From 5f1ca444a5f64fe0cec4c5aa27e6d27f93c05e33 Mon Sep 17 00:00:00 2001 From: Bryan Roe Date: Sat, 30 May 2020 23:06:40 -0700 Subject: [PATCH] Updated user-sessions to remove buggy code with lock/unlock on linux --- microscript/ILibDuktape_Polyfills.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index d496dcc..2d1334c 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -2186,14 +2186,13 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_pcall_method(ctx, 2); duk_pop(ctx); free(_servicemanager); - char *_usersessions = ILibMemory_Allocate(115500, 0, NULL, NULL); - memcpy_s(_usersessions + 0, 66000, "LyoNCkNvcHlyaWdodCAyMDE4IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQp2YXIgTk9USUZZX0ZPUl9USElTX1NFU1NJT04gPSAwOw0KdmFyIE5PVElGWV9GT1JfQUxMX1NFU1NJT05TID0gMTsNCnZhciBXTV9XVFNTRVNTSU9OX0NIQU5HRSA9IDB4MDJCMTsNCnZhciBXTV9QT1dFUkJST0FEQ0FTVCA9IDB4MjE4Ow0KdmFyIFBCVF9QT1dFUlNFVFRJTkdDSEFOR0UgPSAweDgwMTM7DQp2YXIgUEJUX0FQTVNVU1BFTkQgPSAweDQ7DQp2YXIgUEJUX0FQTVJFU1VNRVNVU1BFTkQgPSAweDc7DQp2YXIgUEJUX0FQTVJFU1VNRUFVVE9NQVRJQyA9IDB4MTI7DQp2YXIgUEJUX0FQTVBPV0VSU1RBVFVTQ0hBTkdFID0gMHhBOw0KdmFyIFBST0NFU1NfUVVFUllfSU5GT1JNQVRJT04gPSAweDA0MDA7DQp2YXIgVE9LRU5fUVVFUlkgPSAweDAwMDg7DQp2YXIgVG9rZW5Vc2VyID0gMTsNCnZhciBUb2tlblR5cGUgPSA4Ow0KdmFyIFRva2VuU2Vzc2lvbklkID0gMTI7DQp2YXIgRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUiA9IDEyMjsNCnZhciBIRUFQX1pFUk9fTUVNT1JZID0gMHgwMDAwMDAwODsNCg0KdmFyIFdUU19DT05TT0xFX0NPTk5FQ1QgICAgICAgICA9ICgweDEpOw0KdmFyIFdUU19DT05TT0xFX0RJU0NPTk5FQ1QgICAgICA9ICgweDIpOw0KdmFyIFdUU19SRU1PVEVfQ09OTkVDVCAgICAgICAgICA9ICgweDMpOw0KdmFyIFdUU19SRU1PVEVfRElTQ09OTkVDVCAgICAgICA9ICgweDQpOw0KdmFyIFdUU19TRVNTSU9OX0xPR09OICAgICAgICAgICA9ICgweDUpOw0KdmFyIFdUU19TRVNTSU9OX0xPR09GRiAgICAgICAgICA9ICgweDYpOw0KdmFyIFdUU19TRVNTSU9OX0xPQ0sgICAgICAgICAgICA9ICgweDcpOw0KdmFyIFdUU19TRVNTSU9OX1VOTE9DSyAgICAgICAgICA9ICgweDgpOw0KdmFyIFdUU19TRVNTSU9OX1JFTU9URV9DT05UUk9MICA9ICgweDkpOw0KdmFyIFdUU19TRVNTSU9OX0NSRUFURSAgICAgICAgICA9ICgweEEpOw0KdmFyIFdUU19TRVNTSU9OX1RFUk1JTkFURSAgICAgICA9ICgweEIpOw0KDQp2YXIgR1VJRF9BQ0RDX1BPV0VSX1NPVVJDRTsNCnZhciBHVUlEX0JBVFRFUllfUEVSQ0VOVEFHRV9SRU1BSU5JTkc7DQp2YXIgR1VJRF9DT05TT0xFX0RJU1BMQVlfU1RBVEU7DQoNCmZ1bmN0aW9uIGNvbHVtblBhcnNlKGRhdGEsIGRlbGltaXRlcikNCnsNCiAgICB2YXIgdG9rZW5zID0gZGF0YS5zcGxpdChkZWxpbWl0ZXIpOw0KICAgIHZhciByZXQgPSBbXTsNCiAgICBmb3IodmFyIGkgaW4gdG9rZW5zKQ0KICAgIHsNCiAgICAgICAgaWYgKHRva2Vuc1tpXS5sZW5ndGggPiAwKSB7IHJldC5wdXNoKHRva2Vuc1tpXSk7IH0NCiAgICB9DQogICAgcmV0dXJuIChyZXQpOw0KfQ0KDQoNCmZ1bmN0aW9uIFVzZXJTZXNzaW9ucygpDQp7DQogICAgdGhpcy5fT2JqZWN0SUQgPSAndXNlci1zZXNzaW9ucyc7DQogICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwodGhpcywgdHJ1ZSkNCiAgICAgICAgLmNyZWF0ZUV2ZW50KCdjaGFuZ2VkJykNCiAgICAgICAgLmNyZWF0ZUV2ZW50KCdsb2NrZWQnKQ0KICAgICAgICAuY3JlYXRlRXZlbnQoJ3VubG9ja2VkJyk7DQoNCiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKQ0KICAgIHsNCiAgICAgICAgdGhpcy5fc2VydmljZUhvb2tlZCA9IGZhbHNlOw0KICAgICAgICB0aGlzLl9tYXJzaGFsID0gcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJyk7DQogICAgICAgIHRoaXMuX2tlcm5lbDMyID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVOYXRpdmVQcm94eSgnS2VybmVsMzIuZGxsJyk7DQogICAgICAgIHRoaXMuX2tlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnR2V0TGFzdEVycm9yJyk7DQogICAgICAgIHRoaXMuX2tlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnV1RTR2V0QWN0aXZlQ29uc29sZVNlc3Npb25JZCcpDQogICAgICAgIHRoaXMuX2tlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnQ2xvc2VIYW5kbGUnKTsNCg0KICAgICAgICB0cnkNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5fd3RzID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVOYXRpdmVQcm94eSgnV3RzYXBpMzIuZGxsJyk7DQogICAgICAgICAgICB0aGlzLl93dHMuQ3JlYXRlTWV0aG9kKCdXVFNFbnVtZXJhdGVTZXNzaW9uc0EnKTsNCiAgICAgICAgICAgIHRoaXMuX3d0cy5DcmVhdGVNZXRob2QoJ1dUU1F1ZXJ5U2Vzc2lvbkluZm9ybWF0aW9uVycpOw0KICAgICAgICAgICAgdGhpcy5fd3RzLkNyZWF0ZU1ldGhvZCgnV1RTUmVnaXN0ZXJTZXNzaW9uTm90aWZpY2F0aW9uJyk7DQogICAgICAgICAgICB0aGlzLl93dHMuQ3JlYXRlTWV0aG9kKCdXVFNVblJlZ2lzdGVyU2Vzc2lvbk5vdGlmaWNhdGlvbicpOw0KICAgICAgICAgICAgdGhpcy5fd3RzLkNyZWF0ZU1ldGhvZCgnV1RTRnJlZU1lbW9yeScpOw0KICAgICAgICB9DQogICAgICAgIGNhdGNoKGV4YykNCiAgICAgICAgew0KICAgICAgICB9DQoNCiAgICAgICAgdGhpcy5fYWR2YXBpID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVOYXRpdmVQcm94eSgnQWR2YXBpMzIuZGxsJyk7DQogICAgICAgIHRoaXMuX2FkdmFwaS5DcmVhdGVNZXRob2QoJ0FsbG9jYXRlQW5kSW5pdGlhbGl6ZVNpZCcpOw0KICAgICAgICB0aGlzLl9hZHZhcGkuQ3JlYXRlTWV0aG9kKCdDaGVja1Rva2VuTWVtYmVyc2hpcCcpOw0KICAgICAgICB0aGlzLl9hZHZhcGkuQ3JlYXRlTWV0aG9kKCdGcmVlU2lkJyk7DQoNCiAgICAgICAgdGhpcy5fdXNlcjMyID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVOYXRpdmVQcm94eSgndXNlcjMyLmRsbCcpOw0KICAgICAgICB0aGlzLl91c2VyMzIuQ3JlYXRlTWV0aG9kKHsgbWV0aG9kOiAnUmVnaXN0ZXJQb3dlclNldHRpbmdOb3RpZmljYXRpb24nLCB0aHJlYWREaXNwYXRjaDogMX0pOw0KICAgICAgICB0aGlzLl91c2VyMzIuQ3JlYXRlTWV0aG9kKCdVbnJlZ2lzdGVyUG93ZXJTZXR0aW5nTm90aWZpY2F0aW9uJyk7DQogICAgICAgIHRoaXMuX3JwY3J0ID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVOYXRpdmVQcm94eSgnUnBjcnQ0LmRsbCcpOw0KICAgICAgICB0aGlzLl9ycGNydC5DcmVhdGVNZXRob2QoJ1V1aWRGcm9tU3RyaW5nQScpOw0KICAgICAgICB0aGlzLl9ycGNydC5TdHJpbmdUb1VVSUQgPSBmdW5jdGlvbiBTdHJpbmdUb1VVSUQoZ3VpZCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIHJldFZhbCA9IFN0cmluZ1RvVVVJRC51cy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSgxNik7DQogICAgICAgICAgICBpZihTdHJpbmdUb1VVSUQudXMuX3JwY3J0LlV1aWRGcm9tU3RyaW5nQShTdHJpbmdUb1VVSUQudXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoZ3VpZCksIHJldFZhbCkuVmFsID09IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0dXJuIChyZXRWYWwpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRocm93ICgnQ291bGQgbm90IGNvbnZlcnQgc3RyaW5nIHRvIFVVSUQnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICB0aGlzLl9ycGNydC5TdHJpbmdUb1VVSUQudXMgPSB0aGlzOw0KDQogICAgICAgIHRyeQ0KICAgICAgICB7DQogICAgICAgICAgICB0aGlzLl9rZXJuZWwzMi5DcmVhdGVNZXRob2QoJ09wZW5Qcm9jZXNzJykNCiAgICAgICAgICAgIHRoaXMuX2FkdmFwaS5DcmVhdGVNZXRob2QoJ09wZW5Qcm9jZXNzVG9rZW4nKTsNCiAgICAgICAgICAgIHRoaXMuX2FkdmFwaS5DcmVhdGVNZXRob2QoJ0dldFRva2VuSW5mb3JtYXRpb24nKTsNCiAgICAgICAgICAgIHRoaXMuX2FkdmFwaS5DcmVhdGVNZXRob2QoJ0xvb2t1cEFjY291bnRTaWRXJyk7DQogICAgICAgICAgICB0aGlzLl9hZHZhcGkuQ3JlYXRlTWV0aG9kKCdPcGVuVGhyZWFkVG9rZW4nKTsNCiAgICAgICAgfQ0KICAgICAgICBjYXRjaChlKQ0KICAgICAgICB7DQogICAgICAgIH0NCg0KDQogICAgICAgIEdVSURfQUNEQ19QT1dFUl9TT1VSQ0UgPSB0aGlzLl9ycGNydC5TdHJpbmdUb1VVSUQoJzVkM2U5YTU5LWU5RDUtNGIwMC1hNmJkLWZmMzRmZjUxNjU0OCcpOw0KICAgICAgICBHVUlEX0JBVFRFUllfUEVSQ0VOVEFHRV9SRU1BSU5JTkcgPSB0aGlzLl9ycGNydC5TdHJpbmdUb1VVSUQoJ2E3YWQ4MDQxLWI0NWEtNGNhZS04N2EzLWVlY2JiNDY4YTllMScpOw0KICAgICAgICBHVUlEX0NPTlNPTEVfRElTUExBWV9TVEFURSA9IHRoaXMuX3JwY3J0LlN0cmluZ1RvVVVJRCgnNmZlNjk1NTYtNzA0YS00N2EwLThmMjQtYzI4ZDkzNmZkYTQ3Jyk7DQoNCiAgICAgICAgdGhpcy5TZXNzaW9uU3RhdGVzID0gWydBY3RpdmUnLCAnQ29ubmVjdGVkJywgJ0Nvbm5lY3RRdWVyeScsICdTaGFkb3cnLCAnRGlzY29ubmVjdGVkJywgJ0lkbGUnLCAnTGlzdGVuaW5nJywgJ1Jlc2V0JywgJ0Rvd24nLCAnSW5pdCddOw0KICAgICAgICB0aGlzLkluZm9DbGFzcyA9DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJ1dUU0luaXRpYWxQcm9ncmFtJzogMCwNCiAgICAgICAgICAgICAgICAnV1RTQXBwbGljYXRpb25OYW1lJzogMSwNCiAgICAgICAgICAgICAgICAnV1RTV29ya2luZ0RpcmVjdG9yeSc6IDIsDQogICAgICAgICAgICAgICAgJ1dUU09FTUlkJzogMywNCiAgICAgICAgICAgICAgICAnV1RTU2Vzc2lvbklkJzogNCwNCiAgICAgICAgICAgICAgICAnV1RTVXNlck5hbWUnOiA1LA0KICAgICAgICAgICAgICAgICdXVFNXaW5TdGF0aW9uTmFtZSc6IDYsDQogICAgICAgICAgICAgICAgJ1dUU0RvbWFpbk5hbWUnOiA3LA0KICAgICAgICAgICAgICAgICdXVFNDb25uZWN0U3RhdGUnOiA4LA0KICAgICAgICAgICAgICAgICdXVFNDbGllbnRCdWlsZE51bWJlcic6IDksDQogICAgICAgICAgICAgICAgJ1dUU0NsaWVudE5hbWUnOiAxMCwNCiAgICAgICAgICAgICAgICAnV1RTQ2xpZW50RGlyZWN0b3J5JzogMTEsDQogICAgICAgICAgICAgICAgJ1dUU0NsaWVudFByb2R1Y3RJZCc6IDEyLA0KICAgICAgICAgICAgICAgICdXVFNDbGllbnRIYXJkd2FyZUlkJzogMTMsDQogICAgICAgICAgICAgICAgJ1dUU0NsaWVudEFkZHJlc3MnOiAxNCwNCiAgICAgICAgICAgICAgICAnV1RTQ2xpZW50RGlzcGxheSc6IDE1LA0KICAgICAgICAgICAgICAgICdXVFNDbGllbnRQcm90b2NvbFR5cGUnOiAxNiwNCiAgICAgICAgICAgICAgICAnV1RTSWRsZVRpbWUnOiAxNywNCiAgICAgICAgICAgICAgICAnV1RTTG9nb25UaW1lJzogMTgsDQogICAgICAgICAgICAgICAgJ1dUU0luY29taW5nQnl0ZXMnOiAxOSwNCiAgICAgICAgICAgICAgICAnV1RTT3V0Z29pbmdCeXRlcyc6IDIwLA0KICAgICAgICAgICAgICAgICdXVFNJbmNvbWluZ0ZyYW1lcyc6IDIxLA0KICAgICAgICAgICAgICAgICdXVFNPdXRnb2luZ0ZyYW1lcyc6IDIyLA0KICAgICAgICAgICAgICAgICdXVFNDbGllbnRJbmZvJzogMjMsDQogICAgICAgICAgICAgICAgJ1dUU1Nlc3Npb25JbmZvJzogMjQsDQogICAgICAgICAgICAgICAgJ1dUU1Nlc3Npb25JbmZvRXgnOiAyNSwNCiAgICAgICAgICAgICAgICAnV1RTQ29uZmlnSW5mbyc6IDI2LA0KICAgICAgICAgICAgICAgICdXVFNWYWxpZGF0aW9uSW5mbyc6IDI3LA0KICAgICAgICAgICAgICAgICdXVFNTZXNzaW9uQWRkcmVzc1Y0JzogMjgsDQogICAgICAgICAgICAgICAgJ1dUU0lzUmVtb3RlU2Vzc2lvbic6IDI5DQogICAgICAgICAgICB9Ow0KDQogICAgICAgIHRoaXMuaXNSb290ID0gZnVuY3Rpb24gaXNSb290KCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIE5UQXV0aG9yaXR5ID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg2KTsNCiAgICAgICAgICAgIE5UQXV0aG9yaXR5LnRvQnVmZmVyKCkud3JpdGVJbnQ4KDUsIDUpOw0KDQogICAgICAgICAgICB2YXIgQWRtaW5pc3RyYXRvcnNHcm91cCA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlUG9pbnRlcigpOw0KICAgICAgICAgICAgdmFyIGFkbWluID0gZmFsc2U7DQoNCiAgICAgICAgICAgIGlmICh0aGlzLl9hZHZhcGkuQWxsb2NhdGVBbmRJbml0aWFsaXplU2lkKE5UQXV0aG9yaXR5LCAyLCAzMiwgNTQ0LCAwLCAwLCAwLCAwLCAwLCAwLCBBZG1pbmlzdHJhdG9yc0dyb3VwKS5WYWwgIT0gMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgbWVtYmVyID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVJbnRlZ2VyKCk7DQogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2FkdmFwaS5DaGVja1Rva2VuTWVtYmVyc2hpcCgwLCBBZG1pbmlzdHJhdG9yc0dyb3VwLkRlcmVmKCksIG1lbWJlcikuVmFsICE9IDApDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBpZiAobWVtYmVyLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkgIT0gMCkgeyBhZG1pbiA9IHRydWU7IH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGhpcy5fYWR2YXBpLkZyZWVTaWQoQWRtaW5pc3RyYXRvcnNHcm91cC5EZXJlZigpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBhZG1pbjsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmdldFByb2Nlc3NPd25lck5hbWUgPSBmdW5jdGlvbiBnZXRQcm9jZXNzT3duZXJOYW1lKHBpZCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIHJldCA9IG51bGw7DQogICAgICAgICAgICB2YXIgbmFtZSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoMTAyNCk7DQogICAgICAgICAgICB2YXIgZG9tYWluID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSgxMDI0KTsNCiAgICAgICAgICAgIHZhciBuYW1lRG9tYWluTGVuZ3RoID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsgbmFtZURvbWFpbkxlbmd0aC50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoMTAyNCk7DQogICAgICAgICAgICB2YXIgYnVmZmVyTGVuZ3RoID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsNCiAgICAgICAgICAgIHZhciBzaWR0eXBlID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsNCiAgICAgICAgICAgIHZhciB0b2tlbnVzZXIgPSAwOw0KICAgICAgICAgICAgdmFyIHRva2VuID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVQb2ludGVyKCk7DQoNCiAgICAgICAgICAgIHZhciBoID0gdGhpcy5fa2VybmVsMzIuT3BlblByb2Nlc3MoUFJPQ0VTU19RVUVSWV9JTkZPUk1BVElPTiwgMSwgcGlkKTsNCiAgICAgICAgICAgIGlmIChoLlZhbCA9PSAwKSB7IHRocm93ICgnRmFpbGVkIHRvIHF1ZXJ5IHByb2Nlc3MgaWQ6ICcgKyBwaWQpOyB9DQoNCiAgICAgICAgICAgIGlmKHRoaXMuX2FkdmFwaS5PcGVuUHJvY2Vzc1Rva2VuKGgsIFRPS0VOX1FVRVJZLCB0b2tlbikuVmFsPT0wKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMuX2tlcm5lbDMyLkNsb3NlSGFuZGxlKGgpOw0KICAgICAgICAgICAgICAgIHRocm93ICgnRmFpbGVkIHRvIFF1ZXJ5IFByb2Nlc3MgVG9rZW4gZm9yIHBpZDogJyArIHBpZCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciB0c2lkID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsNCiAgICAgICAgICAgIHRoaXMuX2FkdmFwaS5HZXRUb2tlbkluZm9ybWF0aW9uKHRva2VuLkRlcmVmKCksIFRva2VuU2Vzc2lvbklkLCB0c2lkLCA0LCBidWZmZXJMZW5ndGgpOw0KICAgICAgICAgICAgdGhpcy5fYWR2YXBpLkdldFRva2VuSW5mb3JtYXRpb24odG9rZW4uRGVyZWYoKSwgVG9rZW5Vc2VyLCB0b2tlbnVzZXIsIDAsIGJ1ZmZlckxlbmd0aCk7DQogICAgICAgICAgICB0b2tlbnVzZXIgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKGJ1ZmZlckxlbmd0aC50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpKTsNCg0KICAgICAgICAgICAgaWYgKHRoaXMuX2FkdmFwaS5HZXRUb2tlbkluZm9ybWF0aW9uKHRva2VuLkRlcmVmKCksIFRva2VuVXNlciwgdG9rZW51c2VyLCBidWZmZXJMZW5ndGgudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKSwgYnVmZmVyTGVuZ3RoKS5WYWwgPT0gMCkgeyB0aHJvdyAoJ0ludGVybmFsIEVycm9yJyk7IH0NCiAgICAgICAgICAgIGlmKHRoaXMuX2FkdmFwaS5Mb29rdXBBY2NvdW50U2lkVygwLCB0b2tlbnVzZXIuRGVyZWYoKSwgbmFtZSwgbmFtZURvbWFpbkxlbmd0aCwgZG9tYWluLCBuYW1lRG9tYWluTGVuZ3RoLCBzaWR0eXBlKS5WYWwgPT0gMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aHJvdyAoJ0xvb2t1cCBFcnJvcicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIG5hbWUuX3NpemUgPSAwOyBkb21haW4uX3NpemUgPSAwOw0KICAgICAgICAgICAgICAgIHJldCA9IHsgbmFtZTogbmFtZS5XaWRlMlVURjgsIGRvbWFpbjogZG9tYWluLldpZGUyVVRGOCwgdHNpZDogdHNpZC50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpIH07DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHRoaXMuX2tlcm5lbDMyLkNsb3NlSGFuZGxlKHRva2VuLkRlcmVmKCkpOw0KICAgICAgICAgICAgdGhpcy5fa2VybmVsMzIuQ2xvc2VIYW5kbGUoaCk7DQogICAgICAgICAgICByZXR1cm4gKHJldCk7DQogICAgICAgIH07DQoNCiAgICAgICAgdGhpcy5nZXRSYXdTZXNzaW9uQXR0cmlidXRlID0gZnVuY3Rpb24gZ2V0UmF3U2Vzc2lvbkF0dHJpYnV0ZShzZXNzaW9uSWQsIGF0dHIpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBidWZmZXIgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoKTsNCiAgICAgICAgICAgIHZhciBieXRlc1JldHVybmVkID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsNCg0KICAgICAgICAgICAgaWYgKHRoaXMuX3d0cy5XVFNRdWVyeVNlc3Npb25JbmZvcm1hdGlvblcoMCwgc2Vzc2lvbklkLCBhdHRyLCBidWZmZXIsIGJ5dGVzUmV0dXJuZWQpLlZhbCA9PSAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRocm93ICgnRXJyb3IgY2FsbGluZyBXVFNRdWVyeVNlc3Npb25JbmZvcm1hdGlvblc6ICcgKyB0aGlzLl9rZXJuZWwzMi5HZXRMYXN0RXJyb3IuVmFsKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdmFyIGIgPSBidWZmZXIuRGVyZWYoKS5EZXJlZigwLCBieXRlc1JldHVybmVkLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpLnRvQnVmZmVyKCk7DQogICAgICAgICAgICB2YXIgcmV0ID0gQnVmZmVyLmFsbG9jKGJ5dGVzUmV0dXJuZWQudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKSk7DQogICAgICAgICAgICBiLmNvcHkocmV0KTsNCiAgICAgICAgICAgIHRoaXMuX3d0cy5XVFNGcmVlTWVtb3J5KGJ1ZmZlci5EZXJlZigpKTsNCiAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmdldFNlc3Npb25BdHRyaWJ1dGUgPSBmdW5jdGlvbiBnZXRTZXNzaW9uQXR0cmlidXRlKHNlc3Npb25JZCwgYXR0cikNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlUG9pbnRlcigpOw0KICAgICAgICAgICAgdmFyIGJ5dGVzUmV0dXJuZWQgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOw0KDQogICAgICAgICAgICBpZiAodGhpcy5fd3RzLldUU1F1ZXJ5U2Vzc2lvbkluZm9ybWF0aW9uVygwLCBzZXNzaW9uSWQsIGF0dHIsIGJ1ZmZlciwgYnl0ZXNSZXR1cm5lZCkuVmFsID09IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhyb3cgKCdFcnJvciBjYWxsaW5nIFdUU1F1ZXJ5U2Vzc2lvbkluZm9ybWF0aW9uVzogJyArIHRoaXMuX2tlcm5lbDMyLkdldExhc3RFcnJvci5WYWwpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgcmV0VmFsID0gYnVmZmVyLkRlcmVmKCkuV2lkZTJVVEY4Ow0KDQogICAgICAgICAgICB0aGlzLl93dHMuV1RTRnJlZU1lbW9yeShidWZmZXIuRGVyZWYoKSk7DQogICAgICAgICAgICByZXR1cm4gKHJldFZhbCk7DQogICAgICAgIH07DQogICAgICAgIHRoaXMuY29uc29sZVVpZCA9IGZ1bmN0aW9uIGNvbnNvbGVVaWQoKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgaWQgPSB0aGlzLl9rZXJuZWwzMi5XVFNHZXRBY3RpdmVDb25zb2xlU2Vzc2lvbklkKCkuVmFsOw0KICAgICAgICAgICAgaWYoaWQ9PTB4RkZGRkZGRkYpIHt0aHJvdygnTm9ib2R5IGxvZ2dlZCBpbicpO30NCiAgICAgICAgICAgIHJldHVybiAoaWQpOw0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLmdldFVzZXJuYW1lID0gZnVuY3Rpb24gZ2V0VXNlcm5hbWUodWlkKQ0KICAgICAgICB7DQogICAgICAgICAgICByZXR1cm4gKHRoaXMuZ2V0U2Vzc2lvbkF0dHJpYnV0ZSh1aWQsIHRoaXMuSW5mb0NsYXNzLldUU1VzZXJOYW1lKSk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5DdXJyZW50ID0gZnVuY3Rpb24gQ3VycmVudChjYikNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIHJldFZhbCA9IHt9Ow0KICAgICAgICAgICAgdmFyIHBpbmZvID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVQb2ludGVyKCk7DQogICAgICAgICAgICB2YXIgY291bnQgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOw0KICAgICAgICAgICAgaWYgKHRoaXMuX3d0cy5XVFNFbnVtZXJhdGVTZXNzaW9uc0EoMCwgMCwgMSwgcGluZm8sIGNvdW50KS5WYWwgPT0gMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aHJvdyAoJ0Vycm9yIGNhbGxpbmcgV1RTRW51bWVyYXRlU2Vzc2lvbnNBOiAnICsgdGhpcy5fa2VybmVsMzIuR2V0TGFzdEVycm9yKCkuVmFsKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudC50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpIDsgKytpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciBpbmZvID0gcGluZm8uRGVyZWYoKS5EZXJlZihpICogKHRoaXMuX21hcnNoYWwuUG9pbnRlclNpemUgPT0gNCA/IDEyIDogMjQpLCB0aGlzLl9tYXJzaGFsLlBvaW50ZXJTaXplID09IDQgPyAxMiA6IDI0KTsNCiAgICAgICAgICAgICAgICB2YXIgaiA9IHsgU2Vzc2lvbklkOiBpbmZvLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkgfTsNCiAgICAgICAgICAgICAgICBqLlN0YXRpb25OYW1lID0gaW5mby5EZXJlZih0aGlzLl9tYXJzaGFsLlBvaW50ZXJTaXplID09IDQgPyA0IDogOCwgdGhpcy5fbWFyc2hhbC5Qb2ludGVyU2l6ZSkuRGVyZWYoKS5TdHJpbmc7DQogICAgICAgICAgICAgICAgai5TdGF0ZSA9IHRoaXMuU2Vzc2lvblN0YXRlc1tpbmZvLkRlcmVmKHRoaXMuX21hcnNoYWwuUG9pbnRlclNpemUgPT0gNCA/IDggOiAxNiwgNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKV07DQogICAgICAgICAgICAgICAgaWYgKGouU3RhdGUgPT0gJ0FjdGl2ZScpIHsNCiAgICAgICAgICAgICAgICAgICAgai5Vc2VybmFtZSA9IHRoaXMuZ2V0U2Vzc2lvbkF0dHJpYnV0ZShqLlNlc3Npb25JZCwgdGhpcy5JbmZvQ2xhc3MuV1RTVXNlck5hbWUpOw0KICAgICAgICAgICAgICAgICAgICBqLkRv", 16000); - memcpy_s(_usersessions + 16000, 50000, "bWFpbiA9IHRoaXMuZ2V0U2Vzc2lvbkF0dHJpYnV0ZShqLlNlc3Npb25JZCwgdGhpcy5JbmZvQ2xhc3MuV1RTRG9tYWluTmFtZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJldFZhbFtqLlNlc3Npb25JZF0gPSBqOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB0aGlzLl93dHMuV1RTRnJlZU1lbW9yeShwaW5mby5EZXJlZigpKTsNCg0KICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldFZhbCwgJ0FjdGl2ZScsIHsgdmFsdWU6IHNob3dBY3RpdmVPbmx5KHJldFZhbCkgfSk7DQogICAgICAgICAgICBpZiAoY2IpIHsgY2IocmV0VmFsKTsgfQ0KICAgICAgICAgICAgcmV0dXJuIChyZXRWYWwpOw0KICAgICAgICB9Ow0KDQogICAgICAgIGlmICghZ2xvYmFsLl9ub01lc3NhZ2VQdW1wKQ0KICAgICAgICB7DQogICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHNwaW4gdXAgYSBtZXNzYWdlIHB1bXAsIGFuZCBmZXRjaCBhIHdpbmRvdyBoYW5kbGUNCiAgICAgICAgICAgIHZhciBtZXNzYWdlX3B1bXAgPSByZXF1aXJlKCd3aW4tbWVzc2FnZS1wdW1wJyk7DQogICAgICAgICAgICB0aGlzLl9tZXNzYWdlcHVtcCA9IG5ldyBtZXNzYWdlX3B1bXAoeyBmaWx0ZXI6IFdNX1dUU1NFU1NJT05fQ0hBTkdFIH0pOyB0aGlzLl9tZXNzYWdlcHVtcC5wYXJlbnQgPSB0aGlzOw0KICAgICAgICAgICAgdGhpcy5fbWVzc2FnZXB1bXAub24oJ2V4aXQnLCBmdW5jdGlvbiAoY29kZSkgeyB0aGlzLnBhcmVudC5fd3RzLldUU1VuUmVnaXN0ZXJTZXNzaW9uTm90aWZpY2F0aW9uKHRoaXMucGFyZW50Lmh3bmQpOyB9KTsNCiAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VwdW1wLm9uKCdod25kJywgZnVuY3Rpb24gKGgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuaHduZCA9IGg7DQoNCiAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHlpZWxkLCBhbmQgZG8gdGhpcyBpbiB0aGUgbmV4dCBldmVudCBsb29wIHBhc3MsIGJlY3Vhc2Ugd2UgZG9uJ3Qgd2FudCB0byBjYWxsICdSZWdpc3RlclBvd2VyU2V0dGluZ05vdGlmaWNhdGlvbicNCiAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBtZXNzYWdlcHVtcCAndGhyZWFkJywgYmVjYXVzZSB3ZSBhcmUgYWN0dWFsbHkgb24gdGhlIG1pY3Jvc3RhY2sgdGhyZWFkLCBzdWNoIHRoYXQgdGhlIG1lc3NhZ2UgcHVtcCB0aHJlYWQsIGlzIGhvbGRpbmcNCiAgICAgICAgICAgICAgICAvLyBvbiBhIHNlbWFwaG9yZSBmb3IgdXMgdG8gcmV0dXJuLiBJZiB3ZSBjYWxsIG5vdywgd2UgbWF5IGRlYWRsb2NrIG9uIFdpbmRvd3MgNywgYmVjdWFzZSBpdCB3aWxsIHRyeSB0byBub3RpZnkgaW1tZWRpYXRlbHkNCiAgICAgICAgICAgICAgICB0aGlzLmltbWVkaWF0ZSA9IHNldEltbWVkaWF0ZShmdW5jdGlvbiAoc2VsZikNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSB3aW5kb3cgaGFuZGxlLCB3ZSBjYW4gcmVnaXN0ZXIgaXQgdG8gcmVjZWl2ZSBXaW5kb3dzIE1lc3NhZ2VzDQogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnBhcmVudC5fd3RzKSB7IHNlbGYucGFyZW50Ll93dHMuV1RTUmVnaXN0ZXJTZXNzaW9uTm90aWZpY2F0aW9uKHNlbGYucGFyZW50Lmh3bmQsIE5PVElGWV9GT1JfQUxMX1NFU1NJT05TKTsgfQ0KICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5fdXNlcjMyLkFDRENfSCA9IHNlbGYucGFyZW50Ll91c2VyMzIuUmVnaXN0ZXJQb3dlclNldHRpbmdOb3RpZmljYXRpb24oc2VsZi5wYXJlbnQuaHduZCwgR1VJRF9BQ0RDX1BPV0VSX1NPVVJDRSwgMCk7DQogICAgICAgICAgICAgICAgICAgIHNlbGYucGFyZW50Ll91c2VyMzIuQkFUVF9IID0gc2VsZi5wYXJlbnQuX3VzZXIzMi5SZWdpc3RlclBvd2VyU2V0dGluZ05vdGlmaWNhdGlvbihzZWxmLnBhcmVudC5od25kLCBHVUlEX0JBVFRFUllfUEVSQ0VOVEFHRV9SRU1BSU5JTkcsIDApOw0KICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5fdXNlcjMyLkRJU1BfSCA9IHNlbGYucGFyZW50Ll91c2VyMzIuUmVnaXN0ZXJQb3dlclNldHRpbmdOb3RpZmljYXRpb24oc2VsZi5wYXJlbnQuaHduZCwgR1VJRF9DT05TT0xFX0RJU1BMQVlfU1RBVEUsIDApOw0KICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHNlbGYucGFyZW50Ll91c2VyMzIuQUNEQ19ILlZhbCwgc2VsZi5wYXJlbnQuX3VzZXIzMi5CQVRUX0guVmFsLCBzZWxmLnBhcmVudC5fdXNlcjMyLkRJU1BfSC5WYWwpOw0KICAgICAgICAgICAgICAgIH0sIHRoaXMpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB0aGlzLl9tZXNzYWdlcHVtcC5vbignbWVzc2FnZScsIGZ1bmN0aW9uIChtc2cpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgc3dpdGNoIChtc2cubWVzc2FnZSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgV01fV1RTU0VTU0lPTl9DSEFOR0U6DQogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZy53cGFyYW0pDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXVFNfU0VTU0lPTl9MT0NLOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5lbnVtZXJhdGVVc2VycygpLnRoZW4oZnVuY3Rpb24gKHVzZXJzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlcnNbbXNnLmxwYXJhbV0pIHsgdGhpcy5wYXJlbnQuZW1pdCgnbG9ja2VkJywgdXNlcnNbbXNnLmxwYXJhbV0pOyB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdUU19TRVNTSU9OX1VOTE9DSzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuZW51bWVyYXRlVXNlcnMoKS50aGVuKGZ1bmN0aW9uICh1c2VycykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZXJzW21zZy5scGFyYW1dKSB7IHRoaXMucGFyZW50LmVtaXQoJ3VubG9ja2VkJywgdXNlcnNbbXNnLmxwYXJhbV0pOyB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdUU19TRVNTSU9OX0xPR09OOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV1RTX1NFU1NJT05fTE9HT0ZGOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5lbWl0KCdjaGFuZ2VkJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgV01fUE9XRVJCUk9BRENBU1Q6DQogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZy53cGFyYW0pDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1dNX1BPV0VSQlJPQURDQVNUIFtVTktOT1dOIHdwYXJhbV06ICcgKyBtc2cud3BhcmFtKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQQlRfQVBNU1VTUEVORDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgncG93ZXItbW9uaXRvcicpLmVtaXQoJ3N4JywgJ1NMRUVQJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUEJUX0FQTVJFU1VNRUFVVE9NQVRJQzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgncG93ZXItbW9uaXRvcicpLmVtaXQoJ3N4JywgJ1JFU1VNRV9OT05fSU5URVJBQ1RJVkUnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQQlRfQVBNUkVTVU1FU1VTUEVORDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgncG93ZXItbW9uaXRvcicpLmVtaXQoJ3N4JywgJ1JFU1VNRV9JTlRFUkFDVElWRScpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBCVF9BUE1QT1dFUlNUQVRVU0NIQU5HRToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgncG93ZXItbW9uaXRvcicpLmVtaXQoJ2NoYW5nZWQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQQlRfUE9XRVJTRVRUSU5HQ0hBTkdFOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbHBhcmFtID0gdGhpcy5wYXJlbnQuX21hcnNoYWwuQ3JlYXRlUG9pbnRlcihCdWZmZXIuZnJvbShtc2cubHBhcmFtX2hleCwgJ2hleCcpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBscGFyYW0uRGVyZWYoMjAsIGxwYXJhbS5EZXJlZigxNiwgNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoMCkpLnRvQnVmZmVyKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobHBhcmFtLkRlcmVmKDAsIDE2KS50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBHVUlEX0FDRENfUE9XRVJfU09VUkNFLkRlcmVmKDAsIDE2KS50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGRhdGEucmVhZFVJbnQzMkxFKDApKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgncG93ZXItbW9uaXRvcicpLmVtaXQoJ2FjZGMnLCAnQUMnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnYWNkYycsICdCQVRURVJZJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgncG93ZXItbW9uaXRvcicpLmVtaXQoJ2FjZGMnLCAnSE9UJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEdVSURfQkFUVEVSWV9QRVJDRU5UQUdFX1JFTUFJTklORy5EZXJlZigwLCAxNikudG9CdWZmZXIoKS50b1N0cmluZygnaGV4Jyk6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgncG93ZXItbW9uaXRvcicpLmVtaXQoJ2JhdHRlcnlMZXZlbCcsIGRhdGEucmVhZFVJbnQzMkxFKDApKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgR1VJRF9DT05TT0xFX0RJU1BMQVlfU1RBVEUuRGVyZWYoMCwgMTYpLnRvQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGF0YS5yZWFkVUludDMyTEUoMCkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnZGlzcGxheScsICdPRkYnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnZGlzcGxheScsICdPTicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ3Bvd2VyLW1vbml0b3InKS5lbWl0KCdkaXNwbGF5JywgJ0RJTU1FRCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBlbHNlIGlmKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JyB8fCBwcm9jZXNzLnBsYXRmb3JtID09ICdmcmVlYnNkJykNCiAgICB7DQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiZ2RtVWlkIiwgew0KICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciByZXQgPSBudWxsOw0KICAgICAgICAgICAgICAgIHZhciBtaW4gPSB0aGlzLm1pblVpZCgpOw0KICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnZ2V0ZW50IHBhc3N3ZCB8IGdyZXAgIkdub21lIERpc3BsYXkgTWFuYWdlciIgfCAnICsgInRyICdcXG4nICdgJyB8IGF3ayAtRjogJ3sgcHJpbnQgJDMgfSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgaWYgKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpICE9ICcnICYmIChyZXQgPSBwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkpIDwgbWluKSB7IHJldHVybiAocGFyc2VJbnQoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpKTsgfQ0KDQogICAgICAgICAgICAgICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IGNvbnNvbGUubG9nKGMudG9TdHJpbmcoKSk7IH0pOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdnZXRlbnQgcGFzc3dkIHwgZ3JlcCBnZG0gfCAnICsgInRyICdcXG4nICdgJyB8IGF3ayAtRidgJyAnIiArICd7IGZvcihpPTE7aTxORjsrK2kpIHsgc3BsaXQoJGksIGYsICI6Iik7IGlmKGZbM10rMDwnICsgbWluICsgJyswKSB7IHByaW50IGZbM107IGJyZWFrOyB9IH0gfScgKyAiJ1xuZXhpdFxuIik7DQogICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICBpZiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgIT0gJycgJiYgKHJldCA9IHBhcnNlSW50KGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKSkgPCBtaW4pIHsgcmV0dXJuIChwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkpOyB9DQoNCiAgICAgICAgICAgICAgICByZXR1cm4gKDApOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICAgICAgdGhpcy5nZXRVaWQgPSBmdW5jdGlvbiBnZXRVaWQodXNlcm5hbWUpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiZ2V0ZW50IHBhc3N3ZCBcIiIgKyB1c2VybmFtZSArICJcIiB8IGF3ayAtRjogJ3twcmludCAkM30nXG5leGl0XG4iKTsNCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICAgICAgICAgIHZhciByZXQgPSBwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyKTsNCiAgICAgICAgICAgIGlmIChyZXQgPj0gMCkgeyByZXR1cm4gKHJldCk7IH0NCiAgICAgICAgICAgIHRocm93ICgndXNlcm5hbWU6ICcgKyB1c2VybmFtZSArICcgTk9UIEZPVU5EJyk7DQogICAgICAgIH07DQogICAgICAgIA0KICAgICAgICB0aGlzLkN1cnJlbnQgPSBmdW5jdGlvbiBDdXJyZW50KGNiKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJ3aG8gfCB0ciAnXFxuJyAnYCcgfCBhd2sgLUYnYCcgJyIgKyAneyBwcmludGYgInsiOyBmb3IoYT0xO2E8TkY7KythKSB7IG49c3BsaXQoJGEsIHRvaywgIiAiKTsgcHJpbnRmICIlc1xcIiVzXFwiOiBcXCIlc1xcIiIsIChhPjE/IiwiOiIiKSwgdG9rWzJdLCB0b2tbMV07ICB9IHByaW50ZiAifSI7ICB9XCdcbmV4aXRcbicpOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgICAgICAgICAgdmFyIHJldCA9IHt9Ow0KDQogICAgICAgICAgICB0cnkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXQgPSBKU09OLnBhcnNlKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsNCiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gcmV0KQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0W2tleV0gPSB7IFVzZXJuYW1lOiByZXRba2V5XSwgU2Vzc2lvbklkOiBrZXksIFN0YXRlOiAnQWN0aXZlJywgdWlkOiB0aGlzLmdldFVpZChyZXRba2V5XSkgfTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXRjaChlKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0LCAnQWN0aXZlJywgeyB2YWx1ZTogc2hvd0FjdGl2ZU9ubHkocmV0KSB9KTsNCg0KICAgICAgICAgICAgaWYgKGNiKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGNiLmNhbGwodGhpcywgcmV0KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdsaW51eCcpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBkYnVzID0gcmVxdWlyZSgnbGludXgtZGJ1cycpOw0KICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykud2F0Y2gpIHsNCiAgICAgICAgICAgICAgICB0aGlzLl9saW51eFdhdGNoZXIgPSByZXF1aXJlKCdmcycpLndhdGNoKCcvdmFyL3J1bi91dG1wJyk7DQogICAgICAgICAgICAgICAgdGhpcy5fbGludXhXYXRjaGVyLnVzZXJfc2Vzc2lvbiA9IHRoaXM7DQogICAgICAgICAgICAgICAgdGhpcy5fbGludXhXYXRjaGVyLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoYSwgYikNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMudXNlcl9zZXNzaW9uLmVtaXQoJ2NoYW5nZWQnKTsNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgdGhpcy5fcmVjaGVja0xvZ2dlZEluVXNlcnMgPSBmdW5jdGlvbiBfcmVjaGVja0xvZ2dlZEluVXNlcnMoKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMuZW51bWVyYXRlVXNlcnMoKS50aGVuKGZ1bmN0aW9uICh1KQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHUuQWN0aXZlLmxlbmd0aCA+IDApDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGFscmVhZHkgYSB1c2VyIGxvZ2dlZCBpbiwgc28gd2UgY2FuIG1vbml0b3IgREJVUyBmb3IgbG9jay91bmxvY2sNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudC5fbGludXhfbG9ja193YXRjaGVyICE9IG51bGwgJiYgdGhpcy5wYXJlbnQuX2xpbnV4X2xvY2tfd2F0Y2hlci51aWQgIT0gdS5BY3RpdmVbMF0udWlkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnBhcmVudC5fbGludXhfbG9ja193YXRjaGVyOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVudiA9IHRoaXMucGFyZW50LmZpbmRFbnZFbnRyeSh7IHVzZXJuYW1lOiB1LkFjdGl2ZVswXS5Vc2VybmFtZSwgZ3JlcDogJ2RidXMtZGFlbW9uJywgdmFsdWVzOiBbJ0RCVVNfU0VTU0lPTl9CVVNfQUREUkVTUycsICdYREdfQ1VSUkVOVF9E", 16000); - memcpy_s(_usersessions + 32000, 34000, "RVNLVE9QJ10gfSk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoZW52KS5sZW5ndGggPT0gMCkgeyBlbnYgPSB0aGlzLnBhcmVudC5maW5kRW52RW50cnkoeyB1c2VybmFtZTogdS5BY3RpdmVbMF0uVXNlcm5hbWUsIGdyZXA6ICdYJywgdmFsdWVzOiBbJ0RCVVNfU0VTU0lPTl9CVVNfQUREUkVTUycsICdYREdfQ1VSUkVOVF9ERVNLVE9QJ10gfSk7IH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhlbnYpLmxlbmd0aCA9PSAwKSB7IGVudiA9IHRoaXMucGFyZW50LmZpbmRFbnZFbnRyeSh7IHVzZXJuYW1lOiB1LkFjdGl2ZVswXS5Vc2VybmFtZSwgZ3JlcDogJ2RidXMtZGFlbW9uJywgdmFsdWVzOiBbJ0RCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyddIH0pOyB9DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VydmljZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChlbnZbJ1hER19DVVJSRU5UX0RFU0tUT1AnXSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdVbml0eSc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgPSAnY29tLnVidW50dS5VcHN0YXJ0MF82JzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZSA9IHJlcXVpcmUoJ2xpbnV4LWRidXMnKS5nZXRTZXJ2aWNlcygnU2NyZWVuU2F2ZXInLCB7IHVpZDogdS5BY3RpdmVbMF0udWlkLCBlbnY6IGVudiB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2UuaW5jbHVkZXMoJ29yZy5nbm9tZS5TY3JlZW5TYXZlcicpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlID0gJ29yZy5nbm9tZS5TY3JlZW5TYXZlcic7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2VydmljZS5pbmNsdWRlcygnb3JnLmZyZWVkZXNrdG9wLlNjcmVlblNhdmVyJykpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgPSAnb3JnLmZyZWVkZXNrdG9wLlNjcmVlblNhdmVyJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgPSBudWxsOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlcnZpY2UpIHsgcmV0dXJuOyB9DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5fbGludXhfbG9ja193YXRjaGVyID0gbmV3IGRidXMoc2VydmljZSwgdS5BY3RpdmVbMF0udWlkLCBlbnYpOw0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuX2xpbnV4X2xvY2tfd2F0Y2hlci51c2VyX3Nlc3Npb24gPSB0aGlzLnBhcmVudDsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Ll9saW51eF9sb2NrX3dhdGNoZXIub24oJ3NpZ25hbCcsIGZ1bmN0aW9uIChzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocy52YWx1ZSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgdHJ1ZToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGVza3RvcC1sb2NrJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXNlcl9zZXNzaW9uLmVtaXQoJ2xvY2tlZCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZmFsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Rlc2t0b3AtdW5sb2NrJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXNlcl9zZXNzaW9uLmVtaXQoJ3VubG9ja2VkJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLnBhcmVudC5fbGludXhfbG9ja193YXRjaGVyICE9IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnBhcmVudC5fbGludXhfbG9ja193YXRjaGVyOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgIH07DQogICAgICAgICAgICB0aGlzLmdldFVpZENvbmZpZyA9IGZ1bmN0aW9uIGdldFVpZENvbmZpZygpIHsNCiAgICAgICAgICAgICAgICB2YXIgcmV0ID0ge307DQogICAgICAgICAgICAgICAgdmFyIGNmZyA9IHJlcXVpcmUoJ2ZzJykucmVhZEZpbGVTeW5jKCcvZXRjL2xvZ2luLmRlZnMnKS50b1N0cmluZygpLnNwbGl0KCdcbicpOw0KICAgICAgICAgICAgICAgIHZhciB0b2tlbnM7DQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBjZmcpIHsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gY29sdW1uUGFyc2UoY2ZnW2ldLCAnXHQnKTsgLy9jb25zb2xlLmxvZyh0b2tlbnMpOw0KICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5zWzBdID09ICdVSURfTUlOJykgeyByZXQuTUlOID0gcGFyc2VJbnQodG9rZW5zWzFdKTsgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5zWzBdID09ICdVSURfTUFYJykgeyByZXQuTUFYID0gcGFyc2VJbnQodG9rZW5zWzFdKTsgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAocmV0Lk1JTiAhPSBudWxsICYmIHJldC5NQVggIT0gbnVsbCkgeyBicmVhazsgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7DQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgdGhpcy5vbignY2hhbmdlZCcsIGZ1bmN0aW9uICgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgLy8gRm9yIGxpbnV4IExvY2svVW5sb2NrIG1vbml0b3JpbmcsIHdlIG5lZWQgdG8gd2F0Y2ggZm9yIExvZ09uL0xvZ09mZiwgYW5kIGtlZXAgdHJhY2sgb2YgdGhlIFVJRC4NCiAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VkVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKHRoYXQpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAvLyBEb2luZyB0aGlzIGluIGEgdGltZW91dCwgYmVjdWFzZSB0aGVyZSBpcyBhIHJhY2UgYmV0d2VlbiB3aGVuIGxvZ29uIGlzIGRldGVjdGVkLCBhbmQgd2hlbiBkYnVzIHNlc3Npb24gaXMgc3Bhd25lZA0KICAgICAgICAgICAgICAgICAgICB0aGF0Ll9yZWNoZWNrTG9nZ2VkSW5Vc2Vycy5jYWxsKHRoYXQpOw0KICAgICAgICAgICAgICAgIH0sIDIwMDAsIHRoaXMpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCg0KICAgICAgICB0aGlzLm1pblVpZCA9ICBmdW5jdGlvbiBtaW5VaWQoKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgL2V0Yy9sb2dpbi5kZWZzIHwgZ3JlcCBVSURfIHwgYXdrICd7IGlmKCQxPT1cIlVJRF9NSU5cIikgeyBwcmludCAkMjsgfSB9J1xuZXhpdFxuIik7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgcmV0dXJuIChwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkgPj0gMCA/IHBhcnNlSW50KGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKSA6IDUwMCk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5fdXNlcnMgPSBmdW5jdGlvbiBfdXNlcnMoKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImdldGVudCBwYXNzd2QgfCBhd2sgLUY6ICd7IGlmKCQzPj0wKSB7IHByaW50ZiBcIiVzOiVzXFxuXCIsICQxLCAkMzsgfSB9J1xuZXhpdFxuIik7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgICAgICAgICB2YXIgbGluZXMgPSBjaGlsZC5zdGRvdXQuc3RyLnNwbGl0KCdcbicpOw0KICAgICAgICAgICAgdmFyIHJldCA9IHt9LCB0b2tlbnM7DQogICAgICAgICAgICBmb3IgKHZhciBsbiBpbiBsaW5lcykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbnMgPSBsaW5lc1tsbl0uc3BsaXQoJzonKTsNCiAgICAgICAgICAgICAgICBpZiAodG9rZW5zWzBdKSB7IHJldFt0b2tlbnNbMF1dID0gdG9rZW5zWzFdOyB9ICAgICAgICAgICANCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLl91aWRzID0gZnVuY3Rpb24gX3VpZHMoKSB7DQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImdldGVudCBwYXNzd2QgfCBhd2sgLUY6ICd7IGlmKCQzPj0wKSB7IHByaW50ZiBcIiVzOiVzXFxuXCIsICQxLCAkMzsgfSB9J1xuZXhpdFxuIik7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgICAgICAgICB2YXIgbGluZXMgPSBjaGlsZC5zdGRvdXQuc3RyLnNwbGl0KCdcbicpOw0KICAgICAgICAgICAgdmFyIHJldCA9IHt9LCB0b2tlbnM7DQogICAgICAgICAgICBmb3IgKHZhciBsbiBpbiBsaW5lcykgew0KICAgICAgICAgICAgICAgIHRva2VucyA9IGxpbmVzW2xuXS5zcGxpdCgnOicpOw0KICAgICAgICAgICAgICAgIGlmICh0b2tlbnNbMF0pIHsgcmV0W3Rva2Vuc1sxXV0gPSB0b2tlbnNbMF07IH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmxvZ2luVWlkcyA9IGZ1bmN0aW9uIGxvZ2luVWlkcygpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBtaW4gPSB0aGlzLm1pblVpZCgpOw0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnZ2V0ZW50IHBhc3N3ZCB8IGF3ayAtRjogXCd7IGlmKCQzID49ICcgKyBtaW4gKyAnKSB7IGE9c3BsaXQoJDcsYiwiLyIpOyBpZihiW2FdIT0ibm9sb2dpbiIpIHsgcHJpbnQgJDM7IH0gfX1cJyB8IHRyICJcXG4iICJcXCwiIHwgYXdrIFwneyBwcmludGYgIlslc10iLCAkMDsgfVwnXG5leGl0XG4nKTsNCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICByZXR1cm4gKEpTT04ucGFyc2UoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkucmVwbGFjZSgnLF0nLCddJykpKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmNvbnNvbGVVaWQgPSBmdW5jdGlvbiBjb25zb2xlVWlkKCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgid2hvIHwgdHIgJ1xcbicgJ1xgJyB8IGF3ayAneyBwcmludCAkMSB9J1xuZXhpdFxuIik7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgICAgICAgICBpZiAoY2hpbGQuc3RkZXJyLnN0ciAhPSAnJykgeyByZXR1cm4gKDApOyB9DQogICAgICAgICAgICBpZiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgIT0gJycpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuZ2V0VWlkKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGNhdGNoIChlKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIEJlZm9yZSB3ZSBzYXkgbm9ib2R5IGlzIGxvZ2dlZCBvbiwgbGV0J3MgY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGEgR0RNIHNlc3Npb24NCiAgICAgICAgICAgIHZhciBnZG0gPSB0aGlzLmdkbVVpZDsNCiAgICAgICAgICAgIHZhciBpbmZvID0gcmVxdWlyZSgnbW9uaXRvci1pbmZvJykuZ2V0WEluZm8oZ2RtKTsNCiAgICAgICAgICAgIGlmIChpbmZvID09IG51bGwgfHwgIWluZm8ueGF1dGhvcml0eSB8fCAhaW5mby5kaXNwbGF5KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRocm93ICgnbm9ib2R5IGxvZ2dlZCBpbnRvIGNvbnNvbGUnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gKGdkbSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIHRoaXMuZ2V0SG9tZUZvbGRlciA9IGZ1bmN0aW9uIGdldEhvbWVGb2xkZXIoaWQpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiZ2V0ZW50IHBhc3N3ZCAiICsgaWQgKyAiIHwgYXdrIC1GOiAne3ByaW50ICQ2fSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOw0KICAgICAgICB9DQoNCiAgICAgICAgdGhpcy5nZXRVc2VybmFtZSA9IGZ1bmN0aW9uIGdldFVzZXJuYW1lKHVpZCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJnZXRlbnQgcGFzc3dkICIgKyB1aWQgKyAiIHwgYXdrIC1GOiAne3ByaW50ICQxfSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgIGlmIChjaGlsZC5zdGRvdXQuc3RyLmxlbmd0aCA+IDApIHsgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7IH0NCiAgICAgICAgICAgIHRocm93ICgndWlkOiAnICsgdWlkICsgJyBOT1QgRk9VTkQnKTsNCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy5nZXRHcm91cG5hbWUgPSBmdW5jdGlvbiBnZXRHcm91cG5hbWUoZ2lkKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImdldGVudCBncm91cCAiICsgZ2lkICsgIiB8IGF3ayAtRjogJ3twcmludCAkMX0nXG5leGl0XG4iKTsNCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICBpZiAoY2hpbGQuc3Rkb3V0LnN0ci5sZW5ndGggPiAwKSB7IHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOyB9DQogICAgICAgICAgICB0aHJvdyAoJ2dpZDogJyArIGdpZCArICcgTk9UIEZPVU5EJyk7DQogICAgICAgIH07DQogICAgICAgIHRoaXMud2hvYW1pID0gZnVuY3Rpb24gd2hvYW1pKCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJ3aG9hbWlcbmV4aXRcbiIpOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOw0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLmdldFBpZHMgPSBmdW5jdGlvbiBnZXRQaWRzKG9wdGlvbnMpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBncmVwID0gJyc7DQogICAgICAgICAgICBzd2l0Y2godHlwZW9mKG9wdGlvbnMpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgIHRocm93ICgnSW52YWxpZCB0eXBlIHNwZWNpZmllZDogJyArIHR5cGVvZiAob3B0aW9ucykpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlICdudW1iZXInOg0KICAgICAgICAgICAgICAgICAgICBncmVwID0gJyB8IGdyZXAgIicgKyB0aGlzLmdldFVzZXJuYW1lKG9wdGlvbnMpICsgJyInOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlICdzdHJpbmcnOg0KICAgICAgICAgICAgICAgICAgICBncmVwID0gJyB8IGdyZXAgIicgKyBvcHRpb25zICsgJyInOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlICdvYmplY3QnOg0KICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy51c2VybmFtZSkgeyBncmVwID0gJyB8IGdyZXAgIicgKyBvcHRpb25zLnVzZXJuYW1lICsgJyInOyB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnMudWlkICE9IG51bGwpIHsgZ3JlcCA9ICcgfCBncmVwICInICsgdGhpcy5nZXRVc2VybmFtZShvcHRpb25zLnVpZCkgKyAnIic7IH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZ3JlcCkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcCArPSAoJyB8IGdyZXAgIicgKyBvcHRpb25zLmdyZXAgKyAnIicpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbihjKXt0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7fSk7DQogICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uKGMpe3RoaXMuc3RyICs9IGMudG9TdHJpbmcoKTt9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdwcyAtZSAtbyBwaWQgLW8gdXNlciAtbyBjbWQgJyArIGdyZXAgKyAnIHwnICsgIiB0ciAnXG4nICdgJyB8IGF3ayAtRidgJyAneyAiICsgJ3ByaW50ZiAiWyI7IGZvcihpPTE7aTxORjsrK2kpIHsgc3BsaXQoJGksIHRvaywgIiAiKTsgcHJpbnRmICIlcyVzIiwoaSE9MT8iLCI6IiIpLCB0b2tbMV07ICB9IHByaW50ZiAiXSI7IH1cJ1xuZXhpdFxuJyk7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgICAgICAgICB0cnkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gKEpTT04ucGFyc2UoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhdGNoKGVlKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJldHVybihbXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgICAgIHRoaXMuZmluZEVudkVudHJ5ID0gZnVuY3Rpb24gZmluZEVudkVudHJ5KG9wdGlvbnMpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBicm9rZSA9IGZhbHNlOw0KICAgICAgICAgICAgdmFyIHJldCA9IHt9Ow0KICAgICAgICAgICAgdmFyIHBpZHMgPSB0aGlzLmdldFBpZHMob3B0aW9ucyk7DQoNCiAgICAgICAgICAgIHZhciB2YWxzOw0KICAgICAgICAgICAgdmFyIGo7DQogICAgICAgICAgICBmb3IodmFyIGkgaW4gcGlkcykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBicm9rZSA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIHJldCA9IHt9Ow0KICAgICAgICAgICAgICAgIHZhbHMgPSB0aGlzLmdldEVudkZyb21QaWQocGlkc1tpXSk7DQoNCiAgICAgICAgICAgICAgICBmb3IgKGogaW4gb3B0aW9ucy52YWx1ZXMpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBpZih2YWxzW29wdGlvbnMudmFsdWVzW2pdXSkNCiAgICAgICAg", 16000); - memcpy_s(_usersessions + 48000, 18000, "ICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0W29wdGlvbnMudmFsdWVzW2pdXSA9IHZhbHNbb3B0aW9ucy52YWx1ZXNbal1dOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgYnJva2UgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoYnJva2UpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0dXJuICh7fSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLmdldEVudkZyb21QaWQgPSBmdW5jdGlvbiBnZXRFbnZGcm9tUGlkKHBpZCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIHJldCA9IHt9Ow0KICAgICAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQoNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0IC9wcm9jLyIgKyBwaWQgKyAiL2Vudmlyb24gfCB0ciAnXFwwJyAnXFx0JyB8IiArICcgYXdrIC1GIlx0IiBcJ3sgcHJpbnRmICJ7IjsgZm9yKGk9MTtpPE5GOysraSkgeyBpZihpPjEpIHtwcmludGYgIiwiO30geD1zcGxpdCgkaSwgdG9rLCAiPSIpOyBwcmludGYgIlxcIiVzXFwiOiBcXCIlc1xcIiIsIHRva1sxXSwgc3Vic3RyKCRpLCAyK2xlbmd0aCh0b2tbMV0pKTsgfSBwcmludGYgIn0iOyB9XCcnKTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnXG5leGl0XG4nKTsNCiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEpTT04ucGFyc2UoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgY2F0Y2goZWUpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHt9KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdmcmVlYnNkJykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgicHJvY3N0YXQgLWUgIiArIHBpZCArICIgfCBncmVwICIgKyBwaWQgKyAiIHwgYXdrICd7ICQxPVwiXCI7ICQyPVwiXCI7IHByaW50ICQwIH0nIHwgdHIgXCJcXCBcIiBcIlxcblwiXG5leGl0XG4iKTsgDQogICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCgkJDQogICAgICAgICAgICAgICAgdmFyIGVudjsNCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkuc3BsaXQoJ1xuJyk7DQogICAgICAgICAgICAgICAgZm9yKHZhciBpIGluIHRva2VucykNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGVudiA9IHRva2Vuc1tpXS5zcGxpdCgnPScpOw0KICAgICAgICAgICAgICAgICAgICByZXRbZW52WzBdXSA9IGVudlsxXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gKHJldCk7DQogICAgICAgIH07DQogICAgICAgIHRoaXMuZmluZEVudiA9IGZ1bmN0aW9uIGZpbmRFbnYodWlkLCBlbnYpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciB1bmFtZSA9IHRoaXMuZ2V0VXNlcm5hbWUodWlkKTsNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgicHMgIiArIChwcm9jZXNzLnBsYXRmb3JtID09ICdmcmVlYnNkJyA/ICItYXggIjoiIikgKyAiLWUgLW8gcGlkIC1vIHVzZXIgfCBncmVwICIgKyB1bmFtZSArICIgfCBhd2sgJ3sgcHJpbnQgJDEgfSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgICAgICAgICAgdmFyIGxpbmVzID0gY2hpbGQuc3Rkb3V0LnN0ci5zcGxpdCgnXG4nKTsNCiAgICAgICAgICAgIGZvciAodmFyIG4gaW4gbGluZXMpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGxuID0gbGluZXNbbl0udHJpbSgpOw0KICAgICAgICAgICAgICAgIGlmIChsbi5sZW5ndGggPiAwKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzLmdldEVudkZyb21QaWQobG4pOw0KICAgICAgICAgICAgICAgICAgICBpZiAoZVtlbnZdKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGVbZW52XSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gKG51bGwpOw0KICAgICAgICB9Ow0KICAgIH0NCiAgICBlbHNlIGlmKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2RhcndpbicpDQogICAgew0KICAgICAgICB0aGlzLmdldFVpZCA9IGZ1bmN0aW9uIGdldFVpZCh1c2VybmFtZSkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJpZCAiICsgdXNlcm5hbWUgKyAiIHwgYXdrICd7IHNwbGl0KCQxLCB0b2tlbiwgXCI9XCIpOyBzcGxpdCh0b2tlblsyXSwgdWlkLCBcIihcIik7IHByaW50IHVpZFsxXTsgfSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgIHJldHVybiAocGFyc2VJbnQoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpKTsNCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy5nZXRHcm91cElEID0gZnVuY3Rpb24gZ2V0R3JvdXBJRCh1aWQpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiaWQgIiArIHVpZCArICIgfCBhd2sgJ3sgc3BsaXQoJDIsIGdpZCwgXCI9XCIpOyBpZihnaWRbMV09PVwiZ2lkXCIpIHsgc3BsaXQoZ2lkWzJdLCBnaWRudW0sIFwiKFwiKTsgcHJpbnQgZ2lkbnVtWzFdOyAgfSB9J1xuZXhpdFxuIik7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgcmV0dXJuIChwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuZ2V0VXNlcm5hbWUgPSBmdW5jdGlvbiBnZXRVc2VybmFtZSh1aWQpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiZHNjbCAuIGxpc3QgL1VzZXJzIFVuaXF1ZUlEIHwgZ3JlcCAiICsgdWlkICsgIiB8IGF3ayAneyBpZigkMj09IiArIHVpZCArICIpeyBwcmludCAkMSB9fSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgIGlmKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpICE9ICcnKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRocm93ICgndWlkOiAnICsgdWlkICsgJyBub3QgZm91bmQnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy5nZXRHcm91cG5hbWUgPSBmdW5jdGlvbiBnZXRHcm91cG5hbWUoZ2lkKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImRzY2wgLiBsaXN0IC9Hcm91cHMgUHJpbWFyeUdyb3VwSUQgfCBncmVwICIgKyBnaWQgKyAiIHwgYXdrICd7IGlmKCQyPT0iICsgZ2lkICsgIil7IHByaW50ICQxIH19J1xuZXhpdFxuIik7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgaWYoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgIT0gJycpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhyb3cgKCdnaWQ6ICcgKyBnaWQgKyAnIG5vdCBmb3VuZCcpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLmNvbnNvbGVVaWQgPSBmdW5jdGlvbiBjb25zb2xlVWlkKCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJ3aG8gfCB0ciAnXG4nICdcLicgfCBhd2sgJ3sgcHJpbnQgJDEgfSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgICAgICAgICAgdmFyIHJldCA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpOw0KICAgICAgICAgICAgaWYgKHJldCAhPSAnJykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuZ2V0VWlkKHJldCkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhyb3cgKCdub2JvZHkgbG9nZ2VkIGludG8gY29uc29sZScpOyAgICAgDQogICAgICAgIH0NCiAgICAgICAgdGhpcy5nZXRIb21lRm9sZGVyID0gZnVuY3Rpb24gZ2V0SG9tZUZvbGRlcih1c2VyKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImRzY2wgLiAtcmVhZCAvVXNlcnMvIiArIHVzZXIgKyAiIHwgZ3JlcCBORlNIb21lRGlyZWN0b3J5IHwgYXdrIC1GOiAneyBwcmludCAkMiB9J1xuZXhpdFxuIik7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgaWYgKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpICE9ICcnKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRocm93ICgndXNlcjogJyArIHVzZXIgKyAnIG5vdCBmb3VuZCcpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLl91c2VycyA9IGZ1bmN0aW9uICgpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL3Vzci9iaW4vZHNjbCcsIFsnZHNjbCcsICcuJywgJ2xpc3QnLCAnL1VzZXJzJywgJ1VuaXF1ZUlEJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOw0KICAgICAgICAgICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2V4aXRcbicpOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KDQogICAgICAgICAgICB2YXIgbGluZXMgPSBjaGlsZC5zdGRvdXQuc3RyLnNwbGl0KCdcbicpOw0KICAgICAgICAgICAgdmFyIHRva2VucywgaTsNCiAgICAgICAgICAgIHZhciB1c2VycyA9IHt9Ow0KDQogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHsNCiAgICAgICAgICAgICAgICB0b2tlbnMgPSBsaW5lc1tpXS5zcGxpdCgnICcpOw0KICAgICAgICAgICAgICAgIGlmICh0b2tlbnNbMF0pIHsgdXNlcnNbdG9rZW5zWzBdXSA9IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV07IH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcmV0dXJuICh1c2Vycyk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5fdWlkcyA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL3Vzci9iaW4vZHNjbCcsIFsnZHNjbCcsICcuJywgJ2xpc3QnLCAnL1VzZXJzJywgJ1VuaXF1ZUlEJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2V4aXRcbicpOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgICAgICAgICAgdmFyIGxpbmVzID0gY2hpbGQuc3Rkb3V0LnN0ci5zcGxpdCgnXG4nKTsNCiAgICAgICAgICAgIHZhciB0b2tlbnMsIGk7DQogICAgICAgICAgICB2YXIgdXNlcnMgPSB7fTsNCg0KICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKSB7DQogICAgICAgICAgICAgICAgdG9rZW5zID0gbGluZXNbaV0uc3BsaXQoJyAnKTsNCiAgICAgICAgICAgICAgICBpZiAodG9rZW5zWzBdKSB7IHVzZXJzW3Rva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV1dID0gdG9rZW5zWzBdOyB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHJldHVybiAodXNlcnMpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuX2lkVGFibGUgPSBmdW5jdGlvbigpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciB0YWJsZSA9IHt9Ow0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvdXNyL2Jpbi9pZCcsIFsnaWQnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgICAgICAgICB2YXIgbGluZXMgPSBjaGlsZC5zdGRvdXQuc3RyLnNwbGl0KCdcbicpWzBdLnNwbGl0KCcgJyk7DQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKSB7DQogICAgICAgICAgICAgICAgdmFyIHR5cGVzID0gbGluZXNbaV0uc3BsaXQoJz0nKTsNCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gdHlwZXNbMV0uc3BsaXQoJywnKTsNCiAgICAgICAgICAgICAgICB0YWJsZVt0eXBlc1swXV0gPSB7fTsNCg0KICAgICAgICAgICAgICAgIGZvciAodmFyIGogaW4gdG9rZW5zKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBpZGFyciA9IHRva2Vuc1tqXS5zcGxpdCgnKCcpOw0KICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSBpZGFyclswXTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBpZGFyclsxXS5zdWJzdHJpbmcoMCwgaWRhcnJbMV0ubGVuZ3RoIC0gMSkudHJpbSgpOw0KICAgICAgICAgICAgICAgICAgICB0YWJsZVt0eXBlc1swXV1bbmFtZV0gPSBpZDsNCiAgICAgICAgICAgICAgICAgICAgdGFibGVbdHlwZXNbMF1dW2lkXSA9IG5hbWU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuICh0YWJsZSk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5DdXJyZW50ID0gZnVuY3Rpb24gKGNiKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgdXNlcnMgPSB7fTsNCiAgICAgICAgICAgIHZhciB0YWJsZSA9IHRoaXMuX2lkVGFibGUoKTsNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL3Vzci9iaW4vbGFzdCcsIFsnbGFzdCddKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xuJyk7DQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aCAmJiBsaW5lc1tpXS5sZW5ndGggPiAwOyArK2kpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKCF1c2Vyc1tsaW5lc1tpXS5zcGxpdCgnICcpWzBdXSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICB1c2Vyc1tsaW5lc1tpXS5zcGxpdCgnICcpWzBdXSA9IHsgVXNlcm5hbWU6IGxpbmVzW2ldLnNwbGl0KCcgJylbMF0sIFN0YXRlOiBsaW5lc1tpXS5zcGxpdCgnc3RpbGwgbG9nZ2VkIGluJykubGVuZ3RoID4gMSA/ICdBY3RpdmUnIDogJ0luYWN0aXZlJywgdWlkOiB0YWJsZS51aWRbbGluZXNbaV0uc3BsaXQoJyAnKVswXV0gfTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBjYXRjaChlKQ0KICAgICAgICAgICAgICAgICAgICB7fQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBpZih1c2Vyc1tsaW5lc1tpXS5zcGxpdCgnICcpWzBdXS5TdGF0ZSAhPSAnQWN0aXZlJyAmJiBsaW5lc1tpXS5zcGxpdCgnc3RpbGwgbG9nZ2VkIGluJykubGVuZ3RoID4gMSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgdXNlcnNbbGluZXNbaV0uc3BsaXQoJyAnKVswXV0uU3RhdGUgPSAnQWN0aXZlJzsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHVzZXJzLCAnQWN0aXZlJywgeyB2YWx1ZTogc2hvd0FjdGl2ZU9ubHkodXNlcnMpIH0pOw0KICAgICAgICAgICAgaWYgKGNiKSB7IGNiLmNhbGwodGhpcywgdXNlcnMpOyB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBpZihwcm9jZXNzLnBsYXRmb3JtICE9ICd3aW4zMicpIC8vIExpbnV4LCBNYWNPUywgRnJlZUJTRA0KICAgIHsNCiAgICAgICAgdGhpcy5TZWxmID0gZnVuY3Rpb24gU2VsZigpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL3Vzci9iaW4vaWQnLCBbJ2lkJywgJy11J10pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgIHJldHVybiAocGFyc2VJbnQoY2hpbGQuc3Rkb3V0LnN0cikpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuaXNSb290ID0gZnVuY3Rpb24gaXNSb290KCkNCiAgICAgICAgew0KICAgICAgICAgICAgcmV0dXJuICh0aGlzLlNlbGYoKSA9PSAwKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHRoaXMuZW51bWVyYXRlVXNlcnMgPSBmdW5jdGlvbiBlbnVtZXJhdGVVc2VycygpDQogICAgew0KICAgICAgICB2YXIgcHJvbWlzZSA9IHJlcXVpcmUoJ3Byb21pc2UnKTsNCiAgICAgICAgdmFyIHAgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAocmVzLCByZWopDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMuX19yZXNvbHZlciA9IHJlczsNCiAgICAgICAgICAgIHRoaXMuX19yZWplY3RvciA9IHJlajsNCiAgICAgICAgfSk7DQogICAgICAgIHAuX19oYW5kbGVyID0gZnVuY3Rpb24gX19oYW5kbGVyKHVzZXJzKQ0K", 16000); - memcpy_s(_usersessions + 64000, 2000, "ICAgICAgICB7DQogICAgICAgICAgICBwLl9fcmVzb2x2ZXIodXNlcnMpOw0KICAgICAgICB9Ow0KICAgICAgICB0cnkNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5DdXJyZW50KHAuX19oYW5kbGVyKTsNCiAgICAgICAgfQ0KICAgICAgICBjYXRjaCAoZSkNCiAgICAgICAgew0KICAgICAgICAgICAgcC5fX3JlamVjdG9yKGUpOw0KICAgICAgICB9DQogICAgICAgIHAucGFyZW50ID0gdGhpczsNCiAgICAgICAgcmV0dXJuIChwKTsNCiAgICB9DQoNCiAgICBpZihwcm9jZXNzLnBsYXRmb3JtID09ICdsaW51eCcpDQogICAgew0KICAgICAgICAvLyBGaXJzdCBzdGVwLCBpcyB0byBzZWUgaWYgdGhlcmUgaXMgYSB1c2VyIGxvZ2dlZCBpbjoNCiAgICAgICAgdGhpcy5fcmVjaGVja0xvZ2dlZEluVXNlcnMoKTsNCiAgICB9DQp9DQpmdW5jdGlvbiBzaG93QWN0aXZlT25seShzb3VyY2UpDQp7DQogICAgdmFyIHJldFZhbCA9IFtdOw0KICAgIHZhciB1bmlxdWUgPSB7fTsNCiAgICB2YXIgdXNlcm5hbWVzID0gW107DQogICAgdmFyIHRtcDsNCg0KICAgIGZvciAodmFyIGkgaW4gc291cmNlKQ0KICAgIHsNCiAgICAgICAgaWYgKHNvdXJjZVtpXS5TdGF0ZSA9PSAnQWN0aXZlJykNCiAgICAgICAgew0KICAgICAgICAgICAgcmV0VmFsLnB1c2goc291cmNlW2ldKTsNCiAgICAgICAgICAgIHRtcCA9IChzb3VyY2VbaV0uRG9tYWluID8gKHNvdXJjZVtpXS5Eb21haW4gKyAnXFwnKSA6ICcnKSArIHNvdXJjZVtpXS5Vc2VybmFtZTsNCiAgICAgICAgICAgIGlmICghdW5pcXVlW3RtcF0pIHsgdW5pcXVlW3RtcF0gPSB0bXA7fQ0KICAgICAgICB9DQogICAgfQ0KDQogICAgZm9yICh2YXIgaSBpbiB1bmlxdWUpDQogICAgew0KICAgICAgICB1c2VybmFtZXMucHVzaChpKTsNCiAgICB9DQoNCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0VmFsLCAndXNlcm5hbWVzJywgeyB2YWx1ZTogdXNlcm5hbWVzIH0pOw0KICAgIHJldHVybiAocmV0VmFsKTsNCn0NCmZ1bmN0aW9uIGdldFRva2VucyhzdHIpDQp7DQogICAgdmFyIGNvbHVtbnMgPSBbXTsNCiAgICB2YXIgaTsNCg0KICAgIGNvbHVtbnMucHVzaChzdHIuc3Vic3RyaW5nKDAsIChpPXN0ci5pbmRleE9mKCcgJykpKSk7DQogICAgd2hpbGUgKHN0clsrK2ldID09ICcgJyk7DQogICAgY29sdW1ucy5wdXNoKHN0ci5zdWJzdHJpbmcoaSwgKGk9c3RyLnN1YnN0cmluZyhpKS5pbmRleE9mKCcgJykgKyBpKSkpOw0KICAgIHdoaWxlIChzdHJbKytpXSA9PSAnICcpOw0KICAgIGNvbHVtbnMucHVzaChzdHIuc3Vic3RyaW5nKGksIChpPXN0ci5zdWJzdHJpbmcoaSkuaW5kZXhPZignICcpICsgaSkpKTsNCiAgICB3aGlsZSAoc3RyWysraV0gPT0gJyAnKTsNCiAgICB2YXIgc3RhdHVzID0gc3RyLnN1YnN0cmluZyhpKS50cmltKCk7DQogICAgY29sdW1ucy5wdXNoKHN0YXR1cyk7DQoNCiAgICByZXR1cm4gKGNvbHVtbnMpOw0KfQ0KDQptb2R1bGUuZXhwb3J0cyA9IG5ldyBVc2VyU2Vzc2lvbnMoKTsNCg==", 2000); - ILibBase64DecodeEx((unsigned char*)_usersessions, 66000, (unsigned char*)_usersessions + 66000); - duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "user-sessions"); duk_push_string(ctx, _usersessions + 66000); + char *_usersessions = ILibMemory_Allocate(105940, 0, NULL, NULL); + memcpy_s(_usersessions + 0, 60536, "LyoNCkNvcHlyaWdodCAyMDE4IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQp2YXIgTk9USUZZX0ZPUl9USElTX1NFU1NJT04gPSAwOw0KdmFyIE5PVElGWV9GT1JfQUxMX1NFU1NJT05TID0gMTsNCnZhciBXTV9XVFNTRVNTSU9OX0NIQU5HRSA9IDB4MDJCMTsNCnZhciBXTV9QT1dFUkJST0FEQ0FTVCA9IDB4MjE4Ow0KdmFyIFBCVF9QT1dFUlNFVFRJTkdDSEFOR0UgPSAweDgwMTM7DQp2YXIgUEJUX0FQTVNVU1BFTkQgPSAweDQ7DQp2YXIgUEJUX0FQTVJFU1VNRVNVU1BFTkQgPSAweDc7DQp2YXIgUEJUX0FQTVJFU1VNRUFVVE9NQVRJQyA9IDB4MTI7DQp2YXIgUEJUX0FQTVBPV0VSU1RBVFVTQ0hBTkdFID0gMHhBOw0KdmFyIFBST0NFU1NfUVVFUllfSU5GT1JNQVRJT04gPSAweDA0MDA7DQp2YXIgVE9LRU5fUVVFUlkgPSAweDAwMDg7DQp2YXIgVG9rZW5Vc2VyID0gMTsNCnZhciBUb2tlblR5cGUgPSA4Ow0KdmFyIFRva2VuU2Vzc2lvbklkID0gMTI7DQp2YXIgRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUiA9IDEyMjsNCnZhciBIRUFQX1pFUk9fTUVNT1JZID0gMHgwMDAwMDAwODsNCg0KdmFyIFdUU19DT05TT0xFX0NPTk5FQ1QgICAgICAgICA9ICgweDEpOw0KdmFyIFdUU19DT05TT0xFX0RJU0NPTk5FQ1QgICAgICA9ICgweDIpOw0KdmFyIFdUU19SRU1PVEVfQ09OTkVDVCAgICAgICAgICA9ICgweDMpOw0KdmFyIFdUU19SRU1PVEVfRElTQ09OTkVDVCAgICAgICA9ICgweDQpOw0KdmFyIFdUU19TRVNTSU9OX0xPR09OICAgICAgICAgICA9ICgweDUpOw0KdmFyIFdUU19TRVNTSU9OX0xPR09GRiAgICAgICAgICA9ICgweDYpOw0KdmFyIFdUU19TRVNTSU9OX0xPQ0sgICAgICAgICAgICA9ICgweDcpOw0KdmFyIFdUU19TRVNTSU9OX1VOTE9DSyAgICAgICAgICA9ICgweDgpOw0KdmFyIFdUU19TRVNTSU9OX1JFTU9URV9DT05UUk9MICA9ICgweDkpOw0KdmFyIFdUU19TRVNTSU9OX0NSRUFURSAgICAgICAgICA9ICgweEEpOw0KdmFyIFdUU19TRVNTSU9OX1RFUk1JTkFURSAgICAgICA9ICgweEIpOw0KDQp2YXIgR1VJRF9BQ0RDX1BPV0VSX1NPVVJDRTsNCnZhciBHVUlEX0JBVFRFUllfUEVSQ0VOVEFHRV9SRU1BSU5JTkc7DQp2YXIgR1VJRF9DT05TT0xFX0RJU1BMQVlfU1RBVEU7DQoNCmZ1bmN0aW9uIGNvbHVtblBhcnNlKGRhdGEsIGRlbGltaXRlcikNCnsNCiAgICB2YXIgdG9rZW5zID0gZGF0YS5zcGxpdChkZWxpbWl0ZXIpOw0KICAgIHZhciByZXQgPSBbXTsNCiAgICBmb3IodmFyIGkgaW4gdG9rZW5zKQ0KICAgIHsNCiAgICAgICAgaWYgKHRva2Vuc1tpXS5sZW5ndGggPiAwKSB7IHJldC5wdXNoKHRva2Vuc1tpXSk7IH0NCiAgICB9DQogICAgcmV0dXJuIChyZXQpOw0KfQ0KDQoNCmZ1bmN0aW9uIFVzZXJTZXNzaW9ucygpDQp7DQogICAgdGhpcy5fT2JqZWN0SUQgPSAndXNlci1zZXNzaW9ucyc7DQogICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwodGhpcywgdHJ1ZSkNCiAgICAgICAgLmNyZWF0ZUV2ZW50KCdjaGFuZ2VkJykNCiAgICAgICAgLmNyZWF0ZUV2ZW50KCdsb2NrZWQnKQ0KICAgICAgICAuY3JlYXRlRXZlbnQoJ3VubG9ja2VkJyk7DQoNCiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKQ0KICAgIHsNCiAgICAgICAgdGhpcy5fc2VydmljZUhvb2tlZCA9IGZhbHNlOw0KICAgICAgICB0aGlzLl9tYXJzaGFsID0gcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJyk7DQogICAgICAgIHRoaXMuX2tlcm5lbDMyID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVOYXRpdmVQcm94eSgnS2VybmVsMzIuZGxsJyk7DQogICAgICAgIHRoaXMuX2tlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnR2V0TGFzdEVycm9yJyk7DQogICAgICAgIHRoaXMuX2tlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnV1RTR2V0QWN0aXZlQ29uc29sZVNlc3Npb25JZCcpDQogICAgICAgIHRoaXMuX2tlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnQ2xvc2VIYW5kbGUnKTsNCg0KICAgICAgICB0cnkNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5fd3RzID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVOYXRpdmVQcm94eSgnV3RzYXBpMzIuZGxsJyk7DQogICAgICAgICAgICB0aGlzLl93dHMuQ3JlYXRlTWV0aG9kKCdXVFNFbnVtZXJhdGVTZXNzaW9uc0EnKTsNCiAgICAgICAgICAgIHRoaXMuX3d0cy5DcmVhdGVNZXRob2QoJ1dUU1F1ZXJ5U2Vzc2lvbkluZm9ybWF0aW9uVycpOw0KICAgICAgICAgICAgdGhpcy5fd3RzLkNyZWF0ZU1ldGhvZCgnV1RTUmVnaXN0ZXJTZXNzaW9uTm90aWZpY2F0aW9uJyk7DQogICAgICAgICAgICB0aGlzLl93dHMuQ3JlYXRlTWV0aG9kKCdXVFNVblJlZ2lzdGVyU2Vzc2lvbk5vdGlmaWNhdGlvbicpOw0KICAgICAgICAgICAgdGhpcy5fd3RzLkNyZWF0ZU1ldGhvZCgnV1RTRnJlZU1lbW9yeScpOw0KICAgICAgICB9DQogICAgICAgIGNhdGNoKGV4YykNCiAgICAgICAgew0KICAgICAgICB9DQoNCiAgICAgICAgdGhpcy5fYWR2YXBpID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVOYXRpdmVQcm94eSgnQWR2YXBpMzIuZGxsJyk7DQogICAgICAgIHRoaXMuX2FkdmFwaS5DcmVhdGVNZXRob2QoJ0FsbG9jYXRlQW5kSW5pdGlhbGl6ZVNpZCcpOw0KICAgICAgICB0aGlzLl9hZHZhcGkuQ3JlYXRlTWV0aG9kKCdDaGVja1Rva2VuTWVtYmVyc2hpcCcpOw0KICAgICAgICB0aGlzLl9hZHZhcGkuQ3JlYXRlTWV0aG9kKCdGcmVlU2lkJyk7DQoNCiAgICAgICAgdGhpcy5fdXNlcjMyID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVOYXRpdmVQcm94eSgndXNlcjMyLmRsbCcpOw0KICAgICAgICB0aGlzLl91c2VyMzIuQ3JlYXRlTWV0aG9kKHsgbWV0aG9kOiAnUmVnaXN0ZXJQb3dlclNldHRpbmdOb3RpZmljYXRpb24nLCB0aHJlYWREaXNwYXRjaDogMX0pOw0KICAgICAgICB0aGlzLl91c2VyMzIuQ3JlYXRlTWV0aG9kKCdVbnJlZ2lzdGVyUG93ZXJTZXR0aW5nTm90aWZpY2F0aW9uJyk7DQogICAgICAgIHRoaXMuX3JwY3J0ID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVOYXRpdmVQcm94eSgnUnBjcnQ0LmRsbCcpOw0KICAgICAgICB0aGlzLl9ycGNydC5DcmVhdGVNZXRob2QoJ1V1aWRGcm9tU3RyaW5nQScpOw0KICAgICAgICB0aGlzLl9ycGNydC5TdHJpbmdUb1VVSUQgPSBmdW5jdGlvbiBTdHJpbmdUb1VVSUQoZ3VpZCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIHJldFZhbCA9IFN0cmluZ1RvVVVJRC51cy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSgxNik7DQogICAgICAgICAgICBpZihTdHJpbmdUb1VVSUQudXMuX3JwY3J0LlV1aWRGcm9tU3RyaW5nQShTdHJpbmdUb1VVSUQudXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoZ3VpZCksIHJldFZhbCkuVmFsID09IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0dXJuIChyZXRWYWwpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRocm93ICgnQ291bGQgbm90IGNvbnZlcnQgc3RyaW5nIHRvIFVVSUQnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICB0aGlzLl9ycGNydC5TdHJpbmdUb1VVSUQudXMgPSB0aGlzOw0KDQogICAgICAgIHRyeQ0KICAgICAgICB7DQogICAgICAgICAgICB0aGlzLl9rZXJuZWwzMi5DcmVhdGVNZXRob2QoJ09wZW5Qcm9jZXNzJykNCiAgICAgICAgICAgIHRoaXMuX2FkdmFwaS5DcmVhdGVNZXRob2QoJ09wZW5Qcm9jZXNzVG9rZW4nKTsNCiAgICAgICAgICAgIHRoaXMuX2FkdmFwaS5DcmVhdGVNZXRob2QoJ0dldFRva2VuSW5mb3JtYXRpb24nKTsNCiAgICAgICAgICAgIHRoaXMuX2FkdmFwaS5DcmVhdGVNZXRob2QoJ0xvb2t1cEFjY291bnRTaWRXJyk7DQogICAgICAgICAgICB0aGlzLl9hZHZhcGkuQ3JlYXRlTWV0aG9kKCdPcGVuVGhyZWFkVG9rZW4nKTsNCiAgICAgICAgfQ0KICAgICAgICBjYXRjaChlKQ0KICAgICAgICB7DQogICAgICAgIH0NCg0KDQogICAgICAgIEdVSURfQUNEQ19QT1dFUl9TT1VSQ0UgPSB0aGlzLl9ycGNydC5TdHJpbmdUb1VVSUQoJzVkM2U5YTU5LWU5RDUtNGIwMC1hNmJkLWZmMzRmZjUxNjU0OCcpOw0KICAgICAgICBHVUlEX0JBVFRFUllfUEVSQ0VOVEFHRV9SRU1BSU5JTkcgPSB0aGlzLl9ycGNydC5TdHJpbmdUb1VVSUQoJ2E3YWQ4MDQxLWI0NWEtNGNhZS04N2EzLWVlY2JiNDY4YTllMScpOw0KICAgICAgICBHVUlEX0NPTlNPTEVfRElTUExBWV9TVEFURSA9IHRoaXMuX3JwY3J0LlN0cmluZ1RvVVVJRCgnNmZlNjk1NTYtNzA0YS00N2EwLThmMjQtYzI4ZDkzNmZkYTQ3Jyk7DQoNCiAgICAgICAgdGhpcy5TZXNzaW9uU3RhdGVzID0gWydBY3RpdmUnLCAnQ29ubmVjdGVkJywgJ0Nvbm5lY3RRdWVyeScsICdTaGFkb3cnLCAnRGlzY29ubmVjdGVkJywgJ0lkbGUnLCAnTGlzdGVuaW5nJywgJ1Jlc2V0JywgJ0Rvd24nLCAnSW5pdCddOw0KICAgICAgICB0aGlzLkluZm9DbGFzcyA9DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJ1dUU0luaXRpYWxQcm9ncmFtJzogMCwNCiAgICAgICAgICAgICAgICAnV1RTQXBwbGljYXRpb25OYW1lJzogMSwNCiAgICAgICAgICAgICAgICAnV1RTV29ya2luZ0RpcmVjdG9yeSc6IDIsDQogICAgICAgICAgICAgICAgJ1dUU09FTUlkJzogMywNCiAgICAgICAgICAgICAgICAnV1RTU2Vzc2lvbklkJzogNCwNCiAgICAgICAgICAgICAgICAnV1RTVXNlck5hbWUnOiA1LA0KICAgICAgICAgICAgICAgICdXVFNXaW5TdGF0aW9uTmFtZSc6IDYsDQogICAgICAgICAgICAgICAgJ1dUU0RvbWFpbk5hbWUnOiA3LA0KICAgICAgICAgICAgICAgICdXVFNDb25uZWN0U3RhdGUnOiA4LA0KICAgICAgICAgICAgICAgICdXVFNDbGllbnRCdWlsZE51bWJlcic6IDksDQogICAgICAgICAgICAgICAgJ1dUU0NsaWVudE5hbWUnOiAxMCwNCiAgICAgICAgICAgICAgICAnV1RTQ2xpZW50RGlyZWN0b3J5JzogMTEsDQogICAgICAgICAgICAgICAgJ1dUU0NsaWVudFByb2R1Y3RJZCc6IDEyLA0KICAgICAgICAgICAgICAgICdXVFNDbGllbnRIYXJkd2FyZUlkJzogMTMsDQogICAgICAgICAgICAgICAgJ1dUU0NsaWVudEFkZHJlc3MnOiAxNCwNCiAgICAgICAgICAgICAgICAnV1RTQ2xpZW50RGlzcGxheSc6IDE1LA0KICAgICAgICAgICAgICAgICdXVFNDbGllbnRQcm90b2NvbFR5cGUnOiAxNiwNCiAgICAgICAgICAgICAgICAnV1RTSWRsZVRpbWUnOiAxNywNCiAgICAgICAgICAgICAgICAnV1RTTG9nb25UaW1lJzogMTgsDQogICAgICAgICAgICAgICAgJ1dUU0luY29taW5nQnl0ZXMnOiAxOSwNCiAgICAgICAgICAgICAgICAnV1RTT3V0Z29pbmdCeXRlcyc6IDIwLA0KICAgICAgICAgICAgICAgICdXVFNJbmNvbWluZ0ZyYW1lcyc6IDIxLA0KICAgICAgICAgICAgICAgICdXVFNPdXRnb2luZ0ZyYW1lcyc6IDIyLA0KICAgICAgICAgICAgICAgICdXVFNDbGllbnRJbmZvJzogMjMsDQogICAgICAgICAgICAgICAgJ1dUU1Nlc3Npb25JbmZvJzogMjQsDQogICAgICAgICAgICAgICAgJ1dUU1Nlc3Npb25JbmZvRXgnOiAyNSwNCiAgICAgICAgICAgICAgICAnV1RTQ29uZmlnSW5mbyc6IDI2LA0KICAgICAgICAgICAgICAgICdXVFNWYWxpZGF0aW9uSW5mbyc6IDI3LA0KICAgICAgICAgICAgICAgICdXVFNTZXNzaW9uQWRkcmVzc1Y0JzogMjgsDQogICAgICAgICAgICAgICAgJ1dUU0lzUmVtb3RlU2Vzc2lvbic6IDI5DQogICAgICAgICAgICB9Ow0KDQogICAgICAgIHRoaXMuaXNSb290ID0gZnVuY3Rpb24gaXNSb290KCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIE5UQXV0aG9yaXR5ID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg2KTsNCiAgICAgICAgICAgIE5UQXV0aG9yaXR5LnRvQnVmZmVyKCkud3JpdGVJbnQ4KDUsIDUpOw0KDQogICAgICAgICAgICB2YXIgQWRtaW5pc3RyYXRvcnNHcm91cCA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlUG9pbnRlcigpOw0KICAgICAgICAgICAgdmFyIGFkbWluID0gZmFsc2U7DQoNCiAgICAgICAgICAgIGlmICh0aGlzLl9hZHZhcGkuQWxsb2NhdGVBbmRJbml0aWFsaXplU2lkKE5UQXV0aG9yaXR5LCAyLCAzMiwgNTQ0LCAwLCAwLCAwLCAwLCAwLCAwLCBBZG1pbmlzdHJhdG9yc0dyb3VwKS5WYWwgIT0gMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgbWVtYmVyID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVJbnRlZ2VyKCk7DQogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2FkdmFwaS5DaGVja1Rva2VuTWVtYmVyc2hpcCgwLCBBZG1pbmlzdHJhdG9yc0dyb3VwLkRlcmVmKCksIG1lbWJlcikuVmFsICE9IDApDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBpZiAobWVtYmVyLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkgIT0gMCkgeyBhZG1pbiA9IHRydWU7IH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGhpcy5fYWR2YXBpLkZyZWVTaWQoQWRtaW5pc3RyYXRvcnNHcm91cC5EZXJlZigpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBhZG1pbjsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmdldFByb2Nlc3NPd25lck5hbWUgPSBmdW5jdGlvbiBnZXRQcm9jZXNzT3duZXJOYW1lKHBpZCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIHJldCA9IG51bGw7DQogICAgICAgICAgICB2YXIgbmFtZSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoMTAyNCk7DQogICAgICAgICAgICB2YXIgZG9tYWluID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSgxMDI0KTsNCiAgICAgICAgICAgIHZhciBuYW1lRG9tYWluTGVuZ3RoID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsgbmFtZURvbWFpbkxlbmd0aC50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoMTAyNCk7DQogICAgICAgICAgICB2YXIgYnVmZmVyTGVuZ3RoID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsNCiAgICAgICAgICAgIHZhciBzaWR0eXBlID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsNCiAgICAgICAgICAgIHZhciB0b2tlbnVzZXIgPSAwOw0KICAgICAgICAgICAgdmFyIHRva2VuID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVQb2ludGVyKCk7DQoNCiAgICAgICAgICAgIHZhciBoID0gdGhpcy5fa2VybmVsMzIuT3BlblByb2Nlc3MoUFJPQ0VTU19RVUVSWV9JTkZPUk1BVElPTiwgMSwgcGlkKTsNCiAgICAgICAgICAgIGlmIChoLlZhbCA9PSAwKSB7IHRocm93ICgnRmFpbGVkIHRvIHF1ZXJ5IHByb2Nlc3MgaWQ6ICcgKyBwaWQpOyB9DQoNCiAgICAgICAgICAgIGlmKHRoaXMuX2FkdmFwaS5PcGVuUHJvY2Vzc1Rva2VuKGgsIFRPS0VOX1FVRVJZLCB0b2tlbikuVmFsPT0wKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMuX2tlcm5lbDMyLkNsb3NlSGFuZGxlKGgpOw0KICAgICAgICAgICAgICAgIHRocm93ICgnRmFpbGVkIHRvIFF1ZXJ5IFByb2Nlc3MgVG9rZW4gZm9yIHBpZDogJyArIHBpZCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciB0c2lkID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsNCiAgICAgICAgICAgIHRoaXMuX2FkdmFwaS5HZXRUb2tlbkluZm9ybWF0aW9uKHRva2VuLkRlcmVmKCksIFRva2VuU2Vzc2lvbklkLCB0c2lkLCA0LCBidWZmZXJMZW5ndGgpOw0KICAgICAgICAgICAgdGhpcy5fYWR2YXBpLkdldFRva2VuSW5mb3JtYXRpb24odG9rZW4uRGVyZWYoKSwgVG9rZW5Vc2VyLCB0b2tlbnVzZXIsIDAsIGJ1ZmZlckxlbmd0aCk7DQogICAgICAgICAgICB0b2tlbnVzZXIgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKGJ1ZmZlckxlbmd0aC50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpKTsNCg0KICAgICAgICAgICAgaWYgKHRoaXMuX2FkdmFwaS5HZXRUb2tlbkluZm9ybWF0aW9uKHRva2VuLkRlcmVmKCksIFRva2VuVXNlciwgdG9rZW51c2VyLCBidWZmZXJMZW5ndGgudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKSwgYnVmZmVyTGVuZ3RoKS5WYWwgPT0gMCkgeyB0aHJvdyAoJ0ludGVybmFsIEVycm9yJyk7IH0NCiAgICAgICAgICAgIGlmKHRoaXMuX2FkdmFwaS5Mb29rdXBBY2NvdW50U2lkVygwLCB0b2tlbnVzZXIuRGVyZWYoKSwgbmFtZSwgbmFtZURvbWFpbkxlbmd0aCwgZG9tYWluLCBuYW1lRG9tYWluTGVuZ3RoLCBzaWR0eXBlKS5WYWwgPT0gMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aHJvdyAoJ0xvb2t1cCBFcnJvcicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIG5hbWUuX3NpemUgPSAwOyBkb21haW4uX3NpemUgPSAwOw0KICAgICAgICAgICAgICAgIHJldCA9IHsgbmFtZTogbmFtZS5XaWRlMlVURjgsIGRvbWFpbjogZG9tYWluLldpZGUyVVRGOCwgdHNpZDogdHNpZC50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpIH07DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHRoaXMuX2tlcm5lbDMyLkNsb3NlSGFuZGxlKHRva2VuLkRlcmVmKCkpOw0KICAgICAgICAgICAgdGhpcy5fa2VybmVsMzIuQ2xvc2VIYW5kbGUoaCk7DQogICAgICAgICAgICByZXR1cm4gKHJldCk7DQogICAgICAgIH07DQoNCiAgICAgICAgdGhpcy5nZXRSYXdTZXNzaW9uQXR0cmlidXRlID0gZnVuY3Rpb24gZ2V0UmF3U2Vzc2lvbkF0dHJpYnV0ZShzZXNzaW9uSWQsIGF0dHIpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBidWZmZXIgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoKTsNCiAgICAgICAgICAgIHZhciBieXRlc1JldHVybmVkID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsNCg0KICAgICAgICAgICAgaWYgKHRoaXMuX3d0cy5XVFNRdWVyeVNlc3Npb25JbmZvcm1hdGlvblcoMCwgc2Vzc2lvbklkLCBhdHRyLCBidWZmZXIsIGJ5dGVzUmV0dXJuZWQpLlZhbCA9PSAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRocm93ICgnRXJyb3IgY2FsbGluZyBXVFNRdWVyeVNlc3Npb25JbmZvcm1hdGlvblc6ICcgKyB0aGlzLl9rZXJuZWwzMi5HZXRMYXN0RXJyb3IuVmFsKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdmFyIGIgPSBidWZmZXIuRGVyZWYoKS5EZXJlZigwLCBieXRlc1JldHVybmVkLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpLnRvQnVmZmVyKCk7DQogICAgICAgICAgICB2YXIgcmV0ID0gQnVmZmVyLmFsbG9jKGJ5dGVzUmV0dXJuZWQudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKSk7DQogICAgICAgICAgICBiLmNvcHkocmV0KTsNCiAgICAgICAgICAgIHRoaXMuX3d0cy5XVFNGcmVlTWVtb3J5KGJ1ZmZlci5EZXJlZigpKTsNCiAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmdldFNlc3Npb25BdHRyaWJ1dGUgPSBmdW5jdGlvbiBnZXRTZXNzaW9uQXR0cmlidXRlKHNlc3Npb25JZCwgYXR0cikNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlUG9pbnRlcigpOw0KICAgICAgICAgICAgdmFyIGJ5dGVzUmV0dXJuZWQgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOw0KDQogICAgICAgICAgICBpZiAodGhpcy5fd3RzLldUU1F1ZXJ5U2Vzc2lvbkluZm9ybWF0aW9uVygwLCBzZXNzaW9uSWQsIGF0dHIsIGJ1ZmZlciwgYnl0ZXNSZXR1cm5lZCkuVmFsID09IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhyb3cgKCdFcnJvciBjYWxsaW5nIFdUU1F1ZXJ5U2Vzc2lvbkluZm9ybWF0aW9uVzogJyArIHRoaXMuX2tlcm5lbDMyLkdldExhc3RFcnJvci5WYWwpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgcmV0VmFsID0gYnVmZmVyLkRlcmVmKCkuV2lkZTJVVEY4Ow0KDQogICAgICAgICAgICB0aGlzLl93dHMuV1RTRnJlZU1lbW9yeShidWZmZXIuRGVyZWYoKSk7DQogICAgICAgICAgICByZXR1cm4gKHJldFZhbCk7DQogICAgICAgIH07DQogICAgICAgIHRoaXMuY29uc29sZVVpZCA9IGZ1bmN0aW9uIGNvbnNvbGVVaWQoKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgaWQgPSB0aGlzLl9rZXJuZWwzMi5XVFNHZXRBY3RpdmVDb25zb2xlU2Vzc2lvbklkKCkuVmFsOw0KICAgICAgICAgICAgaWYoaWQ9PTB4RkZGRkZGRkYpIHt0aHJvdygnTm9ib2R5IGxvZ2dlZCBpbicpO30NCiAgICAgICAgICAgIHJldHVybiAoaWQpOw0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLmdldFVzZXJuYW1lID0gZnVuY3Rpb24gZ2V0VXNlcm5hbWUodWlkKQ0KICAgICAgICB7DQogICAgICAgICAgICByZXR1cm4gKHRoaXMuZ2V0U2Vzc2lvbkF0dHJpYnV0ZSh1aWQsIHRoaXMuSW5mb0NsYXNzLldUU1VzZXJOYW1lKSk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5DdXJyZW50ID0gZnVuY3Rpb24gQ3VycmVudChjYikNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIHJldFZhbCA9IHt9Ow0KICAgICAgICAgICAgdmFyIHBpbmZvID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVQb2ludGVyKCk7DQogICAgICAgICAgICB2YXIgY291bnQgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOw0KICAgICAgICAgICAgaWYgKHRoaXMuX3d0cy5XVFNFbnVtZXJhdGVTZXNzaW9uc0EoMCwgMCwgMSwgcGluZm8sIGNvdW50KS5WYWwgPT0gMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aHJvdyAoJ0Vycm9yIGNhbGxpbmcgV1RTRW51bWVyYXRlU2Vzc2lvbnNBOiAnICsgdGhpcy5fa2VybmVsMzIuR2V0TGFzdEVycm9yKCkuVmFsKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudC50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpIDsgKytpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciBpbmZvID0gcGluZm8uRGVyZWYoKS5EZXJlZihpICogKHRoaXMuX21hcnNoYWwuUG9pbnRlclNpemUgPT0gNCA/IDEyIDogMjQpLCB0aGlzLl9tYXJzaGFsLlBvaW50ZXJTaXplID09IDQgPyAxMiA6IDI0KTsNCiAgICAgICAgICAgICAgICB2YXIgaiA9IHsgU2Vzc2lvbklkOiBpbmZvLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkgfTsNCiAgICAgICAgICAgICAgICBqLlN0YXRpb25OYW1lID0gaW5mby5EZXJlZih0aGlzLl9tYXJzaGFsLlBvaW50ZXJTaXplID09IDQgPyA0IDogOCwgdGhpcy5fbWFyc2hhbC5Qb2ludGVyU2l6ZSkuRGVyZWYoKS5TdHJpbmc7DQogICAgICAgICAgICAgICAgai5TdGF0ZSA9IHRoaXMuU2Vzc2lvblN0YXRlc1tpbmZvLkRlcmVmKHRoaXMuX21hcnNoYWwuUG9pbnRlclNpemUgPT0gNCA/IDggOiAxNiwgNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKV07DQogICAgICAgICAgICAgICAgaWYgKGouU3RhdGUgPT0gJ0FjdGl2ZScpIHsNCiAgICAgICAgICAgICAgICAgICAgai5Vc2VybmFtZSA9IHRoaXMuZ2V0U2Vzc2lvbkF0dHJpYnV0ZShqLlNlc3Npb25JZCwgdGhpcy5JbmZvQ2xhc3MuV1RTVXNlck5hbWUpOw0KICAgICAgICAgICAgICAgICAgICBqLkRv", 16000); + memcpy_s(_usersessions + 16000, 44536, "bWFpbiA9IHRoaXMuZ2V0U2Vzc2lvbkF0dHJpYnV0ZShqLlNlc3Npb25JZCwgdGhpcy5JbmZvQ2xhc3MuV1RTRG9tYWluTmFtZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJldFZhbFtqLlNlc3Npb25JZF0gPSBqOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB0aGlzLl93dHMuV1RTRnJlZU1lbW9yeShwaW5mby5EZXJlZigpKTsNCg0KICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldFZhbCwgJ0FjdGl2ZScsIHsgdmFsdWU6IHNob3dBY3RpdmVPbmx5KHJldFZhbCkgfSk7DQogICAgICAgICAgICBpZiAoY2IpIHsgY2IocmV0VmFsKTsgfQ0KICAgICAgICAgICAgcmV0dXJuIChyZXRWYWwpOw0KICAgICAgICB9Ow0KDQogICAgICAgIGlmICghZ2xvYmFsLl9ub01lc3NhZ2VQdW1wKQ0KICAgICAgICB7DQogICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHNwaW4gdXAgYSBtZXNzYWdlIHB1bXAsIGFuZCBmZXRjaCBhIHdpbmRvdyBoYW5kbGUNCiAgICAgICAgICAgIHZhciBtZXNzYWdlX3B1bXAgPSByZXF1aXJlKCd3aW4tbWVzc2FnZS1wdW1wJyk7DQogICAgICAgICAgICB0aGlzLl9tZXNzYWdlcHVtcCA9IG5ldyBtZXNzYWdlX3B1bXAoeyBmaWx0ZXI6IFdNX1dUU1NFU1NJT05fQ0hBTkdFIH0pOyB0aGlzLl9tZXNzYWdlcHVtcC5wYXJlbnQgPSB0aGlzOw0KICAgICAgICAgICAgdGhpcy5fbWVzc2FnZXB1bXAub24oJ2V4aXQnLCBmdW5jdGlvbiAoY29kZSkgeyB0aGlzLnBhcmVudC5fd3RzLldUU1VuUmVnaXN0ZXJTZXNzaW9uTm90aWZpY2F0aW9uKHRoaXMucGFyZW50Lmh3bmQpOyB9KTsNCiAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VwdW1wLm9uKCdod25kJywgZnVuY3Rpb24gKGgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuaHduZCA9IGg7DQoNCiAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHlpZWxkLCBhbmQgZG8gdGhpcyBpbiB0aGUgbmV4dCBldmVudCBsb29wIHBhc3MsIGJlY3Vhc2Ugd2UgZG9uJ3Qgd2FudCB0byBjYWxsICdSZWdpc3RlclBvd2VyU2V0dGluZ05vdGlmaWNhdGlvbicNCiAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBtZXNzYWdlcHVtcCAndGhyZWFkJywgYmVjYXVzZSB3ZSBhcmUgYWN0dWFsbHkgb24gdGhlIG1pY3Jvc3RhY2sgdGhyZWFkLCBzdWNoIHRoYXQgdGhlIG1lc3NhZ2UgcHVtcCB0aHJlYWQsIGlzIGhvbGRpbmcNCiAgICAgICAgICAgICAgICAvLyBvbiBhIHNlbWFwaG9yZSBmb3IgdXMgdG8gcmV0dXJuLiBJZiB3ZSBjYWxsIG5vdywgd2UgbWF5IGRlYWRsb2NrIG9uIFdpbmRvd3MgNywgYmVjdWFzZSBpdCB3aWxsIHRyeSB0byBub3RpZnkgaW1tZWRpYXRlbHkNCiAgICAgICAgICAgICAgICB0aGlzLmltbWVkaWF0ZSA9IHNldEltbWVkaWF0ZShmdW5jdGlvbiAoc2VsZikNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSB3aW5kb3cgaGFuZGxlLCB3ZSBjYW4gcmVnaXN0ZXIgaXQgdG8gcmVjZWl2ZSBXaW5kb3dzIE1lc3NhZ2VzDQogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnBhcmVudC5fd3RzKSB7IHNlbGYucGFyZW50Ll93dHMuV1RTUmVnaXN0ZXJTZXNzaW9uTm90aWZpY2F0aW9uKHNlbGYucGFyZW50Lmh3bmQsIE5PVElGWV9GT1JfQUxMX1NFU1NJT05TKTsgfQ0KICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5fdXNlcjMyLkFDRENfSCA9IHNlbGYucGFyZW50Ll91c2VyMzIuUmVnaXN0ZXJQb3dlclNldHRpbmdOb3RpZmljYXRpb24oc2VsZi5wYXJlbnQuaHduZCwgR1VJRF9BQ0RDX1BPV0VSX1NPVVJDRSwgMCk7DQogICAgICAgICAgICAgICAgICAgIHNlbGYucGFyZW50Ll91c2VyMzIuQkFUVF9IID0gc2VsZi5wYXJlbnQuX3VzZXIzMi5SZWdpc3RlclBvd2VyU2V0dGluZ05vdGlmaWNhdGlvbihzZWxmLnBhcmVudC5od25kLCBHVUlEX0JBVFRFUllfUEVSQ0VOVEFHRV9SRU1BSU5JTkcsIDApOw0KICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5fdXNlcjMyLkRJU1BfSCA9IHNlbGYucGFyZW50Ll91c2VyMzIuUmVnaXN0ZXJQb3dlclNldHRpbmdOb3RpZmljYXRpb24oc2VsZi5wYXJlbnQuaHduZCwgR1VJRF9DT05TT0xFX0RJU1BMQVlfU1RBVEUsIDApOw0KICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHNlbGYucGFyZW50Ll91c2VyMzIuQUNEQ19ILlZhbCwgc2VsZi5wYXJlbnQuX3VzZXIzMi5CQVRUX0guVmFsLCBzZWxmLnBhcmVudC5fdXNlcjMyLkRJU1BfSC5WYWwpOw0KICAgICAgICAgICAgICAgIH0sIHRoaXMpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB0aGlzLl9tZXNzYWdlcHVtcC5vbignbWVzc2FnZScsIGZ1bmN0aW9uIChtc2cpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgc3dpdGNoIChtc2cubWVzc2FnZSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgV01fV1RTU0VTU0lPTl9DSEFOR0U6DQogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZy53cGFyYW0pDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXVFNfU0VTU0lPTl9MT0NLOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5lbnVtZXJhdGVVc2VycygpLnRoZW4oZnVuY3Rpb24gKHVzZXJzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlcnNbbXNnLmxwYXJhbV0pIHsgdGhpcy5wYXJlbnQuZW1pdCgnbG9ja2VkJywgdXNlcnNbbXNnLmxwYXJhbV0pOyB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdUU19TRVNTSU9OX1VOTE9DSzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuZW51bWVyYXRlVXNlcnMoKS50aGVuKGZ1bmN0aW9uICh1c2VycykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZXJzW21zZy5scGFyYW1dKSB7IHRoaXMucGFyZW50LmVtaXQoJ3VubG9ja2VkJywgdXNlcnNbbXNnLmxwYXJhbV0pOyB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdUU19TRVNTSU9OX0xPR09OOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV1RTX1NFU1NJT05fTE9HT0ZGOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5lbWl0KCdjaGFuZ2VkJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgV01fUE9XRVJCUk9BRENBU1Q6DQogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZy53cGFyYW0pDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1dNX1BPV0VSQlJPQURDQVNUIFtVTktOT1dOIHdwYXJhbV06ICcgKyBtc2cud3BhcmFtKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQQlRfQVBNU1VTUEVORDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgncG93ZXItbW9uaXRvcicpLmVtaXQoJ3N4JywgJ1NMRUVQJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUEJUX0FQTVJFU1VNRUFVVE9NQVRJQzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgncG93ZXItbW9uaXRvcicpLmVtaXQoJ3N4JywgJ1JFU1VNRV9OT05fSU5URVJBQ1RJVkUnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQQlRfQVBNUkVTVU1FU1VTUEVORDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgncG93ZXItbW9uaXRvcicpLmVtaXQoJ3N4JywgJ1JFU1VNRV9JTlRFUkFDVElWRScpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBCVF9BUE1QT1dFUlNUQVRVU0NIQU5HRToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgncG93ZXItbW9uaXRvcicpLmVtaXQoJ2NoYW5nZWQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQQlRfUE9XRVJTRVRUSU5HQ0hBTkdFOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbHBhcmFtID0gdGhpcy5wYXJlbnQuX21hcnNoYWwuQ3JlYXRlUG9pbnRlcihCdWZmZXIuZnJvbShtc2cubHBhcmFtX2hleCwgJ2hleCcpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBscGFyYW0uRGVyZWYoMjAsIGxwYXJhbS5EZXJlZigxNiwgNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoMCkpLnRvQnVmZmVyKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobHBhcmFtLkRlcmVmKDAsIDE2KS50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBHVUlEX0FDRENfUE9XRVJfU09VUkNFLkRlcmVmKDAsIDE2KS50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGRhdGEucmVhZFVJbnQzMkxFKDApKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgncG93ZXItbW9uaXRvcicpLmVtaXQoJ2FjZGMnLCAnQUMnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnYWNkYycsICdCQVRURVJZJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgncG93ZXItbW9uaXRvcicpLmVtaXQoJ2FjZGMnLCAnSE9UJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEdVSURfQkFUVEVSWV9QRVJDRU5UQUdFX1JFTUFJTklORy5EZXJlZigwLCAxNikudG9CdWZmZXIoKS50b1N0cmluZygnaGV4Jyk6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgncG93ZXItbW9uaXRvcicpLmVtaXQoJ2JhdHRlcnlMZXZlbCcsIGRhdGEucmVhZFVJbnQzMkxFKDApKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgR1VJRF9DT05TT0xFX0RJU1BMQVlfU1RBVEUuRGVyZWYoMCwgMTYpLnRvQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGF0YS5yZWFkVUludDMyTEUoMCkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnZGlzcGxheScsICdPRkYnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnZGlzcGxheScsICdPTicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ3Bvd2VyLW1vbml0b3InKS5lbWl0KCdkaXNwbGF5JywgJ0RJTU1FRCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBlbHNlIGlmKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JyB8fCBwcm9jZXNzLnBsYXRmb3JtID09ICdmcmVlYnNkJykNCiAgICB7DQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiZ2RtVWlkIiwgew0KICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciByZXQgPSBudWxsOw0KICAgICAgICAgICAgICAgIHZhciBtaW4gPSB0aGlzLm1pblVpZCgpOw0KICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnZ2V0ZW50IHBhc3N3ZCB8IGdyZXAgIkdub21lIERpc3BsYXkgTWFuYWdlciIgfCAnICsgInRyICdcXG4nICdgJyB8IGF3ayAtRjogJ3sgcHJpbnQgJDMgfSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgaWYgKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpICE9ICcnICYmIChyZXQgPSBwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkpIDwgbWluKSB7IHJldHVybiAocGFyc2VJbnQoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpKTsgfQ0KDQogICAgICAgICAgICAgICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IGNvbnNvbGUubG9nKGMudG9TdHJpbmcoKSk7IH0pOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdnZXRlbnQgcGFzc3dkIHwgZ3JlcCBnZG0gfCAnICsgInRyICdcXG4nICdgJyB8IGF3ayAtRidgJyAnIiArICd7IGZvcihpPTE7aTxORjsrK2kpIHsgc3BsaXQoJGksIGYsICI6Iik7IGlmKGZbM10rMDwnICsgbWluICsgJyswKSB7IHByaW50IGZbM107IGJyZWFrOyB9IH0gfScgKyAiJ1xuZXhpdFxuIik7DQogICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICBpZiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgIT0gJycgJiYgKHJldCA9IHBhcnNlSW50KGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKSkgPCBtaW4pIHsgcmV0dXJuIChwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkpOyB9DQoNCiAgICAgICAgICAgICAgICByZXR1cm4gKDApOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICAgICAgdGhpcy5nZXRVaWQgPSBmdW5jdGlvbiBnZXRVaWQodXNlcm5hbWUpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiZ2V0ZW50IHBhc3N3ZCBcIiIgKyB1c2VybmFtZSArICJcIiB8IGF3ayAtRjogJ3twcmludCAkM30nXG5leGl0XG4iKTsNCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICAgICAgICAgIHZhciByZXQgPSBwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyKTsNCiAgICAgICAgICAgIGlmIChyZXQgPj0gMCkgeyByZXR1cm4gKHJldCk7IH0NCiAgICAgICAgICAgIHRocm93ICgndXNlcm5hbWU6ICcgKyB1c2VybmFtZSArICcgTk9UIEZPVU5EJyk7DQogICAgICAgIH07DQogICAgICAgIA0KICAgICAgICB0aGlzLkN1cnJlbnQgPSBmdW5jdGlvbiBDdXJyZW50KGNiKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJ3aG8gfCB0ciAnXFxuJyAnYCcgfCBhd2sgLUYnYCcgJyIgKyAneyBwcmludGYgInsiOyBmb3IoYT0xO2E8TkY7KythKSB7IG49c3BsaXQoJGEsIHRvaywgIiAiKTsgcHJpbnRmICIlc1xcIiVzXFwiOiBcXCIlc1xcIiIsIChhPjE/IiwiOiIiKSwgdG9rWzJdLCB0b2tbMV07ICB9IHByaW50ZiAifSI7ICB9XCdcbmV4aXRcbicpOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgICAgICAgICAgdmFyIHJldCA9IHt9Ow0KDQogICAgICAgICAgICB0cnkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXQgPSBKU09OLnBhcnNlKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsNCiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gcmV0KQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0W2tleV0gPSB7IFVzZXJuYW1lOiByZXRba2V5XSwgU2Vzc2lvbklkOiBrZXksIFN0YXRlOiAnQWN0aXZlJywgdWlkOiB0aGlzLmdldFVpZChyZXRba2V5XSkgfTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXRjaChlKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0LCAnQWN0aXZlJywgeyB2YWx1ZTogc2hvd0FjdGl2ZU9ubHkocmV0KSB9KTsNCg0KICAgICAgICAgICAgaWYgKGNiKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGNiLmNhbGwodGhpcywgcmV0KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdsaW51eCcpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBkYnVzID0gcmVxdWlyZSgnbGludXgtZGJ1cycpOw0KICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykud2F0Y2gpIHsNCiAgICAgICAgICAgICAgICB0aGlzLl9saW51eFdhdGNoZXIgPSByZXF1aXJlKCdmcycpLndhdGNoKCcvdmFyL3J1bi91dG1wJyk7DQogICAgICAgICAgICAgICAgdGhpcy5fbGludXhXYXRjaGVyLnVzZXJfc2Vzc2lvbiA9IHRoaXM7DQogICAgICAgICAgICAgICAgdGhpcy5fbGludXhXYXRjaGVyLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoYSwgYikNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMudXNlcl9zZXNzaW9uLmVtaXQoJ2NoYW5nZWQnKTsNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgdGhpcy5nZXRVaWRDb25maWcgPSBmdW5jdGlvbiBnZXRVaWRDb25maWcoKSB7DQogICAgICAgICAgICAgICAgdmFyIHJldCA9IHt9Ow0KICAgICAgICAgICAgICAgIHZhciBjZmcgPSByZXF1aXJlKCdmcycpLnJlYWRGaWxlU3luYygnL2V0Yy9sb2dpbi5kZWZzJykudG9TdHJpbmcoKS5zcGxpdCgnXG4nKTsNCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5zOw0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gY2ZnKSB7DQogICAgICAgICAgICAgICAgICAgIHRva2VucyA9IGNvbHVtblBhcnNlKGNmZ1tpXSwgJ1x0Jyk7IC8vY29uc29sZS5sb2codG9rZW5zKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2Vuc1swXSA9PSAnVUlEX01JTicpIHsgcmV0Lk1JTiA9IHBhcnNlSW50KHRva2Vuc1sxXSk7IH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2Vuc1swXSA9PSAnVUlEX01BWCcpIHsgcmV0Lk1BWCA9IHBhcnNlSW50KHRva2Vuc1sxXSk7IH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKHJldC5NSU4gIT0gbnVsbCAmJiByZXQuTUFYICE9IG51bGwpIHsgYnJlYWs7IH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgICAgICAgICAgfTsNCiAgICAgICAgfQ0KDQogICAgICAgIHRoaXMubWluVWlkID0gIGZ1bmN0aW9uIG1pblVpZCgpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3Mn", 16000); + memcpy_s(_usersessions + 32000, 28536, "KS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAvZXRjL2xvZ2luLmRlZnMgfCBncmVwIFVJRF8gfCBhd2sgJ3sgaWYoJDE9PVwiVUlEX01JTlwiKSB7IHByaW50ICQyOyB9IH0nXG5leGl0XG4iKTsNCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICByZXR1cm4gKHBhcnNlSW50KGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKSA+PSAwID8gcGFyc2VJbnQoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpIDogNTAwKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLl91c2VycyA9IGZ1bmN0aW9uIF91c2VycygpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiZ2V0ZW50IHBhc3N3ZCB8IGF3ayAtRjogJ3sgaWYoJDM+PTApIHsgcHJpbnRmIFwiJXM6JXNcXG5cIiwgJDEsICQzOyB9IH0nXG5leGl0XG4iKTsNCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xuJyk7DQogICAgICAgICAgICB2YXIgcmV0ID0ge30sIHRva2VuczsNCiAgICAgICAgICAgIGZvciAodmFyIGxuIGluIGxpbmVzKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VucyA9IGxpbmVzW2xuXS5zcGxpdCgnOicpOw0KICAgICAgICAgICAgICAgIGlmICh0b2tlbnNbMF0pIHsgcmV0W3Rva2Vuc1swXV0gPSB0b2tlbnNbMV07IH0gICAgICAgICAgIA0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuX3VpZHMgPSBmdW5jdGlvbiBfdWlkcygpIHsNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiZ2V0ZW50IHBhc3N3ZCB8IGF3ayAtRjogJ3sgaWYoJDM+PTApIHsgcHJpbnRmIFwiJXM6JXNcXG5cIiwgJDEsICQzOyB9IH0nXG5leGl0XG4iKTsNCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xuJyk7DQogICAgICAgICAgICB2YXIgcmV0ID0ge30sIHRva2VuczsNCiAgICAgICAgICAgIGZvciAodmFyIGxuIGluIGxpbmVzKSB7DQogICAgICAgICAgICAgICAgdG9rZW5zID0gbGluZXNbbG5dLnNwbGl0KCc6Jyk7DQogICAgICAgICAgICAgICAgaWYgKHRva2Vuc1swXSkgeyByZXRbdG9rZW5zWzFdXSA9IHRva2Vuc1swXTsgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMubG9naW5VaWRzID0gZnVuY3Rpb24gbG9naW5VaWRzKCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIG1pbiA9IHRoaXMubWluVWlkKCk7DQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdnZXRlbnQgcGFzc3dkIHwgYXdrIC1GOiBcJ3sgaWYoJDMgPj0gJyArIG1pbiArICcpIHsgYT1zcGxpdCgkNyxiLCIvIik7IGlmKGJbYV0hPSJub2xvZ2luIikgeyBwcmludCAkMzsgfSB9fVwnIHwgdHIgIlxcbiIgIlxcLCIgfCBhd2sgXCd7IHByaW50ZiAiWyVzXSIsICQwOyB9XCdcbmV4aXRcbicpOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgIHJldHVybiAoSlNPTi5wYXJzZShjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKS5yZXBsYWNlKCcsXScsJ10nKSkpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuY29uc29sZVVpZCA9IGZ1bmN0aW9uIGNvbnNvbGVVaWQoKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJ3aG8gfCB0ciAnXFxuJyAnXGAnIHwgYXdrICd7IHByaW50ICQxIH0nXG5leGl0XG4iKTsNCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICAgICAgICAgIGlmIChjaGlsZC5zdGRlcnIuc3RyICE9ICcnKSB7IHJldHVybiAoMCk7IH0NCiAgICAgICAgICAgIGlmIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSAhPSAnJykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0cnkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5nZXRVaWQoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy8gQmVmb3JlIHdlIHNheSBub2JvZHkgaXMgbG9nZ2VkIG9uLCBsZXQncyBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYSBHRE0gc2Vzc2lvbg0KICAgICAgICAgICAgdmFyIGdkbSA9IHRoaXMuZ2RtVWlkOw0KICAgICAgICAgICAgdmFyIGluZm8gPSByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5nZXRYSW5mbyhnZG0pOw0KICAgICAgICAgICAgaWYgKGluZm8gPT0gbnVsbCB8fCAhaW5mby54YXV0aG9yaXR5IHx8ICFpbmZvLmRpc3BsYXkpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhyb3cgKCdub2JvZHkgbG9nZ2VkIGludG8gY29uc29sZScpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJldHVybiAoZ2RtKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgdGhpcy5nZXRIb21lRm9sZGVyID0gZnVuY3Rpb24gZ2V0SG9tZUZvbGRlcihpZCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJnZXRlbnQgcGFzc3dkICIgKyBpZCArICIgfCBhd2sgLUY6ICd7cHJpbnQgJDZ9J1xuZXhpdFxuIik7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7DQogICAgICAgIH0NCg0KICAgICAgICB0aGlzLmdldFVzZXJuYW1lID0gZnVuY3Rpb24gZ2V0VXNlcm5hbWUodWlkKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImdldGVudCBwYXNzd2QgIiArIHVpZCArICIgfCBhd2sgLUY6ICd7cHJpbnQgJDF9J1xuZXhpdFxuIik7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgaWYgKGNoaWxkLnN0ZG91dC5zdHIubGVuZ3RoID4gMCkgeyByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsgfQ0KICAgICAgICAgICAgdGhyb3cgKCd1aWQ6ICcgKyB1aWQgKyAnIE5PVCBGT1VORCcpOw0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLmdldEdyb3VwbmFtZSA9IGZ1bmN0aW9uIGdldEdyb3VwbmFtZShnaWQpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiZ2V0ZW50IGdyb3VwICIgKyBnaWQgKyAiIHwgYXdrIC1GOiAne3ByaW50ICQxfSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgIGlmIChjaGlsZC5zdGRvdXQuc3RyLmxlbmd0aCA+IDApIHsgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7IH0NCiAgICAgICAgICAgIHRocm93ICgnZ2lkOiAnICsgZ2lkICsgJyBOT1QgRk9VTkQnKTsNCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy53aG9hbWkgPSBmdW5jdGlvbiB3aG9hbWkoKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoIndob2FtaVxuZXhpdFxuIik7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7DQogICAgICAgIH07DQogICAgICAgIHRoaXMuZ2V0UGlkcyA9IGZ1bmN0aW9uIGdldFBpZHMob3B0aW9ucykNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGdyZXAgPSAnJzsNCiAgICAgICAgICAgIHN3aXRjaCh0eXBlb2Yob3B0aW9ucykpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgKCdJbnZhbGlkIHR5cGUgc3BlY2lmaWVkOiAnICsgdHlwZW9mIChvcHRpb25zKSk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ251bWJlcic6DQogICAgICAgICAgICAgICAgICAgIGdyZXAgPSAnIHwgZ3JlcCAiJyArIHRoaXMuZ2V0VXNlcm5hbWUob3B0aW9ucykgKyAnIic7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6DQogICAgICAgICAgICAgICAgICAgIGdyZXAgPSAnIHwgZ3JlcCAiJyArIG9wdGlvbnMgKyAnIic7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ29iamVjdCc6DQogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnVzZXJuYW1lKSB7IGdyZXAgPSAnIHwgZ3JlcCAiJyArIG9wdGlvbnMudXNlcm5hbWUgKyAnIic7IH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9ucy51aWQgIT0gbnVsbCkgeyBncmVwID0gJyB8IGdyZXAgIicgKyB0aGlzLmdldFVzZXJuYW1lKG9wdGlvbnMudWlkKSArICciJzsgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5ncmVwKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBncmVwICs9ICgnIHwgZ3JlcCAiJyArIG9wdGlvbnMuZ3JlcCArICciJyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uKGMpe3RoaXMuc3RyICs9IGMudG9TdHJpbmcoKTt9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24oYyl7dGhpcy5zdHIgKz0gYy50b1N0cmluZygpO30pOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3BzIC1lIC1vIHBpZCAtbyB1c2VyIC1vIGNtZCAnICsgZ3JlcCArICcgfCcgKyAiIHRyICdcbicgJ2AnIHwgYXdrIC1GJ2AnICd7ICIgKyAncHJpbnRmICJbIjsgZm9yKGk9MTtpPE5GOysraSkgeyBzcGxpdCgkaSwgdG9rLCAiICIpOyBwcmludGYgIiVzJXMiLChpIT0xPyIsIjoiIiksIHRva1sxXTsgIH0gcHJpbnRmICJdIjsgfVwnXG5leGl0XG4nKTsNCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJldHVybiAoSlNPTi5wYXJzZShjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2F0Y2goZWUpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0dXJuKFtdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy5maW5kRW52RW50cnkgPSBmdW5jdGlvbiBmaW5kRW52RW50cnkob3B0aW9ucykNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGJyb2tlID0gZmFsc2U7DQogICAgICAgICAgICB2YXIgcmV0ID0ge307DQogICAgICAgICAgICB2YXIgcGlkcyA9IHRoaXMuZ2V0UGlkcyhvcHRpb25zKTsNCg0KICAgICAgICAgICAgdmFyIHZhbHM7DQogICAgICAgICAgICB2YXIgajsNCiAgICAgICAgICAgIGZvcih2YXIgaSBpbiBwaWRzKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGJyb2tlID0gZmFsc2U7DQogICAgICAgICAgICAgICAgcmV0ID0ge307DQogICAgICAgICAgICAgICAgdmFscyA9IHRoaXMuZ2V0RW52RnJvbVBpZChwaWRzW2ldKTsNCg0KICAgICAgICAgICAgICAgIGZvciAoaiBpbiBvcHRpb25zLnZhbHVlcykNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGlmKHZhbHNbb3B0aW9ucy52YWx1ZXNbal1dKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXRbb3B0aW9ucy52YWx1ZXNbal1dID0gdmFsc1tvcHRpb25zLnZhbHVlc1tqXV07DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBicm9rZSA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChicm9rZSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gKHt9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgICAgIHRoaXMuZ2V0RW52RnJvbVBpZCA9IGZ1bmN0aW9uIGdldEVudkZyb21QaWQocGlkKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgcmV0ID0ge307DQogICAgICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnbGludXgnKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCg0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgL3Byb2MvIiArIHBpZCArICIvZW52aXJvbiB8IHRyICdcXDAnICdcXHQnIHwiICsgJyBhd2sgLUYiXHQiIFwneyBwcmludGYgInsiOyBmb3IoaT0xO2k8TkY7KytpKSB7IGlmKGk+MSkge3ByaW50ZiAiLCI7fSB4PXNwbGl0KCRpLCB0b2ssICI9Iik7IHByaW50ZiAiXFwiJXNcXCI6IFxcIiVzXFwiIiwgdG9rWzFdLCBzdWJzdHIoJGksIDIrbGVuZ3RoKHRva1sxXSkpOyB9IHByaW50ZiAifSI7IH1cJycpOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdcbmV4aXRcbicpOw0KICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICAgICAgICAgICAgICB0cnkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAoSlNPTi5wYXJzZShjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBjYXRjaChlZSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAoe30pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2ZyZWVic2QnKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJwcm9jc3RhdCAtZSAiICsgcGlkICsgIiB8IGdyZXAgIiArIHBpZCArICIgfCBhd2sgJ3sgJDE9XCJcIjsgJDI9XCJcIjsgcHJpbnQgJDAgfScgfCB0ciBcIlxcIFwiIFwiXFxuXCJcbmV4aXRcbiIpOyANCiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KCQkNCiAgICAgICAgICAgICAgICB2YXIgZW52Ow0KICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKS5zcGxpdCgnXG4nKTsNCiAgICAgICAgICAgICAgICBmb3IodmFyIGkgaW4gdG9rZW5zKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgZW52ID0gdG9rZW5zW2ldLnNwbGl0KCc9Jyk7DQogICAgICAgICAgICAgICAgICAgIHJldFtlbnZbMF1dID0gZW52WzFdOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy5maW5kRW52ID0gZnVuY3Rpb24gZmluZEVudih1aWQsIGVudikNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIHVuYW1lID0gdGhpcy5nZXRVc2VybmFtZSh1aWQpOw0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJwcyAiICsgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2ZyZWVic2QnID8gIi1heCAiOiIiKSArICItZSAtbyBwaWQgLW8gdXNlciB8IGdyZXAgIiArIHVuYW1lICsgIiB8IGF3ayAneyBwcmludCAkMSB9J1xuZXhpdFxuIik7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgICAgICAgICB2YXIgbGluZXMgPSBjaGlsZC5zdGRvdXQuc3RyLnNwbGl0KCdcbicpOw0KICAgICAgICAgICAgZm9yICh2YXIgbiBpbiBsaW5lcykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgbG4gPSBsaW5lc1tuXS50cmltKCk7DQogICAgICAgICAgICAgICAgaWYgKGxuLmxlbmd0aCA+IDApDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXMuZ2V0RW52RnJvbVBpZChsbik7DQogICAgICAgICAgICAgICAgICAgIGlmIChlW2Vudl0pDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZVtlbnZdKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiAobnVsbCk7DQogICAgICAgIH07DQogICAgfQ0KICAgIGVsc2UgaWYocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZGFyd2luJykNCiAgICB7DQogICAgICAgIHRoaXMuZ2V0VWlkID0gZnVuY3Rpb24gZ2V0VWlkKHVzZXJuYW1lKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImlkICIgKyB1c2VybmFtZSArICIgfCBhd2sgJ3sgc3BsaXQoJDEsIHRva2VuLCBcIj1cIik7IHNwbGl0KHRva2VuWzJdLCB1aWQsIFwiKFwiKTsgcHJpbnQgdWlkWzFdOyB9J1xuZXhpdFxuIik7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgcmV0dXJuIChwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkpOw0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLmdldEdyb3VwSUQgPSBmdW5jdGlvbiBnZXRHcm91cElEKHVpZCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydz", 16000); + memcpy_s(_usersessions + 48000, 12536, "aCddKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJpZCAiICsgdWlkICsgIiB8IGF3ayAneyBzcGxpdCgkMiwgZ2lkLCBcIj1cIik7IGlmKGdpZFsxXT09XCJnaWRcIikgeyBzcGxpdChnaWRbMl0sIGdpZG51bSwgXCIoXCIpOyBwcmludCBnaWRudW1bMV07ICB9IH0nXG5leGl0XG4iKTsNCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICByZXR1cm4gKHBhcnNlSW50KGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKSk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5nZXRVc2VybmFtZSA9IGZ1bmN0aW9uIGdldFVzZXJuYW1lKHVpZCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJkc2NsIC4gbGlzdCAvVXNlcnMgVW5pcXVlSUQgfCBncmVwICIgKyB1aWQgKyAiIHwgYXdrICd7IGlmKCQyPT0iICsgdWlkICsgIil7IHByaW50ICQxIH19J1xuZXhpdFxuIik7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgaWYoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgIT0gJycpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhyb3cgKCd1aWQ6ICcgKyB1aWQgKyAnIG5vdCBmb3VuZCcpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLmdldEdyb3VwbmFtZSA9IGZ1bmN0aW9uIGdldEdyb3VwbmFtZShnaWQpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiZHNjbCAuIGxpc3QgL0dyb3VwcyBQcmltYXJ5R3JvdXBJRCB8IGdyZXAgIiArIGdpZCArICIgfCBhd2sgJ3sgaWYoJDI9PSIgKyBnaWQgKyAiKXsgcHJpbnQgJDEgfX0nXG5leGl0XG4iKTsNCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICBpZihjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSAhPSAnJykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aHJvdyAoJ2dpZDogJyArIGdpZCArICcgbm90IGZvdW5kJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgICAgIHRoaXMuY29uc29sZVVpZCA9IGZ1bmN0aW9uIGNvbnNvbGVVaWQoKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoIndobyB8IHRyICdcbicgJ1wuJyB8IGF3ayAneyBwcmludCAkMSB9J1xuZXhpdFxuIik7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgICAgICAgICB2YXIgcmV0ID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCk7DQogICAgICAgICAgICBpZiAocmV0ICE9ICcnKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5nZXRVaWQocmV0KSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aHJvdyAoJ25vYm9keSBsb2dnZWQgaW50byBjb25zb2xlJyk7ICAgICANCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmdldEhvbWVGb2xkZXIgPSBmdW5jdGlvbiBnZXRIb21lRm9sZGVyKHVzZXIpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiZHNjbCAuIC1yZWFkIC9Vc2Vycy8iICsgdXNlciArICIgfCBncmVwIE5GU0hvbWVEaXJlY3RvcnkgfCBhd2sgLUY6ICd7IHByaW50ICQyIH0nXG5leGl0XG4iKTsNCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICBpZiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgIT0gJycpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhyb3cgKCd1c2VyOiAnICsgdXNlciArICcgbm90IGZvdW5kJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgICAgIHRoaXMuX3VzZXJzID0gZnVuY3Rpb24gKCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvdXNyL2Jpbi9kc2NsJywgWydkc2NsJywgJy4nLCAnbGlzdCcsICcvVXNlcnMnLCAnVW5pcXVlSUQnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7DQogICAgICAgICAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnZXhpdFxuJyk7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQoNCiAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xuJyk7DQogICAgICAgICAgICB2YXIgdG9rZW5zLCBpOw0KICAgICAgICAgICAgdmFyIHVzZXJzID0ge307DQoNCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7ICsraSkgew0KICAgICAgICAgICAgICAgIHRva2VucyA9IGxpbmVzW2ldLnNwbGl0KCcgJyk7DQogICAgICAgICAgICAgICAgaWYgKHRva2Vuc1swXSkgeyB1c2Vyc1t0b2tlbnNbMF1dID0gdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXTsgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByZXR1cm4gKHVzZXJzKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLl91aWRzID0gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvdXNyL2Jpbi9kc2NsJywgWydkc2NsJywgJy4nLCAnbGlzdCcsICcvVXNlcnMnLCAnVW5pcXVlSUQnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnZXhpdFxuJyk7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgICAgICAgICB2YXIgbGluZXMgPSBjaGlsZC5zdGRvdXQuc3RyLnNwbGl0KCdcbicpOw0KICAgICAgICAgICAgdmFyIHRva2VucywgaTsNCiAgICAgICAgICAgIHZhciB1c2VycyA9IHt9Ow0KDQogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHsNCiAgICAgICAgICAgICAgICB0b2tlbnMgPSBsaW5lc1tpXS5zcGxpdCgnICcpOw0KICAgICAgICAgICAgICAgIGlmICh0b2tlbnNbMF0pIHsgdXNlcnNbdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXV0gPSB0b2tlbnNbMF07IH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcmV0dXJuICh1c2Vycyk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5faWRUYWJsZSA9IGZ1bmN0aW9uKCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIHRhYmxlID0ge307DQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy91c3IvYmluL2lkJywgWydpZCddKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xuJylbMF0uc3BsaXQoJyAnKTsNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHsNCiAgICAgICAgICAgICAgICB2YXIgdHlwZXMgPSBsaW5lc1tpXS5zcGxpdCgnPScpOw0KICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSB0eXBlc1sxXS5zcGxpdCgnLCcpOw0KICAgICAgICAgICAgICAgIHRhYmxlW3R5cGVzWzBdXSA9IHt9Ow0KDQogICAgICAgICAgICAgICAgZm9yICh2YXIgaiBpbiB0b2tlbnMpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGlkYXJyID0gdG9rZW5zW2pdLnNwbGl0KCcoJyk7DQogICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IGlkYXJyWzBdOw0KICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IGlkYXJyWzFdLnN1YnN0cmluZygwLCBpZGFyclsxXS5sZW5ndGggLSAxKS50cmltKCk7DQogICAgICAgICAgICAgICAgICAgIHRhYmxlW3R5cGVzWzBdXVtuYW1lXSA9IGlkOw0KICAgICAgICAgICAgICAgICAgICB0YWJsZVt0eXBlc1swXV1baWRdID0gbmFtZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gKHRhYmxlKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLkN1cnJlbnQgPSBmdW5jdGlvbiAoY2IpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciB1c2VycyA9IHt9Ow0KICAgICAgICAgICAgdmFyIHRhYmxlID0gdGhpcy5faWRUYWJsZSgpOw0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvdXNyL2Jpbi9sYXN0JywgWydsYXN0J10pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgICAgICAgICAgdmFyIGxpbmVzID0gY2hpbGQuc3Rkb3V0LnN0ci5zcGxpdCgnXG4nKTsNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoICYmIGxpbmVzW2ldLmxlbmd0aCA+IDA7ICsraSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoIXVzZXJzW2xpbmVzW2ldLnNwbGl0KCcgJylbMF1dKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJzW2xpbmVzW2ldLnNwbGl0KCcgJylbMF1dID0geyBVc2VybmFtZTogbGluZXNbaV0uc3BsaXQoJyAnKVswXSwgU3RhdGU6IGxpbmVzW2ldLnNwbGl0KCdzdGlsbCBsb2dnZWQgaW4nKS5sZW5ndGggPiAxID8gJ0FjdGl2ZScgOiAnSW5hY3RpdmUnLCB1aWQ6IHRhYmxlLnVpZFtsaW5lc1tpXS5zcGxpdCgnICcpWzBdXSB9Ow0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNhdGNoKGUpDQogICAgICAgICAgICAgICAgICAgIHt9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGlmKHVzZXJzW2xpbmVzW2ldLnNwbGl0KCcgJylbMF1dLlN0YXRlICE9ICdBY3RpdmUnICYmIGxpbmVzW2ldLnNwbGl0KCdzdGlsbCBsb2dnZWQgaW4nKS5sZW5ndGggPiAxKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICB1c2Vyc1tsaW5lc1tpXS5zcGxpdCgnICcpWzBdXS5TdGF0ZSA9ICdBY3RpdmUnOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodXNlcnMsICdBY3RpdmUnLCB7IHZhbHVlOiBzaG93QWN0aXZlT25seSh1c2VycykgfSk7DQogICAgICAgICAgICBpZiAoY2IpIHsgY2IuY2FsbCh0aGlzLCB1c2Vycyk7IH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGlmKHByb2Nlc3MucGxhdGZvcm0gIT0gJ3dpbjMyJykgLy8gTGludXgsIE1hY09TLCBGcmVlQlNEDQogICAgew0KICAgICAgICB0aGlzLlNlbGYgPSBmdW5jdGlvbiBTZWxmKCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvdXNyL2Jpbi9pZCcsIFsnaWQnLCAnLXUnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgcmV0dXJuIChwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyKSk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5pc1Jvb3QgPSBmdW5jdGlvbiBpc1Jvb3QoKQ0KICAgICAgICB7DQogICAgICAgICAgICByZXR1cm4gKHRoaXMuU2VsZigpID09IDApOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgdGhpcy5lbnVtZXJhdGVVc2VycyA9IGZ1bmN0aW9uIGVudW1lcmF0ZVVzZXJzKCkNCiAgICB7DQogICAgICAgIHZhciBwcm9taXNlID0gcmVxdWlyZSgncHJvbWlzZScpOw0KICAgICAgICB2YXIgcCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5fX3Jlc29sdmVyID0gcmVzOw0KICAgICAgICAgICAgdGhpcy5fX3JlamVjdG9yID0gcmVqOw0KICAgICAgICB9KTsNCiAgICAgICAgcC5fX2hhbmRsZXIgPSBmdW5jdGlvbiBfX2hhbmRsZXIodXNlcnMpDQogICAgICAgIHsNCiAgICAgICAgICAgIHAuX19yZXNvbHZlcih1c2Vycyk7DQogICAgICAgIH07DQogICAgICAgIHRyeQ0KICAgICAgICB7DQogICAgICAgICAgICB0aGlzLkN1cnJlbnQocC5fX2hhbmRsZXIpOw0KICAgICAgICB9DQogICAgICAgIGNhdGNoIChlKQ0KICAgICAgICB7DQogICAgICAgICAgICBwLl9fcmVqZWN0b3IoZSk7DQogICAgICAgIH0NCiAgICAgICAgcC5wYXJlbnQgPSB0aGlzOw0KICAgICAgICByZXR1cm4gKHApOw0KICAgIH0NCn0NCmZ1bmN0aW9uIHNob3dBY3RpdmVPbmx5KHNvdXJjZSkNCnsNCiAgICB2YXIgcmV0VmFsID0gW107DQogICAgdmFyIHVuaXF1ZSA9IHt9Ow0KICAgIHZhciB1c2VybmFtZXMgPSBbXTsNCiAgICB2YXIgdG1wOw0KDQogICAgZm9yICh2YXIgaSBpbiBzb3VyY2UpDQogICAgew0KICAgICAgICBpZiAoc291cmNlW2ldLlN0YXRlID09ICdBY3RpdmUnKQ0KICAgICAgICB7DQogICAgICAgICAgICByZXRWYWwucHVzaChzb3VyY2VbaV0pOw0KICAgICAgICAgICAgdG1wID0gKHNvdXJjZVtpXS5Eb21haW4gPyAoc291cmNlW2ldLkRvbWFpbiArICdcXCcpIDogJycpICsgc291cmNlW2ldLlVzZXJuYW1lOw0KICAgICAgICAgICAgaWYgKCF1bmlxdWVbdG1wXSkgeyB1bmlxdWVbdG1wXSA9IHRtcDt9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmb3IgKHZhciBpIGluIHVuaXF1ZSkNCiAgICB7DQogICAgICAgIHVzZXJuYW1lcy5wdXNoKGkpOw0KICAgIH0NCg0KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXRWYWwsICd1c2VybmFtZXMnLCB7IHZhbHVlOiB1c2VybmFtZXMgfSk7DQogICAgcmV0dXJuIChyZXRWYWwpOw0KfQ0KZnVuY3Rpb24gZ2V0VG9rZW5zKHN0cikNCnsNCiAgICB2YXIgY29sdW1ucyA9IFtdOw0KICAgIHZhciBpOw0KDQogICAgY29sdW1ucy5wdXNoKHN0ci5zdWJzdHJpbmcoMCwgKGk9c3RyLmluZGV4T2YoJyAnKSkpKTsNCiAgICB3aGlsZSAoc3RyWysraV0gPT0gJyAnKTsNCiAgICBjb2x1bW5zLnB1c2goc3RyLnN1YnN0cmluZyhpLCAoaT1zdHIuc3Vic3RyaW5nKGkpLmluZGV4T2YoJyAnKSArIGkpKSk7DQogICAgd2hpbGUgKHN0clsrK2ldID09ICcgJyk7DQogICAgY29sdW1ucy5wdXNoKHN0ci5zdWJzdHJpbmcoaSwgKGk9c3RyLnN1YnN0cmluZyhpKS5pbmRleE9mKCcgJykgKyBpKSkpOw0KICAgIHdoaWxlIChzdHJbKytpXSA9PSAnICcpOw0KICAgIHZhciBzdGF0dXMgPSBzdHIuc3Vic3RyaW5nKGkpLnRyaW0oKTsNCiAgICBjb2x1bW5zLnB1c2goc3RhdHVzKTsNCg0KICAgIHJldHVybiAoY29sdW1ucyk7DQp9DQoNCm1vZHVsZS5leHBvcnRzID0gbmV3IFVzZXJTZXNzaW9ucygpOw0K", 12536); + ILibBase64DecodeEx((unsigned char*)_usersessions, 60536, (unsigned char*)_usersessions + 60536); + duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "user-sessions"); duk_push_string(ctx, _usersessions + 60536); duk_pcall_method(ctx, 2); duk_pop(ctx); free(_usersessions);