From 6b8b25ebf9c17f8413c362c7c387b92e366a4b61 Mon Sep 17 00:00:00 2001 From: Bryan Roe Date: Wed, 30 Oct 2019 14:40:25 -0700 Subject: [PATCH] 1. Updated so global events are unhooked when done 2. Updated so fake window is destroyed when done --- microscript/ILibDuktape_Polyfills.c | 2 +- modules/win-message-pump.js | 22 +++++++++++++++------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index 496ee04..84e084f 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -1999,7 +1999,7 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_peval_string_noresult(ctx, "addModule('PE_Parser', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCi8vIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGV4ZWN1dGFibGUKZnVuY3Rpb24gcGFyc2UoZXhlUGF0aCkKewogICAgdmFyIHJldFZhbCA9IHt9OwogICAgdmFyIGZzID0gcmVxdWlyZSgnZnMnKTsKICAgIHZhciBmZCA9IGZzLm9wZW5TeW5jKGV4ZVBhdGgsICdyYicpOwogICAgdmFyIGJ5dGVzUmVhZDsKICAgIHZhciBkb3NIZWFkZXIgPSBCdWZmZXIuYWxsb2MoNjQpOwogICAgdmFyIG50SGVhZGVyID0gQnVmZmVyLmFsbG9jKDI0KTsKICAgIHZhciBvcHRIZWFkZXI7CgogICAgLy8gUmVhZCB0aGUgRE9TIGhlYWRlcgogICAgYnl0ZXNSZWFkID0gZnMucmVhZFN5bmMoZmQsIGRvc0hlYWRlciwgMCwgNjQsIDApOwogICAgaWYgKGRvc0hlYWRlci5yZWFkVUludDE2TEUoMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkgIT0gJzVBNEQnKQogICAgewogICAgICAgIHRocm93ICgndW5yZWNvZ25pemVkIGJpbmFyeSBmb3JtYXQnKTsKICAgIH0KCiAgICAvLyBSZWFkIHRoZSBOVCBoZWFkZXIKICAgIGJ5dGVzUmVhZCA9IGZzLnJlYWRTeW5jKGZkLCBudEhlYWRlciwgMCwgbnRIZWFkZXIubGVuZ3RoLCBkb3NIZWFkZXIucmVhZFVJbnQzMkxFKDYwKSk7CiAgICBpZiAobnRIZWFkZXIuc2xpY2UoMCwgNCkudG9TdHJpbmcoJ2hleCcpICE9ICc1MDQ1MDAwMCcpCiAgICB7CiAgICAgICAgdGhyb3cgKCdub3QgYSBQRSBmaWxlJyk7CiAgICB9CiAgICBzd2l0Y2ggKG50SGVhZGVyLnJlYWRVSW50MTZMRSg0KS50b1N0cmluZygxNikpCiAgICB7CiAgICAgICAgY2FzZSAnMTRjJzogLy8gMzIgYml0CiAgICAgICAgICAgIHJldFZhbC5mb3JtYXQgPSAneDg2JzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnODY2NCc6IC8vIDY0IGJpdAogICAgICAgICAgICByZXRWYWwuZm9ybWF0ID0gJ3g2NCc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6IC8vIFVua25vd24KICAgICAgICAgICAgcmV0VmFsLmZvcm1hdCA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0VmFsLm9wdGlvbmFsSGVhZGVyU2l6ZSA9IG50SGVhZGVyLnJlYWRVSW50MTZMRSgyMCk7CiAgICByZXRWYWwub3B0aW9uYWxIZWFkZXJTaXplQWRkcmVzcyA9IGRvc0hlYWRlci5yZWFkVUludDMyTEUoNjApICsgMjA7CgogICAgLy8gUmVhZCB0aGUgb3B0aW9uYWwgaGVhZGVyCiAgICBvcHRIZWFkZXIgPSBCdWZmZXIuYWxsb2MobnRIZWFkZXIucmVhZFVJbnQxNkxFKDIwKSk7CiAgICBieXRlc1JlYWQgPSBmcy5yZWFkU3luYyhmZCwgb3B0SGVhZGVyLCAwLCBvcHRIZWFkZXIubGVuZ3RoLCBkb3NIZWFkZXIucmVhZFVJbnQzMkxFKDYwKSArIDI0KTsKICAgIHZhciBudW1SVkEgPSB1bmRlZmluZWQ7CgogICAgcmV0VmFsLkNoZWNrU3VtUG9zID0gZG9zSGVhZGVyLnJlYWRVSW50MzJMRSg2MCkgKyAyNCArIDY0OwogICAgcmV0VmFsLlNpemVPZkNvZGUgPSBvcHRIZWFkZXIucmVhZFVJbnQzMkxFKDQpOwogICAgcmV0VmFsLlNpemVPZkluaXRpYWxpemVkRGF0YSA9IG9wdEhlYWRlci5yZWFkVUludDMyTEUoOCk7CiAgICByZXRWYWwuU2l6ZU9mVW5Jbml0aWFsaXplZERhdGEgPSBvcHRIZWFkZXIucmVhZFVJbnQzMkxFKDEyKTsKCiAgICBzd2l0Y2ggKG9wdEhlYWRlci5yZWFkVUludDE2TEUoMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkpCiAgICB7CiAgICAgICAgY2FzZSAnMTBCJzogLy8gMzIgYml0IGJpbmFyeQogICAgICAgICAgICBudW1SVkEgPSBvcHRIZWFkZXIucmVhZFVJbnQzMkxFKDkyKTsKICAgICAgICAgICAgcmV0VmFsLkNlcnRpZmljYXRlVGFibGVBZGRyZXNzID0gb3B0SGVhZGVyLnJlYWRVSW50MzJMRSgxMjgpOwogICAgICAgICAgICByZXRWYWwuQ2VydGlmaWNhdGVUYWJsZVNpemUgPSBvcHRIZWFkZXIucmVhZFVJbnQzMkxFKDEzMik7CiAgICAgICAgICAgIHJldFZhbC5DZXJ0aWZpY2F0ZVRhYmxlU2l6ZVBvcyA9IGRvc0hlYWRlci5yZWFkVUludDMyTEUoNjApICsgMjQgKyAxMzI7CiAgICAgICAgICAgIHJldFZhbC5ydmFTdGFydEFkZHJlc3MgPSBkb3NIZWFkZXIucmVhZFVJbnQzMkxFKDYwKSArIDI0ICsgOTY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJzIwQic6IC8vIDY0IGJpdCBiaW5hcnkKICAgICAgICAgICAgbnVtUlZBID0gb3B0SGVhZGVyLnJlYWRVSW50MzJMRSgxMDgpOwogICAgICAgICAgICByZXRWYWwuQ2VydGlmaWNhdGVUYWJsZUFkZHJlc3MgPSBvcHRIZWFkZXIucmVhZFVJbnQzMkxFKDE0NCk7CiAgICAgICAgICAgIHJldFZhbC5DZXJ0aWZpY2F0ZVRhYmxlU2l6ZSA9IG9wdEhlYWRlci5yZWFkVUludDMyTEUoMTQ4KTsKICAgICAgICAgICAgcmV0VmFsLkNlcnRpZmljYXRlVGFibGVTaXplUG9zID0gZG9zSGVhZGVyLnJlYWRVSW50MzJMRSg2MCkgKyAyNCArIDE0ODsKICAgICAgICAgICAgcmV0VmFsLnJ2YVN0YXJ0QWRkcmVzcyA9IGRvc0hlYWRlci5yZWFkVUludDMyTEUoNjApICsgMjQgKyAxMTI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHRocm93ICgnVW5rbm93biBWYWx1ZSBmb3VuZCBmb3IgT3B0aW9uYWwgTWFnaWM6ICcgKyBudEhlYWRlci5yZWFkVUludDE2TEUoMjQpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXRWYWwucnZhQ291bnQgPSBudW1SVkE7CgogICAgaWYgKHJldFZhbC5DZXJ0aWZpY2F0ZVRhYmxlQWRkcmVzcykKICAgIHsKICAgICAgICAvLyBSZWFkIHRoZSBhdXRoZW50aWNvZGUgY2VydGlmaWNhdGUsIG9ubHkgb25lIGNlcnQgKG9ubHkgdGhlIGZpcnN0IGVudHJ5KQogICAgICAgIHZhciBoZHIgPSBCdWZmZXIuYWxsb2MoOCk7CiAgICAgICAgZnMucmVhZFN5bmMoZmQsIGhkciwgMCwgaGRyLmxlbmd0aCwgcmV0VmFsLkNlcnRpZmljYXRlVGFibGVBZGRyZXNzKTsKICAgICAgICByZXRWYWwuY2VydGlmaWNhdGUgPSBCdWZmZXIuYWxsb2MoaGRyLnJlYWRVSW50MzJMRSgwKSk7CiAgICAgICAgZnMucmVhZFN5bmMoZmQsIHJldFZhbC5jZXJ0aWZpY2F0ZSwgMCwgcmV0VmFsLmNlcnRpZmljYXRlLmxlbmd0aCwgcmV0VmFsLkNlcnRpZmljYXRlVGFibGVBZGRyZXNzICsgaGRyLmxlbmd0aCk7CiAgICAgICAgcmV0VmFsLmNlcnRpZmljYXRlID0gcmV0VmFsLmNlcnRpZmljYXRlLnRvU3RyaW5nKCdiYXNlNjQnKTsKICAgICAgICByZXRWYWwuY2VydGlmaWNhdGVEd0xlbmd0aCA9IGhkci5yZWFkVUludDMyTEUoMCk7CiAgICB9CiAgICBmcy5jbG9zZVN5bmMoZmQpOwogICAgcmV0dXJuIChyZXRWYWwpOwp9Cgptb2R1bGUuZXhwb3J0cyA9IHBhcnNlOwoKCv==', 'base64').toString());"); // Windows Message Pump, refer to modules/win-message-pump.js - duk_peval_string_noresult(ctx, "addModule('win-message-pump', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBXSF9DQUxMV05EUFJPQyA9IDQ7CnZhciBXTV9RVUlUID0gIDB4MDAxMjsKdmFyIFdNX0NMT1NFID0gMHgwMDEwOwp2YXIgR00gPSByZXF1aXJlKCdfR2VuZXJpY01hcnNoYWwnKTsKCmZ1bmN0aW9uIFdpbmRvd3NNZXNzYWdlUHVtcChvcHRpb25zKQp7CiAgICB0aGlzLl9PYmplY3RJRCA9ICd3aW4tbWVzc2FnZS1wdW1wJzsKICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zOwogICAgdmFyIGVtaXR0ZXJVdGlscyA9IHJlcXVpcmUoJ2V2ZW50cycpLmluaGVyaXRzKHRoaXMpOwogICAgZW1pdHRlclV0aWxzLmNyZWF0ZUV2ZW50KCdod25kJyk7CiAgICBlbWl0dGVyVXRpbHMuY3JlYXRlRXZlbnQoJ2Vycm9yJyk7CiAgICBlbWl0dGVyVXRpbHMuY3JlYXRlRXZlbnQoJ21lc3NhZ2UnKTsKICAgIGVtaXR0ZXJVdGlscy5jcmVhdGVFdmVudCgnZXhpdCcpOwoKICAgIHRoaXMuX21zZyA9IEdNLkNyZWF0ZVZhcmlhYmxlKEdNLlBvaW50ZXJTaXplID09IDQgPyAyOCA6IDQ4KTsKICAgIHRoaXMuX2tlcm5lbDMyID0gR00uQ3JlYXRlTmF0aXZlUHJveHkoJ0tlcm5lbDMyLmRsbCcpOwogICAgdGhpcy5fa2VybmVsMzIubXAgPSB0aGlzOwogICAgdGhpcy5fa2VybmVsMzIuQ3JlYXRlTWV0aG9kKCdHZXRMYXN0RXJyb3InKTsKICAgIHRoaXMuX2tlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnR2V0TW9kdWxlSGFuZGxlQScpOwoKICAgIHRoaXMuX3VzZXIzMiA9IEdNLkNyZWF0ZU5hdGl2ZVByb3h5KCdVc2VyMzIuZGxsJyk7CiAgICB0aGlzLl91c2VyMzIubXAgPSB0aGlzOwogICAgdGhpcy5fdXNlcjMyLkNyZWF0ZU1ldGhvZCgnR2V0TWVzc2FnZUEnKTsKICAgIHRoaXMuX3VzZXIzMi5DcmVhdGVNZXRob2QoJ0NyZWF0ZVdpbmRvd0V4QScpOwogICAgdGhpcy5fdXNlcjMyLkNyZWF0ZU1ldGhvZCgnVHJhbnNsYXRlTWVzc2FnZScpOwogICAgdGhpcy5fdXNlcjMyLkNyZWF0ZU1ldGhvZCgnRGlzcGF0Y2hNZXNzYWdlQScpOwogICAgdGhpcy5fdXNlcjMyLkNyZWF0ZU1ldGhvZCgnUmVnaXN0ZXJDbGFzc0V4QScpOwogICAgdGhpcy5fdXNlcjMyLkNyZWF0ZU1ldGhvZCgnRGVmV2luZG93UHJvY0EnKTsKICAgIHRoaXMuX3VzZXIzMi5DcmVhdGVNZXRob2QoJ1Bvc3RNZXNzYWdlQScpOwogICAgdGhpcy5fdXNlcjMyLkNyZWF0ZU1ldGhvZCgnU2hvd1dpbmRvdycpOwogICAgdGhpcy5fdXNlcjMyLkNyZWF0ZU1ldGhvZCgnU2V0V2luZG93UG9zJyk7CgoKICAgIHRoaXMud25kY2xhc3MgPSBHTS5DcmVhdGVWYXJpYWJsZShHTS5Qb2ludGVyU2l6ZSA9PSA0ID8gNDggOiA4MCk7CiAgICB0aGlzLnduZGNsYXNzLm1wID0gdGhpczsKICAgIHRoaXMud25kY2xhc3MuaGluc3RhbmNlID0gdGhpcy5fa2VybmVsMzIuR2V0TW9kdWxlSGFuZGxlQSgwKTsKICAgIHRoaXMud25kY2xhc3MuY25hbWUgPSBHTS5DcmVhdGVWYXJpYWJsZSgnTWFpbldXV0NsYXNzJyk7CiAgICB0aGlzLnduZGNsYXNzLnduZHByb2MgPSBHTS5HZXRHZW5lcmljR2xvYmFsQ2FsbGJhY2soNCk7CiAgICB0aGlzLnduZGNsYXNzLnduZHByb2MubXAgPSB0aGlzOwogICAgdGhpcy53bmRjbGFzcy50b0J1ZmZlcigpLndyaXRlVUludDMyTEUodGhpcy53bmRjbGFzcy5fc2l6ZSk7CiAgICB0aGlzLnduZGNsYXNzLmNuYW1lLnBvaW50ZXJCdWZmZXIoKS5jb3B5KHRoaXMud25kY2xhc3MuRGVyZWYoR00uUG9pbnRlclNpemUgPT0gNCA/IDQwIDogNjQsIEdNLlBvaW50ZXJTaXplKS50b0J1ZmZlcigpKTsKICAgIHRoaXMud25kY2xhc3Mud25kcHJvYy5wb2ludGVyQnVmZmVyKCkuY29weSh0aGlzLnduZGNsYXNzLkRlcmVmKDgsIEdNLlBvaW50ZXJTaXplKS50b0J1ZmZlcigpKTsKICAgIHRoaXMud25kY2xhc3MuaGluc3RhbmNlLnBvaW50ZXJCdWZmZXIoKS5jb3B5KHRoaXMud25kY2xhc3MuRGVyZWYoR00uUG9pbnRlclNpemUgPT0gNCA/IDIwIDogMjQsIEdNLlBvaW50ZXJTaXplKS50b0J1ZmZlcigpKTsKICAgIHRoaXMud25kY2xhc3Mud25kcHJvYy5vbignR2xvYmFsQ2FsbGJhY2snLCBmdW5jdGlvbiBvblduZFByb2MoeGh3bmQsIHhtc2csIHdwYXJhbSwgbHBhcmFtKQogICAgewogICAgICAgIGlmICh0aGlzLm1wLl9od25kICE9IG51bGwgJiYgdGhpcy5tcC5faHduZC5WYWwgPT0geGh3bmQuVmFsKQogICAgICAgIHsKICAgICAgICAgICAgLy8gVGhpcyBpcyBmb3IgdXMKICAgICAgICAgICAgdmFyIGQgPSB0aGlzLlN0YXJ0RGlzcGF0Y2hlcigpOwogICAgICAgICAgICB0aGlzLm1wLmVtaXQoJ21lc3NhZ2UnLCB7IG1lc3NhZ2U6IHhtc2cuVmFsLCB3cGFyYW06IHdwYXJhbS5WYWwsIGxwYXJhbTogbHBhcmFtLlZhbCwgbHBhcmFtX2hleDogbHBhcmFtLnBvaW50ZXJCdWZmZXIoKS50b1N0cmluZygnaGV4JyksIGxwYXJhbV9yYXc6IGxwYXJhbSwgaHduZDogeGh3bmQsIGRpc3BhdGNoZXI6IGQgfSk7CgogICAgICAgICAgICB2YXIgbXNnUmV0ID0gdGhpcy5tcC5lbWl0X3JldHVyblZhbHVlKCdtZXNzYWdlJyk7CiAgICAgICAgICAgIGlmIChtc2dSZXQgPT0gbnVsbCkKICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gY2FsbCBEZWZXaW5kb3dQcm9jQSwgYmVjdWFzZSB0aGlzIG1lc3NhZ2Ugd2FzIG5vdCBoYW5kbGVkDQogICAgICAgICAgICAgICAgdmFyIHAgPSB0aGlzLm1wLl91c2VyMzIuRGVmV2luZG93UHJvY0EuYXN5bmMoZCwgeGh3bmQsIHhtc2csIHdwYXJhbSwgbHBhcmFtKTsKICAgICAgICAgICAgICAgIHAuZGlzcGF0Y2hlciA9IHRoaXM7CiAgICAgICAgICAgICAgICBwLnRoZW4oZnVuY3Rpb24gKHJldCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlci5FbmREaXNwYXRjaGVyKHJldCk7DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciByID0gR00uQ3JlYXRlUG9pbnRlcigpOw0KICAgICAgICAgICAgICAgIHIuVmFsID0gbXNnUmV0Ow0KICAgICAgICAgICAgICAgIHRoaXMuRW5kRGlzcGF0Y2hlcihyKTsNCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZih0aGlzLm1wLl9od25kID09IG51bGwgJiYgdGhpcy5DYWxsaW5nVGhyZWFkKCkgPT0gdGhpcy5tcC5fdXNlcjMyLlJlZ2lzdGVyQ2xhc3NFeEEuYXN5bmMudGhyZWFkSWQoKSkKICAgICAgICB7CiAgICAgICAgICAgIC8vIFRoaXMgbWVzc2FnZSB3YXMgZ2VuZXJhdGVkIGZyb20gb3VyIENyZWF0ZVdpbmRvd0V4QSBtZXRob2QKCiAgICAgICAgICAgIHZhciBkID0gdGhpcy5TdGFydERpc3BhdGNoZXIoKTsKCiAgICAgICAgICAgIHRoaXMubXAuZW1pdCgnbWVzc2FnZScsIHsgbWVzc2FnZTogeG1zZy5WYWwsIHdwYXJhbTogd3BhcmFtLlZhbCwgbHBhcmFtOiBscGFyYW0uVmFsLCBscGFyYW1faGV4OiBscGFyYW0ucG9pbnRlckJ1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKSwgaHduZDogeGh3bmQsIGRpc3BhdGNoZXI6IGQgfSk7CgogICAgICAgICAgICB2YXIgbXNnUmV0ID0gdGhpcy5tcC5lbWl0X3JldHVyblZhbHVlKCdtZXNzYWdlJyk7CiAgICAgICAgICAgIGlmIChtc2dSZXQgPT0gbnVsbCkNCnsNCiAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGNhbGwgRGVmV2luZG93UHJvY0EsIGJlY3Vhc2UgdGhpcyBtZXNzYWdlIHdhcyBub3QgaGFuZGxlZA0KICAgICAgICAgICAgICAgIHZhciBwID0gdGhpcy5tcC5fdXNlcjMyLkRlZldpbmRvd1Byb2NBLmFzeW5jKGQsIHhod25kLCB4bXNnLCB3cGFyYW0sIGxwYXJhbSk7CiAgICAgICAgICAgICAgICBwLmRpc3BhdGNoZXIgPSB0aGlzOwogICAgICAgICAgICAgICAgcC50aGVuKGZ1bmN0aW9uIChyZXQpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIuRW5kRGlzcGF0Y2hlcihyZXQpOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgciA9IEdNLkNyZWF0ZVBvaW50ZXIoKTsNCiAgICAgICAgICAgICAgICByLlZhbCA9IG1zZ1JldDsNCiAgICAgICAgICAgICAgICB0aGlzLkVuZERpc3BhdGNoZXIocik7DQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBfZGVidWdHQygpOwogICAgfSk7CgogICAgdGhpcy5fdXNlcjMyLlJlZ2lzdGVyQ2xhc3NFeEEuYXN5bmModGhpcy53bmRjbGFzcykudGhlbihmdW5jdGlvbiAoKQogICAgewogICAgICAgIGlmICghdGhpcy5uYXRpdmVQcm94eS5tcC5fb3B0aW9ucykgIHsgICB0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zID0ge307ICB9CiAgICAgICAgaWYgKCF0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zLndpbmRvdykgeyB0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zLndpbmRvdyA9IHt9OyB9CiAgICAgICAgaWYgKHRoaXMubmF0aXZlUHJveHkubXAuX29wdGlvbnMud2luZG93LmV4c3R5bGVzID09IG51bGwpIHsgdGhpcy5uYXRpdmVQcm94eS5tcC5fb3B0aW9ucy53aW5kb3cuZXhzdHlsZXMgPSAweDAwMDAwMDg4OyB9ICAgIC8vIFRvcE1vc3QgVG9vbCBXaW5kb3cKICAgICAgICBpZiAodGhpcy5uYXRpdmVQcm94eS5tcC5fb3B0aW9ucy53aW5kb3cud2luc3R5bGVzID09IG51bGwpIHsgdGhpcy5uYXRpdmVQcm94eS5tcC5fb3B0aW9ucy53aW5kb3cud2luc3R5bGVzID0gMHgwMDgwMDAwMDsgfSAgLy8gV1NfQk9SREVSCiAgICAgICAgaWYgKHRoaXMubmF0aXZlUHJveHkubXAuX29wdGlvbnMud2luZG93LnggPT0gbnVsbCkgeyB0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zLndpbmRvdy54ID0gMDsgfQogICAgICAgIGlmICh0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zLndpbmRvdy55ID09IG51bGwpIHsgdGhpcy5uYXRpdmVQcm94eS5tcC5fb3B0aW9ucy53aW5kb3cueSA9IDA7IH0KICAgICAgICBpZiAodGhpcy5uYXRpdmVQcm94eS5tcC5fb3B0aW9ucy53aW5kb3cud2lkdGggPT0gbnVsbCkgeyB0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zLndpbmRvdy53aWR0aCA9IDEwMDsgfQogICAgICAgIGlmICh0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zLndpbmRvdy5oZWlnaHQgPT0gbnVsbCkgeyB0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zLndpbmRvdy5oZWlnaHQgPSAxMDA7IH0KCiAgICAgICAgdGhpcy5uYXRpdmVQcm94eS5DcmVhdGVXaW5kb3dFeEEuYXN5bmModGhpcy5uYXRpdmVQcm94eS5SZWdpc3RlckNsYXNzRXhBLmFzeW5jLCB0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zLndpbmRvdy5leHN0eWxlcywgdGhpcy5uYXRpdmVQcm94eS5tcC53bmRjbGFzcy5jbmFtZSwKICAgICAgICAgICAgdGhpcy5uYXRpdmVQcm94eS5tcC5fb3B0aW9ucy53aW5kb3cudGl0bGUgPT0gbnVsbCA/IDAgOiBHTS5DcmVhdGVWYXJpYWJsZSh0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zLndpbmRvdy50aXRsZSksIHRoaXMubmF0aXZlUHJveHkubXAuX29wdGlvbnMud2luZG93LndpbnN0eWxlcywgdGhpcy5uYXRpdmVQcm94eS5tcC5fb3B0aW9ucy53aW5kb3cueCwgdGhpcy5uYXRpdmVQcm94eS5tcC5fb3B0aW9ucy53aW5kb3cueSwKICAgICAgICAgICAgdGhpcy5uYXRpdmVQcm94eS5tcC5fb3B0aW9ucy53aW5kb3cud2lkdGgsIHRoaXMubmF0aXZlUHJveHkubXAuX29wdGlvbnMud2luZG93LmhlaWdodCwgMCwgMCwgMCwgMCkKICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGguVmFsID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gRXJyb3IgY3JlYXRpbmcgaGlkZGVuIHdpbmRvdwogICAgICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlUHJveHkubXAuZW1pdCgnZXJyb3InLCAnRXJyb3IgY3JlYXRpbmcgaGlkZGVuIHdpbmRvdycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlUHJveHkubXAuX2h3bmQgPSBoOwogICAgICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlUHJveHkubXAuZW1pdCgnaHduZCcsIGgpOwogICAgICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlUHJveHkubXAuX3N0YXJ0UHVtcCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgIH0pOwogICAgdGhpcy5fc3RhcnRQdW1wID0gZnVuY3Rpb24gX3N0YXJ0UHVtcCgpCiAgICB7CiAgICAgICAgdGhpcy5fdXNlcjMyLkdldE1lc3NhZ2VBLmFzeW5jKHRoaXMuX3VzZXIzMi5SZWdpc3RlckNsYXNzRXhBLmFzeW5jLCB0aGlzLl9tc2csIHRoaXMuX2h3bmQsIDAsIDApLnRoZW4oZnVuY3Rpb24gKHIpCiAgICAgICAgewogICAgICAgICAgICBpZihyLlZhbCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlUHJveHkuVHJhbnNsYXRlTWVzc2FnZS5hc3luYyh0aGlzLm5hdGl2ZVByb3h5LlJlZ2lzdGVyQ2xhc3NFeEEuYXN5bmMsIHRoaXMubmF0aXZlUHJveHkubXAuX21zZykudGhlbihmdW5jdGlvbiAoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlUHJveHkuRGlzcGF0Y2hNZXNzYWdlQS5hc3luYyh0aGlzLm5hdGl2ZVByb3h5LlJlZ2lzdGVyQ2xhc3NFeEEuYXN5bmMsIHRoaXMubmF0aXZlUHJveHkubXAuX21zZykudGhlbihmdW5jdGlvbiAoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVQcm94eS5tcC5fc3RhcnRQdW1wKCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIFdlIGdvdCBhICdRVUlUJyBtZXNzYWdlCiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5uYXRpdmVQcm94eS5tcC5faHduZDsKICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlUHJveHkubXAuZW1pdCgnZXhpdCcsIDApOwogICAgICAgICAgICB9CiAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgeyB0aGlzLm5hdGl2ZVByb3h5Lm1wLnN0b3AoKTsgfSk7CiAgICB9CgogICAgdGhpcy5zdG9wID0gZnVuY3Rpb24gc3RvcCgpCiAgICB7CiAgICAgICAgaWYgKHRoaXMuX2h3bmQpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLl91c2VyMzIuUG9zdE1lc3NhZ2VBKHRoaXMuX2h3bmQsIFdNX1FVSVQsIDAsIDApOwogICAgICAgIH0KICAgIH07CiAgICB0aGlzLmNsb3NlID0gZnVuY3Rpb24gY2xvc2UoKQogICAgewogICAgICAgIGlmICh0aGlzLl9od25kKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5fdXNlcjMyLlBvc3RNZXNzYWdlQSh0aGlzLl9od25kLCBXTV9DTE9TRSwgMCwgMCk7CiAgICAgICAgfQogICAgfTsKfQoKbW9kdWxlLmV4cG9ydHMgPSBXaW5kb3dzTWVzc2FnZVB1bXA7Cm1vZHVsZS5leHBvcnRzLldpbmRvd1N0eWxlcyA9CiAgICB7DQogICAgICAgIFdTX0JPUkRFUjogMHgwMDgwMDAwMCwgV1NfQ0FQVElPTjogMHgwMEMwMDAwMCwgV1NfQ0hJTEQ6IDB4NDAwMDAwMDAsIFdTX0NISUxEV0lORE9XOiAweDQwMDAwMDAwLCBXU19DTElQQ0hJTERSRU46IDB4MDIwMDAwMDAsCiAgICAgICAgV1NfQ0xJUFNJQkxJTkdTOiAweDA0MDAwMDAwLCBXU19ESVNBQkxFRDogMHgwODAwMDAwMCwgV1NfRExHRlJBTUU6IDB4MDA0MDAwMDAsIFdTX0dST1VQOiAweDAwMDIwMDAwLCBXU19IU0NST0xMOiAweDAwMTAwMDAwLAogICAgICAgIFdTX0lDT05JQzogMHgyMDAwMDAwMCwgV1NfTUFYSU1JWkU6IDB4MDEwMDAwMDAsIFdTX01BWElNSVpFQk9YOiAweDAwMDEwMDAwLCBXU19NSU5JTUlaRTogMHgyMDAwMDAwMCwgV1NfTUlOSU1JWkVCT1g6IDB4MDAwMjAwMDAsCiAgICAgICAgV1NfT1ZFUkxBUFBFRDogMHgwMDAwMDAwMCwgV1NfUE9QVVA6IDB4ODAwMDAwMDAsIFdTX1NJWkVCT1g6IDB4MDAwNDAwMDAsIFdTX1NZU01FTlU6IDB4MDAwODAwMDAsIFdTX1RBQlNUT1A6IDB4MDAwMTAwMDAsCiAgICAgICAgV1NfVEhJQ0tGUkFNRTogMHgwMDA0MDAwMCwgV1NfVElMRUQ6IDB4MDAwMDAwMDAsIFdTX1ZJU0lCTEU6IDB4MTAwMDAwMDAsIFdTX1ZTQ1JPTEw6IDB4MDAyMDAwMDANCiAgICB9Owptb2R1bGUuZXhwb3J0cy5XaW5kb3dTdHlsZXNFeCA9CiAgICB7DQogICAgICAgIFdTX0VYX0FDQ0VQVEZJTEVTOiAweDAwMDAwMDEwLCBXU19FWF9BUFBXSU5ET1c6IDB4MDAwNDAwMDAsIFdTX0VYX0NMSUVOVEVER0U6IDB4MDAwMDAyMDAsIFdTX0VYX0NPTVBPU0lURUQ6IDB4MDIwMDAwMDAsDQogICAgICAgIFdTX0VYX0NPTlRFWFRIRUxQOiAweDAwMDAwNDAwLCBXU19FWF9DT05UUk9MUEFSRU5UOiAweDAwMDEwMDAwLCBXU19FWF9ETEdNT0RBTEZSQU1FOiAweDAwMDAwMDAxLCBXU19FWF9MQVlFUkVEOiAweDAwMDgwMDAsDQogICAgICAgIFdTX0VYX0xBWU9VVFJUTDogMHgwMDQwMDAwMCwgV1NfRVhfTEVGVDogMHgwMDAwMDAwMCwgV1NfRVhfTEVGVFNDUk9MTEJBUjogMHgwMDAwNDAwMCwgV1NfRVhfTFRSUkVBRElORzogMHgwMDAwMDAwMCwNCiAgICAgICAgV1NfRVhfTURJQ0hJTEQ6IDB4MDAwMDAwNDAsIFdTX0VYX05PQUNUSVZBVEU6IDB4MDgwMDAwMDAsIFdTX0VYX05PSU5IRVJJVExBWU9VVDogMHgwMDEwMDAwMCwgV1NfRVhfTk9QQVJFTlROT1RJRlk6IDB4MDAwMDAwMDQsDQogICAgICAgIFdTX0VYX05PUkVESVJFQ1RJT05CSVRNQVA6IDB4MDAyMDAwMDAsIFdTX0VYX1JJR0hUOiAweDAwMDAxMDAwLCBXU19FWF9SSUdIVFNDUk9MTEJBUjogMHgwMDAwMDAwMCwgV1NfRVhfUlRMUkVBRElORzogMHgwMDAwMjAwMCwNCiAgICAgICAgV1NfRVhfU1RBVElDRURHRTogMHgwMDAyMDAwMCwgV1NfRVhfVE9PTFdJTkRPVzogMHgwMDAwMDA4MCwgV1NfRVhfVE9QTU9TVDogMHgwMDAwMDAwOCwgV1NfRVhfVFJBTlNQQVJFTlQ6IDB4MDAwMDAwMjAsIFdTX0VYX1dJTkRPV0VER0U6IDB4MDAwMDAxMDANCiAgICB9Owo=', 'base64').toString());"); + duk_peval_string_noresult(ctx, "addModule('win-message-pump', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBXSF9DQUxMV05EUFJPQyA9IDQ7CnZhciBXTV9RVUlUID0gIDB4MDAxMjsKdmFyIFdNX0NMT1NFID0gMHgwMDEwOwp2YXIgR00gPSByZXF1aXJlKCdfR2VuZXJpY01hcnNoYWwnKTsKCmZ1bmN0aW9uIFdpbmRvd3NNZXNzYWdlUHVtcChvcHRpb25zKQp7CiAgICB0aGlzLl9PYmplY3RJRCA9ICd3aW4tbWVzc2FnZS1wdW1wJzsKICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zOwogICAgdmFyIGVtaXR0ZXJVdGlscyA9IHJlcXVpcmUoJ2V2ZW50cycpLmluaGVyaXRzKHRoaXMpOwogICAgZW1pdHRlclV0aWxzLmNyZWF0ZUV2ZW50KCdod25kJyk7CiAgICBlbWl0dGVyVXRpbHMuY3JlYXRlRXZlbnQoJ2Vycm9yJyk7CiAgICBlbWl0dGVyVXRpbHMuY3JlYXRlRXZlbnQoJ21lc3NhZ2UnKTsKICAgIGVtaXR0ZXJVdGlscy5jcmVhdGVFdmVudCgnZXhpdCcpOwoKICAgIHRoaXMuX21zZyA9IEdNLkNyZWF0ZVZhcmlhYmxlKEdNLlBvaW50ZXJTaXplID09IDQgPyAyOCA6IDQ4KTsKICAgIHRoaXMuX2tlcm5lbDMyID0gR00uQ3JlYXRlTmF0aXZlUHJveHkoJ0tlcm5lbDMyLmRsbCcpOwogICAgdGhpcy5fa2VybmVsMzIubXAgPSB0aGlzOwogICAgdGhpcy5fa2VybmVsMzIuQ3JlYXRlTWV0aG9kKCdHZXRMYXN0RXJyb3InKTsKICAgIHRoaXMuX2tlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnR2V0TW9kdWxlSGFuZGxlQScpOwoKICAgIHRoaXMuX3VzZXIzMiA9IEdNLkNyZWF0ZU5hdGl2ZVByb3h5KCdVc2VyMzIuZGxsJyk7CiAgICB0aGlzLl91c2VyMzIubXAgPSB0aGlzOwogICAgdGhpcy5fdXNlcjMyLkNyZWF0ZU1ldGhvZCgnQ3JlYXRlV2luZG93RXhBJyk7CiAgICB0aGlzLl91c2VyMzIuQ3JlYXRlTWV0aG9kKCdEZWZXaW5kb3dQcm9jQScpOwogICAgdGhpcy5fdXNlcjMyLkNyZWF0ZU1ldGhvZCgnRGVzdHJveVdpbmRvdycpOwogICAgdGhpcy5fdXNlcjMyLkNyZWF0ZU1ldGhvZCgnRGlzcGF0Y2hNZXNzYWdlQScpOwogICAgdGhpcy5fdXNlcjMyLkNyZWF0ZU1ldGhvZCgnR2V0TWVzc2FnZUEnKTsKICAgIHRoaXMuX3VzZXIzMi5DcmVhdGVNZXRob2QoJ1Bvc3RNZXNzYWdlQScpOwogICAgdGhpcy5fdXNlcjMyLkNyZWF0ZU1ldGhvZCgnUmVnaXN0ZXJDbGFzc0V4QScpOwogICAgdGhpcy5fdXNlcjMyLkNyZWF0ZU1ldGhvZCgnU2V0V2luZG93UG9zJyk7CiAgICB0aGlzLl91c2VyMzIuQ3JlYXRlTWV0aG9kKCdTaG93V2luZG93Jyk7CiAgICB0aGlzLl91c2VyMzIuQ3JlYXRlTWV0aG9kKCdUcmFuc2xhdGVNZXNzYWdlJyk7CgoKICAgIHRoaXMud25kY2xhc3MgPSBHTS5DcmVhdGVWYXJpYWJsZShHTS5Qb2ludGVyU2l6ZSA9PSA0ID8gNDggOiA4MCk7CiAgICB0aGlzLnduZGNsYXNzLm1wID0gdGhpczsKICAgIHRoaXMud25kY2xhc3MuaGluc3RhbmNlID0gdGhpcy5fa2VybmVsMzIuR2V0TW9kdWxlSGFuZGxlQSgwKTsKICAgIHRoaXMud25kY2xhc3MuY25hbWUgPSBHTS5DcmVhdGVWYXJpYWJsZSgnTWFpbldXV0NsYXNzJyk7CiAgICB0aGlzLnduZGNsYXNzLnduZHByb2MgPSBHTS5HZXRHZW5lcmljR2xvYmFsQ2FsbGJhY2soNCk7CiAgICB0aGlzLnduZGNsYXNzLnduZHByb2MubXAgPSB0aGlzOwogICAgdGhpcy53bmRjbGFzcy50b0J1ZmZlcigpLndyaXRlVUludDMyTEUodGhpcy53bmRjbGFzcy5fc2l6ZSk7CiAgICB0aGlzLnduZGNsYXNzLmNuYW1lLnBvaW50ZXJCdWZmZXIoKS5jb3B5KHRoaXMud25kY2xhc3MuRGVyZWYoR00uUG9pbnRlclNpemUgPT0gNCA/IDQwIDogNjQsIEdNLlBvaW50ZXJTaXplKS50b0J1ZmZlcigpKTsKICAgIHRoaXMud25kY2xhc3Mud25kcHJvYy5wb2ludGVyQnVmZmVyKCkuY29weSh0aGlzLnduZGNsYXNzLkRlcmVmKDgsIEdNLlBvaW50ZXJTaXplKS50b0J1ZmZlcigpKTsKICAgIHRoaXMud25kY2xhc3MuaGluc3RhbmNlLnBvaW50ZXJCdWZmZXIoKS5jb3B5KHRoaXMud25kY2xhc3MuRGVyZWYoR00uUG9pbnRlclNpemUgPT0gNCA/IDIwIDogMjQsIEdNLlBvaW50ZXJTaXplKS50b0J1ZmZlcigpKTsKICAgIHRoaXMud25kY2xhc3Mud25kcHJvYy5vbignR2xvYmFsQ2FsbGJhY2snLCBmdW5jdGlvbiBvblduZFByb2MoeGh3bmQsIHhtc2csIHdwYXJhbSwgbHBhcmFtKQogICAgewogICAgICAgIGlmICh0aGlzLm1wLl9od25kICE9IG51bGwgJiYgdGhpcy5tcC5faHduZC5WYWwgPT0geGh3bmQuVmFsKQogICAgICAgIHsKICAgICAgICAgICAgLy8gVGhpcyBpcyBmb3IgdXMKICAgICAgICAgICAgdmFyIGQgPSB0aGlzLlN0YXJ0RGlzcGF0Y2hlcigpOwogICAgICAgICAgICB0aGlzLm1wLmVtaXQoJ21lc3NhZ2UnLCB7IG1lc3NhZ2U6IHhtc2cuVmFsLCB3cGFyYW06IHdwYXJhbS5WYWwsIGxwYXJhbTogbHBhcmFtLlZhbCwgbHBhcmFtX2hleDogbHBhcmFtLnBvaW50ZXJCdWZmZXIoKS50b1N0cmluZygnaGV4JyksIGxwYXJhbV9yYXc6IGxwYXJhbSwgaHduZDogeGh3bmQsIGRpc3BhdGNoZXI6IGQgfSk7CgogICAgICAgICAgICB2YXIgbXNnUmV0ID0gdGhpcy5tcC5lbWl0X3JldHVyblZhbHVlKCdtZXNzYWdlJyk7CiAgICAgICAgICAgIGlmIChtc2dSZXQgPT0gbnVsbCkKICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gY2FsbCBEZWZXaW5kb3dQcm9jQSwgYmVjdWFzZSB0aGlzIG1lc3NhZ2Ugd2FzIG5vdCBoYW5kbGVkDQogICAgICAgICAgICAgICAgdmFyIHAgPSB0aGlzLm1wLl91c2VyMzIuRGVmV2luZG93UHJvY0EuYXN5bmMoZCwgeGh3bmQsIHhtc2csIHdwYXJhbSwgbHBhcmFtKTsKICAgICAgICAgICAgICAgIHAuZGlzcGF0Y2hlciA9IHRoaXM7CiAgICAgICAgICAgICAgICBwLnRoZW4oZnVuY3Rpb24gKHJldCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlci5FbmREaXNwYXRjaGVyKHJldCk7DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciByID0gR00uQ3JlYXRlUG9pbnRlcigpOw0KICAgICAgICAgICAgICAgIHIuVmFsID0gbXNnUmV0Ow0KICAgICAgICAgICAgICAgIHRoaXMuRW5kRGlzcGF0Y2hlcihyKTsNCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZih0aGlzLm1wLl9od25kID09IG51bGwgJiYgdGhpcy5DYWxsaW5nVGhyZWFkKCkgPT0gdGhpcy5tcC5fdXNlcjMyLlJlZ2lzdGVyQ2xhc3NFeEEuYXN5bmMudGhyZWFkSWQoKSkKICAgICAgICB7CiAgICAgICAgICAgIC8vIFRoaXMgbWVzc2FnZSB3YXMgZ2VuZXJhdGVkIGZyb20gb3VyIENyZWF0ZVdpbmRvd0V4QSBtZXRob2QKCiAgICAgICAgICAgIHZhciBkID0gdGhpcy5TdGFydERpc3BhdGNoZXIoKTsKCiAgICAgICAgICAgIHRoaXMubXAuZW1pdCgnbWVzc2FnZScsIHsgbWVzc2FnZTogeG1zZy5WYWwsIHdwYXJhbTogd3BhcmFtLlZhbCwgbHBhcmFtOiBscGFyYW0uVmFsLCBscGFyYW1faGV4OiBscGFyYW0ucG9pbnRlckJ1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKSwgaHduZDogeGh3bmQsIGRpc3BhdGNoZXI6IGQgfSk7CgogICAgICAgICAgICB2YXIgbXNnUmV0ID0gdGhpcy5tcC5lbWl0X3JldHVyblZhbHVlKCdtZXNzYWdlJyk7CiAgICAgICAgICAgIGlmIChtc2dSZXQgPT0gbnVsbCkNCnsNCiAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGNhbGwgRGVmV2luZG93UHJvY0EsIGJlY3Vhc2UgdGhpcyBtZXNzYWdlIHdhcyBub3QgaGFuZGxlZA0KICAgICAgICAgICAgICAgIHZhciBwID0gdGhpcy5tcC5fdXNlcjMyLkRlZldpbmRvd1Byb2NBLmFzeW5jKGQsIHhod25kLCB4bXNnLCB3cGFyYW0sIGxwYXJhbSk7CiAgICAgICAgICAgICAgICBwLmRpc3BhdGNoZXIgPSB0aGlzOwogICAgICAgICAgICAgICAgcC50aGVuKGZ1bmN0aW9uIChyZXQpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIuRW5kRGlzcGF0Y2hlcihyZXQpOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgciA9IEdNLkNyZWF0ZVBvaW50ZXIoKTsNCiAgICAgICAgICAgICAgICByLlZhbCA9IG1zZ1JldDsNCiAgICAgICAgICAgICAgICB0aGlzLkVuZERpc3BhdGNoZXIocik7DQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBfZGVidWdHQygpOwogICAgfSk7CgogICAgdGhpcy5fdXNlcjMyLlJlZ2lzdGVyQ2xhc3NFeEEuYXN5bmModGhpcy53bmRjbGFzcykudGhlbihmdW5jdGlvbiAoKQogICAgewogICAgICAgIGlmICghdGhpcy5uYXRpdmVQcm94eS5tcC5fb3B0aW9ucykgIHsgICB0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zID0ge307ICB9CiAgICAgICAgaWYgKCF0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zLndpbmRvdykgeyB0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zLndpbmRvdyA9IHt9OyB9CiAgICAgICAgaWYgKHRoaXMubmF0aXZlUHJveHkubXAuX29wdGlvbnMud2luZG93LmV4c3R5bGVzID09IG51bGwpIHsgdGhpcy5uYXRpdmVQcm94eS5tcC5fb3B0aW9ucy53aW5kb3cuZXhzdHlsZXMgPSAweDAwMDAwMDg4OyB9ICAgIC8vIFRvcE1vc3QgVG9vbCBXaW5kb3cKICAgICAgICBpZiAodGhpcy5uYXRpdmVQcm94eS5tcC5fb3B0aW9ucy53aW5kb3cud2luc3R5bGVzID09IG51bGwpIHsgdGhpcy5uYXRpdmVQcm94eS5tcC5fb3B0aW9ucy53aW5kb3cud2luc3R5bGVzID0gMHgwMDgwMDAwMDsgfSAgLy8gV1NfQk9SREVSCiAgICAgICAgaWYgKHRoaXMubmF0aXZlUHJveHkubXAuX29wdGlvbnMud2luZG93LnggPT0gbnVsbCkgeyB0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zLndpbmRvdy54ID0gMDsgfQogICAgICAgIGlmICh0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zLndpbmRvdy55ID09IG51bGwpIHsgdGhpcy5uYXRpdmVQcm94eS5tcC5fb3B0aW9ucy53aW5kb3cueSA9IDA7IH0KICAgICAgICBpZiAodGhpcy5uYXRpdmVQcm94eS5tcC5fb3B0aW9ucy53aW5kb3cud2lkdGggPT0gbnVsbCkgeyB0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zLndpbmRvdy53aWR0aCA9IDEwMDsgfQogICAgICAgIGlmICh0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zLndpbmRvdy5oZWlnaHQgPT0gbnVsbCkgeyB0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zLndpbmRvdy5oZWlnaHQgPSAxMDA7IH0KCiAgICAgICAgdGhpcy5uYXRpdmVQcm94eS5DcmVhdGVXaW5kb3dFeEEuYXN5bmModGhpcy5uYXRpdmVQcm94eS5SZWdpc3RlckNsYXNzRXhBLmFzeW5jLCB0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zLndpbmRvdy5leHN0eWxlcywgdGhpcy5uYXRpdmVQcm94eS5tcC53bmRjbGFzcy5jbmFtZSwKICAgICAgICAgICAgdGhpcy5uYXRpdmVQcm94eS5tcC5fb3B0aW9ucy53aW5kb3cudGl0bGUgPT0gbnVsbCA/IDAgOiBHTS5DcmVhdGVWYXJpYWJsZSh0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zLndpbmRvdy50aXRsZSksIHRoaXMubmF0aXZlUHJveHkubXAuX29wdGlvbnMud2luZG93LndpbnN0eWxlcywgdGhpcy5uYXRpdmVQcm94eS5tcC5fb3B0aW9ucy53aW5kb3cueCwgdGhpcy5uYXRpdmVQcm94eS5tcC5fb3B0aW9ucy53aW5kb3cueSwKICAgICAgICAgICAgdGhpcy5uYXRpdmVQcm94eS5tcC5fb3B0aW9ucy53aW5kb3cud2lkdGgsIHRoaXMubmF0aXZlUHJveHkubXAuX29wdGlvbnMud2luZG93LmhlaWdodCwgMCwgMCwgMCwgMCkKICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGguVmFsID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gRXJyb3IgY3JlYXRpbmcgaGlkZGVuIHdpbmRvdwogICAgICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlUHJveHkubXAuZW1pdCgnZXJyb3InLCAnRXJyb3IgY3JlYXRpbmcgaGlkZGVuIHdpbmRvdycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlUHJveHkubXAuX2h3bmQgPSBoOwogICAgICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlUHJveHkubXAuZW1pdCgnaHduZCcsIGgpOwogICAgICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlUHJveHkubXAuX3N0YXJ0UHVtcCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgIH0pOwogICAgdGhpcy5fc3RhcnRQdW1wID0gZnVuY3Rpb24gX3N0YXJ0UHVtcCgpCiAgICB7CiAgICAgICAgdGhpcy5fdXNlcjMyLkdldE1lc3NhZ2VBLmFzeW5jKHRoaXMuX3VzZXIzMi5SZWdpc3RlckNsYXNzRXhBLmFzeW5jLCB0aGlzLl9tc2csIHRoaXMuX2h3bmQsIDAsIDApLnRoZW4oZnVuY3Rpb24gKHIpCiAgICAgICAgewogICAgICAgICAgICBpZihyLlZhbCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlUHJveHkuVHJhbnNsYXRlTWVzc2FnZS5hc3luYyh0aGlzLm5hdGl2ZVByb3h5LlJlZ2lzdGVyQ2xhc3NFeEEuYXN5bmMsIHRoaXMubmF0aXZlUHJveHkubXAuX21zZykudGhlbihmdW5jdGlvbiAoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlUHJveHkuRGlzcGF0Y2hNZXNzYWdlQS5hc3luYyh0aGlzLm5hdGl2ZVByb3h5LlJlZ2lzdGVyQ2xhc3NFeEEuYXN5bmMsIHRoaXMubmF0aXZlUHJveHkubXAuX21zZykudGhlbihmdW5jdGlvbiAoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVQcm94eS5tcC5fc3RhcnRQdW1wKCk7DQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBXZSBnb3QgYSAnUVVJVCcgbWVzc2FnZQogICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVQcm94eS5EZXN0cm95V2luZG93LmFzeW5jKHRoaXMubmF0aXZlUHJveHkuUmVnaXN0ZXJDbGFzc0V4QS5hc3luYywgdGhpcy5uYXRpdmVQcm94eS5tcC5faHduZCkudGhlbihmdW5jdGlvbiAoKQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZVByb3h5LlJlZ2lzdGVyQ2xhc3NFeEEuYXN5bmMuYWJvcnQoKTsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5uYXRpdmVQcm94eS5tcC5faHduZDsKICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZVByb3h5Lm1wLmVtaXQoJ2V4aXQnLCAwKTsNCg0KICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZVByb3h5Lm1wLnduZGNsYXNzLnduZHByb2MucmVtb3ZlQWxsTGlzdGVuZXJzKCdHbG9iYWxDYWxsYmFjaycpOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZVByb3h5Lm1wLnduZGNsYXNzLnduZHByb2MgPSBudWxsOw0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgeyB0aGlzLm5hdGl2ZVByb3h5Lm1wLnN0b3AoKTsgfSk7CiAgICB9CgogICAgdGhpcy5zdG9wID0gZnVuY3Rpb24gc3RvcCgpCiAgICB7CiAgICAgICAgaWYgKHRoaXMuX2h3bmQpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLl91c2VyMzIuUG9zdE1lc3NhZ2VBKHRoaXMuX2h3bmQsIFdNX1FVSVQsIDAsIDApOwogICAgICAgIH0KICAgIH07CiAgICB0aGlzLmNsb3NlID0gZnVuY3Rpb24gY2xvc2UoKQogICAgewogICAgICAgIGlmICh0aGlzLl9od25kKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5fdXNlcjMyLlBvc3RNZXNzYWdlQSh0aGlzLl9od25kLCBXTV9DTE9TRSwgMCwgMCk7CiAgICAgICAgfQogICAgfTsKfQoKbW9kdWxlLmV4cG9ydHMgPSBXaW5kb3dzTWVzc2FnZVB1bXA7Cm1vZHVsZS5leHBvcnRzLldpbmRvd1N0eWxlcyA9CiAgICB7DQogICAgICAgIFdTX0JPUkRFUjogMHgwMDgwMDAwMCwgV1NfQ0FQVElPTjogMHgwMEMwMDAwMCwgV1NfQ0hJTEQ6IDB4NDAwMDAwMDAsIFdTX0NISUxEV0lORE9XOiAweDQwMDAwMDAwLCBXU19DTElQQ0hJTERSRU46IDB4MDIwMDAwMDAsCiAgICAgICAgV1NfQ0xJUFNJQkxJTkdTOiAweDA0MDAwMDAwLCBXU19ESVNBQkxFRDogMHgwODAwMDAwMCwgV1NfRExHRlJBTUU6IDB4MDA0MDAwMDAsIFdTX0dST1VQOiAweDAwMDIwMDAwLCBXU19IU0NST0xMOiAweDAwMTAwMDAwLAogICAgICAgIFdTX0lDT05JQzogMHgyMDAwMDAwMCwgV1NfTUFYSU1JWkU6IDB4MDEwMDAwMDAsIFdTX01BWElNSVpFQk9YOiAweDAwMDEwMDAwLCBXU19NSU5JTUlaRTogMHgyMDAwMDAwMCwgV1NfTUlOSU1JWkVCT1g6IDB4MDAwMjAwMDAsCiAgICAgICAgV1NfT1ZFUkxBUFBFRDogMHgwMDAwMDAwMCwgV1NfUE9QVVA6IDB4ODAwMDAwMDAsIFdTX1NJWkVCT1g6IDB4MDAwNDAwMDAsIFdTX1NZU01FTlU6IDB4MDAwODAwMDAsIFdTX1RBQlNUT1A6IDB4MDAwMTAwMDAsCiAgICAgICAgV1NfVEhJQ0tGUkFNRTogMHgwMDA0MDAwMCwgV1NfVElMRUQ6IDB4MDAwMDAwMDAsIFdTX1ZJU0lCTEU6IDB4MTAwMDAwMDAsIFdTX1ZTQ1JPTEw6IDB4MDAyMDAwMDANCiAgICB9Owptb2R1bGUuZXhwb3J0cy5XaW5kb3dTdHlsZXNFeCA9CiAgICB7DQogICAgICAgIFdTX0VYX0FDQ0VQVEZJTEVTOiAweDAwMDAwMDEwLCBXU19FWF9BUFBXSU5ET1c6IDB4MDAwNDAwMDAsIFdTX0VYX0NMSUVOVEVER0U6IDB4MDAwMDAyMDAsIFdTX0VYX0NPTVBPU0lURUQ6IDB4MDIwMDAwMDAsDQogICAgICAgIFdTX0VYX0NPTlRFWFRIRUxQOiAweDAwMDAwNDAwLCBXU19FWF9DT05UUk9MUEFSRU5UOiAweDAwMDEwMDAwLCBXU19FWF9ETEdNT0RBTEZSQU1FOiAweDAwMDAwMDAxLCBXU19FWF9MQVlFUkVEOiAweDAwMDgwMDAsDQogICAgICAgIFdTX0VYX0xBWU9VVFJUTDogMHgwMDQwMDAwMCwgV1NfRVhfTEVGVDogMHgwMDAwMDAwMCwgV1NfRVhfTEVGVFNDUk9MTEJBUjogMHgwMDAwNDAwMCwgV1NfRVhfTFRSUkVBRElORzogMHgwMDAwMDAwMCwNCiAgICAgICAgV1NfRVhfTURJQ0hJTEQ6IDB4MDAwMDAwNDAsIFdTX0VYX05PQUNUSVZBVEU6IDB4MDgwMDAwMDAsIFdTX0VYX05PSU5IRVJJVExBWU9VVDogMHgwMDEwMDAwMCwgV1NfRVhfTk9QQVJFTlROT1RJRlk6IDB4MDAwMDAwMDQsDQogICAgICAgIFdTX0VYX05PUkVESVJFQ1RJT05CSVRNQVA6IDB4MDAyMDAwMDAsIFdTX0VYX1JJR0hUOiAweDAwMDAxMDAwLCBXU19FWF9SSUdIVFNDUk9MTEJBUjogMHgwMDAwMDAwMCwgV1NfRVhfUlRMUkVBRElORzogMHgwMDAwMjAwMCwNCiAgICAgICAgV1NfRVhfU1RBVElDRURHRTogMHgwMDAyMDAwMCwgV1NfRVhfVE9PTFdJTkRPVzogMHgwMDAwMDA4MCwgV1NfRVhfVE9QTU9TVDogMHgwMDAwMDAwOCwgV1NfRVhfVFJBTlNQQVJFTlQ6IDB4MDAwMDAwMjAsIFdTX0VYX1dJTkRPV0VER0U6IDB4MDAwMDAxMDANCiAgICB9Owo=', 'base64').toString());"); duk_peval_string_noresult(ctx, "addModule('win-console', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBUcmF5SWNvbkZsYWdzID0KICAgIHsKICAgICAgICBOSUZfTUVTU0FHRTogMHgwMDAwMDAwMSwKICAgICAgICBOSUZfSUNPTjogMHgwMDAwMDAwMiwKICAgICAgICBOSUZfVElQOiAweDAwMDAwMDA0LAogICAgICAgIE5JRl9TVEFURTogMHgwMDAwMDAwOCwKICAgICAgICBOSUZfSU5GTzogMHgwMDAwMDAxMCwKICAgICAgICBOSUZfR1VJRDogMHgwMDAwMDAyMCwKICAgICAgICBOSUZfUkVBTFRJTUU6IDB4MDAwMDAwNDAsCiAgICAgICAgTklGX1NIT1dUSVA6IDB4MDAwMDAwODAsCgogICAgICAgIE5JTV9BREQ6IDB4MDAwMDAwMDAsCiAgICAgICAgTklNX01PRElGWTogMHgwMDAwMDAwMSwKICAgICAgICBOSU1fREVMRVRFOiAweDAwMDAwMDAyLAogICAgICAgIE5JTV9TRVRGT0NVUzogMHgwMDAwMDAwMywKICAgICAgICBOSU1fU0VUVkVSU0lPTjogMHgwMDAwMDAwNAogICAgfTsKdmFyIE5PVElGWUlDT05fVkVSU0lPTl80ID0gNDsKdmFyIE1lc3NhZ2VUeXBlcyA9IHsgV01fQVBQOiAweDgwMDAsIFdNX1VTRVI6IDB4MDQwMCB9OwpmdW5jdGlvbiBXaW5kb3dzQ29uc29sZSgpCnsKICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicpCiAgICB7CiAgICAgICAgdGhpcy5fT2JqZWN0SUQgPSAnd2luLWNvbnNvbGUnOwogICAgICAgIHRoaXMuX01hcnNoYWwgPSByZXF1aXJlKCdfR2VuZXJpY01hcnNoYWwnKTsKICAgICAgICB0aGlzLl9rZXJuZWwzMiA9IHRoaXMuX01hcnNoYWwuQ3JlYXRlTmF0aXZlUHJveHkoImtlcm5lbDMyLmRsbCIpOwogICAgICAgIHRoaXMuX3VzZXIzMiA9IHRoaXMuX01hcnNoYWwuQ3JlYXRlTmF0aXZlUHJveHkoInVzZXIzMi5kbGwiKTsKICAgICAgICB0aGlzLl9rZXJuZWwzMi5DcmVhdGVNZXRob2QoIkdldENvbnNvbGVXaW5kb3ciKTsKICAgICAgICB0aGlzLl9rZXJuZWwzMi5DcmVhdGVNZXRob2QoJ0dldEN1cnJlbnRUaHJlYWQnKTsKICAgICAgICB0aGlzLl91c2VyMzIuQ3JlYXRlTWV0aG9kKCJTaG93V2luZG93Iik7CiAgICAgICAgdGhpcy5fdXNlcjMyLkNyZWF0ZU1ldGhvZCgiTG9hZEltYWdlQSIpOwogICAgICAgIHRoaXMuX3VzZXIzMi5DcmVhdGVNZXRob2QoeyBtZXRob2Q6ICdHZXRNZXNzYWdlQScsIHRocmVhZERpc3BhdGNoOiAxIH0pOwogICAgICAgIHRoaXMuX3NoZWxsMzIgPSB0aGlzLl9NYXJzaGFsLkNyZWF0ZU5hdGl2ZVByb3h5KCdTaGVsbDMyLmRsbCcpOwogICAgICAgIHRoaXMuX3NoZWxsMzIuQ3JlYXRlTWV0aG9kKCdTaGVsbF9Ob3RpZnlJY29uQScpOwoKICAgICAgICB0aGlzLl9oYW5kbGUgPSB0aGlzLl9rZXJuZWwzMi5HZXRDb25zb2xlV2luZG93KCk7CiAgICAgICAgdGhpcy5taW5pbWl6ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fdXNlcjMyLlNob3dXaW5kb3codGhpcy5faGFuZGxlLCA2KTsKICAgICAgICB9OwogICAgICAgIHRoaXMucmVzdG9yZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fdXNlcjMyLlNob3dXaW5kb3codGhpcy5faGFuZGxlLCA5KTsKICAgICAgICB9OwogICAgICAgIHRoaXMuaGlkZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fdXNlcjMyLlNob3dXaW5kb3codGhpcy5faGFuZGxlLCAwKTsKICAgICAgICB9OwogICAgICAgIHRoaXMuc2hvdyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fdXNlcjMyLlNob3dXaW5kb3codGhpcy5faGFuZGxlLCA1KTsKICAgICAgICB9OwoKCiAgICAgICAgdGhpcy5fbG9hZGljb24gPSBmdW5jdGlvbiAoaW1hZ2VQYXRoKSB7CiAgICAgICAgICAgIHZhciBoID0gdGhpcy5fdXNlcjMyLkxvYWRJbWFnZUEoMCwgdGhpcy5fTWFyc2hhbC5DcmVhdGVWYXJpYWJsZShpbWFnZVBhdGgpLCAxLCAwLCAwLCAweDAwMDAwMDEwIHwgMHgwMDAwODAwMCB8IDB4MDAwMDAwNDApOyAvLyBMUl9MT0FERlJPTUZJTEUgfCBMUl9TSEFSRUQgfCBMUl9ERUZBVUxUU0laRQogICAgICAgICAgICByZXR1cm4gKGgpOwogICAgICAgIH07CgogICAgICAgIHRoaXMuU2V0VHJheUljb24gPSBmdW5jdGlvbiBTZXRUcmF5SWNvbihvcHRpb25zKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLl9NYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKHRoaXMuX01hcnNoYWwuUG9pbnRlclNpemUgPT0gNCA/IDUwOCA6IDUyOCk7CiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ3N0cnVjdCBzaXplID0gJyArIGRhdGEuX3NpemUpOwogICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdUcnlJY29uLCBXTV9NRVNTQUdFIGZpbHRlciA9ICcgKyBvcHRpb25zLmZpbHRlcik7CiAgICAgICAgICAgIGRhdGEudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKGRhdGEuX3NpemUsIDApOwoKICAgICAgICAgICAgdmFyIHRyYXlUeXBlID0gVHJheUljb25GbGFncy5OSUZfVElQIHwgVHJheUljb25GbGFncy5OSUZfTUVTU0FHRQogICAgICAgICAgICBvcHRpb25zLmZpbHRlciA9IE1lc3NhZ2VUeXBlcy5XTV9BUFAgKyAxOwogICAgICAgICAgICBkYXRhLkRlcmVmKHRoaXMuX01hcnNoYWwuUG9pbnRlclNpemUgPT0gNCA/IDE2IDogMjQsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShvcHRpb25zLmZpbHRlcik7CgogICAgICAgICAgICBpZiAoIW9wdGlvbnMubm9CYWxsb29uKSB7IHRyYXlUeXBlIHw9IFRyYXlJY29uRmxhZ3MuTklGX0lORk87IH0KCiAgICAgICAgICAgIGlmIChvcHRpb25zLmljb24pCiAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB0cmF5VHlwZSB8PSBUcmF5SWNvbkZsYWdzLk5JRl9JQ09OOwogICAgICAgICAgICAgICAgdmFyIGhJY29uID0gZGF0YS5EZXJlZih0aGlzLl9NYXJzaGFsLlBvaW50ZXJTaXplID09IDQgPyAyMCA6IDMyLCB0aGlzLl9NYXJzaGFsLlBvaW50ZXJTaXplKTsKICAgICAgICAgICAgICAgIG9wdGlvbnMuaWNvbi5wb2ludGVyQnVmZmVyKCkuY29weShoSWNvbi50b0J1ZmZlcigpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZGF0YS5EZXJlZih0aGlzLl9NYXJzaGFsLlBvaW50ZXJTaXplICogMiwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKDEpOwogICAgICAgICAgICBkYXRhLkRlcmVmKHRoaXMuX01hcnNoYWwuUG9pbnRlclNpemUgPT0gNCA/IDEyIDogMjAsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSh0cmF5VHlwZSk7CiAgICAgICAgICAgIGRhdGEuRGVyZWYodGhpcy5fTWFyc2hhbC5Qb2ludGVyU2l6ZSA9PSA0ID8gNDE2IDogNDMyLCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoTk9USUZZSUNPTl9WRVJTSU9OXzQpOwoKICAgICAgICAgICAgdmFyIHN6VGlwID0gZGF0YS5EZXJlZih0aGlzLl9NYXJzaGFsLlBvaW50ZXJTaXplID09IDQgPyAyNCA6IDQwLCAxMjgpOwogICAgICAgICAgICB2YXIgc3pJbmZvID0gZGF0YS5EZXJlZih0aGlzLl9NYXJzaGFsLlBvaW50ZXJTaXplID09IDQgPyAxNjAgOiAxNzYsIDI1Nik7CiAgICAgICAgICAgIHZhciBzekluZm9UaXRsZSA9IGRhdGEuRGVyZWYodGhpcy5fTWFyc2hhbC5Qb2ludGVyU2l6ZSA9PSA0ID8gNDIwIDogNDM2LCA2NCk7CgogICAgICAgICAgICBpZiAob3B0aW9ucy5zelRpcCkgeyBCdWZmZXIuZnJvbShvcHRpb25zLnN6VGlwKS5jb3B5KHN6VGlwLnRvQnVmZmVyKCkpOyB9CiAgICAgICAgICAgIGlmIChvcHRpb25zLnN6SW5mbykgeyBCdWZmZXIuZnJvbShvcHRpb25zLnN6SW5mbykuY29weShzekluZm8udG9CdWZmZXIoKSk7IH0KICAgICAgICAgICAgaWYgKG9wdGlvbnMuc3pJbmZvVGl0bGUpIHsgQnVmZmVyLmZyb20ob3B0aW9ucy5zekluZm9UaXRsZSkuY29weShzekluZm9UaXRsZS50b0J1ZmZlcigpKTsgfQoKCiAgICAgICAgICAgIHZhciBNZXNzYWdlUHVtcCA9IHJlcXVpcmUoJ3dpbi1tZXNzYWdlLXB1bXAnKTsKICAgICAgICAgICAgcmV0VmFsID0geyBfT2JqZWN0SUQ6ICdXaW5kb3dzQ29uc29sZS5UcmF5SWNvbicsIE1lc3NhZ2VQdW1wOiBuZXcgTWVzc2FnZVB1bXAob3B0aW9ucykgfTsKICAgICAgICAgICAgdmFyIHJldFZhbEV2ZW50cyA9IHJlcXVpcmUoJ2V2ZW50cycpLmluaGVyaXRzKHJldFZhbCk7CiAgICAgICAgICAgIHJldFZhbEV2ZW50cy5jcmVhdGVFdmVudCgnVG9hc3RDbGlja2VkJyk7CiAgICAgICAgICAgIHJldFZhbEV2ZW50cy5jcmVhdGVFdmVudCgnSWNvbkhvdmVyJyk7CiAgICAgICAgICAgIHJldFZhbEV2ZW50cy5jcmVhdGVFdmVudCgnVG9hc3REaXNtaXNzZWQnKTsKICAgICAgICAgICAgcmV0VmFsLk9wdGlvbnMgPSBvcHRpb25zOwogICAgICAgICAgICByZXRWYWwuTWVzc2FnZVB1bXAuVHJheUljb24gPSByZXRWYWw7CiAgICAgICAgICAgIHJldFZhbC5NZXNzYWdlUHVtcC5Ob3RpZnlEYXRhID0gZGF0YTsKICAgICAgICAgICAgcmV0VmFsLk1lc3NhZ2VQdW1wLldpbmRvd3NDb25zb2xlID0gdGhpczsKICAgICAgICAgICAgcmV0VmFsLk1lc3NhZ2VQdW1wLm9uKCdleGl0JywgZnVuY3Rpb24gb25FeGl0KGNvZGUpIHsgY29uc29sZS5sb2coJ1B1bXAgRXhpdGVkJyk7IGlmICh0aGlzLlRyYXlJY29uKSB7IHRoaXMuVHJheUljb24ucmVtb3ZlKCk7IH0gfSk7CiAgICAgICAgICAgIHJldFZhbC5NZXNzYWdlUHVtcC5vbignaHduZCcsIGZ1bmN0aW9uIG9uSHduZChoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdHb3QgSFdORCcpOwogICAgICAgICAgICAgICAgb3B0aW9ucy5od25kID0gaDsKICAgICAgICAgICAgICAgIGgucG9pbnRlckJ1ZmZlcigpLmNvcHkodGhpcy5Ob3RpZnlEYXRhLkRlcmVmKHRoaXMuV2luZG93c0NvbnNvbGUuX01hcnNoYWwuUG9pbnRlclNpemUsIHRoaXMuV2luZG93c0NvbnNvbGUuX01hcnNoYWwuUG9pbnRlclNpemUpLnRvQnVmZmVyKCkpOwoKICAgICAgICAgICAgICAgIGlmKHRoaXMuV2luZG93c0NvbnNvbGUuX3NoZWxsMzIuU2hlbGxfTm90aWZ5SWNvbkEoVHJheUljb25GbGFncy5OSU1fQURELCB0aGlzLk5vdGlmeURhdGEpLlZhbCA9PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIFNvbWV0aGluZyB3ZW50IHdyb25nCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXRWYWwuTWVzc2FnZVB1bXAub24oJ21lc3NhZ2UnLCBmdW5jdGlvbiBvbldpbmRvd3NNZXNzYWdlKG1zZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYobXNnLm1lc3NhZ2UgPT0gdGhpcy5UcmF5SWNvbi5PcHRpb25zLmZpbHRlcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaGFuZGxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmIChtc2cud3BhcmFtID09IDEgJiYgbXNnLmxwYXJhbSA9PSAxMDI5KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5UcmF5SWNvbi5lbWl0KCdUb2FzdENsaWNrZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChtc2cud3BhcmFtID09IDEgJiYgbXNnLmxwYXJhbSA9PSA1MTIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlRyYXlJY29uLmVtaXQoJ0ljb25Ib3ZlcicpOwogICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuVHJheUljb24uT3B0aW9ucy5iYWxsb29uT25seSAmJiBtc2cud3BhcmFtID09IDEgJiYgKG1zZy5scGFyYW0gPT0gMTAyOCB8fCBtc2cubHBhcmFtID09IDEwMjkpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5UcmF5SWNvbi5lbWl0KCdUb2FzdERpc21pc3NlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlRyYXlJY29uLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXRWYWwucmVtb3ZlID0gZnVuY3Rpb24gcmVtb3ZlKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5NZXNzYWdlUHVtcC5XaW5kb3dzQ29uc29sZS5fc2hlbGwzMi5TaGVsbF9Ob3RpZnlJY29uQShUcmF5SWNvbkZsYWdzLk5JTV9ERUxFVEUsIHRoaXMuTWVzc2FnZVB1bXAuTm90aWZ5RGF0YSk7CiAgICAgICAgICAgICAgICB0aGlzLk1lc3NhZ2VQdW1wLnN0b3AoKTsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLk1lc3NhZ2VQdW1wLlRyYXlJY29uOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuTWVzc2FnZVB1bXA7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHJldHVybiAocmV0VmFsKTsKICAgICAgICAgICAgCiAgICAgICAgfTsKICAgIH0KfQoKbW9kdWxlLmV4cG9ydHMgPSBuZXcgV2luZG93c0NvbnNvbGUoKTs=', 'base64').toString());"); // Windows Cert Store, refer to modules/win-certstore.js diff --git a/modules/win-message-pump.js b/modules/win-message-pump.js index 79c590c..6c05cf0 100644 --- a/modules/win-message-pump.js +++ b/modules/win-message-pump.js @@ -37,15 +37,16 @@ function WindowsMessagePump(options) this._user32 = GM.CreateNativeProxy('User32.dll'); this._user32.mp = this; - this._user32.CreateMethod('GetMessageA'); this._user32.CreateMethod('CreateWindowExA'); - this._user32.CreateMethod('TranslateMessage'); - this._user32.CreateMethod('DispatchMessageA'); - this._user32.CreateMethod('RegisterClassExA'); this._user32.CreateMethod('DefWindowProcA'); + this._user32.CreateMethod('DestroyWindow'); + this._user32.CreateMethod('DispatchMessageA'); + this._user32.CreateMethod('GetMessageA'); this._user32.CreateMethod('PostMessageA'); - this._user32.CreateMethod('ShowWindow'); + this._user32.CreateMethod('RegisterClassExA'); this._user32.CreateMethod('SetWindowPos'); + this._user32.CreateMethod('ShowWindow'); + this._user32.CreateMethod('TranslateMessage'); this.wndclass = GM.CreateVariable(GM.PointerSize == 4 ? 48 : 80); @@ -160,8 +161,15 @@ function WindowsMessagePump(options) else { // We got a 'QUIT' message - delete this.nativeProxy.mp._hwnd; - this.nativeProxy.mp.emit('exit', 0); + this.nativeProxy.DestroyWindow.async(this.nativeProxy.RegisterClassExA.async, this.nativeProxy.mp._hwnd).then(function () + { + this.nativeProxy.RegisterClassExA.async.abort(); + delete this.nativeProxy.mp._hwnd; + this.nativeProxy.mp.emit('exit', 0); + + this.nativeProxy.mp.wndclass.wndproc.removeAllListeners('GlobalCallback'); + this.nativeProxy.mp.wndclass.wndproc = null; + }); } }, function (err) { this.nativeProxy.mp.stop(); }); }