From 00b613fcb12e97e500a09d8c640d1a279cca6c3d Mon Sep 17 00:00:00 2001 From: Bryan Roe Date: Wed, 8 Apr 2020 13:11:39 -0700 Subject: [PATCH] Added try/catch around getLibInfo() to fix an issue on ChromeOS --- microscript/ILibDuktape_Polyfills.c | 11 ++++++----- modules/monitor-info.js | 13 ++++++++++--- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index 0826a77..97cbbc5 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -2100,11 +2100,12 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) #endif // monitor-info: Refer to modules/monitor-info.js - char *_monitorinfo = ILibMemory_Allocate(54866, 0, NULL, NULL); - memcpy_s(_monitorinfo + 0, 31352, "LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBwcm9taXNlID0gcmVxdWlyZSgncHJvbWlzZScpOwp2YXIgUFBvc2l0aW9uID0gNDsKdmFyIFBTaXplID0gODsKdmFyIFBNaW5TaXplID0gMSA8PCA0Owp2YXIgUE1heFNpemUgPSAxIDw8IDU7CnZhciBfTkVUX1dNX1NUQVRFX1JFTU9WRSA9IDA7ICAgIC8vIHJlbW92ZS91bnNldCBwcm9wZXJ0eQp2YXIgX05FVF9XTV9TVEFURV9BREQgPSAxOyAgICAvLyBhZGQvc2V0IHByb3BlcnR5CnZhciBfTkVUX1dNX1NUQVRFX1RPR0dMRSA9IDI7ICAgIC8vIHRvZ2dsZSBwcm9wZXJ0eQp2YXIgU3Vic3RydWN0dXJlUmVkaXJlY3RNYXNrID0gKDEgPDwgMjApOwp2YXIgU3Vic3RydWN0dXJlTm90aWZ5TWFzayA9ICgxIDw8IDE5KTsKdmFyIFByb3BNb2RlUmVwbGFjZSA9IDA7CnZhciBYQV9BVE9NID0gNDsKdmFyIE1XTV9ISU5UU19GVU5DVElPTlMgPSAoMSA8PCAwKTsKdmFyIE1XTV9ISU5UU19ERUNPUkFUSU9OUyA9ICgxIDw8IDEpOwp2YXIgQ2xpZW50TWVzc2FnZSA9IDMzOwoKZnVuY3Rpb24gZ2V0TGliSW5mbyhsaWJuYW1lKQp7CiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSAhPSAnbGludXgnKSB7IHRocm93ICgnT25seSBzdXBwb3J0ZWQgb24gbGludXgnKTsgfQoKICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICBjaGlsZC5zdGRpbi53cml0ZSgid2hlcmVpcyBsZGNvbmZpZyB8IGF3ayAneyBwcmludCAkMiB9J1xuZXhpdFxuIik7CiAgICBjaGlsZC53YWl0RXhpdCgpOwoKICAgIHZhciBsZGNvbmZpZyA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpOwoKICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgIGNoaWxkLnN0ZGluLndyaXRlKGxkY29uZmlnICsgIiAtcCB8IGdyZXAgJyIgKyBsaWJuYW1lICsgIi5zby4nIHwgdHIgJ1xcbicgJ14nIHwgYXdrIC1GXiAneyBwcmludGYgXCJbXCI7IGZvcihpPTE7aTw9TkY7KytpKSB7IiArICcgc3BsaXQoJGksIHBsYXQsICIpIik7IHNwbGl0KHBsYXRbMV0sIHBsYXQyLCAiKCIpOyBpZm94PXNwbGl0KHBsYXQyWzJdLCBpZm8sICIsIik7IGxpYmM9IiI7IGh3Y2FwPSIwIjsgZm9yKGlmb2k9MTtpZm9pPD1pZm94OysraWZvaSkgeyBpZihzcGxpdChpZm9baWZvaV0sIGpuaywgImxpYmMiKT09MikgeyBsaWJjPWlmb1tpZm9pXTsgfSBpZihzcGxpdChpZm9baWZvaV0sIGpuaywgImh3Y2FwOiIpPT0yKSB7IHNwbGl0KGlmb1tpZm9pXSwgam5rLCAiMHgiKTsgaHdjYXA9am5rWzJdOyB9ICAgfSAgICAgIHg9c3BsaXQoJGksIHRvaywgIiAiKTsgaWYodG9rWzFdIT0iIikgeyBwcmludGYgIiVze1xcImxpYlxcIjogXFwiJXNcXCIsIFxcInBhdGhcXCI6IFxcIiVzXFwiLCBcXCJod2NhcFxcIjogXFwiJXNcXCIsIFxcImxpYmNcXCI6IFxcIiVzXFwifSIsIChpIT0xPyIsIjoiIiksIHRva1sxXSwgdG9rW3hdLCBod2NhcCwgbGliYzsgfX0gcHJpbnRmICJdIjsgfVwnXG5leGl0XG4nKTsKCiAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgdmFyIHYgPSBKU09OLnBhcnNlKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsKICAgIHJldHVybiAodik7Cn0KCmZ1bmN0aW9uIG1vbml0b3JpbmZvKCkKewogICAgdGhpcy5fT2JqZWN0SUQgPSAnbW9uaXRvci1pbmZvJzsKICAgIHRoaXMuX2dtID0gcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJyk7CgogICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJykKICAgIHsKICAgICAgICB0aGlzLl91c2VyMzIgPSB0aGlzLl9nbS5DcmVhdGVOYXRpdmVQcm94eSgndXNlcjMyLmRsbCcpOwogICAgICAgIHRoaXMuX3VzZXIzMi5DcmVhdGVNZXRob2QoJ0VudW1EaXNwbGF5TW9uaXRvcnMnKTsKICAgICAgICB0aGlzLl9rZXJuZWwzMiA9IHRoaXMuX2dtLkNyZWF0ZU5hdGl2ZVByb3h5KCdrZXJuZWwzMi5kbGwnKTsKICAgICAgICB0aGlzLl9rZXJuZWwzMi5DcmVhdGVNZXRob2QoJ0dldExhc3RFcnJvcicpOwoKICAgICAgICB0aGlzLmdldEluZm8gPSBmdW5jdGlvbiBnZXRJbmZvKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBpbmZvID0gdGhpczsKICAgICAgICAgICAgcmV0dXJuIChuZXcgcHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZXIsIHJlamVjdG9yKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9tb25pdG9yaW5mbyA9IHsgcmVzb2x2ZXI6IHJlc29sdmVyLCByZWplY3RvcjogcmVqZWN0b3IsIHNlbGY6IGluZm8sIGNhbGxiYWNrOiBpbmZvLl9nbS5HZXRHZW5lcmljR2xvYmFsQ2FsbGJhY2soNCkgfTsKICAgICAgICAgICAgICAgIHRoaXMuX21vbml0b3JpbmZvLmNhbGxiYWNrLmluZm8gPSB0aGlzLl9tb25pdG9yaW5mbzsKICAgICAgICAgICAgICAgIHRoaXMuX21vbml0b3JpbmZvLmR3RGF0YSA9IGluZm8uX2dtLk9iamVjdFRvUHRyKHRoaXMuX21vbml0b3JpbmZvKTsKCiAgICAgICAgICAgICAgICB0aGlzLl9tb25pdG9yaW5mby5jYWxsYmFjay5yZXN1bHRzID0gW107CiAgICAgICAgICAgICAgICB0aGlzLl9tb25pdG9yaW5mby5jYWxsYmFjay5vbignR2xvYmFsQ2FsbGJhY2snLCBmdW5jdGlvbiBPbk1vbml0b3JJbmZvKGhtb24sIGhkYywgciwgdXNlcikgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLk9iamVjdFRvUHRyX1ZlcmlmeSh0aGlzLmluZm8sIHVzZXIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByYiA9IHIuRGVyZWYoMCwgMTYpLnRvQnVmZmVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0cy5wdXNoKHsgbGVmdDogcmIucmVhZEludDMyTEUoMCksIHRvcDogcmIucmVhZEludDMyTEUoNCksIHJpZ2h0OiByYi5yZWFkSW50MzJMRSg4KSwgYm90dG9tOiByYi5yZWFkSW50MzJMRSgxMikgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMuaW5mby5zZWxmLl9nbS5DcmVhdGVJbnRlZ2VyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHIuVmFsID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBpZiAoaW5mby5fdXNlcjMyLkVudW1EaXNwbGF5TW9uaXRvcnMoMCwgMCwgdGhpcy5fbW9uaXRvcmluZm8uY2FsbGJhY2ssIHRoaXMuX21vbml0b3JpbmZvLmR3RGF0YSkuVmFsID09IDApIHsKICAgICAgICAgICAgICAgICAgICByZWplY3RvcignTGFzdEVycm9yPScgKyBpbmZvLl9rZXJuZWwzMi5HZXRMYXN0RXJyb3IoKS5WYWwpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJlc29sdmVyKHRoaXMuX21vbml0b3JpbmZvLmNhbGxiYWNrLnJlc3VsdHMpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JykKICAgIHsKICAgICAgICAvLyBGaXJzdCB0aGluZyB3ZSBuZWVkIHRvIGRvLCBpcyBkZXRlcm1pbmUgd2hlcmUgdGhlIFgxMSBsaWJyYXJpZXMgYXJlCgogICAgICAgIC8vIFN1ZmZpY2llbnQgYWNjZXNzIHJpZ2h0cyB0byB1c2UgbGRjb25maWcKICAgICAgICB2YXIgeDExaW5mbyA9IGdldExpYkluZm8oJ2xpYlgxMScpOwogICAgICAgIHZhciB4dHN0aW5mbyA9IGdldExpYkluZm8oJ2xpYlh0c3QnKTsKICAgICAgICB2YXIgeGV4dGluZm8gPSBnZXRMaWJJbmZvKCdsaWJYZXh0Jyk7CiAgICAgICAgdmFyIHhmaXhlc2luZm8gPSBnZXRMaWJJbmZvKCdsaWJYZml4ZXMnKTsKICAgICAgICB2YXIgaXg7CgogICAgICAgIGZvciAoaXggaW4geDExaW5mbykKICAgICAgICB7CiAgICAgICAgICAgIGlmICh4MTFpbmZvLmxlbmd0aCA9PSAxIHx8IHgxMWluZm9baXhdLmh3Y2FwID09ICIwIikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0cnkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX2dtLkNyZWF0ZU5hdGl2ZVByb3h5KHgxMWluZm9baXhdLnBhdGgpOwogICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnTG9jYXRpb25fWDExTElCJywgeyB2YWx1ZTogeDExaW5mb1tpeF0ucGF0aCB9KTsKICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZXgpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yIChpeCBpbiB4dHN0aW5mbykKICAgICAgICB7CiAgICAgICAgICAgIGlmICh4dHN0aW5mby5sZW5ndGggPT0gMSB8fCB4dHN0aW5mb1tpeF0uaHdjYXAgPT0gIjAiKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ20uQ3JlYXRlTmF0aXZlUHJveHkoeHRzdGluZm9baXhdLnBhdGgpOwogICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnTG9jYXRpb25fWDExVFNUJywgeyB2YWx1ZTogeHRzdGluZm9baXhdLnBhdGggfSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGV4KQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAoaXggaW4geGV4dGluZm8pCiAgICAgICAgewogICAgICAgICAgICBpZiAoeGV4dGluZm8ubGVuZ3RoID09IDEgfHwgeGV4dGluZm9baXhdLmh3Y2FwID09ICIwIikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0cnkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX2dtLkNyZWF0ZU5hdGl2ZVByb3h5KHhleHRpbmZvW2l4XS5wYXRoKTsKICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0xvY2F0aW9uX1gxMUVYVCcsIHsgdmFsdWU6IHhleHRpbmZvW2l4XS5wYXRoIH0pOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChleCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKGl4IGluIHhmaXhlc2luZm8pCiAgICAgICAgewogICAgICAgICAgICBpZiAoeGZpeGVzaW5mby5sZW5ndGggPT0gMSB8fCB4Zml4ZXNpbmZvW2l4XS5od2NhcCA9PSAiMCIpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9nbS5DcmVhdGVOYXRpdmVQcm94eSh4Zml4ZXNpbmZvW2l4XS5wYXRoKTsKICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0xvY2F0aW9uX1gxMUZJWEVTJywgeyB2YWx1ZTogeGZpeGVzaW5mb1tpeF0ucGF0aCB9KTsKICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZXgpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0KICAgICAgICB9ICAgCgogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52WydMb2NhdGlvbl9YMTFMSUInXSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0xvY2F0aW9uX1gxMUxJQicsIHsgdmFsdWU6IHByb2Nlc3MuZW52WydMb2NhdGlvbl9YMTFMSUInXSB9KTsgfQogICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnZbJ0xvY2F0aW9uX1gxMVRTVCddKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnTG9jYXRpb25fWDExVFNUJywgeyB2YWx1ZTogcHJvY2Vzcy5lbnZbJ0xvY2F0aW9uX1gxMVRTVCddIH0pOyB9CiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudlsnTG9jYXRpb25fWDExRVhUJ10pIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdMb2NhdGlvbl9YMTFFWFQnLCB7IHZhbHVlOiBwcm9jZXNzLmVudlsnTG9jYXRpb25fWDExRVhUJ10gfSk7IH0KICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52WydMb2NhdGlvbl9YMTFGSVhFUyddKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnTG9jYXRpb25fWDExRklYRVMnLCB7IHZhbHVlOiBwcm9jZXNzLmVudlsnTG9jYXRpb25fWDExRklYRVMnXSB9KTsgfQogICAgICAgIH0KICAgICAgICBjYXRjaChleCkKICAgICAgICB7CiAgICAgICAgfQogICAgfQogICAgaWYocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZnJlZWJzZCcpCiAgICB7CgkgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdMb2NhdGlvbl9YMTFMSUInLCB7IHZhbHVlOiByZXF1aXJlKCdsaWItZmluZGVyJykoJ2xpYlgxMScpWzBdP3JlcXVpcmUoJ2xpYi1maW5kZXInKSgnbGliWDExJylbMF0ubG9jYXRpb246IHVuZGVmaW5lZCB9KTsKCSAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0xvY2F0aW9uX1gxMVRTVCcsIHsgdmFsdWU6IHJlcXVpcmUoJ2xpYi1maW5kZXInKSgnbGliWHRzdCcpWzBdP3JlcXVpcmUoJ2xpYi1maW5kZXInKSgnbGliWHRzdCcpWzBdLmxvY2F0aW9uOnVuZGVmaW5lZCB9KTsKCSAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0xvY2F0aW9uX1gxMUVYVCcsIHsgdmFsdWU6IHJlcXVpcmUoJ2xpYi1maW5kZXInKSgnbGliWGV4dCcpWzBdID8gcmVxdWlyZSgnbGliLWZpbmRlcicpKCdsaWJYZXh0JylbMF0ubG9jYXRpb24gOiB1bmRlZmluZWQgfSk7CgkgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdMb2NhdGlvbl9YMTFGSVhFUycsIHsgdmFsdWU6IHJlcXVpcmUoJ2xpYi1maW5kZXInKSgnbGliWGZpeGVzJylbMF0gPyByZXF1aXJlKCdsaWItZmluZGVyJykoJ2xpYlhmaXhlcycpWzBdLmxvY2F0aW9uIDogdW5kZWZpbmVkIH0pOwogICAgfQoKICAgIGlmKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JyB8fCBwcm9jZXNzLnBsYXRmb3JtID09ICdmcmVlYnNkJykKICAgIHsKICAgICAgICB0aGlzLk1PVElGX0ZMQUdTID0gCiAgICAgICAgewogICAgICAgICAgICBNV01fRlVOQ19BTEwgICAgICAgIDogKDEgPDwgMCkgLAogICAgICAgICAgICBNV01fRlVOQ19SRVNJWkUgICAgIDogKDEgPDwgMSkgLAogICAgICAgICAgICBNV01fRlVOQ19NT1ZFICAgICAgIDogKDEgPDwgMikgLAogICAgICAgICAgICBNV01fRlVOQ19NSU5JTUlaRSAgIDogKDEgPDwgMykgLAogICAgICAgICAgICBNV01fRlVOQ19NQVhJTUlaRSAgIDogKDEgPDwgNCkgLAogICAgICAgICAgICBNV01fRlVOQ19DTE9TRSAgICAgIDogKDEgPDwgNSkgCiAgICAgICAgfTsKCgogICAgICAgIGlmICh0aGlzLkxvY2F0aW9uX1gxMUxJQiAmJiB0aGlzLkxvY2F0aW9uX1gxMVRTVCAmJiB0aGlzLkxvY2F0aW9uX1gxMUVYVCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgIGNoLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uICgpIHsgfSk7CiAgICAgICAgICAgIGNoLnN0ZG91dC5zdHIgPSAnJzsgY2guc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2guc3RkaW4ud3JpdGUoJ3BzIC1lIHwgZ3JlcCBYXG5leGl0XG4nKTsKICAgICAgICAgICAgY2gud2FpdEV4aXQoKTsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdrdm1feDExX3N1cHBvcnQnLCB7IHZhbHVlOiBjaC5zdGRvdXQuc3RyLnRyaW0oKSA9PSAnJyA/IGZhbHNlIDogdHJ1ZSB9KTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdrdm1feDExX3N1cHBvcnQnLCB7IHZhbHVlOiBmYWxzZSB9KTsKICAgICAgICB9CgoKICAgICAgICBpZiAodGhpcy5Mb2NhdGlvbl9YMTFMSUIpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLl9YMTEgPSB0aGlzLl9nbS5DcmVhdGVOYXRpdmVQcm94eSh0aGlzLkxvY2F0aW9uX1gxMUxJQik7CiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hDaGFuZ2VQcm9wZXJ0eScpOwogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYQ2xvc2VEaXNwbGF5Jyk7CiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hDb25uZWN0aW9uTnVtYmVyJyk7CiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hDb252ZXJ0U2VsZWN0aW9uJyk7CiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hDcmVhdGVHQycpOwogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYQ3JlYXRlV2luZG93Jyk7CiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hDcmVhdGVTaW1wbGVXaW5kb3cnKTsKICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWERlZmF1bHRDb2xvcm1hcCcpOwogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYRGVmYXVsdFNjcmVlbicpOwogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYRGVzdHJveVdpbmRvdycpOwogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYRHJhd0xpbmUnKTsKICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWERpc3BsYXlIZWlnaHQnKTsKICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWERpc3BsYXlXaWR0aCcpOwogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYRmV0Y2hOYW1lJyk7CiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hGbHVzaCcpOwogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYRnJlZScpOwogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYQ3JlYXRlR0MnKTsKICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWEdldEF0b21OYW1lJyk7CiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hHZXRXaW5kb3dQcm9wZXJ0eScpOwogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYSW50ZXJuQXRvbScpOwogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYTWFwV2luZG93Jyk7CiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoeyBtZXRob2Q6ICdYTmV4dEV2ZW50JywgdGhyZWFkRGlzcGF0Y2g6IHRydWUgfSk7CiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoeyBtZXRob2Q6ICdYTmV4dEV2ZW50JywgbmV3TmFtZTogJ1hOZXh0RXZlbnRTeW5jJyB9KTsKICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWE9wZW5EaXNwbGF5Jyk7CiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hQZW5kaW5nJyk7CiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hSb290V2luZG93Jyk7CiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hTZWxlY3RJbnB1dCcpOwogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYU2NyZWVuQ291bnQnKTsKICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWFNjcmVlbk9mRGlzcGxheScpOwogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYU2VsZWN0SW5wdXQnKTsKICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWFNlbmRFdmVudCcpOwogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYU2V0Rm9yZWdyb3VuZCcpOwogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYU2V0RnVuY3Rpb24nKTsKICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWFNldExpbmVBdHRyaWJ1dGVzJyk7CiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hTZXROb3JtYWxIaW50cycpOwogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYU2V0U2VsZWN0aW9uT3duZXInKTsKICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWFNldFN1YndpbmRvd01vZGUnKTsKICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWFNldFdNUHJvdG9jb2xzJyk7CiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hTdG9yZU5hbWUnKTsKICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWFN5bmMnKTsKICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWEJsYWNrUGl4ZWwnKTsKICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWFdoaXRlUGl4ZWwnKTsKICAgICAgICB9CgogICAgICAgIHRoaXMuaXNVbml0eSA9IGZ1bmN0aW9uIGlzVW5pdHkoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIChwcm9jZXNzLmVudlsnWERHX0NVUlJFTlRfREVTS1RPUCddID09ICdVbml0eScpOwogICAgICAgIH0KCiAgICAgICAgdGhpcy51bkRlY29yYXRlV2luZG93ID0gZnVuY3Rpb24gdW5EZWNvcmF0ZVdpbmRvdyhkaXNwbGF5LCB3aW5kb3cpCiAgICAgICAgewogICAgICAgICAgICB2YXIgTXdtSGludHMgPSB0aGlzLl9nbS5DcmVhdGVWYXJpYWJsZSg0MCk7CiAgICAgICAgICAgIHZhciBtd21IaW50c1Byb3BlcnR5ID0gdGhpcy5fWDExLlhJbnRlcm5BdG9tKGRpc3BsYXksIHRoaXMuX2dtLkNyZWF0ZVZhcmlhYmxlKCdfTU9USUZfV01fSElOVFMnKSwgMCk7CiAgICAgICAgICAgIE13bUhpbnRzLkRlcmVmKDAsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSgxIDw8IDEpOwogICAgICAgICAgICB0aGlzLl9YMTEuWENoYW5nZVByb3BlcnR5KGRpc3BsYXksIHdpbmRvdywgbXdtSGludHNQcm9wZXJ0eSwgbXdtSGludHNQcm9wZXJ0eSwgMzIsIDAsIE13bUhpbnRzLCA1KTsKICAgICAgICB9CiAgICAgICAgdGhpcy5zZXRBbGxvd2VkQWN0aW9ucyA9IGZ1bmN0aW9uIHNldEFsbG93ZWRBY3Rpb25zKGRpc3BsYXksIHdpbmRvdywgZmxhZ3MpCiAgICAgICAgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgTVdNX0hJTlRTX0ZVTkNUSU9OUyA9ICgxTCA8PCAwKSwKICAg", 16000); - memcpy_s(_monitorinfo + 16000, 15352, "ICAgICAgICAgICAgIE1XTV9ISU5UU19ERUNPUkFUSU9OUyA9ICAoMUwgPDwgMSksCgogICAgICAgICAgICAgICAgTVdNX0ZVTkNfQUxMID0gKDFMIDw8IDApLAogICAgICAgICAgICAgICAgTVdNX0ZVTkNfUkVTSVpFID0gKDFMIDw8IDEpLAogICAgICAgICAgICAgICAgTVdNX0ZVTkNfTU9WRSA9ICgxTCA8PCAyKSwKICAgICAgICAgICAgICAgIE1XTV9GVU5DX01JTklNSVpFID0gKDFMIDw8IDMpLAogICAgICAgICAgICAgICAgTVdNX0ZVTkNfTUFYSU1JWkUgPSAoMUwgPDwgNCksCiAgICAgICAgICAgICAgICBNV01fRlVOQ19DTE9TRSA9ICgxTCA8PCA1KQogICAgICAgICAgICAqLwoKICAgICAgICAgICAgdmFyIE13bUhpbnRzID0gdGhpcy5fZ20uQ3JlYXRlVmFyaWFibGUoNDApOwogICAgICAgICAgICB2YXIgbXdtSGludHNQcm9wZXJ0eSA9IHRoaXMuX1gxMS5YSW50ZXJuQXRvbShkaXNwbGF5LCB0aGlzLl9nbS5DcmVhdGVWYXJpYWJsZSgnX01PVElGX1dNX0hJTlRTJyksIDApOwoKICAgICAgICAgICAgTXdtSGludHMuRGVyZWYoMCwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKE1XTV9ISU5UU19GVU5DVElPTlMpOwogICAgICAgICAgICBNd21IaW50cy5EZXJlZih0aGlzLl9nbS5Qb2ludGVyU2l6ZSwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKGZsYWdzKTsKCiAgICAgICAgICAgIHRoaXMuX1gxMS5YQ2hhbmdlUHJvcGVydHkoZGlzcGxheSwgd2luZG93LCBtd21IaW50c1Byb3BlcnR5LCBtd21IaW50c1Byb3BlcnR5LCAzMiwgUHJvcE1vZGVSZXBsYWNlLCBNd21IaW50cywgNSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuc2V0V2luZG93U2l6ZUhpbnRzID0gZnVuY3Rpb24gc2V0V2luZG93U2l6ZUhpbnRzKGRpc3BsYXksIHdpbmRvdywgeCwgeSwgd2lkdGgsIGhlaWdodCwgbWluV2lkdGgsIG1pbkhlaWdodCwgbWF4V2lkdGgsIG1heEhlaWdodCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzaXplSGludHMgPSB0aGlzLl9nbS5DcmVhdGVWYXJpYWJsZSg4MCk7CiAgICAgICAgICAgIHZhciBzcGVjID0gUFBvc2l0aW9uIHwgUFNpemU7CiAgICAgICAgICAgIGlmIChtaW5XaWR0aCAhPSBudWxsICYmIG1pbkhlaWdodCAhPSBudWxsKSB7IHNwZWMgfD0gUE1pblNpemU7IH0KICAgICAgICAgICAgaWYgKG1heFdpZHRoICE9IG51bGwgJiYgbWF4SGVpZ2h0ICE9IG51bGwpIHsgc3BlYyB8PSBQTWF4U2l6ZTsgfQoKICAgICAgICAgICAgc2l6ZUhpbnRzLkRlcmVmKDAsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShzcGVjKTsKICAgICAgICAgICAgc2l6ZUhpbnRzLkRlcmVmKHRoaXMuX2dtLlBvaW50ZXJTaXplLCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoeCk7CiAgICAgICAgICAgIHNpemVIaW50cy5EZXJlZih0aGlzLl9nbS5Qb2ludGVyU2l6ZSArIDQsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSh5KTsKICAgICAgICAgICAgc2l6ZUhpbnRzLkRlcmVmKHRoaXMuX2dtLlBvaW50ZXJTaXplICsgOCwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKHdpZHRoKTsKICAgICAgICAgICAgc2l6ZUhpbnRzLkRlcmVmKHRoaXMuX2dtLlBvaW50ZXJTaXplICsgMTIsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShoZWlnaHQpOwogICAgICAgICAgICBpZiAobWluV2lkdGggIT0gbnVsbCkgeyBzaXplSGludHMuRGVyZWYodGhpcy5fZ20uUG9pbnRlclNpemUgKyAxNiwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKG1pbldpZHRoKTsgfQogICAgICAgICAgICBpZiAobWluSGVpZ2h0ICE9IG51bGwpIHsgc2l6ZUhpbnRzLkRlcmVmKHRoaXMuX2dtLlBvaW50ZXJTaXplICsgMjAsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShtaW5IZWlnaHQpOyB9CiAgICAgICAgICAgIGlmIChtYXhXaWR0aCAhPSBudWxsKSB7IHNpemVIaW50cy5EZXJlZih0aGlzLl9nbS5Qb2ludGVyU2l6ZSArIDI0LCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUobWF4V2lkdGgpOyB9CiAgICAgICAgICAgIGlmIChtYXhIZWlnaHQgIT0gbnVsbCkgeyBzaXplSGludHMuRGVyZWYodGhpcy5fZ20uUG9pbnRlclNpemUgKyAyOCwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKG1heEhlaWdodCk7IH0KCiAgICAgICAgICAgIHRoaXMuX1gxMS5YU2V0Tm9ybWFsSGludHMoZGlzcGxheSwgd2luZG93LCBzaXplSGludHMpOwogICAgICAgIH0KICAgICAgICB0aGlzLnNldEFsd2F5c09uVG9wID0gZnVuY3Rpb24gc2V0QWx3YXlzT25Ub3AoZGlzcGxheSwgcm9vdFdpbmRvdywgd2luZG93KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHdtTmV0V21TdGF0ZSA9IHRoaXMuX1gxMS5YSW50ZXJuQXRvbShkaXNwbGF5LCB0aGlzLl9nbS5DcmVhdGVWYXJpYWJsZSgnX05FVF9XTV9TVEFURScpLCAxKTsKICAgICAgICAgICAgdmFyIHdtU3RhdGVBYm92ZSA9IHRoaXMuX1gxMS5YSW50ZXJuQXRvbShkaXNwbGF5LCB0aGlzLl9nbS5DcmVhdGVWYXJpYWJsZSgnX05FVF9XTV9TVEFURV9BQk9WRScpLCAxKTsKCiAgICAgICAgICAgIHZhciB4Y2xpZW50ID0gdGhpcy5fZ20uQ3JlYXRlVmFyaWFibGUoOTYpOwogICAgICAgICAgICB4Y2xpZW50LkRlcmVmKDAsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSgzMyk7ICAgICAgICAgICAgICAgICAgIC8vIENsaWVudE1lc3NhZ2UgdHlwZQogICAgICAgICAgICB4Y2xpZW50LkRlcmVmKHRoaXMuX2dtLlBvaW50ZXJTaXplID09IDggPyA0OCA6IDI0LCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoMzIpOyAgIC8vIEZvcm1hdCAzMgogICAgICAgICAgICB3bU5ldFdtU3RhdGUucG9pbnRlckJ1ZmZlcigpLmNvcHkoeGNsaWVudC5EZXJlZih0aGlzLl9nbS5Qb2ludGVyU2l6ZSA9PSA4ID8gNDAgOiAyMCwgdGhpcy5fZ20uUG9pbnRlclNpemUpLnRvQnVmZmVyKCkpOyAvLyBtZXNzYWdlX3R5cGUKICAgICAgICAgICAgeGNsaWVudC5EZXJlZih0aGlzLl9nbS5Qb2ludGVyU2l6ZSA9PSA4ID8gNTYgOiAyOCwgdGhpcy5fZ20uUG9pbnRlclNpemUpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShfTkVUX1dNX1NUQVRFX0FERCk7ICAgLy8gZGF0YS5sWzBdCiAgICAgICAgICAgIHdtU3RhdGVBYm92ZS5wb2ludGVyQnVmZmVyKCkuY29weSh4Y2xpZW50LkRlcmVmKHRoaXMuX2dtLlBvaW50ZXJTaXplID09IDggPyA2NCA6IDMyLCB0aGlzLl9nbS5Qb2ludGVyU2l6ZSkudG9CdWZmZXIoKSk7ICAvLyBkYXRhLmxbMV0KICAgICAgICAgICAgd2luZG93LnBvaW50ZXJCdWZmZXIoKS5jb3B5KHhjbGllbnQuRGVyZWYodGhpcy5fZ20uUG9pbnRlclNpemUgPT0gOCA/IDMyIDogMTYsIHRoaXMuX2dtLlBvaW50ZXJTaXplKS50b0J1ZmZlcigpKTsgICAgICAgLy8gd2luZG93CiAgICAgICAgICAgIHRoaXMuX1gxMS5YU2VuZEV2ZW50KGRpc3BsYXksIHJvb3RXaW5kb3csIDAsIFN1YnN0cnVjdHVyZVJlZGlyZWN0TWFzayB8IFN1YnN0cnVjdHVyZU5vdGlmeU1hc2ssIHhjbGllbnQpOwogICAgICAgIH0KICAgICAgICB0aGlzLmhpZGVXaW5kb3dJY29uID0gZnVuY3Rpb24gaGlkZVdpbmRvd0ljb24oZGlzcGxheSwgcm9vdFdpbmRvdywgd2luZG93KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHdtTmV0V21TdGF0ZSA9IHRoaXMuX1gxMS5YSW50ZXJuQXRvbShkaXNwbGF5LCB0aGlzLl9nbS5DcmVhdGVWYXJpYWJsZSgnX05FVF9XTV9TVEFURScpLCAxKTsKICAgICAgICAgICAgdmFyIHdtU3RhdGVTa2lwID0gdGhpcy5fWDExLlhJbnRlcm5BdG9tKGRpc3BsYXksIHRoaXMuX2dtLkNyZWF0ZVZhcmlhYmxlKCdfTkVUX1dNX1NUQVRFX1NLSVBfVEFTS0JBUicpLCAxKTsKCiAgICAgICAgICAgIHZhciB4Y2xpZW50ID0gdGhpcy5fZ20uQ3JlYXRlVmFyaWFibGUoOTYpOwogICAgICAgICAgICB4Y2xpZW50LkRlcmVmKDAsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSgzMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsaWVudE1lc3NhZ2UgdHlwZQogICAgICAgICAgICB4Y2xpZW50LkRlcmVmKHRoaXMuX2dtLlBvaW50ZXJTaXplPT04PzQ4OjI0LCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoMzIpOyAgIC8vIEZvcm1hdCAzMgogICAgICAgICAgICB3bU5ldFdtU3RhdGUucG9pbnRlckJ1ZmZlcigpLmNvcHkoeGNsaWVudC5EZXJlZih0aGlzLl9nbS5Qb2ludGVyU2l6ZT09OD80MDoyMCwgdGhpcy5fZ20uUG9pbnRlclNpemUpLnRvQnVmZmVyKCkpOyAvLyBtZXNzYWdlX3R5cGUKICAgICAgICAgICAgeGNsaWVudC5EZXJlZih0aGlzLl9nbS5Qb2ludGVyU2l6ZT09OD81NjoyOCwgdGhpcy5fZ20uUG9pbnRlclNpemUpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShfTkVUX1dNX1NUQVRFX0FERCk7ICAgLy8gZGF0YS5sWzBdCiAgICAgICAgICAgIHdtU3RhdGVTa2lwLnBvaW50ZXJCdWZmZXIoKS5jb3B5KHhjbGllbnQuRGVyZWYodGhpcy5fZ20uUG9pbnRlclNpemU9PTg/NjQ6MzIsIHRoaXMuX2dtLlBvaW50ZXJTaXplKS50b0J1ZmZlcigpKTsgIC8vIGRhdGEubFsxXQoKICAgICAgICAgICAgd2luZG93LnBvaW50ZXJCdWZmZXIoKS5jb3B5KHhjbGllbnQuRGVyZWYodGhpcy5fZ20uUG9pbnRlclNpemU9PTg/MzI6MTYsIHRoaXMuX2dtLlBvaW50ZXJTaXplKS50b0J1ZmZlcigpKTsgICAgICAgLy8gd2luZG93CiAgICAgICAgICAgIHRoaXMuX1gxMS5YU2VuZEV2ZW50KGRpc3BsYXksIHJvb3RXaW5kb3csIDAsIFN1YnN0cnVjdHVyZVJlZGlyZWN0TWFzayB8IFN1YnN0cnVjdHVyZU5vdGlmeU1hc2ssIHhjbGllbnQpOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5nZXRJbmZvID0gZnVuY3Rpb24gZ2V0SW5mbygpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaW5mbyA9IHRoaXM7CiAgICAgICAgICAgIHZhciByZXQgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAocmVzLCByZWopIHsgdGhpcy5fcmVzID0gcmVzOyB0aGlzLl9yZWogPSByZWo7IH0pOwogICAgICAgICAgICByZXQucGFyZW50ID0gdGhpczsKCiAgICAgICAgICAgIGlmICghcHJvY2Vzcy5lbnYuWEFVVEhPUklUWSB8fCAhcHJvY2Vzcy5lbnYuRElTUExBWSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHhpbmZvID0gdGhpcy5nZXRYSW5mbyhyZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZ2V0VWlkKHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS53aG9hbWkoKSkpOwogICAgICAgICAgICAgICAgcHJvY2Vzcy5zZXRlbnYoJ1hBVVRIT1JJVFknLCB4aW5mby54YXV0aG9yaXR5KTsKICAgICAgICAgICAgICAgIHByb2Nlc3Muc2V0ZW52KCdESVNQTEFZJywgeGluZm8uZGlzcGxheSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBkaXNwbGF5ID0gaW5mby5fWDExLlhPcGVuRGlzcGxheShpbmZvLl9nbS5DcmVhdGVWYXJpYWJsZShwcm9jZXNzLmVudi5ESVNQTEFZKSk7CiAgICAgICAgICAgIGlmIChkaXNwbGF5LlZhbCA9PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLndyaXRlRmlsZVN5bmMoJy92YXIvdG1wL2FnZW50U2xhdmUnLCAnWE9wZW5EaXNwbGF5IEZhaWxlZCcsIHsgZmxhZ3M6ICdhJyB9KTsKICAgICAgICAgICAgICAgIHJldC5fcmVqKCdYT3BlbkRpc3BsYXkgRmFpbGVkJyk7CiAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBzY3JlZW5Db3VudCA9IGluZm8uX1gxMS5YU2NyZWVuQ291bnQoZGlzcGxheSkuVmFsOwogICAgICAgICAgICB2YXIgaWZvID0gW107CiAgICAgICAgICAgIGZvcih2YXIgaT0wO2k8c2NyZWVuQ291bnQ7KytpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2NyZWVuID0gaW5mby5fWDExLlhTY3JlZW5PZkRpc3BsYXkoZGlzcGxheSwgaSk7CiAgICAgICAgICAgICAgICBpZm8ucHVzaCh7IGxlZnQ6IDAsIHRvcDogMCwgcmlnaHQ6IGluZm8uX1gxMS5YRGlzcGxheVdpZHRoKGRpc3BsYXksIGkpLlZhbCwgYm90dG9tOiBpbmZvLl9YMTEuWERpc3BsYXlIZWlnaHQoZGlzcGxheSwgaSkuVmFsLCBzY3JlZW46IHNjcmVlbiwgc2NyZWVuSWQ6IGksIGRpc3BsYXk6IGRpc3BsYXkgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0Ll9yZXMoaWZvKTsKCiAgICAgICAgICAgIHJldHVybiAocmV0KTsKICAgICAgICB9CiAgICAgICAgdGhpcy5nZXRYSW5mbyA9IGZ1bmN0aW9uIGdldFhJbmZvKGNvbnNvbGV1aWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcmV0ID0gbnVsbDsKICAgICAgICAgICAgdmFyIHVuYW1lID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldFVzZXJuYW1lKGNvbnNvbGV1aWQpOwogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInBzICIgKyAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZnJlZWJzZCc/Ii1heCAiOiIiKSArICItZSAtbyB1c2VyIiArIChwcm9jZXNzLnBsYXRmb3JtPT0nbGludXgnPyI6OTk5IjoiIikgKyAiIC1vIHR0eSAtbyBjb21tYW5kIHwgZ3JlcCBYIHwgYXdrICd7IHNwbGl0KCQwLCBhLCBcIi1hdXRoXCIpOyBzcGxpdChhWzJdLCBiLCBcIiBcIik7IGlmKCQxPT1cIiIgKyB1bmFtZSArICJcIiAmJiBiWzFdIT1cIlwiKSB7IHByaW50ZiBcIiVzLCVzLCVzXCIsJDEsJDIsYlsxXSB9IH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgdmFyIHRva2VucyA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpLnNwbGl0KCcsJyk7CiAgICAgICAgICAgIGlmICh0b2tlbnMubGVuZ3RoID09IDMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldCA9IHsgdHR5OiB0b2tlbnNbMV0sIHhhdXRob3JpdHk6IHRva2Vuc1syXSwgZXhwb3J0RW52OiBleHBvcnRFbnYgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHJldCA9PSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBUaGlzIExpbnV4IERpc3RybyBkb2VzIG5vdCBzcGF3biBhbiBYU2VydmVyIGluc3RhbmNlIGluIHRoZSB1c2VyIHNlc3Npb24sIHRoYXQgc3BlY2lmaWVzIHRoZSBYQVVUSE9SSVRZLgogICAgICAgICAgICAgICAgLy8gU28gd2UncmUgZ29pbmcgdG8gYnJ1dGUgZm9yY2UgaXQsIGJ5IGVudW1lcmF0aW5nIGFsbCBwcm9jZXNzZXMgb3duZWQgYnkgdGhpcyB1c2VyLCBhbmQgaW5zcGVjdCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzCiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInBzICIgKyAocHJvY2Vzcy5wbGF0Zm9ybT09J2ZyZWVic2QnPyItYXggIjoiIikgKyAiLWUgLW8gcGlkIC1vIHVzZXIgfCBncmVwICIgKyB1bmFtZSArICIgfCBhd2sgJ3sgcHJpbnQgJDEgfSdcbmV4aXRcbiIpOwogICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCiAgICAgICAgICAgICAgICB2YXIgbGluZXMgPSBjaGlsZC5zdGRvdXQuc3RyLnNwbGl0KCdcbicpOwogICAgICAgICAgICAgICAgZm9yKHZhciBuIGluIGxpbmVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBsbiA9IGxpbmVzW25dLnRyaW0oKTsKICAgICAgICAgICAgICAgICAgICBpZihsbi5sZW5ndGg+MCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldEVudkZyb21QaWQobG4pOwogICAgICAgICAgICAgICAgICAgICAgICBpZihlLlhBVVRIT1JJVFkgJiYgZS5ESVNQTEFZKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSB7IHR0eTogJz8nLCB4YXV0aG9yaXR5OiBlLlhBVVRIT1JJVFksIGRpc3BsYXk6IGUuRElTUExBWSwgZXhwb3J0RW52OiBleHBvcnRFbnYgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmKHJldCA9PSBudWxsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIFdlIGNvdWxkbid0IGZpbmQgWEFVVEhPUklUWSBhbmQgRElTUExBWSwgc28gYXMgYSBsYXN0IGRpdGNoIGVmZm9ydCwgbGV0cyBqdXN0IGxvb2sgZm9yIERJU1BMQVkKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIGxpbmVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxuID0gbGluZXNbbl0udHJpbSgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobG4ubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZ2V0RW52RnJvbVBpZChsbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5ESVNQTEFZKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHsgdHR5OiAnPycsIGRpc3BsYXk6IGUuRElTUExBWSwgZXhwb3J0RW52OiBleHBvcnRFbnYgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGZpbmQgJERJU1BMQVkgYnkgbG9va2luZyBhdCBhbGwgdGhlIHByb2Nlc3NlcyBydW5uaW5nIG9uIHRoZSBzYW1lIHR0eSBhcyB0aGUgWFNlcnZlciBpbnN0YW5jZSBmb3IgdGhpcyB1c2VyIHNlc3Npb24KICAgICAgICAgICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJwcyAtZSAtbyB0dHkgLW8gcGlkIC1vIHVzZXI6OTk5OSB8IGdyZXAgIiArIHJldC50dHkgKyAiIHwgZ3JlcCAiICsgdW5hbWUgKyAiIHwgYXdrICd7IHByaW50ICQyIH0nIFxuZXhpdFxuIik7CiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoKICAgICAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xuJyk7CiAgICAgICAgICAgICAgICB2YXIgcHMsIHBzeCwgdiwgdnMgPSAwOwogICAgICAgICAgICAgICAgZm9yKHZhciB4IGluIGxpbmVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmKGxpbmVzW3hdLnRyaW0oKS5sZW5ndGg+MCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcyA9IHJlcXVpcmUoJ2ZzJykucmVhZEZpbGVTeW5jKCcvcHJvYy8nICsgbGluZXNbeF0udHJpbSgpICsgJy9lbnZpcm9uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2gocHNlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2cyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcihwc3g9MDtwc3g8cHMubGVuZ3RoOysrcHN4KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHNbcHN4XSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBwcy5zbGljZSh2cywgcHN4KS50b1N0cmluZygpLnNwbGl0KCc9Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZbMF0gPT0gJ0RJU1BMQVknKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmRpc3BsYXkgPSB2WzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZzID0gcHN4ICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKHJldCk7CiAgICAgICAgfTsKICAgIH0KfQoKZnVuY3Rpb24gZXhwb3J0RW52KCkKewogICAgdmFyIHIgPQogICAgICAgIHsKICAgICAgICAgICAgWEFVVEhPUklUWTogdGhpcy54YXV0aG9yaXR5P3RoaXMueGF1dGhvcml0eToiIiwgRElTUExBWTogdGhpcy5kaXNwbGF5LAogICAgICAgICAgICBMb2NhdGlvbl9YMTFMSUI6IHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLkxvY2F0aW9uX1gxMUxJQiwKICAgICAgICAgICAgTG9jYXRpb25fWDExVFNUOiByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5Mb2NhdGlvbl9YMTFUU1QsCiAgICAgICAgICAgIExvY2F0aW9uX1gxMUVYVDogcmVxdWlyZSgnbW9uaXRvci1pbmZvJykuTG9jYXRpb25fWDExRVhULAogICAgICAgICAgICBMb2NhdGlvbl9YMTFGSVhFUzogcmVxdWlyZSgnbW9uaXRvci1pbmZvJykuTG9jYXRpb25fWDExRklYRVMKICAgICAgICB9OwogICAgcmV0dXJuIChyKTsKfQoKaWYgKHByb2Nlc3MucGxhdGZvcm0gIT0gJ2RhcndpbicpCnsKICAgIG1vZHVsZS5leHBvcnRzID0gbmV3IG1vbml0b3JpbmZvKCk7Cn0KCmlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdsaW51eCcpCnsKICAgIG1vZHVsZS5leHBvcnRzLmdldExpYkluZm8gPSBnZXRMaWJJbmZvOwp9Cv==", 15352); - ILibBase64DecodeEx((unsigned char*)_monitorinfo, 31352, (unsigned char*)_monitorinfo + 31352); - duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "monitor-info"); duk_push_string(ctx, _monitorinfo + 31352); + char *_monitorinfo = ILibMemory_Allocate(56149, 0, NULL, NULL); + memcpy_s(_monitorinfo + 0, 32084, "LyoNCkNvcHlyaWdodCAyMDE4IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQp2YXIgcHJvbWlzZSA9IHJlcXVpcmUoJ3Byb21pc2UnKTsNCnZhciBQUG9zaXRpb24gPSA0Ow0KdmFyIFBTaXplID0gODsNCnZhciBQTWluU2l6ZSA9IDEgPDwgNDsNCnZhciBQTWF4U2l6ZSA9IDEgPDwgNTsNCnZhciBfTkVUX1dNX1NUQVRFX1JFTU9WRSA9IDA7ICAgIC8vIHJlbW92ZS91bnNldCBwcm9wZXJ0eQ0KdmFyIF9ORVRfV01fU1RBVEVfQUREID0gMTsgICAgLy8gYWRkL3NldCBwcm9wZXJ0eQ0KdmFyIF9ORVRfV01fU1RBVEVfVE9HR0xFID0gMjsgICAgLy8gdG9nZ2xlIHByb3BlcnR5DQp2YXIgU3Vic3RydWN0dXJlUmVkaXJlY3RNYXNrID0gKDEgPDwgMjApOw0KdmFyIFN1YnN0cnVjdHVyZU5vdGlmeU1hc2sgPSAoMSA8PCAxOSk7DQp2YXIgUHJvcE1vZGVSZXBsYWNlID0gMDsNCnZhciBYQV9BVE9NID0gNDsNCnZhciBNV01fSElOVFNfRlVOQ1RJT05TID0gKDEgPDwgMCk7DQp2YXIgTVdNX0hJTlRTX0RFQ09SQVRJT05TID0gKDEgPDwgMSk7DQp2YXIgQ2xpZW50TWVzc2FnZSA9IDMzOw0KDQpmdW5jdGlvbiBnZXRMaWJJbmZvKGxpYm5hbWUpDQp7DQogICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gIT0gJ2xpbnV4JykgeyB0aHJvdyAoJ09ubHkgc3VwcG9ydGVkIG9uIGxpbnV4Jyk7IH0NCg0KICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC5zdGRpbi53cml0ZSgid2hlcmVpcyBsZGNvbmZpZyB8IGF3ayAneyBwcmludCAkMiB9J1xuZXhpdFxuIik7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgIHZhciBsZGNvbmZpZyA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpOw0KDQogICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUobGRjb25maWcgKyAiIC1wIHwgZ3JlcCAnIiArIGxpYm5hbWUgKyAiLnNvLicgfCB0ciAnXFxuJyAnXicgfCBhd2sgLUZeICd7IHByaW50ZiBcIltcIjsgZm9yKGk9MTtpPD1ORjsrK2kpIHsiICsgJyBzcGxpdCgkaSwgcGxhdCwgIikiKTsgc3BsaXQocGxhdFsxXSwgcGxhdDIsICIoIik7IGlmb3g9c3BsaXQocGxhdDJbMl0sIGlmbywgIiwiKTsgbGliYz0iIjsgaHdjYXA9IjAiOyBmb3IoaWZvaT0xO2lmb2k8PWlmb3g7KytpZm9pKSB7IGlmKHNwbGl0KGlmb1tpZm9pXSwgam5rLCAibGliYyIpPT0yKSB7IGxpYmM9aWZvW2lmb2ldOyB9IGlmKHNwbGl0KGlmb1tpZm9pXSwgam5rLCAiaHdjYXA6Iik9PTIpIHsgc3BsaXQoaWZvW2lmb2ldLCBqbmssICIweCIpOyBod2NhcD1qbmtbMl07IH0gICB9ICAgICAgeD1zcGxpdCgkaSwgdG9rLCAiICIpOyBpZih0b2tbMV0hPSIiKSB7IHByaW50ZiAiJXN7XFwibGliXFwiOiBcXCIlc1xcIiwgXFwicGF0aFxcIjogXFwiJXNcXCIsIFxcImh3Y2FwXFwiOiBcXCIlc1xcIiwgXFwibGliY1xcIjogXFwiJXNcXCJ9IiwgKGkhPTE/IiwiOiIiKSwgdG9rWzFdLCB0b2tbeF0sIGh3Y2FwLCBsaWJjOyB9fSBwcmludGYgIl0iOyB9XCdcbmV4aXRcbicpOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICB0cnkNCiAgICB7DQogICAgICAgIHZhciB2ID0gSlNPTi5wYXJzZShjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7DQogICAgICAgIHJldHVybiAodik7DQogICAgfQ0KICAgIGNhdGNoKGUpDQogICAgew0KICAgICAgICByZXR1cm4gKHt9KTsNCiAgICB9DQp9DQoNCmZ1bmN0aW9uIG1vbml0b3JpbmZvKCkNCnsNCiAgICB0aGlzLl9PYmplY3RJRCA9ICdtb25pdG9yLWluZm8nOw0KICAgIHRoaXMuX2dtID0gcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJyk7DQoNCiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKQ0KICAgIHsNCiAgICAgICAgdGhpcy5fdXNlcjMyID0gdGhpcy5fZ20uQ3JlYXRlTmF0aXZlUHJveHkoJ3VzZXIzMi5kbGwnKTsNCiAgICAgICAgdGhpcy5fdXNlcjMyLkNyZWF0ZU1ldGhvZCgnRW51bURpc3BsYXlNb25pdG9ycycpOw0KICAgICAgICB0aGlzLl9rZXJuZWwzMiA9IHRoaXMuX2dtLkNyZWF0ZU5hdGl2ZVByb3h5KCdrZXJuZWwzMi5kbGwnKTsNCiAgICAgICAgdGhpcy5fa2VybmVsMzIuQ3JlYXRlTWV0aG9kKCdHZXRMYXN0RXJyb3InKTsNCg0KICAgICAgICB0aGlzLmdldEluZm8gPSBmdW5jdGlvbiBnZXRJbmZvKCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGluZm8gPSB0aGlzOw0KICAgICAgICAgICAgcmV0dXJuIChuZXcgcHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZXIsIHJlamVjdG9yKSB7DQogICAgICAgICAgICAgICAgdGhpcy5fbW9uaXRvcmluZm8gPSB7IHJlc29sdmVyOiByZXNvbHZlciwgcmVqZWN0b3I6IHJlamVjdG9yLCBzZWxmOiBpbmZvLCBjYWxsYmFjazogaW5mby5fZ20uR2V0R2VuZXJpY0dsb2JhbENhbGxiYWNrKDQpIH07DQogICAgICAgICAgICAgICAgdGhpcy5fbW9uaXRvcmluZm8uY2FsbGJhY2suaW5mbyA9IHRoaXMuX21vbml0b3JpbmZvOw0KICAgICAgICAgICAgICAgIHRoaXMuX21vbml0b3JpbmZvLmR3RGF0YSA9IGluZm8uX2dtLk9iamVjdFRvUHRyKHRoaXMuX21vbml0b3JpbmZvKTsNCg0KICAgICAgICAgICAgICAgIHRoaXMuX21vbml0b3JpbmZvLmNhbGxiYWNrLnJlc3VsdHMgPSBbXTsNCiAgICAgICAgICAgICAgICB0aGlzLl9tb25pdG9yaW5mby5jYWxsYmFjay5vbignR2xvYmFsQ2FsbGJhY2snLCBmdW5jdGlvbiBPbk1vbml0b3JJbmZvKGhtb24sIGhkYywgciwgdXNlcikgew0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5PYmplY3RUb1B0cl9WZXJpZnkodGhpcy5pbmZvLCB1c2VyKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJiID0gci5EZXJlZigwLCAxNikudG9CdWZmZXIoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0cy5wdXNoKHsgbGVmdDogcmIucmVhZEludDMyTEUoMCksIHRvcDogcmIucmVhZEludDMyTEUoNCksIHJpZ2h0OiByYi5yZWFkSW50MzJMRSg4KSwgYm90dG9tOiByYi5yZWFkSW50MzJMRSgxMikgfSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gdGhpcy5pbmZvLnNlbGYuX2dtLkNyZWF0ZUludGVnZXIoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHIuVmFsID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocik7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgICAgIGlmIChpbmZvLl91c2VyMzIuRW51bURpc3BsYXlNb25pdG9ycygwLCAwLCB0aGlzLl9tb25pdG9yaW5mby5jYWxsYmFjaywgdGhpcy5fbW9uaXRvcmluZm8uZHdEYXRhKS5WYWwgPT0gMCkgew0KICAgICAgICAgICAgICAgICAgICByZWplY3RvcignTGFzdEVycm9yPScgKyBpbmZvLl9rZXJuZWwzMi5HZXRMYXN0RXJyb3IoKS5WYWwpOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICByZXNvbHZlcih0aGlzLl9tb25pdG9yaW5mby5jYWxsYmFjay5yZXN1bHRzKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIH0pKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBlbHNlIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdsaW51eCcpDQogICAgew0KICAgICAgICAvLyBGaXJzdCB0aGluZyB3ZSBuZWVkIHRvIGRvLCBpcyBkZXRlcm1pbmUgd2hlcmUgdGhlIFgxMSBsaWJyYXJpZXMgYXJlDQoNCiAgICAgICAgLy8gU3VmZmljaWVudCBhY2Nlc3MgcmlnaHRzIHRvIHVzZSBsZGNvbmZpZw0KICAgICAgICB2YXIgeDExaW5mbyA9IGdldExpYkluZm8oJ2xpYlgxMScpOw0KICAgICAgICB2YXIgeHRzdGluZm8gPSBnZXRMaWJJbmZvKCdsaWJYdHN0Jyk7DQogICAgICAgIHZhciB4ZXh0aW5mbyA9IGdldExpYkluZm8oJ2xpYlhleHQnKTsNCiAgICAgICAgdmFyIHhmaXhlc2luZm8gPSBnZXRMaWJJbmZvKCdsaWJYZml4ZXMnKTsNCiAgICAgICAgdmFyIGl4Ow0KDQogICAgICAgIGZvciAoaXggaW4geDExaW5mbykNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKHgxMWluZm8ubGVuZ3RoID09IDEgfHwgeDExaW5mb1tpeF0uaHdjYXAgPT0gIjAiKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ20uQ3JlYXRlTmF0aXZlUHJveHkoeDExaW5mb1tpeF0ucGF0aCk7DQogICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnTG9jYXRpb25fWDExTElCJywgeyB2YWx1ZTogeDExaW5mb1tpeF0ucGF0aCB9KTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGNhdGNoIChleCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGZvciAoaXggaW4geHRzdGluZm8pDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmICh4dHN0aW5mby5sZW5ndGggPT0gMSB8fCB4dHN0aW5mb1tpeF0uaHdjYXAgPT0gIjAiKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ20uQ3JlYXRlTmF0aXZlUHJveHkoeHRzdGluZm9baXhdLnBhdGgpOw0KICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0xvY2F0aW9uX1gxMVRTVCcsIHsgdmFsdWU6IHh0c3RpbmZvW2l4XS5wYXRoIH0pOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgY2F0Y2ggKGV4KQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpeCBpbiB4ZXh0aW5mbykNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKHhleHRpbmZvLmxlbmd0aCA9PSAxIHx8IHhleHRpbmZvW2l4XS5od2NhcCA9PSAiMCIpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9nbS5DcmVhdGVOYXRpdmVQcm94eSh4ZXh0aW5mb1tpeF0ucGF0aCk7DQogICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnTG9jYXRpb25fWDExRVhUJywgeyB2YWx1ZTogeGV4dGluZm9baXhdLnBhdGggfSk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBjYXRjaCAoZXgpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGl4IGluIHhmaXhlc2luZm8pDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmICh4Zml4ZXNpbmZvLmxlbmd0aCA9PSAxIHx8IHhmaXhlc2luZm9baXhdLmh3Y2FwID09ICIwIikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0cnkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX2dtLkNyZWF0ZU5hdGl2ZVByb3h5KHhmaXhlc2luZm9baXhdLnBhdGgpOw0KICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0xvY2F0aW9uX1gxMUZJWEVTJywgeyB2YWx1ZTogeGZpeGVzaW5mb1tpeF0ucGF0aCB9KTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGNhdGNoIChleCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9ICAgDQoNCiAgICAgICAgdHJ5DQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudlsnTG9jYXRpb25fWDExTElCJ10pIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdMb2NhdGlvbl9YMTFMSUInLCB7IHZhbHVlOiBwcm9jZXNzLmVudlsnTG9jYXRpb25fWDExTElCJ10gfSk7IH0NCiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudlsnTG9jYXRpb25fWDExVFNUJ10pIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdMb2NhdGlvbl9YMTFUU1QnLCB7IHZhbHVlOiBwcm9jZXNzLmVudlsnTG9jYXRpb25fWDExVFNUJ10gfSk7IH0NCiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudlsnTG9jYXRpb25fWDExRVhUJ10pIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdMb2NhdGlvbl9YMTFFWFQnLCB7IHZhbHVlOiBwcm9jZXNzLmVudlsnTG9jYXRpb25fWDExRVhUJ10gfSk7IH0NCiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudlsnTG9jYXRpb25fWDExRklYRVMnXSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0xvY2F0aW9uX1gxMUZJWEVTJywgeyB2YWx1ZTogcHJvY2Vzcy5lbnZbJ0xvY2F0aW9uX1gxMUZJWEVTJ10gfSk7IH0NCiAgICAgICAgfQ0KICAgICAgICBjYXRjaChleCkNCiAgICAgICAgew0KICAgICAgICB9DQogICAgfQ0KICAgIGlmKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2ZyZWVic2QnKQ0KICAgIHsNCgkgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdMb2NhdGlvbl9YMTFMSUInLCB7IHZhbHVlOiByZXF1aXJlKCdsaWItZmluZGVyJykoJ2xpYlgxMScpWzBdP3JlcXVpcmUoJ2xpYi1maW5kZXInKSgnbGliWDExJylbMF0ubG9jYXRpb246IHVuZGVmaW5lZCB9KTsNCgkgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdMb2NhdGlvbl9YMTFUU1QnLCB7IHZhbHVlOiByZXF1aXJlKCdsaWItZmluZGVyJykoJ2xpYlh0c3QnKVswXT9yZXF1aXJlKCdsaWItZmluZGVyJykoJ2xpYlh0c3QnKVswXS5sb2NhdGlvbjp1bmRlZmluZWQgfSk7DQoJICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnTG9jYXRpb25fWDExRVhUJywgeyB2YWx1ZTogcmVxdWlyZSgnbGliLWZpbmRlcicpKCdsaWJYZXh0JylbMF0gPyByZXF1aXJlKCdsaWItZmluZGVyJykoJ2xpYlhleHQnKVswXS5sb2NhdGlvbiA6IHVuZGVmaW5lZCB9KTsNCgkgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdMb2NhdGlvbl9YMTFGSVhFUycsIHsgdmFsdWU6IHJlcXVpcmUoJ2xpYi1maW5kZXInKSgnbGliWGZpeGVzJylbMF0gPyByZXF1aXJlKCdsaWItZmluZGVyJykoJ2xpYlhmaXhlcycpWzBdLmxvY2F0aW9uIDogdW5kZWZpbmVkIH0pOw0KICAgIH0NCg0KICAgIGlmKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JyB8fCBwcm9jZXNzLnBsYXRmb3JtID09ICdmcmVlYnNkJykNCiAgICB7DQogICAgICAgIHRoaXMuTU9USUZfRkxBR1MgPSANCiAgICAgICAgew0KICAgICAgICAgICAgTVdNX0ZVTkNfQUxMICAgICAgICA6ICgxIDw8IDApICwNCiAgICAgICAgICAgIE1XTV9GVU5DX1JFU0laRSAgICAgOiAoMSA8PCAxKSAsDQogICAgICAgICAgICBNV01fRlVOQ19NT1ZFICAgICAgIDogKDEgPDwgMikgLA0KICAgICAgICAgICAgTVdNX0ZVTkNfTUlOSU1JWkUgICA6ICgxIDw8IDMpICwNCiAgICAgICAgICAgIE1XTV9GVU5DX01BWElNSVpFICAgOiAoMSA8PCA0KSAsDQogICAgICAgICAgICBNV01fRlVOQ19DTE9TRSAgICAgIDogKDEgPDwgNSkgDQogICAgICAgIH07DQoNCg0KICAgICAgICBpZiAodGhpcy5Mb2NhdGlvbl9YMTFMSUIgJiYgdGhpcy5Mb2NhdGlvbl9YMTFUU1QgJiYgdGhpcy5Mb2NhdGlvbl9YMTFFWFQpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjaCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICBjaC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoKSB7IH0pOw0KICAgICAgICAgICAgY2guc3Rkb3V0LnN0ciA9ICcnOyBjaC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2guc3RkaW4ud3JpdGUoJ3BzIC1lIHwgZ3JlcCBYXG5leGl0XG4nKTsNCiAgICAgICAgICAgIGNoLndhaXRFeGl0KCk7DQogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2t2bV94MTFfc3VwcG9ydCcsIHsgdmFsdWU6IGNoLnN0ZG91dC5zdHIudHJpbSgpID09ICcnID8gZmFsc2UgOiB0cnVlIH0pOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdrdm1feDExX3N1cHBvcnQnLCB7IHZhbHVlOiBmYWxzZSB9KTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgaWYgKHRoaXMuTG9jYXRpb25fWDExTElCKQ0KICAgICAgICB7DQogICAgICAgICAgICB0aGlzLl9YMTEgPSB0aGlzLl9nbS5DcmVhdGVOYXRpdmVQcm94eSh0aGlzLkxvY2F0aW9uX1gxMUxJQik7DQogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYQ2hhbmdlUHJvcGVydHknKTsNCiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hDbG9zZURpc3BsYXknKTsNCiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hDb25uZWN0aW9uTnVtYmVyJyk7DQogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYQ29udmVydFNlbGVjdGlvbicpOw0KICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWENyZWF0ZUdDJyk7DQogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYQ3JlYXRlV2luZG93Jyk7DQogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYQ3JlYXRlU2ltcGxlV2luZG93Jyk7DQogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYRGVmYXVsdENvbG9ybWFwJyk7DQogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYRGVmYXVsdFNjcmVlbicpOw0KICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWERlc3Ryb3lXaW5kb3cnKTsNCiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hEcmF3TGluZScpOw0KICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWERpc3BsYXlIZWlnaHQnKTsNCiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hEaXNwbGF5V2lkdGgnKTsNCiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hGZXRjaE5hbWUnKTsNCiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hGbHVzaCcpOw0KICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWEZyZWUnKTsNCiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hDcmVhdGVHQycpOw0KICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWEdldEF0b21OYW1lJyk7DQogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYR2V0V2luZG93UHJvcGVydHknKTsNCiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hJbnRlcm5BdG9tJyk7DQogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYTWFwV2luZG93Jyk7DQogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKHsgbWV0aG9kOiAnWE5leHRFdmVudCcsIHRocmVhZERpc3BhdGNoOiB0cnVlIH0pOw0KICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCh7IG1ldGhvZDogJ1hOZXh0RXZlbnQnLCBuZXdOYW1lOiAnWE5leHRFdmVudFN5bmMnIH0pOw0KICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWE9wZW5EaXNwbGF5Jyk7DQogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYUGVuZGluZycpOw0KICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWFJvb3RXaW5kb3cnKTsNCiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hTZWxlY3RJbnB1dCcpOw0KICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWFNjcmVlbkNvdW50Jyk7DQogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYU2NyZWVuT2ZEaXNwbGF5Jyk7DQogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYU2VsZWN0SW5wdXQnKTsNCiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hTZW5kRXZlbnQnKTsNCiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hTZXRGb3JlZ3JvdW5kJyk7DQogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYU2V0RnVuY3Rpb24nKTsNCiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hTZXRMaW5lQXR0cmlidXRlcycpOw0KICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWFNldE5vcm1hbEhpbnRzJyk7DQogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYU2V0U2VsZWN0aW9uT3duZXInKTsNCiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hTZXRTdWJ3aW5kb3dNb2RlJyk7DQogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYU2V0V01Qcm90b2NvbHMnKTsNCiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hTdG9yZU5hbWUnKTsNCiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hTeW5jJyk7DQogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYQmxhY2tQaXhlbCcpOw0KICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWFdoaXRlUGl4ZWwnKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHRoaXMuaXNVbml0eSA9IGZ1bmN0aW9uIGlzVW5pdHkoKQ0KICAgICAgICB7DQogICAgICAgICAgICByZXR1cm4gKHByb2Nlc3MuZW52WydYREdfQ1VSUkVOVF9ERVNLVE9QJ10gPT0gJ1VuaXR5Jyk7DQogICAgICAgIH0NCg0KICAgICAgICB0aGlzLnVuRGVjb3JhdGVXaW5kb3cgPSBmdW5jdGlvbiB1bkRlY29yYXRlV2luZG93KGRpc3BsYXksIHdpbmRvdykNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIE13bUhpbnRzID0gdGhpcy5fZ20uQ3JlYXRlVmFyaWFibGUoNDApOw0KICAgICAgICAgICAgdmFyIG13bUhpbnRzUHJvcGVydHkgPSB0aGlzLl9YMTEuWEludGVybkF0b20oZGlzcGxheSwgdGhpcy5fZ20uQ3JlYXRlVmFyaWFibGUoJ19NT1RJRl9XTV9ISU5UUycpLCAwKTsNCiAgICAgICAgICAgIE13bUhpbnRzLkRlcmVmKDAs", 16000); + memcpy_s(_monitorinfo + 16000, 16084, "IDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSgxIDw8IDEpOw0KICAgICAgICAgICAgdGhpcy5fWDExLlhDaGFuZ2VQcm9wZXJ0eShkaXNwbGF5LCB3aW5kb3csIG13bUhpbnRzUHJvcGVydHksIG13bUhpbnRzUHJvcGVydHksIDMyLCAwLCBNd21IaW50cywgNSk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5zZXRBbGxvd2VkQWN0aW9ucyA9IGZ1bmN0aW9uIHNldEFsbG93ZWRBY3Rpb25zKGRpc3BsYXksIHdpbmRvdywgZmxhZ3MpDQogICAgICAgIHsNCiAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgTVdNX0hJTlRTX0ZVTkNUSU9OUyA9ICgxTCA8PCAwKSwNCiAgICAgICAgICAgICAgICBNV01fSElOVFNfREVDT1JBVElPTlMgPSAgKDFMIDw8IDEpLA0KDQogICAgICAgICAgICAgICAgTVdNX0ZVTkNfQUxMID0gKDFMIDw8IDApLA0KICAgICAgICAgICAgICAgIE1XTV9GVU5DX1JFU0laRSA9ICgxTCA8PCAxKSwNCiAgICAgICAgICAgICAgICBNV01fRlVOQ19NT1ZFID0gKDFMIDw8IDIpLA0KICAgICAgICAgICAgICAgIE1XTV9GVU5DX01JTklNSVpFID0gKDFMIDw8IDMpLA0KICAgICAgICAgICAgICAgIE1XTV9GVU5DX01BWElNSVpFID0gKDFMIDw8IDQpLA0KICAgICAgICAgICAgICAgIE1XTV9GVU5DX0NMT1NFID0gKDFMIDw8IDUpDQogICAgICAgICAgICAqLw0KDQogICAgICAgICAgICB2YXIgTXdtSGludHMgPSB0aGlzLl9nbS5DcmVhdGVWYXJpYWJsZSg0MCk7DQogICAgICAgICAgICB2YXIgbXdtSGludHNQcm9wZXJ0eSA9IHRoaXMuX1gxMS5YSW50ZXJuQXRvbShkaXNwbGF5LCB0aGlzLl9nbS5DcmVhdGVWYXJpYWJsZSgnX01PVElGX1dNX0hJTlRTJyksIDApOw0KDQogICAgICAgICAgICBNd21IaW50cy5EZXJlZigwLCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoTVdNX0hJTlRTX0ZVTkNUSU9OUyk7DQogICAgICAgICAgICBNd21IaW50cy5EZXJlZih0aGlzLl9nbS5Qb2ludGVyU2l6ZSwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKGZsYWdzKTsNCg0KICAgICAgICAgICAgdGhpcy5fWDExLlhDaGFuZ2VQcm9wZXJ0eShkaXNwbGF5LCB3aW5kb3csIG13bUhpbnRzUHJvcGVydHksIG13bUhpbnRzUHJvcGVydHksIDMyLCBQcm9wTW9kZVJlcGxhY2UsIE13bUhpbnRzLCA1KTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLnNldFdpbmRvd1NpemVIaW50cyA9IGZ1bmN0aW9uIHNldFdpbmRvd1NpemVIaW50cyhkaXNwbGF5LCB3aW5kb3csIHgsIHksIHdpZHRoLCBoZWlnaHQsIG1pbldpZHRoLCBtaW5IZWlnaHQsIG1heFdpZHRoLCBtYXhIZWlnaHQpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBzaXplSGludHMgPSB0aGlzLl9nbS5DcmVhdGVWYXJpYWJsZSg4MCk7DQogICAgICAgICAgICB2YXIgc3BlYyA9IFBQb3NpdGlvbiB8IFBTaXplOw0KICAgICAgICAgICAgaWYgKG1pbldpZHRoICE9IG51bGwgJiYgbWluSGVpZ2h0ICE9IG51bGwpIHsgc3BlYyB8PSBQTWluU2l6ZTsgfQ0KICAgICAgICAgICAgaWYgKG1heFdpZHRoICE9IG51bGwgJiYgbWF4SGVpZ2h0ICE9IG51bGwpIHsgc3BlYyB8PSBQTWF4U2l6ZTsgfQ0KDQogICAgICAgICAgICBzaXplSGludHMuRGVyZWYoMCwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKHNwZWMpOw0KICAgICAgICAgICAgc2l6ZUhpbnRzLkRlcmVmKHRoaXMuX2dtLlBvaW50ZXJTaXplLCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoeCk7DQogICAgICAgICAgICBzaXplSGludHMuRGVyZWYodGhpcy5fZ20uUG9pbnRlclNpemUgKyA0LCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoeSk7DQogICAgICAgICAgICBzaXplSGludHMuRGVyZWYodGhpcy5fZ20uUG9pbnRlclNpemUgKyA4LCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUod2lkdGgpOw0KICAgICAgICAgICAgc2l6ZUhpbnRzLkRlcmVmKHRoaXMuX2dtLlBvaW50ZXJTaXplICsgMTIsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShoZWlnaHQpOw0KICAgICAgICAgICAgaWYgKG1pbldpZHRoICE9IG51bGwpIHsgc2l6ZUhpbnRzLkRlcmVmKHRoaXMuX2dtLlBvaW50ZXJTaXplICsgMTYsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShtaW5XaWR0aCk7IH0NCiAgICAgICAgICAgIGlmIChtaW5IZWlnaHQgIT0gbnVsbCkgeyBzaXplSGludHMuRGVyZWYodGhpcy5fZ20uUG9pbnRlclNpemUgKyAyMCwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKG1pbkhlaWdodCk7IH0NCiAgICAgICAgICAgIGlmIChtYXhXaWR0aCAhPSBudWxsKSB7IHNpemVIaW50cy5EZXJlZih0aGlzLl9nbS5Qb2ludGVyU2l6ZSArIDI0LCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUobWF4V2lkdGgpOyB9DQogICAgICAgICAgICBpZiAobWF4SGVpZ2h0ICE9IG51bGwpIHsgc2l6ZUhpbnRzLkRlcmVmKHRoaXMuX2dtLlBvaW50ZXJTaXplICsgMjgsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShtYXhIZWlnaHQpOyB9DQoNCiAgICAgICAgICAgIHRoaXMuX1gxMS5YU2V0Tm9ybWFsSGludHMoZGlzcGxheSwgd2luZG93LCBzaXplSGludHMpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuc2V0QWx3YXlzT25Ub3AgPSBmdW5jdGlvbiBzZXRBbHdheXNPblRvcChkaXNwbGF5LCByb290V2luZG93LCB3aW5kb3cpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciB3bU5ldFdtU3RhdGUgPSB0aGlzLl9YMTEuWEludGVybkF0b20oZGlzcGxheSwgdGhpcy5fZ20uQ3JlYXRlVmFyaWFibGUoJ19ORVRfV01fU1RBVEUnKSwgMSk7DQogICAgICAgICAgICB2YXIgd21TdGF0ZUFib3ZlID0gdGhpcy5fWDExLlhJbnRlcm5BdG9tKGRpc3BsYXksIHRoaXMuX2dtLkNyZWF0ZVZhcmlhYmxlKCdfTkVUX1dNX1NUQVRFX0FCT1ZFJyksIDEpOw0KDQogICAgICAgICAgICB2YXIgeGNsaWVudCA9IHRoaXMuX2dtLkNyZWF0ZVZhcmlhYmxlKDk2KTsNCiAgICAgICAgICAgIHhjbGllbnQuRGVyZWYoMCwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKDMzKTsgICAgICAgICAgICAgICAgICAgLy8gQ2xpZW50TWVzc2FnZSB0eXBlDQogICAgICAgICAgICB4Y2xpZW50LkRlcmVmKHRoaXMuX2dtLlBvaW50ZXJTaXplID09IDggPyA0OCA6IDI0LCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoMzIpOyAgIC8vIEZvcm1hdCAzMg0KICAgICAgICAgICAgd21OZXRXbVN0YXRlLnBvaW50ZXJCdWZmZXIoKS5jb3B5KHhjbGllbnQuRGVyZWYodGhpcy5fZ20uUG9pbnRlclNpemUgPT0gOCA/IDQwIDogMjAsIHRoaXMuX2dtLlBvaW50ZXJTaXplKS50b0J1ZmZlcigpKTsgLy8gbWVzc2FnZV90eXBlDQogICAgICAgICAgICB4Y2xpZW50LkRlcmVmKHRoaXMuX2dtLlBvaW50ZXJTaXplID09IDggPyA1NiA6IDI4LCB0aGlzLl9nbS5Qb2ludGVyU2l6ZSkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKF9ORVRfV01fU1RBVEVfQUREKTsgICAvLyBkYXRhLmxbMF0NCiAgICAgICAgICAgIHdtU3RhdGVBYm92ZS5wb2ludGVyQnVmZmVyKCkuY29weSh4Y2xpZW50LkRlcmVmKHRoaXMuX2dtLlBvaW50ZXJTaXplID09IDggPyA2NCA6IDMyLCB0aGlzLl9nbS5Qb2ludGVyU2l6ZSkudG9CdWZmZXIoKSk7ICAvLyBkYXRhLmxbMV0NCiAgICAgICAgICAgIHdpbmRvdy5wb2ludGVyQnVmZmVyKCkuY29weSh4Y2xpZW50LkRlcmVmKHRoaXMuX2dtLlBvaW50ZXJTaXplID09IDggPyAzMiA6IDE2LCB0aGlzLl9nbS5Qb2ludGVyU2l6ZSkudG9CdWZmZXIoKSk7ICAgICAgIC8vIHdpbmRvdw0KICAgICAgICAgICAgdGhpcy5fWDExLlhTZW5kRXZlbnQoZGlzcGxheSwgcm9vdFdpbmRvdywgMCwgU3Vic3RydWN0dXJlUmVkaXJlY3RNYXNrIHwgU3Vic3RydWN0dXJlTm90aWZ5TWFzaywgeGNsaWVudCk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5oaWRlV2luZG93SWNvbiA9IGZ1bmN0aW9uIGhpZGVXaW5kb3dJY29uKGRpc3BsYXksIHJvb3RXaW5kb3csIHdpbmRvdykNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIHdtTmV0V21TdGF0ZSA9IHRoaXMuX1gxMS5YSW50ZXJuQXRvbShkaXNwbGF5LCB0aGlzLl9nbS5DcmVhdGVWYXJpYWJsZSgnX05FVF9XTV9TVEFURScpLCAxKTsNCiAgICAgICAgICAgIHZhciB3bVN0YXRlU2tpcCA9IHRoaXMuX1gxMS5YSW50ZXJuQXRvbShkaXNwbGF5LCB0aGlzLl9nbS5DcmVhdGVWYXJpYWJsZSgnX05FVF9XTV9TVEFURV9TS0lQX1RBU0tCQVInKSwgMSk7DQoNCiAgICAgICAgICAgIHZhciB4Y2xpZW50ID0gdGhpcy5fZ20uQ3JlYXRlVmFyaWFibGUoOTYpOw0KICAgICAgICAgICAgeGNsaWVudC5EZXJlZigwLCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoMzMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGllbnRNZXNzYWdlIHR5cGUNCiAgICAgICAgICAgIHhjbGllbnQuRGVyZWYodGhpcy5fZ20uUG9pbnRlclNpemU9PTg/NDg6MjQsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSgzMik7ICAgLy8gRm9ybWF0IDMyDQogICAgICAgICAgICB3bU5ldFdtU3RhdGUucG9pbnRlckJ1ZmZlcigpLmNvcHkoeGNsaWVudC5EZXJlZih0aGlzLl9nbS5Qb2ludGVyU2l6ZT09OD80MDoyMCwgdGhpcy5fZ20uUG9pbnRlclNpemUpLnRvQnVmZmVyKCkpOyAvLyBtZXNzYWdlX3R5cGUNCiAgICAgICAgICAgIHhjbGllbnQuRGVyZWYodGhpcy5fZ20uUG9pbnRlclNpemU9PTg/NTY6MjgsIHRoaXMuX2dtLlBvaW50ZXJTaXplKS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoX05FVF9XTV9TVEFURV9BREQpOyAgIC8vIGRhdGEubFswXQ0KICAgICAgICAgICAgd21TdGF0ZVNraXAucG9pbnRlckJ1ZmZlcigpLmNvcHkoeGNsaWVudC5EZXJlZih0aGlzLl9nbS5Qb2ludGVyU2l6ZT09OD82NDozMiwgdGhpcy5fZ20uUG9pbnRlclNpemUpLnRvQnVmZmVyKCkpOyAgLy8gZGF0YS5sWzFdDQoNCiAgICAgICAgICAgIHdpbmRvdy5wb2ludGVyQnVmZmVyKCkuY29weSh4Y2xpZW50LkRlcmVmKHRoaXMuX2dtLlBvaW50ZXJTaXplPT04PzMyOjE2LCB0aGlzLl9nbS5Qb2ludGVyU2l6ZSkudG9CdWZmZXIoKSk7ICAgICAgIC8vIHdpbmRvdw0KICAgICAgICAgICAgdGhpcy5fWDExLlhTZW5kRXZlbnQoZGlzcGxheSwgcm9vdFdpbmRvdywgMCwgU3Vic3RydWN0dXJlUmVkaXJlY3RNYXNrIHwgU3Vic3RydWN0dXJlTm90aWZ5TWFzaywgeGNsaWVudCk7DQogICAgICAgIH0NCg0KICAgICAgICB0aGlzLmdldEluZm8gPSBmdW5jdGlvbiBnZXRJbmZvKCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGluZm8gPSB0aGlzOw0KICAgICAgICAgICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikgeyB0aGlzLl9yZXMgPSByZXM7IHRoaXMuX3JlaiA9IHJlajsgfSk7DQogICAgICAgICAgICByZXQucGFyZW50ID0gdGhpczsNCg0KICAgICAgICAgICAgaWYgKCFwcm9jZXNzLmVudi5YQVVUSE9SSVRZIHx8ICFwcm9jZXNzLmVudi5ESVNQTEFZKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciB4aW5mbyA9IHRoaXMuZ2V0WEluZm8ocmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldFVpZChyZXF1aXJlKCd1c2VyLXNlc3Npb25zJykud2hvYW1pKCkpKTsNCiAgICAgICAgICAgICAgICBwcm9jZXNzLnNldGVudignWEFVVEhPUklUWScsIHhpbmZvLnhhdXRob3JpdHkpOw0KICAgICAgICAgICAgICAgIHByb2Nlc3Muc2V0ZW52KCdESVNQTEFZJywgeGluZm8uZGlzcGxheSk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciBkaXNwbGF5ID0gaW5mby5fWDExLlhPcGVuRGlzcGxheShpbmZvLl9nbS5DcmVhdGVWYXJpYWJsZShwcm9jZXNzLmVudi5ESVNQTEFZKSk7DQogICAgICAgICAgICBpZiAoZGlzcGxheS5WYWwgPT0gMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLndyaXRlRmlsZVN5bmMoJy92YXIvdG1wL2FnZW50U2xhdmUnLCAnWE9wZW5EaXNwbGF5IEZhaWxlZCcsIHsgZmxhZ3M6ICdhJyB9KTsNCiAgICAgICAgICAgICAgICByZXQuX3JlaignWE9wZW5EaXNwbGF5IEZhaWxlZCcpOw0KICAgICAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdmFyIHNjcmVlbkNvdW50ID0gaW5mby5fWDExLlhTY3JlZW5Db3VudChkaXNwbGF5KS5WYWw7DQogICAgICAgICAgICB2YXIgaWZvID0gW107DQogICAgICAgICAgICBmb3IodmFyIGk9MDtpPHNjcmVlbkNvdW50OysraSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgc2NyZWVuID0gaW5mby5fWDExLlhTY3JlZW5PZkRpc3BsYXkoZGlzcGxheSwgaSk7DQogICAgICAgICAgICAgICAgaWZvLnB1c2goeyBsZWZ0OiAwLCB0b3A6IDAsIHJpZ2h0OiBpbmZvLl9YMTEuWERpc3BsYXlXaWR0aChkaXNwbGF5LCBpKS5WYWwsIGJvdHRvbTogaW5mby5fWDExLlhEaXNwbGF5SGVpZ2h0KGRpc3BsYXksIGkpLlZhbCwgc2NyZWVuOiBzY3JlZW4sIHNjcmVlbklkOiBpLCBkaXNwbGF5OiBkaXNwbGF5IH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0Ll9yZXMoaWZvKTsNCg0KICAgICAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuZ2V0WEluZm8gPSBmdW5jdGlvbiBnZXRYSW5mbyhjb25zb2xldWlkKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgcmV0ID0gbnVsbDsNCiAgICAgICAgICAgIHZhciB1bmFtZSA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5nZXRVc2VybmFtZShjb25zb2xldWlkKTsNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgicHMgIiArIChwcm9jZXNzLnBsYXRmb3JtID09ICdmcmVlYnNkJz8iLWF4ICI6IiIpICsgIi1lIC1vIHVzZXIiICsgKHByb2Nlc3MucGxhdGZvcm09PSdsaW51eCc/Ijo5OTkiOiIiKSArICIgLW8gdHR5IC1vIGNvbW1hbmQgfCBncmVwIFggfCBhd2sgJ3sgc3BsaXQoJDAsIGEsIFwiLWF1dGhcIik7IHNwbGl0KGFbMl0sIGIsIFwiIFwiKTsgaWYoJDE9PVwiIiArIHVuYW1lICsgIlwiICYmIGJbMV0hPVwiXCIpIHsgcHJpbnRmIFwiJXMsJXMsJXNcIiwkMSwkMixiWzFdIH0gfSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgIHZhciB0b2tlbnMgPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKS5zcGxpdCgnLCcpOw0KICAgICAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPT0gMykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXQgPSB7IHR0eTogdG9rZW5zWzFdLCB4YXV0aG9yaXR5OiB0b2tlbnNbMl0sIGV4cG9ydEVudjogZXhwb3J0RW52IH07DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChyZXQgPT0gbnVsbCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAvLyBUaGlzIExpbnV4IERpc3RybyBkb2VzIG5vdCBzcGF3biBhbiBYU2VydmVyIGluc3RhbmNlIGluIHRoZSB1c2VyIHNlc3Npb24sIHRoYXQgc3BlY2lmaWVzIHRoZSBYQVVUSE9SSVRZLg0KICAgICAgICAgICAgICAgIC8vIFNvIHdlJ3JlIGdvaW5nIHRvIGJydXRlIGZvcmNlIGl0LCBieSBlbnVtZXJhdGluZyBhbGwgcHJvY2Vzc2VzIG93bmVkIGJ5IHRoaXMgdXNlciwgYW5kIGluc3BlY3QgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcw0KICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgicHMgIiArIChwcm9jZXNzLnBsYXRmb3JtPT0nZnJlZWJzZCc/Ii1heCAiOiIiKSArICItZSAtbyBwaWQgLW8gdXNlciB8IGdyZXAgIiArIHVuYW1lICsgIiB8IGF3ayAneyBwcmludCAkMSB9J1xuZXhpdFxuIik7DQogICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgICAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xuJyk7DQogICAgICAgICAgICAgICAgZm9yKHZhciBuIGluIGxpbmVzKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGxuID0gbGluZXNbbl0udHJpbSgpOw0KICAgICAgICAgICAgICAgICAgICBpZihsbi5sZW5ndGg+MCkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZ2V0RW52RnJvbVBpZChsbik7DQogICAgICAgICAgICAgICAgICAgICAgICBpZihlLlhBVVRIT1JJVFkgJiYgZS5ESVNQTEFZKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHsgdHR5OiAnPycsIHhhdXRob3JpdHk6IGUuWEFVVEhPUklUWSwgZGlzcGxheTogZS5ESVNQTEFZLCBleHBvcnRFbnY6IGV4cG9ydEVudiB9Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZihyZXQgPT0gbnVsbCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIC8vIFdlIGNvdWxkbid0IGZpbmQgWEFVVEhPUklUWSBhbmQgRElTUExBWSwgc28gYXMgYSBsYXN0IGRpdGNoIGVmZm9ydCwgbGV0cyBqdXN0IGxvb2sgZm9yIERJU1BMQVkNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiBsaW5lcykNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxuID0gbGluZXNbbl0udHJpbSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxuLmxlbmd0aCA+IDApDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZ2V0RW52RnJvbVBpZChsbik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuRElTUExBWSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHsgdHR5OiAnPycsIGRpc3BsYXk6IGUuRElTUExBWSwgZXhwb3J0RW52OiBleHBvcnRFbnYgfTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGZpbmQgJERJU1BMQVkgYnkgbG9va2luZyBhdCBhbGwgdGhlIHByb2Nlc3NlcyBydW5uaW5nIG9uIHRoZSBzYW1lIHR0eSBhcyB0aGUgWFNlcnZlciBpbnN0YW5jZSBmb3IgdGhpcyB1c2VyIHNlc3Npb24NCiAgICAgICAgICAgICAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgicHMgLWUgLW8gdHR5IC1vIHBpZCAtbyB1c2VyOjk5OTkgfCBncmVwICIgKyByZXQudHR5ICsgIiB8IGdyZXAgIiArIHVuYW1lICsgIiB8IGF3ayAneyBwcmludCAkMiB9JyBcbmV4aXRcbiIpOw0KICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICAgICAgICAgICAgICB2YXIgbGluZXMgPSBjaGlsZC5zdGRvdXQuc3RyLnNwbGl0KCdcbicpOw0KICAgICAgICAgICAgICAgIHZhciBwcywgcHN4LCB2LCB2cyA9IDA7DQogICAgICAgICAgICAgICAgZm9yKHZhciB4IGluIGxpbmVzKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaWYobGluZXNbeF0udHJpbSgpLmxlbmd0aD4wKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICB0cnkNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcyA9IHJlcXVpcmUoJ2ZzJykucmVhZEZpbGVTeW5jKCcvcHJvYy8nICsgbGluZXNbeF0udHJpbSgpICsgJy9lbnZpcm9uJyk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBjYXRjaChwc2UpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB2cyA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IocHN4PTA7cHN4PHBzLmxlbmd0aDsrK3BzeCkNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHNbcHN4XSA9PSAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHBzLnNsaWNlKHZzLCBwc3gpLnRvU3RyaW5nKCkuc3BsaXQoJz0nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZbMF0gPT0gJ0RJU1BMQVknKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuZGlzcGxheSA9IHZbMV07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnMgPSBwc3ggKyAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgfTsNCiAgICB9DQp9DQoNCmZ1bmN0aW9uIGV4cG9ydEVudigpDQp7DQogICAgdmFyIHIgPQ0KICAgICAgICB7DQogICAgICAgICAgICBYQVVUSE9SSVRZOiB0aGlzLnhhdXRob3JpdHk/dGhpcy54YXV0aG9yaXR5OiIiLCBESVNQTEFZOiB0aGlzLmRpc3BsYXksDQogICAgICAgICAgICBMb2NhdGlvbl9YMTFMSUI6IHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLkxvY2F0aW9uX1gxMUxJQiwNCiAgICAgICAgICAgIExvY2F0aW9uX1gxMVRTVDogcmVxdWlyZSgnbW9uaXRvci1pbmZvJykuTG9jYXRpb25fWDExVFNULA0KICAgICAgICAgICAgTG9jYXRpb25fWDExRVhUOiByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5Mb2NhdGlvbl9YMTFFWFQsDQogICAgICAgICAgICBMb2NhdGlvbl9YMTFGSVhFUzogcmVxdWlyZSgnbW9uaXRvci1pbmZvJykuTG9jYXRpb25fWDExRklYRVMNCiAgICAgICAgfTsNCiAgICByZXR1cm4gKHIpOw0KfQ0KDQppZiAocHJvY2Vzcy5wbGF0Zm9ybSAhPSAnZGFyd2luJykNCnsNCiAgICBtb2R1bGUuZXhwb3J0cyA9IG5ldyBtb25pdG9yaW5mbygpOw0KfQ0KDQppZiAocHJvY2Vzcy5wbGF0Zm9ybSA9", 16000); + memcpy_s(_monitorinfo + 32000, 84, "PSAnbGludXgnKQ0Kew0KICAgIG1vZHVsZS5leHBvcnRzLmdldExpYkluZm8gPSBnZXRMaWJJbmZvOw0KfQ0K", 84); + ILibBase64DecodeEx((unsigned char*)_monitorinfo, 32084, (unsigned char*)_monitorinfo + 32084); + duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "monitor-info"); duk_push_string(ctx, _monitorinfo + 32084); duk_pcall_method(ctx, 2); duk_pop(ctx); free(_monitorinfo); diff --git a/modules/monitor-info.js b/modules/monitor-info.js index 211e4c3..42cef73 100644 --- a/modules/monitor-info.js +++ b/modules/monitor-info.js @@ -46,10 +46,17 @@ function getLibInfo(libname) child.stdout.str = ''; child.stdout.on('data', function (chunk) { this.str += chunk.toString(); }); child.stdin.write(ldconfig + " -p | grep '" + libname + ".so.' | tr '\\n' '^' | awk -F^ '{ printf \"[\"; for(i=1;i<=NF;++i) {" + ' split($i, plat, ")"); split(plat[1], plat2, "("); ifox=split(plat2[2], ifo, ","); libc=""; hwcap="0"; for(ifoi=1;ifoi<=ifox;++ifoi) { if(split(ifo[ifoi], jnk, "libc")==2) { libc=ifo[ifoi]; } if(split(ifo[ifoi], jnk, "hwcap:")==2) { split(ifo[ifoi], jnk, "0x"); hwcap=jnk[2]; } } x=split($i, tok, " "); if(tok[1]!="") { printf "%s{\\"lib\\": \\"%s\\", \\"path\\": \\"%s\\", \\"hwcap\\": \\"%s\\", \\"libc\\": \\"%s\\"}", (i!=1?",":""), tok[1], tok[x], hwcap, libc; }} printf "]"; }\'\nexit\n'); - child.waitExit(); - var v = JSON.parse(child.stdout.str.trim()); - return (v); + + try + { + var v = JSON.parse(child.stdout.str.trim()); + return (v); + } + catch(e) + { + return ({}); + } } function monitorinfo()