From 2c53afc1652cacd68a7e7065d4c8cd0ac8eac831 Mon Sep 17 00:00:00 2001 From: mihkelkruuse Date: Tue, 25 Aug 2020 11:36:07 +0300 Subject: [PATCH 1/8] CNL-646 Updated socket sending function to log proper error --- dist/imap.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/dist/imap.js b/dist/imap.js index 9fcafe8d..906fe485 100644 --- a/dist/imap.js +++ b/dist/imap.js @@ -367,7 +367,12 @@ class Imap { if (this.compressed) { this._sendCompressed(buffer); } else { - this.socket.send(buffer); + try { + this.socket.send(buffer); + } catch (e) { + this.logger.error('Socket has been closed or gone missing!', str); + return this._onError(e); + } } } /** @@ -941,4 +946,4 @@ const createMessage = (message, buffer) => ({ message, buffer }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbWFwLmpzIl0sIm5hbWVzIjpbIk1FU1NBR0VfSU5JVElBTElaRV9XT1JLRVIiLCJNRVNTQUdFX0lORkxBVEUiLCJNRVNTQUdFX0lORkxBVEVEX0RBVEFfUkVBRFkiLCJNRVNTQUdFX0RFRkxBVEUiLCJNRVNTQUdFX0RFRkxBVEVEX0RBVEFfUkVBRFkiLCJFT0wiLCJMSU5FX0ZFRUQiLCJDQVJSSUFHRV9SRVRVUk4iLCJMRUZUX0NVUkxZX0JSQUNLRVQiLCJSSUdIVF9DVVJMWV9CUkFDS0VUIiwiQVNDSUlfUExVUyIsIkJVRkZFUl9TVEFURV9MSVRFUkFMIiwiQlVGRkVSX1NUQVRFX1BPU1NJQkxZX0xJVEVSQUxfTEVOR1RIXzEiLCJCVUZGRVJfU1RBVEVfUE9TU0lCTFlfTElURVJBTF9MRU5HVEhfMiIsIkJVRkZFUl9TVEFURV9ERUZBVUxUIiwiVElNRU9VVF9FTlRFUl9JRExFIiwiVElNRU9VVF9TT0NLRVRfTE9XRVJfQk9VTkQiLCJUSU1FT1VUX1NPQ0tFVF9NVUxUSVBMSUVSIiwiSW1hcCIsImNvbnN0cnVjdG9yIiwiaG9zdCIsInBvcnQiLCJvcHRpb25zIiwidGltZW91dEVudGVySWRsZSIsInRpbWVvdXRTb2NrZXRMb3dlckJvdW5kIiwidGltZW91dFNvY2tldE11bHRpcGxpZXIiLCJ1c2VTZWN1cmVUcmFuc3BvcnQiLCJzZWN1cmVNb2RlIiwiX2Nvbm5lY3Rpb25SZWFkeSIsIl9nbG9iYWxBY2NlcHRVbnRhZ2dlZCIsIl9jbGllbnRRdWV1ZSIsIl9jYW5TZW5kIiwiX3RhZ0NvdW50ZXIiLCJfY3VycmVudENvbW1hbmQiLCJfaWRsZVRpbWVyIiwiX3NvY2tldFRpbWVvdXRUaW1lciIsImNvbXByZXNzZWQiLCJfaW5jb21pbmdCdWZmZXJzIiwiX2J1ZmZlclN0YXRlIiwiX2xpdGVyYWxSZW1haW5pbmciLCJvbmNlcnQiLCJvbmVycm9yIiwib25yZWFkeSIsIm9uaWRsZSIsImNvbm5lY3QiLCJTb2NrZXQiLCJUQ1BTb2NrZXQiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInNvY2tldCIsIm9wZW4iLCJiaW5hcnlUeXBlIiwiY2EiLCJjZXJ0IiwiRSIsIm9uY2xvc2UiLCJfb25FcnJvciIsIkVycm9yIiwib25kYXRhIiwiZXZ0IiwiX29uRGF0YSIsImVyciIsImUiLCJkYXRhIiwibWVzc2FnZSIsIm9ub3BlbiIsImNsb3NlIiwiZXJyb3IiLCJ0ZWFyRG93biIsImZvckVhY2giLCJjbWQiLCJjYWxsYmFjayIsImNsZWFyVGltZW91dCIsIl9kaXNhYmxlQ29tcHJlc3Npb24iLCJyZWFkeVN0YXRlIiwibG9nb3V0IiwidGhlbiIsImNhdGNoIiwiZW5xdWV1ZUNvbW1hbmQiLCJ1cGdyYWRlIiwidXBncmFkZVRvU2VjdXJlIiwicmVxdWVzdCIsImFjY2VwdFVudGFnZ2VkIiwiY29tbWFuZCIsImNvbmNhdCIsIm1hcCIsInVudGFnZ2VkIiwidG9TdHJpbmciLCJ0b1VwcGVyQ2FzZSIsInRyaW0iLCJ0YWciLCJwYXlsb2FkIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwicmVzcG9uc2UiLCJpc0Vycm9yIiwiaW5kZXhPZiIsImh1bWFuUmVhZGFibGUiLCJjb2RlIiwiT2JqZWN0Iiwia2V5cyIsImtleSIsImluZGV4IiwiY3R4Iiwic3BsaWNlIiwicHVzaCIsIl9zZW5kUmVxdWVzdCIsImdldFByZXZpb3VzbHlRdWV1ZWQiLCJjb21tYW5kcyIsInN0YXJ0SW5kZXgiLCJpIiwiaXNNYXRjaCIsInNlbmQiLCJzdHIiLCJidWZmZXIiLCJ0aW1lb3V0IiwiTWF0aCIsImZsb29yIiwiYnl0ZUxlbmd0aCIsInNldFRpbWVvdXQiLCJfc2VuZENvbXByZXNzZWQiLCJzZXRIYW5kbGVyIiwibG9nZ2VyIiwiVWludDhBcnJheSIsIl9wYXJzZUluY29taW5nQ29tbWFuZHMiLCJfaXRlcmF0ZUluY29taW5nQnVmZmVyIiwiYnVmIiwiZGlmZiIsIm1pbiIsIk51bWJlciIsIl9sZW5ndGhCdWZmZXIiLCJzdGFydCIsImxhdGVzdCIsInN1YmFycmF5IiwicHJldkJ1ZiIsInNldCIsImxlZnRJZHgiLCJsZWZ0T2ZMZWZ0Q3VybHkiLCJMRmlkeCIsImNvbW1hbmRMZW5ndGgiLCJyZWR1Y2UiLCJwcmV2IiwiY3VyciIsInVpbnQ4QXJyYXkiLCJzaGlmdCIsInJlbWFpbmluZ0xlbmd0aCIsImV4Y2Vzc0xlbmd0aCIsIl9jbGVhcklkbGUiLCJjaHVuayIsImVycm9yUmVzcG9uc2VFeHBlY3RzRW1wdHlMaW5lIiwidmFsdWVBc1N0cmluZyIsImRlYnVnIiwiX3Byb2Nlc3NSZXNwb25zZSIsIl9oYW5kbGVSZXNwb25zZSIsIl9lbnRlcklkbGUiLCJfcmVzdGFydFF1ZXVlIiwicHJlY2hlY2siLCJjb250ZXh0Iiwid2FpdERyYWluIiwiYXR0cmlidXRlcyIsInRlc3QiLCJ0eXBlIiwibnIiLCJ2YWx1ZSIsInNlY3Rpb24iLCJvcHRpb24iLCJBcnJheSIsImlzQXJyYXkiLCJ0b0xvd2VyQ2FzZSIsInByb3RvdHlwZSIsImNhbGwiLCJtYXRjaCIsImVuYWJsZUNvbXByZXNzaW9uIiwiX3NvY2tldE9uRGF0YSIsIndpbmRvdyIsIldvcmtlciIsIl9jb21wcmVzc2lvbldvcmtlciIsIlVSTCIsImNyZWF0ZU9iamVjdFVSTCIsIkJsb2IiLCJDb21wcmVzc2lvbkJsb2IiLCJvbm1lc3NhZ2UiLCJwb3N0TWVzc2FnZSIsImNyZWF0ZU1lc3NhZ2UiLCJpbmZsYXRlZFJlYWR5IiwiZGVmbGF0ZWRSZWFkeSIsIl9jb21wcmVzc2lvbiIsIkNvbXByZXNzaW9uIiwiaW5mbGF0ZSIsInRlcm1pbmF0ZSIsImRlZmxhdGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7cyt4Q0FHQTtBQUNBO0FBQ0E7O0FBQ0EsTUFBTUEseUJBQXlCLEdBQUcsT0FBbEM7QUFDQSxNQUFNQyxlQUFlLEdBQUcsU0FBeEI7QUFDQSxNQUFNQywyQkFBMkIsR0FBRyxnQkFBcEM7QUFDQSxNQUFNQyxlQUFlLEdBQUcsU0FBeEI7QUFDQSxNQUFNQywyQkFBMkIsR0FBRyxn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eEIsQ0FBb0NDLGFBQWEsQ0FBQ3ZMLGVBQUQsRUFBa0IyRCxHQUFHLENBQUNJLElBQXRCLENBQWpELEVBQThFLENBQUNKLEdBQUcsQ0FBQ0ksSUFBTCxDQUE5RTtBQUNELE9BRkQsTUFFTztBQUNMLGFBQUsySCxZQUFMLENBQWtCRSxPQUFsQixDQUEwQmpJLEdBQUcsQ0FBQ0ksSUFBOUI7QUFDRDtBQUNGLEtBVkQ7QUFXRDtBQUVEOzs7OztBQUdBVSxFQUFBQSxtQkFBbUIsR0FBSTtBQUNyQixRQUFJLENBQUMsS0FBS3RDLFVBQVYsRUFBc0I7QUFDcEI7QUFDRDs7QUFFRCxTQUFLQSxVQUFMLEdBQWtCLEtBQWxCO0FBQ0EsU0FBS2MsTUFBTCxDQUFZUyxNQUFaLEdBQXFCLEtBQUttSCxhQUExQjtBQUNBLFNBQUtBLGFBQUwsR0FBcUIsSUFBckI7O0FBRUEsUUFBSSxLQUFLRyxrQkFBVCxFQUE2QjtBQUMzQjtBQUNBLFdBQUtBLGtCQUFMLENBQXdCYSxTQUF4Qjs7QUFDQSxXQUFLYixrQkFBTCxHQUEwQixJQUExQjtBQUNEO0FBQ0Y7QUFFRDs7Ozs7OztBQUtBeEQsRUFBQUEsZUFBZSxDQUFFTixNQUFGLEVBQVU7QUFDdkI7QUFDQSxRQUFJLEtBQUs4RCxrQkFBVCxFQUE2QjtBQUMzQixXQUFLQSxrQkFBTCxDQUF3Qk0sV0FBeEIsQ0FBb0NDLGFBQWEsQ0FBQ3JMLGVBQUQsRUFBa0JnSCxNQUFsQixDQUFqRCxFQUE0RSxDQUFDQSxNQUFELENBQTVFO0FBQ0QsS0FGRCxNQUVPO0FBQ0wsV0FBS3dFLFlBQUwsQ0FBa0JJLE9BQWxCLENBQTBCNUUsTUFBMUI7QUFDRDtBQUNGOztBQTF3QnVCOzs7O0FBNndCMUIsTUFBTXFFLGFBQWEsR0FBRyxDQUFDdkgsT0FBRCxFQUFVa0QsTUFBVixNQUFzQjtBQUFFbEQsRUFBQUEsT0FBRjtBQUFXa0QsRUFBQUE7QUFBWCxDQUF0QixDQUF0QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHByb3BPciB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IFRDUFNvY2tldCBmcm9tICdlbWFpbGpzLXRjcC1zb2NrZXQnXG5pbXBvcnQgeyB0b1R5cGVkQXJyYXksIGZyb21UeXBlZEFycmF5IH0gZnJvbSAnLi9jb21tb24nXG5pbXBvcnQgeyBwYXJzZXIsIGNvbXBpbGVyIH0gZnJvbSAnZW1haWxqcy1pbWFwLWhhbmRsZXInXG5pbXBvcnQgQ29tcHJlc3Npb24gZnJvbSAnLi9jb21wcmVzc2lvbidcbmltcG9ydCBDb21wcmVzc2lvbkJsb2IgZnJvbSAnLi4vcmVzL2NvbXByZXNzaW9uLndvcmtlci5ibG9iJ1xuXG4vL1xuLy8gY29uc3RhbnRzIHVzZWQgZm9yIGNvbW11bmljYXRpb24gd2l0aCB0aGUgd29ya2VyXG4vL1xuY29uc3QgTUVTU0FHRV9JTklUSUFMSVpFX1dPUktFUiA9ICdzdGFydCdcbmNvbnN0IE1FU1NBR0VfSU5GTEFURSA9ICdpbmZsYXRlJ1xuY29uc3QgTUVTU0FHRV9JTkZMQVRFRF9EQVRBX1JFQURZID0gJ2luZmxhdGVkX3JlYWR5J1xuY29uc3QgTUVTU0FHRV9ERUZMQVRFID0gJ2RlZmxhdGUnXG5jb25zdCBNRVNTQUdFX0RFRkxBVEVEX0RBVEFfUkVBRFkgPSAnZGVmbGF0ZWRfcmVhZHknXG5cbmNvbnN0IEVPTCA9ICdcXHJcXG4nXG5jb25zdCBMSU5FX0ZFRUQgPSAxMFxuY29uc3QgQ0FSUklBR0VfUkVUVVJOID0gMTNcbmNvbnN0IExFRlRfQ1VSTFlfQlJBQ0tFVCA9IDEyM1xuY29uc3QgUklHSFRfQ1VSTFlfQlJBQ0tFVCA9IDEyNVxuXG5jb25zdCBBU0NJSV9QTFVTID0gNDNcblxuLy8gU3RhdGUgdHJhY2tpbmcgd2hlbiBjb25zdHJ1Y3RpbmcgYW4gSU1BUCBjb21tYW5kIGZyb20gYnVmZmVycy5cbmNvbnN0IEJVRkZFUl9TVEFURV9MSVRFUkFMID0gJ2xpdGVyYWwnXG5jb25zdCBCVUZGRVJfU1RBVEVfUE9TU0lCTFlfTElURVJBTF9MRU5HVEhfMSA9ICdsaXRlcmFsX2xlbmd0aF8xJ1xuY29uc3QgQlVGRkVSX1NUQVRFX1BPU1NJQkxZX0xJVEVSQUxfTEVOR1RIXzIgPSAnbGl0ZXJhbF9sZW5ndGhfMidcbmNvbnN0IEJVRkZFUl9TVEFURV9ERUZBVUxUID0gJ2RlZmF1bHQnXG5cbi8qKlxuICogSG93IG11Y2ggdGltZSB0byB3YWl0IHNpbmNlIHRoZSBsYXN0IHJlc3BvbnNlIHVudGlsIHRoZSBjb25uZWN0aW9uIGlzIGNvbnNpZGVyZWQgaWRsaW5nXG4gKi9cbmNvbnN0IFRJTUVPVVRfRU5URVJfSURMRSA9IDEwMDBcblxuLyoqXG4gKiBMb3dlciBCb3VuZCBmb3Igc29ja2V0IHRpbWVvdXQgdG8gd2FpdCBzaW5jZSB0aGUgbGFzdCBkYXRhIHdhcyB3cml0dGVuIHRvIGEgc29ja2V0XG4gKi9cbmNvbnN0IFRJTUVPVVRfU09DS0VUX0xPV0VSX0JPVU5EID0gMTAwMDBcblxuLyoqXG4gKiBNdWx0aXBsaWVyIGZvciBzb2NrZXQgdGltZW91dDpcbiAqXG4gKiBXZSBhc3N1bWUgYXQgbGVhc3QgYSBHUFJTIGNvbm5lY3Rpb24gd2l0aCAxMTUga2IvcyA9IDE0LDM3NSBrQi9zIHRvcHMsIHNvIDEwIEtCL3MgdG8gYmUgb25cbiAqIHRoZSBzYWZlIHNpZGUuIFdlIGNhbiB0aW1lb3V0IGFmdGVyIGEgbG93ZXIgYm91bmQgb2YgMTBzICsgKG4gS0IgLyAxMCBLQi9zKS4gQSAxIE1CIG1lc3NhZ2VcbiAqIHVwbG9hZCB3b3VsZCBiZSAxMTAgc2Vjb25kcyB0byB3YWl0IGZvciB0aGUgdGltZW91dC4gMTAgS0IvcyA9PT0gMC4xIHMvQlxuICovXG5jb25zdCBUSU1FT1VUX1NPQ0tFVF9NVUxUSVBMSUVSID0gMC4xXG5cbi8qKlxuICogQ3JlYXRlcyBhIGNvbm5lY3Rpb24gb2JqZWN0IHRvIGFuIElNQVAgc2VydmVyLiBDYWxsIGBjb25uZWN0YCBtZXRob2QgdG8gaW5pdGl0YXRlXG4gKiB0aGUgYWN0dWFsIGNvbm5lY3Rpb24sIHRoZSBjb25zdHJ1Y3RvciBvbmx5IGRlZmluZXMgdGhlIHByb3BlcnRpZXMgYnV0IGRvZXMgbm90IGFjdHVhbGx5IGNvbm5lY3QuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IFtob3N0PSdsb2NhbGhvc3QnXSBIb3N0bmFtZSB0byBjb25lbmN0IHRvXG4gKiBAcGFyYW0ge051bWJlcn0gW3BvcnQ9MTQzXSBQb3J0IG51bWJlciB0byBjb25uZWN0IHRvXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIE9wdGlvbmFsIG9wdGlvbnMgb2JqZWN0XG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnVzZVNlY3VyZVRyYW5zcG9ydF0gU2V0IHRvIHRydWUsIHRvIHVzZSBlbmNyeXB0ZWQgY29ubmVjdGlvblxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmNvbXByZXNzaW9uV29ya2VyUGF0aF0gb2ZmbG9hZHMgZGUtL2NvbXByZXNzaW9uIGNvbXB1dGF0aW9uIHRvIGEgd2ViIHdvcmtlciwgdGhpcyBpcyB0aGUgcGF0aCB0byB0aGUgYnJvd3NlcmlmaWVkIGVtYWlsanMtY29tcHJlc3Nvci13b3JrZXIuanNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW1hcCB7XG4gIGNvbnN0cnVjdG9yIChob3N0LCBwb3J0LCBvcHRpb25zID0ge30pIHtcbiAgICB0aGlzLnRpbWVvdXRFbnRlcklkbGUgPSBUSU1FT1VUX0VOVEVSX0lETEVcbiAgICB0aGlzLnRpbWVvdXRTb2NrZXRMb3dlckJvdW5kID0gVElNRU9VVF9TT0NLRVRfTE9XRVJfQk9VTkRcbiAgICB0aGlzLnRpbWVvdXRTb2NrZXRNdWx0aXBsaWVyID0gVElNRU9VVF9TT0NLRVRfTVVMVElQTElFUlxuXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xuXG4gICAgdGhpcy5wb3J0ID0gcG9ydCB8fCAodGhpcy5vcHRpb25zLnVzZVNlY3VyZVRyYW5zcG9ydCA/IDk5MyA6IDE0MylcbiAgICB0aGlzLmhvc3QgPSBob3N0IHx8ICdsb2NhbGhvc3QnXG5cbiAgICAvLyBVc2UgYSBUTFMgY29ubmVjdGlvbi4gUG9ydCA5OTMgYWxzbyBmb3JjZXMgVExTLlxuICAgIHRoaXMub3B0aW9ucy51c2VTZWN1cmVUcmFuc3BvcnQgPSAndXNlU2VjdXJlVHJhbnNwb3J0JyBpbiB0aGlzLm9wdGlvbnMgPyAhIXRoaXMub3B0aW9ucy51c2VTZWN1cmVUcmFuc3BvcnQgOiB0aGlzLnBvcnQgPT09IDk5M1xuXG4gICAgdGhpcy5zZWN1cmVNb2RlID0gISF0aGlzLm9wdGlvbnMudXNlU2VjdXJlVHJhbnNwb3J0IC8vIERvZXMgdGhlIGNvbm5lY3Rpb24gdXNlIFNTTC9UTFNcblxuICAgIHRoaXMuX2Nvbm5lY3Rpb25SZWFkeSA9IGZhbHNlIC8vIElzIHRoZSBjb25lY3Rpb24gZXN0YWJsaXNoZWQgYW5kIGdyZWV0aW5nIGlzIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlclxuXG4gICAgdGhpcy5fZ2xvYmFsQWNjZXB0VW50YWdnZWQgPSB7fSAvLyBHbG9iYWwgaGFuZGxlcnMgZm9yIHVucmVsYXRlZCByZXNwb25zZXMgKEVYUFVOR0UsIEVYSVNUUyBldGMuKVxuXG4gICAgdGhpcy5fY2xpZW50UXVldWUgPSBbXSAvLyBRdWV1ZSBvZiBvdXRnb2luZyBjb21tYW5kc1xuICAgIHRoaXMuX2NhblNlbmQgPSBmYWxzZSAvLyBJcyBpdCBPSyB0byBzZW5kIHNvbWV0aGluZyB0byB0aGUgc2VydmVyXG4gICAgdGhpcy5fdGFnQ291bnRlciA9IDAgLy8gQ291bnRlciB0byBhbGxvdyB1bmlxdWV1ZSBpbWFwIHRhZ3NcbiAgICB0aGlzLl9jdXJyZW50Q29tbWFuZCA9IGZhbHNlIC8vIEN1cnJlbnQgY29tbWFuZCB0aGF0IGlzIHdhaXRpbmcgZm9yIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlclxuXG4gICAgdGhpcy5faWRsZVRpbWVyID0gZmFsc2UgLy8gVGltZXIgd2FpdGluZyB0byBlbnRlciBpZGxlXG4gICAgdGhpcy5fc29ja2V0VGltZW91dFRpbWVyID0gZmFsc2UgLy8gVGltZXIgd2FpdGluZyB0byBkZWNsYXJlIHRoZSBzb2NrZXQgZGVhZCBzdGFydGluZyBmcm9tIHRoZSBsYXN0IHdyaXRlXG5cbiAgICB0aGlzLmNvbXByZXNzZWQgPSBmYWxzZSAvLyBJcyB0aGUgY29ubmVjdGlvbiBjb21wcmVzc2VkIGFuZCBuZWVkcyBpbmZsYXRpbmcvZGVmbGF0aW5nXG5cbiAgICAvL1xuICAgIC8vIEhFTFBFUlNcbiAgICAvL1xuXG4gICAgLy8gQXMgdGhlIHNlcnZlciBzZW5kcyBkYXRhIGluIGNodW5rcywgaXQgbmVlZHMgdG8gYmUgc3BsaXQgaW50byBzZXBhcmF0ZSBsaW5lcy4gSGVscHMgcGFyc2luZyB0aGUgaW5wdXQuXG4gICAgdGhpcy5faW5jb21pbmdCdWZmZXJzID0gW11cbiAgICB0aGlzLl9idWZmZXJTdGF0ZSA9IEJVRkZFUl9TVEFURV9ERUZBVUxUXG4gICAgdGhpcy5fbGl0ZXJhbFJlbWFpbmluZyA9IDBcblxuICAgIC8vXG4gICAgLy8gRXZlbnQgcGxhY2Vob2xkZXJzLCBtYXkgYmUgb3ZlcnJpZGVuIHdpdGggY2FsbGJhY2sgZnVuY3Rpb25zXG4gICAgLy9cbiAgICB0aGlzLm9uY2VydCA9IG51bGxcbiAgICB0aGlzLm9uZXJyb3IgPSBudWxsIC8vIElycmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJyZWQuIENvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciB3aWxsIGJlIGNsb3NlZCBhdXRvbWF0aWNhbGx5LlxuICAgIHRoaXMub25yZWFkeSA9IG51bGwgLy8gVGhlIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciBoYXMgYmVlbiBlc3RhYmxpc2hlZCBhbmQgZ3JlZXRpbmcgaXMgcmVjZWl2ZWRcbiAgICB0aGlzLm9uaWRsZSA9IG51bGwgLy8gVGhlcmUgYXJlIG5vIG1vcmUgY29tbWFuZHMgdG8gcHJvY2Vzc1xuICB9XG5cbiAgLy8gUFVCTElDIE1FVEhPRFNcblxuICAvKipcbiAgICogSW5pdGlhdGUgYSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIuIFdhaXQgZm9yIG9ucmVhZHkgZXZlbnRcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFNvY2tldFxuICAgKiAgICAgVEVTVElORyBPTkxZISBUaGUgVENQU29ja2V0IGhhcyBhIHByZXR0eSBub25zZW5zaWNhbCBjb252ZW5pZW5jZSBjb25zdHJ1Y3RvcixcbiAgICogICAgIHdoaWNoIG1ha2VzIGl0IGhhcmQgdG8gbW9jay4gRm9yIGRlcGVuZGVuY3ktaW5qZWN0aW9uIHB1cnBvc2VzLCB3ZSB1c2UgdGhlXG4gICAqICAgICBTb2NrZXQgcGFyYW1ldGVyIHRvIHBhc3MgaW4gYSBtb2NrIFNvY2tldCBpbXBsZW1lbnRhdGlvbi4gU2hvdWxkIGJlIGxlZnQgYmxhbmtcbiAgICogICAgIGluIHByb2R1Y3Rpb24gdXNlIVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmVzb2x2ZXMgd2hlbiBzb2NrZXQgaXMgb3BlbmVkXG4gICAqL1xuICBjb25uZWN0IChTb2NrZXQgPSBUQ1BTb2NrZXQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5zb2NrZXQgPSBTb2NrZXQub3Blbih0aGlzLmhvc3QsIHRoaXMucG9ydCwge1xuICAgICAgICBiaW5hcnlUeXBlOiAnYXJyYXlidWZmZXInLFxuICAgICAgICB1c2VTZWN1cmVUcmFuc3BvcnQ6IHRoaXMuc2VjdXJlTW9kZSxcbiAgICAgICAgY2E6IHRoaXMub3B0aW9ucy5jYVxuICAgICAgfSlcblxuICAgICAgLy8gYWxsb3dzIGNlcnRpZmljYXRlIGhhbmRsaW5nIGZvciBwbGF0Zm9ybSB3L28gbmF0aXZlIHRscyBzdXBwb3J0XG4gICAgICAvLyBvbmNlcnQgaXMgbm9uIHN0YW5kYXJkIHNvIHNldHRpbmcgaXQgbWlnaHQgdGhyb3cgaWYgdGhlIHNvY2tldCBvYmplY3QgaXMgaW1tdXRhYmxlXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnNvY2tldC5vbmNlcnQgPSAoY2VydCkgPT4geyB0aGlzLm9uY2VydCAmJiB0aGlzLm9uY2VydChjZXJ0KSB9XG4gICAgICB9IGNhdGNoIChFKSB7IH1cblxuICAgICAgLy8gQ29ubmVjdGlvbiBjbG9zaW5nIHVuZXhwZWN0ZWQgaXMgYW4gZXJyb3JcbiAgICAgIHRoaXMuc29ja2V0Lm9uY2xvc2UgPSAoKSA9PiB0aGlzLl9vbkVycm9yKG5ldyBFcnJvcignU29ja2V0IGNsb3NlZCB1bmV4cGVjdGVkbHkhJykpXG4gICAgICB0aGlzLnNvY2tldC5vbmRhdGEgPSAoZXZ0KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5fb25EYXRhKGV2dClcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5fb25FcnJvcihlcnIpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gaWYgYW4gZXJyb3IgaGFwcGVucyBkdXJpbmcgY3JlYXRlIHRpbWUsIHJlamVjdCB0aGUgcHJvbWlzZVxuICAgICAgdGhpcy5zb2NrZXQub25lcnJvciA9IChlKSA9PiB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0NvdWxkIG5vdCBvcGVuIHNvY2tldDogJyArIGUuZGF0YS5tZXNzYWdlKSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5zb2NrZXQub25vcGVuID0gKCkgPT4ge1xuICAgICAgICAvLyB1c2UgcHJvcGVyIFwiaXJyZWNvdmVyYWJsZSBlcnJvciwgdGVhciBkb3duIGV2ZXJ5dGhpbmdcIi1oYW5kbGVyIG9ubHkgYWZ0ZXIgc29ja2V0IGlzIG9wZW5cbiAgICAgICAgdGhpcy5zb2NrZXQub25lcnJvciA9IChlKSA9PiB0aGlzLl9vbkVycm9yKGUpXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXJcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IFJlc29sdmVzIHdoZW4gdGhlIHNvY2tldCBpcyBjbG9zZWRcbiAgICovXG4gIGNsb3NlIChlcnJvcikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdmFyIHRlYXJEb3duID0gKCkgPT4ge1xuICAgICAgICAvLyBmdWxmaWxsIHBlbmRpbmcgcHJvbWlzZXNcbiAgICAgICAgdGhpcy5fY2xpZW50UXVldWUuZm9yRWFjaChjbWQgPT4gY21kLmNhbGxiYWNrKGVycm9yKSlcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRDb21tYW5kKSB7XG4gICAgICAgICAgdGhpcy5fY3VycmVudENvbW1hbmQuY2FsbGJhY2soZXJyb3IpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jbGllbnRRdWV1ZSA9IFtdXG4gICAgICAgIHRoaXMuX2N1cnJlbnRDb21tYW5kID0gZmFsc2VcblxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5faWRsZVRpbWVyKVxuICAgICAgICB0aGlzLl9pZGxlVGltZXIgPSBudWxsXG5cbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3NvY2tldFRpbWVvdXRUaW1lcilcbiAgICAgICAgdGhpcy5fc29ja2V0VGltZW91dFRpbWVyID0gbnVsbFxuXG4gICAgICAgIGlmICh0aGlzLnNvY2tldCkge1xuICAgICAgICAgIC8vIHJlbW92ZSBhbGwgbGlzdGVuZXJzXG4gICAgICAgICAgdGhpcy5zb2NrZXQub25vcGVuID0gbnVsbFxuICAgICAgICAgIHRoaXMuc29ja2V0Lm9uY2xvc2UgPSBudWxsXG4gICAgICAgICAgdGhpcy5zb2NrZXQub25kYXRhID0gbnVsbFxuICAgICAgICAgIHRoaXMuc29ja2V0Lm9uZXJyb3IgPSBudWxsXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0Lm9uY2VydCA9IG51bGxcbiAgICAgICAgICB9IGNhdGNoIChFKSB7IH1cblxuICAgICAgICAgIHRoaXMuc29ja2V0ID0gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2Rpc2FibGVDb21wcmVzc2lvbigpXG5cbiAgICAgIGlmICghdGhpcy5zb2NrZXQgfHwgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSAhPT0gJ29wZW4nKSB7XG4gICAgICAgIHJldHVybiB0ZWFyRG93bigpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9uY2xvc2UgPSB0aGlzLnNvY2tldC5vbmVycm9yID0gdGVhckRvd24gLy8gd2UgZG9uJ3QgcmVhbGx5IGNhcmUgYWJvdXQgdGhlIGVycm9yIGhlcmVcbiAgICAgIHRoaXMuc29ja2V0LmNsb3NlKClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgTE9HT1VUIHRvIHRoZSBzZXJ2ZXIuXG4gICAqXG4gICAqIFVzZSBpcyBkaXNjb3VyYWdlZCFcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IFJlc29sdmVzIHdoZW4gY29ubmVjdGlvbiBpcyBjbG9zZWQgYnkgc2VydmVyLlxuICAgKi9cbiAgbG9nb3V0ICgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5zb2NrZXQub25jbG9zZSA9IHRoaXMuc29ja2V0Lm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuY2xvc2UoJ0NsaWVudCBsb2dnaW5nIG91dCcpLnRoZW4ocmVzb2x2ZSkuY2F0Y2gocmVqZWN0KVxuICAgICAgfVxuXG4gICAgICB0aGlzLmVucXVldWVDb21tYW5kKCdMT0dPVVQnKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhdGVzIFRMUyBoYW5kc2hha2VcbiAgICovXG4gIHVwZ3JhZGUgKCkge1xuICAgIHRoaXMuc2VjdXJlTW9kZSA9IHRydWVcbiAgICB0aGlzLnNvY2tldC51cGdyYWRlVG9TZWN1cmUoKVxuICB9XG5cbiAgLyoqXG4gICAqIFNjaGVkdWxlcyBhIGNvbW1hbmQgdG8gYmUgc2VudCB0byB0aGUgc2VydmVyLlxuICAgKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VtYWlsanMvZW1haWxqcy1pbWFwLWhhbmRsZXIgZm9yIHJlcXVlc3Qgc3RydWN0dXJlLlxuICAgKiBEbyBub3QgcHJvdmlkZSBhIHRhZyBwcm9wZXJ0eSwgaXQgd2lsbCBiZSBzZXQgYnkgdGhlIHF1ZXVlIG1hbmFnZXIuXG4gICAqXG4gICAqIFRvIGNhdGNoIHVudGFnZ2VkIHJlc3BvbnNlcyB1c2UgYWNjZXB0VW50YWdnZWQgcHJvcGVydHkuIEZvciBleGFtcGxlLCBpZlxuICAgKiB0aGUgdmFsdWUgZm9yIGl0IGlzICdGRVRDSCcgdGhlbiB0aGUgcmVwb25zZSBpbmNsdWRlcyAncGF5bG9hZC5GRVRDSCcgcHJvcGVydHlcbiAgICogdGhhdCBpcyBhbiBhcnJheSBpbmNsdWRpbmcgYWxsIGxpc3RlZCAqIEZFVENIIHJlc3BvbnNlcy5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHJlcXVlc3QgU3RydWN0dXJlZCByZXF1ZXN0IG9iamVjdFxuICAgKiBAcGFyYW0ge0FycmF5fSBhY2NlcHRVbnRhZ2dlZCBhIGxpc3Qgb2YgdW50YWdnZWQgcmVzcG9uc2VzIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiAncGF5bG9hZCcgcHJvcGVydHlcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBPcHRpb25hbCBkYXRhIGZvciB0aGUgY29tbWFuZCBwYXlsb2FkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZSB3YXMgcmVjZWl2ZWRcbiAgICovXG4gIGVucXVldWVDb21tYW5kIChyZXF1ZXN0LCBhY2NlcHRVbnRhZ2dlZCwgb3B0aW9ucykge1xuICAgIGlmICh0eXBlb2YgcmVxdWVzdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJlcXVlc3QgPSB7XG4gICAgICAgIGNvbW1hbmQ6IHJlcXVlc3RcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhY2NlcHRVbnRhZ2dlZCA9IFtdLmNvbmNhdChhY2NlcHRVbnRhZ2dlZCB8fCBbXSkubWFwKCh1bnRhZ2dlZCkgPT4gKHVudGFnZ2VkIHx8ICcnKS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkudHJpbSgpKVxuXG4gICAgdmFyIHRhZyA9ICdXJyArICgrK3RoaXMuX3RhZ0NvdW50ZXIpXG4gICAgcmVxdWVzdC50YWcgPSB0YWdcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB2YXIgZGF0YSA9IHtcbiAgICAgICAgdGFnOiB0YWcsXG4gICAgICAgIHJlcXVlc3Q6IHJlcXVlc3QsXG4gICAgICAgIHBheWxvYWQ6IGFjY2VwdFVudGFnZ2VkLmxlbmd0aCA/IHt9IDogdW5kZWZpbmVkLFxuICAgICAgICBjYWxsYmFjazogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNFcnJvcihyZXNwb25zZSkpIHtcbiAgICAgICAgICAgIHJldHVybiByZWplY3QocmVzcG9uc2UpXG4gICAgICAgICAgfSBlbHNlIGlmIChbJ05PJywgJ0JBRCddLmluZGV4T2YocHJvcE9yKCcnLCAnY29tbWFuZCcsIHJlc3BvbnNlKS50b1VwcGVyQ2FzZSgpLnRyaW0oKSkgPj0gMCkge1xuICAgICAgICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKHJlc3BvbnNlLmh1bWFuUmVhZGFibGUgfHwgJ0Vycm9yJylcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5jb2RlKSB7XG4gICAgICAgICAgICAgIGVycm9yLmNvZGUgPSByZXNwb25zZS5jb2RlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycm9yKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gYXBwbHkgYW55IGFkZGl0aW9uYWwgb3B0aW9ucyB0byB0aGUgY29tbWFuZFxuICAgICAgT2JqZWN0LmtleXMob3B0aW9ucyB8fCB7fSkuZm9yRWFjaCgoa2V5KSA9PiB7IGRhdGFba2V5XSA9IG9wdGlvbnNba2V5XSB9KVxuXG4gICAgICBhY2NlcHRVbnRhZ2dlZC5mb3JFYWNoKChjb21tYW5kKSA9PiB7IGRhdGEucGF5bG9hZFtjb21tYW5kXSA9IFtdIH0pXG5cbiAgICAgIC8vIGlmIHdlJ3JlIGluIHByaW9yaXR5IG1vZGUgKGkuZS4gd2UgcmFuIGNvbW1hbmRzIGluIGEgcHJlY2hlY2spLFxuICAgICAgLy8gcXVldWUgYW55IGNvbW1hbmRzIEJFRk9SRSB0aGUgY29tbWFuZCB0aGF0IGNvbnRpYW5lZCB0aGUgcHJlY2hlY2ssXG4gICAgICAvLyBvdGhlcndpc2UganVzdCBxdWV1ZSBjb21tYW5kIGFzIHVzdWFsXG4gICAgICB2YXIgaW5kZXggPSBkYXRhLmN0eCA/IHRoaXMuX2NsaWVudFF1ZXVlLmluZGV4T2YoZGF0YS5jdHgpIDogLTFcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIGRhdGEudGFnICs9ICcucCdcbiAgICAgICAgZGF0YS5yZXF1ZXN0LnRhZyArPSAnLnAnXG4gICAgICAgIHRoaXMuX2NsaWVudFF1ZXVlLnNwbGljZShpbmRleCwgMCwgZGF0YSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2NsaWVudFF1ZXVlLnB1c2goZGF0YSlcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2NhblNlbmQpIHtcbiAgICAgICAgdGhpcy5fc2VuZFJlcXVlc3QoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGNvbW1hbmRzXG4gICAqIEBwYXJhbSBjdHhcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBnZXRQcmV2aW91c2x5UXVldWVkIChjb21tYW5kcywgY3R4KSB7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IHRoaXMuX2NsaWVudFF1ZXVlLmluZGV4T2YoY3R4KSAtIDFcblxuICAgIC8vIHNlYXJjaCBiYWNrd2FyZHMgZm9yIHRoZSBjb21tYW5kcyBhbmQgcmV0dXJuIHRoZSBmaXJzdCBmb3VuZFxuICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpID49IDA7IGktLSkge1xuICAgICAgaWYgKGlzTWF0Y2godGhpcy5fY2xpZW50UXVldWVbaV0pKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jbGllbnRRdWV1ZVtpXVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGFsc28gY2hlY2sgY3VycmVudCBjb21tYW5kIGlmIG5vIFNFTEVDVCBpcyBxdWV1ZWRcbiAgICBpZiAoaXNNYXRjaCh0aGlzLl9jdXJyZW50Q29tbWFuZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50Q29tbWFuZFxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuXG4gICAgZnVuY3Rpb24gaXNNYXRjaCAoZGF0YSkge1xuICAgICAgcmV0dXJuIGRhdGEgJiYgZGF0YS5yZXF1ZXN0ICYmIGNvbW1hbmRzLmluZGV4T2YoZGF0YS5yZXF1ZXN0LmNvbW1hbmQpID49IDBcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBkYXRhIHRvIHRoZSBUQ1Agc29ja2V0XG4gICAqIEFybXMgYSB0aW1lb3V0IHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyIFBheWxvYWRcbiAgICovXG4gIHNlbmQgKHN0cikge1xuICAgIGNvbnN0IGJ1ZmZlciA9IHRvVHlwZWRBcnJheShzdHIpLmJ1ZmZlclxuICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLnRpbWVvdXRTb2NrZXRMb3dlckJvdW5kICsgTWF0aC5mbG9vcihidWZmZXIuYnl0ZUxlbmd0aCAqIHRoaXMudGltZW91dFNvY2tldE11bHRpcGxpZXIpXG5cbiAgICBjbGVhclRpbWVvdXQodGhpcy5fc29ja2V0VGltZW91dFRpbWVyKSAvLyBjbGVhciBwZW5kaW5nIHRpbWVvdXRzXG4gICAgdGhpcy5fc29ja2V0VGltZW91dFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLl9vbkVycm9yKG5ldyBFcnJvcignIFNvY2tldCB0aW1lZCBvdXQhJykpLCB0aW1lb3V0KSAvLyBhcm0gdGhlIG5leHQgdGltZW91dFxuXG4gICAgaWYgKHRoaXMuY29tcHJlc3NlZCkge1xuICAgICAgdGhpcy5fc2VuZENvbXByZXNzZWQoYnVmZmVyKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNvY2tldC5zZW5kKGJ1ZmZlcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgZ2xvYmFsIGhhbmRsZXIgZm9yIGFuIHVudGFnZ2VkIHJlc3BvbnNlLiBJZiBjdXJyZW50bHkgcHJvY2Vzc2VkIGNvbW1hbmRcbiAgICogaGFzIG5vdCBsaXN0ZWQgdW50YWdnZWQgY29tbWFuZCBpdCBpcyBmb3J3YXJkZWQgdG8gdGhlIGdsb2JhbCBoYW5kbGVyLiBVc2VmdWxcbiAgICogd2l0aCBFWFBVTkdFLCBFWElTVFMgZXRjLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY29tbWFuZCBVbnRhZ2dlZCBjb21tYW5kIG5hbWVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb24gd2l0aCByZXNwb25zZSBvYmplY3QgYW5kIGNvbnRpbnVlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqL1xuICBzZXRIYW5kbGVyIChjb21tYW5kLCBjYWxsYmFjaykge1xuICAgIHRoaXMuX2dsb2JhbEFjY2VwdFVudGFnZ2VkW2NvbW1hbmQudG9VcHBlckNhc2UoKS50cmltKCldID0gY2FsbGJhY2tcbiAgfVxuXG4gIC8vIElOVEVSTkFMIEVWRU5UU1xuXG4gIC8qKlxuICAgKiBFcnJvciBoYW5kbGVyIGZvciB0aGUgc29ja2V0XG4gICAqXG4gICAqIEBldmVudFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnQgRXZlbnQgb2JqZWN0LiBTZWUgZXZ0LmRhdGEgZm9yIHRoZSBlcnJvclxuICAgKi9cbiAgX29uRXJyb3IgKGV2dCkge1xuICAgIHZhciBlcnJvclxuICAgIGlmICh0aGlzLmlzRXJyb3IoZXZ0KSkge1xuICAgICAgZXJyb3IgPSBldnRcbiAgICB9IGVsc2UgaWYgKGV2dCAmJiB0aGlzLmlzRXJyb3IoZXZ0LmRhdGEpKSB7XG4gICAgICBlcnJvciA9IGV2dC5kYXRhXG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9yID0gbmV3IEVycm9yKChldnQgJiYgZXZ0LmRhdGEgJiYgZXZ0LmRhdGEubWVzc2FnZSkgfHwgZXZ0LmRhdGEgfHwgZXZ0IHx8ICdFcnJvcicpXG4gICAgfVxuXG4gICAgdGhpcy5sb2dnZXIuZXJyb3IoZXJyb3IpXG5cbiAgICAvLyBhbHdheXMgY2FsbCBvbmVycm9yIGNhbGxiYWNrLCBubyBtYXR0ZXIgaWYgY2xvc2UoKSBzdWNjZWVkcyBvciBmYWlsc1xuICAgIHRoaXMuY2xvc2UoZXJyb3IpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5vbmVycm9yICYmIHRoaXMub25lcnJvcihlcnJvcilcbiAgICB9LCAoKSA9PiB7XG4gICAgICB0aGlzLm9uZXJyb3IgJiYgdGhpcy5vbmVycm9yKGVycm9yKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgaW5jb21pbmcgZGF0YSBmcm9tIHRoZSBzZXJ2ZXIuIFRoZSBkYXRhIGlzIHNlbnQgaW4gYXJiaXRyYXJ5XG4gICAqIGNodW5rcyBhbmQgY2FuJ3QgYmUgdXNlZCBkaXJlY3RseSBzbyB0aGlzIGZ1bmN0aW9uIG1ha2VzIHN1cmUgdGhlIGRhdGFcbiAgICogaXMgc3BsaXQgaW50byBjb21wbGV0ZSBsaW5lcyBiZWZvcmUgdGhlIGRhdGEgaXMgcGFzc2VkIHRvIHRoZSBjb21tYW5kXG4gICAqIGhhbmRsZXJcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqL1xuICBfb25EYXRhIChldnQpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fc29ja2V0VGltZW91dFRpbWVyKSAvLyByZXNldCB0aGUgdGltZW91dCBvbiBlYWNoIGRhdGEgcGFja2V0XG4gICAgY29uc3QgdGltZW91dCA9IHRoaXMudGltZW91dFNvY2tldExvd2VyQm91bmQgKyBNYXRoLmZsb29yKDQwOTYgKiB0aGlzLnRpbWVvdXRTb2NrZXRNdWx0aXBsaWVyKSAvLyBtYXggcGFja2V0IHNpemUgaXMgNDA5NiBieXRlc1xuICAgIHRoaXMuX3NvY2tldFRpbWVvdXRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5fb25FcnJvcihuZXcgRXJyb3IoJyBTb2NrZXQgdGltZWQgb3V0IScpKSwgdGltZW91dClcblxuICAgIHRoaXMuX2luY29taW5nQnVmZmVycy5wdXNoKG5ldyBVaW50OEFycmF5KGV2dC5kYXRhKSkgLy8gYXBwZW5kIHRvIHRoZSBpbmNvbWluZyBidWZmZXJcbiAgICB0aGlzLl9wYXJzZUluY29taW5nQ29tbWFuZHModGhpcy5faXRlcmF0ZUluY29taW5nQnVmZmVyKCkpIC8vIENvbnN1bWUgdGhlIGluY29taW5nIGJ1ZmZlclxuICB9XG5cbiAgKiBfaXRlcmF0ZUluY29taW5nQnVmZmVyICgpIHtcbiAgICBsZXQgYnVmID0gdGhpcy5faW5jb21pbmdCdWZmZXJzW3RoaXMuX2luY29taW5nQnVmZmVycy5sZW5ndGggLSAxXSB8fCBbXVxuICAgIGxldCBpID0gMFxuXG4gICAgLy8gbG9vcCBpbnZhcmlhbnQ6XG4gICAgLy8gICB0aGlzLl9pbmNvbWluZ0J1ZmZlcnMgc3RhcnRzIHdpdGggdGhlIGJlZ2lubmluZyBvZiBpbmNvbWluZyBjb21tYW5kLlxuICAgIC8vICAgYnVmIGlzIHNob3J0aGFuZCBmb3IgbGFzdCBlbGVtZW50IG9mIHRoaXMuX2luY29taW5nQnVmZmVycy5cbiAgICAvLyAgIGJ1ZlswLi5pLTFdIGlzIHBhcnQgb2YgaW5jb21pbmcgY29tbWFuZC5cbiAgICB3aGlsZSAoaSA8IGJ1Zi5sZW5ndGgpIHtcbiAgICAgIHN3aXRjaCAodGhpcy5fYnVmZmVyU3RhdGUpIHtcbiAgICAgICAgY2FzZSBCVUZGRVJfU1RBVEVfTElURVJBTDpcbiAgICAgICAgICBjb25zdCBkaWZmID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIGksIHRoaXMuX2xpdGVyYWxSZW1haW5pbmcpXG4gICAgICAgICAgdGhpcy5fbGl0ZXJhbFJlbWFpbmluZyAtPSBkaWZmXG4gICAgICAgICAgaSArPSBkaWZmXG4gICAgICAgICAgaWYgKHRoaXMuX2xpdGVyYWxSZW1haW5pbmcgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2J1ZmZlclN0YXRlID0gQlVGRkVSX1NUQVRFX0RFRkFVTFRcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIEJVRkZFUl9TVEFURV9QT1NTSUJMWV9MSVRFUkFMX0xFTkdUSF8yOlxuICAgICAgICAgIGlmIChpIDwgYnVmLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGJ1ZltpXSA9PT0gQ0FSUklBR0VfUkVUVVJOKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2xpdGVyYWxSZW1haW5pbmcgPSBOdW1iZXIoZnJvbVR5cGVkQXJyYXkodGhpcy5fbGVuZ3RoQnVmZmVyKSkgKyAyIC8vIGZvciBDUkxGXG4gICAgICAgICAgICAgIHRoaXMuX2J1ZmZlclN0YXRlID0gQlVGRkVSX1NUQVRFX0xJVEVSQUxcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuX2J1ZmZlclN0YXRlID0gQlVGRkVSX1NUQVRFX0RFRkFVTFRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9sZW5ndGhCdWZmZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIEJVRkZFUl9TVEFURV9QT1NTSUJMWV9MSVRFUkFMX0xFTkdUSF8xOlxuICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gaVxuICAgICAgICAgIHdoaWxlIChpIDwgYnVmLmxlbmd0aCAmJiBidWZbaV0gPj0gNDggJiYgYnVmW2ldIDw9IDU3KSB7IC8vIGRpZ2l0c1xuICAgICAgICAgICAgaSsrXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdGFydCAhPT0gaSkge1xuICAgICAgICAgICAgY29uc3QgbGF0ZXN0ID0gYnVmLnN1YmFycmF5KHN0YXJ0LCBpKVxuICAgICAgICAgICAgY29uc3QgcHJldkJ1ZiA9IHRoaXMuX2xlbmd0aEJ1ZmZlclxuICAgICAgICAgICAgdGhpcy5fbGVuZ3RoQnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkocHJldkJ1Zi5sZW5ndGggKyBsYXRlc3QubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5fbGVuZ3RoQnVmZmVyLnNldChwcmV2QnVmKVxuICAgICAgICAgICAgdGhpcy5fbGVuZ3RoQnVmZmVyLnNldChsYXRlc3QsIHByZXZCdWYubGVuZ3RoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaSA8IGJ1Zi5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9sZW5ndGhCdWZmZXIubGVuZ3RoID4gMCAmJiBidWZbaV0gPT09IFJJR0hUX0NVUkxZX0JSQUNLRVQpIHtcbiAgICAgICAgICAgICAgdGhpcy5fYnVmZmVyU3RhdGUgPSBCVUZGRVJfU1RBVEVfUE9TU0lCTFlfTElURVJBTF9MRU5HVEhfMlxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2xlbmd0aEJ1ZmZlclxuICAgICAgICAgICAgICB0aGlzLl9idWZmZXJTdGF0ZSA9IEJVRkZFUl9TVEFURV9ERUZBVUxUXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpKytcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIGZpbmQgbGl0ZXJhbCBsZW5ndGhcbiAgICAgICAgICBjb25zdCBsZWZ0SWR4ID0gYnVmLmluZGV4T2YoTEVGVF9DVVJMWV9CUkFDS0VULCBpKVxuICAgICAgICAgIGlmIChsZWZ0SWR4ID4gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IGxlZnRPZkxlZnRDdXJseSA9IG5ldyBVaW50OEFycmF5KGJ1Zi5idWZmZXIsIGksIGxlZnRJZHggLSBpKVxuICAgICAgICAgICAgaWYgKGxlZnRPZkxlZnRDdXJseS5pbmRleE9mKExJTkVfRkVFRCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgIGkgPSBsZWZ0SWR4ICsgMVxuICAgICAgICAgICAgICB0aGlzLl9sZW5ndGhCdWZmZXIgPSBuZXcgVWludDhBcnJheSgwKVxuICAgICAgICAgICAgICB0aGlzLl9idWZmZXJTdGF0ZSA9IEJVRkZFUl9TVEFURV9QT1NTSUJMWV9MSVRFUkFMX0xFTkdUSF8xXG4gICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gZmluZCBlbmQgb2YgY29tbWFuZFxuICAgICAgICAgIGNvbnN0IExGaWR4ID0gYnVmLmluZGV4T2YoTElORV9GRUVELCBpKVxuICAgICAgICAgIGlmIChMRmlkeCA+IC0xKSB7XG4gICAgICAgICAgICBpZiAoTEZpZHggPCBidWYubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICB0aGlzLl9pbmNvbWluZ0J1ZmZlcnNbdGhpcy5faW5jb21pbmdCdWZmZXJzLmxlbmd0aCAtIDFdID0gbmV3IFVpbnQ4QXJyYXkoYnVmLmJ1ZmZlciwgMCwgTEZpZHggKyAxKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY29tbWFuZExlbmd0aCA9IHRoaXMuX2luY29taW5nQnVmZmVycy5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHByZXYgKyBjdXJyLmxlbmd0aCwgMCkgLSAyIC8vIDIgZm9yIENSTEZcbiAgICAgICAgICAgIGNvbnN0IGNvbW1hbmQgPSBuZXcgVWludDhBcnJheShjb21tYW5kTGVuZ3RoKVxuICAgICAgICAgICAgbGV0IGluZGV4ID0gMFxuICAgICAgICAgICAgd2hpbGUgKHRoaXMuX2luY29taW5nQnVmZmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGxldCB1aW50OEFycmF5ID0gdGhpcy5faW5jb21pbmdCdWZmZXJzLnNoaWZ0KClcblxuICAgICAgICAgICAgICBjb25zdCByZW1haW5pbmdMZW5ndGggPSBjb21tYW5kTGVuZ3RoIC0gaW5kZXhcbiAgICAgICAgICAgICAgaWYgKHVpbnQ4QXJyYXkubGVuZ3RoID4gcmVtYWluaW5nTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhjZXNzTGVuZ3RoID0gdWludDhBcnJheS5sZW5ndGggLSByZW1haW5pbmdMZW5ndGhcbiAgICAgICAgICAgICAgICB1aW50OEFycmF5ID0gdWludDhBcnJheS5zdWJhcnJheSgwLCAtZXhjZXNzTGVuZ3RoKVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2luY29taW5nQnVmZmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9pbmNvbWluZ0J1ZmZlcnMgPSBbXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb21tYW5kLnNldCh1aW50OEFycmF5LCBpbmRleClcbiAgICAgICAgICAgICAgaW5kZXggKz0gdWludDhBcnJheS5sZW5ndGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHlpZWxkIGNvbW1hbmRcbiAgICAgICAgICAgIGlmIChMRmlkeCA8IGJ1Zi5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGJ1Zi5zdWJhcnJheShMRmlkeCArIDEpKVxuICAgICAgICAgICAgICB0aGlzLl9pbmNvbWluZ0J1ZmZlcnMucHVzaChidWYpXG4gICAgICAgICAgICAgIGkgPSAwXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBjbGVhciB0aGUgdGltZW91dCB3aGVuIGFuIGVudGlyZSBjb21tYW5kIGhhcyBhcnJpdmVkXG4gICAgICAgICAgICAgIC8vIGFuZCBub3Qgd2FpdGluZyBvbiBtb3JlIGRhdGEgZm9yIG5leHQgY29tbWFuZFxuICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fc29ja2V0VGltZW91dFRpbWVyKVxuICAgICAgICAgICAgICB0aGlzLl9zb2NrZXRUaW1lb3V0VGltZXIgPSBudWxsXG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUFJJVkFURSBNRVRIT0RTXG5cbiAgLyoqXG4gICAqIFByb2Nlc3NlcyBhIGNvbW1hbmQgZnJvbSB0aGUgcXVldWUuIFRoZSBjb21tYW5kIGlzIHBhcnNlZCBhbmQgZmVlZGVkIHRvIGEgaGFuZGxlclxuICAgKi9cbiAgX3BhcnNlSW5jb21pbmdDb21tYW5kcyAoY29tbWFuZHMpIHtcbiAgICBmb3IgKHZhciBjb21tYW5kIG9mIGNvbW1hbmRzKSB7XG4gICAgICB0aGlzLl9jbGVhcklkbGUoKVxuXG4gICAgICAvKlxuICAgICAgICogVGhlIFwiK1wiLXRhZ2dlZCByZXNwb25zZSBpcyBhIHNwZWNpYWwgY2FzZTpcbiAgICAgICAqIEVpdGhlciB0aGUgc2VydmVyIGNhbiBhc2tzIGZvciB0aGUgbmV4dCBjaHVuayBvZiBkYXRhLCBlLmcuIGZvciB0aGUgQVVUSEVOVElDQVRFIGNvbW1hbmQuXG4gICAgICAgKlxuICAgICAgICogT3IgdGhlcmUgd2FzIGFuIGVycm9yIGluIHRoZSBYT0FVVEgyIGF1dGhlbnRpY2F0aW9uLCBmb3Igd2hpY2ggU0FTTCBpbml0aWFsIGNsaWVudCByZXNwb25zZSBleHRlbnNpb25cbiAgICAgICAqIGRpY3RhdGVzIHRoZSBjbGllbnQgc2VuZHMgYW4gZW1wdHkgRU9MIHJlc3BvbnNlIHRvIHRoZSBjaGFsbGVuZ2UgY29udGFpbmluZyB0aGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgICAqXG4gICAgICAgKiBEZXRhaWxzIG9uIFwiK1wiLXRhZ2dlZCByZXNwb25zZTpcbiAgICAgICAqICAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM1MDEjc2VjdGlvbi0yLjIuMVxuICAgICAgICovXG4gICAgICAvL1xuICAgICAgaWYgKGNvbW1hbmRbMF0gPT09IEFTQ0lJX1BMVVMpIHtcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRDb21tYW5kLmRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgLy8gZmVlZCB0aGUgbmV4dCBjaHVuayBvZiBkYXRhXG4gICAgICAgICAgdmFyIGNodW5rID0gdGhpcy5fY3VycmVudENvbW1hbmQuZGF0YS5zaGlmdCgpXG4gICAgICAgICAgY2h1bmsgKz0gKCF0aGlzLl9jdXJyZW50Q29tbWFuZC5kYXRhLmxlbmd0aCA/IEVPTCA6ICcnKSAvLyBFT0wgaWYgdGhlcmUncyBub3RoaW5nIG1vcmUgdG8gc2VuZFxuICAgICAgICAgIHRoaXMuc2VuZChjaHVuaylcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9jdXJyZW50Q29tbWFuZC5lcnJvclJlc3BvbnNlRXhwZWN0c0VtcHR5TGluZSkge1xuICAgICAgICAgIHRoaXMuc2VuZChFT0wpIC8vIFhPQVVUSDIgZW1wdHkgcmVzcG9uc2UsIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgd2hlbiBzZXJ2ZXIgY29udGludWVzIHdpdGggTk8gcmVzcG9uc2VcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB2YXIgcmVzcG9uc2VcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHZhbHVlQXNTdHJpbmcgPSB0aGlzLl9jdXJyZW50Q29tbWFuZC5yZXF1ZXN0ICYmIHRoaXMuX2N1cnJlbnRDb21tYW5kLnJlcXVlc3QudmFsdWVBc1N0cmluZ1xuICAgICAgICByZXNwb25zZSA9IHBhcnNlcihjb21tYW5kLCB7IHZhbHVlQXNTdHJpbmcgfSlcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ1M6JywgKCkgPT4gY29tcGlsZXIocmVzcG9uc2UsIGZhbHNlLCB0cnVlKSlcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgaW1hcCBjb21tYW5kIScsIHJlc3BvbnNlKVxuICAgICAgICByZXR1cm4gdGhpcy5fb25FcnJvcihlKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9wcm9jZXNzUmVzcG9uc2UocmVzcG9uc2UpXG4gICAgICB0aGlzLl9oYW5kbGVSZXNwb25zZShyZXNwb25zZSlcblxuICAgICAgLy8gZmlyc3QgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLCBjb25uZWN0aW9uIGlzIG5vdyB1c2FibGVcbiAgICAgIGlmICghdGhpcy5fY29ubmVjdGlvblJlYWR5KSB7XG4gICAgICAgIHRoaXMuX2Nvbm5lY3Rpb25SZWFkeSA9IHRydWVcbiAgICAgICAgdGhpcy5vbnJlYWR5ICYmIHRoaXMub25yZWFkeSgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZlZWRzIGEgcGFyc2VkIHJlc3BvbnNlIG9iamVjdCB0byBhbiBhcHByb3ByaWF0ZSBoYW5kbGVyXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSByZXNwb25zZSBQYXJzZWQgY29tbWFuZCBvYmplY3RcbiAgICovXG4gIF9oYW5kbGVSZXNwb25zZSAocmVzcG9uc2UpIHtcbiAgICB2YXIgY29tbWFuZCA9IHByb3BPcignJywgJ2NvbW1hbmQnLCByZXNwb25zZSkudG9VcHBlckNhc2UoKS50cmltKClcblxuICAgIGlmICghdGhpcy5fY3VycmVudENvbW1hbmQpIHtcbiAgICAgIC8vIHVuc29saWNpdGVkIHVudGFnZ2VkIHJlc3BvbnNlXG4gICAgICBpZiAocmVzcG9uc2UudGFnID09PSAnKicgJiYgY29tbWFuZCBpbiB0aGlzLl9nbG9iYWxBY2NlcHRVbnRhZ2dlZCkge1xuICAgICAgICB0aGlzLl9nbG9iYWxBY2NlcHRVbnRhZ2dlZFtjb21tYW5kXShyZXNwb25zZSlcbiAgICAgICAgdGhpcy5fY2FuU2VuZCA9IHRydWVcbiAgICAgICAgdGhpcy5fc2VuZFJlcXVlc3QoKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5fY3VycmVudENvbW1hbmQucGF5bG9hZCAmJiByZXNwb25zZS50YWcgPT09ICcqJyAmJiBjb21tYW5kIGluIHRoaXMuX2N1cnJlbnRDb21tYW5kLnBheWxvYWQpIHtcbiAgICAgIC8vIGV4cGVjdGVkIHVudGFnZ2VkIHJlc3BvbnNlXG4gICAgICB0aGlzLl9jdXJyZW50Q29tbWFuZC5wYXlsb2FkW2NvbW1hbmRdLnB1c2gocmVzcG9uc2UpXG4gICAgfSBlbHNlIGlmIChyZXNwb25zZS50YWcgPT09ICcqJyAmJiBjb21tYW5kIGluIHRoaXMuX2dsb2JhbEFjY2VwdFVudGFnZ2VkKSB7XG4gICAgICAvLyB1bmV4cGVjdGVkIHVudGFnZ2VkIHJlc3BvbnNlXG4gICAgICB0aGlzLl9nbG9iYWxBY2NlcHRVbnRhZ2dlZFtjb21tYW5kXShyZXNwb25zZSlcbiAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnRhZyA9PT0gdGhpcy5fY3VycmVudENvbW1hbmQudGFnKSB7XG4gICAgICAvLyB0YWdnZWQgcmVzcG9uc2VcbiAgICAgIGlmICh0aGlzLl9jdXJyZW50Q29tbWFuZC5wYXlsb2FkICYmIE9iamVjdC5rZXlzKHRoaXMuX2N1cnJlbnRDb21tYW5kLnBheWxvYWQpLmxlbmd0aCkge1xuICAgICAgICByZXNwb25zZS5wYXlsb2FkID0gdGhpcy5fY3VycmVudENvbW1hbmQucGF5bG9hZFxuICAgICAgfVxuICAgICAgdGhpcy5fY3VycmVudENvbW1hbmQuY2FsbGJhY2socmVzcG9uc2UpXG4gICAgICB0aGlzLl9jYW5TZW5kID0gdHJ1ZVxuICAgICAgdGhpcy5fc2VuZFJlcXVlc3QoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIGNvbW1hbmQgZnJvbSBjbGllbnQgcXVldWUgdG8gdGhlIHNlcnZlci5cbiAgICovXG4gIF9zZW5kUmVxdWVzdCAoKSB7XG4gICAgaWYgKCF0aGlzLl9jbGllbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9lbnRlcklkbGUoKVxuICAgIH1cbiAgICB0aGlzLl9jbGVhcklkbGUoKVxuXG4gICAgLy8gYW4gb3BlcmF0aW9uIHdhcyBtYWRlIGluIHRoZSBwcmVjaGVjaywgbm8gbmVlZCB0byByZXN0YXJ0IHRoZSBxdWV1ZSBtYW51YWxseVxuICAgIHRoaXMuX3Jlc3RhcnRRdWV1ZSA9IGZhbHNlXG5cbiAgICB2YXIgY29tbWFuZCA9IHRoaXMuX2NsaWVudFF1ZXVlWzBdXG4gICAgaWYgKHR5cGVvZiBjb21tYW5kLnByZWNoZWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyByZW1lbWJlciB0aGUgY29udGV4dFxuICAgICAgdmFyIGNvbnRleHQgPSBjb21tYW5kXG4gICAgICB2YXIgcHJlY2hlY2sgPSBjb250ZXh0LnByZWNoZWNrXG4gICAgICBkZWxldGUgY29udGV4dC5wcmVjaGVja1xuXG4gICAgICAvLyB3ZSBuZWVkIHRvIHJlc3RhcnQgdGhlIHF1ZXVlIGhhbmRsaW5nIGlmIG5vIG9wZXJhdGlvbiB3YXMgbWFkZSBpbiB0aGUgcHJlY2hlY2tcbiAgICAgIHRoaXMuX3Jlc3RhcnRRdWV1ZSA9IHRydWVcblxuICAgICAgLy8gaW52b2tlIHRoZSBwcmVjaGVjayBjb21tYW5kIGFuZCByZXN1bWUgbm9ybWFsIG9wZXJhdGlvbiBhZnRlciB0aGUgcHJvbWlzZSByZXNvbHZlc1xuICAgICAgcHJlY2hlY2soY29udGV4dCkudGhlbigoKSA9PiB7XG4gICAgICAgIC8vIHdlJ3JlIGRvbmUgd2l0aCB0aGUgcHJlY2hlY2tcbiAgICAgICAgaWYgKHRoaXMuX3Jlc3RhcnRRdWV1ZSkge1xuICAgICAgICAgIC8vIHdlIG5lZWQgdG8gcmVzdGFydCB0aGUgcXVldWUgaGFuZGxpbmdcbiAgICAgICAgICB0aGlzLl9zZW5kUmVxdWVzdCgpXG4gICAgICAgIH1cbiAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgLy8gcHJlY2hlY2sgZmFpbGVkLCBzbyB3ZSByZW1vdmUgdGhlIGluaXRpYWwgY29tbWFuZFxuICAgICAgICAvLyBmcm9tIHRoZSBxdWV1ZSwgaW52b2tlIGl0cyBjYWxsYmFjayBhbmQgcmVzdW1lIG5vcm1hbCBvcGVyYXRpb25cbiAgICAgICAgbGV0IGNtZFxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2NsaWVudFF1ZXVlLmluZGV4T2YoY29udGV4dClcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICBjbWQgPSB0aGlzLl9jbGllbnRRdWV1ZS5zcGxpY2UoaW5kZXgsIDEpWzBdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNtZCAmJiBjbWQuY2FsbGJhY2spIHtcbiAgICAgICAgICBjbWQuY2FsbGJhY2soZXJyKVxuICAgICAgICAgIHRoaXMuX2NhblNlbmQgPSB0cnVlXG4gICAgICAgICAgdGhpcy5fcGFyc2VJbmNvbWluZ0NvbW1hbmRzKHRoaXMuX2l0ZXJhdGVJbmNvbWluZ0J1ZmZlcigpKSAvLyBDb25zdW1lIHRoZSByZXN0IG9mIHRoZSBpbmNvbWluZyBidWZmZXJcbiAgICAgICAgICB0aGlzLl9zZW5kUmVxdWVzdCgpIC8vIGNvbnRpbnVlIHNlbmRpbmdcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2NhblNlbmQgPSBmYWxzZVxuICAgIHRoaXMuX2N1cnJlbnRDb21tYW5kID0gdGhpcy5fY2xpZW50UXVldWUuc2hpZnQoKVxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX2N1cnJlbnRDb21tYW5kLmRhdGEgPSBjb21waWxlcih0aGlzLl9jdXJyZW50Q29tbWFuZC5yZXF1ZXN0LCB0cnVlKVxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0M6JywgKCkgPT4gY29tcGlsZXIodGhpcy5fY3VycmVudENvbW1hbmQucmVxdWVzdCwgZmFsc2UsIHRydWUpKSAvLyBleGNsdWRlcyBwYXNzd29yZHMgZXRjLlxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdFcnJvciBjb21waWxpbmcgaW1hcCBjb21tYW5kIScsIHRoaXMuX2N1cnJlbnRDb21tYW5kLnJlcXVlc3QpXG4gICAgICByZXR1cm4gdGhpcy5fb25FcnJvcihuZXcgRXJyb3IoJ0Vycm9yIGNvbXBpbGluZyBpbWFwIGNvbW1hbmQhJykpXG4gICAgfVxuXG4gICAgdmFyIGRhdGEgPSB0aGlzLl9jdXJyZW50Q29tbWFuZC5kYXRhLnNoaWZ0KClcblxuICAgIHRoaXMuc2VuZChkYXRhICsgKCF0aGlzLl9jdXJyZW50Q29tbWFuZC5kYXRhLmxlbmd0aCA/IEVPTCA6ICcnKSlcbiAgICByZXR1cm4gdGhpcy53YWl0RHJhaW5cbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBvbmlkbGUsIG5vdGluZyB0byBkbyBjdXJyZW50bHlcbiAgICovXG4gIF9lbnRlcklkbGUgKCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl9pZGxlVGltZXIpXG4gICAgdGhpcy5faWRsZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiAodGhpcy5vbmlkbGUgJiYgdGhpcy5vbmlkbGUoKSksIHRoaXMudGltZW91dEVudGVySWRsZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWwgaWRsZSB0aW1lclxuICAgKi9cbiAgX2NsZWFySWRsZSAoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX2lkbGVUaW1lcilcbiAgICB0aGlzLl9pZGxlVGltZXIgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHByb2Nlc3NlcyBhIHJlc3BvbnNlIGludG8gYW4gZWFzaWVyIHRvIGhhbmRsZSBmb3JtYXQuXG4gICAqIEFkZCB1bnRhZ2dlZCBudW1iZXJlZCByZXNwb25zZXMgKGUuZy4gRkVUQ0gpIGludG8gYSBuaWNlbHkgZmVhc2libGUgZm9ybVxuICAgKiBDaGVja3MgaWYgYSByZXNwb25zZSBpbmNsdWRlcyBvcHRpb25hbCByZXNwb25zZSBjb2Rlc1xuICAgKiBhbmQgY29waWVzIHRoZXNlIGludG8gc2VwYXJhdGUgcHJvcGVydGllcy4gRm9yIGV4YW1wbGUgdGhlXG4gICAqIGZvbGxvd2luZyByZXNwb25zZSBpbmNsdWRlcyBhIGNhcGFiaWxpdHkgbGlzdGluZyBhbmQgYSBodW1hblxuICAgKiByZWFkYWJsZSBtZXNzYWdlOlxuICAgKlxuICAgKiAgICAgKiBPSyBbQ0FQQUJJTElUWSBJRCBOQU1FU1BBQ0VdIEFsbCByZWFkeVxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBhZGRzIGEgJ2NhcGFiaWxpdHknIHByb3BlcnR5IHdpdGggYW4gYXJyYXkgdmFsdWUgWydJRCcsICdOQU1FU1BBQ0UnXVxuICAgKiB0byB0aGUgcmVzcG9uc2Ugb2JqZWN0LiBBZGRpdGlvbmFsbHkgJ0FsbCByZWFkeScgaXMgYWRkZWQgYXMgJ2h1bWFuUmVhZGFibGUnIHByb3BlcnR5LlxuICAgKlxuICAgKiBTZWUgcG9zc2libGVtIElNQVAgUmVzcG9uc2UgQ29kZXMgYXQgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzU1MzBcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHJlc3BvbnNlIFBhcnNlZCByZXNwb25zZSBvYmplY3RcbiAgICovXG4gIF9wcm9jZXNzUmVzcG9uc2UgKHJlc3BvbnNlKSB7XG4gICAgY29uc3QgY29tbWFuZCA9IHByb3BPcignJywgJ2NvbW1hbmQnLCByZXNwb25zZSkudG9VcHBlckNhc2UoKS50cmltKClcblxuICAgIC8vIG5vIGF0dHJpYnV0ZXNcbiAgICBpZiAoIXJlc3BvbnNlIHx8ICFyZXNwb25zZS5hdHRyaWJ1dGVzIHx8ICFyZXNwb25zZS5hdHRyaWJ1dGVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gdW50YWdnZWQgcmVzcG9uc2VzIHcvIHNlcXVlbmNlIG51bWJlcnNcbiAgICBpZiAocmVzcG9uc2UudGFnID09PSAnKicgJiYgL15cXGQrJC8udGVzdChyZXNwb25zZS5jb21tYW5kKSAmJiByZXNwb25zZS5hdHRyaWJ1dGVzWzBdLnR5cGUgPT09ICdBVE9NJykge1xuICAgICAgcmVzcG9uc2UubnIgPSBOdW1iZXIocmVzcG9uc2UuY29tbWFuZClcbiAgICAgIHJlc3BvbnNlLmNvbW1hbmQgPSAocmVzcG9uc2UuYXR0cmlidXRlcy5zaGlmdCgpLnZhbHVlIHx8ICcnKS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkudHJpbSgpXG4gICAgfVxuXG4gICAgLy8gbm8gb3B0aW9uYWwgcmVzcG9uc2UgY29kZVxuICAgIGlmIChbJ09LJywgJ05PJywgJ0JBRCcsICdCWUUnLCAnUFJFQVVUSCddLmluZGV4T2YoY29tbWFuZCkgPCAwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBJZiBsYXN0IGVsZW1lbnQgb2YgdGhlIHJlc3BvbnNlIGlzIFRFWFQgdGhlbiB0aGlzIGlzIGZvciBodW1hbnNcbiAgICBpZiAocmVzcG9uc2UuYXR0cmlidXRlc1tyZXNwb25zZS5hdHRyaWJ1dGVzLmxlbmd0aCAtIDFdLnR5cGUgPT09ICdURVhUJykge1xuICAgICAgcmVzcG9uc2UuaHVtYW5SZWFkYWJsZSA9IHJlc3BvbnNlLmF0dHJpYnV0ZXNbcmVzcG9uc2UuYXR0cmlidXRlcy5sZW5ndGggLSAxXS52YWx1ZVxuICAgIH1cblxuICAgIC8vIFBhcnNlIGFuZCBmb3JtYXQgQVRPTSB2YWx1ZXNcbiAgICBpZiAocmVzcG9uc2UuYXR0cmlidXRlc1swXS50eXBlID09PSAnQVRPTScgJiYgcmVzcG9uc2UuYXR0cmlidXRlc1swXS5zZWN0aW9uKSB7XG4gICAgICBjb25zdCBvcHRpb24gPSByZXNwb25zZS5hdHRyaWJ1dGVzWzBdLnNlY3Rpb24ubWFwKChrZXkpID0+IHtcbiAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShrZXkpKSB7XG4gICAgICAgICAgcmV0dXJuIGtleS5tYXAoKGtleSkgPT4gKGtleS52YWx1ZSB8fCAnJykudG9TdHJpbmcoKS50cmltKCkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIChrZXkudmFsdWUgfHwgJycpLnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKS50cmltKClcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgY29uc3Qga2V5ID0gb3B0aW9uLnNoaWZ0KClcbiAgICAgIHJlc3BvbnNlLmNvZGUgPSBrZXlcblxuICAgICAgaWYgKG9wdGlvbi5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmVzcG9uc2Vba2V5LnRvTG93ZXJDYXNlKCldID0gb3B0aW9uWzBdXG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbi5sZW5ndGggPiAxKSB7XG4gICAgICAgIHJlc3BvbnNlW2tleS50b0xvd2VyQ2FzZSgpXSA9IG9wdGlvblxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBhbiBFcnJvciBvYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWUgVmFsdWUgdG8gYmUgY2hlY2tlZFxuICAgKiBAcmV0dXJuIHtCb29sZWFufSByZXR1cm5zIHRydWUgaWYgdGhlIHZhbHVlIGlzIGFuIEVycm9yXG4gICAqL1xuICBpc0Vycm9yICh2YWx1ZSkge1xuICAgIHJldHVybiAhIU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkubWF0Y2goL0Vycm9yXFxdJC8pXG4gIH1cblxuICAvLyBDT01QUkVTU0lPTiBSRUxBVEVEIE1FVEhPRFNcblxuICAvKipcbiAgICogU2V0cyB1cCBkZWZsYXRlL2luZmxhdGUgZm9yIHRoZSBJT1xuICAgKi9cbiAgZW5hYmxlQ29tcHJlc3Npb24gKCkge1xuICAgIHRoaXMuX3NvY2tldE9uRGF0YSA9IHRoaXMuc29ja2V0Lm9uZGF0YVxuICAgIHRoaXMuY29tcHJlc3NlZCA9IHRydWVcblxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuV29ya2VyKSB7XG4gICAgICB0aGlzLl9jb21wcmVzc2lvbldvcmtlciA9IG5ldyBXb3JrZXIoVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbQ29tcHJlc3Npb25CbG9iXSkpKVxuICAgICAgdGhpcy5fY29tcHJlc3Npb25Xb3JrZXIub25tZXNzYWdlID0gKGUpID0+IHtcbiAgICAgICAgdmFyIG1lc3NhZ2UgPSBlLmRhdGEubWVzc2FnZVxuICAgICAgICB2YXIgZGF0YSA9IGUuZGF0YS5idWZmZXJcblxuICAgICAgICBzd2l0Y2ggKG1lc3NhZ2UpIHtcbiAgICAgICAgICBjYXNlIE1FU1NBR0VfSU5GTEFURURfREFUQV9SRUFEWTpcbiAgICAgICAgICAgIHRoaXMuX3NvY2tldE9uRGF0YSh7IGRhdGEgfSlcbiAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICBjYXNlIE1FU1NBR0VfREVGTEFURURfREFUQV9SRUFEWTpcbiAgICAgICAgICAgIHRoaXMud2FpdERyYWluID0gdGhpcy5zb2NrZXQuc2VuZChkYXRhKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9jb21wcmVzc2lvbldvcmtlci5vbmVycm9yID0gKGUpID0+IHtcbiAgICAgICAgdGhpcy5fb25FcnJvcihuZXcgRXJyb3IoJ0Vycm9yIGhhbmRsaW5nIGNvbXByZXNzaW9uIHdlYiB3b3JrZXI6ICcgKyBlLm1lc3NhZ2UpKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9jb21wcmVzc2lvbldvcmtlci5wb3N0TWVzc2FnZShjcmVhdGVNZXNzYWdlKE1FU1NBR0VfSU5JVElBTElaRV9XT1JLRVIpKVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpbmZsYXRlZFJlYWR5ID0gKGJ1ZmZlcikgPT4geyB0aGlzLl9zb2NrZXRPbkRhdGEoeyBkYXRhOiBidWZmZXIgfSkgfVxuICAgICAgY29uc3QgZGVmbGF0ZWRSZWFkeSA9IChidWZmZXIpID0+IHsgdGhpcy53YWl0RHJhaW4gPSB0aGlzLnNvY2tldC5zZW5kKGJ1ZmZlcikgfVxuICAgICAgdGhpcy5fY29tcHJlc3Npb24gPSBuZXcgQ29tcHJlc3Npb24oaW5mbGF0ZWRSZWFkeSwgZGVmbGF0ZWRSZWFkeSlcbiAgICB9XG5cbiAgICAvLyBvdmVycmlkZSBkYXRhIGhhbmRsZXIsIGRlY29tcHJlc3MgaW5jb21pbmcgZGF0YVxuICAgIHRoaXMuc29ja2V0Lm9uZGF0YSA9IChldnQpID0+IHtcbiAgICAgIGlmICghdGhpcy5jb21wcmVzc2VkKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fY29tcHJlc3Npb25Xb3JrZXIpIHtcbiAgICAgICAgdGhpcy5fY29tcHJlc3Npb25Xb3JrZXIucG9zdE1lc3NhZ2UoY3JlYXRlTWVzc2FnZShNRVNTQUdFX0lORkxBVEUsIGV2dC5kYXRhKSwgW2V2dC5kYXRhXSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2NvbXByZXNzaW9uLmluZmxhdGUoZXZ0LmRhdGEpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVuZG9lcyBhbnkgY2hhbmdlcyByZWxhdGVkIHRvIGNvbXByZXNzaW9uLiBUaGlzIG9ubHkgYmUgY2FsbGVkIHdoZW4gY2xvc2luZyB0aGUgY29ubmVjdGlvblxuICAgKi9cbiAgX2Rpc2FibGVDb21wcmVzc2lvbiAoKSB7XG4gICAgaWYgKCF0aGlzLmNvbXByZXNzZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuY29tcHJlc3NlZCA9IGZhbHNlXG4gICAgdGhpcy5zb2NrZXQub25kYXRhID0gdGhpcy5fc29ja2V0T25EYXRhXG4gICAgdGhpcy5fc29ja2V0T25EYXRhID0gbnVsbFxuXG4gICAgaWYgKHRoaXMuX2NvbXByZXNzaW9uV29ya2VyKSB7XG4gICAgICAvLyB0ZXJtaW5hdGUgdGhlIHdvcmtlclxuICAgICAgdGhpcy5fY29tcHJlc3Npb25Xb3JrZXIudGVybWluYXRlKClcbiAgICAgIHRoaXMuX2NvbXByZXNzaW9uV29ya2VyID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPdXRnb2luZyBwYXlsb2FkIG5lZWRzIHRvIGJlIGNvbXByZXNzZWQgYW5kIHNlbnQgdG8gc29ja2V0XG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGJ1ZmZlciBPdXRnb2luZyB1bmNvbXByZXNzZWQgYXJyYXlidWZmZXJcbiAgICovXG4gIF9zZW5kQ29tcHJlc3NlZCAoYnVmZmVyKSB7XG4gICAgLy8gZGVmbGF0ZVxuICAgIGlmICh0aGlzLl9jb21wcmVzc2lvbldvcmtlcikge1xuICAgICAgdGhpcy5fY29tcHJlc3Npb25Xb3JrZXIucG9zdE1lc3NhZ2UoY3JlYXRlTWVzc2FnZShNRVNTQUdFX0RFRkxBVEUsIGJ1ZmZlciksIFtidWZmZXJdKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jb21wcmVzc2lvbi5kZWZsYXRlKGJ1ZmZlcilcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgY3JlYXRlTWVzc2FnZSA9IChtZXNzYWdlLCBidWZmZXIpID0+ICh7IG1lc3NhZ2UsIGJ1ZmZlciB9KVxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbWFwLmpzIl0sIm5hbWVzIjpbIk1FU1NBR0VfSU5JVElBTElaRV9XT1JLRVIiLCJNRVNTQUdFX0lORkxBVEUiLCJNRVNTQUdFX0lORkxBVEVEX0RBVEFfUkVBRFkiLCJNRVNTQUdFX0RFRkxBVEUiLCJNRVNTQUdFX0RFRkxBVEVEX0RBVEFfUkVBRFkiLCJFT0wiLCJMSU5FX0ZFRUQiLCJDQVJSSUFHRV9SRVRVUk4iLCJMRUZUX0NVUkxZX0JSQUNLRVQiLCJSSUdIVF9DVVJMWV9CUkFDS0VUIiwiQVNDSUlfUExVUyIsIkJVRkZFUl9TVEFURV9MSVRFUkFMIiwiQlVGRkVSX1NUQVRFX1BPU1NJQkxZX0xJVEVSQUxfTEVOR1RIXzEiLCJCVUZGRVJfU1RBVEVfUE9TU0lCTFlfTElURVJBTF9MRU5HVEhfMiIsIkJVRkZFUl9TVEFURV9ERUZBVUxUIiwiVElNRU9VVF9FTlRFUl9JRExFIiwiVElNRU9VVF9TT0NLRVRfTE9XRVJfQk9VTkQiLCJUSU1FT1VUX1NPQ0tFVF9NVUxUSVBMSUVSIiwiSW1hcCIsImNvbnN0cnVjdG9yIiwiaG9zdCIsInBvcnQiLCJvcHRpb25zIiwidGltZW91dEVudGVySWRsZSIsInRpbWVvdXRTb2NrZXRMb3dlckJvdW5kIiwidGltZW91dFNvY2tldE11bHRpcGxpZXIiLCJ1c2VTZWN1cmVUcmFuc3BvcnQiLCJzZWN1cmVNb2RlIiwiX2Nvbm5lY3Rpb25SZWFkeSIsIl9nbG9iYWxBY2NlcHRVbnRhZ2dlZCIsIl9jbGllbnRRdWV1ZSIsIl9jYW5TZW5kIiwiX3RhZ0NvdW50ZXIiLCJfY3VycmVudENvbW1hbmQiLCJfaWRsZVRpbWVyIiwiX3NvY2tldFRpbWVvdXRUaW1lciIsImNvbXByZXNzZWQiLCJfaW5jb21pbmdCdWZmZXJzIiwiX2J1ZmZlclN0YXRlIiwiX2xpdGVyYWxSZW1haW5pbmciLCJvbmNlcnQiLCJvbmVycm9yIiwib25yZWFkeSIsIm9uaWRsZSIsImNvbm5lY3QiLCJTb2NrZXQiLCJUQ1BTb2NrZXQiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInNvY2tldCIsIm9wZW4iLCJiaW5hcnlUeXBlIiwiY2EiLCJjZXJ0IiwiRSIsIm9uY2xvc2UiLCJfb25FcnJvciIsIkVycm9yIiwib25kYXRhIiwiZXZ0IiwiX29uRGF0YSIsImVyciIsImUiLCJkYXRhIiwibWVzc2FnZSIsIm9ub3BlbiIsImNsb3NlIiwiZXJyb3IiLCJ0ZWFyRG93biIsImZvckVhY2giLCJjbWQiLCJjYWxsYmFjayIsImNsZWFyVGltZW91dCIsIl9kaXNhYmxlQ29tcHJlc3Npb24iLCJyZWFkeVN0YXRlIiwibG9nb3V0IiwidGhlbiIsImNhdGNoIiwiZW5xdWV1ZUNvbW1hbmQiLCJ1cGdyYWRlIiwidXBncmFkZVRvU2VjdXJlIiwicmVxdWVzdCIsImFjY2VwdFVudGFnZ2VkIiwiY29tbWFuZCIsImNvbmNhdCIsIm1hcCIsInVudGFnZ2VkIiwidG9TdHJpbmciLCJ0b1VwcGVyQ2FzZSIsInRyaW0iLCJ0YWciLCJwYXlsb2FkIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwicmVzcG9uc2UiLCJpc0Vycm9yIiwiaW5kZXhPZiIsImh1bWFuUmVhZGFibGUiLCJjb2RlIiwiT2JqZWN0Iiwia2V5cyIsImtleSIsImluZGV4IiwiY3R4Iiwic3BsaWNlIiwicHVzaCIsIl9zZW5kUmVxdWVzdCIsImdldFByZXZpb3VzbHlRdWV1ZWQiLCJjb21tYW5kcyIsInN0YXJ0SW5kZXgiLCJpIiwiaXNNYXRjaCIsInNlbmQiLCJzdHIiLCJidWZmZXIiLCJ0aW1lb3V0IiwiTWF0aCIsImZsb29yIiwiYnl0ZUxlbmd0aCIsInNldFRpbWVvdXQiLCJfc2VuZENvbXByZXNzZWQiLCJzZXRIYW5kbGVyIiwibG9nZ2VyIiwiVWludDhBcnJheSIsIl9wYXJzZUluY29taW5nQ29tbWFuZHMiLCJfaXRlcmF0ZUluY29taW5nQnVmZmVyIiwiYnVmIiwiZGlmZiIsIm1pbiIsIk51bWJlciIsIl9sZW5ndGhCdWZmZXIiLCJzdGFydCIsImxhdGVzdCIsInN1YmFycmF5IiwicHJldkJ1ZiIsInNldCIsImxlZnRJZHgiLCJsZWZ0T2ZMZWZ0Q3VybHkiLCJMRmlkeCIsImNvbW1hbmRMZW5ndGgiLCJyZWR1Y2UiLCJwcmV2IiwiY3VyciIsInVpbnQ4QXJyYXkiLCJzaGlmdCIsInJlbWFpbmluZ0xlbmd0aCIsImV4Y2Vzc0xlbmd0aCIsIl9jbGVhcklkbGUiLCJjaHVuayIsImVycm9yUmVzcG9uc2VFeHBlY3RzRW1wdHlMaW5lIiwidmFsdWVBc1N0cmluZyIsImRlYnVnIiwiX3Byb2Nlc3NSZXNwb25zZSIsIl9oYW5kbGVSZXNwb25zZSIsIl9lbnRlcklkbGUiLCJfcmVzdGFydFF1ZXVlIiwicHJlY2hlY2siLCJjb250ZXh0Iiwid2FpdERyYWluIiwiYXR0cmlidXRlcyIsInRlc3QiLCJ0eXBlIiwibnIiLCJ2YWx1ZSIsInNlY3Rpb24iLCJvcHRpb24iLCJBcnJheSIsImlzQXJyYXkiLCJ0b0xvd2VyQ2FzZSIsInByb3RvdHlwZSIsImNhbGwiLCJtYXRjaCIsImVuYWJsZUNvbXByZXNzaW9uIiwiX3NvY2tldE9uRGF0YSIsIndpbmRvdyIsIldvcmtlciIsIl9jb21wcmVzc2lvbldvcmtlciIsIlVSTCIsImNyZWF0ZU9iamVjdFVSTCIsIkJsb2IiLCJDb21wcmVzc2lvbkJsb2IiLCJvbm1lc3NhZ2UiLCJwb3N0TWVzc2FnZSIsImNyZWF0ZU1lc3NhZ2UiLCJpbmZsYXRlZFJlYWR5IiwiZGVmbGF0ZWRSZWFkeSIsIl9jb21wcmVzc2lvbiIsIkNvbXByZXNzaW9uIiwiaW5mbGF0ZSIsInRlcm1pbmF0ZSIsImRlZmxhdGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7cyt4Q0FHQTtBQUNBO0FBQ0E7O0FBQ0EsTUFBTUEseUJBQXlCLEdBQUcsT0FBbEM7QUFDQSxNQUFNQyxlQUFlLEdBQUcsU0FBeEI7QUFDQSxNQUFNQywyQkFBMkIsR0FBRyxnQkFBcEM7QUFDQSxNQUFNQyxlQUFlLEdBQUcsU0FBeEI7QUFDQSxNQUFNQywyQkFBMkIsR0FBRyxn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eEIsQ0FBb0NDLGFBQWEsQ0FBQ3ZMLGVBQUQsRUFBa0IyRCxHQUFHLENBQUNJLElBQXRCLENBQWpELEVBQThFLENBQUNKLEdBQUcsQ0FBQ0ksSUFBTCxDQUE5RTtBQUNELE9BRkQsTUFFTztBQUNMLGFBQUsySCxZQUFMLENBQWtCRSxPQUFsQixDQUEwQmpJLEdBQUcsQ0FBQ0ksSUFBOUI7QUFDRDtBQUNGLEtBVkQ7QUFXRDtBQUVEOzs7OztBQUdBVSxFQUFBQSxtQkFBbUIsR0FBSTtBQUNyQixRQUFJLENBQUMsS0FBS3RDLFVBQVYsRUFBc0I7QUFDcEI7QUFDRDs7QUFFRCxTQUFLQSxVQUFMLEdBQWtCLEtBQWxCO0FBQ0EsU0FBS2MsTUFBTCxDQUFZUyxNQUFaLEdBQXFCLEtBQUttSCxhQUExQjtBQUNBLFNBQUtBLGFBQUwsR0FBcUIsSUFBckI7O0FBRUEsUUFBSSxLQUFLRyxrQkFBVCxFQUE2QjtBQUMzQjtBQUNBLFdBQUtBLGtCQUFMLENBQXdCYSxTQUF4Qjs7QUFDQSxXQUFLYixrQkFBTCxHQUEwQixJQUExQjtBQUNEO0FBQ0Y7QUFFRDs7Ozs7OztBQUtBeEQsRUFBQUEsZUFBZSxDQUFFTixNQUFGLEVBQVU7QUFDdkI7QUFDQSxRQUFJLEtBQUs4RCxrQkFBVCxFQUE2QjtBQUMzQixXQUFLQSxrQkFBTCxDQUF3Qk0sV0FBeEIsQ0FBb0NDLGFBQWEsQ0FBQ3JMLGVBQUQsRUFBa0JnSCxNQUFsQixDQUFqRCxFQUE0RSxDQUFDQSxNQUFELENBQTVFO0FBQ0QsS0FGRCxNQUVPO0FBQ0wsV0FBS3dFLFlBQUwsQ0FBa0JJLE9BQWxCLENBQTBCNUUsTUFBMUI7QUFDRDtBQUNGOztBQTF3QnVCOzs7O0FBNndCMUIsTUFBTXFFLGFBQWEsR0FBRyxDQUFDdkgsT0FBRCxFQUFVa0QsTUFBVixNQUFzQjtBQUFFbEQsRUFBQUEsT0FBRjtBQUFXa0QsRUFBQUE7QUFBWCxDQUF0QixDQUF0QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHByb3BPciB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IFRDUFNvY2tldCBmcm9tICdlbWFpbGpzLXRjcC1zb2NrZXQnXG5pbXBvcnQgeyB0b1R5cGVkQXJyYXksIGZyb21UeXBlZEFycmF5IH0gZnJvbSAnLi9jb21tb24nXG5pbXBvcnQgeyBwYXJzZXIsIGNvbXBpbGVyIH0gZnJvbSAnZW1haWxqcy1pbWFwLWhhbmRsZXInXG5pbXBvcnQgQ29tcHJlc3Npb24gZnJvbSAnLi9jb21wcmVzc2lvbidcbmltcG9ydCBDb21wcmVzc2lvbkJsb2IgZnJvbSAnLi4vcmVzL2NvbXByZXNzaW9uLndvcmtlci5ibG9iJ1xuXG4vL1xuLy8gY29uc3RhbnRzIHVzZWQgZm9yIGNvbW11bmljYXRpb24gd2l0aCB0aGUgd29ya2VyXG4vL1xuY29uc3QgTUVTU0FHRV9JTklUSUFMSVpFX1dPUktFUiA9ICdzdGFydCdcbmNvbnN0IE1FU1NBR0VfSU5GTEFURSA9ICdpbmZsYXRlJ1xuY29uc3QgTUVTU0FHRV9JTkZMQVRFRF9EQVRBX1JFQURZID0gJ2luZmxhdGVkX3JlYWR5J1xuY29uc3QgTUVTU0FHRV9ERUZMQVRFID0gJ2RlZmxhdGUnXG5jb25zdCBNRVNTQUdFX0RFRkxBVEVEX0RBVEFfUkVBRFkgPSAnZGVmbGF0ZWRfcmVhZHknXG5cbmNvbnN0IEVPTCA9ICdcXHJcXG4nXG5jb25zdCBMSU5FX0ZFRUQgPSAxMFxuY29uc3QgQ0FSUklBR0VfUkVUVVJOID0gMTNcbmNvbnN0IExFRlRfQ1VSTFlfQlJBQ0tFVCA9IDEyM1xuY29uc3QgUklHSFRfQ1VSTFlfQlJBQ0tFVCA9IDEyNVxuXG5jb25zdCBBU0NJSV9QTFVTID0gNDNcblxuLy8gU3RhdGUgdHJhY2tpbmcgd2hlbiBjb25zdHJ1Y3RpbmcgYW4gSU1BUCBjb21tYW5kIGZyb20gYnVmZmVycy5cbmNvbnN0IEJVRkZFUl9TVEFURV9MSVRFUkFMID0gJ2xpdGVyYWwnXG5jb25zdCBCVUZGRVJfU1RBVEVfUE9TU0lCTFlfTElURVJBTF9MRU5HVEhfMSA9ICdsaXRlcmFsX2xlbmd0aF8xJ1xuY29uc3QgQlVGRkVSX1NUQVRFX1BPU1NJQkxZX0xJVEVSQUxfTEVOR1RIXzIgPSAnbGl0ZXJhbF9sZW5ndGhfMidcbmNvbnN0IEJVRkZFUl9TVEFURV9ERUZBVUxUID0gJ2RlZmF1bHQnXG5cbi8qKlxuICogSG93IG11Y2ggdGltZSB0byB3YWl0IHNpbmNlIHRoZSBsYXN0IHJlc3BvbnNlIHVudGlsIHRoZSBjb25uZWN0aW9uIGlzIGNvbnNpZGVyZWQgaWRsaW5nXG4gKi9cbmNvbnN0IFRJTUVPVVRfRU5URVJfSURMRSA9IDEwMDBcblxuLyoqXG4gKiBMb3dlciBCb3VuZCBmb3Igc29ja2V0IHRpbWVvdXQgdG8gd2FpdCBzaW5jZSB0aGUgbGFzdCBkYXRhIHdhcyB3cml0dGVuIHRvIGEgc29ja2V0XG4gKi9cbmNvbnN0IFRJTUVPVVRfU09DS0VUX0xPV0VSX0JPVU5EID0gMTAwMDBcblxuLyoqXG4gKiBNdWx0aXBsaWVyIGZvciBzb2NrZXQgdGltZW91dDpcbiAqXG4gKiBXZSBhc3N1bWUgYXQgbGVhc3QgYSBHUFJTIGNvbm5lY3Rpb24gd2l0aCAxMTUga2IvcyA9IDE0LDM3NSBrQi9zIHRvcHMsIHNvIDEwIEtCL3MgdG8gYmUgb25cbiAqIHRoZSBzYWZlIHNpZGUuIFdlIGNhbiB0aW1lb3V0IGFmdGVyIGEgbG93ZXIgYm91bmQgb2YgMTBzICsgKG4gS0IgLyAxMCBLQi9zKS4gQSAxIE1CIG1lc3NhZ2VcbiAqIHVwbG9hZCB3b3VsZCBiZSAxMTAgc2Vjb25kcyB0byB3YWl0IGZvciB0aGUgdGltZW91dC4gMTAgS0IvcyA9PT0gMC4xIHMvQlxuICovXG5jb25zdCBUSU1FT1VUX1NPQ0tFVF9NVUxUSVBMSUVSID0gMC4xXG5cbi8qKlxuICogQ3JlYXRlcyBhIGNvbm5lY3Rpb24gb2JqZWN0IHRvIGFuIElNQVAgc2VydmVyLiBDYWxsIGBjb25uZWN0YCBtZXRob2QgdG8gaW5pdGl0YXRlXG4gKiB0aGUgYWN0dWFsIGNvbm5lY3Rpb24sIHRoZSBjb25zdHJ1Y3RvciBvbmx5IGRlZmluZXMgdGhlIHByb3BlcnRpZXMgYnV0IGRvZXMgbm90IGFjdHVhbGx5IGNvbm5lY3QuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IFtob3N0PSdsb2NhbGhvc3QnXSBIb3N0bmFtZSB0byBjb25lbmN0IHRvXG4gKiBAcGFyYW0ge051bWJlcn0gW3BvcnQ9MTQzXSBQb3J0IG51bWJlciB0byBjb25uZWN0IHRvXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIE9wdGlvbmFsIG9wdGlvbnMgb2JqZWN0XG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnVzZVNlY3VyZVRyYW5zcG9ydF0gU2V0IHRvIHRydWUsIHRvIHVzZSBlbmNyeXB0ZWQgY29ubmVjdGlvblxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmNvbXByZXNzaW9uV29ya2VyUGF0aF0gb2ZmbG9hZHMgZGUtL2NvbXByZXNzaW9uIGNvbXB1dGF0aW9uIHRvIGEgd2ViIHdvcmtlciwgdGhpcyBpcyB0aGUgcGF0aCB0byB0aGUgYnJvd3NlcmlmaWVkIGVtYWlsanMtY29tcHJlc3Nvci13b3JrZXIuanNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW1hcCB7XG4gIGNvbnN0cnVjdG9yIChob3N0LCBwb3J0LCBvcHRpb25zID0ge30pIHtcbiAgICB0aGlzLnRpbWVvdXRFbnRlcklkbGUgPSBUSU1FT1VUX0VOVEVSX0lETEVcbiAgICB0aGlzLnRpbWVvdXRTb2NrZXRMb3dlckJvdW5kID0gVElNRU9VVF9TT0NLRVRfTE9XRVJfQk9VTkRcbiAgICB0aGlzLnRpbWVvdXRTb2NrZXRNdWx0aXBsaWVyID0gVElNRU9VVF9TT0NLRVRfTVVMVElQTElFUlxuXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xuXG4gICAgdGhpcy5wb3J0ID0gcG9ydCB8fCAodGhpcy5vcHRpb25zLnVzZVNlY3VyZVRyYW5zcG9ydCA/IDk5MyA6IDE0MylcbiAgICB0aGlzLmhvc3QgPSBob3N0IHx8ICdsb2NhbGhvc3QnXG5cbiAgICAvLyBVc2UgYSBUTFMgY29ubmVjdGlvbi4gUG9ydCA5OTMgYWxzbyBmb3JjZXMgVExTLlxuICAgIHRoaXMub3B0aW9ucy51c2VTZWN1cmVUcmFuc3BvcnQgPSAndXNlU2VjdXJlVHJhbnNwb3J0JyBpbiB0aGlzLm9wdGlvbnMgPyAhIXRoaXMub3B0aW9ucy51c2VTZWN1cmVUcmFuc3BvcnQgOiB0aGlzLnBvcnQgPT09IDk5M1xuXG4gICAgdGhpcy5zZWN1cmVNb2RlID0gISF0aGlzLm9wdGlvbnMudXNlU2VjdXJlVHJhbnNwb3J0IC8vIERvZXMgdGhlIGNvbm5lY3Rpb24gdXNlIFNTTC9UTFNcblxuICAgIHRoaXMuX2Nvbm5lY3Rpb25SZWFkeSA9IGZhbHNlIC8vIElzIHRoZSBjb25lY3Rpb24gZXN0YWJsaXNoZWQgYW5kIGdyZWV0aW5nIGlzIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlclxuXG4gICAgdGhpcy5fZ2xvYmFsQWNjZXB0VW50YWdnZWQgPSB7fSAvLyBHbG9iYWwgaGFuZGxlcnMgZm9yIHVucmVsYXRlZCByZXNwb25zZXMgKEVYUFVOR0UsIEVYSVNUUyBldGMuKVxuXG4gICAgdGhpcy5fY2xpZW50UXVldWUgPSBbXSAvLyBRdWV1ZSBvZiBvdXRnb2luZyBjb21tYW5kc1xuICAgIHRoaXMuX2NhblNlbmQgPSBmYWxzZSAvLyBJcyBpdCBPSyB0byBzZW5kIHNvbWV0aGluZyB0byB0aGUgc2VydmVyXG4gICAgdGhpcy5fdGFnQ291bnRlciA9IDAgLy8gQ291bnRlciB0byBhbGxvdyB1bmlxdWV1ZSBpbWFwIHRhZ3NcbiAgICB0aGlzLl9jdXJyZW50Q29tbWFuZCA9IGZhbHNlIC8vIEN1cnJlbnQgY29tbWFuZCB0aGF0IGlzIHdhaXRpbmcgZm9yIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlclxuXG4gICAgdGhpcy5faWRsZVRpbWVyID0gZmFsc2UgLy8gVGltZXIgd2FpdGluZyB0byBlbnRlciBpZGxlXG4gICAgdGhpcy5fc29ja2V0VGltZW91dFRpbWVyID0gZmFsc2UgLy8gVGltZXIgd2FpdGluZyB0byBkZWNsYXJlIHRoZSBzb2NrZXQgZGVhZCBzdGFydGluZyBmcm9tIHRoZSBsYXN0IHdyaXRlXG5cbiAgICB0aGlzLmNvbXByZXNzZWQgPSBmYWxzZSAvLyBJcyB0aGUgY29ubmVjdGlvbiBjb21wcmVzc2VkIGFuZCBuZWVkcyBpbmZsYXRpbmcvZGVmbGF0aW5nXG5cbiAgICAvL1xuICAgIC8vIEhFTFBFUlNcbiAgICAvL1xuXG4gICAgLy8gQXMgdGhlIHNlcnZlciBzZW5kcyBkYXRhIGluIGNodW5rcywgaXQgbmVlZHMgdG8gYmUgc3BsaXQgaW50byBzZXBhcmF0ZSBsaW5lcy4gSGVscHMgcGFyc2luZyB0aGUgaW5wdXQuXG4gICAgdGhpcy5faW5jb21pbmdCdWZmZXJzID0gW11cbiAgICB0aGlzLl9idWZmZXJTdGF0ZSA9IEJVRkZFUl9TVEFURV9ERUZBVUxUXG4gICAgdGhpcy5fbGl0ZXJhbFJlbWFpbmluZyA9IDBcblxuICAgIC8vXG4gICAgLy8gRXZlbnQgcGxhY2Vob2xkZXJzLCBtYXkgYmUgb3ZlcnJpZGVuIHdpdGggY2FsbGJhY2sgZnVuY3Rpb25zXG4gICAgLy9cbiAgICB0aGlzLm9uY2VydCA9IG51bGxcbiAgICB0aGlzLm9uZXJyb3IgPSBudWxsIC8vIElycmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJyZWQuIENvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciB3aWxsIGJlIGNsb3NlZCBhdXRvbWF0aWNhbGx5LlxuICAgIHRoaXMub25yZWFkeSA9IG51bGwgLy8gVGhlIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciBoYXMgYmVlbiBlc3RhYmxpc2hlZCBhbmQgZ3JlZXRpbmcgaXMgcmVjZWl2ZWRcbiAgICB0aGlzLm9uaWRsZSA9IG51bGwgLy8gVGhlcmUgYXJlIG5vIG1vcmUgY29tbWFuZHMgdG8gcHJvY2Vzc1xuICB9XG5cbiAgLy8gUFVCTElDIE1FVEhPRFNcblxuICAvKipcbiAgICogSW5pdGlhdGUgYSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIuIFdhaXQgZm9yIG9ucmVhZHkgZXZlbnRcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFNvY2tldFxuICAgKiAgICAgVEVTVElORyBPTkxZISBUaGUgVENQU29ja2V0IGhhcyBhIHByZXR0eSBub25zZW5zaWNhbCBjb252ZW5pZW5jZSBjb25zdHJ1Y3RvcixcbiAgICogICAgIHdoaWNoIG1ha2VzIGl0IGhhcmQgdG8gbW9jay4gRm9yIGRlcGVuZGVuY3ktaW5qZWN0aW9uIHB1cnBvc2VzLCB3ZSB1c2UgdGhlXG4gICAqICAgICBTb2NrZXQgcGFyYW1ldGVyIHRvIHBhc3MgaW4gYSBtb2NrIFNvY2tldCBpbXBsZW1lbnRhdGlvbi4gU2hvdWxkIGJlIGxlZnQgYmxhbmtcbiAgICogICAgIGluIHByb2R1Y3Rpb24gdXNlIVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmVzb2x2ZXMgd2hlbiBzb2NrZXQgaXMgb3BlbmVkXG4gICAqL1xuICBjb25uZWN0IChTb2NrZXQgPSBUQ1BTb2NrZXQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5zb2NrZXQgPSBTb2NrZXQub3Blbih0aGlzLmhvc3QsIHRoaXMucG9ydCwge1xuICAgICAgICBiaW5hcnlUeXBlOiAnYXJyYXlidWZmZXInLFxuICAgICAgICB1c2VTZWN1cmVUcmFuc3BvcnQ6IHRoaXMuc2VjdXJlTW9kZSxcbiAgICAgICAgY2E6IHRoaXMub3B0aW9ucy5jYVxuICAgICAgfSlcblxuICAgICAgLy8gYWxsb3dzIGNlcnRpZmljYXRlIGhhbmRsaW5nIGZvciBwbGF0Zm9ybSB3L28gbmF0aXZlIHRscyBzdXBwb3J0XG4gICAgICAvLyBvbmNlcnQgaXMgbm9uIHN0YW5kYXJkIHNvIHNldHRpbmcgaXQgbWlnaHQgdGhyb3cgaWYgdGhlIHNvY2tldCBvYmplY3QgaXMgaW1tdXRhYmxlXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnNvY2tldC5vbmNlcnQgPSAoY2VydCkgPT4geyB0aGlzLm9uY2VydCAmJiB0aGlzLm9uY2VydChjZXJ0KSB9XG4gICAgICB9IGNhdGNoIChFKSB7IH1cblxuICAgICAgLy8gQ29ubmVjdGlvbiBjbG9zaW5nIHVuZXhwZWN0ZWQgaXMgYW4gZXJyb3JcbiAgICAgIHRoaXMuc29ja2V0Lm9uY2xvc2UgPSAoKSA9PiB0aGlzLl9vbkVycm9yKG5ldyBFcnJvcignU29ja2V0IGNsb3NlZCB1bmV4cGVjdGVkbHkhJykpXG4gICAgICB0aGlzLnNvY2tldC5vbmRhdGEgPSAoZXZ0KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5fb25EYXRhKGV2dClcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5fb25FcnJvcihlcnIpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gaWYgYW4gZXJyb3IgaGFwcGVucyBkdXJpbmcgY3JlYXRlIHRpbWUsIHJlamVjdCB0aGUgcHJvbWlzZVxuICAgICAgdGhpcy5zb2NrZXQub25lcnJvciA9IChlKSA9PiB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0NvdWxkIG5vdCBvcGVuIHNvY2tldDogJyArIGUuZGF0YS5tZXNzYWdlKSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5zb2NrZXQub25vcGVuID0gKCkgPT4ge1xuICAgICAgICAvLyB1c2UgcHJvcGVyIFwiaXJyZWNvdmVyYWJsZSBlcnJvciwgdGVhciBkb3duIGV2ZXJ5dGhpbmdcIi1oYW5kbGVyIG9ubHkgYWZ0ZXIgc29ja2V0IGlzIG9wZW5cbiAgICAgICAgdGhpcy5zb2NrZXQub25lcnJvciA9IChlKSA9PiB0aGlzLl9vbkVycm9yKGUpXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXJcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IFJlc29sdmVzIHdoZW4gdGhlIHNvY2tldCBpcyBjbG9zZWRcbiAgICovXG4gIGNsb3NlIChlcnJvcikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdmFyIHRlYXJEb3duID0gKCkgPT4ge1xuICAgICAgICAvLyBmdWxmaWxsIHBlbmRpbmcgcHJvbWlzZXNcbiAgICAgICAgdGhpcy5fY2xpZW50UXVldWUuZm9yRWFjaChjbWQgPT4gY21kLmNhbGxiYWNrKGVycm9yKSlcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRDb21tYW5kKSB7XG4gICAgICAgICAgdGhpcy5fY3VycmVudENvbW1hbmQuY2FsbGJhY2soZXJyb3IpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jbGllbnRRdWV1ZSA9IFtdXG4gICAgICAgIHRoaXMuX2N1cnJlbnRDb21tYW5kID0gZmFsc2VcblxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5faWRsZVRpbWVyKVxuICAgICAgICB0aGlzLl9pZGxlVGltZXIgPSBudWxsXG5cbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3NvY2tldFRpbWVvdXRUaW1lcilcbiAgICAgICAgdGhpcy5fc29ja2V0VGltZW91dFRpbWVyID0gbnVsbFxuXG4gICAgICAgIGlmICh0aGlzLnNvY2tldCkge1xuICAgICAgICAgIC8vIHJlbW92ZSBhbGwgbGlzdGVuZXJzXG4gICAgICAgICAgdGhpcy5zb2NrZXQub25vcGVuID0gbnVsbFxuICAgICAgICAgIHRoaXMuc29ja2V0Lm9uY2xvc2UgPSBudWxsXG4gICAgICAgICAgdGhpcy5zb2NrZXQub25kYXRhID0gbnVsbFxuICAgICAgICAgIHRoaXMuc29ja2V0Lm9uZXJyb3IgPSBudWxsXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0Lm9uY2VydCA9IG51bGxcbiAgICAgICAgICB9IGNhdGNoIChFKSB7IH1cblxuICAgICAgICAgIHRoaXMuc29ja2V0ID0gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2Rpc2FibGVDb21wcmVzc2lvbigpXG5cbiAgICAgIGlmICghdGhpcy5zb2NrZXQgfHwgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSAhPT0gJ29wZW4nKSB7XG4gICAgICAgIHJldHVybiB0ZWFyRG93bigpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9uY2xvc2UgPSB0aGlzLnNvY2tldC5vbmVycm9yID0gdGVhckRvd24gLy8gd2UgZG9uJ3QgcmVhbGx5IGNhcmUgYWJvdXQgdGhlIGVycm9yIGhlcmVcbiAgICAgIHRoaXMuc29ja2V0LmNsb3NlKClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgTE9HT1VUIHRvIHRoZSBzZXJ2ZXIuXG4gICAqXG4gICAqIFVzZSBpcyBkaXNjb3VyYWdlZCFcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IFJlc29sdmVzIHdoZW4gY29ubmVjdGlvbiBpcyBjbG9zZWQgYnkgc2VydmVyLlxuICAgKi9cbiAgbG9nb3V0ICgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5zb2NrZXQub25jbG9zZSA9IHRoaXMuc29ja2V0Lm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuY2xvc2UoJ0NsaWVudCBsb2dnaW5nIG91dCcpLnRoZW4ocmVzb2x2ZSkuY2F0Y2gocmVqZWN0KVxuICAgICAgfVxuXG4gICAgICB0aGlzLmVucXVldWVDb21tYW5kKCdMT0dPVVQnKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhdGVzIFRMUyBoYW5kc2hha2VcbiAgICovXG4gIHVwZ3JhZGUgKCkge1xuICAgIHRoaXMuc2VjdXJlTW9kZSA9IHRydWVcbiAgICB0aGlzLnNvY2tldC51cGdyYWRlVG9TZWN1cmUoKVxuICB9XG5cbiAgLyoqXG4gICAqIFNjaGVkdWxlcyBhIGNvbW1hbmQgdG8gYmUgc2VudCB0byB0aGUgc2VydmVyLlxuICAgKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VtYWlsanMvZW1haWxqcy1pbWFwLWhhbmRsZXIgZm9yIHJlcXVlc3Qgc3RydWN0dXJlLlxuICAgKiBEbyBub3QgcHJvdmlkZSBhIHRhZyBwcm9wZXJ0eSwgaXQgd2lsbCBiZSBzZXQgYnkgdGhlIHF1ZXVlIG1hbmFnZXIuXG4gICAqXG4gICAqIFRvIGNhdGNoIHVudGFnZ2VkIHJlc3BvbnNlcyB1c2UgYWNjZXB0VW50YWdnZWQgcHJvcGVydHkuIEZvciBleGFtcGxlLCBpZlxuICAgKiB0aGUgdmFsdWUgZm9yIGl0IGlzICdGRVRDSCcgdGhlbiB0aGUgcmVwb25zZSBpbmNsdWRlcyAncGF5bG9hZC5GRVRDSCcgcHJvcGVydHlcbiAgICogdGhhdCBpcyBhbiBhcnJheSBpbmNsdWRpbmcgYWxsIGxpc3RlZCAqIEZFVENIIHJlc3BvbnNlcy5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHJlcXVlc3QgU3RydWN0dXJlZCByZXF1ZXN0IG9iamVjdFxuICAgKiBAcGFyYW0ge0FycmF5fSBhY2NlcHRVbnRhZ2dlZCBhIGxpc3Qgb2YgdW50YWdnZWQgcmVzcG9uc2VzIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiAncGF5bG9hZCcgcHJvcGVydHlcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBPcHRpb25hbCBkYXRhIGZvciB0aGUgY29tbWFuZCBwYXlsb2FkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZSB3YXMgcmVjZWl2ZWRcbiAgICovXG4gIGVucXVldWVDb21tYW5kIChyZXF1ZXN0LCBhY2NlcHRVbnRhZ2dlZCwgb3B0aW9ucykge1xuICAgIGlmICh0eXBlb2YgcmVxdWVzdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJlcXVlc3QgPSB7XG4gICAgICAgIGNvbW1hbmQ6IHJlcXVlc3RcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhY2NlcHRVbnRhZ2dlZCA9IFtdLmNvbmNhdChhY2NlcHRVbnRhZ2dlZCB8fCBbXSkubWFwKCh1bnRhZ2dlZCkgPT4gKHVudGFnZ2VkIHx8ICcnKS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkudHJpbSgpKVxuXG4gICAgdmFyIHRhZyA9ICdXJyArICgrK3RoaXMuX3RhZ0NvdW50ZXIpXG4gICAgcmVxdWVzdC50YWcgPSB0YWdcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB2YXIgZGF0YSA9IHtcbiAgICAgICAgdGFnOiB0YWcsXG4gICAgICAgIHJlcXVlc3Q6IHJlcXVlc3QsXG4gICAgICAgIHBheWxvYWQ6IGFjY2VwdFVudGFnZ2VkLmxlbmd0aCA/IHt9IDogdW5kZWZpbmVkLFxuICAgICAgICBjYWxsYmFjazogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNFcnJvcihyZXNwb25zZSkpIHtcbiAgICAgICAgICAgIHJldHVybiByZWplY3QocmVzcG9uc2UpXG4gICAgICAgICAgfSBlbHNlIGlmIChbJ05PJywgJ0JBRCddLmluZGV4T2YocHJvcE9yKCcnLCAnY29tbWFuZCcsIHJlc3BvbnNlKS50b1VwcGVyQ2FzZSgpLnRyaW0oKSkgPj0gMCkge1xuICAgICAgICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKHJlc3BvbnNlLmh1bWFuUmVhZGFibGUgfHwgJ0Vycm9yJylcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5jb2RlKSB7XG4gICAgICAgICAgICAgIGVycm9yLmNvZGUgPSByZXNwb25zZS5jb2RlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycm9yKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gYXBwbHkgYW55IGFkZGl0aW9uYWwgb3B0aW9ucyB0byB0aGUgY29tbWFuZFxuICAgICAgT2JqZWN0LmtleXMob3B0aW9ucyB8fCB7fSkuZm9yRWFjaCgoa2V5KSA9PiB7IGRhdGFba2V5XSA9IG9wdGlvbnNba2V5XSB9KVxuXG4gICAgICBhY2NlcHRVbnRhZ2dlZC5mb3JFYWNoKChjb21tYW5kKSA9PiB7IGRhdGEucGF5bG9hZFtjb21tYW5kXSA9IFtdIH0pXG5cbiAgICAgIC8vIGlmIHdlJ3JlIGluIHByaW9yaXR5IG1vZGUgKGkuZS4gd2UgcmFuIGNvbW1hbmRzIGluIGEgcHJlY2hlY2spLFxuICAgICAgLy8gcXVldWUgYW55IGNvbW1hbmRzIEJFRk9SRSB0aGUgY29tbWFuZCB0aGF0IGNvbnRpYW5lZCB0aGUgcHJlY2hlY2ssXG4gICAgICAvLyBvdGhlcndpc2UganVzdCBxdWV1ZSBjb21tYW5kIGFzIHVzdWFsXG4gICAgICB2YXIgaW5kZXggPSBkYXRhLmN0eCA/IHRoaXMuX2NsaWVudFF1ZXVlLmluZGV4T2YoZGF0YS5jdHgpIDogLTFcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIGRhdGEudGFnICs9ICcucCdcbiAgICAgICAgZGF0YS5yZXF1ZXN0LnRhZyArPSAnLnAnXG4gICAgICAgIHRoaXMuX2NsaWVudFF1ZXVlLnNwbGljZShpbmRleCwgMCwgZGF0YSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2NsaWVudFF1ZXVlLnB1c2goZGF0YSlcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2NhblNlbmQpIHtcbiAgICAgICAgdGhpcy5fc2VuZFJlcXVlc3QoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGNvbW1hbmRzXG4gICAqIEBwYXJhbSBjdHhcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBnZXRQcmV2aW91c2x5UXVldWVkIChjb21tYW5kcywgY3R4KSB7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IHRoaXMuX2NsaWVudFF1ZXVlLmluZGV4T2YoY3R4KSAtIDFcblxuICAgIC8vIHNlYXJjaCBiYWNrd2FyZHMgZm9yIHRoZSBjb21tYW5kcyBhbmQgcmV0dXJuIHRoZSBmaXJzdCBmb3VuZFxuICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpID49IDA7IGktLSkge1xuICAgICAgaWYgKGlzTWF0Y2godGhpcy5fY2xpZW50UXVldWVbaV0pKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jbGllbnRRdWV1ZVtpXVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGFsc28gY2hlY2sgY3VycmVudCBjb21tYW5kIGlmIG5vIFNFTEVDVCBpcyBxdWV1ZWRcbiAgICBpZiAoaXNNYXRjaCh0aGlzLl9jdXJyZW50Q29tbWFuZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50Q29tbWFuZFxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuXG4gICAgZnVuY3Rpb24gaXNNYXRjaCAoZGF0YSkge1xuICAgICAgcmV0dXJuIGRhdGEgJiYgZGF0YS5yZXF1ZXN0ICYmIGNvbW1hbmRzLmluZGV4T2YoZGF0YS5yZXF1ZXN0LmNvbW1hbmQpID49IDBcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBkYXRhIHRvIHRoZSBUQ1Agc29ja2V0XG4gICAqIEFybXMgYSB0aW1lb3V0IHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyIFBheWxvYWRcbiAgICovXG4gIHNlbmQgKHN0cikge1xuICAgIGNvbnN0IGJ1ZmZlciA9IHRvVHlwZWRBcnJheShzdHIpLmJ1ZmZlclxuICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLnRpbWVvdXRTb2NrZXRMb3dlckJvdW5kICsgTWF0aC5mbG9vcihidWZmZXIuYnl0ZUxlbmd0aCAqIHRoaXMudGltZW91dFNvY2tldE11bHRpcGxpZXIpXG5cbiAgICBjbGVhclRpbWVvdXQodGhpcy5fc29ja2V0VGltZW91dFRpbWVyKSAvLyBjbGVhciBwZW5kaW5nIHRpbWVvdXRzXG4gICAgdGhpcy5fc29ja2V0VGltZW91dFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLl9vbkVycm9yKG5ldyBFcnJvcignIFNvY2tldCB0aW1lZCBvdXQhJykpLCB0aW1lb3V0KSAvLyBhcm0gdGhlIG5leHQgdGltZW91dFxuXG4gICAgaWYgKHRoaXMuY29tcHJlc3NlZCkge1xuICAgICAgdGhpcy5fc2VuZENvbXByZXNzZWQoYnVmZmVyKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNvY2tldC5zZW5kKGJ1ZmZlcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgZ2xvYmFsIGhhbmRsZXIgZm9yIGFuIHVudGFnZ2VkIHJlc3BvbnNlLiBJZiBjdXJyZW50bHkgcHJvY2Vzc2VkIGNvbW1hbmRcbiAgICogaGFzIG5vdCBsaXN0ZWQgdW50YWdnZWQgY29tbWFuZCBpdCBpcyBmb3J3YXJkZWQgdG8gdGhlIGdsb2JhbCBoYW5kbGVyLiBVc2VmdWxcbiAgICogd2l0aCBFWFBVTkdFLCBFWElTVFMgZXRjLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY29tbWFuZCBVbnRhZ2dlZCBjb21tYW5kIG5hbWVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb24gd2l0aCByZXNwb25zZSBvYmplY3QgYW5kIGNvbnRpbnVlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqL1xuICBzZXRIYW5kbGVyIChjb21tYW5kLCBjYWxsYmFjaykge1xuICAgIHRoaXMuX2dsb2JhbEFjY2VwdFVudGFnZ2VkW2NvbW1hbmQudG9VcHBlckNhc2UoKS50cmltKCldID0gY2FsbGJhY2tcbiAgfVxuXG4gIC8vIElOVEVSTkFMIEVWRU5UU1xuXG4gIC8qKlxuICAgKiBFcnJvciBoYW5kbGVyIGZvciB0aGUgc29ja2V0XG4gICAqXG4gICAqIEBldmVudFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnQgRXZlbnQgb2JqZWN0LiBTZWUgZXZ0LmRhdGEgZm9yIHRoZSBlcnJvclxuICAgKi9cbiAgX29uRXJyb3IgKGV2dCkge1xuICAgIHZhciBlcnJvclxuICAgIGlmICh0aGlzLmlzRXJyb3IoZXZ0KSkge1xuICAgICAgZXJyb3IgPSBldnRcbiAgICB9IGVsc2UgaWYgKGV2dCAmJiB0aGlzLmlzRXJyb3IoZXZ0LmRhdGEpKSB7XG4gICAgICBlcnJvciA9IGV2dC5kYXRhXG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9yID0gbmV3IEVycm9yKChldnQgJiYgZXZ0LmRhdGEgJiYgZXZ0LmRhdGEubWVzc2FnZSkgfHwgZXZ0LmRhdGEgfHwgZXZ0IHx8ICdFcnJvcicpXG4gICAgfVxuXG4gICAgdGhpcy5sb2dnZXIuZXJyb3IoZXJyb3IpXG5cbiAgICAvLyBhbHdheXMgY2FsbCBvbmVycm9yIGNhbGxiYWNrLCBubyBtYXR0ZXIgaWYgY2xvc2UoKSBzdWNjZWVkcyBvciBmYWlsc1xuICAgIHRoaXMuY2xvc2UoZXJyb3IpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5vbmVycm9yICYmIHRoaXMub25lcnJvcihlcnJvcilcbiAgICB9LCAoKSA9PiB7XG4gICAgICB0aGlzLm9uZXJyb3IgJiYgdGhpcy5vbmVycm9yKGVycm9yKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgaW5jb21pbmcgZGF0YSBmcm9tIHRoZSBzZXJ2ZXIuIFRoZSBkYXRhIGlzIHNlbnQgaW4gYXJiaXRyYXJ5XG4gICAqIGNodW5rcyBhbmQgY2FuJ3QgYmUgdXNlZCBkaXJlY3RseSBzbyB0aGlzIGZ1bmN0aW9uIG1ha2VzIHN1cmUgdGhlIGRhdGFcbiAgICogaXMgc3BsaXQgaW50byBjb21wbGV0ZSBsaW5lcyBiZWZvcmUgdGhlIGRhdGEgaXMgcGFzc2VkIHRvIHRoZSBjb21tYW5kXG4gICAqIGhhbmRsZXJcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqL1xuICBfb25EYXRhIChldnQpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fc29ja2V0VGltZW91dFRpbWVyKSAvLyByZXNldCB0aGUgdGltZW91dCBvbiBlYWNoIGRhdGEgcGFja2V0XG4gICAgY29uc3QgdGltZW91dCA9IHRoaXMudGltZW91dFNvY2tldExvd2VyQm91bmQgKyBNYXRoLmZsb29yKDQwOTYgKiB0aGlzLnRpbWVvdXRTb2NrZXRNdWx0aXBsaWVyKSAvLyBtYXggcGFja2V0IHNpemUgaXMgNDA5NiBieXRlc1xuICAgIHRoaXMuX3NvY2tldFRpbWVvdXRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5fb25FcnJvcihuZXcgRXJyb3IoJyBTb2NrZXQgdGltZWQgb3V0IScpKSwgdGltZW91dClcblxuICAgIHRoaXMuX2luY29taW5nQnVmZmVycy5wdXNoKG5ldyBVaW50OEFycmF5KGV2dC5kYXRhKSkgLy8gYXBwZW5kIHRvIHRoZSBpbmNvbWluZyBidWZmZXJcbiAgICB0aGlzLl9wYXJzZUluY29taW5nQ29tbWFuZHModGhpcy5faXRlcmF0ZUluY29taW5nQnVmZmVyKCkpIC8vIENvbnN1bWUgdGhlIGluY29taW5nIGJ1ZmZlclxuICB9XG5cbiAgKiBfaXRlcmF0ZUluY29taW5nQnVmZmVyICgpIHtcbiAgICBsZXQgYnVmID0gdGhpcy5faW5jb21pbmdCdWZmZXJzW3RoaXMuX2luY29taW5nQnVmZmVycy5sZW5ndGggLSAxXSB8fCBbXVxuICAgIGxldCBpID0gMFxuXG4gICAgLy8gbG9vcCBpbnZhcmlhbnQ6XG4gICAgLy8gICB0aGlzLl9pbmNvbWluZ0J1ZmZlcnMgc3RhcnRzIHdpdGggdGhlIGJlZ2lubmluZyBvZiBpbmNvbWluZyBjb21tYW5kLlxuICAgIC8vICAgYnVmIGlzIHNob3J0aGFuZCBmb3IgbGFzdCBlbGVtZW50IG9mIHRoaXMuX2luY29taW5nQnVmZmVycy5cbiAgICAvLyAgIGJ1ZlswLi5pLTFdIGlzIHBhcnQgb2YgaW5jb21pbmcgY29tbWFuZC5cbiAgICB3aGlsZSAoaSA8IGJ1Zi5sZW5ndGgpIHtcbiAgICAgIHN3aXRjaCAodGhpcy5fYnVmZmVyU3RhdGUpIHtcbiAgICAgICAgY2FzZSBCVUZGRVJfU1RBVEVfTElURVJBTDpcbiAgICAgICAgICBjb25zdCBkaWZmID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIGksIHRoaXMuX2xpdGVyYWxSZW1haW5pbmcpXG4gICAgICAgICAgdGhpcy5fbGl0ZXJhbFJlbWFpbmluZyAtPSBkaWZmXG4gICAgICAgICAgaSArPSBkaWZmXG4gICAgICAgICAgaWYgKHRoaXMuX2xpdGVyYWxSZW1haW5pbmcgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2J1ZmZlclN0YXRlID0gQlVGRkVSX1NUQVRFX0RFRkFVTFRcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIEJVRkZFUl9TVEFURV9QT1NTSUJMWV9MSVRFUkFMX0xFTkdUSF8yOlxuICAgICAgICAgIGlmIChpIDwgYnVmLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGJ1ZltpXSA9PT0gQ0FSUklBR0VfUkVUVVJOKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2xpdGVyYWxSZW1haW5pbmcgPSBOdW1iZXIoZnJvbVR5cGVkQXJyYXkodGhpcy5fbGVuZ3RoQnVmZmVyKSkgKyAyIC8vIGZvciBDUkxGXG4gICAgICAgICAgICAgIHRoaXMuX2J1ZmZlclN0YXRlID0gQlVGRkVSX1NUQVRFX0xJVEVSQUxcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuX2J1ZmZlclN0YXRlID0gQlVGRkVSX1NUQVRFX0RFRkFVTFRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9sZW5ndGhCdWZmZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIEJVRkZFUl9TVEFURV9QT1NTSUJMWV9MSVRFUkFMX0xFTkdUSF8xOlxuICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gaVxuICAgICAgICAgIHdoaWxlIChpIDwgYnVmLmxlbmd0aCAmJiBidWZbaV0gPj0gNDggJiYgYnVmW2ldIDw9IDU3KSB7IC8vIGRpZ2l0c1xuICAgICAgICAgICAgaSsrXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdGFydCAhPT0gaSkge1xuICAgICAgICAgICAgY29uc3QgbGF0ZXN0ID0gYnVmLnN1YmFycmF5KHN0YXJ0LCBpKVxuICAgICAgICAgICAgY29uc3QgcHJldkJ1ZiA9IHRoaXMuX2xlbmd0aEJ1ZmZlclxuICAgICAgICAgICAgdGhpcy5fbGVuZ3RoQnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkocHJldkJ1Zi5sZW5ndGggKyBsYXRlc3QubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5fbGVuZ3RoQnVmZmVyLnNldChwcmV2QnVmKVxuICAgICAgICAgICAgdGhpcy5fbGVuZ3RoQnVmZmVyLnNldChsYXRlc3QsIHByZXZCdWYubGVuZ3RoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaSA8IGJ1Zi5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9sZW5ndGhCdWZmZXIubGVuZ3RoID4gMCAmJiBidWZbaV0gPT09IFJJR0hUX0NVUkxZX0JSQUNLRVQpIHtcbiAgICAgICAgICAgICAgdGhpcy5fYnVmZmVyU3RhdGUgPSBCVUZGRVJfU1RBVEVfUE9TU0lCTFlfTElURVJBTF9MRU5HVEhfMlxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2xlbmd0aEJ1ZmZlclxuICAgICAgICAgICAgICB0aGlzLl9idWZmZXJTdGF0ZSA9IEJVRkZFUl9TVEFURV9ERUZBVUxUXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpKytcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIGZpbmQgbGl0ZXJhbCBsZW5ndGhcbiAgICAgICAgICBjb25zdCBsZWZ0SWR4ID0gYnVmLmluZGV4T2YoTEVGVF9DVVJMWV9CUkFDS0VULCBpKVxuICAgICAgICAgIGlmIChsZWZ0SWR4ID4gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IGxlZnRPZkxlZnRDdXJseSA9IG5ldyBVaW50OEFycmF5KGJ1Zi5idWZmZXIsIGksIGxlZnRJZHggLSBpKVxuICAgICAgICAgICAgaWYgKGxlZnRPZkxlZnRDdXJseS5pbmRleE9mKExJTkVfRkVFRCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgIGkgPSBsZWZ0SWR4ICsgMVxuICAgICAgICAgICAgICB0aGlzLl9sZW5ndGhCdWZmZXIgPSBuZXcgVWludDhBcnJheSgwKVxuICAgICAgICAgICAgICB0aGlzLl9idWZmZXJTdGF0ZSA9IEJVRkZFUl9TVEFURV9QT1NTSUJMWV9MSVRFUkFMX0xFTkdUSF8xXG4gICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gZmluZCBlbmQgb2YgY29tbWFuZFxuICAgICAgICAgIGNvbnN0IExGaWR4ID0gYnVmLmluZGV4T2YoTElORV9GRUVELCBpKVxuICAgICAgICAgIGlmIChMRmlkeCA+IC0xKSB7XG4gICAgICAgICAgICBpZiAoTEZpZHggPCBidWYubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICB0aGlzLl9pbmNvbWluZ0J1ZmZlcnNbdGhpcy5faW5jb21pbmdCdWZmZXJzLmxlbmd0aCAtIDFdID0gbmV3IFVpbnQ4QXJyYXkoYnVmLmJ1ZmZlciwgMCwgTEZpZHggKyAxKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY29tbWFuZExlbmd0aCA9IHRoaXMuX2luY29taW5nQnVmZmVycy5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHByZXYgKyBjdXJyLmxlbmd0aCwgMCkgLSAyIC8vIDIgZm9yIENSTEZcbiAgICAgICAgICAgIGNvbnN0IGNvbW1hbmQgPSBuZXcgVWludDhBcnJheShjb21tYW5kTGVuZ3RoKVxuICAgICAgICAgICAgbGV0IGluZGV4ID0gMFxuICAgICAgICAgICAgd2hpbGUgKHRoaXMuX2luY29taW5nQnVmZmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGxldCB1aW50OEFycmF5ID0gdGhpcy5faW5jb21pbmdCdWZmZXJzLnNoaWZ0KClcblxuICAgICAgICAgICAgICBjb25zdCByZW1haW5pbmdMZW5ndGggPSBjb21tYW5kTGVuZ3RoIC0gaW5kZXhcbiAgICAgICAgICAgICAgaWYgKHVpbnQ4QXJyYXkubGVuZ3RoID4gcmVtYWluaW5nTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhjZXNzTGVuZ3RoID0gdWludDhBcnJheS5sZW5ndGggLSByZW1haW5pbmdMZW5ndGhcbiAgICAgICAgICAgICAgICB1aW50OEFycmF5ID0gdWludDhBcnJheS5zdWJhcnJheSgwLCAtZXhjZXNzTGVuZ3RoKVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2luY29taW5nQnVmZmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9pbmNvbWluZ0J1ZmZlcnMgPSBbXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb21tYW5kLnNldCh1aW50OEFycmF5LCBpbmRleClcbiAgICAgICAgICAgICAgaW5kZXggKz0gdWludDhBcnJheS5sZW5ndGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHlpZWxkIGNvbW1hbmRcbiAgICAgICAgICAgIGlmIChMRmlkeCA8IGJ1Zi5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGJ1Zi5zdWJhcnJheShMRmlkeCArIDEpKVxuICAgICAgICAgICAgICB0aGlzLl9pbmNvbWluZ0J1ZmZlcnMucHVzaChidWYpXG4gICAgICAgICAgICAgIGkgPSAwXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBjbGVhciB0aGUgdGltZW91dCB3aGVuIGFuIGVudGlyZSBjb21tYW5kIGhhcyBhcnJpdmVkXG4gICAgICAgICAgICAgIC8vIGFuZCBub3Qgd2FpdGluZyBvbiBtb3JlIGRhdGEgZm9yIG5leHQgY29tbWFuZFxuICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fc29ja2V0VGltZW91dFRpbWVyKVxuICAgICAgICAgICAgICB0aGlzLl9zb2NrZXRUaW1lb3V0VGltZXIgPSBudWxsXG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUFJJVkFURSBNRVRIT0RTXG5cbiAgLyoqXG4gICAqIFByb2Nlc3NlcyBhIGNvbW1hbmQgZnJvbSB0aGUgcXVldWUuIFRoZSBjb21tYW5kIGlzIHBhcnNlZCBhbmQgZmVlZGVkIHRvIGEgaGFuZGxlclxuICAgKi9cbiAgX3BhcnNlSW5jb21pbmdDb21tYW5kcyAoY29tbWFuZHMpIHtcbiAgICBmb3IgKHZhciBjb21tYW5kIG9mIGNvbW1hbmRzKSB7XG4gICAgICB0aGlzLl9jbGVhcklkbGUoKVxuXG4gICAgICAvKlxuICAgICAgICogVGhlIFwiK1wiLXRhZ2dlZCByZXNwb25zZSBpcyBhIHNwZWNpYWwgY2FzZTpcbiAgICAgICAqIEVpdGhlciB0aGUgc2VydmVyIGNhbiBhc2tzIGZvciB0aGUgbmV4dCBjaHVuayBvZiBkYXRhLCBlLmcuIGZvciB0aGUgQVVUSEVOVElDQVRFIGNvbW1hbmQuXG4gICAgICAgKlxuICAgICAgICogT3IgdGhlcmUgd2FzIGFuIGVycm9yIGluIHRoZSBYT0FVVEgyIGF1dGhlbnRpY2F0aW9uLCBmb3Igd2hpY2ggU0FTTCBpbml0aWFsIGNsaWVudCByZXNwb25zZSBleHRlbnNpb25cbiAgICAgICAqIGRpY3RhdGVzIHRoZSBjbGllbnQgc2VuZHMgYW4gZW1wdHkgRU9MIHJlc3BvbnNlIHRvIHRoZSBjaGFsbGVuZ2UgY29udGFpbmluZyB0aGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgICAqXG4gICAgICAgKiBEZXRhaWxzIG9uIFwiK1wiLXRhZ2dlZCByZXNwb25zZTpcbiAgICAgICAqICAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM1MDEjc2VjdGlvbi0yLjIuMVxuICAgICAgICovXG4gICAgICAvL1xuICAgICAgaWYgKGNvbW1hbmRbMF0gPT09IEFTQ0lJX1BMVVMpIHtcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRDb21tYW5kLmRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgLy8gZmVlZCB0aGUgbmV4dCBjaHVuayBvZiBkYXRhXG4gICAgICAgICAgdmFyIGNodW5rID0gdGhpcy5fY3VycmVudENvbW1hbmQuZGF0YS5zaGlmdCgpXG4gICAgICAgICAgY2h1bmsgKz0gKCF0aGlzLl9jdXJyZW50Q29tbWFuZC5kYXRhLmxlbmd0aCA/IEVPTCA6ICcnKSAvLyBFT0wgaWYgdGhlcmUncyBub3RoaW5nIG1vcmUgdG8gc2VuZFxuICAgICAgICAgIHRoaXMuc2VuZChjaHVuaylcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9jdXJyZW50Q29tbWFuZC5lcnJvclJlc3BvbnNlRXhwZWN0c0VtcHR5TGluZSkge1xuICAgICAgICAgIHRoaXMuc2VuZChFT0wpIC8vIFhPQVVUSDIgZW1wdHkgcmVzcG9uc2UsIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgd2hlbiBzZXJ2ZXIgY29udGludWVzIHdpdGggTk8gcmVzcG9uc2VcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB2YXIgcmVzcG9uc2VcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHZhbHVlQXNTdHJpbmcgPSB0aGlzLl9jdXJyZW50Q29tbWFuZC5yZXF1ZXN0ICYmIHRoaXMuX2N1cnJlbnRDb21tYW5kLnJlcXVlc3QudmFsdWVBc1N0cmluZ1xuICAgICAgICByZXNwb25zZSA9IHBhcnNlcihjb21tYW5kLCB7IHZhbHVlQXNTdHJpbmcgfSlcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ1M6JywgKCkgPT4gY29tcGlsZXIocmVzcG9uc2UsIGZhbHNlLCB0cnVlKSlcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgaW1hcCBjb21tYW5kIScsIHJlc3BvbnNlKVxuICAgICAgICByZXR1cm4gdGhpcy5fb25FcnJvcihlKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9wcm9jZXNzUmVzcG9uc2UocmVzcG9uc2UpXG4gICAgICB0aGlzLl9oYW5kbGVSZXNwb25zZShyZXNwb25zZSlcblxuICAgICAgLy8gZmlyc3QgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLCBjb25uZWN0aW9uIGlzIG5vdyB1c2FibGVcbiAgICAgIGlmICghdGhpcy5fY29ubmVjdGlvblJlYWR5KSB7XG4gICAgICAgIHRoaXMuX2Nvbm5lY3Rpb25SZWFkeSA9IHRydWVcbiAgICAgICAgdGhpcy5vbnJlYWR5ICYmIHRoaXMub25yZWFkeSgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZlZWRzIGEgcGFyc2VkIHJlc3BvbnNlIG9iamVjdCB0byBhbiBhcHByb3ByaWF0ZSBoYW5kbGVyXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSByZXNwb25zZSBQYXJzZWQgY29tbWFuZCBvYmplY3RcbiAgICovXG4gIF9oYW5kbGVSZXNwb25zZSAocmVzcG9uc2UpIHtcbiAgICB2YXIgY29tbWFuZCA9IHByb3BPcignJywgJ2NvbW1hbmQnLCByZXNwb25zZSkudG9VcHBlckNhc2UoKS50cmltKClcblxuICAgIGlmICghdGhpcy5fY3VycmVudENvbW1hbmQpIHtcbiAgICAgIC8vIHVuc29saWNpdGVkIHVudGFnZ2VkIHJlc3BvbnNlXG4gICAgICBpZiAocmVzcG9uc2UudGFnID09PSAnKicgJiYgY29tbWFuZCBpbiB0aGlzLl9nbG9iYWxBY2NlcHRVbnRhZ2dlZCkge1xuICAgICAgICB0aGlzLl9nbG9iYWxBY2NlcHRVbnRhZ2dlZFtjb21tYW5kXShyZXNwb25zZSlcbiAgICAgICAgdGhpcy5fY2FuU2VuZCA9IHRydWVcbiAgICAgICAgdGhpcy5fc2VuZFJlcXVlc3QoKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5fY3VycmVudENvbW1hbmQucGF5bG9hZCAmJiByZXNwb25zZS50YWcgPT09ICcqJyAmJiBjb21tYW5kIGluIHRoaXMuX2N1cnJlbnRDb21tYW5kLnBheWxvYWQpIHtcbiAgICAgIC8vIGV4cGVjdGVkIHVudGFnZ2VkIHJlc3BvbnNlXG4gICAgICB0aGlzLl9jdXJyZW50Q29tbWFuZC5wYXlsb2FkW2NvbW1hbmRdLnB1c2gocmVzcG9uc2UpXG4gICAgfSBlbHNlIGlmIChyZXNwb25zZS50YWcgPT09ICcqJyAmJiBjb21tYW5kIGluIHRoaXMuX2dsb2JhbEFjY2VwdFVudGFnZ2VkKSB7XG4gICAgICAvLyB1bmV4cGVjdGVkIHVudGFnZ2VkIHJlc3BvbnNlXG4gICAgICB0aGlzLl9nbG9iYWxBY2NlcHRVbnRhZ2dlZFtjb21tYW5kXShyZXNwb25zZSlcbiAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnRhZyA9PT0gdGhpcy5fY3VycmVudENvbW1hbmQudGFnKSB7XG4gICAgICAvLyB0YWdnZWQgcmVzcG9uc2VcbiAgICAgIGlmICh0aGlzLl9jdXJyZW50Q29tbWFuZC5wYXlsb2FkICYmIE9iamVjdC5rZXlzKHRoaXMuX2N1cnJlbnRDb21tYW5kLnBheWxvYWQpLmxlbmd0aCkge1xuICAgICAgICByZXNwb25zZS5wYXlsb2FkID0gdGhpcy5fY3VycmVudENvbW1hbmQucGF5bG9hZFxuICAgICAgfVxuICAgICAgdGhpcy5fY3VycmVudENvbW1hbmQuY2FsbGJhY2socmVzcG9uc2UpXG4gICAgICB0aGlzLl9jYW5TZW5kID0gdHJ1ZVxuICAgICAgdGhpcy5fc2VuZFJlcXVlc3QoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIGNvbW1hbmQgZnJvbSBjbGllbnQgcXVldWUgdG8gdGhlIHNlcnZlci5cbiAgICovXG4gIF9zZW5kUmVxdWVzdCAoKSB7XG4gICAgaWYgKCF0aGlzLl9jbGllbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9lbnRlcklkbGUoKVxuICAgIH1cbiAgICB0aGlzLl9jbGVhcklkbGUoKVxuXG4gICAgLy8gYW4gb3BlcmF0aW9uIHdhcyBtYWRlIGluIHRoZSBwcmVjaGVjaywgbm8gbmVlZCB0byByZXN0YXJ0IHRoZSBxdWV1ZSBtYW51YWxseVxuICAgIHRoaXMuX3Jlc3RhcnRRdWV1ZSA9IGZhbHNlXG5cbiAgICB2YXIgY29tbWFuZCA9IHRoaXMuX2NsaWVudFF1ZXVlWzBdXG4gICAgaWYgKHR5cGVvZiBjb21tYW5kLnByZWNoZWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyByZW1lbWJlciB0aGUgY29udGV4dFxuICAgICAgdmFyIGNvbnRleHQgPSBjb21tYW5kXG4gICAgICB2YXIgcHJlY2hlY2sgPSBjb250ZXh0LnByZWNoZWNrXG4gICAgICBkZWxldGUgY29udGV4dC5wcmVjaGVja1xuXG4gICAgICAvLyB3ZSBuZWVkIHRvIHJlc3RhcnQgdGhlIHF1ZXVlIGhhbmRsaW5nIGlmIG5vIG9wZXJhdGlvbiB3YXMgbWFkZSBpbiB0aGUgcHJlY2hlY2tcbiAgICAgIHRoaXMuX3Jlc3RhcnRRdWV1ZSA9IHRydWVcblxuICAgICAgLy8gaW52b2tlIHRoZSBwcmVjaGVjayBjb21tYW5kIGFuZCByZXN1bWUgbm9ybWFsIG9wZXJhdGlvbiBhZnRlciB0aGUgcHJvbWlzZSByZXNvbHZlc1xuICAgICAgcHJlY2hlY2soY29udGV4dCkudGhlbigoKSA9PiB7XG4gICAgICAgIC8vIHdlJ3JlIGRvbmUgd2l0aCB0aGUgcHJlY2hlY2tcbiAgICAgICAgaWYgKHRoaXMuX3Jlc3RhcnRRdWV1ZSkge1xuICAgICAgICAgIC8vIHdlIG5lZWQgdG8gcmVzdGFydCB0aGUgcXVldWUgaGFuZGxpbmdcbiAgICAgICAgICB0aGlzLl9zZW5kUmVxdWVzdCgpXG4gICAgICAgIH1cbiAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgLy8gcHJlY2hlY2sgZmFpbGVkLCBzbyB3ZSByZW1vdmUgdGhlIGluaXRpYWwgY29tbWFuZFxuICAgICAgICAvLyBmcm9tIHRoZSBxdWV1ZSwgaW52b2tlIGl0cyBjYWxsYmFjayBhbmQgcmVzdW1lIG5vcm1hbCBvcGVyYXRpb25cbiAgICAgICAgbGV0IGNtZFxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2NsaWVudFF1ZXVlLmluZGV4T2YoY29udGV4dClcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICBjbWQgPSB0aGlzLl9jbGllbnRRdWV1ZS5zcGxpY2UoaW5kZXgsIDEpWzBdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNtZCAmJiBjbWQuY2FsbGJhY2spIHtcbiAgICAgICAgICBjbWQuY2FsbGJhY2soZXJyKVxuICAgICAgICAgIHRoaXMuX2NhblNlbmQgPSB0cnVlXG4gICAgICAgICAgdGhpcy5fcGFyc2VJbmNvbWluZ0NvbW1hbmRzKHRoaXMuX2l0ZXJhdGVJbmNvbWluZ0J1ZmZlcigpKSAvLyBDb25zdW1lIHRoZSByZXN0IG9mIHRoZSBpbmNvbWluZyBidWZmZXJcbiAgICAgICAgICB0aGlzLl9zZW5kUmVxdWVzdCgpIC8vIGNvbnRpbnVlIHNlbmRpbmdcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2NhblNlbmQgPSBmYWxzZVxuICAgIHRoaXMuX2N1cnJlbnRDb21tYW5kID0gdGhpcy5fY2xpZW50UXVldWUuc2hpZnQoKVxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX2N1cnJlbnRDb21tYW5kLmRhdGEgPSBjb21waWxlcih0aGlzLl9jdXJyZW50Q29tbWFuZC5yZXF1ZXN0LCB0cnVlKVxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0M6JywgKCkgPT4gY29tcGlsZXIodGhpcy5fY3VycmVudENvbW1hbmQucmVxdWVzdCwgZmFsc2UsIHRydWUpKSAvLyBleGNsdWRlcyBwYXNzd29yZHMgZXRjLlxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdFcnJvciBjb21waWxpbmcgaW1hcCBjb21tYW5kIScsIHRoaXMuX2N1cnJlbnRDb21tYW5kLnJlcXVlc3QpXG4gICAgICByZXR1cm4gdGhpcy5fb25FcnJvcihuZXcgRXJyb3IoJ0Vycm9yIGNvbXBpbGluZyBpbWFwIGNvbW1hbmQhJykpXG4gICAgfVxuXG4gICAgdmFyIGRhdGEgPSB0aGlzLl9jdXJyZW50Q29tbWFuZC5kYXRhLnNoaWZ0KClcblxuICAgIHRoaXMuc2VuZChkYXRhICsgKCF0aGlzLl9jdXJyZW50Q29tbWFuZC5kYXRhLmxlbmd0aCA/IEVPTCA6ICcnKSlcbiAgICByZXR1cm4gdGhpcy53YWl0RHJhaW5cbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBvbmlkbGUsIG5vdGluZyB0byBkbyBjdXJyZW50bHlcbiAgICovXG4gIF9lbnRlcklkbGUgKCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl9pZGxlVGltZXIpXG4gICAgdGhpcy5faWRsZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiAodGhpcy5vbmlkbGUgJiYgdGhpcy5vbmlkbGUoKSksIHRoaXMudGltZW91dEVudGVySWRsZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWwgaWRsZSB0aW1lclxuICAgKi9cbiAgX2NsZWFySWRsZSAoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX2lkbGVUaW1lcilcbiAgICB0aGlzLl9pZGxlVGltZXIgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHByb2Nlc3NlcyBhIHJlc3BvbnNlIGludG8gYW4gZWFzaWVyIHRvIGhhbmRsZSBmb3JtYXQuXG4gICAqIEFkZCB1bnRhZ2dlZCBudW1iZXJlZCByZXNwb25zZXMgKGUuZy4gRkVUQ0gpIGludG8gYSBuaWNlbHkgZmVhc2libGUgZm9ybVxuICAgKiBDaGVja3MgaWYgYSByZXNwb25zZSBpbmNsdWRlcyBvcHRpb25hbCByZXNwb25zZSBjb2Rlc1xuICAgKiBhbmQgY29waWVzIHRoZXNlIGludG8gc2VwYXJhdGUgcHJvcGVydGllcy4gRm9yIGV4YW1wbGUgdGhlXG4gICAqIGZvbGxvd2luZyByZXNwb25zZSBpbmNsdWRlcyBhIGNhcGFiaWxpdHkgbGlzdGluZyBhbmQgYSBodW1hblxuICAgKiByZWFkYWJsZSBtZXNzYWdlOlxuICAgKlxuICAgKiAgICAgKiBPSyBbQ0FQQUJJTElUWSBJRCBOQU1FU1BBQ0VdIEFsbCByZWFkeVxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBhZGRzIGEgJ2NhcGFiaWxpdHknIHByb3BlcnR5IHdpdGggYW4gYXJyYXkgdmFsdWUgWydJRCcsICdOQU1FU1BBQ0UnXVxuICAgKiB0byB0aGUgcmVzcG9uc2Ugb2JqZWN0LiBBZGRpdGlvbmFsbHkgJ0FsbCByZWFkeScgaXMgYWRkZWQgYXMgJ2h1bWFuUmVhZGFibGUnIHByb3BlcnR5LlxuICAgKlxuICAgKiBTZWUgcG9zc2libGVtIElNQVAgUmVzcG9uc2UgQ29kZXMgYXQgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzU1MzBcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHJlc3BvbnNlIFBhcnNlZCByZXNwb25zZSBvYmplY3RcbiAgICovXG4gIF9wcm9jZXNzUmVzcG9uc2UgKHJlc3BvbnNlKSB7XG4gICAgY29uc3QgY29tbWFuZCA9IHByb3BPcignJywgJ2NvbW1hbmQnLCByZXNwb25zZSkudG9VcHBlckNhc2UoKS50cmltKClcblxuICAgIC8vIG5vIGF0dHJpYnV0ZXNcbiAgICBpZiAoIXJlc3BvbnNlIHx8ICFyZXNwb25zZS5hdHRyaWJ1dGVzIHx8ICFyZXNwb25zZS5hdHRyaWJ1dGVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gdW50YWdnZWQgcmVzcG9uc2VzIHcvIHNlcXVlbmNlIG51bWJlcnNcbiAgICBpZiAocmVzcG9uc2UudGFnID09PSAnKicgJiYgL15cXGQrJC8udGVzdChyZXNwb25zZS5jb21tYW5kKSAmJiByZXNwb25zZS5hdHRyaWJ1dGVzWzBdLnR5cGUgPT09ICdBVE9NJykge1xuICAgICAgcmVzcG9uc2UubnIgPSBOdW1iZXIocmVzcG9uc2UuY29tbWFuZClcbiAgICAgIHJlc3BvbnNlLmNvbW1hbmQgPSAocmVzcG9uc2UuYXR0cmlidXRlcy5zaGlmdCgpLnZhbHVlIHx8ICcnKS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkudHJpbSgpXG4gICAgfVxuXG4gICAgLy8gbm8gb3B0aW9uYWwgcmVzcG9uc2UgY29kZVxuICAgIGlmIChbJ09LJywgJ05PJywgJ0JBRCcsICdCWUUnLCAnUFJFQVVUSCddLmluZGV4T2YoY29tbWFuZCkgPCAwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBJZiBsYXN0IGVsZW1lbnQgb2YgdGhlIHJlc3BvbnNlIGlzIFRFWFQgdGhlbiB0aGlzIGlzIGZvciBodW1hbnNcbiAgICBpZiAocmVzcG9uc2UuYXR0cmlidXRlc1tyZXNwb25zZS5hdHRyaWJ1dGVzLmxlbmd0aCAtIDFdLnR5cGUgPT09ICdURVhUJykge1xuICAgICAgcmVzcG9uc2UuaHVtYW5SZWFkYWJsZSA9IHJlc3BvbnNlLmF0dHJpYnV0ZXNbcmVzcG9uc2UuYXR0cmlidXRlcy5sZW5ndGggLSAxXS52YWx1ZVxuICAgIH1cblxuICAgIC8vIFBhcnNlIGFuZCBmb3JtYXQgQVRPTSB2YWx1ZXNcbiAgICBpZiAocmVzcG9uc2UuYXR0cmlidXRlc1swXS50eXBlID09PSAnQVRPTScgJiYgcmVzcG9uc2UuYXR0cmlidXRlc1swXS5zZWN0aW9uKSB7XG4gICAgICBjb25zdCBvcHRpb24gPSByZXNwb25zZS5hdHRyaWJ1dGVzWzBdLnNlY3Rpb24ubWFwKChrZXkpID0+IHtcbiAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShrZXkpKSB7XG4gICAgICAgICAgcmV0dXJuIGtleS5tYXAoKGtleSkgPT4gKGtleS52YWx1ZSB8fCAnJykudG9TdHJpbmcoKS50cmltKCkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIChrZXkudmFsdWUgfHwgJycpLnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKS50cmltKClcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgY29uc3Qga2V5ID0gb3B0aW9uLnNoaWZ0KClcbiAgICAgIHJlc3BvbnNlLmNvZGUgPSBrZXlcblxuICAgICAgaWYgKG9wdGlvbi5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmVzcG9uc2Vba2V5LnRvTG93ZXJDYXNlKCldID0gb3B0aW9uWzBdXG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbi5sZW5ndGggPiAxKSB7XG4gICAgICAgIHJlc3BvbnNlW2tleS50b0xvd2VyQ2FzZSgpXSA9IG9wdGlvblxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBhbiBFcnJvciBvYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWUgVmFsdWUgdG8gYmUgY2hlY2tlZFxuICAgKiBAcmV0dXJuIHtCb29sZWFufSByZXR1cm5zIHRydWUgaWYgdGhlIHZhbHVlIGlzIGFuIEVycm9yXG4gICAqL1xuICBpc0Vycm9yICh2YWx1ZSkge1xuICAgIHJldHVybiAhIU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkubWF0Y2goL0Vycm9yXFxdJC8pXG4gIH1cblxuICAvLyBDT01QUkVTU0lPTiBSRUxBVEVEIE1FVEhPRFNcblxuICAvKipcbiAgICogU2V0cyB1cCBkZWZsYXRlL2luZmxhdGUgZm9yIHRoZSBJT1xuICAgKi9cbiAgZW5hYmxlQ29tcHJlc3Npb24gKCkge1xuICAgIHRoaXMuX3NvY2tldE9uRGF0YSA9IHRoaXMuc29ja2V0Lm9uZGF0YVxuICAgIHRoaXMuY29tcHJlc3NlZCA9IHRydWVcblxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuV29ya2VyKSB7XG4gICAgICB0aGlzLl9jb21wcmVzc2lvbldvcmtlciA9IG5ldyBXb3JrZXIoVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbQ29tcHJlc3Npb25CbG9iXSkpKVxuICAgICAgdGhpcy5fY29tcHJlc3Npb25Xb3JrZXIub25tZXNzYWdlID0gKGUpID0+IHtcbiAgICAgICAgdmFyIG1lc3NhZ2UgPSBlLmRhdGEubWVzc2FnZVxuICAgICAgICB2YXIgZGF0YSA9IGUuZGF0YS5idWZmZXJcblxuICAgICAgICBzd2l0Y2ggKG1lc3NhZ2UpIHtcbiAgICAgICAgICBjYXNlIE1FU1NBR0VfSU5GTEFURURfREFUQV9SRUFEWTpcbiAgICAgICAgICAgIHRoaXMuX3NvY2tldE9uRGF0YSh7IGRhdGEgfSlcbiAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICBjYXNlIE1FU1NBR0VfREVGTEFURURfREFUQV9SRUFEWTpcbiAgICAgICAgICAgIHRoaXMud2FpdERyYWluID0gdGhpcy5zb2NrZXQuc2VuZChkYXRhKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9jb21wcmVzc2lvbldvcmtlci5vbmVycm9yID0gKGUpID0+IHtcbiAgICAgICAgdGhpcy5fb25FcnJvcihuZXcgRXJyb3IoJ0Vycm9yIGhhbmRsaW5nIGNvbXByZXNzaW9uIHdlYiB3b3JrZXI6ICcgKyBlLm1lc3NhZ2UpKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9jb21wcmVzc2lvbldvcmtlci5wb3N0TWVzc2FnZShjcmVhdGVNZXNzYWdlKE1FU1NBR0VfSU5JVElBTElaRV9XT1JLRVIpKVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpbmZsYXRlZFJlYWR5ID0gKGJ1ZmZlcikgPT4geyB0aGlzLl9zb2NrZXRPbkRhdGEoeyBkYXRhOiBidWZmZXIgfSkgfVxuICAgICAgY29uc3QgZGVmbGF0ZWRSZWFkeSA9IChidWZmZXIpID0+IHsgdGhpcy53YWl0RHJhaW4gPSB0aGlzLnNvY2tldC5zZW5kKGJ1ZmZlcikgfVxuICAgICAgdGhpcy5fY29tcHJlc3Npb24gPSBuZXcgQ29tcHJlc3Npb24oaW5mbGF0ZWRSZWFkeSwgZGVmbGF0ZWRSZWFkeSlcbiAgICB9XG5cbiAgICAvLyBvdmVycmlkZSBkYXRhIGhhbmRsZXIsIGRlY29tcHJlc3MgaW5jb21pbmcgZGF0YVxuICAgIHRoaXMuc29ja2V0Lm9uZGF0YSA9IChldnQpID0+IHtcbiAgICAgIGlmICghdGhpcy5jb21wcmVzc2VkKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fY29tcHJlc3Npb25Xb3JrZXIpIHtcbiAgICAgICAgdGhpcy5fY29tcHJlc3Npb25Xb3JrZXIucG9zdE1lc3NhZ2UoY3JlYXRlTWVzc2FnZShNRVNTQUdFX0lORkxBVEUsIGV2dC5kYXRhKSwgW2V2dC5kYXRhXSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2NvbXByZXNzaW9uLmluZmxhdGUoZXZ0LmRhdGEpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVuZG9lcyBhbnkgY2hhbmdlcyByZWxhdGVkIHRvIGNvbXByZXNzaW9uLiBUaGlzIG9ubHkgYmUgY2FsbGVkIHdoZW4gY2xvc2luZyB0aGUgY29ubmVjdGlvblxuICAgKi9cbiAgX2Rpc2FibGVDb21wcmVzc2lvbiAoKSB7XG4gICAgaWYgKCF0aGlzLmNvbXByZXNzZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuY29tcHJlc3NlZCA9IGZhbHNlXG4gICAgdGhpcy5zb2NrZXQub25kYXRhID0gdGhpcy5fc29ja2V0T25EYXRhXG4gICAgdGhpcy5fc29ja2V0T25EYXRhID0gbnVsbFxuXG4gICAgaWYgKHRoaXMuX2NvbXByZXNzaW9uV29ya2VyKSB7XG4gICAgICAvLyB0ZXJtaW5hdGUgdGhlIHdvcmtlclxuICAgICAgdGhpcy5fY29tcHJlc3Npb25Xb3JrZXIudGVybWluYXRlKClcbiAgICAgIHRoaXMuX2NvbXByZXNzaW9uV29ya2VyID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPdXRnb2luZyBwYXlsb2FkIG5lZWRzIHRvIGJlIGNvbXByZXNzZWQgYW5kIHNlbnQgdG8gc29ja2V0XG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGJ1ZmZlciBPdXRnb2luZyB1bmNvbXByZXNzZWQgYXJyYXlidWZmZXJcbiAgICovXG4gIF9zZW5kQ29tcHJlc3NlZCAoYnVmZmVyKSB7XG4gICAgLy8gZGVmbGF0ZVxuICAgIGlmICh0aGlzLl9jb21wcmVzc2lvbldvcmtlcikge1xuICAgICAgdGhpcy5fY29tcHJlc3Npb25Xb3JrZXIucG9zdE1lc3NhZ2UoY3JlYXRlTWVzc2FnZShNRVNTQUdFX0RFRkxBVEUsIGJ1ZmZlciksIFtidWZmZXJdKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jb21wcmVzc2lvbi5kZWZsYXRlKGJ1ZmZlcilcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgY3JlYXRlTWVzc2FnZSA9IChtZXNzYWdlLCBidWZmZXIpID0+ICh7IG1lc3NhZ2UsIGJ1ZmZlciB9KVxuIl19 From 880d2bf196c9f571cbbf3e99dd28349874e1bf58 Mon Sep 17 00:00:00 2001 From: mihkelkruuse Date: Tue, 25 Aug 2020 12:22:01 +0300 Subject: [PATCH 2/8] CNL-646 Updated error logging for socket sending --- src/imap.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/imap.js b/src/imap.js index be820c22..509df536 100644 --- a/src/imap.js +++ b/src/imap.js @@ -344,7 +344,12 @@ export default class Imap { if (this.compressed) { this._sendCompressed(buffer) } else { - this.socket.send(buffer) + if(!this.socket){ + this._onError(new Error("Error :: Unexpected socket close")); + } + else { + this.socket.send(buffer); + } } } From 28599cd172d4efeacb4543d6e67d9848fb0aaf8f Mon Sep 17 00:00:00 2001 From: mihkelkruuse Date: Tue, 25 Aug 2020 12:22:22 +0300 Subject: [PATCH 3/8] CNL-646 Updated error logging for socket sending --- src/imap.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/imap.js b/src/imap.js index 509df536..5044f8c0 100644 --- a/src/imap.js +++ b/src/imap.js @@ -344,7 +344,7 @@ export default class Imap { if (this.compressed) { this._sendCompressed(buffer) } else { - if(!this.socket){ + if (!this.socket) { this._onError(new Error("Error :: Unexpected socket close")); } else { From fccbfd8aa377a0445b2b0de03a839eb8555cd54b Mon Sep 17 00:00:00 2001 From: mihkelkruuse Date: Tue, 25 Aug 2020 12:27:13 +0300 Subject: [PATCH 4/8] Updated error logging for socket sending func --- src/imap.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/imap.js b/src/imap.js index be820c22..5044f8c0 100644 --- a/src/imap.js +++ b/src/imap.js @@ -344,7 +344,12 @@ export default class Imap { if (this.compressed) { this._sendCompressed(buffer) } else { - this.socket.send(buffer) + if (!this.socket) { + this._onError(new Error("Error :: Unexpected socket close")); + } + else { + this.socket.send(buffer); + } } } From c987b9941df70322ac4f659d1fb9ca8b7f6b617f Mon Sep 17 00:00:00 2001 From: mihkelkruuse Date: Tue, 25 Aug 2020 18:25:20 +0300 Subject: [PATCH 5/8] CNL-646 some updates --- dist/client.js | 1233 --------------------------------------- dist/command-builder.js | 233 -------- dist/command-parser.js | 567 ------------------ dist/common.js | 27 - dist/compression.js | 140 ----- dist/imap.js | 949 ------------------------------ dist/index.js | 52 -- dist/logger.js | 38 -- dist/special-use.js | 55 -- src/imap.js | 3 +- 10 files changed, 1 insertion(+), 3296 deletions(-) delete mode 100644 dist/client.js delete mode 100644 dist/command-builder.js delete mode 100644 dist/command-parser.js delete mode 100644 dist/common.js delete mode 100644 dist/compression.js delete mode 100644 dist/imap.js delete mode 100644 dist/index.js delete mode 100644 dist/logger.js delete mode 100644 dist/special-use.js diff --git a/dist/client.js b/dist/client.js deleted file mode 100644 index 4fdb8f09..00000000 --- a/dist/client.js +++ /dev/null @@ -1,1233 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = exports.DEFAULT_CLIENT_ID = exports.STATE_LOGOUT = exports.STATE_SELECTED = exports.STATE_AUTHENTICATED = exports.STATE_NOT_AUTHENTICATED = exports.STATE_CONNECTING = exports.TIMEOUT_IDLE = exports.TIMEOUT_NOOP = exports.TIMEOUT_CONNECTION = void 0; - -var _ramda = require("ramda"); - -var _emailjsUtf = require("emailjs-utf7"); - -var _commandParser = require("./command-parser"); - -var _commandBuilder = require("./command-builder"); - -var _logger = _interopRequireDefault(require("./logger")); - -var _imap = _interopRequireDefault(require("./imap")); - -var _common = require("./common"); - -var _specialUse = require("./special-use"); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } - -function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } - -const TIMEOUT_CONNECTION = 90 * 1000; // Milliseconds to wait for the IMAP greeting from the server - -exports.TIMEOUT_CONNECTION = TIMEOUT_CONNECTION; -const TIMEOUT_NOOP = 60 * 1000; // Milliseconds between NOOP commands while idling - -exports.TIMEOUT_NOOP = TIMEOUT_NOOP; -const TIMEOUT_IDLE = 60 * 1000; // Milliseconds until IDLE command is cancelled - -exports.TIMEOUT_IDLE = TIMEOUT_IDLE; -const STATE_CONNECTING = 1; -exports.STATE_CONNECTING = STATE_CONNECTING; -const STATE_NOT_AUTHENTICATED = 2; -exports.STATE_NOT_AUTHENTICATED = STATE_NOT_AUTHENTICATED; -const STATE_AUTHENTICATED = 3; -exports.STATE_AUTHENTICATED = STATE_AUTHENTICATED; -const STATE_SELECTED = 4; -exports.STATE_SELECTED = STATE_SELECTED; -const STATE_LOGOUT = 5; -exports.STATE_LOGOUT = STATE_LOGOUT; -const DEFAULT_CLIENT_ID = { - name: 'emailjs-imap-client' -}; -/** - * emailjs IMAP client - * - * @constructor - * - * @param {String} [host='localhost'] Hostname to conenct to - * @param {Number} [port=143] Port number to connect to - * @param {Object} [options] Optional options object - */ - -exports.DEFAULT_CLIENT_ID = DEFAULT_CLIENT_ID; - -class Client { - constructor(host, port, options = {}) { - this.timeoutConnection = TIMEOUT_CONNECTION; - this.timeoutNoop = TIMEOUT_NOOP; - this.timeoutIdle = TIMEOUT_IDLE; - this.serverId = false; // RFC 2971 Server ID as key value pairs - // Event placeholders - - this.oncert = null; - this.onupdate = null; - this.onselectmailbox = null; - this.onclosemailbox = null; - this._host = host; - this._clientId = (0, _ramda.propOr)(DEFAULT_CLIENT_ID, 'id', options); - this._state = false; // Current state - - this._authenticated = false; // Is the connection authenticated - - this._capability = []; // List of extensions the server supports - - this._selectedMailbox = false; // Selected mailbox - - this._enteredIdle = false; - this._idleTimeout = false; - this._enableCompression = !!options.enableCompression; - this._auth = options.auth; - this._requireTLS = !!options.requireTLS; - this._ignoreTLS = !!options.ignoreTLS; - this.client = new _imap.default(host, port, options); // IMAP client object - // Event Handlers - - this.client.onerror = this._onError.bind(this); - - this.client.oncert = cert => this.oncert && this.oncert(cert); // allows certificate handling for platforms w/o native tls support - - - this.client.onidle = () => this._onIdle(); // start idling - // Default handlers for untagged responses - - - this.client.setHandler('capability', response => this._untaggedCapabilityHandler(response)); // capability updates - - this.client.setHandler('ok', response => this._untaggedOkHandler(response)); // notifications - - this.client.setHandler('exists', response => this._untaggedExistsHandler(response)); // message count has changed - - this.client.setHandler('expunge', response => this._untaggedExpungeHandler(response)); // message has been deleted - - this.client.setHandler('fetch', response => this._untaggedFetchHandler(response)); // message has been updated (eg. flag change) - // Activate logging - - this.createLogger(); - this.logLevel = (0, _ramda.propOr)(_common.LOG_LEVEL_ALL, 'logLevel', options); - } - /** - * Called if the lower-level ImapClient has encountered an unrecoverable - * error during operation. Cleans up and propagates the error upwards. - */ - - - _onError(err) { - // make sure no idle timeout is pending anymore - clearTimeout(this._idleTimeout); // propagate the error upwards - - this.onerror && this.onerror(err); - } // - // - // PUBLIC API - // - // - - /** - * Initiate connection and login to the IMAP server - * - * @returns {Promise} Promise when login procedure is complete - */ - - - connect() { - var _this = this; - - return _asyncToGenerator(function* () { - try { - yield _this.openConnection(); - yield _this.upgradeConnection(); - - try { - yield _this.updateId(_this._clientId); - } catch (err) { - _this.logger.warn('Failed to update server id!', err.message); - } - - yield _this.login(_this._auth); - yield _this.compressConnection(); - - _this.logger.debug('Connection established, ready to roll!'); - - _this.client.onerror = _this._onError.bind(_this); - } catch (err) { - _this.logger.error('Could not connect to server', err); - - _this.close(err); // we don't really care whether this works or not - - - throw err; - } - })(); - } - /** - * Initiate connection to the IMAP server - * - * @returns {Promise} capability of server without login - */ - - - openConnection() { - return new Promise((resolve, reject) => { - const connectionTimeout = setTimeout(() => reject(new Error('Timeout connecting to server')), this.timeoutConnection); - this.logger.debug('Connecting to', this.client.host, ':', this.client.port); - - this._changeState(STATE_CONNECTING); - - this.client.connect().then(() => { - this.logger.debug('Socket opened, waiting for greeting from the server...'); - - this.client.onready = () => { - clearTimeout(connectionTimeout); - - this._changeState(STATE_NOT_AUTHENTICATED); - - this.updateCapability().then(() => resolve(this._capability)); - }; - - this.client.onerror = err => { - clearTimeout(connectionTimeout); - reject(err); - }; - }).catch(reject); - }); - } - /** - * Logout - * - * Send LOGOUT, to which the server responds by closing the connection. - * Use is discouraged if network status is unclear! If networks status is - * unclear, please use #close instead! - * - * LOGOUT details: - * https://tools.ietf.org/html/rfc3501#section-6.1.3 - * - * @returns {Promise} Resolves when server has closed the connection - */ - - - logout() { - var _this2 = this; - - return _asyncToGenerator(function* () { - _this2._changeState(STATE_LOGOUT); - - _this2.logger.debug('Logging out...'); - - yield _this2.client.logout(); - clearTimeout(_this2._idleTimeout); - })(); - } - /** - * Force-closes the current connection by closing the TCP socket. - * - * @returns {Promise} Resolves when socket is closed - */ - - - close(err) { - var _this3 = this; - - return _asyncToGenerator(function* () { - _this3._changeState(STATE_LOGOUT); - - clearTimeout(_this3._idleTimeout); - - _this3.logger.debug('Closing connection...'); - - yield _this3.client.close(err); - clearTimeout(_this3._idleTimeout); - })(); - } - /** - * Runs ID command, parses ID response, sets this.serverId - * - * ID details: - * http://tools.ietf.org/html/rfc2971 - * - * @param {Object} id ID as JSON object. See http://tools.ietf.org/html/rfc2971#section-3.3 for possible values - * @returns {Promise} Resolves when response has been parsed - */ - - - updateId(id) { - var _this4 = this; - - return _asyncToGenerator(function* () { - if (_this4._capability.indexOf('ID') < 0) return; - - _this4.logger.debug('Updating id...'); - - const command = 'ID'; - const attributes = id ? [(0, _ramda.flatten)(Object.entries(id))] : [null]; - const response = yield _this4.exec({ - command, - attributes - }, 'ID'); - const list = (0, _ramda.flatten)((0, _ramda.pathOr)([], ['payload', 'ID', '0', 'attributes', '0'], response).map(Object.values)); - const keys = list.filter((_, i) => i % 2 === 0); - const values = list.filter((_, i) => i % 2 === 1); - _this4.serverId = (0, _ramda.fromPairs)((0, _ramda.zip)(keys, values)); - - _this4.logger.debug('Server id updated!', _this4.serverId); - })(); - } - - _shouldSelectMailbox(path, ctx) { - if (!ctx) { - return true; - } - - const previousSelect = this.client.getPreviouslyQueued(['SELECT', 'EXAMINE'], ctx); - - if (previousSelect && previousSelect.request.attributes) { - const pathAttribute = previousSelect.request.attributes.find(attribute => attribute.type === 'STRING'); - - if (pathAttribute) { - return pathAttribute.value !== path; - } - } - - return this._selectedMailbox !== path; - } - /** - * Runs SELECT or EXAMINE to open a mailbox - * - * SELECT details: - * http://tools.ietf.org/html/rfc3501#section-6.3.1 - * EXAMINE details: - * http://tools.ietf.org/html/rfc3501#section-6.3.2 - * - * @param {String} path Full path to mailbox - * @param {Object} [options] Options object - * @returns {Promise} Promise with information about the selected mailbox - */ - - - selectMailbox(path, options = {}) { - var _this5 = this; - - return _asyncToGenerator(function* () { - const query = { - command: options.readOnly ? 'EXAMINE' : 'SELECT', - attributes: [{ - type: 'STRING', - value: path - }] - }; - - if (options.condstore && _this5._capability.indexOf('CONDSTORE') >= 0) { - query.attributes.push([{ - type: 'ATOM', - value: 'CONDSTORE' - }]); - } - - _this5.logger.debug('Opening', path, '...'); - - const response = yield _this5.exec(query, ['EXISTS', 'FLAGS', 'OK'], { - ctx: options.ctx - }); - const mailboxInfo = (0, _commandParser.parseSELECT)(response); - - _this5._changeState(STATE_SELECTED); - - if (_this5._selectedMailbox !== path && _this5.onclosemailbox) { - yield _this5.onclosemailbox(_this5._selectedMailbox); - } - - _this5._selectedMailbox = path; - - if (_this5.onselectmailbox) { - yield _this5.onselectmailbox(path, mailboxInfo); - } - - return mailboxInfo; - })(); - } - /** - * Runs NAMESPACE command - * - * NAMESPACE details: - * https://tools.ietf.org/html/rfc2342 - * - * @returns {Promise} Promise with namespace object - */ - - - listNamespaces() { - var _this6 = this; - - return _asyncToGenerator(function* () { - if (_this6._capability.indexOf('NAMESPACE') < 0) return false; - - _this6.logger.debug('Listing namespaces...'); - - const response = yield _this6.exec('NAMESPACE', 'NAMESPACE'); - return (0, _commandParser.parseNAMESPACE)(response); - })(); - } - /** - * Runs LIST and LSUB commands. Retrieves a tree of available mailboxes - * - * LIST details: - * http://tools.ietf.org/html/rfc3501#section-6.3.8 - * LSUB details: - * http://tools.ietf.org/html/rfc3501#section-6.3.9 - * - * @returns {Promise} Promise with list of mailboxes - */ - - - listMailboxes() { - var _this7 = this; - - return _asyncToGenerator(function* () { - const tree = { - root: true, - children: [] - }; - - _this7.logger.debug('Listing mailboxes...'); - - const listResponse = yield _this7.exec({ - command: 'LIST', - attributes: ['', '*'] - }, 'LIST'); - const list = (0, _ramda.pathOr)([], ['payload', 'LIST'], listResponse); - list.forEach(item => { - const attr = (0, _ramda.propOr)([], 'attributes', item); - if (attr.length < 3) return; - const path = (0, _ramda.pathOr)('', ['2', 'value'], attr); - const delim = (0, _ramda.pathOr)('/', ['1', 'value'], attr); - - const branch = _this7._ensurePath(tree, path, delim); - - branch.flags = (0, _ramda.propOr)([], '0', attr).map(({ - value - }) => value || ''); - branch.listed = true; - (0, _specialUse.checkSpecialUse)(branch); - }); - const lsubResponse = yield _this7.exec({ - command: 'LSUB', - attributes: ['', '*'] - }, 'LSUB'); - const lsub = (0, _ramda.pathOr)([], ['payload', 'LSUB'], lsubResponse); - lsub.forEach(item => { - const attr = (0, _ramda.propOr)([], 'attributes', item); - if (attr.length < 3) return; - const path = (0, _ramda.pathOr)('', ['2', 'value'], attr); - const delim = (0, _ramda.pathOr)('/', ['1', 'value'], attr); - - const branch = _this7._ensurePath(tree, path, delim); - - (0, _ramda.propOr)([], '0', attr).map((flag = '') => { - branch.flags = (0, _ramda.union)(branch.flags, [flag]); - }); - branch.subscribed = true; - }); - return tree; - })(); - } - /** - * Create a mailbox with the given path. - * - * CREATE details: - * http://tools.ietf.org/html/rfc3501#section-6.3.3 - * - * @param {String} path - * The path of the mailbox you would like to create. This method will - * handle utf7 encoding for you. - * @returns {Promise} - * Promise resolves if mailbox was created. - * In the event the server says NO [ALREADYEXISTS], we treat that as success. - */ - - - createMailbox(path) { - var _this8 = this; - - return _asyncToGenerator(function* () { - _this8.logger.debug('Creating mailbox', path, '...'); - - try { - yield _this8.exec({ - command: 'CREATE', - attributes: [(0, _emailjsUtf.imapEncode)(path)] - }); - } catch (err) { - if (err && err.code === 'ALREADYEXISTS') { - return; - } - - throw err; - } - })(); - } - /** - * Delete a mailbox with the given path. - * - * DELETE details: - * https://tools.ietf.org/html/rfc3501#section-6.3.4 - * - * @param {String} path - * The path of the mailbox you would like to delete. This method will - * handle utf7 encoding for you. - * @returns {Promise} - * Promise resolves if mailbox was deleted. - */ - - - deleteMailbox(path) { - this.logger.debug('Deleting mailbox', path, '...'); - return this.exec({ - command: 'DELETE', - attributes: [(0, _emailjsUtf.imapEncode)(path)] - }); - } - /** - * Runs FETCH command - * - * FETCH details: - * http://tools.ietf.org/html/rfc3501#section-6.4.5 - * CHANGEDSINCE details: - * https://tools.ietf.org/html/rfc4551#section-3.3 - * - * @param {String} path The path for the mailbox which should be selected for the command. Selects mailbox if necessary - * @param {String} sequence Sequence set, eg 1:* for all messages - * @param {Object} [items] Message data item names or macro - * @param {Object} [options] Query modifiers - * @returns {Promise} Promise with the fetched message info - */ - - - listMessages(path, sequence, items = [{ - fast: true - }], options = {}) { - var _this9 = this; - - return _asyncToGenerator(function* () { - _this9.logger.debug('Fetching messages', sequence, 'from', path, '...'); - - const command = (0, _commandBuilder.buildFETCHCommand)(sequence, items, options); - const response = yield _this9.exec(command, 'FETCH', { - precheck: ctx => _this9._shouldSelectMailbox(path, ctx) ? _this9.selectMailbox(path, { - ctx - }) : Promise.resolve() - }); - return (0, _commandParser.parseFETCH)(response); - })(); - } - /** - * Runs SEARCH command - * - * SEARCH details: - * http://tools.ietf.org/html/rfc3501#section-6.4.4 - * - * @param {String} path The path for the mailbox which should be selected for the command. Selects mailbox if necessary - * @param {Object} query Search terms - * @param {Object} [options] Query modifiers - * @returns {Promise} Promise with the array of matching seq. or uid numbers - */ - - - search(path, query, options = {}) { - var _this10 = this; - - return _asyncToGenerator(function* () { - _this10.logger.debug('Searching in', path, '...'); - - const command = (0, _commandBuilder.buildSEARCHCommand)(query, options); - const response = yield _this10.exec(command, 'SEARCH', { - precheck: ctx => _this10._shouldSelectMailbox(path, ctx) ? _this10.selectMailbox(path, { - ctx - }) : Promise.resolve() - }); - return (0, _commandParser.parseSEARCH)(response); - })(); - } - /** - * Runs STORE command - * - * STORE details: - * http://tools.ietf.org/html/rfc3501#section-6.4.6 - * - * @param {String} path The path for the mailbox which should be selected for the command. Selects mailbox if necessary - * @param {String} sequence Message selector which the flag change is applied to - * @param {Array} flags - * @param {Object} [options] Query modifiers - * @returns {Promise} Promise with the array of matching seq. or uid numbers - */ - - - setFlags(path, sequence, flags, options) { - let key = ''; - let list = []; - - if (Array.isArray(flags) || typeof flags !== 'object') { - list = [].concat(flags || []); - key = ''; - } else if (flags.add) { - list = [].concat(flags.add || []); - key = '+'; - } else if (flags.set) { - key = ''; - list = [].concat(flags.set || []); - } else if (flags.remove) { - key = '-'; - list = [].concat(flags.remove || []); - } - - this.logger.debug('Setting flags on', sequence, 'in', path, '...'); - return this.store(path, sequence, key + 'FLAGS', list, options); - } - /** - * Runs STORE command - * - * STORE details: - * http://tools.ietf.org/html/rfc3501#section-6.4.6 - * - * @param {String} path The path for the mailbox which should be selected for the command. Selects mailbox if necessary - * @param {String} sequence Message selector which the flag change is applied to - * @param {String} action STORE method to call, eg "+FLAGS" - * @param {Array} flags - * @param {Object} [options] Query modifiers - * @returns {Promise} Promise with the array of matching seq. or uid numbers - */ - - - store(path, sequence, action, flags, options = {}) { - var _this11 = this; - - return _asyncToGenerator(function* () { - const command = (0, _commandBuilder.buildSTORECommand)(sequence, action, flags, options); - const response = yield _this11.exec(command, 'FETCH', { - precheck: ctx => _this11._shouldSelectMailbox(path, ctx) ? _this11.selectMailbox(path, { - ctx - }) : Promise.resolve() - }); - return (0, _commandParser.parseFETCH)(response); - })(); - } - /** - * Runs APPEND command - * - * APPEND details: - * http://tools.ietf.org/html/rfc3501#section-6.3.11 - * - * @param {String} destination The mailbox where to append the message - * @param {String} message The message to append - * @param {Array} options.flags Any flags you want to set on the uploaded message. Defaults to [\Seen]. (optional) - * @returns {Promise} Promise with the array of matching seq. or uid numbers - */ - - - upload(destination, message, options = {}) { - var _this12 = this; - - return _asyncToGenerator(function* () { - const flags = (0, _ramda.propOr)(['\\Seen'], 'flags', options).map(value => ({ - type: 'atom', - value - })); - const command = { - command: 'APPEND', - attributes: [{ - type: 'atom', - value: destination - }, flags, { - type: 'literal', - value: message - }] - }; - - _this12.logger.debug('Uploading message to', destination, '...'); - - const response = yield _this12.exec(command); - return (0, _commandParser.parseAPPEND)(response); - })(); - } - /** - * Deletes messages from a selected mailbox - * - * EXPUNGE details: - * http://tools.ietf.org/html/rfc3501#section-6.4.3 - * UID EXPUNGE details: - * https://tools.ietf.org/html/rfc4315#section-2.1 - * - * If possible (byUid:true and UIDPLUS extension supported), uses UID EXPUNGE - * command to delete a range of messages, otherwise falls back to EXPUNGE. - * - * NB! This method might be destructive - if EXPUNGE is used, then any messages - * with \Deleted flag set are deleted - * - * @param {String} path The path for the mailbox which should be selected for the command. Selects mailbox if necessary - * @param {String} sequence Message range to be deleted - * @param {Object} [options] Query modifiers - * @returns {Promise} Promise - */ - - - deleteMessages(path, sequence, options = {}) { - var _this13 = this; - - return _asyncToGenerator(function* () { - // add \Deleted flag to the messages and run EXPUNGE or UID EXPUNGE - _this13.logger.debug('Deleting messages', sequence, 'in', path, '...'); - - const useUidPlus = options.byUid && _this13._capability.indexOf('UIDPLUS') >= 0; - const uidExpungeCommand = { - command: 'UID EXPUNGE', - attributes: [{ - type: 'sequence', - value: sequence - }] - }; - yield _this13.setFlags(path, sequence, { - add: '\\Deleted' - }, options); - const cmd = useUidPlus ? uidExpungeCommand : 'EXPUNGE'; - return _this13.exec(cmd, null, { - precheck: ctx => _this13._shouldSelectMailbox(path, ctx) ? _this13.selectMailbox(path, { - ctx - }) : Promise.resolve() - }); - })(); - } - /** - * Copies a range of messages from the active mailbox to the destination mailbox. - * Silent method (unless an error occurs), by default returns no information. - * - * COPY details: - * http://tools.ietf.org/html/rfc3501#section-6.4.7 - * - * @param {String} path The path for the mailbox which should be selected for the command. Selects mailbox if necessary - * @param {String} sequence Message range to be copied - * @param {String} destination Destination mailbox path - * @param {Object} [options] Query modifiers - * @param {Boolean} [options.byUid] If true, uses UID COPY instead of COPY - * @returns {Promise} Promise - */ - - - copyMessages(path, sequence, destination, options = {}) { - var _this14 = this; - - return _asyncToGenerator(function* () { - _this14.logger.debug('Copying messages', sequence, 'from', path, 'to', destination, '...'); - - const response = yield _this14.exec({ - command: options.byUid ? 'UID COPY' : 'COPY', - attributes: [{ - type: 'sequence', - value: sequence - }, { - type: 'atom', - value: destination - }] - }, null, { - precheck: ctx => _this14._shouldSelectMailbox(path, ctx) ? _this14.selectMailbox(path, { - ctx - }) : Promise.resolve() - }); - return (0, _commandParser.parseCOPY)(response); - })(); - } - /** - * Moves a range of messages from the active mailbox to the destination mailbox. - * Prefers the MOVE extension but if not available, falls back to - * COPY + EXPUNGE - * - * MOVE details: - * http://tools.ietf.org/html/rfc6851 - * - * @param {String} path The path for the mailbox which should be selected for the command. Selects mailbox if necessary - * @param {String} sequence Message range to be moved - * @param {String} destination Destination mailbox path - * @param {Object} [options] Query modifiers - * @returns {Promise} Promise - */ - - - moveMessages(path, sequence, destination, options = {}) { - var _this15 = this; - - return _asyncToGenerator(function* () { - _this15.logger.debug('Moving messages', sequence, 'from', path, 'to', destination, '...'); - - if (_this15._capability.indexOf('MOVE') === -1) { - // Fallback to COPY + EXPUNGE - yield _this15.copyMessages(path, sequence, destination, options); - return _this15.deleteMessages(path, sequence, options); - } // If possible, use MOVE - - - return _this15.exec({ - command: options.byUid ? 'UID MOVE' : 'MOVE', - attributes: [{ - type: 'sequence', - value: sequence - }, { - type: 'atom', - value: destination - }] - }, ['OK'], { - precheck: ctx => _this15._shouldSelectMailbox(path, ctx) ? _this15.selectMailbox(path, { - ctx - }) : Promise.resolve() - }); - })(); - } - /** - * Runs COMPRESS command - * - * COMPRESS details: - * https://tools.ietf.org/html/rfc4978 - */ - - - compressConnection() { - var _this16 = this; - - return _asyncToGenerator(function* () { - if (!_this16._enableCompression || _this16._capability.indexOf('COMPRESS=DEFLATE') < 0 || _this16.client.compressed) { - return false; - } - - _this16.logger.debug('Enabling compression...'); - - yield _this16.exec({ - command: 'COMPRESS', - attributes: [{ - type: 'ATOM', - value: 'DEFLATE' - }] - }); - - _this16.client.enableCompression(); - - _this16.logger.debug('Compression enabled, all data sent and received is deflated!'); - })(); - } - /** - * Runs LOGIN or AUTHENTICATE XOAUTH2 command - * - * LOGIN details: - * http://tools.ietf.org/html/rfc3501#section-6.2.3 - * XOAUTH2 details: - * https://developers.google.com/gmail/xoauth2_protocol#imap_protocol_exchange - * - * @param {String} auth.user - * @param {String} auth.pass - * @param {String} auth.xoauth2 - */ - - - login(auth) { - var _this17 = this; - - return _asyncToGenerator(function* () { - let command; - const options = {}; - - if (!auth) { - throw new Error('Authentication information not provided'); - } - - if (_this17._capability.indexOf('AUTH=XOAUTH2') >= 0 && auth && auth.xoauth2) { - command = { - command: 'AUTHENTICATE', - attributes: [{ - type: 'ATOM', - value: 'XOAUTH2' - }, { - type: 'ATOM', - value: (0, _commandBuilder.buildXOAuth2Token)(auth.user, auth.xoauth2), - sensitive: true - }] - }; - options.errorResponseExpectsEmptyLine = true; // + tagged error response expects an empty line in return - } else { - command = { - command: 'login', - attributes: [{ - type: 'STRING', - value: auth.user || '' - }, { - type: 'STRING', - value: auth.pass || '', - sensitive: true - }] - }; - } - - _this17.logger.debug('Logging in...'); - - const response = yield _this17.exec(command, 'capability', options); - /* - * update post-auth capabilites - * capability list shouldn't contain auth related stuff anymore - * but some new extensions might have popped up that do not - * make much sense in the non-auth state - */ - - if (response.capability && response.capability.length) { - // capabilites were listed with the OK [CAPABILITY ...] response - _this17._capability = response.capability; - } else if (response.payload && response.payload.CAPABILITY && response.payload.CAPABILITY.length) { - // capabilites were listed with * CAPABILITY ... response - _this17._capability = response.payload.CAPABILITY.pop().attributes.map((capa = '') => capa.value.toUpperCase().trim()); - } else { - // capabilities were not automatically listed, reload - yield _this17.updateCapability(true); - } - - _this17._changeState(STATE_AUTHENTICATED); - - _this17._authenticated = true; - - _this17.logger.debug('Login successful, post-auth capabilites updated!', _this17._capability); - })(); - } - /** - * Run an IMAP command. - * - * @param {Object} request Structured request object - * @param {Array} acceptUntagged a list of untagged responses that will be included in 'payload' property - */ - - - exec(request, acceptUntagged, options) { - var _this18 = this; - - return _asyncToGenerator(function* () { - _this18.breakIdle(); - - const response = yield _this18.client.enqueueCommand(request, acceptUntagged, options); - - if (response && response.capability) { - _this18._capability = response.capability; - } - - return response; - })(); - } - /** - * The connection is idling. Sends a NOOP or IDLE command - * - * IDLE details: - * https://tools.ietf.org/html/rfc2177 - */ - - - enterIdle() { - if (this._enteredIdle) { - return; - } - - const supportsIdle = this._capability.indexOf('IDLE') >= 0; - this._enteredIdle = supportsIdle && this._selectedMailbox ? 'IDLE' : 'NOOP'; - this.logger.debug('Entering idle with ' + this._enteredIdle); - - if (this._enteredIdle === 'NOOP') { - this._idleTimeout = setTimeout(() => { - this.logger.debug('Sending NOOP'); - this.exec('NOOP'); - }, this.timeoutNoop); - } else if (this._enteredIdle === 'IDLE') { - this.client.enqueueCommand({ - command: 'IDLE' - }); - this._idleTimeout = setTimeout(() => { - this.client.send('DONE\r\n'); - this._enteredIdle = false; - this.logger.debug('Idle terminated'); - }, this.timeoutIdle); - } - } - /** - * Stops actions related idling, if IDLE is supported, sends DONE to stop it - */ - - - breakIdle() { - if (!this._enteredIdle) { - return; - } - - clearTimeout(this._idleTimeout); - - if (this._enteredIdle === 'IDLE') { - this.client.send('DONE\r\n'); - this.logger.debug('Idle terminated'); - } - - this._enteredIdle = false; - } - /** - * Runs STARTTLS command if needed - * - * STARTTLS details: - * http://tools.ietf.org/html/rfc3501#section-6.2.1 - * - * @param {Boolean} [forced] By default the command is not run if capability is already listed. Set to true to skip this validation - */ - - - upgradeConnection() { - var _this19 = this; - - return _asyncToGenerator(function* () { - // skip request, if already secured - if (_this19.client.secureMode) { - return false; - } // skip if STARTTLS not available or starttls support disabled - - - if ((_this19._capability.indexOf('STARTTLS') < 0 || _this19._ignoreTLS) && !_this19._requireTLS) { - return false; - } - - _this19.logger.debug('Encrypting connection...'); - - yield _this19.exec('STARTTLS'); - _this19._capability = []; - - _this19.client.upgrade(); - - return _this19.updateCapability(); - })(); - } - /** - * Runs CAPABILITY command - * - * CAPABILITY details: - * http://tools.ietf.org/html/rfc3501#section-6.1.1 - * - * Doesn't register untagged CAPABILITY handler as this is already - * handled by global handler - * - * @param {Boolean} [forced] By default the command is not run if capability is already listed. Set to true to skip this validation - */ - - - updateCapability(forced) { - var _this20 = this; - - return _asyncToGenerator(function* () { - // skip request, if not forced update and capabilities are already loaded - if (!forced && _this20._capability.length) { - return; - } // If STARTTLS is required then skip capability listing as we are going to try - // STARTTLS anyway and we re-check capabilities after connection is secured - - - if (!_this20.client.secureMode && _this20._requireTLS) { - return; - } - - _this20.logger.debug('Updating capability...'); - - return _this20.exec('CAPABILITY'); - })(); - } - - hasCapability(capa = '') { - return this._capability.indexOf(capa.toUpperCase().trim()) >= 0; - } // Default handlers for untagged responses - - /** - * Checks if an untagged OK includes [CAPABILITY] tag and updates capability object - * - * @param {Object} response Parsed server response - * @param {Function} next Until called, server responses are not processed - */ - - - _untaggedOkHandler(response) { - if (response && response.capability) { - this._capability = response.capability; - } - } - /** - * Updates capability object - * - * @param {Object} response Parsed server response - * @param {Function} next Until called, server responses are not processed - */ - - - _untaggedCapabilityHandler(response) { - this._capability = (0, _ramda.pipe)((0, _ramda.propOr)([], 'attributes'), (0, _ramda.map)(({ - value - }) => (value || '').toUpperCase().trim()))(response); - } - /** - * Updates existing message count - * - * @param {Object} response Parsed server response - * @param {Function} next Until called, server responses are not processed - */ - - - _untaggedExistsHandler(response) { - if (response && Object.prototype.hasOwnProperty.call(response, 'nr')) { - this.onupdate && this.onupdate(this._selectedMailbox, 'exists', response.nr); - } - } - /** - * Indicates a message has been deleted - * - * @param {Object} response Parsed server response - * @param {Function} next Until called, server responses are not processed - */ - - - _untaggedExpungeHandler(response) { - if (response && Object.prototype.hasOwnProperty.call(response, 'nr')) { - this.onupdate && this.onupdate(this._selectedMailbox, 'expunge', response.nr); - } - } - /** - * Indicates that flags have been updated for a message - * - * @param {Object} response Parsed server response - * @param {Function} next Until called, server responses are not processed - */ - - - _untaggedFetchHandler(response) { - this.onupdate && this.onupdate(this._selectedMailbox, 'fetch', [].concat((0, _commandParser.parseFETCH)({ - payload: { - FETCH: [response] - } - }) || []).shift()); - } // Private helpers - - /** - * Indicates that the connection started idling. Initiates a cycle - * of NOOPs or IDLEs to receive notifications about updates in the server - */ - - - _onIdle() { - if (!this._authenticated || this._enteredIdle) { - // No need to IDLE when not logged in or already idling - return; - } - - this.logger.debug('Client started idling'); - this.enterIdle(); - } - /** - * Updates the IMAP state value for the current connection - * - * @param {Number} newState The state you want to change to - */ - - - _changeState(newState) { - if (newState === this._state) { - return; - } - - this.logger.debug('Entering state: ' + newState); // if a mailbox was opened, emit onclosemailbox and clear selectedMailbox value - - if (this._state === STATE_SELECTED && this._selectedMailbox) { - this.onclosemailbox && this.onclosemailbox(this._selectedMailbox); - this._selectedMailbox = false; - } - - this._state = newState; - } - /** - * Ensures a path exists in the Mailbox tree - * - * @param {Object} tree Mailbox tree - * @param {String} path - * @param {String} delimiter - * @return {Object} branch for used path - */ - - - _ensurePath(tree, path, delimiter) { - const names = path.split(delimiter); - let branch = tree; - - for (let i = 0; i < names.length; i++) { - let found = false; - - for (let j = 0; j < branch.children.length; j++) { - if (this._compareMailboxNames(branch.children[j].name, (0, _emailjsUtf.imapDecode)(names[i]))) { - branch = branch.children[j]; - found = true; - break; - } - } - - if (!found) { - branch.children.push({ - name: (0, _emailjsUtf.imapDecode)(names[i]), - delimiter: delimiter, - path: names.slice(0, i + 1).join(delimiter), - children: [] - }); - branch = branch.children[branch.children.length - 1]; - } - } - - return branch; - } - /** - * Compares two mailbox names. Case insensitive in case of INBOX, otherwise case sensitive - * - * @param {String} a Mailbox name - * @param {String} b Mailbox name - * @returns {Boolean} True if the folder names match - */ - - - _compareMailboxNames(a, b) { - return (a.toUpperCase() === 'INBOX' ? 'INBOX' : a) === (b.toUpperCase() === 'INBOX' ? 'INBOX' : b); - } - - createLogger(creator = _logger.default) { - const logger = creator((this._auth || {}).user || '', this._host); - this.logger = this.client.logger = { - debug: (...msgs) => { - if (_common.LOG_LEVEL_DEBUG >= this.logLevel) { - logger.debug(msgs); - } - }, - info: (...msgs) => { - if (_common.LOG_LEVEL_INFO >= this.logLevel) { - logger.info(msgs); - } - }, - warn: (...msgs) => { - if (_common.LOG_LEVEL_WARN >= this.logLevel) { - logger.warn(msgs); - } - }, - error: (...msgs) => { - if (_common.LOG_LEVEL_ERROR >= this.logLevel) { - logger.error(msgs); - } - } - }; - } - -} - -exports.default = Client; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGllbnQuanMiXSwibmFtZXMiOlsiVElNRU9VVF9DT05ORUNUSU9OIiwiVElNRU9VVF9OT09QIiwiVElNRU9VVF9JRExFIiwiU1RBVEVfQ09OTkVDVElORyIsIlNUQVRFX05PVF9BVVRIRU5USUNBVEVEIiwiU1RBVEVfQVVUSEVOVElDQVRFRCIsIlNUQVRFX1NFTEVDVEVEIiwiU1RBVEVfTE9HT1VUIiwiREVGQVVMVF9DTElFTlRfSUQiLCJuYW1lIiwiQ2xpZW50IiwiY29uc3RydWN0b3IiLCJob3N0IiwicG9ydCIsIm9wdGlvbnMiLCJ0aW1lb3V0Q29ubmVjdGlvbiIsInRpbWVvdXROb29wIiwidGltZW91dElkbGUiLCJzZXJ2ZXJJZCIsIm9uY2VydCIsIm9udXBkYXRlIiwib25zZWxlY3RtYWlsYm94Iiwib25jbG9zZW1haWxib3giLCJfaG9zdCIsIl9jbGllbnRJZCIsIl9zdGF0ZSIsIl9hdXRoZW50aWNhdGVkIiwiX2NhcGFiaWxpdHkiLCJfc2VsZWN0ZWRNYWlsYm94IiwiX2VudGVyZWRJZGxlIiwiX2lkbGVUaW1lb3V0IiwiX2VuYWJsZUNvbXByZXNzaW9uIiwiZW5hYmxlQ29tcHJlc3Npb24iLCJfYXV0aCIsImF1dGgiLCJfcmVxdWlyZVRMUyIsInJlcXVpcmVUTFMiLCJfaWdub3JlVExTIiwiaWdub3JlVExTIiwiY2xpZW50IiwiSW1hcENsaWVudCIsIm9uZXJyb3IiLCJfb25FcnJvciIsImJpbmQiLCJjZXJ0Iiwib25pZGxlIiwiX29uSWRsZSIsInNldEhhbmRsZXIiLCJyZXNwb25zZSIsIl91bnRhZ2dlZENhcGFiaWxpdHlIYW5kbGVyIiwiX3VudGFnZ2VkT2tIYW5kbGVyIiwiX3VudGFnZ2VkRXhpc3RzSGFuZGxlciIsIl91bnRhZ2dlZEV4cHVuZ2VIYW5kbGVyIiwiX3VudGFnZ2VkRmV0Y2hIYW5kbGVyIiwiY3JlYXRlTG9nZ2VyIiwibG9nTGV2ZWwiLCJMT0dfTEVWRUxfQUxMIiwiZXJyIiwiY2xlYXJUaW1lb3V0IiwiY29ubmVjdCIsIm9wZW5Db25uZWN0aW9uIiwidXBncmFkZUNvbm5lY3Rpb24iLCJ1cGRhdGVJZCIsImxvZ2dlciIsIndhcm4iLCJtZXNzYWdlIiwibG9naW4iLCJjb21wcmVzc0Nvbm5lY3Rpb24iLCJkZWJ1ZyIsImVycm9yIiwiY2xvc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImNvbm5lY3Rpb25UaW1lb3V0Iiwic2V0VGltZW91dCIsIkVycm9yIiwiX2NoYW5nZVN0YXRlIiwidGhlbiIsIm9ucmVhZHkiLCJ1cGRhdGVDYXBhYmlsaXR5IiwiY2F0Y2giLCJsb2dvdXQiLCJpZCIsImluZGV4T2YiLCJjb21tYW5kIiwiYXR0cmlidXRlcyIsIk9iamVjdCIsImVudHJpZXMiLCJleGVjIiwibGlzdCIsIm1hcCIsInZhbHVlcyIsImtleXMiLCJmaWx0ZXIiLCJfIiwiaSIsIl9zaG91bGRTZWxlY3RNYWlsYm94IiwicGF0aCIsImN0eCIsInByZXZpb3VzU2VsZWN0IiwiZ2V0UHJldmlvdXNseVF1ZXVlZCIsInJlcXVlc3QiLCJwYXRoQXR0cmlidXRlIiwiZmluZCIsImF0dHJpYnV0ZSIsInR5cGUiLCJ2YWx1ZSIsInNlbGVjdE1haWxib3giLCJxdWVyeSIsInJlYWRPbmx5IiwiY29uZHN0b3JlIiwicHVzaCIsIm1haWxib3hJbmZvIiwibGlzdE5hbWVzcGFjZXMiLCJsaXN0TWFpbGJveGVzIiwidHJlZSIsInJvb3QiLCJjaGlsZHJlbiIsImxpc3RSZXNwb25zZSIsImZvckVhY2giLCJpdGVtIiwiYXR0ciIsImxlbmd0aCIsImRlbGltIiwiYnJhbmNoIiwiX2Vuc3VyZVBhdGgiLCJmbGFncyIsImxpc3RlZCIsImxzdWJSZXNwb25zZSIsImxzdWIiLCJmbGFnIiwic3Vic2NyaWJlZCIsImNyZWF0ZU1haWxib3giLCJjb2RlIiwiZGVsZXRlTWFpbGJveCIsImxpc3RNZXNzYWdlcyIsInNlcXVlbmNlIiwiaXRlbXMiLCJmYXN0IiwicHJlY2hlY2siLCJzZWFyY2giLCJzZXRGbGFncyIsImtleSIsIkFycmF5IiwiaXNBcnJheSIsImNvbmNhdCIsImFkZCIsInNldCIsInJlbW92ZSIsInN0b3JlIiwiYWN0aW9uIiwidXBsb2FkIiwiZGVzdGluYXRpb24iLCJkZWxldGVNZXNzYWdlcyIsInVzZVVpZFBsdXMiLCJieVVpZCIsInVpZEV4cHVuZ2VDb21tYW5kIiwiY21kIiwiY29weU1lc3NhZ2VzIiwibW92ZU1lc3NhZ2VzIiwiY29tcHJlc3NlZCIsInhvYXV0aDIiLCJ1c2VyIiwic2Vuc2l0aXZlIiwiZXJyb3JSZXNwb25zZUV4cGVjdHNFbXB0eUxpbmUiLCJwYXNzIiwiY2FwYWJpbGl0eSIsInBheWxvYWQiLCJDQVBBQklMSVRZIiwicG9wIiwiY2FwYSIsInRvVXBwZXJDYXNlIiwidHJpbSIsImFjY2VwdFVudGFnZ2VkIiwiYnJlYWtJZGxlIiwiZW5xdWV1ZUNvbW1hbmQiLCJlbnRlcklkbGUiLCJzdXBwb3J0c0lkbGUiLCJzZW5kIiwic2VjdXJlTW9kZSIsInVwZ3JhZGUiLCJmb3JjZWQiLCJoYXNDYXBhYmlsaXR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwibnIiLCJGRVRDSCIsInNoaWZ0IiwibmV3U3RhdGUiLCJkZWxpbWl0ZXIiLCJuYW1lcyIsInNwbGl0IiwiZm91bmQiLCJqIiwiX2NvbXBhcmVNYWlsYm94TmFtZXMiLCJzbGljZSIsImpvaW4iLCJhIiwiYiIsImNyZWF0b3IiLCJjcmVhdGVEZWZhdWx0TG9nZ2VyIiwibXNncyIsIkxPR19MRVZFTF9ERUJVRyIsImluZm8iLCJMT0dfTEVWRUxfSU5GTyIsIkxPR19MRVZFTF9XQVJOIiwiTE9HX0xFVkVMX0VSUk9SIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBUUE7O0FBT0E7O0FBQ0E7O0FBQ0E7O0FBUUE7Ozs7Ozs7O0FBSU8sTUFBTUEsa0JBQWtCLEdBQUcsS0FBSyxJQUFoQyxDLENBQXFDOzs7QUFDckMsTUFBTUMsWUFBWSxHQUFHLEtBQUssSUFBMUIsQyxDQUErQjs7O0FBQy9CLE1BQU1D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biwgemlwLCBmcm9tUGFpcnMsIHByb3BPciwgcGF0aE9yLCBmbGF0dGVuIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBpbWFwRW5jb2RlLCBpbWFwRGVjb2RlIH0gZnJvbSAnZW1haWxqcy11dGY3J1xuaW1wb3J0IHtcbiAgcGFyc2VBUFBFTkQsXG4gIHBhcnNlQ09QWSxcbiAgcGFyc2VOQU1FU1BBQ0UsXG4gIHBhcnNlU0VMRUNULFxuICBwYXJzZUZFVENILFxuICBwYXJzZVNFQVJDSFxufSBmcm9tICcuL2NvbW1hbmQtcGFyc2VyJ1xuaW1wb3J0IHtcbiAgYnVpbGRGRVRDSENvbW1hbmQsXG4gIGJ1aWxkWE9BdXRoMlRva2VuLFxuICBidWlsZFNFQVJDSENvbW1hbmQsXG4gIGJ1aWxkU1RPUkVDb21tYW5kXG59IGZyb20gJy4vY29tbWFuZC1idWlsZGVyJ1xuXG5pbXBvcnQgY3JlYXRlRGVmYXVsdExvZ2dlciBmcm9tICcuL2xvZ2dlcidcbmltcG9ydCBJbWFwQ2xpZW50IGZyb20gJy4vaW1hcCdcbmltcG9ydCB7XG4gIExPR19MRVZFTF9FUlJPUixcbiAgTE9HX0xFVkVMX1dBUk4sXG4gIExPR19MRVZFTF9JTkZPLFxuICBMT0dfTEVWRUxfREVCVUcsXG4gIExPR19MRVZFTF9BTExcbn0gZnJvbSAnLi9jb21tb24nXG5cbmltcG9ydCB7XG4gIGNoZWNrU3BlY2lhbFVzZVxufSBmcm9tICcuL3NwZWNpYWwtdXNlJ1xuXG5leHBvcnQgY29uc3QgVElNRU9VVF9DT05ORUNUSU9OID0gOTAgKiAxMDAwIC8vIE1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciB0aGUgSU1BUCBncmVldGluZyBmcm9tIHRoZSBzZXJ2ZXJcbmV4cG9ydCBjb25zdCBUSU1FT1VUX05PT1AgPSA2MCAqIDEwMDAgLy8gTWlsbGlzZWNvbmRzIGJldHdlZW4gTk9PUCBjb21tYW5kcyB3aGlsZSBpZGxpbmdcbmV4cG9ydCBjb25zdCBUSU1FT1VUX0lETEUgPSA2MCAqIDEwMDAgLy8gTWlsbGlzZWNvbmRzIHVudGlsIElETEUgY29tbWFuZCBpcyBjYW5jZWxsZWRcblxuZXhwb3J0IGNvbnN0IFNUQVRFX0NPTk5FQ1RJTkcgPSAxXG5leHBvcnQgY29uc3QgU1RBVEVfTk9UX0FVVEhFTlRJQ0FURUQgPSAyXG5leHBvcnQgY29uc3QgU1RBVEVfQVVUSEVOVElDQVRFRCA9IDNcbmV4cG9ydCBjb25zdCBTVEFURV9TRUxFQ1RFRCA9IDRcbmV4cG9ydCBjb25zdCBTVEFURV9MT0dPVVQgPSA1XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0NMSUVOVF9JRCA9IHtcbiAgbmFtZTogJ2VtYWlsanMtaW1hcC1jbGllbnQnXG59XG5cbi8qKlxuICogZW1haWxqcyBJTUFQIGNsaWVudFxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBbaG9zdD0nbG9jYWxob3N0J10gSG9zdG5hbWUgdG8gY29uZW5jdCB0b1xuICogQHBhcmFtIHtOdW1iZXJ9IFtwb3J0PTE0M10gUG9ydCBudW1iZXIgdG8gY29ubmVjdCB0b1xuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBPcHRpb25hbCBvcHRpb25zIG9iamVjdFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDbGllbnQge1xuICBjb25zdHJ1Y3RvciAoaG9zdCwgcG9ydCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy50aW1lb3V0Q29ubmVjdGlvbiA9IFRJTUVPVVRfQ09OTkVDVElPTlxuICAgIHRoaXMudGltZW91dE5vb3AgPSBUSU1FT1VUX05PT1BcbiAgICB0aGlzLnRpbWVvdXRJZGxlID0gVElNRU9VVF9JRExFXG5cbiAgICB0aGlzLnNlcnZlcklkID0gZmFsc2UgLy8gUkZDIDI5NzEgU2VydmVyIElEIGFzIGtleSB2YWx1ZSBwYWlyc1xuXG4gICAgLy8gRXZlbnQgcGxhY2Vob2xkZXJzXG4gICAgdGhpcy5vbmNlcnQgPSBudWxsXG4gICAgdGhpcy5vbnVwZGF0ZSA9IG51bGxcbiAgICB0aGlzLm9uc2VsZWN0bWFpbGJveCA9IG51bGxcbiAgICB0aGlzLm9uY2xvc2VtYWlsYm94ID0gbnVsbFxuXG4gICAgdGhpcy5faG9zdCA9IGhvc3RcbiAgICB0aGlzLl9jbGllbnRJZCA9IHByb3BPcihERUZBVUxUX0NMSUVOVF9JRCwgJ2lkJywgb3B0aW9ucylcbiAgICB0aGlzLl9zdGF0ZSA9IGZhbHNlIC8vIEN1cnJlbnQgc3RhdGVcbiAgICB0aGlzLl9hdXRoZW50aWNhdGVkID0gZmFsc2UgLy8gSXMgdGhlIGNvbm5lY3Rpb24gYXV0aGVudGljYXRlZFxuICAgIHRoaXMuX2NhcGFiaWxpdHkgPSBbXSAvLyBMaXN0IG9mIGV4dGVuc2lvbnMgdGhlIHNlcnZlciBzdXBwb3J0c1xuICAgIHRoaXMuX3NlbGVjdGVkTWFpbGJveCA9IGZhbHNlIC8vIFNlbGVjdGVkIG1haWxib3hcbiAgICB0aGlzLl9lbnRlcmVkSWRsZSA9IGZhbHNlXG4gICAgdGhpcy5faWRsZVRpbWVvdXQgPSBmYWxzZVxuICAgIHRoaXMuX2VuYWJsZUNvbXByZXNzaW9uID0gISFvcHRpb25zLmVuYWJsZUNvbXByZXNzaW9uXG4gICAgdGhpcy5fYXV0aCA9IG9wdGlvbnMuYXV0aFxuICAgIHRoaXMuX3JlcXVpcmVUTFMgPSAhIW9wdGlvbnMucmVxdWlyZVRMU1xuICAgIHRoaXMuX2lnbm9yZVRMUyA9ICEhb3B0aW9ucy5pZ25vcmVUTFNcblxuICAgIHRoaXMuY2xpZW50ID0gbmV3IEltYXBDbGllbnQoaG9zdCwgcG9ydCwgb3B0aW9ucykgLy8gSU1BUCBjbGllbnQgb2JqZWN0XG5cbiAgICAvLyBFdmVudCBIYW5kbGVyc1xuICAgIHRoaXMuY2xpZW50Lm9uZXJyb3IgPSB0aGlzLl9vbkVycm9yLmJpbmQodGhpcylcbiAgICB0aGlzLmNsaWVudC5vbmNlcnQgPSAoY2VydCkgPT4gKHRoaXMub25jZXJ0ICYmIHRoaXMub25jZXJ0KGNlcnQpKSAvLyBhbGxvd3MgY2VydGlmaWNhdGUgaGFuZGxpbmcgZm9yIHBsYXRmb3JtcyB3L28gbmF0aXZlIHRscyBzdXBwb3J0XG4gICAgdGhpcy5jbGllbnQub25pZGxlID0gKCkgPT4gdGhpcy5fb25JZGxlKCkgLy8gc3RhcnQgaWRsaW5nXG5cbiAgICAvLyBEZWZhdWx0IGhhbmRsZXJzIGZvciB1bnRhZ2dlZCByZXNwb25zZXNcbiAgICB0aGlzLmNsaWVudC5zZXRIYW5kbGVyKCdjYXBhYmlsaXR5JywgKHJlc3BvbnNlKSA9PiB0aGlzLl91bnRhZ2dlZENhcGFiaWxpdHlIYW5kbGVyKHJlc3BvbnNlKSkgLy8gY2FwYWJpbGl0eSB1cGRhdGVzXG4gICAgdGhpcy5jbGllbnQuc2V0SGFuZGxlcignb2snLCAocmVzcG9uc2UpID0+IHRoaXMuX3VudGFnZ2VkT2tIYW5kbGVyKHJlc3BvbnNlKSkgLy8gbm90aWZpY2F0aW9uc1xuICAgIHRoaXMuY2xpZW50LnNldEhhbmRsZXIoJ2V4aXN0cycsIChyZXNwb25zZSkgPT4gdGhpcy5fdW50YWdnZWRFeGlzdHNIYW5kbGVyKHJlc3BvbnNlKSkgLy8gbWVzc2FnZSBjb3VudCBoYXMgY2hhbmdlZFxuICAgIHRoaXMuY2xpZW50LnNldEhhbmRsZXIoJ2V4cHVuZ2UnLCAocmVzcG9uc2UpID0+IHRoaXMuX3VudGFnZ2VkRXhwdW5nZUhhbmRsZXIocmVzcG9uc2UpKSAvLyBtZXNzYWdlIGhhcyBiZWVuIGRlbGV0ZWRcbiAgICB0aGlzLmNsaWVudC5zZXRIYW5kbGVyKCdmZXRjaCcsIChyZXNwb25zZSkgPT4gdGhpcy5fdW50YWdnZWRGZXRjaEhhbmRsZXIocmVzcG9uc2UpKSAvLyBtZXNzYWdlIGhhcyBiZWVuIHVwZGF0ZWQgKGVnLiBmbGFnIGNoYW5nZSlcblxuICAgIC8vIEFjdGl2YXRlIGxvZ2dpbmdcbiAgICB0aGlzLmNyZWF0ZUxvZ2dlcigpXG4gICAgdGhpcy5sb2dMZXZlbCA9IHByb3BPcihMT0dfTEVWRUxfQUxMLCAnbG9nTGV2ZWwnLCBvcHRpb25zKVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCBpZiB0aGUgbG93ZXItbGV2ZWwgSW1hcENsaWVudCBoYXMgZW5jb3VudGVyZWQgYW4gdW5yZWNvdmVyYWJsZVxuICAgKiBlcnJvciBkdXJpbmcgb3BlcmF0aW9uLiBDbGVhbnMgdXAgYW5kIHByb3BhZ2F0ZXMgdGhlIGVycm9yIHVwd2FyZHMuXG4gICAqL1xuICBfb25FcnJvciAoZXJyKSB7XG4gICAgLy8gbWFrZSBzdXJlIG5vIGlkbGUgdGltZW91dCBpcyBwZW5kaW5nIGFueW1vcmVcbiAgICBjbGVhclRpbWVvdXQodGhpcy5faWRsZVRpbWVvdXQpXG5cbiAgICAvLyBwcm9wYWdhdGUgdGhlIGVycm9yIHVwd2FyZHNcbiAgICB0aGlzLm9uZXJyb3IgJiYgdGhpcy5vbmVycm9yKGVycilcbiAgfVxuXG4gIC8vXG4gIC8vXG4gIC8vIFBVQkxJQyBBUElcbiAgLy9cbiAgLy9cblxuICAvKipcbiAgICogSW5pdGlhdGUgY29ubmVjdGlvbiBhbmQgbG9naW4gdG8gdGhlIElNQVAgc2VydmVyXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHdoZW4gbG9naW4gcHJvY2VkdXJlIGlzIGNvbXBsZXRlXG4gICAqL1xuICBhc3luYyBjb25uZWN0ICgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5vcGVuQ29ubmVjdGlvbigpXG4gICAgICBhd2FpdCB0aGlzLnVwZ3JhZGVDb25uZWN0aW9uKClcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMudXBkYXRlSWQodGhpcy5fY2xpZW50SWQpXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybignRmFpbGVkIHRvIHVwZGF0ZSBzZXJ2ZXIgaWQhJywgZXJyLm1lc3NhZ2UpXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMubG9naW4odGhpcy5fYXV0aClcbiAgICAgIGF3YWl0IHRoaXMuY29tcHJlc3NDb25uZWN0aW9uKClcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdDb25uZWN0aW9uIGVzdGFibGlzaGVkLCByZWFkeSB0byByb2xsIScpXG4gICAgICB0aGlzLmNsaWVudC5vbmVycm9yID0gdGhpcy5fb25FcnJvci5iaW5kKHRoaXMpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyJywgZXJyKVxuICAgICAgdGhpcy5jbG9zZShlcnIpIC8vIHdlIGRvbid0IHJlYWxseSBjYXJlIHdoZXRoZXIgdGhpcyB3b3JrcyBvciBub3RcbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWF0ZSBjb25uZWN0aW9uIHRvIHRoZSBJTUFQIHNlcnZlclxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gY2FwYWJpbGl0eSBvZiBzZXJ2ZXIgd2l0aG91dCBsb2dpblxuICAgKi9cbiAgb3BlbkNvbm5lY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBjb25uZWN0aW9uVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG5ldyBFcnJvcignVGltZW91dCBjb25uZWN0aW5nIHRvIHNlcnZlcicpKSwgdGhpcy50aW1lb3V0Q29ubmVjdGlvbilcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdDb25uZWN0aW5nIHRvJywgdGhpcy5jbGllbnQuaG9zdCwgJzonLCB0aGlzLmNsaWVudC5wb3J0KVxuICAgICAgdGhpcy5fY2hhbmdlU3RhdGUoU1RBVEVfQ09OTkVDVElORylcbiAgICAgIHRoaXMuY2xpZW50LmNvbm5lY3QoKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ1NvY2tldCBvcGVuZWQsIHdhaXRpbmcgZm9yIGdyZWV0aW5nIGZyb20gdGhlIHNlcnZlci4uLicpXG5cbiAgICAgICAgdGhpcy5jbGllbnQub25yZWFkeSA9ICgpID0+IHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoY29ubmVjdGlvblRpbWVvdXQpXG4gICAgICAgICAgdGhpcy5fY2hhbmdlU3RhdGUoU1RBVEVfTk9UX0FVVEhFTlRJQ0FURUQpXG4gICAgICAgICAgdGhpcy51cGRhdGVDYXBhYmlsaXR5KClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHJlc29sdmUodGhpcy5fY2FwYWJpbGl0eSkpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNsaWVudC5vbmVycm9yID0gKGVycikgPT4ge1xuICAgICAgICAgIGNsZWFyVGltZW91dChjb25uZWN0aW9uVGltZW91dClcbiAgICAgICAgICByZWplY3QoZXJyKVxuICAgICAgICB9XG4gICAgICB9KS5jYXRjaChyZWplY3QpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dvdXRcbiAgICpcbiAgICogU2VuZCBMT0dPVVQsIHRvIHdoaWNoIHRoZSBzZXJ2ZXIgcmVzcG9uZHMgYnkgY2xvc2luZyB0aGUgY29ubmVjdGlvbi5cbiAgICogVXNlIGlzIGRpc2NvdXJhZ2VkIGlmIG5ldHdvcmsgc3RhdHVzIGlzIHVuY2xlYXIhIElmIG5ldHdvcmtzIHN0YXR1cyBpc1xuICAgKiB1bmNsZWFyLCBwbGVhc2UgdXNlICNjbG9zZSBpbnN0ZWFkIVxuICAgKlxuICAgKiBMT0dPVVQgZGV0YWlsczpcbiAgICogICBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzUwMSNzZWN0aW9uLTYuMS4zXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBSZXNvbHZlcyB3aGVuIHNlcnZlciBoYXMgY2xvc2VkIHRoZSBjb25uZWN0aW9uXG4gICAqL1xuICBhc3luYyBsb2dvdXQgKCkge1xuICAgIHRoaXMuX2NoYW5nZVN0YXRlKFNUQVRFX0xPR09VVClcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTG9nZ2luZyBvdXQuLi4nKVxuICAgIGF3YWl0IHRoaXMuY2xpZW50LmxvZ291dCgpXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX2lkbGVUaW1lb3V0KVxuICB9XG5cbiAgLyoqXG4gICAqIEZvcmNlLWNsb3NlcyB0aGUgY3VycmVudCBjb25uZWN0aW9uIGJ5IGNsb3NpbmcgdGhlIFRDUCBzb2NrZXQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBSZXNvbHZlcyB3aGVuIHNvY2tldCBpcyBjbG9zZWRcbiAgICovXG4gIGFzeW5jIGNsb3NlIChlcnIpIHtcbiAgICB0aGlzLl9jaGFuZ2VTdGF0ZShTVEFURV9MT0dPVVQpXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX2lkbGVUaW1lb3V0KVxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdDbG9zaW5nIGNvbm5lY3Rpb24uLi4nKVxuICAgIGF3YWl0IHRoaXMuY2xpZW50LmNsb3NlKGVycilcbiAgICBjbGVhclRpbWVvdXQodGhpcy5faWRsZVRpbWVvdXQpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBJRCBjb21tYW5kLCBwYXJzZXMgSUQgcmVzcG9uc2UsIHNldHMgdGhpcy5zZXJ2ZXJJZFxuICAgKlxuICAgKiBJRCBkZXRhaWxzOlxuICAgKiAgIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzI5NzFcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IGlkIElEIGFzIEpTT04gb2JqZWN0LiBTZWUgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjk3MSNzZWN0aW9uLTMuMyBmb3IgcG9zc2libGUgdmFsdWVzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBSZXNvbHZlcyB3aGVuIHJlc3BvbnNlIGhhcyBiZWVuIHBhcnNlZFxuICAgKi9cbiAgYXN5bmMgdXBkYXRlSWQgKGlkKSB7XG4gICAgaWYgKHRoaXMuX2NhcGFiaWxpdHkuaW5kZXhPZignSUQnKSA8IDApIHJldHVyblxuXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ1VwZGF0aW5nIGlkLi4uJylcblxuICAgIGNvbnN0IGNvbW1hbmQgPSAnSUQnXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IGlkID8gW2ZsYXR0ZW4oT2JqZWN0LmVudHJpZXMoaWQpKV0gOiBbbnVsbF1cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZXhlYyh7IGNvbW1hbmQsIGF0dHJpYnV0ZXMgfSwgJ0lEJylcbiAgICBjb25zdCBsaXN0ID0gZmxhdHRlbihwYXRoT3IoW10sIFsncGF5bG9hZCcsICdJRCcsICcwJywgJ2F0dHJpYnV0ZXMnLCAnMCddLCByZXNwb25zZSkubWFwKE9iamVjdC52YWx1ZXMpKVxuICAgIGNvbnN0IGtleXMgPSBsaXN0LmZpbHRlcigoXywgaSkgPT4gaSAlIDIgPT09IDApXG4gICAgY29uc3QgdmFsdWVzID0gbGlzdC5maWx0ZXIoKF8sIGkpID0+IGkgJSAyID09PSAxKVxuICAgIHRoaXMuc2VydmVySWQgPSBmcm9tUGFpcnMoemlwKGtleXMsIHZhbHVlcykpXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ1NlcnZlciBpZCB1cGRhdGVkIScsIHRoaXMuc2VydmVySWQpXG4gIH1cblxuICBfc2hvdWxkU2VsZWN0TWFpbGJveCAocGF0aCwgY3R4KSB7XG4gICAgaWYgKCFjdHgpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgY29uc3QgcHJldmlvdXNTZWxlY3QgPSB0aGlzLmNsaWVudC5nZXRQcmV2aW91c2x5UXVldWVkKFsnU0VMRUNUJywgJ0VYQU1JTkUnXSwgY3R4KVxuICAgIGlmIChwcmV2aW91c1NlbGVjdCAmJiBwcmV2aW91c1NlbGVjdC5yZXF1ZXN0LmF0dHJpYnV0ZXMpIHtcbiAgICAgIGNvbnN0IHBhdGhBdHRyaWJ1dGUgPSBwcmV2aW91c1NlbGVjdC5yZXF1ZXN0LmF0dHJpYnV0ZXMuZmluZCgoYXR0cmlidXRlKSA9PiBhdHRyaWJ1dGUudHlwZSA9PT0gJ1NUUklORycpXG4gICAgICBpZiAocGF0aEF0dHJpYnV0ZSkge1xuICAgICAgICByZXR1cm4gcGF0aEF0dHJpYnV0ZS52YWx1ZSAhPT0gcGF0aFxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZE1haWxib3ggIT09IHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIFNFTEVDVCBvciBFWEFNSU5FIHRvIG9wZW4gYSBtYWlsYm94XG4gICAqXG4gICAqIFNFTEVDVCBkZXRhaWxzOlxuICAgKiAgIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM1MDEjc2VjdGlvbi02LjMuMVxuICAgKiBFWEFNSU5FIGRldGFpbHM6XG4gICAqICAgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzUwMSNzZWN0aW9uLTYuMy4yXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoIEZ1bGwgcGF0aCB0byBtYWlsYm94XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gT3B0aW9ucyBvYmplY3RcbiAgICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2Ugd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VsZWN0ZWQgbWFpbGJveFxuICAgKi9cbiAgYXN5bmMgc2VsZWN0TWFpbGJveCAocGF0aCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgcXVlcnkgPSB7XG4gICAgICBjb21tYW5kOiBvcHRpb25zLnJlYWRPbmx5ID8gJ0VYQU1JTkUnIDogJ1NFTEVDVCcsXG4gICAgICBhdHRyaWJ1dGVzOiBbeyB0eXBlOiAnU1RSSU5HJywgdmFsdWU6IHBhdGggfV1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5jb25kc3RvcmUgJiYgdGhpcy5fY2FwYWJpbGl0eS5pbmRleE9mKCdDT05EU1RPUkUnKSA+PSAwKSB7XG4gICAgICBxdWVyeS5hdHRyaWJ1dGVzLnB1c2goW3sgdHlwZTogJ0FUT00nLCB2YWx1ZTogJ0NPTkRTVE9SRScgfV0pXG4gICAgfVxuXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ09wZW5pbmcnLCBwYXRoLCAnLi4uJylcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZXhlYyhxdWVyeSwgWydFWElTVFMnLCAnRkxBR1MnLCAnT0snXSwgeyBjdHg6IG9wdGlvbnMuY3R4IH0pXG4gICAgY29uc3QgbWFpbGJveEluZm8gPSBwYXJzZVNFTEVDVChyZXNwb25zZSlcblxuICAgIHRoaXMuX2NoYW5nZVN0YXRlKFNUQVRFX1NFTEVDVEVEKVxuXG4gICAgaWYgKHRoaXMuX3NlbGVjdGVkTWFpbGJveCAhPT0gcGF0aCAmJiB0aGlzLm9uY2xvc2VtYWlsYm94KSB7XG4gICAgICBhd2FpdCB0aGlzLm9uY2xvc2VtYWlsYm94KHRoaXMuX3NlbGVjdGVkTWFpbGJveClcbiAgICB9XG4gICAgdGhpcy5fc2VsZWN0ZWRNYWlsYm94ID0gcGF0aFxuICAgIGlmICh0aGlzLm9uc2VsZWN0bWFpbGJveCkge1xuICAgICAgYXdhaXQgdGhpcy5vbnNlbGVjdG1haWxib3gocGF0aCwgbWFpbGJveEluZm8pXG4gICAgfVxuXG4gICAgcmV0dXJuIG1haWxib3hJbmZvXG4gIH1cblxuICAvKipcbiAgICogUnVucyBOQU1FU1BBQ0UgY29tbWFuZFxuICAgKlxuICAgKiBOQU1FU1BBQ0UgZGV0YWlsczpcbiAgICogICBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjM0MlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSB3aXRoIG5hbWVzcGFjZSBvYmplY3RcbiAgICovXG4gIGFzeW5jIGxpc3ROYW1lc3BhY2VzICgpIHtcbiAgICBpZiAodGhpcy5fY2FwYWJpbGl0eS5pbmRleE9mKCdOQU1FU1BBQ0UnKSA8IDApIHJldHVybiBmYWxzZVxuXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ0xpc3RpbmcgbmFtZXNwYWNlcy4uLicpXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmV4ZWMoJ05BTUVTUEFDRScsICdOQU1FU1BBQ0UnKVxuICAgIHJldHVybiBwYXJzZU5BTUVTUEFDRShyZXNwb25zZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIExJU1QgYW5kIExTVUIgY29tbWFuZHMuIFJldHJpZXZlcyBhIHRyZWUgb2YgYXZhaWxhYmxlIG1haWxib3hlc1xuICAgKlxuICAgKiBMSVNUIGRldGFpbHM6XG4gICAqICAgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzUwMSNzZWN0aW9uLTYuMy44XG4gICAqIExTVUIgZGV0YWlsczpcbiAgICogICBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNTAxI3NlY3Rpb24tNi4zLjlcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2Ugd2l0aCBsaXN0IG9mIG1haWxib3hlc1xuICAgKi9cbiAgYXN5bmMgbGlzdE1haWxib3hlcyAoKSB7XG4gICAgY29uc3QgdHJlZSA9IHsgcm9vdDogdHJ1ZSwgY2hpbGRyZW46IFtdIH1cblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdMaXN0aW5nIG1haWxib3hlcy4uLicpXG4gICAgY29uc3QgbGlzdFJlc3BvbnNlID0gYXdhaXQgdGhpcy5leGVjKHsgY29tbWFuZDogJ0xJU1QnLCBhdHRyaWJ1dGVzOiBbJycsICcqJ10gfSwgJ0xJU1QnKVxuICAgIGNvbnN0IGxpc3QgPSBwYXRoT3IoW10sIFsncGF5bG9hZCcsICdMSVNUJ10sIGxpc3RSZXNwb25zZSlcbiAgICBsaXN0LmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBjb25zdCBhdHRyID0gcHJvcE9yKFtdLCAnYXR0cmlidXRlcycsIGl0ZW0pXG4gICAgICBpZiAoYXR0ci5sZW5ndGggPCAzKSByZXR1cm5cblxuICAgICAgY29uc3QgcGF0aCA9IHBhdGhPcignJywgWycyJywgJ3ZhbHVlJ10sIGF0dHIpXG4gICAgICBjb25zdCBkZWxpbSA9IHBhdGhPcignLycsIFsnMScsICd2YWx1ZSddLCBhdHRyKVxuICAgICAgY29uc3QgYnJhbmNoID0gdGhpcy5fZW5zdXJlUGF0aCh0cmVlLCBwYXRoLCBkZWxpbSlcbiAgICAgIGJyYW5jaC5mbGFncyA9IHByb3BPcihbXSwgJzAnLCBhdHRyKS5tYXAoKHsgdmFsdWUgfSkgPT4gdmFsdWUgfHwgJycpXG4gICAgICBicmFuY2gubGlzdGVkID0gdHJ1ZVxuICAgICAgY2hlY2tTcGVjaWFsVXNlKGJyYW5jaClcbiAgICB9KVxuXG4gICAgY29uc3QgbHN1YlJlc3BvbnNlID0gYXdhaXQgdGhpcy5leGVjKHsgY29tbWFuZDogJ0xTVUInLCBhdHRyaWJ1dGVzOiBbJycsICcqJ10gfSwgJ0xTVUInKVxuICAgIGNvbnN0IGxzdWIgPSBwYXRoT3IoW10sIFsncGF5bG9hZCcsICdMU1VCJ10sIGxzdWJSZXNwb25zZSlcbiAgICBsc3ViLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGF0dHIgPSBwcm9wT3IoW10sICdhdHRyaWJ1dGVzJywgaXRlbSlcbiAgICAgIGlmIChhdHRyLmxlbmd0aCA8IDMpIHJldHVyblxuXG4gICAgICBjb25zdCBwYXRoID0gcGF0aE9yKCcnLCBbJzInLCAndmFsdWUnXSwgYXR0cilcbiAgICAgIGNvbnN0IGRlbGltID0gcGF0aE9yKCcvJywgWycxJywgJ3ZhbHVlJ10sIGF0dHIpXG4gICAgICBjb25zdCBicmFuY2ggPSB0aGlzLl9lbnN1cmVQYXRoKHRyZWUsIHBhdGgsIGRlbGltKVxuICAgICAgcHJvcE9yKFtdLCAnMCcsIGF0dHIpLm1hcCgoZmxhZyA9ICcnKSA9PiB7IGJyYW5jaC5mbGFncyA9IHVuaW9uKGJyYW5jaC5mbGFncywgW2ZsYWddKSB9KVxuICAgICAgYnJhbmNoLnN1YnNjcmliZWQgPSB0cnVlXG4gICAgfSlcblxuICAgIHJldHVybiB0cmVlXG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbWFpbGJveCB3aXRoIHRoZSBnaXZlbiBwYXRoLlxuICAgKlxuICAgKiBDUkVBVEUgZGV0YWlsczpcbiAgICogICBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNTAxI3NlY3Rpb24tNi4zLjNcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGhcbiAgICogICAgIFRoZSBwYXRoIG9mIHRoZSBtYWlsYm94IHlvdSB3b3VsZCBsaWtlIHRvIGNyZWF0ZS4gIFRoaXMgbWV0aG9kIHdpbGxcbiAgICogICAgIGhhbmRsZSB1dGY3IGVuY29kaW5nIGZvciB5b3UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKiAgICAgUHJvbWlzZSByZXNvbHZlcyBpZiBtYWlsYm94IHdhcyBjcmVhdGVkLlxuICAgKiAgICAgSW4gdGhlIGV2ZW50IHRoZSBzZXJ2ZXIgc2F5cyBOTyBbQUxSRUFEWUVYSVNUU10sIHdlIHRyZWF0IHRoYXQgYXMgc3VjY2Vzcy5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZU1haWxib3ggKHBhdGgpIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnQ3JlYXRpbmcgbWFpbGJveCcsIHBhdGgsICcuLi4nKVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmV4ZWMoeyBjb21tYW5kOiAnQ1JFQVRFJywgYXR0cmlidXRlczogW2ltYXBFbmNvZGUocGF0aCldIH0pXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyICYmIGVyci5jb2RlID09PSAnQUxSRUFEWUVYSVNUUycpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEgbWFpbGJveCB3aXRoIHRoZSBnaXZlbiBwYXRoLlxuICAgKlxuICAgKiBERUxFVEUgZGV0YWlsczpcbiAgICogICBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzUwMSNzZWN0aW9uLTYuMy40XG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gICAqICAgICBUaGUgcGF0aCBvZiB0aGUgbWFpbGJveCB5b3Ugd291bGQgbGlrZSB0byBkZWxldGUuICBUaGlzIG1ldGhvZCB3aWxsXG4gICAqICAgICBoYW5kbGUgdXRmNyBlbmNvZGluZyBmb3IgeW91LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICogICAgIFByb21pc2UgcmVzb2x2ZXMgaWYgbWFpbGJveCB3YXMgZGVsZXRlZC5cbiAgICovXG4gIGRlbGV0ZU1haWxib3ggKHBhdGgpIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnRGVsZXRpbmcgbWFpbGJveCcsIHBhdGgsICcuLi4nKVxuICAgIHJldHVybiB0aGlzLmV4ZWMoeyBjb21tYW5kOiAnREVMRVRFJywgYXR0cmlidXRlczogW2ltYXBFbmNvZGUocGF0aCldIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBGRVRDSCBjb21tYW5kXG4gICAqXG4gICAqIEZFVENIIGRldGFpbHM6XG4gICAqICAgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzUwMSNzZWN0aW9uLTYuNC41XG4gICAqIENIQU5HRURTSU5DRSBkZXRhaWxzOlxuICAgKiAgIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0NTUxI3NlY3Rpb24tMy4zXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoIFRoZSBwYXRoIGZvciB0aGUgbWFpbGJveCB3aGljaCBzaG91bGQgYmUgc2VsZWN0ZWQgZm9yIHRoZSBjb21tYW5kLiBTZWxlY3RzIG1haWxib3ggaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzZXF1ZW5jZSBTZXF1ZW5jZSBzZXQsIGVnIDE6KiBmb3IgYWxsIG1lc3NhZ2VzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbaXRlbXNdIE1lc3NhZ2UgZGF0YSBpdGVtIG5hbWVzIG9yIG1hY3JvXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gUXVlcnkgbW9kaWZpZXJzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHdpdGggdGhlIGZldGNoZWQgbWVzc2FnZSBpbmZvXG4gICAqL1xuICBhc3luYyBsaXN0TWVzc2FnZXMgKHBhdGgsIHNlcXVlbmNlLCBpdGVtcyA9IFt7IGZhc3Q6IHRydWUgfV0sIG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdGZXRjaGluZyBtZXNzYWdlcycsIHNlcXVlbmNlLCAnZnJvbScsIHBhdGgsICcuLi4nKVxuICAgIGNvbnN0IGNvbW1hbmQgPSBidWlsZEZFVENIQ29tbWFuZChzZXF1ZW5jZSwgaXRlbXMsIG9wdGlvbnMpXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmV4ZWMoY29tbWFuZCwgJ0ZFVENIJywge1xuICAgICAgcHJlY2hlY2s6IChjdHgpID0+IHRoaXMuX3Nob3VsZFNlbGVjdE1haWxib3gocGF0aCwgY3R4KSA/IHRoaXMuc2VsZWN0TWFpbGJveChwYXRoLCB7IGN0eCB9KSA6IFByb21pc2UucmVzb2x2ZSgpXG4gICAgfSlcbiAgICByZXR1cm4gcGFyc2VGRVRDSChyZXNwb25zZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIFNFQVJDSCBjb21tYW5kXG4gICAqXG4gICAqIFNFQVJDSCBkZXRhaWxzOlxuICAgKiAgIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM1MDEjc2VjdGlvbi02LjQuNFxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGF0aCBUaGUgcGF0aCBmb3IgdGhlIG1haWxib3ggd2hpY2ggc2hvdWxkIGJlIHNlbGVjdGVkIGZvciB0aGUgY29tbWFuZC4gU2VsZWN0cyBtYWlsYm94IGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0ge09iamVjdH0gcXVlcnkgU2VhcmNoIHRlcm1zXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gUXVlcnkgbW9kaWZpZXJzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHdpdGggdGhlIGFycmF5IG9mIG1hdGNoaW5nIHNlcS4gb3IgdWlkIG51bWJlcnNcbiAgICovXG4gIGFzeW5jIHNlYXJjaCAocGF0aCwgcXVlcnksIG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdTZWFyY2hpbmcgaW4nLCBwYXRoLCAnLi4uJylcbiAgICBjb25zdCBjb21tYW5kID0gYnVpbGRTRUFSQ0hDb21tYW5kKHF1ZXJ5LCBvcHRpb25zKVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5leGVjKGNvbW1hbmQsICdTRUFSQ0gnLCB7XG4gICAgICBwcmVjaGVjazogKGN0eCkgPT4gdGhpcy5fc2hvdWxkU2VsZWN0TWFpbGJveChwYXRoLCBjdHgpID8gdGhpcy5zZWxlY3RNYWlsYm94KHBhdGgsIHsgY3R4IH0pIDogUHJvbWlzZS5yZXNvbHZlKClcbiAgICB9KVxuICAgIHJldHVybiBwYXJzZVNFQVJDSChyZXNwb25zZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIFNUT1JFIGNvbW1hbmRcbiAgICpcbiAgICogU1RPUkUgZGV0YWlsczpcbiAgICogICBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNTAxI3NlY3Rpb24tNi40LjZcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggVGhlIHBhdGggZm9yIHRoZSBtYWlsYm94IHdoaWNoIHNob3VsZCBiZSBzZWxlY3RlZCBmb3IgdGhlIGNvbW1hbmQuIFNlbGVjdHMgbWFpbGJveCBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIHtTdHJpbmd9IHNlcXVlbmNlIE1lc3NhZ2Ugc2VsZWN0b3Igd2hpY2ggdGhlIGZsYWcgY2hhbmdlIGlzIGFwcGxpZWQgdG9cbiAgICogQHBhcmFtIHtBcnJheX0gZmxhZ3NcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBRdWVyeSBtb2RpZmllcnNcbiAgICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2Ugd2l0aCB0aGUgYXJyYXkgb2YgbWF0Y2hpbmcgc2VxLiBvciB1aWQgbnVtYmVyc1xuICAgKi9cbiAgc2V0RmxhZ3MgKHBhdGgsIHNlcXVlbmNlLCBmbGFncywgb3B0aW9ucykge1xuICAgIGxldCBrZXkgPSAnJ1xuICAgIGxldCBsaXN0ID0gW11cblxuICAgIGlmIChBcnJheS5pc0FycmF5KGZsYWdzKSB8fCB0eXBlb2YgZmxhZ3MgIT09ICdvYmplY3QnKSB7XG4gICAgICBsaXN0ID0gW10uY29uY2F0KGZsYWdzIHx8IFtdKVxuICAgICAga2V5ID0gJydcbiAgICB9IGVsc2UgaWYgKGZsYWdzLmFkZCkge1xuICAgICAgbGlzdCA9IFtdLmNvbmNhdChmbGFncy5hZGQgfHwgW10pXG4gICAgICBrZXkgPSAnKydcbiAgICB9IGVsc2UgaWYgKGZsYWdzLnNldCkge1xuICAgICAga2V5ID0gJydcbiAgICAgIGxpc3QgPSBbXS5jb25jYXQoZmxhZ3Muc2V0IHx8IFtdKVxuICAgIH0gZWxzZSBpZiAoZmxhZ3MucmVtb3ZlKSB7XG4gICAgICBrZXkgPSAnLSdcbiAgICAgIGxpc3QgPSBbXS5jb25jYXQoZmxhZ3MucmVtb3ZlIHx8IFtdKVxuICAgIH1cblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdTZXR0aW5nIGZsYWdzIG9uJywgc2VxdWVuY2UsICdpbicsIHBhdGgsICcuLi4nKVxuICAgIHJldHVybiB0aGlzLnN0b3JlKHBhdGgsIHNlcXVlbmNlLCBrZXkgKyAnRkxBR1MnLCBsaXN0LCBvcHRpb25zKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgU1RPUkUgY29tbWFuZFxuICAgKlxuICAgKiBTVE9SRSBkZXRhaWxzOlxuICAgKiAgIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM1MDEjc2VjdGlvbi02LjQuNlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGF0aCBUaGUgcGF0aCBmb3IgdGhlIG1haWxib3ggd2hpY2ggc2hvdWxkIGJlIHNlbGVjdGVkIGZvciB0aGUgY29tbWFuZC4gU2VsZWN0cyBtYWlsYm94IGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0ge1N0cmluZ30gc2VxdWVuY2UgTWVzc2FnZSBzZWxlY3RvciB3aGljaCB0aGUgZmxhZyBjaGFuZ2UgaXMgYXBwbGllZCB0b1xuICAgKiBAcGFyYW0ge1N0cmluZ30gYWN0aW9uIFNUT1JFIG1ldGhvZCB0byBjYWxsLCBlZyBcIitGTEFHU1wiXG4gICAqIEBwYXJhbSB7QXJyYXl9IGZsYWdzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gUXVlcnkgbW9kaWZpZXJzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHdpdGggdGhlIGFycmF5IG9mIG1hdGNoaW5nIHNlcS4gb3IgdWlkIG51bWJlcnNcbiAgICovXG4gIGFzeW5jIHN0b3JlIChwYXRoLCBzZXF1ZW5jZSwgYWN0aW9uLCBmbGFncywgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgY29tbWFuZCA9IGJ1aWxkU1RPUkVDb21tYW5kKHNlcXVlbmNlLCBhY3Rpb24sIGZsYWdzLCBvcHRpb25zKVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5leGVjKGNvbW1hbmQsICdGRVRDSCcsIHtcbiAgICAgIHByZWNoZWNrOiAoY3R4KSA9PiB0aGlzLl9zaG91bGRTZWxlY3RNYWlsYm94KHBhdGgsIGN0eCkgPyB0aGlzLnNlbGVjdE1haWxib3gocGF0aCwgeyBjdHggfSkgOiBQcm9taXNlLnJlc29sdmUoKVxuICAgIH0pXG4gICAgcmV0dXJuIHBhcnNlRkVUQ0gocmVzcG9uc2UpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBBUFBFTkQgY29tbWFuZFxuICAgKlxuICAgKiBBUFBFTkQgZGV0YWlsczpcbiAgICogICBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNTAxI3NlY3Rpb24tNi4zLjExXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBkZXN0aW5hdGlvbiBUaGUgbWFpbGJveCB3aGVyZSB0byBhcHBlbmQgdGhlIG1lc3NhZ2VcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYXBwZW5kXG4gICAqIEBwYXJhbSB7QXJyYXl9IG9wdGlvbnMuZmxhZ3MgQW55IGZsYWdzIHlvdSB3YW50IHRvIHNldCBvbiB0aGUgdXBsb2FkZWQgbWVzc2FnZS4gRGVmYXVsdHMgdG8gW1xcU2Vlbl0uIChvcHRpb25hbClcbiAgICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2Ugd2l0aCB0aGUgYXJyYXkgb2YgbWF0Y2hpbmcgc2VxLiBvciB1aWQgbnVtYmVyc1xuICAgKi9cbiAgYXN5bmMgdXBsb2FkIChkZXN0aW5hdGlvbiwgbWVzc2FnZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgZmxhZ3MgPSBwcm9wT3IoWydcXFxcU2VlbiddLCAnZmxhZ3MnLCBvcHRpb25zKS5tYXAodmFsdWUgPT4gKHsgdHlwZTogJ2F0b20nLCB2YWx1ZSB9KSlcbiAgICBjb25zdCBjb21tYW5kID0ge1xuICAgICAgY29tbWFuZDogJ0FQUEVORCcsXG4gICAgICBhdHRyaWJ1dGVzOiBbXG4gICAgICAgIHsgdHlwZTogJ2F0b20nLCB2YWx1ZTogZGVzdGluYXRpb24gfSxcbiAgICAgICAgZmxhZ3MsXG4gICAgICAgIHsgdHlwZTogJ2xpdGVyYWwnLCB2YWx1ZTogbWVzc2FnZSB9XG4gICAgICBdXG4gICAgfVxuXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ1VwbG9hZGluZyBtZXNzYWdlIHRvJywgZGVzdGluYXRpb24sICcuLi4nKVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5leGVjKGNvbW1hbmQpXG4gICAgcmV0dXJuIHBhcnNlQVBQRU5EKHJlc3BvbnNlKVxuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgbWVzc2FnZXMgZnJvbSBhIHNlbGVjdGVkIG1haWxib3hcbiAgICpcbiAgICogRVhQVU5HRSBkZXRhaWxzOlxuICAgKiAgIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM1MDEjc2VjdGlvbi02LjQuM1xuICAgKiBVSUQgRVhQVU5HRSBkZXRhaWxzOlxuICAgKiAgIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0MzE1I3NlY3Rpb24tMi4xXG4gICAqXG4gICAqIElmIHBvc3NpYmxlIChieVVpZDp0cnVlIGFuZCBVSURQTFVTIGV4dGVuc2lvbiBzdXBwb3J0ZWQpLCB1c2VzIFVJRCBFWFBVTkdFXG4gICAqIGNvbW1hbmQgdG8gZGVsZXRlIGEgcmFuZ2Ugb2YgbWVzc2FnZXMsIG90aGVyd2lzZSBmYWxscyBiYWNrIHRvIEVYUFVOR0UuXG4gICAqXG4gICAqIE5CISBUaGlzIG1ldGhvZCBtaWdodCBiZSBkZXN0cnVjdGl2ZSAtIGlmIEVYUFVOR0UgaXMgdXNlZCwgdGhlbiBhbnkgbWVzc2FnZXNcbiAgICogd2l0aCBcXERlbGV0ZWQgZmxhZyBzZXQgYXJlIGRlbGV0ZWRcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggVGhlIHBhdGggZm9yIHRoZSBtYWlsYm94IHdoaWNoIHNob3VsZCBiZSBzZWxlY3RlZCBmb3IgdGhlIGNvbW1hbmQuIFNlbGVjdHMgbWFpbGJveCBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIHtTdHJpbmd9IHNlcXVlbmNlIE1lc3NhZ2UgcmFuZ2UgdG8gYmUgZGVsZXRlZFxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIFF1ZXJ5IG1vZGlmaWVyc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZVxuICAgKi9cbiAgYXN5bmMgZGVsZXRlTWVzc2FnZXMgKHBhdGgsIHNlcXVlbmNlLCBvcHRpb25zID0ge30pIHtcbiAgICAvLyBhZGQgXFxEZWxldGVkIGZsYWcgdG8gdGhlIG1lc3NhZ2VzIGFuZCBydW4gRVhQVU5HRSBvciBVSUQgRVhQVU5HRVxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdEZWxldGluZyBtZXNzYWdlcycsIHNlcXVlbmNlLCAnaW4nLCBwYXRoLCAnLi4uJylcbiAgICBjb25zdCB1c2VVaWRQbHVzID0gb3B0aW9ucy5ieVVpZCAmJiB0aGlzLl9jYXBhYmlsaXR5LmluZGV4T2YoJ1VJRFBMVVMnKSA+PSAwXG4gICAgY29uc3QgdWlkRXhwdW5nZUNvbW1hbmQgPSB7IGNvbW1hbmQ6ICdVSUQgRVhQVU5HRScsIGF0dHJpYnV0ZXM6IFt7IHR5cGU6ICdzZXF1ZW5jZScsIHZhbHVlOiBzZXF1ZW5jZSB9XSB9XG4gICAgYXdhaXQgdGhpcy5zZXRGbGFncyhwYXRoLCBzZXF1ZW5jZSwgeyBhZGQ6ICdcXFxcRGVsZXRlZCcgfSwgb3B0aW9ucylcbiAgICBjb25zdCBjbWQgPSB1c2VVaWRQbHVzID8gdWlkRXhwdW5nZUNvbW1hbmQgOiAnRVhQVU5HRSdcbiAgICByZXR1cm4gdGhpcy5leGVjKGNtZCwgbnVsbCwge1xuICAgICAgcHJlY2hlY2s6IChjdHgpID0+IHRoaXMuX3Nob3VsZFNlbGVjdE1haWxib3gocGF0aCwgY3R4KSA/IHRoaXMuc2VsZWN0TWFpbGJveChwYXRoLCB7IGN0eCB9KSA6IFByb21pc2UucmVzb2x2ZSgpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3BpZXMgYSByYW5nZSBvZiBtZXNzYWdlcyBmcm9tIHRoZSBhY3RpdmUgbWFpbGJveCB0byB0aGUgZGVzdGluYXRpb24gbWFpbGJveC5cbiAgICogU2lsZW50IG1ldGhvZCAodW5sZXNzIGFuIGVycm9yIG9jY3VycyksIGJ5IGRlZmF1bHQgcmV0dXJucyBubyBpbmZvcm1hdGlvbi5cbiAgICpcbiAgICogQ09QWSBkZXRhaWxzOlxuICAgKiAgIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM1MDEjc2VjdGlvbi02LjQuN1xuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGF0aCBUaGUgcGF0aCBmb3IgdGhlIG1haWxib3ggd2hpY2ggc2hvdWxkIGJlIHNlbGVjdGVkIGZvciB0aGUgY29tbWFuZC4gU2VsZWN0cyBtYWlsYm94IGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0ge1N0cmluZ30gc2VxdWVuY2UgTWVzc2FnZSByYW5nZSB0byBiZSBjb3BpZWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IGRlc3RpbmF0aW9uIERlc3RpbmF0aW9uIG1haWxib3ggcGF0aFxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIFF1ZXJ5IG1vZGlmaWVyc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmJ5VWlkXSBJZiB0cnVlLCB1c2VzIFVJRCBDT1BZIGluc3RlYWQgb2YgQ09QWVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZVxuICAgKi9cbiAgYXN5bmMgY29weU1lc3NhZ2VzIChwYXRoLCBzZXF1ZW5jZSwgZGVzdGluYXRpb24sIG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdDb3B5aW5nIG1lc3NhZ2VzJywgc2VxdWVuY2UsICdmcm9tJywgcGF0aCwgJ3RvJywgZGVzdGluYXRpb24sICcuLi4nKVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5leGVjKHtcbiAgICAgIGNvbW1hbmQ6IG9wdGlvbnMuYnlVaWQgPyAnVUlEIENPUFknIDogJ0NPUFknLFxuICAgICAgYXR0cmlidXRlczogW1xuICAgICAgICB7IHR5cGU6ICdzZXF1ZW5jZScsIHZhbHVlOiBzZXF1ZW5jZSB9LFxuICAgICAgICB7IHR5cGU6ICdhdG9tJywgdmFsdWU6IGRlc3RpbmF0aW9uIH1cbiAgICAgIF1cbiAgICB9LCBudWxsLCB7XG4gICAgICBwcmVjaGVjazogKGN0eCkgPT4gdGhpcy5fc2hvdWxkU2VsZWN0TWFpbGJveChwYXRoLCBjdHgpID8gdGhpcy5zZWxlY3RNYWlsYm94KHBhdGgsIHsgY3R4IH0pIDogUHJvbWlzZS5yZXNvbHZlKClcbiAgICB9KVxuICAgIHJldHVybiBwYXJzZUNPUFkocmVzcG9uc2UpXG4gIH1cblxuICAvKipcbiAgICogTW92ZXMgYSByYW5nZSBvZiBtZXNzYWdlcyBmcm9tIHRoZSBhY3RpdmUgbWFpbGJveCB0byB0aGUgZGVzdGluYXRpb24gbWFpbGJveC5cbiAgICogUHJlZmVycyB0aGUgTU9WRSBleHRlbnNpb24gYnV0IGlmIG5vdCBhdmFpbGFibGUsIGZhbGxzIGJhY2sgdG9cbiAgICogQ09QWSArIEVYUFVOR0VcbiAgICpcbiAgICogTU9WRSBkZXRhaWxzOlxuICAgKiAgIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY4NTFcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggVGhlIHBhdGggZm9yIHRoZSBtYWlsYm94IHdoaWNoIHNob3VsZCBiZSBzZWxlY3RlZCBmb3IgdGhlIGNvbW1hbmQuIFNlbGVjdHMgbWFpbGJveCBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIHtTdHJpbmd9IHNlcXVlbmNlIE1lc3NhZ2UgcmFuZ2UgdG8gYmUgbW92ZWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IGRlc3RpbmF0aW9uIERlc3RpbmF0aW9uIG1haWxib3ggcGF0aFxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIFF1ZXJ5IG1vZGlmaWVyc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZVxuICAgKi9cbiAgYXN5bmMgbW92ZU1lc3NhZ2VzIChwYXRoLCBzZXF1ZW5jZSwgZGVzdGluYXRpb24sIG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdNb3ZpbmcgbWVzc2FnZXMnLCBzZXF1ZW5jZSwgJ2Zyb20nLCBwYXRoLCAndG8nLCBkZXN0aW5hdGlvbiwgJy4uLicpXG5cbiAgICBpZiAodGhpcy5fY2FwYWJpbGl0eS5pbmRleE9mKCdNT1ZFJykgPT09IC0xKSB7XG4gICAgICAvLyBGYWxsYmFjayB0byBDT1BZICsgRVhQVU5HRVxuICAgICAgYXdhaXQgdGhpcy5jb3B5TWVzc2FnZXMocGF0aCwgc2VxdWVuY2UsIGRlc3RpbmF0aW9uLCBvcHRpb25zKVxuICAgICAgcmV0dXJuIHRoaXMuZGVsZXRlTWVzc2FnZXMocGF0aCwgc2VxdWVuY2UsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgLy8gSWYgcG9zc2libGUsIHVzZSBNT1ZFXG4gICAgcmV0dXJuIHRoaXMuZXhlYyh7XG4gICAgICBjb21tYW5kOiBvcHRpb25zLmJ5VWlkID8gJ1VJRCBNT1ZFJyA6ICdNT1ZFJyxcbiAgICAgIGF0dHJpYnV0ZXM6IFtcbiAgICAgICAgeyB0eXBlOiAnc2VxdWVuY2UnLCB2YWx1ZTogc2VxdWVuY2UgfSxcbiAgICAgICAgeyB0eXBlOiAnYXRvbScsIHZhbHVlOiBkZXN0aW5hdGlvbiB9XG4gICAgICBdXG4gICAgfSwgWydPSyddLCB7XG4gICAgICBwcmVjaGVjazogKGN0eCkgPT4gdGhpcy5fc2hvdWxkU2VsZWN0TWFpbGJveChwYXRoLCBjdHgpID8gdGhpcy5zZWxlY3RNYWlsYm94KHBhdGgsIHsgY3R4IH0pIDogUHJvbWlzZS5yZXNvbHZlKClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgQ09NUFJFU1MgY29tbWFuZFxuICAgKlxuICAgKiBDT01QUkVTUyBkZXRhaWxzOlxuICAgKiAgIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0OTc4XG4gICAqL1xuICBhc3luYyBjb21wcmVzc0Nvbm5lY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5fZW5hYmxlQ29tcHJlc3Npb24gfHwgdGhpcy5fY2FwYWJpbGl0eS5pbmRleE9mKCdDT01QUkVTUz1ERUZMQVRFJykgPCAwIHx8IHRoaXMuY2xpZW50LmNvbXByZXNzZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdFbmFibGluZyBjb21wcmVzc2lvbi4uLicpXG4gICAgYXdhaXQgdGhpcy5leGVjKHtcbiAgICAgIGNvbW1hbmQ6ICdDT01QUkVTUycsXG4gICAgICBhdHRyaWJ1dGVzOiBbe1xuICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgIHZhbHVlOiAnREVGTEFURSdcbiAgICAgIH1dXG4gICAgfSlcbiAgICB0aGlzLmNsaWVudC5lbmFibGVDb21wcmVzc2lvbigpXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ0NvbXByZXNzaW9uIGVuYWJsZWQsIGFsbCBkYXRhIHNlbnQgYW5kIHJlY2VpdmVkIGlzIGRlZmxhdGVkIScpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBMT0dJTiBvciBBVVRIRU5USUNBVEUgWE9BVVRIMiBjb21tYW5kXG4gICAqXG4gICAqIExPR0lOIGRldGFpbHM6XG4gICAqICAgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzUwMSNzZWN0aW9uLTYuMi4zXG4gICAqIFhPQVVUSDIgZGV0YWlsczpcbiAgICogICBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9nbWFpbC94b2F1dGgyX3Byb3RvY29sI2ltYXBfcHJvdG9jb2xfZXhjaGFuZ2VcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGF1dGgudXNlclxuICAgKiBAcGFyYW0ge1N0cmluZ30gYXV0aC5wYXNzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBhdXRoLnhvYXV0aDJcbiAgICovXG4gIGFzeW5jIGxvZ2luIChhdXRoKSB7XG4gICAgbGV0IGNvbW1hbmRcbiAgICBjb25zdCBvcHRpb25zID0ge31cblxuICAgIGlmICghYXV0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBub3QgcHJvdmlkZWQnKVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9jYXBhYmlsaXR5LmluZGV4T2YoJ0FVVEg9WE9BVVRIMicpID49IDAgJiYgYXV0aCAmJiBhdXRoLnhvYXV0aDIpIHtcbiAgICAgIGNvbW1hbmQgPSB7XG4gICAgICAgIGNvbW1hbmQ6ICdBVVRIRU5USUNBVEUnLFxuICAgICAgICBhdHRyaWJ1dGVzOiBbXG4gICAgICAgICAgeyB0eXBlOiAnQVRPTScsIHZhbHVlOiAnWE9BVVRIMicgfSxcbiAgICAgICAgICB7IHR5cGU6ICdBVE9NJywgdmFsdWU6IGJ1aWxkWE9BdXRoMlRva2VuKGF1dGgudXNlciwgYXV0aC54b2F1dGgyKSwgc2Vuc2l0aXZlOiB0cnVlIH1cbiAgICAgICAgXVxuICAgICAgfVxuXG4gICAgICBvcHRpb25zLmVycm9yUmVzcG9uc2VFeHBlY3RzRW1wdHlMaW5lID0gdHJ1ZSAvLyArIHRhZ2dlZCBlcnJvciByZXNwb25zZSBleHBlY3RzIGFuIGVtcHR5IGxpbmUgaW4gcmV0dXJuXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbW1hbmQgPSB7XG4gICAgICAgIGNvbW1hbmQ6ICdsb2dpbicsXG4gICAgICAgIGF0dHJpYnV0ZXM6IFtcbiAgICAgICAgICB7IHR5cGU6ICdTVFJJTkcnLCB2YWx1ZTogYXV0aC51c2VyIHx8ICcnIH0sXG4gICAgICAgICAgeyB0eXBlOiAnU1RSSU5HJywgdmFsdWU6IGF1dGgucGFzcyB8fCAnJywgc2Vuc2l0aXZlOiB0cnVlIH1cbiAgICAgICAgXVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdMb2dnaW5nIGluLi4uJylcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZXhlYyhjb21tYW5kLCAnY2FwYWJpbGl0eScsIG9wdGlvbnMpXG4gICAgLypcbiAgICAgKiB1cGRhdGUgcG9zdC1hdXRoIGNhcGFiaWxpdGVzXG4gICAgICogY2FwYWJpbGl0eSBsaXN0IHNob3VsZG4ndCBjb250YWluIGF1dGggcmVsYXRlZCBzdHVmZiBhbnltb3JlXG4gICAgICogYnV0IHNvbWUgbmV3IGV4dGVuc2lvbnMgbWlnaHQgaGF2ZSBwb3BwZWQgdXAgdGhhdCBkbyBub3RcbiAgICAgKiBtYWtlIG11Y2ggc2Vuc2UgaW4gdGhlIG5vbi1hdXRoIHN0YXRlXG4gICAgICovXG4gICAgaWYgKHJlc3BvbnNlLmNhcGFiaWxpdHkgJiYgcmVzcG9uc2UuY2FwYWJpbGl0eS5sZW5ndGgpIHtcbiAgICAgIC8vIGNhcGFiaWxpdGVzIHdlcmUgbGlzdGVkIHdpdGggdGhlIE9LIFtDQVBBQklMSVRZIC4uLl0gcmVzcG9uc2VcbiAgICAgIHRoaXMuX2NhcGFiaWxpdHkgPSByZXNwb25zZS5jYXBhYmlsaXR5XG4gICAgfSBlbHNlIGlmIChyZXNwb25zZS5wYXlsb2FkICYmIHJlc3BvbnNlLnBheWxvYWQuQ0FQQUJJTElUWSAmJiByZXNwb25zZS5wYXlsb2FkLkNBUEFCSUxJVFkubGVuZ3RoKSB7XG4gICAgICAvLyBjYXBhYmlsaXRlcyB3ZXJlIGxpc3RlZCB3aXRoICogQ0FQQUJJTElUWSAuLi4gcmVzcG9uc2VcbiAgICAgIHRoaXMuX2NhcGFiaWxpdHkgPSByZXNwb25zZS5wYXlsb2FkLkNBUEFCSUxJVFkucG9wKCkuYXR0cmlidXRlcy5tYXAoKGNhcGEgPSAnJykgPT4gY2FwYS52YWx1ZS50b1VwcGVyQ2FzZSgpLnRyaW0oKSlcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY2FwYWJpbGl0aWVzIHdlcmUgbm90IGF1dG9tYXRpY2FsbHkgbGlzdGVkLCByZWxvYWRcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlQ2FwYWJpbGl0eSh0cnVlKVxuICAgIH1cblxuICAgIHRoaXMuX2NoYW5nZVN0YXRlKFNUQVRFX0FVVEhFTlRJQ0FURUQpXG4gICAgdGhpcy5fYXV0aGVudGljYXRlZCA9IHRydWVcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTG9naW4gc3VjY2Vzc2Z1bCwgcG9zdC1hdXRoIGNhcGFiaWxpdGVzIHVwZGF0ZWQhJywgdGhpcy5fY2FwYWJpbGl0eSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gYW4gSU1BUCBjb21tYW5kLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcmVxdWVzdCBTdHJ1Y3R1cmVkIHJlcXVlc3Qgb2JqZWN0XG4gICAqIEBwYXJhbSB7QXJyYXl9IGFjY2VwdFVudGFnZ2VkIGEgbGlzdCBvZiB1bnRhZ2dlZCByZXNwb25zZXMgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIGluICdwYXlsb2FkJyBwcm9wZXJ0eVxuICAgKi9cbiAgYXN5bmMgZXhlYyAocmVxdWVzdCwgYWNjZXB0VW50YWdnZWQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLmJyZWFrSWRsZSgpXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5lbnF1ZXVlQ29tbWFuZChyZXF1ZXN0LCBhY2NlcHRVbnRhZ2dlZCwgb3B0aW9ucylcbiAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UuY2FwYWJpbGl0eSkge1xuICAgICAgdGhpcy5fY2FwYWJpbGl0eSA9IHJlc3BvbnNlLmNhcGFiaWxpdHlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlXG4gIH1cblxuICAvKipcbiAgICogVGhlIGNvbm5lY3Rpb24gaXMgaWRsaW5nLiBTZW5kcyBhIE5PT1Agb3IgSURMRSBjb21tYW5kXG4gICAqXG4gICAqIElETEUgZGV0YWlsczpcbiAgICogICBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjE3N1xuICAgKi9cbiAgZW50ZXJJZGxlICgpIHtcbiAgICBpZiAodGhpcy5fZW50ZXJlZElkbGUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBzdXBwb3J0c0lkbGUgPSB0aGlzLl9jYXBhYmlsaXR5LmluZGV4T2YoJ0lETEUnKSA+PSAwXG4gICAgdGhpcy5fZW50ZXJlZElkbGUgPSBzdXBwb3J0c0lkbGUgJiYgdGhpcy5fc2VsZWN0ZWRNYWlsYm94ID8gJ0lETEUnIDogJ05PT1AnXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ0VudGVyaW5nIGlkbGUgd2l0aCAnICsgdGhpcy5fZW50ZXJlZElkbGUpXG5cbiAgICBpZiAodGhpcy5fZW50ZXJlZElkbGUgPT09ICdOT09QJykge1xuICAgICAgdGhpcy5faWRsZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ1NlbmRpbmcgTk9PUCcpXG4gICAgICAgIHRoaXMuZXhlYygnTk9PUCcpXG4gICAgICB9LCB0aGlzLnRpbWVvdXROb29wKVxuICAgIH0gZWxzZSBpZiAodGhpcy5fZW50ZXJlZElkbGUgPT09ICdJRExFJykge1xuICAgICAgdGhpcy5jbGllbnQuZW5xdWV1ZUNvbW1hbmQoe1xuICAgICAgICBjb21tYW5kOiAnSURMRSdcbiAgICAgIH0pXG4gICAgICB0aGlzLl9pZGxlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmNsaWVudC5zZW5kKCdET05FXFxyXFxuJylcbiAgICAgICAgdGhpcy5fZW50ZXJlZElkbGUgPSBmYWxzZVxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnSWRsZSB0ZXJtaW5hdGVkJylcbiAgICAgIH0sIHRoaXMudGltZW91dElkbGUpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIGFjdGlvbnMgcmVsYXRlZCBpZGxpbmcsIGlmIElETEUgaXMgc3VwcG9ydGVkLCBzZW5kcyBET05FIHRvIHN0b3AgaXRcbiAgICovXG4gIGJyZWFrSWRsZSAoKSB7XG4gICAgaWYgKCF0aGlzLl9lbnRlcmVkSWRsZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX2lkbGVUaW1lb3V0KVxuICAgIGlmICh0aGlzLl9lbnRlcmVkSWRsZSA9PT0gJ0lETEUnKSB7XG4gICAgICB0aGlzLmNsaWVudC5zZW5kKCdET05FXFxyXFxuJylcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdJZGxlIHRlcm1pbmF0ZWQnKVxuICAgIH1cbiAgICB0aGlzLl9lbnRlcmVkSWRsZSA9IGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBTVEFSVFRMUyBjb21tYW5kIGlmIG5lZWRlZFxuICAgKlxuICAgKiBTVEFSVFRMUyBkZXRhaWxzOlxuICAgKiAgIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM1MDEjc2VjdGlvbi02LjIuMVxuICAgKlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtmb3JjZWRdIEJ5IGRlZmF1bHQgdGhlIGNvbW1hbmQgaXMgbm90IHJ1biBpZiBjYXBhYmlsaXR5IGlzIGFscmVhZHkgbGlzdGVkLiBTZXQgdG8gdHJ1ZSB0byBza2lwIHRoaXMgdmFsaWRhdGlvblxuICAgKi9cbiAgYXN5bmMgdXBncmFkZUNvbm5lY3Rpb24gKCkge1xuICAgIC8vIHNraXAgcmVxdWVzdCwgaWYgYWxyZWFkeSBzZWN1cmVkXG4gICAgaWYgKHRoaXMuY2xpZW50LnNlY3VyZU1vZGUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIHNraXAgaWYgU1RBUlRUTFMgbm90IGF2YWlsYWJsZSBvciBzdGFydHRscyBzdXBwb3J0IGRpc2FibGVkXG4gICAgaWYgKCh0aGlzLl9jYXBhYmlsaXR5LmluZGV4T2YoJ1NUQVJUVExTJykgPCAwIHx8IHRoaXMuX2lnbm9yZVRMUykgJiYgIXRoaXMuX3JlcXVpcmVUTFMpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdFbmNyeXB0aW5nIGNvbm5lY3Rpb24uLi4nKVxuICAgIGF3YWl0IHRoaXMuZXhlYygnU1RBUlRUTFMnKVxuICAgIHRoaXMuX2NhcGFiaWxpdHkgPSBbXVxuICAgIHRoaXMuY2xpZW50LnVwZ3JhZGUoKVxuICAgIHJldHVybiB0aGlzLnVwZGF0ZUNhcGFiaWxpdHkoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgQ0FQQUJJTElUWSBjb21tYW5kXG4gICAqXG4gICAqIENBUEFCSUxJVFkgZGV0YWlsczpcbiAgICogICBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNTAxI3NlY3Rpb24tNi4xLjFcbiAgICpcbiAgICogRG9lc24ndCByZWdpc3RlciB1bnRhZ2dlZCBDQVBBQklMSVRZIGhhbmRsZXIgYXMgdGhpcyBpcyBhbHJlYWR5XG4gICAqIGhhbmRsZWQgYnkgZ2xvYmFsIGhhbmRsZXJcbiAgICpcbiAgICogQHBhcmFtIHtCb29sZWFufSBbZm9yY2VkXSBCeSBkZWZhdWx0IHRoZSBjb21tYW5kIGlzIG5vdCBydW4gaWYgY2FwYWJpbGl0eSBpcyBhbHJlYWR5IGxpc3RlZC4gU2V0IHRvIHRydWUgdG8gc2tpcCB0aGlzIHZhbGlkYXRpb25cbiAgICovXG4gIGFzeW5jIHVwZGF0ZUNhcGFiaWxpdHkgKGZvcmNlZCkge1xuICAgIC8vIHNraXAgcmVxdWVzdCwgaWYgbm90IGZvcmNlZCB1cGRhdGUgYW5kIGNhcGFiaWxpdGllcyBhcmUgYWxyZWFkeSBsb2FkZWRcbiAgICBpZiAoIWZvcmNlZCAmJiB0aGlzLl9jYXBhYmlsaXR5Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gSWYgU1RBUlRUTFMgaXMgcmVxdWlyZWQgdGhlbiBza2lwIGNhcGFiaWxpdHkgbGlzdGluZyBhcyB3ZSBhcmUgZ29pbmcgdG8gdHJ5XG4gICAgLy8gU1RBUlRUTFMgYW55d2F5IGFuZCB3ZSByZS1jaGVjayBjYXBhYmlsaXRpZXMgYWZ0ZXIgY29ubmVjdGlvbiBpcyBzZWN1cmVkXG4gICAgaWYgKCF0aGlzLmNsaWVudC5zZWN1cmVNb2RlICYmIHRoaXMuX3JlcXVpcmVUTFMpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdVcGRhdGluZyBjYXBhYmlsaXR5Li4uJylcbiAgICByZXR1cm4gdGhpcy5leGVjKCdDQVBBQklMSVRZJylcbiAgfVxuXG4gIGhhc0NhcGFiaWxpdHkgKGNhcGEgPSAnJykge1xuICAgIHJldHVybiB0aGlzLl9jYXBhYmlsaXR5LmluZGV4T2YoY2FwYS50b1VwcGVyQ2FzZSgpLnRyaW0oKSkgPj0gMFxuICB9XG5cbiAgLy8gRGVmYXVsdCBoYW5kbGVycyBmb3IgdW50YWdnZWQgcmVzcG9uc2VzXG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhbiB1bnRhZ2dlZCBPSyBpbmNsdWRlcyBbQ0FQQUJJTElUWV0gdGFnIGFuZCB1cGRhdGVzIGNhcGFiaWxpdHkgb2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSByZXNwb25zZSBQYXJzZWQgc2VydmVyIHJlc3BvbnNlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG5leHQgVW50aWwgY2FsbGVkLCBzZXJ2ZXIgcmVzcG9uc2VzIGFyZSBub3QgcHJvY2Vzc2VkXG4gICAqL1xuICBfdW50YWdnZWRPa0hhbmRsZXIgKHJlc3BvbnNlKSB7XG4gICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmNhcGFiaWxpdHkpIHtcbiAgICAgIHRoaXMuX2NhcGFiaWxpdHkgPSByZXNwb25zZS5jYXBhYmlsaXR5XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgY2FwYWJpbGl0eSBvYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHJlc3BvbnNlIFBhcnNlZCBzZXJ2ZXIgcmVzcG9uc2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbmV4dCBVbnRpbCBjYWxsZWQsIHNlcnZlciByZXNwb25zZXMgYXJlIG5vdCBwcm9jZXNzZWRcbiAgICovXG4gIF91bnRhZ2dlZENhcGFiaWxpdHlIYW5kbGVyIChyZXNwb25zZSkge1xuICAgIHRoaXMuX2NhcGFiaWxpdHkgPSBwaXBlKFxuICAgICAgcHJvcE9yKFtdLCAnYXR0cmlidXRlcycpLFxuICAgICAgbWFwKCh7IHZhbHVlIH0pID0+ICh2YWx1ZSB8fCAnJykudG9VcHBlckNhc2UoKS50cmltKCkpXG4gICAgKShyZXNwb25zZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGV4aXN0aW5nIG1lc3NhZ2UgY291bnRcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHJlc3BvbnNlIFBhcnNlZCBzZXJ2ZXIgcmVzcG9uc2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbmV4dCBVbnRpbCBjYWxsZWQsIHNlcnZlciByZXNwb25zZXMgYXJlIG5vdCBwcm9jZXNzZWRcbiAgICovXG4gIF91bnRhZ2dlZEV4aXN0c0hhbmRsZXIgKHJlc3BvbnNlKSB7XG4gICAgaWYgKHJlc3BvbnNlICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyZXNwb25zZSwgJ25yJykpIHtcbiAgICAgIHRoaXMub251cGRhdGUgJiYgdGhpcy5vbnVwZGF0ZSh0aGlzLl9zZWxlY3RlZE1haWxib3gsICdleGlzdHMnLCByZXNwb25zZS5ucilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIGEgbWVzc2FnZSBoYXMgYmVlbiBkZWxldGVkXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSByZXNwb25zZSBQYXJzZWQgc2VydmVyIHJlc3BvbnNlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG5leHQgVW50aWwgY2FsbGVkLCBzZXJ2ZXIgcmVzcG9uc2VzIGFyZSBub3QgcHJvY2Vzc2VkXG4gICAqL1xuICBfdW50YWdnZWRFeHB1bmdlSGFuZGxlciAocmVzcG9uc2UpIHtcbiAgICBpZiAocmVzcG9uc2UgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3BvbnNlLCAnbnInKSkge1xuICAgICAgdGhpcy5vbnVwZGF0ZSAmJiB0aGlzLm9udXBkYXRlKHRoaXMuX3NlbGVjdGVkTWFpbGJveCwgJ2V4cHVuZ2UnLCByZXNwb25zZS5ucilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHRoYXQgZmxhZ3MgaGF2ZSBiZWVuIHVwZGF0ZWQgZm9yIGEgbWVzc2FnZVxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcmVzcG9uc2UgUGFyc2VkIHNlcnZlciByZXNwb25zZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBuZXh0IFVudGlsIGNhbGxlZCwgc2VydmVyIHJlc3BvbnNlcyBhcmUgbm90IHByb2Nlc3NlZFxuICAgKi9cbiAgX3VudGFnZ2VkRmV0Y2hIYW5kbGVyIChyZXNwb25zZSkge1xuICAgIHRoaXMub251cGRhdGUgJiYgdGhpcy5vbnVwZGF0ZSh0aGlzLl9zZWxlY3RlZE1haWxib3gsICdmZXRjaCcsIFtdLmNvbmNhdChwYXJzZUZFVENIKHsgcGF5bG9hZDogeyBGRVRDSDogW3Jlc3BvbnNlXSB9IH0pIHx8IFtdKS5zaGlmdCgpKVxuICB9XG5cbiAgLy8gUHJpdmF0ZSBoZWxwZXJzXG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGF0IHRoZSBjb25uZWN0aW9uIHN0YXJ0ZWQgaWRsaW5nLiBJbml0aWF0ZXMgYSBjeWNsZVxuICAgKiBvZiBOT09QcyBvciBJRExFcyB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMgYWJvdXQgdXBkYXRlcyBpbiB0aGUgc2VydmVyXG4gICAqL1xuICBfb25JZGxlICgpIHtcbiAgICBpZiAoIXRoaXMuX2F1dGhlbnRpY2F0ZWQgfHwgdGhpcy5fZW50ZXJlZElkbGUpIHtcbiAgICAgIC8vIE5vIG5lZWQgdG8gSURMRSB3aGVuIG5vdCBsb2dnZWQgaW4gb3IgYWxyZWFkeSBpZGxpbmdcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdDbGllbnQgc3RhcnRlZCBpZGxpbmcnKVxuICAgIHRoaXMuZW50ZXJJZGxlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBJTUFQIHN0YXRlIHZhbHVlIGZvciB0aGUgY3VycmVudCBjb25uZWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBuZXdTdGF0ZSBUaGUgc3RhdGUgeW91IHdhbnQgdG8gY2hhbmdlIHRvXG4gICAqL1xuICBfY2hhbmdlU3RhdGUgKG5ld1N0YXRlKSB7XG4gICAgaWYgKG5ld1N0YXRlID09PSB0aGlzLl9zdGF0ZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ0VudGVyaW5nIHN0YXRlOiAnICsgbmV3U3RhdGUpXG5cbiAgICAvLyBpZiBhIG1haWxib3ggd2FzIG9wZW5lZCwgZW1pdCBvbmNsb3NlbWFpbGJveCBhbmQgY2xlYXIgc2VsZWN0ZWRNYWlsYm94IHZhbHVlXG4gICAgaWYgKHRoaXMuX3N0YXRlID09PSBTVEFURV9TRUxFQ1RFRCAmJiB0aGlzLl9zZWxlY3RlZE1haWxib3gpIHtcbiAgICAgIHRoaXMub25jbG9zZW1haWxib3ggJiYgdGhpcy5vbmNsb3NlbWFpbGJveCh0aGlzLl9zZWxlY3RlZE1haWxib3gpXG4gICAgICB0aGlzLl9zZWxlY3RlZE1haWxib3ggPSBmYWxzZVxuICAgIH1cblxuICAgIHRoaXMuX3N0YXRlID0gbmV3U3RhdGVcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmVzIGEgcGF0aCBleGlzdHMgaW4gdGhlIE1haWxib3ggdHJlZVxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gdHJlZSBNYWlsYm94IHRyZWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtTdHJpbmd9IGRlbGltaXRlclxuICAgKiBAcmV0dXJuIHtPYmplY3R9IGJyYW5jaCBmb3IgdXNlZCBwYXRoXG4gICAqL1xuICBfZW5zdXJlUGF0aCAodHJlZSwgcGF0aCwgZGVsaW1pdGVyKSB7XG4gICAgY29uc3QgbmFtZXMgPSBwYXRoLnNwbGl0KGRlbGltaXRlcilcbiAgICBsZXQgYnJhbmNoID0gdHJlZVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGZvdW5kID0gZmFsc2VcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYnJhbmNoLmNoaWxkcmVuLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmICh0aGlzLl9jb21wYXJlTWFpbGJveE5hbWVzKGJyYW5jaC5jaGlsZHJlbltqXS5uYW1lLCBpbWFwRGVjb2RlKG5hbWVzW2ldKSkpIHtcbiAgICAgICAgICBicmFuY2ggPSBicmFuY2guY2hpbGRyZW5bal1cbiAgICAgICAgICBmb3VuZCA9IHRydWVcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgIGJyYW5jaC5jaGlsZHJlbi5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBpbWFwRGVjb2RlKG5hbWVzW2ldKSxcbiAgICAgICAgICBkZWxpbWl0ZXI6IGRlbGltaXRlcixcbiAgICAgICAgICBwYXRoOiBuYW1lcy5zbGljZSgwLCBpICsgMSkuam9pbihkZWxpbWl0ZXIpLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXVxuICAgICAgICB9KVxuICAgICAgICBicmFuY2ggPSBicmFuY2guY2hpbGRyZW5bYnJhbmNoLmNoaWxkcmVuLmxlbmd0aCAtIDFdXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBicmFuY2hcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wYXJlcyB0d28gbWFpbGJveCBuYW1lcy4gQ2FzZSBpbnNlbnNpdGl2ZSBpbiBjYXNlIG9mIElOQk9YLCBvdGhlcndpc2UgY2FzZSBzZW5zaXRpdmVcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGEgTWFpbGJveCBuYW1lXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBiIE1haWxib3ggbmFtZVxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZm9sZGVyIG5hbWVzIG1hdGNoXG4gICAqL1xuICBfY29tcGFyZU1haWxib3hOYW1lcyAoYSwgYikge1xuICAgIHJldHVybiAoYS50b1VwcGVyQ2FzZSgpID09PSAnSU5CT1gnID8gJ0lOQk9YJyA6IGEpID09PSAoYi50b1VwcGVyQ2FzZSgpID09PSAnSU5CT1gnID8gJ0lOQk9YJyA6IGIpXG4gIH1cblxuICBjcmVhdGVMb2dnZXIgKGNyZWF0b3IgPSBjcmVhdGVEZWZhdWx0TG9nZ2VyKSB7XG4gICAgY29uc3QgbG9nZ2VyID0gY3JlYXRvcigodGhpcy5fYXV0aCB8fCB7fSkudXNlciB8fCAnJywgdGhpcy5faG9zdClcbiAgICB0aGlzLmxvZ2dlciA9IHRoaXMuY2xpZW50LmxvZ2dlciA9IHtcbiAgICAgIGRlYnVnOiAoLi4ubXNncykgPT4geyBpZiAoTE9HX0xFVkVMX0RFQlVHID49IHRoaXMubG9nTGV2ZWwpIHsgbG9nZ2VyLmRlYnVnKG1zZ3MpIH0gfSxcbiAgICAgIGluZm86ICguLi5tc2dzKSA9PiB7IGlmIChMT0dfTEVWRUxfSU5GTyA+PSB0aGlzLmxvZ0xldmVsKSB7IGxvZ2dlci5pbmZvKG1zZ3MpIH0gfSxcbiAgICAgIHdhcm46ICguLi5tc2dzKSA9PiB7IGlmIChMT0dfTEVWRUxfV0FSTiA+PSB0aGlzLmxvZ0xldmVsKSB7IGxvZ2dlci53YXJuKG1zZ3MpIH0gfSxcbiAgICAgIGVycm9yOiAoLi4ubXNncykgPT4geyBpZiAoTE9HX0xFVkVMX0VSUk9SID49IHRoaXMubG9nTGV2ZWwpIHsgbG9nZ2VyLmVycm9yKG1zZ3MpIH0gfVxuICAgIH1cbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/dist/command-builder.js b/dist/command-builder.js deleted file mode 100644 index 5cc84d44..00000000 --- a/dist/command-builder.js +++ /dev/null @@ -1,233 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.buildFETCHCommand = buildFETCHCommand; -exports.buildXOAuth2Token = buildXOAuth2Token; -exports.buildSEARCHCommand = buildSEARCHCommand; -exports.buildSTORECommand = buildSTORECommand; - -var _emailjsImapHandler = require("emailjs-imap-handler"); - -var _emailjsMimeCodec = require("emailjs-mime-codec"); - -var _emailjsBase = require("emailjs-base64"); - -var _common = require("./common"); - -function buildFETCHCommand(sequence, items, options) { - const command = { - command: options.byUid ? 'UID FETCH' : 'FETCH', - attributes: [{ - type: 'SEQUENCE', - value: sequence - }] - }; - - if (options.valueAsString !== undefined) { - command.valueAsString = options.valueAsString; - } - - let query = []; - items.forEach(item => { - item = item.toUpperCase().trim(); - - if (/^\w+$/.test(item)) { - // alphanum strings can be used directly - query.push({ - type: 'ATOM', - value: item - }); - } else if (item) { - try { - // parse the value as a fake command, use only the attributes block - const cmd = (0, _emailjsImapHandler.parser)((0, _common.toTypedArray)('* Z ' + item)); - query = query.concat(cmd.attributes || []); - } catch (e) { - // if parse failed, use the original string as one entity - query.push({ - type: 'ATOM', - value: item - }); - } - } - }); - - if (query.length === 1) { - query = query.pop(); - } - - command.attributes.push(query); - - if (options.changedSince) { - command.attributes.push([{ - type: 'ATOM', - value: 'CHANGEDSINCE' - }, { - type: 'ATOM', - value: options.changedSince - }]); - } - - return command; -} -/** - * Builds a login token for XOAUTH2 authentication command - * - * @param {String} user E-mail address of the user - * @param {String} token Valid access token for the user - * @return {String} Base64 formatted login token - */ - - -function buildXOAuth2Token(user = '', token) { - const authData = [`user=${user}`, `auth=Bearer ${token}`, '', '']; - return (0, _emailjsBase.encode)(authData.join('\x01')); -} -/** - * Compiles a search query into an IMAP command. Queries are composed as objects - * where keys are search terms and values are term arguments. Only strings, - * numbers and Dates are used. If the value is an array, the members of it - * are processed separately (use this for terms that require multiple params). - * If the value is a Date, it is converted to the form of "01-Jan-1970". - * Subqueries (OR, NOT) are made up of objects - * - * {unseen: true, header: ["subject", "hello world"]}; - * SEARCH UNSEEN HEADER "subject" "hello world" - * - * @param {Object} query Search query - * @param {Object} [options] Option object - * @param {Boolean} [options.byUid] If ture, use UID SEARCH instead of SEARCH - * @return {Object} IMAP command object - */ - - -function buildSEARCHCommand(query = {}, options = {}) { - const command = { - command: options.byUid ? 'UID SEARCH' : 'SEARCH' - }; - let isAscii = true; - - const buildTerm = query => { - let list = []; - Object.keys(query).forEach(key => { - let params = []; - - const formatDate = date => date.toUTCString().replace(/^\w+, 0?(\d+) (\w+) (\d+).*/, '$1-$2-$3'); - - const escapeParam = param => { - if (typeof param === 'number') { - return { - type: 'number', - value: param - }; - } else if (typeof param === 'string') { - if (/[\u0080-\uFFFF]/.test(param)) { - isAscii = false; - return { - type: 'literal', - value: (0, _common.fromTypedArray)((0, _emailjsMimeCodec.encode)(param)) // cast unicode string to pseudo-binary as imap-handler compiles strings as octets - - }; - } - - return { - type: 'string', - value: param - }; - } else if (Object.prototype.toString.call(param) === '[object Date]') { - // RFC 3501 allows for dates to be placed in - // double-quotes or left without quotes. Some - // servers (Yandex), do not like the double quotes, - // so we treat the date as an atom. - return { - type: 'atom', - value: formatDate(param) - }; - } else if (Array.isArray(param)) { - return param.map(escapeParam); - } else if (typeof param === 'object') { - return buildTerm(param); - } - }; - - params.push({ - type: 'atom', - value: key.toUpperCase() - }); - [].concat(query[key] || []).forEach(param => { - switch (key.toLowerCase()) { - case 'uid': - param = { - type: 'sequence', - value: param - }; - break; - // The Gmail extension values of X-GM-THRID and - // X-GM-MSGID are defined to be unsigned 64-bit integers - // and they must not be quoted strings or the server - // will report a parse error. - - case 'x-gm-thrid': - case 'x-gm-msgid': - param = { - type: 'number', - value: param - }; - break; - - default: - param = escapeParam(param); - } - - if (param) { - params = params.concat(param || []); - } - }); - list = list.concat(params || []); - }); - return list; - }; - - command.attributes = buildTerm(query); // If any string input is using 8bit bytes, prepend the optional CHARSET argument - - if (!isAscii) { - command.attributes.unshift({ - type: 'atom', - value: 'UTF-8' - }); - command.attributes.unshift({ - type: 'atom', - value: 'CHARSET' - }); - } - - return command; -} -/** - * Creates an IMAP STORE command from the selected arguments - */ - - -function buildSTORECommand(sequence, action = '', flags = [], options = {}) { - const command = { - command: options.byUid ? 'UID STORE' : 'STORE', - attributes: [{ - type: 'sequence', - value: sequence - }] - }; - command.attributes.push({ - type: 'atom', - value: action.toUpperCase() + (options.silent ? '.SILENT' : '') - }); - command.attributes.push(flags.map(flag => { - return { - type: 'atom', - value: flag - }; - })); - return command; -} -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21tYW5kLWJ1aWxkZXIuanMiXSwibmFtZXMiOlsiYnVpbGRGRVRDSENvbW1hbmQiLCJzZXF1ZW5jZSIsIml0ZW1zIiwib3B0aW9ucyIsImNvbW1hbmQiLCJieVVpZCIsImF0dHJpYnV0ZXMiLCJ0eXBlIiwidmFsdWUiLCJ2YWx1ZUFzU3RyaW5nIiwidW5kZWZpbmVkIiwicXVlcnkiLCJmb3JFYWNoIiwiaXRlbSIsInRvVXBwZXJDYXNlIiwidHJpbSIsInRlc3QiLCJwdXNoIiwiY21kIiwiY29uY2F0IiwiZSIsImxlbmd0aCIsInBvcCIsImNoYW5nZWRTaW5jZSIsImJ1aWxkWE9BdXRoMlRva2VuIiwidXNlciIsInRva2VuIiwiYXV0aERhdGEiLCJqb2luIiwiYnVpbGRTRUFSQ0hDb21tYW5kIiwiaXNBc2NpaSIsImJ1aWxkVGVybSIsImxpc3QiLCJPYmplY3QiLCJrZXlzIiwia2V5IiwicGFyYW1zIiwiZm9ybWF0RGF0ZSIsImRhdGUiLCJ0b1VUQ1N0cmluZyIsInJlcGxhY2UiLCJlc2NhcGVQYXJhbSIsInBhcmFtIiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJjYWxsIiwiQXJyYXkiLCJpc0FycmF5IiwibWFwIiwidG9Mb3dlckNhc2UiLCJ1bnNoaWZ0IiwiYnVpbGRTVE9SRUNvbW1hbmQiLCJhY3Rpb24iLCJmbGFncyIsInNpbGVudCIsImZsYWciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFhTyxTQUFTQSxpQkFBVCxDQUE0QkMsUUFBNUIsRUFBc0NDLEtBQXRDLEVBQTZDQyxPQUE3QyxFQUFzRDtBQUMzRCxRQUFNQyxPQUFPLEdBQUc7QUFDZEEsSUFBQUEsT0FBTyxFQUFFRCxPQUFPLENBQUNFLEtBQVIsR0FBZ0IsV0FBaEIsR0FBOEIsT0FEekI7QUFFZEMsSUFBQUEsVUFBVSxFQUFFLENBQUM7QUFDWEMsTUFBQUEsSUFBSSxFQUFFLFVBREs7QUFFWEMsTUFBQUEsS0FBSyxFQUFFUDtBQUZJ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b3J0IHsgcGFyc2VyIH0gZnJvbSAnZW1haWxqcy1pbWFwLWhhbmRsZXInXG5pbXBvcnQgeyBlbmNvZGUgfSBmcm9tICdlbWFpbGpzLW1pbWUtY29kZWMnXG5pbXBvcnQgeyBlbmNvZGUgYXMgZW5jb2RlQmFzZTY0IH0gZnJvbSAnZW1haWxqcy1iYXNlNjQnXG5pbXBvcnQge1xuICBmcm9tVHlwZWRBcnJheSxcbiAgdG9UeXBlZEFycmF5XG59IGZyb20gJy4vY29tbW9uJ1xuXG4vKipcbiAqIEJ1aWxkcyBhIEZFVENIIGNvbW1hbmRcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VxdWVuY2UgTWVzc2FnZSByYW5nZSBzZWxlY3RvclxuICogQHBhcmFtIHtBcnJheX0gaXRlbXMgTGlzdCBvZiBlbGVtZW50cyB0byBmZXRjaCAoZWcuIGBbJ3VpZCcsICdlbnZlbG9wZSddYCkuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIE9wdGlvbmFsIG9wdGlvbnMgb2JqZWN0LiBVc2UgYHtieVVpZDp0cnVlfWAgZm9yIGBVSUQgRkVUQ0hgXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBTdHJ1Y3R1cmVkIElNQVAgY29tbWFuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRGRVRDSENvbW1hbmQgKHNlcXVlbmNlLCBpdGVtcywgb3B0aW9ucykge1xuICBjb25zdCBjb21tYW5kID0ge1xuICAgIGNvbW1hbmQ6IG9wdGlvbnMuYnlVaWQgPyAnVUlEIEZFVENIJyA6ICdGRVRDSCcsXG4gICAgYXR0cmlidXRlczogW3tcbiAgICAgIHR5cGU6ICdTRVFVRU5DRScsXG4gICAgICB2YWx1ZTogc2VxdWVuY2VcbiAgICB9XVxuICB9XG5cbiAgaWYgKG9wdGlvbnMudmFsdWVBc1N0cmluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29tbWFuZC52YWx1ZUFzU3RyaW5nID0gb3B0aW9ucy52YWx1ZUFzU3RyaW5nXG4gIH1cblxuICBsZXQgcXVlcnkgPSBbXVxuXG4gIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICBpdGVtID0gaXRlbS50b1VwcGVyQ2FzZSgpLnRyaW0oKVxuXG4gICAgaWYgKC9eXFx3KyQvLnRlc3QoaXRlbSkpIHtcbiAgICAgIC8vIGFscGhhbnVtIHN0cmluZ3MgY2FuIGJlIHVzZWQgZGlyZWN0bHlcbiAgICAgIHF1ZXJ5LnB1c2goe1xuICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgIHZhbHVlOiBpdGVtXG4gICAgICB9KVxuICAgIH0gZWxzZSBpZiAoaXRlbSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gcGFyc2UgdGhlIHZhbHVlIGFzIGEgZmFrZSBjb21tYW5kLCB1c2Ugb25seSB0aGUgYXR0cmlidXRlcyBibG9ja1xuICAgICAgICBjb25zdCBjbWQgPSBwYXJzZXIodG9UeXBlZEFycmF5KCcqIFogJyArIGl0ZW0pKVxuICAgICAgICBxdWVyeSA9IHF1ZXJ5LmNvbmNhdChjbWQuYXR0cmlidXRlcyB8fCBbXSlcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaWYgcGFyc2UgZmFpbGVkLCB1c2UgdGhlIG9yaWdpbmFsIHN0cmluZyBhcyBvbmUgZW50aXR5XG4gICAgICAgIHF1ZXJ5LnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICB2YWx1ZTogaXRlbVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICBpZiAocXVlcnkubGVuZ3RoID09PSAxKSB7XG4gICAgcXVlcnkgPSBxdWVyeS5wb3AoKVxuICB9XG5cbiAgY29tbWFuZC5hdHRyaWJ1dGVzLnB1c2gocXVlcnkpXG5cbiAgaWYgKG9wdGlvbnMuY2hhbmdlZFNpbmNlKSB7XG4gICAgY29tbWFuZC5hdHRyaWJ1dGVzLnB1c2goW3tcbiAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgIHZhbHVlOiAnQ0hBTkdFRFNJTkNFJ1xuICAgIH0sIHtcbiAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgIHZhbHVlOiBvcHRpb25zLmNoYW5nZWRTaW5jZVxuICAgIH1dKVxuICB9XG5cbiAgcmV0dXJuIGNvbW1hbmRcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBsb2dpbiB0b2tlbiBmb3IgWE9BVVRIMiBhdXRoZW50aWNhdGlvbiBjb21tYW5kXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVzZXIgRS1tYWlsIGFkZHJlc3Mgb2YgdGhlIHVzZXJcbiAqIEBwYXJhbSB7U3RyaW5nfSB0b2tlbiBWYWxpZCBhY2Nlc3MgdG9rZW4gZm9yIHRoZSB1c2VyXG4gKiBAcmV0dXJuIHtTdHJpbmd9IEJhc2U2NCBmb3JtYXR0ZWQgbG9naW4gdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkWE9BdXRoMlRva2VuICh1c2VyID0gJycsIHRva2VuKSB7XG4gIGNvbnN0IGF1dGhEYXRhID0gW1xuICAgIGB1c2VyPSR7dXNlcn1gLFxuICAgIGBhdXRoPUJlYXJlciAke3Rva2VufWAsXG4gICAgJycsXG4gICAgJydcbiAgXVxuICByZXR1cm4gZW5jb2RlQmFzZTY0KGF1dGhEYXRhLmpvaW4oJ1xceDAxJykpXG59XG5cbi8qKlxuICogQ29tcGlsZXMgYSBzZWFyY2ggcXVlcnkgaW50byBhbiBJTUFQIGNvbW1hbmQuIFF1ZXJpZXMgYXJlIGNvbXBvc2VkIGFzIG9iamVjdHNcbiAqIHdoZXJlIGtleXMgYXJlIHNlYXJjaCB0ZXJtcyBhbmQgdmFsdWVzIGFyZSB0ZXJtIGFyZ3VtZW50cy4gT25seSBzdHJpbmdzLFxuICogbnVtYmVycyBhbmQgRGF0ZXMgYXJlIHVzZWQuIElmIHRoZSB2YWx1ZSBpcyBhbiBhcnJheSwgdGhlIG1lbWJlcnMgb2YgaXRcbiAqIGFyZSBwcm9jZXNzZWQgc2VwYXJhdGVseSAodXNlIHRoaXMgZm9yIHRlcm1zIHRoYXQgcmVxdWlyZSBtdWx0aXBsZSBwYXJhbXMpLlxuICogSWYgdGhlIHZhbHVlIGlzIGEgRGF0ZSwgaXQgaXMgY29udmVydGVkIHRvIHRoZSBmb3JtIG9mIFwiMDEtSmFuLTE5NzBcIi5cbiAqIFN1YnF1ZXJpZXMgKE9SLCBOT1QpIGFyZSBtYWRlIHVwIG9mIG9iamVjdHNcbiAqXG4gKiAgICB7dW5zZWVuOiB0cnVlLCBoZWFkZXI6IFtcInN1YmplY3RcIiwgXCJoZWxsbyB3b3JsZFwiXX07XG4gKiAgICBTRUFSQ0ggVU5TRUVOIEhFQURFUiBcInN1YmplY3RcIiBcImhlbGxvIHdvcmxkXCJcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcXVlcnkgU2VhcmNoIHF1ZXJ5XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIE9wdGlvbiBvYmplY3RcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYnlVaWRdIElmIHR1cmUsIHVzZSBVSUQgU0VBUkNIIGluc3RlYWQgb2YgU0VBUkNIXG4gKiBAcmV0dXJuIHtPYmplY3R9IElNQVAgY29tbWFuZCBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU0VBUkNIQ29tbWFuZCAocXVlcnkgPSB7fSwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IGNvbW1hbmQgPSB7XG4gICAgY29tbWFuZDogb3B0aW9ucy5ieVVpZCA/ICdVSUQgU0VBUkNIJyA6ICdTRUFSQ0gnXG4gIH1cblxuICBsZXQgaXNBc2NpaSA9IHRydWVcblxuICBjb25zdCBidWlsZFRlcm0gPSAocXVlcnkpID0+IHtcbiAgICBsZXQgbGlzdCA9IFtdXG5cbiAgICBPYmplY3Qua2V5cyhxdWVyeSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBsZXQgcGFyYW1zID0gW11cbiAgICAgIGNvbnN0IGZvcm1hdERhdGUgPSAoZGF0ZSkgPT4gZGF0ZS50b1VUQ1N0cmluZygpLnJlcGxhY2UoL15cXHcrLCAwPyhcXGQrKSAoXFx3KykgKFxcZCspLiovLCAnJDEtJDItJDMnKVxuICAgICAgY29uc3QgZXNjYXBlUGFyYW0gPSAocGFyYW0pID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgICAgICB2YWx1ZTogcGFyYW1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGlmICgvW1xcdTAwODAtXFx1RkZGRl0vLnRlc3QocGFyYW0pKSB7XG4gICAgICAgICAgICBpc0FzY2lpID0gZmFsc2VcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdsaXRlcmFsJyxcbiAgICAgICAgICAgICAgdmFsdWU6IGZyb21UeXBlZEFycmF5KGVuY29kZShwYXJhbSkpIC8vIGNhc3QgdW5pY29kZSBzdHJpbmcgdG8gcHNldWRvLWJpbmFyeSBhcyBpbWFwLWhhbmRsZXIgY29tcGlsZXMgc3RyaW5ncyBhcyBvY3RldHNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgdmFsdWU6IHBhcmFtXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChwYXJhbSkgPT09ICdbb2JqZWN0IERhdGVdJykge1xuICAgICAgICAgIC8vIFJGQyAzNTAxIGFsbG93cyBmb3IgZGF0ZXMgdG8gYmUgcGxhY2VkIGluXG4gICAgICAgICAgLy8gZG91YmxlLXF1b3RlcyBvciBsZWZ0IHdpdGhvdXQgcXVvdGVzLiAgU29tZVxuICAgICAgICAgIC8vIHNlcnZlcnMgKFlhbmRleCksIGRvIG5vdCBsaWtlIHRoZSBkb3VibGUgcXVvdGVzLFxuICAgICAgICAgIC8vIHNvIHdlIHRyZWF0IHRoZSBkYXRlIGFzIGFuIGF0b20uXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdhdG9tJyxcbiAgICAgICAgICAgIHZhbHVlOiBmb3JtYXREYXRlKHBhcmFtKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHBhcmFtKSkge1xuICAgICAgICAgIHJldHVybiBwYXJhbS5tYXAoZXNjYXBlUGFyYW0pXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHJldHVybiBidWlsZFRlcm0ocGFyYW0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcGFyYW1zLnB1c2goe1xuICAgICAgICB0eXBlOiAnYXRvbScsXG4gICAgICAgIHZhbHVlOiBrZXkudG9VcHBlckNhc2UoKVxuICAgICAgfSk7XG5cbiAgICAgIFtdLmNvbmNhdChxdWVyeVtrZXldIHx8IFtdKS5mb3JFYWNoKChwYXJhbSkgPT4ge1xuICAgICAgICBzd2l0Y2ggKGtleS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgY2FzZSAndWlkJzpcbiAgICAgICAgICAgIHBhcmFtID0ge1xuICAgICAgICAgICAgICB0eXBlOiAnc2VxdWVuY2UnLFxuICAgICAgICAgICAgICB2YWx1ZTogcGFyYW1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgLy8gVGhlIEdtYWlsIGV4dGVuc2lvbiB2YWx1ZXMgb2YgWC1HTS1USFJJRCBhbmRcbiAgICAgICAgICAvLyBYLUdNLU1TR0lEIGFyZSBkZWZpbmVkIHRvIGJlIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2Vyc1xuICAgICAgICAgIC8vIGFuZCB0aGV5IG11c3Qgbm90IGJlIHF1b3RlZCBzdHJpbmdzIG9yIHRoZSBzZXJ2ZXJcbiAgICAgICAgICAvLyB3aWxsIHJlcG9ydCBhIHBhcnNlIGVycm9yLlxuICAgICAgICAgIGNhc2UgJ3gtZ20tdGhyaWQnOlxuICAgICAgICAgIGNhc2UgJ3gtZ20tbXNnaWQnOlxuICAgICAgICAgICAgcGFyYW0gPSB7XG4gICAgICAgICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgICAgICAgICB2YWx1ZTogcGFyYW1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHBhcmFtID0gZXNjYXBlUGFyYW0ocGFyYW0pXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtKSB7XG4gICAgICAgICAgcGFyYW1zID0gcGFyYW1zLmNvbmNhdChwYXJhbSB8fCBbXSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIGxpc3QgPSBsaXN0LmNvbmNhdChwYXJhbXMgfHwgW10pXG4gICAgfSlcblxuICAgIHJldHVybiBsaXN0XG4gIH1cblxuICBjb21tYW5kLmF0dHJpYnV0ZXMgPSBidWlsZFRlcm0ocXVlcnkpXG5cbiAgLy8gSWYgYW55IHN0cmluZyBpbnB1dCBpcyB1c2luZyA4Yml0IGJ5dGVzLCBwcmVwZW5kIHRoZSBvcHRpb25hbCBDSEFSU0VUIGFyZ3VtZW50XG4gIGlmICghaXNBc2NpaSkge1xuICAgIGNvbW1hbmQuYXR0cmlidXRlcy51bnNoaWZ0KHtcbiAgICAgIHR5cGU6ICdhdG9tJyxcbiAgICAgIHZhbHVlOiAnVVRGLTgnXG4gICAgfSlcbiAgICBjb21tYW5kLmF0dHJpYnV0ZXMudW5zaGlmdCh7XG4gICAgICB0eXBlOiAnYXRvbScsXG4gICAgICB2YWx1ZTogJ0NIQVJTRVQnXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBjb21tYW5kXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBJTUFQIFNUT1JFIGNvbW1hbmQgZnJvbSB0aGUgc2VsZWN0ZWQgYXJndW1lbnRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFNUT1JFQ29tbWFuZCAoc2VxdWVuY2UsIGFjdGlvbiA9ICcnLCBmbGFncyA9IFtdLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgY29tbWFuZCA9IHtcbiAgICBjb21tYW5kOiBvcHRpb25zLmJ5VWlkID8gJ1VJRCBTVE9SRScgOiAnU1RPUkUnLFxuICAgIGF0dHJpYnV0ZXM6IFt7XG4gICAgICB0eXBlOiAnc2VxdWVuY2UnLFxuICAgICAgdmFsdWU6IHNlcXVlbmNlXG4gICAgfV1cbiAgfVxuXG4gIGNvbW1hbmQuYXR0cmlidXRlcy5wdXNoKHtcbiAgICB0eXBlOiAnYXRvbScsXG4gICAgdmFsdWU6IGFjdGlvbi50b1VwcGVyQ2FzZSgpICsgKG9wdGlvbnMuc2lsZW50ID8gJy5TSUxFTlQnIDogJycpXG4gIH0pXG5cbiAgY29tbWFuZC5hdHRyaWJ1dGVzLnB1c2goZmxhZ3MubWFwKChmbGFnKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdhdG9tJyxcbiAgICAgIHZhbHVlOiBmbGFnXG4gICAgfVxuICB9KSlcblxuICByZXR1cm4gY29tbWFuZFxufVxuIl19 \ No newline at end of file diff --git a/dist/command-parser.js b/dist/command-parser.js deleted file mode 100644 index ec36e1f8..00000000 --- a/dist/command-parser.js +++ /dev/null @@ -1,567 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.parseNAMESPACE = parseNAMESPACE; -exports.parseNAMESPACEElement = parseNAMESPACEElement; -exports.parseSELECT = parseSELECT; -exports.parseENVELOPE = parseENVELOPE; -exports.parseBODYSTRUCTURE = parseBODYSTRUCTURE; -exports.parseFETCH = parseFETCH; -exports.parseSEARCH = parseSEARCH; -exports.parseCOPY = parseCOPY; -exports.parseAPPEND = parseAPPEND; - -var _emailjsAddressparser = _interopRequireDefault(require("emailjs-addressparser")); - -var _emailjsImapHandler = require("emailjs-imap-handler"); - -var _ramda = require("ramda"); - -var _emailjsMimeCodec = require("emailjs-mime-codec"); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function parseNAMESPACE(response) { - if (!response.payload || !response.payload.NAMESPACE || !response.payload.NAMESPACE.length) { - return false; - } - - const attributes = [].concat(response.payload.NAMESPACE.pop().attributes || []); - - if (!attributes.length) { - return false; - } - - return { - personal: parseNAMESPACEElement(attributes[0]), - users: parseNAMESPACEElement(attributes[1]), - shared: parseNAMESPACEElement(attributes[2]) - }; -} -/** - * Parses a NAMESPACE element - * - * @param {Object} element - * @return {Object} Namespaces element object - */ - - -function parseNAMESPACEElement(element) { - if (!element) { - return false; - } - - element = [].concat(element || []); - return element.map(ns => { - if (!ns || !ns.length) { - return false; - } - - return { - prefix: ns[0].value, - delimiter: ns[1] && ns[1].value // The delimiter can legally be NIL which maps to null - - }; - }); -} -/** - * Parses SELECT response - * - * @param {Object} response - * @return {Object} Mailbox information object - */ - - -function parseSELECT(response) { - if (!response || !response.payload) { - return; - } - - const mailbox = { - readOnly: response.code === 'READ-ONLY' - }; - const existsResponse = response.payload.EXISTS && response.payload.EXISTS.pop(); - const flagsResponse = response.payload.FLAGS && response.payload.FLAGS.pop(); - const okResponse = response.payload.OK; - - if (existsResponse) { - mailbox.exists = existsResponse.nr || 0; - } - - if (flagsResponse && flagsResponse.attributes && flagsResponse.attributes.length) { - mailbox.flags = flagsResponse.attributes[0].map(flag => (flag.value || '').toString().trim()); - } - - [].concat(okResponse || []).forEach(ok => { - switch (ok && ok.code) { - case 'PERMANENTFLAGS': - mailbox.permanentFlags = [].concat(ok.permanentflags || []); - break; - - case 'UIDVALIDITY': - mailbox.uidValidity = Number(ok.uidvalidity) || 0; - break; - - case 'UIDNEXT': - mailbox.uidNext = Number(ok.uidnext) || 0; - break; - - case 'HIGHESTMODSEQ': - mailbox.highestModseq = ok.highestmodseq || '0'; // keep 64bit uint as a string - - break; - - case 'NOMODSEQ': - mailbox.noModseq = true; - break; - } - }); - return mailbox; -} -/** - * Parses message envelope from FETCH response. All keys in the resulting - * object are lowercase. Address fields are all arrays with {name:, address:} - * structured values. Unicode strings are automatically decoded. - * - * @param {Array} value Envelope array - * @param {Object} Envelope object - */ - - -function parseENVELOPE(value) { - const envelope = {}; - - if (value[0] && value[0].value) { - envelope.date = value[0].value; - } - - if (value[1] && value[1].value) { - envelope.subject = (0, _emailjsMimeCodec.mimeWordsDecode)(value[1] && value[1].value); - } - - if (value[2] && value[2].length) { - envelope.from = processAddresses(value[2]); - } - - if (value[3] && value[3].length) { - envelope.sender = processAddresses(value[3]); - } - - if (value[4] && value[4].length) { - envelope['reply-to'] = processAddresses(value[4]); - } - - if (value[5] && value[5].length) { - envelope.to = processAddresses(value[5]); - } - - if (value[6] && value[6].length) { - envelope.cc = processAddresses(value[6]); - } - - if (value[7] && value[7].length) { - envelope.bcc = processAddresses(value[7]); - } - - if (value[8] && value[8].value) { - envelope['in-reply-to'] = value[8].value; - } - - if (value[9] && value[9].value) { - envelope['message-id'] = value[9].value; - } - - return envelope; -} -/* - * ENVELOPE lists addresses as [name-part, source-route, username, hostname] - * where source-route is not used anymore and can be ignored. - * To get comparable results with other parts of the email.js stack - * browserbox feeds the parsed address values from ENVELOPE - * to addressparser and uses resulting values instead of the - * pre-parsed addresses - */ - - -function processAddresses(list = []) { - return list.map(addr => { - const name = (0, _ramda.pathOr)('', ['0', 'value'], addr).trim(); - const address = (0, _ramda.pathOr)('', ['2', 'value'], addr) + '@' + (0, _ramda.pathOr)('', ['3', 'value'], addr); - const formatted = name ? encodeAddressName(name) + ' <' + address + '>' : address; - const parsed = (0, _emailjsAddressparser.default)(formatted).shift(); // there should be just a single address - - parsed.name = (0, _emailjsMimeCodec.mimeWordsDecode)(parsed.name); - return parsed; - }); -} -/** - * If needed, encloses with quotes or mime encodes the name part of an e-mail address - * - * @param {String} name Name part of an address - * @returns {String} Mime word encoded or quoted string - */ - - -function encodeAddressName(name) { - if (!/^[\w ']*$/.test(name)) { - if (/^[\x20-\x7e]*$/.test(name)) { - return JSON.stringify(name); - } else { - return (0, _emailjsMimeCodec.mimeWordEncode)(name, 'Q', 52); - } - } - - return name; -} -/** - * Parses message body structure from FETCH response. - * - * @param {Array} value BODYSTRUCTURE array - * @param {Object} Envelope object - */ - - -function parseBODYSTRUCTURE(node, path = []) { - const curNode = {}; - let i = 0; - let part = 0; - - if (path.length) { - curNode.part = path.join('.'); - } // multipart - - - if (Array.isArray(node[0])) { - curNode.childNodes = []; - - while (Array.isArray(node[i])) { - curNode.childNodes.push(parseBODYSTRUCTURE(node[i], path.concat(++part))); - i++; - } // multipart type - - - curNode.type = 'multipart/' + ((node[i++] || {}).value || '').toString().toLowerCase(); // extension data (not available for BODY requests) - // body parameter parenthesized list - - if (i < node.length - 1) { - if (node[i]) { - curNode.parameters = attributesToObject(node[i]); - } - - i++; - } - } else { - // content type - curNode.type = [((node[i++] || {}).value || '').toString().toLowerCase(), ((node[i++] || {}).value || '').toString().toLowerCase()].join('/'); // body parameter parenthesized list - - if (node[i]) { - curNode.parameters = attributesToObject(node[i]); - } - - i++; // id - - if (node[i]) { - curNode.id = ((node[i] || {}).value || '').toString(); - } - - i++; // description - - if (node[i]) { - curNode.description = ((node[i] || {}).value || '').toString(); - } - - i++; // encoding - - if (node[i]) { - curNode.encoding = ((node[i] || {}).value || '').toString().toLowerCase(); - } - - i++; // size - - if (node[i]) { - curNode.size = Number((node[i] || {}).value || 0) || 0; - } - - i++; - - if (curNode.type === 'message/rfc822') { - // message/rfc adds additional envelope, bodystructure and line count values - // envelope - if (node[i]) { - curNode.envelope = parseENVELOPE([].concat(node[i] || [])); - } - - i++; - - if (node[i]) { - curNode.childNodes = [// rfc822 bodyparts share the same path, difference is between MIME and HEADER - // path.MIME returns message/rfc822 header - // path.HEADER returns inlined message header - parseBODYSTRUCTURE(node[i], path)]; - } - - i++; // line count - - if (node[i]) { - curNode.lineCount = Number((node[i] || {}).value || 0) || 0; - } - - i++; - } else if (/^text\//.test(curNode.type)) { - // text/* adds additional line count values - // line count - if (node[i]) { - curNode.lineCount = Number((node[i] || {}).value || 0) || 0; - } - - i++; - } // extension data (not available for BODY requests) - // md5 - - - if (i < node.length - 1) { - if (node[i]) { - curNode.md5 = ((node[i] || {}).value || '').toString().toLowerCase(); - } - - i++; - } - } // the following are shared extension values (for both multipart and non-multipart parts) - // not available for BODY requests - // body disposition - - - if (i < node.length - 1) { - if (Array.isArray(node[i]) && node[i].length) { - curNode.disposition = ((node[i][0] || {}).value || '').toString().toLowerCase(); - - if (Array.isArray(node[i][1])) { - curNode.dispositionParameters = attributesToObject(node[i][1]); - } - } - - i++; - } // body language - - - if (i < node.length - 1) { - if (node[i]) { - curNode.language = [].concat(node[i]).map(val => (0, _ramda.propOr)('', 'value', val).toLowerCase()); - } - - i++; - } // body location - // NB! defined as a "string list" in RFC3501 but replaced in errata document with "string" - // Errata: http://www.rfc-editor.org/errata_search.php?rfc=3501 - - - if (i < node.length - 1) { - if (node[i]) { - curNode.location = ((node[i] || {}).value || '').toString(); - } - - i++; - } - - return curNode; -} - -function attributesToObject(attrs = [], keyTransform = _ramda.toLower, valueTransform = _emailjsMimeCodec.mimeWordsDecode) { - const vals = attrs.map((0, _ramda.prop)('value')); - const keys = vals.filter((_, i) => i % 2 === 0).map(keyTransform); - const values = vals.filter((_, i) => i % 2 === 1).map(valueTransform); - return (0, _ramda.fromPairs)((0, _ramda.zip)(keys, values)); -} -/** - * Parses FETCH response - * - * @param {Object} response - * @return {Object} Message object - */ - - -function parseFETCH(response) { - if (!response || !response.payload || !response.payload.FETCH || !response.payload.FETCH.length) { - return []; - } - - const list = []; - const messages = {}; - response.payload.FETCH.forEach(item => { - const params = [].concat([].concat(item.attributes || [])[0] || []); // ensure the first value is an array - - let message; - let i, len, key; - - if (messages[item.nr]) { - // same sequence number is already used, so merge values instead of creating a new message object - message = messages[item.nr]; - } else { - messages[item.nr] = message = { - '#': item.nr - }; - list.push(message); - } - - for (i = 0, len = params.length; i < len; i++) { - if (i % 2 === 0) { - key = (0, _emailjsImapHandler.compiler)({ - attributes: [params[i]] - }).toLowerCase().replace(/<\d+>$/, ''); - continue; - } - - message[key] = parseFetchValue(key, params[i]); - } - }); - return list; -} -/** - * Parses a single value from the FETCH response object - * - * @param {String} key Key name (uppercase) - * @param {Mized} value Value for the key - * @return {Mixed} Processed value - */ - - -function parseFetchValue(key, value) { - if (!value) { - return null; - } - - if (!Array.isArray(value)) { - switch (key) { - case 'uid': - case 'rfc822.size': - return Number(value.value) || 0; - - case 'modseq': - // do not cast 64 bit uint to a number - return value.value || '0'; - } - - return value.value; - } - - switch (key) { - case 'flags': - case 'x-gm-labels': - value = [].concat(value).map(flag => flag.value || ''); - break; - - case 'envelope': - value = parseENVELOPE([].concat(value || [])); - break; - - case 'bodystructure': - value = parseBODYSTRUCTURE([].concat(value || [])); - break; - - case 'modseq': - value = (value.shift() || {}).value || '0'; - break; - } - - return value; -} -/** - * Binary Search - from npm module binary-search, license CC0 - * - * @param {Array} haystack Ordered array - * @param {any} needle Item to search for in haystack - * @param {Function} comparator Function that defines the sort order - * @return {Number} Index of needle in haystack or if not found, - * -Index-1 is the position where needle could be inserted while still - * keeping haystack ordered. - */ - - -function binSearch(haystack, needle, comparator = (a, b) => a - b) { - var mid, cmp; - var low = 0; - var high = haystack.length - 1; - - while (low <= high) { - // Note that "(low + high) >>> 1" may overflow, and results in - // a typecast to double (which gives the wrong results). - mid = low + (high - low >> 1); - cmp = +comparator(haystack[mid], needle); - - if (cmp < 0.0) { - // too low - low = mid + 1; - } else if (cmp > 0.0) { - // too high - high = mid - 1; - } else { - // key found - return mid; - } - } // key not found - - - return ~low; -} - -; -/** - * Parses SEARCH response. Gathers all untagged SEARCH responses, fetched seq./uid numbers - * and compiles these into a sorted array. - * - * @param {Object} response - * @return {Object} Message object - * @param {Array} Sorted Seq./UID number list - */ - -function parseSEARCH(response) { - const list = []; - - if (!response || !response.payload || !response.payload.SEARCH || !response.payload.SEARCH.length) { - return list; - } - - response.payload.SEARCH.forEach(result => (result.attributes || []).forEach(nr => { - nr = Number(nr && nr.value || nr) || 0; - const idx = binSearch(list, nr); - - if (idx < 0) { - list.splice(-idx - 1, 0, nr); - } - })); - return list; -} - -; -/** - * Parses COPY and UID COPY response. - * https://tools.ietf.org/html/rfc4315 - * @param {Object} response - * @returns {{destSeqSet: string, srcSeqSet: string}} Source and - * destination uid sets if available, undefined if not. - */ - -function parseCOPY(response) { - const copyuid = response && response.copyuid; - - if (copyuid) { - return { - srcSeqSet: copyuid[1], - destSeqSet: copyuid[2] - }; - } -} -/** - * Parses APPEND (upload) response. - * https://tools.ietf.org/html/rfc4315 - * @param {Object} response - * @returns {String} The uid assigned to the uploaded message if available. - */ - - -function parseAPPEND(response) { - return response && response.appenduid && response.appenduid[1]; -} -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21tYW5kLXBhcnNlci5qcyJdLCJuYW1lcyI6WyJwYXJzZU5BTUVTUEFDRSIsInJlc3BvbnNlIiwicGF5bG9hZCIsIk5BTUVTUEFDRSIsImxlbmd0aCIsImF0dHJpYnV0ZXMiLCJjb25jYXQiLCJwb3AiLCJwZXJzb25hbCIsInBhcnNlTkFNRVNQQUNFRWxlbWVudCIsInVzZXJzIiwic2hhcmVkIiwiZWxlbWVudCIsIm1hcCIsIm5zIiwicHJlZml4IiwidmFsdWUiLCJkZWxpbWl0ZXIiLCJwYXJzZVNFTEVDVCIsIm1haWxib3giLCJyZWFkT25seSIsImNvZGUiLCJleGlzdHNSZXNwb25zZSIsIkVYSVNUUyIsImZsYWdzUmVzcG9uc2UiLCJGTEFHUyIsIm9rUmVzcG9uc2UiLCJPSyIsImV4aXN0cyIsIm5yIiwiZmxhZ3MiLCJmbGFnIiwidG9TdHJpbmciLCJ0cmltIiwiZm9yRWFjaCIsIm9rIiwicGVybWFuZW50RmxhZ3MiLCJwZXJtYW5lbnRmbGFncyIsInVpZFZhbGlkaXR5IiwiTnVtYmVyIiwidWlkdmFsaWRpdHkiLCJ1aWROZXh0IiwidWlkbmV4dCIsImhpZ2hlc3RNb2RzZXEiLCJoaWdoZXN0bW9kc2VxIiwibm9Nb2RzZXEiLCJwYXJzZUVOVkVMT1BFIiwiZW52ZWxvcGUiLCJkYXRlIiwic3ViamVjdCIsImZyb20iLCJwcm9jZXNzQWRkcmVzc2VzIiwic2VuZGVyIiwidG8iLCJjYyIsImJjYyIsImxpc3QiLCJhZGRyIiwibmFtZSIsImFkZHJlc3MiLCJmb3JtYXR0ZWQiLCJlbmNvZGVBZGRyZXNzTmFtZSIsInBhcnNlZCIsInNoaWZ0IiwidGVzdCIsIkpTT04iLCJzdHJpbmdpZnkiLCJwYXJzZUJPRFlTVFJVQ1RVUkUiLCJub2RlIiwicGF0aCIsImN1ck5vZGUiLCJpIiwicGFydCIsImpvaW4iLCJBcnJheSIsImlzQXJyYXkiLCJjaGlsZE5vZGVzIiwicHVzaCIsInR5cGUiLCJ0b0xvd2VyQ2FzZSIsInBhcmFtZXRlcnMiLCJhdHRyaWJ1dGVzVG9PYmplY3QiLCJpZCIsImRlc2NyaXB0aW9uIiwiZW5jb2RpbmciLCJzaXplIiwibGluZUNvdW50IiwibWQ1IiwiZGlzcG9zaXRpb24iLCJkaXNwb3NpdGlvblBhcmFtZXRlcnMiLCJsYW5ndWFnZSIsInZhbCIsImxvY2F0aW9uIiwiYXR0cnMiLCJrZXlUcmFuc2Zvcm0iLCJ0b0xvd2VyIiwidmFsdWVUcmFuc2Zvcm0iLCJtaW1lV29yZHNEZWNvZGUiLCJ2YWxzIiwia2V5cyIsImZpbHRlciIsIl8iLCJ2YWx1ZXMiLCJwYXJzZUZFVENIIiwiRkVUQ0giLCJtZXNzYWdlcyIsIml0ZW0iLCJwYXJhbXMiLCJtZXNzYWdlIiwibGVuIiwia2V5IiwicmVwbGFjZSIsInBhcnNlRmV0Y2hWYWx1ZSIsImJpblNlYXJjaCIsImhheXN0YWNrIiwibmVlZGxlIiwiY29tcGFyYXRvciIsImEiLCJiIiwibWlkIiwiY21wIiwibG93IiwiaGlnaCIsInBhcnNlU0VBUkNIIiwiU0VBUkNIIiwicmVzdWx0IiwiaWR4Iiwic3BsaWNlIiwicGFyc2VDT1BZIiwiY29weXVpZCIsInNyY1NlcVNldCIsImRlc3RTZXFTZXQiLCJwYXJzZUFQUEVORCIsImFwcGVuZHVpZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFRTyxTQUFTQSxjQUFULENBQXlCQyxRQUF6QixFQUFtQztBQUN4QyxNQUFJLENBQUNBLFFBQVEsQ0FBQ0MsT0FBVixJQUFxQixDQUFDRCxRQUFRLENBQUNDLE9BQVQsQ0FBaUJDLFNBQXZDLElBQW9ELENBQUNGLFFBQVEsQ0FBQ0MsT0FBVCxDQUFpQkMsU0FBakIsQ0FBMkJDLE1BQXBGLEVBQTRGO0FBQzFGLFdBQU8sS0FBUDtBQUNEOztBQUVELFFBQU1DLFVBQVUsR0FBRyxHQUFHQyxNQUFILENBQVVMLFFBQVEsQ0FBQ0MsT0FBVCxDQUFpQkMsU0FBakIsQ0FBMkJJLEdBQTNCLEdBQWlDRixVQUFqQyxJQUErQyxFQUF6RCxDQUFuQjs7QUFDQSxNQUFJ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RSxNQUFBQSxVQUFVLEVBQUVGLE9BQU8sQ0FBQyxDQUFEO0FBRmQsS0FBUDtBQUlEO0FBQ0Y7QUFFRDs7Ozs7Ozs7QUFNTyxTQUFTRyxXQUFULENBQXNCbkksUUFBdEIsRUFBZ0M7QUFDckMsU0FBT0EsUUFBUSxJQUFJQSxRQUFRLENBQUNvSSxTQUFyQixJQUFrQ3BJLFFBQVEsQ0FBQ29JLFNBQVQsQ0FBbUIsQ0FBbkIsQ0FBekM7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXJzZUFkZHJlc3MgZnJvbSAnZW1haWxqcy1hZGRyZXNzcGFyc2VyJ1xuaW1wb3J0IHsgY29tcGlsZXIgfSBmcm9tICdlbWFpbGpzLWltYXAtaGFuZGxlcidcbmltcG9ydCB7IHppcCwgZnJvbVBhaXJzLCBwcm9wLCBwYXRoT3IsIHByb3BPciwgdG9Mb3dlciB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHsgbWltZVdvcmRFbmNvZGUsIG1pbWVXb3Jkc0RlY29kZSB9IGZyb20gJ2VtYWlsanMtbWltZS1jb2RlYydcblxuLyoqXG4gKiBQYXJzZXMgTkFNRVNQQUNFIHJlc3BvbnNlXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHJlc3BvbnNlXG4gKiBAcmV0dXJuIHtPYmplY3R9IE5hbWVzcGFjZXMgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU5BTUVTUEFDRSAocmVzcG9uc2UpIHtcbiAgaWYgKCFyZXNwb25zZS5wYXlsb2FkIHx8ICFyZXNwb25zZS5wYXlsb2FkLk5BTUVTUEFDRSB8fCAhcmVzcG9uc2UucGF5bG9hZC5OQU1FU1BBQ0UubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBjb25zdCBhdHRyaWJ1dGVzID0gW10uY29uY2F0KHJlc3BvbnNlLnBheWxvYWQuTkFNRVNQQUNFLnBvcCgpLmF0dHJpYnV0ZXMgfHwgW10pXG4gIGlmICghYXR0cmlidXRlcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGVyc29uYWw6IHBhcnNlTkFNRVNQQUNFRWxlbWVudChhdHRyaWJ1dGVzWzBdKSxcbiAgICB1c2VyczogcGFyc2VOQU1FU1BBQ0VFbGVtZW50KGF0dHJpYnV0ZXNbMV0pLFxuICAgIHNoYXJlZDogcGFyc2VOQU1FU1BBQ0VFbGVtZW50KGF0dHJpYnV0ZXNbMl0pXG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZXMgYSBOQU1FU1BBQ0UgZWxlbWVudFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtZW50XG4gKiBAcmV0dXJuIHtPYmplY3R9IE5hbWVzcGFjZXMgZWxlbWVudCBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTkFNRVNQQUNFRWxlbWVudCAoZWxlbWVudCkge1xuICBpZiAoIWVsZW1lbnQpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGVsZW1lbnQgPSBbXS5jb25jYXQoZWxlbWVudCB8fCBbXSlcbiAgcmV0dXJuIGVsZW1lbnQubWFwKChucykgPT4ge1xuICAgIGlmICghbnMgfHwgIW5zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHByZWZpeDogbnNbMF0udmFsdWUsXG4gICAgICBkZWxpbWl0ZXI6IG5zWzFdICYmIG5zWzFdLnZhbHVlIC8vIFRoZSBkZWxpbWl0ZXIgY2FuIGxlZ2FsbHkgYmUgTklMIHdoaWNoIG1hcHMgdG8gbnVsbFxuICAgIH1cbiAgfSlcbn1cblxuLyoqXG4gKiBQYXJzZXMgU0VMRUNUIHJlc3BvbnNlXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHJlc3BvbnNlXG4gKiBAcmV0dXJuIHtPYmplY3R9IE1haWxib3ggaW5mb3JtYXRpb24gb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNFTEVDVCAocmVzcG9uc2UpIHtcbiAgaWYgKCFyZXNwb25zZSB8fCAhcmVzcG9uc2UucGF5bG9hZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgbWFpbGJveCA9IHtcbiAgICByZWFkT25seTogcmVzcG9uc2UuY29kZSA9PT0gJ1JFQUQtT05MWSdcbiAgfVxuICBjb25zdCBleGlzdHNSZXNwb25zZSA9IHJlc3BvbnNlLnBheWxvYWQuRVhJU1RTICYmIHJlc3BvbnNlLnBheWxvYWQuRVhJU1RTLnBvcCgpXG4gIGNvbnN0IGZsYWdzUmVzcG9uc2UgPSByZXNwb25zZS5wYXlsb2FkLkZMQUdTICYmIHJlc3BvbnNlLnBheWxvYWQuRkxBR1MucG9wKClcbiAgY29uc3Qgb2tSZXNwb25zZSA9IHJlc3BvbnNlLnBheWxvYWQuT0tcblxuICBpZiAoZXhpc3RzUmVzcG9uc2UpIHtcbiAgICBtYWlsYm94LmV4aXN0cyA9IGV4aXN0c1Jlc3BvbnNlLm5yIHx8IDBcbiAgfVxuXG4gIGlmIChmbGFnc1Jlc3BvbnNlICYmIGZsYWdzUmVzcG9uc2UuYXR0cmlidXRlcyAmJiBmbGFnc1Jlc3BvbnNlLmF0dHJpYnV0ZXMubGVuZ3RoKSB7XG4gICAgbWFpbGJveC5mbGFncyA9IGZsYWdzUmVzcG9uc2UuYXR0cmlidXRlc1swXS5tYXAoKGZsYWcpID0+IChmbGFnLnZhbHVlIHx8ICcnKS50b1N0cmluZygpLnRyaW0oKSlcbiAgfVxuXG4gIFtdLmNvbmNhdChva1Jlc3BvbnNlIHx8IFtdKS5mb3JFYWNoKChvaykgPT4ge1xuICAgIHN3aXRjaCAob2sgJiYgb2suY29kZSkge1xuICAgICAgY2FzZSAnUEVSTUFORU5URkxBR1MnOlxuICAgICAgICBtYWlsYm94LnBlcm1hbmVudEZsYWdzID0gW10uY29uY2F0KG9rLnBlcm1hbmVudGZsYWdzIHx8IFtdKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnVUlEVkFMSURJVFknOlxuICAgICAgICBtYWlsYm94LnVpZFZhbGlkaXR5ID0gTnVtYmVyKG9rLnVpZHZhbGlkaXR5KSB8fCAwXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdVSURORVhUJzpcbiAgICAgICAgbWFpbGJveC51aWROZXh0ID0gTnVtYmVyKG9rLnVpZG5leHQpIHx8IDBcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ0hJR0hFU1RNT0RTRVEnOlxuICAgICAgICBtYWlsYm94LmhpZ2hlc3RNb2RzZXEgPSBvay5oaWdoZXN0bW9kc2VxIHx8ICcwJyAvLyBrZWVwIDY0Yml0IHVpbnQgYXMgYSBzdHJpbmdcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ05PTU9EU0VRJzpcbiAgICAgICAgbWFpbGJveC5ub01vZHNlcSA9IHRydWVcbiAgICAgICAgYnJlYWtcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIG1haWxib3hcbn1cblxuLyoqXG4gKiBQYXJzZXMgbWVzc2FnZSBlbnZlbG9wZSBmcm9tIEZFVENIIHJlc3BvbnNlLiBBbGwga2V5cyBpbiB0aGUgcmVzdWx0aW5nXG4gKiBvYmplY3QgYXJlIGxvd2VyY2FzZS4gQWRkcmVzcyBmaWVsZHMgYXJlIGFsbCBhcnJheXMgd2l0aCB7bmFtZTosIGFkZHJlc3M6fVxuICogc3RydWN0dXJlZCB2YWx1ZXMuIFVuaWNvZGUgc3RyaW5ncyBhcmUgYXV0b21hdGljYWxseSBkZWNvZGVkLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlIEVudmVsb3BlIGFycmF5XG4gKiBAcGFyYW0ge09iamVjdH0gRW52ZWxvcGUgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUVOVkVMT1BFICh2YWx1ZSkge1xuICBjb25zdCBlbnZlbG9wZSA9IHt9XG5cbiAgaWYgKHZhbHVlWzBdICYmIHZhbHVlWzBdLnZhbHVlKSB7XG4gICAgZW52ZWxvcGUuZGF0ZSA9IHZhbHVlWzBdLnZhbHVlXG4gIH1cblxuICBpZiAodmFsdWVbMV0gJiYgdmFsdWVbMV0udmFsdWUpIHtcbiAgICBlbnZlbG9wZS5zdWJqZWN0ID0gbWltZVdvcmRzRGVjb2RlKHZhbHVlWzFdICYmIHZhbHVlWzFdLnZhbHVlKVxuICB9XG5cbiAgaWYgKHZhbHVlWzJdICYmIHZhbHVlWzJdLmxlbmd0aCkge1xuICAgIGVudmVsb3BlLmZyb20gPSBwcm9jZXNzQWRkcmVzc2VzKHZhbHVlWzJdKVxuICB9XG5cbiAgaWYgKHZhbHVlWzNdICYmIHZhbHVlWzNdLmxlbmd0aCkge1xuICAgIGVudmVsb3BlLnNlbmRlciA9IHByb2Nlc3NBZGRyZXNzZXModmFsdWVbM10pXG4gIH1cblxuICBpZiAodmFsdWVbNF0gJiYgdmFsdWVbNF0ubGVuZ3RoKSB7XG4gICAgZW52ZWxvcGVbJ3JlcGx5LXRvJ10gPSBwcm9jZXNzQWRkcmVzc2VzKHZhbHVlWzRdKVxuICB9XG5cbiAgaWYgKHZhbHVlWzVdICYmIHZhbHVlWzVdLmxlbmd0aCkge1xuICAgIGVudmVsb3BlLnRvID0gcHJvY2Vzc0FkZHJlc3Nlcyh2YWx1ZVs1XSlcbiAgfVxuXG4gIGlmICh2YWx1ZVs2XSAmJiB2YWx1ZVs2XS5sZW5ndGgpIHtcbiAgICBlbnZlbG9wZS5jYyA9IHByb2Nlc3NBZGRyZXNzZXModmFsdWVbNl0pXG4gIH1cblxuICBpZiAodmFsdWVbN10gJiYgdmFsdWVbN10ubGVuZ3RoKSB7XG4gICAgZW52ZWxvcGUuYmNjID0gcHJvY2Vzc0FkZHJlc3Nlcyh2YWx1ZVs3XSlcbiAgfVxuXG4gIGlmICh2YWx1ZVs4XSAmJiB2YWx1ZVs4XS52YWx1ZSkge1xuICAgIGVudmVsb3BlWydpbi1yZXBseS10byddID0gdmFsdWVbOF0udmFsdWVcbiAgfVxuXG4gIGlmICh2YWx1ZVs5XSAmJiB2YWx1ZVs5XS52YWx1ZSkge1xuICAgIGVudmVsb3BlWydtZXNzYWdlLWlkJ10gPSB2YWx1ZVs5XS52YWx1ZVxuICB9XG5cbiAgcmV0dXJuIGVudmVsb3BlXG59XG5cbi8qXG4gKiBFTlZFTE9QRSBsaXN0cyBhZGRyZXNzZXMgYXMgW25hbWUtcGFydCwgc291cmNlLXJvdXRlLCB1c2VybmFtZSwgaG9zdG5hbWVdXG4gKiB3aGVyZSBzb3VyY2Utcm91dGUgaXMgbm90IHVzZWQgYW55bW9yZSBhbmQgY2FuIGJlIGlnbm9yZWQuXG4gKiBUbyBnZXQgY29tcGFyYWJsZSByZXN1bHRzIHdpdGggb3RoZXIgcGFydHMgb2YgdGhlIGVtYWlsLmpzIHN0YWNrXG4gKiBicm93c2VyYm94IGZlZWRzIHRoZSBwYXJzZWQgYWRkcmVzcyB2YWx1ZXMgZnJvbSBFTlZFTE9QRVxuICogdG8gYWRkcmVzc3BhcnNlciBhbmQgdXNlcyByZXN1bHRpbmcgdmFsdWVzIGluc3RlYWQgb2YgdGhlXG4gKiBwcmUtcGFyc2VkIGFkZHJlc3Nlc1xuICovXG5mdW5jdGlvbiBwcm9jZXNzQWRkcmVzc2VzIChsaXN0ID0gW10pIHtcbiAgcmV0dXJuIGxpc3QubWFwKChhZGRyKSA9PiB7XG4gICAgY29uc3QgbmFtZSA9IChwYXRoT3IoJycsIFsnMCcsICd2YWx1ZSddLCBhZGRyKSkudHJpbSgpXG4gICAgY29uc3QgYWRkcmVzcyA9IChwYXRoT3IoJycsIFsnMicsICd2YWx1ZSddLCBhZGRyKSkgKyAnQCcgKyAocGF0aE9yKCcnLCBbJzMnLCAndmFsdWUnXSwgYWRkcikpXG4gICAgY29uc3QgZm9ybWF0dGVkID0gbmFtZSA/IChlbmNvZGVBZGRyZXNzTmFtZShuYW1lKSArICcgPCcgKyBhZGRyZXNzICsgJz4nKSA6IGFkZHJlc3NcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUFkZHJlc3MoZm9ybWF0dGVkKS5zaGlmdCgpIC8vIHRoZXJlIHNob3VsZCBiZSBqdXN0IGEgc2luZ2xlIGFkZHJlc3NcbiAgICBwYXJzZWQubmFtZSA9IG1pbWVXb3Jkc0RlY29kZShwYXJzZWQubmFtZSlcbiAgICByZXR1cm4gcGFyc2VkXG4gIH0pXG59XG5cbi8qKlxuICogSWYgbmVlZGVkLCBlbmNsb3NlcyB3aXRoIHF1b3RlcyBvciBtaW1lIGVuY29kZXMgdGhlIG5hbWUgcGFydCBvZiBhbiBlLW1haWwgYWRkcmVzc1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIE5hbWUgcGFydCBvZiBhbiBhZGRyZXNzXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBNaW1lIHdvcmQgZW5jb2RlZCBvciBxdW90ZWQgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGVuY29kZUFkZHJlc3NOYW1lIChuYW1lKSB7XG4gIGlmICghL15bXFx3ICddKiQvLnRlc3QobmFtZSkpIHtcbiAgICBpZiAoL15bXFx4MjAtXFx4N2VdKiQvLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShuYW1lKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbWltZVdvcmRFbmNvZGUobmFtZSwgJ1EnLCA1MilcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5hbWVcbn1cblxuLyoqXG4gKiBQYXJzZXMgbWVzc2FnZSBib2R5IHN0cnVjdHVyZSBmcm9tIEZFVENIIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlIEJPRFlTVFJVQ1RVUkUgYXJyYXlcbiAqIEBwYXJhbSB7T2JqZWN0fSBFbnZlbG9wZSBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQk9EWVNUUlVDVFVSRSAobm9kZSwgcGF0aCA9IFtdKSB7XG4gIGNvbnN0IGN1ck5vZGUgPSB7fVxuICBsZXQgaSA9IDBcbiAgbGV0IHBhcnQgPSAwXG5cbiAgaWYgKHBhdGgubGVuZ3RoKSB7XG4gICAgY3VyTm9kZS5wYXJ0ID0gcGF0aC5qb2luKCcuJylcbiAgfVxuXG4gIC8vIG11bHRpcGFydFxuICBpZiAoQXJyYXkuaXNBcnJheShub2RlWzBdKSkge1xuICAgIGN1ck5vZGUuY2hpbGROb2RlcyA9IFtdXG4gICAgd2hpbGUgKEFycmF5LmlzQXJyYXkobm9kZVtpXSkpIHtcbiAgICAgIGN1ck5vZGUuY2hpbGROb2Rlcy5wdXNoKHBhcnNlQk9EWVNUUlVDVFVSRShub2RlW2ldLCBwYXRoLmNvbmNhdCgrK3BhcnQpKSlcbiAgICAgIGkrK1xuICAgIH1cblxuICAgIC8vIG11bHRpcGFydCB0eXBlXG4gICAgY3VyTm9kZS50eXBlID0gJ211bHRpcGFydC8nICsgKChub2RlW2krK10gfHwge30pLnZhbHVlIHx8ICcnKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKClcblxuICAgIC8vIGV4dGVuc2lvbiBkYXRhIChub3QgYXZhaWxhYmxlIGZvciBCT0RZIHJlcXVlc3RzKVxuXG4gICAgLy8gYm9keSBwYXJhbWV0ZXIgcGFyZW50aGVzaXplZCBsaXN0XG4gICAgaWYgKGkgPCBub2RlLmxlbmd0aCAtIDEpIHtcbiAgICAgIGlmIChub2RlW2ldKSB7XG4gICAgICAgIGN1ck5vZGUucGFyYW1ldGVycyA9IGF0dHJpYnV0ZXNUb09iamVjdChub2RlW2ldKVxuICAgICAgfVxuICAgICAgaSsrXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIGNvbnRlbnQgdHlwZVxuICAgIGN1ck5vZGUudHlwZSA9IFtcbiAgICAgICgobm9kZVtpKytdIHx8IHt9KS52YWx1ZSB8fCAnJykudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLCAoKG5vZGVbaSsrXSB8fCB7fSkudmFsdWUgfHwgJycpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKVxuICAgIF0uam9pbignLycpXG5cbiAgICAvLyBib2R5IHBhcmFtZXRlciBwYXJlbnRoZXNpemVkIGxpc3RcbiAgICBpZiAobm9kZVtpXSkge1xuICAgICAgY3VyTm9kZS5wYXJhbWV0ZXJzID0gYXR0cmlidXRlc1RvT2JqZWN0KG5vZGVbaV0pXG4gICAgfVxuICAgIGkrK1xuXG4gICAgLy8gaWRcbiAgICBpZiAobm9kZVtpXSkge1xuICAgICAgY3VyTm9kZS5pZCA9ICgobm9kZVtpXSB8fCB7fSkudmFsdWUgfHwgJycpLnRvU3RyaW5nKClcbiAgICB9XG4gICAgaSsrXG5cbiAgICAvLyBkZXNjcmlwdGlvblxuICAgIGlmIChub2RlW2ldKSB7XG4gICAgICBjdXJOb2RlLmRlc2NyaXB0aW9uID0gKChub2RlW2ldIHx8IHt9KS52YWx1ZSB8fCAnJykudG9TdHJpbmcoKVxuICAgIH1cbiAgICBpKytcblxuICAgIC8vIGVuY29kaW5nXG4gICAgaWYgKG5vZGVbaV0pIHtcbiAgICAgIGN1ck5vZGUuZW5jb2RpbmcgPSAoKG5vZGVbaV0gfHwge30pLnZhbHVlIHx8ICcnKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKClcbiAgICB9XG4gICAgaSsrXG5cbiAgICAvLyBzaXplXG4gICAgaWYgKG5vZGVbaV0pIHtcbiAgICAgIGN1ck5vZGUuc2l6ZSA9IE51bWJlcigobm9kZVtpXSB8fCB7fSkudmFsdWUgfHwgMCkgfHwgMFxuICAgIH1cbiAgICBpKytcblxuICAgIGlmIChjdXJOb2RlLnR5cGUgPT09ICdtZXNzYWdlL3JmYzgyMicpIHtcbiAgICAgIC8vIG1lc3NhZ2UvcmZjIGFkZHMgYWRkaXRpb25hbCBlbnZlbG9wZSwgYm9keXN0cnVjdHVyZSBhbmQgbGluZSBjb3VudCB2YWx1ZXNcblxuICAgICAgLy8gZW52ZWxvcGVcbiAgICAgIGlmIChub2RlW2ldKSB7XG4gICAgICAgIGN1ck5vZGUuZW52ZWxvcGUgPSBwYXJzZUVOVkVMT1BFKFtdLmNvbmNhdChub2RlW2ldIHx8IFtdKSlcbiAgICAgIH1cbiAgICAgIGkrK1xuXG4gICAgICBpZiAobm9kZVtpXSkge1xuICAgICAgICBjdXJOb2RlLmNoaWxkTm9kZXMgPSBbXG4gICAgICAgICAgLy8gcmZjODIyIGJvZHlwYXJ0cyBzaGFyZSB0aGUgc2FtZSBwYXRoLCBkaWZmZXJlbmNlIGlzIGJldHdlZW4gTUlNRSBhbmQgSEVBREVSXG4gICAgICAgICAgLy8gcGF0aC5NSU1FIHJldHVybnMgbWVzc2FnZS9yZmM4MjIgaGVhZGVyXG4gICAgICAgICAgLy8gcGF0aC5IRUFERVIgcmV0dXJucyBpbmxpbmVkIG1lc3NhZ2UgaGVhZGVyXG4gICAgICAgICAgcGFyc2VCT0RZU1RSVUNUVVJFKG5vZGVbaV0sIHBhdGgpXG4gICAgICAgIF1cbiAgICAgIH1cbiAgICAgIGkrK1xuXG4gICAgICAvLyBsaW5lIGNvdW50XG4gICAgICBpZiAobm9kZVtpXSkge1xuICAgICAgICBjdXJOb2RlLmxpbmVDb3VudCA9IE51bWJlcigobm9kZVtpXSB8fCB7fSkudmFsdWUgfHwgMCkgfHwgMFxuICAgICAgfVxuICAgICAgaSsrXG4gICAgfSBlbHNlIGlmICgvXnRleHRcXC8vLnRlc3QoY3VyTm9kZS50eXBlKSkge1xuICAgICAgLy8gdGV4dC8qIGFkZHMgYWRkaXRpb25hbCBsaW5lIGNvdW50IHZhbHVlc1xuXG4gICAgICAvLyBsaW5lIGNvdW50XG4gICAgICBpZiAobm9kZVtpXSkge1xuICAgICAgICBjdXJOb2RlLmxpbmVDb3VudCA9IE51bWJlcigobm9kZVtpXSB8fCB7fSkudmFsdWUgfHwgMCkgfHwgMFxuICAgICAgfVxuICAgICAgaSsrXG4gICAgfVxuXG4gICAgLy8gZXh0ZW5zaW9uIGRhdGEgKG5vdCBhdmFpbGFibGUgZm9yIEJPRFkgcmVxdWVzdHMpXG5cbiAgICAvLyBtZDVcbiAgICBpZiAoaSA8IG5vZGUubGVuZ3RoIC0gMSkge1xuICAgICAgaWYgKG5vZGVbaV0pIHtcbiAgICAgICAgY3VyTm9kZS5tZDUgPSAoKG5vZGVbaV0gfHwge30pLnZhbHVlIHx8ICcnKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKClcbiAgICAgIH1cbiAgICAgIGkrK1xuICAgIH1cbiAgfVxuXG4gIC8vIHRoZSBmb2xsb3dpbmcgYXJlIHNoYXJlZCBleHRlbnNpb24gdmFsdWVzIChmb3IgYm90aCBtdWx0aXBhcnQgYW5kIG5vbi1tdWx0aXBhcnQgcGFydHMpXG4gIC8vIG5vdCBhdmFpbGFibGUgZm9yIEJPRFkgcmVxdWVzdHNcblxuICAvLyBib2R5IGRpc3Bvc2l0aW9uXG4gIGlmIChpIDwgbm9kZS5sZW5ndGggLSAxKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobm9kZVtpXSkgJiYgbm9kZVtpXS5sZW5ndGgpIHtcbiAgICAgIGN1ck5vZGUuZGlzcG9zaXRpb24gPSAoKG5vZGVbaV1bMF0gfHwge30pLnZhbHVlIHx8ICcnKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKClcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGVbaV1bMV0pKSB7XG4gICAgICAgIGN1ck5vZGUuZGlzcG9zaXRpb25QYXJhbWV0ZXJzID0gYXR0cmlidXRlc1RvT2JqZWN0KG5vZGVbaV1bMV0pXG4gICAgICB9XG4gICAgfVxuICAgIGkrK1xuICB9XG5cbiAgLy8gYm9keSBsYW5ndWFnZVxuICBpZiAoaSA8IG5vZGUubGVuZ3RoIC0gMSkge1xuICAgIGlmIChub2RlW2ldKSB7XG4gICAgICBjdXJOb2RlLmxhbmd1YWdlID0gW10uY29uY2F0KG5vZGVbaV0pLm1hcCgodmFsKSA9PiBwcm9wT3IoJycsICd2YWx1ZScsIHZhbCkudG9Mb3dlckNhc2UoKSlcbiAgICB9XG4gICAgaSsrXG4gIH1cblxuICAvLyBib2R5IGxvY2F0aW9uXG4gIC8vIE5CISBkZWZpbmVkIGFzIGEgXCJzdHJpbmcgbGlzdFwiIGluIFJGQzM1MDEgYnV0IHJlcGxhY2VkIGluIGVycmF0YSBkb2N1bWVudCB3aXRoIFwic3RyaW5nXCJcbiAgLy8gRXJyYXRhOiBodHRwOi8vd3d3LnJmYy1lZGl0b3Iub3JnL2VycmF0YV9zZWFyY2gucGhwP3JmYz0zNTAxXG4gIGlmIChpIDwgbm9kZS5sZW5ndGggLSAxKSB7XG4gICAgaWYgKG5vZGVbaV0pIHtcbiAgICAgIGN1ck5vZGUubG9jYXRpb24gPSAoKG5vZGVbaV0gfHwge30pLnZhbHVlIHx8ICcnKS50b1N0cmluZygpXG4gICAgfVxuICAgIGkrK1xuICB9XG5cbiAgcmV0dXJuIGN1ck5vZGVcbn1cblxuZnVuY3Rpb24gYXR0cmlidXRlc1RvT2JqZWN0IChhdHRycyA9IFtdLCBrZXlUcmFuc2Zvcm0gPSB0b0xvd2VyLCB2YWx1ZVRyYW5zZm9ybSA9IG1pbWVXb3Jkc0RlY29kZSkge1xuICBjb25zdCB2YWxzID0gYXR0cnMubWFwKHByb3AoJ3ZhbHVlJykpXG4gIGNvbnN0IGtleXMgPSB2YWxzLmZpbHRlcigoXywgaSkgPT4gaSAlIDIgPT09IDApLm1hcChrZXlUcmFuc2Zvcm0pXG4gIGNvbnN0IHZhbHVlcyA9IHZhbHMuZmlsdGVyKChfLCBpKSA9PiBpICUgMiA9PT0gMSkubWFwKHZhbHVlVHJhbnNmb3JtKVxuICByZXR1cm4gZnJvbVBhaXJzKHppcChrZXlzLCB2YWx1ZXMpKVxufVxuXG4vKipcbiAqIFBhcnNlcyBGRVRDSCByZXNwb25zZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZXNwb25zZVxuICogQHJldHVybiB7T2JqZWN0fSBNZXNzYWdlIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VGRVRDSCAocmVzcG9uc2UpIHtcbiAgaWYgKCFyZXNwb25zZSB8fCAhcmVzcG9uc2UucGF5bG9hZCB8fCAhcmVzcG9uc2UucGF5bG9hZC5GRVRDSCB8fCAhcmVzcG9uc2UucGF5bG9hZC5GRVRDSC5sZW5ndGgpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIGNvbnN0IGxpc3QgPSBbXVxuICBjb25zdCBtZXNzYWdlcyA9IHt9XG5cbiAgcmVzcG9uc2UucGF5bG9hZC5GRVRDSC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgY29uc3QgcGFyYW1zID0gW10uY29uY2F0KFtdLmNvbmNhdChpdGVtLmF0dHJpYnV0ZXMgfHwgW10pWzBdIHx8IFtdKSAvLyBlbnN1cmUgdGhlIGZpcnN0IHZhbHVlIGlzIGFuIGFycmF5XG4gICAgbGV0IG1lc3NhZ2VcbiAgICBsZXQgaSwgbGVuLCBrZXlcblxuICAgIGlmIChtZXNzYWdlc1tpdGVtLm5yXSkge1xuICAgICAgLy8gc2FtZSBzZXF1ZW5jZSBudW1iZXIgaXMgYWxyZWFkeSB1c2VkLCBzbyBtZXJnZSB2YWx1ZXMgaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBtZXNzYWdlIG9iamVjdFxuICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VzW2l0ZW0ubnJdXG4gICAgfSBlbHNlIHtcbiAgICAgIG1lc3NhZ2VzW2l0ZW0ubnJdID0gbWVzc2FnZSA9IHtcbiAgICAgICAgJyMnOiBpdGVtLm5yXG4gICAgICB9XG4gICAgICBsaXN0LnB1c2gobWVzc2FnZSlcbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwLCBsZW4gPSBwYXJhbXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmIChpICUgMiA9PT0gMCkge1xuICAgICAgICBrZXkgPSBjb21waWxlcih7XG4gICAgICAgICAgYXR0cmlidXRlczogW3BhcmFtc1tpXV1cbiAgICAgICAgfSkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC88XFxkKz4kLywgJycpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBtZXNzYWdlW2tleV0gPSBwYXJzZUZldGNoVmFsdWUoa2V5LCBwYXJhbXNbaV0pXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBsaXN0XG59XG5cbi8qKlxuICogUGFyc2VzIGEgc2luZ2xlIHZhbHVlIGZyb20gdGhlIEZFVENIIHJlc3BvbnNlIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgS2V5IG5hbWUgKHVwcGVyY2FzZSlcbiAqIEBwYXJhbSB7TWl6ZWR9IHZhbHVlIFZhbHVlIGZvciB0aGUga2V5XG4gKiBAcmV0dXJuIHtNaXhlZH0gUHJvY2Vzc2VkIHZhbHVlXG4gKi9cbmZ1bmN0aW9uIHBhcnNlRmV0Y2hWYWx1ZSAoa2V5LCB2YWx1ZSkge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgY2FzZSAndWlkJzpcbiAgICAgIGNhc2UgJ3JmYzgyMi5zaXplJzpcbiAgICAgICAgcmV0dXJuIE51bWJlcih2YWx1ZS52YWx1ZSkgfHwgMFxuICAgICAgY2FzZSAnbW9kc2VxJzogLy8gZG8gbm90IGNhc3QgNjQgYml0IHVpbnQgdG8gYSBudW1iZXJcbiAgICAgICAgcmV0dXJuIHZhbHVlLnZhbHVlIHx8ICcwJ1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUudmFsdWVcbiAgfVxuXG4gIHN3aXRjaCAoa2V5KSB7XG4gICAgY2FzZSAnZmxhZ3MnOlxuICAgIGNhc2UgJ3gtZ20tbGFiZWxzJzpcbiAgICAgIHZhbHVlID0gW10uY29uY2F0KHZhbHVlKS5tYXAoKGZsYWcpID0+IChmbGFnLnZhbHVlIHx8ICcnKSlcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAnZW52ZWxvcGUnOlxuICAgICAgdmFsdWUgPSBwYXJzZUVOVkVMT1BFKFtdLmNvbmNhdCh2YWx1ZSB8fCBbXSkpXG4gICAgICBicmVha1xuICAgIGNhc2UgJ2JvZHlzdHJ1Y3R1cmUnOlxuICAgICAgdmFsdWUgPSBwYXJzZUJPRFlTVFJVQ1RVUkUoW10uY29uY2F0KHZhbHVlIHx8IFtdKSlcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAnbW9kc2VxJzpcbiAgICAgIHZhbHVlID0gKHZhbHVlLnNoaWZ0KCkgfHwge30pLnZhbHVlIHx8ICcwJ1xuICAgICAgYnJlYWtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZVxufVxuXG4vKipcbiAgKiBCaW5hcnkgU2VhcmNoIC0gZnJvbSBucG0gbW9kdWxlIGJpbmFyeS1zZWFyY2gsIGxpY2Vuc2UgQ0MwXG4gICpcbiAgKiBAcGFyYW0ge0FycmF5fSBoYXlzdGFjayBPcmRlcmVkIGFycmF5XG4gICogQHBhcmFtIHthbnl9IG5lZWRsZSBJdGVtIHRvIHNlYXJjaCBmb3IgaW4gaGF5c3RhY2tcbiAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIEZ1bmN0aW9uIHRoYXQgZGVmaW5lcyB0aGUgc29ydCBvcmRlclxuICAqIEByZXR1cm4ge051bWJlcn0gSW5kZXggb2YgbmVlZGxlIGluIGhheXN0YWNrIG9yIGlmIG5vdCBmb3VuZCxcbiAgKiAgICAgLUluZGV4LTEgaXMgdGhlIHBvc2l0aW9uIHdoZXJlIG5lZWRsZSBjb3VsZCBiZSBpbnNlcnRlZCB3aGlsZSBzdGlsbFxuICAqICAgICBrZWVwaW5nIGhheXN0YWNrIG9yZGVyZWQuXG4gICovXG5mdW5jdGlvbiBiaW5TZWFyY2ggKGhheXN0YWNrLCBuZWVkbGUsIGNvbXBhcmF0b3IgPSAoYSwgYikgPT4gYSAtIGIpIHtcbiAgdmFyIG1pZCwgY21wXG4gIHZhciBsb3cgPSAwXG4gIHZhciBoaWdoID0gaGF5c3RhY2subGVuZ3RoIC0gMVxuXG4gIHdoaWxlIChsb3cgPD0gaGlnaCkge1xuICAgIC8vIE5vdGUgdGhhdCBcIihsb3cgKyBoaWdoKSA+Pj4gMVwiIG1heSBvdmVyZmxvdywgYW5kIHJlc3VsdHMgaW5cbiAgICAvLyBhIHR5cGVjYXN0IHRvIGRvdWJsZSAod2hpY2ggZ2l2ZXMgdGhlIHdyb25nIHJlc3VsdHMpLlxuICAgIG1pZCA9IGxvdyArIChoaWdoIC0gbG93ID4+IDEpXG4gICAgY21wID0gK2NvbXBhcmF0b3IoaGF5c3RhY2tbbWlkXSwgbmVlZGxlKVxuXG4gICAgaWYgKGNtcCA8IDAuMCkge1xuICAgICAgLy8gdG9vIGxvd1xuICAgICAgbG93ID0gbWlkICsgMVxuICAgIH0gZWxzZSBpZiAoY21wID4gMC4wKSB7XG4gICAgICAvLyB0b28gaGlnaFxuICAgICAgaGlnaCA9IG1pZCAtIDFcbiAgICB9IGVsc2Uge1xuICAgICAgLy8ga2V5IGZvdW5kXG4gICAgICByZXR1cm4gbWlkXG4gICAgfVxuICB9XG5cbiAgLy8ga2V5IG5vdCBmb3VuZFxuICByZXR1cm4gfmxvd1xufTtcblxuLyoqXG4gKiBQYXJzZXMgU0VBUkNIIHJlc3BvbnNlLiBHYXRoZXJzIGFsbCB1bnRhZ2dlZCBTRUFSQ0ggcmVzcG9uc2VzLCBmZXRjaGVkIHNlcS4vdWlkIG51bWJlcnNcbiAqIGFuZCBjb21waWxlcyB0aGVzZSBpbnRvIGEgc29ydGVkIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZXNwb25zZVxuICogQHJldHVybiB7T2JqZWN0fSBNZXNzYWdlIG9iamVjdFxuICogQHBhcmFtIHtBcnJheX0gU29ydGVkIFNlcS4vVUlEIG51bWJlciBsaXN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNFQVJDSCAocmVzcG9uc2UpIHtcbiAgY29uc3QgbGlzdCA9IFtdXG5cbiAgaWYgKCFyZXNwb25zZSB8fCAhcmVzcG9uc2UucGF5bG9hZCB8fCAhcmVzcG9uc2UucGF5bG9hZC5TRUFSQ0ggfHwgIXJlc3BvbnNlLnBheWxvYWQuU0VBUkNILmxlbmd0aCkge1xuICAgIHJldHVybiBsaXN0XG4gIH1cblxuICByZXNwb25zZS5wYXlsb2FkLlNFQVJDSC5mb3JFYWNoKHJlc3VsdCA9PlxuICAgIChyZXN1bHQuYXR0cmlidXRlcyB8fCBbXSkuZm9yRWFjaChuciA9PiB7XG4gICAgICBuciA9IE51bWJlcigobnIgJiYgbnIudmFsdWUpIHx8IG5yKSB8fCAwXG4gICAgICBjb25zdCBpZHggPSBiaW5TZWFyY2gobGlzdCwgbnIpXG4gICAgICBpZiAoaWR4IDwgMCkge1xuICAgICAgICBsaXN0LnNwbGljZSgtaWR4IC0gMSwgMCwgbnIpXG4gICAgICB9XG4gICAgfSlcbiAgKVxuXG4gIHJldHVybiBsaXN0XG59O1xuXG4vKipcbiAqIFBhcnNlcyBDT1BZIGFuZCBVSUQgQ09QWSByZXNwb25zZS5cbiAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0MzE1XG4gKiBAcGFyYW0ge09iamVjdH0gcmVzcG9uc2VcbiAqIEByZXR1cm5zIHt7ZGVzdFNlcVNldDogc3RyaW5nLCBzcmNTZXFTZXQ6IHN0cmluZ319IFNvdXJjZSBhbmRcbiAqIGRlc3RpbmF0aW9uIHVpZCBzZXRzIGlmIGF2YWlsYWJsZSwgdW5kZWZpbmVkIGlmIG5vdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ09QWSAocmVzcG9uc2UpIHtcbiAgY29uc3QgY29weXVpZCA9IHJlc3BvbnNlICYmIHJlc3BvbnNlLmNvcHl1aWRcbiAgaWYgKGNvcHl1aWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3JjU2VxU2V0OiBjb3B5dWlkWzFdLFxuICAgICAgZGVzdFNlcVNldDogY29weXVpZFsyXVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlcyBBUFBFTkQgKHVwbG9hZCkgcmVzcG9uc2UuXG4gKiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDMxNVxuICogQHBhcmFtIHtPYmplY3R9IHJlc3BvbnNlXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgdWlkIGFzc2lnbmVkIHRvIHRoZSB1cGxvYWRlZCBtZXNzYWdlIGlmIGF2YWlsYWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQVBQRU5EIChyZXNwb25zZSkge1xuICByZXR1cm4gcmVzcG9uc2UgJiYgcmVzcG9uc2UuYXBwZW5kdWlkICYmIHJlc3BvbnNlLmFwcGVuZHVpZFsxXVxufVxuIl19 \ No newline at end of file diff --git a/dist/common.js b/dist/common.js deleted file mode 100644 index a2646950..00000000 --- a/dist/common.js +++ /dev/null @@ -1,27 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.fromTypedArray = exports.toTypedArray = exports.LOG_LEVEL_ALL = exports.LOG_LEVEL_DEBUG = exports.LOG_LEVEL_INFO = exports.LOG_LEVEL_WARN = exports.LOG_LEVEL_ERROR = exports.LOG_LEVEL_NONE = void 0; -const LOG_LEVEL_NONE = 1000; -exports.LOG_LEVEL_NONE = LOG_LEVEL_NONE; -const LOG_LEVEL_ERROR = 40; -exports.LOG_LEVEL_ERROR = LOG_LEVEL_ERROR; -const LOG_LEVEL_WARN = 30; -exports.LOG_LEVEL_WARN = LOG_LEVEL_WARN; -const LOG_LEVEL_INFO = 20; -exports.LOG_LEVEL_INFO = LOG_LEVEL_INFO; -const LOG_LEVEL_DEBUG = 10; -exports.LOG_LEVEL_DEBUG = LOG_LEVEL_DEBUG; -const LOG_LEVEL_ALL = 0; -exports.LOG_LEVEL_ALL = LOG_LEVEL_ALL; - -const toTypedArray = str => new Uint8Array(str.split('').map(char => char.charCodeAt(0))); - -exports.toTypedArray = toTypedArray; - -const fromTypedArray = arr => String.fromCharCode.apply(null, arr); - -exports.fromTypedArray = fromTypedArray; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21tb24uanMiXSwibmFtZXMiOlsiTE9HX0xFVkVMX05PTkUiLCJMT0dfTEVWRUxfRVJST1IiLCJMT0dfTEVWRUxfV0FSTiIsIkxPR19MRVZFTF9JTkZPIiwiTE9HX0xFVkVMX0RFQlVHIiwiTE9HX0xFVkVMX0FMTCIsInRvVHlwZWRBcnJheSIsInN0ciIsIlVpbnQ4QXJyYXkiLCJzcGxpdCIsIm1hcCIsImNoYXIiLCJjaGFyQ29kZUF0IiwiZnJvbVR5cGVkQXJyYXkiLCJhcnIiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJhcHBseSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQU8sTUFBTUEsY0FBYyxHQUFHLElBQXZCOztBQUNBLE1BQU1DLGVBQWUsR0FBRyxFQUF4Qjs7QUFDQSxNQUFNQyxjQUFjLEdBQUcsRUFBdkI7O0FBQ0EsTUFBTUMsY0FBYyxHQUFHLEVBQXZCOztBQUNBLE1BQU1DLGVBQWUsR0FBRyxFQUF4Qjs7QUFDQSxNQUFNQyxhQUFhLEdBQUcsQ0FBdEI7OztBQUVBLE1BQU1DLFlBQVksR0FBR0MsR0FBRyxJQUFJLElBQUlDLFVBQUosQ0FBZUQsR0FBRyxDQUFDRSxLQUFKLENBQVUsRUFBVixFQUFjQyxHQUFkLENBQWtCQyxJQUFJLElBQUlBLElBQUksQ0FBQ0MsVUFBTCxDQUFnQixDQUFoQixDQUExQixDQUFmLENBQTVCOzs7O0FBQ0EsTUFBTUMsY0FBYyxHQUFHQyxHQUFHLElBQUlDLE1BQU0sQ0FBQ0MsWUFBUCxDQUFvQkMsS0FBcEIsQ0FBMEIsSUFBMUIsRUFBZ0NILEdBQWhDLENBQTlCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IExPR19MRVZFTF9OT05FID0gMTAwMFxuZXhwb3J0IGNvbnN0IExPR19MRVZFTF9FUlJPUiA9IDQwXG5leHBvcnQgY29uc3QgTE9HX0xFVkVMX1dBUk4gPSAzMFxuZXhwb3J0IGNvbnN0IExPR19MRVZFTF9JTkZPID0gMjBcbmV4cG9ydCBjb25zdCBMT0dfTEVWRUxfREVCVUcgPSAxMFxuZXhwb3J0IGNvbnN0IExPR19MRVZFTF9BTEwgPSAwXG5cbmV4cG9ydCBjb25zdCB0b1R5cGVkQXJyYXkgPSBzdHIgPT4gbmV3IFVpbnQ4QXJyYXkoc3RyLnNwbGl0KCcnKS5tYXAoY2hhciA9PiBjaGFyLmNoYXJDb2RlQXQoMCkpKVxuZXhwb3J0IGNvbnN0IGZyb21UeXBlZEFycmF5ID0gYXJyID0+IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYXJyKVxuIl19 \ No newline at end of file diff --git a/dist/compression.js b/dist/compression.js deleted file mode 100644 index f96e1879..00000000 --- a/dist/compression.js +++ /dev/null @@ -1,140 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = Compressor; - -var _zstream = _interopRequireDefault(require("pako/lib/zlib/zstream")); - -var _deflate = require("pako/lib/zlib/deflate"); - -var _inflate = require("pako/lib/zlib/inflate"); - -var _messages = _interopRequireDefault(require("pako/lib/zlib/messages.js")); - -var _constants = require("pako/lib/zlib/constants"); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -const CHUNK_SIZE = 16384; -const WINDOW_BITS = 15; -/** - * Handles de-/compression via #inflate() and #deflate(), calls you back via #deflatedReady() and #inflatedReady(). - * The chunk we get from deflater is actually a view of a 16kB arraybuffer, so we need to copy the relevant parts - * memory to a new arraybuffer. - */ - -function Compressor(inflatedReady, deflatedReady) { - this.inflatedReady = inflatedReady; - this.deflatedReady = deflatedReady; - this._inflate = inflater(chunk => this.inflatedReady(chunk.buffer.slice(chunk.byteOffset, chunk.byteOffset + chunk.length))); - this._deflate = deflater(chunk => this.deflatedReady(chunk.buffer.slice(chunk.byteOffset, chunk.byteOffset + chunk.length))); -} - -Compressor.prototype.inflate = function (buffer) { - this._inflate(new Uint8Array(buffer)); -}; - -Compressor.prototype.deflate = function (buffer) { - this._deflate(new Uint8Array(buffer)); -}; - -function deflater(emit) { - const stream = new _zstream.default(); - const status = (0, _deflate.deflateInit2)(stream, _constants.Z_DEFAULT_COMPRESSION, _constants.Z_DEFLATED, WINDOW_BITS, 8, _constants.Z_DEFAULT_STRATEGY); - - if (status !== _constants.Z_OK) { - throw new Error('Problem initializing deflate stream: ' + _messages.default[status]); - } - - return function (data) { - if (data === undefined) return emit(); // Attach the input data - - stream.input = data; - stream.next_in = 0; - stream.avail_in = stream.input.length; - let status; - let output; - let start; - let ret = true; - - do { - // When the stream gets full, we need to create new space. - if (stream.avail_out === 0) { - stream.output = new Uint8Array(CHUNK_SIZE); - start = stream.next_out = 0; - stream.avail_out = CHUNK_SIZE; - } // Perform the deflate - - - status = (0, _deflate.deflate)(stream, _constants.Z_SYNC_FLUSH); - - if (status !== _constants.Z_STREAM_END && status !== _constants.Z_OK) { - throw new Error('Deflate problem: ' + _messages.default[status]); - } // If the output buffer got full, flush the data. - - - if (stream.avail_out === 0 && stream.next_out > start) { - output = stream.output.subarray(start, start = stream.next_out); - ret = emit(output); - } - } while ((stream.avail_in > 0 || stream.avail_out === 0) && status !== _constants.Z_STREAM_END); // Emit whatever is left in output. - - - if (stream.next_out > start) { - output = stream.output.subarray(start, start = stream.next_out); - ret = emit(output); - } - - return ret; - }; -} - -function inflater(emit) { - const stream = new _zstream.default(); - const status = (0, _inflate.inflateInit2)(stream, WINDOW_BITS); - - if (status !== _constants.Z_OK) { - throw new Error('Problem initializing inflate stream: ' + _messages.default[status]); - } - - return function (data) { - if (data === undefined) return emit(); - let start; - stream.input = data; - stream.next_in = 0; - stream.avail_in = stream.input.length; - let status, output; - let ret = true; - - do { - if (stream.avail_out === 0) { - stream.output = new Uint8Array(CHUNK_SIZE); - start = stream.next_out = 0; - stream.avail_out = CHUNK_SIZE; - } - - status = (0, _inflate.inflate)(stream, _constants.Z_NO_FLUSH); - - if (status !== _constants.Z_STREAM_END && status !== _constants.Z_OK) { - throw new Error('inflate problem: ' + _messages.default[status]); - } - - if (stream.next_out) { - if (stream.avail_out === 0 || status === _constants.Z_STREAM_END) { - output = stream.output.subarray(start, start = stream.next_out); - ret = emit(output); - } - } - } while (stream.avail_in > 0 && status !== _constants.Z_STREAM_END); - - if (stream.next_out > start) { - output = stream.output.subarray(start, start = stream.next_out); - ret = emit(output); - } - - return ret; - }; -} -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21wcmVzc2lvbi5qcyJdLCJuYW1lcyI6WyJDSFVOS19TSVpFIiwiV0lORE9XX0JJVFMiLCJDb21wcmVzc29yIiwiaW5mbGF0ZWRSZWFkeSIsImRlZmxhdGVkUmVhZHkiLCJfaW5mbGF0ZSIsImluZmxhdGVyIiwiY2h1bmsiLCJidWZmZXIiLCJzbGljZSIsImJ5dGVPZmZzZXQiLCJsZW5ndGgiLCJfZGVmbGF0ZSIsImRlZmxhdGVyIiwicHJvdG90eXBlIiwiaW5mbGF0ZSIsIlVpbnQ4QXJyYXkiLCJkZWZsYXRlIiwiZW1pdCIsInN0cmVhbSIsIlpTdHJlYW0iLCJzdGF0dXMiLCJaX0RFRkFVTFRfQ09NUFJFU1NJT04iLCJaX0RFRkxBVEVEIiwiWl9ERUZBVUxUX1NUUkFURUdZIiwiWl9PSyIsIkVycm9yIiwibWVzc2FnZXMiLCJkYXRhIiwidW5kZWZpbmVkIiwiaW5wdXQiLCJuZXh0X2luIiwiYXZhaWxfaW4iLCJvdXRwdXQiLCJzdGFydCIsInJldCIsImF2YWlsX291dCIsIm5leHRfb3V0IiwiWl9TWU5DX0ZMVVNIIiwiWl9TVFJFQU1fRU5EIiwic3ViYXJyYXkiLCJaX05PX0ZMVVNIIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFNQSxNQUFNQSxVQUFVLEdBQUcsS0FBbkI7QUFDQSxNQUFNQyxXQUFXLEdBQUcsRUFBcEI7QUFFQTs7Ozs7O0FBS2UsU0FBU0MsVUFBVCxDQUFxQkMsYUFBckIsRUFBb0NDLGFBQXBDLEVBQW1EO0FBQ2hFLE9BQUtELGFBQUwsR0FBcUJBLGFBQXJCO0FBQ0EsT0FBS0MsYUFBTCxHQUFxQkEsYUFBckI7QUFDQSxPQUFLQyxRQUFMLEdBQWdCQyxRQUFRLENBQUNDLEtBQUssSUFBSSxLQUFLSixhQUFMLENBQW1CSSxLQUFLLENBQUNDLE1BQU4sQ0FBYUMsS0FBYixDQUFtQkYsS0FBSyxDQUFDRyxVQUF6QixFQUFxQ0gsS0FBSyxDQUFDRyxVQUFOLEdBQW1CSCxL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OlsiaW1wb3J0IFpTdHJlYW0gZnJvbSAncGFrby9saWIvemxpYi96c3RyZWFtJ1xuaW1wb3J0IHsgZGVmbGF0ZUluaXQyLCBkZWZsYXRlIH0gZnJvbSAncGFrby9saWIvemxpYi9kZWZsYXRlJ1xuaW1wb3J0IHsgaW5mbGF0ZSwgaW5mbGF0ZUluaXQyIH0gZnJvbSAncGFrby9saWIvemxpYi9pbmZsYXRlJ1xuaW1wb3J0IG1lc3NhZ2VzIGZyb20gJ3Bha28vbGliL3psaWIvbWVzc2FnZXMuanMnXG5pbXBvcnQge1xuICBaX05PX0ZMVVNILCBaX1NZTkNfRkxVU0gsIFpfT0ssXG4gIFpfU1RSRUFNX0VORCwgWl9ERUZBVUxUX0NPTVBSRVNTSU9OLFxuICBaX0RFRkFVTFRfU1RSQVRFR1ksIFpfREVGTEFURURcbn0gZnJvbSAncGFrby9saWIvemxpYi9jb25zdGFudHMnXG5cbmNvbnN0IENIVU5LX1NJWkUgPSAxNjM4NFxuY29uc3QgV0lORE9XX0JJVFMgPSAxNVxuXG4vKipcbiAqIEhhbmRsZXMgZGUtL2NvbXByZXNzaW9uIHZpYSAjaW5mbGF0ZSgpIGFuZCAjZGVmbGF0ZSgpLCBjYWxscyB5b3UgYmFjayB2aWEgI2RlZmxhdGVkUmVhZHkoKSBhbmQgI2luZmxhdGVkUmVhZHkoKS5cbiAqIFRoZSBjaHVuayB3ZSBnZXQgZnJvbSBkZWZsYXRlciBpcyBhY3R1YWxseSBhIHZpZXcgb2YgYSAxNmtCIGFycmF5YnVmZmVyLCBzbyB3ZSBuZWVkIHRvIGNvcHkgdGhlIHJlbGV2YW50IHBhcnRzXG4gKiBtZW1vcnkgdG8gYSBuZXcgYXJyYXlidWZmZXIuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENvbXByZXNzb3IgKGluZmxhdGVkUmVhZHksIGRlZmxhdGVkUmVhZHkpIHtcbiAgdGhpcy5pbmZsYXRlZFJlYWR5ID0gaW5mbGF0ZWRSZWFkeVxuICB0aGlzLmRlZmxhdGVkUmVhZHkgPSBkZWZsYXRlZFJlYWR5XG4gIHRoaXMuX2luZmxhdGUgPSBpbmZsYXRlcihjaHVuayA9PiB0aGlzLmluZmxhdGVkUmVhZHkoY2h1bmsuYnVmZmVyLnNsaWNlKGNodW5rLmJ5dGVPZmZzZXQsIGNodW5rLmJ5dGVPZmZzZXQgKyBjaHVuay5sZW5ndGgpKSlcbiAgdGhpcy5fZGVmbGF0ZSA9IGRlZmxhdGVyKGNodW5rID0+IHRoaXMuZGVmbGF0ZWRSZWFkeShjaHVuay5idWZmZXIuc2xpY2UoY2h1bmsuYnl0ZU9mZnNldCwgY2h1bmsuYnl0ZU9mZnNldCArIGNodW5rLmxlbmd0aCkpKVxufVxuXG5Db21wcmVzc29yLnByb3RvdHlwZS5pbmZsYXRlID0gZnVuY3Rpb24gKGJ1ZmZlcikge1xuICB0aGlzLl9pbmZsYXRlKG5ldyBVaW50OEFycmF5KGJ1ZmZlcikpXG59XG5cbkNvbXByZXNzb3IucHJvdG90eXBlLmRlZmxhdGUgPSBmdW5jdGlvbiAoYnVmZmVyKSB7XG4gIHRoaXMuX2RlZmxhdGUobmV3IFVpbnQ4QXJyYXkoYnVmZmVyKSlcbn1cblxuZnVuY3Rpb24gZGVmbGF0ZXIgKGVtaXQpIHtcbiAgY29uc3Qgc3RyZWFtID0gbmV3IFpTdHJlYW0oKVxuICBjb25zdCBzdGF0dXMgPSBkZWZsYXRlSW5pdDIoc3RyZWFtLCBaX0RFRkFVTFRfQ09NUFJFU1NJT04sIFpfREVGTEFURUQsIFdJTkRPV19CSVRTLCA4LCBaX0RFRkFVTFRfU1RSQVRFR1kpXG4gIGlmIChzdGF0dXMgIT09IFpfT0spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb2JsZW0gaW5pdGlhbGl6aW5nIGRlZmxhdGUgc3RyZWFtOiAnICsgbWVzc2FnZXNbc3RhdHVzXSlcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZGF0YSkge1xuICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHJldHVybiBlbWl0KClcblxuICAgIC8vIEF0dGFjaCB0aGUgaW5wdXQgZGF0YVxuICAgIHN0cmVhbS5pbnB1dCA9IGRhdGFcbiAgICBzdHJlYW0ubmV4dF9pbiA9IDBcbiAgICBzdHJlYW0uYXZhaWxfaW4gPSBzdHJlYW0uaW5wdXQubGVuZ3RoXG5cbiAgICBsZXQgc3RhdHVzXG4gICAgbGV0IG91dHB1dFxuICAgIGxldCBzdGFydFxuICAgIGxldCByZXQgPSB0cnVlXG5cbiAgICBkbyB7XG4gICAgICAvLyBXaGVuIHRoZSBzdHJlYW0gZ2V0cyBmdWxsLCB3ZSBuZWVkIHRvIGNyZWF0ZSBuZXcgc3BhY2UuXG4gICAgICBpZiAoc3RyZWFtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICBzdHJlYW0ub3V0cHV0ID0gbmV3IFVpbnQ4QXJyYXkoQ0hVTktfU0laRSlcbiAgICAgICAgc3RhcnQgPSBzdHJlYW0ubmV4dF9vdXQgPSAwXG4gICAgICAgIHN0cmVhbS5hdmFpbF9vdXQgPSBDSFVOS19TSVpFXG4gICAgICB9XG5cbiAgICAgIC8vIFBlcmZvcm0gdGhlIGRlZmxhdGVcbiAgICAgIHN0YXR1cyA9IGRlZmxhdGUoc3RyZWFtLCBaX1NZTkNfRkxVU0gpXG4gICAgICBpZiAoc3RhdHVzICE9PSBaX1NUUkVBTV9FTkQgJiYgc3RhdHVzICE9PSBaX09LKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRGVmbGF0ZSBwcm9ibGVtOiAnICsgbWVzc2FnZXNbc3RhdHVzXSlcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIG91dHB1dCBidWZmZXIgZ290IGZ1bGwsIGZsdXNoIHRoZSBkYXRhLlxuICAgICAgaWYgKHN0cmVhbS5hdmFpbF9vdXQgPT09IDAgJiYgc3RyZWFtLm5leHRfb3V0ID4gc3RhcnQpIHtcbiAgICAgICAgb3V0cHV0ID0gc3RyZWFtLm91dHB1dC5zdWJhcnJheShzdGFydCwgc3RhcnQgPSBzdHJlYW0ubmV4dF9vdXQpXG4gICAgICAgIHJldCA9IGVtaXQob3V0cHV0KVxuICAgICAgfVxuICAgIH0gd2hpbGUgKChzdHJlYW0uYXZhaWxfaW4gPiAwIHx8IHN0cmVhbS5hdmFpbF9vdXQgPT09IDApICYmIHN0YXR1cyAhPT0gWl9TVFJFQU1fRU5EKVxuXG4gICAgLy8gRW1pdCB3aGF0ZXZlciBpcyBsZWZ0IGluIG91dHB1dC5cbiAgICBpZiAoc3RyZWFtLm5leHRfb3V0ID4gc3RhcnQpIHtcbiAgICAgIG91dHB1dCA9IHN0cmVhbS5vdXRwdXQuc3ViYXJyYXkoc3RhcnQsIHN0YXJ0ID0gc3RyZWFtLm5leHRfb3V0KVxuICAgICAgcmV0ID0gZW1pdChvdXRwdXQpXG4gICAgfVxuICAgIHJldHVybiByZXRcbiAgfVxufVxuXG5mdW5jdGlvbiBpbmZsYXRlciAoZW1pdCkge1xuICBjb25zdCBzdHJlYW0gPSBuZXcgWlN0cmVhbSgpXG5cbiAgY29uc3Qgc3RhdHVzID0gaW5mbGF0ZUluaXQyKHN0cmVhbSwgV0lORE9XX0JJVFMpXG4gIGlmIChzdGF0dXMgIT09IFpfT0spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb2JsZW0gaW5pdGlhbGl6aW5nIGluZmxhdGUgc3RyZWFtOiAnICsgbWVzc2FnZXNbc3RhdHVzXSlcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZGF0YSkge1xuICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHJldHVybiBlbWl0KClcblxuICAgIGxldCBzdGFydFxuICAgIHN0cmVhbS5pbnB1dCA9IGRhdGFcbiAgICBzdHJlYW0ubmV4dF9pbiA9IDBcbiAgICBzdHJlYW0uYXZhaWxfaW4gPSBzdHJlYW0uaW5wdXQubGVuZ3RoXG5cbiAgICBsZXQgc3RhdHVzLCBvdXRwdXRcbiAgICBsZXQgcmV0ID0gdHJ1ZVxuXG4gICAgZG8ge1xuICAgICAgaWYgKHN0cmVhbS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgc3RyZWFtLm91dHB1dCA9IG5ldyBVaW50OEFycmF5KENIVU5LX1NJWkUpXG4gICAgICAgIHN0YXJ0ID0gc3RyZWFtLm5leHRfb3V0ID0gMFxuICAgICAgICBzdHJlYW0uYXZhaWxfb3V0ID0gQ0hVTktfU0laRVxuICAgICAgfVxuXG4gICAgICBzdGF0dXMgPSBpbmZsYXRlKHN0cmVhbSwgWl9OT19GTFVTSClcbiAgICAgIGlmIChzdGF0dXMgIT09IFpfU1RSRUFNX0VORCAmJiBzdGF0dXMgIT09IFpfT0spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbmZsYXRlIHByb2JsZW06ICcgKyBtZXNzYWdlc1tzdGF0dXNdKVxuICAgICAgfVxuXG4gICAgICBpZiAoc3RyZWFtLm5leHRfb3V0KSB7XG4gICAgICAgIGlmIChzdHJlYW0uYXZhaWxfb3V0ID09PSAwIHx8IHN0YXR1cyA9PT0gWl9TVFJFQU1fRU5EKSB7XG4gICAgICAgICAgb3V0cHV0ID0gc3RyZWFtLm91dHB1dC5zdWJhcnJheShzdGFydCwgc3RhcnQgPSBzdHJlYW0ubmV4dF9vdXQpXG4gICAgICAgICAgcmV0ID0gZW1pdChvdXRwdXQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IHdoaWxlICgoc3RyZWFtLmF2YWlsX2luID4gMCkgJiYgc3RhdHVzICE9PSBaX1NUUkVBTV9FTkQpXG5cbiAgICBpZiAoc3RyZWFtLm5leHRfb3V0ID4gc3RhcnQpIHtcbiAgICAgIG91dHB1dCA9IHN0cmVhbS5vdXRwdXQuc3ViYXJyYXkoc3RhcnQsIHN0YXJ0ID0gc3RyZWFtLm5leHRfb3V0KVxuICAgICAgcmV0ID0gZW1pdChvdXRwdXQpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJldFxuICB9XG59XG4iXX0= \ No newline at end of file diff --git a/dist/imap.js b/dist/imap.js deleted file mode 100644 index 906fe485..00000000 --- a/dist/imap.js +++ /dev/null @@ -1,949 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; - -var _ramda = require("ramda"); - -var _emailjsTcpSocket = _interopRequireDefault(require("emailjs-tcp-socket")); - -var _common = require("./common"); - -var _emailjsImapHandler = require("emailjs-imap-handler"); - -var _compression = _interopRequireDefault(require("./compression")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/* babel-plugin-inline-import '../res/compression.worker.blob' */ -const CompressionBlob = "!function(e){var t={};function a(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,a),i.l=!0,i.exports}a.m=e,a.c=t,a.d=function(e,t,n){a.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},a.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},a.t=function(e,t){if(1&t&&(e=a(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(a.r(n),Object.defineProperty(n,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var i in e)a.d(n,i,function(t){return e[t]}.bind(null,i));return n},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,\"a\",t),t},a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},a.p=\"\",a(a.s=11)}([function(e,t,a){\"use strict\";e.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},function(e,t,a){\"use strict\";e.exports={2:\"need dictionary\",1:\"stream end\",0:\"\",\"-1\":\"file error\",\"-2\":\"stream error\",\"-3\":\"data error\",\"-4\":\"insufficient memory\",\"-5\":\"buffer error\",\"-6\":\"incompatible version\"}},function(e,t,a){\"use strict\";var n=\"undefined\"!=typeof Uint8Array&&\"undefined\"!=typeof Uint16Array&&\"undefined\"!=typeof Int32Array;function i(e,t){return Object.prototype.hasOwnProperty.call(e,t)}t.assign=function(e){for(var t=Array.prototype.slice.call(arguments,1);t.length;){var a=t.shift();if(a){if(\"object\"!=typeof a)throw new TypeError(a+\"must be non-object\");for(var n in a)i(a,n)&&(e[n]=a[n])}}return e},t.shrinkBuf=function(e,t){return e.length===t?e:e.subarray?e.subarray(0,t):(e.length=t,e)};var r={arraySet:function(e,t,a,n,i){if(t.subarray&&e.subarray)e.set(t.subarray(a,a+n),i);else for(var r=0;r4?9:0)}function $(e){for(var t=e.length;--t>=0;)e[t]=0}function ee(e){var t=e.state,a=t.pending;a>e.avail_out&&(a=e.avail_out),0!==a&&(i.arraySet(e.output,t.pending_buf,t.pending_out,a,e.next_out),e.next_out+=a,t.pending_out+=a,e.total_out+=a,e.avail_out-=a,t.pending-=a,0===t.pending&&(t.pending_out=0))}function te(e,t){r._tr_flush_block(e,e.block_start>=0?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,ee(e.strm)}function ae(e,t){e.pending_buf[e.pending++]=t}function ne(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t}function ie(e,t){var a,n,i=e.max_chain_length,r=e.strstart,s=e.prev_length,l=e.nice_match,o=e.strstart>e.w_size-F?e.strstart-(e.w_size-F):0,h=e.window,d=e.w_mask,_=e.prev,f=e.strstart+I,u=h[r+s-1],c=h[r+s];e.prev_length>=e.good_match&&(i>>=2),l>e.lookahead&&(l=e.lookahead);do{if(h[(a=t)+s]===c&&h[a+s-1]===u&&h[a]===h[r]&&h[++a]===h[r+1]){r+=2,a++;do{}while(h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&rs){if(e.match_start=t,s=n,n>=l)break;u=h[r+s-1],c=h[r+s]}}}while((t=_[t&d])>o&&0!=--i);return s<=e.lookahead?s:e.lookahead}function re(e){var t,a,n,r,o,h,d,_,f,u,c=e.w_size;do{if(r=e.window_size-e.lookahead-e.strstart,e.strstart>=c+(c-F)){i.arraySet(e.window,e.window,c,c,0),e.match_start-=c,e.strstart-=c,e.block_start-=c,t=a=e.hash_size;do{n=e.head[--t],e.head[t]=n>=c?n-c:0}while(--a);t=a=c;do{n=e.prev[--t],e.prev[t]=n>=c?n-c:0}while(--a);r+=c}if(0===e.strm.avail_in)break;if(h=e.strm,d=e.window,_=e.strstart+e.lookahead,f=r,u=void 0,(u=h.avail_in)>f&&(u=f),a=0===u?0:(h.avail_in-=u,i.arraySet(d,h.input,h.next_in,u,_),1===h.state.wrap?h.adler=s(h.adler,d,u,_):2===h.state.wrap&&(h.adler=l(h.adler,d,u,_)),h.next_in+=u,h.total_in+=u,u),e.lookahead+=a,e.lookahead+e.insert>=U)for(o=e.strstart-e.insert,e.ins_h=e.window[o],e.ins_h=(e.ins_h<=U&&(e.ins_h=(e.ins_h<=U)if(n=r._tr_tally(e,e.strstart-e.match_start,e.match_length-U),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=U){e.match_length--;do{e.strstart++,e.ins_h=(e.ins_h<=U&&(e.ins_h=(e.ins_h<4096)&&(e.match_length=U-1)),e.prev_length>=U&&e.match_length<=e.prev_length){i=e.strstart+e.lookahead-U,n=r._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-U),e.lookahead-=e.prev_length-1,e.prev_length-=2;do{++e.strstart<=i&&(e.ins_h=(e.ins_h<15&&(l=2,n-=16),r<1||r>A||a!==E||n<8||n>15||t<0||t>9||s<0||s>x)return Q(e,g);8===n&&(n=9);var o=new he;return e.state=o,o.strm=e,o.wrap=l,o.gzhead=null,o.w_bits=n,o.w_size=1<e.pending_buf_size-5&&(a=e.pending_buf_size-5);;){if(e.lookahead<=1){if(re(e),0===e.lookahead&&t===h)return G;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var n=e.block_start+a;if((0===e.strstart||e.strstart>=n)&&(e.lookahead=e.strstart-n,e.strstart=n,te(e,!1),0===e.strm.avail_out))return G;if(e.strstart-e.block_start>=e.w_size-F&&(te(e,!1),0===e.strm.avail_out))return G}return e.insert=0,t===f?(te(e,!0),0===e.strm.avail_out?W:q):(e.strstart>e.block_start&&(te(e,!1),e.strm.avail_out),G)}),new oe(4,4,8,4,se),new oe(4,5,16,8,se),new oe(4,6,32,32,se),new oe(4,4,16,16,le),new oe(8,16,32,32,le),new oe(8,16,128,128,le),new oe(8,32,128,256,le),new oe(32,128,258,1024,le),new oe(32,258,258,4096,le)],t.deflateInit=function(e,t){return fe(e,t,E,Z,O,z)},t.deflateInit2=fe,t.deflateReset=_e,t.deflateResetKeep=de,t.deflateSetHeader=function(e,t){return e&&e.state?2!==e.state.wrap?g:(e.state.gzhead=t,c):g},t.deflate=function(e,t){var a,i,s,o;if(!e||!e.state||t>u||t<0)return e?Q(e,g):g;if(i=e.state,!e.output||!e.input&&0!==e.avail_in||i.status===Y&&t!==f)return Q(e,0===e.avail_out?w:g);if(i.strm=e,a=i.last_flush,i.last_flush=t,i.status===M)if(2===i.wrap)e.adler=0,ae(i,31),ae(i,139),ae(i,8),i.gzhead?(ae(i,(i.gzhead.text?1:0)+(i.gzhead.hcrc?2:0)+(i.gzhead.extra?4:0)+(i.gzhead.name?8:0)+(i.gzhead.comment?16:0)),ae(i,255&i.gzhead.time),ae(i,i.gzhead.time>>8&255),ae(i,i.gzhead.time>>16&255),ae(i,i.gzhead.time>>24&255),ae(i,9===i.level?2:i.strategy>=k||i.level<2?4:0),ae(i,255&i.gzhead.os),i.gzhead.extra&&i.gzhead.extra.length&&(ae(i,255&i.gzhead.extra.length),ae(i,i.gzhead.extra.length>>8&255)),i.gzhead.hcrc&&(e.adler=l(e.adler,i.pending_buf,i.pending,0)),i.gzindex=0,i.status=j):(ae(i,0),ae(i,0),ae(i,0),ae(i,0),ae(i,0),ae(i,9===i.level?2:i.strategy>=k||i.level<2?4:0),ae(i,J),i.status=K);else{var m=E+(i.w_bits-8<<4)<<8;m|=(i.strategy>=k||i.level<2?0:i.level<6?1:6===i.level?2:3)<<6,0!==i.strstart&&(m|=L),m+=31-m%31,i.status=K,ne(i,m),0!==i.strstart&&(ne(i,e.adler>>>16),ne(i,65535&e.adler)),e.adler=1}if(i.status===j)if(i.gzhead.extra){for(s=i.pending;i.gzindex<(65535&i.gzhead.extra.length)&&(i.pending!==i.pending_buf_size||(i.gzhead.hcrc&&i.pending>s&&(e.adler=l(e.adler,i.pending_buf,i.pending-s,s)),ee(e),s=i.pending,i.pending!==i.pending_buf_size));)ae(i,255&i.gzhead.extra[i.gzindex]),i.gzindex++;i.gzhead.hcrc&&i.pending>s&&(e.adler=l(e.adler,i.pending_buf,i.pending-s,s)),i.gzindex===i.gzhead.extra.length&&(i.gzindex=0,i.status=C)}else i.status=C;if(i.status===C)if(i.gzhead.name){s=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>s&&(e.adler=l(e.adler,i.pending_buf,i.pending-s,s)),ee(e),s=i.pending,i.pending===i.pending_buf_size)){o=1;break}o=i.gzindexs&&(e.adler=l(e.adler,i.pending_buf,i.pending-s,s)),0===o&&(i.gzindex=0,i.status=P)}else i.status=P;if(i.status===P)if(i.gzhead.comment){s=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>s&&(e.adler=l(e.adler,i.pending_buf,i.pending-s,s)),ee(e),s=i.pending,i.pending===i.pending_buf_size)){o=1;break}o=i.gzindexs&&(e.adler=l(e.adler,i.pending_buf,i.pending-s,s)),0===o&&(i.status=H)}else i.status=H;if(i.status===H&&(i.gzhead.hcrc?(i.pending+2>i.pending_buf_size&&ee(e),i.pending+2<=i.pending_buf_size&&(ae(i,255&e.adler),ae(i,e.adler>>8&255),e.adler=0,i.status=K)):i.status=K),0!==i.pending){if(ee(e),0===e.avail_out)return i.last_flush=-1,c}else if(0===e.avail_in&&V(t)<=V(a)&&t!==f)return Q(e,w);if(i.status===Y&&0!==e.avail_in)return Q(e,w);if(0!==e.avail_in||0!==i.lookahead||t!==h&&i.status!==Y){var p=i.strategy===k?function(e,t){for(var a;;){if(0===e.lookahead&&(re(e),0===e.lookahead)){if(t===h)return G;break}if(e.match_length=0,a=r._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,a&&(te(e,!1),0===e.strm.avail_out))return G}return e.insert=0,t===f?(te(e,!0),0===e.strm.avail_out?W:q):e.last_lit&&(te(e,!1),0===e.strm.avail_out)?G:X}(i,t):i.strategy===y?function(e,t){for(var a,n,i,s,l=e.window;;){if(e.lookahead<=I){if(re(e),e.lookahead<=I&&t===h)return G;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=U&&e.strstart>0&&(n=l[i=e.strstart-1])===l[++i]&&n===l[++i]&&n===l[++i]){s=e.strstart+I;do{}while(n===l[++i]&&n===l[++i]&&n===l[++i]&&n===l[++i]&&n===l[++i]&&n===l[++i]&&n===l[++i]&&n===l[++i]&&ie.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=U?(a=r._tr_tally(e,1,e.match_length-U),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(a=r._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),a&&(te(e,!1),0===e.strm.avail_out))return G}return e.insert=0,t===f?(te(e,!0),0===e.strm.avail_out?W:q):e.last_lit&&(te(e,!1),0===e.strm.avail_out)?G:X}(i,t):n[i.level].func(i,t);if(p!==W&&p!==q||(i.status=Y),p===G||p===W)return 0===e.avail_out&&(i.last_flush=-1),c;if(p===X&&(t===d?r._tr_align(i):t!==u&&(r._tr_stored_block(i,0,0,!1),t===_&&($(i.head),0===i.lookahead&&(i.strstart=0,i.block_start=0,i.insert=0))),ee(e),0===e.avail_out))return i.last_flush=-1,c}return t!==f?c:i.wrap<=0?b:(2===i.wrap?(ae(i,255&e.adler),ae(i,e.adler>>8&255),ae(i,e.adler>>16&255),ae(i,e.adler>>24&255),ae(i,255&e.total_in),ae(i,e.total_in>>8&255),ae(i,e.total_in>>16&255),ae(i,e.total_in>>24&255)):(ne(i,e.adler>>>16),ne(i,65535&e.adler)),ee(e),i.wrap>0&&(i.wrap=-i.wrap),0!==i.pending?c:b)},t.deflateEnd=function(e){var t;return e&&e.state?(t=e.state.status)!==M&&t!==j&&t!==C&&t!==P&&t!==H&&t!==K&&t!==Y?Q(e,g):(e.state=null,t===K?Q(e,m):c):g},t.deflateSetDictionary=function(e,t){var a,n,r,l,o,h,d,_,f=t.length;if(!e||!e.state)return g;if(2===(l=(a=e.state).wrap)||1===l&&a.status!==M||a.lookahead)return g;for(1===l&&(e.adler=s(e.adler,t,f,0)),a.wrap=0,f>=a.w_size&&(0===l&&($(a.head),a.strstart=0,a.block_start=0,a.insert=0),_=new i.Buf8(a.w_size),i.arraySet(_,t,f-a.w_size,a.w_size,0),t=_,f=a.w_size),o=e.avail_in,h=e.next_in,d=e.input,e.avail_in=f,e.next_in=0,e.input=t,re(a);a.lookahead>=U;){n=a.strstart,r=a.lookahead-(U-1);do{a.ins_h=(a.ins_h<>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function ie(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new n.Buf16(320),this.work=new n.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function re(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg=\"\",t.wrap&&(e.adler=1&t.wrap),t.mode=y,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new n.Buf32(ee),t.distcode=t.distdyn=new n.Buf32(te),t.sane=1,t.back=-1,c):m}function se(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,re(e)):m}function le(e,t){var a,n;return e&&e.state?(n=e.state,t<0?(a=0,t=-t):(a=1+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?m:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=a,n.wbits=t,se(e))):m}function oe(e,t){var a,n;return e?(n=new ie,e.state=n,n.window=null,(a=le(e,t))!==c&&(e.state=null),a):m}var he,de,_e=!0;function fe(e){if(_e){var t;for(he=new n.Buf32(512),de=new n.Buf32(32),t=0;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(l(h,e.lens,0,288,he,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;l(d,e.lens,0,32,de,0,e.work,{bits:5}),_e=!1}e.lencode=he,e.lenbits=9,e.distcode=de,e.distbits=5}function ue(e,t,a,i){var r,s=e.state;return null===s.window&&(s.wsize=1<=s.wsize?(n.arraySet(s.window,t,a-s.wsize,s.wsize,0),s.wnext=0,s.whave=s.wsize):((r=s.wsize-s.wnext)>i&&(r=i),n.arraySet(s.window,t,a-i,r,s.wnext),(i-=r)?(n.arraySet(s.window,t,a-i,i,0),s.wnext=i,s.whave=s.wsize):(s.wnext+=r,s.wnext===s.wsize&&(s.wnext=0),s.whave>>8&255,a.check=r(a.check,Ae,2,0),le=0,oe=0,a.mode=x;break}if(a.flags=0,a.head&&(a.head.done=!1),!(1&a.wrap)||(((255&le)<<8)+(le>>8))%31){e.msg=\"incorrect header check\",a.mode=Q;break}if((15&le)!==k){e.msg=\"unknown compression method\",a.mode=Q;break}if(oe-=4,ye=8+(15&(le>>>=4)),0===a.wbits)a.wbits=ye;else if(ye>a.wbits){e.msg=\"invalid window size\",a.mode=Q;break}a.dmax=1<>8&1),512&a.flags&&(Ae[0]=255&le,Ae[1]=le>>>8&255,a.check=r(a.check,Ae,2,0)),le=0,oe=0,a.mode=z;case z:for(;oe<32;){if(0===re)break e;re--,le+=ee[ae++]<>>8&255,Ae[2]=le>>>16&255,Ae[3]=le>>>24&255,a.check=r(a.check,Ae,4,0)),le=0,oe=0,a.mode=S;case S:for(;oe<16;){if(0===re)break e;re--,le+=ee[ae++]<>8),512&a.flags&&(Ae[0]=255&le,Ae[1]=le>>>8&255,a.check=r(a.check,Ae,2,0)),le=0,oe=0,a.mode=E;case E:if(1024&a.flags){for(;oe<16;){if(0===re)break e;re--,le+=ee[ae++]<>>8&255,a.check=r(a.check,Ae,2,0)),le=0,oe=0}else a.head&&(a.head.extra=null);a.mode=A;case A:if(1024&a.flags&&((_e=a.length)>re&&(_e=re),_e&&(a.head&&(ye=a.head.extra_len-a.length,a.head.extra||(a.head.extra=new Array(a.head.extra_len)),n.arraySet(a.head.extra,ee,ae,_e,ye)),512&a.flags&&(a.check=r(a.check,ee,_e,ae)),re-=_e,ae+=_e,a.length-=_e),a.length))break e;a.length=0,a.mode=Z;case Z:if(2048&a.flags){if(0===re)break e;_e=0;do{ye=ee[ae+_e++],a.head&&ye&&a.length<65536&&(a.head.name+=String.fromCharCode(ye))}while(ye&&_e>9&1,a.head.done=!0),e.adler=a.check=0,a.mode=N;break;case B:for(;oe<32;){if(0===re)break e;re--,le+=ee[ae++]<>>=7&oe,oe-=7&oe,a.mode=W;break}for(;oe<3;){if(0===re)break e;re--,le+=ee[ae++]<>>=1)){case 0:a.mode=U;break;case 1:if(fe(a),a.mode=C,t===u){le>>>=2,oe-=2;break e}break;case 2:a.mode=L;break;case 3:e.msg=\"invalid block type\",a.mode=Q}le>>>=2,oe-=2;break;case U:for(le>>>=7&oe,oe-=7&oe;oe<32;){if(0===re)break e;re--,le+=ee[ae++]<>>16^65535)){e.msg=\"invalid stored block lengths\",a.mode=Q;break}if(a.length=65535&le,le=0,oe=0,a.mode=I,t===u)break e;case I:a.mode=F;case F:if(_e=a.length){if(_e>re&&(_e=re),_e>se&&(_e=se),0===_e)break e;n.arraySet(te,ee,ae,_e,ie),re-=_e,ae+=_e,se-=_e,ie+=_e,a.length-=_e;break}a.mode=N;break;case L:for(;oe<14;){if(0===re)break e;re--,le+=ee[ae++]<>>=5,oe-=5,a.ndist=1+(31&le),le>>>=5,oe-=5,a.ncode=4+(15&le),le>>>=4,oe-=4,a.nlen>286||a.ndist>30){e.msg=\"too many length or distance symbols\",a.mode=Q;break}a.have=0,a.mode=M;case M:for(;a.have>>=3,oe-=3}for(;a.have<19;)a.lens[Ze[a.have++]]=0;if(a.lencode=a.lendyn,a.lenbits=7,ze={bits:a.lenbits},xe=l(o,a.lens,0,19,a.lencode,0,a.work,ze),a.lenbits=ze.bits,xe){e.msg=\"invalid code lengths set\",a.mode=Q;break}a.have=0,a.mode=j;case j:for(;a.have>>16&255,we=65535&Ee,!((ge=Ee>>>24)<=oe);){if(0===re)break e;re--,le+=ee[ae++]<>>=ge,oe-=ge,a.lens[a.have++]=we;else{if(16===we){for(Se=ge+2;oe>>=ge,oe-=ge,0===a.have){e.msg=\"invalid bit length repeat\",a.mode=Q;break}ye=a.lens[a.have-1],_e=3+(3&le),le>>>=2,oe-=2}else if(17===we){for(Se=ge+3;oe>>=ge)),le>>>=3,oe-=3}else{for(Se=ge+7;oe>>=ge)),le>>>=7,oe-=7}if(a.have+_e>a.nlen+a.ndist){e.msg=\"invalid bit length repeat\",a.mode=Q;break}for(;_e--;)a.lens[a.have++]=ye}}if(a.mode===Q)break;if(0===a.lens[256]){e.msg=\"invalid code -- missing end-of-block\",a.mode=Q;break}if(a.lenbits=9,ze={bits:a.lenbits},xe=l(h,a.lens,0,a.nlen,a.lencode,0,a.work,ze),a.lenbits=ze.bits,xe){e.msg=\"invalid literal/lengths set\",a.mode=Q;break}if(a.distbits=6,a.distcode=a.distdyn,ze={bits:a.distbits},xe=l(d,a.lens,a.nlen,a.ndist,a.distcode,0,a.work,ze),a.distbits=ze.bits,xe){e.msg=\"invalid distances set\",a.mode=Q;break}if(a.mode=C,t===u)break e;case C:a.mode=P;case P:if(re>=6&&se>=258){e.next_out=ie,e.avail_out=se,e.next_in=ae,e.avail_in=re,a.hold=le,a.bits=oe,s(e,de),ie=e.next_out,te=e.output,se=e.avail_out,ae=e.next_in,ee=e.input,re=e.avail_in,le=a.hold,oe=a.bits,a.mode===N&&(a.back=-1);break}for(a.back=0;me=(Ee=a.lencode[le&(1<>>16&255,we=65535&Ee,!((ge=Ee>>>24)<=oe);){if(0===re)break e;re--,le+=ee[ae++]<>pe)])>>>16&255,we=65535&Ee,!(pe+(ge=Ee>>>24)<=oe);){if(0===re)break e;re--,le+=ee[ae++]<>>=pe,oe-=pe,a.back+=pe}if(le>>>=ge,oe-=ge,a.back+=ge,a.length=we,0===me){a.mode=X;break}if(32&me){a.back=-1,a.mode=N;break}if(64&me){e.msg=\"invalid literal/length code\",a.mode=Q;break}a.extra=15&me,a.mode=H;case H:if(a.extra){for(Se=a.extra;oe>>=a.extra,oe-=a.extra,a.back+=a.extra}a.was=a.length,a.mode=K;case K:for(;me=(Ee=a.distcode[le&(1<>>16&255,we=65535&Ee,!((ge=Ee>>>24)<=oe);){if(0===re)break e;re--,le+=ee[ae++]<>pe)])>>>16&255,we=65535&Ee,!(pe+(ge=Ee>>>24)<=oe);){if(0===re)break e;re--,le+=ee[ae++]<>>=pe,oe-=pe,a.back+=pe}if(le>>>=ge,oe-=ge,a.back+=ge,64&me){e.msg=\"invalid distance code\",a.mode=Q;break}a.offset=we,a.extra=15&me,a.mode=Y;case Y:if(a.extra){for(Se=a.extra;oe>>=a.extra,oe-=a.extra,a.back+=a.extra}if(a.offset>a.dmax){e.msg=\"invalid distance too far back\",a.mode=Q;break}a.mode=G;case G:if(0===se)break e;if(_e=de-se,a.offset>_e){if((_e=a.offset-_e)>a.whave&&a.sane){e.msg=\"invalid distance too far back\",a.mode=Q;break}_e>a.wnext?(_e-=a.wnext,ce=a.wsize-_e):ce=a.wnext-_e,_e>a.length&&(_e=a.length),be=a.window}else be=te,ce=ie-a.offset,_e=a.length;_e>se&&(_e=se),se-=_e,a.length-=_e;do{te[ie++]=be[ce++]}while(--_e);0===a.length&&(a.mode=P);break;case X:if(0===se)break e;te[ie++]=a.length,se--,a.mode=P;break;case W:if(a.wrap){for(;oe<32;){if(0===re)break e;re--,le|=ee[ae++]<>>16&65535|0,s=0;0!==a;){a-=s=a>2e3?2e3:a;do{r=r+(i=i+t[n++]|0)|0}while(--s);i%=65521,r%=65521}return i|r<<16|0}},function(e,t,a){\"use strict\";var n=function(){for(var e,t=[],a=0;a<256;a++){e=a;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[a]=e}return t}();e.exports=function(e,t,a,i){var r=n,s=i+a;e^=-1;for(var l=i;l>>8^r[255&(e^t[l])];return-1^e}},function(e,t,a){\"use strict\";var n=a(2),i=4,r=0,s=1,l=2;function o(e){for(var t=e.length;--t>=0;)e[t]=0}var h=0,d=1,_=2,f=29,u=256,c=u+1+f,b=30,g=19,m=2*c+1,w=15,p=16,v=7,k=256,y=16,x=17,z=18,S=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],E=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],A=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],Z=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],O=new Array(2*(c+2));o(O);var R=new Array(2*b);o(R);var B=new Array(512);o(B);var T=new Array(256);o(T);var N=new Array(f);o(N);var D,U,I,F=new Array(b);function L(e,t,a,n,i){this.static_tree=e,this.extra_bits=t,this.extra_base=a,this.elems=n,this.max_length=i,this.has_stree=e&&e.length}function M(e,t){this.dyn_tree=e,this.max_code=0,this.stat_desc=t}function j(e){return e<256?B[e]:B[256+(e>>>7)]}function C(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function P(e,t,a){e.bi_valid>p-a?(e.bi_buf|=t<>p-e.bi_valid,e.bi_valid+=a-p):(e.bi_buf|=t<>>=1,a<<=1}while(--t>0);return a>>>1}function Y(e,t,a){var n,i,r=new Array(w+1),s=0;for(n=1;n<=w;n++)r[n]=s=s+a[n-1]<<1;for(i=0;i<=t;i++){var l=e[2*i+1];0!==l&&(e[2*i]=K(r[l]++,l))}}function G(e){var t;for(t=0;t8?C(e,e.bi_buf):e.bi_valid>0&&(e.pending_buf[e.pending++]=e.bi_buf),e.bi_buf=0,e.bi_valid=0}function W(e,t,a,n){var i=2*t,r=2*a;return e[i]>1;a>=1;a--)q(e,r,a);i=o;do{a=e.heap[1],e.heap[1]=e.heap[e.heap_len--],q(e,r,1),n=e.heap[1],e.heap[--e.heap_max]=a,e.heap[--e.heap_max]=n,r[2*i]=r[2*a]+r[2*n],e.depth[i]=(e.depth[a]>=e.depth[n]?e.depth[a]:e.depth[n])+1,r[2*a+1]=r[2*n+1]=i,e.heap[1]=i++,q(e,r,1)}while(e.heap_len>=2);e.heap[--e.heap_max]=e.heap[1],function(e,t){var a,n,i,r,s,l,o=t.dyn_tree,h=t.max_code,d=t.stat_desc.static_tree,_=t.stat_desc.has_stree,f=t.stat_desc.extra_bits,u=t.stat_desc.extra_base,c=t.stat_desc.max_length,b=0;for(r=0;r<=w;r++)e.bl_count[r]=0;for(o[2*e.heap[e.heap_max]+1]=0,a=e.heap_max+1;ac&&(r=c,b++),o[2*n+1]=r,n>h||(e.bl_count[r]++,s=0,n>=u&&(s=f[n-u]),l=o[2*n],e.opt_len+=l*(r+s),_&&(e.static_len+=l*(d[2*n+1]+s)));if(0!==b){do{for(r=c-1;0===e.bl_count[r];)r--;e.bl_count[r]--,e.bl_count[r+1]+=2,e.bl_count[c]--,b-=2}while(b>0);for(r=c;0!==r;r--)for(n=e.bl_count[r];0!==n;)(i=e.heap[--a])>h||(o[2*i+1]!==r&&(e.opt_len+=(r-o[2*i+1])*o[2*i],o[2*i+1]=r),n--)}}(e,t),Y(r,h,e.bl_count)}function V(e,t,a){var n,i,r=-1,s=t[1],l=0,o=7,h=4;for(0===s&&(o=138,h=3),t[2*(a+1)+1]=65535,n=0;n<=a;n++)i=s,s=t[2*(n+1)+1],++l>=7;n0?(e.strm.data_type===l&&(e.strm.data_type=function(e){var t,a=4093624447;for(t=0;t<=31;t++,a>>>=1)if(1&a&&0!==e.dyn_ltree[2*t])return r;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return s;for(t=32;t=3&&0===e.bl_tree[2*Z[t]+1];t--);return e.opt_len+=3*(t+1)+5+5+4,t}(e),o=e.opt_len+3+7>>>3,(h=e.static_len+3+7>>>3)<=o&&(o=h)):o=h=a+5,a+4<=o&&-1!==t?te(e,t,a,n):e.strategy===i||h===o?(P(e,(d<<1)+(n?1:0),3),J(e,O,R)):(P(e,(_<<1)+(n?1:0),3),function(e,t,a,n){var i;for(P(e,t-257,5),P(e,a-1,5),P(e,n-4,4),i=0;i>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&a,e.last_lit++,0===t?e.dyn_ltree[2*a]++:(e.matches++,t--,e.dyn_ltree[2*(T[a]+u+1)]++,e.dyn_dtree[2*j(t)]++),e.last_lit===e.lit_bufsize-1},t._tr_align=function(e){P(e,d<<1,3),H(e,k,O),function(e){16===e.bi_valid?(C(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):e.bi_valid>=8&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}(e)}},function(e,t,a){\"use strict\";e.exports=function(e,t){var a,n,i,r,s,l,o,h,d,_,f,u,c,b,g,m,w,p,v,k,y,x,z,S,E;a=e.state,n=e.next_in,S=e.input,i=n+(e.avail_in-5),r=e.next_out,E=e.output,s=r-(t-e.avail_out),l=r+(e.avail_out-257),o=a.dmax,h=a.wsize,d=a.whave,_=a.wnext,f=a.window,u=a.hold,c=a.bits,b=a.lencode,g=a.distcode,m=(1<>>=v=p>>>24,c-=v,0===(v=p>>>16&255))E[r++]=65535&p;else{if(!(16&v)){if(0==(64&v)){p=b[(65535&p)+(u&(1<>>=v,c-=v),c<15&&(u+=S[n++]<>>=v=p>>>24,c-=v,!(16&(v=p>>>16&255))){if(0==(64&v)){p=g[(65535&p)+(u&(1<o){e.msg=\"invalid distance too far back\",a.mode=30;break e}if(u>>>=v,c-=v,y>(v=r-s)){if((v=y-v)>d&&a.sane){e.msg=\"invalid distance too far back\",a.mode=30;break e}if(x=0,z=f,0===_){if(x+=h-v,v2;)E[r++]=z[x++],E[r++]=z[x++],E[r++]=z[x++],k-=3;k&&(E[r++]=z[x++],k>1&&(E[r++]=z[x++]))}else{x=r-y;do{E[r++]=E[x++],E[r++]=E[x++],E[r++]=E[x++],k-=3}while(k>2);k&&(E[r++]=E[x++],k>1&&(E[r++]=E[x++]))}break}}break}}while(n>3,u&=(1<<(c-=k<<3))-1,e.next_in=n,e.next_out=r,e.avail_in=n=1&&0===U[E];E--);if(A>E&&(A=E),0===E)return h[d++]=20971520,h[d++]=20971520,f.bits=1,0;for(S=1;S0&&(0===e||1!==E))return-1;for(I[1]=0,x=1;x<15;x++)I[x+1]=I[x]+U[x];for(z=0;z852||2===e&&B>592)return 1;for(;;){p=x-O,_[z]w?(v=F[L+_[z]],k=N[D+_[z]]):(v=96,k=0),u=1<>O)+(c-=u)]=p<<24|v<<16|k|0}while(0!==c);for(u=1<>=1;if(0!==u?(T&=u-1,T+=u):T=0,z++,0==--U[x]){if(x===E)break;x=t[a+_[z]]}if(x>A&&(T&g)!==b){for(0===O&&(O=A),m+=S,R=1<<(Z=x-O);Z+O852||2===e&&B>592)return 1;h[b=T&g]=A<<24|Z<<16|m-d|0}}return 0!==T&&(h[m+T]=x-O<<24|64<<16|0),f.bits=A,0}},function(e,t,a){\"use strict\";a.r(t);var n=a(3),i=a.n(n),r=a(4),s=a(5),l=a(1),o=a.n(l),h=a(0),d=16384,_=15;function f(e,t){var a=this;this.inflatedReady=e,this.deflatedReady=t,this._inflate=function(e){var t=new i.a,a=Object(s.inflateInit2)(t,_);if(a!==h.Z_OK)throw new Error(\"Problem initializing inflate stream: \"+o.a[a]);return function(a){if(void 0===a)return e();var n,i,r;t.input=a,t.next_in=0,t.avail_in=t.input.length;var l=!0;do{if(0===t.avail_out&&(t.output=new Uint8Array(d),n=t.next_out=0,t.avail_out=d),(i=Object(s.inflate)(t,h.Z_NO_FLUSH))!==h.Z_STREAM_END&&i!==h.Z_OK)throw new Error(\"inflate problem: \"+o.a[i]);t.next_out&&(0!==t.avail_out&&i!==h.Z_STREAM_END||(r=t.output.subarray(n,n=t.next_out),l=e(r)))}while(t.avail_in>0&&i!==h.Z_STREAM_END);return t.next_out>n&&(r=t.output.subarray(n,n=t.next_out),l=e(r)),l}}(function(e){return a.inflatedReady(e.buffer.slice(e.byteOffset,e.byteOffset+e.length))}),this._deflate=function(e){var t=new i.a,a=Object(r.deflateInit2)(t,h.Z_DEFAULT_COMPRESSION,h.Z_DEFLATED,_,8,h.Z_DEFAULT_STRATEGY);if(a!==h.Z_OK)throw new Error(\"Problem initializing deflate stream: \"+o.a[a]);return function(a){if(void 0===a)return e();var n,i,s;t.input=a,t.next_in=0,t.avail_in=t.input.length;var l=!0;do{if(0===t.avail_out&&(t.output=new Uint8Array(d),s=t.next_out=0,t.avail_out=d),(n=Object(r.deflate)(t,h.Z_SYNC_FLUSH))!==h.Z_STREAM_END&&n!==h.Z_OK)throw new Error(\"Deflate problem: \"+o.a[n]);0===t.avail_out&&t.next_out>s&&(i=t.output.subarray(s,s=t.next_out),l=e(i))}while((t.avail_in>0||0===t.avail_out)&&n!==h.Z_STREAM_END);return t.next_out>s&&(i=t.output.subarray(s,s=t.next_out),l=e(i)),l}}(function(e){return a.deflatedReady(e.buffer.slice(e.byteOffset,e.byteOffset+e.length))})}f.prototype.inflate=function(e){this._inflate(new Uint8Array(e))},f.prototype.deflate=function(e){this._deflate(new Uint8Array(e))};var u=function(e,t){return{message:e,buffer:t}},c=new f(function(e){return self.postMessage(u(\"inflated_ready\",e),[e])},function(e){return self.postMessage(u(\"deflated_ready\",e),[e])});self.onmessage=function(e){var t=e.data.message,a=e.data.buffer;switch(t){case\"start\":break;case\"inflate\":c.inflate(a);break;case\"deflate\":c.deflate(a)}}}]);"; // -// constants used for communication with the worker -// - -const MESSAGE_INITIALIZE_WORKER = 'start'; -const MESSAGE_INFLATE = 'inflate'; -const MESSAGE_INFLATED_DATA_READY = 'inflated_ready'; -const MESSAGE_DEFLATE = 'deflate'; -const MESSAGE_DEFLATED_DATA_READY = 'deflated_ready'; -const EOL = '\r\n'; -const LINE_FEED = 10; -const CARRIAGE_RETURN = 13; -const LEFT_CURLY_BRACKET = 123; -const RIGHT_CURLY_BRACKET = 125; -const ASCII_PLUS = 43; // State tracking when constructing an IMAP command from buffers. - -const BUFFER_STATE_LITERAL = 'literal'; -const BUFFER_STATE_POSSIBLY_LITERAL_LENGTH_1 = 'literal_length_1'; -const BUFFER_STATE_POSSIBLY_LITERAL_LENGTH_2 = 'literal_length_2'; -const BUFFER_STATE_DEFAULT = 'default'; -/** - * How much time to wait since the last response until the connection is considered idling - */ - -const TIMEOUT_ENTER_IDLE = 1000; -/** - * Lower Bound for socket timeout to wait since the last data was written to a socket - */ - -const TIMEOUT_SOCKET_LOWER_BOUND = 10000; -/** - * Multiplier for socket timeout: - * - * We assume at least a GPRS connection with 115 kb/s = 14,375 kB/s tops, so 10 KB/s to be on - * the safe side. We can timeout after a lower bound of 10s + (n KB / 10 KB/s). A 1 MB message - * upload would be 110 seconds to wait for the timeout. 10 KB/s === 0.1 s/B - */ - -const TIMEOUT_SOCKET_MULTIPLIER = 0.1; -/** - * Creates a connection object to an IMAP server. Call `connect` method to inititate - * the actual connection, the constructor only defines the properties but does not actually connect. - * - * @constructor - * - * @param {String} [host='localhost'] Hostname to conenct to - * @param {Number} [port=143] Port number to connect to - * @param {Object} [options] Optional options object - * @param {Boolean} [options.useSecureTransport] Set to true, to use encrypted connection - * @param {String} [options.compressionWorkerPath] offloads de-/compression computation to a web worker, this is the path to the browserified emailjs-compressor-worker.js - */ - -class Imap { - constructor(host, port, options = {}) { - this.timeoutEnterIdle = TIMEOUT_ENTER_IDLE; - this.timeoutSocketLowerBound = TIMEOUT_SOCKET_LOWER_BOUND; - this.timeoutSocketMultiplier = TIMEOUT_SOCKET_MULTIPLIER; - this.options = options; - this.port = port || (this.options.useSecureTransport ? 993 : 143); - this.host = host || 'localhost'; // Use a TLS connection. Port 993 also forces TLS. - - this.options.useSecureTransport = 'useSecureTransport' in this.options ? !!this.options.useSecureTransport : this.port === 993; - this.secureMode = !!this.options.useSecureTransport; // Does the connection use SSL/TLS - - this._connectionReady = false; // Is the conection established and greeting is received from the server - - this._globalAcceptUntagged = {}; // Global handlers for unrelated responses (EXPUNGE, EXISTS etc.) - - this._clientQueue = []; // Queue of outgoing commands - - this._canSend = false; // Is it OK to send something to the server - - this._tagCounter = 0; // Counter to allow uniqueue imap tags - - this._currentCommand = false; // Current command that is waiting for response from the server - - this._idleTimer = false; // Timer waiting to enter idle - - this._socketTimeoutTimer = false; // Timer waiting to declare the socket dead starting from the last write - - this.compressed = false; // Is the connection compressed and needs inflating/deflating - // - // HELPERS - // - // As the server sends data in chunks, it needs to be split into separate lines. Helps parsing the input. - - this._incomingBuffers = []; - this._bufferState = BUFFER_STATE_DEFAULT; - this._literalRemaining = 0; // - // Event placeholders, may be overriden with callback functions - // - - this.oncert = null; - this.onerror = null; // Irrecoverable error occurred. Connection to the server will be closed automatically. - - this.onready = null; // The connection to the server has been established and greeting is received - - this.onidle = null; // There are no more commands to process - } // PUBLIC METHODS - - /** - * Initiate a connection to the server. Wait for onready event - * - * @param {Object} Socket - * TESTING ONLY! The TCPSocket has a pretty nonsensical convenience constructor, - * which makes it hard to mock. For dependency-injection purposes, we use the - * Socket parameter to pass in a mock Socket implementation. Should be left blank - * in production use! - * @returns {Promise} Resolves when socket is opened - */ - - - connect(Socket = _emailjsTcpSocket.default) { - return new Promise((resolve, reject) => { - this.socket = Socket.open(this.host, this.port, { - binaryType: 'arraybuffer', - useSecureTransport: this.secureMode, - ca: this.options.ca - }); // allows certificate handling for platform w/o native tls support - // oncert is non standard so setting it might throw if the socket object is immutable - - try { - this.socket.oncert = cert => { - this.oncert && this.oncert(cert); - }; - } catch (E) {} // Connection closing unexpected is an error - - - this.socket.onclose = () => this._onError(new Error('Socket closed unexpectedly!')); - - this.socket.ondata = evt => { - try { - this._onData(evt); - } catch (err) { - this._onError(err); - } - }; // if an error happens during create time, reject the promise - - - this.socket.onerror = e => { - reject(new Error('Could not open socket: ' + e.data.message)); - }; - - this.socket.onopen = () => { - // use proper "irrecoverable error, tear down everything"-handler only after socket is open - this.socket.onerror = e => this._onError(e); - - resolve(); - }; - }); - } - /** - * Closes the connection to the server - * - * @returns {Promise} Resolves when the socket is closed - */ - - - close(error) { - return new Promise(resolve => { - var tearDown = () => { - // fulfill pending promises - this._clientQueue.forEach(cmd => cmd.callback(error)); - - if (this._currentCommand) { - this._currentCommand.callback(error); - } - - this._clientQueue = []; - this._currentCommand = false; - clearTimeout(this._idleTimer); - this._idleTimer = null; - clearTimeout(this._socketTimeoutTimer); - this._socketTimeoutTimer = null; - - if (this.socket) { - // remove all listeners - this.socket.onopen = null; - this.socket.onclose = null; - this.socket.ondata = null; - this.socket.onerror = null; - - try { - this.socket.oncert = null; - } catch (E) {} - - this.socket = null; - } - - resolve(); - }; - - this._disableCompression(); - - if (!this.socket || this.socket.readyState !== 'open') { - return tearDown(); - } - - this.socket.onclose = this.socket.onerror = tearDown; // we don't really care about the error here - - this.socket.close(); - }); - } - /** - * Send LOGOUT to the server. - * - * Use is discouraged! - * - * @returns {Promise} Resolves when connection is closed by server. - */ - - - logout() { - return new Promise((resolve, reject) => { - this.socket.onclose = this.socket.onerror = () => { - this.close('Client logging out').then(resolve).catch(reject); - }; - - this.enqueueCommand('LOGOUT'); - }); - } - /** - * Initiates TLS handshake - */ - - - upgrade() { - this.secureMode = true; - this.socket.upgradeToSecure(); - } - /** - * Schedules a command to be sent to the server. - * See https://github.com/emailjs/emailjs-imap-handler for request structure. - * Do not provide a tag property, it will be set by the queue manager. - * - * To catch untagged responses use acceptUntagged property. For example, if - * the value for it is 'FETCH' then the reponse includes 'payload.FETCH' property - * that is an array including all listed * FETCH responses. - * - * @param {Object} request Structured request object - * @param {Array} acceptUntagged a list of untagged responses that will be included in 'payload' property - * @param {Object} [options] Optional data for the command payload - * @returns {Promise} Promise that resolves when the corresponding response was received - */ - - - enqueueCommand(request, acceptUntagged, options) { - if (typeof request === 'string') { - request = { - command: request - }; - } - - acceptUntagged = [].concat(acceptUntagged || []).map(untagged => (untagged || '').toString().toUpperCase().trim()); - var tag = 'W' + ++this._tagCounter; - request.tag = tag; - return new Promise((resolve, reject) => { - var data = { - tag: tag, - request: request, - payload: acceptUntagged.length ? {} : undefined, - callback: response => { - if (this.isError(response)) { - return reject(response); - } else if (['NO', 'BAD'].indexOf((0, _ramda.propOr)('', 'command', response).toUpperCase().trim()) >= 0) { - var error = new Error(response.humanReadable || 'Error'); - - if (response.code) { - error.code = response.code; - } - - return reject(error); - } - - resolve(response); - } - }; // apply any additional options to the command - - Object.keys(options || {}).forEach(key => { - data[key] = options[key]; - }); - acceptUntagged.forEach(command => { - data.payload[command] = []; - }); // if we're in priority mode (i.e. we ran commands in a precheck), - // queue any commands BEFORE the command that contianed the precheck, - // otherwise just queue command as usual - - var index = data.ctx ? this._clientQueue.indexOf(data.ctx) : -1; - - if (index >= 0) { - data.tag += '.p'; - data.request.tag += '.p'; - - this._clientQueue.splice(index, 0, data); - } else { - this._clientQueue.push(data); - } - - if (this._canSend) { - this._sendRequest(); - } - }); - } - /** - * - * @param commands - * @param ctx - * @returns {*} - */ - - - getPreviouslyQueued(commands, ctx) { - const startIndex = this._clientQueue.indexOf(ctx) - 1; // search backwards for the commands and return the first found - - for (let i = startIndex; i >= 0; i--) { - if (isMatch(this._clientQueue[i])) { - return this._clientQueue[i]; - } - } // also check current command if no SELECT is queued - - - if (isMatch(this._currentCommand)) { - return this._currentCommand; - } - - return false; - - function isMatch(data) { - return data && data.request && commands.indexOf(data.request.command) >= 0; - } - } - /** - * Send data to the TCP socket - * Arms a timeout waiting for a response from the server. - * - * @param {String} str Payload - */ - - - send(str) { - const buffer = (0, _common.toTypedArray)(str).buffer; - const timeout = this.timeoutSocketLowerBound + Math.floor(buffer.byteLength * this.timeoutSocketMultiplier); - clearTimeout(this._socketTimeoutTimer); // clear pending timeouts - - this._socketTimeoutTimer = setTimeout(() => this._onError(new Error(' Socket timed out!')), timeout); // arm the next timeout - - if (this.compressed) { - this._sendCompressed(buffer); - } else { - try { - this.socket.send(buffer); - } catch (e) { - this.logger.error('Socket has been closed or gone missing!', str); - return this._onError(e); - } - } - } - /** - * Set a global handler for an untagged response. If currently processed command - * has not listed untagged command it is forwarded to the global handler. Useful - * with EXPUNGE, EXISTS etc. - * - * @param {String} command Untagged command name - * @param {Function} callback Callback function with response object and continue callback function - */ - - - setHandler(command, callback) { - this._globalAcceptUntagged[command.toUpperCase().trim()] = callback; - } // INTERNAL EVENTS - - /** - * Error handler for the socket - * - * @event - * @param {Event} evt Event object. See evt.data for the error - */ - - - _onError(evt) { - var error; - - if (this.isError(evt)) { - error = evt; - } else if (evt && this.isError(evt.data)) { - error = evt.data; - } else { - error = new Error(evt && evt.data && evt.data.message || evt.data || evt || 'Error'); - } - - this.logger.error(error); // always call onerror callback, no matter if close() succeeds or fails - - this.close(error).then(() => { - this.onerror && this.onerror(error); - }, () => { - this.onerror && this.onerror(error); - }); - } - /** - * Handler for incoming data from the server. The data is sent in arbitrary - * chunks and can't be used directly so this function makes sure the data - * is split into complete lines before the data is passed to the command - * handler - * - * @param {Event} evt - */ - - - _onData(evt) { - clearTimeout(this._socketTimeoutTimer); // reset the timeout on each data packet - - const timeout = this.timeoutSocketLowerBound + Math.floor(4096 * this.timeoutSocketMultiplier); // max packet size is 4096 bytes - - this._socketTimeoutTimer = setTimeout(() => this._onError(new Error(' Socket timed out!')), timeout); - - this._incomingBuffers.push(new Uint8Array(evt.data)); // append to the incoming buffer - - - this._parseIncomingCommands(this._iterateIncomingBuffer()); // Consume the incoming buffer - - } - - *_iterateIncomingBuffer() { - let buf = this._incomingBuffers[this._incomingBuffers.length - 1] || []; - let i = 0; // loop invariant: - // this._incomingBuffers starts with the beginning of incoming command. - // buf is shorthand for last element of this._incomingBuffers. - // buf[0..i-1] is part of incoming command. - - while (i < buf.length) { - switch (this._bufferState) { - case BUFFER_STATE_LITERAL: - const diff = Math.min(buf.length - i, this._literalRemaining); - this._literalRemaining -= diff; - i += diff; - - if (this._literalRemaining === 0) { - this._bufferState = BUFFER_STATE_DEFAULT; - } - - continue; - - case BUFFER_STATE_POSSIBLY_LITERAL_LENGTH_2: - if (i < buf.length) { - if (buf[i] === CARRIAGE_RETURN) { - this._literalRemaining = Number((0, _common.fromTypedArray)(this._lengthBuffer)) + 2; // for CRLF - - this._bufferState = BUFFER_STATE_LITERAL; - } else { - this._bufferState = BUFFER_STATE_DEFAULT; - } - - delete this._lengthBuffer; - } - - continue; - - case BUFFER_STATE_POSSIBLY_LITERAL_LENGTH_1: - const start = i; - - while (i < buf.length && buf[i] >= 48 && buf[i] <= 57) { - // digits - i++; - } - - if (start !== i) { - const latest = buf.subarray(start, i); - const prevBuf = this._lengthBuffer; - this._lengthBuffer = new Uint8Array(prevBuf.length + latest.length); - - this._lengthBuffer.set(prevBuf); - - this._lengthBuffer.set(latest, prevBuf.length); - } - - if (i < buf.length) { - if (this._lengthBuffer.length > 0 && buf[i] === RIGHT_CURLY_BRACKET) { - this._bufferState = BUFFER_STATE_POSSIBLY_LITERAL_LENGTH_2; - } else { - delete this._lengthBuffer; - this._bufferState = BUFFER_STATE_DEFAULT; - } - - i++; - } - - continue; - - default: - // find literal length - const leftIdx = buf.indexOf(LEFT_CURLY_BRACKET, i); - - if (leftIdx > -1) { - const leftOfLeftCurly = new Uint8Array(buf.buffer, i, leftIdx - i); - - if (leftOfLeftCurly.indexOf(LINE_FEED) === -1) { - i = leftIdx + 1; - this._lengthBuffer = new Uint8Array(0); - this._bufferState = BUFFER_STATE_POSSIBLY_LITERAL_LENGTH_1; - continue; - } - } // find end of command - - - const LFidx = buf.indexOf(LINE_FEED, i); - - if (LFidx > -1) { - if (LFidx < buf.length - 1) { - this._incomingBuffers[this._incomingBuffers.length - 1] = new Uint8Array(buf.buffer, 0, LFidx + 1); - } - - const commandLength = this._incomingBuffers.reduce((prev, curr) => prev + curr.length, 0) - 2; // 2 for CRLF - - const command = new Uint8Array(commandLength); - let index = 0; - - while (this._incomingBuffers.length > 0) { - let uint8Array = this._incomingBuffers.shift(); - - const remainingLength = commandLength - index; - - if (uint8Array.length > remainingLength) { - const excessLength = uint8Array.length - remainingLength; - uint8Array = uint8Array.subarray(0, -excessLength); - - if (this._incomingBuffers.length > 0) { - this._incomingBuffers = []; - } - } - - command.set(uint8Array, index); - index += uint8Array.length; - } - - yield command; - - if (LFidx < buf.length - 1) { - buf = new Uint8Array(buf.subarray(LFidx + 1)); - - this._incomingBuffers.push(buf); - - i = 0; - } else { - // clear the timeout when an entire command has arrived - // and not waiting on more data for next command - clearTimeout(this._socketTimeoutTimer); - this._socketTimeoutTimer = null; - return; - } - } else { - return; - } - - } - } - } // PRIVATE METHODS - - /** - * Processes a command from the queue. The command is parsed and feeded to a handler - */ - - - _parseIncomingCommands(commands) { - for (var command of commands) { - this._clearIdle(); - /* - * The "+"-tagged response is a special case: - * Either the server can asks for the next chunk of data, e.g. for the AUTHENTICATE command. - * - * Or there was an error in the XOAUTH2 authentication, for which SASL initial client response extension - * dictates the client sends an empty EOL response to the challenge containing the error message. - * - * Details on "+"-tagged response: - * https://tools.ietf.org/html/rfc3501#section-2.2.1 - */ - // - - - if (command[0] === ASCII_PLUS) { - if (this._currentCommand.data.length) { - // feed the next chunk of data - var chunk = this._currentCommand.data.shift(); - - chunk += !this._currentCommand.data.length ? EOL : ''; // EOL if there's nothing more to send - - this.send(chunk); - } else if (this._currentCommand.errorResponseExpectsEmptyLine) { - this.send(EOL); // XOAUTH2 empty response, error will be reported when server continues with NO response - } - - continue; - } - - var response; - - try { - const valueAsString = this._currentCommand.request && this._currentCommand.request.valueAsString; - response = (0, _emailjsImapHandler.parser)(command, { - valueAsString - }); - this.logger.debug('S:', () => (0, _emailjsImapHandler.compiler)(response, false, true)); - } catch (e) { - this.logger.error('Error parsing imap command!', response); - return this._onError(e); - } - - this._processResponse(response); - - this._handleResponse(response); // first response from the server, connection is now usable - - - if (!this._connectionReady) { - this._connectionReady = true; - this.onready && this.onready(); - } - } - } - /** - * Feeds a parsed response object to an appropriate handler - * - * @param {Object} response Parsed command object - */ - - - _handleResponse(response) { - var command = (0, _ramda.propOr)('', 'command', response).toUpperCase().trim(); - - if (!this._currentCommand) { - // unsolicited untagged response - if (response.tag === '*' && command in this._globalAcceptUntagged) { - this._globalAcceptUntagged[command](response); - - this._canSend = true; - - this._sendRequest(); - } - } else if (this._currentCommand.payload && response.tag === '*' && command in this._currentCommand.payload) { - // expected untagged response - this._currentCommand.payload[command].push(response); - } else if (response.tag === '*' && command in this._globalAcceptUntagged) { - // unexpected untagged response - this._globalAcceptUntagged[command](response); - } else if (response.tag === this._currentCommand.tag) { - // tagged response - if (this._currentCommand.payload && Object.keys(this._currentCommand.payload).length) { - response.payload = this._currentCommand.payload; - } - - this._currentCommand.callback(response); - - this._canSend = true; - - this._sendRequest(); - } - } - /** - * Sends a command from client queue to the server. - */ - - - _sendRequest() { - if (!this._clientQueue.length) { - return this._enterIdle(); - } - - this._clearIdle(); // an operation was made in the precheck, no need to restart the queue manually - - - this._restartQueue = false; - var command = this._clientQueue[0]; - - if (typeof command.precheck === 'function') { - // remember the context - var context = command; - var precheck = context.precheck; - delete context.precheck; // we need to restart the queue handling if no operation was made in the precheck - - this._restartQueue = true; // invoke the precheck command and resume normal operation after the promise resolves - - precheck(context).then(() => { - // we're done with the precheck - if (this._restartQueue) { - // we need to restart the queue handling - this._sendRequest(); - } - }).catch(err => { - // precheck failed, so we remove the initial command - // from the queue, invoke its callback and resume normal operation - let cmd; - - const index = this._clientQueue.indexOf(context); - - if (index >= 0) { - cmd = this._clientQueue.splice(index, 1)[0]; - } - - if (cmd && cmd.callback) { - cmd.callback(err); - this._canSend = true; - - this._parseIncomingCommands(this._iterateIncomingBuffer()); // Consume the rest of the incoming buffer - - - this._sendRequest(); // continue sending - - } - }); - return; - } - - this._canSend = false; - this._currentCommand = this._clientQueue.shift(); - - try { - this._currentCommand.data = (0, _emailjsImapHandler.compiler)(this._currentCommand.request, true); - this.logger.debug('C:', () => (0, _emailjsImapHandler.compiler)(this._currentCommand.request, false, true)); // excludes passwords etc. - } catch (e) { - this.logger.error('Error compiling imap command!', this._currentCommand.request); - return this._onError(new Error('Error compiling imap command!')); - } - - var data = this._currentCommand.data.shift(); - - this.send(data + (!this._currentCommand.data.length ? EOL : '')); - return this.waitDrain; - } - /** - * Emits onidle, noting to do currently - */ - - - _enterIdle() { - clearTimeout(this._idleTimer); - this._idleTimer = setTimeout(() => this.onidle && this.onidle(), this.timeoutEnterIdle); - } - /** - * Cancel idle timer - */ - - - _clearIdle() { - clearTimeout(this._idleTimer); - this._idleTimer = null; - } - /** - * Method processes a response into an easier to handle format. - * Add untagged numbered responses (e.g. FETCH) into a nicely feasible form - * Checks if a response includes optional response codes - * and copies these into separate properties. For example the - * following response includes a capability listing and a human - * readable message: - * - * * OK [CAPABILITY ID NAMESPACE] All ready - * - * This method adds a 'capability' property with an array value ['ID', 'NAMESPACE'] - * to the response object. Additionally 'All ready' is added as 'humanReadable' property. - * - * See possiblem IMAP Response Codes at https://tools.ietf.org/html/rfc5530 - * - * @param {Object} response Parsed response object - */ - - - _processResponse(response) { - const command = (0, _ramda.propOr)('', 'command', response).toUpperCase().trim(); // no attributes - - if (!response || !response.attributes || !response.attributes.length) { - return; - } // untagged responses w/ sequence numbers - - - if (response.tag === '*' && /^\d+$/.test(response.command) && response.attributes[0].type === 'ATOM') { - response.nr = Number(response.command); - response.command = (response.attributes.shift().value || '').toString().toUpperCase().trim(); - } // no optional response code - - - if (['OK', 'NO', 'BAD', 'BYE', 'PREAUTH'].indexOf(command) < 0) { - return; - } // If last element of the response is TEXT then this is for humans - - - if (response.attributes[response.attributes.length - 1].type === 'TEXT') { - response.humanReadable = response.attributes[response.attributes.length - 1].value; - } // Parse and format ATOM values - - - if (response.attributes[0].type === 'ATOM' && response.attributes[0].section) { - const option = response.attributes[0].section.map(key => { - if (!key) { - return; - } - - if (Array.isArray(key)) { - return key.map(key => (key.value || '').toString().trim()); - } else { - return (key.value || '').toString().toUpperCase().trim(); - } - }); - const key = option.shift(); - response.code = key; - - if (option.length === 1) { - response[key.toLowerCase()] = option[0]; - } else if (option.length > 1) { - response[key.toLowerCase()] = option; - } - } - } - /** - * Checks if a value is an Error object - * - * @param {Mixed} value Value to be checked - * @return {Boolean} returns true if the value is an Error - */ - - - isError(value) { - return !!Object.prototype.toString.call(value).match(/Error\]$/); - } // COMPRESSION RELATED METHODS - - /** - * Sets up deflate/inflate for the IO - */ - - - enableCompression() { - this._socketOnData = this.socket.ondata; - this.compressed = true; - - if (typeof window !== 'undefined' && window.Worker) { - this._compressionWorker = new Worker(URL.createObjectURL(new Blob([CompressionBlob]))); - - this._compressionWorker.onmessage = e => { - var message = e.data.message; - var data = e.data.buffer; - - switch (message) { - case MESSAGE_INFLATED_DATA_READY: - this._socketOnData({ - data - }); - - break; - - case MESSAGE_DEFLATED_DATA_READY: - this.waitDrain = this.socket.send(data); - break; - } - }; - - this._compressionWorker.onerror = e => { - this._onError(new Error('Error handling compression web worker: ' + e.message)); - }; - - this._compressionWorker.postMessage(createMessage(MESSAGE_INITIALIZE_WORKER)); - } else { - const inflatedReady = buffer => { - this._socketOnData({ - data: buffer - }); - }; - - const deflatedReady = buffer => { - this.waitDrain = this.socket.send(buffer); - }; - - this._compression = new _compression.default(inflatedReady, deflatedReady); - } // override data handler, decompress incoming data - - - this.socket.ondata = evt => { - if (!this.compressed) { - return; - } - - if (this._compressionWorker) { - this._compressionWorker.postMessage(createMessage(MESSAGE_INFLATE, evt.data), [evt.data]); - } else { - this._compression.inflate(evt.data); - } - }; - } - /** - * Undoes any changes related to compression. This only be called when closing the connection - */ - - - _disableCompression() { - if (!this.compressed) { - return; - } - - this.compressed = false; - this.socket.ondata = this._socketOnData; - this._socketOnData = null; - - if (this._compressionWorker) { - // terminate the worker - this._compressionWorker.terminate(); - - this._compressionWorker = null; - } - } - /** - * Outgoing payload needs to be compressed and sent to socket - * - * @param {ArrayBuffer} buffer Outgoing uncompressed arraybuffer - */ - - - _sendCompressed(buffer) { - // deflate - if (this._compressionWorker) { - this._compressionWorker.postMessage(createMessage(MESSAGE_DEFLATE, buffer), [buffer]); - } else { - this._compression.deflate(buffer); - } - } - -} - -exports.default = Imap; - -const createMessage = (message, buffer) => ({ - message, - buffer -}); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbWFwLmpzIl0sIm5hbWVzIjpbIk1FU1NBR0VfSU5JVElBTElaRV9XT1JLRVIiLCJNRVNTQUdFX0lORkxBVEUiLCJNRVNTQUdFX0lORkxBVEVEX0RBVEFfUkVBRFkiLCJNRVNTQUdFX0RFRkxBVEUiLCJNRVNTQUdFX0RFRkxBVEVEX0RBVEFfUkVBRFkiLCJFT0wiLCJMSU5FX0ZFRUQiLCJDQVJSSUFHRV9SRVRVUk4iLCJMRUZUX0NVUkxZX0JSQUNLRVQiLCJSSUdIVF9DVVJMWV9CUkFDS0VUIiwiQVNDSUlfUExVUyIsIkJVRkZFUl9TVEFURV9MSVRFUkFMIiwiQlVGRkVSX1NUQVRFX1BPU1NJQkxZX0xJVEVSQUxfTEVOR1RIXzEiLCJCVUZGRVJfU1RBVEVfUE9TU0lCTFlfTElURVJBTF9MRU5HVEhfMiIsIkJVRkZFUl9TVEFURV9ERUZBVUxUIiwiVElNRU9VVF9FTlRFUl9JRExFIiwiVElNRU9VVF9TT0NLRVRfTE9XRVJfQk9VTkQiLCJUSU1FT1VUX1NPQ0tFVF9NVUxUSVBMSUVSIiwiSW1hcCIsImNvbnN0cnVjdG9yIiwiaG9zdCIsInBvcnQiLCJvcHRpb25zIiwidGltZW91dEVudGVySWRsZSIsInRpbWVvdXRTb2NrZXRMb3dlckJvdW5kIiwidGltZW91dFNvY2tldE11bHRpcGxpZXIiLCJ1c2VTZWN1cmVUcmFuc3BvcnQiLCJzZWN1cmVNb2RlIiwiX2Nvbm5lY3Rpb25SZWFkeSIsIl9nbG9iYWxBY2NlcHRVbnRhZ2dlZCIsIl9jbGllbnRRdWV1ZSIsIl9jYW5TZW5kIiwiX3RhZ0NvdW50ZXIiLCJfY3VycmVudENvbW1hbmQiLCJfaWRsZVRpbWVyIiwiX3NvY2tldFRpbWVvdXRUaW1lciIsImNvbXByZXNzZWQiLCJfaW5jb21pbmdCdWZmZXJzIiwiX2J1ZmZlclN0YXRlIiwiX2xpdGVyYWxSZW1haW5pbmciLCJvbmNlcnQiLCJvbmVycm9yIiwib25yZWFkeSIsIm9uaWRsZSIsImNvbm5lY3QiLCJTb2NrZXQiLCJUQ1BTb2NrZXQiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInNvY2tldCIsIm9wZW4iLCJiaW5hcnlUeXBlIiwiY2EiLCJjZXJ0IiwiRSIsIm9uY2xvc2UiLCJfb25FcnJvciIsIkVycm9yIiwib25kYXRhIiwiZXZ0IiwiX29uRGF0YSIsImVyciIsImUiLCJkYXRhIiwibWVzc2FnZSIsIm9ub3BlbiIsImNsb3NlIiwiZXJyb3IiLCJ0ZWFyRG93biIsImZvckVhY2giLCJjbWQiLCJjYWxsYmFjayIsImNsZWFyVGltZW91dCIsIl9kaXNhYmxlQ29tcHJlc3Npb24iLCJyZWFkeVN0YXRlIiwibG9nb3V0IiwidGhlbiIsImNhdGNoIiwiZW5xdWV1ZUNvbW1hbmQiLCJ1cGdyYWRlIiwidXBncmFkZVRvU2VjdXJlIiwicmVxdWVzdCIsImFjY2VwdFVudGFnZ2VkIiwiY29tbWFuZCIsImNvbmNhdCIsIm1hcCIsInVudGFnZ2VkIiwidG9TdHJpbmciLCJ0b1VwcGVyQ2FzZSIsInRyaW0iLCJ0YWciLCJwYXlsb2FkIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwicmVzcG9uc2UiLCJpc0Vycm9yIiwiaW5kZXhPZiIsImh1bWFuUmVhZGFibGUiLCJjb2RlIiwiT2JqZWN0Iiwia2V5cyIsImtleSIsImluZGV4IiwiY3R4Iiwic3BsaWNlIiwicHVzaCIsIl9zZW5kUmVxdWVzdCIsImdldFByZXZpb3VzbHlRdWV1ZWQiLCJjb21tYW5kcyIsInN0YXJ0SW5kZXgiLCJpIiwiaXNNYXRjaCIsInNlbmQiLCJzdHIiLCJidWZmZXIiLCJ0aW1lb3V0IiwiTWF0aCIsImZsb29yIiwiYnl0ZUxlbmd0aCIsInNldFRpbWVvdXQiLCJfc2VuZENvbXByZXNzZWQiLCJzZXRIYW5kbGVyIiwibG9nZ2VyIiwiVWludDhBcnJheSIsIl9wYXJzZUluY29taW5nQ29tbWFuZHMiLCJfaXRlcmF0ZUluY29taW5nQnVmZmVyIiwiYnVmIiwiZGlmZiIsIm1pbiIsIk51bWJlciIsIl9sZW5ndGhCdWZmZXIiLCJzdGFydCIsImxhdGVzdCIsInN1YmFycmF5IiwicHJldkJ1ZiIsInNldCIsImxlZnRJZHgiLCJsZWZ0T2ZMZWZ0Q3VybHkiLCJMRmlkeCIsImNvbW1hbmRMZW5ndGgiLCJyZWR1Y2UiLCJwcmV2IiwiY3VyciIsInVpbnQ4QXJyYXkiLCJzaGlmdCIsInJlbWFpbmluZ0xlbmd0aCIsImV4Y2Vzc0xlbmd0aCIsIl9jbGVhcklkbGUiLCJjaHVuayIsImVycm9yUmVzcG9uc2VFeHBlY3RzRW1wdHlMaW5lIiwidmFsdWVBc1N0cmluZyIsImRlYnVnIiwiX3Byb2Nlc3NSZXNwb25zZSIsIl9oYW5kbGVSZXNwb25zZSIsIl9lbnRlcklkbGUiLCJfcmVzdGFydFF1ZXVlIiwicHJlY2hlY2siLCJjb250ZXh0Iiwid2FpdERyYWluIiwiYXR0cmlidXRlcyIsInRlc3QiLCJ0eXBlIiwibnIiLCJ2YWx1ZSIsInNlY3Rpb24iLCJvcHRpb24iLCJBcnJheSIsImlzQXJyYXkiLCJ0b0xvd2VyQ2FzZSIsInByb3RvdHlwZSIsImNhbGwiLCJtYXRjaCIsImVuYWJsZUNvbXByZXNzaW9uIiwiX3NvY2tldE9uRGF0YSIsIndpbmRvdyIsIldvcmtlciIsIl9jb21wcmVzc2lvbldvcmtlciIsIlVSTCIsImNyZWF0ZU9iamVjdFVSTCIsIkJsb2IiLCJDb21wcmVzc2lvbkJsb2IiLCJvbm1lc3NhZ2UiLCJwb3N0TWVzc2FnZSIsImNyZWF0ZU1lc3NhZ2UiLCJpbmZsYXRlZFJlYWR5IiwiZGVmbGF0ZWRSZWFkeSIsIl9jb21wcmVzc2lvbiIsIkNvbXByZXNzaW9uIiwiaW5mbGF0ZSIsInRlcm1pbmF0ZSIsImRlZmxhdGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7cyt4Q0FHQTtBQUNBO0FBQ0E7O0FBQ0EsTUFBTUEseUJBQXlCLEdBQUcsT0FBbEM7QUFDQSxNQUFNQyxlQUFlLEdBQUcsU0FBeEI7QUFDQSxNQUFNQywyQkFBMkIsR0FBRyxnQkFBcEM7QUFDQSxNQUFNQyxlQUFlLEdBQUcsU0FBeEI7QUFDQSxNQUFNQywyQkFBMkIsR0FBRyxn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eEIsQ0FBb0NDLGFBQWEsQ0FBQ3ZMLGVBQUQsRUFBa0IyRCxHQUFHLENBQUNJLElBQXRCLENBQWpELEVBQThFLENBQUNKLEdBQUcsQ0FBQ0ksSUFBTCxDQUE5RTtBQUNELE9BRkQsTUFFTztBQUNMLGFBQUsySCxZQUFMLENBQWtCRSxPQUFsQixDQUEwQmpJLEdBQUcsQ0FBQ0ksSUFBOUI7QUFDRDtBQUNGLEtBVkQ7QUFXRDtBQUVEOzs7OztBQUdBVSxFQUFBQSxtQkFBbUIsR0FBSTtBQUNyQixRQUFJLENBQUMsS0FBS3RDLFVBQVYsRUFBc0I7QUFDcEI7QUFDRDs7QUFFRCxTQUFLQSxVQUFMLEdBQWtCLEtBQWxCO0FBQ0EsU0FBS2MsTUFBTCxDQUFZUyxNQUFaLEdBQXFCLEtBQUttSCxhQUExQjtBQUNBLFNBQUtBLGFBQUwsR0FBcUIsSUFBckI7O0FBRUEsUUFBSSxLQUFLRyxrQkFBVCxFQUE2QjtBQUMzQjtBQUNBLFdBQUtBLGtCQUFMLENBQXdCYSxTQUF4Qjs7QUFDQSxXQUFLYixrQkFBTCxHQUEwQixJQUExQjtBQUNEO0FBQ0Y7QUFFRDs7Ozs7OztBQUtBeEQsRUFBQUEsZUFBZSxDQUFFTixNQUFGLEVBQVU7QUFDdkI7QUFDQSxRQUFJLEtBQUs4RCxrQkFBVCxFQUE2QjtBQUMzQixXQUFLQSxrQkFBTCxDQUF3Qk0sV0FBeEIsQ0FBb0NDLGFBQWEsQ0FBQ3JMLGVBQUQsRUFBa0JnSCxNQUFsQixDQUFqRCxFQUE0RSxDQUFDQSxNQUFELENBQTVFO0FBQ0QsS0FGRCxNQUVPO0FBQ0wsV0FBS3dFLFlBQUwsQ0FBa0JJLE9BQWxCLENBQTBCNUUsTUFBMUI7QUFDRDtBQUNGOztBQTF3QnVCOzs7O0FBNndCMUIsTUFBTXFFLGFBQWEsR0FBRyxDQUFDdkgsT0FBRCxFQUFVa0QsTUFBVixNQUFzQjtBQUFFbEQsRUFBQUEsT0FBRjtBQUFXa0QsRUFBQUE7QUFBWCxDQUF0QixDQUF0QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHByb3BPciB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IFRDUFNvY2tldCBmcm9tICdlbWFpbGpzLXRjcC1zb2NrZXQnXG5pbXBvcnQgeyB0b1R5cGVkQXJyYXksIGZyb21UeXBlZEFycmF5IH0gZnJvbSAnLi9jb21tb24nXG5pbXBvcnQgeyBwYXJzZXIsIGNvbXBpbGVyIH0gZnJvbSAnZW1haWxqcy1pbWFwLWhhbmRsZXInXG5pbXBvcnQgQ29tcHJlc3Npb24gZnJvbSAnLi9jb21wcmVzc2lvbidcbmltcG9ydCBDb21wcmVzc2lvbkJsb2IgZnJvbSAnLi4vcmVzL2NvbXByZXNzaW9uLndvcmtlci5ibG9iJ1xuXG4vL1xuLy8gY29uc3RhbnRzIHVzZWQgZm9yIGNvbW11bmljYXRpb24gd2l0aCB0aGUgd29ya2VyXG4vL1xuY29uc3QgTUVTU0FHRV9JTklUSUFMSVpFX1dPUktFUiA9ICdzdGFydCdcbmNvbnN0IE1FU1NBR0VfSU5GTEFURSA9ICdpbmZsYXRlJ1xuY29uc3QgTUVTU0FHRV9JTkZMQVRFRF9EQVRBX1JFQURZID0gJ2luZmxhdGVkX3JlYWR5J1xuY29uc3QgTUVTU0FHRV9ERUZMQVRFID0gJ2RlZmxhdGUnXG5jb25zdCBNRVNTQUdFX0RFRkxBVEVEX0RBVEFfUkVBRFkgPSAnZGVmbGF0ZWRfcmVhZHknXG5cbmNvbnN0IEVPTCA9ICdcXHJcXG4nXG5jb25zdCBMSU5FX0ZFRUQgPSAxMFxuY29uc3QgQ0FSUklBR0VfUkVUVVJOID0gMTNcbmNvbnN0IExFRlRfQ1VSTFlfQlJBQ0tFVCA9IDEyM1xuY29uc3QgUklHSFRfQ1VSTFlfQlJBQ0tFVCA9IDEyNVxuXG5jb25zdCBBU0NJSV9QTFVTID0gNDNcblxuLy8gU3RhdGUgdHJhY2tpbmcgd2hlbiBjb25zdHJ1Y3RpbmcgYW4gSU1BUCBjb21tYW5kIGZyb20gYnVmZmVycy5cbmNvbnN0IEJVRkZFUl9TVEFURV9MSVRFUkFMID0gJ2xpdGVyYWwnXG5jb25zdCBCVUZGRVJfU1RBVEVfUE9TU0lCTFlfTElURVJBTF9MRU5HVEhfMSA9ICdsaXRlcmFsX2xlbmd0aF8xJ1xuY29uc3QgQlVGRkVSX1NUQVRFX1BPU1NJQkxZX0xJVEVSQUxfTEVOR1RIXzIgPSAnbGl0ZXJhbF9sZW5ndGhfMidcbmNvbnN0IEJVRkZFUl9TVEFURV9ERUZBVUxUID0gJ2RlZmF1bHQnXG5cbi8qKlxuICogSG93IG11Y2ggdGltZSB0byB3YWl0IHNpbmNlIHRoZSBsYXN0IHJlc3BvbnNlIHVudGlsIHRoZSBjb25uZWN0aW9uIGlzIGNvbnNpZGVyZWQgaWRsaW5nXG4gKi9cbmNvbnN0IFRJTUVPVVRfRU5URVJfSURMRSA9IDEwMDBcblxuLyoqXG4gKiBMb3dlciBCb3VuZCBmb3Igc29ja2V0IHRpbWVvdXQgdG8gd2FpdCBzaW5jZSB0aGUgbGFzdCBkYXRhIHdhcyB3cml0dGVuIHRvIGEgc29ja2V0XG4gKi9cbmNvbnN0IFRJTUVPVVRfU09DS0VUX0xPV0VSX0JPVU5EID0gMTAwMDBcblxuLyoqXG4gKiBNdWx0aXBsaWVyIGZvciBzb2NrZXQgdGltZW91dDpcbiAqXG4gKiBXZSBhc3N1bWUgYXQgbGVhc3QgYSBHUFJTIGNvbm5lY3Rpb24gd2l0aCAxMTUga2IvcyA9IDE0LDM3NSBrQi9zIHRvcHMsIHNvIDEwIEtCL3MgdG8gYmUgb25cbiAqIHRoZSBzYWZlIHNpZGUuIFdlIGNhbiB0aW1lb3V0IGFmdGVyIGEgbG93ZXIgYm91bmQgb2YgMTBzICsgKG4gS0IgLyAxMCBLQi9zKS4gQSAxIE1CIG1lc3NhZ2VcbiAqIHVwbG9hZCB3b3VsZCBiZSAxMTAgc2Vjb25kcyB0byB3YWl0IGZvciB0aGUgdGltZW91dC4gMTAgS0IvcyA9PT0gMC4xIHMvQlxuICovXG5jb25zdCBUSU1FT1VUX1NPQ0tFVF9NVUxUSVBMSUVSID0gMC4xXG5cbi8qKlxuICogQ3JlYXRlcyBhIGNvbm5lY3Rpb24gb2JqZWN0IHRvIGFuIElNQVAgc2VydmVyLiBDYWxsIGBjb25uZWN0YCBtZXRob2QgdG8gaW5pdGl0YXRlXG4gKiB0aGUgYWN0dWFsIGNvbm5lY3Rpb24sIHRoZSBjb25zdHJ1Y3RvciBvbmx5IGRlZmluZXMgdGhlIHByb3BlcnRpZXMgYnV0IGRvZXMgbm90IGFjdHVhbGx5IGNvbm5lY3QuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IFtob3N0PSdsb2NhbGhvc3QnXSBIb3N0bmFtZSB0byBjb25lbmN0IHRvXG4gKiBAcGFyYW0ge051bWJlcn0gW3BvcnQ9MTQzXSBQb3J0IG51bWJlciB0byBjb25uZWN0IHRvXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIE9wdGlvbmFsIG9wdGlvbnMgb2JqZWN0XG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnVzZVNlY3VyZVRyYW5zcG9ydF0gU2V0IHRvIHRydWUsIHRvIHVzZSBlbmNyeXB0ZWQgY29ubmVjdGlvblxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmNvbXByZXNzaW9uV29ya2VyUGF0aF0gb2ZmbG9hZHMgZGUtL2NvbXByZXNzaW9uIGNvbXB1dGF0aW9uIHRvIGEgd2ViIHdvcmtlciwgdGhpcyBpcyB0aGUgcGF0aCB0byB0aGUgYnJvd3NlcmlmaWVkIGVtYWlsanMtY29tcHJlc3Nvci13b3JrZXIuanNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW1hcCB7XG4gIGNvbnN0cnVjdG9yIChob3N0LCBwb3J0LCBvcHRpb25zID0ge30pIHtcbiAgICB0aGlzLnRpbWVvdXRFbnRlcklkbGUgPSBUSU1FT1VUX0VOVEVSX0lETEVcbiAgICB0aGlzLnRpbWVvdXRTb2NrZXRMb3dlckJvdW5kID0gVElNRU9VVF9TT0NLRVRfTE9XRVJfQk9VTkRcbiAgICB0aGlzLnRpbWVvdXRTb2NrZXRNdWx0aXBsaWVyID0gVElNRU9VVF9TT0NLRVRfTVVMVElQTElFUlxuXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xuXG4gICAgdGhpcy5wb3J0ID0gcG9ydCB8fCAodGhpcy5vcHRpb25zLnVzZVNlY3VyZVRyYW5zcG9ydCA/IDk5MyA6IDE0MylcbiAgICB0aGlzLmhvc3QgPSBob3N0IHx8ICdsb2NhbGhvc3QnXG5cbiAgICAvLyBVc2UgYSBUTFMgY29ubmVjdGlvbi4gUG9ydCA5OTMgYWxzbyBmb3JjZXMgVExTLlxuICAgIHRoaXMub3B0aW9ucy51c2VTZWN1cmVUcmFuc3BvcnQgPSAndXNlU2VjdXJlVHJhbnNwb3J0JyBpbiB0aGlzLm9wdGlvbnMgPyAhIXRoaXMub3B0aW9ucy51c2VTZWN1cmVUcmFuc3BvcnQgOiB0aGlzLnBvcnQgPT09IDk5M1xuXG4gICAgdGhpcy5zZWN1cmVNb2RlID0gISF0aGlzLm9wdGlvbnMudXNlU2VjdXJlVHJhbnNwb3J0IC8vIERvZXMgdGhlIGNvbm5lY3Rpb24gdXNlIFNTTC9UTFNcblxuICAgIHRoaXMuX2Nvbm5lY3Rpb25SZWFkeSA9IGZhbHNlIC8vIElzIHRoZSBjb25lY3Rpb24gZXN0YWJsaXNoZWQgYW5kIGdyZWV0aW5nIGlzIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlclxuXG4gICAgdGhpcy5fZ2xvYmFsQWNjZXB0VW50YWdnZWQgPSB7fSAvLyBHbG9iYWwgaGFuZGxlcnMgZm9yIHVucmVsYXRlZCByZXNwb25zZXMgKEVYUFVOR0UsIEVYSVNUUyBldGMuKVxuXG4gICAgdGhpcy5fY2xpZW50UXVldWUgPSBbXSAvLyBRdWV1ZSBvZiBvdXRnb2luZyBjb21tYW5kc1xuICAgIHRoaXMuX2NhblNlbmQgPSBmYWxzZSAvLyBJcyBpdCBPSyB0byBzZW5kIHNvbWV0aGluZyB0byB0aGUgc2VydmVyXG4gICAgdGhpcy5fdGFnQ291bnRlciA9IDAgLy8gQ291bnRlciB0byBhbGxvdyB1bmlxdWV1ZSBpbWFwIHRhZ3NcbiAgICB0aGlzLl9jdXJyZW50Q29tbWFuZCA9IGZhbHNlIC8vIEN1cnJlbnQgY29tbWFuZCB0aGF0IGlzIHdhaXRpbmcgZm9yIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlclxuXG4gICAgdGhpcy5faWRsZVRpbWVyID0gZmFsc2UgLy8gVGltZXIgd2FpdGluZyB0byBlbnRlciBpZGxlXG4gICAgdGhpcy5fc29ja2V0VGltZW91dFRpbWVyID0gZmFsc2UgLy8gVGltZXIgd2FpdGluZyB0byBkZWNsYXJlIHRoZSBzb2NrZXQgZGVhZCBzdGFydGluZyBmcm9tIHRoZSBsYXN0IHdyaXRlXG5cbiAgICB0aGlzLmNvbXByZXNzZWQgPSBmYWxzZSAvLyBJcyB0aGUgY29ubmVjdGlvbiBjb21wcmVzc2VkIGFuZCBuZWVkcyBpbmZsYXRpbmcvZGVmbGF0aW5nXG5cbiAgICAvL1xuICAgIC8vIEhFTFBFUlNcbiAgICAvL1xuXG4gICAgLy8gQXMgdGhlIHNlcnZlciBzZW5kcyBkYXRhIGluIGNodW5rcywgaXQgbmVlZHMgdG8gYmUgc3BsaXQgaW50byBzZXBhcmF0ZSBsaW5lcy4gSGVscHMgcGFyc2luZyB0aGUgaW5wdXQuXG4gICAgdGhpcy5faW5jb21pbmdCdWZmZXJzID0gW11cbiAgICB0aGlzLl9idWZmZXJTdGF0ZSA9IEJVRkZFUl9TVEFURV9ERUZBVUxUXG4gICAgdGhpcy5fbGl0ZXJhbFJlbWFpbmluZyA9IDBcblxuICAgIC8vXG4gICAgLy8gRXZlbnQgcGxhY2Vob2xkZXJzLCBtYXkgYmUgb3ZlcnJpZGVuIHdpdGggY2FsbGJhY2sgZnVuY3Rpb25zXG4gICAgLy9cbiAgICB0aGlzLm9uY2VydCA9IG51bGxcbiAgICB0aGlzLm9uZXJyb3IgPSBudWxsIC8vIElycmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJyZWQuIENvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciB3aWxsIGJlIGNsb3NlZCBhdXRvbWF0aWNhbGx5LlxuICAgIHRoaXMub25yZWFkeSA9IG51bGwgLy8gVGhlIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciBoYXMgYmVlbiBlc3RhYmxpc2hlZCBhbmQgZ3JlZXRpbmcgaXMgcmVjZWl2ZWRcbiAgICB0aGlzLm9uaWRsZSA9IG51bGwgLy8gVGhlcmUgYXJlIG5vIG1vcmUgY29tbWFuZHMgdG8gcHJvY2Vzc1xuICB9XG5cbiAgLy8gUFVCTElDIE1FVEhPRFNcblxuICAvKipcbiAgICogSW5pdGlhdGUgYSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIuIFdhaXQgZm9yIG9ucmVhZHkgZXZlbnRcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFNvY2tldFxuICAgKiAgICAgVEVTVElORyBPTkxZISBUaGUgVENQU29ja2V0IGhhcyBhIHByZXR0eSBub25zZW5zaWNhbCBjb252ZW5pZW5jZSBjb25zdHJ1Y3RvcixcbiAgICogICAgIHdoaWNoIG1ha2VzIGl0IGhhcmQgdG8gbW9jay4gRm9yIGRlcGVuZGVuY3ktaW5qZWN0aW9uIHB1cnBvc2VzLCB3ZSB1c2UgdGhlXG4gICAqICAgICBTb2NrZXQgcGFyYW1ldGVyIHRvIHBhc3MgaW4gYSBtb2NrIFNvY2tldCBpbXBsZW1lbnRhdGlvbi4gU2hvdWxkIGJlIGxlZnQgYmxhbmtcbiAgICogICAgIGluIHByb2R1Y3Rpb24gdXNlIVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmVzb2x2ZXMgd2hlbiBzb2NrZXQgaXMgb3BlbmVkXG4gICAqL1xuICBjb25uZWN0IChTb2NrZXQgPSBUQ1BTb2NrZXQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5zb2NrZXQgPSBTb2NrZXQub3Blbih0aGlzLmhvc3QsIHRoaXMucG9ydCwge1xuICAgICAgICBiaW5hcnlUeXBlOiAnYXJyYXlidWZmZXInLFxuICAgICAgICB1c2VTZWN1cmVUcmFuc3BvcnQ6IHRoaXMuc2VjdXJlTW9kZSxcbiAgICAgICAgY2E6IHRoaXMub3B0aW9ucy5jYVxuICAgICAgfSlcblxuICAgICAgLy8gYWxsb3dzIGNlcnRpZmljYXRlIGhhbmRsaW5nIGZvciBwbGF0Zm9ybSB3L28gbmF0aXZlIHRscyBzdXBwb3J0XG4gICAgICAvLyBvbmNlcnQgaXMgbm9uIHN0YW5kYXJkIHNvIHNldHRpbmcgaXQgbWlnaHQgdGhyb3cgaWYgdGhlIHNvY2tldCBvYmplY3QgaXMgaW1tdXRhYmxlXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnNvY2tldC5vbmNlcnQgPSAoY2VydCkgPT4geyB0aGlzLm9uY2VydCAmJiB0aGlzLm9uY2VydChjZXJ0KSB9XG4gICAgICB9IGNhdGNoIChFKSB7IH1cblxuICAgICAgLy8gQ29ubmVjdGlvbiBjbG9zaW5nIHVuZXhwZWN0ZWQgaXMgYW4gZXJyb3JcbiAgICAgIHRoaXMuc29ja2V0Lm9uY2xvc2UgPSAoKSA9PiB0aGlzLl9vbkVycm9yKG5ldyBFcnJvcignU29ja2V0IGNsb3NlZCB1bmV4cGVjdGVkbHkhJykpXG4gICAgICB0aGlzLnNvY2tldC5vbmRhdGEgPSAoZXZ0KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5fb25EYXRhKGV2dClcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5fb25FcnJvcihlcnIpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gaWYgYW4gZXJyb3IgaGFwcGVucyBkdXJpbmcgY3JlYXRlIHRpbWUsIHJlamVjdCB0aGUgcHJvbWlzZVxuICAgICAgdGhpcy5zb2NrZXQub25lcnJvciA9IChlKSA9PiB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0NvdWxkIG5vdCBvcGVuIHNvY2tldDogJyArIGUuZGF0YS5tZXNzYWdlKSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5zb2NrZXQub25vcGVuID0gKCkgPT4ge1xuICAgICAgICAvLyB1c2UgcHJvcGVyIFwiaXJyZWNvdmVyYWJsZSBlcnJvciwgdGVhciBkb3duIGV2ZXJ5dGhpbmdcIi1oYW5kbGVyIG9ubHkgYWZ0ZXIgc29ja2V0IGlzIG9wZW5cbiAgICAgICAgdGhpcy5zb2NrZXQub25lcnJvciA9IChlKSA9PiB0aGlzLl9vbkVycm9yKGUpXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXJcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IFJlc29sdmVzIHdoZW4gdGhlIHNvY2tldCBpcyBjbG9zZWRcbiAgICovXG4gIGNsb3NlIChlcnJvcikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdmFyIHRlYXJEb3duID0gKCkgPT4ge1xuICAgICAgICAvLyBmdWxmaWxsIHBlbmRpbmcgcHJvbWlzZXNcbiAgICAgICAgdGhpcy5fY2xpZW50UXVldWUuZm9yRWFjaChjbWQgPT4gY21kLmNhbGxiYWNrKGVycm9yKSlcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRDb21tYW5kKSB7XG4gICAgICAgICAgdGhpcy5fY3VycmVudENvbW1hbmQuY2FsbGJhY2soZXJyb3IpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jbGllbnRRdWV1ZSA9IFtdXG4gICAgICAgIHRoaXMuX2N1cnJlbnRDb21tYW5kID0gZmFsc2VcblxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5faWRsZVRpbWVyKVxuICAgICAgICB0aGlzLl9pZGxlVGltZXIgPSBudWxsXG5cbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3NvY2tldFRpbWVvdXRUaW1lcilcbiAgICAgICAgdGhpcy5fc29ja2V0VGltZW91dFRpbWVyID0gbnVsbFxuXG4gICAgICAgIGlmICh0aGlzLnNvY2tldCkge1xuICAgICAgICAgIC8vIHJlbW92ZSBhbGwgbGlzdGVuZXJzXG4gICAgICAgICAgdGhpcy5zb2NrZXQub25vcGVuID0gbnVsbFxuICAgICAgICAgIHRoaXMuc29ja2V0Lm9uY2xvc2UgPSBudWxsXG4gICAgICAgICAgdGhpcy5zb2NrZXQub25kYXRhID0gbnVsbFxuICAgICAgICAgIHRoaXMuc29ja2V0Lm9uZXJyb3IgPSBudWxsXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0Lm9uY2VydCA9IG51bGxcbiAgICAgICAgICB9IGNhdGNoIChFKSB7IH1cblxuICAgICAgICAgIHRoaXMuc29ja2V0ID0gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2Rpc2FibGVDb21wcmVzc2lvbigpXG5cbiAgICAgIGlmICghdGhpcy5zb2NrZXQgfHwgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSAhPT0gJ29wZW4nKSB7XG4gICAgICAgIHJldHVybiB0ZWFyRG93bigpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9uY2xvc2UgPSB0aGlzLnNvY2tldC5vbmVycm9yID0gdGVhckRvd24gLy8gd2UgZG9uJ3QgcmVhbGx5IGNhcmUgYWJvdXQgdGhlIGVycm9yIGhlcmVcbiAgICAgIHRoaXMuc29ja2V0LmNsb3NlKClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgTE9HT1VUIHRvIHRoZSBzZXJ2ZXIuXG4gICAqXG4gICAqIFVzZSBpcyBkaXNjb3VyYWdlZCFcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IFJlc29sdmVzIHdoZW4gY29ubmVjdGlvbiBpcyBjbG9zZWQgYnkgc2VydmVyLlxuICAgKi9cbiAgbG9nb3V0ICgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5zb2NrZXQub25jbG9zZSA9IHRoaXMuc29ja2V0Lm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuY2xvc2UoJ0NsaWVudCBsb2dnaW5nIG91dCcpLnRoZW4ocmVzb2x2ZSkuY2F0Y2gocmVqZWN0KVxuICAgICAgfVxuXG4gICAgICB0aGlzLmVucXVldWVDb21tYW5kKCdMT0dPVVQnKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhdGVzIFRMUyBoYW5kc2hha2VcbiAgICovXG4gIHVwZ3JhZGUgKCkge1xuICAgIHRoaXMuc2VjdXJlTW9kZSA9IHRydWVcbiAgICB0aGlzLnNvY2tldC51cGdyYWRlVG9TZWN1cmUoKVxuICB9XG5cbiAgLyoqXG4gICAqIFNjaGVkdWxlcyBhIGNvbW1hbmQgdG8gYmUgc2VudCB0byB0aGUgc2VydmVyLlxuICAgKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VtYWlsanMvZW1haWxqcy1pbWFwLWhhbmRsZXIgZm9yIHJlcXVlc3Qgc3RydWN0dXJlLlxuICAgKiBEbyBub3QgcHJvdmlkZSBhIHRhZyBwcm9wZXJ0eSwgaXQgd2lsbCBiZSBzZXQgYnkgdGhlIHF1ZXVlIG1hbmFnZXIuXG4gICAqXG4gICAqIFRvIGNhdGNoIHVudGFnZ2VkIHJlc3BvbnNlcyB1c2UgYWNjZXB0VW50YWdnZWQgcHJvcGVydHkuIEZvciBleGFtcGxlLCBpZlxuICAgKiB0aGUgdmFsdWUgZm9yIGl0IGlzICdGRVRDSCcgdGhlbiB0aGUgcmVwb25zZSBpbmNsdWRlcyAncGF5bG9hZC5GRVRDSCcgcHJvcGVydHlcbiAgICogdGhhdCBpcyBhbiBhcnJheSBpbmNsdWRpbmcgYWxsIGxpc3RlZCAqIEZFVENIIHJlc3BvbnNlcy5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHJlcXVlc3QgU3RydWN0dXJlZCByZXF1ZXN0IG9iamVjdFxuICAgKiBAcGFyYW0ge0FycmF5fSBhY2NlcHRVbnRhZ2dlZCBhIGxpc3Qgb2YgdW50YWdnZWQgcmVzcG9uc2VzIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiAncGF5bG9hZCcgcHJvcGVydHlcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBPcHRpb25hbCBkYXRhIGZvciB0aGUgY29tbWFuZCBwYXlsb2FkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZSB3YXMgcmVjZWl2ZWRcbiAgICovXG4gIGVucXVldWVDb21tYW5kIChyZXF1ZXN0LCBhY2NlcHRVbnRhZ2dlZCwgb3B0aW9ucykge1xuICAgIGlmICh0eXBlb2YgcmVxdWVzdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJlcXVlc3QgPSB7XG4gICAgICAgIGNvbW1hbmQ6IHJlcXVlc3RcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhY2NlcHRVbnRhZ2dlZCA9IFtdLmNvbmNhdChhY2NlcHRVbnRhZ2dlZCB8fCBbXSkubWFwKCh1bnRhZ2dlZCkgPT4gKHVudGFnZ2VkIHx8ICcnKS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkudHJpbSgpKVxuXG4gICAgdmFyIHRhZyA9ICdXJyArICgrK3RoaXMuX3RhZ0NvdW50ZXIpXG4gICAgcmVxdWVzdC50YWcgPSB0YWdcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB2YXIgZGF0YSA9IHtcbiAgICAgICAgdGFnOiB0YWcsXG4gICAgICAgIHJlcXVlc3Q6IHJlcXVlc3QsXG4gICAgICAgIHBheWxvYWQ6IGFjY2VwdFVudGFnZ2VkLmxlbmd0aCA/IHt9IDogdW5kZWZpbmVkLFxuICAgICAgICBjYWxsYmFjazogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNFcnJvcihyZXNwb25zZSkpIHtcbiAgICAgICAgICAgIHJldHVybiByZWplY3QocmVzcG9uc2UpXG4gICAgICAgICAgfSBlbHNlIGlmIChbJ05PJywgJ0JBRCddLmluZGV4T2YocHJvcE9yKCcnLCAnY29tbWFuZCcsIHJlc3BvbnNlKS50b1VwcGVyQ2FzZSgpLnRyaW0oKSkgPj0gMCkge1xuICAgICAgICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKHJlc3BvbnNlLmh1bWFuUmVhZGFibGUgfHwgJ0Vycm9yJylcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5jb2RlKSB7XG4gICAgICAgICAgICAgIGVycm9yLmNvZGUgPSByZXNwb25zZS5jb2RlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycm9yKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gYXBwbHkgYW55IGFkZGl0aW9uYWwgb3B0aW9ucyB0byB0aGUgY29tbWFuZFxuICAgICAgT2JqZWN0LmtleXMob3B0aW9ucyB8fCB7fSkuZm9yRWFjaCgoa2V5KSA9PiB7IGRhdGFba2V5XSA9IG9wdGlvbnNba2V5XSB9KVxuXG4gICAgICBhY2NlcHRVbnRhZ2dlZC5mb3JFYWNoKChjb21tYW5kKSA9PiB7IGRhdGEucGF5bG9hZFtjb21tYW5kXSA9IFtdIH0pXG5cbiAgICAgIC8vIGlmIHdlJ3JlIGluIHByaW9yaXR5IG1vZGUgKGkuZS4gd2UgcmFuIGNvbW1hbmRzIGluIGEgcHJlY2hlY2spLFxuICAgICAgLy8gcXVldWUgYW55IGNvbW1hbmRzIEJFRk9SRSB0aGUgY29tbWFuZCB0aGF0IGNvbnRpYW5lZCB0aGUgcHJlY2hlY2ssXG4gICAgICAvLyBvdGhlcndpc2UganVzdCBxdWV1ZSBjb21tYW5kIGFzIHVzdWFsXG4gICAgICB2YXIgaW5kZXggPSBkYXRhLmN0eCA/IHRoaXMuX2NsaWVudFF1ZXVlLmluZGV4T2YoZGF0YS5jdHgpIDogLTFcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIGRhdGEudGFnICs9ICcucCdcbiAgICAgICAgZGF0YS5yZXF1ZXN0LnRhZyArPSAnLnAnXG4gICAgICAgIHRoaXMuX2NsaWVudFF1ZXVlLnNwbGljZShpbmRleCwgMCwgZGF0YSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2NsaWVudFF1ZXVlLnB1c2goZGF0YSlcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2NhblNlbmQpIHtcbiAgICAgICAgdGhpcy5fc2VuZFJlcXVlc3QoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGNvbW1hbmRzXG4gICAqIEBwYXJhbSBjdHhcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBnZXRQcmV2aW91c2x5UXVldWVkIChjb21tYW5kcywgY3R4KSB7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IHRoaXMuX2NsaWVudFF1ZXVlLmluZGV4T2YoY3R4KSAtIDFcblxuICAgIC8vIHNlYXJjaCBiYWNrd2FyZHMgZm9yIHRoZSBjb21tYW5kcyBhbmQgcmV0dXJuIHRoZSBmaXJzdCBmb3VuZFxuICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpID49IDA7IGktLSkge1xuICAgICAgaWYgKGlzTWF0Y2godGhpcy5fY2xpZW50UXVldWVbaV0pKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jbGllbnRRdWV1ZVtpXVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGFsc28gY2hlY2sgY3VycmVudCBjb21tYW5kIGlmIG5vIFNFTEVDVCBpcyBxdWV1ZWRcbiAgICBpZiAoaXNNYXRjaCh0aGlzLl9jdXJyZW50Q29tbWFuZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50Q29tbWFuZFxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuXG4gICAgZnVuY3Rpb24gaXNNYXRjaCAoZGF0YSkge1xuICAgICAgcmV0dXJuIGRhdGEgJiYgZGF0YS5yZXF1ZXN0ICYmIGNvbW1hbmRzLmluZGV4T2YoZGF0YS5yZXF1ZXN0LmNvbW1hbmQpID49IDBcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBkYXRhIHRvIHRoZSBUQ1Agc29ja2V0XG4gICAqIEFybXMgYSB0aW1lb3V0IHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyIFBheWxvYWRcbiAgICovXG4gIHNlbmQgKHN0cikge1xuICAgIGNvbnN0IGJ1ZmZlciA9IHRvVHlwZWRBcnJheShzdHIpLmJ1ZmZlclxuICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLnRpbWVvdXRTb2NrZXRMb3dlckJvdW5kICsgTWF0aC5mbG9vcihidWZmZXIuYnl0ZUxlbmd0aCAqIHRoaXMudGltZW91dFNvY2tldE11bHRpcGxpZXIpXG5cbiAgICBjbGVhclRpbWVvdXQodGhpcy5fc29ja2V0VGltZW91dFRpbWVyKSAvLyBjbGVhciBwZW5kaW5nIHRpbWVvdXRzXG4gICAgdGhpcy5fc29ja2V0VGltZW91dFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLl9vbkVycm9yKG5ldyBFcnJvcignIFNvY2tldCB0aW1lZCBvdXQhJykpLCB0aW1lb3V0KSAvLyBhcm0gdGhlIG5leHQgdGltZW91dFxuXG4gICAgaWYgKHRoaXMuY29tcHJlc3NlZCkge1xuICAgICAgdGhpcy5fc2VuZENvbXByZXNzZWQoYnVmZmVyKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNvY2tldC5zZW5kKGJ1ZmZlcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgZ2xvYmFsIGhhbmRsZXIgZm9yIGFuIHVudGFnZ2VkIHJlc3BvbnNlLiBJZiBjdXJyZW50bHkgcHJvY2Vzc2VkIGNvbW1hbmRcbiAgICogaGFzIG5vdCBsaXN0ZWQgdW50YWdnZWQgY29tbWFuZCBpdCBpcyBmb3J3YXJkZWQgdG8gdGhlIGdsb2JhbCBoYW5kbGVyLiBVc2VmdWxcbiAgICogd2l0aCBFWFBVTkdFLCBFWElTVFMgZXRjLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY29tbWFuZCBVbnRhZ2dlZCBjb21tYW5kIG5hbWVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb24gd2l0aCByZXNwb25zZSBvYmplY3QgYW5kIGNvbnRpbnVlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqL1xuICBzZXRIYW5kbGVyIChjb21tYW5kLCBjYWxsYmFjaykge1xuICAgIHRoaXMuX2dsb2JhbEFjY2VwdFVudGFnZ2VkW2NvbW1hbmQudG9VcHBlckNhc2UoKS50cmltKCldID0gY2FsbGJhY2tcbiAgfVxuXG4gIC8vIElOVEVSTkFMIEVWRU5UU1xuXG4gIC8qKlxuICAgKiBFcnJvciBoYW5kbGVyIGZvciB0aGUgc29ja2V0XG4gICAqXG4gICAqIEBldmVudFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnQgRXZlbnQgb2JqZWN0LiBTZWUgZXZ0LmRhdGEgZm9yIHRoZSBlcnJvclxuICAgKi9cbiAgX29uRXJyb3IgKGV2dCkge1xuICAgIHZhciBlcnJvclxuICAgIGlmICh0aGlzLmlzRXJyb3IoZXZ0KSkge1xuICAgICAgZXJyb3IgPSBldnRcbiAgICB9IGVsc2UgaWYgKGV2dCAmJiB0aGlzLmlzRXJyb3IoZXZ0LmRhdGEpKSB7XG4gICAgICBlcnJvciA9IGV2dC5kYXRhXG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9yID0gbmV3IEVycm9yKChldnQgJiYgZXZ0LmRhdGEgJiYgZXZ0LmRhdGEubWVzc2FnZSkgfHwgZXZ0LmRhdGEgfHwgZXZ0IHx8ICdFcnJvcicpXG4gICAgfVxuXG4gICAgdGhpcy5sb2dnZXIuZXJyb3IoZXJyb3IpXG5cbiAgICAvLyBhbHdheXMgY2FsbCBvbmVycm9yIGNhbGxiYWNrLCBubyBtYXR0ZXIgaWYgY2xvc2UoKSBzdWNjZWVkcyBvciBmYWlsc1xuICAgIHRoaXMuY2xvc2UoZXJyb3IpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5vbmVycm9yICYmIHRoaXMub25lcnJvcihlcnJvcilcbiAgICB9LCAoKSA9PiB7XG4gICAgICB0aGlzLm9uZXJyb3IgJiYgdGhpcy5vbmVycm9yKGVycm9yKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgaW5jb21pbmcgZGF0YSBmcm9tIHRoZSBzZXJ2ZXIuIFRoZSBkYXRhIGlzIHNlbnQgaW4gYXJiaXRyYXJ5XG4gICAqIGNodW5rcyBhbmQgY2FuJ3QgYmUgdXNlZCBkaXJlY3RseSBzbyB0aGlzIGZ1bmN0aW9uIG1ha2VzIHN1cmUgdGhlIGRhdGFcbiAgICogaXMgc3BsaXQgaW50byBjb21wbGV0ZSBsaW5lcyBiZWZvcmUgdGhlIGRhdGEgaXMgcGFzc2VkIHRvIHRoZSBjb21tYW5kXG4gICAqIGhhbmRsZXJcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqL1xuICBfb25EYXRhIChldnQpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fc29ja2V0VGltZW91dFRpbWVyKSAvLyByZXNldCB0aGUgdGltZW91dCBvbiBlYWNoIGRhdGEgcGFja2V0XG4gICAgY29uc3QgdGltZW91dCA9IHRoaXMudGltZW91dFNvY2tldExvd2VyQm91bmQgKyBNYXRoLmZsb29yKDQwOTYgKiB0aGlzLnRpbWVvdXRTb2NrZXRNdWx0aXBsaWVyKSAvLyBtYXggcGFja2V0IHNpemUgaXMgNDA5NiBieXRlc1xuICAgIHRoaXMuX3NvY2tldFRpbWVvdXRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5fb25FcnJvcihuZXcgRXJyb3IoJyBTb2NrZXQgdGltZWQgb3V0IScpKSwgdGltZW91dClcblxuICAgIHRoaXMuX2luY29taW5nQnVmZmVycy5wdXNoKG5ldyBVaW50OEFycmF5KGV2dC5kYXRhKSkgLy8gYXBwZW5kIHRvIHRoZSBpbmNvbWluZyBidWZmZXJcbiAgICB0aGlzLl9wYXJzZUluY29taW5nQ29tbWFuZHModGhpcy5faXRlcmF0ZUluY29taW5nQnVmZmVyKCkpIC8vIENvbnN1bWUgdGhlIGluY29taW5nIGJ1ZmZlclxuICB9XG5cbiAgKiBfaXRlcmF0ZUluY29taW5nQnVmZmVyICgpIHtcbiAgICBsZXQgYnVmID0gdGhpcy5faW5jb21pbmdCdWZmZXJzW3RoaXMuX2luY29taW5nQnVmZmVycy5sZW5ndGggLSAxXSB8fCBbXVxuICAgIGxldCBpID0gMFxuXG4gICAgLy8gbG9vcCBpbnZhcmlhbnQ6XG4gICAgLy8gICB0aGlzLl9pbmNvbWluZ0J1ZmZlcnMgc3RhcnRzIHdpdGggdGhlIGJlZ2lubmluZyBvZiBpbmNvbWluZyBjb21tYW5kLlxuICAgIC8vICAgYnVmIGlzIHNob3J0aGFuZCBmb3IgbGFzdCBlbGVtZW50IG9mIHRoaXMuX2luY29taW5nQnVmZmVycy5cbiAgICAvLyAgIGJ1ZlswLi5pLTFdIGlzIHBhcnQgb2YgaW5jb21pbmcgY29tbWFuZC5cbiAgICB3aGlsZSAoaSA8IGJ1Zi5sZW5ndGgpIHtcbiAgICAgIHN3aXRjaCAodGhpcy5fYnVmZmVyU3RhdGUpIHtcbiAgICAgICAgY2FzZSBCVUZGRVJfU1RBVEVfTElURVJBTDpcbiAgICAgICAgICBjb25zdCBkaWZmID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIGksIHRoaXMuX2xpdGVyYWxSZW1haW5pbmcpXG4gICAgICAgICAgdGhpcy5fbGl0ZXJhbFJlbWFpbmluZyAtPSBkaWZmXG4gICAgICAgICAgaSArPSBkaWZmXG4gICAgICAgICAgaWYgKHRoaXMuX2xpdGVyYWxSZW1haW5pbmcgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2J1ZmZlclN0YXRlID0gQlVGRkVSX1NUQVRFX0RFRkFVTFRcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIEJVRkZFUl9TVEFURV9QT1NTSUJMWV9MSVRFUkFMX0xFTkdUSF8yOlxuICAgICAgICAgIGlmIChpIDwgYnVmLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGJ1ZltpXSA9PT0gQ0FSUklBR0VfUkVUVVJOKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2xpdGVyYWxSZW1haW5pbmcgPSBOdW1iZXIoZnJvbVR5cGVkQXJyYXkodGhpcy5fbGVuZ3RoQnVmZmVyKSkgKyAyIC8vIGZvciBDUkxGXG4gICAgICAgICAgICAgIHRoaXMuX2J1ZmZlclN0YXRlID0gQlVGRkVSX1NUQVRFX0xJVEVSQUxcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuX2J1ZmZlclN0YXRlID0gQlVGRkVSX1NUQVRFX0RFRkFVTFRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9sZW5ndGhCdWZmZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIEJVRkZFUl9TVEFURV9QT1NTSUJMWV9MSVRFUkFMX0xFTkdUSF8xOlxuICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gaVxuICAgICAgICAgIHdoaWxlIChpIDwgYnVmLmxlbmd0aCAmJiBidWZbaV0gPj0gNDggJiYgYnVmW2ldIDw9IDU3KSB7IC8vIGRpZ2l0c1xuICAgICAgICAgICAgaSsrXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdGFydCAhPT0gaSkge1xuICAgICAgICAgICAgY29uc3QgbGF0ZXN0ID0gYnVmLnN1YmFycmF5KHN0YXJ0LCBpKVxuICAgICAgICAgICAgY29uc3QgcHJldkJ1ZiA9IHRoaXMuX2xlbmd0aEJ1ZmZlclxuICAgICAgICAgICAgdGhpcy5fbGVuZ3RoQnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkocHJldkJ1Zi5sZW5ndGggKyBsYXRlc3QubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5fbGVuZ3RoQnVmZmVyLnNldChwcmV2QnVmKVxuICAgICAgICAgICAgdGhpcy5fbGVuZ3RoQnVmZmVyLnNldChsYXRlc3QsIHByZXZCdWYubGVuZ3RoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaSA8IGJ1Zi5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9sZW5ndGhCdWZmZXIubGVuZ3RoID4gMCAmJiBidWZbaV0gPT09IFJJR0hUX0NVUkxZX0JSQUNLRVQpIHtcbiAgICAgICAgICAgICAgdGhpcy5fYnVmZmVyU3RhdGUgPSBCVUZGRVJfU1RBVEVfUE9TU0lCTFlfTElURVJBTF9MRU5HVEhfMlxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2xlbmd0aEJ1ZmZlclxuICAgICAgICAgICAgICB0aGlzLl9idWZmZXJTdGF0ZSA9IEJVRkZFUl9TVEFURV9ERUZBVUxUXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpKytcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIGZpbmQgbGl0ZXJhbCBsZW5ndGhcbiAgICAgICAgICBjb25zdCBsZWZ0SWR4ID0gYnVmLmluZGV4T2YoTEVGVF9DVVJMWV9CUkFDS0VULCBpKVxuICAgICAgICAgIGlmIChsZWZ0SWR4ID4gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IGxlZnRPZkxlZnRDdXJseSA9IG5ldyBVaW50OEFycmF5KGJ1Zi5idWZmZXIsIGksIGxlZnRJZHggLSBpKVxuICAgICAgICAgICAgaWYgKGxlZnRPZkxlZnRDdXJseS5pbmRleE9mKExJTkVfRkVFRCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgIGkgPSBsZWZ0SWR4ICsgMVxuICAgICAgICAgICAgICB0aGlzLl9sZW5ndGhCdWZmZXIgPSBuZXcgVWludDhBcnJheSgwKVxuICAgICAgICAgICAgICB0aGlzLl9idWZmZXJTdGF0ZSA9IEJVRkZFUl9TVEFURV9QT1NTSUJMWV9MSVRFUkFMX0xFTkdUSF8xXG4gICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gZmluZCBlbmQgb2YgY29tbWFuZFxuICAgICAgICAgIGNvbnN0IExGaWR4ID0gYnVmLmluZGV4T2YoTElORV9GRUVELCBpKVxuICAgICAgICAgIGlmIChMRmlkeCA+IC0xKSB7XG4gICAgICAgICAgICBpZiAoTEZpZHggPCBidWYubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICB0aGlzLl9pbmNvbWluZ0J1ZmZlcnNbdGhpcy5faW5jb21pbmdCdWZmZXJzLmxlbmd0aCAtIDFdID0gbmV3IFVpbnQ4QXJyYXkoYnVmLmJ1ZmZlciwgMCwgTEZpZHggKyAxKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY29tbWFuZExlbmd0aCA9IHRoaXMuX2luY29taW5nQnVmZmVycy5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHByZXYgKyBjdXJyLmxlbmd0aCwgMCkgLSAyIC8vIDIgZm9yIENSTEZcbiAgICAgICAgICAgIGNvbnN0IGNvbW1hbmQgPSBuZXcgVWludDhBcnJheShjb21tYW5kTGVuZ3RoKVxuICAgICAgICAgICAgbGV0IGluZGV4ID0gMFxuICAgICAgICAgICAgd2hpbGUgKHRoaXMuX2luY29taW5nQnVmZmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGxldCB1aW50OEFycmF5ID0gdGhpcy5faW5jb21pbmdCdWZmZXJzLnNoaWZ0KClcblxuICAgICAgICAgICAgICBjb25zdCByZW1haW5pbmdMZW5ndGggPSBjb21tYW5kTGVuZ3RoIC0gaW5kZXhcbiAgICAgICAgICAgICAgaWYgKHVpbnQ4QXJyYXkubGVuZ3RoID4gcmVtYWluaW5nTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhjZXNzTGVuZ3RoID0gdWludDhBcnJheS5sZW5ndGggLSByZW1haW5pbmdMZW5ndGhcbiAgICAgICAgICAgICAgICB1aW50OEFycmF5ID0gdWludDhBcnJheS5zdWJhcnJheSgwLCAtZXhjZXNzTGVuZ3RoKVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2luY29taW5nQnVmZmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9pbmNvbWluZ0J1ZmZlcnMgPSBbXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb21tYW5kLnNldCh1aW50OEFycmF5LCBpbmRleClcbiAgICAgICAgICAgICAgaW5kZXggKz0gdWludDhBcnJheS5sZW5ndGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHlpZWxkIGNvbW1hbmRcbiAgICAgICAgICAgIGlmIChMRmlkeCA8IGJ1Zi5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGJ1Zi5zdWJhcnJheShMRmlkeCArIDEpKVxuICAgICAgICAgICAgICB0aGlzLl9pbmNvbWluZ0J1ZmZlcnMucHVzaChidWYpXG4gICAgICAgICAgICAgIGkgPSAwXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBjbGVhciB0aGUgdGltZW91dCB3aGVuIGFuIGVudGlyZSBjb21tYW5kIGhhcyBhcnJpdmVkXG4gICAgICAgICAgICAgIC8vIGFuZCBub3Qgd2FpdGluZyBvbiBtb3JlIGRhdGEgZm9yIG5leHQgY29tbWFuZFxuICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fc29ja2V0VGltZW91dFRpbWVyKVxuICAgICAgICAgICAgICB0aGlzLl9zb2NrZXRUaW1lb3V0VGltZXIgPSBudWxsXG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUFJJVkFURSBNRVRIT0RTXG5cbiAgLyoqXG4gICAqIFByb2Nlc3NlcyBhIGNvbW1hbmQgZnJvbSB0aGUgcXVldWUuIFRoZSBjb21tYW5kIGlzIHBhcnNlZCBhbmQgZmVlZGVkIHRvIGEgaGFuZGxlclxuICAgKi9cbiAgX3BhcnNlSW5jb21pbmdDb21tYW5kcyAoY29tbWFuZHMpIHtcbiAgICBmb3IgKHZhciBjb21tYW5kIG9mIGNvbW1hbmRzKSB7XG4gICAgICB0aGlzLl9jbGVhcklkbGUoKVxuXG4gICAgICAvKlxuICAgICAgICogVGhlIFwiK1wiLXRhZ2dlZCByZXNwb25zZSBpcyBhIHNwZWNpYWwgY2FzZTpcbiAgICAgICAqIEVpdGhlciB0aGUgc2VydmVyIGNhbiBhc2tzIGZvciB0aGUgbmV4dCBjaHVuayBvZiBkYXRhLCBlLmcuIGZvciB0aGUgQVVUSEVOVElDQVRFIGNvbW1hbmQuXG4gICAgICAgKlxuICAgICAgICogT3IgdGhlcmUgd2FzIGFuIGVycm9yIGluIHRoZSBYT0FVVEgyIGF1dGhlbnRpY2F0aW9uLCBmb3Igd2hpY2ggU0FTTCBpbml0aWFsIGNsaWVudCByZXNwb25zZSBleHRlbnNpb25cbiAgICAgICAqIGRpY3RhdGVzIHRoZSBjbGllbnQgc2VuZHMgYW4gZW1wdHkgRU9MIHJlc3BvbnNlIHRvIHRoZSBjaGFsbGVuZ2UgY29udGFpbmluZyB0aGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgICAqXG4gICAgICAgKiBEZXRhaWxzIG9uIFwiK1wiLXRhZ2dlZCByZXNwb25zZTpcbiAgICAgICAqICAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM1MDEjc2VjdGlvbi0yLjIuMVxuICAgICAgICovXG4gICAgICAvL1xuICAgICAgaWYgKGNvbW1hbmRbMF0gPT09IEFTQ0lJX1BMVVMpIHtcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRDb21tYW5kLmRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgLy8gZmVlZCB0aGUgbmV4dCBjaHVuayBvZiBkYXRhXG4gICAgICAgICAgdmFyIGNodW5rID0gdGhpcy5fY3VycmVudENvbW1hbmQuZGF0YS5zaGlmdCgpXG4gICAgICAgICAgY2h1bmsgKz0gKCF0aGlzLl9jdXJyZW50Q29tbWFuZC5kYXRhLmxlbmd0aCA/IEVPTCA6ICcnKSAvLyBFT0wgaWYgdGhlcmUncyBub3RoaW5nIG1vcmUgdG8gc2VuZFxuICAgICAgICAgIHRoaXMuc2VuZChjaHVuaylcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9jdXJyZW50Q29tbWFuZC5lcnJvclJlc3BvbnNlRXhwZWN0c0VtcHR5TGluZSkge1xuICAgICAgICAgIHRoaXMuc2VuZChFT0wpIC8vIFhPQVVUSDIgZW1wdHkgcmVzcG9uc2UsIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgd2hlbiBzZXJ2ZXIgY29udGludWVzIHdpdGggTk8gcmVzcG9uc2VcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB2YXIgcmVzcG9uc2VcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHZhbHVlQXNTdHJpbmcgPSB0aGlzLl9jdXJyZW50Q29tbWFuZC5yZXF1ZXN0ICYmIHRoaXMuX2N1cnJlbnRDb21tYW5kLnJlcXVlc3QudmFsdWVBc1N0cmluZ1xuICAgICAgICByZXNwb25zZSA9IHBhcnNlcihjb21tYW5kLCB7IHZhbHVlQXNTdHJpbmcgfSlcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ1M6JywgKCkgPT4gY29tcGlsZXIocmVzcG9uc2UsIGZhbHNlLCB0cnVlKSlcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgaW1hcCBjb21tYW5kIScsIHJlc3BvbnNlKVxuICAgICAgICByZXR1cm4gdGhpcy5fb25FcnJvcihlKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9wcm9jZXNzUmVzcG9uc2UocmVzcG9uc2UpXG4gICAgICB0aGlzLl9oYW5kbGVSZXNwb25zZShyZXNwb25zZSlcblxuICAgICAgLy8gZmlyc3QgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLCBjb25uZWN0aW9uIGlzIG5vdyB1c2FibGVcbiAgICAgIGlmICghdGhpcy5fY29ubmVjdGlvblJlYWR5KSB7XG4gICAgICAgIHRoaXMuX2Nvbm5lY3Rpb25SZWFkeSA9IHRydWVcbiAgICAgICAgdGhpcy5vbnJlYWR5ICYmIHRoaXMub25yZWFkeSgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZlZWRzIGEgcGFyc2VkIHJlc3BvbnNlIG9iamVjdCB0byBhbiBhcHByb3ByaWF0ZSBoYW5kbGVyXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSByZXNwb25zZSBQYXJzZWQgY29tbWFuZCBvYmplY3RcbiAgICovXG4gIF9oYW5kbGVSZXNwb25zZSAocmVzcG9uc2UpIHtcbiAgICB2YXIgY29tbWFuZCA9IHByb3BPcignJywgJ2NvbW1hbmQnLCByZXNwb25zZSkudG9VcHBlckNhc2UoKS50cmltKClcblxuICAgIGlmICghdGhpcy5fY3VycmVudENvbW1hbmQpIHtcbiAgICAgIC8vIHVuc29saWNpdGVkIHVudGFnZ2VkIHJlc3BvbnNlXG4gICAgICBpZiAocmVzcG9uc2UudGFnID09PSAnKicgJiYgY29tbWFuZCBpbiB0aGlzLl9nbG9iYWxBY2NlcHRVbnRhZ2dlZCkge1xuICAgICAgICB0aGlzLl9nbG9iYWxBY2NlcHRVbnRhZ2dlZFtjb21tYW5kXShyZXNwb25zZSlcbiAgICAgICAgdGhpcy5fY2FuU2VuZCA9IHRydWVcbiAgICAgICAgdGhpcy5fc2VuZFJlcXVlc3QoKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5fY3VycmVudENvbW1hbmQucGF5bG9hZCAmJiByZXNwb25zZS50YWcgPT09ICcqJyAmJiBjb21tYW5kIGluIHRoaXMuX2N1cnJlbnRDb21tYW5kLnBheWxvYWQpIHtcbiAgICAgIC8vIGV4cGVjdGVkIHVudGFnZ2VkIHJlc3BvbnNlXG4gICAgICB0aGlzLl9jdXJyZW50Q29tbWFuZC5wYXlsb2FkW2NvbW1hbmRdLnB1c2gocmVzcG9uc2UpXG4gICAgfSBlbHNlIGlmIChyZXNwb25zZS50YWcgPT09ICcqJyAmJiBjb21tYW5kIGluIHRoaXMuX2dsb2JhbEFjY2VwdFVudGFnZ2VkKSB7XG4gICAgICAvLyB1bmV4cGVjdGVkIHVudGFnZ2VkIHJlc3BvbnNlXG4gICAgICB0aGlzLl9nbG9iYWxBY2NlcHRVbnRhZ2dlZFtjb21tYW5kXShyZXNwb25zZSlcbiAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnRhZyA9PT0gdGhpcy5fY3VycmVudENvbW1hbmQudGFnKSB7XG4gICAgICAvLyB0YWdnZWQgcmVzcG9uc2VcbiAgICAgIGlmICh0aGlzLl9jdXJyZW50Q29tbWFuZC5wYXlsb2FkICYmIE9iamVjdC5rZXlzKHRoaXMuX2N1cnJlbnRDb21tYW5kLnBheWxvYWQpLmxlbmd0aCkge1xuICAgICAgICByZXNwb25zZS5wYXlsb2FkID0gdGhpcy5fY3VycmVudENvbW1hbmQucGF5bG9hZFxuICAgICAgfVxuICAgICAgdGhpcy5fY3VycmVudENvbW1hbmQuY2FsbGJhY2socmVzcG9uc2UpXG4gICAgICB0aGlzLl9jYW5TZW5kID0gdHJ1ZVxuICAgICAgdGhpcy5fc2VuZFJlcXVlc3QoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIGNvbW1hbmQgZnJvbSBjbGllbnQgcXVldWUgdG8gdGhlIHNlcnZlci5cbiAgICovXG4gIF9zZW5kUmVxdWVzdCAoKSB7XG4gICAgaWYgKCF0aGlzLl9jbGllbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9lbnRlcklkbGUoKVxuICAgIH1cbiAgICB0aGlzLl9jbGVhcklkbGUoKVxuXG4gICAgLy8gYW4gb3BlcmF0aW9uIHdhcyBtYWRlIGluIHRoZSBwcmVjaGVjaywgbm8gbmVlZCB0byByZXN0YXJ0IHRoZSBxdWV1ZSBtYW51YWxseVxuICAgIHRoaXMuX3Jlc3RhcnRRdWV1ZSA9IGZhbHNlXG5cbiAgICB2YXIgY29tbWFuZCA9IHRoaXMuX2NsaWVudFF1ZXVlWzBdXG4gICAgaWYgKHR5cGVvZiBjb21tYW5kLnByZWNoZWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyByZW1lbWJlciB0aGUgY29udGV4dFxuICAgICAgdmFyIGNvbnRleHQgPSBjb21tYW5kXG4gICAgICB2YXIgcHJlY2hlY2sgPSBjb250ZXh0LnByZWNoZWNrXG4gICAgICBkZWxldGUgY29udGV4dC5wcmVjaGVja1xuXG4gICAgICAvLyB3ZSBuZWVkIHRvIHJlc3RhcnQgdGhlIHF1ZXVlIGhhbmRsaW5nIGlmIG5vIG9wZXJhdGlvbiB3YXMgbWFkZSBpbiB0aGUgcHJlY2hlY2tcbiAgICAgIHRoaXMuX3Jlc3RhcnRRdWV1ZSA9IHRydWVcblxuICAgICAgLy8gaW52b2tlIHRoZSBwcmVjaGVjayBjb21tYW5kIGFuZCByZXN1bWUgbm9ybWFsIG9wZXJhdGlvbiBhZnRlciB0aGUgcHJvbWlzZSByZXNvbHZlc1xuICAgICAgcHJlY2hlY2soY29udGV4dCkudGhlbigoKSA9PiB7XG4gICAgICAgIC8vIHdlJ3JlIGRvbmUgd2l0aCB0aGUgcHJlY2hlY2tcbiAgICAgICAgaWYgKHRoaXMuX3Jlc3RhcnRRdWV1ZSkge1xuICAgICAgICAgIC8vIHdlIG5lZWQgdG8gcmVzdGFydCB0aGUgcXVldWUgaGFuZGxpbmdcbiAgICAgICAgICB0aGlzLl9zZW5kUmVxdWVzdCgpXG4gICAgICAgIH1cbiAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgLy8gcHJlY2hlY2sgZmFpbGVkLCBzbyB3ZSByZW1vdmUgdGhlIGluaXRpYWwgY29tbWFuZFxuICAgICAgICAvLyBmcm9tIHRoZSBxdWV1ZSwgaW52b2tlIGl0cyBjYWxsYmFjayBhbmQgcmVzdW1lIG5vcm1hbCBvcGVyYXRpb25cbiAgICAgICAgbGV0IGNtZFxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2NsaWVudFF1ZXVlLmluZGV4T2YoY29udGV4dClcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICBjbWQgPSB0aGlzLl9jbGllbnRRdWV1ZS5zcGxpY2UoaW5kZXgsIDEpWzBdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNtZCAmJiBjbWQuY2FsbGJhY2spIHtcbiAgICAgICAgICBjbWQuY2FsbGJhY2soZXJyKVxuICAgICAgICAgIHRoaXMuX2NhblNlbmQgPSB0cnVlXG4gICAgICAgICAgdGhpcy5fcGFyc2VJbmNvbWluZ0NvbW1hbmRzKHRoaXMuX2l0ZXJhdGVJbmNvbWluZ0J1ZmZlcigpKSAvLyBDb25zdW1lIHRoZSByZXN0IG9mIHRoZSBpbmNvbWluZyBidWZmZXJcbiAgICAgICAgICB0aGlzLl9zZW5kUmVxdWVzdCgpIC8vIGNvbnRpbnVlIHNlbmRpbmdcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2NhblNlbmQgPSBmYWxzZVxuICAgIHRoaXMuX2N1cnJlbnRDb21tYW5kID0gdGhpcy5fY2xpZW50UXVldWUuc2hpZnQoKVxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX2N1cnJlbnRDb21tYW5kLmRhdGEgPSBjb21waWxlcih0aGlzLl9jdXJyZW50Q29tbWFuZC5yZXF1ZXN0LCB0cnVlKVxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0M6JywgKCkgPT4gY29tcGlsZXIodGhpcy5fY3VycmVudENvbW1hbmQucmVxdWVzdCwgZmFsc2UsIHRydWUpKSAvLyBleGNsdWRlcyBwYXNzd29yZHMgZXRjLlxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdFcnJvciBjb21waWxpbmcgaW1hcCBjb21tYW5kIScsIHRoaXMuX2N1cnJlbnRDb21tYW5kLnJlcXVlc3QpXG4gICAgICByZXR1cm4gdGhpcy5fb25FcnJvcihuZXcgRXJyb3IoJ0Vycm9yIGNvbXBpbGluZyBpbWFwIGNvbW1hbmQhJykpXG4gICAgfVxuXG4gICAgdmFyIGRhdGEgPSB0aGlzLl9jdXJyZW50Q29tbWFuZC5kYXRhLnNoaWZ0KClcblxuICAgIHRoaXMuc2VuZChkYXRhICsgKCF0aGlzLl9jdXJyZW50Q29tbWFuZC5kYXRhLmxlbmd0aCA/IEVPTCA6ICcnKSlcbiAgICByZXR1cm4gdGhpcy53YWl0RHJhaW5cbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBvbmlkbGUsIG5vdGluZyB0byBkbyBjdXJyZW50bHlcbiAgICovXG4gIF9lbnRlcklkbGUgKCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl9pZGxlVGltZXIpXG4gICAgdGhpcy5faWRsZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiAodGhpcy5vbmlkbGUgJiYgdGhpcy5vbmlkbGUoKSksIHRoaXMudGltZW91dEVudGVySWRsZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWwgaWRsZSB0aW1lclxuICAgKi9cbiAgX2NsZWFySWRsZSAoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX2lkbGVUaW1lcilcbiAgICB0aGlzLl9pZGxlVGltZXIgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHByb2Nlc3NlcyBhIHJlc3BvbnNlIGludG8gYW4gZWFzaWVyIHRvIGhhbmRsZSBmb3JtYXQuXG4gICAqIEFkZCB1bnRhZ2dlZCBudW1iZXJlZCByZXNwb25zZXMgKGUuZy4gRkVUQ0gpIGludG8gYSBuaWNlbHkgZmVhc2libGUgZm9ybVxuICAgKiBDaGVja3MgaWYgYSByZXNwb25zZSBpbmNsdWRlcyBvcHRpb25hbCByZXNwb25zZSBjb2Rlc1xuICAgKiBhbmQgY29waWVzIHRoZXNlIGludG8gc2VwYXJhdGUgcHJvcGVydGllcy4gRm9yIGV4YW1wbGUgdGhlXG4gICAqIGZvbGxvd2luZyByZXNwb25zZSBpbmNsdWRlcyBhIGNhcGFiaWxpdHkgbGlzdGluZyBhbmQgYSBodW1hblxuICAgKiByZWFkYWJsZSBtZXNzYWdlOlxuICAgKlxuICAgKiAgICAgKiBPSyBbQ0FQQUJJTElUWSBJRCBOQU1FU1BBQ0VdIEFsbCByZWFkeVxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBhZGRzIGEgJ2NhcGFiaWxpdHknIHByb3BlcnR5IHdpdGggYW4gYXJyYXkgdmFsdWUgWydJRCcsICdOQU1FU1BBQ0UnXVxuICAgKiB0byB0aGUgcmVzcG9uc2Ugb2JqZWN0LiBBZGRpdGlvbmFsbHkgJ0FsbCByZWFkeScgaXMgYWRkZWQgYXMgJ2h1bWFuUmVhZGFibGUnIHByb3BlcnR5LlxuICAgKlxuICAgKiBTZWUgcG9zc2libGVtIElNQVAgUmVzcG9uc2UgQ29kZXMgYXQgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzU1MzBcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHJlc3BvbnNlIFBhcnNlZCByZXNwb25zZSBvYmplY3RcbiAgICovXG4gIF9wcm9jZXNzUmVzcG9uc2UgKHJlc3BvbnNlKSB7XG4gICAgY29uc3QgY29tbWFuZCA9IHByb3BPcignJywgJ2NvbW1hbmQnLCByZXNwb25zZSkudG9VcHBlckNhc2UoKS50cmltKClcblxuICAgIC8vIG5vIGF0dHJpYnV0ZXNcbiAgICBpZiAoIXJlc3BvbnNlIHx8ICFyZXNwb25zZS5hdHRyaWJ1dGVzIHx8ICFyZXNwb25zZS5hdHRyaWJ1dGVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gdW50YWdnZWQgcmVzcG9uc2VzIHcvIHNlcXVlbmNlIG51bWJlcnNcbiAgICBpZiAocmVzcG9uc2UudGFnID09PSAnKicgJiYgL15cXGQrJC8udGVzdChyZXNwb25zZS5jb21tYW5kKSAmJiByZXNwb25zZS5hdHRyaWJ1dGVzWzBdLnR5cGUgPT09ICdBVE9NJykge1xuICAgICAgcmVzcG9uc2UubnIgPSBOdW1iZXIocmVzcG9uc2UuY29tbWFuZClcbiAgICAgIHJlc3BvbnNlLmNvbW1hbmQgPSAocmVzcG9uc2UuYXR0cmlidXRlcy5zaGlmdCgpLnZhbHVlIHx8ICcnKS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkudHJpbSgpXG4gICAgfVxuXG4gICAgLy8gbm8gb3B0aW9uYWwgcmVzcG9uc2UgY29kZVxuICAgIGlmIChbJ09LJywgJ05PJywgJ0JBRCcsICdCWUUnLCAnUFJFQVVUSCddLmluZGV4T2YoY29tbWFuZCkgPCAwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBJZiBsYXN0IGVsZW1lbnQgb2YgdGhlIHJlc3BvbnNlIGlzIFRFWFQgdGhlbiB0aGlzIGlzIGZvciBodW1hbnNcbiAgICBpZiAocmVzcG9uc2UuYXR0cmlidXRlc1tyZXNwb25zZS5hdHRyaWJ1dGVzLmxlbmd0aCAtIDFdLnR5cGUgPT09ICdURVhUJykge1xuICAgICAgcmVzcG9uc2UuaHVtYW5SZWFkYWJsZSA9IHJlc3BvbnNlLmF0dHJpYnV0ZXNbcmVzcG9uc2UuYXR0cmlidXRlcy5sZW5ndGggLSAxXS52YWx1ZVxuICAgIH1cblxuICAgIC8vIFBhcnNlIGFuZCBmb3JtYXQgQVRPTSB2YWx1ZXNcbiAgICBpZiAocmVzcG9uc2UuYXR0cmlidXRlc1swXS50eXBlID09PSAnQVRPTScgJiYgcmVzcG9uc2UuYXR0cmlidXRlc1swXS5zZWN0aW9uKSB7XG4gICAgICBjb25zdCBvcHRpb24gPSByZXNwb25zZS5hdHRyaWJ1dGVzWzBdLnNlY3Rpb24ubWFwKChrZXkpID0+IHtcbiAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShrZXkpKSB7XG4gICAgICAgICAgcmV0dXJuIGtleS5tYXAoKGtleSkgPT4gKGtleS52YWx1ZSB8fCAnJykudG9TdHJpbmcoKS50cmltKCkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIChrZXkudmFsdWUgfHwgJycpLnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKS50cmltKClcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgY29uc3Qga2V5ID0gb3B0aW9uLnNoaWZ0KClcbiAgICAgIHJlc3BvbnNlLmNvZGUgPSBrZXlcblxuICAgICAgaWYgKG9wdGlvbi5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmVzcG9uc2Vba2V5LnRvTG93ZXJDYXNlKCldID0gb3B0aW9uWzBdXG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbi5sZW5ndGggPiAxKSB7XG4gICAgICAgIHJlc3BvbnNlW2tleS50b0xvd2VyQ2FzZSgpXSA9IG9wdGlvblxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBhbiBFcnJvciBvYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWUgVmFsdWUgdG8gYmUgY2hlY2tlZFxuICAgKiBAcmV0dXJuIHtCb29sZWFufSByZXR1cm5zIHRydWUgaWYgdGhlIHZhbHVlIGlzIGFuIEVycm9yXG4gICAqL1xuICBpc0Vycm9yICh2YWx1ZSkge1xuICAgIHJldHVybiAhIU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkubWF0Y2goL0Vycm9yXFxdJC8pXG4gIH1cblxuICAvLyBDT01QUkVTU0lPTiBSRUxBVEVEIE1FVEhPRFNcblxuICAvKipcbiAgICogU2V0cyB1cCBkZWZsYXRlL2luZmxhdGUgZm9yIHRoZSBJT1xuICAgKi9cbiAgZW5hYmxlQ29tcHJlc3Npb24gKCkge1xuICAgIHRoaXMuX3NvY2tldE9uRGF0YSA9IHRoaXMuc29ja2V0Lm9uZGF0YVxuICAgIHRoaXMuY29tcHJlc3NlZCA9IHRydWVcblxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuV29ya2VyKSB7XG4gICAgICB0aGlzLl9jb21wcmVzc2lvbldvcmtlciA9IG5ldyBXb3JrZXIoVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbQ29tcHJlc3Npb25CbG9iXSkpKVxuICAgICAgdGhpcy5fY29tcHJlc3Npb25Xb3JrZXIub25tZXNzYWdlID0gKGUpID0+IHtcbiAgICAgICAgdmFyIG1lc3NhZ2UgPSBlLmRhdGEubWVzc2FnZVxuICAgICAgICB2YXIgZGF0YSA9IGUuZGF0YS5idWZmZXJcblxuICAgICAgICBzd2l0Y2ggKG1lc3NhZ2UpIHtcbiAgICAgICAgICBjYXNlIE1FU1NBR0VfSU5GTEFURURfREFUQV9SRUFEWTpcbiAgICAgICAgICAgIHRoaXMuX3NvY2tldE9uRGF0YSh7IGRhdGEgfSlcbiAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICBjYXNlIE1FU1NBR0VfREVGTEFURURfREFUQV9SRUFEWTpcbiAgICAgICAgICAgIHRoaXMud2FpdERyYWluID0gdGhpcy5zb2NrZXQuc2VuZChkYXRhKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9jb21wcmVzc2lvbldvcmtlci5vbmVycm9yID0gKGUpID0+IHtcbiAgICAgICAgdGhpcy5fb25FcnJvcihuZXcgRXJyb3IoJ0Vycm9yIGhhbmRsaW5nIGNvbXByZXNzaW9uIHdlYiB3b3JrZXI6ICcgKyBlLm1lc3NhZ2UpKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9jb21wcmVzc2lvbldvcmtlci5wb3N0TWVzc2FnZShjcmVhdGVNZXNzYWdlKE1FU1NBR0VfSU5JVElBTElaRV9XT1JLRVIpKVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpbmZsYXRlZFJlYWR5ID0gKGJ1ZmZlcikgPT4geyB0aGlzLl9zb2NrZXRPbkRhdGEoeyBkYXRhOiBidWZmZXIgfSkgfVxuICAgICAgY29uc3QgZGVmbGF0ZWRSZWFkeSA9IChidWZmZXIpID0+IHsgdGhpcy53YWl0RHJhaW4gPSB0aGlzLnNvY2tldC5zZW5kKGJ1ZmZlcikgfVxuICAgICAgdGhpcy5fY29tcHJlc3Npb24gPSBuZXcgQ29tcHJlc3Npb24oaW5mbGF0ZWRSZWFkeSwgZGVmbGF0ZWRSZWFkeSlcbiAgICB9XG5cbiAgICAvLyBvdmVycmlkZSBkYXRhIGhhbmRsZXIsIGRlY29tcHJlc3MgaW5jb21pbmcgZGF0YVxuICAgIHRoaXMuc29ja2V0Lm9uZGF0YSA9IChldnQpID0+IHtcbiAgICAgIGlmICghdGhpcy5jb21wcmVzc2VkKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fY29tcHJlc3Npb25Xb3JrZXIpIHtcbiAgICAgICAgdGhpcy5fY29tcHJlc3Npb25Xb3JrZXIucG9zdE1lc3NhZ2UoY3JlYXRlTWVzc2FnZShNRVNTQUdFX0lORkxBVEUsIGV2dC5kYXRhKSwgW2V2dC5kYXRhXSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2NvbXByZXNzaW9uLmluZmxhdGUoZXZ0LmRhdGEpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVuZG9lcyBhbnkgY2hhbmdlcyByZWxhdGVkIHRvIGNvbXByZXNzaW9uLiBUaGlzIG9ubHkgYmUgY2FsbGVkIHdoZW4gY2xvc2luZyB0aGUgY29ubmVjdGlvblxuICAgKi9cbiAgX2Rpc2FibGVDb21wcmVzc2lvbiAoKSB7XG4gICAgaWYgKCF0aGlzLmNvbXByZXNzZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuY29tcHJlc3NlZCA9IGZhbHNlXG4gICAgdGhpcy5zb2NrZXQub25kYXRhID0gdGhpcy5fc29ja2V0T25EYXRhXG4gICAgdGhpcy5fc29ja2V0T25EYXRhID0gbnVsbFxuXG4gICAgaWYgKHRoaXMuX2NvbXByZXNzaW9uV29ya2VyKSB7XG4gICAgICAvLyB0ZXJtaW5hdGUgdGhlIHdvcmtlclxuICAgICAgdGhpcy5fY29tcHJlc3Npb25Xb3JrZXIudGVybWluYXRlKClcbiAgICAgIHRoaXMuX2NvbXByZXNzaW9uV29ya2VyID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPdXRnb2luZyBwYXlsb2FkIG5lZWRzIHRvIGJlIGNvbXByZXNzZWQgYW5kIHNlbnQgdG8gc29ja2V0XG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGJ1ZmZlciBPdXRnb2luZyB1bmNvbXByZXNzZWQgYXJyYXlidWZmZXJcbiAgICovXG4gIF9zZW5kQ29tcHJlc3NlZCAoYnVmZmVyKSB7XG4gICAgLy8gZGVmbGF0ZVxuICAgIGlmICh0aGlzLl9jb21wcmVzc2lvbldvcmtlcikge1xuICAgICAgdGhpcy5fY29tcHJlc3Npb25Xb3JrZXIucG9zdE1lc3NhZ2UoY3JlYXRlTWVzc2FnZShNRVNTQUdFX0RFRkxBVEUsIGJ1ZmZlciksIFtidWZmZXJdKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jb21wcmVzc2lvbi5kZWZsYXRlKGJ1ZmZlcilcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgY3JlYXRlTWVzc2FnZSA9IChtZXNzYWdlLCBidWZmZXIpID0+ICh7IG1lc3NhZ2UsIGJ1ZmZlciB9KVxuIl19 diff --git a/dist/index.js b/dist/index.js deleted file mode 100644 index b0aab470..00000000 --- a/dist/index.js +++ /dev/null @@ -1,52 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -Object.defineProperty(exports, "LOG_LEVEL_NONE", { - enumerable: true, - get: function () { - return _common.LOG_LEVEL_NONE; - } -}); -Object.defineProperty(exports, "LOG_LEVEL_ERROR", { - enumerable: true, - get: function () { - return _common.LOG_LEVEL_ERROR; - } -}); -Object.defineProperty(exports, "LOG_LEVEL_WARN", { - enumerable: true, - get: function () { - return _common.LOG_LEVEL_WARN; - } -}); -Object.defineProperty(exports, "LOG_LEVEL_INFO", { - enumerable: true, - get: function () { - return _common.LOG_LEVEL_INFO; - } -}); -Object.defineProperty(exports, "LOG_LEVEL_DEBUG", { - enumerable: true, - get: function () { - return _common.LOG_LEVEL_DEBUG; - } -}); -Object.defineProperty(exports, "LOG_LEVEL_ALL", { - enumerable: true, - get: function () { - return _common.LOG_LEVEL_ALL; - } -}); -exports.default = void 0; - -var _client = _interopRequireDefault(require("./client")); - -var _common = require("./common"); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var _default = _client.default; -exports.default = _default; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJJbWFwQ2xpZW50Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBRUE7Ozs7ZUFTZUEsZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBJbWFwQ2xpZW50IGZyb20gJy4vY2xpZW50J1xuXG5leHBvcnQge1xuICBMT0dfTEVWRUxfTk9ORSxcbiAgTE9HX0xFVkVMX0VSUk9SLFxuICBMT0dfTEVWRUxfV0FSTixcbiAgTE9HX0xFVkVMX0lORk8sXG4gIExPR19MRVZFTF9ERUJVRyxcbiAgTE9HX0xFVkVMX0FMTFxufSBmcm9tICcuL2NvbW1vbidcblxuZXhwb3J0IGRlZmF1bHQgSW1hcENsaWVudFxuIl19 \ No newline at end of file diff --git a/dist/logger.js b/dist/logger.js deleted file mode 100644 index 8f685139..00000000 --- a/dist/logger.js +++ /dev/null @@ -1,38 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = createDefaultLogger; - -var _common = require("./common"); - -let SESSIONCOUNTER = 0; - -function createDefaultLogger(username, hostname) { - const session = ++SESSIONCOUNTER; - - const log = (level, messages) => { - messages = messages.map(msg => typeof msg === 'function' ? msg() : msg); - const date = new Date().toISOString(); - const logMessage = `[${date}][${session}][${username}][${hostname}] ${messages.join(' ')}`; - - if (level === _common.LOG_LEVEL_DEBUG) { - console.log('[DEBUG]' + logMessage); - } else if (level === _common.LOG_LEVEL_INFO) { - console.info('[INFO]' + logMessage); - } else if (level === _common.LOG_LEVEL_WARN) { - console.warn('[WARN]' + logMessage); - } else if (level === _common.LOG_LEVEL_ERROR) { - console.error('[ERROR]' + logMessage); - } - }; - - return { - debug: msgs => log(_common.LOG_LEVEL_DEBUG, msgs), - info: msgs => log(_common.LOG_LEVEL_INFO, msgs), - warn: msgs => log(_common.LOG_LEVEL_WARN, msgs), - error: msgs => log(_common.LOG_LEVEL_ERROR, msgs) - }; -} -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9sb2dnZXIuanMiXSwibmFtZXMiOlsiU0VTU0lPTkNPVU5URVIiLCJjcmVhdGVEZWZhdWx0TG9nZ2VyIiwidXNlcm5hbWUiLCJob3N0bmFtZSIsInNlc3Npb24iLCJsb2ciLCJsZXZlbCIsIm1lc3NhZ2VzIiwibWFwIiwibXNnIiwiZGF0ZSIsIkRhdGUiLCJ0b0lTT1N0cmluZyIsImxvZ01lc3NhZ2UiLCJqb2luIiwiTE9HX0xFVkVMX0RFQlVHIiwiY29uc29sZSIsIkxPR19MRVZFTF9JTkZPIiwiaW5mbyIsIkxPR19MRVZFTF9XQVJOIiwid2FybiIsIkxPR19MRVZFTF9FUlJPUiIsImVycm9yIiwiZGVidWciLCJtc2dzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBT0EsSUFBSUEsY0FBYyxHQUFHLENBQXJCOztBQUVlLFNBQVNDLG1CQUFULENBQThCQyxRQUE5QixFQUF3Q0MsUUFBeEMsRUFBa0Q7QUFDL0QsUUFBTUMsT0FBTyxHQUFHLEVBQUVKLGNBQWxCOztBQUNBLFFBQU1LLEdBQUcsR0FBRyxDQUFDQyxLQUFELEVBQVFDLFFBQVIsS0FBcUI7QUFDL0JBLElBQUFBLFFBQVEsR0FBR0EsUUFBUSxDQUFDQyxHQUFULENBQWFDLEdBQUcsSUFBSSxPQUFPQSxHQUFQLEtBQWUsVUFBZixHQUE0QkEsR0FBRyxFQUEvQixHQUFvQ0EsR0FBeEQsQ0FBWDtBQUNBLFVBQU1DLElBQUksR0FBRyxJQUFJQyxJQUFKLEdBQVdDLFdBQVgsRUFBYjtBQUNBLFVBQU1DLFVBQVUsR0FBSSxJQUFHSCxJQUFLLEtBQUlOLE9BQVEsS0FBSUYsUUFBUyxLQUFJQyxRQUFTLEtBQUlJLFFBQVEsQ0FBQ08sSUFBVCxDQUFjLEdBQWQsQ0FBbUIsRUFBekY7O0FBQ0EsUUFBSVIsS0FBSyxLQUFLUyx1QkFBZCxFQUErQjtBQUM3QkMsTUFBQUEsT0FBTyxDQUFDWCxHQUFSLENBQVksWUFBWVEsVUFBeEI7QUFDRCxLQUZELE1BRU8sSUFBSVAsS0FBSyxLQUFLVyxzQkFBZCxFQUE4QjtBQUNuQ0QsTUFBQUEsT0FBTyxDQUFDRSxJQUFSLENBQWEsV0FBV0wsVUFBeEI7QUFDRCxLQUZNLE1BRUEsSUFBSVAsS0FBSyxLQUFLYSxzQkFBZCxFQUE4QjtBQUNuQ0gsTUFBQUEsT0FBTyxDQUFDSSxJQUFSLENBQWEsV0FBV1AsVUFBeEI7QUFDRCxLQUZNLE1BRUEsSUFBSVAsS0FBSyxLQUFLZSx1QkFBZCxFQUErQjtBQUNwQ0wsTUFBQUEsT0FBTyxDQUFDTSxLQUFSLENBQWMsWUFBWVQsVUFBMUI7QUFDRDtBQUNGLEdBYkQ7O0FBZUEsU0FBTztBQUNMVSxJQUFBQSxLQUFLLEVBQUVDLElBQUksSUFBSW5CLEdBQUcsQ0FBQ1UsdUJBQUQsRUFBa0JTLElBQWxCLENBRGI7QUFFTE4sSUFBQUEsSUFBSSxFQUFFTSxJQUFJLElBQUluQixHQUFHLENBQUNZLHNCQUFELEVBQWlCTyxJQUFqQixDQUZaO0FBR0xKLElBQUFBLElBQUksRUFBRUksSUFBSSxJQUFJbkIsR0FBRyxDQUFDYyxzQkFBRCxFQUFpQkssSUFBakIsQ0FIWjtBQUlMRixJQUFBQSxLQUFLLEVBQUVFLElBQUksSUFBSW5CLEdBQUcsQ0FBQ2dCLHVCQUFELEVBQWtCRyxJQUFsQjtBQUpiLEdBQVA7QUFNRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIExPR19MRVZFTF9FUlJPUixcbiAgTE9HX0xFVkVMX1dBUk4sXG4gIExPR19MRVZFTF9JTkZPLFxuICBMT0dfTEVWRUxfREVCVUdcbn0gZnJvbSAnLi9jb21tb24nXG5cbmxldCBTRVNTSU9OQ09VTlRFUiA9IDBcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdExvZ2dlciAodXNlcm5hbWUsIGhvc3RuYW1lKSB7XG4gIGNvbnN0IHNlc3Npb24gPSArK1NFU1NJT05DT1VOVEVSXG4gIGNvbnN0IGxvZyA9IChsZXZlbCwgbWVzc2FnZXMpID0+IHtcbiAgICBtZXNzYWdlcyA9IG1lc3NhZ2VzLm1hcChtc2cgPT4gdHlwZW9mIG1zZyA9PT0gJ2Z1bmN0aW9uJyA/IG1zZygpIDogbXNnKVxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgICBjb25zdCBsb2dNZXNzYWdlID0gYFske2RhdGV9XVske3Nlc3Npb259XVske3VzZXJuYW1lfV1bJHtob3N0bmFtZX1dICR7bWVzc2FnZXMuam9pbignICcpfWBcbiAgICBpZiAobGV2ZWwgPT09IExPR19MRVZFTF9ERUJVRykge1xuICAgICAgY29uc29sZS5sb2coJ1tERUJVR10nICsgbG9nTWVzc2FnZSlcbiAgICB9IGVsc2UgaWYgKGxldmVsID09PSBMT0dfTEVWRUxfSU5GTykge1xuICAgICAgY29uc29sZS5pbmZvKCdbSU5GT10nICsgbG9nTWVzc2FnZSlcbiAgICB9IGVsc2UgaWYgKGxldmVsID09PSBMT0dfTEVWRUxfV0FSTikge1xuICAgICAgY29uc29sZS53YXJuKCdbV0FSTl0nICsgbG9nTWVzc2FnZSlcbiAgICB9IGVsc2UgaWYgKGxldmVsID09PSBMT0dfTEVWRUxfRVJST1IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tFUlJPUl0nICsgbG9nTWVzc2FnZSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGRlYnVnOiBtc2dzID0+IGxvZyhMT0dfTEVWRUxfREVCVUcsIG1zZ3MpLFxuICAgIGluZm86IG1zZ3MgPT4gbG9nKExPR19MRVZFTF9JTkZPLCBtc2dzKSxcbiAgICB3YXJuOiBtc2dzID0+IGxvZyhMT0dfTEVWRUxfV0FSTiwgbXNncyksXG4gICAgZXJyb3I6IG1zZ3MgPT4gbG9nKExPR19MRVZFTF9FUlJPUiwgbXNncylcbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/dist/special-use.js b/dist/special-use.js deleted file mode 100644 index 5d7a861b..00000000 --- a/dist/special-use.js +++ /dev/null @@ -1,55 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.checkSpecialUse = checkSpecialUse; - -var _ramda = require("ramda"); - -const SPECIAL_USE_FLAGS = ['\\All', '\\Archive', '\\Drafts', '\\Flagged', '\\Junk', '\\Sent', '\\Trash']; -const SPECIAL_USE_BOXES = { - '\\Sent': ['aika', 'bidaliak', 'bidalita', 'dihantar', 'e rometsweng', 'e tindami', 'elküldött', 'elküldöttek', 'enviadas', 'enviadas', 'enviados', 'enviats', 'envoyés', 'ethunyelweyo', 'expediate', 'ezipuru', 'gesendete', 'gestuur', 'gönderilmiş öğeler', 'göndərilənlər', 'iberilen', 'inviati', 'išsiųstieji', 'kuthunyelwe', 'lasa', 'lähetetyt', 'messages envoyés', 'naipadala', 'nalefa', 'napadala', 'nosūtītās ziņas', 'odeslané', 'padala', 'poslane', 'poslano', 'poslano', 'poslané', 'poslato', 'saadetud', 'saadetud kirjad', 'sendt', 'sendt', 'sent', 'sent items', 'sent messages', 'sända poster', 'sänt', 'terkirim', 'ti fi ranṣẹ', 'të dërguara', 'verzonden', 'vilivyotumwa', 'wysłane', 'đã gửi', 'σταλθέντα', 'жиберилген', 'жіберілгендер', 'изпратени', 'илгээсэн', 'ирсол шуд', 'испратено', 'надіслані', 'отправленные', 'пасланыя', 'юборилган', 'ուղարկված', 'נשלחו', 'פריטים שנשלחו', 'المرسلة', 'بھیجے گئے', 'سوزمژہ', 'لېګل شوی', 'موارد ارسال شده', 'पाठविले', 'पाठविलेले', 'प्रेषित', 'भेजा गया', 'প্রেরিত', 'প্রেরিত', 'প্ৰেৰিত', 'ਭੇਜੇ', 'મોકલેલા', 'ପଠାଗଲା', 'அனுப்பியவை', 'పంపించబడింది', 'ಕಳುಹಿಸಲಾದ', 'അയച്ചു', 'යැවු පණිවුඩ', 'ส่งแล้ว', 'გაგზავნილი', 'የተላኩ', 'បាន​ផ្ញើ', '寄件備份', '寄件備份', '已发信息', '送信済みメール', '발신 메시지', '보낸 편지함'], - '\\Trash': ['articole șterse', 'bin', 'borttagna objekt', 'deleted', 'deleted items', 'deleted messages', 'elementi eliminati', 'elementos borrados', 'elementos eliminados', 'gelöschte objekte', 'item dipadam', 'itens apagados', 'itens excluídos', 'mục đã xóa', 'odstraněné položky', 'pesan terhapus', 'poistetut', 'praht', 'prügikast', 'silinmiş öğeler', 'slettede beskeder', 'slettede elementer', 'trash', 'törölt elemek', 'usunięte wiadomości', 'verwijderde items', 'vymazané správy', 'éléments supprimés', 'видалені', 'жойылғандар', 'удаленные', 'פריטים שנמחקו', 'العناصر المحذوفة', 'موارد حذف شده', 'รายการที่ลบ', '已删除邮件', '已刪除項目', '已刪除項目'], - '\\Junk': ['bulk mail', 'correo no deseado', 'courrier indésirable', 'istenmeyen', 'istenmeyen e-posta', 'junk', 'levélszemét', 'nevyžiadaná pošta', 'nevyžádaná pošta', 'no deseado', 'posta indesiderata', 'pourriel', 'roskaposti', 'skräppost', 'spam', 'spam', 'spamowanie', 'søppelpost', 'thư rác', 'спам', 'דואר זבל', 'الرسائل العشوائية', 'هرزنامه', 'สแปม', '‎垃圾郵件', '垃圾邮件', '垃圾電郵'], - '\\Drafts': ['ba brouillon', 'borrador', 'borrador', 'borradores', 'bozze', 'brouillons', 'bản thảo', 'ciorne', 'concepten', 'draf', 'drafts', 'drög', 'entwürfe', 'esborranys', 'garalamalar', 'ihe edeturu', 'iidrafti', 'izinhlaka', 'juodraščiai', 'kladd', 'kladder', 'koncepty', 'koncepty', 'konsep', 'konsepte', 'kopie robocze', 'layihələr', 'luonnokset', 'melnraksti', 'meralo', 'mesazhe të padërguara', 'mga draft', 'mustandid', 'nacrti', 'nacrti', 'osnutki', 'piszkozatok', 'rascunhos', 'rasimu', 'skice', 'taslaklar', 'tsararrun saƙonni', 'utkast', 'vakiraoka', 'vázlatok', 'zirriborroak', 'àwọn àkọpamọ́', 'πρόχειρα', 'жобалар', 'нацрти', 'нооргууд', 'сиёҳнавис', 'хомаки хатлар', 'чарнавікі', 'чернетки', 'чернови', 'черновики', 'черновиктер', 'սևագրեր', 'טיוטות', 'مسودات', 'مسودات', 'موسودې', 'پیش نویسها', 'ڈرافٹ/', 'ड्राफ़्ट', 'प्रारूप', 'খসড়া', 'খসড়া', 'ড্ৰাফ্ট', 'ਡ੍ਰਾਫਟ', 'ડ્રાફ્ટસ', 'ଡ୍ରାଫ୍ଟ', 'வரைவுகள்', 'చిత్తు ప్రతులు', 'ಕರಡುಗಳು', 'കരടുകള്‍', 'කෙටුම් පත්', 'ฉบับร่าง', 'მონახაზები', 'ረቂቆች', 'សារព្រាង', '下書き', '草稿', '草稿', '草稿', '임시 보관함'] -}; -const SPECIAL_USE_BOX_FLAGS = Object.keys(SPECIAL_USE_BOXES); -/** - * Checks if a mailbox is for special use - * - * @param {Object} mailbox - * @return {String} Special use flag (if detected) - */ - -function checkSpecialUse(mailbox) { - if (mailbox.flags) { - for (let i = 0; i < SPECIAL_USE_FLAGS.length; i++) { - const type = SPECIAL_USE_FLAGS[i]; - - if ((mailbox.flags || []).indexOf(type) >= 0) { - mailbox.specialUse = type; - mailbox.specialUseFlag = type; - return type; - } - } - } - - return checkSpecialUseByName(mailbox); -} - -function checkSpecialUseByName(mailbox) { - const name = (0, _ramda.propOr)('', 'name', mailbox).toLowerCase().trim(); - - for (let i = 0; i < SPECIAL_USE_BOX_FLAGS.length; i++) { - const type = SPECIAL_USE_BOX_FLAGS[i]; - - if (SPECIAL_USE_BOXES[type].indexOf(name) >= 0) { - mailbox.specialUse = type; - return type; - } - } - - return false; -} -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9zcGVjaWFsLXVzZS5qcyJdLCJuYW1lcyI6WyJTUEVDSUFMX1VTRV9GTEFHUyIsIlNQRUNJQUxfVVNFX0JPWEVTIiwiU1BFQ0lBTF9VU0VfQk9YX0ZMQUdTIiwiT2JqZWN0Iiwia2V5cyIsImNoZWNrU3BlY2lhbFVzZSIsIm1haWxib3giLCJmbGFncyIsImkiLCJsZW5ndGgiLCJ0eXBlIiwiaW5kZXhPZiIsInNwZWNpYWxVc2UiLCJzcGVjaWFsVXNlRmxhZyIsImNoZWNrU3BlY2lhbFVzZUJ5TmFtZSIsIm5hbWUiLCJ0b0xvd2VyQ2FzZSIsInRyaW0iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFFQSxNQUFNQSxpQkFBaUIsR0FBRyxDQUFDLE9BQUQsRUFBVSxXQUFWLEVBQXVCLFVBQXZCLEVBQW1DLFdBQW5DLEVBQWdELFFBQWhELEVBQTBELFFBQTFELEVBQW9FLFNBQXBFLENBQTFCO0FBQ0EsTUFBTUMsaUJBQWlCLEdBQUc7QUFDeEIsWUFBVSxDQUNSLE1BRFEsRUFDQSxVQURBLEVBQ1ksVUFEWixFQUN3QixVQUR4QixFQUNvQyxjQURwQyxFQUNvRCxXQURwRCxFQUNpRSxXQURqRSxFQUM4RSxhQUQ5RSxFQUM2RixVQUQ3RixFQUVSLFVBRlEsRUFFSSxVQUZKLEVBRWdCLFNBRmhCLEVBRTJCLFNBRjNCLEVBRXNDLGNBRnRDLEVBRXNELFdBRnRELEVBRW1FLFNBRm5FLEVBRThFLFdBRjlFLEVBRTJGLFNBRjNGLEVBR1Isb0JBSFEsRUFHYyxlQUhkLEVBRytCLFVBSC9CLEVBRzJDLFNBSDNDLEVBR3NELGFBSHRELEVBR3FFLGFBSHJFLEVBR29GLE1BSHBGLEVBRzRGLFdBSDVGLEVBSVIsa0JBSlEsRUFJWSxXQUpaLEVBSXlCLFFBSnpCLEVBSW1DLFVBSm5DLEVBSStDLGlCQUovQyxFQUlrRSxVQUpsRSxFQUk4RSxRQUo5RSxFQUl3RixTQUp4RixFQUtSLFNBTFEsRUFLRyxTQUxILEVBS2MsU0FMZCxFQUt5QixTQUx6QixFQUtvQyxVQUxw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Q0FBQ1MsTUFBdEMsRUFBOENELENBQUMsRUFBL0MsRUFBbUQ7QUFDakQsWUFBTUUsSUFBSSxHQUFHVixpQkFBaUIsQ0FBQ1EsQ0FBRCxDQUE5Qjs7QUFDQSxVQUFJLENBQUNGLE9BQU8sQ0FBQ0MsS0FBUixJQUFpQixFQUFsQixFQUFzQkksT0FBdEIsQ0FBOEJELElBQTlCLEtBQXVDLENBQTNDLEVBQThDO0FBQzVDSixRQUFBQSxPQUFPLENBQUNNLFVBQVIsR0FBcUJGLElBQXJCO0FBQ0FKLFFBQUFBLE9BQU8sQ0FBQ08sY0FBUixHQUF5QkgsSUFBekI7QUFDQSxlQUFPQSxJQUFQO0FBQ0Q7QUFDRjtBQUNGOztBQUVELFNBQU9JLHFCQUFxQixDQUFDUixPQUFELENBQTVCO0FBQ0Q7O0FBRUQsU0FBU1EscUJBQVQsQ0FBZ0NSLE9BQWhDLEVBQXlDO0FBQ3ZDLFFBQU1TLElBQUksR0FBRyxtQkFBTyxFQUFQLEVBQVcsTUFBWCxFQUFtQlQsT0FBbkIsRUFBNEJVLFdBQTVCLEdBQTBDQyxJQUExQyxFQUFiOztBQUVBLE9BQUssSUFBSVQsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR04scUJBQXFCLENBQUNPLE1BQTFDLEVBQWtERCxDQUFDLEVBQW5ELEVBQXVEO0FBQ3JELFVBQU1FLElBQUksR0FBR1IscUJBQXFCLENBQUNNLENBQUQsQ0FBbEM7O0FBQ0EsUUFBSVAsaUJBQWlCLENBQUNTLElBQUQsQ0FBakIsQ0FBd0JDLE9BQXhCLENBQWdDSSxJQUFoQyxLQUF5QyxDQUE3QyxFQUFnRDtBQUM5Q1QsTUFBQUEsT0FBTyxDQUFDTSxVQUFSLEdBQXFCRixJQUFyQjtBQUNBLGFBQU9BLElBQVA7QUFDRDtBQUNGOztBQUVELFNBQU8sS0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcHJvcE9yIH0gZnJvbSAncmFtZGEnXG5cbmNvbnN0IFNQRUNJQUxfVVNFX0ZMQUdTID0gWydcXFxcQWxsJywgJ1xcXFxBcmNoaXZlJywgJ1xcXFxEcmFmdHMnLCAnXFxcXEZsYWdnZWQnLCAnXFxcXEp1bmsnLCAnXFxcXFNlbnQnLCAnXFxcXFRyYXNoJ11cbmNvbnN0IFNQRUNJQUxfVVNFX0JPWEVTID0ge1xuICAnXFxcXFNlbnQnOiBbXG4gICAgJ2Fpa2EnLCAnYmlkYWxpYWsnLCAnYmlkYWxpdGEnLCAnZGloYW50YXInLCAnZSByb21ldHN3ZW5nJywgJ2UgdGluZGFtaScsICdlbGvDvGxkw7Z0dCcsICdlbGvDvGxkw7Z0dGVrJywgJ2VudmlhZGFzJyxcbiAgICAnZW52aWFkYXMnLCAnZW52aWFkb3MnLCAnZW52aWF0cycsICdlbnZvecOpcycsICdldGh1bnllbHdleW8nLCAnZXhwZWRpYXRlJywgJ2V6aXB1cnUnLCAnZ2VzZW5kZXRlJywgJ2dlc3R1dXInLFxuICAgICdnw7ZuZGVyaWxtacWfIMO2xJ9lbGVyJywgJ2fDtm5kyZlyaWzJmW5syZlyJywgJ2liZXJpbGVuJywgJ2ludmlhdGknLCAnacWhc2nFs3N0aWVqaScsICdrdXRodW55ZWx3ZScsICdsYXNhJywgJ2zDpGhldGV0eXQnLFxuICAgICdtZXNzYWdlcyBlbnZvecOpcycsICduYWlwYWRhbGEnLCAnbmFsZWZhJywgJ25hcGFkYWxhJywgJ25vc8WrdMSrdMSBcyB6acWGYXMnLCAnb2Rlc2xhbsOpJywgJ3BhZGFsYScsICdwb3NsYW5lJyxcbiAgICAncG9zbGFubycsICdwb3NsYW5vJywgJ3Bvc2xhbsOpJywgJ3Bvc2xhdG8nLCAnc2FhZGV0dWQnLCAnc2FhZGV0dWQga2lyamFkJywgJ3NlbmR0JywgJ3NlbmR0JywgJ3NlbnQnLCAnc2VudCBpdGVtcycsXG4gICAgJ3NlbnQgbWVzc2FnZXMnLCAnc8OkbmRhIHBvc3RlcicsICdzw6RudCcsICd0ZXJraXJpbScsICd0aSBmaSByYW7huaPhurknLCAndMOrIGTDq3JndWFyYScsICd2ZXJ6b25kZW4nLCAndmlsaXZ5b3R1bXdhJyxcbiAgICAnd3lzxYJhbmUnLCAnxJHDoyBn4butaScsICfPg8+EzrHOu864zq3Ovc+EzrEnLCAn0LbQuNCx0LXRgNC40LvQs9C10L0nLCAn0LbRltCx0LXRgNGW0LvQs9C10L3QtNC10YAnLCAn0LjQt9C/0YDQsNGC0LXQvdC4JywgJ9C40LvQs9GN0Y3RgdGN0L0nLCAn0LjRgNGB0L7QuyDRiNGD0LQnLCAn0LjRgdC/0YDQsNGC0LXQvdC+JyxcbiAgICAn0L3QsNC00ZbRgdC70LDQvdGWJywgJ9C+0YLQv9GA0LDQstC70LXQvdC90YvQtScsICfQv9Cw0YHQu9Cw0L3Ri9GPJywgJ9GO0LHQvtGA0LjQu9Cz0LDQvScsICfVuNaC1bLVodaA1a/VvtWh1a4nLCAn16DXqdec15fXlScsICfXpNeo15nXmNeZ150g16nXoNep15zXl9eVJywgJ9in2YTZhdix2LPZhNipJywgJ9io2r7bjNis25Ig2q/YptuSJyxcbiAgICAn2LPZiNiy2YXamNuBJywgJ9mE25Daq9mEINi02YjbjCcsICfZhdmI2KfYsdivINin2LHYs9in2YQg2LTYr9mHJywgJ+CkquCkvuCkoOCkteCkv+CksuClhycsICfgpKrgpL7gpKDgpLXgpL/gpLLgpYfgpLLgpYcnLCAn4KSq4KWN4KSw4KWH4KS34KS/4KSkJywgJ+CkreClh+CknOCkviDgpJfgpK/gpL4nLCAn4Kaq4KeN4Kaw4KeH4Kaw4Ka/4KakJywgJ+CmquCnjeCmsOCnh+CmsOCmv+CmpCcsICfgpqrgp43gp7Dgp4fgp7Dgpr/gpqQnLCAn4Kit4KmH4Kic4KmHJywgJ+CqruCri+CqleCqsuCrh+CqsuCqvicsXG4gICAgJ+CsquCsoOCsvuCsl+CssuCsvicsICfgroXgrqngr4Hgrqrgr43grqrgrr/grq/grrXgr4gnLCAn4LCq4LCC4LCq4LC/4LCC4LCa4LCs4LCh4LC/4LCC4LCm4LC/JywgJ+CyleCys+CzgeCyueCyv+CyuOCysuCyvuCypicsICfgtIXgtK/gtJrgtY3gtJrgtYEnLCAn4La64LeQ4LeA4LeUIOC2tOC2q+C3kuC3gOC3lOC2qScsICfguKrguYjguIfguYHguKXguYnguKcnLCAn4YOS4YOQ4YOS4YOW4YOQ4YOV4YOc4YOY4YOa4YOYJywgJ+GLqOGJsOGIi+GKqScsICfhnpThnrbhnpPigIvhnpXhn5Lhnonhnr4nLFxuICAgICflr4Tku7blgpnku70nLCAn5a+E5Lu25YKZ5Lu9JywgJ+W3suWPkeS/oeaBrycsICfpgIHkv6HmuIjjgb/vvpLvvbDvvpknLCAn67Cc7IugIOuplOyLnOyngCcsICfrs7Trgrgg7Y647KeA7ZWoJ1xuICBdLFxuICAnXFxcXFRyYXNoJzogW1xuICAgICdhcnRpY29sZSDImXRlcnNlJywgJ2JpbicsICdib3J0dGFnbmEgb2JqZWt0JywgJ2RlbGV0ZWQnLCAnZGVsZXRlZCBpdGVtcycsICdkZWxldGVkIG1lc3NhZ2VzJywgJ2VsZW1lbnRpIGVsaW1pbmF0aScsXG4gICAgJ2VsZW1lbnRvcyBib3JyYWRvcycsICdlbGVtZW50b3MgZWxpbWluYWRvcycsICdnZWzDtnNjaHRlIG9iamVrdGUnLCAnaXRlbSBkaXBhZGFtJywgJ2l0ZW5zIGFwYWdhZG9zJywgJ2l0ZW5zIGV4Y2x1w61kb3MnLFxuICAgICdt4bulYyDEkcOjIHjDs2EnLCAnb2RzdHJhbsSbbsOpIHBvbG/Fvmt5JywgJ3Blc2FuIHRlcmhhcHVzJywgJ3BvaXN0ZXR1dCcsICdwcmFodCcsICdwcsO8Z2lrYXN0JywgJ3NpbGlubWnFnyDDtsSfZWxlcicsXG4gICAgJ3NsZXR0ZWRlIGJlc2tlZGVyJywgJ3NsZXR0ZWRlIGVsZW1lbnRlcicsICd0cmFzaCcsICd0w7Zyw7ZsdCBlbGVtZWsnLCAndXN1bmnEmXRlIHdpYWRvbW/Fm2NpJywgJ3ZlcndpamRlcmRlIGl0ZW1zJyxcbiAgICAndnltYXphbsOpIHNwcsOhdnknLCAnw6lsw6ltZW50cyBzdXBwcmltw6lzJywgJ9Cy0LjQtNCw0LvQtdC90ZYnLCAn0LbQvtC50YvQu9KT0LDQvdC00LDRgCcsICfRg9C00LDQu9C10L3QvdGL0LUnLCAn16TXqNeZ15jXmdedINep16DXnteX16fXlScsICfYp9mE2LnZhtin2LXYsSDYp9mE2YXYrdiw2YjZgdipJyxcbiAgICAn2YXZiNin2LHYryDYrdiw2YEg2LTYr9mHJywgJ+C4o+C4suC4ouC4geC4suC4o+C4l+C4teC5iOC4peC4micsICflt7LliKDpmaTpgq7ku7YnLCAn5bey5Yiq6Zmk6aCF55uuJywgJ+W3suWIqumZpOmgheebridcbiAgXSxcbiAgJ1xcXFxKdW5rJzogW1xuICAgICdidWxrIG1haWwnLCAnY29ycmVvIG5vIGRlc2VhZG8nLCAnY291cnJpZXIgaW5kw6lzaXJhYmxlJywgJ2lzdGVubWV5ZW4nLCAnaXN0ZW5tZXllbiBlLXBvc3RhJywgJ2p1bmsnLCAnbGV2w6lsc3plbcOpdCcsXG4gICAgJ25ldnnFvmlhZGFuw6EgcG/FoXRhJywgJ25ldnnFvsOhZGFuw6EgcG/FoXRhJywgJ25vIGRlc2VhZG8nLCAncG9zdGEgaW5kZXNpZGVyYXRhJywgJ3BvdXJyaWVsJywgJ3Jvc2thcG9zdGknLCAnc2tyw6RwcG9zdCcsXG4gICAgJ3NwYW0nLCAnc3BhbScsICdzcGFtb3dhbmllJywgJ3PDuHBwZWxwb3N0JywgJ3RoxrAgcsOhYycsICfRgdC/0LDQvCcsICfXk9eV15DXqCDXlteR15wnLCAn2KfZhNix2LPYp9im2YQg2KfZhNi52LTZiNin2KbZitipJywgJ9mH2LHYstmG2KfZhdmHJywgJ+C4quC5geC4m+C4oScsXG4gICAgJ+KAjuWeg+WcvumDteS7ticsICflnoPlnL7pgq7ku7YnLCAn5Z6D5Zy+6Zu76YO1J1xuICBdLFxuICAnXFxcXERyYWZ0cyc6IFtcbiAgICAnYmEgYnJvdWlsbG9uJywgJ2JvcnJhZG9yJywgJ2JvcnJhZG9yJywgJ2JvcnJhZG9yZXMnLCAnYm96emUnLCAnYnJvdWlsbG9ucycsICdi4bqjbiB0aOG6o28nLCAnY2lvcm5lJywgJ2NvbmNlcHRlbicsICdkcmFmJyxcbiAgICAnZHJhZnRzJywgJ2Ryw7ZnJywgJ2VudHfDvHJmZScsICdlc2JvcnJhbnlzJywgJ2dhcmFsYW1hbGFyJywgJ2loZSBlZGV0dXJ1JywgJ2lpZHJhZnRpJywgJ2l6aW5obGFrYScsICdqdW9kcmHFocSNaWFpJywgJ2tsYWRkJyxcbiAgICAna2xhZGRlcicsICdrb25jZXB0eScsICdrb25jZXB0eScsICdrb25zZXAnLCAna29uc2VwdGUnLCAna29waWUgcm9ib2N6ZScsICdsYXlpaMmZbMmZcicsICdsdW9ubm9rc2V0JywgJ21lbG5yYWtzdGknLCAnbWVyYWxvJyxcbiAgICAnbWVzYXpoZSB0w6sgcGFkw6tyZ3VhcmEnLCAnbWdhIGRyYWZ0JywgJ211c3RhbmRpZCcsICduYWNydGknLCAnbmFjcnRpJywgJ29zbnV0a2knLCAncGlzemtvemF0b2snLCAncmFzY3VuaG9zJywgJ3Jhc2ltdScsXG4gICAgJ3NraWNlJywgJ3Rhc2xha2xhcicsICd0c2FyYXJydW4gc2HGmW9ubmknLCAndXRrYXN0JywgJ3Zha2lyYW9rYScsICd2w6F6bGF0b2snLCAnemlycmlib3Jyb2FrJywgJ8Ogd+G7jW4gw6Br4buNcGFt4buNzIEnLCAnz4DPgc+Mz4fOtc65z4HOsScsXG4gICAgJ9C20L7QsdCw0LvQsNGAJywgJ9C90LDRhtGA0YLQuCcsICfQvdC+0L7RgNCz0YPRg9C0JywgJ9GB0LjRkdKz0L3QsNCy0LjRgScsICfRhdC+0LzQsNC60Lgg0YXQsNGC0LvQsNGAJywgJ9GH0LDRgNC90LDQstGW0LrRlicsICfRh9C10YDQvdC10YLQutC4JywgJ9GH0LXRgNC90L7QstC4JywgJ9GH0LXRgNC90L7QstC40LrQuCcsICfRh9C10YDQvdC+0LLQuNC60YLQtdGAJyxcbiAgICAn1b3Wh9Wh1aPWgNWl1oAnLCAn15jXmdeV15jXldeqJywgJ9mF2LPZiNiv2KfYqicsICfZhdiz2YjYr9in2KonLCAn2YXZiNiz2YjYr9uQJywgJ9m+24zYtCDZhtmI24zYs9mH2KcnLCAn2ojYsdin2YHZuS8nLCAn4KSh4KWN4KSw4KS+4KWe4KWN4KSfJywgJ+CkquCljeCksOCkvuCksOClguCkqicsICfgppbgprjgp5zgpr4nLCAn4KaW4Ka44Kec4Ka+JywgJ+CmoeCnjeCnsOCmvuCmq+CnjeCmnycsICfgqKHgqY3gqLDgqL7gqKvgqJ8nLCAn4Kqh4KuN4Kqw4Kq+4Kqr4KuN4Kqf4Kq4JyxcbiAgICAn4Kyh4K2N4Kyw4Ky+4Kyr4K2N4KyfJywgJ+CuteCusOCviOCuteCvgeCuleCus+CvjScsICfgsJrgsL/gsKTgsY3gsKTgsYEg4LCq4LGN4LCw4LCk4LGB4LCy4LGBJywgJ+CyleCysOCyoeCzgeCyl+Cys+CzgScsICfgtJXgtLDgtJ/gtYHgtJXgtLPgtY3igI0nLCAn4Laa4LeZ4Lan4LeU4La44LeKIOC2tOC2reC3iicsICfguInguJrguLHguJrguKPguYjguLLguIcnLCAn4YOb4YOd4YOc4YOQ4YOu4YOQ4YOW4YOU4YOR4YOYJywgJ+GIqOGJguGJhuGJvScsICfhnp/hnrbhnprhnpbhn5LhnprhnrbhnoQnLCAn5LiL5pu444GNJywgJ+iNieeovycsXG4gICAgJ+iNieeovycsICfojYnnqL8nLCAn7J6E7IucIOuztOq0gO2VqCdcbiAgXVxufVxuY29uc3QgU1BFQ0lBTF9VU0VfQk9YX0ZMQUdTID0gT2JqZWN0LmtleXMoU1BFQ0lBTF9VU0VfQk9YRVMpXG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgbWFpbGJveCBpcyBmb3Igc3BlY2lhbCB1c2VcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gbWFpbGJveFxuICogQHJldHVybiB7U3RyaW5nfSBTcGVjaWFsIHVzZSBmbGFnIChpZiBkZXRlY3RlZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrU3BlY2lhbFVzZSAobWFpbGJveCkge1xuICBpZiAobWFpbGJveC5mbGFncykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgU1BFQ0lBTF9VU0VfRkxBR1MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHR5cGUgPSBTUEVDSUFMX1VTRV9GTEFHU1tpXVxuICAgICAgaWYgKChtYWlsYm94LmZsYWdzIHx8IFtdKS5pbmRleE9mKHR5cGUpID49IDApIHtcbiAgICAgICAgbWFpbGJveC5zcGVjaWFsVXNlID0gdHlwZVxuICAgICAgICBtYWlsYm94LnNwZWNpYWxVc2VGbGFnID0gdHlwZVxuICAgICAgICByZXR1cm4gdHlwZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjaGVja1NwZWNpYWxVc2VCeU5hbWUobWFpbGJveClcbn1cblxuZnVuY3Rpb24gY2hlY2tTcGVjaWFsVXNlQnlOYW1lIChtYWlsYm94KSB7XG4gIGNvbnN0IG5hbWUgPSBwcm9wT3IoJycsICduYW1lJywgbWFpbGJveCkudG9Mb3dlckNhc2UoKS50cmltKClcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IFNQRUNJQUxfVVNFX0JPWF9GTEFHUy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHR5cGUgPSBTUEVDSUFMX1VTRV9CT1hfRkxBR1NbaV1cbiAgICBpZiAoU1BFQ0lBTF9VU0VfQk9YRVNbdHlwZV0uaW5kZXhPZihuYW1lKSA+PSAwKSB7XG4gICAgICBtYWlsYm94LnNwZWNpYWxVc2UgPSB0eXBlXG4gICAgICByZXR1cm4gdHlwZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuIl19 \ No newline at end of file diff --git a/src/imap.js b/src/imap.js index 5044f8c0..d40d8b24 100644 --- a/src/imap.js +++ b/src/imap.js @@ -346,8 +346,7 @@ export default class Imap { } else { if (!this.socket) { this._onError(new Error("Error :: Unexpected socket close")); - } - else { + } else { this.socket.send(buffer); } } From ec21f6694a9fe485e4b6e6592bb49a28b98f74fe Mon Sep 17 00:00:00 2001 From: mihkelkruuse Date: Wed, 26 Aug 2020 08:37:00 +0300 Subject: [PATCH 6/8] repo loc --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c4f0bd79..abdf1f27 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ }, "repository": { "type": "git", - "url": "git://github.com/emailjs/emailjs-imap-client.git" + "url": "git://github.com/pipedrive/emailjs-imap-client.git" }, "main": "dist/index", "dependencies": { From 3b49ef92008ac0c7008c0b50d8febb18f655343e Mon Sep 17 00:00:00 2001 From: mihkelkruuse Date: Wed, 26 Aug 2020 09:19:12 +0300 Subject: [PATCH 7/8] repo loc --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index abdf1f27..28798a6c 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ }, "repository": { "type": "git", - "url": "git://github.com/pipedrive/emailjs-imap-client.git" + "url": "git+https://github.com/pipedrive/emailjs-imap-client.git" }, "main": "dist/index", "dependencies": { From dae80f75ea8265c72b30124018c60f791955ef27 Mon Sep 17 00:00:00 2001 From: mihkelkruuse Date: Thu, 27 Aug 2020 12:58:52 +0300 Subject: [PATCH 8/8] Added updated dist files --- dist/client-integration.js | 466 +++++++++++++ dist/client-unit.js | 1105 ++++++++++++++++++++++++++++++ dist/client.js | 1233 ++++++++++++++++++++++++++++++++++ dist/command-builder-unit.js | 369 ++++++++++ dist/command-builder.js | 241 +++++++ dist/command-parser-unit.js | 461 +++++++++++++ dist/command-parser.js | 573 ++++++++++++++++ dist/common.js | 27 + dist/compression-worker.js | 41 ++ dist/compression.js | 140 ++++ dist/imap-unit.js | 764 +++++++++++++++++++++ dist/imap.js | 948 ++++++++++++++++++++++++++ dist/index.js | 52 ++ dist/logger.js | 38 ++ dist/special-use-unit.js | 42 ++ dist/special-use.js | 55 ++ res/compression.worker.blob | 2 +- src/imap.js | 4 +- 18 files changed, 6558 insertions(+), 3 deletions(-) create mode 100644 dist/client-integration.js create mode 100644 dist/client-unit.js create mode 100644 dist/client.js create mode 100644 dist/command-builder-unit.js create mode 100644 dist/command-builder.js create mode 100644 dist/command-parser-unit.js create mode 100644 dist/command-parser.js create mode 100644 dist/common.js create mode 100644 dist/compression-worker.js create mode 100644 dist/compression.js create mode 100644 dist/imap-unit.js create mode 100644 dist/imap.js create mode 100644 dist/index.js create mode 100644 dist/logger.js create mode 100644 dist/special-use-unit.js create mode 100644 dist/special-use.js diff --git a/dist/client-integration.js b/dist/client-integration.js new file mode 100644 index 00000000..3ea639cd --- /dev/null +++ b/dist/client-integration.js @@ -0,0 +1,466 @@ +"use strict"; + +var _hoodiecrowImap = _interopRequireDefault(require("hoodiecrow-imap")); + +var _ = _interopRequireWildcard(require("..")); + +var _commandParser = require("./command-parser"); + +var _commandBuilder = require("./command-builder"); + +function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/* eslint-disable no-unused-expressions */ +process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; +describe('browserbox integration tests', () => { + let imap; + const port = 10000; + let server; + beforeEach(done => { + // start imap test server + var options = { + // debug: true, + plugins: ['STARTTLS', 'X-GM-EXT-1'], + secureConnection: false, + storage: { + INBOX: { + messages: [{ + raw: 'Subject: hello 1\r\n\r\nWorld 1!' + }, { + raw: 'Subject: hello 2\r\n\r\nWorld 2!', + flags: ['\\Seen'] + }, { + raw: 'Subject: hello 3\r\n\r\nWorld 3!', + uid: 555 + }, { + raw: 'From: sender name \r\nTo: Receiver name \r\nSubject: hello 4\r\nMessage-Id: \r\nDate: Fri, 13 Sep 2013 15:01:00 +0300\r\n\r\nWorld 4!' + }, { + raw: 'Subject: hello 5\r\n\r\nWorld 5!', + flags: ['$MyFlag', '\\Deleted'], + uid: 557 + }, { + raw: 'Subject: hello 6\r\n\r\nWorld 6!' + }, { + raw: 'Subject: hello 7\r\n\r\nWorld 7!', + uid: 600 + }] + }, + '': { + separator: '/', + folders: { + '[Gmail]': { + flags: ['\\Noselect'], + folders: { + 'All Mail': { + 'special-use': '\\All' + }, + Drafts: { + 'special-use': '\\Drafts' + }, + Important: { + 'special-use': '\\Important' + }, + 'Sent Mail': { + 'special-use': '\\Sent' + }, + Spam: { + 'special-use': '\\Junk' + }, + Starred: { + 'special-use': '\\Flagged' + }, + Trash: { + 'special-use': '\\Trash' + }, + A: { + messages: [{}] + }, + B: { + messages: [{}] + } + } + } + } + } + } + }; + server = (0, _hoodiecrowImap.default)(options); + server.listen(port, done); + }); + afterEach(done => { + server.close(done); + }); + describe('Connection tests', () => { + var insecureServer; + beforeEach(done => { + // start imap test server + var options = { + // debug: true, + plugins: [], + secureConnection: false + }; + insecureServer = (0, _hoodiecrowImap.default)(options); + insecureServer.listen(port + 2, done); + }); + afterEach(done => { + insecureServer.close(done); + }); + it('should use STARTTLS by default', () => { + imap = new _.default('127.0.0.1', port, { + logLevel: _.LOG_LEVEL_NONE, + auth: { + user: 'testuser', + pass: 'testpass' + }, + useSecureTransport: false + }); + return imap.connect().then(() => { + expect(imap.client.secureMode).to.be.true; + }).then(() => { + return imap.close(); + }); + }); + it('should ignore STARTTLS', () => { + imap = new _.default('127.0.0.1', port, { + logLevel: _.LOG_LEVEL_NONE, + auth: { + user: 'testuser', + pass: 'testpass' + }, + useSecureTransport: false, + ignoreTLS: true + }); + return imap.connect().then(() => { + expect(imap.client.secureMode).to.be.false; + }).then(() => { + return imap.close(); + }); + }); + it('should fail connecting to non-STARTTLS host', () => { + imap = new _.default('127.0.0.1', port + 2, { + logLevel: _.LOG_LEVEL_NONE, + auth: { + user: 'testuser', + pass: 'testpass' + }, + useSecureTransport: false, + requireTLS: true + }); + return imap.connect().catch(err => { + expect(err).to.exist; + }); + }); + it('should connect to non secure host', () => { + imap = new _.default('127.0.0.1', port + 2, { + logLevel: _.LOG_LEVEL_NONE, + auth: { + user: 'testuser', + pass: 'testpass' + }, + useSecureTransport: false + }); + return imap.connect().then(() => { + expect(imap.client.secureMode).to.be.false; + }).then(() => { + return imap.close(); + }); + }); + it('should fail authentication', done => { + imap = new _.default('127.0.0.1', port + 2, { + logLevel: _.LOG_LEVEL_NONE, + auth: { + user: 'invalid', + pass: 'invalid' + }, + useSecureTransport: false + }); + imap.connect().then(() => { + expect(imap.client.secureMode).to.be.false; + }).catch(() => { + done(); + }); + }); + }); + describe('Post login tests', () => { + beforeEach(() => { + imap = new _.default('127.0.0.1', port, { + logLevel: _.LOG_LEVEL_NONE, + auth: { + user: 'testuser', + pass: 'testpass' + }, + useSecureTransport: false + }); + return imap.connect().then(() => { + return imap.selectMailbox('[Gmail]/Spam'); + }); + }); + afterEach(() => { + return imap.close(); + }); + describe('#listMailboxes', () => { + it('should succeed', () => { + return imap.listMailboxes().then(mailboxes => { + expect(mailboxes).to.exist; + }); + }); + }); + describe('#listMessages', () => { + it('should succeed', () => { + return imap.listMessages('inbox', '1:*', ['uid', 'flags', 'envelope', 'bodystructure', 'body.peek[]']).then(messages => { + expect(messages).to.not.be.empty; + }); + }); + }); + describe('#upload', () => { + it('should succeed', () => { + var msgCount; + return imap.listMessages('inbox', '1:*', ['uid', 'flags', 'envelope', 'bodystructure']).then(messages => { + expect(messages).to.not.be.empty; + msgCount = messages.length; + }).then(() => { + return imap.upload('inbox', 'MIME-Version: 1.0\r\nDate: Wed, 9 Jul 2014 15:07:47 +0200\r\nDelivered-To: test@test.com\r\nMessage-ID: \r\nSubject: test\r\nFrom: Test Test \r\nTo: Test Test \r\nContent-Type: text/plain; charset=UTF-8\r\n\r\ntest', { + flags: ['\\Seen', '\\Answered', '\\$MyFlag'] + }); + }).then(() => { + return imap.listMessages('inbox', '1:*', ['uid', 'flags', 'envelope', 'bodystructure']); + }).then(messages => { + expect(messages.length).to.equal(msgCount + 1); + }); + }); + }); + describe('#search', () => { + it('should return a sequence number', () => { + return imap.search('inbox', { + header: ['subject', 'hello 3'] + }).then(result => { + expect(result).to.deep.equal([3]); + }); + }); + it('should return an uid', () => { + return imap.search('inbox', { + header: ['subject', 'hello 3'] + }, { + byUid: true + }).then(result => { + expect(result).to.deep.equal([555]); + }); + }); + it('should work with complex queries', () => { + return imap.search('inbox', { + header: ['subject', 'hello'], + seen: true + }).then(result => { + expect(result).to.deep.equal([2]); + }); + }); + }); + describe('#setFlags', () => { + it('should set flags for a message', () => { + return imap.setFlags('inbox', '1', ['\\Seen', '$MyFlag']).then(result => { + expect(result).to.deep.equal([{ + '#': 1, + flags: ['\\Seen', '$MyFlag'] + }]); + }); + }); + it('should add flags to a message', () => { + return imap.setFlags('inbox', '2', { + add: ['$MyFlag'] + }).then(result => { + expect(result).to.deep.equal([{ + '#': 2, + flags: ['\\Seen', '$MyFlag'] + }]); + }); + }); + it('should remove flags from a message', () => { + return imap.setFlags('inbox', '557', { + remove: ['\\Deleted'] + }, { + byUid: true + }).then(result => { + expect(result).to.deep.equal([{ + '#': 5, + flags: ['$MyFlag'], + uid: 557 + }]); + }); + }); + it('should not return anything on silent mode', () => { + return imap.setFlags('inbox', '1', ['$MyFlag2'], { + silent: true + }).then(result => { + expect(result).to.deep.equal([]); + }); + }); + }); + describe('#store', () => { + it('should add labels for a message', () => { + return imap.store('inbox', '1', '+X-GM-LABELS', ['\\Sent', '\\Junk']).then(result => { + expect(result).to.deep.equal([{ + '#': 1, + 'x-gm-labels': ['\\Inbox', '\\Sent', '\\Junk'] + }]); + }); + }); + it('should set labels for a message', () => { + return imap.store('inbox', '1', 'X-GM-LABELS', ['\\Sent', '\\Junk']).then(result => { + expect(result).to.deep.equal([{ + '#': 1, + 'x-gm-labels': ['\\Sent', '\\Junk'] + }]); + }); + }); + it('should remove labels from a message', () => { + return imap.store('inbox', '1', '-X-GM-LABELS', ['\\Sent', '\\Inbox']).then(result => { + expect(result).to.deep.equal([{ + '#': 1, + 'x-gm-labels': [] + }]); + }); + }); + }); + describe('#deleteMessages', () => { + it('should delete a message', () => { + var initialInfo; + var expungeNotified = new Promise((resolve, reject) => { + imap.onupdate = function (mb, type + /*, data */ + ) { + try { + expect(mb).to.equal('inbox'); + expect(type).to.equal('expunge'); + resolve(); + } catch (err) { + reject(err); + } + }; + }); + return imap.selectMailbox('inbox').then(info => { + initialInfo = info; + return imap.deleteMessages('inbox', 557, { + byUid: true + }); + }).then(() => { + return imap.selectMailbox('inbox'); + }).then(resultInfo => { + expect(initialInfo.exists - 1 === resultInfo.exists).to.be.true; + }).then(() => expungeNotified); + }); + }); + describe('#copyMessages', () => { + it('should copy a message', () => { + return imap.copyMessages('inbox', 555, '[Gmail]/Trash', { + byUid: true + }).then(() => { + return imap.selectMailbox('[Gmail]/Trash'); + }).then(info => { + expect(info.exists).to.equal(1); + }); + }); + }); + describe('#moveMessages', () => { + it('should move a message', () => { + var initialInfo; + return imap.selectMailbox('inbox').then(info => { + initialInfo = info; + return imap.moveMessages('inbox', 555, '[Gmail]/Spam', { + byUid: true + }); + }).then(() => { + return imap.selectMailbox('[Gmail]/Spam'); + }).then(info => { + expect(info.exists).to.equal(1); + return imap.selectMailbox('inbox'); + }).then(resultInfo => { + expect(initialInfo.exists).to.not.equal(resultInfo.exists); + }); + }); + }); + describe('precheck', () => { + it('should handle precheck error correctly', () => { + // simulates a broken search command + var search = (query, options = {}) => { + var command = (0, _commandBuilder.buildSEARCHCommand)(query, options); + return imap.exec(command, 'SEARCH', { + precheck: () => Promise.reject(new Error('FOO')) + }).then(response => (0, _commandParser.parseSEARCH)(response)); + }; + + return imap.selectMailbox('inbox').then(() => search({ + header: ['subject', 'hello 3'] + })).catch(err => { + expect(err.message).to.equal('FOO'); + return imap.selectMailbox('[Gmail]/Spam'); + }); + }); + it('should select correct mailboxes in prechecks on concurrent calls', () => { + return imap.selectMailbox('[Gmail]/A').then(() => { + return Promise.all([imap.selectMailbox('[Gmail]/B'), imap.setFlags('[Gmail]/A', '1', ['\\Seen'])]); + }).then(() => { + return imap.listMessages('[Gmail]/A', '1:1', ['flags']); + }).then(messages => { + expect(messages.length).to.equal(1); + expect(messages[0].flags).to.deep.equal(['\\Seen']); + }); + }); + it('should send precheck commands in correct order on concurrent calls', () => { + return Promise.all([imap.setFlags('[Gmail]/A', '1', ['\\Seen']), imap.setFlags('[Gmail]/B', '1', ['\\Seen'])]).then(() => { + return imap.listMessages('[Gmail]/A', '1:1', ['flags']); + }).then(messages => { + expect(messages.length).to.equal(1); + expect(messages[0].flags).to.deep.equal(['\\Seen']); + }).then(() => { + return imap.listMessages('[Gmail]/B', '1:1', ['flags']); + }).then(messages => { + expect(messages.length).to.equal(1); + expect(messages[0].flags).to.deep.equal(['\\Seen']); + }); + }); + }); + }); + describe('Timeout', () => { + beforeEach(() => { + imap = new _.default('127.0.0.1', port, { + logLevel: _.LOG_LEVEL_NONE, + auth: { + user: 'testuser', + pass: 'testpass' + }, + useSecureTransport: false + }); + return imap.connect().then(() => { + // remove the ondata event to simulate 100% packet loss and make the socket time out after 10ms + imap.client.timeoutSocketLowerBound = 10; + imap.client.timeoutSocketMultiplier = 0; + + imap.client.socket.ondata = () => {}; + }); + }); + it('should timeout', done => { + imap.onerror = () => { + done(); + }; + + imap.selectMailbox('inbox').catch(() => {}); + }); + it('should reject all pending commands on timeout', () => { + let rejectionCount = 0; + return Promise.all([imap.selectMailbox('INBOX').catch(err => { + expect(err).to.exist; + rejectionCount++; + }), imap.listMessages('INBOX', '1:*', ['body.peek[]']).catch(err => { + expect(err).to.exist; + rejectionCount++; + })]).then(() => { + expect(rejectionCount).to.equal(2); + }); + }); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGllbnQtaW50ZWdyYXRpb24uanMiXSwibmFtZXMiOlsicHJvY2VzcyIsImVudiIsIk5PREVfVExTX1JFSkVDVF9VTkFVVEhPUklaRUQiLCJkZXNjcmliZSIsImltYXAiLCJwb3J0Iiwic2VydmVyIiwiYmVmb3JlRWFjaCIsImRvbmUiLCJvcHRpb25zIiwicGx1Z2lucyIsInNlY3VyZUNvbm5lY3Rpb24iLCJzdG9yYWdlIiwiSU5CT1giLCJtZXNzYWdlcyIsInJhdyIsImZsYWdzIiwidWlkIiwic2VwYXJhdG9yIiwiZm9sZGVycyIsIkRyYWZ0cyIsIkltcG9ydGFudCIsIlNwYW0iLCJTdGFycmVkIiwiVHJhc2giLCJBIiwiQiIsImxpc3RlbiIsImFmdGVyRWFjaCIsImNsb3NlIiwiaW5zZWN1cmVTZXJ2ZXIiLCJpdCIsIkltYXBDbGllbnQiLCJsb2dMZXZlbCIsImF1dGgiLCJ1c2VyIiwicGFzcyIsInVzZVNlY3VyZVRyYW5zcG9ydCIsImNvbm5lY3QiLCJ0aGVuIiwiZXhwZWN0IiwiY2xpZW50Iiwic2VjdXJlTW9kZSIsInRvIiwiYmUiLCJ0cnVlIiwiaWdub3JlVExTIiwiZmFsc2UiLCJyZXF1aXJlVExTIiwiY2F0Y2giLCJlcnIiLCJleGlzdCIsInNlbGVjdE1haWxib3giLCJsaXN0TWFpbGJveGVzIiwibWFpbGJveGVzIiwibGlzdE1lc3NhZ2VzIiwibm90IiwiZW1wdHkiLCJtc2dDb3VudCIsImxlbmd0aCIsInVwbG9hZCIsImVxdWFsIiwic2VhcmNoIiwiaGVhZGVyIiwicmVzdWx0IiwiZGVlcCIsImJ5VWlkIiwic2VlbiIsInNldEZsYWdzIiwiYWRkIiwicmVtb3ZlIiwic2lsZW50Iiwic3RvcmUiLCJpbml0aWFsSW5mbyIsImV4cHVuZ2VOb3RpZmllZCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0Iiwib251cGRhdGUiLCJtYiIsInR5cGUiLCJpbmZvIiwiZGVsZXRlTWVzc2FnZXMiLCJyZXN1bHRJbmZvIiwiZXhpc3RzIiwiY29weU1lc3NhZ2VzIiwibW92ZU1lc3NhZ2VzIiwicXVlcnkiLCJjb21tYW5kIiwiZXhlYyIsInByZWNoZWNrIiwiRXJyb3IiLCJyZXNwb25zZSIsIm1lc3NhZ2UiLCJhbGwiLCJ0aW1lb3V0U29ja2V0TG93ZXJCb3VuZCIsInRpbWVvdXRTb2NrZXRNdWx0aXBsaWVyIiwic29ja2V0Iiwib25kYXRhIiwib25lcnJvciIsInJlamVjdGlvbkNvdW50Il0sIm1hcHBpbmdzIjoiOztBQUVBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7OztBQUxBO0FBT0FBLE9BQU8sQ0FBQ0MsR0FBUixDQUFZQyw0QkFBWixHQUEyQyxHQUEzQztBQUVBQyxRQUFRLENBQUMsOEJBQUQsRUFBaUMsTUFBTTtBQUM3QyxNQUFJQyxJQUFKO0FBQ0EsUUFBTUMsSUFBSSxHQUFHLEtBQWI7QUFDQSxNQUFJQyxNQUFKO0FBRUFDLEVBQUFBLFVBQVUsQ0FBRUMsSUFBRCxJQUFVO0FBQ25CO0FBQ0EsUUFBSUMsT0FBTyxHQUFHO0FBQ1o7QUFDQUMsTUFBQUEsT0FBTyxFQUFFLENBQUMsVUFBRCxFQUFhLFlBQWIsQ0FGRztBQUdaQyxNQUFBQSxnQkFBZ0IsRUFBRSxLQUhOO0FBSVpDLE1BQUFBLE9BQU8sRUFBRTtBQUNQQyxRQUFBQSxLQUFLLEVBQUU7QUFDTEMsVUFBQUEsUUFBUSxFQUFFLENBQ1I7QUFBRUMsWUFBQUEsR0FBRyxFQUFFO0FBQVAsV0FEUSxFQUVSO0FBQUVBLFlBQUFBLEdBQUcsRUFBRSxrQ0FBUDtBQUEyQ0MsWUFBQUEsS0FBSyxFQUFFLENBQUMsUUFBRDtBQUFsRCxXQUZRLEVBR1I7QUFBRUQsWUFBQUEsR0FBRyxFQUFFLGtDQUFQO0FBQTJDRSxZQUFBQSxHQUFHLEVBQUU7QUFBaEQsV0FIUSxFQUlSO0FBQUVGLFlBQUFBLEdBQUcsRUFBRTtBQUFQLFdBSlEsRUFLUjtBQUFFQSxZQUFBQSxHQUFHLEVBQUUsa0NBQVA7QUFBMkNDLFlBQUFBLEtBQUssRUFBRSxDQUFDLFNBQUQsRUFBWSxXQUFaLENBQWxEO0FBQTRFQyxZ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QU07QUFDWkMsUUFBQUEsTUFBTSxDQUFDNEQsY0FBRCxDQUFOLENBQXVCekQsRUFBdkIsQ0FBMEJrQixLQUExQixDQUFnQyxDQUFoQztBQUNELE9BZE0sQ0FBUDtBQWVELEtBakJDLENBQUY7QUFrQkQsR0EzQ08sQ0FBUjtBQTRDRCxDQXBkTyxDQUFSIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovXG5cbmltcG9ydCBob29kaWVjcm93IGZyb20gJ2hvb2RpZWNyb3ctaW1hcCdcbmltcG9ydCBJbWFwQ2xpZW50LCB7IExPR19MRVZFTF9OT05FIGFzIGxvZ0xldmVsIH0gZnJvbSAnLi4nXG5pbXBvcnQgeyBwYXJzZVNFQVJDSCB9IGZyb20gJy4vY29tbWFuZC1wYXJzZXInXG5pbXBvcnQgeyBidWlsZFNFQVJDSENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmQtYnVpbGRlcidcblxucHJvY2Vzcy5lbnYuTk9ERV9UTFNfUkVKRUNUX1VOQVVUSE9SSVpFRCA9ICcwJ1xuXG5kZXNjcmliZSgnYnJvd3NlcmJveCBpbnRlZ3JhdGlvbiB0ZXN0cycsICgpID0+IHtcbiAgbGV0IGltYXBcbiAgY29uc3QgcG9ydCA9IDEwMDAwXG4gIGxldCBzZXJ2ZXJcblxuICBiZWZvcmVFYWNoKChkb25lKSA9PiB7XG4gICAgLy8gc3RhcnQgaW1hcCB0ZXN0IHNlcnZlclxuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgLy8gZGVidWc6IHRydWUsXG4gICAgICBwbHVnaW5zOiBbJ1NUQVJUVExTJywgJ1gtR00tRVhULTEnXSxcbiAgICAgIHNlY3VyZUNvbm5lY3Rpb246IGZhbHNlLFxuICAgICAgc3RvcmFnZToge1xuICAgICAgICBJTkJPWDoge1xuICAgICAgICAgIG1lc3NhZ2VzOiBbXG4gICAgICAgICAgICB7IHJhdzogJ1N1YmplY3Q6IGhlbGxvIDFcXHJcXG5cXHJcXG5Xb3JsZCAxIScgfSxcbiAgICAgICAgICAgIHsgcmF3OiAnU3ViamVjdDogaGVsbG8gMlxcclxcblxcclxcbldvcmxkIDIhJywgZmxhZ3M6IFsnXFxcXFNlZW4nXSB9LFxuICAgICAgICAgICAgeyByYXc6ICdTdWJqZWN0OiBoZWxsbyAzXFxyXFxuXFxyXFxuV29ybGQgMyEnLCB1aWQ6IDU1NSB9LFxuICAgICAgICAgICAgeyByYXc6ICdGcm9tOiBzZW5kZXIgbmFtZSA8c2VuZGVyQGV4YW1wbGUuY29tPlxcclxcblRvOiBSZWNlaXZlciBuYW1lIDxyZWNlaXZlckBleGFtcGxlLmNvbT5cXHJcXG5TdWJqZWN0OiBoZWxsbyA0XFxyXFxuTWVzc2FnZS1JZDogPGFiY2RlPlxcclxcbkRhdGU6IEZyaSwgMTMgU2VwIDIwMTMgMTU6MDE6MDAgKzAzMDBcXHJcXG5cXHJcXG5Xb3JsZCA0IScgfSxcbiAgICAgICAgICAgIHsgcmF3OiAnU3ViamVjdDogaGVsbG8gNVxcclxcblxcclxcbldvcmxkIDUhJywgZmxhZ3M6IFsnJE15RmxhZycsICdcXFxcRGVsZXRlZCddLCB1aWQ6IDU1NyB9LFxuICAgICAgICAgICAgeyByYXc6ICdTdWJqZWN0OiBoZWxsbyA2XFxyXFxuXFxyXFxuV29ybGQgNiEnIH0sXG4gICAgICAgICAgICB7IHJhdzogJ1N1YmplY3Q6IGhlbGxvIDdcXHJcXG5cXHJcXG5Xb3JsZCA3IScsIHVpZDogNjAwIH1cbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgICcnOiB7XG4gICAgICAgICAgc2VwYXJhdG9yOiAnLycsXG4gICAgICAgICAgZm9sZGVyczoge1xuICAgICAgICAgICAgJ1tHbWFpbF0nOiB7XG4gICAgICAgICAgICAgIGZsYWdzOiBbJ1xcXFxOb3NlbGVjdCddLFxuICAgICAgICAgICAgICBmb2xkZXJzOiB7XG4gICAgICAgICAgICAgICAgJ0FsbCBNYWlsJzogeyAnc3BlY2lhbC11c2UnOiAnXFxcXEFsbCcgfSxcbiAgICAgICAgICAgICAgICBEcmFmdHM6IHsgJ3NwZWNpYWwtdXNlJzogJ1xcXFxEcmFmdHMnIH0sXG4gICAgICAgICAgICAgICAgSW1wb3J0YW50OiB7ICdzcGVjaWFsLXVzZSc6ICdcXFxcSW1wb3J0YW50JyB9LFxuICAgICAgICAgICAgICAgICdTZW50IE1haWwnOiB7ICdzcGVjaWFsLXVzZSc6ICdcXFxcU2VudCcgfSxcbiAgICAgICAgICAgICAgICBTcGFtOiB7ICdzcGVjaWFsLXVzZSc6ICdcXFxcSnVuaycgfSxcbiAgICAgICAgICAgICAgICBTdGFycmVkOiB7ICdzcGVjaWFsLXVzZSc6ICdcXFxcRmxhZ2dlZCcgfSxcbiAgICAgICAgICAgICAgICBUcmFzaDogeyAnc3BlY2lhbC11c2UnOiAnXFxcXFRyYXNoJyB9LFxuICAgICAgICAgICAgICAgIEE6IHsgbWVzc2FnZXM6IFt7fV0gfSxcbiAgICAgICAgICAgICAgICBCOiB7IG1lc3NhZ2VzOiBbe31dIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHNlcnZlciA9IGhvb2RpZWNyb3cob3B0aW9ucylcbiAgICBzZXJ2ZXIubGlzdGVuKHBvcnQsIGRvbmUpXG4gIH0pXG5cbiAgYWZ0ZXJFYWNoKChkb25lKSA9PiB7XG4gICAgc2VydmVyLmNsb3NlKGRvbmUpXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ0Nvbm5lY3Rpb24gdGVzdHMnLCAoKSA9PiB7XG4gICAgdmFyIGluc2VjdXJlU2VydmVyXG5cbiAgICBiZWZvcmVFYWNoKChkb25lKSA9PiB7XG4gICAgICAvLyBzdGFydCBpbWFwIHRlc3Qgc2VydmVyXG4gICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgLy8gZGVidWc6IHRydWUsXG4gICAgICAgIHBsdWdpbnM6IFtdLFxuICAgICAgICBzZWN1cmVDb25uZWN0aW9uOiBmYWxzZVxuICAgICAgfVxuXG4gICAgICBpbnNlY3VyZVNlcnZlciA9IGhvb2RpZWNyb3cob3B0aW9ucylcbiAgICAgIGluc2VjdXJlU2VydmVyLmxpc3Rlbihwb3J0ICsgMiwgZG9uZSlcbiAgICB9KVxuXG4gICAgYWZ0ZXJFYWNoKChkb25lKSA9PiB7XG4gICAgICBpbnNlY3VyZVNlcnZlci5jbG9zZShkb25lKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHVzZSBTVEFSVFRMUyBieSBkZWZhdWx0JywgKCkgPT4ge1xuICAgICAgaW1hcCA9IG5ldyBJbWFwQ2xpZW50KCcxMjcuMC4wLjEnLCBwb3J0LCB7XG4gICAgICAgIGxvZ0xldmVsLFxuICAgICAgICBhdXRoOiB7XG4gICAgICAgICAgdXNlcjogJ3Rlc3R1c2VyJyxcbiAgICAgICAgICBwYXNzOiAndGVzdHBhc3MnXG4gICAgICAgIH0sXG4gICAgICAgIHVzZVNlY3VyZVRyYW5zcG9ydDogZmFsc2VcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBpbWFwLmNvbm5lY3QoKS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KGltYXAuY2xpZW50LnNlY3VyZU1vZGUpLnRvLmJlLnRydWVcbiAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gaW1hcC5jbG9zZSgpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIGlnbm9yZSBTVEFSVFRMUycsICgpID0+IHtcbiAgICAgIGltYXAgPSBuZXcgSW1hcENsaWVudCgnMTI3LjAuMC4xJywgcG9ydCwge1xuICAgICAgICBsb2dMZXZlbCxcbiAgICAgICAgYXV0aDoge1xuICAgICAgICAgIHVzZXI6ICd0ZXN0dXNlcicsXG4gICAgICAgICAgcGFzczogJ3Rlc3RwYXNzJ1xuICAgICAgICB9LFxuICAgICAgICB1c2VTZWN1cmVUcmFuc3BvcnQ6IGZhbHNlLFxuICAgICAgICBpZ25vcmVUTFM6IHRydWVcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBpbWFwLmNvbm5lY3QoKS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KGltYXAuY2xpZW50LnNlY3VyZU1vZGUpLnRvLmJlLmZhbHNlXG4gICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIGltYXAuY2xvc2UoKVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGNvbm5lY3RpbmcgdG8gbm9uLVNUQVJUVExTIGhvc3QnLCAoKSA9PiB7XG4gICAgICBpbWFwID0gbmV3IEltYXBDbGllbnQoJzEyNy4wLjAuMScsIHBvcnQgKyAyLCB7XG4gICAgICAgIGxvZ0xldmVsLFxuICAgICAgICBhdXRoOiB7XG4gICAgICAgICAgdXNlcjogJ3Rlc3R1c2VyJyxcbiAgICAgICAgICBwYXNzOiAndGVzdHBhc3MnXG4gICAgICAgIH0sXG4gICAgICAgIHVzZVNlY3VyZVRyYW5zcG9ydDogZmFsc2UsXG4gICAgICAgIHJlcXVpcmVUTFM6IHRydWVcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBpbWFwLmNvbm5lY3QoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIGV4cGVjdChlcnIpLnRvLmV4aXN0XG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIGNvbm5lY3QgdG8gbm9uIHNlY3VyZSBob3N0JywgKCkgPT4ge1xuICAgICAgaW1hcCA9IG5ldyBJbWFwQ2xpZW50KCcxMjcuMC4wLjEnLCBwb3J0ICsgMiwge1xuICAgICAgICBsb2dMZXZlbCxcbiAgICAgICAgYXV0aDoge1xuICAgICAgICAgIHVzZXI6ICd0ZXN0dXNlcicsXG4gICAgICAgICAgcGFzczogJ3Rlc3RwYXNzJ1xuICAgICAgICB9LFxuICAgICAgICB1c2VTZWN1cmVUcmFuc3BvcnQ6IGZhbHNlXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gaW1hcC5jb25uZWN0KCkudGhlbigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChpbWFwLmNsaWVudC5zZWN1cmVNb2RlKS50by5iZS5mYWxzZVxuICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgIHJldHVybiBpbWFwLmNsb3NlKClcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgZmFpbCBhdXRoZW50aWNhdGlvbicsIChkb25lKSA9PiB7XG4gICAgICBpbWFwID0gbmV3IEltYXBDbGllbnQoJzEyNy4wLjAuMScsIHBvcnQgKyAyLCB7XG4gICAgICAgIGxvZ0xldmVsLFxuICAgICAgICBhdXRoOiB7XG4gICAgICAgICAgdXNlcjogJ2ludmFsaWQnLFxuICAgICAgICAgIHBhc3M6ICdpbnZhbGlkJ1xuICAgICAgICB9LFxuICAgICAgICB1c2VTZWN1cmVUcmFuc3BvcnQ6IGZhbHNlXG4gICAgICB9KVxuXG4gICAgICBpbWFwLmNvbm5lY3QoKS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KGltYXAuY2xpZW50LnNlY3VyZU1vZGUpLnRvLmJlLmZhbHNlXG4gICAgICB9KS5jYXRjaCgoKSA9PiB7IGRvbmUoKSB9KVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ1Bvc3QgbG9naW4gdGVzdHMnLCAoKSA9PiB7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBpbWFwID0gbmV3IEltYXBDbGllbnQoJzEyNy4wLjAuMScsIHBvcnQsIHtcbiAgICAgICAgbG9nTGV2ZWwsXG4gICAgICAgIGF1dGg6IHtcbiAgICAgICAgICB1c2VyOiAndGVzdHVzZXInLFxuICAgICAgICAgIHBhc3M6ICd0ZXN0cGFzcydcbiAgICAgICAgfSxcbiAgICAgICAgdXNlU2VjdXJlVHJhbnNwb3J0OiBmYWxzZVxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIGltYXAuY29ubmVjdCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gaW1hcC5zZWxlY3RNYWlsYm94KCdbR21haWxdL1NwYW0nKVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgIHJldHVybiBpbWFwLmNsb3NlKClcbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJyNsaXN0TWFpbGJveGVzJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkJywgKCkgPT4ge1xuICAgICAgICByZXR1cm4gaW1hcC5saXN0TWFpbGJveGVzKCkudGhlbigobWFpbGJveGVzKSA9PiB7XG4gICAgICAgICAgZXhwZWN0KG1haWxib3hlcykudG8uZXhpc3RcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCcjbGlzdE1lc3NhZ2VzJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkJywgKCkgPT4ge1xuICAgICAgICByZXR1cm4gaW1hcC5saXN0TWVzc2FnZXMoJ2luYm94JywgJzE6KicsIFsndWlkJywgJ2ZsYWdzJywgJ2VudmVsb3BlJywgJ2JvZHlzdHJ1Y3R1cmUnLCAnYm9keS5wZWVrW10nXSkudGhlbigobWVzc2FnZXMpID0+IHtcbiAgICAgICAgICBleHBlY3QobWVzc2FnZXMpLnRvLm5vdC5iZS5lbXB0eVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJyN1cGxvYWQnLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIHN1Y2NlZWQnLCAoKSA9PiB7XG4gICAgICAgIHZhciBtc2dDb3VudFxuXG4gICAgICAgIHJldHVybiBpbWFwLmxpc3RNZXNzYWdlcygnaW5ib3gnLCAnMToqJywgWyd1aWQnLCAnZmxhZ3MnLCAnZW52ZWxvcGUnLCAnYm9keXN0cnVjdHVyZSddKS50aGVuKChtZXNzYWdlcykgPT4ge1xuICAgICAgICAgIGV4cGVjdChtZXNzYWdlcykudG8ubm90LmJlLmVtcHR5XG4gICAgICAgICAgbXNnQ291bnQgPSBtZXNzYWdlcy5sZW5ndGhcbiAgICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGltYXAudXBsb2FkKCdpbmJveCcsICdNSU1FLVZlcnNpb246IDEuMFxcclxcbkRhdGU6IFdlZCwgOSBKdWwgMjAxNCAxNTowNzo0NyArMDIwMFxcclxcbkRlbGl2ZXJlZC1UbzogdGVzdEB0ZXN0LmNvbVxcclxcbk1lc3NhZ2UtSUQ6IDxDQUhmdFlZUW89NWZxYnRudi1EYXpYaEwyajVBeFZQMW5XYXJqa3p0bi1OOVNWOTFaMndAbWFpbC5nbWFpbC5jb20+XFxyXFxuU3ViamVjdDogdGVzdFxcclxcbkZyb206IFRlc3QgVGVzdCA8dGVzdEB0ZXN0LmNvbT5cXHJcXG5UbzogVGVzdCBUZXN0IDx0ZXN0QHRlc3QuY29tPlxcclxcbkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxcclxcblxcclxcbnRlc3QnLCB7XG4gICAgICAgICAgICBmbGFnczogWydcXFxcU2VlbicsICdcXFxcQW5zd2VyZWQnLCAnXFxcXCRNeUZsYWcnXVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBpbWFwLmxpc3RNZXNzYWdlcygnaW5ib3gnLCAnMToqJywgWyd1aWQnLCAnZmxhZ3MnLCAnZW52ZWxvcGUnLCAnYm9keXN0cnVjdHVyZSddKVxuICAgICAgICB9KS50aGVuKChtZXNzYWdlcykgPT4ge1xuICAgICAgICAgIGV4cGVjdChtZXNzYWdlcy5sZW5ndGgpLnRvLmVxdWFsKG1zZ0NvdW50ICsgMSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCcjc2VhcmNoJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBzZXF1ZW5jZSBudW1iZXInLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBpbWFwLnNlYXJjaCgnaW5ib3gnLCB7XG4gICAgICAgICAgaGVhZGVyOiBbJ3N1YmplY3QnLCAnaGVsbG8gMyddXG4gICAgICAgIH0pLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmRlZXAuZXF1YWwoWzNdKVxuICAgICAgICB9KVxuICAgICAgfSlcblxuICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gdWlkJywgKCkgPT4ge1xuICAgICAgICByZXR1cm4gaW1hcC5zZWFyY2goJ2luYm94Jywge1xuICAgICAgICAgIGhlYWRlcjogWydzdWJqZWN0JywgJ2hlbGxvIDMnXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgYnlVaWQ6IHRydWVcbiAgICAgICAgfSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZGVlcC5lcXVhbChbNTU1XSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG5cbiAgICAgIGl0KCdzaG91bGQgd29yayB3aXRoIGNvbXBsZXggcXVlcmllcycsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGltYXAuc2VhcmNoKCdpbmJveCcsIHtcbiAgICAgICAgICBoZWFkZXI6IFsnc3ViamVjdCcsICdoZWxsbyddLFxuICAgICAgICAgIHNlZW46IHRydWVcbiAgICAgICAgfSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZGVlcC5lcXVhbChbMl0pXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnI3NldEZsYWdzJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCBzZXQgZmxhZ3MgZm9yIGEgbWVzc2FnZScsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGltYXAuc2V0RmxhZ3MoJ2luYm94JywgJzEnLCBbJ1xcXFxTZWVuJywgJyRNeUZsYWcnXSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZGVlcC5lcXVhbChbe1xuICAgICAgICAgICAgJyMnOiAxLFxuICAgICAgICAgICAgZmxhZ3M6IFsnXFxcXFNlZW4nLCAnJE15RmxhZyddXG4gICAgICAgICAgfV0pXG4gICAgICAgIH0pXG4gICAgICB9KVxuXG4gICAgICBpdCgnc2hvdWxkIGFkZCBmbGFncyB0byBhIG1lc3NhZ2UnLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBpbWFwLnNldEZsYWdzKCdpbmJveCcsICcyJywge1xuICAgICAgICAgIGFkZDogWyckTXlGbGFnJ11cbiAgICAgICAgfSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZGVlcC5lcXVhbChbe1xuICAgICAgICAgICAgJyMnOiAyLFxuICAgICAgICAgICAgZmxhZ3M6IFsnXFxcXFNlZW4nLCAnJE15RmxhZyddXG4gICAgICAgICAgfV0pXG4gICAgICAgIH0pXG4gICAgICB9KVxuXG4gICAgICBpdCgnc2hvdWxkIHJlbW92ZSBmbGFncyBmcm9tIGEgbWVzc2FnZScsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGltYXAuc2V0RmxhZ3MoJ2luYm94JywgJzU1NycsIHtcbiAgICAgICAgICByZW1vdmU6IFsnXFxcXERlbGV0ZWQnXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgYnlVaWQ6IHRydWVcbiAgICAgICAgfSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZGVlcC5lcXVhbChbe1xuICAgICAgICAgICAgJyMnOiA1LFxuICAgICAgICAgICAgZmxhZ3M6IFsnJE15RmxhZyddLFxuICAgICAgICAgICAgdWlkOiA1NTdcbiAgICAgICAgICB9XSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG5cbiAgICAgIGl0KCdzaG91bGQgbm90IHJldHVybiBhbnl0aGluZyBvbiBzaWxlbnQgbW9kZScsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGltYXAuc2V0RmxhZ3MoJ2luYm94JywgJzEnLCBbJyRNeUZsYWcyJ10sIHtcbiAgICAgICAgICBzaWxlbnQ6IHRydWVcbiAgICAgICAgfSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZGVlcC5lcXVhbChbXSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCcjc3RvcmUnLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIGFkZCBsYWJlbHMgZm9yIGEgbWVzc2FnZScsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGltYXAuc3RvcmUoJ2luYm94JywgJzEnLCAnK1gtR00tTEFCRUxTJywgWydcXFxcU2VudCcsICdcXFxcSnVuayddKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICBleHBlY3QocmVzdWx0KS50by5kZWVwLmVxdWFsKFt7XG4gICAgICAgICAgICAnIyc6IDEsXG4gICAgICAgICAgICAneC1nbS1sYWJlbHMnOiBbJ1xcXFxJbmJveCcsICdcXFxcU2VudCcsICdcXFxcSnVuayddXG4gICAgICAgICAgfV0pXG4gICAgICAgIH0pXG4gICAgICB9KVxuXG4gICAgICBpdCgnc2hvdWxkIHNldCBsYWJlbHMgZm9yIGEgbWVzc2FnZScsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGltYXAuc3RvcmUoJ2luYm94JywgJzEnLCAnWC1HTS1MQUJFTFMnLCBbJ1xcXFxTZW50JywgJ1xcXFxKdW5rJ10pLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmRlZXAuZXF1YWwoW3tcbiAgICAgICAgICAgICcjJzogMSxcbiAgICAgICAgICAgICd4LWdtLWxhYmVscyc6IFsnXFxcXFNlbnQnLCAnXFxcXEp1bmsnXVxuICAgICAgICAgIH1dKVxuICAgICAgICB9KVxuICAgICAgfSlcblxuICAgICAgaXQoJ3Nob3VsZCByZW1vdmUgbGFiZWxzIGZyb20gYSBtZXNzYWdlJywgKCkgPT4ge1xuICAgICAgICByZXR1cm4gaW1hcC5zdG9yZSgnaW5ib3gnLCAnMScsICctWC1HTS1MQUJFTFMnLCBbJ1xcXFxTZW50JywgJ1xcXFxJbmJveCddKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICBleHBlY3QocmVzdWx0KS50by5kZWVwLmVxdWFsKFt7XG4gICAgICAgICAgICAnIyc6IDEsXG4gICAgICAgICAgICAneC1nbS1sYWJlbHMnOiBbXVxuICAgICAgICAgIH1dKVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJyNkZWxldGVNZXNzYWdlcycsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgZGVsZXRlIGEgbWVzc2FnZScsICgpID0+IHtcbiAgICAgICAgdmFyIGluaXRpYWxJbmZvXG5cbiAgICAgICAgdmFyIGV4cHVuZ2VOb3RpZmllZCA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBpbWFwLm9udXBkYXRlID0gZnVuY3Rpb24gKG1iLCB0eXBlIC8qLCBkYXRhICovKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBleHBlY3QobWIpLnRvLmVxdWFsKCdpbmJveCcpXG4gICAgICAgICAgICAgIGV4cGVjdCh0eXBlKS50by5lcXVhbCgnZXhwdW5nZScpXG4gICAgICAgICAgICAgIHJlc29sdmUoKVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBpbWFwLnNlbGVjdE1haWxib3goJ2luYm94JykudGhlbigoaW5mbykgPT4ge1xuICAgICAgICAgIGluaXRpYWxJbmZvID0gaW5mb1xuICAgICAgICAgIHJldHVybiBpbWFwLmRlbGV0ZU1lc3NhZ2VzKCdpbmJveCcsIDU1Nywge1xuICAgICAgICAgICAgYnlVaWQ6IHRydWVcbiAgICAgICAgICB9KVxuICAgICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gaW1hcC5zZWxlY3RNYWlsYm94KCdpbmJveCcpXG4gICAgICAgIH0pLnRoZW4oKHJlc3VsdEluZm8pID0+IHtcbiAgICAgICAgICBleHBlY3QoaW5pdGlhbEluZm8uZXhpc3RzIC0gMSA9PT0gcmVzdWx0SW5mby5leGlzdHMpLnRvLmJlLnRydWVcbiAgICAgICAgfSkudGhlbigoKSA9PiBleHB1bmdlTm90aWZpZWQpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnI2NvcHlNZXNzYWdlcycsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgY29weSBhIG1lc3NhZ2UnLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBpbWFwLmNvcHlNZXNzYWdlcygnaW5ib3gnLCA1NTUsICdbR21haWxdL1RyYXNoJywge1xuICAgICAgICAgIGJ5VWlkOiB0cnVlXG4gICAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBpbWFwLnNlbGVjdE1haWxib3goJ1tHbWFpbF0vVHJhc2gnKVxuICAgICAgICB9KS50aGVuKChpbmZvKSA9PiB7XG4gICAgICAgICAgZXhwZWN0KGluZm8uZXhpc3RzKS50by5lcXVhbCgxKVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJyNtb3ZlTWVzc2FnZXMnLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIG1vdmUgYSBtZXNzYWdlJywgKCkgPT4ge1xuICAgICAgICB2YXIgaW5pdGlhbEluZm9cbiAgICAgICAgcmV0dXJuIGltYXAuc2VsZWN0TWFpbGJveCgnaW5ib3gnKS50aGVuKChpbmZvKSA9PiB7XG4gICAgICAgICAgaW5pdGlhbEluZm8gPSBpbmZvXG4gICAgICAgICAgcmV0dXJuIGltYXAubW92ZU1lc3NhZ2VzKCdpbmJveCcsIDU1NSwgJ1tHbWFpbF0vU3BhbScsIHtcbiAgICAgICAgICAgIGJ5VWlkOiB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGltYXAuc2VsZWN0TWFpbGJveCgnW0dtYWlsXS9TcGFtJylcbiAgICAgICAgfSkudGhlbigoaW5mbykgPT4ge1xuICAgICAgICAgIGV4cGVjdChpbmZvLmV4aXN0cykudG8uZXF1YWwoMSlcbiAgICAgICAgICByZXR1cm4gaW1hcC5zZWxlY3RNYWlsYm94KCdpbmJveCcpXG4gICAgICAgIH0pLnRoZW4oKHJlc3VsdEluZm8pID0+IHtcbiAgICAgICAgICBleHBlY3QoaW5pdGlhbEluZm8uZXhpc3RzKS50by5ub3QuZXF1YWwocmVzdWx0SW5mby5leGlzdHMpXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgncHJlY2hlY2snLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIGhhbmRsZSBwcmVjaGVjayBlcnJvciBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICAgIC8vIHNpbXVsYXRlcyBhIGJyb2tlbiBzZWFyY2ggY29tbWFuZFxuICAgICAgICB2YXIgc2VhcmNoID0gKHF1ZXJ5LCBvcHRpb25zID0ge30pID0+IHtcbiAgICAgICAgICB2YXIgY29tbWFuZCA9IGJ1aWxkU0VBUkNIQ29tbWFuZChxdWVyeSwgb3B0aW9ucylcbiAgICAgICAgICByZXR1cm4gaW1hcC5leGVjKGNvbW1hbmQsICdTRUFSQ0gnLCB7XG4gICAgICAgICAgICBwcmVjaGVjazogKCkgPT4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdGT08nKSlcbiAgICAgICAgICB9KS50aGVuKChyZXNwb25zZSkgPT4gcGFyc2VTRUFSQ0gocmVzcG9uc2UpKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGltYXAuc2VsZWN0TWFpbGJveCgnaW5ib3gnKVxuICAgICAgICAgIC50aGVuKCgpID0+IHNlYXJjaCh7IGhlYWRlcjogWydzdWJqZWN0JywgJ2hlbGxvIDMnXSB9KSlcbiAgICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgZXhwZWN0KGVyci5tZXNzYWdlKS50by5lcXVhbCgnRk9PJylcbiAgICAgICAgICAgIHJldHVybiBpbWFwLnNlbGVjdE1haWxib3goJ1tHbWFpbF0vU3BhbScpXG4gICAgICAgICAgfSlcbiAgICAgIH0pXG5cbiAgICAgIGl0KCdzaG91bGQgc2VsZWN0IGNvcnJlY3QgbWFpbGJveGVzIGluIHByZWNoZWNrcyBvbiBjb25jdXJyZW50IGNhbGxzJywgKCkgPT4ge1xuICAgICAgICByZXR1cm4gaW1hcC5zZWxlY3RNYWlsYm94KCdbR21haWxdL0EnKS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgaW1hcC5zZWxlY3RNYWlsYm94KCdbR21haWxdL0InKSxcbiAgICAgICAgICAgIGltYXAuc2V0RmxhZ3MoJ1tHbWFpbF0vQScsICcxJywgWydcXFxcU2VlbiddKVxuICAgICAgICAgIF0pXG4gICAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBpbWFwLmxpc3RNZXNzYWdlcygnW0dtYWlsXS9BJywgJzE6MScsIFsnZmxhZ3MnXSlcbiAgICAgICAgfSkudGhlbigobWVzc2FnZXMpID0+IHtcbiAgICAgICAgICBleHBlY3QobWVzc2FnZXMubGVuZ3RoKS50by5lcXVhbCgxKVxuICAgICAgICAgIGV4cGVjdChtZXNzYWdlc1swXS5mbGFncykudG8uZGVlcC5lcXVhbChbJ1xcXFxTZWVuJ10pXG4gICAgICAgIH0pXG4gICAgICB9KVxuXG4gICAgICBpdCgnc2hvdWxkIHNlbmQgcHJlY2hlY2sgY29tbWFuZHMgaW4gY29ycmVjdCBvcmRlciBvbiBjb25jdXJyZW50IGNhbGxzJywgKCkgPT4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIGltYXAuc2V0RmxhZ3MoJ1tHbWFpbF0vQScsICcxJywgWydcXFxcU2VlbiddKSxcbiAgICAgICAgICBpbWFwLnNldEZsYWdzKCdbR21haWxdL0InLCAnMScsIFsnXFxcXFNlZW4nXSlcbiAgICAgICAgXSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGltYXAubGlzdE1lc3NhZ2VzKCdbR21haWxdL0EnLCAnMToxJywgWydmbGFncyddKVxuICAgICAgICB9KS50aGVuKChtZXNzYWdlcykgPT4ge1xuICAgICAgICAgIGV4cGVjdChtZXNzYWdlcy5sZW5ndGgpLnRvLmVxdWFsKDEpXG4gICAgICAgICAgZXhwZWN0KG1lc3NhZ2VzWzBdLmZsYWdzKS50by5kZWVwLmVxdWFsKFsnXFxcXFNlZW4nXSlcbiAgICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGltYXAubGlzdE1lc3NhZ2VzKCdbR21haWxdL0InLCAnMToxJywgWydmbGFncyddKVxuICAgICAgICB9KS50aGVuKChtZXNzYWdlcykgPT4ge1xuICAgICAgICAgIGV4cGVjdChtZXNzYWdlcy5sZW5ndGgpLnRvLmVxdWFsKDEpXG4gICAgICAgICAgZXhwZWN0KG1lc3NhZ2VzWzBdLmZsYWdzKS50by5kZWVwLmVxdWFsKFsnXFxcXFNlZW4nXSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnVGltZW91dCcsICgpID0+IHtcbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIGltYXAgPSBuZXcgSW1hcENsaWVudCgnMTI3LjAuMC4xJywgcG9ydCwge1xuICAgICAgICBsb2dMZXZlbCxcbiAgICAgICAgYXV0aDoge1xuICAgICAgICAgIHVzZXI6ICd0ZXN0dXNlcicsXG4gICAgICAgICAgcGFzczogJ3Rlc3RwYXNzJ1xuICAgICAgICB9LFxuICAgICAgICB1c2VTZWN1cmVUcmFuc3BvcnQ6IGZhbHNlXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gaW1hcC5jb25uZWN0KClcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIC8vIHJlbW92ZSB0aGUgb25kYXRhIGV2ZW50IHRvIHNpbXVsYXRlIDEwMCUgcGFja2V0IGxvc3MgYW5kIG1ha2UgdGhlIHNvY2tldCB0aW1lIG91dCBhZnRlciAxMG1zXG4gICAgICAgICAgaW1hcC5jbGllbnQudGltZW91dFNvY2tldExvd2VyQm91bmQgPSAxMFxuICAgICAgICAgIGltYXAuY2xpZW50LnRpbWVvdXRTb2NrZXRNdWx0aXBsaWVyID0gMFxuICAgICAgICAgIGltYXAuY2xpZW50LnNvY2tldC5vbmRhdGEgPSAoKSA9PiB7IH1cbiAgICAgICAgfSlcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCB0aW1lb3V0JywgKGRvbmUpID0+IHtcbiAgICAgIGltYXAub25lcnJvciA9ICgpID0+IHsgZG9uZSgpIH1cbiAgICAgIGltYXAuc2VsZWN0TWFpbGJveCgnaW5ib3gnKS5jYXRjaCgoKSA9PiB7fSlcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYWxsIHBlbmRpbmcgY29tbWFuZHMgb24gdGltZW91dCcsICgpID0+IHtcbiAgICAgIGxldCByZWplY3Rpb25Db3VudCA9IDBcbiAgICAgIHJldHVybiBQcm9taXNlLmFsbChbXG4gICAgICAgIGltYXAuc2VsZWN0TWFpbGJveCgnSU5CT1gnKVxuICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgZXhwZWN0KGVycikudG8uZXhpc3RcbiAgICAgICAgICAgIHJlamVjdGlvbkNvdW50KytcbiAgICAgICAgICB9KSxcbiAgICAgICAgaW1hcC5saXN0TWVzc2FnZXMoJ0lOQk9YJywgJzE6KicsIFsnYm9keS5wZWVrW10nXSlcbiAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgIGV4cGVjdChlcnIpLnRvLmV4aXN0XG4gICAgICAgICAgICByZWplY3Rpb25Db3VudCsrXG4gICAgICAgICAgfSlcblxuICAgICAgXSkudGhlbigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChyZWplY3Rpb25Db3VudCkudG8uZXF1YWwoMilcbiAgICAgIH0pXG4gICAgfSlcbiAgfSlcbn0pXG4iXX0= \ No newline at end of file diff --git a/dist/client-unit.js b/dist/client-unit.js new file mode 100644 index 00000000..c02a1822 --- /dev/null +++ b/dist/client-unit.js @@ -0,0 +1,1105 @@ +"use strict"; + +var _client = _interopRequireWildcard(require("./client")); + +var _emailjsImapHandler = require("emailjs-imap-handler"); + +var _common = require("./common"); + +function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +/* eslint-disable no-unused-expressions */ +describe('browserbox unit tests', () => { + var br; + beforeEach(() => { + const auth = { + user: 'baldrian', + pass: 'sleeper.de' + }; + br = new _client.default('somehost', 1234, { + auth, + logLevel: _common.LOG_LEVEL_NONE + }); + br.client.socket = { + send: () => {}, + upgradeToSecure: () => {} + }; + }); + describe('#_onIdle', () => { + it('should call enterIdle', () => { + sinon.stub(br, 'enterIdle'); + br._authenticated = true; + br._enteredIdle = false; + + br._onIdle(); + + expect(br.enterIdle.callCount).to.equal(1); + }); + it('should not call enterIdle', () => { + sinon.stub(br, 'enterIdle'); + br._enteredIdle = true; + + br._onIdle(); + + expect(br.enterIdle.callCount).to.equal(0); + }); + }); + describe('#openConnection', () => { + beforeEach(() => { + sinon.stub(br.client, 'connect'); + sinon.stub(br.client, 'close'); + sinon.stub(br.client, 'enqueueCommand'); + }); + it('should open connection', () => { + br.client.connect.returns(Promise.resolve()); + br.client.enqueueCommand.returns(Promise.resolve({ + capability: ['capa1', 'capa2'] + })); + setTimeout(() => br.client.onready(), 0); + return br.openConnection().then(() => { + expect(br.client.connect.calledOnce).to.be.true; + expect(br.client.enqueueCommand.calledOnce).to.be.true; + expect(br._capability.length).to.equal(2); + expect(br._capability[0]).to.equal('capa1'); + expect(br._capability[1]).to.equal('capa2'); + }); + }); + }); + describe('#connect', () => { + beforeEach(() => { + sinon.stub(br.client, 'connect'); + sinon.stub(br.client, 'close'); + sinon.stub(br, 'updateCapability'); + sinon.stub(br, 'upgradeConnection'); + sinon.stub(br, 'updateId'); + sinon.stub(br, 'login'); + sinon.stub(br, 'compressConnection'); + }); + it('should connect', () => { + br.client.connect.returns(Promise.resolve()); + br.updateCapability.returns(Promise.resolve()); + br.upgradeConnection.returns(Promise.resolve()); + br.updateId.returns(Promise.resolve()); + br.login.returns(Promise.resolve()); + br.compressConnection.returns(Promise.resolve()); + setTimeout(() => br.client.onready(), 0); + return br.connect().then(() => { + expect(br.client.connect.calledOnce).to.be.true; + expect(br.updateCapability.calledOnce).to.be.true; + expect(br.upgradeConnection.calledOnce).to.be.true; + expect(br.updateId.calledOnce).to.be.true; + expect(br.login.calledOnce).to.be.true; + expect(br.compressConnection.calledOnce).to.be.true; + }); + }); + it('should fail to login', done => { + br.client.connect.returns(Promise.resolve()); + br.updateCapability.returns(Promise.resolve()); + br.upgradeConnection.returns(Promise.resolve()); + br.updateId.returns(Promise.resolve()); + br.login.throws(new Error()); + setTimeout(() => br.client.onready(), 0); + br.connect().catch(err => { + expect(err).to.exist; + expect(br.client.connect.calledOnce).to.be.true; + expect(br.client.close.calledOnce).to.be.true; + expect(br.updateCapability.calledOnce).to.be.true; + expect(br.upgradeConnection.calledOnce).to.be.true; + expect(br.updateId.calledOnce).to.be.true; + expect(br.login.calledOnce).to.be.true; + expect(br.compressConnection.called).to.be.false; + done(); + }); + }); + it('should timeout', done => { + br.client.connect.returns(Promise.resolve()); + br.timeoutConnection = 1; + br.connect().catch(err => { + expect(err).to.exist; + expect(br.client.connect.calledOnce).to.be.true; + expect(br.client.close.calledOnce).to.be.true; + expect(br.updateCapability.called).to.be.false; + expect(br.upgradeConnection.called).to.be.false; + expect(br.updateId.called).to.be.false; + expect(br.login.called).to.be.false; + expect(br.compressConnection.called).to.be.false; + done(); + }); + }); + }); + describe('#close', () => { + it('should force-close', () => { + sinon.stub(br.client, 'close').returns(Promise.resolve()); + return br.close().then(() => { + expect(br._state).to.equal(_client.STATE_LOGOUT); + expect(br.client.close.calledOnce).to.be.true; + }); + }); + }); + describe('#exec', () => { + beforeEach(() => { + sinon.stub(br, 'breakIdle'); + }); + it('should send string command', () => { + sinon.stub(br.client, 'enqueueCommand').returns(Promise.resolve({})); + return br.exec('TEST').then(res => { + expect(res).to.deep.equal({}); + expect(br.client.enqueueCommand.args[0][0]).to.equal('TEST'); + }); + }); + it('should update capability from response', () => { + sinon.stub(br.client, 'enqueueCommand').returns(Promise.resolve({ + capability: ['A', 'B'] + })); + return br.exec('TEST').then(res => { + expect(res).to.deep.equal({ + capability: ['A', 'B'] + }); + expect(br._capability).to.deep.equal(['A', 'B']); + }); + }); + }); + describe('#enterIdle', () => { + it('should periodically send NOOP if IDLE not supported', done => { + sinon.stub(br, 'exec').callsFake(command => { + expect(command).to.equal('NOOP'); + done(); + }); + br._capability = []; + br._selectedMailbox = 'FOO'; + br.timeoutNoop = 1; + br.enterIdle(); + }); + it('should periodically send NOOP if no mailbox selected', done => { + sinon.stub(br, 'exec').callsFake(command => { + expect(command).to.equal('NOOP'); + done(); + }); + br._capability = ['IDLE']; + br._selectedMailbox = undefined; + br.timeoutNoop = 1; + br.enterIdle(); + }); + it('should break IDLE after timeout', done => { + sinon.stub(br.client, 'enqueueCommand'); + sinon.stub(br.client.socket, 'send').callsFake(payload => { + expect(br.client.enqueueCommand.args[0][0].command).to.equal('IDLE'); + expect([].slice.call(new Uint8Array(payload))).to.deep.equal([0x44, 0x4f, 0x4e, 0x45, 0x0d, 0x0a]); + done(); + }); + br._capability = ['IDLE']; + br._selectedMailbox = 'FOO'; + br.timeoutIdle = 1; + br.enterIdle(); + }); + }); + describe('#breakIdle', () => { + it('should send DONE to socket', () => { + sinon.stub(br.client.socket, 'send'); + br._enteredIdle = 'IDLE'; + br.breakIdle(); + expect([].slice.call(new Uint8Array(br.client.socket.send.args[0][0]))).to.deep.equal([0x44, 0x4f, 0x4e, 0x45, 0x0d, 0x0a]); + }); + }); + describe('#upgradeConnection', () => { + it('should do nothing if already secured', () => { + br.client.secureMode = true; + br._capability = ['starttls']; + return br.upgradeConnection(); + }); + it('should do nothing if STARTTLS not available', () => { + br.client.secureMode = false; + br._capability = []; + return br.upgradeConnection(); + }); + it('should run STARTTLS', () => { + sinon.stub(br.client, 'upgrade'); + sinon.stub(br, 'exec').withArgs('STARTTLS').returns(Promise.resolve()); + sinon.stub(br, 'updateCapability').returns(Promise.resolve()); + br._capability = ['STARTTLS']; + return br.upgradeConnection().then(() => { + expect(br.client.upgrade.callCount).to.equal(1); + expect(br._capability.length).to.equal(0); + }); + }); + }); + describe('#updateCapability', () => { + beforeEach(() => { + sinon.stub(br, 'exec'); + }); + it('should do nothing if capability is set', () => { + br._capability = ['abc']; + return br.updateCapability(); + }); + it('should run CAPABILITY if capability not set', () => { + br.exec.returns(Promise.resolve()); + br._capability = []; + return br.updateCapability().then(() => { + expect(br.exec.args[0][0]).to.equal('CAPABILITY'); + }); + }); + it('should force run CAPABILITY', () => { + br.exec.returns(Promise.resolve()); + br._capability = ['abc']; + return br.updateCapability(true).then(() => { + expect(br.exec.args[0][0]).to.equal('CAPABILITY'); + }); + }); + it('should do nothing if connection is not yet upgraded', () => { + br._capability = []; + br.client.secureMode = false; + br._requireTLS = true; + br.updateCapability(); + }); + }); + describe('#listNamespaces', () => { + beforeEach(() => { + sinon.stub(br, 'exec'); + }); + it('should run NAMESPACE if supported', () => { + br.exec.returns(Promise.resolve({ + payload: { + NAMESPACE: [{ + attributes: [[[{ + type: 'STRING', + value: 'INBOX.' + }, { + type: 'STRING', + value: '.' + }]], null, null] + }] + } + })); + br._capability = ['NAMESPACE']; + return br.listNamespaces().then(namespaces => { + expect(namespaces).to.deep.equal({ + personal: [{ + prefix: 'INBOX.', + delimiter: '.' + }], + users: false, + shared: false + }); + expect(br.exec.args[0][0]).to.equal('NAMESPACE'); + expect(br.exec.args[0][1]).to.equal('NAMESPACE'); + }); + }); + it('should do nothing if not supported', () => { + br._capability = []; + return br.listNamespaces().then(namespaces => { + expect(namespaces).to.be.false; + expect(br.exec.callCount).to.equal(0); + }); + }); + }); + describe('#compressConnection', () => { + beforeEach(() => { + sinon.stub(br, 'exec'); + sinon.stub(br.client, 'enableCompression'); + }); + it('should run COMPRESS=DEFLATE if supported', () => { + br.exec.withArgs({ + command: 'COMPRESS', + attributes: [{ + type: 'ATOM', + value: 'DEFLATE' + }] + }).returns(Promise.resolve({})); + br._enableCompression = true; + br._capability = ['COMPRESS=DEFLATE']; + return br.compressConnection().then(() => { + expect(br.exec.callCount).to.equal(1); + expect(br.client.enableCompression.callCount).to.equal(1); + }); + }); + it('should do nothing if not supported', () => { + br._capability = []; + return br.compressConnection().then(() => { + expect(br.exec.callCount).to.equal(0); + }); + }); + it('should do nothing if not enabled', () => { + br._enableCompression = false; + br._capability = ['COMPRESS=DEFLATE']; + return br.compressConnection().then(() => { + expect(br.exec.callCount).to.equal(0); + }); + }); + }); + describe('#login', () => { + it('should call LOGIN', () => { + sinon.stub(br, 'exec').returns(Promise.resolve({})); + sinon.stub(br, 'updateCapability').returns(Promise.resolve(true)); + return br.login({ + user: 'u1', + pass: 'p1' + }).then(() => { + expect(br.exec.callCount).to.equal(1); + expect(br.exec.args[0][0]).to.deep.equal({ + command: 'login', + attributes: [{ + type: 'STRING', + value: 'u1' + }, { + type: 'STRING', + value: 'p1', + sensitive: true + }] + }); + }); + }); + it('should call XOAUTH2', () => { + sinon.stub(br, 'exec').returns(Promise.resolve({})); + sinon.stub(br, 'updateCapability').returns(Promise.resolve(true)); + br._capability = ['AUTH=XOAUTH2']; + br.login({ + user: 'u1', + xoauth2: 'abc' + }).then(() => { + expect(br.exec.callCount).to.equal(1); + expect(br.exec.args[0][0]).to.deep.equal({ + command: 'AUTHENTICATE', + attributes: [{ + type: 'ATOM', + value: 'XOAUTH2' + }, { + type: 'ATOM', + value: 'dXNlcj11MQFhdXRoPUJlYXJlciBhYmMBAQ==', + sensitive: true + }] + }); + }); + }); + }); + describe('#updateId', () => { + beforeEach(() => { + sinon.stub(br, 'exec'); + }); + it('should not nothing if not supported', () => { + br._capability = []; + return br.updateId({ + a: 'b', + c: 'd' + }).then(() => { + expect(br.serverId).to.be.false; + }); + }); + it('should send NIL', () => { + br.exec.withArgs({ + command: 'ID', + attributes: [null] + }).returns(Promise.resolve({ + payload: { + ID: [{ + attributes: [null] + }] + } + })); + br._capability = ['ID']; + return br.updateId(null).then(() => { + expect(br.serverId).to.deep.equal({}); + }); + }); + it('should exhange ID values', () => { + br.exec.withArgs({ + command: 'ID', + attributes: [['ckey1', 'cval1', 'ckey2', 'cval2']] + }).returns(Promise.resolve({ + payload: { + ID: [{ + attributes: [[{ + value: 'skey1' + }, { + value: 'sval1' + }, { + value: 'skey2' + }, { + value: 'sval2' + }]] + }] + } + })); + br._capability = ['ID']; + return br.updateId({ + ckey1: 'cval1', + ckey2: 'cval2' + }).then(() => { + expect(br.serverId).to.deep.equal({ + skey1: 'sval1', + skey2: 'sval2' + }); + }); + }); + }); + describe('#listMailboxes', () => { + beforeEach(() => { + sinon.stub(br, 'exec'); + }); + it('should call LIST and LSUB in sequence', () => { + br.exec.withArgs({ + command: 'LIST', + attributes: ['', '*'] + }).returns(Promise.resolve({ + payload: { + LIST: [false] + } + })); + br.exec.withArgs({ + command: 'LSUB', + attributes: ['', '*'] + }).returns(Promise.resolve({ + payload: { + LSUB: [false] + } + })); + return br.listMailboxes().then(tree => { + expect(tree).to.exist; + }); + }); + it('should not die on NIL separators', () => { + br.exec.withArgs({ + command: 'LIST', + attributes: ['', '*'] + }).returns(Promise.resolve({ + payload: { + LIST: [(0, _emailjsImapHandler.parser)((0, _common.toTypedArray)('* LIST (\\NoInferiors) NIL "INBOX"'))] + } + })); + br.exec.withArgs({ + command: 'LSUB', + attributes: ['', '*'] + }).returns(Promise.resolve({ + payload: { + LSUB: [(0, _emailjsImapHandler.parser)((0, _common.toTypedArray)('* LSUB (\\NoInferiors) NIL "INBOX"'))] + } + })); + return br.listMailboxes().then(tree => { + expect(tree).to.exist; + }); + }); + }); + describe('#createMailbox', () => { + beforeEach(() => { + sinon.stub(br, 'exec'); + }); + it('should call CREATE with a string payload', () => { + // The spec allows unquoted ATOM-style syntax too, but for + // simplicity we always generate a string even if it could be + // expressed as an atom. + br.exec.withArgs({ + command: 'CREATE', + attributes: ['mailboxname'] + }).returns(Promise.resolve()); + return br.createMailbox('mailboxname').then(() => { + expect(br.exec.callCount).to.equal(1); + }); + }); + it('should call mutf7 encode the argument', () => { + // From RFC 3501 + br.exec.withArgs({ + command: 'CREATE', + attributes: ['~peter/mail/&U,BTFw-/&ZeVnLIqe-'] + }).returns(Promise.resolve()); + return br.createMailbox('~peter/mail/\u53f0\u5317/\u65e5\u672c\u8a9e').then(() => { + expect(br.exec.callCount).to.equal(1); + }); + }); + it('should treat an ALREADYEXISTS response as success', () => { + var fakeErr = { + code: 'ALREADYEXISTS' + }; + br.exec.withArgs({ + command: 'CREATE', + attributes: ['mailboxname'] + }).returns(Promise.reject(fakeErr)); + return br.createMailbox('mailboxname').then(() => { + expect(br.exec.callCount).to.equal(1); + }); + }); + }); + describe('#deleteMailbox', () => { + beforeEach(() => { + sinon.stub(br, 'exec'); + }); + it('should call DELETE with a string payload', () => { + br.exec.withArgs({ + command: 'DELETE', + attributes: ['mailboxname'] + }).returns(Promise.resolve()); + return br.deleteMailbox('mailboxname').then(() => { + expect(br.exec.callCount).to.equal(1); + }); + }); + it('should call mutf7 encode the argument', () => { + // From RFC 3501 + br.exec.withArgs({ + command: 'DELETE', + attributes: ['~peter/mail/&U,BTFw-/&ZeVnLIqe-'] + }).returns(Promise.resolve()); + return br.deleteMailbox('~peter/mail/\u53f0\u5317/\u65e5\u672c\u8a9e').then(() => { + expect(br.exec.callCount).to.equal(1); + }); + }); + }); + describe.skip('#listMessages', () => { + beforeEach(() => { + sinon.stub(br, 'exec'); + sinon.stub(br, '_buildFETCHCommand'); + sinon.stub(br, '_parseFETCH'); + }); + it('should call FETCH', () => { + br.exec.returns(Promise.resolve('abc')); + + br._buildFETCHCommand.withArgs(['1:2', ['uid', 'flags'], { + byUid: true + }]).returns({}); + + return br.listMessages('INBOX', '1:2', ['uid', 'flags'], { + byUid: true + }).then(() => { + expect(br._buildFETCHCommand.callCount).to.equal(1); + expect(br._parseFETCH.withArgs('abc').callCount).to.equal(1); + }); + }); + }); + describe.skip('#search', () => { + beforeEach(() => { + sinon.stub(br, 'exec'); + sinon.stub(br, '_buildSEARCHCommand'); + sinon.stub(br, '_parseSEARCH'); + }); + it('should call SEARCH', () => { + br.exec.returns(Promise.resolve('abc')); + + br._buildSEARCHCommand.withArgs({ + uid: 1 + }, { + byUid: true + }).returns({}); + + return br.search('INBOX', { + uid: 1 + }, { + byUid: true + }).then(() => { + expect(br._buildSEARCHCommand.callCount).to.equal(1); + expect(br.exec.callCount).to.equal(1); + expect(br._parseSEARCH.withArgs('abc').callCount).to.equal(1); + }); + }); + }); + describe('#upload', () => { + beforeEach(() => { + sinon.stub(br, 'exec'); + }); + it('should call APPEND with custom flag', () => { + br.exec.returns(Promise.resolve()); + return br.upload('mailbox', 'this is a message', { + flags: ['\\$MyFlag'] + }).then(() => { + expect(br.exec.callCount).to.equal(1); + }); + }); + it('should call APPEND w/o flags', () => { + br.exec.returns(Promise.resolve()); + return br.upload('mailbox', 'this is a message').then(() => { + expect(br.exec.callCount).to.equal(1); + }); + }); + }); + describe.skip('#setFlags', () => { + beforeEach(() => { + sinon.stub(br, 'exec'); + sinon.stub(br, '_buildSTORECommand'); + sinon.stub(br, '_parseFETCH'); + }); + it('should call STORE', () => { + br.exec.returns(Promise.resolve('abc')); + + br._buildSTORECommand.withArgs('1:2', 'FLAGS', ['\\Seen', '$MyFlag'], { + byUid: true + }).returns({}); + + return br.setFlags('INBOX', '1:2', ['\\Seen', '$MyFlag'], { + byUid: true + }).then(() => { + expect(br.exec.callCount).to.equal(1); + expect(br._parseFETCH.withArgs('abc').callCount).to.equal(1); + }); + }); + }); + describe.skip('#store', () => { + beforeEach(() => { + sinon.stub(br, 'exec'); + sinon.stub(br, '_buildSTORECommand'); + sinon.stub(br, '_parseFETCH'); + }); + it('should call STORE', () => { + br.exec.returns(Promise.resolve('abc')); + + br._buildSTORECommand.withArgs('1:2', '+X-GM-LABELS', ['\\Sent', '\\Junk'], { + byUid: true + }).returns({}); + + return br.store('INBOX', '1:2', '+X-GM-LABELS', ['\\Sent', '\\Junk'], { + byUid: true + }).then(() => { + expect(br._buildSTORECommand.callCount).to.equal(1); + expect(br.exec.callCount).to.equal(1); + expect(br._parseFETCH.withArgs('abc').callCount).to.equal(1); + }); + }); + }); + describe('#deleteMessages', () => { + beforeEach(() => { + sinon.stub(br, 'setFlags'); + sinon.stub(br, 'exec'); + }); + it('should call UID EXPUNGE', () => { + br.exec.withArgs({ + command: 'UID EXPUNGE', + attributes: [{ + type: 'sequence', + value: '1:2' + }] + }).returns(Promise.resolve('abc')); + br.setFlags.withArgs('INBOX', '1:2', { + add: '\\Deleted' + }).returns(Promise.resolve()); + br._capability = ['UIDPLUS']; + return br.deleteMessages('INBOX', '1:2', { + byUid: true + }).then(() => { + expect(br.exec.callCount).to.equal(1); + }); + }); + it('should call EXPUNGE', () => { + br.exec.withArgs('EXPUNGE').returns(Promise.resolve('abc')); + br.setFlags.withArgs('INBOX', '1:2', { + add: '\\Deleted' + }).returns(Promise.resolve()); + br._capability = []; + return br.deleteMessages('INBOX', '1:2', { + byUid: true + }).then(() => { + expect(br.exec.callCount).to.equal(1); + }); + }); + }); + describe('#copyMessages', () => { + beforeEach(() => { + sinon.stub(br, 'exec'); + }); + it('should call COPY', () => { + br.exec.withArgs({ + command: 'UID COPY', + attributes: [{ + type: 'sequence', + value: '1:2' + }, { + type: 'atom', + value: '[Gmail]/Trash' + }] + }).returns(Promise.resolve({ + copyuid: ['1', '1:2', '4,3'] + })); + return br.copyMessages('INBOX', '1:2', '[Gmail]/Trash', { + byUid: true + }).then(response => { + expect(response).to.deep.equal({ + srcSeqSet: '1:2', + destSeqSet: '4,3' + }); + expect(br.exec.callCount).to.equal(1); + }); + }); + }); + describe('#moveMessages', () => { + beforeEach(() => { + sinon.stub(br, 'exec'); + sinon.stub(br, 'copyMessages'); + sinon.stub(br, 'deleteMessages'); + }); + it('should call MOVE if supported', () => { + br.exec.withArgs({ + command: 'UID MOVE', + attributes: [{ + type: 'sequence', + value: '1:2' + }, { + type: 'atom', + value: '[Gmail]/Trash' + }] + }, ['OK']).returns(Promise.resolve('abc')); + br._capability = ['MOVE']; + return br.moveMessages('INBOX', '1:2', '[Gmail]/Trash', { + byUid: true + }).then(() => { + expect(br.exec.callCount).to.equal(1); + }); + }); + it('should fallback to copy+expunge', () => { + br.copyMessages.withArgs('INBOX', '1:2', '[Gmail]/Trash', { + byUid: true + }).returns(Promise.resolve()); + br.deleteMessages.withArgs('1:2', { + byUid: true + }).returns(Promise.resolve()); + br._capability = []; + return br.moveMessages('INBOX', '1:2', '[Gmail]/Trash', { + byUid: true + }).then(() => { + expect(br.deleteMessages.callCount).to.equal(1); + }); + }); + }); + describe('#_shouldSelectMailbox', () => { + it('should return true when ctx is undefined', () => { + expect(br._shouldSelectMailbox('path')).to.be.true; + }); + it('should return true when a different path is queued', () => { + sinon.stub(br.client, 'getPreviouslyQueued').returns({ + request: { + command: 'SELECT', + attributes: [{ + type: 'STRING', + value: 'queued path' + }] + } + }); + expect(br._shouldSelectMailbox('path', {})).to.be.true; + }); + it('should return false when the same path is queued', () => { + sinon.stub(br.client, 'getPreviouslyQueued').returns({ + request: { + command: 'SELECT', + attributes: [{ + type: 'STRING', + value: 'queued path' + }] + } + }); + expect(br._shouldSelectMailbox('queued path', {})).to.be.false; + }); + }); + describe('#selectMailbox', () => { + const path = '[Gmail]/Trash'; + beforeEach(() => { + sinon.stub(br, 'exec'); + }); + it('should run SELECT', () => { + br.exec.withArgs({ + command: 'SELECT', + attributes: [{ + type: 'STRING', + value: path + }] + }).returns(Promise.resolve({ + code: 'READ-WRITE' + })); + return br.selectMailbox(path).then(() => { + expect(br.exec.callCount).to.equal(1); + expect(br._state).to.equal(_client.STATE_SELECTED); + }); + }); + it('should run SELECT with CONDSTORE', () => { + br.exec.withArgs({ + command: 'SELECT', + attributes: [{ + type: 'STRING', + value: path + }, [{ + type: 'ATOM', + value: 'CONDSTORE' + }]] + }).returns(Promise.resolve({ + code: 'READ-WRITE' + })); + br._capability = ['CONDSTORE']; + return br.selectMailbox(path, { + condstore: true + }).then(() => { + expect(br.exec.callCount).to.equal(1); + expect(br._state).to.equal(_client.STATE_SELECTED); + }); + }); + describe('should emit onselectmailbox before selectMailbox is resolved', () => { + beforeEach(() => { + br.exec.returns(Promise.resolve({ + code: 'READ-WRITE' + })); + }); + it('when it returns a promise', () => { + var promiseResolved = false; + + br.onselectmailbox = () => new Promise(resolve => { + resolve(); + promiseResolved = true; + }); + + var onselectmailboxSpy = sinon.spy(br, 'onselectmailbox'); + return br.selectMailbox(path).then(() => { + expect(onselectmailboxSpy.withArgs(path).callCount).to.equal(1); + expect(promiseResolved).to.equal(true); + }); + }); + it('when it does not return a promise', () => { + br.onselectmailbox = () => {}; + + var onselectmailboxSpy = sinon.spy(br, 'onselectmailbox'); + return br.selectMailbox(path).then(() => { + expect(onselectmailboxSpy.withArgs(path).callCount).to.equal(1); + }); + }); + }); + it('should emit onclosemailbox', () => { + let called = false; + br.exec.returns(Promise.resolve('abc')).returns(Promise.resolve({ + code: 'READ-WRITE' + })); + + br.onclosemailbox = path => { + expect(path).to.equal('yyy'); + called = true; + }; + + br._selectedMailbox = 'yyy'; + return br.selectMailbox(path).then(() => { + expect(called).to.be.true; + }); + }); + }); + describe('#hasCapability', () => { + it('should detect existing capability', () => { + br._capability = ['ZZZ']; + expect(br.hasCapability('zzz')).to.be.true; + }); + it('should detect non existing capability', () => { + br._capability = ['ZZZ']; + expect(br.hasCapability('ooo')).to.be.false; + expect(br.hasCapability()).to.be.false; + }); + }); + describe('#_untaggedOkHandler', () => { + it('should update capability if present', () => { + br._untaggedOkHandler({ + capability: ['abc'] + }, () => {}); + + expect(br._capability).to.deep.equal(['abc']); + }); + }); + describe('#_untaggedCapabilityHandler', () => { + it('should update capability', () => { + br._untaggedCapabilityHandler({ + attributes: [{ + value: 'abc' + }] + }, () => {}); + + expect(br._capability).to.deep.equal(['ABC']); + }); + }); + describe('#_untaggedExistsHandler', () => { + it('should emit onupdate', () => { + br.onupdate = sinon.stub(); + br._selectedMailbox = 'FOO'; + + br._untaggedExistsHandler({ + nr: 123 + }, () => {}); + + expect(br.onupdate.withArgs('FOO', 'exists', 123).callCount).to.equal(1); + }); + }); + describe('#_untaggedExpungeHandler', () => { + it('should emit onupdate', () => { + br.onupdate = sinon.stub(); + br._selectedMailbox = 'FOO'; + + br._untaggedExpungeHandler({ + nr: 123 + }, () => {}); + + expect(br.onupdate.withArgs('FOO', 'expunge', 123).callCount).to.equal(1); + }); + }); + describe.skip('#_untaggedFetchHandler', () => { + it('should emit onupdate', () => { + br.onupdate = sinon.stub(); + sinon.stub(br, '_parseFETCH').returns('abc'); + br._selectedMailbox = 'FOO'; + + br._untaggedFetchHandler({ + nr: 123 + }, () => {}); + + expect(br.onupdate.withArgs('FOO', 'fetch', 'abc').callCount).to.equal(1); + expect(br._parseFETCH.args[0][0]).to.deep.equal({ + payload: { + FETCH: [{ + nr: 123 + }] + } + }); + }); + }); + describe('#_changeState', () => { + it('should set the state value', () => { + br._changeState(12345); + + expect(br._state).to.equal(12345); + }); + it('should emit onclosemailbox if mailbox was closed', () => { + br.onclosemailbox = sinon.stub(); + br._state = _client.STATE_SELECTED; + br._selectedMailbox = 'aaa'; + + br._changeState(12345); + + expect(br._selectedMailbox).to.be.false; + expect(br.onclosemailbox.withArgs('aaa').callCount).to.equal(1); + }); + }); + describe('#_ensurePath', () => { + it('should create the path if not present', () => { + var tree = { + children: [] + }; + expect(br._ensurePath(tree, 'hello/world', '/')).to.deep.equal({ + name: 'world', + delimiter: '/', + path: 'hello/world', + children: [] + }); + expect(tree).to.deep.equal({ + children: [{ + name: 'hello', + delimiter: '/', + path: 'hello', + children: [{ + name: 'world', + delimiter: '/', + path: 'hello/world', + children: [] + }] + }] + }); + }); + it('should return existing path if possible', () => { + var tree = { + children: [{ + name: 'hello', + delimiter: '/', + path: 'hello', + children: [{ + name: 'world', + delimiter: '/', + path: 'hello/world', + children: [], + abc: 123 + }] + }] + }; + expect(br._ensurePath(tree, 'hello/world', '/')).to.deep.equal({ + name: 'world', + delimiter: '/', + path: 'hello/world', + children: [], + abc: 123 + }); + }); + it('should handle case insensitive Inbox', () => { + var tree = { + children: [] + }; + expect(br._ensurePath(tree, 'Inbox/world', '/')).to.deep.equal({ + name: 'world', + delimiter: '/', + path: 'Inbox/world', + children: [] + }); + expect(br._ensurePath(tree, 'INBOX/worlds', '/')).to.deep.equal({ + name: 'worlds', + delimiter: '/', + path: 'INBOX/worlds', + children: [] + }); + expect(tree).to.deep.equal({ + children: [{ + name: 'Inbox', + delimiter: '/', + path: 'Inbox', + children: [{ + name: 'world', + delimiter: '/', + path: 'Inbox/world', + children: [] + }, { + name: 'worlds', + delimiter: '/', + path: 'INBOX/worlds', + children: [] + }] + }] + }); + }); + }); + describe('untagged updates', () => { + it('should receive information about untagged exists', done => { + br.client._connectionReady = true; + br._selectedMailbox = 'FOO'; + + br.onupdate = (path, type, value) => { + expect(path).to.equal('FOO'); + expect(type).to.equal('exists'); + expect(value).to.equal(123); + done(); + }; + + br.client._onData({ + /* * 123 EXISTS\r\n */ + data: new Uint8Array([42, 32, 49, 50, 51, 32, 69, 88, 73, 83, 84, 83, 13, 10]).buffer + }); + }); + it('should receive information about untagged expunge', done => { + br.client._connectionReady = true; + br._selectedMailbox = 'FOO'; + + br.onupdate = (path, type, value) => { + expect(path).to.equal('FOO'); + expect(type).to.equal('expunge'); + expect(value).to.equal(456); + done(); + }; + + br.client._onData({ + /* * 456 EXPUNGE\r\n */ + data: new Uint8Array([42, 32, 52, 53, 54, 32, 69, 88, 80, 85, 78, 71, 69, 13, 10]).buffer + }); + }); + it('should receive information about untagged fetch', done => { + br.client._connectionReady = true; + br._selectedMailbox = 'FOO'; + + br.onupdate = (path, type, value) => { + expect(path).to.equal('FOO'); + expect(type).to.equal('fetch'); + expect(value).to.deep.equal({ + '#': 123, + flags: ['\\Seen'], + modseq: '4' + }); + done(); + }; + + br.client._onData({ + /* * 123 FETCH (FLAGS (\\Seen) MODSEQ (4))\r\n */ + data: new Uint8Array([42, 32, 49, 50, 51, 32, 70, 69, 84, 67, 72, 32, 40, 70, 76, 65, 71, 83, 32, 40, 92, 83, 101, 101, 110, 41, 32, 77, 79, 68, 83, 69, 81, 32, 40, 52, 41, 41, 13, 10]).buffer + }); + }); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGllbnQtdW5pdC5qcyJdLCJuYW1lcyI6WyJkZXNjcmliZSIsImJyIiwiYmVmb3JlRWFjaCIsImF1dGgiLCJ1c2VyIiwicGFzcyIsIkltYXBDbGllbnQiLCJsb2dMZXZlbCIsImNsaWVudCIsInNvY2tldCIsInNlbmQiLCJ1cGdyYWRlVG9TZWN1cmUiLCJpdCIsInNpbm9uIiwic3R1YiIsIl9hdXRoZW50aWNhdGVkIiwiX2VudGVyZWRJZGxlIiwiX29uSWRsZSIsImV4cGVjdCIsImVudGVySWRsZSIsImNhbGxDb3VudCIsInRvIiwiZXF1YWwiLCJjb25uZWN0IiwicmV0dXJucyIsIlByb21pc2UiLCJyZXNvbHZlIiwiZW5xdWV1ZUNvbW1hbmQiLCJjYXBhYmlsaXR5Iiwic2V0VGltZW91dCIsIm9ucmVhZHkiLCJvcGVuQ29ubmVjdGlvbiIsInRoZW4iLCJjYWxsZWRPbmNlIiwiYmUiLCJ0cnVlIiwiX2NhcGFiaWxpdHkiLCJsZW5ndGgiLCJ1cGRhdGVDYXBhYmlsaXR5IiwidXBncmFkZUNvbm5lY3Rpb24iLCJ1cGRhdGVJZCIsImxvZ2luIiwiY29tcHJlc3NDb25uZWN0aW9uIiwiZG9uZSIsInRocm93cyIsIkVycm9yIiwiY2F0Y2giLCJlcnIiLCJleGlzdCIsImNsb3NlIiwiY2FsbGVkIiwiZmFsc2UiLCJ0aW1lb3V0Q29ubmVjdGlvbiIsIl9zdGF0ZSIsIlNUQVRFX0xPR09VVCIsImV4ZWMiLCJyZXMiLCJkZWVwIiwiYXJncyIsImNhbGxzRmFrZSIsImNvbW1hbmQiLCJfc2VsZWN0ZWRNYWlsYm94IiwidGltZW91dE5vb3AiLCJ1bmRlZmluZWQiLCJwYXlsb2FkIiwic2xpY2UiLCJjYWxsIiwiVWludDhBcnJheSIsInRpbWVvdXRJZGxlIiwiYnJlYWtJZGxlIiwic2VjdXJlTW9kZSIsIndpdGhBcmdzIiwidXBncmFkZSIsIl9yZXF1aXJlVExTIiwiTkFNRVNQQUNFIiwiYXR0cmlidXRlcyIsInR5cGUiLCJ2YWx1ZSIsImxpc3ROYW1lc3BhY2VzIiwibmFtZXNwYWNlcyIsInBlcnNvbmFsIiwicHJlZml4IiwiZGVsaW1pdGVyIiwidXNlcnMiLCJzaGFyZWQiLCJfZW5hYmxlQ29tcHJlc3Npb24iLCJlbmFibGVDb21wcmVzc2lvbiIsInNlbnNpdGl2ZSIsInhvYXV0aDIiLCJhIiwiYyIsInNlcnZlcklkIiwiSUQiLCJja2V5MSIsImNrZXkyIiwic2tleTEiLCJza2V5MiIsIkxJU1QiLCJMU1VCIiwibGlzdE1haWxib3hlcyIsInRyZWUiLCJjcmVhdGVNYWlsYm94IiwiZmFrZUVyciIsImNvZGUiLCJyZWplY3QiLCJkZWxldGVNYWlsYm94Iiwic2tpcCIsIl9idWlsZEZFVENIQ29tbWFuZCIsImJ5VWlkIiwibGlzdE1lc3NhZ2VzIiwiX3BhcnNlRkVUQ0giLCJfYnVpbGRTRUFSQ0hDb21tYW5kIiwidWlkIiwic2VhcmNoIiwiX3BhcnNlU0VBUkNIIiwidXBsb2FkIiwiZmxhZ3MiLCJfYnVpbGRTVE9SRUNvbW1hbmQiLCJzZXRGbGFncyIsInN0b3JlIiwiYWRkIiwiZGVsZXRlTWVzc2FnZXMiLCJjb3B5dWlkIiwiY29weU1lc3NhZ2VzIiwicmVzcG9uc2UiLCJzcmNTZXFTZXQiLCJkZXN0U2VxU2V0IiwibW92ZU1lc3NhZ2VzIiwiX3Nob3VsZFNlbGVjdE1haWxib3giLCJyZXF1ZXN0IiwicGF0aCIsInNlbGVjdE1haWxib3giLCJTVEFURV9TRUxFQ1RFRCIsImNvbmRzdG9yZSIsInByb21pc2VSZXNvbHZlZCIsIm9uc2VsZWN0bWFpbGJveCIsIm9uc2VsZWN0bWFpbGJveFNweSIsInNweSIsIm9uY2xvc2VtYWlsYm94IiwiaGFzQ2FwYWJpbGl0eSIsIl91bnRhZ2dlZE9rSGFuZGxlciIsIl91bnRhZ2dlZENhcGFiaWxpdHlIYW5kbGVyIiwib251cGRhdGUiLCJfdW50YWdnZWRFeGlzdHNIYW5kbGVyIiwibnIiLCJfdW50YWdnZWRFeHB1bmdlSGFuZGxlciIsIl91bnRhZ2dlZEZldGNoSGFuZGxlciIsIkZFVENIIiwiX2NoYW5nZVN0YXRlIiwiY2hpbGRyZW4iLCJfZW5zdXJlUGF0aCIsIm5hbWUiLCJhYmMiLCJfY29ubmVjdGlvblJlYWR5IiwiX29uRGF0YSIsImRhdGEiLCJidWZmZXIiLCJtb2RzZXEiXSwibWFwcGluZ3MiOiI7O0FBRUE7O0FBQ0E7O0FBQ0E7Ozs7OztBQUpBO0FBU0FBLFFBQVEsQ0FBQyx1QkFBRCxFQUEwQixNQUFNO0FBQ3RDLE1BQUlDLEVBQUo7QUFFQUMsRUFBQUEsVUFBVSxDQUFDLE1BQU07QUFDZixVQUFNQyxJQUFJLEdBQUc7QUFBRUMsTUFBQUEsSUFBSSxFQUFFLFVBQVI7QUFBb0JDLE1BQUFBLElBQUksRUFBRTtBQUExQixLQUFiO0FBQ0FKLElBQUFBLEVBQUUsR0FBRyxJQUFJSyxlQUFKLENBQWUsVUFBZixFQUEyQixJQUEzQixFQUFpQztBQUFFSCxNQUFBQSxJQUFGO0FBQVFJLE1BQUFBLFFBQVEsRUFBUkE7QUFBUixLQUFqQyxDQUFMO0FBQ0FOLElBQUFBLEVBQUUsQ0FBQ08sTUFBSCxDQUFVQyxNQUFWLEdBQW1CO0FBQ2pCQyxNQUFBQSxJQUFJLEVBQUUsTUFBTSxDQUFHLENBREU7QUFFakJDLE1BQUFBLGVBQWUsRUFBRSxNQUFNLENBQUc7QUFGVCxLQUFuQjtBQUlELEdBUFMsQ0FBVjtBQVNBWCxFQUFBQSxRQUFRLENBQUMsVUFBRCxFQUFhLE1BQU07QUFDekJZLElBQUFBLEVBQUUsQ0FBQyx1QkFBRCxFQUEwQixNQUFNO0FBQ2hDQyxNQUFBQSxLQUFLLENBQUNDLElBQU4sQ0FBV2IsRUFBWCxFQUFlLFdBQWY7QUFFQUEsTUFBQUEsRUFBRSxDQUFDYyxjQUFILEdBQW9CLElBQXBCO0FBQ0FkLE1BQUFBLEVBQUUsQ0FBQ2UsWUFBSCxHQUFrQixLQUFsQjs7QUFDQWYsTUFBQUEsRUFBRSxDQUFDZ0IsT0FBSDs7QUFFQUMsTUFBQUEsTUFBTSxDQUFDakIsRUFBRSxDQUFDa0IsU0FBSCxDQUFhQyxTQUFkLENBQU4sQ0FBK0JDLEVBQS9CLENBQWtDQyxLQUFsQyxDQUF3QyxDQUF4QztBQUNELEtBUkMsQ0FBRjtB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LEVBQXpFLEVBQTZFLEVBQTdFLEVBQWlGLEVBQWpGLEVBQXFGLEVBQXJGLEVBQXlGLEdBQXpGLEVBQThGLEdBQTlGLEVBQW1HLEdBQW5HLEVBQXdHLEVBQXhHLEVBQTRHLEVBQTVHLEVBQWdILEVBQWhILEVBQW9ILEVBQXBILEVBQXdILEVBQXhILEVBQTRILEVBQTVILEVBQWdJLEVBQWhJLEVBQW9JLEVBQXBJLEVBQXdJLEVBQXhJLEVBQTRJLEVBQTVJLEVBQWdKLEVBQWhKLEVBQW9KLEVBQXBKLEVBQXdKLEVBQXhKLEVBQTRKLEVBQTVKLEVBQWdLLEVBQWhLLENBQWYsRUFBb0x5RjtBQUYxSyxPQUFsQjtBQUlELEtBakJDLENBQUY7QUFrQkQsR0FqRE8sQ0FBUjtBQWtERCxDQTVzQ08sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC1leHByZXNzaW9ucyAqL1xuXG5pbXBvcnQgSW1hcENsaWVudCwgeyBTVEFURV9TRUxFQ1RFRCwgU1RBVEVfTE9HT1VUIH0gZnJvbSAnLi9jbGllbnQnXG5pbXBvcnQgeyBwYXJzZXIgfSBmcm9tICdlbWFpbGpzLWltYXAtaGFuZGxlcidcbmltcG9ydCB7XG4gIHRvVHlwZWRBcnJheSxcbiAgTE9HX0xFVkVMX05PTkUgYXMgbG9nTGV2ZWxcbn0gZnJvbSAnLi9jb21tb24nXG5cbmRlc2NyaWJlKCdicm93c2VyYm94IHVuaXQgdGVzdHMnLCAoKSA9PiB7XG4gIHZhciBiclxuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGNvbnN0IGF1dGggPSB7IHVzZXI6ICdiYWxkcmlhbicsIHBhc3M6ICdzbGVlcGVyLmRlJyB9XG4gICAgYnIgPSBuZXcgSW1hcENsaWVudCgnc29tZWhvc3QnLCAxMjM0LCB7IGF1dGgsIGxvZ0xldmVsIH0pXG4gICAgYnIuY2xpZW50LnNvY2tldCA9IHtcbiAgICAgIHNlbmQ6ICgpID0+IHsgfSxcbiAgICAgIHVwZ3JhZGVUb1NlY3VyZTogKCkgPT4geyB9XG4gICAgfVxuICB9KVxuXG4gIGRlc2NyaWJlKCcjX29uSWRsZScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNhbGwgZW50ZXJJZGxlJywgKCkgPT4ge1xuICAgICAgc2lub24uc3R1YihiciwgJ2VudGVySWRsZScpXG5cbiAgICAgIGJyLl9hdXRoZW50aWNhdGVkID0gdHJ1ZVxuICAgICAgYnIuX2VudGVyZWRJZGxlID0gZmFsc2VcbiAgICAgIGJyLl9vbklkbGUoKVxuXG4gICAgICBleHBlY3QoYnIuZW50ZXJJZGxlLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBub3QgY2FsbCBlbnRlcklkbGUnLCAoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGJyLCAnZW50ZXJJZGxlJylcblxuICAgICAgYnIuX2VudGVyZWRJZGxlID0gdHJ1ZVxuICAgICAgYnIuX29uSWRsZSgpXG5cbiAgICAgIGV4cGVjdChici5lbnRlcklkbGUuY2FsbENvdW50KS50by5lcXVhbCgwKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJyNvcGVuQ29ubmVjdGlvbicsICgpID0+IHtcbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIHNpbm9uLnN0dWIoYnIuY2xpZW50LCAnY29ubmVjdCcpXG4gICAgICBzaW5vbi5zdHViKGJyLmNsaWVudCwgJ2Nsb3NlJylcbiAgICAgIHNpbm9uLnN0dWIoYnIuY2xpZW50LCAnZW5xdWV1ZUNvbW1hbmQnKVxuICAgIH0pXG4gICAgaXQoJ3Nob3VsZCBvcGVuIGNvbm5lY3Rpb24nLCAoKSA9PiB7XG4gICAgICBici5jbGllbnQuY29ubmVjdC5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSgpKVxuICAgICAgYnIuY2xpZW50LmVucXVldWVDb21tYW5kLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgY2FwYWJpbGl0eTogWydjYXBhMScsICdjYXBhMiddXG4gICAgICB9KSlcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gYnIuY2xpZW50Lm9ucmVhZHkoKSwgMClcbiAgICAgIHJldHVybiBici5vcGVuQ29ubmVjdGlvbigpLnRoZW4oKCkgPT4ge1xuICAgICAgICBleHBlY3QoYnIuY2xpZW50LmNvbm5lY3QuY2FsbGVkT25jZSkudG8uYmUudHJ1ZVxuICAgICAgICBleHBlY3QoYnIuY2xpZW50LmVucXVldWVDb21tYW5kLmNhbGxlZE9uY2UpLnRvLmJlLnRydWVcbiAgICAgICAgZXhwZWN0KGJyLl9jYXBhYmlsaXR5Lmxlbmd0aCkudG8uZXF1YWwoMilcbiAgICAgICAgZXhwZWN0KGJyLl9jYXBhYmlsaXR5WzBdKS50by5lcXVhbCgnY2FwYTEnKVxuICAgICAgICBleHBlY3QoYnIuX2NhcGFiaWxpdHlbMV0pLnRvLmVxdWFsKCdjYXBhMicpXG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJyNjb25uZWN0JywgKCkgPT4ge1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgc2lub24uc3R1Yihici5jbGllbnQsICdjb25uZWN0JylcbiAgICAgIHNpbm9uLnN0dWIoYnIuY2xpZW50LCAnY2xvc2UnKVxuICAgICAgc2lub24uc3R1YihiciwgJ3VwZGF0ZUNhcGFiaWxpdHknKVxuICAgICAgc2lub24uc3R1YihiciwgJ3VwZ3JhZGVDb25uZWN0aW9uJylcbiAgICAgIHNpbm9uLnN0dWIoYnIsICd1cGRhdGVJZCcpXG4gICAgICBzaW5vbi5zdHViKGJyLCAnbG9naW4nKVxuICAgICAgc2lub24uc3R1YihiciwgJ2NvbXByZXNzQ29ubmVjdGlvbicpXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgY29ubmVjdCcsICgpID0+IHtcbiAgICAgIGJyLmNsaWVudC5jb25uZWN0LnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKCkpXG4gICAgICBici51cGRhdGVDYXBhYmlsaXR5LnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKCkpXG4gICAgICBici51cGdyYWRlQ29ubmVjdGlvbi5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSgpKVxuICAgICAgYnIudXBkYXRlSWQucmV0dXJucyhQcm9taXNlLnJlc29sdmUoKSlcbiAgICAgIGJyLmxvZ2luLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKCkpXG4gICAgICBici5jb21wcmVzc0Nvbm5lY3Rpb24ucmV0dXJucyhQcm9taXNlLnJlc29sdmUoKSlcblxuICAgICAgc2V0VGltZW91dCgoKSA9PiBici5jbGllbnQub25yZWFkeSgpLCAwKVxuICAgICAgcmV0dXJuIGJyLmNvbm5lY3QoKS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KGJyLmNsaWVudC5jb25uZWN0LmNhbGxlZE9uY2UpLnRvLmJlLnRydWVcbiAgICAgICAgZXhwZWN0KGJyLnVwZGF0ZUNhcGFiaWxpdHkuY2FsbGVkT25jZSkudG8uYmUudHJ1ZVxuICAgICAgICBleHBlY3QoYnIudXBncmFkZUNvbm5lY3Rpb24uY2FsbGVkT25jZSkudG8uYmUudHJ1ZVxuICAgICAgICBleHBlY3QoYnIudXBkYXRlSWQuY2FsbGVkT25jZSkudG8uYmUudHJ1ZVxuICAgICAgICBleHBlY3QoYnIubG9naW4uY2FsbGVkT25jZSkudG8uYmUudHJ1ZVxuICAgICAgICBleHBlY3QoYnIuY29tcHJlc3NDb25uZWN0aW9uLmNhbGxlZE9uY2UpLnRvLmJlLnRydWVcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBsb2dpbicsIChkb25lKSA9PiB7XG4gICAgICBici5jbGllbnQuY29ubmVjdC5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSgpKVxuICAgICAgYnIudXBkYXRlQ2FwYWJpbGl0eS5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSgpKVxuICAgICAgYnIudXBncmFkZUNvbm5lY3Rpb24ucmV0dXJucyhQcm9taXNlLnJlc29sdmUoKSlcbiAgICAgIGJyLnVwZGF0ZUlkLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKCkpXG4gICAgICBici5sb2dpbi50aHJvd3MobmV3IEVycm9yKCkpXG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gYnIuY2xpZW50Lm9ucmVhZHkoKSwgMClcbiAgICAgIGJyLmNvbm5lY3QoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIGV4cGVjdChlcnIpLnRvLmV4aXN0XG5cbiAgICAgICAgZXhwZWN0KGJyLmNsaWVudC5jb25uZWN0LmNhbGxlZE9uY2UpLnRvLmJlLnRydWVcbiAgICAgICAgZXhwZWN0KGJyLmNsaWVudC5jbG9zZS5jYWxsZWRPbmNlKS50by5iZS50cnVlXG4gICAgICAgIGV4cGVjdChici51cGRhdGVDYXBhYmlsaXR5LmNhbGxlZE9uY2UpLnRvLmJlLnRydWVcbiAgICAgICAgZXhwZWN0KGJyLnVwZ3JhZGVDb25uZWN0aW9uLmNhbGxlZE9uY2UpLnRvLmJlLnRydWVcbiAgICAgICAgZXhwZWN0KGJyLnVwZGF0ZUlkLmNhbGxlZE9uY2UpLnRvLmJlLnRydWVcbiAgICAgICAgZXhwZWN0KGJyLmxvZ2luLmNhbGxlZE9uY2UpLnRvLmJlLnRydWVcblxuICAgICAgICBleHBlY3QoYnIuY29tcHJlc3NDb25uZWN0aW9uLmNhbGxlZCkudG8uYmUuZmFsc2VcblxuICAgICAgICBkb25lKClcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgdGltZW91dCcsIChkb25lKSA9PiB7XG4gICAgICBici5jbGllbnQuY29ubmVjdC5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSgpKVxuICAgICAgYnIudGltZW91dENvbm5lY3Rpb24gPSAxXG5cbiAgICAgIGJyLmNvbm5lY3QoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIGV4cGVjdChlcnIpLnRvLmV4aXN0XG5cbiAgICAgICAgZXhwZWN0KGJyLmNsaWVudC5jb25uZWN0LmNhbGxlZE9uY2UpLnRvLmJlLnRydWVcbiAgICAgICAgZXhwZWN0KGJyLmNsaWVudC5jbG9zZS5jYWxsZWRPbmNlKS50by5iZS50cnVlXG5cbiAgICAgICAgZXhwZWN0KGJyLnVwZGF0ZUNhcGFiaWxpdHkuY2FsbGVkKS50by5iZS5mYWxzZVxuICAgICAgICBleHBlY3QoYnIudXBncmFkZUNvbm5lY3Rpb24uY2FsbGVkKS50by5iZS5mYWxzZVxuICAgICAgICBleHBlY3QoYnIudXBkYXRlSWQuY2FsbGVkKS50by5iZS5mYWxzZVxuICAgICAgICBleHBlY3QoYnIubG9naW4uY2FsbGVkKS50by5iZS5mYWxzZVxuICAgICAgICBleHBlY3QoYnIuY29tcHJlc3NDb25uZWN0aW9uLmNhbGxlZCkudG8uYmUuZmFsc2VcblxuICAgICAgICBkb25lKClcbiAgICAgIH0pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnI2Nsb3NlJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZm9yY2UtY2xvc2UnLCAoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGJyLmNsaWVudCwgJ2Nsb3NlJykucmV0dXJucyhQcm9taXNlLnJlc29sdmUoKSlcblxuICAgICAgcmV0dXJuIGJyLmNsb3NlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChici5fc3RhdGUpLnRvLmVxdWFsKFNUQVRFX0xPR09VVClcbiAgICAgICAgZXhwZWN0KGJyLmNsaWVudC5jbG9zZS5jYWxsZWRPbmNlKS50by5iZS50cnVlXG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJyNleGVjJywgKCkgPT4ge1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgc2lub24uc3R1YihiciwgJ2JyZWFrSWRsZScpXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgc2VuZCBzdHJpbmcgY29tbWFuZCcsICgpID0+IHtcbiAgICAgIHNpbm9uLnN0dWIoYnIuY2xpZW50LCAnZW5xdWV1ZUNvbW1hbmQnKS5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSh7fSkpXG4gICAgICByZXR1cm4gYnIuZXhlYygnVEVTVCcpLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICBleHBlY3QocmVzKS50by5kZWVwLmVxdWFsKHt9KVxuICAgICAgICBleHBlY3QoYnIuY2xpZW50LmVucXVldWVDb21tYW5kLmFyZ3NbMF1bMF0pLnRvLmVxdWFsKCdURVNUJylcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgdXBkYXRlIGNhcGFiaWxpdHkgZnJvbSByZXNwb25zZScsICgpID0+IHtcbiAgICAgIHNpbm9uLnN0dWIoYnIuY2xpZW50LCAnZW5xdWV1ZUNvbW1hbmQnKS5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgIGNhcGFiaWxpdHk6IFsnQScsICdCJ11cbiAgICAgIH0pKVxuICAgICAgcmV0dXJuIGJyLmV4ZWMoJ1RFU1QnKS50aGVuKChyZXMpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlcykudG8uZGVlcC5lcXVhbCh7XG4gICAgICAgICAgY2FwYWJpbGl0eTogWydBJywgJ0InXVxuICAgICAgICB9KVxuICAgICAgICBleHBlY3QoYnIuX2NhcGFiaWxpdHkpLnRvLmRlZXAuZXF1YWwoWydBJywgJ0InXSlcbiAgICAgIH0pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnI2VudGVySWRsZScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHBlcmlvZGljYWxseSBzZW5kIE5PT1AgaWYgSURMRSBub3Qgc3VwcG9ydGVkJywgKGRvbmUpID0+IHtcbiAgICAgIHNpbm9uLnN0dWIoYnIsICdleGVjJykuY2FsbHNGYWtlKChjb21tYW5kKSA9PiB7XG4gICAgICAgIGV4cGVjdChjb21tYW5kKS50by5lcXVhbCgnTk9PUCcpXG5cbiAgICAgICAgZG9uZSgpXG4gICAgICB9KVxuXG4gICAgICBici5fY2FwYWJpbGl0eSA9IFtdXG4gICAgICBici5fc2VsZWN0ZWRNYWlsYm94ID0gJ0ZPTydcbiAgICAgIGJyLnRpbWVvdXROb29wID0gMVxuICAgICAgYnIuZW50ZXJJZGxlKClcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBwZXJpb2RpY2FsbHkgc2VuZCBOT09QIGlmIG5vIG1haWxib3ggc2VsZWN0ZWQnLCAoZG9uZSkgPT4ge1xuICAgICAgc2lub24uc3R1YihiciwgJ2V4ZWMnKS5jYWxsc0Zha2UoKGNvbW1hbmQpID0+IHtcbiAgICAgICAgZXhwZWN0KGNvbW1hbmQpLnRvLmVxdWFsKCdOT09QJylcblxuICAgICAgICBkb25lKClcbiAgICAgIH0pXG5cbiAgICAgIGJyLl9jYXBhYmlsaXR5ID0gWydJRExFJ11cbiAgICAgIGJyLl9zZWxlY3RlZE1haWxib3ggPSB1bmRlZmluZWRcbiAgICAgIGJyLnRpbWVvdXROb29wID0gMVxuICAgICAgYnIuZW50ZXJJZGxlKClcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBicmVhayBJRExFIGFmdGVyIHRpbWVvdXQnLCAoZG9uZSkgPT4ge1xuICAgICAgc2lub24uc3R1Yihici5jbGllbnQsICdlbnF1ZXVlQ29tbWFuZCcpXG4gICAgICBzaW5vbi5zdHViKGJyLmNsaWVudC5zb2NrZXQsICdzZW5kJykuY2FsbHNGYWtlKChwYXlsb2FkKSA9PiB7XG4gICAgICAgIGV4cGVjdChici5jbGllbnQuZW5xdWV1ZUNvbW1hbmQuYXJnc1swXVswXS5jb21tYW5kKS50by5lcXVhbCgnSURMRScpXG4gICAgICAgIGV4cGVjdChbXS5zbGljZS5jYWxsKG5ldyBVaW50OEFycmF5KHBheWxvYWQpKSkudG8uZGVlcC5lcXVhbChbMHg0NCwgMHg0ZiwgMHg0ZSwgMHg0NSwgMHgwZCwgMHgwYV0pXG5cbiAgICAgICAgZG9uZSgpXG4gICAgICB9KVxuXG4gICAgICBici5fY2FwYWJpbGl0eSA9IFsnSURMRSddXG4gICAgICBici5fc2VsZWN0ZWRNYWlsYm94ID0gJ0ZPTydcbiAgICAgIGJyLnRpbWVvdXRJZGxlID0gMVxuICAgICAgYnIuZW50ZXJJZGxlKClcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCcjYnJlYWtJZGxlJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgc2VuZCBET05FIHRvIHNvY2tldCcsICgpID0+IHtcbiAgICAgIHNpbm9uLnN0dWIoYnIuY2xpZW50LnNvY2tldCwgJ3NlbmQnKVxuXG4gICAgICBici5fZW50ZXJlZElkbGUgPSAnSURMRSdcbiAgICAgIGJyLmJyZWFrSWRsZSgpXG4gICAgICBleHBlY3QoW10uc2xpY2UuY2FsbChuZXcgVWludDhBcnJheShici5jbGllbnQuc29ja2V0LnNlbmQuYXJnc1swXVswXSkpKS50by5kZWVwLmVxdWFsKFsweDQ0LCAweDRmLCAweDRlLCAweDQ1LCAweDBkLCAweDBhXSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCcjdXBncmFkZUNvbm5lY3Rpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBkbyBub3RoaW5nIGlmIGFscmVhZHkgc2VjdXJlZCcsICgpID0+IHtcbiAgICAgIGJyLmNsaWVudC5zZWN1cmVNb2RlID0gdHJ1ZVxuICAgICAgYnIuX2NhcGFiaWxpdHkgPSBbJ3N0YXJ0dGxzJ11cbiAgICAgIHJldHVybiBici51cGdyYWRlQ29ubmVjdGlvbigpXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgZG8gbm90aGluZyBpZiBTVEFSVFRMUyBub3QgYXZhaWxhYmxlJywgKCkgPT4ge1xuICAgICAgYnIuY2xpZW50LnNlY3VyZU1vZGUgPSBmYWxzZVxuICAgICAgYnIuX2NhcGFiaWxpdHkgPSBbXVxuICAgICAgcmV0dXJuIGJyLnVwZ3JhZGVDb25uZWN0aW9uKClcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBydW4gU1RBUlRUTFMnLCAoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGJyLmNsaWVudCwgJ3VwZ3JhZGUnKVxuICAgICAgc2lub24uc3R1YihiciwgJ2V4ZWMnKS53aXRoQXJncygnU1RBUlRUTFMnKS5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSgpKVxuICAgICAgc2lub24uc3R1YihiciwgJ3VwZGF0ZUNhcGFiaWxpdHknKS5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSgpKVxuXG4gICAgICBici5fY2FwYWJpbGl0eSA9IFsnU1RBUlRUTFMnXVxuXG4gICAgICByZXR1cm4gYnIudXBncmFkZUNvbm5lY3Rpb24oKS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KGJyLmNsaWVudC51cGdyYWRlLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgICAgZXhwZWN0KGJyLl9jYXBhYmlsaXR5Lmxlbmd0aCkudG8uZXF1YWwoMClcbiAgICAgIH0pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnI3VwZGF0ZUNhcGFiaWxpdHknLCAoKSA9PiB7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGJyLCAnZXhlYycpXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgZG8gbm90aGluZyBpZiBjYXBhYmlsaXR5IGlzIHNldCcsICgpID0+IHtcbiAgICAgIGJyLl9jYXBhYmlsaXR5ID0gWydhYmMnXVxuICAgICAgcmV0dXJuIGJyLnVwZGF0ZUNhcGFiaWxpdHkoKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHJ1biBDQVBBQklMSVRZIGlmIGNhcGFiaWxpdHkgbm90IHNldCcsICgpID0+IHtcbiAgICAgIGJyLmV4ZWMucmV0dXJucyhQcm9taXNlLnJlc29sdmUoKSlcblxuICAgICAgYnIuX2NhcGFiaWxpdHkgPSBbXVxuXG4gICAgICByZXR1cm4gYnIudXBkYXRlQ2FwYWJpbGl0eSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICBleHBlY3QoYnIuZXhlYy5hcmdzWzBdWzBdKS50by5lcXVhbCgnQ0FQQUJJTElUWScpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIGZvcmNlIHJ1biBDQVBBQklMSVRZJywgKCkgPT4ge1xuICAgICAgYnIuZXhlYy5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSgpKVxuICAgICAgYnIuX2NhcGFiaWxpdHkgPSBbJ2FiYyddXG5cbiAgICAgIHJldHVybiBici51cGRhdGVDYXBhYmlsaXR5KHRydWUpLnRoZW4oKCkgPT4ge1xuICAgICAgICBleHBlY3QoYnIuZXhlYy5hcmdzWzBdWzBdKS50by5lcXVhbCgnQ0FQQUJJTElUWScpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIGRvIG5vdGhpbmcgaWYgY29ubmVjdGlvbiBpcyBub3QgeWV0IHVwZ3JhZGVkJywgKCkgPT4ge1xuICAgICAgYnIuX2NhcGFiaWxpdHkgPSBbXVxuICAgICAgYnIuY2xpZW50LnNlY3VyZU1vZGUgPSBmYWxzZVxuICAgICAgYnIuX3JlcXVpcmVUTFMgPSB0cnVlXG5cbiAgICAgIGJyLnVwZGF0ZUNhcGFiaWxpdHkoKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJyNsaXN0TmFtZXNwYWNlcycsICgpID0+IHtcbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIHNpbm9uLnN0dWIoYnIsICdleGVjJylcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBydW4gTkFNRVNQQUNFIGlmIHN1cHBvcnRlZCcsICgpID0+IHtcbiAgICAgIGJyLmV4ZWMucmV0dXJucyhQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgTkFNRVNQQUNFOiBbe1xuICAgICAgICAgICAgYXR0cmlidXRlczogW1xuICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgW3tcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdTVFJJTkcnLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6ICdJTkJPWC4nXG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ1NUUklORycsXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogJy4nXG4gICAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgICAgXSwgbnVsbCwgbnVsbFxuICAgICAgICAgICAgXVxuICAgICAgICAgIH1dXG4gICAgICAgIH1cbiAgICAgIH0pKVxuICAgICAgYnIuX2NhcGFiaWxpdHkgPSBbJ05BTUVTUEFDRSddXG5cbiAgICAgIHJldHVybiBici5saXN0TmFtZXNwYWNlcygpLnRoZW4oKG5hbWVzcGFjZXMpID0+IHtcbiAgICAgICAgZXhwZWN0KG5hbWVzcGFjZXMpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgICAgIHBlcnNvbmFsOiBbe1xuICAgICAgICAgICAgcHJlZml4OiAnSU5CT1guJyxcbiAgICAgICAgICAgIGRlbGltaXRlcjogJy4nXG4gICAgICAgICAgfV0sXG4gICAgICAgICAgdXNlcnM6IGZhbHNlLFxuICAgICAgICAgIHNoYXJlZDogZmFsc2VcbiAgICAgICAgfSlcbiAgICAgICAgZXhwZWN0KGJyLmV4ZWMuYXJnc1swXVswXSkudG8uZXF1YWwoJ05BTUVTUEFDRScpXG4gICAgICAgIGV4cGVjdChici5leGVjLmFyZ3NbMF1bMV0pLnRvLmVxdWFsKCdOQU1FU1BBQ0UnKVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBkbyBub3RoaW5nIGlmIG5vdCBzdXBwb3J0ZWQnLCAoKSA9PiB7XG4gICAgICBici5fY2FwYWJpbGl0eSA9IFtdXG4gICAgICByZXR1cm4gYnIubGlzdE5hbWVzcGFjZXMoKS50aGVuKChuYW1lc3BhY2VzKSA9PiB7XG4gICAgICAgIGV4cGVjdChuYW1lc3BhY2VzKS50by5iZS5mYWxzZVxuICAgICAgICBleHBlY3QoYnIuZXhlYy5jYWxsQ291bnQpLnRvLmVxdWFsKDApXG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJyNjb21wcmVzc0Nvbm5lY3Rpb24nLCAoKSA9PiB7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGJyLCAnZXhlYycpXG4gICAgICBzaW5vbi5zdHViKGJyLmNsaWVudCwgJ2VuYWJsZUNvbXByZXNzaW9uJylcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBydW4gQ09NUFJFU1M9REVGTEFURSBpZiBzdXBwb3J0ZWQnLCAoKSA9PiB7XG4gICAgICBici5leGVjLndpdGhBcmdzKHtcbiAgICAgICAgY29tbWFuZDogJ0NPTVBSRVNTJyxcbiAgICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgdmFsdWU6ICdERUZMQVRFJ1xuICAgICAgICB9XVxuICAgICAgfSkucmV0dXJucyhQcm9taXNlLnJlc29sdmUoe30pKVxuXG4gICAgICBici5fZW5hYmxlQ29tcHJlc3Npb24gPSB0cnVlXG4gICAgICBici5fY2FwYWJpbGl0eSA9IFsnQ09NUFJFU1M9REVGTEFURSddXG4gICAgICByZXR1cm4gYnIuY29tcHJlc3NDb25uZWN0aW9uKCkudGhlbigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChici5leGVjLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgICAgZXhwZWN0KGJyLmNsaWVudC5lbmFibGVDb21wcmVzc2lvbi5jYWxsQ291bnQpLnRvLmVxdWFsKDEpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIGRvIG5vdGhpbmcgaWYgbm90IHN1cHBvcnRlZCcsICgpID0+IHtcbiAgICAgIGJyLl9jYXBhYmlsaXR5ID0gW11cblxuICAgICAgcmV0dXJuIGJyLmNvbXByZXNzQ29ubmVjdGlvbigpLnRoZW4oKCkgPT4ge1xuICAgICAgICBleHBlY3QoYnIuZXhlYy5jYWxsQ291bnQpLnRvLmVxdWFsKDApXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIGRvIG5vdGhpbmcgaWYgbm90IGVuYWJsZWQnLCAoKSA9PiB7XG4gICAgICBici5fZW5hYmxlQ29tcHJlc3Npb24gPSBmYWxzZVxuICAgICAgYnIuX2NhcGFiaWxpdHkgPSBbJ0NPTVBSRVNTPURFRkxBVEUnXVxuXG4gICAgICByZXR1cm4gYnIuY29tcHJlc3NDb25uZWN0aW9uKCkudGhlbigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChici5leGVjLmNhbGxDb3VudCkudG8uZXF1YWwoMClcbiAgICAgIH0pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnI2xvZ2luJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgY2FsbCBMT0dJTicsICgpID0+IHtcbiAgICAgIHNpbm9uLnN0dWIoYnIsICdleGVjJykucmV0dXJucyhQcm9taXNlLnJlc29sdmUoe30pKVxuICAgICAgc2lub24uc3R1YihiciwgJ3VwZGF0ZUNhcGFiaWxpdHknKS5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSh0cnVlKSlcblxuICAgICAgcmV0dXJuIGJyLmxvZ2luKHtcbiAgICAgICAgdXNlcjogJ3UxJyxcbiAgICAgICAgcGFzczogJ3AxJ1xuICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChici5leGVjLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgICAgZXhwZWN0KGJyLmV4ZWMuYXJnc1swXVswXSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICAgICAgY29tbWFuZDogJ2xvZ2luJyxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBbe1xuICAgICAgICAgICAgdHlwZTogJ1NUUklORycsXG4gICAgICAgICAgICB2YWx1ZTogJ3UxJ1xuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIHR5cGU6ICdTVFJJTkcnLFxuICAgICAgICAgICAgdmFsdWU6ICdwMScsXG4gICAgICAgICAgICBzZW5zaXRpdmU6IHRydWVcbiAgICAgICAgICB9XVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBjYWxsIFhPQVVUSDInLCAoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGJyLCAnZXhlYycpLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKHt9KSlcbiAgICAgIHNpbm9uLnN0dWIoYnIsICd1cGRhdGVDYXBhYmlsaXR5JykucmV0dXJucyhQcm9taXNlLnJlc29sdmUodHJ1ZSkpXG5cbiAgICAgIGJyLl9jYXBhYmlsaXR5ID0gWydBVVRIPVhPQVVUSDInXVxuICAgICAgYnIubG9naW4oe1xuICAgICAgICB1c2VyOiAndTEnLFxuICAgICAgICB4b2F1dGgyOiAnYWJjJ1xuICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChici5leGVjLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgICAgZXhwZWN0KGJyLmV4ZWMuYXJnc1swXVswXSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICAgICAgY29tbWFuZDogJ0FVVEhFTlRJQ0FURScsXG4gICAgICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgIHZhbHVlOiAnWE9BVVRIMidcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICB2YWx1ZTogJ2RYTmxjajExTVFGaGRYUm9QVUpsWVhKbGNpQmhZbU1CQVE9PScsXG4gICAgICAgICAgICBzZW5zaXRpdmU6IHRydWVcbiAgICAgICAgICB9XVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCcjdXBkYXRlSWQnLCAoKSA9PiB7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGJyLCAnZXhlYycpXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgbm90IG5vdGhpbmcgaWYgbm90IHN1cHBvcnRlZCcsICgpID0+IHtcbiAgICAgIGJyLl9jYXBhYmlsaXR5ID0gW11cblxuICAgICAgcmV0dXJuIGJyLnVwZGF0ZUlkKHtcbiAgICAgICAgYTogJ2InLFxuICAgICAgICBjOiAnZCdcbiAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICBleHBlY3QoYnIuc2VydmVySWQpLnRvLmJlLmZhbHNlXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHNlbmQgTklMJywgKCkgPT4ge1xuICAgICAgYnIuZXhlYy53aXRoQXJncyh7XG4gICAgICAgIGNvbW1hbmQ6ICdJRCcsXG4gICAgICAgIGF0dHJpYnV0ZXM6IFtcbiAgICAgICAgICBudWxsXG4gICAgICAgIF1cbiAgICAgIH0pLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgIElEOiBbe1xuICAgICAgICAgICAgYXR0cmlidXRlczogW1xuICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICBdXG4gICAgICAgICAgfV1cbiAgICAgICAgfVxuICAgICAgfSkpXG4gICAgICBici5fY2FwYWJpbGl0eSA9IFsnSUQnXVxuXG4gICAgICByZXR1cm4gYnIudXBkYXRlSWQobnVsbCkudGhlbigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChici5zZXJ2ZXJJZCkudG8uZGVlcC5lcXVhbCh7fSlcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgZXhoYW5nZSBJRCB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBici5leGVjLndpdGhBcmdzKHtcbiAgICAgICAgY29tbWFuZDogJ0lEJyxcbiAgICAgICAgYXR0cmlidXRlczogW1xuICAgICAgICAgIFsnY2tleTEnLCAnY3ZhbDEnLCAnY2tleTInLCAnY3ZhbDInXVxuICAgICAgICBdXG4gICAgICB9KS5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICBJRDogW3tcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IFtcbiAgICAgICAgICAgICAgW3tcbiAgICAgICAgICAgICAgICB2YWx1ZTogJ3NrZXkxJ1xuICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgdmFsdWU6ICdzdmFsMSdcbiAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIHZhbHVlOiAnc2tleTInXG4gICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogJ3N2YWwyJ1xuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH1dXG4gICAgICAgIH1cbiAgICAgIH0pKVxuICAgICAgYnIuX2NhcGFiaWxpdHkgPSBbJ0lEJ11cblxuICAgICAgcmV0dXJuIGJyLnVwZGF0ZUlkKHtcbiAgICAgICAgY2tleTE6ICdjdmFsMScsXG4gICAgICAgIGNrZXkyOiAnY3ZhbDInXG4gICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KGJyLnNlcnZlcklkKS50by5kZWVwLmVxdWFsKHtcbiAgICAgICAgICBza2V5MTogJ3N2YWwxJyxcbiAgICAgICAgICBza2V5MjogJ3N2YWwyJ1xuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCcjbGlzdE1haWxib3hlcycsICgpID0+IHtcbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIHNpbm9uLnN0dWIoYnIsICdleGVjJylcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBjYWxsIExJU1QgYW5kIExTVUIgaW4gc2VxdWVuY2UnLCAoKSA9PiB7XG4gICAgICBici5leGVjLndpdGhBcmdzKHtcbiAgICAgICAgY29tbWFuZDogJ0xJU1QnLFxuICAgICAgICBhdHRyaWJ1dGVzOiBbJycsICcqJ11cbiAgICAgIH0pLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgIExJU1Q6IFtmYWxzZV1cbiAgICAgICAgfVxuICAgICAgfSkpXG5cbiAgICAgIGJyLmV4ZWMud2l0aEFyZ3Moe1xuICAgICAgICBjb21tYW5kOiAnTFNVQicsXG4gICAgICAgIGF0dHJpYnV0ZXM6IFsnJywgJyonXVxuICAgICAgfSkucmV0dXJucyhQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgTFNVQjogW2ZhbHNlXVxuICAgICAgICB9XG4gICAgICB9KSlcblxuICAgICAgcmV0dXJuIGJyLmxpc3RNYWlsYm94ZXMoKS50aGVuKCh0cmVlKSA9PiB7XG4gICAgICAgIGV4cGVjdCh0cmVlKS50by5leGlzdFxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBub3QgZGllIG9uIE5JTCBzZXBhcmF0b3JzJywgKCkgPT4ge1xuICAgICAgYnIuZXhlYy53aXRoQXJncyh7XG4gICAgICAgIGNvbW1hbmQ6ICdMSVNUJyxcbiAgICAgICAgYXR0cmlidXRlczogWycnLCAnKiddXG4gICAgICB9KS5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICBMSVNUOiBbXG4gICAgICAgICAgICBwYXJzZXIodG9UeXBlZEFycmF5KCcqIExJU1QgKFxcXFxOb0luZmVyaW9ycykgTklMIFwiSU5CT1hcIicpKVxuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgfSkpXG5cbiAgICAgIGJyLmV4ZWMud2l0aEFyZ3Moe1xuICAgICAgICBjb21tYW5kOiAnTFNVQicsXG4gICAgICAgIGF0dHJpYnV0ZXM6IFsnJywgJyonXVxuICAgICAgfSkucmV0dXJucyhQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgTFNVQjogW1xuICAgICAgICAgICAgcGFyc2VyKHRvVHlwZWRBcnJheSgnKiBMU1VCIChcXFxcTm9JbmZlcmlvcnMpIE5JTCBcIklOQk9YXCInKSlcbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIH0pKVxuXG4gICAgICByZXR1cm4gYnIubGlzdE1haWxib3hlcygpLnRoZW4oKHRyZWUpID0+IHtcbiAgICAgICAgZXhwZWN0KHRyZWUpLnRvLmV4aXN0XG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJyNjcmVhdGVNYWlsYm94JywgKCkgPT4ge1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgc2lub24uc3R1YihiciwgJ2V4ZWMnKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIGNhbGwgQ1JFQVRFIHdpdGggYSBzdHJpbmcgcGF5bG9hZCcsICgpID0+IHtcbiAgICAgIC8vIFRoZSBzcGVjIGFsbG93cyB1bnF1b3RlZCBBVE9NLXN0eWxlIHN5bnRheCB0b28sIGJ1dCBmb3JcbiAgICAgIC8vIHNpbXBsaWNpdHkgd2UgYWx3YXlzIGdlbmVyYXRlIGEgc3RyaW5nIGV2ZW4gaWYgaXQgY291bGQgYmVcbiAgICAgIC8vIGV4cHJlc3NlZCBhcyBhbiBhdG9tLlxuICAgICAgYnIuZXhlYy53aXRoQXJncyh7XG4gICAgICAgIGNvbW1hbmQ6ICdDUkVBVEUnLFxuICAgICAgICBhdHRyaWJ1dGVzOiBbJ21haWxib3huYW1lJ11cbiAgICAgIH0pLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKCkpXG5cbiAgICAgIHJldHVybiBici5jcmVhdGVNYWlsYm94KCdtYWlsYm94bmFtZScpLnRoZW4oKCkgPT4ge1xuICAgICAgICBleHBlY3QoYnIuZXhlYy5jYWxsQ291bnQpLnRvLmVxdWFsKDEpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIGNhbGwgbXV0ZjcgZW5jb2RlIHRoZSBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIC8vIEZyb20gUkZDIDM1MDFcbiAgICAgIGJyLmV4ZWMud2l0aEFyZ3Moe1xuICAgICAgICBjb21tYW5kOiAnQ1JFQVRFJyxcbiAgICAgICAgYXR0cmlidXRlczogWyd+cGV0ZXIvbWFpbC8mVSxCVEZ3LS8mWmVWbkxJcWUtJ11cbiAgICAgIH0pLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKCkpXG5cbiAgICAgIHJldHVybiBici5jcmVhdGVNYWlsYm94KCd+cGV0ZXIvbWFpbC9cXHU1M2YwXFx1NTMxNy9cXHU2NWU1XFx1NjcyY1xcdThhOWUnKS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KGJyLmV4ZWMuY2FsbENvdW50KS50by5lcXVhbCgxKVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCB0cmVhdCBhbiBBTFJFQURZRVhJU1RTIHJlc3BvbnNlIGFzIHN1Y2Nlc3MnLCAoKSA9PiB7XG4gICAgICB2YXIgZmFrZUVyciA9IHtcbiAgICAgICAgY29kZTogJ0FMUkVBRFlFWElTVFMnXG4gICAgICB9XG4gICAgICBici5leGVjLndpdGhBcmdzKHtcbiAgICAgICAgY29tbWFuZDogJ0NSRUFURScsXG4gICAgICAgIGF0dHJpYnV0ZXM6IFsnbWFpbGJveG5hbWUnXVxuICAgICAgfSkucmV0dXJucyhQcm9taXNlLnJlamVjdChmYWtlRXJyKSlcblxuICAgICAgcmV0dXJuIGJyLmNyZWF0ZU1haWxib3goJ21haWxib3huYW1lJykudGhlbigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChici5leGVjLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgIH0pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnI2RlbGV0ZU1haWxib3gnLCAoKSA9PiB7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGJyLCAnZXhlYycpXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgY2FsbCBERUxFVEUgd2l0aCBhIHN0cmluZyBwYXlsb2FkJywgKCkgPT4ge1xuICAgICAgYnIuZXhlYy53aXRoQXJncyh7XG4gICAgICAgIGNvbW1hbmQ6ICdERUxFVEUnLFxuICAgICAgICBhdHRyaWJ1dGVzOiBbJ21haWxib3huYW1lJ11cbiAgICAgIH0pLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKCkpXG5cbiAgICAgIHJldHVybiBici5kZWxldGVNYWlsYm94KCdtYWlsYm94bmFtZScpLnRoZW4oKCkgPT4ge1xuICAgICAgICBleHBlY3QoYnIuZXhlYy5jYWxsQ291bnQpLnRvLmVxdWFsKDEpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIGNhbGwgbXV0ZjcgZW5jb2RlIHRoZSBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIC8vIEZyb20gUkZDIDM1MDFcbiAgICAgIGJyLmV4ZWMud2l0aEFyZ3Moe1xuICAgICAgICBjb21tYW5kOiAnREVMRVRFJyxcbiAgICAgICAgYXR0cmlidXRlczogWyd+cGV0ZXIvbWFpbC8mVSxCVEZ3LS8mWmVWbkxJcWUtJ11cbiAgICAgIH0pLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKCkpXG5cbiAgICAgIHJldHVybiBici5kZWxldGVNYWlsYm94KCd+cGV0ZXIvbWFpbC9cXHU1M2YwXFx1NTMxNy9cXHU2NWU1XFx1NjcyY1xcdThhOWUnKS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KGJyLmV4ZWMuY2FsbENvdW50KS50by5lcXVhbCgxKVxuICAgICAgfSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlLnNraXAoJyNsaXN0TWVzc2FnZXMnLCAoKSA9PiB7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGJyLCAnZXhlYycpXG4gICAgICBzaW5vbi5zdHViKGJyLCAnX2J1aWxkRkVUQ0hDb21tYW5kJylcbiAgICAgIHNpbm9uLnN0dWIoYnIsICdfcGFyc2VGRVRDSCcpXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgY2FsbCBGRVRDSCcsICgpID0+IHtcbiAgICAgIGJyLmV4ZWMucmV0dXJucyhQcm9taXNlLnJlc29sdmUoJ2FiYycpKVxuICAgICAgYnIuX2J1aWxkRkVUQ0hDb21tYW5kLndpdGhBcmdzKFsnMToyJywgWyd1aWQnLCAnZmxhZ3MnXSwge1xuICAgICAgICBieVVpZDogdHJ1ZVxuICAgICAgfV0pLnJldHVybnMoe30pXG5cbiAgICAgIHJldHVybiBici5saXN0TWVzc2FnZXMoJ0lOQk9YJywgJzE6MicsIFsndWlkJywgJ2ZsYWdzJ10sIHtcbiAgICAgICAgYnlVaWQ6IHRydWVcbiAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICBleHBlY3QoYnIuX2J1aWxkRkVUQ0hDb21tYW5kLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgICAgZXhwZWN0KGJyLl9wYXJzZUZFVENILndpdGhBcmdzKCdhYmMnKS5jYWxsQ291bnQpLnRvLmVxdWFsKDEpXG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUuc2tpcCgnI3NlYXJjaCcsICgpID0+IHtcbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIHNpbm9uLnN0dWIoYnIsICdleGVjJylcbiAgICAgIHNpbm9uLnN0dWIoYnIsICdfYnVpbGRTRUFSQ0hDb21tYW5kJylcbiAgICAgIHNpbm9uLnN0dWIoYnIsICdfcGFyc2VTRUFSQ0gnKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIGNhbGwgU0VBUkNIJywgKCkgPT4ge1xuICAgICAgYnIuZXhlYy5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSgnYWJjJykpXG4gICAgICBici5fYnVpbGRTRUFSQ0hDb21tYW5kLndpdGhBcmdzKHtcbiAgICAgICAgdWlkOiAxXG4gICAgICB9LCB7XG4gICAgICAgIGJ5VWlkOiB0cnVlXG4gICAgICB9KS5yZXR1cm5zKHt9KVxuXG4gICAgICByZXR1cm4gYnIuc2VhcmNoKCdJTkJPWCcsIHtcbiAgICAgICAgdWlkOiAxXG4gICAgICB9LCB7XG4gICAgICAgIGJ5VWlkOiB0cnVlXG4gICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KGJyLl9idWlsZFNFQVJDSENvbW1hbmQuY2FsbENvdW50KS50by5lcXVhbCgxKVxuICAgICAgICBleHBlY3QoYnIuZXhlYy5jYWxsQ291bnQpLnRvLmVxdWFsKDEpXG4gICAgICAgIGV4cGVjdChici5fcGFyc2VTRUFSQ0gud2l0aEFyZ3MoJ2FiYycpLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgIH0pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnI3VwbG9hZCcsICgpID0+IHtcbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIHNpbm9uLnN0dWIoYnIsICdleGVjJylcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBjYWxsIEFQUEVORCB3aXRoIGN1c3RvbSBmbGFnJywgKCkgPT4ge1xuICAgICAgYnIuZXhlYy5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSgpKVxuXG4gICAgICByZXR1cm4gYnIudXBsb2FkKCdtYWlsYm94JywgJ3RoaXMgaXMgYSBtZXNzYWdlJywge1xuICAgICAgICBmbGFnczogWydcXFxcJE15RmxhZyddXG4gICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KGJyLmV4ZWMuY2FsbENvdW50KS50by5lcXVhbCgxKVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBjYWxsIEFQUEVORCB3L28gZmxhZ3MnLCAoKSA9PiB7XG4gICAgICBici5leGVjLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKCkpXG5cbiAgICAgIHJldHVybiBici51cGxvYWQoJ21haWxib3gnLCAndGhpcyBpcyBhIG1lc3NhZ2UnKS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KGJyLmV4ZWMuY2FsbENvdW50KS50by5lcXVhbCgxKVxuICAgICAgfSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlLnNraXAoJyNzZXRGbGFncycsICgpID0+IHtcbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIHNpbm9uLnN0dWIoYnIsICdleGVjJylcbiAgICAgIHNpbm9uLnN0dWIoYnIsICdfYnVpbGRTVE9SRUNvbW1hbmQnKVxuICAgICAgc2lub24uc3R1YihiciwgJ19wYXJzZUZFVENIJylcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBjYWxsIFNUT1JFJywgKCkgPT4ge1xuICAgICAgYnIuZXhlYy5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSgnYWJjJykpXG4gICAgICBici5fYnVpbGRTVE9SRUNvbW1hbmQud2l0aEFyZ3MoJzE6MicsICdGTEFHUycsIFsnXFxcXFNlZW4nLCAnJE15RmxhZyddLCB7XG4gICAgICAgIGJ5VWlkOiB0cnVlXG4gICAgICB9KS5yZXR1cm5zKHt9KVxuXG4gICAgICByZXR1cm4gYnIuc2V0RmxhZ3MoJ0lOQk9YJywgJzE6MicsIFsnXFxcXFNlZW4nLCAnJE15RmxhZyddLCB7XG4gICAgICAgIGJ5VWlkOiB0cnVlXG4gICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KGJyLmV4ZWMuY2FsbENvdW50KS50by5lcXVhbCgxKVxuICAgICAgICBleHBlY3QoYnIuX3BhcnNlRkVUQ0gud2l0aEFyZ3MoJ2FiYycpLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgIH0pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZS5za2lwKCcjc3RvcmUnLCAoKSA9PiB7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGJyLCAnZXhlYycpXG4gICAgICBzaW5vbi5zdHViKGJyLCAnX2J1aWxkU1RPUkVDb21tYW5kJylcbiAgICAgIHNpbm9uLnN0dWIoYnIsICdfcGFyc2VGRVRDSCcpXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgY2FsbCBTVE9SRScsICgpID0+IHtcbiAgICAgIGJyLmV4ZWMucmV0dXJucyhQcm9taXNlLnJlc29sdmUoJ2FiYycpKVxuICAgICAgYnIuX2J1aWxkU1RPUkVDb21tYW5kLndpdGhBcmdzKCcxOjInLCAnK1gtR00tTEFCRUxTJywgWydcXFxcU2VudCcsICdcXFxcSnVuayddLCB7XG4gICAgICAgIGJ5VWlkOiB0cnVlXG4gICAgICB9KS5yZXR1cm5zKHt9KVxuXG4gICAgICByZXR1cm4gYnIuc3RvcmUoJ0lOQk9YJywgJzE6MicsICcrWC1HTS1MQUJFTFMnLCBbJ1xcXFxTZW50JywgJ1xcXFxKdW5rJ10sIHtcbiAgICAgICAgYnlVaWQ6IHRydWVcbiAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICBleHBlY3QoYnIuX2J1aWxkU1RPUkVDb21tYW5kLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgICAgZXhwZWN0KGJyLmV4ZWMuY2FsbENvdW50KS50by5lcXVhbCgxKVxuICAgICAgICBleHBlY3QoYnIuX3BhcnNlRkVUQ0gud2l0aEFyZ3MoJ2FiYycpLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgIH0pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnI2RlbGV0ZU1lc3NhZ2VzJywgKCkgPT4ge1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgc2lub24uc3R1YihiciwgJ3NldEZsYWdzJylcbiAgICAgIHNpbm9uLnN0dWIoYnIsICdleGVjJylcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBjYWxsIFVJRCBFWFBVTkdFJywgKCkgPT4ge1xuICAgICAgYnIuZXhlYy53aXRoQXJncyh7XG4gICAgICAgIGNvbW1hbmQ6ICdVSUQgRVhQVU5HRScsXG4gICAgICAgIGF0dHJpYnV0ZXM6IFt7XG4gICAgICAgICAgdHlwZTogJ3NlcXVlbmNlJyxcbiAgICAgICAgICB2YWx1ZTogJzE6MidcbiAgICAgICAgfV1cbiAgICAgIH0pLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKCdhYmMnKSlcbiAgICAgIGJyLnNldEZsYWdzLndpdGhBcmdzKCdJTkJPWCcsICcxOjInLCB7XG4gICAgICAgIGFkZDogJ1xcXFxEZWxldGVkJ1xuICAgICAgfSkucmV0dXJucyhQcm9taXNlLnJlc29sdmUoKSlcblxuICAgICAgYnIuX2NhcGFiaWxpdHkgPSBbJ1VJRFBMVVMnXVxuICAgICAgcmV0dXJuIGJyLmRlbGV0ZU1lc3NhZ2VzKCdJTkJPWCcsICcxOjInLCB7XG4gICAgICAgIGJ5VWlkOiB0cnVlXG4gICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KGJyLmV4ZWMuY2FsbENvdW50KS50by5lcXVhbCgxKVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBjYWxsIEVYUFVOR0UnLCAoKSA9PiB7XG4gICAgICBici5leGVjLndpdGhBcmdzKCdFWFBVTkdFJykucmV0dXJucyhQcm9taXNlLnJlc29sdmUoJ2FiYycpKVxuICAgICAgYnIuc2V0RmxhZ3Mud2l0aEFyZ3MoJ0lOQk9YJywgJzE6MicsIHtcbiAgICAgICAgYWRkOiAnXFxcXERlbGV0ZWQnXG4gICAgICB9KS5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSgpKVxuXG4gICAgICBici5fY2FwYWJpbGl0eSA9IFtdXG4gICAgICByZXR1cm4gYnIuZGVsZXRlTWVzc2FnZXMoJ0lOQk9YJywgJzE6MicsIHtcbiAgICAgICAgYnlVaWQ6IHRydWVcbiAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICBleHBlY3QoYnIuZXhlYy5jYWxsQ291bnQpLnRvLmVxdWFsKDEpXG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJyNjb3B5TWVzc2FnZXMnLCAoKSA9PiB7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGJyLCAnZXhlYycpXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgY2FsbCBDT1BZJywgKCkgPT4ge1xuICAgICAgYnIuZXhlYy53aXRoQXJncyh7XG4gICAgICAgIGNvbW1hbmQ6ICdVSUQgQ09QWScsXG4gICAgICAgIGF0dHJpYnV0ZXM6IFt7XG4gICAgICAgICAgdHlwZTogJ3NlcXVlbmNlJyxcbiAgICAgICAgICB2YWx1ZTogJzE6MidcbiAgICAgICAgfSwge1xuICAgICAgICAgIHR5cGU6ICdhdG9tJyxcbiAgICAgICAgICB2YWx1ZTogJ1tHbWFpbF0vVHJhc2gnXG4gICAgICAgIH1dXG4gICAgICB9KS5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgIGNvcHl1aWQ6IFsnMScsICcxOjInLCAnNCwzJ11cbiAgICAgIH0pKVxuXG4gICAgICByZXR1cm4gYnIuY29weU1lc3NhZ2VzKCdJTkJPWCcsICcxOjInLCAnW0dtYWlsXS9UcmFzaCcsIHtcbiAgICAgICAgYnlVaWQ6IHRydWVcbiAgICAgIH0pLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGV4cGVjdChyZXNwb25zZSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICAgICAgc3JjU2VxU2V0OiAnMToyJyxcbiAgICAgICAgICBkZXN0U2VxU2V0OiAnNCwzJ1xuICAgICAgICB9KVxuICAgICAgICBleHBlY3QoYnIuZXhlYy5jYWxsQ291bnQpLnRvLmVxdWFsKDEpXG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJyNtb3ZlTWVzc2FnZXMnLCAoKSA9PiB7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGJyLCAnZXhlYycpXG4gICAgICBzaW5vbi5zdHViKGJyLCAnY29weU1lc3NhZ2VzJylcbiAgICAgIHNpbm9uLnN0dWIoYnIsICdkZWxldGVNZXNzYWdlcycpXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgY2FsbCBNT1ZFIGlmIHN1cHBvcnRlZCcsICgpID0+IHtcbiAgICAgIGJyLmV4ZWMud2l0aEFyZ3Moe1xuICAgICAgICBjb21tYW5kOiAnVUlEIE1PVkUnLFxuICAgICAgICBhdHRyaWJ1dGVzOiBbe1xuICAgICAgICAgIHR5cGU6ICdzZXF1ZW5jZScsXG4gICAgICAgICAgdmFsdWU6ICcxOjInXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB0eXBlOiAnYXRvbScsXG4gICAgICAgICAgdmFsdWU6ICdbR21haWxdL1RyYXNoJ1xuICAgICAgICB9XVxuICAgICAgfSwgWydPSyddKS5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSgnYWJjJykpXG5cbiAgICAgIGJyLl9jYXBhYmlsaXR5ID0gWydNT1ZFJ11cbiAgICAgIHJldHVybiBici5tb3ZlTWVzc2FnZXMoJ0lOQk9YJywgJzE6MicsICdbR21haWxdL1RyYXNoJywge1xuICAgICAgICBieVVpZDogdHJ1ZVxuICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChici5leGVjLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgZmFsbGJhY2sgdG8gY29weStleHB1bmdlJywgKCkgPT4ge1xuICAgICAgYnIuY29weU1lc3NhZ2VzLndpdGhBcmdzKCdJTkJPWCcsICcxOjInLCAnW0dtYWlsXS9UcmFzaCcsIHtcbiAgICAgICAgYnlVaWQ6IHRydWVcbiAgICAgIH0pLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKCkpXG4gICAgICBici5kZWxldGVNZXNzYWdlcy53aXRoQXJncygnMToyJywge1xuICAgICAgICBieVVpZDogdHJ1ZVxuICAgICAgfSkucmV0dXJucyhQcm9taXNlLnJlc29sdmUoKSlcblxuICAgICAgYnIuX2NhcGFiaWxpdHkgPSBbXVxuICAgICAgcmV0dXJuIGJyLm1vdmVNZXNzYWdlcygnSU5CT1gnLCAnMToyJywgJ1tHbWFpbF0vVHJhc2gnLCB7XG4gICAgICAgIGJ5VWlkOiB0cnVlXG4gICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KGJyLmRlbGV0ZU1lc3NhZ2VzLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgIH0pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnI19zaG91bGRTZWxlY3RNYWlsYm94JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBjdHggaXMgdW5kZWZpbmVkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGJyLl9zaG91bGRTZWxlY3RNYWlsYm94KCdwYXRoJykpLnRvLmJlLnRydWVcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIGEgZGlmZmVyZW50IHBhdGggaXMgcXVldWVkJywgKCkgPT4ge1xuICAgICAgc2lub24uc3R1Yihici5jbGllbnQsICdnZXRQcmV2aW91c2x5UXVldWVkJykucmV0dXJucyh7XG4gICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICBjb21tYW5kOiAnU0VMRUNUJyxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBbe1xuICAgICAgICAgICAgdHlwZTogJ1NUUklORycsXG4gICAgICAgICAgICB2YWx1ZTogJ3F1ZXVlZCBwYXRoJ1xuICAgICAgICAgIH1dXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIGV4cGVjdChici5fc2hvdWxkU2VsZWN0TWFpbGJveCgncGF0aCcsIHt9KSkudG8uYmUudHJ1ZVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIHRoZSBzYW1lIHBhdGggaXMgcXVldWVkJywgKCkgPT4ge1xuICAgICAgc2lub24uc3R1Yihici5jbGllbnQsICdnZXRQcmV2aW91c2x5UXVldWVkJykucmV0dXJucyh7XG4gICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICBjb21tYW5kOiAnU0VMRUNUJyxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBbe1xuICAgICAgICAgICAgdHlwZTogJ1NUUklORycsXG4gICAgICAgICAgICB2YWx1ZTogJ3F1ZXVlZCBwYXRoJ1xuICAgICAgICAgIH1dXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIGV4cGVjdChici5fc2hvdWxkU2VsZWN0TWFpbGJveCgncXVldWVkIHBhdGgnLCB7fSkpLnRvLmJlLmZhbHNlXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnI3NlbGVjdE1haWxib3gnLCAoKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9ICdbR21haWxdL1RyYXNoJ1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgc2lub24uc3R1YihiciwgJ2V4ZWMnKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHJ1biBTRUxFQ1QnLCAoKSA9PiB7XG4gICAgICBici5leGVjLndpdGhBcmdzKHtcbiAgICAgICAgY29tbWFuZDogJ1NFTEVDVCcsXG4gICAgICAgIGF0dHJpYnV0ZXM6IFt7XG4gICAgICAgICAgdHlwZTogJ1NUUklORycsXG4gICAgICAgICAgdmFsdWU6IHBhdGhcbiAgICAgICAgfV1cbiAgICAgIH0pLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgY29kZTogJ1JFQUQtV1JJVEUnXG4gICAgICB9KSlcblxuICAgICAgcmV0dXJuIGJyLnNlbGVjdE1haWxib3gocGF0aCkudGhlbigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChici5leGVjLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgICAgZXhwZWN0KGJyLl9zdGF0ZSkudG8uZXF1YWwoU1RBVEVfU0VMRUNURUQpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHJ1biBTRUxFQ1Qgd2l0aCBDT05EU1RPUkUnLCAoKSA9PiB7XG4gICAgICBici5leGVjLndpdGhBcmdzKHtcbiAgICAgICAgY29tbWFuZDogJ1NFTEVDVCcsXG4gICAgICAgIGF0dHJpYnV0ZXM6IFt7XG4gICAgICAgICAgdHlwZTogJ1NUUklORycsXG4gICAgICAgICAgdmFsdWU6IHBhdGhcbiAgICAgICAgfSxcbiAgICAgICAgW3tcbiAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgdmFsdWU6ICdDT05EU1RPUkUnXG4gICAgICAgIH1dXG4gICAgICAgIF1cbiAgICAgIH0pLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgY29kZTogJ1JFQUQtV1JJVEUnXG4gICAgICB9KSlcblxuICAgICAgYnIuX2NhcGFiaWxpdHkgPSBbJ0NPTkRTVE9SRSddXG4gICAgICByZXR1cm4gYnIuc2VsZWN0TWFpbGJveChwYXRoLCB7XG4gICAgICAgIGNvbmRzdG9yZTogdHJ1ZVxuICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChici5leGVjLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgICAgZXhwZWN0KGJyLl9zdGF0ZSkudG8uZXF1YWwoU1RBVEVfU0VMRUNURUQpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnc2hvdWxkIGVtaXQgb25zZWxlY3RtYWlsYm94IGJlZm9yZSBzZWxlY3RNYWlsYm94IGlzIHJlc29sdmVkJywgKCkgPT4ge1xuICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIGJyLmV4ZWMucmV0dXJucyhQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgIGNvZGU6ICdSRUFELVdSSVRFJ1xuICAgICAgICB9KSlcbiAgICAgIH0pXG5cbiAgICAgIGl0KCd3aGVuIGl0IHJldHVybnMgYSBwcm9taXNlJywgKCkgPT4ge1xuICAgICAgICB2YXIgcHJvbWlzZVJlc29sdmVkID0gZmFsc2VcbiAgICAgICAgYnIub25zZWxlY3RtYWlsYm94ID0gKCkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICByZXNvbHZlKClcbiAgICAgICAgICBwcm9taXNlUmVzb2x2ZWQgPSB0cnVlXG4gICAgICAgIH0pXG4gICAgICAgIHZhciBvbnNlbGVjdG1haWxib3hTcHkgPSBzaW5vbi5zcHkoYnIsICdvbnNlbGVjdG1haWxib3gnKVxuICAgICAgICByZXR1cm4gYnIuc2VsZWN0TWFpbGJveChwYXRoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICBleHBlY3Qob25zZWxlY3RtYWlsYm94U3B5LndpdGhBcmdzKHBhdGgpLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgICAgICBleHBlY3QocHJvbWlzZVJlc29sdmVkKS50by5lcXVhbCh0cnVlKVxuICAgICAgICB9KVxuICAgICAgfSlcblxuICAgICAgaXQoJ3doZW4gaXQgZG9lcyBub3QgcmV0dXJuIGEgcHJvbWlzZScsICgpID0+IHtcbiAgICAgICAgYnIub25zZWxlY3RtYWlsYm94ID0gKCkgPT4geyB9XG4gICAgICAgIHZhciBvbnNlbGVjdG1haWxib3hTcHkgPSBzaW5vbi5zcHkoYnIsICdvbnNlbGVjdG1haWxib3gnKVxuICAgICAgICByZXR1cm4gYnIuc2VsZWN0TWFpbGJveChwYXRoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICBleHBlY3Qob25zZWxlY3RtYWlsYm94U3B5LndpdGhBcmdzKHBhdGgpLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgZW1pdCBvbmNsb3NlbWFpbGJveCcsICgpID0+IHtcbiAgICAgIGxldCBjYWxsZWQgPSBmYWxzZVxuICAgICAgYnIuZXhlYy5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSgnYWJjJykpLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgY29kZTogJ1JFQUQtV1JJVEUnXG4gICAgICB9KSlcblxuICAgICAgYnIub25jbG9zZW1haWxib3ggPSAocGF0aCkgPT4ge1xuICAgICAgICBleHBlY3QocGF0aCkudG8uZXF1YWwoJ3l5eScpXG4gICAgICAgIGNhbGxlZCA9IHRydWVcbiAgICAgIH1cblxuICAgICAgYnIuX3NlbGVjdGVkTWFpbGJveCA9ICd5eXknXG4gICAgICByZXR1cm4gYnIuc2VsZWN0TWFpbGJveChwYXRoKS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KGNhbGxlZCkudG8uYmUudHJ1ZVxuICAgICAgfSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCcjaGFzQ2FwYWJpbGl0eScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGRldGVjdCBleGlzdGluZyBjYXBhYmlsaXR5JywgKCkgPT4ge1xuICAgICAgYnIuX2NhcGFiaWxpdHkgPSBbJ1paWiddXG4gICAgICBleHBlY3QoYnIuaGFzQ2FwYWJpbGl0eSgnenp6JykpLnRvLmJlLnRydWVcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBkZXRlY3Qgbm9uIGV4aXN0aW5nIGNhcGFiaWxpdHknLCAoKSA9PiB7XG4gICAgICBici5fY2FwYWJpbGl0eSA9IFsnWlpaJ11cbiAgICAgIGV4cGVjdChici5oYXNDYXBhYmlsaXR5KCdvb28nKSkudG8uYmUuZmFsc2VcbiAgICAgIGV4cGVjdChici5oYXNDYXBhYmlsaXR5KCkpLnRvLmJlLmZhbHNlXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnI191bnRhZ2dlZE9rSGFuZGxlcicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHVwZGF0ZSBjYXBhYmlsaXR5IGlmIHByZXNlbnQnLCAoKSA9PiB7XG4gICAgICBici5fdW50YWdnZWRPa0hhbmRsZXIoe1xuICAgICAgICBjYXBhYmlsaXR5OiBbJ2FiYyddXG4gICAgICB9LCAoKSA9PiB7IH0pXG4gICAgICBleHBlY3QoYnIuX2NhcGFiaWxpdHkpLnRvLmRlZXAuZXF1YWwoWydhYmMnXSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCcjX3VudGFnZ2VkQ2FwYWJpbGl0eUhhbmRsZXInLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB1cGRhdGUgY2FwYWJpbGl0eScsICgpID0+IHtcbiAgICAgIGJyLl91bnRhZ2dlZENhcGFiaWxpdHlIYW5kbGVyKHtcbiAgICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgICB2YWx1ZTogJ2FiYydcbiAgICAgICAgfV1cbiAgICAgIH0sICgpID0+IHsgfSlcbiAgICAgIGV4cGVjdChici5fY2FwYWJpbGl0eSkudG8uZGVlcC5lcXVhbChbJ0FCQyddKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJyNfdW50YWdnZWRFeGlzdHNIYW5kbGVyJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZW1pdCBvbnVwZGF0ZScsICgpID0+IHtcbiAgICAgIGJyLm9udXBkYXRlID0gc2lub24uc3R1YigpXG4gICAgICBici5fc2VsZWN0ZWRNYWlsYm94ID0gJ0ZPTydcblxuICAgICAgYnIuX3VudGFnZ2VkRXhpc3RzSGFuZGxlcih7XG4gICAgICAgIG5yOiAxMjNcbiAgICAgIH0sICgpID0+IHsgfSlcbiAgICAgIGV4cGVjdChici5vbnVwZGF0ZS53aXRoQXJncygnRk9PJywgJ2V4aXN0cycsIDEyMykuY2FsbENvdW50KS50by5lcXVhbCgxKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJyNfdW50YWdnZWRFeHB1bmdlSGFuZGxlcicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGVtaXQgb251cGRhdGUnLCAoKSA9PiB7XG4gICAgICBici5vbnVwZGF0ZSA9IHNpbm9uLnN0dWIoKVxuICAgICAgYnIuX3NlbGVjdGVkTWFpbGJveCA9ICdGT08nXG5cbiAgICAgIGJyLl91bnRhZ2dlZEV4cHVuZ2VIYW5kbGVyKHtcbiAgICAgICAgbnI6IDEyM1xuICAgICAgfSwgKCkgPT4geyB9KVxuICAgICAgZXhwZWN0KGJyLm9udXBkYXRlLndpdGhBcmdzKCdGT08nLCAnZXhwdW5nZScsIDEyMykuY2FsbENvdW50KS50by5lcXVhbCgxKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUuc2tpcCgnI191bnRhZ2dlZEZldGNoSGFuZGxlcicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGVtaXQgb251cGRhdGUnLCAoKSA9PiB7XG4gICAgICBici5vbnVwZGF0ZSA9IHNpbm9uLnN0dWIoKVxuICAgICAgc2lub24uc3R1YihiciwgJ19wYXJzZUZFVENIJykucmV0dXJucygnYWJjJylcbiAgICAgIGJyLl9zZWxlY3RlZE1haWxib3ggPSAnRk9PJ1xuXG4gICAgICBici5fdW50YWdnZWRGZXRjaEhhbmRsZXIoe1xuICAgICAgICBucjogMTIzXG4gICAgICB9LCAoKSA9PiB7IH0pXG4gICAgICBleHBlY3QoYnIub251cGRhdGUud2l0aEFyZ3MoJ0ZPTycsICdmZXRjaCcsICdhYmMnKS5jYWxsQ291bnQpLnRvLmVxdWFsKDEpXG4gICAgICBleHBlY3QoYnIuX3BhcnNlRkVUQ0guYXJnc1swXVswXSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICBGRVRDSDogW3tcbiAgICAgICAgICAgIG5yOiAxMjNcbiAgICAgICAgICB9XVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJyNfY2hhbmdlU3RhdGUnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzZXQgdGhlIHN0YXRlIHZhbHVlJywgKCkgPT4ge1xuICAgICAgYnIuX2NoYW5nZVN0YXRlKDEyMzQ1KVxuXG4gICAgICBleHBlY3QoYnIuX3N0YXRlKS50by5lcXVhbCgxMjM0NSlcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBlbWl0IG9uY2xvc2VtYWlsYm94IGlmIG1haWxib3ggd2FzIGNsb3NlZCcsICgpID0+IHtcbiAgICAgIGJyLm9uY2xvc2VtYWlsYm94ID0gc2lub24uc3R1YigpXG4gICAgICBici5fc3RhdGUgPSBTVEFURV9TRUxFQ1RFRFxuICAgICAgYnIuX3NlbGVjdGVkTWFpbGJveCA9ICdhYWEnXG5cbiAgICAgIGJyLl9jaGFuZ2VTdGF0ZSgxMjM0NSlcblxuICAgICAgZXhwZWN0KGJyLl9zZWxlY3RlZE1haWxib3gpLnRvLmJlLmZhbHNlXG4gICAgICBleHBlY3QoYnIub25jbG9zZW1haWxib3gud2l0aEFyZ3MoJ2FhYScpLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCcjX2Vuc3VyZVBhdGgnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBjcmVhdGUgdGhlIHBhdGggaWYgbm90IHByZXNlbnQnLCAoKSA9PiB7XG4gICAgICB2YXIgdHJlZSA9IHtcbiAgICAgICAgY2hpbGRyZW46IFtdXG4gICAgICB9XG4gICAgICBleHBlY3QoYnIuX2Vuc3VyZVBhdGgodHJlZSwgJ2hlbGxvL3dvcmxkJywgJy8nKSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICAgIG5hbWU6ICd3b3JsZCcsXG4gICAgICAgIGRlbGltaXRlcjogJy8nLFxuICAgICAgICBwYXRoOiAnaGVsbG8vd29ybGQnLFxuICAgICAgICBjaGlsZHJlbjogW11cbiAgICAgIH0pXG4gICAgICBleHBlY3QodHJlZSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICAgIGNoaWxkcmVuOiBbe1xuICAgICAgICAgIG5hbWU6ICdoZWxsbycsXG4gICAgICAgICAgZGVsaW1pdGVyOiAnLycsXG4gICAgICAgICAgcGF0aDogJ2hlbGxvJyxcbiAgICAgICAgICBjaGlsZHJlbjogW3tcbiAgICAgICAgICAgIG5hbWU6ICd3b3JsZCcsXG4gICAgICAgICAgICBkZWxpbWl0ZXI6ICcvJyxcbiAgICAgICAgICAgIHBhdGg6ICdoZWxsby93b3JsZCcsXG4gICAgICAgICAgICBjaGlsZHJlbjogW11cbiAgICAgICAgICB9XVxuICAgICAgICB9XVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZXhpc3RpbmcgcGF0aCBpZiBwb3NzaWJsZScsICgpID0+IHtcbiAgICAgIHZhciB0cmVlID0ge1xuICAgICAgICBjaGlsZHJlbjogW3tcbiAgICAgICAgICBuYW1lOiAnaGVsbG8nLFxuICAgICAgICAgIGRlbGltaXRlcjogJy8nLFxuICAgICAgICAgIHBhdGg6ICdoZWxsbycsXG4gICAgICAgICAgY2hpbGRyZW46IFt7XG4gICAgICAgICAgICBuYW1lOiAnd29ybGQnLFxuICAgICAgICAgICAgZGVsaW1pdGVyOiAnLycsXG4gICAgICAgICAgICBwYXRoOiAnaGVsbG8vd29ybGQnLFxuICAgICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgYWJjOiAxMjNcbiAgICAgICAgICB9XVxuICAgICAgICB9XVxuICAgICAgfVxuICAgICAgZXhwZWN0KGJyLl9lbnN1cmVQYXRoKHRyZWUsICdoZWxsby93b3JsZCcsICcvJykpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgICBuYW1lOiAnd29ybGQnLFxuICAgICAgICBkZWxpbWl0ZXI6ICcvJyxcbiAgICAgICAgcGF0aDogJ2hlbGxvL3dvcmxkJyxcbiAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICBhYmM6IDEyM1xuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgY2FzZSBpbnNlbnNpdGl2ZSBJbmJveCcsICgpID0+IHtcbiAgICAgIHZhciB0cmVlID0ge1xuICAgICAgICBjaGlsZHJlbjogW11cbiAgICAgIH1cbiAgICAgIGV4cGVjdChici5fZW5zdXJlUGF0aCh0cmVlLCAnSW5ib3gvd29ybGQnLCAnLycpKS50by5kZWVwLmVxdWFsKHtcbiAgICAgICAgbmFtZTogJ3dvcmxkJyxcbiAgICAgICAgZGVsaW1pdGVyOiAnLycsXG4gICAgICAgIHBhdGg6ICdJbmJveC93b3JsZCcsXG4gICAgICAgIGNoaWxkcmVuOiBbXVxuICAgICAgfSlcbiAgICAgIGV4cGVjdChici5fZW5zdXJlUGF0aCh0cmVlLCAnSU5CT1gvd29ybGRzJywgJy8nKSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICAgIG5hbWU6ICd3b3JsZHMnLFxuICAgICAgICBkZWxpbWl0ZXI6ICcvJyxcbiAgICAgICAgcGF0aDogJ0lOQk9YL3dvcmxkcycsXG4gICAgICAgIGNoaWxkcmVuOiBbXVxuICAgICAgfSlcblxuICAgICAgZXhwZWN0KHRyZWUpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgICBjaGlsZHJlbjogW3tcbiAgICAgICAgICBuYW1lOiAnSW5ib3gnLFxuICAgICAgICAgIGRlbGltaXRlcjogJy8nLFxuICAgICAgICAgIHBhdGg6ICdJbmJveCcsXG4gICAgICAgICAgY2hpbGRyZW46IFt7XG4gICAgICAgICAgICBuYW1lOiAnd29ybGQnLFxuICAgICAgICAgICAgZGVsaW1pdGVyOiAnLycsXG4gICAgICAgICAgICBwYXRoOiAnSW5ib3gvd29ybGQnLFxuICAgICAgICAgICAgY2hpbGRyZW46IFtdXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgbmFtZTogJ3dvcmxkcycsXG4gICAgICAgICAgICBkZWxpbWl0ZXI6ICcvJyxcbiAgICAgICAgICAgIHBhdGg6ICdJTkJPWC93b3JsZHMnLFxuICAgICAgICAgICAgY2hpbGRyZW46IFtdXG4gICAgICAgICAgfV1cbiAgICAgICAgfV1cbiAgICAgIH0pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgndW50YWdnZWQgdXBkYXRlcycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJlY2VpdmUgaW5mb3JtYXRpb24gYWJvdXQgdW50YWdnZWQgZXhpc3RzJywgKGRvbmUpID0+IHtcbiAgICAgIGJyLmNsaWVudC5fY29ubmVjdGlvblJlYWR5ID0gdHJ1ZVxuICAgICAgYnIuX3NlbGVjdGVkTWFpbGJveCA9ICdGT08nXG4gICAgICBici5vbnVwZGF0ZSA9IChwYXRoLCB0eXBlLCB2YWx1ZSkgPT4ge1xuICAgICAgICBleHBlY3QocGF0aCkudG8uZXF1YWwoJ0ZPTycpXG4gICAgICAgIGV4cGVjdCh0eXBlKS50by5lcXVhbCgnZXhpc3RzJylcbiAgICAgICAgZXhwZWN0KHZhbHVlKS50by5lcXVhbCgxMjMpXG4gICAgICAgIGRvbmUoKVxuICAgICAgfVxuICAgICAgYnIuY2xpZW50Ll9vbkRhdGEoe1xuICAgICAgICAvKiAqIDEyMyBFWElTVFNcXHJcXG4gKi9cbiAgICAgICAgZGF0YTogbmV3IFVpbnQ4QXJyYXkoWzQyLCAzMiwgNDksIDUwLCA1MSwgMzIsIDY5LCA4OCwgNzMsIDgzLCA4NCwgODMsIDEzLCAxMF0pLmJ1ZmZlclxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCByZWNlaXZlIGluZm9ybWF0aW9uIGFib3V0IHVudGFnZ2VkIGV4cHVuZ2UnLCAoZG9uZSkgPT4ge1xuICAgICAgYnIuY2xpZW50Ll9jb25uZWN0aW9uUmVhZHkgPSB0cnVlXG4gICAgICBici5fc2VsZWN0ZWRNYWlsYm94ID0gJ0ZPTydcbiAgICAgIGJyLm9udXBkYXRlID0gKHBhdGgsIHR5cGUsIHZhbHVlKSA9PiB7XG4gICAgICAgIGV4cGVjdChwYXRoKS50by5lcXVhbCgnRk9PJylcbiAgICAgICAgZXhwZWN0KHR5cGUpLnRvLmVxdWFsKCdleHB1bmdlJylcbiAgICAgICAgZXhwZWN0KHZhbHVlKS50by5lcXVhbCg0NTYpXG4gICAgICAgIGRvbmUoKVxuICAgICAgfVxuICAgICAgYnIuY2xpZW50Ll9vbkRhdGEoe1xuICAgICAgICAvKiAqIDQ1NiBFWFBVTkdFXFxyXFxuICovXG4gICAgICAgIGRhdGE6IG5ldyBVaW50OEFycmF5KFs0MiwgMzIsIDUyLCA1MywgNTQsIDMyLCA2OSwgODgsIDgwLCA4NSwgNzgsIDcxLCA2OSwgMTMsIDEwXSkuYnVmZmVyXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHJlY2VpdmUgaW5mb3JtYXRpb24gYWJvdXQgdW50YWdnZWQgZmV0Y2gnLCAoZG9uZSkgPT4ge1xuICAgICAgYnIuY2xpZW50Ll9jb25uZWN0aW9uUmVhZHkgPSB0cnVlXG4gICAgICBici5fc2VsZWN0ZWRNYWlsYm94ID0gJ0ZPTydcbiAgICAgIGJyLm9udXBkYXRlID0gKHBhdGgsIHR5cGUsIHZhbHVlKSA9PiB7XG4gICAgICAgIGV4cGVjdChwYXRoKS50by5lcXVhbCgnRk9PJylcbiAgICAgICAgZXhwZWN0KHR5cGUpLnRvLmVxdWFsKCdmZXRjaCcpXG4gICAgICAgIGV4cGVjdCh2YWx1ZSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICAgICAgJyMnOiAxMjMsXG4gICAgICAgICAgZmxhZ3M6IFsnXFxcXFNlZW4nXSxcbiAgICAgICAgICBtb2RzZXE6ICc0J1xuICAgICAgICB9KVxuICAgICAgICBkb25lKClcbiAgICAgIH1cbiAgICAgIGJyLmNsaWVudC5fb25EYXRhKHtcbiAgICAgICAgLyogKiAxMjMgRkVUQ0ggKEZMQUdTIChcXFxcU2VlbikgTU9EU0VRICg0KSlcXHJcXG4gKi9cbiAgICAgICAgZGF0YTogbmV3IFVpbnQ4QXJyYXkoWzQyLCAzMiwgNDksIDUwLCA1MSwgMzIsIDcwLCA2OSwgODQsIDY3LCA3MiwgMzIsIDQwLCA3MCwgNzYsIDY1LCA3MSwgODMsIDMyLCA0MCwgOTIsIDgzLCAxMDEsIDEwMSwgMTEwLCA0MSwgMzIsIDc3LCA3OSwgNjgsIDgzLCA2OSwgODEsIDMyLCA0MCwgNTIsIDQxLCA0MSwgMTMsIDEwXSkuYnVmZmVyXG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG59KVxuIl19 \ No newline at end of file diff --git a/dist/client.js b/dist/client.js new file mode 100644 index 00000000..4fdb8f09 --- /dev/null +++ b/dist/client.js @@ -0,0 +1,1233 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = exports.DEFAULT_CLIENT_ID = exports.STATE_LOGOUT = exports.STATE_SELECTED = exports.STATE_AUTHENTICATED = exports.STATE_NOT_AUTHENTICATED = exports.STATE_CONNECTING = exports.TIMEOUT_IDLE = exports.TIMEOUT_NOOP = exports.TIMEOUT_CONNECTION = void 0; + +var _ramda = require("ramda"); + +var _emailjsUtf = require("emailjs-utf7"); + +var _commandParser = require("./command-parser"); + +var _commandBuilder = require("./command-builder"); + +var _logger = _interopRequireDefault(require("./logger")); + +var _imap = _interopRequireDefault(require("./imap")); + +var _common = require("./common"); + +var _specialUse = require("./special-use"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + +const TIMEOUT_CONNECTION = 90 * 1000; // Milliseconds to wait for the IMAP greeting from the server + +exports.TIMEOUT_CONNECTION = TIMEOUT_CONNECTION; +const TIMEOUT_NOOP = 60 * 1000; // Milliseconds between NOOP commands while idling + +exports.TIMEOUT_NOOP = TIMEOUT_NOOP; +const TIMEOUT_IDLE = 60 * 1000; // Milliseconds until IDLE command is cancelled + +exports.TIMEOUT_IDLE = TIMEOUT_IDLE; +const STATE_CONNECTING = 1; +exports.STATE_CONNECTING = STATE_CONNECTING; +const STATE_NOT_AUTHENTICATED = 2; +exports.STATE_NOT_AUTHENTICATED = STATE_NOT_AUTHENTICATED; +const STATE_AUTHENTICATED = 3; +exports.STATE_AUTHENTICATED = STATE_AUTHENTICATED; +const STATE_SELECTED = 4; +exports.STATE_SELECTED = STATE_SELECTED; +const STATE_LOGOUT = 5; +exports.STATE_LOGOUT = STATE_LOGOUT; +const DEFAULT_CLIENT_ID = { + name: 'emailjs-imap-client' +}; +/** + * emailjs IMAP client + * + * @constructor + * + * @param {String} [host='localhost'] Hostname to conenct to + * @param {Number} [port=143] Port number to connect to + * @param {Object} [options] Optional options object + */ + +exports.DEFAULT_CLIENT_ID = DEFAULT_CLIENT_ID; + +class Client { + constructor(host, port, options = {}) { + this.timeoutConnection = TIMEOUT_CONNECTION; + this.timeoutNoop = TIMEOUT_NOOP; + this.timeoutIdle = TIMEOUT_IDLE; + this.serverId = false; // RFC 2971 Server ID as key value pairs + // Event placeholders + + this.oncert = null; + this.onupdate = null; + this.onselectmailbox = null; + this.onclosemailbox = null; + this._host = host; + this._clientId = (0, _ramda.propOr)(DEFAULT_CLIENT_ID, 'id', options); + this._state = false; // Current state + + this._authenticated = false; // Is the connection authenticated + + this._capability = []; // List of extensions the server supports + + this._selectedMailbox = false; // Selected mailbox + + this._enteredIdle = false; + this._idleTimeout = false; + this._enableCompression = !!options.enableCompression; + this._auth = options.auth; + this._requireTLS = !!options.requireTLS; + this._ignoreTLS = !!options.ignoreTLS; + this.client = new _imap.default(host, port, options); // IMAP client object + // Event Handlers + + this.client.onerror = this._onError.bind(this); + + this.client.oncert = cert => this.oncert && this.oncert(cert); // allows certificate handling for platforms w/o native tls support + + + this.client.onidle = () => this._onIdle(); // start idling + // Default handlers for untagged responses + + + this.client.setHandler('capability', response => this._untaggedCapabilityHandler(response)); // capability updates + + this.client.setHandler('ok', response => this._untaggedOkHandler(response)); // notifications + + this.client.setHandler('exists', response => this._untaggedExistsHandler(response)); // message count has changed + + this.client.setHandler('expunge', response => this._untaggedExpungeHandler(response)); // message has been deleted + + this.client.setHandler('fetch', response => this._untaggedFetchHandler(response)); // message has been updated (eg. flag change) + // Activate logging + + this.createLogger(); + this.logLevel = (0, _ramda.propOr)(_common.LOG_LEVEL_ALL, 'logLevel', options); + } + /** + * Called if the lower-level ImapClient has encountered an unrecoverable + * error during operation. Cleans up and propagates the error upwards. + */ + + + _onError(err) { + // make sure no idle timeout is pending anymore + clearTimeout(this._idleTimeout); // propagate the error upwards + + this.onerror && this.onerror(err); + } // + // + // PUBLIC API + // + // + + /** + * Initiate connection and login to the IMAP server + * + * @returns {Promise} Promise when login procedure is complete + */ + + + connect() { + var _this = this; + + return _asyncToGenerator(function* () { + try { + yield _this.openConnection(); + yield _this.upgradeConnection(); + + try { + yield _this.updateId(_this._clientId); + } catch (err) { + _this.logger.warn('Failed to update server id!', err.message); + } + + yield _this.login(_this._auth); + yield _this.compressConnection(); + + _this.logger.debug('Connection established, ready to roll!'); + + _this.client.onerror = _this._onError.bind(_this); + } catch (err) { + _this.logger.error('Could not connect to server', err); + + _this.close(err); // we don't really care whether this works or not + + + throw err; + } + })(); + } + /** + * Initiate connection to the IMAP server + * + * @returns {Promise} capability of server without login + */ + + + openConnection() { + return new Promise((resolve, reject) => { + const connectionTimeout = setTimeout(() => reject(new Error('Timeout connecting to server')), this.timeoutConnection); + this.logger.debug('Connecting to', this.client.host, ':', this.client.port); + + this._changeState(STATE_CONNECTING); + + this.client.connect().then(() => { + this.logger.debug('Socket opened, waiting for greeting from the server...'); + + this.client.onready = () => { + clearTimeout(connectionTimeout); + + this._changeState(STATE_NOT_AUTHENTICATED); + + this.updateCapability().then(() => resolve(this._capability)); + }; + + this.client.onerror = err => { + clearTimeout(connectionTimeout); + reject(err); + }; + }).catch(reject); + }); + } + /** + * Logout + * + * Send LOGOUT, to which the server responds by closing the connection. + * Use is discouraged if network status is unclear! If networks status is + * unclear, please use #close instead! + * + * LOGOUT details: + * https://tools.ietf.org/html/rfc3501#section-6.1.3 + * + * @returns {Promise} Resolves when server has closed the connection + */ + + + logout() { + var _this2 = this; + + return _asyncToGenerator(function* () { + _this2._changeState(STATE_LOGOUT); + + _this2.logger.debug('Logging out...'); + + yield _this2.client.logout(); + clearTimeout(_this2._idleTimeout); + })(); + } + /** + * Force-closes the current connection by closing the TCP socket. + * + * @returns {Promise} Resolves when socket is closed + */ + + + close(err) { + var _this3 = this; + + return _asyncToGenerator(function* () { + _this3._changeState(STATE_LOGOUT); + + clearTimeout(_this3._idleTimeout); + + _this3.logger.debug('Closing connection...'); + + yield _this3.client.close(err); + clearTimeout(_this3._idleTimeout); + })(); + } + /** + * Runs ID command, parses ID response, sets this.serverId + * + * ID details: + * http://tools.ietf.org/html/rfc2971 + * + * @param {Object} id ID as JSON object. See http://tools.ietf.org/html/rfc2971#section-3.3 for possible values + * @returns {Promise} Resolves when response has been parsed + */ + + + updateId(id) { + var _this4 = this; + + return _asyncToGenerator(function* () { + if (_this4._capability.indexOf('ID') < 0) return; + + _this4.logger.debug('Updating id...'); + + const command = 'ID'; + const attributes = id ? [(0, _ramda.flatten)(Object.entries(id))] : [null]; + const response = yield _this4.exec({ + command, + attributes + }, 'ID'); + const list = (0, _ramda.flatten)((0, _ramda.pathOr)([], ['payload', 'ID', '0', 'attributes', '0'], response).map(Object.values)); + const keys = list.filter((_, i) => i % 2 === 0); + const values = list.filter((_, i) => i % 2 === 1); + _this4.serverId = (0, _ramda.fromPairs)((0, _ramda.zip)(keys, values)); + + _this4.logger.debug('Server id updated!', _this4.serverId); + })(); + } + + _shouldSelectMailbox(path, ctx) { + if (!ctx) { + return true; + } + + const previousSelect = this.client.getPreviouslyQueued(['SELECT', 'EXAMINE'], ctx); + + if (previousSelect && previousSelect.request.attributes) { + const pathAttribute = previousSelect.request.attributes.find(attribute => attribute.type === 'STRING'); + + if (pathAttribute) { + return pathAttribute.value !== path; + } + } + + return this._selectedMailbox !== path; + } + /** + * Runs SELECT or EXAMINE to open a mailbox + * + * SELECT details: + * http://tools.ietf.org/html/rfc3501#section-6.3.1 + * EXAMINE details: + * http://tools.ietf.org/html/rfc3501#section-6.3.2 + * + * @param {String} path Full path to mailbox + * @param {Object} [options] Options object + * @returns {Promise} Promise with information about the selected mailbox + */ + + + selectMailbox(path, options = {}) { + var _this5 = this; + + return _asyncToGenerator(function* () { + const query = { + command: options.readOnly ? 'EXAMINE' : 'SELECT', + attributes: [{ + type: 'STRING', + value: path + }] + }; + + if (options.condstore && _this5._capability.indexOf('CONDSTORE') >= 0) { + query.attributes.push([{ + type: 'ATOM', + value: 'CONDSTORE' + }]); + } + + _this5.logger.debug('Opening', path, '...'); + + const response = yield _this5.exec(query, ['EXISTS', 'FLAGS', 'OK'], { + ctx: options.ctx + }); + const mailboxInfo = (0, _commandParser.parseSELECT)(response); + + _this5._changeState(STATE_SELECTED); + + if (_this5._selectedMailbox !== path && _this5.onclosemailbox) { + yield _this5.onclosemailbox(_this5._selectedMailbox); + } + + _this5._selectedMailbox = path; + + if (_this5.onselectmailbox) { + yield _this5.onselectmailbox(path, mailboxInfo); + } + + return mailboxInfo; + })(); + } + /** + * Runs NAMESPACE command + * + * NAMESPACE details: + * https://tools.ietf.org/html/rfc2342 + * + * @returns {Promise} Promise with namespace object + */ + + + listNamespaces() { + var _this6 = this; + + return _asyncToGenerator(function* () { + if (_this6._capability.indexOf('NAMESPACE') < 0) return false; + + _this6.logger.debug('Listing namespaces...'); + + const response = yield _this6.exec('NAMESPACE', 'NAMESPACE'); + return (0, _commandParser.parseNAMESPACE)(response); + })(); + } + /** + * Runs LIST and LSUB commands. Retrieves a tree of available mailboxes + * + * LIST details: + * http://tools.ietf.org/html/rfc3501#section-6.3.8 + * LSUB details: + * http://tools.ietf.org/html/rfc3501#section-6.3.9 + * + * @returns {Promise} Promise with list of mailboxes + */ + + + listMailboxes() { + var _this7 = this; + + return _asyncToGenerator(function* () { + const tree = { + root: true, + children: [] + }; + + _this7.logger.debug('Listing mailboxes...'); + + const listResponse = yield _this7.exec({ + command: 'LIST', + attributes: ['', '*'] + }, 'LIST'); + const list = (0, _ramda.pathOr)([], ['payload', 'LIST'], listResponse); + list.forEach(item => { + const attr = (0, _ramda.propOr)([], 'attributes', item); + if (attr.length < 3) return; + const path = (0, _ramda.pathOr)('', ['2', 'value'], attr); + const delim = (0, _ramda.pathOr)('/', ['1', 'value'], attr); + + const branch = _this7._ensurePath(tree, path, delim); + + branch.flags = (0, _ramda.propOr)([], '0', attr).map(({ + value + }) => value || ''); + branch.listed = true; + (0, _specialUse.checkSpecialUse)(branch); + }); + const lsubResponse = yield _this7.exec({ + command: 'LSUB', + attributes: ['', '*'] + }, 'LSUB'); + const lsub = (0, _ramda.pathOr)([], ['payload', 'LSUB'], lsubResponse); + lsub.forEach(item => { + const attr = (0, _ramda.propOr)([], 'attributes', item); + if (attr.length < 3) return; + const path = (0, _ramda.pathOr)('', ['2', 'value'], attr); + const delim = (0, _ramda.pathOr)('/', ['1', 'value'], attr); + + const branch = _this7._ensurePath(tree, path, delim); + + (0, _ramda.propOr)([], '0', attr).map((flag = '') => { + branch.flags = (0, _ramda.union)(branch.flags, [flag]); + }); + branch.subscribed = true; + }); + return tree; + })(); + } + /** + * Create a mailbox with the given path. + * + * CREATE details: + * http://tools.ietf.org/html/rfc3501#section-6.3.3 + * + * @param {String} path + * The path of the mailbox you would like to create. This method will + * handle utf7 encoding for you. + * @returns {Promise} + * Promise resolves if mailbox was created. + * In the event the server says NO [ALREADYEXISTS], we treat that as success. + */ + + + createMailbox(path) { + var _this8 = this; + + return _asyncToGenerator(function* () { + _this8.logger.debug('Creating mailbox', path, '...'); + + try { + yield _this8.exec({ + command: 'CREATE', + attributes: [(0, _emailjsUtf.imapEncode)(path)] + }); + } catch (err) { + if (err && err.code === 'ALREADYEXISTS') { + return; + } + + throw err; + } + })(); + } + /** + * Delete a mailbox with the given path. + * + * DELETE details: + * https://tools.ietf.org/html/rfc3501#section-6.3.4 + * + * @param {String} path + * The path of the mailbox you would like to delete. This method will + * handle utf7 encoding for you. + * @returns {Promise} + * Promise resolves if mailbox was deleted. + */ + + + deleteMailbox(path) { + this.logger.debug('Deleting mailbox', path, '...'); + return this.exec({ + command: 'DELETE', + attributes: [(0, _emailjsUtf.imapEncode)(path)] + }); + } + /** + * Runs FETCH command + * + * FETCH details: + * http://tools.ietf.org/html/rfc3501#section-6.4.5 + * CHANGEDSINCE details: + * https://tools.ietf.org/html/rfc4551#section-3.3 + * + * @param {String} path The path for the mailbox which should be selected for the command. Selects mailbox if necessary + * @param {String} sequence Sequence set, eg 1:* for all messages + * @param {Object} [items] Message data item names or macro + * @param {Object} [options] Query modifiers + * @returns {Promise} Promise with the fetched message info + */ + + + listMessages(path, sequence, items = [{ + fast: true + }], options = {}) { + var _this9 = this; + + return _asyncToGenerator(function* () { + _this9.logger.debug('Fetching messages', sequence, 'from', path, '...'); + + const command = (0, _commandBuilder.buildFETCHCommand)(sequence, items, options); + const response = yield _this9.exec(command, 'FETCH', { + precheck: ctx => _this9._shouldSelectMailbox(path, ctx) ? _this9.selectMailbox(path, { + ctx + }) : Promise.resolve() + }); + return (0, _commandParser.parseFETCH)(response); + })(); + } + /** + * Runs SEARCH command + * + * SEARCH details: + * http://tools.ietf.org/html/rfc3501#section-6.4.4 + * + * @param {String} path The path for the mailbox which should be selected for the command. Selects mailbox if necessary + * @param {Object} query Search terms + * @param {Object} [options] Query modifiers + * @returns {Promise} Promise with the array of matching seq. or uid numbers + */ + + + search(path, query, options = {}) { + var _this10 = this; + + return _asyncToGenerator(function* () { + _this10.logger.debug('Searching in', path, '...'); + + const command = (0, _commandBuilder.buildSEARCHCommand)(query, options); + const response = yield _this10.exec(command, 'SEARCH', { + precheck: ctx => _this10._shouldSelectMailbox(path, ctx) ? _this10.selectMailbox(path, { + ctx + }) : Promise.resolve() + }); + return (0, _commandParser.parseSEARCH)(response); + })(); + } + /** + * Runs STORE command + * + * STORE details: + * http://tools.ietf.org/html/rfc3501#section-6.4.6 + * + * @param {String} path The path for the mailbox which should be selected for the command. Selects mailbox if necessary + * @param {String} sequence Message selector which the flag change is applied to + * @param {Array} flags + * @param {Object} [options] Query modifiers + * @returns {Promise} Promise with the array of matching seq. or uid numbers + */ + + + setFlags(path, sequence, flags, options) { + let key = ''; + let list = []; + + if (Array.isArray(flags) || typeof flags !== 'object') { + list = [].concat(flags || []); + key = ''; + } else if (flags.add) { + list = [].concat(flags.add || []); + key = '+'; + } else if (flags.set) { + key = ''; + list = [].concat(flags.set || []); + } else if (flags.remove) { + key = '-'; + list = [].concat(flags.remove || []); + } + + this.logger.debug('Setting flags on', sequence, 'in', path, '...'); + return this.store(path, sequence, key + 'FLAGS', list, options); + } + /** + * Runs STORE command + * + * STORE details: + * http://tools.ietf.org/html/rfc3501#section-6.4.6 + * + * @param {String} path The path for the mailbox which should be selected for the command. Selects mailbox if necessary + * @param {String} sequence Message selector which the flag change is applied to + * @param {String} action STORE method to call, eg "+FLAGS" + * @param {Array} flags + * @param {Object} [options] Query modifiers + * @returns {Promise} Promise with the array of matching seq. or uid numbers + */ + + + store(path, sequence, action, flags, options = {}) { + var _this11 = this; + + return _asyncToGenerator(function* () { + const command = (0, _commandBuilder.buildSTORECommand)(sequence, action, flags, options); + const response = yield _this11.exec(command, 'FETCH', { + precheck: ctx => _this11._shouldSelectMailbox(path, ctx) ? _this11.selectMailbox(path, { + ctx + }) : Promise.resolve() + }); + return (0, _commandParser.parseFETCH)(response); + })(); + } + /** + * Runs APPEND command + * + * APPEND details: + * http://tools.ietf.org/html/rfc3501#section-6.3.11 + * + * @param {String} destination The mailbox where to append the message + * @param {String} message The message to append + * @param {Array} options.flags Any flags you want to set on the uploaded message. Defaults to [\Seen]. (optional) + * @returns {Promise} Promise with the array of matching seq. or uid numbers + */ + + + upload(destination, message, options = {}) { + var _this12 = this; + + return _asyncToGenerator(function* () { + const flags = (0, _ramda.propOr)(['\\Seen'], 'flags', options).map(value => ({ + type: 'atom', + value + })); + const command = { + command: 'APPEND', + attributes: [{ + type: 'atom', + value: destination + }, flags, { + type: 'literal', + value: message + }] + }; + + _this12.logger.debug('Uploading message to', destination, '...'); + + const response = yield _this12.exec(command); + return (0, _commandParser.parseAPPEND)(response); + })(); + } + /** + * Deletes messages from a selected mailbox + * + * EXPUNGE details: + * http://tools.ietf.org/html/rfc3501#section-6.4.3 + * UID EXPUNGE details: + * https://tools.ietf.org/html/rfc4315#section-2.1 + * + * If possible (byUid:true and UIDPLUS extension supported), uses UID EXPUNGE + * command to delete a range of messages, otherwise falls back to EXPUNGE. + * + * NB! This method might be destructive - if EXPUNGE is used, then any messages + * with \Deleted flag set are deleted + * + * @param {String} path The path for the mailbox which should be selected for the command. Selects mailbox if necessary + * @param {String} sequence Message range to be deleted + * @param {Object} [options] Query modifiers + * @returns {Promise} Promise + */ + + + deleteMessages(path, sequence, options = {}) { + var _this13 = this; + + return _asyncToGenerator(function* () { + // add \Deleted flag to the messages and run EXPUNGE or UID EXPUNGE + _this13.logger.debug('Deleting messages', sequence, 'in', path, '...'); + + const useUidPlus = options.byUid && _this13._capability.indexOf('UIDPLUS') >= 0; + const uidExpungeCommand = { + command: 'UID EXPUNGE', + attributes: [{ + type: 'sequence', + value: sequence + }] + }; + yield _this13.setFlags(path, sequence, { + add: '\\Deleted' + }, options); + const cmd = useUidPlus ? uidExpungeCommand : 'EXPUNGE'; + return _this13.exec(cmd, null, { + precheck: ctx => _this13._shouldSelectMailbox(path, ctx) ? _this13.selectMailbox(path, { + ctx + }) : Promise.resolve() + }); + })(); + } + /** + * Copies a range of messages from the active mailbox to the destination mailbox. + * Silent method (unless an error occurs), by default returns no information. + * + * COPY details: + * http://tools.ietf.org/html/rfc3501#section-6.4.7 + * + * @param {String} path The path for the mailbox which should be selected for the command. Selects mailbox if necessary + * @param {String} sequence Message range to be copied + * @param {String} destination Destination mailbox path + * @param {Object} [options] Query modifiers + * @param {Boolean} [options.byUid] If true, uses UID COPY instead of COPY + * @returns {Promise} Promise + */ + + + copyMessages(path, sequence, destination, options = {}) { + var _this14 = this; + + return _asyncToGenerator(function* () { + _this14.logger.debug('Copying messages', sequence, 'from', path, 'to', destination, '...'); + + const response = yield _this14.exec({ + command: options.byUid ? 'UID COPY' : 'COPY', + attributes: [{ + type: 'sequence', + value: sequence + }, { + type: 'atom', + value: destination + }] + }, null, { + precheck: ctx => _this14._shouldSelectMailbox(path, ctx) ? _this14.selectMailbox(path, { + ctx + }) : Promise.resolve() + }); + return (0, _commandParser.parseCOPY)(response); + })(); + } + /** + * Moves a range of messages from the active mailbox to the destination mailbox. + * Prefers the MOVE extension but if not available, falls back to + * COPY + EXPUNGE + * + * MOVE details: + * http://tools.ietf.org/html/rfc6851 + * + * @param {String} path The path for the mailbox which should be selected for the command. Selects mailbox if necessary + * @param {String} sequence Message range to be moved + * @param {String} destination Destination mailbox path + * @param {Object} [options] Query modifiers + * @returns {Promise} Promise + */ + + + moveMessages(path, sequence, destination, options = {}) { + var _this15 = this; + + return _asyncToGenerator(function* () { + _this15.logger.debug('Moving messages', sequence, 'from', path, 'to', destination, '...'); + + if (_this15._capability.indexOf('MOVE') === -1) { + // Fallback to COPY + EXPUNGE + yield _this15.copyMessages(path, sequence, destination, options); + return _this15.deleteMessages(path, sequence, options); + } // If possible, use MOVE + + + return _this15.exec({ + command: options.byUid ? 'UID MOVE' : 'MOVE', + attributes: [{ + type: 'sequence', + value: sequence + }, { + type: 'atom', + value: destination + }] + }, ['OK'], { + precheck: ctx => _this15._shouldSelectMailbox(path, ctx) ? _this15.selectMailbox(path, { + ctx + }) : Promise.resolve() + }); + })(); + } + /** + * Runs COMPRESS command + * + * COMPRESS details: + * https://tools.ietf.org/html/rfc4978 + */ + + + compressConnection() { + var _this16 = this; + + return _asyncToGenerator(function* () { + if (!_this16._enableCompression || _this16._capability.indexOf('COMPRESS=DEFLATE') < 0 || _this16.client.compressed) { + return false; + } + + _this16.logger.debug('Enabling compression...'); + + yield _this16.exec({ + command: 'COMPRESS', + attributes: [{ + type: 'ATOM', + value: 'DEFLATE' + }] + }); + + _this16.client.enableCompression(); + + _this16.logger.debug('Compression enabled, all data sent and received is deflated!'); + })(); + } + /** + * Runs LOGIN or AUTHENTICATE XOAUTH2 command + * + * LOGIN details: + * http://tools.ietf.org/html/rfc3501#section-6.2.3 + * XOAUTH2 details: + * https://developers.google.com/gmail/xoauth2_protocol#imap_protocol_exchange + * + * @param {String} auth.user + * @param {String} auth.pass + * @param {String} auth.xoauth2 + */ + + + login(auth) { + var _this17 = this; + + return _asyncToGenerator(function* () { + let command; + const options = {}; + + if (!auth) { + throw new Error('Authentication information not provided'); + } + + if (_this17._capability.indexOf('AUTH=XOAUTH2') >= 0 && auth && auth.xoauth2) { + command = { + command: 'AUTHENTICATE', + attributes: [{ + type: 'ATOM', + value: 'XOAUTH2' + }, { + type: 'ATOM', + value: (0, _commandBuilder.buildXOAuth2Token)(auth.user, auth.xoauth2), + sensitive: true + }] + }; + options.errorResponseExpectsEmptyLine = true; // + tagged error response expects an empty line in return + } else { + command = { + command: 'login', + attributes: [{ + type: 'STRING', + value: auth.user || '' + }, { + type: 'STRING', + value: auth.pass || '', + sensitive: true + }] + }; + } + + _this17.logger.debug('Logging in...'); + + const response = yield _this17.exec(command, 'capability', options); + /* + * update post-auth capabilites + * capability list shouldn't contain auth related stuff anymore + * but some new extensions might have popped up that do not + * make much sense in the non-auth state + */ + + if (response.capability && response.capability.length) { + // capabilites were listed with the OK [CAPABILITY ...] response + _this17._capability = response.capability; + } else if (response.payload && response.payload.CAPABILITY && response.payload.CAPABILITY.length) { + // capabilites were listed with * CAPABILITY ... response + _this17._capability = response.payload.CAPABILITY.pop().attributes.map((capa = '') => capa.value.toUpperCase().trim()); + } else { + // capabilities were not automatically listed, reload + yield _this17.updateCapability(true); + } + + _this17._changeState(STATE_AUTHENTICATED); + + _this17._authenticated = true; + + _this17.logger.debug('Login successful, post-auth capabilites updated!', _this17._capability); + })(); + } + /** + * Run an IMAP command. + * + * @param {Object} request Structured request object + * @param {Array} acceptUntagged a list of untagged responses that will be included in 'payload' property + */ + + + exec(request, acceptUntagged, options) { + var _this18 = this; + + return _asyncToGenerator(function* () { + _this18.breakIdle(); + + const response = yield _this18.client.enqueueCommand(request, acceptUntagged, options); + + if (response && response.capability) { + _this18._capability = response.capability; + } + + return response; + })(); + } + /** + * The connection is idling. Sends a NOOP or IDLE command + * + * IDLE details: + * https://tools.ietf.org/html/rfc2177 + */ + + + enterIdle() { + if (this._enteredIdle) { + return; + } + + const supportsIdle = this._capability.indexOf('IDLE') >= 0; + this._enteredIdle = supportsIdle && this._selectedMailbox ? 'IDLE' : 'NOOP'; + this.logger.debug('Entering idle with ' + this._enteredIdle); + + if (this._enteredIdle === 'NOOP') { + this._idleTimeout = setTimeout(() => { + this.logger.debug('Sending NOOP'); + this.exec('NOOP'); + }, this.timeoutNoop); + } else if (this._enteredIdle === 'IDLE') { + this.client.enqueueCommand({ + command: 'IDLE' + }); + this._idleTimeout = setTimeout(() => { + this.client.send('DONE\r\n'); + this._enteredIdle = false; + this.logger.debug('Idle terminated'); + }, this.timeoutIdle); + } + } + /** + * Stops actions related idling, if IDLE is supported, sends DONE to stop it + */ + + + breakIdle() { + if (!this._enteredIdle) { + return; + } + + clearTimeout(this._idleTimeout); + + if (this._enteredIdle === 'IDLE') { + this.client.send('DONE\r\n'); + this.logger.debug('Idle terminated'); + } + + this._enteredIdle = false; + } + /** + * Runs STARTTLS command if needed + * + * STARTTLS details: + * http://tools.ietf.org/html/rfc3501#section-6.2.1 + * + * @param {Boolean} [forced] By default the command is not run if capability is already listed. Set to true to skip this validation + */ + + + upgradeConnection() { + var _this19 = this; + + return _asyncToGenerator(function* () { + // skip request, if already secured + if (_this19.client.secureMode) { + return false; + } // skip if STARTTLS not available or starttls support disabled + + + if ((_this19._capability.indexOf('STARTTLS') < 0 || _this19._ignoreTLS) && !_this19._requireTLS) { + return false; + } + + _this19.logger.debug('Encrypting connection...'); + + yield _this19.exec('STARTTLS'); + _this19._capability = []; + + _this19.client.upgrade(); + + return _this19.updateCapability(); + })(); + } + /** + * Runs CAPABILITY command + * + * CAPABILITY details: + * http://tools.ietf.org/html/rfc3501#section-6.1.1 + * + * Doesn't register untagged CAPABILITY handler as this is already + * handled by global handler + * + * @param {Boolean} [forced] By default the command is not run if capability is already listed. Set to true to skip this validation + */ + + + updateCapability(forced) { + var _this20 = this; + + return _asyncToGenerator(function* () { + // skip request, if not forced update and capabilities are already loaded + if (!forced && _this20._capability.length) { + return; + } // If STARTTLS is required then skip capability listing as we are going to try + // STARTTLS anyway and we re-check capabilities after connection is secured + + + if (!_this20.client.secureMode && _this20._requireTLS) { + return; + } + + _this20.logger.debug('Updating capability...'); + + return _this20.exec('CAPABILITY'); + })(); + } + + hasCapability(capa = '') { + return this._capability.indexOf(capa.toUpperCase().trim()) >= 0; + } // Default handlers for untagged responses + + /** + * Checks if an untagged OK includes [CAPABILITY] tag and updates capability object + * + * @param {Object} response Parsed server response + * @param {Function} next Until called, server responses are not processed + */ + + + _untaggedOkHandler(response) { + if (response && response.capability) { + this._capability = response.capability; + } + } + /** + * Updates capability object + * + * @param {Object} response Parsed server response + * @param {Function} next Until called, server responses are not processed + */ + + + _untaggedCapabilityHandler(response) { + this._capability = (0, _ramda.pipe)((0, _ramda.propOr)([], 'attributes'), (0, _ramda.map)(({ + value + }) => (value || '').toUpperCase().trim()))(response); + } + /** + * Updates existing message count + * + * @param {Object} response Parsed server response + * @param {Function} next Until called, server responses are not processed + */ + + + _untaggedExistsHandler(response) { + if (response && Object.prototype.hasOwnProperty.call(response, 'nr')) { + this.onupdate && this.onupdate(this._selectedMailbox, 'exists', response.nr); + } + } + /** + * Indicates a message has been deleted + * + * @param {Object} response Parsed server response + * @param {Function} next Until called, server responses are not processed + */ + + + _untaggedExpungeHandler(response) { + if (response && Object.prototype.hasOwnProperty.call(response, 'nr')) { + this.onupdate && this.onupdate(this._selectedMailbox, 'expunge', response.nr); + } + } + /** + * Indicates that flags have been updated for a message + * + * @param {Object} response Parsed server response + * @param {Function} next Until called, server responses are not processed + */ + + + _untaggedFetchHandler(response) { + this.onupdate && this.onupdate(this._selectedMailbox, 'fetch', [].concat((0, _commandParser.parseFETCH)({ + payload: { + FETCH: [response] + } + }) || []).shift()); + } // Private helpers + + /** + * Indicates that the connection started idling. Initiates a cycle + * of NOOPs or IDLEs to receive notifications about updates in the server + */ + + + _onIdle() { + if (!this._authenticated || this._enteredIdle) { + // No need to IDLE when not logged in or already idling + return; + } + + this.logger.debug('Client started idling'); + this.enterIdle(); + } + /** + * Updates the IMAP state value for the current connection + * + * @param {Number} newState The state you want to change to + */ + + + _changeState(newState) { + if (newState === this._state) { + return; + } + + this.logger.debug('Entering state: ' + newState); // if a mailbox was opened, emit onclosemailbox and clear selectedMailbox value + + if (this._state === STATE_SELECTED && this._selectedMailbox) { + this.onclosemailbox && this.onclosemailbox(this._selectedMailbox); + this._selectedMailbox = false; + } + + this._state = newState; + } + /** + * Ensures a path exists in the Mailbox tree + * + * @param {Object} tree Mailbox tree + * @param {String} path + * @param {String} delimiter + * @return {Object} branch for used path + */ + + + _ensurePath(tree, path, delimiter) { + const names = path.split(delimiter); + let branch = tree; + + for (let i = 0; i < names.length; i++) { + let found = false; + + for (let j = 0; j < branch.children.length; j++) { + if (this._compareMailboxNames(branch.children[j].name, (0, _emailjsUtf.imapDecode)(names[i]))) { + branch = branch.children[j]; + found = true; + break; + } + } + + if (!found) { + branch.children.push({ + name: (0, _emailjsUtf.imapDecode)(names[i]), + delimiter: delimiter, + path: names.slice(0, i + 1).join(delimiter), + children: [] + }); + branch = branch.children[branch.children.length - 1]; + } + } + + return branch; + } + /** + * Compares two mailbox names. Case insensitive in case of INBOX, otherwise case sensitive + * + * @param {String} a Mailbox name + * @param {String} b Mailbox name + * @returns {Boolean} True if the folder names match + */ + + + _compareMailboxNames(a, b) { + return (a.toUpperCase() === 'INBOX' ? 'INBOX' : a) === (b.toUpperCase() === 'INBOX' ? 'INBOX' : b); + } + + createLogger(creator = _logger.default) { + const logger = creator((this._auth || {}).user || '', this._host); + this.logger = this.client.logger = { + debug: (...msgs) => { + if (_common.LOG_LEVEL_DEBUG >= this.logLevel) { + logger.debug(msgs); + } + }, + info: (...msgs) => { + if (_common.LOG_LEVEL_INFO >= this.logLevel) { + logger.info(msgs); + } + }, + warn: (...msgs) => { + if (_common.LOG_LEVEL_WARN >= this.logLevel) { + logger.warn(msgs); + } + }, + error: (...msgs) => { + if (_common.LOG_LEVEL_ERROR >= this.logLevel) { + logger.error(msgs); + } + } + }; + } + +} + +exports.default = Client; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGllbnQuanMiXSwibmFtZXMiOlsiVElNRU9VVF9DT05ORUNUSU9OIiwiVElNRU9VVF9OT09QIiwiVElNRU9VVF9JRExFIiwiU1RBVEVfQ09OTkVDVElORyIsIlNUQVRFX05PVF9BVVRIRU5USUNBVEVEIiwiU1RBVEVfQVVUSEVOVElDQVRFRCIsIlNUQVRFX1NFTEVDVEVEIiwiU1RBVEVfTE9HT1VUIiwiREVGQVVMVF9DTElFTlRfSUQiLCJuYW1lIiwiQ2xpZW50IiwiY29uc3RydWN0b3IiLCJob3N0IiwicG9ydCIsIm9wdGlvbnMiLCJ0aW1lb3V0Q29ubmVjdGlvbiIsInRpbWVvdXROb29wIiwidGltZW91dElkbGUiLCJzZXJ2ZXJJZCIsIm9uY2VydCIsIm9udXBkYXRlIiwib25zZWxlY3RtYWlsYm94Iiwib25jbG9zZW1haWxib3giLCJfaG9zdCIsIl9jbGllbnRJZCIsIl9zdGF0ZSIsIl9hdXRoZW50aWNhdGVkIiwiX2NhcGFiaWxpdHkiLCJfc2VsZWN0ZWRNYWlsYm94IiwiX2VudGVyZWRJZGxlIiwiX2lkbGVUaW1lb3V0IiwiX2VuYWJsZUNvbXByZXNzaW9uIiwiZW5hYmxlQ29tcHJlc3Npb24iLCJfYXV0aCIsImF1dGgiLCJfcmVxdWlyZVRMUyIsInJlcXVpcmVUTFMiLCJfaWdub3JlVExTIiwiaWdub3JlVExTIiwiY2xpZW50IiwiSW1hcENsaWVudCIsIm9uZXJyb3IiLCJfb25FcnJvciIsImJpbmQiLCJjZXJ0Iiwib25pZGxlIiwiX29uSWRsZSIsInNldEhhbmRsZXIiLCJyZXNwb25zZSIsIl91bnRhZ2dlZENhcGFiaWxpdHlIYW5kbGVyIiwiX3VudGFnZ2VkT2tIYW5kbGVyIiwiX3VudGFnZ2VkRXhpc3RzSGFuZGxlciIsIl91bnRhZ2dlZEV4cHVuZ2VIYW5kbGVyIiwiX3VudGFnZ2VkRmV0Y2hIYW5kbGVyIiwiY3JlYXRlTG9nZ2VyIiwibG9nTGV2ZWwiLCJMT0dfTEVWRUxfQUxMIiwiZXJyIiwiY2xlYXJUaW1lb3V0IiwiY29ubmVjdCIsIm9wZW5Db25uZWN0aW9uIiwidXBncmFkZUNvbm5lY3Rpb24iLCJ1cGRhdGVJZCIsImxvZ2dlciIsIndhcm4iLCJtZXNzYWdlIiwibG9naW4iLCJjb21wcmVzc0Nvbm5lY3Rpb24iLCJkZWJ1ZyIsImVycm9yIiwiY2xvc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImNvbm5lY3Rpb25UaW1lb3V0Iiwic2V0VGltZW91dCIsIkVycm9yIiwiX2NoYW5nZVN0YXRlIiwidGhlbiIsIm9ucmVhZHkiLCJ1cGRhdGVDYXBhYmlsaXR5IiwiY2F0Y2giLCJsb2dvdXQiLCJpZCIsImluZGV4T2YiLCJjb21tYW5kIiwiYXR0cmlidXRlcyIsIk9iamVjdCIsImVudHJpZXMiLCJleGVjIiwibGlzdCIsIm1hcCIsInZhbHVlcyIsImtleXMiLCJmaWx0ZXIiLCJfIiwiaSIsIl9zaG91bGRTZWxlY3RNYWlsYm94IiwicGF0aCIsImN0eCIsInByZXZpb3VzU2VsZWN0IiwiZ2V0UHJldmlvdXNseVF1ZXVlZCIsInJlcXVlc3QiLCJwYXRoQXR0cmlidXRlIiwiZmluZCIsImF0dHJpYnV0ZSIsInR5cGUiLCJ2YWx1ZSIsInNlbGVjdE1haWxib3giLCJxdWVyeSIsInJlYWRPbmx5IiwiY29uZHN0b3JlIiwicHVzaCIsIm1haWxib3hJbmZvIiwibGlzdE5hbWVzcGFjZXMiLCJsaXN0TWFpbGJveGVzIiwidHJlZSIsInJvb3QiLCJjaGlsZHJlbiIsImxpc3RSZXNwb25zZSIsImZvckVhY2giLCJpdGVtIiwiYXR0ciIsImxlbmd0aCIsImRlbGltIiwiYnJhbmNoIiwiX2Vuc3VyZVBhdGgiLCJmbGFncyIsImxpc3RlZCIsImxzdWJSZXNwb25zZSIsImxzdWIiLCJmbGFnIiwic3Vic2NyaWJlZCIsImNyZWF0ZU1haWxib3giLCJjb2RlIiwiZGVsZXRlTWFpbGJveCIsImxpc3RNZXNzYWdlcyIsInNlcXVlbmNlIiwiaXRlbXMiLCJmYXN0IiwicHJlY2hlY2siLCJzZWFyY2giLCJzZXRGbGFncyIsImtleSIsIkFycmF5IiwiaXNBcnJheSIsImNvbmNhdCIsImFkZCIsInNldCIsInJlbW92ZSIsInN0b3JlIiwiYWN0aW9uIiwidXBsb2FkIiwiZGVzdGluYXRpb24iLCJkZWxldGVNZXNzYWdlcyIsInVzZVVpZFBsdXMiLCJieVVpZCIsInVpZEV4cHVuZ2VDb21tYW5kIiwiY21kIiwiY29weU1lc3NhZ2VzIiwibW92ZU1lc3NhZ2VzIiwiY29tcHJlc3NlZCIsInhvYXV0aDIiLCJ1c2VyIiwic2Vuc2l0aXZlIiwiZXJyb3JSZXNwb25zZUV4cGVjdHNFbXB0eUxpbmUiLCJwYXNzIiwiY2FwYWJpbGl0eSIsInBheWxvYWQiLCJDQVBBQklMSVRZIiwicG9wIiwiY2FwYSIsInRvVXBwZXJDYXNlIiwidHJpbSIsImFjY2VwdFVudGFnZ2VkIiwiYnJlYWtJZGxlIiwiZW5xdWV1ZUNvbW1hbmQiLCJlbnRlcklkbGUiLCJzdXBwb3J0c0lkbGUiLCJzZW5kIiwic2VjdXJlTW9kZSIsInVwZ3JhZGUiLCJmb3JjZWQiLCJoYXNDYXBhYmlsaXR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwibnIiLCJGRVRDSCIsInNoaWZ0IiwibmV3U3RhdGUiLCJkZWxpbWl0ZXIiLCJuYW1lcyIsInNwbGl0IiwiZm91bmQiLCJqIiwiX2NvbXBhcmVNYWlsYm94TmFtZXMiLCJzbGljZSIsImpvaW4iLCJhIiwiYiIsImNyZWF0b3IiLCJjcmVhdGVEZWZhdWx0TG9nZ2VyIiwibXNncyIsIkxPR19MRVZFTF9ERUJVRyIsImluZm8iLCJMT0dfTEVWRUxfSU5GTyIsIkxPR19MRVZFTF9XQVJOIiwiTE9HX0xFVkVMX0VSUk9SIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBUUE7O0FBT0E7O0FBQ0E7O0FBQ0E7O0FBUUE7Ozs7Ozs7O0FBSU8sTUFBTUEsa0JBQWtCLEdBQUcsS0FBSyxJQUFoQyxDLENBQXFDOzs7QUFDckMsTUFBTUMsWUFBWSxHQUFHLEtBQUssSUFBMUIsQyxDQUErQjs7O0FBQy9CLE1BQU1D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biwgemlwLCBmcm9tUGFpcnMsIHByb3BPciwgcGF0aE9yLCBmbGF0dGVuIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBpbWFwRW5jb2RlLCBpbWFwRGVjb2RlIH0gZnJvbSAnZW1haWxqcy11dGY3J1xuaW1wb3J0IHtcbiAgcGFyc2VBUFBFTkQsXG4gIHBhcnNlQ09QWSxcbiAgcGFyc2VOQU1FU1BBQ0UsXG4gIHBhcnNlU0VMRUNULFxuICBwYXJzZUZFVENILFxuICBwYXJzZVNFQVJDSFxufSBmcm9tICcuL2NvbW1hbmQtcGFyc2VyJ1xuaW1wb3J0IHtcbiAgYnVpbGRGRVRDSENvbW1hbmQsXG4gIGJ1aWxkWE9BdXRoMlRva2VuLFxuICBidWlsZFNFQVJDSENvbW1hbmQsXG4gIGJ1aWxkU1RPUkVDb21tYW5kXG59IGZyb20gJy4vY29tbWFuZC1idWlsZGVyJ1xuXG5pbXBvcnQgY3JlYXRlRGVmYXVsdExvZ2dlciBmcm9tICcuL2xvZ2dlcidcbmltcG9ydCBJbWFwQ2xpZW50IGZyb20gJy4vaW1hcCdcbmltcG9ydCB7XG4gIExPR19MRVZFTF9FUlJPUixcbiAgTE9HX0xFVkVMX1dBUk4sXG4gIExPR19MRVZFTF9JTkZPLFxuICBMT0dfTEVWRUxfREVCVUcsXG4gIExPR19MRVZFTF9BTExcbn0gZnJvbSAnLi9jb21tb24nXG5cbmltcG9ydCB7XG4gIGNoZWNrU3BlY2lhbFVzZVxufSBmcm9tICcuL3NwZWNpYWwtdXNlJ1xuXG5leHBvcnQgY29uc3QgVElNRU9VVF9DT05ORUNUSU9OID0gOTAgKiAxMDAwIC8vIE1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciB0aGUgSU1BUCBncmVldGluZyBmcm9tIHRoZSBzZXJ2ZXJcbmV4cG9ydCBjb25zdCBUSU1FT1VUX05PT1AgPSA2MCAqIDEwMDAgLy8gTWlsbGlzZWNvbmRzIGJldHdlZW4gTk9PUCBjb21tYW5kcyB3aGlsZSBpZGxpbmdcbmV4cG9ydCBjb25zdCBUSU1FT1VUX0lETEUgPSA2MCAqIDEwMDAgLy8gTWlsbGlzZWNvbmRzIHVudGlsIElETEUgY29tbWFuZCBpcyBjYW5jZWxsZWRcblxuZXhwb3J0IGNvbnN0IFNUQVRFX0NPTk5FQ1RJTkcgPSAxXG5leHBvcnQgY29uc3QgU1RBVEVfTk9UX0FVVEhFTlRJQ0FURUQgPSAyXG5leHBvcnQgY29uc3QgU1RBVEVfQVVUSEVOVElDQVRFRCA9IDNcbmV4cG9ydCBjb25zdCBTVEFURV9TRUxFQ1RFRCA9IDRcbmV4cG9ydCBjb25zdCBTVEFURV9MT0dPVVQgPSA1XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0NMSUVOVF9JRCA9IHtcbiAgbmFtZTogJ2VtYWlsanMtaW1hcC1jbGllbnQnXG59XG5cbi8qKlxuICogZW1haWxqcyBJTUFQIGNsaWVudFxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBbaG9zdD0nbG9jYWxob3N0J10gSG9zdG5hbWUgdG8gY29uZW5jdCB0b1xuICogQHBhcmFtIHtOdW1iZXJ9IFtwb3J0PTE0M10gUG9ydCBudW1iZXIgdG8gY29ubmVjdCB0b1xuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBPcHRpb25hbCBvcHRpb25zIG9iamVjdFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDbGllbnQge1xuICBjb25zdHJ1Y3RvciAoaG9zdCwgcG9ydCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy50aW1lb3V0Q29ubmVjdGlvbiA9IFRJTUVPVVRfQ09OTkVDVElPTlxuICAgIHRoaXMudGltZW91dE5vb3AgPSBUSU1FT1VUX05PT1BcbiAgICB0aGlzLnRpbWVvdXRJZGxlID0gVElNRU9VVF9JRExFXG5cbiAgICB0aGlzLnNlcnZlcklkID0gZmFsc2UgLy8gUkZDIDI5NzEgU2VydmVyIElEIGFzIGtleSB2YWx1ZSBwYWlyc1xuXG4gICAgLy8gRXZlbnQgcGxhY2Vob2xkZXJzXG4gICAgdGhpcy5vbmNlcnQgPSBudWxsXG4gICAgdGhpcy5vbnVwZGF0ZSA9IG51bGxcbiAgICB0aGlzLm9uc2VsZWN0bWFpbGJveCA9IG51bGxcbiAgICB0aGlzLm9uY2xvc2VtYWlsYm94ID0gbnVsbFxuXG4gICAgdGhpcy5faG9zdCA9IGhvc3RcbiAgICB0aGlzLl9jbGllbnRJZCA9IHByb3BPcihERUZBVUxUX0NMSUVOVF9JRCwgJ2lkJywgb3B0aW9ucylcbiAgICB0aGlzLl9zdGF0ZSA9IGZhbHNlIC8vIEN1cnJlbnQgc3RhdGVcbiAgICB0aGlzLl9hdXRoZW50aWNhdGVkID0gZmFsc2UgLy8gSXMgdGhlIGNvbm5lY3Rpb24gYXV0aGVudGljYXRlZFxuICAgIHRoaXMuX2NhcGFiaWxpdHkgPSBbXSAvLyBMaXN0IG9mIGV4dGVuc2lvbnMgdGhlIHNlcnZlciBzdXBwb3J0c1xuICAgIHRoaXMuX3NlbGVjdGVkTWFpbGJveCA9IGZhbHNlIC8vIFNlbGVjdGVkIG1haWxib3hcbiAgICB0aGlzLl9lbnRlcmVkSWRsZSA9IGZhbHNlXG4gICAgdGhpcy5faWRsZVRpbWVvdXQgPSBmYWxzZVxuICAgIHRoaXMuX2VuYWJsZUNvbXByZXNzaW9uID0gISFvcHRpb25zLmVuYWJsZUNvbXByZXNzaW9uXG4gICAgdGhpcy5fYXV0aCA9IG9wdGlvbnMuYXV0aFxuICAgIHRoaXMuX3JlcXVpcmVUTFMgPSAhIW9wdGlvbnMucmVxdWlyZVRMU1xuICAgIHRoaXMuX2lnbm9yZVRMUyA9ICEhb3B0aW9ucy5pZ25vcmVUTFNcblxuICAgIHRoaXMuY2xpZW50ID0gbmV3IEltYXBDbGllbnQoaG9zdCwgcG9ydCwgb3B0aW9ucykgLy8gSU1BUCBjbGllbnQgb2JqZWN0XG5cbiAgICAvLyBFdmVudCBIYW5kbGVyc1xuICAgIHRoaXMuY2xpZW50Lm9uZXJyb3IgPSB0aGlzLl9vbkVycm9yLmJpbmQodGhpcylcbiAgICB0aGlzLmNsaWVudC5vbmNlcnQgPSAoY2VydCkgPT4gKHRoaXMub25jZXJ0ICYmIHRoaXMub25jZXJ0KGNlcnQpKSAvLyBhbGxvd3MgY2VydGlmaWNhdGUgaGFuZGxpbmcgZm9yIHBsYXRmb3JtcyB3L28gbmF0aXZlIHRscyBzdXBwb3J0XG4gICAgdGhpcy5jbGllbnQub25pZGxlID0gKCkgPT4gdGhpcy5fb25JZGxlKCkgLy8gc3RhcnQgaWRsaW5nXG5cbiAgICAvLyBEZWZhdWx0IGhhbmRsZXJzIGZvciB1bnRhZ2dlZCByZXNwb25zZXNcbiAgICB0aGlzLmNsaWVudC5zZXRIYW5kbGVyKCdjYXBhYmlsaXR5JywgKHJlc3BvbnNlKSA9PiB0aGlzLl91bnRhZ2dlZENhcGFiaWxpdHlIYW5kbGVyKHJlc3BvbnNlKSkgLy8gY2FwYWJpbGl0eSB1cGRhdGVzXG4gICAgdGhpcy5jbGllbnQuc2V0SGFuZGxlcignb2snLCAocmVzcG9uc2UpID0+IHRoaXMuX3VudGFnZ2VkT2tIYW5kbGVyKHJlc3BvbnNlKSkgLy8gbm90aWZpY2F0aW9uc1xuICAgIHRoaXMuY2xpZW50LnNldEhhbmRsZXIoJ2V4aXN0cycsIChyZXNwb25zZSkgPT4gdGhpcy5fdW50YWdnZWRFeGlzdHNIYW5kbGVyKHJlc3BvbnNlKSkgLy8gbWVzc2FnZSBjb3VudCBoYXMgY2hhbmdlZFxuICAgIHRoaXMuY2xpZW50LnNldEhhbmRsZXIoJ2V4cHVuZ2UnLCAocmVzcG9uc2UpID0+IHRoaXMuX3VudGFnZ2VkRXhwdW5nZUhhbmRsZXIocmVzcG9uc2UpKSAvLyBtZXNzYWdlIGhhcyBiZWVuIGRlbGV0ZWRcbiAgICB0aGlzLmNsaWVudC5zZXRIYW5kbGVyKCdmZXRjaCcsIChyZXNwb25zZSkgPT4gdGhpcy5fdW50YWdnZWRGZXRjaEhhbmRsZXIocmVzcG9uc2UpKSAvLyBtZXNzYWdlIGhhcyBiZWVuIHVwZGF0ZWQgKGVnLiBmbGFnIGNoYW5nZSlcblxuICAgIC8vIEFjdGl2YXRlIGxvZ2dpbmdcbiAgICB0aGlzLmNyZWF0ZUxvZ2dlcigpXG4gICAgdGhpcy5sb2dMZXZlbCA9IHByb3BPcihMT0dfTEVWRUxfQUxMLCAnbG9nTGV2ZWwnLCBvcHRpb25zKVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCBpZiB0aGUgbG93ZXItbGV2ZWwgSW1hcENsaWVudCBoYXMgZW5jb3VudGVyZWQgYW4gdW5yZWNvdmVyYWJsZVxuICAgKiBlcnJvciBkdXJpbmcgb3BlcmF0aW9uLiBDbGVhbnMgdXAgYW5kIHByb3BhZ2F0ZXMgdGhlIGVycm9yIHVwd2FyZHMuXG4gICAqL1xuICBfb25FcnJvciAoZXJyKSB7XG4gICAgLy8gbWFrZSBzdXJlIG5vIGlkbGUgdGltZW91dCBpcyBwZW5kaW5nIGFueW1vcmVcbiAgICBjbGVhclRpbWVvdXQodGhpcy5faWRsZVRpbWVvdXQpXG5cbiAgICAvLyBwcm9wYWdhdGUgdGhlIGVycm9yIHVwd2FyZHNcbiAgICB0aGlzLm9uZXJyb3IgJiYgdGhpcy5vbmVycm9yKGVycilcbiAgfVxuXG4gIC8vXG4gIC8vXG4gIC8vIFBVQkxJQyBBUElcbiAgLy9cbiAgLy9cblxuICAvKipcbiAgICogSW5pdGlhdGUgY29ubmVjdGlvbiBhbmQgbG9naW4gdG8gdGhlIElNQVAgc2VydmVyXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHdoZW4gbG9naW4gcHJvY2VkdXJlIGlzIGNvbXBsZXRlXG4gICAqL1xuICBhc3luYyBjb25uZWN0ICgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5vcGVuQ29ubmVjdGlvbigpXG4gICAgICBhd2FpdCB0aGlzLnVwZ3JhZGVDb25uZWN0aW9uKClcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMudXBkYXRlSWQodGhpcy5fY2xpZW50SWQpXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybignRmFpbGVkIHRvIHVwZGF0ZSBzZXJ2ZXIgaWQhJywgZXJyLm1lc3NhZ2UpXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMubG9naW4odGhpcy5fYXV0aClcbiAgICAgIGF3YWl0IHRoaXMuY29tcHJlc3NDb25uZWN0aW9uKClcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdDb25uZWN0aW9uIGVzdGFibGlzaGVkLCByZWFkeSB0byByb2xsIScpXG4gICAgICB0aGlzLmNsaWVudC5vbmVycm9yID0gdGhpcy5fb25FcnJvci5iaW5kKHRoaXMpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyJywgZXJyKVxuICAgICAgdGhpcy5jbG9zZShlcnIpIC8vIHdlIGRvbid0IHJlYWxseSBjYXJlIHdoZXRoZXIgdGhpcyB3b3JrcyBvciBub3RcbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWF0ZSBjb25uZWN0aW9uIHRvIHRoZSBJTUFQIHNlcnZlclxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gY2FwYWJpbGl0eSBvZiBzZXJ2ZXIgd2l0aG91dCBsb2dpblxuICAgKi9cbiAgb3BlbkNvbm5lY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBjb25uZWN0aW9uVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG5ldyBFcnJvcignVGltZW91dCBjb25uZWN0aW5nIHRvIHNlcnZlcicpKSwgdGhpcy50aW1lb3V0Q29ubmVjdGlvbilcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdDb25uZWN0aW5nIHRvJywgdGhpcy5jbGllbnQuaG9zdCwgJzonLCB0aGlzLmNsaWVudC5wb3J0KVxuICAgICAgdGhpcy5fY2hhbmdlU3RhdGUoU1RBVEVfQ09OTkVDVElORylcbiAgICAgIHRoaXMuY2xpZW50LmNvbm5lY3QoKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ1NvY2tldCBvcGVuZWQsIHdhaXRpbmcgZm9yIGdyZWV0aW5nIGZyb20gdGhlIHNlcnZlci4uLicpXG5cbiAgICAgICAgdGhpcy5jbGllbnQub25yZWFkeSA9ICgpID0+IHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoY29ubmVjdGlvblRpbWVvdXQpXG4gICAgICAgICAgdGhpcy5fY2hhbmdlU3RhdGUoU1RBVEVfTk9UX0FVVEhFTlRJQ0FURUQpXG4gICAgICAgICAgdGhpcy51cGRhdGVDYXBhYmlsaXR5KClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHJlc29sdmUodGhpcy5fY2FwYWJpbGl0eSkpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNsaWVudC5vbmVycm9yID0gKGVycikgPT4ge1xuICAgICAgICAgIGNsZWFyVGltZW91dChjb25uZWN0aW9uVGltZW91dClcbiAgICAgICAgICByZWplY3QoZXJyKVxuICAgICAgICB9XG4gICAgICB9KS5jYXRjaChyZWplY3QpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dvdXRcbiAgICpcbiAgICogU2VuZCBMT0dPVVQsIHRvIHdoaWNoIHRoZSBzZXJ2ZXIgcmVzcG9uZHMgYnkgY2xvc2luZyB0aGUgY29ubmVjdGlvbi5cbiAgICogVXNlIGlzIGRpc2NvdXJhZ2VkIGlmIG5ldHdvcmsgc3RhdHVzIGlzIHVuY2xlYXIhIElmIG5ldHdvcmtzIHN0YXR1cyBpc1xuICAgKiB1bmNsZWFyLCBwbGVhc2UgdXNlICNjbG9zZSBpbnN0ZWFkIVxuICAgKlxuICAgKiBMT0dPVVQgZGV0YWlsczpcbiAgICogICBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzUwMSNzZWN0aW9uLTYuMS4zXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBSZXNvbHZlcyB3aGVuIHNlcnZlciBoYXMgY2xvc2VkIHRoZSBjb25uZWN0aW9uXG4gICAqL1xuICBhc3luYyBsb2dvdXQgKCkge1xuICAgIHRoaXMuX2NoYW5nZVN0YXRlKFNUQVRFX0xPR09VVClcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTG9nZ2luZyBvdXQuLi4nKVxuICAgIGF3YWl0IHRoaXMuY2xpZW50LmxvZ291dCgpXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX2lkbGVUaW1lb3V0KVxuICB9XG5cbiAgLyoqXG4gICAqIEZvcmNlLWNsb3NlcyB0aGUgY3VycmVudCBjb25uZWN0aW9uIGJ5IGNsb3NpbmcgdGhlIFRDUCBzb2NrZXQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBSZXNvbHZlcyB3aGVuIHNvY2tldCBpcyBjbG9zZWRcbiAgICovXG4gIGFzeW5jIGNsb3NlIChlcnIpIHtcbiAgICB0aGlzLl9jaGFuZ2VTdGF0ZShTVEFURV9MT0dPVVQpXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX2lkbGVUaW1lb3V0KVxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdDbG9zaW5nIGNvbm5lY3Rpb24uLi4nKVxuICAgIGF3YWl0IHRoaXMuY2xpZW50LmNsb3NlKGVycilcbiAgICBjbGVhclRpbWVvdXQodGhpcy5faWRsZVRpbWVvdXQpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBJRCBjb21tYW5kLCBwYXJzZXMgSUQgcmVzcG9uc2UsIHNldHMgdGhpcy5zZXJ2ZXJJZFxuICAgKlxuICAgKiBJRCBkZXRhaWxzOlxuICAgKiAgIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzI5NzFcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IGlkIElEIGFzIEpTT04gb2JqZWN0LiBTZWUgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjk3MSNzZWN0aW9uLTMuMyBmb3IgcG9zc2libGUgdmFsdWVzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBSZXNvbHZlcyB3aGVuIHJlc3BvbnNlIGhhcyBiZWVuIHBhcnNlZFxuICAgKi9cbiAgYXN5bmMgdXBkYXRlSWQgKGlkKSB7XG4gICAgaWYgKHRoaXMuX2NhcGFiaWxpdHkuaW5kZXhPZignSUQnKSA8IDApIHJldHVyblxuXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ1VwZGF0aW5nIGlkLi4uJylcblxuICAgIGNvbnN0IGNvbW1hbmQgPSAnSUQnXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IGlkID8gW2ZsYXR0ZW4oT2JqZWN0LmVudHJpZXMoaWQpKV0gOiBbbnVsbF1cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZXhlYyh7IGNvbW1hbmQsIGF0dHJpYnV0ZXMgfSwgJ0lEJylcbiAgICBjb25zdCBsaXN0ID0gZmxhdHRlbihwYXRoT3IoW10sIFsncGF5bG9hZCcsICdJRCcsICcwJywgJ2F0dHJpYnV0ZXMnLCAnMCddLCByZXNwb25zZSkubWFwKE9iamVjdC52YWx1ZXMpKVxuICAgIGNvbnN0IGtleXMgPSBsaXN0LmZpbHRlcigoXywgaSkgPT4gaSAlIDIgPT09IDApXG4gICAgY29uc3QgdmFsdWVzID0gbGlzdC5maWx0ZXIoKF8sIGkpID0+IGkgJSAyID09PSAxKVxuICAgIHRoaXMuc2VydmVySWQgPSBmcm9tUGFpcnMoemlwKGtleXMsIHZhbHVlcykpXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ1NlcnZlciBpZCB1cGRhdGVkIScsIHRoaXMuc2VydmVySWQpXG4gIH1cblxuICBfc2hvdWxkU2VsZWN0TWFpbGJveCAocGF0aCwgY3R4KSB7XG4gICAgaWYgKCFjdHgpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgY29uc3QgcHJldmlvdXNTZWxlY3QgPSB0aGlzLmNsaWVudC5nZXRQcmV2aW91c2x5UXVldWVkKFsnU0VMRUNUJywgJ0VYQU1JTkUnXSwgY3R4KVxuICAgIGlmIChwcmV2aW91c1NlbGVjdCAmJiBwcmV2aW91c1NlbGVjdC5yZXF1ZXN0LmF0dHJpYnV0ZXMpIHtcbiAgICAgIGNvbnN0IHBhdGhBdHRyaWJ1dGUgPSBwcmV2aW91c1NlbGVjdC5yZXF1ZXN0LmF0dHJpYnV0ZXMuZmluZCgoYXR0cmlidXRlKSA9PiBhdHRyaWJ1dGUudHlwZSA9PT0gJ1NUUklORycpXG4gICAgICBpZiAocGF0aEF0dHJpYnV0ZSkge1xuICAgICAgICByZXR1cm4gcGF0aEF0dHJpYnV0ZS52YWx1ZSAhPT0gcGF0aFxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZE1haWxib3ggIT09IHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIFNFTEVDVCBvciBFWEFNSU5FIHRvIG9wZW4gYSBtYWlsYm94XG4gICAqXG4gICAqIFNFTEVDVCBkZXRhaWxzOlxuICAgKiAgIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM1MDEjc2VjdGlvbi02LjMuMVxuICAgKiBFWEFNSU5FIGRldGFpbHM6XG4gICAqICAgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzUwMSNzZWN0aW9uLTYuMy4yXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoIEZ1bGwgcGF0aCB0byBtYWlsYm94XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gT3B0aW9ucyBvYmplY3RcbiAgICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2Ugd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VsZWN0ZWQgbWFpbGJveFxuICAgKi9cbiAgYXN5bmMgc2VsZWN0TWFpbGJveCAocGF0aCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgcXVlcnkgPSB7XG4gICAgICBjb21tYW5kOiBvcHRpb25zLnJlYWRPbmx5ID8gJ0VYQU1JTkUnIDogJ1NFTEVDVCcsXG4gICAgICBhdHRyaWJ1dGVzOiBbeyB0eXBlOiAnU1RSSU5HJywgdmFsdWU6IHBhdGggfV1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5jb25kc3RvcmUgJiYgdGhpcy5fY2FwYWJpbGl0eS5pbmRleE9mKCdDT05EU1RPUkUnKSA+PSAwKSB7XG4gICAgICBxdWVyeS5hdHRyaWJ1dGVzLnB1c2goW3sgdHlwZTogJ0FUT00nLCB2YWx1ZTogJ0NPTkRTVE9SRScgfV0pXG4gICAgfVxuXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ09wZW5pbmcnLCBwYXRoLCAnLi4uJylcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZXhlYyhxdWVyeSwgWydFWElTVFMnLCAnRkxBR1MnLCAnT0snXSwgeyBjdHg6IG9wdGlvbnMuY3R4IH0pXG4gICAgY29uc3QgbWFpbGJveEluZm8gPSBwYXJzZVNFTEVDVChyZXNwb25zZSlcblxuICAgIHRoaXMuX2NoYW5nZVN0YXRlKFNUQVRFX1NFTEVDVEVEKVxuXG4gICAgaWYgKHRoaXMuX3NlbGVjdGVkTWFpbGJveCAhPT0gcGF0aCAmJiB0aGlzLm9uY2xvc2VtYWlsYm94KSB7XG4gICAgICBhd2FpdCB0aGlzLm9uY2xvc2VtYWlsYm94KHRoaXMuX3NlbGVjdGVkTWFpbGJveClcbiAgICB9XG4gICAgdGhpcy5fc2VsZWN0ZWRNYWlsYm94ID0gcGF0aFxuICAgIGlmICh0aGlzLm9uc2VsZWN0bWFpbGJveCkge1xuICAgICAgYXdhaXQgdGhpcy5vbnNlbGVjdG1haWxib3gocGF0aCwgbWFpbGJveEluZm8pXG4gICAgfVxuXG4gICAgcmV0dXJuIG1haWxib3hJbmZvXG4gIH1cblxuICAvKipcbiAgICogUnVucyBOQU1FU1BBQ0UgY29tbWFuZFxuICAgKlxuICAgKiBOQU1FU1BBQ0UgZGV0YWlsczpcbiAgICogICBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjM0MlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSB3aXRoIG5hbWVzcGFjZSBvYmplY3RcbiAgICovXG4gIGFzeW5jIGxpc3ROYW1lc3BhY2VzICgpIHtcbiAgICBpZiAodGhpcy5fY2FwYWJpbGl0eS5pbmRleE9mKCdOQU1FU1BBQ0UnKSA8IDApIHJldHVybiBmYWxzZVxuXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ0xpc3RpbmcgbmFtZXNwYWNlcy4uLicpXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmV4ZWMoJ05BTUVTUEFDRScsICdOQU1FU1BBQ0UnKVxuICAgIHJldHVybiBwYXJzZU5BTUVTUEFDRShyZXNwb25zZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIExJU1QgYW5kIExTVUIgY29tbWFuZHMuIFJldHJpZXZlcyBhIHRyZWUgb2YgYXZhaWxhYmxlIG1haWxib3hlc1xuICAgKlxuICAgKiBMSVNUIGRldGFpbHM6XG4gICAqICAgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzUwMSNzZWN0aW9uLTYuMy44XG4gICAqIExTVUIgZGV0YWlsczpcbiAgICogICBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNTAxI3NlY3Rpb24tNi4zLjlcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2Ugd2l0aCBsaXN0IG9mIG1haWxib3hlc1xuICAgKi9cbiAgYXN5bmMgbGlzdE1haWxib3hlcyAoKSB7XG4gICAgY29uc3QgdHJlZSA9IHsgcm9vdDogdHJ1ZSwgY2hpbGRyZW46IFtdIH1cblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdMaXN0aW5nIG1haWxib3hlcy4uLicpXG4gICAgY29uc3QgbGlzdFJlc3BvbnNlID0gYXdhaXQgdGhpcy5leGVjKHsgY29tbWFuZDogJ0xJU1QnLCBhdHRyaWJ1dGVzOiBbJycsICcqJ10gfSwgJ0xJU1QnKVxuICAgIGNvbnN0IGxpc3QgPSBwYXRoT3IoW10sIFsncGF5bG9hZCcsICdMSVNUJ10sIGxpc3RSZXNwb25zZSlcbiAgICBsaXN0LmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBjb25zdCBhdHRyID0gcHJvcE9yKFtdLCAnYXR0cmlidXRlcycsIGl0ZW0pXG4gICAgICBpZiAoYXR0ci5sZW5ndGggPCAzKSByZXR1cm5cblxuICAgICAgY29uc3QgcGF0aCA9IHBhdGhPcignJywgWycyJywgJ3ZhbHVlJ10sIGF0dHIpXG4gICAgICBjb25zdCBkZWxpbSA9IHBhdGhPcignLycsIFsnMScsICd2YWx1ZSddLCBhdHRyKVxuICAgICAgY29uc3QgYnJhbmNoID0gdGhpcy5fZW5zdXJlUGF0aCh0cmVlLCBwYXRoLCBkZWxpbSlcbiAgICAgIGJyYW5jaC5mbGFncyA9IHByb3BPcihbXSwgJzAnLCBhdHRyKS5tYXAoKHsgdmFsdWUgfSkgPT4gdmFsdWUgfHwgJycpXG4gICAgICBicmFuY2gubGlzdGVkID0gdHJ1ZVxuICAgICAgY2hlY2tTcGVjaWFsVXNlKGJyYW5jaClcbiAgICB9KVxuXG4gICAgY29uc3QgbHN1YlJlc3BvbnNlID0gYXdhaXQgdGhpcy5leGVjKHsgY29tbWFuZDogJ0xTVUInLCBhdHRyaWJ1dGVzOiBbJycsICcqJ10gfSwgJ0xTVUInKVxuICAgIGNvbnN0IGxzdWIgPSBwYXRoT3IoW10sIFsncGF5bG9hZCcsICdMU1VCJ10sIGxzdWJSZXNwb25zZSlcbiAgICBsc3ViLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGF0dHIgPSBwcm9wT3IoW10sICdhdHRyaWJ1dGVzJywgaXRlbSlcbiAgICAgIGlmIChhdHRyLmxlbmd0aCA8IDMpIHJldHVyblxuXG4gICAgICBjb25zdCBwYXRoID0gcGF0aE9yKCcnLCBbJzInLCAndmFsdWUnXSwgYXR0cilcbiAgICAgIGNvbnN0IGRlbGltID0gcGF0aE9yKCcvJywgWycxJywgJ3ZhbHVlJ10sIGF0dHIpXG4gICAgICBjb25zdCBicmFuY2ggPSB0aGlzLl9lbnN1cmVQYXRoKHRyZWUsIHBhdGgsIGRlbGltKVxuICAgICAgcHJvcE9yKFtdLCAnMCcsIGF0dHIpLm1hcCgoZmxhZyA9ICcnKSA9PiB7IGJyYW5jaC5mbGFncyA9IHVuaW9uKGJyYW5jaC5mbGFncywgW2ZsYWddKSB9KVxuICAgICAgYnJhbmNoLnN1YnNjcmliZWQgPSB0cnVlXG4gICAgfSlcblxuICAgIHJldHVybiB0cmVlXG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbWFpbGJveCB3aXRoIHRoZSBnaXZlbiBwYXRoLlxuICAgKlxuICAgKiBDUkVBVEUgZGV0YWlsczpcbiAgICogICBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNTAxI3NlY3Rpb24tNi4zLjNcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGhcbiAgICogICAgIFRoZSBwYXRoIG9mIHRoZSBtYWlsYm94IHlvdSB3b3VsZCBsaWtlIHRvIGNyZWF0ZS4gIFRoaXMgbWV0aG9kIHdpbGxcbiAgICogICAgIGhhbmRsZSB1dGY3IGVuY29kaW5nIGZvciB5b3UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKiAgICAgUHJvbWlzZSByZXNvbHZlcyBpZiBtYWlsYm94IHdhcyBjcmVhdGVkLlxuICAgKiAgICAgSW4gdGhlIGV2ZW50IHRoZSBzZXJ2ZXIgc2F5cyBOTyBbQUxSRUFEWUVYSVNUU10sIHdlIHRyZWF0IHRoYXQgYXMgc3VjY2Vzcy5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZU1haWxib3ggKHBhdGgpIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnQ3JlYXRpbmcgbWFpbGJveCcsIHBhdGgsICcuLi4nKVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmV4ZWMoeyBjb21tYW5kOiAnQ1JFQVRFJywgYXR0cmlidXRlczogW2ltYXBFbmNvZGUocGF0aCldIH0pXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyICYmIGVyci5jb2RlID09PSAnQUxSRUFEWUVYSVNUUycpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEgbWFpbGJveCB3aXRoIHRoZSBnaXZlbiBwYXRoLlxuICAgKlxuICAgKiBERUxFVEUgZGV0YWlsczpcbiAgICogICBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzUwMSNzZWN0aW9uLTYuMy40XG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gICAqICAgICBUaGUgcGF0aCBvZiB0aGUgbWFpbGJveCB5b3Ugd291bGQgbGlrZSB0byBkZWxldGUuICBUaGlzIG1ldGhvZCB3aWxsXG4gICAqICAgICBoYW5kbGUgdXRmNyBlbmNvZGluZyBmb3IgeW91LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICogICAgIFByb21pc2UgcmVzb2x2ZXMgaWYgbWFpbGJveCB3YXMgZGVsZXRlZC5cbiAgICovXG4gIGRlbGV0ZU1haWxib3ggKHBhdGgpIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnRGVsZXRpbmcgbWFpbGJveCcsIHBhdGgsICcuLi4nKVxuICAgIHJldHVybiB0aGlzLmV4ZWMoeyBjb21tYW5kOiAnREVMRVRFJywgYXR0cmlidXRlczogW2ltYXBFbmNvZGUocGF0aCldIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBGRVRDSCBjb21tYW5kXG4gICAqXG4gICAqIEZFVENIIGRldGFpbHM6XG4gICAqICAgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzUwMSNzZWN0aW9uLTYuNC41XG4gICAqIENIQU5HRURTSU5DRSBkZXRhaWxzOlxuICAgKiAgIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0NTUxI3NlY3Rpb24tMy4zXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoIFRoZSBwYXRoIGZvciB0aGUgbWFpbGJveCB3aGljaCBzaG91bGQgYmUgc2VsZWN0ZWQgZm9yIHRoZSBjb21tYW5kLiBTZWxlY3RzIG1haWxib3ggaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzZXF1ZW5jZSBTZXF1ZW5jZSBzZXQsIGVnIDE6KiBmb3IgYWxsIG1lc3NhZ2VzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbaXRlbXNdIE1lc3NhZ2UgZGF0YSBpdGVtIG5hbWVzIG9yIG1hY3JvXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gUXVlcnkgbW9kaWZpZXJzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHdpdGggdGhlIGZldGNoZWQgbWVzc2FnZSBpbmZvXG4gICAqL1xuICBhc3luYyBsaXN0TWVzc2FnZXMgKHBhdGgsIHNlcXVlbmNlLCBpdGVtcyA9IFt7IGZhc3Q6IHRydWUgfV0sIG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdGZXRjaGluZyBtZXNzYWdlcycsIHNlcXVlbmNlLCAnZnJvbScsIHBhdGgsICcuLi4nKVxuICAgIGNvbnN0IGNvbW1hbmQgPSBidWlsZEZFVENIQ29tbWFuZChzZXF1ZW5jZSwgaXRlbXMsIG9wdGlvbnMpXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmV4ZWMoY29tbWFuZCwgJ0ZFVENIJywge1xuICAgICAgcHJlY2hlY2s6IChjdHgpID0+IHRoaXMuX3Nob3VsZFNlbGVjdE1haWxib3gocGF0aCwgY3R4KSA/IHRoaXMuc2VsZWN0TWFpbGJveChwYXRoLCB7IGN0eCB9KSA6IFByb21pc2UucmVzb2x2ZSgpXG4gICAgfSlcbiAgICByZXR1cm4gcGFyc2VGRVRDSChyZXNwb25zZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIFNFQVJDSCBjb21tYW5kXG4gICAqXG4gICAqIFNFQVJDSCBkZXRhaWxzOlxuICAgKiAgIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM1MDEjc2VjdGlvbi02LjQuNFxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGF0aCBUaGUgcGF0aCBmb3IgdGhlIG1haWxib3ggd2hpY2ggc2hvdWxkIGJlIHNlbGVjdGVkIGZvciB0aGUgY29tbWFuZC4gU2VsZWN0cyBtYWlsYm94IGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0ge09iamVjdH0gcXVlcnkgU2VhcmNoIHRlcm1zXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gUXVlcnkgbW9kaWZpZXJzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHdpdGggdGhlIGFycmF5IG9mIG1hdGNoaW5nIHNlcS4gb3IgdWlkIG51bWJlcnNcbiAgICovXG4gIGFzeW5jIHNlYXJjaCAocGF0aCwgcXVlcnksIG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdTZWFyY2hpbmcgaW4nLCBwYXRoLCAnLi4uJylcbiAgICBjb25zdCBjb21tYW5kID0gYnVpbGRTRUFSQ0hDb21tYW5kKHF1ZXJ5LCBvcHRpb25zKVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5leGVjKGNvbW1hbmQsICdTRUFSQ0gnLCB7XG4gICAgICBwcmVjaGVjazogKGN0eCkgPT4gdGhpcy5fc2hvdWxkU2VsZWN0TWFpbGJveChwYXRoLCBjdHgpID8gdGhpcy5zZWxlY3RNYWlsYm94KHBhdGgsIHsgY3R4IH0pIDogUHJvbWlzZS5yZXNvbHZlKClcbiAgICB9KVxuICAgIHJldHVybiBwYXJzZVNFQVJDSChyZXNwb25zZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIFNUT1JFIGNvbW1hbmRcbiAgICpcbiAgICogU1RPUkUgZGV0YWlsczpcbiAgICogICBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNTAxI3NlY3Rpb24tNi40LjZcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggVGhlIHBhdGggZm9yIHRoZSBtYWlsYm94IHdoaWNoIHNob3VsZCBiZSBzZWxlY3RlZCBmb3IgdGhlIGNvbW1hbmQuIFNlbGVjdHMgbWFpbGJveCBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIHtTdHJpbmd9IHNlcXVlbmNlIE1lc3NhZ2Ugc2VsZWN0b3Igd2hpY2ggdGhlIGZsYWcgY2hhbmdlIGlzIGFwcGxpZWQgdG9cbiAgICogQHBhcmFtIHtBcnJheX0gZmxhZ3NcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBRdWVyeSBtb2RpZmllcnNcbiAgICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2Ugd2l0aCB0aGUgYXJyYXkgb2YgbWF0Y2hpbmcgc2VxLiBvciB1aWQgbnVtYmVyc1xuICAgKi9cbiAgc2V0RmxhZ3MgKHBhdGgsIHNlcXVlbmNlLCBmbGFncywgb3B0aW9ucykge1xuICAgIGxldCBrZXkgPSAnJ1xuICAgIGxldCBsaXN0ID0gW11cblxuICAgIGlmIChBcnJheS5pc0FycmF5KGZsYWdzKSB8fCB0eXBlb2YgZmxhZ3MgIT09ICdvYmplY3QnKSB7XG4gICAgICBsaXN0ID0gW10uY29uY2F0KGZsYWdzIHx8IFtdKVxuICAgICAga2V5ID0gJydcbiAgICB9IGVsc2UgaWYgKGZsYWdzLmFkZCkge1xuICAgICAgbGlzdCA9IFtdLmNvbmNhdChmbGFncy5hZGQgfHwgW10pXG4gICAgICBrZXkgPSAnKydcbiAgICB9IGVsc2UgaWYgKGZsYWdzLnNldCkge1xuICAgICAga2V5ID0gJydcbiAgICAgIGxpc3QgPSBbXS5jb25jYXQoZmxhZ3Muc2V0IHx8IFtdKVxuICAgIH0gZWxzZSBpZiAoZmxhZ3MucmVtb3ZlKSB7XG4gICAgICBrZXkgPSAnLSdcbiAgICAgIGxpc3QgPSBbXS5jb25jYXQoZmxhZ3MucmVtb3ZlIHx8IFtdKVxuICAgIH1cblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdTZXR0aW5nIGZsYWdzIG9uJywgc2VxdWVuY2UsICdpbicsIHBhdGgsICcuLi4nKVxuICAgIHJldHVybiB0aGlzLnN0b3JlKHBhdGgsIHNlcXVlbmNlLCBrZXkgKyAnRkxBR1MnLCBsaXN0LCBvcHRpb25zKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgU1RPUkUgY29tbWFuZFxuICAgKlxuICAgKiBTVE9SRSBkZXRhaWxzOlxuICAgKiAgIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM1MDEjc2VjdGlvbi02LjQuNlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGF0aCBUaGUgcGF0aCBmb3IgdGhlIG1haWxib3ggd2hpY2ggc2hvdWxkIGJlIHNlbGVjdGVkIGZvciB0aGUgY29tbWFuZC4gU2VsZWN0cyBtYWlsYm94IGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0ge1N0cmluZ30gc2VxdWVuY2UgTWVzc2FnZSBzZWxlY3RvciB3aGljaCB0aGUgZmxhZyBjaGFuZ2UgaXMgYXBwbGllZCB0b1xuICAgKiBAcGFyYW0ge1N0cmluZ30gYWN0aW9uIFNUT1JFIG1ldGhvZCB0byBjYWxsLCBlZyBcIitGTEFHU1wiXG4gICAqIEBwYXJhbSB7QXJyYXl9IGZsYWdzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gUXVlcnkgbW9kaWZpZXJzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHdpdGggdGhlIGFycmF5IG9mIG1hdGNoaW5nIHNlcS4gb3IgdWlkIG51bWJlcnNcbiAgICovXG4gIGFzeW5jIHN0b3JlIChwYXRoLCBzZXF1ZW5jZSwgYWN0aW9uLCBmbGFncywgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgY29tbWFuZCA9IGJ1aWxkU1RPUkVDb21tYW5kKHNlcXVlbmNlLCBhY3Rpb24sIGZsYWdzLCBvcHRpb25zKVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5leGVjKGNvbW1hbmQsICdGRVRDSCcsIHtcbiAgICAgIHByZWNoZWNrOiAoY3R4KSA9PiB0aGlzLl9zaG91bGRTZWxlY3RNYWlsYm94KHBhdGgsIGN0eCkgPyB0aGlzLnNlbGVjdE1haWxib3gocGF0aCwgeyBjdHggfSkgOiBQcm9taXNlLnJlc29sdmUoKVxuICAgIH0pXG4gICAgcmV0dXJuIHBhcnNlRkVUQ0gocmVzcG9uc2UpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBBUFBFTkQgY29tbWFuZFxuICAgKlxuICAgKiBBUFBFTkQgZGV0YWlsczpcbiAgICogICBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNTAxI3NlY3Rpb24tNi4zLjExXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBkZXN0aW5hdGlvbiBUaGUgbWFpbGJveCB3aGVyZSB0byBhcHBlbmQgdGhlIG1lc3NhZ2VcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYXBwZW5kXG4gICAqIEBwYXJhbSB7QXJyYXl9IG9wdGlvbnMuZmxhZ3MgQW55IGZsYWdzIHlvdSB3YW50IHRvIHNldCBvbiB0aGUgdXBsb2FkZWQgbWVzc2FnZS4gRGVmYXVsdHMgdG8gW1xcU2Vlbl0uIChvcHRpb25hbClcbiAgICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2Ugd2l0aCB0aGUgYXJyYXkgb2YgbWF0Y2hpbmcgc2VxLiBvciB1aWQgbnVtYmVyc1xuICAgKi9cbiAgYXN5bmMgdXBsb2FkIChkZXN0aW5hdGlvbiwgbWVzc2FnZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgZmxhZ3MgPSBwcm9wT3IoWydcXFxcU2VlbiddLCAnZmxhZ3MnLCBvcHRpb25zKS5tYXAodmFsdWUgPT4gKHsgdHlwZTogJ2F0b20nLCB2YWx1ZSB9KSlcbiAgICBjb25zdCBjb21tYW5kID0ge1xuICAgICAgY29tbWFuZDogJ0FQUEVORCcsXG4gICAgICBhdHRyaWJ1dGVzOiBbXG4gICAgICAgIHsgdHlwZTogJ2F0b20nLCB2YWx1ZTogZGVzdGluYXRpb24gfSxcbiAgICAgICAgZmxhZ3MsXG4gICAgICAgIHsgdHlwZTogJ2xpdGVyYWwnLCB2YWx1ZTogbWVzc2FnZSB9XG4gICAgICBdXG4gICAgfVxuXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ1VwbG9hZGluZyBtZXNzYWdlIHRvJywgZGVzdGluYXRpb24sICcuLi4nKVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5leGVjKGNvbW1hbmQpXG4gICAgcmV0dXJuIHBhcnNlQVBQRU5EKHJlc3BvbnNlKVxuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgbWVzc2FnZXMgZnJvbSBhIHNlbGVjdGVkIG1haWxib3hcbiAgICpcbiAgICogRVhQVU5HRSBkZXRhaWxzOlxuICAgKiAgIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM1MDEjc2VjdGlvbi02LjQuM1xuICAgKiBVSUQgRVhQVU5HRSBkZXRhaWxzOlxuICAgKiAgIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0MzE1I3NlY3Rpb24tMi4xXG4gICAqXG4gICAqIElmIHBvc3NpYmxlIChieVVpZDp0cnVlIGFuZCBVSURQTFVTIGV4dGVuc2lvbiBzdXBwb3J0ZWQpLCB1c2VzIFVJRCBFWFBVTkdFXG4gICAqIGNvbW1hbmQgdG8gZGVsZXRlIGEgcmFuZ2Ugb2YgbWVzc2FnZXMsIG90aGVyd2lzZSBmYWxscyBiYWNrIHRvIEVYUFVOR0UuXG4gICAqXG4gICAqIE5CISBUaGlzIG1ldGhvZCBtaWdodCBiZSBkZXN0cnVjdGl2ZSAtIGlmIEVYUFVOR0UgaXMgdXNlZCwgdGhlbiBhbnkgbWVzc2FnZXNcbiAgICogd2l0aCBcXERlbGV0ZWQgZmxhZyBzZXQgYXJlIGRlbGV0ZWRcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggVGhlIHBhdGggZm9yIHRoZSBtYWlsYm94IHdoaWNoIHNob3VsZCBiZSBzZWxlY3RlZCBmb3IgdGhlIGNvbW1hbmQuIFNlbGVjdHMgbWFpbGJveCBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIHtTdHJpbmd9IHNlcXVlbmNlIE1lc3NhZ2UgcmFuZ2UgdG8gYmUgZGVsZXRlZFxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIFF1ZXJ5IG1vZGlmaWVyc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZVxuICAgKi9cbiAgYXN5bmMgZGVsZXRlTWVzc2FnZXMgKHBhdGgsIHNlcXVlbmNlLCBvcHRpb25zID0ge30pIHtcbiAgICAvLyBhZGQgXFxEZWxldGVkIGZsYWcgdG8gdGhlIG1lc3NhZ2VzIGFuZCBydW4gRVhQVU5HRSBvciBVSUQgRVhQVU5HRVxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdEZWxldGluZyBtZXNzYWdlcycsIHNlcXVlbmNlLCAnaW4nLCBwYXRoLCAnLi4uJylcbiAgICBjb25zdCB1c2VVaWRQbHVzID0gb3B0aW9ucy5ieVVpZCAmJiB0aGlzLl9jYXBhYmlsaXR5LmluZGV4T2YoJ1VJRFBMVVMnKSA+PSAwXG4gICAgY29uc3QgdWlkRXhwdW5nZUNvbW1hbmQgPSB7IGNvbW1hbmQ6ICdVSUQgRVhQVU5HRScsIGF0dHJpYnV0ZXM6IFt7IHR5cGU6ICdzZXF1ZW5jZScsIHZhbHVlOiBzZXF1ZW5jZSB9XSB9XG4gICAgYXdhaXQgdGhpcy5zZXRGbGFncyhwYXRoLCBzZXF1ZW5jZSwgeyBhZGQ6ICdcXFxcRGVsZXRlZCcgfSwgb3B0aW9ucylcbiAgICBjb25zdCBjbWQgPSB1c2VVaWRQbHVzID8gdWlkRXhwdW5nZUNvbW1hbmQgOiAnRVhQVU5HRSdcbiAgICByZXR1cm4gdGhpcy5leGVjKGNtZCwgbnVsbCwge1xuICAgICAgcHJlY2hlY2s6IChjdHgpID0+IHRoaXMuX3Nob3VsZFNlbGVjdE1haWxib3gocGF0aCwgY3R4KSA/IHRoaXMuc2VsZWN0TWFpbGJveChwYXRoLCB7IGN0eCB9KSA6IFByb21pc2UucmVzb2x2ZSgpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3BpZXMgYSByYW5nZSBvZiBtZXNzYWdlcyBmcm9tIHRoZSBhY3RpdmUgbWFpbGJveCB0byB0aGUgZGVzdGluYXRpb24gbWFpbGJveC5cbiAgICogU2lsZW50IG1ldGhvZCAodW5sZXNzIGFuIGVycm9yIG9jY3VycyksIGJ5IGRlZmF1bHQgcmV0dXJucyBubyBpbmZvcm1hdGlvbi5cbiAgICpcbiAgICogQ09QWSBkZXRhaWxzOlxuICAgKiAgIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM1MDEjc2VjdGlvbi02LjQuN1xuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGF0aCBUaGUgcGF0aCBmb3IgdGhlIG1haWxib3ggd2hpY2ggc2hvdWxkIGJlIHNlbGVjdGVkIGZvciB0aGUgY29tbWFuZC4gU2VsZWN0cyBtYWlsYm94IGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0ge1N0cmluZ30gc2VxdWVuY2UgTWVzc2FnZSByYW5nZSB0byBiZSBjb3BpZWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IGRlc3RpbmF0aW9uIERlc3RpbmF0aW9uIG1haWxib3ggcGF0aFxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIFF1ZXJ5IG1vZGlmaWVyc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmJ5VWlkXSBJZiB0cnVlLCB1c2VzIFVJRCBDT1BZIGluc3RlYWQgb2YgQ09QWVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZVxuICAgKi9cbiAgYXN5bmMgY29weU1lc3NhZ2VzIChwYXRoLCBzZXF1ZW5jZSwgZGVzdGluYXRpb24sIG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdDb3B5aW5nIG1lc3NhZ2VzJywgc2VxdWVuY2UsICdmcm9tJywgcGF0aCwgJ3RvJywgZGVzdGluYXRpb24sICcuLi4nKVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5leGVjKHtcbiAgICAgIGNvbW1hbmQ6IG9wdGlvbnMuYnlVaWQgPyAnVUlEIENPUFknIDogJ0NPUFknLFxuICAgICAgYXR0cmlidXRlczogW1xuICAgICAgICB7IHR5cGU6ICdzZXF1ZW5jZScsIHZhbHVlOiBzZXF1ZW5jZSB9LFxuICAgICAgICB7IHR5cGU6ICdhdG9tJywgdmFsdWU6IGRlc3RpbmF0aW9uIH1cbiAgICAgIF1cbiAgICB9LCBudWxsLCB7XG4gICAgICBwcmVjaGVjazogKGN0eCkgPT4gdGhpcy5fc2hvdWxkU2VsZWN0TWFpbGJveChwYXRoLCBjdHgpID8gdGhpcy5zZWxlY3RNYWlsYm94KHBhdGgsIHsgY3R4IH0pIDogUHJvbWlzZS5yZXNvbHZlKClcbiAgICB9KVxuICAgIHJldHVybiBwYXJzZUNPUFkocmVzcG9uc2UpXG4gIH1cblxuICAvKipcbiAgICogTW92ZXMgYSByYW5nZSBvZiBtZXNzYWdlcyBmcm9tIHRoZSBhY3RpdmUgbWFpbGJveCB0byB0aGUgZGVzdGluYXRpb24gbWFpbGJveC5cbiAgICogUHJlZmVycyB0aGUgTU9WRSBleHRlbnNpb24gYnV0IGlmIG5vdCBhdmFpbGFibGUsIGZhbGxzIGJhY2sgdG9cbiAgICogQ09QWSArIEVYUFVOR0VcbiAgICpcbiAgICogTU9WRSBkZXRhaWxzOlxuICAgKiAgIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY4NTFcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggVGhlIHBhdGggZm9yIHRoZSBtYWlsYm94IHdoaWNoIHNob3VsZCBiZSBzZWxlY3RlZCBmb3IgdGhlIGNvbW1hbmQuIFNlbGVjdHMgbWFpbGJveCBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIHtTdHJpbmd9IHNlcXVlbmNlIE1lc3NhZ2UgcmFuZ2UgdG8gYmUgbW92ZWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IGRlc3RpbmF0aW9uIERlc3RpbmF0aW9uIG1haWxib3ggcGF0aFxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIFF1ZXJ5IG1vZGlmaWVyc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZVxuICAgKi9cbiAgYXN5bmMgbW92ZU1lc3NhZ2VzIChwYXRoLCBzZXF1ZW5jZSwgZGVzdGluYXRpb24sIG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdNb3ZpbmcgbWVzc2FnZXMnLCBzZXF1ZW5jZSwgJ2Zyb20nLCBwYXRoLCAndG8nLCBkZXN0aW5hdGlvbiwgJy4uLicpXG5cbiAgICBpZiAodGhpcy5fY2FwYWJpbGl0eS5pbmRleE9mKCdNT1ZFJykgPT09IC0xKSB7XG4gICAgICAvLyBGYWxsYmFjayB0byBDT1BZICsgRVhQVU5HRVxuICAgICAgYXdhaXQgdGhpcy5jb3B5TWVzc2FnZXMocGF0aCwgc2VxdWVuY2UsIGRlc3RpbmF0aW9uLCBvcHRpb25zKVxuICAgICAgcmV0dXJuIHRoaXMuZGVsZXRlTWVzc2FnZXMocGF0aCwgc2VxdWVuY2UsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgLy8gSWYgcG9zc2libGUsIHVzZSBNT1ZFXG4gICAgcmV0dXJuIHRoaXMuZXhlYyh7XG4gICAgICBjb21tYW5kOiBvcHRpb25zLmJ5VWlkID8gJ1VJRCBNT1ZFJyA6ICdNT1ZFJyxcbiAgICAgIGF0dHJpYnV0ZXM6IFtcbiAgICAgICAgeyB0eXBlOiAnc2VxdWVuY2UnLCB2YWx1ZTogc2VxdWVuY2UgfSxcbiAgICAgICAgeyB0eXBlOiAnYXRvbScsIHZhbHVlOiBkZXN0aW5hdGlvbiB9XG4gICAgICBdXG4gICAgfSwgWydPSyddLCB7XG4gICAgICBwcmVjaGVjazogKGN0eCkgPT4gdGhpcy5fc2hvdWxkU2VsZWN0TWFpbGJveChwYXRoLCBjdHgpID8gdGhpcy5zZWxlY3RNYWlsYm94KHBhdGgsIHsgY3R4IH0pIDogUHJvbWlzZS5yZXNvbHZlKClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgQ09NUFJFU1MgY29tbWFuZFxuICAgKlxuICAgKiBDT01QUkVTUyBkZXRhaWxzOlxuICAgKiAgIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0OTc4XG4gICAqL1xuICBhc3luYyBjb21wcmVzc0Nvbm5lY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5fZW5hYmxlQ29tcHJlc3Npb24gfHwgdGhpcy5fY2FwYWJpbGl0eS5pbmRleE9mKCdDT01QUkVTUz1ERUZMQVRFJykgPCAwIHx8IHRoaXMuY2xpZW50LmNvbXByZXNzZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdFbmFibGluZyBjb21wcmVzc2lvbi4uLicpXG4gICAgYXdhaXQgdGhpcy5leGVjKHtcbiAgICAgIGNvbW1hbmQ6ICdDT01QUkVTUycsXG4gICAgICBhdHRyaWJ1dGVzOiBbe1xuICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgIHZhbHVlOiAnREVGTEFURSdcbiAgICAgIH1dXG4gICAgfSlcbiAgICB0aGlzLmNsaWVudC5lbmFibGVDb21wcmVzc2lvbigpXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ0NvbXByZXNzaW9uIGVuYWJsZWQsIGFsbCBkYXRhIHNlbnQgYW5kIHJlY2VpdmVkIGlzIGRlZmxhdGVkIScpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBMT0dJTiBvciBBVVRIRU5USUNBVEUgWE9BVVRIMiBjb21tYW5kXG4gICAqXG4gICAqIExPR0lOIGRldGFpbHM6XG4gICAqICAgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzUwMSNzZWN0aW9uLTYuMi4zXG4gICAqIFhPQVVUSDIgZGV0YWlsczpcbiAgICogICBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9nbWFpbC94b2F1dGgyX3Byb3RvY29sI2ltYXBfcHJvdG9jb2xfZXhjaGFuZ2VcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGF1dGgudXNlclxuICAgKiBAcGFyYW0ge1N0cmluZ30gYXV0aC5wYXNzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBhdXRoLnhvYXV0aDJcbiAgICovXG4gIGFzeW5jIGxvZ2luIChhdXRoKSB7XG4gICAgbGV0IGNvbW1hbmRcbiAgICBjb25zdCBvcHRpb25zID0ge31cblxuICAgIGlmICghYXV0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBub3QgcHJvdmlkZWQnKVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9jYXBhYmlsaXR5LmluZGV4T2YoJ0FVVEg9WE9BVVRIMicpID49IDAgJiYgYXV0aCAmJiBhdXRoLnhvYXV0aDIpIHtcbiAgICAgIGNvbW1hbmQgPSB7XG4gICAgICAgIGNvbW1hbmQ6ICdBVVRIRU5USUNBVEUnLFxuICAgICAgICBhdHRyaWJ1dGVzOiBbXG4gICAgICAgICAgeyB0eXBlOiAnQVRPTScsIHZhbHVlOiAnWE9BVVRIMicgfSxcbiAgICAgICAgICB7IHR5cGU6ICdBVE9NJywgdmFsdWU6IGJ1aWxkWE9BdXRoMlRva2VuKGF1dGgudXNlciwgYXV0aC54b2F1dGgyKSwgc2Vuc2l0aXZlOiB0cnVlIH1cbiAgICAgICAgXVxuICAgICAgfVxuXG4gICAgICBvcHRpb25zLmVycm9yUmVzcG9uc2VFeHBlY3RzRW1wdHlMaW5lID0gdHJ1ZSAvLyArIHRhZ2dlZCBlcnJvciByZXNwb25zZSBleHBlY3RzIGFuIGVtcHR5IGxpbmUgaW4gcmV0dXJuXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbW1hbmQgPSB7XG4gICAgICAgIGNvbW1hbmQ6ICdsb2dpbicsXG4gICAgICAgIGF0dHJpYnV0ZXM6IFtcbiAgICAgICAgICB7IHR5cGU6ICdTVFJJTkcnLCB2YWx1ZTogYXV0aC51c2VyIHx8ICcnIH0sXG4gICAgICAgICAgeyB0eXBlOiAnU1RSSU5HJywgdmFsdWU6IGF1dGgucGFzcyB8fCAnJywgc2Vuc2l0aXZlOiB0cnVlIH1cbiAgICAgICAgXVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdMb2dnaW5nIGluLi4uJylcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZXhlYyhjb21tYW5kLCAnY2FwYWJpbGl0eScsIG9wdGlvbnMpXG4gICAgLypcbiAgICAgKiB1cGRhdGUgcG9zdC1hdXRoIGNhcGFiaWxpdGVzXG4gICAgICogY2FwYWJpbGl0eSBsaXN0IHNob3VsZG4ndCBjb250YWluIGF1dGggcmVsYXRlZCBzdHVmZiBhbnltb3JlXG4gICAgICogYnV0IHNvbWUgbmV3IGV4dGVuc2lvbnMgbWlnaHQgaGF2ZSBwb3BwZWQgdXAgdGhhdCBkbyBub3RcbiAgICAgKiBtYWtlIG11Y2ggc2Vuc2UgaW4gdGhlIG5vbi1hdXRoIHN0YXRlXG4gICAgICovXG4gICAgaWYgKHJlc3BvbnNlLmNhcGFiaWxpdHkgJiYgcmVzcG9uc2UuY2FwYWJpbGl0eS5sZW5ndGgpIHtcbiAgICAgIC8vIGNhcGFiaWxpdGVzIHdlcmUgbGlzdGVkIHdpdGggdGhlIE9LIFtDQVBBQklMSVRZIC4uLl0gcmVzcG9uc2VcbiAgICAgIHRoaXMuX2NhcGFiaWxpdHkgPSByZXNwb25zZS5jYXBhYmlsaXR5XG4gICAgfSBlbHNlIGlmIChyZXNwb25zZS5wYXlsb2FkICYmIHJlc3BvbnNlLnBheWxvYWQuQ0FQQUJJTElUWSAmJiByZXNwb25zZS5wYXlsb2FkLkNBUEFCSUxJVFkubGVuZ3RoKSB7XG4gICAgICAvLyBjYXBhYmlsaXRlcyB3ZXJlIGxpc3RlZCB3aXRoICogQ0FQQUJJTElUWSAuLi4gcmVzcG9uc2VcbiAgICAgIHRoaXMuX2NhcGFiaWxpdHkgPSByZXNwb25zZS5wYXlsb2FkLkNBUEFCSUxJVFkucG9wKCkuYXR0cmlidXRlcy5tYXAoKGNhcGEgPSAnJykgPT4gY2FwYS52YWx1ZS50b1VwcGVyQ2FzZSgpLnRyaW0oKSlcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY2FwYWJpbGl0aWVzIHdlcmUgbm90IGF1dG9tYXRpY2FsbHkgbGlzdGVkLCByZWxvYWRcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlQ2FwYWJpbGl0eSh0cnVlKVxuICAgIH1cblxuICAgIHRoaXMuX2NoYW5nZVN0YXRlKFNUQVRFX0FVVEhFTlRJQ0FURUQpXG4gICAgdGhpcy5fYXV0aGVudGljYXRlZCA9IHRydWVcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTG9naW4gc3VjY2Vzc2Z1bCwgcG9zdC1hdXRoIGNhcGFiaWxpdGVzIHVwZGF0ZWQhJywgdGhpcy5fY2FwYWJpbGl0eSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gYW4gSU1BUCBjb21tYW5kLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcmVxdWVzdCBTdHJ1Y3R1cmVkIHJlcXVlc3Qgb2JqZWN0XG4gICAqIEBwYXJhbSB7QXJyYXl9IGFjY2VwdFVudGFnZ2VkIGEgbGlzdCBvZiB1bnRhZ2dlZCByZXNwb25zZXMgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIGluICdwYXlsb2FkJyBwcm9wZXJ0eVxuICAgKi9cbiAgYXN5bmMgZXhlYyAocmVxdWVzdCwgYWNjZXB0VW50YWdnZWQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLmJyZWFrSWRsZSgpXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5lbnF1ZXVlQ29tbWFuZChyZXF1ZXN0LCBhY2NlcHRVbnRhZ2dlZCwgb3B0aW9ucylcbiAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UuY2FwYWJpbGl0eSkge1xuICAgICAgdGhpcy5fY2FwYWJpbGl0eSA9IHJlc3BvbnNlLmNhcGFiaWxpdHlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlXG4gIH1cblxuICAvKipcbiAgICogVGhlIGNvbm5lY3Rpb24gaXMgaWRsaW5nLiBTZW5kcyBhIE5PT1Agb3IgSURMRSBjb21tYW5kXG4gICAqXG4gICAqIElETEUgZGV0YWlsczpcbiAgICogICBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjE3N1xuICAgKi9cbiAgZW50ZXJJZGxlICgpIHtcbiAgICBpZiAodGhpcy5fZW50ZXJlZElkbGUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBzdXBwb3J0c0lkbGUgPSB0aGlzLl9jYXBhYmlsaXR5LmluZGV4T2YoJ0lETEUnKSA+PSAwXG4gICAgdGhpcy5fZW50ZXJlZElkbGUgPSBzdXBwb3J0c0lkbGUgJiYgdGhpcy5fc2VsZWN0ZWRNYWlsYm94ID8gJ0lETEUnIDogJ05PT1AnXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ0VudGVyaW5nIGlkbGUgd2l0aCAnICsgdGhpcy5fZW50ZXJlZElkbGUpXG5cbiAgICBpZiAodGhpcy5fZW50ZXJlZElkbGUgPT09ICdOT09QJykge1xuICAgICAgdGhpcy5faWRsZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ1NlbmRpbmcgTk9PUCcpXG4gICAgICAgIHRoaXMuZXhlYygnTk9PUCcpXG4gICAgICB9LCB0aGlzLnRpbWVvdXROb29wKVxuICAgIH0gZWxzZSBpZiAodGhpcy5fZW50ZXJlZElkbGUgPT09ICdJRExFJykge1xuICAgICAgdGhpcy5jbGllbnQuZW5xdWV1ZUNvbW1hbmQoe1xuICAgICAgICBjb21tYW5kOiAnSURMRSdcbiAgICAgIH0pXG4gICAgICB0aGlzLl9pZGxlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmNsaWVudC5zZW5kKCdET05FXFxyXFxuJylcbiAgICAgICAgdGhpcy5fZW50ZXJlZElkbGUgPSBmYWxzZVxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnSWRsZSB0ZXJtaW5hdGVkJylcbiAgICAgIH0sIHRoaXMudGltZW91dElkbGUpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIGFjdGlvbnMgcmVsYXRlZCBpZGxpbmcsIGlmIElETEUgaXMgc3VwcG9ydGVkLCBzZW5kcyBET05FIHRvIHN0b3AgaXRcbiAgICovXG4gIGJyZWFrSWRsZSAoKSB7XG4gICAgaWYgKCF0aGlzLl9lbnRlcmVkSWRsZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX2lkbGVUaW1lb3V0KVxuICAgIGlmICh0aGlzLl9lbnRlcmVkSWRsZSA9PT0gJ0lETEUnKSB7XG4gICAgICB0aGlzLmNsaWVudC5zZW5kKCdET05FXFxyXFxuJylcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdJZGxlIHRlcm1pbmF0ZWQnKVxuICAgIH1cbiAgICB0aGlzLl9lbnRlcmVkSWRsZSA9IGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBTVEFSVFRMUyBjb21tYW5kIGlmIG5lZWRlZFxuICAgKlxuICAgKiBTVEFSVFRMUyBkZXRhaWxzOlxuICAgKiAgIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM1MDEjc2VjdGlvbi02LjIuMVxuICAgKlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtmb3JjZWRdIEJ5IGRlZmF1bHQgdGhlIGNvbW1hbmQgaXMgbm90IHJ1biBpZiBjYXBhYmlsaXR5IGlzIGFscmVhZHkgbGlzdGVkLiBTZXQgdG8gdHJ1ZSB0byBza2lwIHRoaXMgdmFsaWRhdGlvblxuICAgKi9cbiAgYXN5bmMgdXBncmFkZUNvbm5lY3Rpb24gKCkge1xuICAgIC8vIHNraXAgcmVxdWVzdCwgaWYgYWxyZWFkeSBzZWN1cmVkXG4gICAgaWYgKHRoaXMuY2xpZW50LnNlY3VyZU1vZGUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIHNraXAgaWYgU1RBUlRUTFMgbm90IGF2YWlsYWJsZSBvciBzdGFydHRscyBzdXBwb3J0IGRpc2FibGVkXG4gICAgaWYgKCh0aGlzLl9jYXBhYmlsaXR5LmluZGV4T2YoJ1NUQVJUVExTJykgPCAwIHx8IHRoaXMuX2lnbm9yZVRMUykgJiYgIXRoaXMuX3JlcXVpcmVUTFMpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdFbmNyeXB0aW5nIGNvbm5lY3Rpb24uLi4nKVxuICAgIGF3YWl0IHRoaXMuZXhlYygnU1RBUlRUTFMnKVxuICAgIHRoaXMuX2NhcGFiaWxpdHkgPSBbXVxuICAgIHRoaXMuY2xpZW50LnVwZ3JhZGUoKVxuICAgIHJldHVybiB0aGlzLnVwZGF0ZUNhcGFiaWxpdHkoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgQ0FQQUJJTElUWSBjb21tYW5kXG4gICAqXG4gICAqIENBUEFCSUxJVFkgZGV0YWlsczpcbiAgICogICBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNTAxI3NlY3Rpb24tNi4xLjFcbiAgICpcbiAgICogRG9lc24ndCByZWdpc3RlciB1bnRhZ2dlZCBDQVBBQklMSVRZIGhhbmRsZXIgYXMgdGhpcyBpcyBhbHJlYWR5XG4gICAqIGhhbmRsZWQgYnkgZ2xvYmFsIGhhbmRsZXJcbiAgICpcbiAgICogQHBhcmFtIHtCb29sZWFufSBbZm9yY2VkXSBCeSBkZWZhdWx0IHRoZSBjb21tYW5kIGlzIG5vdCBydW4gaWYgY2FwYWJpbGl0eSBpcyBhbHJlYWR5IGxpc3RlZC4gU2V0IHRvIHRydWUgdG8gc2tpcCB0aGlzIHZhbGlkYXRpb25cbiAgICovXG4gIGFzeW5jIHVwZGF0ZUNhcGFiaWxpdHkgKGZvcmNlZCkge1xuICAgIC8vIHNraXAgcmVxdWVzdCwgaWYgbm90IGZvcmNlZCB1cGRhdGUgYW5kIGNhcGFiaWxpdGllcyBhcmUgYWxyZWFkeSBsb2FkZWRcbiAgICBpZiAoIWZvcmNlZCAmJiB0aGlzLl9jYXBhYmlsaXR5Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gSWYgU1RBUlRUTFMgaXMgcmVxdWlyZWQgdGhlbiBza2lwIGNhcGFiaWxpdHkgbGlzdGluZyBhcyB3ZSBhcmUgZ29pbmcgdG8gdHJ5XG4gICAgLy8gU1RBUlRUTFMgYW55d2F5IGFuZCB3ZSByZS1jaGVjayBjYXBhYmlsaXRpZXMgYWZ0ZXIgY29ubmVjdGlvbiBpcyBzZWN1cmVkXG4gICAgaWYgKCF0aGlzLmNsaWVudC5zZWN1cmVNb2RlICYmIHRoaXMuX3JlcXVpcmVUTFMpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdVcGRhdGluZyBjYXBhYmlsaXR5Li4uJylcbiAgICByZXR1cm4gdGhpcy5leGVjKCdDQVBBQklMSVRZJylcbiAgfVxuXG4gIGhhc0NhcGFiaWxpdHkgKGNhcGEgPSAnJykge1xuICAgIHJldHVybiB0aGlzLl9jYXBhYmlsaXR5LmluZGV4T2YoY2FwYS50b1VwcGVyQ2FzZSgpLnRyaW0oKSkgPj0gMFxuICB9XG5cbiAgLy8gRGVmYXVsdCBoYW5kbGVycyBmb3IgdW50YWdnZWQgcmVzcG9uc2VzXG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhbiB1bnRhZ2dlZCBPSyBpbmNsdWRlcyBbQ0FQQUJJTElUWV0gdGFnIGFuZCB1cGRhdGVzIGNhcGFiaWxpdHkgb2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSByZXNwb25zZSBQYXJzZWQgc2VydmVyIHJlc3BvbnNlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG5leHQgVW50aWwgY2FsbGVkLCBzZXJ2ZXIgcmVzcG9uc2VzIGFyZSBub3QgcHJvY2Vzc2VkXG4gICAqL1xuICBfdW50YWdnZWRPa0hhbmRsZXIgKHJlc3BvbnNlKSB7XG4gICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmNhcGFiaWxpdHkpIHtcbiAgICAgIHRoaXMuX2NhcGFiaWxpdHkgPSByZXNwb25zZS5jYXBhYmlsaXR5XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgY2FwYWJpbGl0eSBvYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHJlc3BvbnNlIFBhcnNlZCBzZXJ2ZXIgcmVzcG9uc2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbmV4dCBVbnRpbCBjYWxsZWQsIHNlcnZlciByZXNwb25zZXMgYXJlIG5vdCBwcm9jZXNzZWRcbiAgICovXG4gIF91bnRhZ2dlZENhcGFiaWxpdHlIYW5kbGVyIChyZXNwb25zZSkge1xuICAgIHRoaXMuX2NhcGFiaWxpdHkgPSBwaXBlKFxuICAgICAgcHJvcE9yKFtdLCAnYXR0cmlidXRlcycpLFxuICAgICAgbWFwKCh7IHZhbHVlIH0pID0+ICh2YWx1ZSB8fCAnJykudG9VcHBlckNhc2UoKS50cmltKCkpXG4gICAgKShyZXNwb25zZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGV4aXN0aW5nIG1lc3NhZ2UgY291bnRcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHJlc3BvbnNlIFBhcnNlZCBzZXJ2ZXIgcmVzcG9uc2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbmV4dCBVbnRpbCBjYWxsZWQsIHNlcnZlciByZXNwb25zZXMgYXJlIG5vdCBwcm9jZXNzZWRcbiAgICovXG4gIF91bnRhZ2dlZEV4aXN0c0hhbmRsZXIgKHJlc3BvbnNlKSB7XG4gICAgaWYgKHJlc3BvbnNlICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyZXNwb25zZSwgJ25yJykpIHtcbiAgICAgIHRoaXMub251cGRhdGUgJiYgdGhpcy5vbnVwZGF0ZSh0aGlzLl9zZWxlY3RlZE1haWxib3gsICdleGlzdHMnLCByZXNwb25zZS5ucilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIGEgbWVzc2FnZSBoYXMgYmVlbiBkZWxldGVkXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSByZXNwb25zZSBQYXJzZWQgc2VydmVyIHJlc3BvbnNlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG5leHQgVW50aWwgY2FsbGVkLCBzZXJ2ZXIgcmVzcG9uc2VzIGFyZSBub3QgcHJvY2Vzc2VkXG4gICAqL1xuICBfdW50YWdnZWRFeHB1bmdlSGFuZGxlciAocmVzcG9uc2UpIHtcbiAgICBpZiAocmVzcG9uc2UgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3BvbnNlLCAnbnInKSkge1xuICAgICAgdGhpcy5vbnVwZGF0ZSAmJiB0aGlzLm9udXBkYXRlKHRoaXMuX3NlbGVjdGVkTWFpbGJveCwgJ2V4cHVuZ2UnLCByZXNwb25zZS5ucilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHRoYXQgZmxhZ3MgaGF2ZSBiZWVuIHVwZGF0ZWQgZm9yIGEgbWVzc2FnZVxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcmVzcG9uc2UgUGFyc2VkIHNlcnZlciByZXNwb25zZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBuZXh0IFVudGlsIGNhbGxlZCwgc2VydmVyIHJlc3BvbnNlcyBhcmUgbm90IHByb2Nlc3NlZFxuICAgKi9cbiAgX3VudGFnZ2VkRmV0Y2hIYW5kbGVyIChyZXNwb25zZSkge1xuICAgIHRoaXMub251cGRhdGUgJiYgdGhpcy5vbnVwZGF0ZSh0aGlzLl9zZWxlY3RlZE1haWxib3gsICdmZXRjaCcsIFtdLmNvbmNhdChwYXJzZUZFVENIKHsgcGF5bG9hZDogeyBGRVRDSDogW3Jlc3BvbnNlXSB9IH0pIHx8IFtdKS5zaGlmdCgpKVxuICB9XG5cbiAgLy8gUHJpdmF0ZSBoZWxwZXJzXG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGF0IHRoZSBjb25uZWN0aW9uIHN0YXJ0ZWQgaWRsaW5nLiBJbml0aWF0ZXMgYSBjeWNsZVxuICAgKiBvZiBOT09QcyBvciBJRExFcyB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMgYWJvdXQgdXBkYXRlcyBpbiB0aGUgc2VydmVyXG4gICAqL1xuICBfb25JZGxlICgpIHtcbiAgICBpZiAoIXRoaXMuX2F1dGhlbnRpY2F0ZWQgfHwgdGhpcy5fZW50ZXJlZElkbGUpIHtcbiAgICAgIC8vIE5vIG5lZWQgdG8gSURMRSB3aGVuIG5vdCBsb2dnZWQgaW4gb3IgYWxyZWFkeSBpZGxpbmdcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdDbGllbnQgc3RhcnRlZCBpZGxpbmcnKVxuICAgIHRoaXMuZW50ZXJJZGxlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBJTUFQIHN0YXRlIHZhbHVlIGZvciB0aGUgY3VycmVudCBjb25uZWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBuZXdTdGF0ZSBUaGUgc3RhdGUgeW91IHdhbnQgdG8gY2hhbmdlIHRvXG4gICAqL1xuICBfY2hhbmdlU3RhdGUgKG5ld1N0YXRlKSB7XG4gICAgaWYgKG5ld1N0YXRlID09PSB0aGlzLl9zdGF0ZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ0VudGVyaW5nIHN0YXRlOiAnICsgbmV3U3RhdGUpXG5cbiAgICAvLyBpZiBhIG1haWxib3ggd2FzIG9wZW5lZCwgZW1pdCBvbmNsb3NlbWFpbGJveCBhbmQgY2xlYXIgc2VsZWN0ZWRNYWlsYm94IHZhbHVlXG4gICAgaWYgKHRoaXMuX3N0YXRlID09PSBTVEFURV9TRUxFQ1RFRCAmJiB0aGlzLl9zZWxlY3RlZE1haWxib3gpIHtcbiAgICAgIHRoaXMub25jbG9zZW1haWxib3ggJiYgdGhpcy5vbmNsb3NlbWFpbGJveCh0aGlzLl9zZWxlY3RlZE1haWxib3gpXG4gICAgICB0aGlzLl9zZWxlY3RlZE1haWxib3ggPSBmYWxzZVxuICAgIH1cblxuICAgIHRoaXMuX3N0YXRlID0gbmV3U3RhdGVcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmVzIGEgcGF0aCBleGlzdHMgaW4gdGhlIE1haWxib3ggdHJlZVxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gdHJlZSBNYWlsYm94IHRyZWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtTdHJpbmd9IGRlbGltaXRlclxuICAgKiBAcmV0dXJuIHtPYmplY3R9IGJyYW5jaCBmb3IgdXNlZCBwYXRoXG4gICAqL1xuICBfZW5zdXJlUGF0aCAodHJlZSwgcGF0aCwgZGVsaW1pdGVyKSB7XG4gICAgY29uc3QgbmFtZXMgPSBwYXRoLnNwbGl0KGRlbGltaXRlcilcbiAgICBsZXQgYnJhbmNoID0gdHJlZVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGZvdW5kID0gZmFsc2VcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYnJhbmNoLmNoaWxkcmVuLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmICh0aGlzLl9jb21wYXJlTWFpbGJveE5hbWVzKGJyYW5jaC5jaGlsZHJlbltqXS5uYW1lLCBpbWFwRGVjb2RlKG5hbWVzW2ldKSkpIHtcbiAgICAgICAgICBicmFuY2ggPSBicmFuY2guY2hpbGRyZW5bal1cbiAgICAgICAgICBmb3VuZCA9IHRydWVcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgIGJyYW5jaC5jaGlsZHJlbi5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBpbWFwRGVjb2RlKG5hbWVzW2ldKSxcbiAgICAgICAgICBkZWxpbWl0ZXI6IGRlbGltaXRlcixcbiAgICAgICAgICBwYXRoOiBuYW1lcy5zbGljZSgwLCBpICsgMSkuam9pbihkZWxpbWl0ZXIpLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXVxuICAgICAgICB9KVxuICAgICAgICBicmFuY2ggPSBicmFuY2guY2hpbGRyZW5bYnJhbmNoLmNoaWxkcmVuLmxlbmd0aCAtIDFdXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBicmFuY2hcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wYXJlcyB0d28gbWFpbGJveCBuYW1lcy4gQ2FzZSBpbnNlbnNpdGl2ZSBpbiBjYXNlIG9mIElOQk9YLCBvdGhlcndpc2UgY2FzZSBzZW5zaXRpdmVcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGEgTWFpbGJveCBuYW1lXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBiIE1haWxib3ggbmFtZVxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZm9sZGVyIG5hbWVzIG1hdGNoXG4gICAqL1xuICBfY29tcGFyZU1haWxib3hOYW1lcyAoYSwgYikge1xuICAgIHJldHVybiAoYS50b1VwcGVyQ2FzZSgpID09PSAnSU5CT1gnID8gJ0lOQk9YJyA6IGEpID09PSAoYi50b1VwcGVyQ2FzZSgpID09PSAnSU5CT1gnID8gJ0lOQk9YJyA6IGIpXG4gIH1cblxuICBjcmVhdGVMb2dnZXIgKGNyZWF0b3IgPSBjcmVhdGVEZWZhdWx0TG9nZ2VyKSB7XG4gICAgY29uc3QgbG9nZ2VyID0gY3JlYXRvcigodGhpcy5fYXV0aCB8fCB7fSkudXNlciB8fCAnJywgdGhpcy5faG9zdClcbiAgICB0aGlzLmxvZ2dlciA9IHRoaXMuY2xpZW50LmxvZ2dlciA9IHtcbiAgICAgIGRlYnVnOiAoLi4ubXNncykgPT4geyBpZiAoTE9HX0xFVkVMX0RFQlVHID49IHRoaXMubG9nTGV2ZWwpIHsgbG9nZ2VyLmRlYnVnKG1zZ3MpIH0gfSxcbiAgICAgIGluZm86ICguLi5tc2dzKSA9PiB7IGlmIChMT0dfTEVWRUxfSU5GTyA+PSB0aGlzLmxvZ0xldmVsKSB7IGxvZ2dlci5pbmZvKG1zZ3MpIH0gfSxcbiAgICAgIHdhcm46ICguLi5tc2dzKSA9PiB7IGlmIChMT0dfTEVWRUxfV0FSTiA+PSB0aGlzLmxvZ0xldmVsKSB7IGxvZ2dlci53YXJuKG1zZ3MpIH0gfSxcbiAgICAgIGVycm9yOiAoLi4ubXNncykgPT4geyBpZiAoTE9HX0xFVkVMX0VSUk9SID49IHRoaXMubG9nTGV2ZWwpIHsgbG9nZ2VyLmVycm9yKG1zZ3MpIH0gfVxuICAgIH1cbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/dist/command-builder-unit.js b/dist/command-builder-unit.js new file mode 100644 index 00000000..f3a9a1a1 --- /dev/null +++ b/dist/command-builder-unit.js @@ -0,0 +1,369 @@ +"use strict"; + +var _commandBuilder = require("./command-builder"); + +describe('buildFETCHCommand', () => { + it('should build single ALL', () => { + expect((0, _commandBuilder.buildFETCHCommand)('1:*', ['all'], {})).to.deep.equal({ + command: 'FETCH', + attributes: [{ + type: 'SEQUENCE', + value: '1:*' + }, { + type: 'ATOM', + value: 'ALL' + }] + }); + }); + it('should build FETCH with uid', () => { + expect((0, _commandBuilder.buildFETCHCommand)('1:*', ['all'], { + byUid: true + })).to.deep.equal({ + command: 'UID FETCH', + attributes: [{ + type: 'SEQUENCE', + value: '1:*' + }, { + type: 'ATOM', + value: 'ALL' + }] + }); + }); + it('should build FETCH with uid, envelope', () => { + expect((0, _commandBuilder.buildFETCHCommand)('1:*', ['uid', 'envelope'], {})).to.deep.equal({ + command: 'FETCH', + attributes: [{ + type: 'SEQUENCE', + value: '1:*' + }, [{ + type: 'ATOM', + value: 'UID' + }, { + type: 'ATOM', + value: 'ENVELOPE' + }]] + }); + }); + it('should build FETCH with modseq', () => { + expect((0, _commandBuilder.buildFETCHCommand)('1:*', ['modseq (1234567)'], {})).to.deep.equal({ + command: 'FETCH', + attributes: [{ + type: 'SEQUENCE', + value: '1:*' + }, [{ + type: 'ATOM', + value: 'MODSEQ' + }, [{ + type: 'ATOM', + value: '1234567' + }]]] + }); + }); + it('should build FETCH with section', () => { + expect((0, _commandBuilder.buildFETCHCommand)('1:*', ['body[text]'], {})).to.deep.equal({ + command: 'FETCH', + attributes: [{ + type: 'SEQUENCE', + value: '1:*' + }, { + type: 'ATOM', + value: 'BODY', + section: [{ + type: 'ATOM', + value: 'TEXT' + }] + }] + }); + }); + it('should build FETCH with section and list', () => { + expect((0, _commandBuilder.buildFETCHCommand)('1:*', ['body[header.fields (date in-reply-to)]'], {})).to.deep.equal({ + command: 'FETCH', + attributes: [{ + type: 'SEQUENCE', + value: '1:*' + }, { + type: 'ATOM', + value: 'BODY', + section: [{ + type: 'ATOM', + value: 'HEADER.FIELDS' + }, [{ + type: 'ATOM', + value: 'DATE' + }, { + type: 'ATOM', + value: 'IN-REPLY-TO' + }]] + }] + }); + }); + it('should build FETCH with ', () => { + expect((0, _commandBuilder.buildFETCHCommand)('1:*', ['all'], { + changedSince: '123456' + })).to.deep.equal({ + command: 'FETCH', + attributes: [{ + type: 'SEQUENCE', + value: '1:*' + }, { + type: 'ATOM', + value: 'ALL' + }, [{ + type: 'ATOM', + value: 'CHANGEDSINCE' + }, { + type: 'ATOM', + value: '123456' + }]] + }); + }); + it('should build FETCH with partial', () => { + expect((0, _commandBuilder.buildFETCHCommand)('1:*', ['body[]'], {})).to.deep.equal({ + command: 'FETCH', + attributes: [{ + type: 'SEQUENCE', + value: '1:*' + }, { + type: 'ATOM', + value: 'BODY', + section: [] + }] + }); + }); + it('should build FETCH with the valueAsString option', () => { + expect((0, _commandBuilder.buildFETCHCommand)('1:*', ['body[]'], { + valueAsString: false + })).to.deep.equal({ + command: 'FETCH', + attributes: [{ + type: 'SEQUENCE', + value: '1:*' + }, { + type: 'ATOM', + value: 'BODY', + section: [] + }], + valueAsString: false + }); + }); +}); +describe('#_buildXOAuth2Token', () => { + it('should return base64 encoded XOAUTH2 token', () => { + expect((0, _commandBuilder.buildXOAuth2Token)('user@host', 'abcde')).to.equal('dXNlcj11c2VyQGhvc3QBYXV0aD1CZWFyZXIgYWJjZGUBAQ=='); + }); +}); +describe('buildSEARCHCommand', () => { + it('should compose a search command', () => { + expect((0, _commandBuilder.buildSEARCHCommand)({ + unseen: true, + header: ['subject', 'hello world'], + or: { + unseen: true, + seen: true + }, + not: { + seen: true + }, + sentbefore: new Date(2011, 1, 3, 12, 0, 0), + since: new Date(2011, 11, 23, 12, 0, 0), + uid: '1:*', + 'X-GM-MSGID': '1499257647490662970', + 'X-GM-THRID': '1499257647490662971' + }, {})).to.deep.equal({ + command: 'SEARCH', + attributes: [{ + type: 'atom', + value: 'UNSEEN' + }, { + type: 'atom', + value: 'HEADER' + }, { + type: 'string', + value: 'subject' + }, { + type: 'string', + value: 'hello world' + }, { + type: 'atom', + value: 'OR' + }, { + type: 'atom', + value: 'UNSEEN' + }, { + type: 'atom', + value: 'SEEN' + }, { + type: 'atom', + value: 'NOT' + }, { + type: 'atom', + value: 'SEEN' + }, { + type: 'atom', + value: 'SENTBEFORE' + }, { + type: 'atom', + value: '3-Feb-2011' + }, { + type: 'atom', + value: 'SINCE' + }, { + type: 'atom', + value: '23-Dec-2011' + }, { + type: 'atom', + value: 'UID' + }, { + type: 'sequence', + value: '1:*' + }, { + type: 'atom', + value: 'X-GM-MSGID' + }, { + type: 'number', + value: '1499257647490662970' + }, { + type: 'atom', + value: 'X-GM-THRID' + }, { + type: 'number', + value: '1499257647490662971' + }] + }); + }); + it('should compose an unicode search command', () => { + expect((0, _commandBuilder.buildSEARCHCommand)({ + body: 'jõgeva' + }, {})).to.deep.equal({ + command: 'SEARCH', + attributes: [{ + type: 'atom', + value: 'CHARSET' + }, { + type: 'atom', + value: 'UTF-8' + }, { + type: 'atom', + value: 'BODY' + }, { + type: 'literal', + value: 'jõgeva' + }] + }); + }); +}); +describe('#_buildSTORECommand', () => { + it('should compose a store command from an array', () => { + expect((0, _commandBuilder.buildSTORECommand)('1,2,3', 'FLAGS', ['a', 'b'], {})).to.deep.equal({ + command: 'STORE', + attributes: [{ + type: 'sequence', + value: '1,2,3' + }, { + type: 'atom', + value: 'FLAGS' + }, [{ + type: 'atom', + value: 'a' + }, { + type: 'atom', + value: 'b' + }]] + }); + }); + it('should compose a store set flags command', () => { + expect((0, _commandBuilder.buildSTORECommand)('1,2,3', 'FLAGS', ['a', 'b'], {})).to.deep.equal({ + command: 'STORE', + attributes: [{ + type: 'sequence', + value: '1,2,3' + }, { + type: 'atom', + value: 'FLAGS' + }, [{ + type: 'atom', + value: 'a' + }, { + type: 'atom', + value: 'b' + }]] + }); + }); + it('should compose a store add flags command', () => { + expect((0, _commandBuilder.buildSTORECommand)('1,2,3', '+FLAGS', ['a', 'b'], {})).to.deep.equal({ + command: 'STORE', + attributes: [{ + type: 'sequence', + value: '1,2,3' + }, { + type: 'atom', + value: '+FLAGS' + }, [{ + type: 'atom', + value: 'a' + }, { + type: 'atom', + value: 'b' + }]] + }); + }); + it('should compose a store remove flags command', () => { + expect((0, _commandBuilder.buildSTORECommand)('1,2,3', '-FLAGS', ['a', 'b'], {})).to.deep.equal({ + command: 'STORE', + attributes: [{ + type: 'sequence', + value: '1,2,3' + }, { + type: 'atom', + value: '-FLAGS' + }, [{ + type: 'atom', + value: 'a' + }, { + type: 'atom', + value: 'b' + }]] + }); + }); + it('should compose a store remove silent flags command', () => { + expect((0, _commandBuilder.buildSTORECommand)('1,2,3', '-FLAGS', ['a', 'b'], { + silent: true + })).to.deep.equal({ + command: 'STORE', + attributes: [{ + type: 'sequence', + value: '1,2,3' + }, { + type: 'atom', + value: '-FLAGS.SILENT' + }, [{ + type: 'atom', + value: 'a' + }, { + type: 'atom', + value: 'b' + }]] + }); + }); + it('should compose a uid store flags command', () => { + expect((0, _commandBuilder.buildSTORECommand)('1,2,3', 'FLAGS', ['a', 'b'], { + byUid: true + })).to.deep.equal({ + command: 'UID STORE', + attributes: [{ + type: 'sequence', + value: '1,2,3' + }, { + type: 'atom', + value: 'FLAGS' + }, [{ + type: 'atom', + value: 'a' + }, { + type: 'atom', + value: 'b' + }]] + }); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21tYW5kLWJ1aWxkZXItdW5pdC5qcyJdLCJuYW1lcyI6WyJkZXNjcmliZSIsIml0IiwiZXhwZWN0IiwidG8iLCJkZWVwIiwiZXF1YWwiLCJjb21tYW5kIiwiYXR0cmlidXRlcyIsInR5cGUiLCJ2YWx1ZSIsImJ5VWlkIiwic2VjdGlvbiIsImNoYW5nZWRTaW5jZSIsInZhbHVlQXNTdHJpbmciLCJ1bnNlZW4iLCJoZWFkZXIiLCJvciIsInNlZW4iLCJub3QiLCJzZW50YmVmb3JlIiwiRGF0ZSIsInNpbmNlIiwidWlkIiwiYm9keSIsInNpbGVudCJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7QUFPQUEsUUFBUSxDQUFDLG1CQUFELEVBQXNCLE1BQU07QUFDbENDLEVBQUFBLEVBQUUsQ0FBQyx5QkFBRCxFQUE0QixNQUFNO0FBQ2xDQyxJQUFBQSxNQUFNLENBQUMsdUNBQWtCLEtBQWxCLEVBQXlCLENBQUMsS0FBRCxDQUF6QixFQUFrQyxFQUFsQyxDQUFELENBQU4sQ0FBOENDLEVBQTlDLENBQWlEQyxJQUFqRCxDQUFzREMsS0FBdEQsQ0FBNEQ7QUFDMURDLE1BQUFBLE9BQU8sRUFBRSxPQURpRDtBQUUxREMsTUFBQUEsVUFBVSxFQUFFLENBQUM7QUFDWEMsUUFBQUEsSUFBSSxFQUFFLFVBREs7QUFFWEMsUUFBQUEsS0FBSyxFQUFFO0FBRkksT0FBRCxFQUdUO0FBQ0RELFFBQUFBLElBQUksRUFBRSxNQURMO0FBRURDLFFBQUFBLEtBQUssRUFBRTtBQUZOLE9BSFM7QUFGOEMsS0FBNUQ7QUFVRCxHQVhDLENBQUY7QUFhQVIsRUFBQUEsRUFBRSxDQUFDLDZCQUFELEVBQWdDLE1BQU07QUFDdENDLElBQUFBLE1BQU0sQ0FBQyx1Q0FBa0IsS0FBbEIsRUFBeUIsQ0FBQyxLQUFELENBQXpCLEVBQWtDO0FBQ3ZDUSxNQUFBQSxLQUFLLEVBQUU7QUFEZ0MsS0FBbEMsQ0FBRCxDQUFOLENBRUlQLEVBRkosQ0FFT0MsSUFGUCxDQUVZQyxLQUZaLENBRWtCO0FB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VSxFQUFFLENBQUM7QUFDWEMsUUFBQUEsSUFBSSxFQUFFLE1BREs7QUFFWEMsUUFBQUEsS0FBSyxFQUFFO0FBRkksT0FBRCxFQUdUO0FBQ0RELFFBQUFBLElBQUksRUFBRSxNQURMO0FBRURDLFFBQUFBLEtBQUssRUFBRTtBQUZOLE9BSFMsRUFNVDtBQUNERCxRQUFBQSxJQUFJLEVBQUUsUUFETDtBQUVEQyxRQUFBQSxLQUFLLEVBQUU7QUFGTixPQU5TLEVBU1Q7QUFDREQsUUFBQUEsSUFBSSxFQUFFLFFBREw7QUFFREMsUUFBQUEsS0FBSyxFQUFFO0FBRk4sT0FUUyxFQVlUO0FBQ0RELFFBQUFBLElBQUksRUFBRSxNQURMO0FBRURDLFFBQUFBLEtBQUssRUFBRTtBQUZOLE9BWlMsRUFlVDtBQUNERCxRQUFBQSxJQUFJLEVBQUUsTUFETDtBQUVEQyxRQUFBQSxLQUFLLEVBQUU7QUFGTixPQWZTLEVBa0JUO0FBQ0RELFFBQUFBLElBQUksRUFBRSxNQURMO0FBRURDLFFBQUFBLEtBQUssRUFBRTtBQUZOLE9BbEJTLEVBcUJUO0FBQ0RELFFBQUFBLElBQUksRUFBRSxNQURMO0FBRURDLFFBQUFBLEtBQUssRUFBRTtBQUZOLE9BckJTLEVBd0JUO0FBQ0RELFFBQUFBLElBQUksRUFBRSxNQURMO0FBRURDLFFBQUFBLEtBQUssRUFBRTtBQUZOLE9BeEJTLEVBMkJUO0FBQ0RELFFBQUFBLElBQUksRUFBRSxNQURMO0FBRURDLFFBQUFBLEtBQUssRUFBRTtBQUZOLE9BM0JTLEVBOEJUO0FBQ0RELFFBQUFBLElBQUksRUFBRSxNQURMO0FBRURDLFFBQUFBLEtBQUssRUFBRTtBQUZOLE9BOUJTLEVBaUNUO0FBQ0RELFFBQUFBLElBQUksRUFBRSxNQURMO0FBRURDLFFBQUFBLEtBQUssRUFBRTtBQUZOLE9BakNTLEVBb0NUO0FBQ0RELFFBQUFBLElBQUksRUFBRSxNQURMO0FBRURDLFFBQUFBLEtBQUssRUFBRTtBQUZOLE9BcENTLEVBdUNUO0FBQ0RELFFBQUFBLElBQUksRUFBRSxNQURMO0FBRURDLFFBQUFBLEtB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LEtBRmxCO0FBb0JELEdBckJDLENBQUY7QUF1QkFSLEVBQUFBLEVBQUUsQ0FBQywwQ0FBRCxFQUE2QyxNQUFNO0FBQ25EQyxJQUFBQSxNQUFNLENBQUMsdUNBQWtCLE9BQWxCLEVBQTJCLE9BQTNCLEVBQW9DLENBQUMsR0FBRCxFQUFNLEdBQU4sQ0FBcEMsRUFBZ0Q7QUFDckRRLE1BQUFBLEtBQUssRUFBRTtBQUQ4QyxLQUFoRCxDQUFELENBQU4sQ0FFSVAsRUFGSixDQUVPQyxJQUZQLENBRVlDLEtBRlosQ0FFa0I7QUFDaEJDLE1BQUFBLE9BQU8sRUFBRSxXQURPO0FBRWhCQyxNQUFBQSxVQUFVLEVBQUUsQ0FBQztBQUNYQyxRQUFBQSxJQUFJLEVBQUUsVUFESztBQUVYQyxRQUFBQSxLQUFLLEVBQUU7QUFGSSxPQUFELEVBR1Q7QUFDREQsUUFBQUEsSUFBSSxFQUFFLE1BREw7QUFFREMsUUFBQUEsS0FBSyxFQUFFO0FBRk4sT0FIUyxFQU9aLENBQUM7QUFDQ0QsUUFBQUEsSUFBSSxFQUFFLE1BRFA7QUFFQ0MsUUFBQUEsS0FBSyxFQUFFO0FBRlIsT0FBRCxFQUdHO0FBQ0RELFFBQUFBLElBQUksRUFBRSxNQURMO0FBRURDLFFBQUFBLEtBQUssRUFBRTtBQUZOLE9BSEgsQ0FQWTtBQUZJLEtBRmxCO0FBb0JELEdBckJDLENBQUY7QUFzQkQsQ0FsSU8sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGJ1aWxkU1RPUkVDb21tYW5kLFxuICBidWlsZEZFVENIQ29tbWFuZCxcbiAgYnVpbGRYT0F1dGgyVG9rZW4sXG4gIGJ1aWxkU0VBUkNIQ29tbWFuZFxufSBmcm9tICcuL2NvbW1hbmQtYnVpbGRlcidcblxuZGVzY3JpYmUoJ2J1aWxkRkVUQ0hDb21tYW5kJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIGJ1aWxkIHNpbmdsZSBBTEwnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGJ1aWxkRkVUQ0hDb21tYW5kKCcxOionLCBbJ2FsbCddLCB7fSkpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgY29tbWFuZDogJ0ZFVENIJyxcbiAgICAgIGF0dHJpYnV0ZXM6IFt7XG4gICAgICAgIHR5cGU6ICdTRVFVRU5DRScsXG4gICAgICAgIHZhbHVlOiAnMToqJ1xuICAgICAgfSwge1xuICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgIHZhbHVlOiAnQUxMJ1xuICAgICAgfV1cbiAgICB9KVxuICB9KVxuXG4gIGl0KCdzaG91bGQgYnVpbGQgRkVUQ0ggd2l0aCB1aWQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGJ1aWxkRkVUQ0hDb21tYW5kKCcxOionLCBbJ2FsbCddLCB7XG4gICAgICBieVVpZDogdHJ1ZVxuICAgIH0pKS50by5kZWVwLmVxdWFsKHtcbiAgICAgIGNvbW1hbmQ6ICdVSUQgRkVUQ0gnLFxuICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgdHlwZTogJ1NFUVVFTkNFJyxcbiAgICAgICAgdmFsdWU6ICcxOionXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgdmFsdWU6ICdBTEwnXG4gICAgICB9XVxuICAgIH0pXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCBidWlsZCBGRVRDSCB3aXRoIHVpZCwgZW52ZWxvcGUnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGJ1aWxkRkVUQ0hDb21tYW5kKCcxOionLCBbJ3VpZCcsICdlbnZlbG9wZSddLCB7fSkpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgY29tbWFuZDogJ0ZFVENIJyxcbiAgICAgIGF0dHJpYnV0ZXM6IFt7XG4gICAgICAgIHR5cGU6ICdTRVFVRU5DRScsXG4gICAgICAgIHZhbHVlOiAnMToqJ1xuICAgICAgfSxcbiAgICAgIFt7XG4gICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgdmFsdWU6ICdVSUQnXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgdmFsdWU6ICdFTlZFTE9QRSdcbiAgICAgIH1dXG4gICAgICBdXG4gICAgfSlcbiAgfSlcblxuICBpdCgnc2hvdWxkIGJ1aWxkIEZFVENIIHdpdGggbW9kc2VxJywgKCkgPT4ge1xuICAgIGV4cGVjdChidWlsZEZFVENIQ29tbWFuZCgnMToqJywgWydtb2RzZXEgKDEyMzQ1NjcpJ10sIHt9KSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICBjb21tYW5kOiAnRkVUQ0gnLFxuICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgdHlwZTogJ1NFUVVFTkNFJyxcbiAgICAgICAgdmFsdWU6ICcxOionXG4gICAgICB9LFxuICAgICAgW3tcbiAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICB2YWx1ZTogJ01PRFNFUSdcbiAgICAgIH0sXG4gICAgICBbe1xuICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgIHZhbHVlOiAnMTIzNDU2NydcbiAgICAgIH1dXG4gICAgICBdXG4gICAgICBdXG4gICAgfSlcbiAgfSlcblxuICBpdCgnc2hvdWxkIGJ1aWxkIEZFVENIIHdpdGggc2VjdGlvbicsICgpID0+IHtcbiAgICBleHBlY3QoYnVpbGRGRVRDSENvbW1hbmQoJzE6KicsIFsnYm9keVt0ZXh0XSddLCB7fSkpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgY29tbWFuZDogJ0ZFVENIJyxcbiAgICAgIGF0dHJpYnV0ZXM6IFt7XG4gICAgICAgIHR5cGU6ICdTRVFVRU5DRScsXG4gICAgICAgIHZhbHVlOiAnMToqJ1xuICAgICAgfSwge1xuICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgIHZhbHVlOiAnQk9EWScsXG4gICAgICAgIHNlY3Rpb246IFt7XG4gICAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICAgIHZhbHVlOiAnVEVYVCdcbiAgICAgICAgfV1cbiAgICAgIH1dXG4gICAgfSlcbiAgfSlcblxuICBpdCgnc2hvdWxkIGJ1aWxkIEZFVENIIHdpdGggc2VjdGlvbiBhbmQgbGlzdCcsICgpID0+IHtcbiAgICBleHBlY3QoYnVpbGRGRVRDSENvbW1hbmQoJzE6KicsIFsnYm9keVtoZWFkZXIuZmllbGRzIChkYXRlIGluLXJlcGx5LXRvKV0nXSwge30pKS50by5kZWVwLmVxdWFsKHtcbiAgICAgIGNvbW1hbmQ6ICdGRVRDSCcsXG4gICAgICBhdHRyaWJ1dGVzOiBbe1xuICAgICAgICB0eXBlOiAnU0VRVUVOQ0UnLFxuICAgICAgICB2YWx1ZTogJzE6KidcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICB2YWx1ZTogJ0JPRFknLFxuICAgICAgICBzZWN0aW9uOiBbe1xuICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICB2YWx1ZTogJ0hFQURFUi5GSUVMRFMnXG4gICAgICAgIH0sXG4gICAgICAgIFt7XG4gICAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICAgIHZhbHVlOiAnREFURSdcbiAgICAgICAgfSwge1xuICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICB2YWx1ZTogJ0lOLVJFUExZLVRPJ1xuICAgICAgICB9XVxuICAgICAgICBdXG4gICAgICB9XVxuICAgIH0pXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCBidWlsZCBGRVRDSCB3aXRoICcsICgpID0+IHtcbiAgICBleHBlY3QoYnVpbGRGRVRDSENvbW1hbmQoJzE6KicsIFsnYWxsJ10sIHtcbiAgICAgIGNoYW5nZWRTaW5jZTogJzEyMzQ1NidcbiAgICB9KSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICBjb21tYW5kOiAnRkVUQ0gnLFxuICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgdHlwZTogJ1NFUVVFTkNFJyxcbiAgICAgICAgdmFsdWU6ICcxOionXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgdmFsdWU6ICdBTEwnXG4gICAgICB9LFxuICAgICAgW3tcbiAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICB2YWx1ZTogJ0NIQU5HRURTSU5DRSdcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICB2YWx1ZTogJzEyMzQ1NidcbiAgICAgIH1dXG4gICAgICBdXG4gICAgfSlcbiAgfSlcblxuICBpdCgnc2hvdWxkIGJ1aWxkIEZFVENIIHdpdGggcGFydGlhbCcsICgpID0+IHtcbiAgICBleHBlY3QoYnVpbGRGRVRDSENvbW1hbmQoJzE6KicsIFsnYm9keVtdJ10sIHt9KSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICBjb21tYW5kOiAnRkVUQ0gnLFxuICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgdHlwZTogJ1NFUVVFTkNFJyxcbiAgICAgICAgdmFsdWU6ICcxOionXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgdmFsdWU6ICdCT0RZJyxcbiAgICAgICAgc2VjdGlvbjogW11cbiAgICAgIH1dXG4gICAgfSlcbiAgfSlcblxuICBpdCgnc2hvdWxkIGJ1aWxkIEZFVENIIHdpdGggdGhlIHZhbHVlQXNTdHJpbmcgb3B0aW9uJywgKCkgPT4ge1xuICAgIGV4cGVjdChidWlsZEZFVENIQ29tbWFuZCgnMToqJywgWydib2R5W10nXSwgeyB2YWx1ZUFzU3RyaW5nOiBmYWxzZSB9KSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICBjb21tYW5kOiAnRkVUQ0gnLFxuICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgdHlwZTogJ1NFUVVFTkNFJyxcbiAgICAgICAgdmFsdWU6ICcxOionXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgdmFsdWU6ICdCT0RZJyxcbiAgICAgICAgc2VjdGlvbjogW11cbiAgICAgIH1dLFxuICAgICAgdmFsdWVBc1N0cmluZzogZmFsc2VcbiAgICB9KVxuICB9KVxufSlcblxuZGVzY3JpYmUoJyNfYnVpbGRYT0F1dGgyVG9rZW4nLCAoKSA9PiB7XG4gIGl0KCdzaG91bGQgcmV0dXJuIGJhc2U2NCBlbmNvZGVkIFhPQVVUSDIgdG9rZW4nLCAoKSA9PiB7XG4gICAgZXhwZWN0KGJ1aWxkWE9BdXRoMlRva2VuKCd1c2VyQGhvc3QnLCAnYWJjZGUnKSkudG8uZXF1YWwoJ2RYTmxjajExYzJWeVFHaHZjM1FCWVhWMGFEMUNaV0Z5WlhJZ1lXSmpaR1VCQVE9PScpXG4gIH0pXG59KVxuXG5kZXNjcmliZSgnYnVpbGRTRUFSQ0hDb21tYW5kJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIGNvbXBvc2UgYSBzZWFyY2ggY29tbWFuZCcsICgpID0+IHtcbiAgICBleHBlY3QoYnVpbGRTRUFSQ0hDb21tYW5kKHtcbiAgICAgIHVuc2VlbjogdHJ1ZSxcbiAgICAgIGhlYWRlcjogWydzdWJqZWN0JywgJ2hlbGxvIHdvcmxkJ10sXG4gICAgICBvcjoge1xuICAgICAgICB1bnNlZW46IHRydWUsXG4gICAgICAgIHNlZW46IHRydWVcbiAgICAgIH0sXG4gICAgICBub3Q6IHtcbiAgICAgICAgc2VlbjogdHJ1ZVxuICAgICAgfSxcbiAgICAgIHNlbnRiZWZvcmU6IG5ldyBEYXRlKDIwMTEsIDEsIDMsIDEyLCAwLCAwKSxcbiAgICAgIHNpbmNlOiBuZXcgRGF0ZSgyMDExLCAxMSwgMjMsIDEyLCAwLCAwKSxcbiAgICAgIHVpZDogJzE6KicsXG4gICAgICAnWC1HTS1NU0dJRCc6ICcxNDk5MjU3NjQ3NDkwNjYyOTcwJyxcbiAgICAgICdYLUdNLVRIUklEJzogJzE0OTkyNTc2NDc0OTA2NjI5NzEnXG4gICAgfSwge30pKS50by5kZWVwLmVxdWFsKHtcbiAgICAgIGNvbW1hbmQ6ICdTRUFSQ0gnLFxuICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgdHlwZTogJ2F0b20nLFxuICAgICAgICB2YWx1ZTogJ1VOU0VFTidcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2F0b20nLFxuICAgICAgICB2YWx1ZTogJ0hFQURFUidcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIHZhbHVlOiAnc3ViamVjdCdcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIHZhbHVlOiAnaGVsbG8gd29ybGQnXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdhdG9tJyxcbiAgICAgICAgdmFsdWU6ICdPUidcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2F0b20nLFxuICAgICAgICB2YWx1ZTogJ1VOU0VFTidcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2F0b20nLFxuICAgICAgICB2YWx1ZTogJ1NFRU4nXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdhdG9tJyxcbiAgICAgICAgdmFsdWU6ICdOT1QnXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdhdG9tJyxcbiAgICAgICAgdmFsdWU6ICdTRUVOJ1xuICAgICAgfSwge1xuICAgICAgICB0eXBlOiAnYXRvbScsXG4gICAgICAgIHZhbHVlOiAnU0VOVEJFRk9SRSdcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2F0b20nLFxuICAgICAgICB2YWx1ZTogJzMtRmViLTIwMTEnXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdhdG9tJyxcbiAgICAgICAgdmFsdWU6ICdTSU5DRSdcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2F0b20nLFxuICAgICAgICB2YWx1ZTogJzIzLURlYy0yMDExJ1xuICAgICAgfSwge1xuICAgICAgICB0eXBlOiAnYXRvbScsXG4gICAgICAgIHZhbHVlOiAnVUlEJ1xuICAgICAgfSwge1xuICAgICAgICB0eXBlOiAnc2VxdWVuY2UnLFxuICAgICAgICB2YWx1ZTogJzE6KidcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2F0b20nLFxuICAgICAgICB2YWx1ZTogJ1gtR00tTVNHSUQnXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgICB2YWx1ZTogJzE0OTkyNTc2NDc0OTA2NjI5NzAnXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdhdG9tJyxcbiAgICAgICAgdmFsdWU6ICdYLUdNLVRIUklEJ1xuICAgICAgfSwge1xuICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgdmFsdWU6ICcxNDk5MjU3NjQ3NDkwNjYyOTcxJ1xuICAgICAgfV1cbiAgICB9KVxuICB9KVxuXG4gIGl0KCdzaG91bGQgY29tcG9zZSBhbiB1bmljb2RlIHNlYXJjaCBjb21tYW5kJywgKCkgPT4ge1xuICAgIGV4cGVjdChidWlsZFNFQVJDSENvbW1hbmQoe1xuICAgICAgYm9keTogJ2rDtWdldmEnXG4gICAgfSwge30pKS50by5kZWVwLmVxdWFsKHtcbiAgICAgIGNvbW1hbmQ6ICdTRUFSQ0gnLFxuICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgdHlwZTogJ2F0b20nLFxuICAgICAgICB2YWx1ZTogJ0NIQVJTRVQnXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdhdG9tJyxcbiAgICAgICAgdmFsdWU6ICdVVEYtOCdcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2F0b20nLFxuICAgICAgICB2YWx1ZTogJ0JPRFknXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdsaXRlcmFsJyxcbiAgICAgICAgdmFsdWU6ICdqw4PCtWdldmEnXG4gICAgICB9XVxuICAgIH0pXG4gIH0pXG59KVxuXG5kZXNjcmliZSgnI19idWlsZFNUT1JFQ29tbWFuZCcsICgpID0+IHtcbiAgaXQoJ3Nob3VsZCBjb21wb3NlIGEgc3RvcmUgY29tbWFuZCBmcm9tIGFuIGFycmF5JywgKCkgPT4ge1xuICAgIGV4cGVjdChidWlsZFNUT1JFQ29tbWFuZCgnMSwyLDMnLCAnRkxBR1MnLCBbJ2EnLCAnYiddLCB7fSkpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgY29tbWFuZDogJ1NUT1JFJyxcbiAgICAgIGF0dHJpYnV0ZXM6IFt7XG4gICAgICAgIHR5cGU6ICdzZXF1ZW5jZScsXG4gICAgICAgIHZhbHVlOiAnMSwyLDMnXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdhdG9tJyxcbiAgICAgICAgdmFsdWU6ICdGTEFHUydcbiAgICAgIH0sXG4gICAgICBbe1xuICAgICAgICB0eXBlOiAnYXRvbScsXG4gICAgICAgIHZhbHVlOiAnYSdcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2F0b20nLFxuICAgICAgICB2YWx1ZTogJ2InXG4gICAgICB9XVxuICAgICAgXVxuICAgIH0pXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCBjb21wb3NlIGEgc3RvcmUgc2V0IGZsYWdzIGNvbW1hbmQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGJ1aWxkU1RPUkVDb21tYW5kKCcxLDIsMycsICdGTEFHUycsIFsnYScsICdiJ10sIHt9KSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICBjb21tYW5kOiAnU1RPUkUnLFxuICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgdHlwZTogJ3NlcXVlbmNlJyxcbiAgICAgICAgdmFsdWU6ICcxLDIsMydcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2F0b20nLFxuICAgICAgICB2YWx1ZTogJ0ZMQUdTJ1xuICAgICAgfSxcbiAgICAgIFt7XG4gICAgICAgIHR5cGU6ICdhdG9tJyxcbiAgICAgICAgdmFsdWU6ICdhJ1xuICAgICAgfSwge1xuICAgICAgICB0eXBlOiAnYXRvbScsXG4gICAgICAgIHZhbHVlOiAnYidcbiAgICAgIH1dXG4gICAgICBdXG4gICAgfSlcbiAgfSlcblxuICBpdCgnc2hvdWxkIGNvbXBvc2UgYSBzdG9yZSBhZGQgZmxhZ3MgY29tbWFuZCcsICgpID0+IHtcbiAgICBleHBlY3QoYnVpbGRTVE9SRUNvbW1hbmQoJzEsMiwzJywgJytGTEFHUycsIFsnYScsICdiJ10sIHt9KSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICBjb21tYW5kOiAnU1RPUkUnLFxuICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgdHlwZTogJ3NlcXVlbmNlJyxcbiAgICAgICAgdmFsdWU6ICcxLDIsMydcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2F0b20nLFxuICAgICAgICB2YWx1ZTogJytGTEFHUydcbiAgICAgIH0sXG4gICAgICBbe1xuICAgICAgICB0eXBlOiAnYXRvbScsXG4gICAgICAgIHZhbHVlOiAnYSdcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2F0b20nLFxuICAgICAgICB2YWx1ZTogJ2InXG4gICAgICB9XVxuICAgICAgXVxuICAgIH0pXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCBjb21wb3NlIGEgc3RvcmUgcmVtb3ZlIGZsYWdzIGNvbW1hbmQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGJ1aWxkU1RPUkVDb21tYW5kKCcxLDIsMycsICctRkxBR1MnLCBbJ2EnLCAnYiddLCB7fSkpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgY29tbWFuZDogJ1NUT1JFJyxcbiAgICAgIGF0dHJpYnV0ZXM6IFt7XG4gICAgICAgIHR5cGU6ICdzZXF1ZW5jZScsXG4gICAgICAgIHZhbHVlOiAnMSwyLDMnXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdhdG9tJyxcbiAgICAgICAgdmFsdWU6ICctRkxBR1MnXG4gICAgICB9LFxuICAgICAgW3tcbiAgICAgICAgdHlwZTogJ2F0b20nLFxuICAgICAgICB2YWx1ZTogJ2EnXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdhdG9tJyxcbiAgICAgICAgdmFsdWU6ICdiJ1xuICAgICAgfV1cbiAgICAgIF1cbiAgICB9KVxuICB9KVxuXG4gIGl0KCdzaG91bGQgY29tcG9zZSBhIHN0b3JlIHJlbW92ZSBzaWxlbnQgZmxhZ3MgY29tbWFuZCcsICgpID0+IHtcbiAgICBleHBlY3QoYnVpbGRTVE9SRUNvbW1hbmQoJzEsMiwzJywgJy1GTEFHUycsIFsnYScsICdiJ10sIHtcbiAgICAgIHNpbGVudDogdHJ1ZVxuICAgIH0pKS50by5kZWVwLmVxdWFsKHtcbiAgICAgIGNvbW1hbmQ6ICdTVE9SRScsXG4gICAgICBhdHRyaWJ1dGVzOiBbe1xuICAgICAgICB0eXBlOiAnc2VxdWVuY2UnLFxuICAgICAgICB2YWx1ZTogJzEsMiwzJ1xuICAgICAgfSwge1xuICAgICAgICB0eXBlOiAnYXRvbScsXG4gICAgICAgIHZhbHVlOiAnLUZMQUdTLlNJTEVOVCdcbiAgICAgIH0sXG4gICAgICBbe1xuICAgICAgICB0eXBlOiAnYXRvbScsXG4gICAgICAgIHZhbHVlOiAnYSdcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2F0b20nLFxuICAgICAgICB2YWx1ZTogJ2InXG4gICAgICB9XVxuICAgICAgXVxuICAgIH0pXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCBjb21wb3NlIGEgdWlkIHN0b3JlIGZsYWdzIGNvbW1hbmQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGJ1aWxkU1RPUkVDb21tYW5kKCcxLDIsMycsICdGTEFHUycsIFsnYScsICdiJ10sIHtcbiAgICAgIGJ5VWlkOiB0cnVlXG4gICAgfSkpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgY29tbWFuZDogJ1VJRCBTVE9SRScsXG4gICAgICBhdHRyaWJ1dGVzOiBbe1xuICAgICAgICB0eXBlOiAnc2VxdWVuY2UnLFxuICAgICAgICB2YWx1ZTogJzEsMiwzJ1xuICAgICAgfSwge1xuICAgICAgICB0eXBlOiAnYXRvbScsXG4gICAgICAgIHZhbHVlOiAnRkxBR1MnXG4gICAgICB9LFxuICAgICAgW3tcbiAgICAgICAgdHlwZTogJ2F0b20nLFxuICAgICAgICB2YWx1ZTogJ2EnXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdhdG9tJyxcbiAgICAgICAgdmFsdWU6ICdiJ1xuICAgICAgfV1cbiAgICAgIF1cbiAgICB9KVxuICB9KVxufSlcbiJdfQ== \ No newline at end of file diff --git a/dist/command-builder.js b/dist/command-builder.js new file mode 100644 index 00000000..7170595f --- /dev/null +++ b/dist/command-builder.js @@ -0,0 +1,241 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.buildFETCHCommand = buildFETCHCommand; +exports.buildXOAuth2Token = buildXOAuth2Token; +exports.buildSEARCHCommand = buildSEARCHCommand; +exports.buildSTORECommand = buildSTORECommand; + +var _emailjsImapHandler = require("emailjs-imap-handler"); + +var _emailjsMimeCodec = require("emailjs-mime-codec"); + +var _emailjsBase = require("emailjs-base64"); + +var _common = require("./common"); + +/** + * Builds a FETCH command + * + * @param {String} sequence Message range selector + * @param {Array} items List of elements to fetch (eg. `['uid', 'envelope']`). + * @param {Object} [options] Optional options object. Use `{byUid:true}` for `UID FETCH` + * @returns {Object} Structured IMAP command + */ +function buildFETCHCommand(sequence, items, options) { + const command = { + command: options.byUid ? 'UID FETCH' : 'FETCH', + attributes: [{ + type: 'SEQUENCE', + value: sequence + }] + }; + + if (options.valueAsString !== undefined) { + command.valueAsString = options.valueAsString; + } + + let query = []; + items.forEach(item => { + item = item.toUpperCase().trim(); + + if (/^\w+$/.test(item)) { + // alphanum strings can be used directly + query.push({ + type: 'ATOM', + value: item + }); + } else if (item) { + try { + // parse the value as a fake command, use only the attributes block + const cmd = (0, _emailjsImapHandler.parser)((0, _common.toTypedArray)('* Z ' + item)); + query = query.concat(cmd.attributes || []); + } catch (e) { + // if parse failed, use the original string as one entity + query.push({ + type: 'ATOM', + value: item + }); + } + } + }); + + if (query.length === 1) { + query = query.pop(); + } + + command.attributes.push(query); + + if (options.changedSince) { + command.attributes.push([{ + type: 'ATOM', + value: 'CHANGEDSINCE' + }, { + type: 'ATOM', + value: options.changedSince + }]); + } + + return command; +} +/** + * Builds a login token for XOAUTH2 authentication command + * + * @param {String} user E-mail address of the user + * @param {String} token Valid access token for the user + * @return {String} Base64 formatted login token + */ + + +function buildXOAuth2Token(user = '', token) { + const authData = [`user=${user}`, `auth=Bearer ${token}`, '', '']; + return (0, _emailjsBase.encode)(authData.join('\x01')); +} +/** + * Compiles a search query into an IMAP command. Queries are composed as objects + * where keys are search terms and values are term arguments. Only strings, + * numbers and Dates are used. If the value is an array, the members of it + * are processed separately (use this for terms that require multiple params). + * If the value is a Date, it is converted to the form of "01-Jan-1970". + * Subqueries (OR, NOT) are made up of objects + * + * {unseen: true, header: ["subject", "hello world"]}; + * SEARCH UNSEEN HEADER "subject" "hello world" + * + * @param {Object} query Search query + * @param {Object} [options] Option object + * @param {Boolean} [options.byUid] If ture, use UID SEARCH instead of SEARCH + * @return {Object} IMAP command object + */ + + +function buildSEARCHCommand(query = {}, options = {}) { + const command = { + command: options.byUid ? 'UID SEARCH' : 'SEARCH' + }; + let isAscii = true; + + const buildTerm = query => { + let list = []; + Object.keys(query).forEach(key => { + let params = []; + + const formatDate = date => date.toUTCString().replace(/^\w+, 0?(\d+) (\w+) (\d+).*/, '$1-$2-$3'); + + const escapeParam = param => { + if (typeof param === 'number') { + return { + type: 'number', + value: param + }; + } else if (typeof param === 'string') { + if (/[\u0080-\uFFFF]/.test(param)) { + isAscii = false; + return { + type: 'literal', + value: (0, _common.fromTypedArray)((0, _emailjsMimeCodec.encode)(param)) // cast unicode string to pseudo-binary as imap-handler compiles strings as octets + + }; + } + + return { + type: 'string', + value: param + }; + } else if (Object.prototype.toString.call(param) === '[object Date]') { + // RFC 3501 allows for dates to be placed in + // double-quotes or left without quotes. Some + // servers (Yandex), do not like the double quotes, + // so we treat the date as an atom. + return { + type: 'atom', + value: formatDate(param) + }; + } else if (Array.isArray(param)) { + return param.map(escapeParam); + } else if (typeof param === 'object') { + return buildTerm(param); + } + }; + + params.push({ + type: 'atom', + value: key.toUpperCase() + }); + [].concat(query[key] || []).forEach(param => { + switch (key.toLowerCase()) { + case 'uid': + param = { + type: 'sequence', + value: param + }; + break; + // The Gmail extension values of X-GM-THRID and + // X-GM-MSGID are defined to be unsigned 64-bit integers + // and they must not be quoted strings or the server + // will report a parse error. + + case 'x-gm-thrid': + case 'x-gm-msgid': + param = { + type: 'number', + value: param + }; + break; + + default: + param = escapeParam(param); + } + + if (param) { + params = params.concat(param || []); + } + }); + list = list.concat(params || []); + }); + return list; + }; + + command.attributes = buildTerm(query); // If any string input is using 8bit bytes, prepend the optional CHARSET argument + + if (!isAscii) { + command.attributes.unshift({ + type: 'atom', + value: 'UTF-8' + }); + command.attributes.unshift({ + type: 'atom', + value: 'CHARSET' + }); + } + + return command; +} +/** + * Creates an IMAP STORE command from the selected arguments + */ + + +function buildSTORECommand(sequence, action = '', flags = [], options = {}) { + const command = { + command: options.byUid ? 'UID STORE' : 'STORE', + attributes: [{ + type: 'sequence', + value: sequence + }] + }; + command.attributes.push({ + type: 'atom', + value: action.toUpperCase() + (options.silent ? '.SILENT' : '') + }); + command.attributes.push(flags.map(flag => { + return { + type: 'atom', + value: flag + }; + })); + return command; +} +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21tYW5kLWJ1aWxkZXIuanMiXSwibmFtZXMiOlsiYnVpbGRGRVRDSENvbW1hbmQiLCJzZXF1ZW5jZSIsIml0ZW1zIiwib3B0aW9ucyIsImNvbW1hbmQiLCJieVVpZCIsImF0dHJpYnV0ZXMiLCJ0eXBlIiwidmFsdWUiLCJ2YWx1ZUFzU3RyaW5nIiwidW5kZWZpbmVkIiwicXVlcnkiLCJmb3JFYWNoIiwiaXRlbSIsInRvVXBwZXJDYXNlIiwidHJpbSIsInRlc3QiLCJwdXNoIiwiY21kIiwiY29uY2F0IiwiZSIsImxlbmd0aCIsInBvcCIsImNoYW5nZWRTaW5jZSIsImJ1aWxkWE9BdXRoMlRva2VuIiwidXNlciIsInRva2VuIiwiYXV0aERhdGEiLCJqb2luIiwiYnVpbGRTRUFSQ0hDb21tYW5kIiwiaXNBc2NpaSIsImJ1aWxkVGVybSIsImxpc3QiLCJPYmplY3QiLCJrZXlzIiwia2V5IiwicGFyYW1zIiwiZm9ybWF0RGF0ZSIsImRhdGUiLCJ0b1VUQ1N0cmluZyIsInJlcGxhY2UiLCJlc2NhcGVQYXJhbSIsInBhcmFtIiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJjYWxsIiwiQXJyYXkiLCJpc0FycmF5IiwibWFwIiwidG9Mb3dlckNhc2UiLCJ1bnNoaWZ0IiwiYnVpbGRTVE9SRUNvbW1hbmQiLCJhY3Rpb24iLCJmbGFncyIsInNpbGVudCIsImZsYWciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFLQTs7Ozs7Ozs7QUFRTyxTQUFTQSxpQkFBVCxDQUE0QkMsUUFBNUIsRUFBc0NDLEtBQXRDLEVBQTZDQyxPQUE3QyxFQUFzRDtBQUMzRCxRQUFNQyxPQUFPLEdBQUc7QUFDZEEsSUFBQUEsT0FBTyxFQUFFRCxPQUFPLENBQUNFLEtBQVIsR0FBZ0IsV0FBaEIsR0FBOEIsT0FEekI7QUFFZEMsSUFBQUEsVUFBVSxFQUFFLENBQUM7QUFDWEMsTUFBQUEsSUFBSSxFQUFFLFVBREs7QUFFWEMsTUFBQUEsS0FB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bnRlbnQiOlsiaW1wb3J0IHsgcGFyc2VyIH0gZnJvbSAnZW1haWxqcy1pbWFwLWhhbmRsZXInXG5pbXBvcnQgeyBlbmNvZGUgfSBmcm9tICdlbWFpbGpzLW1pbWUtY29kZWMnXG5pbXBvcnQgeyBlbmNvZGUgYXMgZW5jb2RlQmFzZTY0IH0gZnJvbSAnZW1haWxqcy1iYXNlNjQnXG5pbXBvcnQge1xuICBmcm9tVHlwZWRBcnJheSxcbiAgdG9UeXBlZEFycmF5XG59IGZyb20gJy4vY29tbW9uJ1xuXG4vKipcbiAqIEJ1aWxkcyBhIEZFVENIIGNvbW1hbmRcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VxdWVuY2UgTWVzc2FnZSByYW5nZSBzZWxlY3RvclxuICogQHBhcmFtIHtBcnJheX0gaXRlbXMgTGlzdCBvZiBlbGVtZW50cyB0byBmZXRjaCAoZWcuIGBbJ3VpZCcsICdlbnZlbG9wZSddYCkuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIE9wdGlvbmFsIG9wdGlvbnMgb2JqZWN0LiBVc2UgYHtieVVpZDp0cnVlfWAgZm9yIGBVSUQgRkVUQ0hgXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBTdHJ1Y3R1cmVkIElNQVAgY29tbWFuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRGRVRDSENvbW1hbmQgKHNlcXVlbmNlLCBpdGVtcywgb3B0aW9ucykge1xuICBjb25zdCBjb21tYW5kID0ge1xuICAgIGNvbW1hbmQ6IG9wdGlvbnMuYnlVaWQgPyAnVUlEIEZFVENIJyA6ICdGRVRDSCcsXG4gICAgYXR0cmlidXRlczogW3tcbiAgICAgIHR5cGU6ICdTRVFVRU5DRScsXG4gICAgICB2YWx1ZTogc2VxdWVuY2VcbiAgICB9XVxuICB9XG5cbiAgaWYgKG9wdGlvbnMudmFsdWVBc1N0cmluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29tbWFuZC52YWx1ZUFzU3RyaW5nID0gb3B0aW9ucy52YWx1ZUFzU3RyaW5nXG4gIH1cblxuICBsZXQgcXVlcnkgPSBbXVxuXG4gIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICBpdGVtID0gaXRlbS50b1VwcGVyQ2FzZSgpLnRyaW0oKVxuXG4gICAgaWYgKC9eXFx3KyQvLnRlc3QoaXRlbSkpIHtcbiAgICAgIC8vIGFscGhhbnVtIHN0cmluZ3MgY2FuIGJlIHVzZWQgZGlyZWN0bHlcbiAgICAgIHF1ZXJ5LnB1c2goe1xuICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgIHZhbHVlOiBpdGVtXG4gICAgICB9KVxuICAgIH0gZWxzZSBpZiAoaXRlbSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gcGFyc2UgdGhlIHZhbHVlIGFzIGEgZmFrZSBjb21tYW5kLCB1c2Ugb25seSB0aGUgYXR0cmlidXRlcyBibG9ja1xuICAgICAgICBjb25zdCBjbWQgPSBwYXJzZXIodG9UeXBlZEFycmF5KCcqIFogJyArIGl0ZW0pKVxuICAgICAgICBxdWVyeSA9IHF1ZXJ5LmNvbmNhdChjbWQuYXR0cmlidXRlcyB8fCBbXSlcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaWYgcGFyc2UgZmFpbGVkLCB1c2UgdGhlIG9yaWdpbmFsIHN0cmluZyBhcyBvbmUgZW50aXR5XG4gICAgICAgIHF1ZXJ5LnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICB2YWx1ZTogaXRlbVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICBpZiAocXVlcnkubGVuZ3RoID09PSAxKSB7XG4gICAgcXVlcnkgPSBxdWVyeS5wb3AoKVxuICB9XG5cbiAgY29tbWFuZC5hdHRyaWJ1dGVzLnB1c2gocXVlcnkpXG5cbiAgaWYgKG9wdGlvbnMuY2hhbmdlZFNpbmNlKSB7XG4gICAgY29tbWFuZC5hdHRyaWJ1dGVzLnB1c2goW3tcbiAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgIHZhbHVlOiAnQ0hBTkdFRFNJTkNFJ1xuICAgIH0sIHtcbiAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgIHZhbHVlOiBvcHRpb25zLmNoYW5nZWRTaW5jZVxuICAgIH1dKVxuICB9XG5cbiAgcmV0dXJuIGNvbW1hbmRcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBsb2dpbiB0b2tlbiBmb3IgWE9BVVRIMiBhdXRoZW50aWNhdGlvbiBjb21tYW5kXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVzZXIgRS1tYWlsIGFkZHJlc3Mgb2YgdGhlIHVzZXJcbiAqIEBwYXJhbSB7U3RyaW5nfSB0b2tlbiBWYWxpZCBhY2Nlc3MgdG9rZW4gZm9yIHRoZSB1c2VyXG4gKiBAcmV0dXJuIHtTdHJpbmd9IEJhc2U2NCBmb3JtYXR0ZWQgbG9naW4gdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkWE9BdXRoMlRva2VuICh1c2VyID0gJycsIHRva2VuKSB7XG4gIGNvbnN0IGF1dGhEYXRhID0gW1xuICAgIGB1c2VyPSR7dXNlcn1gLFxuICAgIGBhdXRoPUJlYXJlciAke3Rva2VufWAsXG4gICAgJycsXG4gICAgJydcbiAgXVxuICByZXR1cm4gZW5jb2RlQmFzZTY0KGF1dGhEYXRhLmpvaW4oJ1xceDAxJykpXG59XG5cbi8qKlxuICogQ29tcGlsZXMgYSBzZWFyY2ggcXVlcnkgaW50byBhbiBJTUFQIGNvbW1hbmQuIFF1ZXJpZXMgYXJlIGNvbXBvc2VkIGFzIG9iamVjdHNcbiAqIHdoZXJlIGtleXMgYXJlIHNlYXJjaCB0ZXJtcyBhbmQgdmFsdWVzIGFyZSB0ZXJtIGFyZ3VtZW50cy4gT25seSBzdHJpbmdzLFxuICogbnVtYmVycyBhbmQgRGF0ZXMgYXJlIHVzZWQuIElmIHRoZSB2YWx1ZSBpcyBhbiBhcnJheSwgdGhlIG1lbWJlcnMgb2YgaXRcbiAqIGFyZSBwcm9jZXNzZWQgc2VwYXJhdGVseSAodXNlIHRoaXMgZm9yIHRlcm1zIHRoYXQgcmVxdWlyZSBtdWx0aXBsZSBwYXJhbXMpLlxuICogSWYgdGhlIHZhbHVlIGlzIGEgRGF0ZSwgaXQgaXMgY29udmVydGVkIHRvIHRoZSBmb3JtIG9mIFwiMDEtSmFuLTE5NzBcIi5cbiAqIFN1YnF1ZXJpZXMgKE9SLCBOT1QpIGFyZSBtYWRlIHVwIG9mIG9iamVjdHNcbiAqXG4gKiAgICB7dW5zZWVuOiB0cnVlLCBoZWFkZXI6IFtcInN1YmplY3RcIiwgXCJoZWxsbyB3b3JsZFwiXX07XG4gKiAgICBTRUFSQ0ggVU5TRUVOIEhFQURFUiBcInN1YmplY3RcIiBcImhlbGxvIHdvcmxkXCJcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcXVlcnkgU2VhcmNoIHF1ZXJ5XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIE9wdGlvbiBvYmplY3RcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYnlVaWRdIElmIHR1cmUsIHVzZSBVSUQgU0VBUkNIIGluc3RlYWQgb2YgU0VBUkNIXG4gKiBAcmV0dXJuIHtPYmplY3R9IElNQVAgY29tbWFuZCBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU0VBUkNIQ29tbWFuZCAocXVlcnkgPSB7fSwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IGNvbW1hbmQgPSB7XG4gICAgY29tbWFuZDogb3B0aW9ucy5ieVVpZCA/ICdVSUQgU0VBUkNIJyA6ICdTRUFSQ0gnXG4gIH1cblxuICBsZXQgaXNBc2NpaSA9IHRydWVcblxuICBjb25zdCBidWlsZFRlcm0gPSAocXVlcnkpID0+IHtcbiAgICBsZXQgbGlzdCA9IFtdXG5cbiAgICBPYmplY3Qua2V5cyhxdWVyeSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBsZXQgcGFyYW1zID0gW11cbiAgICAgIGNvbnN0IGZvcm1hdERhdGUgPSAoZGF0ZSkgPT4gZGF0ZS50b1VUQ1N0cmluZygpLnJlcGxhY2UoL15cXHcrLCAwPyhcXGQrKSAoXFx3KykgKFxcZCspLiovLCAnJDEtJDItJDMnKVxuICAgICAgY29uc3QgZXNjYXBlUGFyYW0gPSAocGFyYW0pID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgICAgICB2YWx1ZTogcGFyYW1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGlmICgvW1xcdTAwODAtXFx1RkZGRl0vLnRlc3QocGFyYW0pKSB7XG4gICAgICAgICAgICBpc0FzY2lpID0gZmFsc2VcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdsaXRlcmFsJyxcbiAgICAgICAgICAgICAgdmFsdWU6IGZyb21UeXBlZEFycmF5KGVuY29kZShwYXJhbSkpIC8vIGNhc3QgdW5pY29kZSBzdHJpbmcgdG8gcHNldWRvLWJpbmFyeSBhcyBpbWFwLWhhbmRsZXIgY29tcGlsZXMgc3RyaW5ncyBhcyBvY3RldHNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgdmFsdWU6IHBhcmFtXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChwYXJhbSkgPT09ICdbb2JqZWN0IERhdGVdJykge1xuICAgICAgICAgIC8vIFJGQyAzNTAxIGFsbG93cyBmb3IgZGF0ZXMgdG8gYmUgcGxhY2VkIGluXG4gICAgICAgICAgLy8gZG91YmxlLXF1b3RlcyBvciBsZWZ0IHdpdGhvdXQgcXVvdGVzLiAgU29tZVxuICAgICAgICAgIC8vIHNlcnZlcnMgKFlhbmRleCksIGRvIG5vdCBsaWtlIHRoZSBkb3VibGUgcXVvdGVzLFxuICAgICAgICAgIC8vIHNvIHdlIHRyZWF0IHRoZSBkYXRlIGFzIGFuIGF0b20uXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdhdG9tJyxcbiAgICAgICAgICAgIHZhbHVlOiBmb3JtYXREYXRlKHBhcmFtKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHBhcmFtKSkge1xuICAgICAgICAgIHJldHVybiBwYXJhbS5tYXAoZXNjYXBlUGFyYW0pXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHJldHVybiBidWlsZFRlcm0ocGFyYW0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcGFyYW1zLnB1c2goe1xuICAgICAgICB0eXBlOiAnYXRvbScsXG4gICAgICAgIHZhbHVlOiBrZXkudG9VcHBlckNhc2UoKVxuICAgICAgfSk7XG5cbiAgICAgIFtdLmNvbmNhdChxdWVyeVtrZXldIHx8IFtdKS5mb3JFYWNoKChwYXJhbSkgPT4ge1xuICAgICAgICBzd2l0Y2ggKGtleS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgY2FzZSAndWlkJzpcbiAgICAgICAgICAgIHBhcmFtID0ge1xuICAgICAgICAgICAgICB0eXBlOiAnc2VxdWVuY2UnLFxuICAgICAgICAgICAgICB2YWx1ZTogcGFyYW1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgLy8gVGhlIEdtYWlsIGV4dGVuc2lvbiB2YWx1ZXMgb2YgWC1HTS1USFJJRCBhbmRcbiAgICAgICAgICAvLyBYLUdNLU1TR0lEIGFyZSBkZWZpbmVkIHRvIGJlIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2Vyc1xuICAgICAgICAgIC8vIGFuZCB0aGV5IG11c3Qgbm90IGJlIHF1b3RlZCBzdHJpbmdzIG9yIHRoZSBzZXJ2ZXJcbiAgICAgICAgICAvLyB3aWxsIHJlcG9ydCBhIHBhcnNlIGVycm9yLlxuICAgICAgICAgIGNhc2UgJ3gtZ20tdGhyaWQnOlxuICAgICAgICAgIGNhc2UgJ3gtZ20tbXNnaWQnOlxuICAgICAgICAgICAgcGFyYW0gPSB7XG4gICAgICAgICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgICAgICAgICB2YWx1ZTogcGFyYW1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHBhcmFtID0gZXNjYXBlUGFyYW0ocGFyYW0pXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtKSB7XG4gICAgICAgICAgcGFyYW1zID0gcGFyYW1zLmNvbmNhdChwYXJhbSB8fCBbXSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIGxpc3QgPSBsaXN0LmNvbmNhdChwYXJhbXMgfHwgW10pXG4gICAgfSlcblxuICAgIHJldHVybiBsaXN0XG4gIH1cblxuICBjb21tYW5kLmF0dHJpYnV0ZXMgPSBidWlsZFRlcm0ocXVlcnkpXG5cbiAgLy8gSWYgYW55IHN0cmluZyBpbnB1dCBpcyB1c2luZyA4Yml0IGJ5dGVzLCBwcmVwZW5kIHRoZSBvcHRpb25hbCBDSEFSU0VUIGFyZ3VtZW50XG4gIGlmICghaXNBc2NpaSkge1xuICAgIGNvbW1hbmQuYXR0cmlidXRlcy51bnNoaWZ0KHtcbiAgICAgIHR5cGU6ICdhdG9tJyxcbiAgICAgIHZhbHVlOiAnVVRGLTgnXG4gICAgfSlcbiAgICBjb21tYW5kLmF0dHJpYnV0ZXMudW5zaGlmdCh7XG4gICAgICB0eXBlOiAnYXRvbScsXG4gICAgICB2YWx1ZTogJ0NIQVJTRVQnXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBjb21tYW5kXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBJTUFQIFNUT1JFIGNvbW1hbmQgZnJvbSB0aGUgc2VsZWN0ZWQgYXJndW1lbnRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFNUT1JFQ29tbWFuZCAoc2VxdWVuY2UsIGFjdGlvbiA9ICcnLCBmbGFncyA9IFtdLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgY29tbWFuZCA9IHtcbiAgICBjb21tYW5kOiBvcHRpb25zLmJ5VWlkID8gJ1VJRCBTVE9SRScgOiAnU1RPUkUnLFxuICAgIGF0dHJpYnV0ZXM6IFt7XG4gICAgICB0eXBlOiAnc2VxdWVuY2UnLFxuICAgICAgdmFsdWU6IHNlcXVlbmNlXG4gICAgfV1cbiAgfVxuXG4gIGNvbW1hbmQuYXR0cmlidXRlcy5wdXNoKHtcbiAgICB0eXBlOiAnYXRvbScsXG4gICAgdmFsdWU6IGFjdGlvbi50b1VwcGVyQ2FzZSgpICsgKG9wdGlvbnMuc2lsZW50ID8gJy5TSUxFTlQnIDogJycpXG4gIH0pXG5cbiAgY29tbWFuZC5hdHRyaWJ1dGVzLnB1c2goZmxhZ3MubWFwKChmbGFnKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdhdG9tJyxcbiAgICAgIHZhbHVlOiBmbGFnXG4gICAgfVxuICB9KSlcblxuICByZXR1cm4gY29tbWFuZFxufVxuIl19 \ No newline at end of file diff --git a/dist/command-parser-unit.js b/dist/command-parser-unit.js new file mode 100644 index 00000000..27ceef50 --- /dev/null +++ b/dist/command-parser-unit.js @@ -0,0 +1,461 @@ +"use strict"; + +var _emailjsImapHandler = require("emailjs-imap-handler"); + +var _commandParser = require("./command-parser"); + +var _common = require("./common"); + +var _envelope = _interopRequireDefault(require("../res/fixtures/envelope")); + +var _mimeTortureBodystructure = _interopRequireDefault(require("../res/fixtures/mime-torture-bodystructure")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/* eslint-disable no-unused-expressions */ + +/* eslint-disable no-useless-escape */ +describe('parseNAMESPACE', () => { + it('should not succeed for no namespace response', () => { + expect((0, _commandParser.parseNAMESPACE)({ + payload: { + NAMESPACE: [] + } + })).to.be.false; + }); + it('should return single personal namespace', () => { + expect((0, _commandParser.parseNAMESPACE)({ + payload: { + NAMESPACE: [{ + attributes: [[[{ + type: 'STRING', + value: 'INBOX.' + }, { + type: 'STRING', + value: '.' + }]], null, null] + }] + } + })).to.deep.equal({ + personal: [{ + prefix: 'INBOX.', + delimiter: '.' + }], + users: false, + shared: false + }); + }); + it('should return single personal, single users, multiple shared', () => { + expect((0, _commandParser.parseNAMESPACE)({ + payload: { + NAMESPACE: [{ + attributes: [// personal + [[{ + type: 'STRING', + value: '' + }, { + type: 'STRING', + value: '/' + }]], // users + [[{ + type: 'STRING', + value: '~' + }, { + type: 'STRING', + value: '/' + }]], // shared + [[{ + type: 'STRING', + value: '#shared/' + }, { + type: 'STRING', + value: '/' + }], [{ + type: 'STRING', + value: '#public/' + }, { + type: 'STRING', + value: '/' + }]]] + }] + } + })).to.deep.equal({ + personal: [{ + prefix: '', + delimiter: '/' + }], + users: [{ + prefix: '~', + delimiter: '/' + }], + shared: [{ + prefix: '#shared/', + delimiter: '/' + }, { + prefix: '#public/', + delimiter: '/' + }] + }); + }); + it('should handle NIL namespace hierarchy delim', () => { + expect((0, _commandParser.parseNAMESPACE)({ + payload: { + NAMESPACE: [// This specific value is returned by yahoo.co.jp's + // imapgate version 0.7.68_11_1.61475 IMAP server + (0, _emailjsImapHandler.parser)((0, _common.toTypedArray)('* NAMESPACE (("" NIL)) NIL NIL'))] + } + })).to.deep.equal({ + personal: [{ + prefix: '', + delimiter: null + }], + users: false, + shared: false + }); + }); +}); +describe('parseSELECT', () => { + it('should parse a complete response', () => { + expect((0, _commandParser.parseSELECT)({ + code: 'READ-WRITE', + payload: { + EXISTS: [{ + nr: 123 + }], + FLAGS: [{ + attributes: [[{ + type: 'ATOM', + value: '\\Answered' + }, { + type: 'ATOM', + value: '\\Flagged' + }]] + }], + OK: [{ + code: 'PERMANENTFLAGS', + permanentflags: ['\\Answered', '\\Flagged'] + }, { + code: 'UIDVALIDITY', + uidvalidity: '2' + }, { + code: 'UIDNEXT', + uidnext: '38361' + }, { + code: 'HIGHESTMODSEQ', + highestmodseq: '3682918' + }] + } + })).to.deep.equal({ + exists: 123, + flags: ['\\Answered', '\\Flagged'], + highestModseq: '3682918', + permanentFlags: ['\\Answered', '\\Flagged'], + readOnly: false, + uidNext: 38361, + uidValidity: 2 + }); + }); + it('should parse response with no modseq', () => { + expect((0, _commandParser.parseSELECT)({ + code: 'READ-WRITE', + payload: { + EXISTS: [{ + nr: 123 + }], + FLAGS: [{ + attributes: [[{ + type: 'ATOM', + value: '\\Answered' + }, { + type: 'ATOM', + value: '\\Flagged' + }]] + }], + OK: [{ + code: 'PERMANENTFLAGS', + permanentflags: ['\\Answered', '\\Flagged'] + }, { + code: 'UIDVALIDITY', + uidvalidity: '2' + }, { + code: 'UIDNEXT', + uidnext: '38361' + }] + } + })).to.deep.equal({ + exists: 123, + flags: ['\\Answered', '\\Flagged'], + permanentFlags: ['\\Answered', '\\Flagged'], + readOnly: false, + uidNext: 38361, + uidValidity: 2 + }); + }); + it('should parse response with read-only', () => { + expect((0, _commandParser.parseSELECT)({ + code: 'READ-ONLY', + payload: { + EXISTS: [{ + nr: 123 + }], + FLAGS: [{ + attributes: [[{ + type: 'ATOM', + value: '\\Answered' + }, { + type: 'ATOM', + value: '\\Flagged' + }]] + }], + OK: [{ + code: 'PERMANENTFLAGS', + permanentflags: ['\\Answered', '\\Flagged'] + }, { + code: 'UIDVALIDITY', + uidvalidity: '2' + }, { + code: 'UIDNEXT', + uidnext: '38361' + }] + } + })).to.deep.equal({ + exists: 123, + flags: ['\\Answered', '\\Flagged'], + permanentFlags: ['\\Answered', '\\Flagged'], + readOnly: true, + uidNext: 38361, + uidValidity: 2 + }); + }); + it('should parse response with NOMODSEQ flag', () => { + expect((0, _commandParser.parseSELECT)({ + code: 'READ-WRITE', + payload: { + EXISTS: [{ + nr: 123 + }], + FLAGS: [{ + attributes: [[{ + type: 'ATOM', + value: '\\Answered' + }, { + type: 'ATOM', + value: '\\Flagged' + }]] + }], + OK: [{ + code: 'PERMANENTFLAGS', + permanentflags: ['\\Answered', '\\Flagged'] + }, { + code: 'UIDVALIDITY', + uidvalidity: '2' + }, { + code: 'UIDNEXT', + uidnext: '38361' + }, { + code: 'NOMODSEQ' + }] + } + })).to.deep.equal({ + exists: 123, + flags: ['\\Answered', '\\Flagged'], + permanentFlags: ['\\Answered', '\\Flagged'], + readOnly: false, + uidNext: 38361, + uidValidity: 2, + noModseq: true + }); + }); +}); +describe('parseENVELOPE', () => { + it('should parsed envelope object', () => { + expect((0, _commandParser.parseENVELOPE)(_envelope.default.source)).to.deep.equal(_envelope.default.parsed); + }); +}); +describe('parseBODYSTRUCTURE', () => { + it('should parse bodystructure object', () => { + expect((0, _commandParser.parseBODYSTRUCTURE)(_mimeTortureBodystructure.default.source)).to.deep.equal(_mimeTortureBodystructure.default.parsed); + }); + it('should parse bodystructure with unicode filename', () => { + var input = [[{ + type: 'STRING', + value: 'APPLICATION' + }, { + type: 'STRING', + value: 'OCTET-STREAM' + }, null, null, null, { + type: 'STRING', + value: 'BASE64' + }, { + type: 'ATOM', + value: '40' + }, null, [{ + type: 'STRING', + value: 'ATTACHMENT' + }, [{ + type: 'STRING', + value: 'FILENAME' + }, { + type: 'STRING', + value: '=?ISO-8859-1?Q?BBR_Handel,_Gewerbe,_B=FCrobetriebe,?= =?ISO-8859-1?Q?_private_Bildungseinrichtungen.txt?=' + }]], null], { + type: 'STRING', + value: 'MIXED' + }, [{ + type: 'STRING', + value: 'BOUNDARY' + }, { + type: 'STRING', + value: '----sinikael-?=_1-14105085265110.49903922458179295' + }], null, null]; + var expected = { + childNodes: [{ + part: '1', + type: 'application/octet-stream', + encoding: 'base64', + size: 40, + disposition: 'attachment', + dispositionParameters: { + filename: 'BBR Handel, Gewerbe, Bürobetriebe, private Bildungseinrichtungen.txt' + } + }], + type: 'multipart/mixed', + parameters: { + boundary: '----sinikael-?=_1-14105085265110.49903922458179295' + } + }; + expect((0, _commandParser.parseBODYSTRUCTURE)(input)).to.deep.equal(expected); + }); +}); +describe('parseFETCH', () => { + it('should return values lowercase keys', () => { + expect((0, _commandParser.parseFETCH)({ + payload: { + FETCH: [{ + nr: 123, + attributes: [[{ + type: 'ATOM', + value: 'BODY', + section: [{ + type: 'ATOM', + value: 'HEADER' + }, [{ + type: 'ATOM', + value: 'DATE' + }, { + type: 'ATOM', + value: 'SUBJECT' + }]], + partial: [0, 123] + }, { + type: 'ATOM', + value: 'abc' + }]] + }] + } + })).to.deep.equal([{ + '#': 123, + 'body[header (date subject)]<0.123>': 'abc' + }]); + }); + it('should merge multiple responses based on sequence number', () => { + expect((0, _commandParser.parseFETCH)({ + payload: { + FETCH: [{ + nr: 123, + attributes: [[{ + type: 'ATOM', + value: 'UID' + }, { + type: 'ATOM', + value: 789 + }]] + }, { + nr: 124, + attributes: [[{ + type: 'ATOM', + value: 'UID' + }, { + type: 'ATOM', + value: 790 + }]] + }, { + nr: 123, + attributes: [[{ + type: 'ATOM', + value: 'MODSEQ' + }, { + type: 'ATOM', + value: '127' + }]] + }] + } + })).to.deep.equal([{ + '#': 123, + uid: 789, + modseq: '127' + }, { + '#': 124, + uid: 790 + }]); + }); +}); +describe('parseSEARCH', () => { + it('should parse SEARCH response', () => { + expect((0, _commandParser.parseSEARCH)({ + payload: { + SEARCH: [{ + attributes: [{ + value: 5 + }, { + value: 7 + }] + }, { + attributes: [{ + value: 6 + }] + }] + } + })).to.deep.equal([5, 6, 7]); + }); + it('should parse empty SEARCH response', () => { + expect((0, _commandParser.parseSEARCH)({ + payload: { + SEARCH: [{ + command: 'SEARCH', + tag: '*' + }] + } + })).to.deep.equal([]); + }); +}); +describe('parseCOPY', () => { + it('should parse COPY response', () => { + expect((0, _commandParser.parseCOPY)({ + copyuid: ['1', '1:3', '3,4,2'] + })).to.deep.equal({ + srcSeqSet: '1:3', + destSeqSet: '3,4,2' + }); + }); + it('should return undefined when response does not contain copyuid', () => { + expect((0, _commandParser.parseCOPY)({})).to.equal(undefined); + }); + it('should return undefined when response is not defined', () => { + expect((0, _commandParser.parseCOPY)()).to.equal(undefined); + }); +}); +describe('parseAPPEND', () => { + it('should parse APPEND response', () => { + expect((0, _commandParser.parseAPPEND)({ + appenduid: ['1', '3'] + })).to.equal('3'); + }); + it('should return undefined when response does not contain copyuid', () => { + expect((0, _commandParser.parseAPPEND)({})).to.equal(undefined); + }); + it('should return undefined when response is not defined', () => { + expect((0, _commandParser.parseAPPEND)()).to.equal(undefined); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21tYW5kLXBhcnNlci11bml0LmpzIl0sIm5hbWVzIjpbImRlc2NyaWJlIiwiaXQiLCJleHBlY3QiLCJwYXlsb2FkIiwiTkFNRVNQQUNFIiwidG8iLCJiZSIsImZhbHNlIiwiYXR0cmlidXRlcyIsInR5cGUiLCJ2YWx1ZSIsImRlZXAiLCJlcXVhbCIsInBlcnNvbmFsIiwicHJlZml4IiwiZGVsaW1pdGVyIiwidXNlcnMiLCJzaGFyZWQiLCJjb2RlIiwiRVhJU1RTIiwibnIiLCJGTEFHUyIsIk9LIiwicGVybWFuZW50ZmxhZ3MiLCJ1aWR2YWxpZGl0eSIsInVpZG5leHQiLCJoaWdoZXN0bW9kc2VxIiwiZXhpc3RzIiwiZmxhZ3MiLCJoaWdoZXN0TW9kc2VxIiwicGVybWFuZW50RmxhZ3MiLCJyZWFkT25seSIsInVpZE5leHQiLCJ1aWRWYWxpZGl0eSIsIm5vTW9kc2VxIiwidGVzdEVudmVsb3BlIiwic291cmNlIiwicGFyc2VkIiwibWltZVRvcnR1cmUiLCJpbnB1dCIsImV4cGVjdGVkIiwiY2hpbGROb2RlcyIsInBhcnQiLCJlbmNvZGluZyIsInNpemUiLCJkaXNwb3NpdGlvbiIsImRpc3Bvc2l0aW9uUGFyYW1ldGVycyIsImZpbGVuYW1lIiwicGFyYW1ldGVycyIsImJvdW5kYXJ5IiwiRkVUQ0giLCJzZWN0aW9uIiwicGFydGlhbCIsInVpZCIsIm1vZHNlcSIsIlNFQVJDSCIsImNvbW1hbmQiLCJ0YWciLCJjb3B5dWlkIiwic3JjU2VxU2V0IiwiZGVzdFNlcVNldCIsInVuZGVmaW5lZCIsImFwcGVuZHVpZCJdLCJtYXBwaW5ncyI6Ijs7QUFHQTs7QUFDQTs7QUFVQTs7QUFDQTs7QUFDQTs7OztBQWhCQTs7QUFDQTtBQWlCQUEsUUFBUSxDQUFDLGdCQUFELEVBQW1CLE1BQU07QUFDL0JDLEVBQUFBLEVBQUUsQ0FBQyw4Q0FBRCxFQUFpRCxNQUFNO0FBQ3ZEQyxJQUFBQSxNQUFNLENBQUMsbUNBQWU7QUFDcEJDLE1BQUFBLE9BQU8sRUFBRTtB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QUErQmlELFNBQS9CO0FBQ0QsR0FGQyxDQUFGO0FBSUE1RCxFQUFBQSxFQUFFLENBQUMsc0RBQUQsRUFBeUQsTUFBTTtBQUMvREMsSUFBQUEsTUFBTSxDQUFDLCtCQUFELENBQU4sQ0FBb0JHLEVBQXBCLENBQXVCTyxLQUF2QixDQUE2QmlELFNBQTdCO0FBQ0QsR0FGQyxDQUFGO0FBR0QsQ0FqQk8sQ0FBUjtBQW1CQTdELFFBQVEsQ0FBQyxhQUFELEVBQWdCLE1BQU07QUFDNUJDLEVBQUFBLEVBQUUsQ0FBQyw4QkFBRCxFQUFpQyxNQUFNO0FBQ3ZDQyxJQUFBQSxNQUFNLENBQUMsZ0NBQVk7QUFDakI0RCxNQUFBQSxTQUFTLEVBQUUsQ0FBQyxHQUFELEVBQU0sR0FBTjtBQURNLEtBQVosQ0FBRCxDQUFOLENBRUl6RCxFQUZKLENBRU9PLEtBRlAsQ0FFYSxHQUZiO0FBR0QsR0FKQyxDQUFGO0FBTUFYLEVBQUFBLEVBQUUsQ0FBQyxnRUFBRCxFQUFtRSxNQUFNO0FBQ3pFQyxJQUFBQSxNQUFNLENBQUMsZ0NBQVksRUFBWixDQUFELENBQU4sQ0FBd0JHLEVBQXhCLENBQTJCTyxLQUEzQixDQUFpQ2lELFNBQWpDO0FBQ0QsR0FGQyxDQUFGO0FBSUE1RCxFQUFBQSxFQUFFLENBQUMsc0RBQUQsRUFBeUQsTUFBTTtBQUMvREMsSUFBQUEsTUFBTSxDQUFDLGlDQUFELENBQU4sQ0FBc0JHLEVBQXRCLENBQXlCTyxLQUF6QixDQUErQmlELFNBQS9CO0FBQ0QsR0FGQyxDQUFGO0FBR0QsQ0FkTyxDQUFSIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11c2VsZXNzLWVzY2FwZSAqL1xuXG5pbXBvcnQgeyBwYXJzZXIgfSBmcm9tICdlbWFpbGpzLWltYXAtaGFuZGxlcidcbmltcG9ydCB7XG4gIHBhcnNlQVBQRU5ELFxuICBwYXJzZUNPUFksXG4gIHBhcnNlU0VBUkNILFxuICBwYXJzZU5BTUVTUEFDRSxcbiAgcGFyc2VFTlZFTE9QRSxcbiAgcGFyc2VTRUxFQ1QsXG4gIHBhcnNlQk9EWVNUUlVDVFVSRSxcbiAgcGFyc2VGRVRDSFxufSBmcm9tICcuL2NvbW1hbmQtcGFyc2VyJ1xuaW1wb3J0IHsgdG9UeXBlZEFycmF5IH0gZnJvbSAnLi9jb21tb24nXG5pbXBvcnQgdGVzdEVudmVsb3BlIGZyb20gJy4uL3Jlcy9maXh0dXJlcy9lbnZlbG9wZSdcbmltcG9ydCBtaW1lVG9ydHVyZSBmcm9tICcuLi9yZXMvZml4dHVyZXMvbWltZS10b3J0dXJlLWJvZHlzdHJ1Y3R1cmUnXG5cbmRlc2NyaWJlKCdwYXJzZU5BTUVTUEFDRScsICgpID0+IHtcbiAgaXQoJ3Nob3VsZCBub3Qgc3VjY2VlZCBmb3Igbm8gbmFtZXNwYWNlIHJlc3BvbnNlJywgKCkgPT4ge1xuICAgIGV4cGVjdChwYXJzZU5BTUVTUEFDRSh7XG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIE5BTUVTUEFDRTogW11cbiAgICAgIH1cbiAgICB9KSkudG8uYmUuZmFsc2VcbiAgfSlcblxuICBpdCgnc2hvdWxkIHJldHVybiBzaW5nbGUgcGVyc29uYWwgbmFtZXNwYWNlJywgKCkgPT4ge1xuICAgIGV4cGVjdChwYXJzZU5BTUVTUEFDRSh7XG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIE5BTUVTUEFDRTogW3tcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBbXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIFt7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1NUUklORycsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICdJTkJPWC4nXG4gICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnU1RSSU5HJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJy4nXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICBdLCBudWxsLCBudWxsXG4gICAgICAgICAgXVxuICAgICAgICB9XVxuICAgICAgfVxuICAgIH0pKS50by5kZWVwLmVxdWFsKHtcbiAgICAgIHBlcnNvbmFsOiBbe1xuICAgICAgICBwcmVmaXg6ICdJTkJPWC4nLFxuICAgICAgICBkZWxpbWl0ZXI6ICcuJ1xuICAgICAgfV0sXG4gICAgICB1c2VyczogZmFsc2UsXG4gICAgICBzaGFyZWQ6IGZhbHNlXG4gICAgfSlcbiAgfSlcblxuICBpdCgnc2hvdWxkIHJldHVybiBzaW5nbGUgcGVyc29uYWwsIHNpbmdsZSB1c2VycywgbXVsdGlwbGUgc2hhcmVkJywgKCkgPT4ge1xuICAgIGV4cGVjdChwYXJzZU5BTUVTUEFDRSh7XG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIE5BTUVTUEFDRTogW3tcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBbXG4gICAgICAgICAgICAvLyBwZXJzb25hbFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBbe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdTVFJJTkcnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnJ1xuICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1NUUklORycsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICcvJ1xuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIC8vIHVzZXJzXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIFt7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1NUUklORycsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICd+J1xuICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1NUUklORycsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICcvJ1xuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIC8vIHNoYXJlZFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBbe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdTVFJJTkcnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnI3NoYXJlZC8nXG4gICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnU1RSSU5HJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJy8nXG4gICAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgICBbe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdTVFJJTkcnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnI3B1YmxpYy8nXG4gICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnU1RSSU5HJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJy8nXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICBdXG4gICAgICAgICAgXVxuICAgICAgICB9XVxuICAgICAgfVxuICAgIH0pKS50by5kZWVwLmVxdWFsKHtcbiAgICAgIHBlcnNvbmFsOiBbe1xuICAgICAgICBwcmVmaXg6ICcnLFxuICAgICAgICBkZWxpbWl0ZXI6ICcvJ1xuICAgICAgfV0sXG4gICAgICB1c2VyczogW3tcbiAgICAgICAgcHJlZml4OiAnficsXG4gICAgICAgIGRlbGltaXRlcjogJy8nXG4gICAgICB9XSxcbiAgICAgIHNoYXJlZDogW3tcbiAgICAgICAgcHJlZml4OiAnI3NoYXJlZC8nLFxuICAgICAgICBkZWxpbWl0ZXI6ICcvJ1xuICAgICAgfSwge1xuICAgICAgICBwcmVmaXg6ICcjcHVibGljLycsXG4gICAgICAgIGRlbGltaXRlcjogJy8nXG4gICAgICB9XVxuICAgIH0pXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCBoYW5kbGUgTklMIG5hbWVzcGFjZSBoaWVyYXJjaHkgZGVsaW0nLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlTkFNRVNQQUNFKHtcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgTkFNRVNQQUNFOiBbXG4gICAgICAgICAgLy8gVGhpcyBzcGVjaWZpYyB2YWx1ZSBpcyByZXR1cm5lZCBieSB5YWhvby5jby5qcCdzXG4gICAgICAgICAgLy8gaW1hcGdhdGUgdmVyc2lvbiAwLjcuNjhfMTFfMS42MTQ3NSBJTUFQIHNlcnZlclxuICAgICAgICAgIHBhcnNlcih0b1R5cGVkQXJyYXkoJyogTkFNRVNQQUNFICgoXCJcIiBOSUwpKSBOSUwgTklMJykpXG4gICAgICAgIF1cbiAgICAgIH1cbiAgICB9KSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICBwZXJzb25hbDogW3tcbiAgICAgICAgcHJlZml4OiAnJyxcbiAgICAgICAgZGVsaW1pdGVyOiBudWxsXG4gICAgICB9XSxcbiAgICAgIHVzZXJzOiBmYWxzZSxcbiAgICAgIHNoYXJlZDogZmFsc2VcbiAgICB9KVxuICB9KVxufSlcblxuZGVzY3JpYmUoJ3BhcnNlU0VMRUNUJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIHBhcnNlIGEgY29tcGxldGUgcmVzcG9uc2UnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlU0VMRUNUKHtcbiAgICAgIGNvZGU6ICdSRUFELVdSSVRFJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgRVhJU1RTOiBbe1xuICAgICAgICAgIG5yOiAxMjNcbiAgICAgICAgfV0sXG4gICAgICAgIEZMQUdTOiBbe1xuICAgICAgICAgIGF0dHJpYnV0ZXM6IFtcbiAgICAgICAgICAgIFt7XG4gICAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdcXFxcQW5zd2VyZWQnXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdcXFxcRmxhZ2dlZCdcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgXVxuICAgICAgICB9XSxcbiAgICAgICAgT0s6IFt7XG4gICAgICAgICAgY29kZTogJ1BFUk1BTkVOVEZMQUdTJyxcbiAgICAgICAgICBwZXJtYW5lbnRmbGFnczogWydcXFxcQW5zd2VyZWQnLCAnXFxcXEZsYWdnZWQnXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgY29kZTogJ1VJRFZBTElESVRZJyxcbiAgICAgICAgICB1aWR2YWxpZGl0eTogJzInXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBjb2RlOiAnVUlETkVYVCcsXG4gICAgICAgICAgdWlkbmV4dDogJzM4MzYxJ1xuICAgICAgICB9LCB7XG4gICAgICAgICAgY29kZTogJ0hJR0hFU1RNT0RTRVEnLFxuICAgICAgICAgIGhpZ2hlc3Rtb2RzZXE6ICczNjgyOTE4J1xuICAgICAgICB9XVxuICAgICAgfVxuICAgIH0pKS50by5kZWVwLmVxdWFsKHtcbiAgICAgIGV4aXN0czogMTIzLFxuICAgICAgZmxhZ3M6IFsnXFxcXEFuc3dlcmVkJywgJ1xcXFxGbGFnZ2VkJ10sXG4gICAgICBoaWdoZXN0TW9kc2VxOiAnMzY4MjkxOCcsXG4gICAgICBwZXJtYW5lbnRGbGFnczogWydcXFxcQW5zd2VyZWQnLCAnXFxcXEZsYWdnZWQnXSxcbiAgICAgIHJlYWRPbmx5OiBmYWxzZSxcbiAgICAgIHVpZE5leHQ6IDM4MzYxLFxuICAgICAgdWlkVmFsaWRpdHk6IDJcbiAgICB9KVxuICB9KVxuXG4gIGl0KCdzaG91bGQgcGFyc2UgcmVzcG9uc2Ugd2l0aCBubyBtb2RzZXEnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlU0VMRUNUKHtcbiAgICAgIGNvZGU6ICdSRUFELVdSSVRFJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgRVhJU1RTOiBbe1xuICAgICAgICAgIG5yOiAxMjNcbiAgICAgICAgfV0sXG4gICAgICAgIEZMQUdTOiBbe1xuICAgICAgICAgIGF0dHJpYnV0ZXM6IFtcbiAgICAgICAgICAgIFt7XG4gICAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdcXFxcQW5zd2VyZWQnXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdcXFxcRmxhZ2dlZCdcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgXVxuICAgICAgICB9XSxcbiAgICAgICAgT0s6IFt7XG4gICAgICAgICAgY29kZTogJ1BFUk1BTkVOVEZMQUdTJyxcbiAgICAgICAgICBwZXJtYW5lbnRmbGFnczogWydcXFxcQW5zd2VyZWQnLCAnXFxcXEZsYWdnZWQnXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgY29kZTogJ1VJRFZBTElESVRZJyxcbiAgICAgICAgICB1aWR2YWxpZGl0eTogJzInXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBjb2RlOiAnVUlETkVYVCcsXG4gICAgICAgICAgdWlkbmV4dDogJzM4MzYxJ1xuICAgICAgICB9XVxuICAgICAgfVxuICAgIH0pKS50by5kZWVwLmVxdWFsKHtcbiAgICAgIGV4aXN0czogMTIzLFxuICAgICAgZmxhZ3M6IFsnXFxcXEFuc3dlcmVkJywgJ1xcXFxGbGFnZ2VkJ10sXG4gICAgICBwZXJtYW5lbnRGbGFnczogWydcXFxcQW5zd2VyZWQnLCAnXFxcXEZsYWdnZWQnXSxcbiAgICAgIHJlYWRPbmx5OiBmYWxzZSxcbiAgICAgIHVpZE5leHQ6IDM4MzYxLFxuICAgICAgdWlkVmFsaWRpdHk6IDJcbiAgICB9KVxuICB9KVxuXG4gIGl0KCdzaG91bGQgcGFyc2UgcmVzcG9uc2Ugd2l0aCByZWFkLW9ubHknLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlU0VMRUNUKHtcbiAgICAgIGNvZGU6ICdSRUFELU9OTFknLFxuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBFWElTVFM6IFt7XG4gICAgICAgICAgbnI6IDEyM1xuICAgICAgICB9XSxcbiAgICAgICAgRkxBR1M6IFt7XG4gICAgICAgICAgYXR0cmlidXRlczogW1xuICAgICAgICAgICAgW3tcbiAgICAgICAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICAgICAgICB2YWx1ZTogJ1xcXFxBbnN3ZXJlZCdcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICAgICAgICB2YWx1ZTogJ1xcXFxGbGFnZ2VkJ1xuICAgICAgICAgICAgfV1cbiAgICAgICAgICBdXG4gICAgICAgIH1dLFxuICAgICAgICBPSzogW3tcbiAgICAgICAgICBjb2RlOiAnUEVSTUFORU5URkxBR1MnLFxuICAgICAgICAgIHBlcm1hbmVudGZsYWdzOiBbJ1xcXFxBbnN3ZXJlZCcsICdcXFxcRmxhZ2dlZCddXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBjb2RlOiAnVUlEVkFMSURJVFknLFxuICAgICAgICAgIHVpZHZhbGlkaXR5OiAnMidcbiAgICAgICAgfSwge1xuICAgICAgICAgIGNvZGU6ICdVSURORVhUJyxcbiAgICAgICAgICB1aWRuZXh0OiAnMzgzNjEnXG4gICAgICAgIH1dXG4gICAgICB9XG4gICAgfSkpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgZXhpc3RzOiAxMjMsXG4gICAgICBmbGFnczogWydcXFxcQW5zd2VyZWQnLCAnXFxcXEZsYWdnZWQnXSxcbiAgICAgIHBlcm1hbmVudEZsYWdzOiBbJ1xcXFxBbnN3ZXJlZCcsICdcXFxcRmxhZ2dlZCddLFxuICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICB1aWROZXh0OiAzODM2MSxcbiAgICAgIHVpZFZhbGlkaXR5OiAyXG4gICAgfSlcbiAgfSlcblxuICBpdCgnc2hvdWxkIHBhcnNlIHJlc3BvbnNlIHdpdGggTk9NT0RTRVEgZmxhZycsICgpID0+IHtcbiAgICBleHBlY3QocGFyc2VTRUxFQ1Qoe1xuICAgICAgY29kZTogJ1JFQUQtV1JJVEUnLFxuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBFWElTVFM6IFt7XG4gICAgICAgICAgbnI6IDEyM1xuICAgICAgICB9XSxcbiAgICAgICAgRkxBR1M6IFt7XG4gICAgICAgICAgYXR0cmlidXRlczogW1xuICAgICAgICAgICAgW3tcbiAgICAgICAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICAgICAgICB2YWx1ZTogJ1xcXFxBbnN3ZXJlZCdcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICAgICAgICB2YWx1ZTogJ1xcXFxGbGFnZ2VkJ1xuICAgICAgICAgICAgfV1cbiAgICAgICAgICBdXG4gICAgICAgIH1dLFxuICAgICAgICBPSzogW3tcbiAgICAgICAgICBjb2RlOiAnUEVSTUFORU5URkxBR1MnLFxuICAgICAgICAgIHBlcm1hbmVudGZsYWdzOiBbJ1xcXFxBbnN3ZXJlZCcsICdcXFxcRmxhZ2dlZCddXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBjb2RlOiAnVUlEVkFMSURJVFknLFxuICAgICAgICAgIHVpZHZhbGlkaXR5OiAnMidcbiAgICAgICAgfSwge1xuICAgICAgICAgIGNvZGU6ICdVSURORVhUJyxcbiAgICAgICAgICB1aWRuZXh0OiAnMzgzNjEnXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBjb2RlOiAnTk9NT0RTRVEnXG4gICAgICAgIH1dXG4gICAgICB9XG4gICAgfSkpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgZXhpc3RzOiAxMjMsXG4gICAgICBmbGFnczogWydcXFxcQW5zd2VyZWQnLCAnXFxcXEZsYWdnZWQnXSxcbiAgICAgIHBlcm1hbmVudEZsYWdzOiBbJ1xcXFxBbnN3ZXJlZCcsICdcXFxcRmxhZ2dlZCddLFxuICAgICAgcmVhZE9ubHk6IGZhbHNlLFxuICAgICAgdWlkTmV4dDogMzgzNjEsXG4gICAgICB1aWRWYWxpZGl0eTogMixcbiAgICAgIG5vTW9kc2VxOiB0cnVlXG4gICAgfSlcbiAgfSlcbn0pXG5cbmRlc2NyaWJlKCdwYXJzZUVOVkVMT1BFJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIHBhcnNlZCBlbnZlbG9wZSBvYmplY3QnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlRU5WRUxPUEUodGVzdEVudmVsb3BlLnNvdXJjZSkpLnRvLmRlZXAuZXF1YWwodGVzdEVudmVsb3BlLnBhcnNlZClcbiAgfSlcbn0pXG5cbmRlc2NyaWJlKCdwYXJzZUJPRFlTVFJVQ1RVUkUnLCAoKSA9PiB7XG4gIGl0KCdzaG91bGQgcGFyc2UgYm9keXN0cnVjdHVyZSBvYmplY3QnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlQk9EWVNUUlVDVFVSRShtaW1lVG9ydHVyZS5zb3VyY2UpKS50by5kZWVwLmVxdWFsKG1pbWVUb3J0dXJlLnBhcnNlZClcbiAgfSlcblxuICBpdCgnc2hvdWxkIHBhcnNlIGJvZHlzdHJ1Y3R1cmUgd2l0aCB1bmljb2RlIGZpbGVuYW1lJywgKCkgPT4ge1xuICAgIHZhciBpbnB1dCA9IFtcbiAgICAgIFtcbiAgICAgICAgeyB0eXBlOiAnU1RSSU5HJywgdmFsdWU6ICdBUFBMSUNBVElPTicgfSxcbiAgICAgICAgeyB0eXBlOiAnU1RSSU5HJywgdmFsdWU6ICdPQ1RFVC1TVFJFQU0nIH0sXG4gICAgICAgIG51bGwsXG4gICAgICAgIG51bGwsXG4gICAgICAgIG51bGwsXG4gICAgICAgIHsgdHlwZTogJ1NUUklORycsIHZhbHVlOiAnQkFTRTY0JyB9LFxuICAgICAgICB7IHR5cGU6ICdBVE9NJywgdmFsdWU6ICc0MCcgfSxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgW1xuICAgICAgICAgIHsgdHlwZTogJ1NUUklORycsIHZhbHVlOiAnQVRUQUNITUVOVCcgfSxcbiAgICAgICAgICBbXG4gICAgICAgICAgICB7IHR5cGU6ICdTVFJJTkcnLCB2YWx1ZTogJ0ZJTEVOQU1FJyB9LFxuICAgICAgICAgICAgeyB0eXBlOiAnU1RSSU5HJywgdmFsdWU6ICc9P0lTTy04ODU5LTE/UT9CQlJfSGFuZGVsLF9HZXdlcmJlLF9CPUZDcm9iZXRyaWViZSw/PSA9P0lTTy04ODU5LTE/UT9fcHJpdmF0ZV9CaWxkdW5nc2VpbnJpY2h0dW5nZW4udHh0Pz0nIH1cbiAgICAgICAgICBdXG4gICAgICAgIF0sXG4gICAgICAgIG51bGxcbiAgICAgIF0sXG4gICAgICB7IHR5cGU6ICdTVFJJTkcnLCB2YWx1ZTogJ01JWEVEJyB9LFxuICAgICAgW1xuICAgICAgICB7IHR5cGU6ICdTVFJJTkcnLCB2YWx1ZTogJ0JPVU5EQVJZJyB9LFxuICAgICAgICB7IHR5cGU6ICdTVFJJTkcnLCB2YWx1ZTogJy0tLS1zaW5pa2FlbC0/PV8xLTE0MTA1MDg1MjY1MTEwLjQ5OTAzOTIyNDU4MTc5Mjk1JyB9XG4gICAgICBdLFxuICAgICAgbnVsbCxcbiAgICAgIG51bGxcbiAgICBdXG5cbiAgICB2YXIgZXhwZWN0ZWQgPSB7XG4gICAgICBjaGlsZE5vZGVzOiBbe1xuICAgICAgICBwYXJ0OiAnMScsXG4gICAgICAgIHR5cGU6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLFxuICAgICAgICBlbmNvZGluZzogJ2Jhc2U2NCcsXG4gICAgICAgIHNpemU6IDQwLFxuICAgICAgICBkaXNwb3NpdGlvbjogJ2F0dGFjaG1lbnQnLFxuICAgICAgICBkaXNwb3NpdGlvblBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBmaWxlbmFtZTogJ0JCUiBIYW5kZWwsIEdld2VyYmUsIELDvHJvYmV0cmllYmUsIHByaXZhdGUgQmlsZHVuZ3NlaW5yaWNodHVuZ2VuLnR4dCdcbiAgICAgICAgfVxuICAgICAgfV0sXG4gICAgICB0eXBlOiAnbXVsdGlwYXJ0L21peGVkJyxcbiAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgYm91bmRhcnk6ICctLS0tc2luaWthZWwtPz1fMS0xNDEwNTA4NTI2NTExMC40OTkwMzkyMjQ1ODE3OTI5NSdcbiAgICAgIH1cbiAgICB9XG5cbiAgICBleHBlY3QocGFyc2VCT0RZU1RSVUNUVVJFKGlucHV0KSkudG8uZGVlcC5lcXVhbChleHBlY3RlZClcbiAgfSlcbn0pXG5cbmRlc2NyaWJlKCdwYXJzZUZFVENIJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIHJldHVybiB2YWx1ZXMgbG93ZXJjYXNlIGtleXMnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlRkVUQ0goe1xuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBGRVRDSDogW3tcbiAgICAgICAgICBucjogMTIzLFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IFtcbiAgICAgICAgICAgIFt7XG4gICAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdCT0RZJyxcbiAgICAgICAgICAgICAgc2VjdGlvbjogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICdIRUFERVInXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFt7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnREFURSdcbiAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJ1NVQkpFQ1QnXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHBhcnRpYWw6IFswLCAxMjNdXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdhYmMnXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIF1cbiAgICAgICAgfV1cbiAgICAgIH1cbiAgICB9KSkudG8uZGVlcC5lcXVhbChbe1xuICAgICAgJyMnOiAxMjMsXG4gICAgICAnYm9keVtoZWFkZXIgKGRhdGUgc3ViamVjdCldPDAuMTIzPic6ICdhYmMnXG4gICAgfV0pXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCBtZXJnZSBtdWx0aXBsZSByZXNwb25zZXMgYmFzZWQgb24gc2VxdWVuY2UgbnVtYmVyJywgKCkgPT4ge1xuICAgIGV4cGVjdChwYXJzZUZFVENIKHtcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgRkVUQ0g6IFt7XG4gICAgICAgICAgbnI6IDEyMyxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBbXG4gICAgICAgICAgICBbe1xuICAgICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICAgIHZhbHVlOiAnVUlEJ1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICAgIHZhbHVlOiA3ODlcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgbnI6IDEyNCxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBbXG4gICAgICAgICAgICBbe1xuICAgICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICAgIHZhbHVlOiAnVUlEJ1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICAgIHZhbHVlOiA3OTBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgbnI6IDEyMyxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBbXG4gICAgICAgICAgICBbe1xuICAgICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICAgIHZhbHVlOiAnTU9EU0VRJ1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICAgIHZhbHVlOiAnMTI3J1xuICAgICAgICAgICAgfV1cbiAgICAgICAgICBdXG4gICAgICAgIH1dXG4gICAgICB9XG4gICAgfSkpLnRvLmRlZXAuZXF1YWwoW3tcbiAgICAgICcjJzogMTIzLFxuICAgICAgdWlkOiA3ODksXG4gICAgICBtb2RzZXE6ICcxMjcnXG4gICAgfSwge1xuICAgICAgJyMnOiAxMjQsXG4gICAgICB1aWQ6IDc5MFxuICAgIH1dKVxuICB9KVxufSlcblxuZGVzY3JpYmUoJ3BhcnNlU0VBUkNIJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIHBhcnNlIFNFQVJDSCByZXNwb25zZScsICgpID0+IHtcbiAgICBleHBlY3QocGFyc2VTRUFSQ0goe1xuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBTRUFSQ0g6IFt7XG4gICAgICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgICAgIHZhbHVlOiA1XG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgdmFsdWU6IDdcbiAgICAgICAgICB9XVxuICAgICAgICB9LCB7XG4gICAgICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgICAgIHZhbHVlOiA2XG4gICAgICAgICAgfV1cbiAgICAgICAgfV1cbiAgICAgIH1cbiAgICB9KSkudG8uZGVlcC5lcXVhbChbNSwgNiwgN10pXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCBwYXJzZSBlbXB0eSBTRUFSQ0ggcmVzcG9uc2UnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlU0VBUkNIKHtcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgU0VBUkNIOiBbe1xuICAgICAgICAgIGNvbW1hbmQ6ICdTRUFSQ0gnLFxuICAgICAgICAgIHRhZzogJyonXG4gICAgICAgIH1dXG4gICAgICB9XG4gICAgfSkpLnRvLmRlZXAuZXF1YWwoW10pXG4gIH0pXG59KVxuXG5kZXNjcmliZSgncGFyc2VDT1BZJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIHBhcnNlIENPUFkgcmVzcG9uc2UnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlQ09QWSh7XG4gICAgICBjb3B5dWlkOiBbJzEnLCAnMTozJywgJzMsNCwyJ11cbiAgICB9KSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICBzcmNTZXFTZXQ6ICcxOjMnLFxuICAgICAgZGVzdFNlcVNldDogJzMsNCwyJ1xuICAgIH0pXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gdW5kZWZpbmVkIHdoZW4gcmVzcG9uc2UgZG9lcyBub3QgY29udGFpbiBjb3B5dWlkJywgKCkgPT4ge1xuICAgIGV4cGVjdChwYXJzZUNPUFkoe30pKS50by5lcXVhbCh1bmRlZmluZWQpXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gdW5kZWZpbmVkIHdoZW4gcmVzcG9uc2UgaXMgbm90IGRlZmluZWQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlQ09QWSgpKS50by5lcXVhbCh1bmRlZmluZWQpXG4gIH0pXG59KVxuXG5kZXNjcmliZSgncGFyc2VBUFBFTkQnLCAoKSA9PiB7XG4gIGl0KCdzaG91bGQgcGFyc2UgQVBQRU5EIHJlc3BvbnNlJywgKCkgPT4ge1xuICAgIGV4cGVjdChwYXJzZUFQUEVORCh7XG4gICAgICBhcHBlbmR1aWQ6IFsnMScsICczJ11cbiAgICB9KSkudG8uZXF1YWwoJzMnKVxuICB9KVxuXG4gIGl0KCdzaG91bGQgcmV0dXJuIHVuZGVmaW5lZCB3aGVuIHJlc3BvbnNlIGRvZXMgbm90IGNvbnRhaW4gY29weXVpZCcsICgpID0+IHtcbiAgICBleHBlY3QocGFyc2VBUFBFTkQoe30pKS50by5lcXVhbCh1bmRlZmluZWQpXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gdW5kZWZpbmVkIHdoZW4gcmVzcG9uc2UgaXMgbm90IGRlZmluZWQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlQVBQRU5EKCkpLnRvLmVxdWFsKHVuZGVmaW5lZClcbiAgfSlcbn0pXG4iXX0= \ No newline at end of file diff --git a/dist/command-parser.js b/dist/command-parser.js new file mode 100644 index 00000000..e750eb83 --- /dev/null +++ b/dist/command-parser.js @@ -0,0 +1,573 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.parseNAMESPACE = parseNAMESPACE; +exports.parseNAMESPACEElement = parseNAMESPACEElement; +exports.parseSELECT = parseSELECT; +exports.parseENVELOPE = parseENVELOPE; +exports.parseBODYSTRUCTURE = parseBODYSTRUCTURE; +exports.parseFETCH = parseFETCH; +exports.parseSEARCH = parseSEARCH; +exports.parseCOPY = parseCOPY; +exports.parseAPPEND = parseAPPEND; + +var _emailjsAddressparser = _interopRequireDefault(require("emailjs-addressparser")); + +var _emailjsImapHandler = require("emailjs-imap-handler"); + +var _ramda = require("ramda"); + +var _emailjsMimeCodec = require("emailjs-mime-codec"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Parses NAMESPACE response + * + * @param {Object} response + * @return {Object} Namespaces object + */ +function parseNAMESPACE(response) { + if (!response.payload || !response.payload.NAMESPACE || !response.payload.NAMESPACE.length) { + return false; + } + + const attributes = [].concat(response.payload.NAMESPACE.pop().attributes || []); + + if (!attributes.length) { + return false; + } + + return { + personal: parseNAMESPACEElement(attributes[0]), + users: parseNAMESPACEElement(attributes[1]), + shared: parseNAMESPACEElement(attributes[2]) + }; +} +/** + * Parses a NAMESPACE element + * + * @param {Object} element + * @return {Object} Namespaces element object + */ + + +function parseNAMESPACEElement(element) { + if (!element) { + return false; + } + + element = [].concat(element || []); + return element.map(ns => { + if (!ns || !ns.length) { + return false; + } + + return { + prefix: ns[0].value, + delimiter: ns[1] && ns[1].value // The delimiter can legally be NIL which maps to null + + }; + }); +} +/** + * Parses SELECT response + * + * @param {Object} response + * @return {Object} Mailbox information object + */ + + +function parseSELECT(response) { + if (!response || !response.payload) { + return; + } + + const mailbox = { + readOnly: response.code === 'READ-ONLY' + }; + const existsResponse = response.payload.EXISTS && response.payload.EXISTS.pop(); + const flagsResponse = response.payload.FLAGS && response.payload.FLAGS.pop(); + const okResponse = response.payload.OK; + + if (existsResponse) { + mailbox.exists = existsResponse.nr || 0; + } + + if (flagsResponse && flagsResponse.attributes && flagsResponse.attributes.length) { + mailbox.flags = flagsResponse.attributes[0].map(flag => (flag.value || '').toString().trim()); + } + + [].concat(okResponse || []).forEach(ok => { + switch (ok && ok.code) { + case 'PERMANENTFLAGS': + mailbox.permanentFlags = [].concat(ok.permanentflags || []); + break; + + case 'UIDVALIDITY': + mailbox.uidValidity = Number(ok.uidvalidity) || 0; + break; + + case 'UIDNEXT': + mailbox.uidNext = Number(ok.uidnext) || 0; + break; + + case 'HIGHESTMODSEQ': + mailbox.highestModseq = ok.highestmodseq || '0'; // keep 64bit uint as a string + + break; + + case 'NOMODSEQ': + mailbox.noModseq = true; + break; + } + }); + return mailbox; +} +/** + * Parses message envelope from FETCH response. All keys in the resulting + * object are lowercase. Address fields are all arrays with {name:, address:} + * structured values. Unicode strings are automatically decoded. + * + * @param {Array} value Envelope array + * @param {Object} Envelope object + */ + + +function parseENVELOPE(value) { + const envelope = {}; + + if (value[0] && value[0].value) { + envelope.date = value[0].value; + } + + if (value[1] && value[1].value) { + envelope.subject = (0, _emailjsMimeCodec.mimeWordsDecode)(value[1] && value[1].value); + } + + if (value[2] && value[2].length) { + envelope.from = processAddresses(value[2]); + } + + if (value[3] && value[3].length) { + envelope.sender = processAddresses(value[3]); + } + + if (value[4] && value[4].length) { + envelope['reply-to'] = processAddresses(value[4]); + } + + if (value[5] && value[5].length) { + envelope.to = processAddresses(value[5]); + } + + if (value[6] && value[6].length) { + envelope.cc = processAddresses(value[6]); + } + + if (value[7] && value[7].length) { + envelope.bcc = processAddresses(value[7]); + } + + if (value[8] && value[8].value) { + envelope['in-reply-to'] = value[8].value; + } + + if (value[9] && value[9].value) { + envelope['message-id'] = value[9].value; + } + + return envelope; +} +/* + * ENVELOPE lists addresses as [name-part, source-route, username, hostname] + * where source-route is not used anymore and can be ignored. + * To get comparable results with other parts of the email.js stack + * browserbox feeds the parsed address values from ENVELOPE + * to addressparser and uses resulting values instead of the + * pre-parsed addresses + */ + + +function processAddresses(list = []) { + return list.map(addr => { + const name = (0, _ramda.pathOr)('', ['0', 'value'], addr).trim(); + const address = (0, _ramda.pathOr)('', ['2', 'value'], addr) + '@' + (0, _ramda.pathOr)('', ['3', 'value'], addr); + const formatted = name ? encodeAddressName(name) + ' <' + address + '>' : address; + const parsed = (0, _emailjsAddressparser.default)(formatted).shift(); // there should be just a single address + + parsed.name = (0, _emailjsMimeCodec.mimeWordsDecode)(parsed.name); + return parsed; + }); +} +/** + * If needed, encloses with quotes or mime encodes the name part of an e-mail address + * + * @param {String} name Name part of an address + * @returns {String} Mime word encoded or quoted string + */ + + +function encodeAddressName(name) { + if (!/^[\w ']*$/.test(name)) { + if (/^[\x20-\x7e]*$/.test(name)) { + return JSON.stringify(name); + } else { + return (0, _emailjsMimeCodec.mimeWordEncode)(name, 'Q', 52); + } + } + + return name; +} +/** + * Parses message body structure from FETCH response. + * + * @param {Array} value BODYSTRUCTURE array + * @param {Object} Envelope object + */ + + +function parseBODYSTRUCTURE(node, path = []) { + const curNode = {}; + let i = 0; + let part = 0; + + if (path.length) { + curNode.part = path.join('.'); + } // multipart + + + if (Array.isArray(node[0])) { + curNode.childNodes = []; + + while (Array.isArray(node[i])) { + curNode.childNodes.push(parseBODYSTRUCTURE(node[i], path.concat(++part))); + i++; + } // multipart type + + + curNode.type = 'multipart/' + ((node[i++] || {}).value || '').toString().toLowerCase(); // extension data (not available for BODY requests) + // body parameter parenthesized list + + if (i < node.length - 1) { + if (node[i]) { + curNode.parameters = attributesToObject(node[i]); + } + + i++; + } + } else { + // content type + curNode.type = [((node[i++] || {}).value || '').toString().toLowerCase(), ((node[i++] || {}).value || '').toString().toLowerCase()].join('/'); // body parameter parenthesized list + + if (node[i]) { + curNode.parameters = attributesToObject(node[i]); + } + + i++; // id + + if (node[i]) { + curNode.id = ((node[i] || {}).value || '').toString(); + } + + i++; // description + + if (node[i]) { + curNode.description = ((node[i] || {}).value || '').toString(); + } + + i++; // encoding + + if (node[i]) { + curNode.encoding = ((node[i] || {}).value || '').toString().toLowerCase(); + } + + i++; // size + + if (node[i]) { + curNode.size = Number((node[i] || {}).value || 0) || 0; + } + + i++; + + if (curNode.type === 'message/rfc822') { + // message/rfc adds additional envelope, bodystructure and line count values + // envelope + if (node[i]) { + curNode.envelope = parseENVELOPE([].concat(node[i] || [])); + } + + i++; + + if (node[i]) { + curNode.childNodes = [// rfc822 bodyparts share the same path, difference is between MIME and HEADER + // path.MIME returns message/rfc822 header + // path.HEADER returns inlined message header + parseBODYSTRUCTURE(node[i], path)]; + } + + i++; // line count + + if (node[i]) { + curNode.lineCount = Number((node[i] || {}).value || 0) || 0; + } + + i++; + } else if (/^text\//.test(curNode.type)) { + // text/* adds additional line count values + // line count + if (node[i]) { + curNode.lineCount = Number((node[i] || {}).value || 0) || 0; + } + + i++; + } // extension data (not available for BODY requests) + // md5 + + + if (i < node.length - 1) { + if (node[i]) { + curNode.md5 = ((node[i] || {}).value || '').toString().toLowerCase(); + } + + i++; + } + } // the following are shared extension values (for both multipart and non-multipart parts) + // not available for BODY requests + // body disposition + + + if (i < node.length - 1) { + if (Array.isArray(node[i]) && node[i].length) { + curNode.disposition = ((node[i][0] || {}).value || '').toString().toLowerCase(); + + if (Array.isArray(node[i][1])) { + curNode.dispositionParameters = attributesToObject(node[i][1]); + } + } + + i++; + } // body language + + + if (i < node.length - 1) { + if (node[i]) { + curNode.language = [].concat(node[i]).map(val => (0, _ramda.propOr)('', 'value', val).toLowerCase()); + } + + i++; + } // body location + // NB! defined as a "string list" in RFC3501 but replaced in errata document with "string" + // Errata: http://www.rfc-editor.org/errata_search.php?rfc=3501 + + + if (i < node.length - 1) { + if (node[i]) { + curNode.location = ((node[i] || {}).value || '').toString(); + } + + i++; + } + + return curNode; +} + +function attributesToObject(attrs = [], keyTransform = _ramda.toLower, valueTransform = _emailjsMimeCodec.mimeWordsDecode) { + const vals = attrs.map((0, _ramda.prop)('value')); + const keys = vals.filter((_, i) => i % 2 === 0).map(keyTransform); + const values = vals.filter((_, i) => i % 2 === 1).map(valueTransform); + return (0, _ramda.fromPairs)((0, _ramda.zip)(keys, values)); +} +/** + * Parses FETCH response + * + * @param {Object} response + * @return {Object} Message object + */ + + +function parseFETCH(response) { + if (!response || !response.payload || !response.payload.FETCH || !response.payload.FETCH.length) { + return []; + } + + const list = []; + const messages = {}; + response.payload.FETCH.forEach(item => { + const params = [].concat([].concat(item.attributes || [])[0] || []); // ensure the first value is an array + + let message; + let i, len, key; + + if (messages[item.nr]) { + // same sequence number is already used, so merge values instead of creating a new message object + message = messages[item.nr]; + } else { + messages[item.nr] = message = { + '#': item.nr + }; + list.push(message); + } + + for (i = 0, len = params.length; i < len; i++) { + if (i % 2 === 0) { + key = (0, _emailjsImapHandler.compiler)({ + attributes: [params[i]] + }).toLowerCase().replace(/<\d+>$/, ''); + continue; + } + + message[key] = parseFetchValue(key, params[i]); + } + }); + return list; +} +/** + * Parses a single value from the FETCH response object + * + * @param {String} key Key name (uppercase) + * @param {Mized} value Value for the key + * @return {Mixed} Processed value + */ + + +function parseFetchValue(key, value) { + if (!value) { + return null; + } + + if (!Array.isArray(value)) { + switch (key) { + case 'uid': + case 'rfc822.size': + return Number(value.value) || 0; + + case 'modseq': + // do not cast 64 bit uint to a number + return value.value || '0'; + } + + return value.value; + } + + switch (key) { + case 'flags': + case 'x-gm-labels': + value = [].concat(value).map(flag => flag.value || ''); + break; + + case 'envelope': + value = parseENVELOPE([].concat(value || [])); + break; + + case 'bodystructure': + value = parseBODYSTRUCTURE([].concat(value || [])); + break; + + case 'modseq': + value = (value.shift() || {}).value || '0'; + break; + } + + return value; +} +/** + * Binary Search - from npm module binary-search, license CC0 + * + * @param {Array} haystack Ordered array + * @param {any} needle Item to search for in haystack + * @param {Function} comparator Function that defines the sort order + * @return {Number} Index of needle in haystack or if not found, + * -Index-1 is the position where needle could be inserted while still + * keeping haystack ordered. + */ + + +function binSearch(haystack, needle, comparator = (a, b) => a - b) { + var mid, cmp; + var low = 0; + var high = haystack.length - 1; + + while (low <= high) { + // Note that "(low + high) >>> 1" may overflow, and results in + // a typecast to double (which gives the wrong results). + mid = low + (high - low >> 1); + cmp = +comparator(haystack[mid], needle); + + if (cmp < 0.0) { + // too low + low = mid + 1; + } else if (cmp > 0.0) { + // too high + high = mid - 1; + } else { + // key found + return mid; + } + } // key not found + + + return ~low; +} + +; +/** + * Parses SEARCH response. Gathers all untagged SEARCH responses, fetched seq./uid numbers + * and compiles these into a sorted array. + * + * @param {Object} response + * @return {Object} Message object + * @param {Array} Sorted Seq./UID number list + */ + +function parseSEARCH(response) { + const list = []; + + if (!response || !response.payload || !response.payload.SEARCH || !response.payload.SEARCH.length) { + return list; + } + + response.payload.SEARCH.forEach(result => (result.attributes || []).forEach(nr => { + nr = Number(nr && nr.value || nr) || 0; + const idx = binSearch(list, nr); + + if (idx < 0) { + list.splice(-idx - 1, 0, nr); + } + })); + return list; +} + +; +/** + * Parses COPY and UID COPY response. + * https://tools.ietf.org/html/rfc4315 + * @param {Object} response + * @returns {{destSeqSet: string, srcSeqSet: string}} Source and + * destination uid sets if available, undefined if not. + */ + +function parseCOPY(response) { + const copyuid = response && response.copyuid; + + if (copyuid) { + return { + srcSeqSet: copyuid[1], + destSeqSet: copyuid[2] + }; + } +} +/** + * Parses APPEND (upload) response. + * https://tools.ietf.org/html/rfc4315 + * @param {Object} response + * @returns {String} The uid assigned to the uploaded message if available. + */ + + +function parseAPPEND(response) { + return response && response.appenduid && response.appenduid[1]; +} +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21tYW5kLXBhcnNlci5qcyJdLCJuYW1lcyI6WyJwYXJzZU5BTUVTUEFDRSIsInJlc3BvbnNlIiwicGF5bG9hZCIsIk5BTUVTUEFDRSIsImxlbmd0aCIsImF0dHJpYnV0ZXMiLCJjb25jYXQiLCJwb3AiLCJwZXJzb25hbCIsInBhcnNlTkFNRVNQQUNFRWxlbWVudCIsInVzZXJzIiwic2hhcmVkIiwiZWxlbWVudCIsIm1hcCIsIm5zIiwicHJlZml4IiwidmFsdWUiLCJkZWxpbWl0ZXIiLCJwYXJzZVNFTEVDVCIsIm1haWxib3giLCJyZWFkT25seSIsImNvZGUiLCJleGlzdHNSZXNwb25zZSIsIkVYSVNUUyIsImZsYWdzUmVzcG9uc2UiLCJGTEFHUyIsIm9rUmVzcG9uc2UiLCJPSyIsImV4aXN0cyIsIm5yIiwiZmxhZ3MiLCJmbGFnIiwidG9TdHJpbmciLCJ0cmltIiwiZm9yRWFjaCIsIm9rIiwicGVybWFuZW50RmxhZ3MiLCJwZXJtYW5lbnRmbGFncyIsInVpZFZhbGlkaXR5IiwiTnVtYmVyIiwidWlkdmFsaWRpdHkiLCJ1aWROZXh0IiwidWlkbmV4dCIsImhpZ2hlc3RNb2RzZXEiLCJoaWdoZXN0bW9kc2VxIiwibm9Nb2RzZXEiLCJwYXJzZUVOVkVMT1BFIiwiZW52ZWxvcGUiLCJkYXRlIiwic3ViamVjdCIsImZyb20iLCJwcm9jZXNzQWRkcmVzc2VzIiwic2VuZGVyIiwidG8iLCJjYyIsImJjYyIsImxpc3QiLCJhZGRyIiwibmFtZSIsImFkZHJlc3MiLCJmb3JtYXR0ZWQiLCJlbmNvZGVBZGRyZXNzTmFtZSIsInBhcnNlZCIsInNoaWZ0IiwidGVzdCIsIkpTT04iLCJzdHJpbmdpZnkiLCJwYXJzZUJPRFlTVFJVQ1RVUkUiLCJub2RlIiwicGF0aCIsImN1ck5vZGUiLCJpIiwicGFydCIsImpvaW4iLCJBcnJheSIsImlzQXJyYXkiLCJjaGlsZE5vZGVzIiwicHVzaCIsInR5cGUiLCJ0b0xvd2VyQ2FzZSIsInBhcmFtZXRlcnMiLCJhdHRyaWJ1dGVzVG9PYmplY3QiLCJpZCIsImRlc2NyaXB0aW9uIiwiZW5jb2RpbmciLCJzaXplIiwibGluZUNvdW50IiwibWQ1IiwiZGlzcG9zaXRpb24iLCJkaXNwb3NpdGlvblBhcmFtZXRlcnMiLCJsYW5ndWFnZSIsInZhbCIsImxvY2F0aW9uIiwiYXR0cnMiLCJrZXlUcmFuc2Zvcm0iLCJ0b0xvd2VyIiwidmFsdWVUcmFuc2Zvcm0iLCJtaW1lV29yZHNEZWNvZGUiLCJ2YWxzIiwia2V5cyIsImZpbHRlciIsIl8iLCJ2YWx1ZXMiLCJwYXJzZUZFVENIIiwiRkVUQ0giLCJtZXNzYWdlcyIsIml0ZW0iLCJwYXJhbXMiLCJtZXNzYWdlIiwibGVuIiwia2V5IiwicmVwbGFjZSIsInBhcnNlRmV0Y2hWYWx1ZSIsImJpblNlYXJjaCIsImhheXN0YWNrIiwibmVlZGxlIiwiY29tcGFyYXRvciIsImEiLCJiIiwibWlkIiwiY21wIiwibG93IiwiaGlnaCIsInBhcnNlU0VBUkNIIiwiU0VBUkNIIiwicmVzdWx0IiwiaWR4Iiwic3BsaWNlIiwicGFyc2VDT1BZIiwiY29weXVpZCIsInNyY1NlcVNldCIsImRlc3RTZXFTZXQiLCJwYXJzZUFQUEVORCIsImFwcGVuZHVpZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFFQTs7Ozs7O0FBTU8sU0FBU0EsY0FBVCxDQUF5QkMsUUFBekIsRUFBbUM7QUFDeEMsTUFBSSxDQUFDQSxRQUFRLENBQUNDLE9BQVYsSUFBcUIsQ0FBQ0QsUUFBUSxDQUFDQyxPQUFULENBQWlCQyxTQUF2QyxJQUFvRCxDQUFDRixRQUFRLENBQUNDLE9BQVQsQ0FBaUJDLFNBQWpCLENBQTJCQyxNQUFwRixFQUE0RjtBQUMxRixXQUFPLEtBQVA7QUFDRDs7QUFFRCxRQUFNQyxVQUFVLEdBQUcsR0FBR0MsTUFBSCxDQUFVTCxRQUFRLENBQUNDLE9BQVQsQ0FBaUJDLFNBQWpCLENBQTJCSSxHQUEzQixHQUFpQ0YsVUFBakMsSUFBK0MsRUFBekQsQ0FBbkI7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LENBRGI7QUFFTEUsTUFBQUEsVUFBVSxFQUFFRixPQUFPLENBQUMsQ0FBRDtBQUZkLEtBQVA7QUFJRDtBQUNGO0FBRUQ7Ozs7Ozs7O0FBTU8sU0FBU0csV0FBVCxDQUFzQm5JLFFBQXRCLEVBQWdDO0FBQ3JDLFNBQU9BLFFBQVEsSUFBSUEsUUFBUSxDQUFDb0ksU0FBckIsSUFBa0NwSSxRQUFRLENBQUNvSSxTQUFULENBQW1CLENBQW5CLENBQXpDO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGFyc2VBZGRyZXNzIGZyb20gJ2VtYWlsanMtYWRkcmVzc3BhcnNlcidcbmltcG9ydCB7IGNvbXBpbGVyIH0gZnJvbSAnZW1haWxqcy1pbWFwLWhhbmRsZXInXG5pbXBvcnQgeyB6aXAsIGZyb21QYWlycywgcHJvcCwgcGF0aE9yLCBwcm9wT3IsIHRvTG93ZXIgfSBmcm9tICdyYW1kYSdcbmltcG9ydCB7IG1pbWVXb3JkRW5jb2RlLCBtaW1lV29yZHNEZWNvZGUgfSBmcm9tICdlbWFpbGpzLW1pbWUtY29kZWMnXG5cbi8qKlxuICogUGFyc2VzIE5BTUVTUEFDRSByZXNwb25zZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZXNwb25zZVxuICogQHJldHVybiB7T2JqZWN0fSBOYW1lc3BhY2VzIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VOQU1FU1BBQ0UgKHJlc3BvbnNlKSB7XG4gIGlmICghcmVzcG9uc2UucGF5bG9hZCB8fCAhcmVzcG9uc2UucGF5bG9hZC5OQU1FU1BBQ0UgfHwgIXJlc3BvbnNlLnBheWxvYWQuTkFNRVNQQUNFLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgY29uc3QgYXR0cmlidXRlcyA9IFtdLmNvbmNhdChyZXNwb25zZS5wYXlsb2FkLk5BTUVTUEFDRS5wb3AoKS5hdHRyaWJ1dGVzIHx8IFtdKVxuICBpZiAoIWF0dHJpYnV0ZXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBlcnNvbmFsOiBwYXJzZU5BTUVTUEFDRUVsZW1lbnQoYXR0cmlidXRlc1swXSksXG4gICAgdXNlcnM6IHBhcnNlTkFNRVNQQUNFRWxlbWVudChhdHRyaWJ1dGVzWzFdKSxcbiAgICBzaGFyZWQ6IHBhcnNlTkFNRVNQQUNFRWxlbWVudChhdHRyaWJ1dGVzWzJdKVxuICB9XG59XG5cbi8qKlxuICogUGFyc2VzIGEgTkFNRVNQQUNFIGVsZW1lbnRcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZWxlbWVudFxuICogQHJldHVybiB7T2JqZWN0fSBOYW1lc3BhY2VzIGVsZW1lbnQgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU5BTUVTUEFDRUVsZW1lbnQgKGVsZW1lbnQpIHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBlbGVtZW50ID0gW10uY29uY2F0KGVsZW1lbnQgfHwgW10pXG4gIHJldHVybiBlbGVtZW50Lm1hcCgobnMpID0+IHtcbiAgICBpZiAoIW5zIHx8ICFucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwcmVmaXg6IG5zWzBdLnZhbHVlLFxuICAgICAgZGVsaW1pdGVyOiBuc1sxXSAmJiBuc1sxXS52YWx1ZSAvLyBUaGUgZGVsaW1pdGVyIGNhbiBsZWdhbGx5IGJlIE5JTCB3aGljaCBtYXBzIHRvIG51bGxcbiAgICB9XG4gIH0pXG59XG5cbi8qKlxuICogUGFyc2VzIFNFTEVDVCByZXNwb25zZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZXNwb25zZVxuICogQHJldHVybiB7T2JqZWN0fSBNYWlsYm94IGluZm9ybWF0aW9uIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTRUxFQ1QgKHJlc3BvbnNlKSB7XG4gIGlmICghcmVzcG9uc2UgfHwgIXJlc3BvbnNlLnBheWxvYWQpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IG1haWxib3ggPSB7XG4gICAgcmVhZE9ubHk6IHJlc3BvbnNlLmNvZGUgPT09ICdSRUFELU9OTFknXG4gIH1cbiAgY29uc3QgZXhpc3RzUmVzcG9uc2UgPSByZXNwb25zZS5wYXlsb2FkLkVYSVNUUyAmJiByZXNwb25zZS5wYXlsb2FkLkVYSVNUUy5wb3AoKVxuICBjb25zdCBmbGFnc1Jlc3BvbnNlID0gcmVzcG9uc2UucGF5bG9hZC5GTEFHUyAmJiByZXNwb25zZS5wYXlsb2FkLkZMQUdTLnBvcCgpXG4gIGNvbnN0IG9rUmVzcG9uc2UgPSByZXNwb25zZS5wYXlsb2FkLk9LXG5cbiAgaWYgKGV4aXN0c1Jlc3BvbnNlKSB7XG4gICAgbWFpbGJveC5leGlzdHMgPSBleGlzdHNSZXNwb25zZS5uciB8fCAwXG4gIH1cblxuICBpZiAoZmxhZ3NSZXNwb25zZSAmJiBmbGFnc1Jlc3BvbnNlLmF0dHJpYnV0ZXMgJiYgZmxhZ3NSZXNwb25zZS5hdHRyaWJ1dGVzLmxlbmd0aCkge1xuICAgIG1haWxib3guZmxhZ3MgPSBmbGFnc1Jlc3BvbnNlLmF0dHJpYnV0ZXNbMF0ubWFwKChmbGFnKSA9PiAoZmxhZy52YWx1ZSB8fCAnJykudG9TdHJpbmcoKS50cmltKCkpXG4gIH1cblxuICBbXS5jb25jYXQob2tSZXNwb25zZSB8fCBbXSkuZm9yRWFjaCgob2spID0+IHtcbiAgICBzd2l0Y2ggKG9rICYmIG9rLmNvZGUpIHtcbiAgICAgIGNhc2UgJ1BFUk1BTkVOVEZMQUdTJzpcbiAgICAgICAgbWFpbGJveC5wZXJtYW5lbnRGbGFncyA9IFtdLmNvbmNhdChvay5wZXJtYW5lbnRmbGFncyB8fCBbXSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ1VJRFZBTElESVRZJzpcbiAgICAgICAgbWFpbGJveC51aWRWYWxpZGl0eSA9IE51bWJlcihvay51aWR2YWxpZGl0eSkgfHwgMFxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnVUlETkVYVCc6XG4gICAgICAgIG1haWxib3gudWlkTmV4dCA9IE51bWJlcihvay51aWRuZXh0KSB8fCAwXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdISUdIRVNUTU9EU0VRJzpcbiAgICAgICAgbWFpbGJveC5oaWdoZXN0TW9kc2VxID0gb2suaGlnaGVzdG1vZHNlcSB8fCAnMCcgLy8ga2VlcCA2NGJpdCB1aW50IGFzIGEgc3RyaW5nXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdOT01PRFNFUSc6XG4gICAgICAgIG1haWxib3gubm9Nb2RzZXEgPSB0cnVlXG4gICAgICAgIGJyZWFrXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBtYWlsYm94XG59XG5cbi8qKlxuICogUGFyc2VzIG1lc3NhZ2UgZW52ZWxvcGUgZnJvbSBGRVRDSCByZXNwb25zZS4gQWxsIGtleXMgaW4gdGhlIHJlc3VsdGluZ1xuICogb2JqZWN0IGFyZSBsb3dlcmNhc2UuIEFkZHJlc3MgZmllbGRzIGFyZSBhbGwgYXJyYXlzIHdpdGgge25hbWU6LCBhZGRyZXNzOn1cbiAqIHN0cnVjdHVyZWQgdmFsdWVzLiBVbmljb2RlIHN0cmluZ3MgYXJlIGF1dG9tYXRpY2FsbHkgZGVjb2RlZC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSB2YWx1ZSBFbnZlbG9wZSBhcnJheVxuICogQHBhcmFtIHtPYmplY3R9IEVudmVsb3BlIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VFTlZFTE9QRSAodmFsdWUpIHtcbiAgY29uc3QgZW52ZWxvcGUgPSB7fVxuXG4gIGlmICh2YWx1ZVswXSAmJiB2YWx1ZVswXS52YWx1ZSkge1xuICAgIGVudmVsb3BlLmRhdGUgPSB2YWx1ZVswXS52YWx1ZVxuICB9XG5cbiAgaWYgKHZhbHVlWzFdICYmIHZhbHVlWzFdLnZhbHVlKSB7XG4gICAgZW52ZWxvcGUuc3ViamVjdCA9IG1pbWVXb3Jkc0RlY29kZSh2YWx1ZVsxXSAmJiB2YWx1ZVsxXS52YWx1ZSlcbiAgfVxuXG4gIGlmICh2YWx1ZVsyXSAmJiB2YWx1ZVsyXS5sZW5ndGgpIHtcbiAgICBlbnZlbG9wZS5mcm9tID0gcHJvY2Vzc0FkZHJlc3Nlcyh2YWx1ZVsyXSlcbiAgfVxuXG4gIGlmICh2YWx1ZVszXSAmJiB2YWx1ZVszXS5sZW5ndGgpIHtcbiAgICBlbnZlbG9wZS5zZW5kZXIgPSBwcm9jZXNzQWRkcmVzc2VzKHZhbHVlWzNdKVxuICB9XG5cbiAgaWYgKHZhbHVlWzRdICYmIHZhbHVlWzRdLmxlbmd0aCkge1xuICAgIGVudmVsb3BlWydyZXBseS10byddID0gcHJvY2Vzc0FkZHJlc3Nlcyh2YWx1ZVs0XSlcbiAgfVxuXG4gIGlmICh2YWx1ZVs1XSAmJiB2YWx1ZVs1XS5sZW5ndGgpIHtcbiAgICBlbnZlbG9wZS50byA9IHByb2Nlc3NBZGRyZXNzZXModmFsdWVbNV0pXG4gIH1cblxuICBpZiAodmFsdWVbNl0gJiYgdmFsdWVbNl0ubGVuZ3RoKSB7XG4gICAgZW52ZWxvcGUuY2MgPSBwcm9jZXNzQWRkcmVzc2VzKHZhbHVlWzZdKVxuICB9XG5cbiAgaWYgKHZhbHVlWzddICYmIHZhbHVlWzddLmxlbmd0aCkge1xuICAgIGVudmVsb3BlLmJjYyA9IHByb2Nlc3NBZGRyZXNzZXModmFsdWVbN10pXG4gIH1cblxuICBpZiAodmFsdWVbOF0gJiYgdmFsdWVbOF0udmFsdWUpIHtcbiAgICBlbnZlbG9wZVsnaW4tcmVwbHktdG8nXSA9IHZhbHVlWzhdLnZhbHVlXG4gIH1cblxuICBpZiAodmFsdWVbOV0gJiYgdmFsdWVbOV0udmFsdWUpIHtcbiAgICBlbnZlbG9wZVsnbWVzc2FnZS1pZCddID0gdmFsdWVbOV0udmFsdWVcbiAgfVxuXG4gIHJldHVybiBlbnZlbG9wZVxufVxuXG4vKlxuICogRU5WRUxPUEUgbGlzdHMgYWRkcmVzc2VzIGFzIFtuYW1lLXBhcnQsIHNvdXJjZS1yb3V0ZSwgdXNlcm5hbWUsIGhvc3RuYW1lXVxuICogd2hlcmUgc291cmNlLXJvdXRlIGlzIG5vdCB1c2VkIGFueW1vcmUgYW5kIGNhbiBiZSBpZ25vcmVkLlxuICogVG8gZ2V0IGNvbXBhcmFibGUgcmVzdWx0cyB3aXRoIG90aGVyIHBhcnRzIG9mIHRoZSBlbWFpbC5qcyBzdGFja1xuICogYnJvd3NlcmJveCBmZWVkcyB0aGUgcGFyc2VkIGFkZHJlc3MgdmFsdWVzIGZyb20gRU5WRUxPUEVcbiAqIHRvIGFkZHJlc3NwYXJzZXIgYW5kIHVzZXMgcmVzdWx0aW5nIHZhbHVlcyBpbnN0ZWFkIG9mIHRoZVxuICogcHJlLXBhcnNlZCBhZGRyZXNzZXNcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0FkZHJlc3NlcyAobGlzdCA9IFtdKSB7XG4gIHJldHVybiBsaXN0Lm1hcCgoYWRkcikgPT4ge1xuICAgIGNvbnN0IG5hbWUgPSAocGF0aE9yKCcnLCBbJzAnLCAndmFsdWUnXSwgYWRkcikpLnRyaW0oKVxuICAgIGNvbnN0IGFkZHJlc3MgPSAocGF0aE9yKCcnLCBbJzInLCAndmFsdWUnXSwgYWRkcikpICsgJ0AnICsgKHBhdGhPcignJywgWyczJywgJ3ZhbHVlJ10sIGFkZHIpKVxuICAgIGNvbnN0IGZvcm1hdHRlZCA9IG5hbWUgPyAoZW5jb2RlQWRkcmVzc05hbWUobmFtZSkgKyAnIDwnICsgYWRkcmVzcyArICc+JykgOiBhZGRyZXNzXG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VBZGRyZXNzKGZvcm1hdHRlZCkuc2hpZnQoKSAvLyB0aGVyZSBzaG91bGQgYmUganVzdCBhIHNpbmdsZSBhZGRyZXNzXG4gICAgcGFyc2VkLm5hbWUgPSBtaW1lV29yZHNEZWNvZGUocGFyc2VkLm5hbWUpXG4gICAgcmV0dXJuIHBhcnNlZFxuICB9KVxufVxuXG4vKipcbiAqIElmIG5lZWRlZCwgZW5jbG9zZXMgd2l0aCBxdW90ZXMgb3IgbWltZSBlbmNvZGVzIHRoZSBuYW1lIHBhcnQgb2YgYW4gZS1tYWlsIGFkZHJlc3NcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBOYW1lIHBhcnQgb2YgYW4gYWRkcmVzc1xuICogQHJldHVybnMge1N0cmluZ30gTWltZSB3b3JkIGVuY29kZWQgb3IgcXVvdGVkIHN0cmluZ1xuICovXG5mdW5jdGlvbiBlbmNvZGVBZGRyZXNzTmFtZSAobmFtZSkge1xuICBpZiAoIS9eW1xcdyAnXSokLy50ZXN0KG5hbWUpKSB7XG4gICAgaWYgKC9eW1xceDIwLVxceDdlXSokLy50ZXN0KG5hbWUpKSB7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkobmFtZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1pbWVXb3JkRW5jb2RlKG5hbWUsICdRJywgNTIpXG4gICAgfVxuICB9XG4gIHJldHVybiBuYW1lXG59XG5cbi8qKlxuICogUGFyc2VzIG1lc3NhZ2UgYm9keSBzdHJ1Y3R1cmUgZnJvbSBGRVRDSCByZXNwb25zZS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSB2YWx1ZSBCT0RZU1RSVUNUVVJFIGFycmF5XG4gKiBAcGFyYW0ge09iamVjdH0gRW52ZWxvcGUgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUJPRFlTVFJVQ1RVUkUgKG5vZGUsIHBhdGggPSBbXSkge1xuICBjb25zdCBjdXJOb2RlID0ge31cbiAgbGV0IGkgPSAwXG4gIGxldCBwYXJ0ID0gMFxuXG4gIGlmIChwYXRoLmxlbmd0aCkge1xuICAgIGN1ck5vZGUucGFydCA9IHBhdGguam9pbignLicpXG4gIH1cblxuICAvLyBtdWx0aXBhcnRcbiAgaWYgKEFycmF5LmlzQXJyYXkobm9kZVswXSkpIHtcbiAgICBjdXJOb2RlLmNoaWxkTm9kZXMgPSBbXVxuICAgIHdoaWxlIChBcnJheS5pc0FycmF5KG5vZGVbaV0pKSB7XG4gICAgICBjdXJOb2RlLmNoaWxkTm9kZXMucHVzaChwYXJzZUJPRFlTVFJVQ1RVUkUobm9kZVtpXSwgcGF0aC5jb25jYXQoKytwYXJ0KSkpXG4gICAgICBpKytcbiAgICB9XG5cbiAgICAvLyBtdWx0aXBhcnQgdHlwZVxuICAgIGN1ck5vZGUudHlwZSA9ICdtdWx0aXBhcnQvJyArICgobm9kZVtpKytdIHx8IHt9KS52YWx1ZSB8fCAnJykudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpXG5cbiAgICAvLyBleHRlbnNpb24gZGF0YSAobm90IGF2YWlsYWJsZSBmb3IgQk9EWSByZXF1ZXN0cylcblxuICAgIC8vIGJvZHkgcGFyYW1ldGVyIHBhcmVudGhlc2l6ZWQgbGlzdFxuICAgIGlmIChpIDwgbm9kZS5sZW5ndGggLSAxKSB7XG4gICAgICBpZiAobm9kZVtpXSkge1xuICAgICAgICBjdXJOb2RlLnBhcmFtZXRlcnMgPSBhdHRyaWJ1dGVzVG9PYmplY3Qobm9kZVtpXSlcbiAgICAgIH1cbiAgICAgIGkrK1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBjb250ZW50IHR5cGVcbiAgICBjdXJOb2RlLnR5cGUgPSBbXG4gICAgICAoKG5vZGVbaSsrXSB8fCB7fSkudmFsdWUgfHwgJycpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSwgKChub2RlW2krK10gfHwge30pLnZhbHVlIHx8ICcnKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKClcbiAgICBdLmpvaW4oJy8nKVxuXG4gICAgLy8gYm9keSBwYXJhbWV0ZXIgcGFyZW50aGVzaXplZCBsaXN0XG4gICAgaWYgKG5vZGVbaV0pIHtcbiAgICAgIGN1ck5vZGUucGFyYW1ldGVycyA9IGF0dHJpYnV0ZXNUb09iamVjdChub2RlW2ldKVxuICAgIH1cbiAgICBpKytcblxuICAgIC8vIGlkXG4gICAgaWYgKG5vZGVbaV0pIHtcbiAgICAgIGN1ck5vZGUuaWQgPSAoKG5vZGVbaV0gfHwge30pLnZhbHVlIHx8ICcnKS50b1N0cmluZygpXG4gICAgfVxuICAgIGkrK1xuXG4gICAgLy8gZGVzY3JpcHRpb25cbiAgICBpZiAobm9kZVtpXSkge1xuICAgICAgY3VyTm9kZS5kZXNjcmlwdGlvbiA9ICgobm9kZVtpXSB8fCB7fSkudmFsdWUgfHwgJycpLnRvU3RyaW5nKClcbiAgICB9XG4gICAgaSsrXG5cbiAgICAvLyBlbmNvZGluZ1xuICAgIGlmIChub2RlW2ldKSB7XG4gICAgICBjdXJOb2RlLmVuY29kaW5nID0gKChub2RlW2ldIHx8IHt9KS52YWx1ZSB8fCAnJykudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpXG4gICAgfVxuICAgIGkrK1xuXG4gICAgLy8gc2l6ZVxuICAgIGlmIChub2RlW2ldKSB7XG4gICAgICBjdXJOb2RlLnNpemUgPSBOdW1iZXIoKG5vZGVbaV0gfHwge30pLnZhbHVlIHx8IDApIHx8IDBcbiAgICB9XG4gICAgaSsrXG5cbiAgICBpZiAoY3VyTm9kZS50eXBlID09PSAnbWVzc2FnZS9yZmM4MjInKSB7XG4gICAgICAvLyBtZXNzYWdlL3JmYyBhZGRzIGFkZGl0aW9uYWwgZW52ZWxvcGUsIGJvZHlzdHJ1Y3R1cmUgYW5kIGxpbmUgY291bnQgdmFsdWVzXG5cbiAgICAgIC8vIGVudmVsb3BlXG4gICAgICBpZiAobm9kZVtpXSkge1xuICAgICAgICBjdXJOb2RlLmVudmVsb3BlID0gcGFyc2VFTlZFTE9QRShbXS5jb25jYXQobm9kZVtpXSB8fCBbXSkpXG4gICAgICB9XG4gICAgICBpKytcblxuICAgICAgaWYgKG5vZGVbaV0pIHtcbiAgICAgICAgY3VyTm9kZS5jaGlsZE5vZGVzID0gW1xuICAgICAgICAgIC8vIHJmYzgyMiBib2R5cGFydHMgc2hhcmUgdGhlIHNhbWUgcGF0aCwgZGlmZmVyZW5jZSBpcyBiZXR3ZWVuIE1JTUUgYW5kIEhFQURFUlxuICAgICAgICAgIC8vIHBhdGguTUlNRSByZXR1cm5zIG1lc3NhZ2UvcmZjODIyIGhlYWRlclxuICAgICAgICAgIC8vIHBhdGguSEVBREVSIHJldHVybnMgaW5saW5lZCBtZXNzYWdlIGhlYWRlclxuICAgICAgICAgIHBhcnNlQk9EWVNUUlVDVFVSRShub2RlW2ldLCBwYXRoKVxuICAgICAgICBdXG4gICAgICB9XG4gICAgICBpKytcblxuICAgICAgLy8gbGluZSBjb3VudFxuICAgICAgaWYgKG5vZGVbaV0pIHtcbiAgICAgICAgY3VyTm9kZS5saW5lQ291bnQgPSBOdW1iZXIoKG5vZGVbaV0gfHwge30pLnZhbHVlIHx8IDApIHx8IDBcbiAgICAgIH1cbiAgICAgIGkrK1xuICAgIH0gZWxzZSBpZiAoL150ZXh0XFwvLy50ZXN0KGN1ck5vZGUudHlwZSkpIHtcbiAgICAgIC8vIHRleHQvKiBhZGRzIGFkZGl0aW9uYWwgbGluZSBjb3VudCB2YWx1ZXNcblxuICAgICAgLy8gbGluZSBjb3VudFxuICAgICAgaWYgKG5vZGVbaV0pIHtcbiAgICAgICAgY3VyTm9kZS5saW5lQ291bnQgPSBOdW1iZXIoKG5vZGVbaV0gfHwge30pLnZhbHVlIHx8IDApIHx8IDBcbiAgICAgIH1cbiAgICAgIGkrK1xuICAgIH1cblxuICAgIC8vIGV4dGVuc2lvbiBkYXRhIChub3QgYXZhaWxhYmxlIGZvciBCT0RZIHJlcXVlc3RzKVxuXG4gICAgLy8gbWQ1XG4gICAgaWYgKGkgPCBub2RlLmxlbmd0aCAtIDEpIHtcbiAgICAgIGlmIChub2RlW2ldKSB7XG4gICAgICAgIGN1ck5vZGUubWQ1ID0gKChub2RlW2ldIHx8IHt9KS52YWx1ZSB8fCAnJykudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpXG4gICAgICB9XG4gICAgICBpKytcbiAgICB9XG4gIH1cblxuICAvLyB0aGUgZm9sbG93aW5nIGFyZSBzaGFyZWQgZXh0ZW5zaW9uIHZhbHVlcyAoZm9yIGJvdGggbXVsdGlwYXJ0IGFuZCBub24tbXVsdGlwYXJ0IHBhcnRzKVxuICAvLyBub3QgYXZhaWxhYmxlIGZvciBCT0RZIHJlcXVlc3RzXG5cbiAgLy8gYm9keSBkaXNwb3NpdGlvblxuICBpZiAoaSA8IG5vZGUubGVuZ3RoIC0gMSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGVbaV0pICYmIG5vZGVbaV0ubGVuZ3RoKSB7XG4gICAgICBjdXJOb2RlLmRpc3Bvc2l0aW9uID0gKChub2RlW2ldWzBdIHx8IHt9KS52YWx1ZSB8fCAnJykudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlW2ldWzFdKSkge1xuICAgICAgICBjdXJOb2RlLmRpc3Bvc2l0aW9uUGFyYW1ldGVycyA9IGF0dHJpYnV0ZXNUb09iamVjdChub2RlW2ldWzFdKVxuICAgICAgfVxuICAgIH1cbiAgICBpKytcbiAgfVxuXG4gIC8vIGJvZHkgbGFuZ3VhZ2VcbiAgaWYgKGkgPCBub2RlLmxlbmd0aCAtIDEpIHtcbiAgICBpZiAobm9kZVtpXSkge1xuICAgICAgY3VyTm9kZS5sYW5ndWFnZSA9IFtdLmNvbmNhdChub2RlW2ldKS5tYXAoKHZhbCkgPT4gcHJvcE9yKCcnLCAndmFsdWUnLCB2YWwpLnRvTG93ZXJDYXNlKCkpXG4gICAgfVxuICAgIGkrK1xuICB9XG5cbiAgLy8gYm9keSBsb2NhdGlvblxuICAvLyBOQiEgZGVmaW5lZCBhcyBhIFwic3RyaW5nIGxpc3RcIiBpbiBSRkMzNTAxIGJ1dCByZXBsYWNlZCBpbiBlcnJhdGEgZG9jdW1lbnQgd2l0aCBcInN0cmluZ1wiXG4gIC8vIEVycmF0YTogaHR0cDovL3d3dy5yZmMtZWRpdG9yLm9yZy9lcnJhdGFfc2VhcmNoLnBocD9yZmM9MzUwMVxuICBpZiAoaSA8IG5vZGUubGVuZ3RoIC0gMSkge1xuICAgIGlmIChub2RlW2ldKSB7XG4gICAgICBjdXJOb2RlLmxvY2F0aW9uID0gKChub2RlW2ldIHx8IHt9KS52YWx1ZSB8fCAnJykudG9TdHJpbmcoKVxuICAgIH1cbiAgICBpKytcbiAgfVxuXG4gIHJldHVybiBjdXJOb2RlXG59XG5cbmZ1bmN0aW9uIGF0dHJpYnV0ZXNUb09iamVjdCAoYXR0cnMgPSBbXSwga2V5VHJhbnNmb3JtID0gdG9Mb3dlciwgdmFsdWVUcmFuc2Zvcm0gPSBtaW1lV29yZHNEZWNvZGUpIHtcbiAgY29uc3QgdmFscyA9IGF0dHJzLm1hcChwcm9wKCd2YWx1ZScpKVxuICBjb25zdCBrZXlzID0gdmFscy5maWx0ZXIoKF8sIGkpID0+IGkgJSAyID09PSAwKS5tYXAoa2V5VHJhbnNmb3JtKVxuICBjb25zdCB2YWx1ZXMgPSB2YWxzLmZpbHRlcigoXywgaSkgPT4gaSAlIDIgPT09IDEpLm1hcCh2YWx1ZVRyYW5zZm9ybSlcbiAgcmV0dXJuIGZyb21QYWlycyh6aXAoa2V5cywgdmFsdWVzKSlcbn1cblxuLyoqXG4gKiBQYXJzZXMgRkVUQ0ggcmVzcG9uc2VcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcmVzcG9uc2VcbiAqIEByZXR1cm4ge09iamVjdH0gTWVzc2FnZSBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRkVUQ0ggKHJlc3BvbnNlKSB7XG4gIGlmICghcmVzcG9uc2UgfHwgIXJlc3BvbnNlLnBheWxvYWQgfHwgIXJlc3BvbnNlLnBheWxvYWQuRkVUQ0ggfHwgIXJlc3BvbnNlLnBheWxvYWQuRkVUQ0gubGVuZ3RoKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBjb25zdCBsaXN0ID0gW11cbiAgY29uc3QgbWVzc2FnZXMgPSB7fVxuXG4gIHJlc3BvbnNlLnBheWxvYWQuRkVUQ0guZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IFtdLmNvbmNhdChbXS5jb25jYXQoaXRlbS5hdHRyaWJ1dGVzIHx8IFtdKVswXSB8fCBbXSkgLy8gZW5zdXJlIHRoZSBmaXJzdCB2YWx1ZSBpcyBhbiBhcnJheVxuICAgIGxldCBtZXNzYWdlXG4gICAgbGV0IGksIGxlbiwga2V5XG5cbiAgICBpZiAobWVzc2FnZXNbaXRlbS5ucl0pIHtcbiAgICAgIC8vIHNhbWUgc2VxdWVuY2UgbnVtYmVyIGlzIGFscmVhZHkgdXNlZCwgc28gbWVyZ2UgdmFsdWVzIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgbWVzc2FnZSBvYmplY3RcbiAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlc1tpdGVtLm5yXVxuICAgIH0gZWxzZSB7XG4gICAgICBtZXNzYWdlc1tpdGVtLm5yXSA9IG1lc3NhZ2UgPSB7XG4gICAgICAgICcjJzogaXRlbS5uclxuICAgICAgfVxuICAgICAgbGlzdC5wdXNoKG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgZm9yIChpID0gMCwgbGVuID0gcGFyYW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBpZiAoaSAlIDIgPT09IDApIHtcbiAgICAgICAga2V5ID0gY29tcGlsZXIoe1xuICAgICAgICAgIGF0dHJpYnV0ZXM6IFtwYXJhbXNbaV1dXG4gICAgICAgIH0pLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvPFxcZCs+JC8sICcnKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgbWVzc2FnZVtrZXldID0gcGFyc2VGZXRjaFZhbHVlKGtleSwgcGFyYW1zW2ldKVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gbGlzdFxufVxuXG4vKipcbiAqIFBhcnNlcyBhIHNpbmdsZSB2YWx1ZSBmcm9tIHRoZSBGRVRDSCByZXNwb25zZSBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5IEtleSBuYW1lICh1cHBlcmNhc2UpXG4gKiBAcGFyYW0ge01pemVkfSB2YWx1ZSBWYWx1ZSBmb3IgdGhlIGtleVxuICogQHJldHVybiB7TWl4ZWR9IFByb2Nlc3NlZCB2YWx1ZVxuICovXG5mdW5jdGlvbiBwYXJzZUZldGNoVmFsdWUgKGtleSwgdmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgc3dpdGNoIChrZXkpIHtcbiAgICAgIGNhc2UgJ3VpZCc6XG4gICAgICBjYXNlICdyZmM4MjIuc2l6ZSc6XG4gICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUudmFsdWUpIHx8IDBcbiAgICAgIGNhc2UgJ21vZHNlcSc6IC8vIGRvIG5vdCBjYXN0IDY0IGJpdCB1aW50IHRvIGEgbnVtYmVyXG4gICAgICAgIHJldHVybiB2YWx1ZS52YWx1ZSB8fCAnMCdcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlLnZhbHVlXG4gIH1cblxuICBzd2l0Y2ggKGtleSkge1xuICAgIGNhc2UgJ2ZsYWdzJzpcbiAgICBjYXNlICd4LWdtLWxhYmVscyc6XG4gICAgICB2YWx1ZSA9IFtdLmNvbmNhdCh2YWx1ZSkubWFwKChmbGFnKSA9PiAoZmxhZy52YWx1ZSB8fCAnJykpXG4gICAgICBicmVha1xuICAgIGNhc2UgJ2VudmVsb3BlJzpcbiAgICAgIHZhbHVlID0gcGFyc2VFTlZFTE9QRShbXS5jb25jYXQodmFsdWUgfHwgW10pKVxuICAgICAgYnJlYWtcbiAgICBjYXNlICdib2R5c3RydWN0dXJlJzpcbiAgICAgIHZhbHVlID0gcGFyc2VCT0RZU1RSVUNUVVJFKFtdLmNvbmNhdCh2YWx1ZSB8fCBbXSkpXG4gICAgICBicmVha1xuICAgIGNhc2UgJ21vZHNlcSc6XG4gICAgICB2YWx1ZSA9ICh2YWx1ZS5zaGlmdCgpIHx8IHt9KS52YWx1ZSB8fCAnMCdcbiAgICAgIGJyZWFrXG4gIH1cblxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gICogQmluYXJ5IFNlYXJjaCAtIGZyb20gbnBtIG1vZHVsZSBiaW5hcnktc2VhcmNoLCBsaWNlbnNlIENDMFxuICAqXG4gICogQHBhcmFtIHtBcnJheX0gaGF5c3RhY2sgT3JkZXJlZCBhcnJheVxuICAqIEBwYXJhbSB7YW55fSBuZWVkbGUgSXRlbSB0byBzZWFyY2ggZm9yIGluIGhheXN0YWNrXG4gICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBGdW5jdGlvbiB0aGF0IGRlZmluZXMgdGhlIHNvcnQgb3JkZXJcbiAgKiBAcmV0dXJuIHtOdW1iZXJ9IEluZGV4IG9mIG5lZWRsZSBpbiBoYXlzdGFjayBvciBpZiBub3QgZm91bmQsXG4gICogICAgIC1JbmRleC0xIGlzIHRoZSBwb3NpdGlvbiB3aGVyZSBuZWVkbGUgY291bGQgYmUgaW5zZXJ0ZWQgd2hpbGUgc3RpbGxcbiAgKiAgICAga2VlcGluZyBoYXlzdGFjayBvcmRlcmVkLlxuICAqL1xuZnVuY3Rpb24gYmluU2VhcmNoIChoYXlzdGFjaywgbmVlZGxlLCBjb21wYXJhdG9yID0gKGEsIGIpID0+IGEgLSBiKSB7XG4gIHZhciBtaWQsIGNtcFxuICB2YXIgbG93ID0gMFxuICB2YXIgaGlnaCA9IGhheXN0YWNrLmxlbmd0aCAtIDFcblxuICB3aGlsZSAobG93IDw9IGhpZ2gpIHtcbiAgICAvLyBOb3RlIHRoYXQgXCIobG93ICsgaGlnaCkgPj4+IDFcIiBtYXkgb3ZlcmZsb3csIGFuZCByZXN1bHRzIGluXG4gICAgLy8gYSB0eXBlY2FzdCB0byBkb3VibGUgKHdoaWNoIGdpdmVzIHRoZSB3cm9uZyByZXN1bHRzKS5cbiAgICBtaWQgPSBsb3cgKyAoaGlnaCAtIGxvdyA+PiAxKVxuICAgIGNtcCA9ICtjb21wYXJhdG9yKGhheXN0YWNrW21pZF0sIG5lZWRsZSlcblxuICAgIGlmIChjbXAgPCAwLjApIHtcbiAgICAgIC8vIHRvbyBsb3dcbiAgICAgIGxvdyA9IG1pZCArIDFcbiAgICB9IGVsc2UgaWYgKGNtcCA+IDAuMCkge1xuICAgICAgLy8gdG9vIGhpZ2hcbiAgICAgIGhpZ2ggPSBtaWQgLSAxXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGtleSBmb3VuZFxuICAgICAgcmV0dXJuIG1pZFxuICAgIH1cbiAgfVxuXG4gIC8vIGtleSBub3QgZm91bmRcbiAgcmV0dXJuIH5sb3dcbn07XG5cbi8qKlxuICogUGFyc2VzIFNFQVJDSCByZXNwb25zZS4gR2F0aGVycyBhbGwgdW50YWdnZWQgU0VBUkNIIHJlc3BvbnNlcywgZmV0Y2hlZCBzZXEuL3VpZCBudW1iZXJzXG4gKiBhbmQgY29tcGlsZXMgdGhlc2UgaW50byBhIHNvcnRlZCBhcnJheS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcmVzcG9uc2VcbiAqIEByZXR1cm4ge09iamVjdH0gTWVzc2FnZSBvYmplY3RcbiAqIEBwYXJhbSB7QXJyYXl9IFNvcnRlZCBTZXEuL1VJRCBudW1iZXIgbGlzdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTRUFSQ0ggKHJlc3BvbnNlKSB7XG4gIGNvbnN0IGxpc3QgPSBbXVxuXG4gIGlmICghcmVzcG9uc2UgfHwgIXJlc3BvbnNlLnBheWxvYWQgfHwgIXJlc3BvbnNlLnBheWxvYWQuU0VBUkNIIHx8ICFyZXNwb25zZS5wYXlsb2FkLlNFQVJDSC5sZW5ndGgpIHtcbiAgICByZXR1cm4gbGlzdFxuICB9XG5cbiAgcmVzcG9uc2UucGF5bG9hZC5TRUFSQ0guZm9yRWFjaChyZXN1bHQgPT5cbiAgICAocmVzdWx0LmF0dHJpYnV0ZXMgfHwgW10pLmZvckVhY2gobnIgPT4ge1xuICAgICAgbnIgPSBOdW1iZXIoKG5yICYmIG5yLnZhbHVlKSB8fCBucikgfHwgMFxuICAgICAgY29uc3QgaWR4ID0gYmluU2VhcmNoKGxpc3QsIG5yKVxuICAgICAgaWYgKGlkeCA8IDApIHtcbiAgICAgICAgbGlzdC5zcGxpY2UoLWlkeCAtIDEsIDAsIG5yKVxuICAgICAgfVxuICAgIH0pXG4gIClcblxuICByZXR1cm4gbGlzdFxufTtcblxuLyoqXG4gKiBQYXJzZXMgQ09QWSBhbmQgVUlEIENPUFkgcmVzcG9uc2UuXG4gKiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDMxNVxuICogQHBhcmFtIHtPYmplY3R9IHJlc3BvbnNlXG4gKiBAcmV0dXJucyB7e2Rlc3RTZXFTZXQ6IHN0cmluZywgc3JjU2VxU2V0OiBzdHJpbmd9fSBTb3VyY2UgYW5kXG4gKiBkZXN0aW5hdGlvbiB1aWQgc2V0cyBpZiBhdmFpbGFibGUsIHVuZGVmaW5lZCBpZiBub3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNPUFkgKHJlc3BvbnNlKSB7XG4gIGNvbnN0IGNvcHl1aWQgPSByZXNwb25zZSAmJiByZXNwb25zZS5jb3B5dWlkXG4gIGlmIChjb3B5dWlkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNyY1NlcVNldDogY29weXVpZFsxXSxcbiAgICAgIGRlc3RTZXFTZXQ6IGNvcHl1aWRbMl1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZXMgQVBQRU5EICh1cGxvYWQpIHJlc3BvbnNlLlxuICogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQzMTVcbiAqIEBwYXJhbSB7T2JqZWN0fSByZXNwb25zZVxuICogQHJldHVybnMge1N0cmluZ30gVGhlIHVpZCBhc3NpZ25lZCB0byB0aGUgdXBsb2FkZWQgbWVzc2FnZSBpZiBhdmFpbGFibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUFQUEVORCAocmVzcG9uc2UpIHtcbiAgcmV0dXJuIHJlc3BvbnNlICYmIHJlc3BvbnNlLmFwcGVuZHVpZCAmJiByZXNwb25zZS5hcHBlbmR1aWRbMV1cbn1cbiJdfQ== \ No newline at end of file diff --git a/dist/common.js b/dist/common.js new file mode 100644 index 00000000..a2646950 --- /dev/null +++ b/dist/common.js @@ -0,0 +1,27 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.fromTypedArray = exports.toTypedArray = exports.LOG_LEVEL_ALL = exports.LOG_LEVEL_DEBUG = exports.LOG_LEVEL_INFO = exports.LOG_LEVEL_WARN = exports.LOG_LEVEL_ERROR = exports.LOG_LEVEL_NONE = void 0; +const LOG_LEVEL_NONE = 1000; +exports.LOG_LEVEL_NONE = LOG_LEVEL_NONE; +const LOG_LEVEL_ERROR = 40; +exports.LOG_LEVEL_ERROR = LOG_LEVEL_ERROR; +const LOG_LEVEL_WARN = 30; +exports.LOG_LEVEL_WARN = LOG_LEVEL_WARN; +const LOG_LEVEL_INFO = 20; +exports.LOG_LEVEL_INFO = LOG_LEVEL_INFO; +const LOG_LEVEL_DEBUG = 10; +exports.LOG_LEVEL_DEBUG = LOG_LEVEL_DEBUG; +const LOG_LEVEL_ALL = 0; +exports.LOG_LEVEL_ALL = LOG_LEVEL_ALL; + +const toTypedArray = str => new Uint8Array(str.split('').map(char => char.charCodeAt(0))); + +exports.toTypedArray = toTypedArray; + +const fromTypedArray = arr => String.fromCharCode.apply(null, arr); + +exports.fromTypedArray = fromTypedArray; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21tb24uanMiXSwibmFtZXMiOlsiTE9HX0xFVkVMX05PTkUiLCJMT0dfTEVWRUxfRVJST1IiLCJMT0dfTEVWRUxfV0FSTiIsIkxPR19MRVZFTF9JTkZPIiwiTE9HX0xFVkVMX0RFQlVHIiwiTE9HX0xFVkVMX0FMTCIsInRvVHlwZWRBcnJheSIsInN0ciIsIlVpbnQ4QXJyYXkiLCJzcGxpdCIsIm1hcCIsImNoYXIiLCJjaGFyQ29kZUF0IiwiZnJvbVR5cGVkQXJyYXkiLCJhcnIiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJhcHBseSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQU8sTUFBTUEsY0FBYyxHQUFHLElBQXZCOztBQUNBLE1BQU1DLGVBQWUsR0FBRyxFQUF4Qjs7QUFDQSxNQUFNQyxjQUFjLEdBQUcsRUFBdkI7O0FBQ0EsTUFBTUMsY0FBYyxHQUFHLEVBQXZCOztBQUNBLE1BQU1DLGVBQWUsR0FBRyxFQUF4Qjs7QUFDQSxNQUFNQyxhQUFhLEdBQUcsQ0FBdEI7OztBQUVBLE1BQU1DLFlBQVksR0FBR0MsR0FBRyxJQUFJLElBQUlDLFVBQUosQ0FBZUQsR0FBRyxDQUFDRSxLQUFKLENBQVUsRUFBVixFQUFjQyxHQUFkLENBQWtCQyxJQUFJLElBQUlBLElBQUksQ0FBQ0MsVUFBTCxDQUFnQixDQUFoQixDQUExQixDQUFmLENBQTVCOzs7O0FBQ0EsTUFBTUMsY0FBYyxHQUFHQyxHQUFHLElBQUlDLE1BQU0sQ0FBQ0MsWUFBUCxDQUFvQkMsS0FBcEIsQ0FBMEIsSUFBMUIsRUFBZ0NILEdBQWhDLENBQTlCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IExPR19MRVZFTF9OT05FID0gMTAwMFxuZXhwb3J0IGNvbnN0IExPR19MRVZFTF9FUlJPUiA9IDQwXG5leHBvcnQgY29uc3QgTE9HX0xFVkVMX1dBUk4gPSAzMFxuZXhwb3J0IGNvbnN0IExPR19MRVZFTF9JTkZPID0gMjBcbmV4cG9ydCBjb25zdCBMT0dfTEVWRUxfREVCVUcgPSAxMFxuZXhwb3J0IGNvbnN0IExPR19MRVZFTF9BTEwgPSAwXG5cbmV4cG9ydCBjb25zdCB0b1R5cGVkQXJyYXkgPSBzdHIgPT4gbmV3IFVpbnQ4QXJyYXkoc3RyLnNwbGl0KCcnKS5tYXAoY2hhciA9PiBjaGFyLmNoYXJDb2RlQXQoMCkpKVxuZXhwb3J0IGNvbnN0IGZyb21UeXBlZEFycmF5ID0gYXJyID0+IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYXJyKVxuIl19 \ No newline at end of file diff --git a/dist/compression-worker.js b/dist/compression-worker.js new file mode 100644 index 00000000..5234c9c0 --- /dev/null +++ b/dist/compression-worker.js @@ -0,0 +1,41 @@ +"use strict"; + +var _compression = _interopRequireDefault(require("./compression")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const MESSAGE_INITIALIZE_WORKER = 'start'; +const MESSAGE_INFLATE = 'inflate'; +const MESSAGE_INFLATED_DATA_READY = 'inflated_ready'; +const MESSAGE_DEFLATE = 'deflate'; +const MESSAGE_DEFLATED_DATA_READY = 'deflated_ready'; + +const createMessage = (message, buffer) => ({ + message, + buffer +}); + +const inflatedReady = buffer => self.postMessage(createMessage(MESSAGE_INFLATED_DATA_READY, buffer), [buffer]); + +const deflatedReady = buffer => self.postMessage(createMessage(MESSAGE_DEFLATED_DATA_READY, buffer), [buffer]); + +const compressor = new _compression.default(inflatedReady, deflatedReady); + +self.onmessage = function (e) { + const message = e.data.message; + const buffer = e.data.buffer; + + switch (message) { + case MESSAGE_INITIALIZE_WORKER: + break; + + case MESSAGE_INFLATE: + compressor.inflate(buffer); + break; + + case MESSAGE_DEFLATE: + compressor.deflate(buffer); + break; + } +}; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21wcmVzc2lvbi13b3JrZXIuanMiXSwibmFtZXMiOlsiTUVTU0FHRV9JTklUSUFMSVpFX1dPUktFUiIsIk1FU1NBR0VfSU5GTEFURSIsIk1FU1NBR0VfSU5GTEFURURfREFUQV9SRUFEWSIsIk1FU1NBR0VfREVGTEFURSIsIk1FU1NBR0VfREVGTEFURURfREFUQV9SRUFEWSIsImNyZWF0ZU1lc3NhZ2UiLCJtZXNzYWdlIiwiYnVmZmVyIiwiaW5mbGF0ZWRSZWFkeSIsInNlbGYiLCJwb3N0TWVzc2FnZSIsImRlZmxhdGVkUmVhZHkiLCJjb21wcmVzc29yIiwiQ29tcHJlc3NvciIsIm9ubWVzc2FnZSIsImUiLCJkYXRhIiwiaW5mbGF0ZSIsImRlZmxhdGUiXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7QUFFQSxNQUFNQSx5QkFBeUIsR0FBRyxPQUFsQztBQUNBLE1BQU1DLGVBQWUsR0FBRyxTQUF4QjtBQUNBLE1BQU1DLDJCQUEyQixHQUFHLGdCQUFwQztBQUNBLE1BQU1DLGVBQWUsR0FBRyxTQUF4QjtBQUNBLE1BQU1DLDJCQUEyQixHQUFHLGdCQUFwQzs7QUFFQSxNQUFNQyxhQUFhLEdBQUcsQ0FBQ0MsT0FBRCxFQUFVQyxNQUFWLE1BQXNCO0FBQUVELEVBQUFBLE9BQUY7QUFBV0MsRUFBQUE7QUFBWCxDQUF0QixDQUF0Qjs7QUFFQSxNQUFNQyxhQUFhLEdBQUdELE1BQU0sSUFBSUUsSUFBSSxDQUFDQyxXQUFMLENBQWlCTCxhQUFhLENBQUNILDJCQUFELEVBQThCSyxNQUE5QixDQUE5QixFQUFxRSxDQUFDQSxNQUFELENBQXJFLENBQWhDOztBQUNBLE1BQU1JLGFBQWEsR0FBR0osTUFBTSxJQUFJRSxJQUFJLENBQUNDLFdBQUwsQ0FBaUJMLGFBQWEsQ0FBQ0QsMkJBQUQsRUFBOEJHLE1BQTlCLENBQTlCLEVBQXFFLENBQUNBLE1BQUQsQ0FBckUsQ0FBaEM7O0FBQ0EsTUFBTUssVUFBVSxHQUFHLElBQUlDLG9CQUFKLENBQWVMLGFBQWYsRUFBOEJHLGFBQTlCLENBQW5COztBQUVBRixJQUFJLENBQUNLLFNBQUwsR0FBaUIsVUFBVUMsQ0FBVixFQUFhO0FBQzVCLFFBQU1ULE9BQU8sR0FBR1MsQ0FBQyxDQUFDQyxJQUFGLENBQU9WLE9BQXZCO0FBQ0EsUUFBTUMsTUFBTSxHQUFHUSxDQUFDLENBQUNDLElBQUYsQ0FBT1QsTUFBdEI7O0FBRUEsVUFBUUQsT0FBUjtBQUNFLFNBQUtOLHlCQUFMO0FBQ0U7O0FBRUYsU0FBS0MsZUFBTDtBQUNFVyxNQUFBQSxVQUFVLENBQUNLLE9BQVgsQ0FBbUJWLE1BQW5CO0FBQ0E7O0FBRUYsU0FBS0osZUFBTDtBQUNFUyxNQUFBQSxVQUFVLENBQUNNLE9BQVgsQ0FBbUJYLE1BQW5CO0FBQ0E7QUFWSjtBQVlELENBaEJEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IENvbXByZXNzb3IgZnJvbSAnLi9jb21wcmVzc2lvbidcblxuY29uc3QgTUVTU0FHRV9JTklUSUFMSVpFX1dPUktFUiA9ICdzdGFydCdcbmNvbnN0IE1FU1NBR0VfSU5GTEFURSA9ICdpbmZsYXRlJ1xuY29uc3QgTUVTU0FHRV9JTkZMQVRFRF9EQVRBX1JFQURZID0gJ2luZmxhdGVkX3JlYWR5J1xuY29uc3QgTUVTU0FHRV9ERUZMQVRFID0gJ2RlZmxhdGUnXG5jb25zdCBNRVNTQUdFX0RFRkxBVEVEX0RBVEFfUkVBRFkgPSAnZGVmbGF0ZWRfcmVhZHknXG5cbmNvbnN0IGNyZWF0ZU1lc3NhZ2UgPSAobWVzc2FnZSwgYnVmZmVyKSA9PiAoeyBtZXNzYWdlLCBidWZmZXIgfSlcblxuY29uc3QgaW5mbGF0ZWRSZWFkeSA9IGJ1ZmZlciA9PiBzZWxmLnBvc3RNZXNzYWdlKGNyZWF0ZU1lc3NhZ2UoTUVTU0FHRV9JTkZMQVRFRF9EQVRBX1JFQURZLCBidWZmZXIpLCBbYnVmZmVyXSlcbmNvbnN0IGRlZmxhdGVkUmVhZHkgPSBidWZmZXIgPT4gc2VsZi5wb3N0TWVzc2FnZShjcmVhdGVNZXNzYWdlKE1FU1NBR0VfREVGTEFURURfREFUQV9SRUFEWSwgYnVmZmVyKSwgW2J1ZmZlcl0pXG5jb25zdCBjb21wcmVzc29yID0gbmV3IENvbXByZXNzb3IoaW5mbGF0ZWRSZWFkeSwgZGVmbGF0ZWRSZWFkeSlcblxuc2VsZi5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZSkge1xuICBjb25zdCBtZXNzYWdlID0gZS5kYXRhLm1lc3NhZ2VcbiAgY29uc3QgYnVmZmVyID0gZS5kYXRhLmJ1ZmZlclxuXG4gIHN3aXRjaCAobWVzc2FnZSkge1xuICAgIGNhc2UgTUVTU0FHRV9JTklUSUFMSVpFX1dPUktFUjpcbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlIE1FU1NBR0VfSU5GTEFURTpcbiAgICAgIGNvbXByZXNzb3IuaW5mbGF0ZShidWZmZXIpXG4gICAgICBicmVha1xuXG4gICAgY2FzZSBNRVNTQUdFX0RFRkxBVEU6XG4gICAgICBjb21wcmVzc29yLmRlZmxhdGUoYnVmZmVyKVxuICAgICAgYnJlYWtcbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/dist/compression.js b/dist/compression.js new file mode 100644 index 00000000..f96e1879 --- /dev/null +++ b/dist/compression.js @@ -0,0 +1,140 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = Compressor; + +var _zstream = _interopRequireDefault(require("pako/lib/zlib/zstream")); + +var _deflate = require("pako/lib/zlib/deflate"); + +var _inflate = require("pako/lib/zlib/inflate"); + +var _messages = _interopRequireDefault(require("pako/lib/zlib/messages.js")); + +var _constants = require("pako/lib/zlib/constants"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const CHUNK_SIZE = 16384; +const WINDOW_BITS = 15; +/** + * Handles de-/compression via #inflate() and #deflate(), calls you back via #deflatedReady() and #inflatedReady(). + * The chunk we get from deflater is actually a view of a 16kB arraybuffer, so we need to copy the relevant parts + * memory to a new arraybuffer. + */ + +function Compressor(inflatedReady, deflatedReady) { + this.inflatedReady = inflatedReady; + this.deflatedReady = deflatedReady; + this._inflate = inflater(chunk => this.inflatedReady(chunk.buffer.slice(chunk.byteOffset, chunk.byteOffset + chunk.length))); + this._deflate = deflater(chunk => this.deflatedReady(chunk.buffer.slice(chunk.byteOffset, chunk.byteOffset + chunk.length))); +} + +Compressor.prototype.inflate = function (buffer) { + this._inflate(new Uint8Array(buffer)); +}; + +Compressor.prototype.deflate = function (buffer) { + this._deflate(new Uint8Array(buffer)); +}; + +function deflater(emit) { + const stream = new _zstream.default(); + const status = (0, _deflate.deflateInit2)(stream, _constants.Z_DEFAULT_COMPRESSION, _constants.Z_DEFLATED, WINDOW_BITS, 8, _constants.Z_DEFAULT_STRATEGY); + + if (status !== _constants.Z_OK) { + throw new Error('Problem initializing deflate stream: ' + _messages.default[status]); + } + + return function (data) { + if (data === undefined) return emit(); // Attach the input data + + stream.input = data; + stream.next_in = 0; + stream.avail_in = stream.input.length; + let status; + let output; + let start; + let ret = true; + + do { + // When the stream gets full, we need to create new space. + if (stream.avail_out === 0) { + stream.output = new Uint8Array(CHUNK_SIZE); + start = stream.next_out = 0; + stream.avail_out = CHUNK_SIZE; + } // Perform the deflate + + + status = (0, _deflate.deflate)(stream, _constants.Z_SYNC_FLUSH); + + if (status !== _constants.Z_STREAM_END && status !== _constants.Z_OK) { + throw new Error('Deflate problem: ' + _messages.default[status]); + } // If the output buffer got full, flush the data. + + + if (stream.avail_out === 0 && stream.next_out > start) { + output = stream.output.subarray(start, start = stream.next_out); + ret = emit(output); + } + } while ((stream.avail_in > 0 || stream.avail_out === 0) && status !== _constants.Z_STREAM_END); // Emit whatever is left in output. + + + if (stream.next_out > start) { + output = stream.output.subarray(start, start = stream.next_out); + ret = emit(output); + } + + return ret; + }; +} + +function inflater(emit) { + const stream = new _zstream.default(); + const status = (0, _inflate.inflateInit2)(stream, WINDOW_BITS); + + if (status !== _constants.Z_OK) { + throw new Error('Problem initializing inflate stream: ' + _messages.default[status]); + } + + return function (data) { + if (data === undefined) return emit(); + let start; + stream.input = data; + stream.next_in = 0; + stream.avail_in = stream.input.length; + let status, output; + let ret = true; + + do { + if (stream.avail_out === 0) { + stream.output = new Uint8Array(CHUNK_SIZE); + start = stream.next_out = 0; + stream.avail_out = CHUNK_SIZE; + } + + status = (0, _inflate.inflate)(stream, _constants.Z_NO_FLUSH); + + if (status !== _constants.Z_STREAM_END && status !== _constants.Z_OK) { + throw new Error('inflate problem: ' + _messages.default[status]); + } + + if (stream.next_out) { + if (stream.avail_out === 0 || status === _constants.Z_STREAM_END) { + output = stream.output.subarray(start, start = stream.next_out); + ret = emit(output); + } + } + } while (stream.avail_in > 0 && status !== _constants.Z_STREAM_END); + + if (stream.next_out > start) { + output = stream.output.subarray(start, start = stream.next_out); + ret = emit(output); + } + + return ret; + }; +} +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21wcmVzc2lvbi5qcyJdLCJuYW1lcyI6WyJDSFVOS19TSVpFIiwiV0lORE9XX0JJVFMiLCJDb21wcmVzc29yIiwiaW5mbGF0ZWRSZWFkeSIsImRlZmxhdGVkUmVhZHkiLCJfaW5mbGF0ZSIsImluZmxhdGVyIiwiY2h1bmsiLCJidWZmZXIiLCJzbGljZSIsImJ5dGVPZmZzZXQiLCJsZW5ndGgiLCJfZGVmbGF0ZSIsImRlZmxhdGVyIiwicHJvdG90eXBlIiwiaW5mbGF0ZSIsIlVpbnQ4QXJyYXkiLCJkZWZsYXRlIiwiZW1pdCIsInN0cmVhbSIsIlpTdHJlYW0iLCJzdGF0dXMiLCJaX0RFRkFVTFRfQ09NUFJFU1NJT04iLCJaX0RFRkxBVEVEIiwiWl9ERUZBVUxUX1NUUkFURUdZIiwiWl9PSyIsIkVycm9yIiwibWVzc2FnZXMiLCJkYXRhIiwidW5kZWZpbmVkIiwiaW5wdXQiLCJuZXh0X2luIiwiYXZhaWxfaW4iLCJvdXRwdXQiLCJzdGFydCIsInJldCIsImF2YWlsX291dCIsIm5leHRfb3V0IiwiWl9TWU5DX0ZMVVNIIiwiWl9TVFJFQU1fRU5EIiwic3ViYXJyYXkiLCJaX05PX0ZMVVNIIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFNQSxNQUFNQSxVQUFVLEdBQUcsS0FBbkI7QUFDQSxNQUFNQyxXQUFXLEdBQUcsRUFBcEI7QUFFQTs7Ozs7O0FBS2UsU0FBU0MsVUFBVCxDQUFxQkMsYUFBckIsRUFBb0NDLGFBQXBDLEVBQW1EO0FBQ2hFLE9BQUtELGFBQUwsR0FBcUJBLGFBQXJCO0FBQ0EsT0FBS0MsYUFBTCxHQUFxQkEsYUFBckI7QUFDQSxPQUFLQyxRQUFMLEdBQWdCQyxRQUFRLENBQUNDLEtBQUssSUFBSSxLQUFLSixhQUFMLENBQW1CSSxLQUFLLENBQUNDLE1BQU4sQ0FBYUMsS0FBYixDQUFtQkYsS0FBSyxDQUFDRyxVQUF6QixFQUFxQ0gsS0FBSyxDQUFDRyxVQUFOLEdBQW1CSCxL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OlsiaW1wb3J0IFpTdHJlYW0gZnJvbSAncGFrby9saWIvemxpYi96c3RyZWFtJ1xuaW1wb3J0IHsgZGVmbGF0ZUluaXQyLCBkZWZsYXRlIH0gZnJvbSAncGFrby9saWIvemxpYi9kZWZsYXRlJ1xuaW1wb3J0IHsgaW5mbGF0ZSwgaW5mbGF0ZUluaXQyIH0gZnJvbSAncGFrby9saWIvemxpYi9pbmZsYXRlJ1xuaW1wb3J0IG1lc3NhZ2VzIGZyb20gJ3Bha28vbGliL3psaWIvbWVzc2FnZXMuanMnXG5pbXBvcnQge1xuICBaX05PX0ZMVVNILCBaX1NZTkNfRkxVU0gsIFpfT0ssXG4gIFpfU1RSRUFNX0VORCwgWl9ERUZBVUxUX0NPTVBSRVNTSU9OLFxuICBaX0RFRkFVTFRfU1RSQVRFR1ksIFpfREVGTEFURURcbn0gZnJvbSAncGFrby9saWIvemxpYi9jb25zdGFudHMnXG5cbmNvbnN0IENIVU5LX1NJWkUgPSAxNjM4NFxuY29uc3QgV0lORE9XX0JJVFMgPSAxNVxuXG4vKipcbiAqIEhhbmRsZXMgZGUtL2NvbXByZXNzaW9uIHZpYSAjaW5mbGF0ZSgpIGFuZCAjZGVmbGF0ZSgpLCBjYWxscyB5b3UgYmFjayB2aWEgI2RlZmxhdGVkUmVhZHkoKSBhbmQgI2luZmxhdGVkUmVhZHkoKS5cbiAqIFRoZSBjaHVuayB3ZSBnZXQgZnJvbSBkZWZsYXRlciBpcyBhY3R1YWxseSBhIHZpZXcgb2YgYSAxNmtCIGFycmF5YnVmZmVyLCBzbyB3ZSBuZWVkIHRvIGNvcHkgdGhlIHJlbGV2YW50IHBhcnRzXG4gKiBtZW1vcnkgdG8gYSBuZXcgYXJyYXlidWZmZXIuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENvbXByZXNzb3IgKGluZmxhdGVkUmVhZHksIGRlZmxhdGVkUmVhZHkpIHtcbiAgdGhpcy5pbmZsYXRlZFJlYWR5ID0gaW5mbGF0ZWRSZWFkeVxuICB0aGlzLmRlZmxhdGVkUmVhZHkgPSBkZWZsYXRlZFJlYWR5XG4gIHRoaXMuX2luZmxhdGUgPSBpbmZsYXRlcihjaHVuayA9PiB0aGlzLmluZmxhdGVkUmVhZHkoY2h1bmsuYnVmZmVyLnNsaWNlKGNodW5rLmJ5dGVPZmZzZXQsIGNodW5rLmJ5dGVPZmZzZXQgKyBjaHVuay5sZW5ndGgpKSlcbiAgdGhpcy5fZGVmbGF0ZSA9IGRlZmxhdGVyKGNodW5rID0+IHRoaXMuZGVmbGF0ZWRSZWFkeShjaHVuay5idWZmZXIuc2xpY2UoY2h1bmsuYnl0ZU9mZnNldCwgY2h1bmsuYnl0ZU9mZnNldCArIGNodW5rLmxlbmd0aCkpKVxufVxuXG5Db21wcmVzc29yLnByb3RvdHlwZS5pbmZsYXRlID0gZnVuY3Rpb24gKGJ1ZmZlcikge1xuICB0aGlzLl9pbmZsYXRlKG5ldyBVaW50OEFycmF5KGJ1ZmZlcikpXG59XG5cbkNvbXByZXNzb3IucHJvdG90eXBlLmRlZmxhdGUgPSBmdW5jdGlvbiAoYnVmZmVyKSB7XG4gIHRoaXMuX2RlZmxhdGUobmV3IFVpbnQ4QXJyYXkoYnVmZmVyKSlcbn1cblxuZnVuY3Rpb24gZGVmbGF0ZXIgKGVtaXQpIHtcbiAgY29uc3Qgc3RyZWFtID0gbmV3IFpTdHJlYW0oKVxuICBjb25zdCBzdGF0dXMgPSBkZWZsYXRlSW5pdDIoc3RyZWFtLCBaX0RFRkFVTFRfQ09NUFJFU1NJT04sIFpfREVGTEFURUQsIFdJTkRPV19CSVRTLCA4LCBaX0RFRkFVTFRfU1RSQVRFR1kpXG4gIGlmIChzdGF0dXMgIT09IFpfT0spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb2JsZW0gaW5pdGlhbGl6aW5nIGRlZmxhdGUgc3RyZWFtOiAnICsgbWVzc2FnZXNbc3RhdHVzXSlcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZGF0YSkge1xuICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHJldHVybiBlbWl0KClcblxuICAgIC8vIEF0dGFjaCB0aGUgaW5wdXQgZGF0YVxuICAgIHN0cmVhbS5pbnB1dCA9IGRhdGFcbiAgICBzdHJlYW0ubmV4dF9pbiA9IDBcbiAgICBzdHJlYW0uYXZhaWxfaW4gPSBzdHJlYW0uaW5wdXQubGVuZ3RoXG5cbiAgICBsZXQgc3RhdHVzXG4gICAgbGV0IG91dHB1dFxuICAgIGxldCBzdGFydFxuICAgIGxldCByZXQgPSB0cnVlXG5cbiAgICBkbyB7XG4gICAgICAvLyBXaGVuIHRoZSBzdHJlYW0gZ2V0cyBmdWxsLCB3ZSBuZWVkIHRvIGNyZWF0ZSBuZXcgc3BhY2UuXG4gICAgICBpZiAoc3RyZWFtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICBzdHJlYW0ub3V0cHV0ID0gbmV3IFVpbnQ4QXJyYXkoQ0hVTktfU0laRSlcbiAgICAgICAgc3RhcnQgPSBzdHJlYW0ubmV4dF9vdXQgPSAwXG4gICAgICAgIHN0cmVhbS5hdmFpbF9vdXQgPSBDSFVOS19TSVpFXG4gICAgICB9XG5cbiAgICAgIC8vIFBlcmZvcm0gdGhlIGRlZmxhdGVcbiAgICAgIHN0YXR1cyA9IGRlZmxhdGUoc3RyZWFtLCBaX1NZTkNfRkxVU0gpXG4gICAgICBpZiAoc3RhdHVzICE9PSBaX1NUUkVBTV9FTkQgJiYgc3RhdHVzICE9PSBaX09LKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRGVmbGF0ZSBwcm9ibGVtOiAnICsgbWVzc2FnZXNbc3RhdHVzXSlcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIG91dHB1dCBidWZmZXIgZ290IGZ1bGwsIGZsdXNoIHRoZSBkYXRhLlxuICAgICAgaWYgKHN0cmVhbS5hdmFpbF9vdXQgPT09IDAgJiYgc3RyZWFtLm5leHRfb3V0ID4gc3RhcnQpIHtcbiAgICAgICAgb3V0cHV0ID0gc3RyZWFtLm91dHB1dC5zdWJhcnJheShzdGFydCwgc3RhcnQgPSBzdHJlYW0ubmV4dF9vdXQpXG4gICAgICAgIHJldCA9IGVtaXQob3V0cHV0KVxuICAgICAgfVxuICAgIH0gd2hpbGUgKChzdHJlYW0uYXZhaWxfaW4gPiAwIHx8IHN0cmVhbS5hdmFpbF9vdXQgPT09IDApICYmIHN0YXR1cyAhPT0gWl9TVFJFQU1fRU5EKVxuXG4gICAgLy8gRW1pdCB3aGF0ZXZlciBpcyBsZWZ0IGluIG91dHB1dC5cbiAgICBpZiAoc3RyZWFtLm5leHRfb3V0ID4gc3RhcnQpIHtcbiAgICAgIG91dHB1dCA9IHN0cmVhbS5vdXRwdXQuc3ViYXJyYXkoc3RhcnQsIHN0YXJ0ID0gc3RyZWFtLm5leHRfb3V0KVxuICAgICAgcmV0ID0gZW1pdChvdXRwdXQpXG4gICAgfVxuICAgIHJldHVybiByZXRcbiAgfVxufVxuXG5mdW5jdGlvbiBpbmZsYXRlciAoZW1pdCkge1xuICBjb25zdCBzdHJlYW0gPSBuZXcgWlN0cmVhbSgpXG5cbiAgY29uc3Qgc3RhdHVzID0gaW5mbGF0ZUluaXQyKHN0cmVhbSwgV0lORE9XX0JJVFMpXG4gIGlmIChzdGF0dXMgIT09IFpfT0spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb2JsZW0gaW5pdGlhbGl6aW5nIGluZmxhdGUgc3RyZWFtOiAnICsgbWVzc2FnZXNbc3RhdHVzXSlcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZGF0YSkge1xuICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHJldHVybiBlbWl0KClcblxuICAgIGxldCBzdGFydFxuICAgIHN0cmVhbS5pbnB1dCA9IGRhdGFcbiAgICBzdHJlYW0ubmV4dF9pbiA9IDBcbiAgICBzdHJlYW0uYXZhaWxfaW4gPSBzdHJlYW0uaW5wdXQubGVuZ3RoXG5cbiAgICBsZXQgc3RhdHVzLCBvdXRwdXRcbiAgICBsZXQgcmV0ID0gdHJ1ZVxuXG4gICAgZG8ge1xuICAgICAgaWYgKHN0cmVhbS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgc3RyZWFtLm91dHB1dCA9IG5ldyBVaW50OEFycmF5KENIVU5LX1NJWkUpXG4gICAgICAgIHN0YXJ0ID0gc3RyZWFtLm5leHRfb3V0ID0gMFxuICAgICAgICBzdHJlYW0uYXZhaWxfb3V0ID0gQ0hVTktfU0laRVxuICAgICAgfVxuXG4gICAgICBzdGF0dXMgPSBpbmZsYXRlKHN0cmVhbSwgWl9OT19GTFVTSClcbiAgICAgIGlmIChzdGF0dXMgIT09IFpfU1RSRUFNX0VORCAmJiBzdGF0dXMgIT09IFpfT0spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbmZsYXRlIHByb2JsZW06ICcgKyBtZXNzYWdlc1tzdGF0dXNdKVxuICAgICAgfVxuXG4gICAgICBpZiAoc3RyZWFtLm5leHRfb3V0KSB7XG4gICAgICAgIGlmIChzdHJlYW0uYXZhaWxfb3V0ID09PSAwIHx8IHN0YXR1cyA9PT0gWl9TVFJFQU1fRU5EKSB7XG4gICAgICAgICAgb3V0cHV0ID0gc3RyZWFtLm91dHB1dC5zdWJhcnJheShzdGFydCwgc3RhcnQgPSBzdHJlYW0ubmV4dF9vdXQpXG4gICAgICAgICAgcmV0ID0gZW1pdChvdXRwdXQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IHdoaWxlICgoc3RyZWFtLmF2YWlsX2luID4gMCkgJiYgc3RhdHVzICE9PSBaX1NUUkVBTV9FTkQpXG5cbiAgICBpZiAoc3RyZWFtLm5leHRfb3V0ID4gc3RhcnQpIHtcbiAgICAgIG91dHB1dCA9IHN0cmVhbS5vdXRwdXQuc3ViYXJyYXkoc3RhcnQsIHN0YXJ0ID0gc3RyZWFtLm5leHRfb3V0KVxuICAgICAgcmV0ID0gZW1pdChvdXRwdXQpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJldFxuICB9XG59XG4iXX0= \ No newline at end of file diff --git a/dist/imap-unit.js b/dist/imap-unit.js new file mode 100644 index 00000000..21b91f50 --- /dev/null +++ b/dist/imap-unit.js @@ -0,0 +1,764 @@ +"use strict"; + +var _imap = _interopRequireDefault(require("./imap")); + +var _common = require("./common"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/* eslint-disable no-unused-expressions */ +const host = 'localhost'; +const port = 10000; +describe('browserbox imap unit tests', () => { + var client, socketStub; + /* jshint indent:false */ + + beforeEach(() => { + client = new _imap.default(host, port); + expect(client).to.exist; + client.logger = { + debug: () => {}, + error: () => {} + }; + + var Socket = function () {}; + + Socket.open = () => {}; + + Socket.prototype.close = () => {}; + + Socket.prototype.send = () => {}; + + Socket.prototype.suspend = () => {}; + + Socket.prototype.resume = () => {}; + + Socket.prototype.upgradeToSecure = () => {}; + + socketStub = sinon.createStubInstance(Socket); + sinon.stub(Socket, 'open').withArgs(host, port).returns(socketStub); + var promise = client.connect(Socket).then(() => { + expect(Socket.open.callCount).to.equal(1); + expect(socketStub.onerror).to.exist; + expect(socketStub.onopen).to.exist; + expect(socketStub.onclose).to.exist; + expect(socketStub.ondata).to.exist; + }); + setTimeout(() => socketStub.onopen(), 10); + return promise; + }); + describe.skip('#close', () => { + it('should call socket.close', () => { + client.socket.readyState = 'open'; + setTimeout(() => socketStub.onclose(), 10); + return client.close().then(() => { + expect(socketStub.close.callCount).to.equal(1); + }); + }); + it('should not call socket.close', () => { + client.socket.readyState = 'not open. duh.'; + setTimeout(() => socketStub.onclose(), 10); + return client.close().then(() => { + expect(socketStub.close.called).to.be.false; + }); + }); + }); + describe('#upgrade', () => { + it('should upgrade socket', () => { + client.secureMode = false; + client.upgrade(); + }); + it('should not upgrade socket', () => { + client.secureMode = true; + client.upgrade(); + }); + }); + describe('#setHandler', () => { + it('should set global handler for keyword', () => { + var handler = () => {}; + + client.setHandler('fetch', handler); + expect(client._globalAcceptUntagged.FETCH).to.equal(handler); + }); + }); + describe('#socket.onerror', () => { + it('should emit error and close connection', done => { + client.socket.onerror({ + data: new Error('err') + }); + + client.onerror = () => { + done(); + }; + }); + }); + describe('#socket.onclose', () => { + it('should emit error ', done => { + client.socket.onclose(); + + client.onerror = () => { + done(); + }; + }); + }); + describe('#_onData', () => { + it('should process input', () => { + sinon.stub(client, '_parseIncomingCommands'); + sinon.stub(client, '_iterateIncomingBuffer'); + + client._onData({ + data: (0, _common.toTypedArray)('foobar').buffer + }); + + expect(client._parseIncomingCommands.calledOnce).to.be.true; + expect(client._iterateIncomingBuffer.calledOnce).to.be.true; + }); + }); + describe('rateIncomingBuffer', () => { + it('should iterate chunked input', () => { + appendIncomingBuffer('* 1 FETCH (UID 1)\r\n* 2 FETCH (UID 2)\r\n* 3 FETCH (UID 3)\r\n'); + + var iterator = client._iterateIncomingBuffer(); + + expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 1 FETCH (UID 1)'); + expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 2 FETCH (UID 2)'); + expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 3 FETCH (UID 3)'); + expect(iterator.next().value).to.be.undefined; + }); + it('should process chunked literals', () => { + appendIncomingBuffer('* 1 FETCH (UID {1}\r\n1)\r\n* 2 FETCH (UID {4}\r\n2345)\r\n* 3 FETCH (UID {4}\r\n3789)\r\n'); + + var iterator = client._iterateIncomingBuffer(); + + expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 1 FETCH (UID {1}\r\n1)'); + expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 2 FETCH (UID {4}\r\n2345)'); + expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 3 FETCH (UID {4}\r\n3789)'); + expect(iterator.next().value).to.be.undefined; + }); + it('should process chunked literals 2', () => { + appendIncomingBuffer('* 1 FETCH (UID 1)\r\n* 2 FETCH (UID {4}\r\n2345)\r\n'); + + var iterator = client._iterateIncomingBuffer(); + + expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 1 FETCH (UID 1)'); + expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 2 FETCH (UID {4}\r\n2345)'); + expect(iterator.next().value).to.be.undefined; + }); + it('should process chunked literals 3', () => { + appendIncomingBuffer('* 1 FETCH (UID {1}\r\n1)\r\n* 2 FETCH (UID 4)\r\n'); + + var iterator = client._iterateIncomingBuffer(); + + expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 1 FETCH (UID {1}\r\n1)'); + expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 2 FETCH (UID 4)'); + expect(iterator.next().value).to.be.undefined; + }); + it('should process chunked literals 4', () => { + appendIncomingBuffer('* SEARCH {1}\r\n1 {1}\r\n2\r\n'); + + var iterator = client._iterateIncomingBuffer(); + + expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* SEARCH {1}\r\n1 {1}\r\n2'); + }); + it('should process CRLF literal', () => { + appendIncomingBuffer('* 1 FETCH (UID 20 BODY[HEADER.FIELDS (REFERENCES LIST-ID)] {2}\r\n\r\n)\r\n'); + + var iterator = client._iterateIncomingBuffer(); + + expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 1 FETCH (UID 20 BODY[HEADER.FIELDS (REFERENCES LIST-ID)] {2}\r\n\r\n)'); + }); + it('should process CRLF literal 2', () => { + appendIncomingBuffer('* 1 FETCH (UID 1 ENVELOPE ("string with {parenthesis}") BODY[HEADER.FIELDS (REFERENCES LIST-ID)] {2}\r\n\r\n)\r\n'); + + var iterator = client._iterateIncomingBuffer(); + + expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 1 FETCH (UID 1 ENVELOPE ("string with {parenthesis}") BODY[HEADER.FIELDS (REFERENCES LIST-ID)] {2}\r\n\r\n)'); + }); + it('should parse multiple zero-length literals', () => { + appendIncomingBuffer('* 126015 FETCH (UID 585599 BODY[1.2] {0}\r\n BODY[1.1] {0}\r\n)\r\n'); + + var iterator = client._iterateIncomingBuffer(); + + expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 126015 FETCH (UID 585599 BODY[1.2] {0}\r\n BODY[1.1] {0}\r\n)'); + }); + it('should process two commands when CRLF arrives in 2 parts', () => { + appendIncomingBuffer('* 1 FETCH (UID 1)\r'); + + var iterator1 = client._iterateIncomingBuffer(); + + expect(iterator1.next().value).to.be.undefined; + appendIncomingBuffer('\n* 2 FETCH (UID 2)\r\n'); + + var iterator2 = client._iterateIncomingBuffer(); + + expect(String.fromCharCode.apply(null, iterator2.next().value)).to.equal('* 1 FETCH (UID 1)'); + expect(String.fromCharCode.apply(null, iterator2.next().value)).to.equal('* 2 FETCH (UID 2)'); + expect(iterator2.next().value).to.be.undefined; + }); + it('should process literal when literal count arrives in 2 parts', () => { + appendIncomingBuffer('* 1 FETCH (UID {'); + + var iterator1 = client._iterateIncomingBuffer(); + + expect(iterator1.next().value).to.be.undefined; + appendIncomingBuffer('2}\r\n12)\r\n'); + + var iterator2 = client._iterateIncomingBuffer(); + + expect(String.fromCharCode.apply(null, iterator2.next().value)).to.equal('* 1 FETCH (UID {2}\r\n12)'); + expect(iterator2.next().value).to.be.undefined; + }); + it('should process literal when literal count arrives in 2 parts 2', () => { + appendIncomingBuffer('* 1 FETCH (UID {1'); + + var iterator1 = client._iterateIncomingBuffer(); + + expect(iterator1.next().value).to.be.undefined; + appendIncomingBuffer('0}\r\n0123456789)\r\n'); + + var iterator2 = client._iterateIncomingBuffer(); + + expect(String.fromCharCode.apply(null, iterator2.next().value)).to.equal('* 1 FETCH (UID {10}\r\n0123456789)'); + expect(iterator2.next().value).to.be.undefined; + }); + it('should process literal when literal count arrives in 2 parts 3', () => { + appendIncomingBuffer('* 1 FETCH (UID {'); + + var iterator1 = client._iterateIncomingBuffer(); + + expect(iterator1.next().value).to.be.undefined; + appendIncomingBuffer('10}\r\n1234567890)\r\n'); + + var iterator2 = client._iterateIncomingBuffer(); + + expect(String.fromCharCode.apply(null, iterator2.next().value)).to.equal('* 1 FETCH (UID {10}\r\n1234567890)'); + expect(iterator2.next().value).to.be.undefined; + }); + it('should process literal when literal count arrives in 2 parts 4', () => { + appendIncomingBuffer('* 1 FETCH (UID 1 BODY[HEADER.FIELDS (REFERENCES LIST-ID)] {2}\r'); + + var iterator1 = client._iterateIncomingBuffer(); + + expect(iterator1.next().value).to.be.undefined; + appendIncomingBuffer('\nXX)\r\n'); + + var iterator2 = client._iterateIncomingBuffer(); + + expect(String.fromCharCode.apply(null, iterator2.next().value)).to.equal('* 1 FETCH (UID 1 BODY[HEADER.FIELDS (REFERENCES LIST-ID)] {2}\r\nXX)'); + }); + it('should process literal when literal count arrives in 3 parts', () => { + appendIncomingBuffer('* 1 FETCH (UID {'); + + var iterator1 = client._iterateIncomingBuffer(); + + expect(iterator1.next().value).to.be.undefined; + appendIncomingBuffer('1'); + + var iterator2 = client._iterateIncomingBuffer(); + + expect(iterator2.next().value).to.be.undefined; + appendIncomingBuffer('}\r\n1)\r\n'); + + var iterator3 = client._iterateIncomingBuffer(); + + expect(String.fromCharCode.apply(null, iterator3.next().value)).to.equal('* 1 FETCH (UID {1}\r\n1)'); + expect(iterator3.next().value).to.be.undefined; + }); + it('should process SEARCH response when it arrives in 2 parts', () => { + appendIncomingBuffer('* SEARCH 1 2'); + + var iterator1 = client._iterateIncomingBuffer(); + + expect(iterator1.next().value).to.be.undefined; + appendIncomingBuffer(' 3 4\r\n'); + + var iterator2 = client._iterateIncomingBuffer(); + + expect(String.fromCharCode.apply(null, iterator2.next().value)).to.equal('* SEARCH 1 2 3 4'); + expect(iterator2.next().value).to.be.undefined; + }); + it('should not process {} in string as literal 1', () => { + appendIncomingBuffer('* 1 FETCH (UID 1 ENVELOPE ("string with {parenthesis}"))\r\n'); + + var iterator = client._iterateIncomingBuffer(); + + expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 1 FETCH (UID 1 ENVELOPE ("string with {parenthesis}"))'); + }); + it('should not process {} in string as literal 2', () => { + appendIncomingBuffer('* 1 FETCH (UID 1 ENVELOPE ("string with number in parenthesis {123}"))\r\n'); + + var iterator = client._iterateIncomingBuffer(); + + expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 1 FETCH (UID 1 ENVELOPE ("string with number in parenthesis {123}"))'); + }); + + function appendIncomingBuffer(content) { + client._incomingBuffers.push((0, _common.toTypedArray)(content)); + } + }); + describe('#_parseIncomingCommands', () => { + it('should process a tagged item from the queue', () => { + client.onready = sinon.stub(); + sinon.stub(client, '_handleResponse'); + + function* gen() { + yield (0, _common.toTypedArray)('OK Hello world!'); + } + + client._parseIncomingCommands(gen()); + + expect(client.onready.callCount).to.equal(1); + expect(client._handleResponse.withArgs({ + tag: 'OK', + command: 'Hello', + attributes: [{ + type: 'ATOM', + value: 'world!' + }] + }).calledOnce).to.be.true; + }); + it('should process an untagged item from the queue', () => { + sinon.stub(client, '_handleResponse'); + + function* gen() { + yield (0, _common.toTypedArray)('* 1 EXISTS'); + } + + client._parseIncomingCommands(gen()); + + expect(client._handleResponse.withArgs({ + tag: '*', + command: 'EXISTS', + attributes: [], + nr: 1 + }).calledOnce).to.be.true; + }); + it('should process a plus tagged item from the queue', () => { + sinon.stub(client, 'send'); + + function* gen() { + yield (0, _common.toTypedArray)('+ Please continue'); + } + + client._currentCommand = { + data: ['literal data'] + }; + + client._parseIncomingCommands(gen()); + + expect(client.send.withArgs('literal data\r\n').callCount).to.equal(1); + }); + it('should process an XOAUTH2 error challenge', () => { + sinon.stub(client, 'send'); + + function* gen() { + yield (0, _common.toTypedArray)('+ FOOBAR'); + } + + client._currentCommand = { + data: [], + errorResponseExpectsEmptyLine: true + }; + + client._parseIncomingCommands(gen()); + + expect(client.send.withArgs('\r\n').callCount).to.equal(1); + }); + }); + describe('#_handleResponse', () => { + it('should invoke global handler by default', () => { + sinon.stub(client, '_processResponse'); + sinon.stub(client, '_sendRequest'); + + client._globalAcceptUntagged.TEST = () => {}; + + sinon.stub(client._globalAcceptUntagged, 'TEST'); + client._currentCommand = false; + + client._handleResponse({ + tag: '*', + command: 'test' + }); + + expect(client._sendRequest.callCount).to.equal(1); + expect(client._globalAcceptUntagged.TEST.withArgs({ + tag: '*', + command: 'test' + }).callCount).to.equal(1); + }); + it('should invoke global handler if needed', () => { + sinon.stub(client, '_processResponse'); + + client._globalAcceptUntagged.TEST = () => {}; + + sinon.stub(client._globalAcceptUntagged, 'TEST'); + sinon.stub(client, '_sendRequest'); + client._currentCommand = { + payload: {} + }; + + client._handleResponse({ + tag: '*', + command: 'test' + }); + + expect(client._sendRequest.callCount).to.equal(0); + expect(client._globalAcceptUntagged.TEST.withArgs({ + tag: '*', + command: 'test' + }).callCount).to.equal(1); + }); + it('should push to payload', () => { + sinon.stub(client, '_processResponse'); + + client._globalAcceptUntagged.TEST = () => {}; + + sinon.stub(client._globalAcceptUntagged, 'TEST'); + client._currentCommand = { + payload: { + TEST: [] + } + }; + + client._handleResponse({ + tag: '*', + command: 'test' + }); + + expect(client._globalAcceptUntagged.TEST.callCount).to.equal(0); + expect(client._currentCommand.payload.TEST).to.deep.equal([{ + tag: '*', + command: 'test' + }]); + }); + it('should invoke command callback', () => { + sinon.stub(client, '_processResponse'); + sinon.stub(client, '_sendRequest'); + + client._globalAcceptUntagged.TEST = () => {}; + + sinon.stub(client._globalAcceptUntagged, 'TEST'); + client._currentCommand = { + tag: 'A', + callback: response => { + expect(response).to.deep.equal({ + tag: 'A', + command: 'test', + payload: { + TEST: 'abc' + } + }); + }, + payload: { + TEST: 'abc' + } + }; + + client._handleResponse({ + tag: 'A', + command: 'test' + }); + + expect(client._sendRequest.callCount).to.equal(1); + expect(client._globalAcceptUntagged.TEST.callCount).to.equal(0); + }); + }); + describe('#enqueueCommand', () => { + it('should reject on NO/BAD', () => { + sinon.stub(client, '_sendRequest').callsFake(() => { + client._clientQueue[0].callback({ + command: 'NO' + }); + }); + client._tagCounter = 100; + client._clientQueue = []; + client._canSend = true; + return client.enqueueCommand({ + command: 'abc' + }, ['def'], { + t: 1 + }).catch(err => { + expect(err).to.exist; + }); + }); + it('should invoke sending', () => { + sinon.stub(client, '_sendRequest').callsFake(() => { + client._clientQueue[0].callback({}); + }); + client._tagCounter = 100; + client._clientQueue = []; + client._canSend = true; + return client.enqueueCommand({ + command: 'abc' + }, ['def'], { + t: 1 + }).then(() => { + expect(client._sendRequest.callCount).to.equal(1); + expect(client._clientQueue.length).to.equal(1); + expect(client._clientQueue[0].tag).to.equal('W101'); + expect(client._clientQueue[0].request).to.deep.equal({ + command: 'abc', + tag: 'W101' + }); + expect(client._clientQueue[0].t).to.equal(1); + }); + }); + it('should only queue', () => { + sinon.stub(client, '_sendRequest'); + client._tagCounter = 100; + client._clientQueue = []; + client._canSend = false; + setTimeout(() => { + client._clientQueue[0].callback({}); + }, 0); + return client.enqueueCommand({ + command: 'abc' + }, ['def'], { + t: 1 + }).then(() => { + expect(client._sendRequest.callCount).to.equal(0); + expect(client._clientQueue.length).to.equal(1); + expect(client._clientQueue[0].tag).to.equal('W101'); + }); + }); + it('should store valueAsString option in the command', () => { + sinon.stub(client, '_sendRequest'); + client._tagCounter = 100; + client._clientQueue = []; + client._canSend = false; + setTimeout(() => { + client._clientQueue[0].callback({}); + }, 0); + return client.enqueueCommand({ + command: 'abc', + valueAsString: false + }, ['def'], { + t: 1 + }).then(() => { + expect(client._clientQueue[0].request.valueAsString).to.equal(false); + }); + }); + }); + describe('#_sendRequest', () => { + it('should enter idle if nothing is to process', () => { + sinon.stub(client, '_enterIdle'); + client._clientQueue = []; + + client._sendRequest(); + + expect(client._enterIdle.callCount).to.equal(1); + }); + it('should send data', () => { + sinon.stub(client, '_clearIdle'); + sinon.stub(client, 'send'); + client._clientQueue = [{ + request: { + tag: 'W101', + command: 'TEST' + } + }]; + + client._sendRequest(); + + expect(client._clearIdle.callCount).to.equal(1); + expect(client.send.args[0][0]).to.equal('W101 TEST\r\n'); + }); + it('should send partial data', () => { + sinon.stub(client, '_clearIdle'); + sinon.stub(client, 'send'); + client._clientQueue = [{ + request: { + tag: 'W101', + command: 'TEST', + attributes: [{ + type: 'LITERAL', + value: 'abc' + }] + } + }]; + + client._sendRequest(); + + expect(client._clearIdle.callCount).to.equal(1); + expect(client.send.args[0][0]).to.equal('W101 TEST {3}\r\n'); + expect(client._currentCommand.data).to.deep.equal(['abc']); + }); + it('should run precheck', done => { + sinon.stub(client, '_clearIdle'); + client._canSend = true; + client._clientQueue = [{ + request: { + tag: 'W101', + command: 'TEST', + attributes: [{ + type: 'LITERAL', + value: 'abc' + }] + }, + precheck: ctx => { + expect(ctx).to.exist; + expect(client._canSend).to.be.true; + + client._sendRequest = () => { + expect(client._clientQueue.length).to.equal(2); + expect(client._clientQueue[0].tag).to.include('.p'); + expect(client._clientQueue[0].request.tag).to.include('.p'); + + client._clearIdle.restore(); + + done(); + }; + + client.enqueueCommand({}, undefined, { + ctx: ctx + }); + return Promise.resolve(); + } + }]; + + client._sendRequest(); + }); + }); + describe('#_enterIdle', () => { + it('should set idle timer', done => { + client.onidle = () => { + done(); + }; + + client.timeoutEnterIdle = 1; + + client._enterIdle(); + }); + }); + describe('#_processResponse', () => { + it('should set humanReadable', () => { + var response = { + tag: '*', + command: 'OK', + attributes: [{ + type: 'TEXT', + value: 'Some random text' + }] + }; + + client._processResponse(response); + + expect(response.humanReadable).to.equal('Some random text'); + }); + it('should set response code', () => { + var response = { + tag: '*', + command: 'OK', + attributes: [{ + type: 'ATOM', + section: [{ + type: 'ATOM', + value: 'CAPABILITY' + }, { + type: 'ATOM', + value: 'IMAP4REV1' + }, { + type: 'ATOM', + value: 'UIDPLUS' + }] + }, { + type: 'TEXT', + value: 'Some random text' + }] + }; + + client._processResponse(response); + + expect(response.code).to.equal('CAPABILITY'); + expect(response.capability).to.deep.equal(['IMAP4REV1', 'UIDPLUS']); + }); + }); + describe('#isError', () => { + it('should detect if an object is an error', () => { + expect(client.isError(new RangeError('abc'))).to.be.true; + expect(client.isError('abc')).to.be.false; + }); + }); + describe('#enableCompression', () => { + it('should create inflater and deflater streams', () => { + client.socket.ondata = () => {}; + + sinon.stub(client.socket, 'ondata'); + expect(client.compressed).to.be.false; + client.enableCompression(); + expect(client.compressed).to.be.true; + const payload = 'asdasd'; + const expected = payload.split('').map(char => char.charCodeAt(0)); + client.send(payload); + const actualOut = socketStub.send.args[0][0]; + client.socket.ondata({ + data: actualOut + }); + expect(Buffer.from(client._socketOnData.args[0][0].data)).to.deep.equal(Buffer.from(expected)); + }); + }); + describe('#getPreviouslyQueued', () => { + const ctx = {}; + it('should return undefined with empty queue and no current command', () => { + client._currentCommand = undefined; + client._clientQueue = []; + expect(testAndGetAttribute()).to.be.undefined; + }); + it('should return undefined with empty queue and non-SELECT current command', () => { + client._currentCommand = createCommand('TEST'); + client._clientQueue = []; + expect(testAndGetAttribute()).to.be.undefined; + }); + it('should return current command with empty queue and SELECT current command', () => { + client._currentCommand = createCommand('SELECT', 'ATTR'); + client._clientQueue = []; + expect(testAndGetAttribute()).to.equal('ATTR'); + }); + it('should return current command with non-SELECT commands in queue and SELECT current command', () => { + client._currentCommand = createCommand('SELECT', 'ATTR'); + client._clientQueue = [createCommand('TEST01'), createCommand('TEST02')]; + expect(testAndGetAttribute()).to.equal('ATTR'); + }); + it('should return last SELECT before ctx with multiple SELECT commands in queue (1)', () => { + client._currentCommand = createCommand('SELECT', 'ATTR01'); + client._clientQueue = [createCommand('SELECT', 'ATTR'), createCommand('TEST'), ctx, createCommand('SELECT', 'ATTR03')]; + expect(testAndGetAttribute()).to.equal('ATTR'); + }); + it('should return last SELECT before ctx with multiple SELECT commands in queue (2)', () => { + client._clientQueue = [createCommand('SELECT', 'ATTR02'), createCommand('SELECT', 'ATTR'), ctx, createCommand('SELECT', 'ATTR03')]; + expect(testAndGetAttribute()).to.equal('ATTR'); + }); + it('should return last SELECT before ctx with multiple SELECT commands in queue (3)', () => { + client._clientQueue = [createCommand('SELECT', 'ATTR02'), createCommand('SELECT', 'ATTR'), createCommand('TEST'), ctx, createCommand('SELECT', 'ATTR03')]; + expect(testAndGetAttribute()).to.equal('ATTR'); + }); + + function testAndGetAttribute() { + const data = client.getPreviouslyQueued(['SELECT'], ctx); + + if (data) { + return data.request.attributes[0].value; + } + } + + function createCommand(command, attribute) { + const attributes = []; + const data = { + request: { + command, + attributes + } + }; + + if (attribute) { + data.request.attributes.push({ + type: 'STRING', + value: attribute + }); + } + + return data; + } + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbWFwLXVuaXQuanMiXSwibmFtZXMiOlsiaG9zdCIsInBvcnQiLCJkZXNjcmliZSIsImNsaWVudCIsInNvY2tldFN0dWIiLCJiZWZvcmVFYWNoIiwiSW1hcENsaWVudCIsImV4cGVjdCIsInRvIiwiZXhpc3QiLCJsb2dnZXIiLCJkZWJ1ZyIsImVycm9yIiwiU29ja2V0Iiwib3BlbiIsInByb3RvdHlwZSIsImNsb3NlIiwic2VuZCIsInN1c3BlbmQiLCJyZXN1bWUiLCJ1cGdyYWRlVG9TZWN1cmUiLCJzaW5vbiIsImNyZWF0ZVN0dWJJbnN0YW5jZSIsInN0dWIiLCJ3aXRoQXJncyIsInJldHVybnMiLCJwcm9taXNlIiwiY29ubmVjdCIsInRoZW4iLCJjYWxsQ291bnQiLCJlcXVhbCIsIm9uZXJyb3IiLCJvbm9wZW4iLCJvbmNsb3NlIiwib25kYXRhIiwic2V0VGltZW91dCIsInNraXAiLCJpdCIsInNvY2tldCIsInJlYWR5U3RhdGUiLCJjYWxsZWQiLCJiZSIsImZhbHNlIiwic2VjdXJlTW9kZSIsInVwZ3JhZGUiLCJoYW5kbGVyIiwic2V0SGFuZGxlciIsIl9nbG9iYWxBY2NlcHRVbnRhZ2dlZCIsIkZFVENIIiwiZG9uZSIsImRhdGEiLCJFcnJvciIsIl9vbkRhdGEiLCJidWZmZXIiLCJfcGFyc2VJbmNvbWluZ0NvbW1hbmRzIiwiY2FsbGVkT25jZSIsInRydWUiLCJfaXRlcmF0ZUluY29taW5nQnVmZmVyIiwiYXBwZW5kSW5jb21pbmdCdWZmZXIiLCJpdGVyYXRvciIsIlN0cmluZyIsImZyb21DaGFyQ29kZSIsImFwcGx5IiwibmV4dCIsInZhbHVlIiwidW5kZWZpbmVkIiwiaXRlcmF0b3IxIiwiaXRlcmF0b3IyIiwiaXRlcmF0b3IzIiwiY29udGVudCIsIl9pbmNvbWluZ0J1ZmZlcnMiLCJwdXNoIiwib25yZWFkeSIsImdlbiIsIl9oYW5kbGVSZXNwb25zZSIsInRhZyIsImNvbW1hbmQiLCJhdHRyaWJ1dGVzIiwidHlwZSIsIm5yIiwiX2N1cnJlbnRDb21tYW5kIiwiZXJyb3JSZXNwb25zZUV4cGVjdHNFbXB0eUxpbmUiLCJURVNUIiwiX3NlbmRSZXF1ZXN0IiwicGF5bG9hZCIsImRlZXAiLCJjYWxsYmFjayIsInJlc3BvbnNlIiwiY2FsbHNGYWtlIiwiX2NsaWVudFF1ZXVlIiwiX3RhZ0NvdW50ZXIiLCJfY2FuU2VuZCIsImVucXVldWVDb21tYW5kIiwidCIsImNhdGNoIiwiZXJyIiwibGVuZ3RoIiwicmVxdWVzdCIsInZhbHVlQXNTdHJpbmciLCJfZW50ZXJJZGxlIiwiX2NsZWFySWRsZSIsImFyZ3MiLCJwcmVjaGVjayIsImN0eCIsImluY2x1ZGUiLCJyZXN0b3JlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJvbmlkbGUiLCJ0aW1lb3V0RW50ZXJJZGxlIiwiX3Byb2Nlc3NSZXNwb25zZSIsImh1bWFuUmVhZGFibGUiLCJzZWN0aW9uIiwiY29kZSIsImNhcGFiaWxpdHkiLCJpc0Vycm9yIiwiUmFuZ2VFcnJvciIsImNvbXByZXNzZWQiLCJlbmFibGVDb21wcmVzc2lvbiIsImV4cGVjdGVkIiwic3BsaXQiLCJtYXAiLCJjaGFyIiwiY2hhckNvZGVBdCIsImFjdHVhbE91dCIsIkJ1ZmZlciIsImZyb20iLCJfc29ja2V0T25EYXRhIiwidGVzdEFuZEdldEF0dHJpYnV0ZSIsImNyZWF0ZUNvbW1hbmQiLCJnZXRQcmV2aW91c2x5UXVldWVkIiwiYXR0cmlidXRlIl0sIm1hcHBpbmdzIjoiOztBQUVBOztBQUNBOzs7O0FBSEE7QUFLQSxNQUFNQSxJQUFJLEdBQUcsV0FBYjtBQUNBLE1BQU1DLElBQUksR0FBRyxLQUFiO0FBRUFDLFFBQVEsQ0FBQyw0QkFBRCxFQUErQixNQUFNO0FBQzNDLE1BQUlDLE1BQUosRUFBWUMsVUFBWjtBQUVBOztBQUVBQyxFQUFBQSxVQUFVLENBQUMsTUFBTTtBQUNmRixJQUFBQSxNQUFNLEdBQUcsSUFBSUcsYUFBSixDQUFlTixJQUFmLEVBQXFCQyxJQUFyQixDQUFUO0FBQ0FNLElBQUFBLE1BQU0sQ0FBQ0osTUFBRCxD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LG1CQUFULEdBQWdDO0FBQzlCLFlBQU05RSxJQUFJLEdBQUcvQyxNQUFNLENBQUMrSCxtQkFBUCxDQUEyQixDQUFDLFFBQUQsQ0FBM0IsRUFBdUMzQixHQUF2QyxDQUFiOztBQUNBLFVBQUlyRCxJQUFKLEVBQVU7QUFDUixlQUFPQSxJQUFJLENBQUMrQyxPQUFMLENBQWFwQixVQUFiLENBQXdCLENBQXhCLEVBQTJCYixLQUFsQztBQUNEO0FBQ0Y7O0FBRUQsYUFBU2lFLGFBQVQsQ0FBd0JyRCxPQUF4QixFQUFpQ3VELFNBQWpDLEVBQTRDO0FBQzFDLFlBQU10RCxVQUFVLEdBQUcsRUFBbkI7QUFDQSxZQUFNM0IsSUFBSSxHQUFHO0FBQ1grQyxRQUFBQSxPQUFPLEVBQUU7QUFBRXJCLFVBQUFBLE9BQUY7QUFBV0MsVUFBQUE7QUFBWDtBQURFLE9BQWI7O0FBSUEsVUFBSXNELFNBQUosRUFBZTtBQUNiakYsUUFBQUEsSUFBSSxDQUFDK0MsT0FBTCxDQUFhcEIsVUFBYixDQUF3Qk4sSUFBeEIsQ0FBNkI7QUFDM0JPLFVBQUFBLElBQUksRUFBRSxRQURxQjtBQUUzQmQsVUFBQUEsS0FBSyxFQUFFbUU7QUFGb0IsU0FBN0I7QUFJRDs7QUFFRCxhQUFPakYsSUFBUDtBQUNEO0FBQ0YsR0EzRk8sQ0FBUjtBQTRGRCxDQWh3Qk8sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC1leHByZXNzaW9ucyAqL1xuXG5pbXBvcnQgSW1hcENsaWVudCBmcm9tICcuL2ltYXAnXG5pbXBvcnQgeyB0b1R5cGVkQXJyYXkgfSBmcm9tICcuL2NvbW1vbidcblxuY29uc3QgaG9zdCA9ICdsb2NhbGhvc3QnXG5jb25zdCBwb3J0ID0gMTAwMDBcblxuZGVzY3JpYmUoJ2Jyb3dzZXJib3ggaW1hcCB1bml0IHRlc3RzJywgKCkgPT4ge1xuICB2YXIgY2xpZW50LCBzb2NrZXRTdHViXG5cbiAgLyoganNoaW50IGluZGVudDpmYWxzZSAqL1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGNsaWVudCA9IG5ldyBJbWFwQ2xpZW50KGhvc3QsIHBvcnQpXG4gICAgZXhwZWN0KGNsaWVudCkudG8uZXhpc3RcblxuICAgIGNsaWVudC5sb2dnZXIgPSB7XG4gICAgICBkZWJ1ZzogKCkgPT4geyB9LFxuICAgICAgZXJyb3I6ICgpID0+IHsgfVxuICAgIH1cblxuICAgIHZhciBTb2NrZXQgPSBmdW5jdGlvbiAoKSB7IH1cbiAgICBTb2NrZXQub3BlbiA9ICgpID0+IHsgfVxuICAgIFNvY2tldC5wcm90b3R5cGUuY2xvc2UgPSAoKSA9PiB7IH1cbiAgICBTb2NrZXQucHJvdG90eXBlLnNlbmQgPSAoKSA9PiB7IH1cbiAgICBTb2NrZXQucHJvdG90eXBlLnN1c3BlbmQgPSAoKSA9PiB7IH1cbiAgICBTb2NrZXQucHJvdG90eXBlLnJlc3VtZSA9ICgpID0+IHsgfVxuICAgIFNvY2tldC5wcm90b3R5cGUudXBncmFkZVRvU2VjdXJlID0gKCkgPT4geyB9XG5cbiAgICBzb2NrZXRTdHViID0gc2lub24uY3JlYXRlU3R1Ykluc3RhbmNlKFNvY2tldClcbiAgICBzaW5vbi5zdHViKFNvY2tldCwgJ29wZW4nKS53aXRoQXJncyhob3N0LCBwb3J0KS5yZXR1cm5zKHNvY2tldFN0dWIpXG5cbiAgICB2YXIgcHJvbWlzZSA9IGNsaWVudC5jb25uZWN0KFNvY2tldCkudGhlbigoKSA9PiB7XG4gICAgICBleHBlY3QoU29ja2V0Lm9wZW4uY2FsbENvdW50KS50by5lcXVhbCgxKVxuXG4gICAgICBleHBlY3Qoc29ja2V0U3R1Yi5vbmVycm9yKS50by5leGlzdFxuICAgICAgZXhwZWN0KHNvY2tldFN0dWIub25vcGVuKS50by5leGlzdFxuICAgICAgZXhwZWN0KHNvY2tldFN0dWIub25jbG9zZSkudG8uZXhpc3RcbiAgICAgIGV4cGVjdChzb2NrZXRTdHViLm9uZGF0YSkudG8uZXhpc3RcbiAgICB9KVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiBzb2NrZXRTdHViLm9ub3BlbigpLCAxMClcblxuICAgIHJldHVybiBwcm9taXNlXG4gIH0pXG5cbiAgZGVzY3JpYmUuc2tpcCgnI2Nsb3NlJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgY2FsbCBzb2NrZXQuY2xvc2UnLCAoKSA9PiB7XG4gICAgICBjbGllbnQuc29ja2V0LnJlYWR5U3RhdGUgPSAnb3BlbidcblxuICAgICAgc2V0VGltZW91dCgoKSA9PiBzb2NrZXRTdHViLm9uY2xvc2UoKSwgMTApXG4gICAgICByZXR1cm4gY2xpZW50LmNsb3NlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChzb2NrZXRTdHViLmNsb3NlLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgbm90IGNhbGwgc29ja2V0LmNsb3NlJywgKCkgPT4ge1xuICAgICAgY2xpZW50LnNvY2tldC5yZWFkeVN0YXRlID0gJ25vdCBvcGVuLiBkdWguJ1xuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHNvY2tldFN0dWIub25jbG9zZSgpLCAxMClcbiAgICAgIHJldHVybiBjbGllbnQuY2xvc2UoKS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KHNvY2tldFN0dWIuY2xvc2UuY2FsbGVkKS50by5iZS5mYWxzZVxuICAgICAgfSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCcjdXBncmFkZScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHVwZ3JhZGUgc29ja2V0JywgKCkgPT4ge1xuICAgICAgY2xpZW50LnNlY3VyZU1vZGUgPSBmYWxzZVxuICAgICAgY2xpZW50LnVwZ3JhZGUoKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIG5vdCB1cGdyYWRlIHNvY2tldCcsICgpID0+IHtcbiAgICAgIGNsaWVudC5zZWN1cmVNb2RlID0gdHJ1ZVxuICAgICAgY2xpZW50LnVwZ3JhZGUoKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJyNzZXRIYW5kbGVyJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgc2V0IGdsb2JhbCBoYW5kbGVyIGZvciBrZXl3b3JkJywgKCkgPT4ge1xuICAgICAgdmFyIGhhbmRsZXIgPSAoKSA9PiB7IH1cbiAgICAgIGNsaWVudC5zZXRIYW5kbGVyKCdmZXRjaCcsIGhhbmRsZXIpXG5cbiAgICAgIGV4cGVjdChjbGllbnQuX2dsb2JhbEFjY2VwdFVudGFnZ2VkLkZFVENIKS50by5lcXVhbChoYW5kbGVyKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJyNzb2NrZXQub25lcnJvcicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGVtaXQgZXJyb3IgYW5kIGNsb3NlIGNvbm5lY3Rpb24nLCAoZG9uZSkgPT4ge1xuICAgICAgY2xpZW50LnNvY2tldC5vbmVycm9yKHtcbiAgICAgICAgZGF0YTogbmV3IEVycm9yKCdlcnInKVxuICAgICAgfSlcblxuICAgICAgY2xpZW50Lm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgIGRvbmUoKVxuICAgICAgfVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJyNzb2NrZXQub25jbG9zZScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGVtaXQgZXJyb3IgJywgKGRvbmUpID0+IHtcbiAgICAgIGNsaWVudC5zb2NrZXQub25jbG9zZSgpXG5cbiAgICAgIGNsaWVudC5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICBkb25lKClcbiAgICAgIH1cbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCcjX29uRGF0YScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHByb2Nlc3MgaW5wdXQnLCAoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGNsaWVudCwgJ19wYXJzZUluY29taW5nQ29tbWFuZHMnKVxuICAgICAgc2lub24uc3R1YihjbGllbnQsICdfaXRlcmF0ZUluY29taW5nQnVmZmVyJylcblxuICAgICAgY2xpZW50Ll9vbkRhdGEoe1xuICAgICAgICBkYXRhOiB0b1R5cGVkQXJyYXkoJ2Zvb2JhcicpLmJ1ZmZlclxuICAgICAgfSlcblxuICAgICAgZXhwZWN0KGNsaWVudC5fcGFyc2VJbmNvbWluZ0NvbW1hbmRzLmNhbGxlZE9uY2UpLnRvLmJlLnRydWVcbiAgICAgIGV4cGVjdChjbGllbnQuX2l0ZXJhdGVJbmNvbWluZ0J1ZmZlci5jYWxsZWRPbmNlKS50by5iZS50cnVlXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgncmF0ZUluY29taW5nQnVmZmVyJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgaXRlcmF0ZSBjaHVua2VkIGlucHV0JywgKCkgPT4ge1xuICAgICAgYXBwZW5kSW5jb21pbmdCdWZmZXIoJyogMSBGRVRDSCAoVUlEIDEpXFxyXFxuKiAyIEZFVENIIChVSUQgMilcXHJcXG4qIDMgRkVUQ0ggKFVJRCAzKVxcclxcbicpXG4gICAgICB2YXIgaXRlcmF0b3IgPSBjbGllbnQuX2l0ZXJhdGVJbmNvbWluZ0J1ZmZlcigpXG5cbiAgICAgIGV4cGVjdChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGl0ZXJhdG9yLm5leHQoKS52YWx1ZSkpLnRvLmVxdWFsKCcqIDEgRkVUQ0ggKFVJRCAxKScpXG4gICAgICBleHBlY3QoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBpdGVyYXRvci5uZXh0KCkudmFsdWUpKS50by5lcXVhbCgnKiAyIEZFVENIIChVSUQgMiknKVxuICAgICAgZXhwZWN0KFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgaXRlcmF0b3IubmV4dCgpLnZhbHVlKSkudG8uZXF1YWwoJyogMyBGRVRDSCAoVUlEIDMpJylcbiAgICAgIGV4cGVjdChpdGVyYXRvci5uZXh0KCkudmFsdWUpLnRvLmJlLnVuZGVmaW5lZFxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHByb2Nlc3MgY2h1bmtlZCBsaXRlcmFscycsICgpID0+IHtcbiAgICAgIGFwcGVuZEluY29taW5nQnVmZmVyKCcqIDEgRkVUQ0ggKFVJRCB7MX1cXHJcXG4xKVxcclxcbiogMiBGRVRDSCAoVUlEIHs0fVxcclxcbjIzNDUpXFxyXFxuKiAzIEZFVENIIChVSUQgezR9XFxyXFxuMzc4OSlcXHJcXG4nKVxuICAgICAgdmFyIGl0ZXJhdG9yID0gY2xpZW50Ll9pdGVyYXRlSW5jb21pbmdCdWZmZXIoKVxuXG4gICAgICBleHBlY3QoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBpdGVyYXRvci5uZXh0KCkudmFsdWUpKS50by5lcXVhbCgnKiAxIEZFVENIIChVSUQgezF9XFxyXFxuMSknKVxuICAgICAgZXhwZWN0KFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgaXRlcmF0b3IubmV4dCgpLnZhbHVlKSkudG8uZXF1YWwoJyogMiBGRVRDSCAoVUlEIHs0fVxcclxcbjIzNDUpJylcbiAgICAgIGV4cGVjdChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGl0ZXJhdG9yLm5leHQoKS52YWx1ZSkpLnRvLmVxdWFsKCcqIDMgRkVUQ0ggKFVJRCB7NH1cXHJcXG4zNzg5KScpXG4gICAgICBleHBlY3QoaXRlcmF0b3IubmV4dCgpLnZhbHVlKS50by5iZS51bmRlZmluZWRcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBwcm9jZXNzIGNodW5rZWQgbGl0ZXJhbHMgMicsICgpID0+IHtcbiAgICAgIGFwcGVuZEluY29taW5nQnVmZmVyKCcqIDEgRkVUQ0ggKFVJRCAxKVxcclxcbiogMiBGRVRDSCAoVUlEIHs0fVxcclxcbjIzNDUpXFxyXFxuJylcbiAgICAgIHZhciBpdGVyYXRvciA9IGNsaWVudC5faXRlcmF0ZUluY29taW5nQnVmZmVyKClcblxuICAgICAgZXhwZWN0KFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgaXRlcmF0b3IubmV4dCgpLnZhbHVlKSkudG8uZXF1YWwoJyogMSBGRVRDSCAoVUlEIDEpJylcbiAgICAgIGV4cGVjdChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGl0ZXJhdG9yLm5leHQoKS52YWx1ZSkpLnRvLmVxdWFsKCcqIDIgRkVUQ0ggKFVJRCB7NH1cXHJcXG4yMzQ1KScpXG4gICAgICBleHBlY3QoaXRlcmF0b3IubmV4dCgpLnZhbHVlKS50by5iZS51bmRlZmluZWRcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBwcm9jZXNzIGNodW5rZWQgbGl0ZXJhbHMgMycsICgpID0+IHtcbiAgICAgIGFwcGVuZEluY29taW5nQnVmZmVyKCcqIDEgRkVUQ0ggKFVJRCB7MX1cXHJcXG4xKVxcclxcbiogMiBGRVRDSCAoVUlEIDQpXFxyXFxuJylcbiAgICAgIHZhciBpdGVyYXRvciA9IGNsaWVudC5faXRlcmF0ZUluY29taW5nQnVmZmVyKClcblxuICAgICAgZXhwZWN0KFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgaXRlcmF0b3IubmV4dCgpLnZhbHVlKSkudG8uZXF1YWwoJyogMSBGRVRDSCAoVUlEIHsxfVxcclxcbjEpJylcbiAgICAgIGV4cGVjdChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGl0ZXJhdG9yLm5leHQoKS52YWx1ZSkpLnRvLmVxdWFsKCcqIDIgRkVUQ0ggKFVJRCA0KScpXG4gICAgICBleHBlY3QoaXRlcmF0b3IubmV4dCgpLnZhbHVlKS50by5iZS51bmRlZmluZWRcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBwcm9jZXNzIGNodW5rZWQgbGl0ZXJhbHMgNCcsICgpID0+IHtcbiAgICAgIGFwcGVuZEluY29taW5nQnVmZmVyKCcqIFNFQVJDSCB7MX1cXHJcXG4xIHsxfVxcclxcbjJcXHJcXG4nKVxuICAgICAgdmFyIGl0ZXJhdG9yID0gY2xpZW50Ll9pdGVyYXRlSW5jb21pbmdCdWZmZXIoKVxuICAgICAgZXhwZWN0KFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgaXRlcmF0b3IubmV4dCgpLnZhbHVlKSkudG8uZXF1YWwoJyogU0VBUkNIIHsxfVxcclxcbjEgezF9XFxyXFxuMicpXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgcHJvY2VzcyBDUkxGIGxpdGVyYWwnLCAoKSA9PiB7XG4gICAgICBhcHBlbmRJbmNvbWluZ0J1ZmZlcignKiAxIEZFVENIIChVSUQgMjAgQk9EWVtIRUFERVIuRklFTERTIChSRUZFUkVOQ0VTIExJU1QtSUQpXSB7Mn1cXHJcXG5cXHJcXG4pXFxyXFxuJylcbiAgICAgIHZhciBpdGVyYXRvciA9IGNsaWVudC5faXRlcmF0ZUluY29taW5nQnVmZmVyKClcbiAgICAgIGV4cGVjdChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGl0ZXJhdG9yLm5leHQoKS52YWx1ZSkpLnRvLmVxdWFsKCcqIDEgRkVUQ0ggKFVJRCAyMCBCT0RZW0hFQURFUi5GSUVMRFMgKFJFRkVSRU5DRVMgTElTVC1JRCldIHsyfVxcclxcblxcclxcbiknKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHByb2Nlc3MgQ1JMRiBsaXRlcmFsIDInLCAoKSA9PiB7XG4gICAgICBhcHBlbmRJbmNvbWluZ0J1ZmZlcignKiAxIEZFVENIIChVSUQgMSBFTlZFTE9QRSAoXCJzdHJpbmcgd2l0aCB7cGFyZW50aGVzaXN9XCIpIEJPRFlbSEVBREVSLkZJRUxEUyAoUkVGRVJFTkNFUyBMSVNULUlEKV0gezJ9XFxyXFxuXFxyXFxuKVxcclxcbicpXG4gICAgICB2YXIgaXRlcmF0b3IgPSBjbGllbnQuX2l0ZXJhdGVJbmNvbWluZ0J1ZmZlcigpXG4gICAgICBleHBlY3QoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBpdGVyYXRvci5uZXh0KCkudmFsdWUpKS50by5lcXVhbCgnKiAxIEZFVENIIChVSUQgMSBFTlZFTE9QRSAoXCJzdHJpbmcgd2l0aCB7cGFyZW50aGVzaXN9XCIpIEJPRFlbSEVBREVSLkZJRUxEUyAoUkVGRVJFTkNFUyBMSVNULUlEKV0gezJ9XFxyXFxuXFxyXFxuKScpXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgcGFyc2UgbXVsdGlwbGUgemVyby1sZW5ndGggbGl0ZXJhbHMnLCAoKSA9PiB7XG4gICAgICBhcHBlbmRJbmNvbWluZ0J1ZmZlcignKiAxMjYwMTUgRkVUQ0ggKFVJRCA1ODU1OTkgQk9EWVsxLjJdIHswfVxcclxcbiBCT0RZWzEuMV0gezB9XFxyXFxuKVxcclxcbicpXG4gICAgICB2YXIgaXRlcmF0b3IgPSBjbGllbnQuX2l0ZXJhdGVJbmNvbWluZ0J1ZmZlcigpXG4gICAgICBleHBlY3QoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBpdGVyYXRvci5uZXh0KCkudmFsdWUpKS50by5lcXVhbCgnKiAxMjYwMTUgRkVUQ0ggKFVJRCA1ODU1OTkgQk9EWVsxLjJdIHswfVxcclxcbiBCT0RZWzEuMV0gezB9XFxyXFxuKScpXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgcHJvY2VzcyB0d28gY29tbWFuZHMgd2hlbiBDUkxGIGFycml2ZXMgaW4gMiBwYXJ0cycsICgpID0+IHtcbiAgICAgIGFwcGVuZEluY29taW5nQnVmZmVyKCcqIDEgRkVUQ0ggKFVJRCAxKVxccicpXG4gICAgICB2YXIgaXRlcmF0b3IxID0gY2xpZW50Ll9pdGVyYXRlSW5jb21pbmdCdWZmZXIoKVxuICAgICAgZXhwZWN0KGl0ZXJhdG9yMS5uZXh0KCkudmFsdWUpLnRvLmJlLnVuZGVmaW5lZFxuXG4gICAgICBhcHBlbmRJbmNvbWluZ0J1ZmZlcignXFxuKiAyIEZFVENIIChVSUQgMilcXHJcXG4nKVxuICAgICAgdmFyIGl0ZXJhdG9yMiA9IGNsaWVudC5faXRlcmF0ZUluY29taW5nQnVmZmVyKClcbiAgICAgIGV4cGVjdChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGl0ZXJhdG9yMi5uZXh0KCkudmFsdWUpKS50by5lcXVhbCgnKiAxIEZFVENIIChVSUQgMSknKVxuICAgICAgZXhwZWN0KFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgaXRlcmF0b3IyLm5leHQoKS52YWx1ZSkpLnRvLmVxdWFsKCcqIDIgRkVUQ0ggKFVJRCAyKScpXG4gICAgICBleHBlY3QoaXRlcmF0b3IyLm5leHQoKS52YWx1ZSkudG8uYmUudW5kZWZpbmVkXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgcHJvY2VzcyBsaXRlcmFsIHdoZW4gbGl0ZXJhbCBjb3VudCBhcnJpdmVzIGluIDIgcGFydHMnLCAoKSA9PiB7XG4gICAgICBhcHBlbmRJbmNvbWluZ0J1ZmZlcignKiAxIEZFVENIIChVSUQgeycpXG4gICAgICB2YXIgaXRlcmF0b3IxID0gY2xpZW50Ll9pdGVyYXRlSW5jb21pbmdCdWZmZXIoKVxuICAgICAgZXhwZWN0KGl0ZXJhdG9yMS5uZXh0KCkudmFsdWUpLnRvLmJlLnVuZGVmaW5lZFxuXG4gICAgICBhcHBlbmRJbmNvbWluZ0J1ZmZlcignMn1cXHJcXG4xMilcXHJcXG4nKVxuICAgICAgdmFyIGl0ZXJhdG9yMiA9IGNsaWVudC5faXRlcmF0ZUluY29taW5nQnVmZmVyKClcbiAgICAgIGV4cGVjdChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGl0ZXJhdG9yMi5uZXh0KCkudmFsdWUpKS50by5lcXVhbCgnKiAxIEZFVENIIChVSUQgezJ9XFxyXFxuMTIpJylcbiAgICAgIGV4cGVjdChpdGVyYXRvcjIubmV4dCgpLnZhbHVlKS50by5iZS51bmRlZmluZWRcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBwcm9jZXNzIGxpdGVyYWwgd2hlbiBsaXRlcmFsIGNvdW50IGFycml2ZXMgaW4gMiBwYXJ0cyAyJywgKCkgPT4ge1xuICAgICAgYXBwZW5kSW5jb21pbmdCdWZmZXIoJyogMSBGRVRDSCAoVUlEIHsxJylcbiAgICAgIHZhciBpdGVyYXRvcjEgPSBjbGllbnQuX2l0ZXJhdGVJbmNvbWluZ0J1ZmZlcigpXG4gICAgICBleHBlY3QoaXRlcmF0b3IxLm5leHQoKS52YWx1ZSkudG8uYmUudW5kZWZpbmVkXG5cbiAgICAgIGFwcGVuZEluY29taW5nQnVmZmVyKCcwfVxcclxcbjAxMjM0NTY3ODkpXFxyXFxuJylcbiAgICAgIHZhciBpdGVyYXRvcjIgPSBjbGllbnQuX2l0ZXJhdGVJbmNvbWluZ0J1ZmZlcigpXG4gICAgICBleHBlY3QoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBpdGVyYXRvcjIubmV4dCgpLnZhbHVlKSkudG8uZXF1YWwoJyogMSBGRVRDSCAoVUlEIHsxMH1cXHJcXG4wMTIzNDU2Nzg5KScpXG4gICAgICBleHBlY3QoaXRlcmF0b3IyLm5leHQoKS52YWx1ZSkudG8uYmUudW5kZWZpbmVkXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgcHJvY2VzcyBsaXRlcmFsIHdoZW4gbGl0ZXJhbCBjb3VudCBhcnJpdmVzIGluIDIgcGFydHMgMycsICgpID0+IHtcbiAgICAgIGFwcGVuZEluY29taW5nQnVmZmVyKCcqIDEgRkVUQ0ggKFVJRCB7JylcbiAgICAgIHZhciBpdGVyYXRvcjEgPSBjbGllbnQuX2l0ZXJhdGVJbmNvbWluZ0J1ZmZlcigpXG4gICAgICBleHBlY3QoaXRlcmF0b3IxLm5leHQoKS52YWx1ZSkudG8uYmUudW5kZWZpbmVkXG5cbiAgICAgIGFwcGVuZEluY29taW5nQnVmZmVyKCcxMH1cXHJcXG4xMjM0NTY3ODkwKVxcclxcbicpXG4gICAgICB2YXIgaXRlcmF0b3IyID0gY2xpZW50Ll9pdGVyYXRlSW5jb21pbmdCdWZmZXIoKVxuICAgICAgZXhwZWN0KFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgaXRlcmF0b3IyLm5leHQoKS52YWx1ZSkpLnRvLmVxdWFsKCcqIDEgRkVUQ0ggKFVJRCB7MTB9XFxyXFxuMTIzNDU2Nzg5MCknKVxuICAgICAgZXhwZWN0KGl0ZXJhdG9yMi5uZXh0KCkudmFsdWUpLnRvLmJlLnVuZGVmaW5lZFxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHByb2Nlc3MgbGl0ZXJhbCB3aGVuIGxpdGVyYWwgY291bnQgYXJyaXZlcyBpbiAyIHBhcnRzIDQnLCAoKSA9PiB7XG4gICAgICBhcHBlbmRJbmNvbWluZ0J1ZmZlcignKiAxIEZFVENIIChVSUQgMSBCT0RZW0hFQURFUi5GSUVMRFMgKFJFRkVSRU5DRVMgTElTVC1JRCldIHsyfVxccicpXG4gICAgICB2YXIgaXRlcmF0b3IxID0gY2xpZW50Ll9pdGVyYXRlSW5jb21pbmdCdWZmZXIoKVxuICAgICAgZXhwZWN0KGl0ZXJhdG9yMS5uZXh0KCkudmFsdWUpLnRvLmJlLnVuZGVmaW5lZFxuICAgICAgYXBwZW5kSW5jb21pbmdCdWZmZXIoJ1xcblhYKVxcclxcbicpXG4gICAgICB2YXIgaXRlcmF0b3IyID0gY2xpZW50Ll9pdGVyYXRlSW5jb21pbmdCdWZmZXIoKVxuICAgICAgZXhwZWN0KFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgaXRlcmF0b3IyLm5leHQoKS52YWx1ZSkpLnRvLmVxdWFsKCcqIDEgRkVUQ0ggKFVJRCAxIEJPRFlbSEVBREVSLkZJRUxEUyAoUkVGRVJFTkNFUyBMSVNULUlEKV0gezJ9XFxyXFxuWFgpJylcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBwcm9jZXNzIGxpdGVyYWwgd2hlbiBsaXRlcmFsIGNvdW50IGFycml2ZXMgaW4gMyBwYXJ0cycsICgpID0+IHtcbiAgICAgIGFwcGVuZEluY29taW5nQnVmZmVyKCcqIDEgRkVUQ0ggKFVJRCB7JylcbiAgICAgIHZhciBpdGVyYXRvcjEgPSBjbGllbnQuX2l0ZXJhdGVJbmNvbWluZ0J1ZmZlcigpXG4gICAgICBleHBlY3QoaXRlcmF0b3IxLm5leHQoKS52YWx1ZSkudG8uYmUudW5kZWZpbmVkXG5cbiAgICAgIGFwcGVuZEluY29taW5nQnVmZmVyKCcxJylcbiAgICAgIHZhciBpdGVyYXRvcjIgPSBjbGllbnQuX2l0ZXJhdGVJbmNvbWluZ0J1ZmZlcigpXG4gICAgICBleHBlY3QoaXRlcmF0b3IyLm5leHQoKS52YWx1ZSkudG8uYmUudW5kZWZpbmVkXG5cbiAgICAgIGFwcGVuZEluY29taW5nQnVmZmVyKCd9XFxyXFxuMSlcXHJcXG4nKVxuICAgICAgdmFyIGl0ZXJhdG9yMyA9IGNsaWVudC5faXRlcmF0ZUluY29taW5nQnVmZmVyKClcbiAgICAgIGV4cGVjdChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGl0ZXJhdG9yMy5uZXh0KCkudmFsdWUpKS50by5lcXVhbCgnKiAxIEZFVENIIChVSUQgezF9XFxyXFxuMSknKVxuICAgICAgZXhwZWN0KGl0ZXJhdG9yMy5uZXh0KCkudmFsdWUpLnRvLmJlLnVuZGVmaW5lZFxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHByb2Nlc3MgU0VBUkNIIHJlc3BvbnNlIHdoZW4gaXQgYXJyaXZlcyBpbiAyIHBhcnRzJywgKCkgPT4ge1xuICAgICAgYXBwZW5kSW5jb21pbmdCdWZmZXIoJyogU0VBUkNIIDEgMicpXG4gICAgICB2YXIgaXRlcmF0b3IxID0gY2xpZW50Ll9pdGVyYXRlSW5jb21pbmdCdWZmZXIoKVxuICAgICAgZXhwZWN0KGl0ZXJhdG9yMS5uZXh0KCkudmFsdWUpLnRvLmJlLnVuZGVmaW5lZFxuXG4gICAgICBhcHBlbmRJbmNvbWluZ0J1ZmZlcignIDMgNFxcclxcbicpXG4gICAgICB2YXIgaXRlcmF0b3IyID0gY2xpZW50Ll9pdGVyYXRlSW5jb21pbmdCdWZmZXIoKVxuICAgICAgZXhwZWN0KFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgaXRlcmF0b3IyLm5leHQoKS52YWx1ZSkpLnRvLmVxdWFsKCcqIFNFQVJDSCAxIDIgMyA0JylcbiAgICAgIGV4cGVjdChpdGVyYXRvcjIubmV4dCgpLnZhbHVlKS50by5iZS51bmRlZmluZWRcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBub3QgcHJvY2VzcyB7fSBpbiBzdHJpbmcgYXMgbGl0ZXJhbCAxJywgKCkgPT4ge1xuICAgICAgYXBwZW5kSW5jb21pbmdCdWZmZXIoJyogMSBGRVRDSCAoVUlEIDEgRU5WRUxPUEUgKFwic3RyaW5nIHdpdGgge3BhcmVudGhlc2lzfVwiKSlcXHJcXG4nKVxuICAgICAgdmFyIGl0ZXJhdG9yID0gY2xpZW50Ll9pdGVyYXRlSW5jb21pbmdCdWZmZXIoKVxuICAgICAgZXhwZWN0KFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgaXRlcmF0b3IubmV4dCgpLnZhbHVlKSkudG8uZXF1YWwoJyogMSBGRVRDSCAoVUlEIDEgRU5WRUxPUEUgKFwic3RyaW5nIHdpdGgge3BhcmVudGhlc2lzfVwiKSknKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIG5vdCBwcm9jZXNzIHt9IGluIHN0cmluZyBhcyBsaXRlcmFsIDInLCAoKSA9PiB7XG4gICAgICBhcHBlbmRJbmNvbWluZ0J1ZmZlcignKiAxIEZFVENIIChVSUQgMSBFTlZFTE9QRSAoXCJzdHJpbmcgd2l0aCBudW1iZXIgaW4gcGFyZW50aGVzaXMgezEyM31cIikpXFxyXFxuJylcbiAgICAgIHZhciBpdGVyYXRvciA9IGNsaWVudC5faXRlcmF0ZUluY29taW5nQnVmZmVyKClcbiAgICAgIGV4cGVjdChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGl0ZXJhdG9yLm5leHQoKS52YWx1ZSkpLnRvLmVxdWFsKCcqIDEgRkVUQ0ggKFVJRCAxIEVOVkVMT1BFIChcInN0cmluZyB3aXRoIG51bWJlciBpbiBwYXJlbnRoZXNpcyB7MTIzfVwiKSknKVxuICAgIH0pXG5cbiAgICBmdW5jdGlvbiBhcHBlbmRJbmNvbWluZ0J1ZmZlciAoY29udGVudCkge1xuICAgICAgY2xpZW50Ll9pbmNvbWluZ0J1ZmZlcnMucHVzaCh0b1R5cGVkQXJyYXkoY29udGVudCkpXG4gICAgfVxuICB9KVxuXG4gIGRlc2NyaWJlKCcjX3BhcnNlSW5jb21pbmdDb21tYW5kcycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHByb2Nlc3MgYSB0YWdnZWQgaXRlbSBmcm9tIHRoZSBxdWV1ZScsICgpID0+IHtcbiAgICAgIGNsaWVudC5vbnJlYWR5ID0gc2lub24uc3R1YigpXG4gICAgICBzaW5vbi5zdHViKGNsaWVudCwgJ19oYW5kbGVSZXNwb25zZScpXG5cbiAgICAgIGZ1bmN0aW9uICogZ2VuICgpIHsgeWllbGQgdG9UeXBlZEFycmF5KCdPSyBIZWxsbyB3b3JsZCEnKSB9XG5cbiAgICAgIGNsaWVudC5fcGFyc2VJbmNvbWluZ0NvbW1hbmRzKGdlbigpKVxuXG4gICAgICBleHBlY3QoY2xpZW50Lm9ucmVhZHkuY2FsbENvdW50KS50by5lcXVhbCgxKVxuICAgICAgZXhwZWN0KGNsaWVudC5faGFuZGxlUmVzcG9uc2Uud2l0aEFyZ3Moe1xuICAgICAgICB0YWc6ICdPSycsXG4gICAgICAgIGNvbW1hbmQ6ICdIZWxsbycsXG4gICAgICAgIGF0dHJpYnV0ZXM6IFt7XG4gICAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICAgIHZhbHVlOiAnd29ybGQhJ1xuICAgICAgICB9XVxuICAgICAgfSkuY2FsbGVkT25jZSkudG8uYmUudHJ1ZVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHByb2Nlc3MgYW4gdW50YWdnZWQgaXRlbSBmcm9tIHRoZSBxdWV1ZScsICgpID0+IHtcbiAgICAgIHNpbm9uLnN0dWIoY2xpZW50LCAnX2hhbmRsZVJlc3BvbnNlJylcblxuICAgICAgZnVuY3Rpb24gKiBnZW4gKCkgeyB5aWVsZCB0b1R5cGVkQXJyYXkoJyogMSBFWElTVFMnKSB9XG5cbiAgICAgIGNsaWVudC5fcGFyc2VJbmNvbWluZ0NvbW1hbmRzKGdlbigpKVxuXG4gICAgICBleHBlY3QoY2xpZW50Ll9oYW5kbGVSZXNwb25zZS53aXRoQXJncyh7XG4gICAgICAgIHRhZzogJyonLFxuICAgICAgICBjb21tYW5kOiAnRVhJU1RTJyxcbiAgICAgICAgYXR0cmlidXRlczogW10sXG4gICAgICAgIG5yOiAxXG4gICAgICB9KS5jYWxsZWRPbmNlKS50by5iZS50cnVlXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgcHJvY2VzcyBhIHBsdXMgdGFnZ2VkIGl0ZW0gZnJvbSB0aGUgcXVldWUnLCAoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGNsaWVudCwgJ3NlbmQnKVxuXG4gICAgICBmdW5jdGlvbiAqIGdlbiAoKSB7IHlpZWxkIHRvVHlwZWRBcnJheSgnKyBQbGVhc2UgY29udGludWUnKSB9XG4gICAgICBjbGllbnQuX2N1cnJlbnRDb21tYW5kID0ge1xuICAgICAgICBkYXRhOiBbJ2xpdGVyYWwgZGF0YSddXG4gICAgICB9XG5cbiAgICAgIGNsaWVudC5fcGFyc2VJbmNvbWluZ0NvbW1hbmRzKGdlbigpKVxuXG4gICAgICBleHBlY3QoY2xpZW50LnNlbmQud2l0aEFyZ3MoJ2xpdGVyYWwgZGF0YVxcclxcbicpLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBwcm9jZXNzIGFuIFhPQVVUSDIgZXJyb3IgY2hhbGxlbmdlJywgKCkgPT4ge1xuICAgICAgc2lub24uc3R1YihjbGllbnQsICdzZW5kJylcblxuICAgICAgZnVuY3Rpb24gKiBnZW4gKCkgeyB5aWVsZCB0b1R5cGVkQXJyYXkoJysgRk9PQkFSJykgfVxuICAgICAgY2xpZW50Ll9jdXJyZW50Q29tbWFuZCA9IHtcbiAgICAgICAgZGF0YTogW10sXG4gICAgICAgIGVycm9yUmVzcG9uc2VFeHBlY3RzRW1wdHlMaW5lOiB0cnVlXG4gICAgICB9XG5cbiAgICAgIGNsaWVudC5fcGFyc2VJbmNvbWluZ0NvbW1hbmRzKGdlbigpKVxuXG4gICAgICBleHBlY3QoY2xpZW50LnNlbmQud2l0aEFyZ3MoJ1xcclxcbicpLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCcjX2hhbmRsZVJlc3BvbnNlJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgaW52b2tlIGdsb2JhbCBoYW5kbGVyIGJ5IGRlZmF1bHQnLCAoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGNsaWVudCwgJ19wcm9jZXNzUmVzcG9uc2UnKVxuICAgICAgc2lub24uc3R1YihjbGllbnQsICdfc2VuZFJlcXVlc3QnKVxuXG4gICAgICBjbGllbnQuX2dsb2JhbEFjY2VwdFVudGFnZ2VkLlRFU1QgPSAoKSA9PiB7IH1cbiAgICAgIHNpbm9uLnN0dWIoY2xpZW50Ll9nbG9iYWxBY2NlcHRVbnRhZ2dlZCwgJ1RFU1QnKVxuXG4gICAgICBjbGllbnQuX2N1cnJlbnRDb21tYW5kID0gZmFsc2VcbiAgICAgIGNsaWVudC5faGFuZGxlUmVzcG9uc2Uoe1xuICAgICAgICB0YWc6ICcqJyxcbiAgICAgICAgY29tbWFuZDogJ3Rlc3QnXG4gICAgICB9KVxuXG4gICAgICBleHBlY3QoY2xpZW50Ll9zZW5kUmVxdWVzdC5jYWxsQ291bnQpLnRvLmVxdWFsKDEpXG4gICAgICBleHBlY3QoY2xpZW50Ll9nbG9iYWxBY2NlcHRVbnRhZ2dlZC5URVNULndpdGhBcmdzKHtcbiAgICAgICAgdGFnOiAnKicsXG4gICAgICAgIGNvbW1hbmQ6ICd0ZXN0J1xuICAgICAgfSkuY2FsbENvdW50KS50by5lcXVhbCgxKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIGludm9rZSBnbG9iYWwgaGFuZGxlciBpZiBuZWVkZWQnLCAoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGNsaWVudCwgJ19wcm9jZXNzUmVzcG9uc2UnKVxuICAgICAgY2xpZW50Ll9nbG9iYWxBY2NlcHRVbnRhZ2dlZC5URVNUID0gKCkgPT4geyB9XG4gICAgICBzaW5vbi5zdHViKGNsaWVudC5fZ2xvYmFsQWNjZXB0VW50YWdnZWQsICdURVNUJylcbiAgICAgIHNpbm9uLnN0dWIoY2xpZW50LCAnX3NlbmRSZXF1ZXN0JylcblxuICAgICAgY2xpZW50Ll9jdXJyZW50Q29tbWFuZCA9IHtcbiAgICAgICAgcGF5bG9hZDoge31cbiAgICAgIH1cbiAgICAgIGNsaWVudC5faGFuZGxlUmVzcG9uc2Uoe1xuICAgICAgICB0YWc6ICcqJyxcbiAgICAgICAgY29tbWFuZDogJ3Rlc3QnXG4gICAgICB9KVxuXG4gICAgICBleHBlY3QoY2xpZW50Ll9zZW5kUmVxdWVzdC5jYWxsQ291bnQpLnRvLmVxdWFsKDApXG4gICAgICBleHBlY3QoY2xpZW50Ll9nbG9iYWxBY2NlcHRVbnRhZ2dlZC5URVNULndpdGhBcmdzKHtcbiAgICAgICAgdGFnOiAnKicsXG4gICAgICAgIGNvbW1hbmQ6ICd0ZXN0J1xuICAgICAgfSkuY2FsbENvdW50KS50by5lcXVhbCgxKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHB1c2ggdG8gcGF5bG9hZCcsICgpID0+IHtcbiAgICAgIHNpbm9uLnN0dWIoY2xpZW50LCAnX3Byb2Nlc3NSZXNwb25zZScpXG4gICAgICBjbGllbnQuX2dsb2JhbEFjY2VwdFVudGFnZ2VkLlRFU1QgPSAoKSA9PiB7IH1cbiAgICAgIHNpbm9uLnN0dWIoY2xpZW50Ll9nbG9iYWxBY2NlcHRVbnRhZ2dlZCwgJ1RFU1QnKVxuXG4gICAgICBjbGllbnQuX2N1cnJlbnRDb21tYW5kID0ge1xuICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgVEVTVDogW11cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2xpZW50Ll9oYW5kbGVSZXNwb25zZSh7XG4gICAgICAgIHRhZzogJyonLFxuICAgICAgICBjb21tYW5kOiAndGVzdCdcbiAgICAgIH0pXG5cbiAgICAgIGV4cGVjdChjbGllbnQuX2dsb2JhbEFjY2VwdFVudGFnZ2VkLlRFU1QuY2FsbENvdW50KS50by5lcXVhbCgwKVxuICAgICAgZXhwZWN0KGNsaWVudC5fY3VycmVudENvbW1hbmQucGF5bG9hZC5URVNUKS50by5kZWVwLmVxdWFsKFt7XG4gICAgICAgIHRhZzogJyonLFxuICAgICAgICBjb21tYW5kOiAndGVzdCdcbiAgICAgIH1dKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIGludm9rZSBjb21tYW5kIGNhbGxiYWNrJywgKCkgPT4ge1xuICAgICAgc2lub24uc3R1YihjbGllbnQsICdfcHJvY2Vzc1Jlc3BvbnNlJylcbiAgICAgIHNpbm9uLnN0dWIoY2xpZW50LCAnX3NlbmRSZXF1ZXN0JylcbiAgICAgIGNsaWVudC5fZ2xvYmFsQWNjZXB0VW50YWdnZWQuVEVTVCA9ICgpID0+IHsgfVxuICAgICAgc2lub24uc3R1YihjbGllbnQuX2dsb2JhbEFjY2VwdFVudGFnZ2VkLCAnVEVTVCcpXG5cbiAgICAgIGNsaWVudC5fY3VycmVudENvbW1hbmQgPSB7XG4gICAgICAgIHRhZzogJ0EnLFxuICAgICAgICBjYWxsYmFjazogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgZXhwZWN0KHJlc3BvbnNlKS50by5kZWVwLmVxdWFsKHtcbiAgICAgICAgICAgIHRhZzogJ0EnLFxuICAgICAgICAgICAgY29tbWFuZDogJ3Rlc3QnLFxuICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICBURVNUOiAnYWJjJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICBURVNUOiAnYWJjJ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjbGllbnQuX2hhbmRsZVJlc3BvbnNlKHtcbiAgICAgICAgdGFnOiAnQScsXG4gICAgICAgIGNvbW1hbmQ6ICd0ZXN0J1xuICAgICAgfSlcblxuICAgICAgZXhwZWN0KGNsaWVudC5fc2VuZFJlcXVlc3QuY2FsbENvdW50KS50by5lcXVhbCgxKVxuICAgICAgZXhwZWN0KGNsaWVudC5fZ2xvYmFsQWNjZXB0VW50YWdnZWQuVEVTVC5jYWxsQ291bnQpLnRvLmVxdWFsKDApXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnI2VucXVldWVDb21tYW5kJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmVqZWN0IG9uIE5PL0JBRCcsICgpID0+IHtcbiAgICAgIHNpbm9uLnN0dWIoY2xpZW50LCAnX3NlbmRSZXF1ZXN0JykuY2FsbHNGYWtlKCgpID0+IHtcbiAgICAgICAgY2xpZW50Ll9jbGllbnRRdWV1ZVswXS5jYWxsYmFjayh7IGNvbW1hbmQ6ICdOTycgfSlcbiAgICAgIH0pXG5cbiAgICAgIGNsaWVudC5fdGFnQ291bnRlciA9IDEwMFxuICAgICAgY2xpZW50Ll9jbGllbnRRdWV1ZSA9IFtdXG4gICAgICBjbGllbnQuX2NhblNlbmQgPSB0cnVlXG5cbiAgICAgIHJldHVybiBjbGllbnQuZW5xdWV1ZUNvbW1hbmQoe1xuICAgICAgICBjb21tYW5kOiAnYWJjJ1xuICAgICAgfSwgWydkZWYnXSwge1xuICAgICAgICB0OiAxXG4gICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIGV4cGVjdChlcnIpLnRvLmV4aXN0XG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIGludm9rZSBzZW5kaW5nJywgKCkgPT4ge1xuICAgICAgc2lub24uc3R1YihjbGllbnQsICdfc2VuZFJlcXVlc3QnKS5jYWxsc0Zha2UoKCkgPT4ge1xuICAgICAgICBjbGllbnQuX2NsaWVudFF1ZXVlWzBdLmNhbGxiYWNrKHt9KVxuICAgICAgfSlcblxuICAgICAgY2xpZW50Ll90YWdDb3VudGVyID0gMTAwXG4gICAgICBjbGllbnQuX2NsaWVudFF1ZXVlID0gW11cbiAgICAgIGNsaWVudC5fY2FuU2VuZCA9IHRydWVcblxuICAgICAgcmV0dXJuIGNsaWVudC5lbnF1ZXVlQ29tbWFuZCh7XG4gICAgICAgIGNvbW1hbmQ6ICdhYmMnXG4gICAgICB9LCBbJ2RlZiddLCB7XG4gICAgICAgIHQ6IDFcbiAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICBleHBlY3QoY2xpZW50Ll9zZW5kUmVxdWVzdC5jYWxsQ291bnQpLnRvLmVxdWFsKDEpXG4gICAgICAgIGV4cGVjdChjbGllbnQuX2NsaWVudFF1ZXVlLmxlbmd0aCkudG8uZXF1YWwoMSlcbiAgICAgICAgZXhwZWN0KGNsaWVudC5fY2xpZW50UXVldWVbMF0udGFnKS50by5lcXVhbCgnVzEwMScpXG4gICAgICAgIGV4cGVjdChjbGllbnQuX2NsaWVudFF1ZXVlWzBdLnJlcXVlc3QpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgICAgIGNvbW1hbmQ6ICdhYmMnLFxuICAgICAgICAgIHRhZzogJ1cxMDEnXG4gICAgICAgIH0pXG4gICAgICAgIGV4cGVjdChjbGllbnQuX2NsaWVudFF1ZXVlWzBdLnQpLnRvLmVxdWFsKDEpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIG9ubHkgcXVldWUnLCAoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGNsaWVudCwgJ19zZW5kUmVxdWVzdCcpXG5cbiAgICAgIGNsaWVudC5fdGFnQ291bnRlciA9IDEwMFxuICAgICAgY2xpZW50Ll9jbGllbnRRdWV1ZSA9IFtdXG4gICAgICBjbGllbnQuX2NhblNlbmQgPSBmYWxzZVxuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHsgY2xpZW50Ll9jbGllbnRRdWV1ZVswXS5jYWxsYmFjayh7fSkgfSwgMClcblxuICAgICAgcmV0dXJuIGNsaWVudC5lbnF1ZXVlQ29tbWFuZCh7XG4gICAgICAgIGNvbW1hbmQ6ICdhYmMnXG4gICAgICB9LCBbJ2RlZiddLCB7XG4gICAgICAgIHQ6IDFcbiAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICBleHBlY3QoY2xpZW50Ll9zZW5kUmVxdWVzdC5jYWxsQ291bnQpLnRvLmVxdWFsKDApXG4gICAgICAgIGV4cGVjdChjbGllbnQuX2NsaWVudFF1ZXVlLmxlbmd0aCkudG8uZXF1YWwoMSlcbiAgICAgICAgZXhwZWN0KGNsaWVudC5fY2xpZW50UXVldWVbMF0udGFnKS50by5lcXVhbCgnVzEwMScpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHN0b3JlIHZhbHVlQXNTdHJpbmcgb3B0aW9uIGluIHRoZSBjb21tYW5kJywgKCkgPT4ge1xuICAgICAgc2lub24uc3R1YihjbGllbnQsICdfc2VuZFJlcXVlc3QnKVxuXG4gICAgICBjbGllbnQuX3RhZ0NvdW50ZXIgPSAxMDBcbiAgICAgIGNsaWVudC5fY2xpZW50UXVldWUgPSBbXVxuICAgICAgY2xpZW50Ll9jYW5TZW5kID0gZmFsc2VcblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGNsaWVudC5fY2xpZW50UXVldWVbMF0uY2FsbGJhY2soe30pIH0sIDApXG4gICAgICByZXR1cm4gY2xpZW50LmVucXVldWVDb21tYW5kKHtcbiAgICAgICAgY29tbWFuZDogJ2FiYycsXG4gICAgICAgIHZhbHVlQXNTdHJpbmc6IGZhbHNlXG4gICAgICB9LCBbJ2RlZiddLCB7XG4gICAgICAgIHQ6IDFcbiAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICBleHBlY3QoY2xpZW50Ll9jbGllbnRRdWV1ZVswXS5yZXF1ZXN0LnZhbHVlQXNTdHJpbmcpLnRvLmVxdWFsKGZhbHNlKVxuICAgICAgfSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCcjX3NlbmRSZXF1ZXN0JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZW50ZXIgaWRsZSBpZiBub3RoaW5nIGlzIHRvIHByb2Nlc3MnLCAoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGNsaWVudCwgJ19lbnRlcklkbGUnKVxuXG4gICAgICBjbGllbnQuX2NsaWVudFF1ZXVlID0gW11cbiAgICAgIGNsaWVudC5fc2VuZFJlcXVlc3QoKVxuXG4gICAgICBleHBlY3QoY2xpZW50Ll9lbnRlcklkbGUuY2FsbENvdW50KS50by5lcXVhbCgxKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHNlbmQgZGF0YScsICgpID0+IHtcbiAgICAgIHNpbm9uLnN0dWIoY2xpZW50LCAnX2NsZWFySWRsZScpXG4gICAgICBzaW5vbi5zdHViKGNsaWVudCwgJ3NlbmQnKVxuXG4gICAgICBjbGllbnQuX2NsaWVudFF1ZXVlID0gW3tcbiAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgIHRhZzogJ1cxMDEnLFxuICAgICAgICAgIGNvbW1hbmQ6ICdURVNUJ1xuICAgICAgICB9XG4gICAgICB9XVxuICAgICAgY2xpZW50Ll9zZW5kUmVxdWVzdCgpXG5cbiAgICAgIGV4cGVjdChjbGllbnQuX2NsZWFySWRsZS5jYWxsQ291bnQpLnRvLmVxdWFsKDEpXG4gICAgICBleHBlY3QoY2xpZW50LnNlbmQuYXJnc1swXVswXSkudG8uZXF1YWwoJ1cxMDEgVEVTVFxcclxcbicpXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgc2VuZCBwYXJ0aWFsIGRhdGEnLCAoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGNsaWVudCwgJ19jbGVhcklkbGUnKVxuICAgICAgc2lub24uc3R1YihjbGllbnQsICdzZW5kJylcblxuICAgICAgY2xpZW50Ll9jbGllbnRRdWV1ZSA9IFt7XG4gICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICB0YWc6ICdXMTAxJyxcbiAgICAgICAgICBjb21tYW5kOiAnVEVTVCcsXG4gICAgICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgICAgIHR5cGU6ICdMSVRFUkFMJyxcbiAgICAgICAgICAgIHZhbHVlOiAnYWJjJ1xuICAgICAgICAgIH1dXG4gICAgICAgIH1cbiAgICAgIH1dXG4gICAgICBjbGllbnQuX3NlbmRSZXF1ZXN0KClcblxuICAgICAgZXhwZWN0KGNsaWVudC5fY2xlYXJJZGxlLmNhbGxDb3VudCkudG8uZXF1YWwoMSlcbiAgICAgIGV4cGVjdChjbGllbnQuc2VuZC5hcmdzWzBdWzBdKS50by5lcXVhbCgnVzEwMSBURVNUIHszfVxcclxcbicpXG4gICAgICBleHBlY3QoY2xpZW50Ll9jdXJyZW50Q29tbWFuZC5kYXRhKS50by5kZWVwLmVxdWFsKFsnYWJjJ10pXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgcnVuIHByZWNoZWNrJywgKGRvbmUpID0+IHtcbiAgICAgIHNpbm9uLnN0dWIoY2xpZW50LCAnX2NsZWFySWRsZScpXG5cbiAgICAgIGNsaWVudC5fY2FuU2VuZCA9IHRydWVcbiAgICAgIGNsaWVudC5fY2xpZW50UXVldWUgPSBbe1xuICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgdGFnOiAnVzEwMScsXG4gICAgICAgICAgY29tbWFuZDogJ1RFU1QnLFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IFt7XG4gICAgICAgICAgICB0eXBlOiAnTElURVJBTCcsXG4gICAgICAgICAgICB2YWx1ZTogJ2FiYydcbiAgICAgICAgICB9XVxuICAgICAgICB9LFxuICAgICAgICBwcmVjaGVjazogKGN0eCkgPT4ge1xuICAgICAgICAgIGV4cGVjdChjdHgpLnRvLmV4aXN0XG4gICAgICAgICAgZXhwZWN0KGNsaWVudC5fY2FuU2VuZCkudG8uYmUudHJ1ZVxuICAgICAgICAgIGNsaWVudC5fc2VuZFJlcXVlc3QgPSAoKSA9PiB7XG4gICAgICAgICAgICBleHBlY3QoY2xpZW50Ll9jbGllbnRRdWV1ZS5sZW5ndGgpLnRvLmVxdWFsKDIpXG4gICAgICAgICAgICBleHBlY3QoY2xpZW50Ll9jbGllbnRRdWV1ZVswXS50YWcpLnRvLmluY2x1ZGUoJy5wJylcbiAgICAgICAgICAgIGV4cGVjdChjbGllbnQuX2NsaWVudFF1ZXVlWzBdLnJlcXVlc3QudGFnKS50by5pbmNsdWRlKCcucCcpXG4gICAgICAgICAgICBjbGllbnQuX2NsZWFySWRsZS5yZXN0b3JlKClcbiAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjbGllbnQuZW5xdWV1ZUNvbW1hbmQoe30sIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgY3R4OiBjdHhcbiAgICAgICAgICB9KVxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICB9XG4gICAgICB9XVxuICAgICAgY2xpZW50Ll9zZW5kUmVxdWVzdCgpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnI19lbnRlcklkbGUnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzZXQgaWRsZSB0aW1lcicsIChkb25lKSA9PiB7XG4gICAgICBjbGllbnQub25pZGxlID0gKCkgPT4ge1xuICAgICAgICBkb25lKClcbiAgICAgIH1cbiAgICAgIGNsaWVudC50aW1lb3V0RW50ZXJJZGxlID0gMVxuXG4gICAgICBjbGllbnQuX2VudGVySWRsZSgpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnI19wcm9jZXNzUmVzcG9uc2UnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzZXQgaHVtYW5SZWFkYWJsZScsICgpID0+IHtcbiAgICAgIHZhciByZXNwb25zZSA9IHtcbiAgICAgICAgdGFnOiAnKicsXG4gICAgICAgIGNvbW1hbmQ6ICdPSycsXG4gICAgICAgIGF0dHJpYnV0ZXM6IFt7XG4gICAgICAgICAgdHlwZTogJ1RFWFQnLFxuICAgICAgICAgIHZhbHVlOiAnU29tZSByYW5kb20gdGV4dCdcbiAgICAgICAgfV1cbiAgICAgIH1cbiAgICAgIGNsaWVudC5fcHJvY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlKVxuXG4gICAgICBleHBlY3QocmVzcG9uc2UuaHVtYW5SZWFkYWJsZSkudG8uZXF1YWwoJ1NvbWUgcmFuZG9tIHRleHQnKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHNldCByZXNwb25zZSBjb2RlJywgKCkgPT4ge1xuICAgICAgdmFyIHJlc3BvbnNlID0ge1xuICAgICAgICB0YWc6ICcqJyxcbiAgICAgICAgY29tbWFuZDogJ09LJyxcbiAgICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgc2VjdGlvbjogW3tcbiAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgIHZhbHVlOiAnQ0FQQUJJTElUWSdcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICB2YWx1ZTogJ0lNQVA0UkVWMSdcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICB2YWx1ZTogJ1VJRFBMVVMnXG4gICAgICAgICAgfV1cbiAgICAgICAgfSwge1xuICAgICAgICAgIHR5cGU6ICdURVhUJyxcbiAgICAgICAgICB2YWx1ZTogJ1NvbWUgcmFuZG9tIHRleHQnXG4gICAgICAgIH1dXG4gICAgICB9XG4gICAgICBjbGllbnQuX3Byb2Nlc3NSZXNwb25zZShyZXNwb25zZSlcbiAgICAgIGV4cGVjdChyZXNwb25zZS5jb2RlKS50by5lcXVhbCgnQ0FQQUJJTElUWScpXG4gICAgICBleHBlY3QocmVzcG9uc2UuY2FwYWJpbGl0eSkudG8uZGVlcC5lcXVhbChbJ0lNQVA0UkVWMScsICdVSURQTFVTJ10pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnI2lzRXJyb3InLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBkZXRlY3QgaWYgYW4gb2JqZWN0IGlzIGFuIGVycm9yJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNsaWVudC5pc0Vycm9yKG5ldyBSYW5nZUVycm9yKCdhYmMnKSkpLnRvLmJlLnRydWVcbiAgICAgIGV4cGVjdChjbGllbnQuaXNFcnJvcignYWJjJykpLnRvLmJlLmZhbHNlXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnI2VuYWJsZUNvbXByZXNzaW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgY3JlYXRlIGluZmxhdGVyIGFuZCBkZWZsYXRlciBzdHJlYW1zJywgKCkgPT4ge1xuICAgICAgY2xpZW50LnNvY2tldC5vbmRhdGEgPSAoKSA9PiB7IH1cbiAgICAgIHNpbm9uLnN0dWIoY2xpZW50LnNvY2tldCwgJ29uZGF0YScpXG5cbiAgICAgIGV4cGVjdChjbGllbnQuY29tcHJlc3NlZCkudG8uYmUuZmFsc2VcbiAgICAgIGNsaWVudC5lbmFibGVDb21wcmVzc2lvbigpXG4gICAgICBleHBlY3QoY2xpZW50LmNvbXByZXNzZWQpLnRvLmJlLnRydWVcblxuICAgICAgY29uc3QgcGF5bG9hZCA9ICdhc2Rhc2QnXG4gICAgICBjb25zdCBleHBlY3RlZCA9IHBheWxvYWQuc3BsaXQoJycpLm1hcChjaGFyID0+IGNoYXIuY2hhckNvZGVBdCgwKSlcblxuICAgICAgY2xpZW50LnNlbmQocGF5bG9hZClcbiAgICAgIGNvbnN0IGFjdHVhbE91dCA9IHNvY2tldFN0dWIuc2VuZC5hcmdzWzBdWzBdXG4gICAgICBjbGllbnQuc29ja2V0Lm9uZGF0YSh7IGRhdGE6IGFjdHVhbE91dCB9KVxuICAgICAgZXhwZWN0KEJ1ZmZlci5mcm9tKGNsaWVudC5fc29ja2V0T25EYXRhLmFyZ3NbMF1bMF0uZGF0YSkpLnRvLmRlZXAuZXF1YWwoQnVmZmVyLmZyb20oZXhwZWN0ZWQpKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJyNnZXRQcmV2aW91c2x5UXVldWVkJywgKCkgPT4ge1xuICAgIGNvbnN0IGN0eCA9IHt9XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB1bmRlZmluZWQgd2l0aCBlbXB0eSBxdWV1ZSBhbmQgbm8gY3VycmVudCBjb21tYW5kJywgKCkgPT4ge1xuICAgICAgY2xpZW50Ll9jdXJyZW50Q29tbWFuZCA9IHVuZGVmaW5lZFxuICAgICAgY2xpZW50Ll9jbGllbnRRdWV1ZSA9IFtdXG5cbiAgICAgIGV4cGVjdCh0ZXN0QW5kR2V0QXR0cmlidXRlKCkpLnRvLmJlLnVuZGVmaW5lZFxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB1bmRlZmluZWQgd2l0aCBlbXB0eSBxdWV1ZSBhbmQgbm9uLVNFTEVDVCBjdXJyZW50IGNvbW1hbmQnLCAoKSA9PiB7XG4gICAgICBjbGllbnQuX2N1cnJlbnRDb21tYW5kID0gY3JlYXRlQ29tbWFuZCgnVEVTVCcpXG4gICAgICBjbGllbnQuX2NsaWVudFF1ZXVlID0gW11cblxuICAgICAgZXhwZWN0KHRlc3RBbmRHZXRBdHRyaWJ1dGUoKSkudG8uYmUudW5kZWZpbmVkXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGN1cnJlbnQgY29tbWFuZCB3aXRoIGVtcHR5IHF1ZXVlIGFuZCBTRUxFQ1QgY3VycmVudCBjb21tYW5kJywgKCkgPT4ge1xuICAgICAgY2xpZW50Ll9jdXJyZW50Q29tbWFuZCA9IGNyZWF0ZUNvbW1hbmQoJ1NFTEVDVCcsICdBVFRSJylcbiAgICAgIGNsaWVudC5fY2xpZW50UXVldWUgPSBbXVxuXG4gICAgICBleHBlY3QodGVzdEFuZEdldEF0dHJpYnV0ZSgpKS50by5lcXVhbCgnQVRUUicpXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGN1cnJlbnQgY29tbWFuZCB3aXRoIG5vbi1TRUxFQ1QgY29tbWFuZHMgaW4gcXVldWUgYW5kIFNFTEVDVCBjdXJyZW50IGNvbW1hbmQnLCAoKSA9PiB7XG4gICAgICBjbGllbnQuX2N1cnJlbnRDb21tYW5kID0gY3JlYXRlQ29tbWFuZCgnU0VMRUNUJywgJ0FUVFInKVxuICAgICAgY2xpZW50Ll9jbGllbnRRdWV1ZSA9IFtcbiAgICAgICAgY3JlYXRlQ29tbWFuZCgnVEVTVDAxJyksXG4gICAgICAgIGNyZWF0ZUNvbW1hbmQoJ1RFU1QwMicpXG4gICAgICBdXG5cbiAgICAgIGV4cGVjdCh0ZXN0QW5kR2V0QXR0cmlidXRlKCkpLnRvLmVxdWFsKCdBVFRSJylcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gbGFzdCBTRUxFQ1QgYmVmb3JlIGN0eCB3aXRoIG11bHRpcGxlIFNFTEVDVCBjb21tYW5kcyBpbiBxdWV1ZSAoMSknLCAoKSA9PiB7XG4gICAgICBjbGllbnQuX2N1cnJlbnRDb21tYW5kID0gY3JlYXRlQ29tbWFuZCgnU0VMRUNUJywgJ0FUVFIwMScpXG4gICAgICBjbGllbnQuX2NsaWVudFF1ZXVlID0gW1xuICAgICAgICBjcmVhdGVDb21tYW5kKCdTRUxFQ1QnLCAnQVRUUicpLFxuICAgICAgICBjcmVhdGVDb21tYW5kKCdURVNUJyksXG4gICAgICAgIGN0eCxcbiAgICAgICAgY3JlYXRlQ29tbWFuZCgnU0VMRUNUJywgJ0FUVFIwMycpXG4gICAgICBdXG5cbiAgICAgIGV4cGVjdCh0ZXN0QW5kR2V0QXR0cmlidXRlKCkpLnRvLmVxdWFsKCdBVFRSJylcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gbGFzdCBTRUxFQ1QgYmVmb3JlIGN0eCB3aXRoIG11bHRpcGxlIFNFTEVDVCBjb21tYW5kcyBpbiBxdWV1ZSAoMiknLCAoKSA9PiB7XG4gICAgICBjbGllbnQuX2NsaWVudFF1ZXVlID0gW1xuICAgICAgICBjcmVhdGVDb21tYW5kKCdTRUxFQ1QnLCAnQVRUUjAyJyksXG4gICAgICAgIGNyZWF0ZUNvbW1hbmQoJ1NFTEVDVCcsICdBVFRSJyksXG4gICAgICAgIGN0eCxcbiAgICAgICAgY3JlYXRlQ29tbWFuZCgnU0VMRUNUJywgJ0FUVFIwMycpXG4gICAgICBdXG5cbiAgICAgIGV4cGVjdCh0ZXN0QW5kR2V0QXR0cmlidXRlKCkpLnRvLmVxdWFsKCdBVFRSJylcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gbGFzdCBTRUxFQ1QgYmVmb3JlIGN0eCB3aXRoIG11bHRpcGxlIFNFTEVDVCBjb21tYW5kcyBpbiBxdWV1ZSAoMyknLCAoKSA9PiB7XG4gICAgICBjbGllbnQuX2NsaWVudFF1ZXVlID0gW1xuICAgICAgICBjcmVhdGVDb21tYW5kKCdTRUxFQ1QnLCAnQVRUUjAyJyksXG4gICAgICAgIGNyZWF0ZUNvbW1hbmQoJ1NFTEVDVCcsICdBVFRSJyksXG4gICAgICAgIGNyZWF0ZUNvbW1hbmQoJ1RFU1QnKSxcbiAgICAgICAgY3R4LFxuICAgICAgICBjcmVhdGVDb21tYW5kKCdTRUxFQ1QnLCAnQVRUUjAzJylcbiAgICAgIF1cblxuICAgICAgZXhwZWN0KHRlc3RBbmRHZXRBdHRyaWJ1dGUoKSkudG8uZXF1YWwoJ0FUVFInKVxuICAgIH0pXG5cbiAgICBmdW5jdGlvbiB0ZXN0QW5kR2V0QXR0cmlidXRlICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBjbGllbnQuZ2V0UHJldmlvdXNseVF1ZXVlZChbJ1NFTEVDVCddLCBjdHgpXG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICByZXR1cm4gZGF0YS5yZXF1ZXN0LmF0dHJpYnV0ZXNbMF0udmFsdWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVDb21tYW5kIChjb21tYW5kLCBhdHRyaWJ1dGUpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBbXVxuICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgcmVxdWVzdDogeyBjb21tYW5kLCBhdHRyaWJ1dGVzIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGF0dHJpYnV0ZSkge1xuICAgICAgICBkYXRhLnJlcXVlc3QuYXR0cmlidXRlcy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiAnU1RSSU5HJyxcbiAgICAgICAgICB2YWx1ZTogYXR0cmlidXRlXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkYXRhXG4gICAgfVxuICB9KVxufSlcbiJdfQ== \ No newline at end of file diff --git a/dist/imap.js b/dist/imap.js new file mode 100644 index 00000000..a1f74e09 --- /dev/null +++ b/dist/imap.js @@ -0,0 +1,948 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _ramda = require("ramda"); + +var _emailjsTcpSocket = _interopRequireDefault(require("emailjs-tcp-socket")); + +var _common = require("./common"); + +var _emailjsImapHandler = require("emailjs-imap-handler"); + +var _compression = _interopRequireDefault(require("./compression")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/* babel-plugin-inline-import '../res/compression.worker.blob' */ +const CompressionBlob = "!function(e){var t={};function a(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,a),i.l=!0,i.exports}a.m=e,a.c=t,a.d=function(e,t,n){a.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},a.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},a.t=function(e,t){if(1&t&&(e=a(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(a.r(n),Object.defineProperty(n,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var i in e)a.d(n,i,function(t){return e[t]}.bind(null,i));return n},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,\"a\",t),t},a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},a.p=\"\",a(a.s=11)}([function(e,t,a){\"use strict\";e.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},function(e,t,a){\"use strict\";e.exports={2:\"need dictionary\",1:\"stream end\",0:\"\",\"-1\":\"file error\",\"-2\":\"stream error\",\"-3\":\"data error\",\"-4\":\"insufficient memory\",\"-5\":\"buffer error\",\"-6\":\"incompatible version\"}},function(e,t,a){\"use strict\";var n=\"undefined\"!=typeof Uint8Array&&\"undefined\"!=typeof Uint16Array&&\"undefined\"!=typeof Int32Array;function i(e,t){return Object.prototype.hasOwnProperty.call(e,t)}t.assign=function(e){for(var t=Array.prototype.slice.call(arguments,1);t.length;){var a=t.shift();if(a){if(\"object\"!=typeof a)throw new TypeError(a+\"must be non-object\");for(var n in a)i(a,n)&&(e[n]=a[n])}}return e},t.shrinkBuf=function(e,t){return e.length===t?e:e.subarray?e.subarray(0,t):(e.length=t,e)};var r={arraySet:function(e,t,a,n,i){if(t.subarray&&e.subarray)e.set(t.subarray(a,a+n),i);else for(var r=0;r4?9:0)}function _(e){for(var t=e.length;--t>=0;)e[t]=0}function f(e){var t=e.state,a=t.pending;a>e.avail_out&&(a=e.avail_out),0!==a&&(i.arraySet(e.output,t.pending_buf,t.pending_out,a,e.next_out),e.next_out+=a,t.pending_out+=a,e.total_out+=a,e.avail_out-=a,t.pending-=a,0===t.pending&&(t.pending_out=0))}function u(e,t){r._tr_flush_block(e,e.block_start>=0?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,f(e.strm)}function c(e,t){e.pending_buf[e.pending++]=t}function b(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t}function g(e,t){var a,n,i=e.max_chain_length,r=e.strstart,s=e.prev_length,l=e.nice_match,o=e.strstart>e.w_size-262?e.strstart-(e.w_size-262):0,h=e.window,d=e.w_mask,_=e.prev,f=e.strstart+258,u=h[r+s-1],c=h[r+s];e.prev_length>=e.good_match&&(i>>=2),l>e.lookahead&&(l=e.lookahead);do{if(h[(a=t)+s]===c&&h[a+s-1]===u&&h[a]===h[r]&&h[++a]===h[r+1]){r+=2,a++;do{}while(h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&rs){if(e.match_start=t,s=n,n>=l)break;u=h[r+s-1],c=h[r+s]}}}while((t=_[t&d])>o&&0!=--i);return s<=e.lookahead?s:e.lookahead}function m(e){var t,a,n,r,o,h,d,_,f,u,c=e.w_size;do{if(r=e.window_size-e.lookahead-e.strstart,e.strstart>=c+(c-262)){i.arraySet(e.window,e.window,c,c,0),e.match_start-=c,e.strstart-=c,e.block_start-=c,t=a=e.hash_size;do{n=e.head[--t],e.head[t]=n>=c?n-c:0}while(--a);t=a=c;do{n=e.prev[--t],e.prev[t]=n>=c?n-c:0}while(--a);r+=c}if(0===e.strm.avail_in)break;if(h=e.strm,d=e.window,_=e.strstart+e.lookahead,f=r,u=void 0,(u=h.avail_in)>f&&(u=f),a=0===u?0:(h.avail_in-=u,i.arraySet(d,h.input,h.next_in,u,_),1===h.state.wrap?h.adler=s(h.adler,d,u,_):2===h.state.wrap&&(h.adler=l(h.adler,d,u,_)),h.next_in+=u,h.total_in+=u,u),e.lookahead+=a,e.lookahead+e.insert>=3)for(o=e.strstart-e.insert,e.ins_h=e.window[o],e.ins_h=(e.ins_h<=3&&(e.ins_h=(e.ins_h<=3)if(n=r._tr_tally(e,e.strstart-e.match_start,e.match_length-3),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=3){e.match_length--;do{e.strstart++,e.ins_h=(e.ins_h<=3&&(e.ins_h=(e.ins_h<4096)&&(e.match_length=2)),e.prev_length>=3&&e.match_length<=e.prev_length){i=e.strstart+e.lookahead-3,n=r._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-3),e.lookahead-=e.prev_length-1,e.prev_length-=2;do{++e.strstart<=i&&(e.ins_h=(e.ins_h<15&&(l=2,n-=16),r<1||r>9||8!==a||n<8||n>15||t<0||t>9||s<0||s>4)return h(e,-2);8===n&&(n=9);var o=new k;return e.state=o,o.strm=e,o.wrap=l,o.gzhead=null,o.w_bits=n,o.w_size=1<e.pending_buf_size-5&&(a=e.pending_buf_size-5);;){if(e.lookahead<=1){if(m(e),0===e.lookahead&&0===t)return 1;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var n=e.block_start+a;if((0===e.strstart||e.strstart>=n)&&(e.lookahead=e.strstart-n,e.strstart=n,u(e,!1),0===e.strm.avail_out))return 1;if(e.strstart-e.block_start>=e.w_size-262&&(u(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,4===t?(u(e,!0),0===e.strm.avail_out?3:4):(e.strstart>e.block_start&&(u(e,!1),e.strm.avail_out),1)})),new v(4,4,8,4,w),new v(4,5,16,8,w),new v(4,6,32,32,w),new v(4,4,16,16,p),new v(8,16,32,32,p),new v(8,16,128,128,p),new v(8,32,128,256,p),new v(32,128,258,1024,p),new v(32,258,258,4096,p)],t.deflateInit=function(e,t){return z(e,t,8,15,8,0)},t.deflateInit2=z,t.deflateReset=x,t.deflateResetKeep=y,t.deflateSetHeader=function(e,t){return e&&e.state?2!==e.state.wrap?-2:(e.state.gzhead=t,0):-2},t.deflate=function(e,t){var a,i,s,o;if(!e||!e.state||t>5||t<0)return e?h(e,-2):-2;if(i=e.state,!e.output||!e.input&&0!==e.avail_in||666===i.status&&4!==t)return h(e,0===e.avail_out?-5:-2);if(i.strm=e,a=i.last_flush,i.last_flush=t,42===i.status)if(2===i.wrap)e.adler=0,c(i,31),c(i,139),c(i,8),i.gzhead?(c(i,(i.gzhead.text?1:0)+(i.gzhead.hcrc?2:0)+(i.gzhead.extra?4:0)+(i.gzhead.name?8:0)+(i.gzhead.comment?16:0)),c(i,255&i.gzhead.time),c(i,i.gzhead.time>>8&255),c(i,i.gzhead.time>>16&255),c(i,i.gzhead.time>>24&255),c(i,9===i.level?2:i.strategy>=2||i.level<2?4:0),c(i,255&i.gzhead.os),i.gzhead.extra&&i.gzhead.extra.length&&(c(i,255&i.gzhead.extra.length),c(i,i.gzhead.extra.length>>8&255)),i.gzhead.hcrc&&(e.adler=l(e.adler,i.pending_buf,i.pending,0)),i.gzindex=0,i.status=69):(c(i,0),c(i,0),c(i,0),c(i,0),c(i,0),c(i,9===i.level?2:i.strategy>=2||i.level<2?4:0),c(i,3),i.status=113);else{var g=8+(i.w_bits-8<<4)<<8;g|=(i.strategy>=2||i.level<2?0:i.level<6?1:6===i.level?2:3)<<6,0!==i.strstart&&(g|=32),g+=31-g%31,i.status=113,b(i,g),0!==i.strstart&&(b(i,e.adler>>>16),b(i,65535&e.adler)),e.adler=1}if(69===i.status)if(i.gzhead.extra){for(s=i.pending;i.gzindex<(65535&i.gzhead.extra.length)&&(i.pending!==i.pending_buf_size||(i.gzhead.hcrc&&i.pending>s&&(e.adler=l(e.adler,i.pending_buf,i.pending-s,s)),f(e),s=i.pending,i.pending!==i.pending_buf_size));)c(i,255&i.gzhead.extra[i.gzindex]),i.gzindex++;i.gzhead.hcrc&&i.pending>s&&(e.adler=l(e.adler,i.pending_buf,i.pending-s,s)),i.gzindex===i.gzhead.extra.length&&(i.gzindex=0,i.status=73)}else i.status=73;if(73===i.status)if(i.gzhead.name){s=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>s&&(e.adler=l(e.adler,i.pending_buf,i.pending-s,s)),f(e),s=i.pending,i.pending===i.pending_buf_size)){o=1;break}o=i.gzindexs&&(e.adler=l(e.adler,i.pending_buf,i.pending-s,s)),0===o&&(i.gzindex=0,i.status=91)}else i.status=91;if(91===i.status)if(i.gzhead.comment){s=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>s&&(e.adler=l(e.adler,i.pending_buf,i.pending-s,s)),f(e),s=i.pending,i.pending===i.pending_buf_size)){o=1;break}o=i.gzindexs&&(e.adler=l(e.adler,i.pending_buf,i.pending-s,s)),0===o&&(i.status=103)}else i.status=103;if(103===i.status&&(i.gzhead.hcrc?(i.pending+2>i.pending_buf_size&&f(e),i.pending+2<=i.pending_buf_size&&(c(i,255&e.adler),c(i,e.adler>>8&255),e.adler=0,i.status=113)):i.status=113),0!==i.pending){if(f(e),0===e.avail_out)return i.last_flush=-1,0}else if(0===e.avail_in&&d(t)<=d(a)&&4!==t)return h(e,-5);if(666===i.status&&0!==e.avail_in)return h(e,-5);if(0!==e.avail_in||0!==i.lookahead||0!==t&&666!==i.status){var w=2===i.strategy?function(e,t){for(var a;;){if(0===e.lookahead&&(m(e),0===e.lookahead)){if(0===t)return 1;break}if(e.match_length=0,a=r._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,a&&(u(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,4===t?(u(e,!0),0===e.strm.avail_out?3:4):e.last_lit&&(u(e,!1),0===e.strm.avail_out)?1:2}(i,t):3===i.strategy?function(e,t){for(var a,n,i,s,l=e.window;;){if(e.lookahead<=258){if(m(e),e.lookahead<=258&&0===t)return 1;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=3&&e.strstart>0&&(n=l[i=e.strstart-1])===l[++i]&&n===l[++i]&&n===l[++i]){s=e.strstart+258;do{}while(n===l[++i]&&n===l[++i]&&n===l[++i]&&n===l[++i]&&n===l[++i]&&n===l[++i]&&n===l[++i]&&n===l[++i]&&ie.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=3?(a=r._tr_tally(e,1,e.match_length-3),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(a=r._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),a&&(u(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,4===t?(u(e,!0),0===e.strm.avail_out?3:4):e.last_lit&&(u(e,!1),0===e.strm.avail_out)?1:2}(i,t):n[i.level].func(i,t);if(3!==w&&4!==w||(i.status=666),1===w||3===w)return 0===e.avail_out&&(i.last_flush=-1),0;if(2===w&&(1===t?r._tr_align(i):5!==t&&(r._tr_stored_block(i,0,0,!1),3===t&&(_(i.head),0===i.lookahead&&(i.strstart=0,i.block_start=0,i.insert=0))),f(e),0===e.avail_out))return i.last_flush=-1,0}return 4!==t?0:i.wrap<=0?1:(2===i.wrap?(c(i,255&e.adler),c(i,e.adler>>8&255),c(i,e.adler>>16&255),c(i,e.adler>>24&255),c(i,255&e.total_in),c(i,e.total_in>>8&255),c(i,e.total_in>>16&255),c(i,e.total_in>>24&255)):(b(i,e.adler>>>16),b(i,65535&e.adler)),f(e),i.wrap>0&&(i.wrap=-i.wrap),0!==i.pending?0:1)},t.deflateEnd=function(e){var t;return e&&e.state?42!==(t=e.state.status)&&69!==t&&73!==t&&91!==t&&103!==t&&113!==t&&666!==t?h(e,-2):(e.state=null,113===t?h(e,-3):0):-2},t.deflateSetDictionary=function(e,t){var a,n,r,l,o,h,d,f,u=t.length;if(!e||!e.state)return-2;if(2===(l=(a=e.state).wrap)||1===l&&42!==a.status||a.lookahead)return-2;for(1===l&&(e.adler=s(e.adler,t,u,0)),a.wrap=0,u>=a.w_size&&(0===l&&(_(a.head),a.strstart=0,a.block_start=0,a.insert=0),f=new i.Buf8(a.w_size),i.arraySet(f,t,u-a.w_size,a.w_size,0),t=f,u=a.w_size),o=e.avail_in,h=e.next_in,d=e.input,e.avail_in=u,e.next_in=0,e.input=t,m(a);a.lookahead>=3;){n=a.strstart,r=a.lookahead-2;do{a.ins_h=(a.ins_h<>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function h(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new n.Buf16(320),this.work=new n.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function d(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg=\"\",t.wrap&&(e.adler=1&t.wrap),t.mode=1,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new n.Buf32(852),t.distcode=t.distdyn=new n.Buf32(592),t.sane=1,t.back=-1,0):-2}function _(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,d(e)):-2}function f(e,t){var a,n;return e&&e.state?(n=e.state,t<0?(a=0,t=-t):(a=1+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?-2:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=a,n.wbits=t,_(e))):-2}function u(e,t){var a,n;return e?(n=new h,e.state=n,n.window=null,0!==(a=f(e,t))&&(e.state=null),a):-2}var c,b,g=!0;function m(e){if(g){var t;for(c=new n.Buf32(512),b=new n.Buf32(32),t=0;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(l(1,e.lens,0,288,c,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;l(2,e.lens,0,32,b,0,e.work,{bits:5}),g=!1}e.lencode=c,e.lenbits=9,e.distcode=b,e.distbits=5}function w(e,t,a,i){var r,s=e.state;return null===s.window&&(s.wsize=1<=s.wsize?(n.arraySet(s.window,t,a-s.wsize,s.wsize,0),s.wnext=0,s.whave=s.wsize):((r=s.wsize-s.wnext)>i&&(r=i),n.arraySet(s.window,t,a-i,r,s.wnext),(i-=r)?(n.arraySet(s.window,t,a-i,i,0),s.wnext=i,s.whave=s.wsize):(s.wnext+=r,s.wnext===s.wsize&&(s.wnext=0),s.whave>>8&255,a.check=r(a.check,U,2,0),b=0,g=0,a.mode=2;break}if(a.flags=0,a.head&&(a.head.done=!1),!(1&a.wrap)||(((255&b)<<8)+(b>>8))%31){e.msg=\"incorrect header check\",a.mode=30;break}if(8!=(15&b)){e.msg=\"unknown compression method\",a.mode=30;break}if(g-=4,R=8+(15&(b>>>=4)),0===a.wbits)a.wbits=R;else if(R>a.wbits){e.msg=\"invalid window size\",a.mode=30;break}a.dmax=1<>8&1),512&a.flags&&(U[0]=255&b,U[1]=b>>>8&255,a.check=r(a.check,U,2,0)),b=0,g=0,a.mode=3;case 3:for(;g<32;){if(0===u)break e;u--,b+=h[_++]<>>8&255,U[2]=b>>>16&255,U[3]=b>>>24&255,a.check=r(a.check,U,4,0)),b=0,g=0,a.mode=4;case 4:for(;g<16;){if(0===u)break e;u--,b+=h[_++]<>8),512&a.flags&&(U[0]=255&b,U[1]=b>>>8&255,a.check=r(a.check,U,2,0)),b=0,g=0,a.mode=5;case 5:if(1024&a.flags){for(;g<16;){if(0===u)break e;u--,b+=h[_++]<>>8&255,a.check=r(a.check,U,2,0)),b=0,g=0}else a.head&&(a.head.extra=null);a.mode=6;case 6:if(1024&a.flags&&((k=a.length)>u&&(k=u),k&&(a.head&&(R=a.head.extra_len-a.length,a.head.extra||(a.head.extra=new Array(a.head.extra_len)),n.arraySet(a.head.extra,h,_,k,R)),512&a.flags&&(a.check=r(a.check,h,k,_)),u-=k,_+=k,a.length-=k),a.length))break e;a.length=0,a.mode=7;case 7:if(2048&a.flags){if(0===u)break e;k=0;do{R=h[_+k++],a.head&&R&&a.length<65536&&(a.head.name+=String.fromCharCode(R))}while(R&&k>9&1,a.head.done=!0),e.adler=a.check=0,a.mode=12;break;case 10:for(;g<32;){if(0===u)break e;u--,b+=h[_++]<>>=7&g,g-=7&g,a.mode=27;break}for(;g<3;){if(0===u)break e;u--,b+=h[_++]<>>=1)){case 0:a.mode=14;break;case 1:if(m(a),a.mode=20,6===t){b>>>=2,g-=2;break e}break;case 2:a.mode=17;break;case 3:e.msg=\"invalid block type\",a.mode=30}b>>>=2,g-=2;break;case 14:for(b>>>=7&g,g-=7&g;g<32;){if(0===u)break e;u--,b+=h[_++]<>>16^65535)){e.msg=\"invalid stored block lengths\",a.mode=30;break}if(a.length=65535&b,b=0,g=0,a.mode=15,6===t)break e;case 15:a.mode=16;case 16:if(k=a.length){if(k>u&&(k=u),k>c&&(k=c),0===k)break e;n.arraySet(d,h,_,k,f),u-=k,_+=k,c-=k,f+=k,a.length-=k;break}a.mode=12;break;case 17:for(;g<14;){if(0===u)break e;u--,b+=h[_++]<>>=5,g-=5,a.ndist=1+(31&b),b>>>=5,g-=5,a.ncode=4+(15&b),b>>>=4,g-=4,a.nlen>286||a.ndist>30){e.msg=\"too many length or distance symbols\",a.mode=30;break}a.have=0,a.mode=18;case 18:for(;a.have>>=3,g-=3}for(;a.have<19;)a.lens[I[a.have++]]=0;if(a.lencode=a.lendyn,a.lenbits=7,T={bits:a.lenbits},B=l(0,a.lens,0,19,a.lencode,0,a.work,T),a.lenbits=T.bits,B){e.msg=\"invalid code lengths set\",a.mode=30;break}a.have=0,a.mode=19;case 19:for(;a.have>>16&255,E=65535&D,!((z=D>>>24)<=g);){if(0===u)break e;u--,b+=h[_++]<>>=z,g-=z,a.lens[a.have++]=E;else{if(16===E){for(N=z+2;g>>=z,g-=z,0===a.have){e.msg=\"invalid bit length repeat\",a.mode=30;break}R=a.lens[a.have-1],k=3+(3&b),b>>>=2,g-=2}else if(17===E){for(N=z+3;g>>=z)),b>>>=3,g-=3}else{for(N=z+7;g>>=z)),b>>>=7,g-=7}if(a.have+k>a.nlen+a.ndist){e.msg=\"invalid bit length repeat\",a.mode=30;break}for(;k--;)a.lens[a.have++]=R}}if(30===a.mode)break;if(0===a.lens[256]){e.msg=\"invalid code -- missing end-of-block\",a.mode=30;break}if(a.lenbits=9,T={bits:a.lenbits},B=l(1,a.lens,0,a.nlen,a.lencode,0,a.work,T),a.lenbits=T.bits,B){e.msg=\"invalid literal/lengths set\",a.mode=30;break}if(a.distbits=6,a.distcode=a.distdyn,T={bits:a.distbits},B=l(2,a.lens,a.nlen,a.ndist,a.distcode,0,a.work,T),a.distbits=T.bits,B){e.msg=\"invalid distances set\",a.mode=30;break}if(a.mode=20,6===t)break e;case 20:a.mode=21;case 21:if(u>=6&&c>=258){e.next_out=f,e.avail_out=c,e.next_in=_,e.avail_in=u,a.hold=b,a.bits=g,s(e,v),f=e.next_out,d=e.output,c=e.avail_out,_=e.next_in,h=e.input,u=e.avail_in,b=a.hold,g=a.bits,12===a.mode&&(a.back=-1);break}for(a.back=0;S=(D=a.lencode[b&(1<>>16&255,E=65535&D,!((z=D>>>24)<=g);){if(0===u)break e;u--,b+=h[_++]<>A)])>>>16&255,E=65535&D,!(A+(z=D>>>24)<=g);){if(0===u)break e;u--,b+=h[_++]<>>=A,g-=A,a.back+=A}if(b>>>=z,g-=z,a.back+=z,a.length=E,0===S){a.mode=26;break}if(32&S){a.back=-1,a.mode=12;break}if(64&S){e.msg=\"invalid literal/length code\",a.mode=30;break}a.extra=15&S,a.mode=22;case 22:if(a.extra){for(N=a.extra;g>>=a.extra,g-=a.extra,a.back+=a.extra}a.was=a.length,a.mode=23;case 23:for(;S=(D=a.distcode[b&(1<>>16&255,E=65535&D,!((z=D>>>24)<=g);){if(0===u)break e;u--,b+=h[_++]<>A)])>>>16&255,E=65535&D,!(A+(z=D>>>24)<=g);){if(0===u)break e;u--,b+=h[_++]<>>=A,g-=A,a.back+=A}if(b>>>=z,g-=z,a.back+=z,64&S){e.msg=\"invalid distance code\",a.mode=30;break}a.offset=E,a.extra=15&S,a.mode=24;case 24:if(a.extra){for(N=a.extra;g>>=a.extra,g-=a.extra,a.back+=a.extra}if(a.offset>a.dmax){e.msg=\"invalid distance too far back\",a.mode=30;break}a.mode=25;case 25:if(0===c)break e;if(k=v-c,a.offset>k){if((k=a.offset-k)>a.whave&&a.sane){e.msg=\"invalid distance too far back\",a.mode=30;break}k>a.wnext?(k-=a.wnext,y=a.wsize-k):y=a.wnext-k,k>a.length&&(k=a.length),x=a.window}else x=d,y=f-a.offset,k=a.length;k>c&&(k=c),c-=k,a.length-=k;do{d[f++]=x[y++]}while(--k);0===a.length&&(a.mode=21);break;case 26:if(0===c)break e;d[f++]=a.length,c--,a.mode=21;break;case 27:if(a.wrap){for(;g<32;){if(0===u)break e;u--,b|=h[_++]<>>16&65535|0,s=0;0!==a;){a-=s=a>2e3?2e3:a;do{r=r+(i=i+t[n++]|0)|0}while(--s);i%=65521,r%=65521}return i|r<<16|0}},function(e,t,a){\"use strict\";var n=function(){for(var e,t=[],a=0;a<256;a++){e=a;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[a]=e}return t}();e.exports=function(e,t,a,i){var r=n,s=i+a;e^=-1;for(var l=i;l>>8^r[255&(e^t[l])];return-1^e}},function(e,t,a){\"use strict\";var n=a(2);function i(e){for(var t=e.length;--t>=0;)e[t]=0}var r=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],s=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],l=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],o=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],h=new Array(576);i(h);var d=new Array(60);i(d);var _=new Array(512);i(_);var f=new Array(256);i(f);var u=new Array(29);i(u);var c,b,g,m=new Array(30);function w(e,t,a,n,i){this.static_tree=e,this.extra_bits=t,this.extra_base=a,this.elems=n,this.max_length=i,this.has_stree=e&&e.length}function p(e,t){this.dyn_tree=e,this.max_code=0,this.stat_desc=t}function v(e){return e<256?_[e]:_[256+(e>>>7)]}function k(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function y(e,t,a){e.bi_valid>16-a?(e.bi_buf|=t<>16-e.bi_valid,e.bi_valid+=a-16):(e.bi_buf|=t<>>=1,a<<=1}while(--t>0);return a>>>1}function S(e,t,a){var n,i,r=new Array(16),s=0;for(n=1;n<=15;n++)r[n]=s=s+a[n-1]<<1;for(i=0;i<=t;i++){var l=e[2*i+1];0!==l&&(e[2*i]=z(r[l]++,l))}}function E(e){var t;for(t=0;t<286;t++)e.dyn_ltree[2*t]=0;for(t=0;t<30;t++)e.dyn_dtree[2*t]=0;for(t=0;t<19;t++)e.bl_tree[2*t]=0;e.dyn_ltree[512]=1,e.opt_len=e.static_len=0,e.last_lit=e.matches=0}function A(e){e.bi_valid>8?k(e,e.bi_buf):e.bi_valid>0&&(e.pending_buf[e.pending++]=e.bi_buf),e.bi_buf=0,e.bi_valid=0}function Z(e,t,a,n){var i=2*t,r=2*a;return e[i]>1;a>=1;a--)O(e,r,a);i=o;do{a=e.heap[1],e.heap[1]=e.heap[e.heap_len--],O(e,r,1),n=e.heap[1],e.heap[--e.heap_max]=a,e.heap[--e.heap_max]=n,r[2*i]=r[2*a]+r[2*n],e.depth[i]=(e.depth[a]>=e.depth[n]?e.depth[a]:e.depth[n])+1,r[2*a+1]=r[2*n+1]=i,e.heap[1]=i++,O(e,r,1)}while(e.heap_len>=2);e.heap[--e.heap_max]=e.heap[1],function(e,t){var a,n,i,r,s,l,o=t.dyn_tree,h=t.max_code,d=t.stat_desc.static_tree,_=t.stat_desc.has_stree,f=t.stat_desc.extra_bits,u=t.stat_desc.extra_base,c=t.stat_desc.max_length,b=0;for(r=0;r<=15;r++)e.bl_count[r]=0;for(o[2*e.heap[e.heap_max]+1]=0,a=e.heap_max+1;a<573;a++)(r=o[2*o[2*(n=e.heap[a])+1]+1]+1)>c&&(r=c,b++),o[2*n+1]=r,n>h||(e.bl_count[r]++,s=0,n>=u&&(s=f[n-u]),l=o[2*n],e.opt_len+=l*(r+s),_&&(e.static_len+=l*(d[2*n+1]+s)));if(0!==b){do{for(r=c-1;0===e.bl_count[r];)r--;e.bl_count[r]--,e.bl_count[r+1]+=2,e.bl_count[c]--,b-=2}while(b>0);for(r=c;0!==r;r--)for(n=e.bl_count[r];0!==n;)(i=e.heap[--a])>h||(o[2*i+1]!==r&&(e.opt_len+=(r-o[2*i+1])*o[2*i],o[2*i+1]=r),n--)}}(e,t),S(r,h,e.bl_count)}function T(e,t,a){var n,i,r=-1,s=t[1],l=0,o=7,h=4;for(0===s&&(o=138,h=3),t[2*(a+1)+1]=65535,n=0;n<=a;n++)i=s,s=t[2*(n+1)+1],++l>=7;n<30;n++)for(m[n]=i<<7,e=0;e<1<0?(2===e.strm.data_type&&(e.strm.data_type=function(e){var t,a=4093624447;for(t=0;t<=31;t++,a>>>=1)if(1&a&&0!==e.dyn_ltree[2*t])return 0;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return 1;for(t=32;t<256;t++)if(0!==e.dyn_ltree[2*t])return 1;return 0}(e)),B(e,e.l_desc),B(e,e.d_desc),s=function(e){var t;for(T(e,e.dyn_ltree,e.l_desc.max_code),T(e,e.dyn_dtree,e.d_desc.max_code),B(e,e.bl_desc),t=18;t>=3&&0===e.bl_tree[2*o[t]+1];t--);return e.opt_len+=3*(t+1)+5+5+4,t}(e),i=e.opt_len+3+7>>>3,(r=e.static_len+3+7>>>3)<=i&&(i=r)):i=r=a+5,a+4<=i&&-1!==t?U(e,t,a,n):4===e.strategy||r===i?(y(e,2+(n?1:0),3),R(e,h,d)):(y(e,4+(n?1:0),3),function(e,t,a,n){var i;for(y(e,t-257,5),y(e,a-1,5),y(e,n-4,4),i=0;i>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&a,e.last_lit++,0===t?e.dyn_ltree[2*a]++:(e.matches++,t--,e.dyn_ltree[2*(f[a]+256+1)]++,e.dyn_dtree[2*v(t)]++),e.last_lit===e.lit_bufsize-1},t._tr_align=function(e){y(e,2,3),x(e,256,h),function(e){16===e.bi_valid?(k(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):e.bi_valid>=8&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}(e)}},function(e,t,a){\"use strict\";e.exports=function(e,t){var a,n,i,r,s,l,o,h,d,_,f,u,c,b,g,m,w,p,v,k,y,x,z,S,E;a=e.state,n=e.next_in,S=e.input,i=n+(e.avail_in-5),r=e.next_out,E=e.output,s=r-(t-e.avail_out),l=r+(e.avail_out-257),o=a.dmax,h=a.wsize,d=a.whave,_=a.wnext,f=a.window,u=a.hold,c=a.bits,b=a.lencode,g=a.distcode,m=(1<>>=v=p>>>24,c-=v,0===(v=p>>>16&255))E[r++]=65535&p;else{if(!(16&v)){if(0==(64&v)){p=b[(65535&p)+(u&(1<>>=v,c-=v),c<15&&(u+=S[n++]<>>=v=p>>>24,c-=v,!(16&(v=p>>>16&255))){if(0==(64&v)){p=g[(65535&p)+(u&(1<o){e.msg=\"invalid distance too far back\",a.mode=30;break e}if(u>>>=v,c-=v,y>(v=r-s)){if((v=y-v)>d&&a.sane){e.msg=\"invalid distance too far back\",a.mode=30;break e}if(x=0,z=f,0===_){if(x+=h-v,v2;)E[r++]=z[x++],E[r++]=z[x++],E[r++]=z[x++],k-=3;k&&(E[r++]=z[x++],k>1&&(E[r++]=z[x++]))}else{x=r-y;do{E[r++]=E[x++],E[r++]=E[x++],E[r++]=E[x++],k-=3}while(k>2);k&&(E[r++]=E[x++],k>1&&(E[r++]=E[x++]))}break}}break}}while(n>3,u&=(1<<(c-=k<<3))-1,e.next_in=n,e.next_out=r,e.avail_in=n=1&&0===U[E];E--);if(A>E&&(A=E),0===E)return h[d++]=20971520,h[d++]=20971520,f.bits=1,0;for(S=1;S0&&(0===e||1!==E))return-1;for(I[1]=0,x=1;x<15;x++)I[x+1]=I[x]+U[x];for(z=0;z852||2===e&&B>592)return 1;for(;;){p=x-O,_[z]w?(v=F[L+_[z]],k=N[D+_[z]]):(v=96,k=0),u=1<>O)+(c-=u)]=p<<24|v<<16|k|0}while(0!==c);for(u=1<>=1;if(0!==u?(T&=u-1,T+=u):T=0,z++,0==--U[x]){if(x===E)break;x=t[a+_[z]]}if(x>A&&(T&g)!==b){for(0===O&&(O=A),m+=S,R=1<<(Z=x-O);Z+O852||2===e&&B>592)return 1;h[b=T&g]=A<<24|Z<<16|m-d|0}}return 0!==T&&(h[m+T]=x-O<<24|64<<16|0),f.bits=A,0}},function(e,t,a){\"use strict\";a.r(t);var n=a(3),i=a.n(n),r=a(4),s=a(5),l=a(1),o=a.n(l),h=a(0);function d(e,t){var a=this;this.inflatedReady=e,this.deflatedReady=t,this._inflate=function(e){var t=new i.a,a=Object(s.inflateInit2)(t,15);if(a!==h.Z_OK)throw new Error(\"Problem initializing inflate stream: \"+o.a[a]);return function(a){if(void 0===a)return e();var n,i,r;t.input=a,t.next_in=0,t.avail_in=t.input.length;var l=!0;do{if(0===t.avail_out&&(t.output=new Uint8Array(16384),n=t.next_out=0,t.avail_out=16384),(i=Object(s.inflate)(t,h.Z_NO_FLUSH))!==h.Z_STREAM_END&&i!==h.Z_OK)throw new Error(\"inflate problem: \"+o.a[i]);t.next_out&&(0!==t.avail_out&&i!==h.Z_STREAM_END||(r=t.output.subarray(n,n=t.next_out),l=e(r)))}while(t.avail_in>0&&i!==h.Z_STREAM_END);return t.next_out>n&&(r=t.output.subarray(n,n=t.next_out),l=e(r)),l}}((function(e){return a.inflatedReady(e.buffer.slice(e.byteOffset,e.byteOffset+e.length))})),this._deflate=function(e){var t=new i.a,a=Object(r.deflateInit2)(t,h.Z_DEFAULT_COMPRESSION,h.Z_DEFLATED,15,8,h.Z_DEFAULT_STRATEGY);if(a!==h.Z_OK)throw new Error(\"Problem initializing deflate stream: \"+o.a[a]);return function(a){if(void 0===a)return e();var n,i,s;t.input=a,t.next_in=0,t.avail_in=t.input.length;var l=!0;do{if(0===t.avail_out&&(t.output=new Uint8Array(16384),s=t.next_out=0,t.avail_out=16384),(n=Object(r.deflate)(t,h.Z_SYNC_FLUSH))!==h.Z_STREAM_END&&n!==h.Z_OK)throw new Error(\"Deflate problem: \"+o.a[n]);0===t.avail_out&&t.next_out>s&&(i=t.output.subarray(s,s=t.next_out),l=e(i))}while((t.avail_in>0||0===t.avail_out)&&n!==h.Z_STREAM_END);return t.next_out>s&&(i=t.output.subarray(s,s=t.next_out),l=e(i)),l}}((function(e){return a.deflatedReady(e.buffer.slice(e.byteOffset,e.byteOffset+e.length))}))}d.prototype.inflate=function(e){this._inflate(new Uint8Array(e))},d.prototype.deflate=function(e){this._deflate(new Uint8Array(e))};var _=function(e,t){return{message:e,buffer:t}},f=new d((function(e){return self.postMessage(_(\"inflated_ready\",e),[e])}),(function(e){return self.postMessage(_(\"deflated_ready\",e),[e])}));self.onmessage=function(e){var t=e.data.message,a=e.data.buffer;switch(t){case\"start\":break;case\"inflate\":f.inflate(a);break;case\"deflate\":f.deflate(a)}}}]);"; // +// constants used for communication with the worker +// + +const MESSAGE_INITIALIZE_WORKER = 'start'; +const MESSAGE_INFLATE = 'inflate'; +const MESSAGE_INFLATED_DATA_READY = 'inflated_ready'; +const MESSAGE_DEFLATE = 'deflate'; +const MESSAGE_DEFLATED_DATA_READY = 'deflated_ready'; +const EOL = '\r\n'; +const LINE_FEED = 10; +const CARRIAGE_RETURN = 13; +const LEFT_CURLY_BRACKET = 123; +const RIGHT_CURLY_BRACKET = 125; +const ASCII_PLUS = 43; // State tracking when constructing an IMAP command from buffers. + +const BUFFER_STATE_LITERAL = 'literal'; +const BUFFER_STATE_POSSIBLY_LITERAL_LENGTH_1 = 'literal_length_1'; +const BUFFER_STATE_POSSIBLY_LITERAL_LENGTH_2 = 'literal_length_2'; +const BUFFER_STATE_DEFAULT = 'default'; +/** + * How much time to wait since the last response until the connection is considered idling + */ + +const TIMEOUT_ENTER_IDLE = 1000; +/** + * Lower Bound for socket timeout to wait since the last data was written to a socket + */ + +const TIMEOUT_SOCKET_LOWER_BOUND = 10000; +/** + * Multiplier for socket timeout: + * + * We assume at least a GPRS connection with 115 kb/s = 14,375 kB/s tops, so 10 KB/s to be on + * the safe side. We can timeout after a lower bound of 10s + (n KB / 10 KB/s). A 1 MB message + * upload would be 110 seconds to wait for the timeout. 10 KB/s === 0.1 s/B + */ + +const TIMEOUT_SOCKET_MULTIPLIER = 0.1; +/** + * Creates a connection object to an IMAP server. Call `connect` method to inititate + * the actual connection, the constructor only defines the properties but does not actually connect. + * + * @constructor + * + * @param {String} [host='localhost'] Hostname to conenct to + * @param {Number} [port=143] Port number to connect to + * @param {Object} [options] Optional options object + * @param {Boolean} [options.useSecureTransport] Set to true, to use encrypted connection + * @param {String} [options.compressionWorkerPath] offloads de-/compression computation to a web worker, this is the path to the browserified emailjs-compressor-worker.js + */ + +class Imap { + constructor(host, port, options = {}) { + this.timeoutEnterIdle = TIMEOUT_ENTER_IDLE; + this.timeoutSocketLowerBound = TIMEOUT_SOCKET_LOWER_BOUND; + this.timeoutSocketMultiplier = TIMEOUT_SOCKET_MULTIPLIER; + this.options = options; + this.port = port || (this.options.useSecureTransport ? 993 : 143); + this.host = host || 'localhost'; // Use a TLS connection. Port 993 also forces TLS. + + this.options.useSecureTransport = 'useSecureTransport' in this.options ? !!this.options.useSecureTransport : this.port === 993; + this.secureMode = !!this.options.useSecureTransport; // Does the connection use SSL/TLS + + this._connectionReady = false; // Is the conection established and greeting is received from the server + + this._globalAcceptUntagged = {}; // Global handlers for unrelated responses (EXPUNGE, EXISTS etc.) + + this._clientQueue = []; // Queue of outgoing commands + + this._canSend = false; // Is it OK to send something to the server + + this._tagCounter = 0; // Counter to allow uniqueue imap tags + + this._currentCommand = false; // Current command that is waiting for response from the server + + this._idleTimer = false; // Timer waiting to enter idle + + this._socketTimeoutTimer = false; // Timer waiting to declare the socket dead starting from the last write + + this.compressed = false; // Is the connection compressed and needs inflating/deflating + // + // HELPERS + // + // As the server sends data in chunks, it needs to be split into separate lines. Helps parsing the input. + + this._incomingBuffers = []; + this._bufferState = BUFFER_STATE_DEFAULT; + this._literalRemaining = 0; // + // Event placeholders, may be overriden with callback functions + // + + this.oncert = null; + this.onerror = null; // Irrecoverable error occurred. Connection to the server will be closed automatically. + + this.onready = null; // The connection to the server has been established and greeting is received + + this.onidle = null; // There are no more commands to process + } // PUBLIC METHODS + + /** + * Initiate a connection to the server. Wait for onready event + * + * @param {Object} Socket + * TESTING ONLY! The TCPSocket has a pretty nonsensical convenience constructor, + * which makes it hard to mock. For dependency-injection purposes, we use the + * Socket parameter to pass in a mock Socket implementation. Should be left blank + * in production use! + * @returns {Promise} Resolves when socket is opened + */ + + + connect(Socket = _emailjsTcpSocket.default) { + return new Promise((resolve, reject) => { + this.socket = Socket.open(this.host, this.port, { + binaryType: 'arraybuffer', + useSecureTransport: this.secureMode, + ca: this.options.ca + }); // allows certificate handling for platform w/o native tls support + // oncert is non standard so setting it might throw if the socket object is immutable + + try { + this.socket.oncert = cert => { + this.oncert && this.oncert(cert); + }; + } catch (E) {} // Connection closing unexpected is an error + + + this.socket.onclose = () => this._onError(new Error('Socket closed unexpectedly!')); + + this.socket.ondata = evt => { + try { + this._onData(evt); + } catch (err) { + this._onError(err); + } + }; // if an error happens during create time, reject the promise + + + this.socket.onerror = e => { + reject(new Error('Could not open socket: ' + e.data.message)); + }; + + this.socket.onopen = () => { + // use proper "irrecoverable error, tear down everything"-handler only after socket is open + this.socket.onerror = e => this._onError(e); + + resolve(); + }; + }); + } + /** + * Closes the connection to the server + * + * @returns {Promise} Resolves when the socket is closed + */ + + + close(error) { + return new Promise(resolve => { + var tearDown = () => { + // fulfill pending promises + this._clientQueue.forEach(cmd => cmd.callback(error)); + + if (this._currentCommand) { + this._currentCommand.callback(error); + } + + this._clientQueue = []; + this._currentCommand = false; + clearTimeout(this._idleTimer); + this._idleTimer = null; + clearTimeout(this._socketTimeoutTimer); + this._socketTimeoutTimer = null; + + if (this.socket) { + // remove all listeners + this.socket.onopen = null; + this.socket.onclose = null; + this.socket.ondata = null; + this.socket.onerror = null; + + try { + this.socket.oncert = null; + } catch (E) {} + + this.socket = null; + } + + resolve(); + }; + + this._disableCompression(); + + if (!this.socket || this.socket.readyState !== 'open') { + return tearDown(); + } + + this.socket.onclose = this.socket.onerror = tearDown; // we don't really care about the error here + + this.socket.close(); + }); + } + /** + * Send LOGOUT to the server. + * + * Use is discouraged! + * + * @returns {Promise} Resolves when connection is closed by server. + */ + + + logout() { + return new Promise((resolve, reject) => { + this.socket.onclose = this.socket.onerror = () => { + this.close('Client logging out').then(resolve).catch(reject); + }; + + this.enqueueCommand('LOGOUT'); + }); + } + /** + * Initiates TLS handshake + */ + + + upgrade() { + this.secureMode = true; + this.socket.upgradeToSecure(); + } + /** + * Schedules a command to be sent to the server. + * See https://github.com/emailjs/emailjs-imap-handler for request structure. + * Do not provide a tag property, it will be set by the queue manager. + * + * To catch untagged responses use acceptUntagged property. For example, if + * the value for it is 'FETCH' then the reponse includes 'payload.FETCH' property + * that is an array including all listed * FETCH responses. + * + * @param {Object} request Structured request object + * @param {Array} acceptUntagged a list of untagged responses that will be included in 'payload' property + * @param {Object} [options] Optional data for the command payload + * @returns {Promise} Promise that resolves when the corresponding response was received + */ + + + enqueueCommand(request, acceptUntagged, options) { + if (typeof request === 'string') { + request = { + command: request + }; + } + + acceptUntagged = [].concat(acceptUntagged || []).map(untagged => (untagged || '').toString().toUpperCase().trim()); + var tag = 'W' + ++this._tagCounter; + request.tag = tag; + return new Promise((resolve, reject) => { + var data = { + tag: tag, + request: request, + payload: acceptUntagged.length ? {} : undefined, + callback: response => { + if (this.isError(response)) { + return reject(response); + } else if (['NO', 'BAD'].indexOf((0, _ramda.propOr)('', 'command', response).toUpperCase().trim()) >= 0) { + var error = new Error(response.humanReadable || 'Error'); + + if (response.code) { + error.code = response.code; + } + + return reject(error); + } + + resolve(response); + } + }; // apply any additional options to the command + + Object.keys(options || {}).forEach(key => { + data[key] = options[key]; + }); + acceptUntagged.forEach(command => { + data.payload[command] = []; + }); // if we're in priority mode (i.e. we ran commands in a precheck), + // queue any commands BEFORE the command that contianed the precheck, + // otherwise just queue command as usual + + var index = data.ctx ? this._clientQueue.indexOf(data.ctx) : -1; + + if (index >= 0) { + data.tag += '.p'; + data.request.tag += '.p'; + + this._clientQueue.splice(index, 0, data); + } else { + this._clientQueue.push(data); + } + + if (this._canSend) { + this._sendRequest(); + } + }); + } + /** + * + * @param commands + * @param ctx + * @returns {*} + */ + + + getPreviouslyQueued(commands, ctx) { + const startIndex = this._clientQueue.indexOf(ctx) - 1; // search backwards for the commands and return the first found + + for (let i = startIndex; i >= 0; i--) { + if (isMatch(this._clientQueue[i])) { + return this._clientQueue[i]; + } + } // also check current command if no SELECT is queued + + + if (isMatch(this._currentCommand)) { + return this._currentCommand; + } + + return false; + + function isMatch(data) { + return data && data.request && commands.indexOf(data.request.command) >= 0; + } + } + /** + * Send data to the TCP socket + * Arms a timeout waiting for a response from the server. + * + * @param {String} str Payload + */ + + + send(str) { + const buffer = (0, _common.toTypedArray)(str).buffer; + const timeout = this.timeoutSocketLowerBound + Math.floor(buffer.byteLength * this.timeoutSocketMultiplier); + clearTimeout(this._socketTimeoutTimer); // clear pending timeouts + + this._socketTimeoutTimer = setTimeout(() => this._onError(new Error(' Socket timed out!')), timeout); // arm the next timeout + + if (this.compressed) { + this._sendCompressed(buffer); + } else { + if (!this.socket) { + this._onError(new Error('Error :: Unexpected socket close')); + } else { + this.socket.send(buffer); + } + } + } + /** + * Set a global handler for an untagged response. If currently processed command + * has not listed untagged command it is forwarded to the global handler. Useful + * with EXPUNGE, EXISTS etc. + * + * @param {String} command Untagged command name + * @param {Function} callback Callback function with response object and continue callback function + */ + + + setHandler(command, callback) { + this._globalAcceptUntagged[command.toUpperCase().trim()] = callback; + } // INTERNAL EVENTS + + /** + * Error handler for the socket + * + * @event + * @param {Event} evt Event object. See evt.data for the error + */ + + + _onError(evt) { + var error; + + if (this.isError(evt)) { + error = evt; + } else if (evt && this.isError(evt.data)) { + error = evt.data; + } else { + error = new Error(evt && evt.data && evt.data.message || evt.data || evt || 'Error'); + } + + this.logger.error(error); // always call onerror callback, no matter if close() succeeds or fails + + this.close(error).then(() => { + this.onerror && this.onerror(error); + }, () => { + this.onerror && this.onerror(error); + }); + } + /** + * Handler for incoming data from the server. The data is sent in arbitrary + * chunks and can't be used directly so this function makes sure the data + * is split into complete lines before the data is passed to the command + * handler + * + * @param {Event} evt + */ + + + _onData(evt) { + clearTimeout(this._socketTimeoutTimer); // reset the timeout on each data packet + + const timeout = this.timeoutSocketLowerBound + Math.floor(4096 * this.timeoutSocketMultiplier); // max packet size is 4096 bytes + + this._socketTimeoutTimer = setTimeout(() => this._onError(new Error(' Socket timed out!')), timeout); + + this._incomingBuffers.push(new Uint8Array(evt.data)); // append to the incoming buffer + + + this._parseIncomingCommands(this._iterateIncomingBuffer()); // Consume the incoming buffer + + } + + *_iterateIncomingBuffer() { + let buf = this._incomingBuffers[this._incomingBuffers.length - 1] || []; + let i = 0; // loop invariant: + // this._incomingBuffers starts with the beginning of incoming command. + // buf is shorthand for last element of this._incomingBuffers. + // buf[0..i-1] is part of incoming command. + + while (i < buf.length) { + switch (this._bufferState) { + case BUFFER_STATE_LITERAL: + const diff = Math.min(buf.length - i, this._literalRemaining); + this._literalRemaining -= diff; + i += diff; + + if (this._literalRemaining === 0) { + this._bufferState = BUFFER_STATE_DEFAULT; + } + + continue; + + case BUFFER_STATE_POSSIBLY_LITERAL_LENGTH_2: + if (i < buf.length) { + if (buf[i] === CARRIAGE_RETURN) { + this._literalRemaining = Number((0, _common.fromTypedArray)(this._lengthBuffer)) + 2; // for CRLF + + this._bufferState = BUFFER_STATE_LITERAL; + } else { + this._bufferState = BUFFER_STATE_DEFAULT; + } + + delete this._lengthBuffer; + } + + continue; + + case BUFFER_STATE_POSSIBLY_LITERAL_LENGTH_1: + const start = i; + + while (i < buf.length && buf[i] >= 48 && buf[i] <= 57) { + // digits + i++; + } + + if (start !== i) { + const latest = buf.subarray(start, i); + const prevBuf = this._lengthBuffer; + this._lengthBuffer = new Uint8Array(prevBuf.length + latest.length); + + this._lengthBuffer.set(prevBuf); + + this._lengthBuffer.set(latest, prevBuf.length); + } + + if (i < buf.length) { + if (this._lengthBuffer.length > 0 && buf[i] === RIGHT_CURLY_BRACKET) { + this._bufferState = BUFFER_STATE_POSSIBLY_LITERAL_LENGTH_2; + } else { + delete this._lengthBuffer; + this._bufferState = BUFFER_STATE_DEFAULT; + } + + i++; + } + + continue; + + default: + // find literal length + const leftIdx = buf.indexOf(LEFT_CURLY_BRACKET, i); + + if (leftIdx > -1) { + const leftOfLeftCurly = new Uint8Array(buf.buffer, i, leftIdx - i); + + if (leftOfLeftCurly.indexOf(LINE_FEED) === -1) { + i = leftIdx + 1; + this._lengthBuffer = new Uint8Array(0); + this._bufferState = BUFFER_STATE_POSSIBLY_LITERAL_LENGTH_1; + continue; + } + } // find end of command + + + const LFidx = buf.indexOf(LINE_FEED, i); + + if (LFidx > -1) { + if (LFidx < buf.length - 1) { + this._incomingBuffers[this._incomingBuffers.length - 1] = new Uint8Array(buf.buffer, 0, LFidx + 1); + } + + const commandLength = this._incomingBuffers.reduce((prev, curr) => prev + curr.length, 0) - 2; // 2 for CRLF + + const command = new Uint8Array(commandLength); + let index = 0; + + while (this._incomingBuffers.length > 0) { + let uint8Array = this._incomingBuffers.shift(); + + const remainingLength = commandLength - index; + + if (uint8Array.length > remainingLength) { + const excessLength = uint8Array.length - remainingLength; + uint8Array = uint8Array.subarray(0, -excessLength); + + if (this._incomingBuffers.length > 0) { + this._incomingBuffers = []; + } + } + + command.set(uint8Array, index); + index += uint8Array.length; + } + + yield command; + + if (LFidx < buf.length - 1) { + buf = new Uint8Array(buf.subarray(LFidx + 1)); + + this._incomingBuffers.push(buf); + + i = 0; + } else { + // clear the timeout when an entire command has arrived + // and not waiting on more data for next command + clearTimeout(this._socketTimeoutTimer); + this._socketTimeoutTimer = null; + return; + } + } else { + return; + } + + } + } + } // PRIVATE METHODS + + /** + * Processes a command from the queue. The command is parsed and feeded to a handler + */ + + + _parseIncomingCommands(commands) { + for (var command of commands) { + this._clearIdle(); + /* + * The "+"-tagged response is a special case: + * Either the server can asks for the next chunk of data, e.g. for the AUTHENTICATE command. + * + * Or there was an error in the XOAUTH2 authentication, for which SASL initial client response extension + * dictates the client sends an empty EOL response to the challenge containing the error message. + * + * Details on "+"-tagged response: + * https://tools.ietf.org/html/rfc3501#section-2.2.1 + */ + // + + + if (command[0] === ASCII_PLUS) { + if (this._currentCommand.data.length) { + // feed the next chunk of data + var chunk = this._currentCommand.data.shift(); + + chunk += !this._currentCommand.data.length ? EOL : ''; // EOL if there's nothing more to send + + this.send(chunk); + } else if (this._currentCommand.errorResponseExpectsEmptyLine) { + this.send(EOL); // XOAUTH2 empty response, error will be reported when server continues with NO response + } + + continue; + } + + var response; + + try { + const valueAsString = this._currentCommand.request && this._currentCommand.request.valueAsString; + response = (0, _emailjsImapHandler.parser)(command, { + valueAsString + }); + this.logger.debug('S:', () => (0, _emailjsImapHandler.compiler)(response, false, true)); + } catch (e) { + this.logger.error('Error parsing imap command!', response); + return this._onError(e); + } + + this._processResponse(response); + + this._handleResponse(response); // first response from the server, connection is now usable + + + if (!this._connectionReady) { + this._connectionReady = true; + this.onready && this.onready(); + } + } + } + /** + * Feeds a parsed response object to an appropriate handler + * + * @param {Object} response Parsed command object + */ + + + _handleResponse(response) { + var command = (0, _ramda.propOr)('', 'command', response).toUpperCase().trim(); + + if (!this._currentCommand) { + // unsolicited untagged response + if (response.tag === '*' && command in this._globalAcceptUntagged) { + this._globalAcceptUntagged[command](response); + + this._canSend = true; + + this._sendRequest(); + } + } else if (this._currentCommand.payload && response.tag === '*' && command in this._currentCommand.payload) { + // expected untagged response + this._currentCommand.payload[command].push(response); + } else if (response.tag === '*' && command in this._globalAcceptUntagged) { + // unexpected untagged response + this._globalAcceptUntagged[command](response); + } else if (response.tag === this._currentCommand.tag) { + // tagged response + if (this._currentCommand.payload && Object.keys(this._currentCommand.payload).length) { + response.payload = this._currentCommand.payload; + } + + this._currentCommand.callback(response); + + this._canSend = true; + + this._sendRequest(); + } + } + /** + * Sends a command from client queue to the server. + */ + + + _sendRequest() { + if (!this._clientQueue.length) { + return this._enterIdle(); + } + + this._clearIdle(); // an operation was made in the precheck, no need to restart the queue manually + + + this._restartQueue = false; + var command = this._clientQueue[0]; + + if (typeof command.precheck === 'function') { + // remember the context + var context = command; + var precheck = context.precheck; + delete context.precheck; // we need to restart the queue handling if no operation was made in the precheck + + this._restartQueue = true; // invoke the precheck command and resume normal operation after the promise resolves + + precheck(context).then(() => { + // we're done with the precheck + if (this._restartQueue) { + // we need to restart the queue handling + this._sendRequest(); + } + }).catch(err => { + // precheck failed, so we remove the initial command + // from the queue, invoke its callback and resume normal operation + let cmd; + + const index = this._clientQueue.indexOf(context); + + if (index >= 0) { + cmd = this._clientQueue.splice(index, 1)[0]; + } + + if (cmd && cmd.callback) { + cmd.callback(err); + this._canSend = true; + + this._parseIncomingCommands(this._iterateIncomingBuffer()); // Consume the rest of the incoming buffer + + + this._sendRequest(); // continue sending + + } + }); + return; + } + + this._canSend = false; + this._currentCommand = this._clientQueue.shift(); + + try { + this._currentCommand.data = (0, _emailjsImapHandler.compiler)(this._currentCommand.request, true); + this.logger.debug('C:', () => (0, _emailjsImapHandler.compiler)(this._currentCommand.request, false, true)); // excludes passwords etc. + } catch (e) { + this.logger.error('Error compiling imap command!', this._currentCommand.request); + return this._onError(new Error('Error compiling imap command!')); + } + + var data = this._currentCommand.data.shift(); + + this.send(data + (!this._currentCommand.data.length ? EOL : '')); + return this.waitDrain; + } + /** + * Emits onidle, noting to do currently + */ + + + _enterIdle() { + clearTimeout(this._idleTimer); + this._idleTimer = setTimeout(() => this.onidle && this.onidle(), this.timeoutEnterIdle); + } + /** + * Cancel idle timer + */ + + + _clearIdle() { + clearTimeout(this._idleTimer); + this._idleTimer = null; + } + /** + * Method processes a response into an easier to handle format. + * Add untagged numbered responses (e.g. FETCH) into a nicely feasible form + * Checks if a response includes optional response codes + * and copies these into separate properties. For example the + * following response includes a capability listing and a human + * readable message: + * + * * OK [CAPABILITY ID NAMESPACE] All ready + * + * This method adds a 'capability' property with an array value ['ID', 'NAMESPACE'] + * to the response object. Additionally 'All ready' is added as 'humanReadable' property. + * + * See possiblem IMAP Response Codes at https://tools.ietf.org/html/rfc5530 + * + * @param {Object} response Parsed response object + */ + + + _processResponse(response) { + const command = (0, _ramda.propOr)('', 'command', response).toUpperCase().trim(); // no attributes + + if (!response || !response.attributes || !response.attributes.length) { + return; + } // untagged responses w/ sequence numbers + + + if (response.tag === '*' && /^\d+$/.test(response.command) && response.attributes[0].type === 'ATOM') { + response.nr = Number(response.command); + response.command = (response.attributes.shift().value || '').toString().toUpperCase().trim(); + } // no optional response code + + + if (['OK', 'NO', 'BAD', 'BYE', 'PREAUTH'].indexOf(command) < 0) { + return; + } // If last element of the response is TEXT then this is for humans + + + if (response.attributes[response.attributes.length - 1].type === 'TEXT') { + response.humanReadable = response.attributes[response.attributes.length - 1].value; + } // Parse and format ATOM values + + + if (response.attributes[0].type === 'ATOM' && response.attributes[0].section) { + const option = response.attributes[0].section.map(key => { + if (!key) { + return; + } + + if (Array.isArray(key)) { + return key.map(key => (key.value || '').toString().trim()); + } else { + return (key.value || '').toString().toUpperCase().trim(); + } + }); + const key = option.shift(); + response.code = key; + + if (option.length === 1) { + response[key.toLowerCase()] = option[0]; + } else if (option.length > 1) { + response[key.toLowerCase()] = option; + } + } + } + /** + * Checks if a value is an Error object + * + * @param {Mixed} value Value to be checked + * @return {Boolean} returns true if the value is an Error + */ + + + isError(value) { + return !!Object.prototype.toString.call(value).match(/Error\]$/); + } // COMPRESSION RELATED METHODS + + /** + * Sets up deflate/inflate for the IO + */ + + + enableCompression() { + this._socketOnData = this.socket.ondata; + this.compressed = true; + + if (typeof window !== 'undefined' && window.Worker) { + this._compressionWorker = new Worker(URL.createObjectURL(new Blob([CompressionBlob]))); + + this._compressionWorker.onmessage = e => { + var message = e.data.message; + var data = e.data.buffer; + + switch (message) { + case MESSAGE_INFLATED_DATA_READY: + this._socketOnData({ + data + }); + + break; + + case MESSAGE_DEFLATED_DATA_READY: + this.waitDrain = this.socket.send(data); + break; + } + }; + + this._compressionWorker.onerror = e => { + this._onError(new Error('Error handling compression web worker: ' + e.message)); + }; + + this._compressionWorker.postMessage(createMessage(MESSAGE_INITIALIZE_WORKER)); + } else { + const inflatedReady = buffer => { + this._socketOnData({ + data: buffer + }); + }; + + const deflatedReady = buffer => { + this.waitDrain = this.socket.send(buffer); + }; + + this._compression = new _compression.default(inflatedReady, deflatedReady); + } // override data handler, decompress incoming data + + + this.socket.ondata = evt => { + if (!this.compressed) { + return; + } + + if (this._compressionWorker) { + this._compressionWorker.postMessage(createMessage(MESSAGE_INFLATE, evt.data), [evt.data]); + } else { + this._compression.inflate(evt.data); + } + }; + } + /** + * Undoes any changes related to compression. This only be called when closing the connection + */ + + + _disableCompression() { + if (!this.compressed) { + return; + } + + this.compressed = false; + this.socket.ondata = this._socketOnData; + this._socketOnData = null; + + if (this._compressionWorker) { + // terminate the worker + this._compressionWorker.terminate(); + + this._compressionWorker = null; + } + } + /** + * Outgoing payload needs to be compressed and sent to socket + * + * @param {ArrayBuffer} buffer Outgoing uncompressed arraybuffer + */ + + + _sendCompressed(buffer) { + // deflate + if (this._compressionWorker) { + this._compressionWorker.postMessage(createMessage(MESSAGE_DEFLATE, buffer), [buffer]); + } else { + this._compression.deflate(buffer); + } + } + +} + +exports.default = Imap; + +const createMessage = (message, buffer) => ({ + message, + buffer +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbWFwLmpzIl0sIm5hbWVzIjpbIk1FU1NBR0VfSU5JVElBTElaRV9XT1JLRVIiLCJNRVNTQUdFX0lORkxBVEUiLCJNRVNTQUdFX0lORkxBVEVEX0RBVEFfUkVBRFkiLCJNRVNTQUdFX0RFRkxBVEUiLCJNRVNTQUdFX0RFRkxBVEVEX0RBVEFfUkVBRFkiLCJFT0wiLCJMSU5FX0ZFRUQiLCJDQVJSSUFHRV9SRVRVUk4iLCJMRUZUX0NVUkxZX0JSQUNLRVQiLCJSSUdIVF9DVVJMWV9CUkFDS0VUIiwiQVNDSUlfUExVUyIsIkJVRkZFUl9TVEFURV9MSVRFUkFMIiwiQlVGRkVSX1NUQVRFX1BPU1NJQkxZX0xJVEVSQUxfTEVOR1RIXzEiLCJCVUZGRVJfU1RBVEVfUE9TU0lCTFlfTElURVJBTF9MRU5HVEhfMiIsIkJVRkZFUl9TVEFURV9ERUZBVUxUIiwiVElNRU9VVF9FTlRFUl9JRExFIiwiVElNRU9VVF9TT0NLRVRfTE9XRVJfQk9VTkQiLCJUSU1FT1VUX1NPQ0tFVF9NVUxUSVBMSUVSIiwiSW1hcCIsImNvbnN0cnVjdG9yIiwiaG9zdCIsInBvcnQiLCJvcHRpb25zIiwidGltZW91dEVudGVySWRsZSIsInRpbWVvdXRTb2NrZXRMb3dlckJvdW5kIiwidGltZW91dFNvY2tldE11bHRpcGxpZXIiLCJ1c2VTZWN1cmVUcmFuc3BvcnQiLCJzZWN1cmVNb2RlIiwiX2Nvbm5lY3Rpb25SZWFkeSIsIl9nbG9iYWxBY2NlcHRVbnRhZ2dlZCIsIl9jbGllbnRRdWV1ZSIsIl9jYW5TZW5kIiwiX3RhZ0NvdW50ZXIiLCJfY3VycmVudENvbW1hbmQiLCJfaWRsZVRpbWVyIiwiX3NvY2tldFRpbWVvdXRUaW1lciIsImNvbXByZXNzZWQiLCJfaW5jb21pbmdCdWZmZXJzIiwiX2J1ZmZlclN0YXRlIiwiX2xpdGVyYWxSZW1haW5pbmciLCJvbmNlcnQiLCJvbmVycm9yIiwib25yZWFkeSIsIm9uaWRsZSIsImNvbm5lY3QiLCJTb2NrZXQiLCJUQ1BTb2NrZXQiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInNvY2tldCIsIm9wZW4iLCJiaW5hcnlUeXBlIiwiY2EiLCJjZXJ0IiwiRSIsIm9uY2xvc2UiLCJfb25FcnJvciIsIkVycm9yIiwib25kYXRhIiwiZXZ0IiwiX29uRGF0YSIsImVyciIsImUiLCJkYXRhIiwibWVzc2FnZSIsIm9ub3BlbiIsImNsb3NlIiwiZXJyb3IiLCJ0ZWFyRG93biIsImZvckVhY2giLCJjbWQiLCJjYWxsYmFjayIsImNsZWFyVGltZW91dCIsIl9kaXNhYmxlQ29tcHJlc3Npb24iLCJyZWFkeVN0YXRlIiwibG9nb3V0IiwidGhlbiIsImNhdGNoIiwiZW5xdWV1ZUNvbW1hbmQiLCJ1cGdyYWRlIiwidXBncmFkZVRvU2VjdXJlIiwicmVxdWVzdCIsImFjY2VwdFVudGFnZ2VkIiwiY29tbWFuZCIsImNvbmNhdCIsIm1hcCIsInVudGFnZ2VkIiwidG9TdHJpbmciLCJ0b1VwcGVyQ2FzZSIsInRyaW0iLCJ0YWciLCJwYXlsb2FkIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwicmVzcG9uc2UiLCJpc0Vycm9yIiwiaW5kZXhPZiIsImh1bWFuUmVhZGFibGUiLCJjb2RlIiwiT2JqZWN0Iiwia2V5cyIsImtleSIsImluZGV4IiwiY3R4Iiwic3BsaWNlIiwicHVzaCIsIl9zZW5kUmVxdWVzdCIsImdldFByZXZpb3VzbHlRdWV1ZWQiLCJjb21tYW5kcyIsInN0YXJ0SW5kZXgiLCJpIiwiaXNNYXRjaCIsInNlbmQiLCJzdHIiLCJidWZmZXIiLCJ0aW1lb3V0IiwiTWF0aCIsImZsb29yIiwiYnl0ZUxlbmd0aCIsInNldFRpbWVvdXQiLCJfc2VuZENvbXByZXNzZWQiLCJzZXRIYW5kbGVyIiwibG9nZ2VyIiwiVWludDhBcnJheSIsIl9wYXJzZUluY29taW5nQ29tbWFuZHMiLCJfaXRlcmF0ZUluY29taW5nQnVmZmVyIiwiYnVmIiwiZGlmZiIsIm1pbiIsIk51bWJlciIsIl9sZW5ndGhCdWZmZXIiLCJzdGFydCIsImxhdGVzdCIsInN1YmFycmF5IiwicHJldkJ1ZiIsInNldCIsImxlZnRJZHgiLCJsZWZ0T2ZMZWZ0Q3VybHkiLCJMRmlkeCIsImNvbW1hbmRMZW5ndGgiLCJyZWR1Y2UiLCJwcmV2IiwiY3VyciIsInVpbnQ4QXJyYXkiLCJzaGlmdCIsInJlbWFpbmluZ0xlbmd0aCIsImV4Y2Vzc0xlbmd0aCIsIl9jbGVhcklkbGUiLCJjaHVuayIsImVycm9yUmVzcG9uc2VFeHBlY3RzRW1wdHlMaW5lIiwidmFsdWVBc1N0cmluZyIsImRlYnVnIiwiX3Byb2Nlc3NSZXNwb25zZSIsIl9oYW5kbGVSZXNwb25zZSIsIl9lbnRlcklkbGUiLCJfcmVzdGFydFF1ZXVlIiwicHJlY2hlY2siLCJjb250ZXh0Iiwid2FpdERyYWluIiwiYXR0cmlidXRlcyIsInRlc3QiLCJ0eXBlIiwibnIiLCJ2YWx1ZSIsInNlY3Rpb24iLCJvcHRpb24iLCJBcnJheSIsImlzQXJyYXkiLCJ0b0xvd2VyQ2FzZSIsInByb3RvdHlwZSIsImNhbGwiLCJtYXRjaCIsImVuYWJsZUNvbXByZXNzaW9uIiwiX3NvY2tldE9uRGF0YSIsIndpbmRvdyIsIldvcmtlciIsIl9jb21wcmVzc2lvbldvcmtlciIsIlVSTCIsImNyZWF0ZU9iamVjdFVSTCIsIkJsb2IiLCJDb21wcmVzc2lvbkJsb2IiLCJvbm1lc3NhZ2UiLCJwb3N0TWVzc2FnZSIsImNyZWF0ZU1lc3NhZ2UiLCJpbmZsYXRlZFJlYWR5IiwiZGVmbGF0ZWRSZWFkeSIsIl9jb21wcmVzc2lvbiIsIkNvbXByZXNzaW9uIiwiaW5mbGF0ZSIsInRlcm1pbmF0ZSIsImRlZmxhdGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7cTF2Q0FHQTtBQUNBO0FBQ0E7O0FBQ0EsTUFBTUEseUJBQXlCLEdBQUcsT0FBbEM7QUFDQSxNQUFNQyxlQUFlLEdBQUcsU0FBeEI7QUFDQSxNQUFNQywyQkFBMkIsR0FBRyxnQkFBcEM7QUFDQSxNQUFNQyxlQUFlLEdBQUcsU0FBeEI7QUFDQSxNQUFNQywyQkFBMkIsR0FBRyxn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O0FBQVdrRCxFQUFBQTtBQUFYLENBQXRCLENBQXRCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcHJvcE9yIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgVENQU29ja2V0IGZyb20gJ2VtYWlsanMtdGNwLXNvY2tldCdcbmltcG9ydCB7IHRvVHlwZWRBcnJheSwgZnJvbVR5cGVkQXJyYXkgfSBmcm9tICcuL2NvbW1vbidcbmltcG9ydCB7IHBhcnNlciwgY29tcGlsZXIgfSBmcm9tICdlbWFpbGpzLWltYXAtaGFuZGxlcidcbmltcG9ydCBDb21wcmVzc2lvbiBmcm9tICcuL2NvbXByZXNzaW9uJ1xuaW1wb3J0IENvbXByZXNzaW9uQmxvYiBmcm9tICcuLi9yZXMvY29tcHJlc3Npb24ud29ya2VyLmJsb2InXG5cbi8vXG4vLyBjb25zdGFudHMgdXNlZCBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB3b3JrZXJcbi8vXG5jb25zdCBNRVNTQUdFX0lOSVRJQUxJWkVfV09SS0VSID0gJ3N0YXJ0J1xuY29uc3QgTUVTU0FHRV9JTkZMQVRFID0gJ2luZmxhdGUnXG5jb25zdCBNRVNTQUdFX0lORkxBVEVEX0RBVEFfUkVBRFkgPSAnaW5mbGF0ZWRfcmVhZHknXG5jb25zdCBNRVNTQUdFX0RFRkxBVEUgPSAnZGVmbGF0ZSdcbmNvbnN0IE1FU1NBR0VfREVGTEFURURfREFUQV9SRUFEWSA9ICdkZWZsYXRlZF9yZWFkeSdcblxuY29uc3QgRU9MID0gJ1xcclxcbidcbmNvbnN0IExJTkVfRkVFRCA9IDEwXG5jb25zdCBDQVJSSUFHRV9SRVRVUk4gPSAxM1xuY29uc3QgTEVGVF9DVVJMWV9CUkFDS0VUID0gMTIzXG5jb25zdCBSSUdIVF9DVVJMWV9CUkFDS0VUID0gMTI1XG5cbmNvbnN0IEFTQ0lJX1BMVVMgPSA0M1xuXG4vLyBTdGF0ZSB0cmFja2luZyB3aGVuIGNvbnN0cnVjdGluZyBhbiBJTUFQIGNvbW1hbmQgZnJvbSBidWZmZXJzLlxuY29uc3QgQlVGRkVSX1NUQVRFX0xJVEVSQUwgPSAnbGl0ZXJhbCdcbmNvbnN0IEJVRkZFUl9TVEFURV9QT1NTSUJMWV9MSVRFUkFMX0xFTkdUSF8xID0gJ2xpdGVyYWxfbGVuZ3RoXzEnXG5jb25zdCBCVUZGRVJfU1RBVEVfUE9TU0lCTFlfTElURVJBTF9MRU5HVEhfMiA9ICdsaXRlcmFsX2xlbmd0aF8yJ1xuY29uc3QgQlVGRkVSX1NUQVRFX0RFRkFVTFQgPSAnZGVmYXVsdCdcblxuLyoqXG4gKiBIb3cgbXVjaCB0aW1lIHRvIHdhaXQgc2luY2UgdGhlIGxhc3QgcmVzcG9uc2UgdW50aWwgdGhlIGNvbm5lY3Rpb24gaXMgY29uc2lkZXJlZCBpZGxpbmdcbiAqL1xuY29uc3QgVElNRU9VVF9FTlRFUl9JRExFID0gMTAwMFxuXG4vKipcbiAqIExvd2VyIEJvdW5kIGZvciBzb2NrZXQgdGltZW91dCB0byB3YWl0IHNpbmNlIHRoZSBsYXN0IGRhdGEgd2FzIHdyaXR0ZW4gdG8gYSBzb2NrZXRcbiAqL1xuY29uc3QgVElNRU9VVF9TT0NLRVRfTE9XRVJfQk9VTkQgPSAxMDAwMFxuXG4vKipcbiAqIE11bHRpcGxpZXIgZm9yIHNvY2tldCB0aW1lb3V0OlxuICpcbiAqIFdlIGFzc3VtZSBhdCBsZWFzdCBhIEdQUlMgY29ubmVjdGlvbiB3aXRoIDExNSBrYi9zID0gMTQsMzc1IGtCL3MgdG9wcywgc28gMTAgS0IvcyB0byBiZSBvblxuICogdGhlIHNhZmUgc2lkZS4gV2UgY2FuIHRpbWVvdXQgYWZ0ZXIgYSBsb3dlciBib3VuZCBvZiAxMHMgKyAobiBLQiAvIDEwIEtCL3MpLiBBIDEgTUIgbWVzc2FnZVxuICogdXBsb2FkIHdvdWxkIGJlIDExMCBzZWNvbmRzIHRvIHdhaXQgZm9yIHRoZSB0aW1lb3V0LiAxMCBLQi9zID09PSAwLjEgcy9CXG4gKi9cbmNvbnN0IFRJTUVPVVRfU09DS0VUX01VTFRJUExJRVIgPSAwLjFcblxuLyoqXG4gKiBDcmVhdGVzIGEgY29ubmVjdGlvbiBvYmplY3QgdG8gYW4gSU1BUCBzZXJ2ZXIuIENhbGwgYGNvbm5lY3RgIG1ldGhvZCB0byBpbml0aXRhdGVcbiAqIHRoZSBhY3R1YWwgY29ubmVjdGlvbiwgdGhlIGNvbnN0cnVjdG9yIG9ubHkgZGVmaW5lcyB0aGUgcHJvcGVydGllcyBidXQgZG9lcyBub3QgYWN0dWFsbHkgY29ubmVjdC5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gW2hvc3Q9J2xvY2FsaG9zdCddIEhvc3RuYW1lIHRvIGNvbmVuY3QgdG9cbiAqIEBwYXJhbSB7TnVtYmVyfSBbcG9ydD0xNDNdIFBvcnQgbnVtYmVyIHRvIGNvbm5lY3QgdG9cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gT3B0aW9uYWwgb3B0aW9ucyBvYmplY3RcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMudXNlU2VjdXJlVHJhbnNwb3J0XSBTZXQgdG8gdHJ1ZSwgdG8gdXNlIGVuY3J5cHRlZCBjb25uZWN0aW9uXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY29tcHJlc3Npb25Xb3JrZXJQYXRoXSBvZmZsb2FkcyBkZS0vY29tcHJlc3Npb24gY29tcHV0YXRpb24gdG8gYSB3ZWIgd29ya2VyLCB0aGlzIGlzIHRoZSBwYXRoIHRvIHRoZSBicm93c2VyaWZpZWQgZW1haWxqcy1jb21wcmVzc29yLXdvcmtlci5qc1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbWFwIHtcbiAgY29uc3RydWN0b3IgKGhvc3QsIHBvcnQsIG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMudGltZW91dEVudGVySWRsZSA9IFRJTUVPVVRfRU5URVJfSURMRVxuICAgIHRoaXMudGltZW91dFNvY2tldExvd2VyQm91bmQgPSBUSU1FT1VUX1NPQ0tFVF9MT1dFUl9CT1VORFxuICAgIHRoaXMudGltZW91dFNvY2tldE11bHRpcGxpZXIgPSBUSU1FT1VUX1NPQ0tFVF9NVUxUSVBMSUVSXG5cbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG5cbiAgICB0aGlzLnBvcnQgPSBwb3J0IHx8ICh0aGlzLm9wdGlvbnMudXNlU2VjdXJlVHJhbnNwb3J0ID8gOTkzIDogMTQzKVxuICAgIHRoaXMuaG9zdCA9IGhvc3QgfHwgJ2xvY2FsaG9zdCdcblxuICAgIC8vIFVzZSBhIFRMUyBjb25uZWN0aW9uLiBQb3J0IDk5MyBhbHNvIGZvcmNlcyBUTFMuXG4gICAgdGhpcy5vcHRpb25zLnVzZVNlY3VyZVRyYW5zcG9ydCA9ICd1c2VTZWN1cmVUcmFuc3BvcnQnIGluIHRoaXMub3B0aW9ucyA/ICEhdGhpcy5vcHRpb25zLnVzZVNlY3VyZVRyYW5zcG9ydCA6IHRoaXMucG9ydCA9PT0gOTkzXG5cbiAgICB0aGlzLnNlY3VyZU1vZGUgPSAhIXRoaXMub3B0aW9ucy51c2VTZWN1cmVUcmFuc3BvcnQgLy8gRG9lcyB0aGUgY29ubmVjdGlvbiB1c2UgU1NML1RMU1xuXG4gICAgdGhpcy5fY29ubmVjdGlvblJlYWR5ID0gZmFsc2UgLy8gSXMgdGhlIGNvbmVjdGlvbiBlc3RhYmxpc2hlZCBhbmQgZ3JlZXRpbmcgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyXG5cbiAgICB0aGlzLl9nbG9iYWxBY2NlcHRVbnRhZ2dlZCA9IHt9IC8vIEdsb2JhbCBoYW5kbGVycyBmb3IgdW5yZWxhdGVkIHJlc3BvbnNlcyAoRVhQVU5HRSwgRVhJU1RTIGV0Yy4pXG5cbiAgICB0aGlzLl9jbGllbnRRdWV1ZSA9IFtdIC8vIFF1ZXVlIG9mIG91dGdvaW5nIGNvbW1hbmRzXG4gICAgdGhpcy5fY2FuU2VuZCA9IGZhbHNlIC8vIElzIGl0IE9LIHRvIHNlbmQgc29tZXRoaW5nIHRvIHRoZSBzZXJ2ZXJcbiAgICB0aGlzLl90YWdDb3VudGVyID0gMCAvLyBDb3VudGVyIHRvIGFsbG93IHVuaXF1ZXVlIGltYXAgdGFnc1xuICAgIHRoaXMuX2N1cnJlbnRDb21tYW5kID0gZmFsc2UgLy8gQ3VycmVudCBjb21tYW5kIHRoYXQgaXMgd2FpdGluZyBmb3IgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyXG5cbiAgICB0aGlzLl9pZGxlVGltZXIgPSBmYWxzZSAvLyBUaW1lciB3YWl0aW5nIHRvIGVudGVyIGlkbGVcbiAgICB0aGlzLl9zb2NrZXRUaW1lb3V0VGltZXIgPSBmYWxzZSAvLyBUaW1lciB3YWl0aW5nIHRvIGRlY2xhcmUgdGhlIHNvY2tldCBkZWFkIHN0YXJ0aW5nIGZyb20gdGhlIGxhc3Qgd3JpdGVcblxuICAgIHRoaXMuY29tcHJlc3NlZCA9IGZhbHNlIC8vIElzIHRoZSBjb25uZWN0aW9uIGNvbXByZXNzZWQgYW5kIG5lZWRzIGluZmxhdGluZy9kZWZsYXRpbmdcblxuICAgIC8vXG4gICAgLy8gSEVMUEVSU1xuICAgIC8vXG5cbiAgICAvLyBBcyB0aGUgc2VydmVyIHNlbmRzIGRhdGEgaW4gY2h1bmtzLCBpdCBuZWVkcyB0byBiZSBzcGxpdCBpbnRvIHNlcGFyYXRlIGxpbmVzLiBIZWxwcyBwYXJzaW5nIHRoZSBpbnB1dC5cbiAgICB0aGlzLl9pbmNvbWluZ0J1ZmZlcnMgPSBbXVxuICAgIHRoaXMuX2J1ZmZlclN0YXRlID0gQlVGRkVSX1NUQVRFX0RFRkFVTFRcbiAgICB0aGlzLl9saXRlcmFsUmVtYWluaW5nID0gMFxuXG4gICAgLy9cbiAgICAvLyBFdmVudCBwbGFjZWhvbGRlcnMsIG1heSBiZSBvdmVycmlkZW4gd2l0aCBjYWxsYmFjayBmdW5jdGlvbnNcbiAgICAvL1xuICAgIHRoaXMub25jZXJ0ID0gbnVsbFxuICAgIHRoaXMub25lcnJvciA9IG51bGwgLy8gSXJyZWNvdmVyYWJsZSBlcnJvciBvY2N1cnJlZC4gQ29ubmVjdGlvbiB0byB0aGUgc2VydmVyIHdpbGwgYmUgY2xvc2VkIGF1dG9tYXRpY2FsbHkuXG4gICAgdGhpcy5vbnJlYWR5ID0gbnVsbCAvLyBUaGUgY29ubmVjdGlvbiB0byB0aGUgc2VydmVyIGhhcyBiZWVuIGVzdGFibGlzaGVkIGFuZCBncmVldGluZyBpcyByZWNlaXZlZFxuICAgIHRoaXMub25pZGxlID0gbnVsbCAvLyBUaGVyZSBhcmUgbm8gbW9yZSBjb21tYW5kcyB0byBwcm9jZXNzXG4gIH1cblxuICAvLyBQVUJMSUMgTUVUSE9EU1xuXG4gIC8qKlxuICAgKiBJbml0aWF0ZSBhIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlci4gV2FpdCBmb3Igb25yZWFkeSBldmVudFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gU29ja2V0XG4gICAqICAgICBURVNUSU5HIE9OTFkhIFRoZSBUQ1BTb2NrZXQgaGFzIGEgcHJldHR5IG5vbnNlbnNpY2FsIGNvbnZlbmllbmNlIGNvbnN0cnVjdG9yLFxuICAgKiAgICAgd2hpY2ggbWFrZXMgaXQgaGFyZCB0byBtb2NrLiBGb3IgZGVwZW5kZW5jeS1pbmplY3Rpb24gcHVycG9zZXMsIHdlIHVzZSB0aGVcbiAgICogICAgIFNvY2tldCBwYXJhbWV0ZXIgdG8gcGFzcyBpbiBhIG1vY2sgU29ja2V0IGltcGxlbWVudGF0aW9uLiBTaG91bGQgYmUgbGVmdCBibGFua1xuICAgKiAgICAgaW4gcHJvZHVjdGlvbiB1c2UhXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBSZXNvbHZlcyB3aGVuIHNvY2tldCBpcyBvcGVuZWRcbiAgICovXG4gIGNvbm5lY3QgKFNvY2tldCA9IFRDUFNvY2tldCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnNvY2tldCA9IFNvY2tldC5vcGVuKHRoaXMuaG9zdCwgdGhpcy5wb3J0LCB7XG4gICAgICAgIGJpbmFyeVR5cGU6ICdhcnJheWJ1ZmZlcicsXG4gICAgICAgIHVzZVNlY3VyZVRyYW5zcG9ydDogdGhpcy5zZWN1cmVNb2RlLFxuICAgICAgICBjYTogdGhpcy5vcHRpb25zLmNhXG4gICAgICB9KVxuXG4gICAgICAvLyBhbGxvd3MgY2VydGlmaWNhdGUgaGFuZGxpbmcgZm9yIHBsYXRmb3JtIHcvbyBuYXRpdmUgdGxzIHN1cHBvcnRcbiAgICAgIC8vIG9uY2VydCBpcyBub24gc3RhbmRhcmQgc28gc2V0dGluZyBpdCBtaWdodCB0aHJvdyBpZiB0aGUgc29ja2V0IG9iamVjdCBpcyBpbW11dGFibGVcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9uY2VydCA9IChjZXJ0KSA9PiB7IHRoaXMub25jZXJ0ICYmIHRoaXMub25jZXJ0KGNlcnQpIH1cbiAgICAgIH0gY2F0Y2ggKEUpIHsgfVxuXG4gICAgICAvLyBDb25uZWN0aW9uIGNsb3NpbmcgdW5leHBlY3RlZCBpcyBhbiBlcnJvclxuICAgICAgdGhpcy5zb2NrZXQub25jbG9zZSA9ICgpID0+IHRoaXMuX29uRXJyb3IobmV3IEVycm9yKCdTb2NrZXQgY2xvc2VkIHVuZXhwZWN0ZWRseSEnKSlcbiAgICAgIHRoaXMuc29ja2V0Lm9uZGF0YSA9IChldnQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLl9vbkRhdGEoZXZ0KVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aGlzLl9vbkVycm9yKGVycilcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBpZiBhbiBlcnJvciBoYXBwZW5zIGR1cmluZyBjcmVhdGUgdGltZSwgcmVqZWN0IHRoZSBwcm9taXNlXG4gICAgICB0aGlzLnNvY2tldC5vbmVycm9yID0gKGUpID0+IHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignQ291bGQgbm90IG9wZW4gc29ja2V0OiAnICsgZS5kYXRhLm1lc3NhZ2UpKVxuICAgICAgfVxuXG4gICAgICB0aGlzLnNvY2tldC5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgIC8vIHVzZSBwcm9wZXIgXCJpcnJlY292ZXJhYmxlIGVycm9yLCB0ZWFyIGRvd24gZXZlcnl0aGluZ1wiLWhhbmRsZXIgb25seSBhZnRlciBzb2NrZXQgaXMgb3BlblxuICAgICAgICB0aGlzLnNvY2tldC5vbmVycm9yID0gKGUpID0+IHRoaXMuX29uRXJyb3IoZSlcbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlclxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmVzb2x2ZXMgd2hlbiB0aGUgc29ja2V0IGlzIGNsb3NlZFxuICAgKi9cbiAgY2xvc2UgKGVycm9yKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB2YXIgdGVhckRvd24gPSAoKSA9PiB7XG4gICAgICAgIC8vIGZ1bGZpbGwgcGVuZGluZyBwcm9taXNlc1xuICAgICAgICB0aGlzLl9jbGllbnRRdWV1ZS5mb3JFYWNoKGNtZCA9PiBjbWQuY2FsbGJhY2soZXJyb3IpKVxuICAgICAgICBpZiAodGhpcy5fY3VycmVudENvbW1hbmQpIHtcbiAgICAgICAgICB0aGlzLl9jdXJyZW50Q29tbWFuZC5jYWxsYmFjayhlcnJvcilcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NsaWVudFF1ZXVlID0gW11cbiAgICAgICAgdGhpcy5fY3VycmVudENvbW1hbmQgPSBmYWxzZVxuXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9pZGxlVGltZXIpXG4gICAgICAgIHRoaXMuX2lkbGVUaW1lciA9IG51bGxcblxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fc29ja2V0VGltZW91dFRpbWVyKVxuICAgICAgICB0aGlzLl9zb2NrZXRUaW1lb3V0VGltZXIgPSBudWxsXG5cbiAgICAgICAgaWYgKHRoaXMuc29ja2V0KSB7XG4gICAgICAgICAgLy8gcmVtb3ZlIGFsbCBsaXN0ZW5lcnNcbiAgICAgICAgICB0aGlzLnNvY2tldC5vbm9wZW4gPSBudWxsXG4gICAgICAgICAgdGhpcy5zb2NrZXQub25jbG9zZSA9IG51bGxcbiAgICAgICAgICB0aGlzLnNvY2tldC5vbmRhdGEgPSBudWxsXG4gICAgICAgICAgdGhpcy5zb2NrZXQub25lcnJvciA9IG51bGxcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQub25jZXJ0ID0gbnVsbFxuICAgICAgICAgIH0gY2F0Y2ggKEUpIHsgfVxuXG4gICAgICAgICAgdGhpcy5zb2NrZXQgPSBudWxsXG4gICAgICAgIH1cblxuICAgICAgICByZXNvbHZlKClcbiAgICAgIH1cblxuICAgICAgdGhpcy5fZGlzYWJsZUNvbXByZXNzaW9uKClcblxuICAgICAgaWYgKCF0aGlzLnNvY2tldCB8fCB0aGlzLnNvY2tldC5yZWFkeVN0YXRlICE9PSAnb3BlbicpIHtcbiAgICAgICAgcmV0dXJuIHRlYXJEb3duKClcbiAgICAgIH1cblxuICAgICAgdGhpcy5zb2NrZXQub25jbG9zZSA9IHRoaXMuc29ja2V0Lm9uZXJyb3IgPSB0ZWFyRG93biAvLyB3ZSBkb24ndCByZWFsbHkgY2FyZSBhYm91dCB0aGUgZXJyb3IgaGVyZVxuICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogU2VuZCBMT0dPVVQgdG8gdGhlIHNlcnZlci5cbiAgICpcbiAgICogVXNlIGlzIGRpc2NvdXJhZ2VkIVxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmVzb2x2ZXMgd2hlbiBjb25uZWN0aW9uIGlzIGNsb3NlZCBieSBzZXJ2ZXIuXG4gICAqL1xuICBsb2dvdXQgKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnNvY2tldC5vbmNsb3NlID0gdGhpcy5zb2NrZXQub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5jbG9zZSgnQ2xpZW50IGxvZ2dpbmcgb3V0JykudGhlbihyZXNvbHZlKS5jYXRjaChyZWplY3QpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuZW5xdWV1ZUNvbW1hbmQoJ0xPR09VVCcpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWF0ZXMgVExTIGhhbmRzaGFrZVxuICAgKi9cbiAgdXBncmFkZSAoKSB7XG4gICAgdGhpcy5zZWN1cmVNb2RlID0gdHJ1ZVxuICAgIHRoaXMuc29ja2V0LnVwZ3JhZGVUb1NlY3VyZSgpXG4gIH1cblxuICAvKipcbiAgICogU2NoZWR1bGVzIGEgY29tbWFuZCB0byBiZSBzZW50IHRvIHRoZSBzZXJ2ZXIuXG4gICAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW1haWxqcy9lbWFpbGpzLWltYXAtaGFuZGxlciBmb3IgcmVxdWVzdCBzdHJ1Y3R1cmUuXG4gICAqIERvIG5vdCBwcm92aWRlIGEgdGFnIHByb3BlcnR5LCBpdCB3aWxsIGJlIHNldCBieSB0aGUgcXVldWUgbWFuYWdlci5cbiAgICpcbiAgICogVG8gY2F0Y2ggdW50YWdnZWQgcmVzcG9uc2VzIHVzZSBhY2NlcHRVbnRhZ2dlZCBwcm9wZXJ0eS4gRm9yIGV4YW1wbGUsIGlmXG4gICAqIHRoZSB2YWx1ZSBmb3IgaXQgaXMgJ0ZFVENIJyB0aGVuIHRoZSByZXBvbnNlIGluY2x1ZGVzICdwYXlsb2FkLkZFVENIJyBwcm9wZXJ0eVxuICAgKiB0aGF0IGlzIGFuIGFycmF5IGluY2x1ZGluZyBhbGwgbGlzdGVkICogRkVUQ0ggcmVzcG9uc2VzLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcmVxdWVzdCBTdHJ1Y3R1cmVkIHJlcXVlc3Qgb2JqZWN0XG4gICAqIEBwYXJhbSB7QXJyYXl9IGFjY2VwdFVudGFnZ2VkIGEgbGlzdCBvZiB1bnRhZ2dlZCByZXNwb25zZXMgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIGluICdwYXlsb2FkJyBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIE9wdGlvbmFsIGRhdGEgZm9yIHRoZSBjb21tYW5kIHBheWxvYWRcbiAgICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlIHdhcyByZWNlaXZlZFxuICAgKi9cbiAgZW5xdWV1ZUNvbW1hbmQgKHJlcXVlc3QsIGFjY2VwdFVudGFnZ2VkLCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiByZXF1ZXN0ID09PSAnc3RyaW5nJykge1xuICAgICAgcmVxdWVzdCA9IHtcbiAgICAgICAgY29tbWFuZDogcmVxdWVzdFxuICAgICAgfVxuICAgIH1cblxuICAgIGFjY2VwdFVudGFnZ2VkID0gW10uY29uY2F0KGFjY2VwdFVudGFnZ2VkIHx8IFtdKS5tYXAoKHVudGFnZ2VkKSA9PiAodW50YWdnZWQgfHwgJycpLnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKS50cmltKCkpXG5cbiAgICB2YXIgdGFnID0gJ1cnICsgKCsrdGhpcy5fdGFnQ291bnRlcilcbiAgICByZXF1ZXN0LnRhZyA9IHRhZ1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHZhciBkYXRhID0ge1xuICAgICAgICB0YWc6IHRhZyxcbiAgICAgICAgcmVxdWVzdDogcmVxdWVzdCxcbiAgICAgICAgcGF5bG9hZDogYWNjZXB0VW50YWdnZWQubGVuZ3RoID8ge30gOiB1bmRlZmluZWQsXG4gICAgICAgIGNhbGxiYWNrOiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc0Vycm9yKHJlc3BvbnNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlamVjdChyZXNwb25zZSlcbiAgICAgICAgICB9IGVsc2UgaWYgKFsnTk8nLCAnQkFEJ10uaW5kZXhPZihwcm9wT3IoJycsICdjb21tYW5kJywgcmVzcG9uc2UpLnRvVXBwZXJDYXNlKCkudHJpbSgpKSA+PSAwKSB7XG4gICAgICAgICAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IocmVzcG9uc2UuaHVtYW5SZWFkYWJsZSB8fCAnRXJyb3InKVxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmNvZGUpIHtcbiAgICAgICAgICAgICAgZXJyb3IuY29kZSA9IHJlc3BvbnNlLmNvZGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZWplY3QoZXJyb3IpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBhcHBseSBhbnkgYWRkaXRpb25hbCBvcHRpb25zIHRvIHRoZSBjb21tYW5kXG4gICAgICBPYmplY3Qua2V5cyhvcHRpb25zIHx8IHt9KS5mb3JFYWNoKChrZXkpID0+IHsgZGF0YVtrZXldID0gb3B0aW9uc1trZXldIH0pXG5cbiAgICAgIGFjY2VwdFVudGFnZ2VkLmZvckVhY2goKGNvbW1hbmQpID0+IHsgZGF0YS5wYXlsb2FkW2NvbW1hbmRdID0gW10gfSlcblxuICAgICAgLy8gaWYgd2UncmUgaW4gcHJpb3JpdHkgbW9kZSAoaS5lLiB3ZSByYW4gY29tbWFuZHMgaW4gYSBwcmVjaGVjayksXG4gICAgICAvLyBxdWV1ZSBhbnkgY29tbWFuZHMgQkVGT1JFIHRoZSBjb21tYW5kIHRoYXQgY29udGlhbmVkIHRoZSBwcmVjaGVjayxcbiAgICAgIC8vIG90aGVyd2lzZSBqdXN0IHF1ZXVlIGNvbW1hbmQgYXMgdXN1YWxcbiAgICAgIHZhciBpbmRleCA9IGRhdGEuY3R4ID8gdGhpcy5fY2xpZW50UXVldWUuaW5kZXhPZihkYXRhLmN0eCkgOiAtMVxuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgZGF0YS50YWcgKz0gJy5wJ1xuICAgICAgICBkYXRhLnJlcXVlc3QudGFnICs9ICcucCdcbiAgICAgICAgdGhpcy5fY2xpZW50UXVldWUuc3BsaWNlKGluZGV4LCAwLCBkYXRhKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fY2xpZW50UXVldWUucHVzaChkYXRhKVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fY2FuU2VuZCkge1xuICAgICAgICB0aGlzLl9zZW5kUmVxdWVzdCgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZHNcbiAgICogQHBhcmFtIGN0eFxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGdldFByZXZpb3VzbHlRdWV1ZWQgKGNvbW1hbmRzLCBjdHgpIHtcbiAgICBjb25zdCBzdGFydEluZGV4ID0gdGhpcy5fY2xpZW50UXVldWUuaW5kZXhPZihjdHgpIC0gMVxuXG4gICAgLy8gc2VhcmNoIGJhY2t3YXJkcyBmb3IgdGhlIGNvbW1hbmRzIGFuZCByZXR1cm4gdGhlIGZpcnN0IGZvdW5kXG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBpZiAoaXNNYXRjaCh0aGlzLl9jbGllbnRRdWV1ZVtpXSkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NsaWVudFF1ZXVlW2ldXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYWxzbyBjaGVjayBjdXJyZW50IGNvbW1hbmQgaWYgbm8gU0VMRUNUIGlzIHF1ZXVlZFxuICAgIGlmIChpc01hdGNoKHRoaXMuX2N1cnJlbnRDb21tYW5kKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRDb21tYW5kXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG5cbiAgICBmdW5jdGlvbiBpc01hdGNoIChkYXRhKSB7XG4gICAgICByZXR1cm4gZGF0YSAmJiBkYXRhLnJlcXVlc3QgJiYgY29tbWFuZHMuaW5kZXhPZihkYXRhLnJlcXVlc3QuY29tbWFuZCkgPj0gMFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGRhdGEgdG8gdGhlIFRDUCBzb2NrZXRcbiAgICogQXJtcyBhIHRpbWVvdXQgd2FpdGluZyBmb3IgYSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgUGF5bG9hZFxuICAgKi9cbiAgc2VuZCAoc3RyKSB7XG4gICAgY29uc3QgYnVmZmVyID0gdG9UeXBlZEFycmF5KHN0cikuYnVmZmVyXG4gICAgY29uc3QgdGltZW91dCA9IHRoaXMudGltZW91dFNvY2tldExvd2VyQm91bmQgKyBNYXRoLmZsb29yKGJ1ZmZlci5ieXRlTGVuZ3RoICogdGhpcy50aW1lb3V0U29ja2V0TXVsdGlwbGllcilcblxuICAgIGNsZWFyVGltZW91dCh0aGlzLl9zb2NrZXRUaW1lb3V0VGltZXIpIC8vIGNsZWFyIHBlbmRpbmcgdGltZW91dHNcbiAgICB0aGlzLl9zb2NrZXRUaW1lb3V0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX29uRXJyb3IobmV3IEVycm9yKCcgU29ja2V0IHRpbWVkIG91dCEnKSksIHRpbWVvdXQpIC8vIGFybSB0aGUgbmV4dCB0aW1lb3V0XG5cbiAgICBpZiAodGhpcy5jb21wcmVzc2VkKSB7XG4gICAgICB0aGlzLl9zZW5kQ29tcHJlc3NlZChidWZmZXIpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghdGhpcy5zb2NrZXQpIHtcbiAgICAgICAgdGhpcy5fb25FcnJvcihuZXcgRXJyb3IoJ0Vycm9yIDo6IFVuZXhwZWN0ZWQgc29ja2V0IGNsb3NlJykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNvY2tldC5zZW5kKGJ1ZmZlcilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgZ2xvYmFsIGhhbmRsZXIgZm9yIGFuIHVudGFnZ2VkIHJlc3BvbnNlLiBJZiBjdXJyZW50bHkgcHJvY2Vzc2VkIGNvbW1hbmRcbiAgICogaGFzIG5vdCBsaXN0ZWQgdW50YWdnZWQgY29tbWFuZCBpdCBpcyBmb3J3YXJkZWQgdG8gdGhlIGdsb2JhbCBoYW5kbGVyLiBVc2VmdWxcbiAgICogd2l0aCBFWFBVTkdFLCBFWElTVFMgZXRjLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY29tbWFuZCBVbnRhZ2dlZCBjb21tYW5kIG5hbWVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb24gd2l0aCByZXNwb25zZSBvYmplY3QgYW5kIGNvbnRpbnVlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqL1xuICBzZXRIYW5kbGVyIChjb21tYW5kLCBjYWxsYmFjaykge1xuICAgIHRoaXMuX2dsb2JhbEFjY2VwdFVudGFnZ2VkW2NvbW1hbmQudG9VcHBlckNhc2UoKS50cmltKCldID0gY2FsbGJhY2tcbiAgfVxuXG4gIC8vIElOVEVSTkFMIEVWRU5UU1xuXG4gIC8qKlxuICAgKiBFcnJvciBoYW5kbGVyIGZvciB0aGUgc29ja2V0XG4gICAqXG4gICAqIEBldmVudFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnQgRXZlbnQgb2JqZWN0LiBTZWUgZXZ0LmRhdGEgZm9yIHRoZSBlcnJvclxuICAgKi9cbiAgX29uRXJyb3IgKGV2dCkge1xuICAgIHZhciBlcnJvclxuICAgIGlmICh0aGlzLmlzRXJyb3IoZXZ0KSkge1xuICAgICAgZXJyb3IgPSBldnRcbiAgICB9IGVsc2UgaWYgKGV2dCAmJiB0aGlzLmlzRXJyb3IoZXZ0LmRhdGEpKSB7XG4gICAgICBlcnJvciA9IGV2dC5kYXRhXG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9yID0gbmV3IEVycm9yKChldnQgJiYgZXZ0LmRhdGEgJiYgZXZ0LmRhdGEubWVzc2FnZSkgfHwgZXZ0LmRhdGEgfHwgZXZ0IHx8ICdFcnJvcicpXG4gICAgfVxuXG4gICAgdGhpcy5sb2dnZXIuZXJyb3IoZXJyb3IpXG5cbiAgICAvLyBhbHdheXMgY2FsbCBvbmVycm9yIGNhbGxiYWNrLCBubyBtYXR0ZXIgaWYgY2xvc2UoKSBzdWNjZWVkcyBvciBmYWlsc1xuICAgIHRoaXMuY2xvc2UoZXJyb3IpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5vbmVycm9yICYmIHRoaXMub25lcnJvcihlcnJvcilcbiAgICB9LCAoKSA9PiB7XG4gICAgICB0aGlzLm9uZXJyb3IgJiYgdGhpcy5vbmVycm9yKGVycm9yKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgaW5jb21pbmcgZGF0YSBmcm9tIHRoZSBzZXJ2ZXIuIFRoZSBkYXRhIGlzIHNlbnQgaW4gYXJiaXRyYXJ5XG4gICAqIGNodW5rcyBhbmQgY2FuJ3QgYmUgdXNlZCBkaXJlY3RseSBzbyB0aGlzIGZ1bmN0aW9uIG1ha2VzIHN1cmUgdGhlIGRhdGFcbiAgICogaXMgc3BsaXQgaW50byBjb21wbGV0ZSBsaW5lcyBiZWZvcmUgdGhlIGRhdGEgaXMgcGFzc2VkIHRvIHRoZSBjb21tYW5kXG4gICAqIGhhbmRsZXJcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqL1xuICBfb25EYXRhIChldnQpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fc29ja2V0VGltZW91dFRpbWVyKSAvLyByZXNldCB0aGUgdGltZW91dCBvbiBlYWNoIGRhdGEgcGFja2V0XG4gICAgY29uc3QgdGltZW91dCA9IHRoaXMudGltZW91dFNvY2tldExvd2VyQm91bmQgKyBNYXRoLmZsb29yKDQwOTYgKiB0aGlzLnRpbWVvdXRTb2NrZXRNdWx0aXBsaWVyKSAvLyBtYXggcGFja2V0IHNpemUgaXMgNDA5NiBieXRlc1xuICAgIHRoaXMuX3NvY2tldFRpbWVvdXRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5fb25FcnJvcihuZXcgRXJyb3IoJyBTb2NrZXQgdGltZWQgb3V0IScpKSwgdGltZW91dClcblxuICAgIHRoaXMuX2luY29taW5nQnVmZmVycy5wdXNoKG5ldyBVaW50OEFycmF5KGV2dC5kYXRhKSkgLy8gYXBwZW5kIHRvIHRoZSBpbmNvbWluZyBidWZmZXJcbiAgICB0aGlzLl9wYXJzZUluY29taW5nQ29tbWFuZHModGhpcy5faXRlcmF0ZUluY29taW5nQnVmZmVyKCkpIC8vIENvbnN1bWUgdGhlIGluY29taW5nIGJ1ZmZlclxuICB9XG5cbiAgKiBfaXRlcmF0ZUluY29taW5nQnVmZmVyICgpIHtcbiAgICBsZXQgYnVmID0gdGhpcy5faW5jb21pbmdCdWZmZXJzW3RoaXMuX2luY29taW5nQnVmZmVycy5sZW5ndGggLSAxXSB8fCBbXVxuICAgIGxldCBpID0gMFxuXG4gICAgLy8gbG9vcCBpbnZhcmlhbnQ6XG4gICAgLy8gICB0aGlzLl9pbmNvbWluZ0J1ZmZlcnMgc3RhcnRzIHdpdGggdGhlIGJlZ2lubmluZyBvZiBpbmNvbWluZyBjb21tYW5kLlxuICAgIC8vICAgYnVmIGlzIHNob3J0aGFuZCBmb3IgbGFzdCBlbGVtZW50IG9mIHRoaXMuX2luY29taW5nQnVmZmVycy5cbiAgICAvLyAgIGJ1ZlswLi5pLTFdIGlzIHBhcnQgb2YgaW5jb21pbmcgY29tbWFuZC5cbiAgICB3aGlsZSAoaSA8IGJ1Zi5sZW5ndGgpIHtcbiAgICAgIHN3aXRjaCAodGhpcy5fYnVmZmVyU3RhdGUpIHtcbiAgICAgICAgY2FzZSBCVUZGRVJfU1RBVEVfTElURVJBTDpcbiAgICAgICAgICBjb25zdCBkaWZmID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIGksIHRoaXMuX2xpdGVyYWxSZW1haW5pbmcpXG4gICAgICAgICAgdGhpcy5fbGl0ZXJhbFJlbWFpbmluZyAtPSBkaWZmXG4gICAgICAgICAgaSArPSBkaWZmXG4gICAgICAgICAgaWYgKHRoaXMuX2xpdGVyYWxSZW1haW5pbmcgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2J1ZmZlclN0YXRlID0gQlVGRkVSX1NUQVRFX0RFRkFVTFRcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIEJVRkZFUl9TVEFURV9QT1NTSUJMWV9MSVRFUkFMX0xFTkdUSF8yOlxuICAgICAgICAgIGlmIChpIDwgYnVmLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGJ1ZltpXSA9PT0gQ0FSUklBR0VfUkVUVVJOKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2xpdGVyYWxSZW1haW5pbmcgPSBOdW1iZXIoZnJvbVR5cGVkQXJyYXkodGhpcy5fbGVuZ3RoQnVmZmVyKSkgKyAyIC8vIGZvciBDUkxGXG4gICAgICAgICAgICAgIHRoaXMuX2J1ZmZlclN0YXRlID0gQlVGRkVSX1NUQVRFX0xJVEVSQUxcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuX2J1ZmZlclN0YXRlID0gQlVGRkVSX1NUQVRFX0RFRkFVTFRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9sZW5ndGhCdWZmZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIEJVRkZFUl9TVEFURV9QT1NTSUJMWV9MSVRFUkFMX0xFTkdUSF8xOlxuICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gaVxuICAgICAgICAgIHdoaWxlIChpIDwgYnVmLmxlbmd0aCAmJiBidWZbaV0gPj0gNDggJiYgYnVmW2ldIDw9IDU3KSB7IC8vIGRpZ2l0c1xuICAgICAgICAgICAgaSsrXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdGFydCAhPT0gaSkge1xuICAgICAgICAgICAgY29uc3QgbGF0ZXN0ID0gYnVmLnN1YmFycmF5KHN0YXJ0LCBpKVxuICAgICAgICAgICAgY29uc3QgcHJldkJ1ZiA9IHRoaXMuX2xlbmd0aEJ1ZmZlclxuICAgICAgICAgICAgdGhpcy5fbGVuZ3RoQnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkocHJldkJ1Zi5sZW5ndGggKyBsYXRlc3QubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5fbGVuZ3RoQnVmZmVyLnNldChwcmV2QnVmKVxuICAgICAgICAgICAgdGhpcy5fbGVuZ3RoQnVmZmVyLnNldChsYXRlc3QsIHByZXZCdWYubGVuZ3RoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaSA8IGJ1Zi5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9sZW5ndGhCdWZmZXIubGVuZ3RoID4gMCAmJiBidWZbaV0gPT09IFJJR0hUX0NVUkxZX0JSQUNLRVQpIHtcbiAgICAgICAgICAgICAgdGhpcy5fYnVmZmVyU3RhdGUgPSBCVUZGRVJfU1RBVEVfUE9TU0lCTFlfTElURVJBTF9MRU5HVEhfMlxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2xlbmd0aEJ1ZmZlclxuICAgICAgICAgICAgICB0aGlzLl9idWZmZXJTdGF0ZSA9IEJVRkZFUl9TVEFURV9ERUZBVUxUXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpKytcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIGZpbmQgbGl0ZXJhbCBsZW5ndGhcbiAgICAgICAgICBjb25zdCBsZWZ0SWR4ID0gYnVmLmluZGV4T2YoTEVGVF9DVVJMWV9CUkFDS0VULCBpKVxuICAgICAgICAgIGlmIChsZWZ0SWR4ID4gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IGxlZnRPZkxlZnRDdXJseSA9IG5ldyBVaW50OEFycmF5KGJ1Zi5idWZmZXIsIGksIGxlZnRJZHggLSBpKVxuICAgICAgICAgICAgaWYgKGxlZnRPZkxlZnRDdXJseS5pbmRleE9mKExJTkVfRkVFRCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgIGkgPSBsZWZ0SWR4ICsgMVxuICAgICAgICAgICAgICB0aGlzLl9sZW5ndGhCdWZmZXIgPSBuZXcgVWludDhBcnJheSgwKVxuICAgICAgICAgICAgICB0aGlzLl9idWZmZXJTdGF0ZSA9IEJVRkZFUl9TVEFURV9QT1NTSUJMWV9MSVRFUkFMX0xFTkdUSF8xXG4gICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gZmluZCBlbmQgb2YgY29tbWFuZFxuICAgICAgICAgIGNvbnN0IExGaWR4ID0gYnVmLmluZGV4T2YoTElORV9GRUVELCBpKVxuICAgICAgICAgIGlmIChMRmlkeCA+IC0xKSB7XG4gICAgICAgICAgICBpZiAoTEZpZHggPCBidWYubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICB0aGlzLl9pbmNvbWluZ0J1ZmZlcnNbdGhpcy5faW5jb21pbmdCdWZmZXJzLmxlbmd0aCAtIDFdID0gbmV3IFVpbnQ4QXJyYXkoYnVmLmJ1ZmZlciwgMCwgTEZpZHggKyAxKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY29tbWFuZExlbmd0aCA9IHRoaXMuX2luY29taW5nQnVmZmVycy5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHByZXYgKyBjdXJyLmxlbmd0aCwgMCkgLSAyIC8vIDIgZm9yIENSTEZcbiAgICAgICAgICAgIGNvbnN0IGNvbW1hbmQgPSBuZXcgVWludDhBcnJheShjb21tYW5kTGVuZ3RoKVxuICAgICAgICAgICAgbGV0IGluZGV4ID0gMFxuICAgICAgICAgICAgd2hpbGUgKHRoaXMuX2luY29taW5nQnVmZmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGxldCB1aW50OEFycmF5ID0gdGhpcy5faW5jb21pbmdCdWZmZXJzLnNoaWZ0KClcblxuICAgICAgICAgICAgICBjb25zdCByZW1haW5pbmdMZW5ndGggPSBjb21tYW5kTGVuZ3RoIC0gaW5kZXhcbiAgICAgICAgICAgICAgaWYgKHVpbnQ4QXJyYXkubGVuZ3RoID4gcmVtYWluaW5nTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhjZXNzTGVuZ3RoID0gdWludDhBcnJheS5sZW5ndGggLSByZW1haW5pbmdMZW5ndGhcbiAgICAgICAgICAgICAgICB1aW50OEFycmF5ID0gdWludDhBcnJheS5zdWJhcnJheSgwLCAtZXhjZXNzTGVuZ3RoKVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2luY29taW5nQnVmZmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9pbmNvbWluZ0J1ZmZlcnMgPSBbXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb21tYW5kLnNldCh1aW50OEFycmF5LCBpbmRleClcbiAgICAgICAgICAgICAgaW5kZXggKz0gdWludDhBcnJheS5sZW5ndGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHlpZWxkIGNvbW1hbmRcbiAgICAgICAgICAgIGlmIChMRmlkeCA8IGJ1Zi5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGJ1Zi5zdWJhcnJheShMRmlkeCArIDEpKVxuICAgICAgICAgICAgICB0aGlzLl9pbmNvbWluZ0J1ZmZlcnMucHVzaChidWYpXG4gICAgICAgICAgICAgIGkgPSAwXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBjbGVhciB0aGUgdGltZW91dCB3aGVuIGFuIGVudGlyZSBjb21tYW5kIGhhcyBhcnJpdmVkXG4gICAgICAgICAgICAgIC8vIGFuZCBub3Qgd2FpdGluZyBvbiBtb3JlIGRhdGEgZm9yIG5leHQgY29tbWFuZFxuICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fc29ja2V0VGltZW91dFRpbWVyKVxuICAgICAgICAgICAgICB0aGlzLl9zb2NrZXRUaW1lb3V0VGltZXIgPSBudWxsXG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUFJJVkFURSBNRVRIT0RTXG5cbiAgLyoqXG4gICAqIFByb2Nlc3NlcyBhIGNvbW1hbmQgZnJvbSB0aGUgcXVldWUuIFRoZSBjb21tYW5kIGlzIHBhcnNlZCBhbmQgZmVlZGVkIHRvIGEgaGFuZGxlclxuICAgKi9cbiAgX3BhcnNlSW5jb21pbmdDb21tYW5kcyAoY29tbWFuZHMpIHtcbiAgICBmb3IgKHZhciBjb21tYW5kIG9mIGNvbW1hbmRzKSB7XG4gICAgICB0aGlzLl9jbGVhcklkbGUoKVxuXG4gICAgICAvKlxuICAgICAgICogVGhlIFwiK1wiLXRhZ2dlZCByZXNwb25zZSBpcyBhIHNwZWNpYWwgY2FzZTpcbiAgICAgICAqIEVpdGhlciB0aGUgc2VydmVyIGNhbiBhc2tzIGZvciB0aGUgbmV4dCBjaHVuayBvZiBkYXRhLCBlLmcuIGZvciB0aGUgQVVUSEVOVElDQVRFIGNvbW1hbmQuXG4gICAgICAgKlxuICAgICAgICogT3IgdGhlcmUgd2FzIGFuIGVycm9yIGluIHRoZSBYT0FVVEgyIGF1dGhlbnRpY2F0aW9uLCBmb3Igd2hpY2ggU0FTTCBpbml0aWFsIGNsaWVudCByZXNwb25zZSBleHRlbnNpb25cbiAgICAgICAqIGRpY3RhdGVzIHRoZSBjbGllbnQgc2VuZHMgYW4gZW1wdHkgRU9MIHJlc3BvbnNlIHRvIHRoZSBjaGFsbGVuZ2UgY29udGFpbmluZyB0aGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgICAqXG4gICAgICAgKiBEZXRhaWxzIG9uIFwiK1wiLXRhZ2dlZCByZXNwb25zZTpcbiAgICAgICAqICAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM1MDEjc2VjdGlvbi0yLjIuMVxuICAgICAgICovXG4gICAgICAvL1xuICAgICAgaWYgKGNvbW1hbmRbMF0gPT09IEFTQ0lJX1BMVVMpIHtcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRDb21tYW5kLmRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgLy8gZmVlZCB0aGUgbmV4dCBjaHVuayBvZiBkYXRhXG4gICAgICAgICAgdmFyIGNodW5rID0gdGhpcy5fY3VycmVudENvbW1hbmQuZGF0YS5zaGlmdCgpXG4gICAgICAgICAgY2h1bmsgKz0gKCF0aGlzLl9jdXJyZW50Q29tbWFuZC5kYXRhLmxlbmd0aCA/IEVPTCA6ICcnKSAvLyBFT0wgaWYgdGhlcmUncyBub3RoaW5nIG1vcmUgdG8gc2VuZFxuICAgICAgICAgIHRoaXMuc2VuZChjaHVuaylcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9jdXJyZW50Q29tbWFuZC5lcnJvclJlc3BvbnNlRXhwZWN0c0VtcHR5TGluZSkge1xuICAgICAgICAgIHRoaXMuc2VuZChFT0wpIC8vIFhPQVVUSDIgZW1wdHkgcmVzcG9uc2UsIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgd2hlbiBzZXJ2ZXIgY29udGludWVzIHdpdGggTk8gcmVzcG9uc2VcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB2YXIgcmVzcG9uc2VcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHZhbHVlQXNTdHJpbmcgPSB0aGlzLl9jdXJyZW50Q29tbWFuZC5yZXF1ZXN0ICYmIHRoaXMuX2N1cnJlbnRDb21tYW5kLnJlcXVlc3QudmFsdWVBc1N0cmluZ1xuICAgICAgICByZXNwb25zZSA9IHBhcnNlcihjb21tYW5kLCB7IHZhbHVlQXNTdHJpbmcgfSlcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ1M6JywgKCkgPT4gY29tcGlsZXIocmVzcG9uc2UsIGZhbHNlLCB0cnVlKSlcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgaW1hcCBjb21tYW5kIScsIHJlc3BvbnNlKVxuICAgICAgICByZXR1cm4gdGhpcy5fb25FcnJvcihlKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9wcm9jZXNzUmVzcG9uc2UocmVzcG9uc2UpXG4gICAgICB0aGlzLl9oYW5kbGVSZXNwb25zZShyZXNwb25zZSlcblxuICAgICAgLy8gZmlyc3QgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLCBjb25uZWN0aW9uIGlzIG5vdyB1c2FibGVcbiAgICAgIGlmICghdGhpcy5fY29ubmVjdGlvblJlYWR5KSB7XG4gICAgICAgIHRoaXMuX2Nvbm5lY3Rpb25SZWFkeSA9IHRydWVcbiAgICAgICAgdGhpcy5vbnJlYWR5ICYmIHRoaXMub25yZWFkeSgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZlZWRzIGEgcGFyc2VkIHJlc3BvbnNlIG9iamVjdCB0byBhbiBhcHByb3ByaWF0ZSBoYW5kbGVyXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSByZXNwb25zZSBQYXJzZWQgY29tbWFuZCBvYmplY3RcbiAgICovXG4gIF9oYW5kbGVSZXNwb25zZSAocmVzcG9uc2UpIHtcbiAgICB2YXIgY29tbWFuZCA9IHByb3BPcignJywgJ2NvbW1hbmQnLCByZXNwb25zZSkudG9VcHBlckNhc2UoKS50cmltKClcblxuICAgIGlmICghdGhpcy5fY3VycmVudENvbW1hbmQpIHtcbiAgICAgIC8vIHVuc29saWNpdGVkIHVudGFnZ2VkIHJlc3BvbnNlXG4gICAgICBpZiAocmVzcG9uc2UudGFnID09PSAnKicgJiYgY29tbWFuZCBpbiB0aGlzLl9nbG9iYWxBY2NlcHRVbnRhZ2dlZCkge1xuICAgICAgICB0aGlzLl9nbG9iYWxBY2NlcHRVbnRhZ2dlZFtjb21tYW5kXShyZXNwb25zZSlcbiAgICAgICAgdGhpcy5fY2FuU2VuZCA9IHRydWVcbiAgICAgICAgdGhpcy5fc2VuZFJlcXVlc3QoKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5fY3VycmVudENvbW1hbmQucGF5bG9hZCAmJiByZXNwb25zZS50YWcgPT09ICcqJyAmJiBjb21tYW5kIGluIHRoaXMuX2N1cnJlbnRDb21tYW5kLnBheWxvYWQpIHtcbiAgICAgIC8vIGV4cGVjdGVkIHVudGFnZ2VkIHJlc3BvbnNlXG4gICAgICB0aGlzLl9jdXJyZW50Q29tbWFuZC5wYXlsb2FkW2NvbW1hbmRdLnB1c2gocmVzcG9uc2UpXG4gICAgfSBlbHNlIGlmIChyZXNwb25zZS50YWcgPT09ICcqJyAmJiBjb21tYW5kIGluIHRoaXMuX2dsb2JhbEFjY2VwdFVudGFnZ2VkKSB7XG4gICAgICAvLyB1bmV4cGVjdGVkIHVudGFnZ2VkIHJlc3BvbnNlXG4gICAgICB0aGlzLl9nbG9iYWxBY2NlcHRVbnRhZ2dlZFtjb21tYW5kXShyZXNwb25zZSlcbiAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnRhZyA9PT0gdGhpcy5fY3VycmVudENvbW1hbmQudGFnKSB7XG4gICAgICAvLyB0YWdnZWQgcmVzcG9uc2VcbiAgICAgIGlmICh0aGlzLl9jdXJyZW50Q29tbWFuZC5wYXlsb2FkICYmIE9iamVjdC5rZXlzKHRoaXMuX2N1cnJlbnRDb21tYW5kLnBheWxvYWQpLmxlbmd0aCkge1xuICAgICAgICByZXNwb25zZS5wYXlsb2FkID0gdGhpcy5fY3VycmVudENvbW1hbmQucGF5bG9hZFxuICAgICAgfVxuICAgICAgdGhpcy5fY3VycmVudENvbW1hbmQuY2FsbGJhY2socmVzcG9uc2UpXG4gICAgICB0aGlzLl9jYW5TZW5kID0gdHJ1ZVxuICAgICAgdGhpcy5fc2VuZFJlcXVlc3QoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIGNvbW1hbmQgZnJvbSBjbGllbnQgcXVldWUgdG8gdGhlIHNlcnZlci5cbiAgICovXG4gIF9zZW5kUmVxdWVzdCAoKSB7XG4gICAgaWYgKCF0aGlzLl9jbGllbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9lbnRlcklkbGUoKVxuICAgIH1cbiAgICB0aGlzLl9jbGVhcklkbGUoKVxuXG4gICAgLy8gYW4gb3BlcmF0aW9uIHdhcyBtYWRlIGluIHRoZSBwcmVjaGVjaywgbm8gbmVlZCB0byByZXN0YXJ0IHRoZSBxdWV1ZSBtYW51YWxseVxuICAgIHRoaXMuX3Jlc3RhcnRRdWV1ZSA9IGZhbHNlXG5cbiAgICB2YXIgY29tbWFuZCA9IHRoaXMuX2NsaWVudFF1ZXVlWzBdXG4gICAgaWYgKHR5cGVvZiBjb21tYW5kLnByZWNoZWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyByZW1lbWJlciB0aGUgY29udGV4dFxuICAgICAgdmFyIGNvbnRleHQgPSBjb21tYW5kXG4gICAgICB2YXIgcHJlY2hlY2sgPSBjb250ZXh0LnByZWNoZWNrXG4gICAgICBkZWxldGUgY29udGV4dC5wcmVjaGVja1xuXG4gICAgICAvLyB3ZSBuZWVkIHRvIHJlc3RhcnQgdGhlIHF1ZXVlIGhhbmRsaW5nIGlmIG5vIG9wZXJhdGlvbiB3YXMgbWFkZSBpbiB0aGUgcHJlY2hlY2tcbiAgICAgIHRoaXMuX3Jlc3RhcnRRdWV1ZSA9IHRydWVcblxuICAgICAgLy8gaW52b2tlIHRoZSBwcmVjaGVjayBjb21tYW5kIGFuZCByZXN1bWUgbm9ybWFsIG9wZXJhdGlvbiBhZnRlciB0aGUgcHJvbWlzZSByZXNvbHZlc1xuICAgICAgcHJlY2hlY2soY29udGV4dCkudGhlbigoKSA9PiB7XG4gICAgICAgIC8vIHdlJ3JlIGRvbmUgd2l0aCB0aGUgcHJlY2hlY2tcbiAgICAgICAgaWYgKHRoaXMuX3Jlc3RhcnRRdWV1ZSkge1xuICAgICAgICAgIC8vIHdlIG5lZWQgdG8gcmVzdGFydCB0aGUgcXVldWUgaGFuZGxpbmdcbiAgICAgICAgICB0aGlzLl9zZW5kUmVxdWVzdCgpXG4gICAgICAgIH1cbiAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgLy8gcHJlY2hlY2sgZmFpbGVkLCBzbyB3ZSByZW1vdmUgdGhlIGluaXRpYWwgY29tbWFuZFxuICAgICAgICAvLyBmcm9tIHRoZSBxdWV1ZSwgaW52b2tlIGl0cyBjYWxsYmFjayBhbmQgcmVzdW1lIG5vcm1hbCBvcGVyYXRpb25cbiAgICAgICAgbGV0IGNtZFxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2NsaWVudFF1ZXVlLmluZGV4T2YoY29udGV4dClcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICBjbWQgPSB0aGlzLl9jbGllbnRRdWV1ZS5zcGxpY2UoaW5kZXgsIDEpWzBdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNtZCAmJiBjbWQuY2FsbGJhY2spIHtcbiAgICAgICAgICBjbWQuY2FsbGJhY2soZXJyKVxuICAgICAgICAgIHRoaXMuX2NhblNlbmQgPSB0cnVlXG4gICAgICAgICAgdGhpcy5fcGFyc2VJbmNvbWluZ0NvbW1hbmRzKHRoaXMuX2l0ZXJhdGVJbmNvbWluZ0J1ZmZlcigpKSAvLyBDb25zdW1lIHRoZSByZXN0IG9mIHRoZSBpbmNvbWluZyBidWZmZXJcbiAgICAgICAgICB0aGlzLl9zZW5kUmVxdWVzdCgpIC8vIGNvbnRpbnVlIHNlbmRpbmdcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2NhblNlbmQgPSBmYWxzZVxuICAgIHRoaXMuX2N1cnJlbnRDb21tYW5kID0gdGhpcy5fY2xpZW50UXVldWUuc2hpZnQoKVxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX2N1cnJlbnRDb21tYW5kLmRhdGEgPSBjb21waWxlcih0aGlzLl9jdXJyZW50Q29tbWFuZC5yZXF1ZXN0LCB0cnVlKVxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0M6JywgKCkgPT4gY29tcGlsZXIodGhpcy5fY3VycmVudENvbW1hbmQucmVxdWVzdCwgZmFsc2UsIHRydWUpKSAvLyBleGNsdWRlcyBwYXNzd29yZHMgZXRjLlxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdFcnJvciBjb21waWxpbmcgaW1hcCBjb21tYW5kIScsIHRoaXMuX2N1cnJlbnRDb21tYW5kLnJlcXVlc3QpXG4gICAgICByZXR1cm4gdGhpcy5fb25FcnJvcihuZXcgRXJyb3IoJ0Vycm9yIGNvbXBpbGluZyBpbWFwIGNvbW1hbmQhJykpXG4gICAgfVxuXG4gICAgdmFyIGRhdGEgPSB0aGlzLl9jdXJyZW50Q29tbWFuZC5kYXRhLnNoaWZ0KClcblxuICAgIHRoaXMuc2VuZChkYXRhICsgKCF0aGlzLl9jdXJyZW50Q29tbWFuZC5kYXRhLmxlbmd0aCA/IEVPTCA6ICcnKSlcbiAgICByZXR1cm4gdGhpcy53YWl0RHJhaW5cbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBvbmlkbGUsIG5vdGluZyB0byBkbyBjdXJyZW50bHlcbiAgICovXG4gIF9lbnRlcklkbGUgKCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl9pZGxlVGltZXIpXG4gICAgdGhpcy5faWRsZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiAodGhpcy5vbmlkbGUgJiYgdGhpcy5vbmlkbGUoKSksIHRoaXMudGltZW91dEVudGVySWRsZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWwgaWRsZSB0aW1lclxuICAgKi9cbiAgX2NsZWFySWRsZSAoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX2lkbGVUaW1lcilcbiAgICB0aGlzLl9pZGxlVGltZXIgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHByb2Nlc3NlcyBhIHJlc3BvbnNlIGludG8gYW4gZWFzaWVyIHRvIGhhbmRsZSBmb3JtYXQuXG4gICAqIEFkZCB1bnRhZ2dlZCBudW1iZXJlZCByZXNwb25zZXMgKGUuZy4gRkVUQ0gpIGludG8gYSBuaWNlbHkgZmVhc2libGUgZm9ybVxuICAgKiBDaGVja3MgaWYgYSByZXNwb25zZSBpbmNsdWRlcyBvcHRpb25hbCByZXNwb25zZSBjb2Rlc1xuICAgKiBhbmQgY29waWVzIHRoZXNlIGludG8gc2VwYXJhdGUgcHJvcGVydGllcy4gRm9yIGV4YW1wbGUgdGhlXG4gICAqIGZvbGxvd2luZyByZXNwb25zZSBpbmNsdWRlcyBhIGNhcGFiaWxpdHkgbGlzdGluZyBhbmQgYSBodW1hblxuICAgKiByZWFkYWJsZSBtZXNzYWdlOlxuICAgKlxuICAgKiAgICAgKiBPSyBbQ0FQQUJJTElUWSBJRCBOQU1FU1BBQ0VdIEFsbCByZWFkeVxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBhZGRzIGEgJ2NhcGFiaWxpdHknIHByb3BlcnR5IHdpdGggYW4gYXJyYXkgdmFsdWUgWydJRCcsICdOQU1FU1BBQ0UnXVxuICAgKiB0byB0aGUgcmVzcG9uc2Ugb2JqZWN0LiBBZGRpdGlvbmFsbHkgJ0FsbCByZWFkeScgaXMgYWRkZWQgYXMgJ2h1bWFuUmVhZGFibGUnIHByb3BlcnR5LlxuICAgKlxuICAgKiBTZWUgcG9zc2libGVtIElNQVAgUmVzcG9uc2UgQ29kZXMgYXQgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzU1MzBcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHJlc3BvbnNlIFBhcnNlZCByZXNwb25zZSBvYmplY3RcbiAgICovXG4gIF9wcm9jZXNzUmVzcG9uc2UgKHJlc3BvbnNlKSB7XG4gICAgY29uc3QgY29tbWFuZCA9IHByb3BPcignJywgJ2NvbW1hbmQnLCByZXNwb25zZSkudG9VcHBlckNhc2UoKS50cmltKClcblxuICAgIC8vIG5vIGF0dHJpYnV0ZXNcbiAgICBpZiAoIXJlc3BvbnNlIHx8ICFyZXNwb25zZS5hdHRyaWJ1dGVzIHx8ICFyZXNwb25zZS5hdHRyaWJ1dGVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gdW50YWdnZWQgcmVzcG9uc2VzIHcvIHNlcXVlbmNlIG51bWJlcnNcbiAgICBpZiAocmVzcG9uc2UudGFnID09PSAnKicgJiYgL15cXGQrJC8udGVzdChyZXNwb25zZS5jb21tYW5kKSAmJiByZXNwb25zZS5hdHRyaWJ1dGVzWzBdLnR5cGUgPT09ICdBVE9NJykge1xuICAgICAgcmVzcG9uc2UubnIgPSBOdW1iZXIocmVzcG9uc2UuY29tbWFuZClcbiAgICAgIHJlc3BvbnNlLmNvbW1hbmQgPSAocmVzcG9uc2UuYXR0cmlidXRlcy5zaGlmdCgpLnZhbHVlIHx8ICcnKS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkudHJpbSgpXG4gICAgfVxuXG4gICAgLy8gbm8gb3B0aW9uYWwgcmVzcG9uc2UgY29kZVxuICAgIGlmIChbJ09LJywgJ05PJywgJ0JBRCcsICdCWUUnLCAnUFJFQVVUSCddLmluZGV4T2YoY29tbWFuZCkgPCAwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBJZiBsYXN0IGVsZW1lbnQgb2YgdGhlIHJlc3BvbnNlIGlzIFRFWFQgdGhlbiB0aGlzIGlzIGZvciBodW1hbnNcbiAgICBpZiAocmVzcG9uc2UuYXR0cmlidXRlc1tyZXNwb25zZS5hdHRyaWJ1dGVzLmxlbmd0aCAtIDFdLnR5cGUgPT09ICdURVhUJykge1xuICAgICAgcmVzcG9uc2UuaHVtYW5SZWFkYWJsZSA9IHJlc3BvbnNlLmF0dHJpYnV0ZXNbcmVzcG9uc2UuYXR0cmlidXRlcy5sZW5ndGggLSAxXS52YWx1ZVxuICAgIH1cblxuICAgIC8vIFBhcnNlIGFuZCBmb3JtYXQgQVRPTSB2YWx1ZXNcbiAgICBpZiAocmVzcG9uc2UuYXR0cmlidXRlc1swXS50eXBlID09PSAnQVRPTScgJiYgcmVzcG9uc2UuYXR0cmlidXRlc1swXS5zZWN0aW9uKSB7XG4gICAgICBjb25zdCBvcHRpb24gPSByZXNwb25zZS5hdHRyaWJ1dGVzWzBdLnNlY3Rpb24ubWFwKChrZXkpID0+IHtcbiAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShrZXkpKSB7XG4gICAgICAgICAgcmV0dXJuIGtleS5tYXAoKGtleSkgPT4gKGtleS52YWx1ZSB8fCAnJykudG9TdHJpbmcoKS50cmltKCkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIChrZXkudmFsdWUgfHwgJycpLnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKS50cmltKClcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgY29uc3Qga2V5ID0gb3B0aW9uLnNoaWZ0KClcbiAgICAgIHJlc3BvbnNlLmNvZGUgPSBrZXlcblxuICAgICAgaWYgKG9wdGlvbi5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmVzcG9uc2Vba2V5LnRvTG93ZXJDYXNlKCldID0gb3B0aW9uWzBdXG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbi5sZW5ndGggPiAxKSB7XG4gICAgICAgIHJlc3BvbnNlW2tleS50b0xvd2VyQ2FzZSgpXSA9IG9wdGlvblxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBhbiBFcnJvciBvYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWUgVmFsdWUgdG8gYmUgY2hlY2tlZFxuICAgKiBAcmV0dXJuIHtCb29sZWFufSByZXR1cm5zIHRydWUgaWYgdGhlIHZhbHVlIGlzIGFuIEVycm9yXG4gICAqL1xuICBpc0Vycm9yICh2YWx1ZSkge1xuICAgIHJldHVybiAhIU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkubWF0Y2goL0Vycm9yXFxdJC8pXG4gIH1cblxuICAvLyBDT01QUkVTU0lPTiBSRUxBVEVEIE1FVEhPRFNcblxuICAvKipcbiAgICogU2V0cyB1cCBkZWZsYXRlL2luZmxhdGUgZm9yIHRoZSBJT1xuICAgKi9cbiAgZW5hYmxlQ29tcHJlc3Npb24gKCkge1xuICAgIHRoaXMuX3NvY2tldE9uRGF0YSA9IHRoaXMuc29ja2V0Lm9uZGF0YVxuICAgIHRoaXMuY29tcHJlc3NlZCA9IHRydWVcblxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuV29ya2VyKSB7XG4gICAgICB0aGlzLl9jb21wcmVzc2lvbldvcmtlciA9IG5ldyBXb3JrZXIoVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbQ29tcHJlc3Npb25CbG9iXSkpKVxuICAgICAgdGhpcy5fY29tcHJlc3Npb25Xb3JrZXIub25tZXNzYWdlID0gKGUpID0+IHtcbiAgICAgICAgdmFyIG1lc3NhZ2UgPSBlLmRhdGEubWVzc2FnZVxuICAgICAgICB2YXIgZGF0YSA9IGUuZGF0YS5idWZmZXJcblxuICAgICAgICBzd2l0Y2ggKG1lc3NhZ2UpIHtcbiAgICAgICAgICBjYXNlIE1FU1NBR0VfSU5GTEFURURfREFUQV9SRUFEWTpcbiAgICAgICAgICAgIHRoaXMuX3NvY2tldE9uRGF0YSh7IGRhdGEgfSlcbiAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICBjYXNlIE1FU1NBR0VfREVGTEFURURfREFUQV9SRUFEWTpcbiAgICAgICAgICAgIHRoaXMud2FpdERyYWluID0gdGhpcy5zb2NrZXQuc2VuZChkYXRhKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9jb21wcmVzc2lvbldvcmtlci5vbmVycm9yID0gKGUpID0+IHtcbiAgICAgICAgdGhpcy5fb25FcnJvcihuZXcgRXJyb3IoJ0Vycm9yIGhhbmRsaW5nIGNvbXByZXNzaW9uIHdlYiB3b3JrZXI6ICcgKyBlLm1lc3NhZ2UpKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9jb21wcmVzc2lvbldvcmtlci5wb3N0TWVzc2FnZShjcmVhdGVNZXNzYWdlKE1FU1NBR0VfSU5JVElBTElaRV9XT1JLRVIpKVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpbmZsYXRlZFJlYWR5ID0gKGJ1ZmZlcikgPT4geyB0aGlzLl9zb2NrZXRPbkRhdGEoeyBkYXRhOiBidWZmZXIgfSkgfVxuICAgICAgY29uc3QgZGVmbGF0ZWRSZWFkeSA9IChidWZmZXIpID0+IHsgdGhpcy53YWl0RHJhaW4gPSB0aGlzLnNvY2tldC5zZW5kKGJ1ZmZlcikgfVxuICAgICAgdGhpcy5fY29tcHJlc3Npb24gPSBuZXcgQ29tcHJlc3Npb24oaW5mbGF0ZWRSZWFkeSwgZGVmbGF0ZWRSZWFkeSlcbiAgICB9XG5cbiAgICAvLyBvdmVycmlkZSBkYXRhIGhhbmRsZXIsIGRlY29tcHJlc3MgaW5jb21pbmcgZGF0YVxuICAgIHRoaXMuc29ja2V0Lm9uZGF0YSA9IChldnQpID0+IHtcbiAgICAgIGlmICghdGhpcy5jb21wcmVzc2VkKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fY29tcHJlc3Npb25Xb3JrZXIpIHtcbiAgICAgICAgdGhpcy5fY29tcHJlc3Npb25Xb3JrZXIucG9zdE1lc3NhZ2UoY3JlYXRlTWVzc2FnZShNRVNTQUdFX0lORkxBVEUsIGV2dC5kYXRhKSwgW2V2dC5kYXRhXSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2NvbXByZXNzaW9uLmluZmxhdGUoZXZ0LmRhdGEpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVuZG9lcyBhbnkgY2hhbmdlcyByZWxhdGVkIHRvIGNvbXByZXNzaW9uLiBUaGlzIG9ubHkgYmUgY2FsbGVkIHdoZW4gY2xvc2luZyB0aGUgY29ubmVjdGlvblxuICAgKi9cbiAgX2Rpc2FibGVDb21wcmVzc2lvbiAoKSB7XG4gICAgaWYgKCF0aGlzLmNvbXByZXNzZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuY29tcHJlc3NlZCA9IGZhbHNlXG4gICAgdGhpcy5zb2NrZXQub25kYXRhID0gdGhpcy5fc29ja2V0T25EYXRhXG4gICAgdGhpcy5fc29ja2V0T25EYXRhID0gbnVsbFxuXG4gICAgaWYgKHRoaXMuX2NvbXByZXNzaW9uV29ya2VyKSB7XG4gICAgICAvLyB0ZXJtaW5hdGUgdGhlIHdvcmtlclxuICAgICAgdGhpcy5fY29tcHJlc3Npb25Xb3JrZXIudGVybWluYXRlKClcbiAgICAgIHRoaXMuX2NvbXByZXNzaW9uV29ya2VyID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPdXRnb2luZyBwYXlsb2FkIG5lZWRzIHRvIGJlIGNvbXByZXNzZWQgYW5kIHNlbnQgdG8gc29ja2V0XG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGJ1ZmZlciBPdXRnb2luZyB1bmNvbXByZXNzZWQgYXJyYXlidWZmZXJcbiAgICovXG4gIF9zZW5kQ29tcHJlc3NlZCAoYnVmZmVyKSB7XG4gICAgLy8gZGVmbGF0ZVxuICAgIGlmICh0aGlzLl9jb21wcmVzc2lvbldvcmtlcikge1xuICAgICAgdGhpcy5fY29tcHJlc3Npb25Xb3JrZXIucG9zdE1lc3NhZ2UoY3JlYXRlTWVzc2FnZShNRVNTQUdFX0RFRkxBVEUsIGJ1ZmZlciksIFtidWZmZXJdKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jb21wcmVzc2lvbi5kZWZsYXRlKGJ1ZmZlcilcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgY3JlYXRlTWVzc2FnZSA9IChtZXNzYWdlLCBidWZmZXIpID0+ICh7IG1lc3NhZ2UsIGJ1ZmZlciB9KVxuIl19 \ No newline at end of file diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 00000000..b0aab470 --- /dev/null +++ b/dist/index.js @@ -0,0 +1,52 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "LOG_LEVEL_NONE", { + enumerable: true, + get: function () { + return _common.LOG_LEVEL_NONE; + } +}); +Object.defineProperty(exports, "LOG_LEVEL_ERROR", { + enumerable: true, + get: function () { + return _common.LOG_LEVEL_ERROR; + } +}); +Object.defineProperty(exports, "LOG_LEVEL_WARN", { + enumerable: true, + get: function () { + return _common.LOG_LEVEL_WARN; + } +}); +Object.defineProperty(exports, "LOG_LEVEL_INFO", { + enumerable: true, + get: function () { + return _common.LOG_LEVEL_INFO; + } +}); +Object.defineProperty(exports, "LOG_LEVEL_DEBUG", { + enumerable: true, + get: function () { + return _common.LOG_LEVEL_DEBUG; + } +}); +Object.defineProperty(exports, "LOG_LEVEL_ALL", { + enumerable: true, + get: function () { + return _common.LOG_LEVEL_ALL; + } +}); +exports.default = void 0; + +var _client = _interopRequireDefault(require("./client")); + +var _common = require("./common"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var _default = _client.default; +exports.default = _default; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJJbWFwQ2xpZW50Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBRUE7Ozs7ZUFTZUEsZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBJbWFwQ2xpZW50IGZyb20gJy4vY2xpZW50J1xuXG5leHBvcnQge1xuICBMT0dfTEVWRUxfTk9ORSxcbiAgTE9HX0xFVkVMX0VSUk9SLFxuICBMT0dfTEVWRUxfV0FSTixcbiAgTE9HX0xFVkVMX0lORk8sXG4gIExPR19MRVZFTF9ERUJVRyxcbiAgTE9HX0xFVkVMX0FMTFxufSBmcm9tICcuL2NvbW1vbidcblxuZXhwb3J0IGRlZmF1bHQgSW1hcENsaWVudFxuIl19 \ No newline at end of file diff --git a/dist/logger.js b/dist/logger.js new file mode 100644 index 00000000..8f685139 --- /dev/null +++ b/dist/logger.js @@ -0,0 +1,38 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = createDefaultLogger; + +var _common = require("./common"); + +let SESSIONCOUNTER = 0; + +function createDefaultLogger(username, hostname) { + const session = ++SESSIONCOUNTER; + + const log = (level, messages) => { + messages = messages.map(msg => typeof msg === 'function' ? msg() : msg); + const date = new Date().toISOString(); + const logMessage = `[${date}][${session}][${username}][${hostname}] ${messages.join(' ')}`; + + if (level === _common.LOG_LEVEL_DEBUG) { + console.log('[DEBUG]' + logMessage); + } else if (level === _common.LOG_LEVEL_INFO) { + console.info('[INFO]' + logMessage); + } else if (level === _common.LOG_LEVEL_WARN) { + console.warn('[WARN]' + logMessage); + } else if (level === _common.LOG_LEVEL_ERROR) { + console.error('[ERROR]' + logMessage); + } + }; + + return { + debug: msgs => log(_common.LOG_LEVEL_DEBUG, msgs), + info: msgs => log(_common.LOG_LEVEL_INFO, msgs), + warn: msgs => log(_common.LOG_LEVEL_WARN, msgs), + error: msgs => log(_common.LOG_LEVEL_ERROR, msgs) + }; +} +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9sb2dnZXIuanMiXSwibmFtZXMiOlsiU0VTU0lPTkNPVU5URVIiLCJjcmVhdGVEZWZhdWx0TG9nZ2VyIiwidXNlcm5hbWUiLCJob3N0bmFtZSIsInNlc3Npb24iLCJsb2ciLCJsZXZlbCIsIm1lc3NhZ2VzIiwibWFwIiwibXNnIiwiZGF0ZSIsIkRhdGUiLCJ0b0lTT1N0cmluZyIsImxvZ01lc3NhZ2UiLCJqb2luIiwiTE9HX0xFVkVMX0RFQlVHIiwiY29uc29sZSIsIkxPR19MRVZFTF9JTkZPIiwiaW5mbyIsIkxPR19MRVZFTF9XQVJOIiwid2FybiIsIkxPR19MRVZFTF9FUlJPUiIsImVycm9yIiwiZGVidWciLCJtc2dzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBT0EsSUFBSUEsY0FBYyxHQUFHLENBQXJCOztBQUVlLFNBQVNDLG1CQUFULENBQThCQyxRQUE5QixFQUF3Q0MsUUFBeEMsRUFBa0Q7QUFDL0QsUUFBTUMsT0FBTyxHQUFHLEVBQUVKLGNBQWxCOztBQUNBLFFBQU1LLEdBQUcsR0FBRyxDQUFDQyxLQUFELEVBQVFDLFFBQVIsS0FBcUI7QUFDL0JBLElBQUFBLFFBQVEsR0FBR0EsUUFBUSxDQUFDQyxHQUFULENBQWFDLEdBQUcsSUFBSSxPQUFPQSxHQUFQLEtBQWUsVUFBZixHQUE0QkEsR0FBRyxFQUEvQixHQUFvQ0EsR0FBeEQsQ0FBWDtBQUNBLFVBQU1DLElBQUksR0FBRyxJQUFJQyxJQUFKLEdBQVdDLFdBQVgsRUFBYjtBQUNBLFVBQU1DLFVBQVUsR0FBSSxJQUFHSCxJQUFLLEtBQUlOLE9BQVEsS0FBSUYsUUFBUyxLQUFJQyxRQUFTLEtBQUlJLFFBQVEsQ0FBQ08sSUFBVCxDQUFjLEdBQWQsQ0FBbUIsRUFBekY7O0FBQ0EsUUFBSVIsS0FBSyxLQUFLUyx1QkFBZCxFQUErQjtBQUM3QkMsTUFBQUEsT0FBTyxDQUFDWCxHQUFSLENBQVksWUFBWVEsVUFBeEI7QUFDRCxLQUZELE1BRU8sSUFBSVAsS0FBSyxLQUFLVyxzQkFBZCxFQUE4QjtBQUNuQ0QsTUFBQUEsT0FBTyxDQUFDRSxJQUFSLENBQWEsV0FBV0wsVUFBeEI7QUFDRCxLQUZNLE1BRUEsSUFBSVAsS0FBSyxLQUFLYSxzQkFBZCxFQUE4QjtBQUNuQ0gsTUFBQUEsT0FBTyxDQUFDSSxJQUFSLENBQWEsV0FBV1AsVUFBeEI7QUFDRCxLQUZNLE1BRUEsSUFBSVAsS0FBSyxLQUFLZSx1QkFBZCxFQUErQjtBQUNwQ0wsTUFBQUEsT0FBTyxDQUFDTSxLQUFSLENBQWMsWUFBWVQsVUFBMUI7QUFDRDtBQUNGLEdBYkQ7O0FBZUEsU0FBTztBQUNMVSxJQUFBQSxLQUFLLEVBQUVDLElBQUksSUFBSW5CLEdBQUcsQ0FBQ1UsdUJBQUQsRUFBa0JTLElBQWxCLENBRGI7QUFFTE4sSUFBQUEsSUFBSSxFQUFFTSxJQUFJLElBQUluQixHQUFHLENBQUNZLHNCQUFELEVBQWlCTyxJQUFqQixDQUZaO0FBR0xKLElBQUFBLElBQUksRUFBRUksSUFBSSxJQUFJbkIsR0FBRyxDQUFDYyxzQkFBRCxFQUFpQkssSUFBakIsQ0FIWjtBQUlMRixJQUFBQSxLQUFLLEVBQUVFLElBQUksSUFBSW5CLEdBQUcsQ0FBQ2dCLHVCQUFELEVBQWtCRyxJQUFsQjtBQUpiLEdBQVA7QUFNRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIExPR19MRVZFTF9FUlJPUixcbiAgTE9HX0xFVkVMX1dBUk4sXG4gIExPR19MRVZFTF9JTkZPLFxuICBMT0dfTEVWRUxfREVCVUdcbn0gZnJvbSAnLi9jb21tb24nXG5cbmxldCBTRVNTSU9OQ09VTlRFUiA9IDBcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdExvZ2dlciAodXNlcm5hbWUsIGhvc3RuYW1lKSB7XG4gIGNvbnN0IHNlc3Npb24gPSArK1NFU1NJT05DT1VOVEVSXG4gIGNvbnN0IGxvZyA9IChsZXZlbCwgbWVzc2FnZXMpID0+IHtcbiAgICBtZXNzYWdlcyA9IG1lc3NhZ2VzLm1hcChtc2cgPT4gdHlwZW9mIG1zZyA9PT0gJ2Z1bmN0aW9uJyA/IG1zZygpIDogbXNnKVxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgICBjb25zdCBsb2dNZXNzYWdlID0gYFske2RhdGV9XVske3Nlc3Npb259XVske3VzZXJuYW1lfV1bJHtob3N0bmFtZX1dICR7bWVzc2FnZXMuam9pbignICcpfWBcbiAgICBpZiAobGV2ZWwgPT09IExPR19MRVZFTF9ERUJVRykge1xuICAgICAgY29uc29sZS5sb2coJ1tERUJVR10nICsgbG9nTWVzc2FnZSlcbiAgICB9IGVsc2UgaWYgKGxldmVsID09PSBMT0dfTEVWRUxfSU5GTykge1xuICAgICAgY29uc29sZS5pbmZvKCdbSU5GT10nICsgbG9nTWVzc2FnZSlcbiAgICB9IGVsc2UgaWYgKGxldmVsID09PSBMT0dfTEVWRUxfV0FSTikge1xuICAgICAgY29uc29sZS53YXJuKCdbV0FSTl0nICsgbG9nTWVzc2FnZSlcbiAgICB9IGVsc2UgaWYgKGxldmVsID09PSBMT0dfTEVWRUxfRVJST1IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tFUlJPUl0nICsgbG9nTWVzc2FnZSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGRlYnVnOiBtc2dzID0+IGxvZyhMT0dfTEVWRUxfREVCVUcsIG1zZ3MpLFxuICAgIGluZm86IG1zZ3MgPT4gbG9nKExPR19MRVZFTF9JTkZPLCBtc2dzKSxcbiAgICB3YXJuOiBtc2dzID0+IGxvZyhMT0dfTEVWRUxfV0FSTiwgbXNncyksXG4gICAgZXJyb3I6IG1zZ3MgPT4gbG9nKExPR19MRVZFTF9FUlJPUiwgbXNncylcbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/dist/special-use-unit.js b/dist/special-use-unit.js new file mode 100644 index 00000000..738633ef --- /dev/null +++ b/dist/special-use-unit.js @@ -0,0 +1,42 @@ +"use strict"; + +var _specialUse = require("./special-use"); + +/* eslint-disable no-unused-expressions */ + +/* eslint-disable no-useless-escape */ +describe('checkSpecialUse', () => { + it('should return a matching special use flag', () => { + expect((0, _specialUse.checkSpecialUse)({ + flags: ['test', '\\All'] + })).to.equal('\\All'); + }); + it('should fail for non-existent flag', () => { + expect((0, _specialUse.checkSpecialUse)({})).to.be.false; + }); + it('should fail for invalid flag', () => { + expect((0, _specialUse.checkSpecialUse)({ + flags: ['test'] + })).to.be.false; + }); + it('should return special use flag if a matching name is found', () => { + expect((0, _specialUse.checkSpecialUse)({ + name: 'test' + })).to.be.false; + expect((0, _specialUse.checkSpecialUse)({ + name: 'Praht' + })).to.equal('\\Trash'); + expect((0, _specialUse.checkSpecialUse)({ + flags: ['\HasChildren'], + // not a special use flag + name: 'Praht' + })).to.equal('\\Trash'); + }); + it('should prefer matching special use flag over a matching name', () => { + expect((0, _specialUse.checkSpecialUse)({ + flags: ['\\All'], + name: 'Praht' + })).to.equal('\\All'); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9zcGVjaWFsLXVzZS11bml0LmpzIl0sIm5hbWVzIjpbImRlc2NyaWJlIiwiaXQiLCJleHBlY3QiLCJmbGFncyIsInRvIiwiZXF1YWwiLCJiZSIsImZhbHNlIiwibmFtZSJdLCJtYXBwaW5ncyI6Ijs7QUFHQTs7QUFIQTs7QUFDQTtBQUlBQSxRQUFRLENBQUMsaUJBQUQsRUFBb0IsTUFBTTtBQUNoQ0MsRUFBQUEsRUFBRSxDQUFDLDJDQUFELEVBQThDLE1BQU07QUFDcERDLElBQUFBLE1BQU0sQ0FBQyxpQ0FBZ0I7QUFDckJDLE1BQUFBLEtBQUssRUFBRSxDQUFDLE1BQUQsRUFBUyxPQUFUO0FBRGMsS0FBaEIsQ0FBRCxDQUFOLENBRUlDLEVBRkosQ0FFT0MsS0FGUCxDQUVhLE9BRmI7QUFHRCxHQUpDLENBQUY7QUFNQUosRUFBQUEsRUFBRSxDQUFDLG1DQUFELEVBQXNDLE1BQU07QUFDNUNDLElBQUFBLE1BQU0sQ0FBQyxpQ0FBZ0IsRUFBaEIsQ0FBRCxDQUFOLENBQTRCRSxFQUE1QixDQUErQkUsRUFBL0IsQ0FBa0NDLEtBQWxDO0FBQ0QsR0FGQyxDQUFGO0FBSUFOLEVBQUFBLEVBQUUsQ0FBQyw4QkFBRCxFQUFpQyxNQUFNO0FBQ3ZDQyxJQUFBQSxNQUFNLENBQUMsaUNBQWdCO0FBQ3JCQyxNQUFBQSxLQUFLLEVBQUUsQ0FBQyxNQUFEO0FBRGMsS0FBaEIsQ0FBRCxDQUFOLENBRUlDLEVBRkosQ0FFT0UsRUFGUCxDQUVVQyxLQUZWO0FBR0QsR0FKQyxDQUFGO0FBTUFOLEVBQUFBLEVBQUUsQ0FBQyw0REFBRCxFQUErRCxNQUFNO0FBQ3JFQyxJQUFBQSxNQUFNLENBQUMsaUNBQWdCO0FBQ3JCTSxNQUFBQSxJQUFJLEVBQUU7QUFEZSxLQUFoQixDQUFELENBQU4sQ0FFSUosRUFGSixDQUVPRSxFQUZQLENBRVVDLEtBRlY7QUFHQUwsSUFBQUEsTUFBTSxDQUFDLGlDQUFnQjtBQUNyQk0sTUFBQUEsSUFBSSxFQUFFO0FBRGUsS0FBaEIsQ0FBRCxDQUFOLENBRUlKLEVBRkosQ0FFT0MsS0FGUCxDQUVhLFNBRmI7QUFHQUgsSUFBQUEsTUFBTSxDQUFDLGlDQUFnQjtBQUNyQkMsTUFBQUEsS0FBSyxFQUFFLENBQUMsY0FBRCxDQURjO0FBQ0k7QUFDekJLLE1BQUFBLElBQUksRUFBRTtBQUZlLEtBQWhCLENBQUQsQ0FBTixDQUdJSixFQUhKLENBR09DLEtBSFAsQ0FHYSxTQUhiO0FBSUQsR0FYQyxDQUFGO0FBYUFKLEVBQUFBLEVBQUUsQ0FBQyw4REFBRCxFQUFpRSxNQUFNO0FBQ3ZFQyxJQUFBQSxNQUFNLENBQUMsaUNBQWdCO0FBQ3JCQyxNQUFBQSxLQUFLLEVBQUUsQ0FBQyxPQUFELENBRGM7QUFFckJLLE1BQUFBLElBQUksRUFBRTtBQUZlLEtBQWhCLENBQUQsQ0FBTixDQUdJSixFQUhKLENBR09DLEtBSFAsQ0FHYSxPQUhiO0FBSUQsR0FMQyxDQUFGO0FBTUQsQ0FwQ08sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC1leHByZXNzaW9ucyAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tdXNlbGVzcy1lc2NhcGUgKi9cblxuaW1wb3J0IHsgY2hlY2tTcGVjaWFsVXNlIH0gZnJvbSAnLi9zcGVjaWFsLXVzZSdcblxuZGVzY3JpYmUoJ2NoZWNrU3BlY2lhbFVzZScsICgpID0+IHtcbiAgaXQoJ3Nob3VsZCByZXR1cm4gYSBtYXRjaGluZyBzcGVjaWFsIHVzZSBmbGFnJywgKCkgPT4ge1xuICAgIGV4cGVjdChjaGVja1NwZWNpYWxVc2Uoe1xuICAgICAgZmxhZ3M6IFsndGVzdCcsICdcXFxcQWxsJ11cbiAgICB9KSkudG8uZXF1YWwoJ1xcXFxBbGwnKVxuICB9KVxuXG4gIGl0KCdzaG91bGQgZmFpbCBmb3Igbm9uLWV4aXN0ZW50IGZsYWcnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGNoZWNrU3BlY2lhbFVzZSh7fSkpLnRvLmJlLmZhbHNlXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCBmYWlsIGZvciBpbnZhbGlkIGZsYWcnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGNoZWNrU3BlY2lhbFVzZSh7XG4gICAgICBmbGFnczogWyd0ZXN0J11cbiAgICB9KSkudG8uYmUuZmFsc2VcbiAgfSlcblxuICBpdCgnc2hvdWxkIHJldHVybiBzcGVjaWFsIHVzZSBmbGFnIGlmIGEgbWF0Y2hpbmcgbmFtZSBpcyBmb3VuZCcsICgpID0+IHtcbiAgICBleHBlY3QoY2hlY2tTcGVjaWFsVXNlKHtcbiAgICAgIG5hbWU6ICd0ZXN0J1xuICAgIH0pKS50by5iZS5mYWxzZVxuICAgIGV4cGVjdChjaGVja1NwZWNpYWxVc2Uoe1xuICAgICAgbmFtZTogJ1ByYWh0J1xuICAgIH0pKS50by5lcXVhbCgnXFxcXFRyYXNoJylcbiAgICBleHBlY3QoY2hlY2tTcGVjaWFsVXNlKHtcbiAgICAgIGZsYWdzOiBbJ1xcSGFzQ2hpbGRyZW4nXSwgLy8gbm90IGEgc3BlY2lhbCB1c2UgZmxhZ1xuICAgICAgbmFtZTogJ1ByYWh0J1xuICAgIH0pKS50by5lcXVhbCgnXFxcXFRyYXNoJylcbiAgfSlcblxuICBpdCgnc2hvdWxkIHByZWZlciBtYXRjaGluZyBzcGVjaWFsIHVzZSBmbGFnIG92ZXIgYSBtYXRjaGluZyBuYW1lJywgKCkgPT4ge1xuICAgIGV4cGVjdChjaGVja1NwZWNpYWxVc2Uoe1xuICAgICAgZmxhZ3M6IFsnXFxcXEFsbCddLFxuICAgICAgbmFtZTogJ1ByYWh0J1xuICAgIH0pKS50by5lcXVhbCgnXFxcXEFsbCcpXG4gIH0pXG59KVxuIl19 \ No newline at end of file diff --git a/dist/special-use.js b/dist/special-use.js new file mode 100644 index 00000000..5d7a861b --- /dev/null +++ b/dist/special-use.js @@ -0,0 +1,55 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.checkSpecialUse = checkSpecialUse; + +var _ramda = require("ramda"); + +const SPECIAL_USE_FLAGS = ['\\All', '\\Archive', '\\Drafts', '\\Flagged', '\\Junk', '\\Sent', '\\Trash']; +const SPECIAL_USE_BOXES = { + '\\Sent': ['aika', 'bidaliak', 'bidalita', 'dihantar', 'e rometsweng', 'e tindami', 'elküldött', 'elküldöttek', 'enviadas', 'enviadas', 'enviados', 'enviats', 'envoyés', 'ethunyelweyo', 'expediate', 'ezipuru', 'gesendete', 'gestuur', 'gönderilmiş öğeler', 'göndərilənlər', 'iberilen', 'inviati', 'išsiųstieji', 'kuthunyelwe', 'lasa', 'lähetetyt', 'messages envoyés', 'naipadala', 'nalefa', 'napadala', 'nosūtītās ziņas', 'odeslané', 'padala', 'poslane', 'poslano', 'poslano', 'poslané', 'poslato', 'saadetud', 'saadetud kirjad', 'sendt', 'sendt', 'sent', 'sent items', 'sent messages', 'sända poster', 'sänt', 'terkirim', 'ti fi ranṣẹ', 'të dërguara', 'verzonden', 'vilivyotumwa', 'wysłane', 'đã gửi', 'σταλθέντα', 'жиберилген', 'жіберілгендер', 'изпратени', 'илгээсэн', 'ирсол шуд', 'испратено', 'надіслані', 'отправленные', 'пасланыя', 'юборилган', 'ուղարկված', 'נשלחו', 'פריטים שנשלחו', 'المرسلة', 'بھیجے گئے', 'سوزمژہ', 'لېګل شوی', 'موارد ارسال شده', 'पाठविले', 'पाठविलेले', 'प्रेषित', 'भेजा गया', 'প্রেরিত', 'প্রেরিত', 'প্ৰেৰিত', 'ਭੇਜੇ', 'મોકલેલા', 'ପଠାଗଲା', 'அனுப்பியவை', 'పంపించబడింది', 'ಕಳುಹಿಸಲಾದ', 'അയച്ചു', 'යැවු පණිවුඩ', 'ส่งแล้ว', 'გაგზავნილი', 'የተላኩ', 'បាន​ផ្ញើ', '寄件備份', '寄件備份', '已发信息', '送信済みメール', '발신 메시지', '보낸 편지함'], + '\\Trash': ['articole șterse', 'bin', 'borttagna objekt', 'deleted', 'deleted items', 'deleted messages', 'elementi eliminati', 'elementos borrados', 'elementos eliminados', 'gelöschte objekte', 'item dipadam', 'itens apagados', 'itens excluídos', 'mục đã xóa', 'odstraněné položky', 'pesan terhapus', 'poistetut', 'praht', 'prügikast', 'silinmiş öğeler', 'slettede beskeder', 'slettede elementer', 'trash', 'törölt elemek', 'usunięte wiadomości', 'verwijderde items', 'vymazané správy', 'éléments supprimés', 'видалені', 'жойылғандар', 'удаленные', 'פריטים שנמחקו', 'العناصر المحذوفة', 'موارد حذف شده', 'รายการที่ลบ', '已删除邮件', '已刪除項目', '已刪除項目'], + '\\Junk': ['bulk mail', 'correo no deseado', 'courrier indésirable', 'istenmeyen', 'istenmeyen e-posta', 'junk', 'levélszemét', 'nevyžiadaná pošta', 'nevyžádaná pošta', 'no deseado', 'posta indesiderata', 'pourriel', 'roskaposti', 'skräppost', 'spam', 'spam', 'spamowanie', 'søppelpost', 'thư rác', 'спам', 'דואר זבל', 'الرسائل العشوائية', 'هرزنامه', 'สแปม', '‎垃圾郵件', '垃圾邮件', '垃圾電郵'], + '\\Drafts': ['ba brouillon', 'borrador', 'borrador', 'borradores', 'bozze', 'brouillons', 'bản thảo', 'ciorne', 'concepten', 'draf', 'drafts', 'drög', 'entwürfe', 'esborranys', 'garalamalar', 'ihe edeturu', 'iidrafti', 'izinhlaka', 'juodraščiai', 'kladd', 'kladder', 'koncepty', 'koncepty', 'konsep', 'konsepte', 'kopie robocze', 'layihələr', 'luonnokset', 'melnraksti', 'meralo', 'mesazhe të padërguara', 'mga draft', 'mustandid', 'nacrti', 'nacrti', 'osnutki', 'piszkozatok', 'rascunhos', 'rasimu', 'skice', 'taslaklar', 'tsararrun saƙonni', 'utkast', 'vakiraoka', 'vázlatok', 'zirriborroak', 'àwọn àkọpamọ́', 'πρόχειρα', 'жобалар', 'нацрти', 'нооргууд', 'сиёҳнавис', 'хомаки хатлар', 'чарнавікі', 'чернетки', 'чернови', 'черновики', 'черновиктер', 'սևագրեր', 'טיוטות', 'مسودات', 'مسودات', 'موسودې', 'پیش نویسها', 'ڈرافٹ/', 'ड्राफ़्ट', 'प्रारूप', 'খসড়া', 'খসড়া', 'ড্ৰাফ্ট', 'ਡ੍ਰਾਫਟ', 'ડ્રાફ્ટસ', 'ଡ୍ରାଫ୍ଟ', 'வரைவுகள்', 'చిత్తు ప్రతులు', 'ಕರಡುಗಳು', 'കരടുകള്‍', 'කෙටුම් පත්', 'ฉบับร่าง', 'მონახაზები', 'ረቂቆች', 'សារព្រាង', '下書き', '草稿', '草稿', '草稿', '임시 보관함'] +}; +const SPECIAL_USE_BOX_FLAGS = Object.keys(SPECIAL_USE_BOXES); +/** + * Checks if a mailbox is for special use + * + * @param {Object} mailbox + * @return {String} Special use flag (if detected) + */ + +function checkSpecialUse(mailbox) { + if (mailbox.flags) { + for (let i = 0; i < SPECIAL_USE_FLAGS.length; i++) { + const type = SPECIAL_USE_FLAGS[i]; + + if ((mailbox.flags || []).indexOf(type) >= 0) { + mailbox.specialUse = type; + mailbox.specialUseFlag = type; + return type; + } + } + } + + return checkSpecialUseByName(mailbox); +} + +function checkSpecialUseByName(mailbox) { + const name = (0, _ramda.propOr)('', 'name', mailbox).toLowerCase().trim(); + + for (let i = 0; i < SPECIAL_USE_BOX_FLAGS.length; i++) { + const type = SPECIAL_USE_BOX_FLAGS[i]; + + if (SPECIAL_USE_BOXES[type].indexOf(name) >= 0) { + mailbox.specialUse = type; + return type; + } + } + + return false; +} +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9zcGVjaWFsLXVzZS5qcyJdLCJuYW1lcyI6WyJTUEVDSUFMX1VTRV9GTEFHUyIsIlNQRUNJQUxfVVNFX0JPWEVTIiwiU1BFQ0lBTF9VU0VfQk9YX0ZMQUdTIiwiT2JqZWN0Iiwia2V5cyIsImNoZWNrU3BlY2lhbFVzZSIsIm1haWxib3giLCJmbGFncyIsImkiLCJsZW5ndGgiLCJ0eXBlIiwiaW5kZXhPZiIsInNwZWNpYWxVc2UiLCJzcGVjaWFsVXNlRmxhZyIsImNoZWNrU3BlY2lhbFVzZUJ5TmFtZSIsIm5hbWUiLCJ0b0xvd2VyQ2FzZSIsInRyaW0iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFFQSxNQUFNQSxpQkFBaUIsR0FBRyxDQUFDLE9BQUQsRUFBVSxXQUFWLEVBQXVCLFVBQXZCLEVBQW1DLFdBQW5DLEVBQWdELFFBQWhELEVBQTBELFFBQTFELEVBQW9FLFNBQXBFLENBQTFCO0FBQ0EsTUFBTUMsaUJBQWlCLEdBQUc7QUFDeEIsWUFBVSxDQUNSLE1BRFEsRUFDQSxVQURBLEVBQ1ksVUFEWixFQUN3QixVQUR4QixFQUNvQyxjQURwQyxFQUNvRCxXQURwRCxFQUNpRSxXQURqRSxFQUM4RSxhQUQ5RSxFQUM2RixVQUQ3RixFQUVSLFVBRlEsRUFFSSxVQUZKLEVBRWdCLFNBRmhCLEVBRTJCLFNBRjNCLEVBRXNDLGNBRnRDLEVBRXNELFdBRnRELEVBRW1FLFNBRm5FLEVBRThFLFdBRjlFLEVBRTJGLFNBRjNGLEVBR1Isb0JBSFEsRUFHYyxlQUhkLEVBRytCLFVBSC9CLEVBRzJDLFNBSDNDLEVBR3NELGFBSHRELEVBR3FFLGFBSHJFLEVBR29GLE1BSHBGLEVBRzRGLFdBSDVGLEVBSVIsa0JBSlEsRUFJWSxXQUpaLEVBSXlCLFFBSnpCLEVBSW1DLFVBSm5DLEVBSStDLGlCQUovQyxFQUlrRSxVQUpsRSxFQUk4RSxRQUo5RSxFQUl3RixTQUp4RixFQUtSLFNBTFEsRUFLRyxTQUxILEVBS2MsU0FMZCxFQUt5QixTQUx6QixFQUtvQyxVQUxwQyxFQUtnRCxpQkFMaEQsRUFLbUUsT0FMbkUsRUFLNEUsT0FMNUUsRUFLcUYsTUFMckYsRUFLNkYsWUFMN0YsRUFNUixlQU5RLEVBTVMsY0FOVCxFQU15QixNQU56QixFQU1pQyxVQU5qQyxFQU02QyxhQU43QyxFQU00RCxhQU41RCxFQU0yRSxXQU4zRSxFQU13RixjQU54RixFQU9SLFNBUFEsRUFPRyxRQVBILEVBT2EsV0FQYixFQU8wQixZQVAxQixFQU93QyxlQVB4QyxFQU95RCxXQVB6RCxFQU9zRSxVQVB0RSxFQU9rRixXQVBsRixFQU8rRixXQVAvRixFQVFSLFdBUlEsRUFRSyxjQVJMLEVBUXFCLFVBUnJCLEVBUWlDLFdBUmpDLEVBUThDLFdBUjlDLEVBUTJELE9BUjNELEVBUW9FLGVBUnBFLEVBUXFGLFNBUnJGLEVBUWdHLFdBUmhHLEVBU1IsUUFUUSxFQVNFLFVBVEYsRUFTYyxpQkFUZCxFQVNpQyxTQVRqQyxFQVM0QyxXQVQ1QyxFQVN5RCxTQVR6RCxFQVNvRSxVQVRwRSxFQVNnRixTQVRoRixFQVMyRixTQVQzRixFQVNzRyxTQVR0RyxFQVNpSCxNQVRqSCxFQVN5SCxTQVR6SCxFQVVSLFFBVlEsRUFVRSxZQVZGLEVBVWdCLGNBVmhCLEVBVWdDLFdBVmhDLEVBVTZDLFFBVjdDLEVBVXVELGFBVnZELEVBVXNFLFNBVnRFLEVBVWlGLFlBVmpGLEVBVStGLE1BVi9GLEVBVXVHLFVBVnZHLEVBV1IsTUFYUSxFQVdBLE1BWEEsRUFXUSxNQVhSLEVBV2dCLFNBWGhCLEVBVzJCLFFBWDNCLEVBV3FDLFFBWHJDLENBRGM7QUFjeEIsYUFBVyxDQUNULGlCQURTLEVBQ1UsS0FEVixFQUNpQixrQkFEakIsRUFDcUMsU0FEckMsRUFDZ0QsZUFEaEQsRUFDaUUsa0JBRGpFLEVBQ3FGLG9CQURyRixFQUVULG9CQUZTLEVBRWEsc0JBRmIsRUFFcUMsbUJBRnJDLEVBRTBELGNBRjFELEVBRTBFLGdCQUYxRSxFQUU0RixpQkFGNUYsRUFHVCxZQUhTLEVBR0ssb0JBSEwsRUFHMkIsZ0JBSDNCLEVBRzZDLFdBSDdDLEVBRzBELE9BSDFELEVBR21FLFdBSG5FLEVBR2dGLGlCQUhoRixFQUlULG1CQUpTLEVBSVksb0JBSlosRUFJa0MsT0FKbEMsRUFJMkMsZUFKM0MsRUFJNEQscUJBSjVELEVBSW1GLG1CQUpuRixFQUtULGlCQUxTLEVBS1Usb0JBTFYsRUFLZ0MsVUFMaEMsRUFLNEMsYUFMNUMsRUFLMkQsV0FMM0QsRUFLd0UsZUFMeEUsRUFLeUYsa0JBTHpGLEVBTVQsZUFOUyxFQU1RLGFBTlIsRUFNdUIsT0FOdkIsRUFNZ0MsT0FOaEMsRUFNeUMsT0FOekMsQ0FkYTtBQXNCeEIsWUFBVSxDQUNSLFdBRFEsRUFDSyxtQkFETCxFQUMwQixzQkFEMUIsRUFDa0QsWUFEbEQsRUFDZ0Usb0JBRGhFLEVBQ3NGLE1BRHRGLEVBQzhGLGFBRDlGLEVBRVIsbUJBRlEsRUFFYSxrQkFGYixFQUVpQyxZQUZqQyxFQUUrQyxvQkFGL0MsRUFFcUUsVUFGckUsRUFFaUYsWUFGakYsRUFFK0YsV0FGL0YsRUFHUixNQUhRLEVBR0EsTUFIQSxFQUdRLFlBSFIsRUFHc0IsWUFIdEIsRUFHb0MsU0FIcEMsRUFHK0MsTUFIL0MsRUFHdUQsVUFIdkQsRUFHbUUsbUJBSG5FLEVBR3dGLFNBSHhGLEVBR21HLE1BSG5HLEVBSVIsT0FKUSxFQUlDLE1BSkQsRUFJUyxNQUpULENBdEJjO0FBNEJ4QixjQUFZLENBQ1YsY0FEVSxFQUNNLFVBRE4sRUFDa0IsVUFEbEIsRUFDOEIsWUFEOUIsRUFDNEMsT0FENUMsRUFDcUQsWUFEckQsRUFDbUUsVUFEbkUsRUFDK0UsUUFEL0UsRUFDeUYsV0FEekYsRUFDc0csTUFEdEcsRUFFVixRQUZVLEVBRUEsTUFGQSxFQUVRLFVBRlIsRUFFb0IsWUFGcEIsRUFFa0MsYUFGbEMsRUFFaUQsYUFGakQsRUFFZ0UsVUFGaEUsRUFFNEUsV0FGNUUsRUFFeUYsYUFGekYsRUFFd0csT0FGeEcsRUFHVixTQUhVLEVBR0MsVUFIRCxFQUdhLFVBSGIsRUFHeUIsUUFIekIsRUFHbUMsVUFIbkMsRUFHK0MsZUFIL0MsRUFHZ0UsV0FIaEUsRUFHNkUsWUFIN0UsRUFHMkYsWUFIM0YsRUFHeUcsUUFIekcsRUFJVix1QkFKVSxFQUllLFdBSmYsRUFJNEIsV0FKNUIsRUFJeUMsUUFKekMsRUFJbUQsUUFKbkQsRUFJNkQsU0FKN0QsRUFJd0UsYUFKeEUsRUFJdUYsV0FKdkYsRUFJb0csUUFKcEcsRUFLVixPQUxVLEVBS0QsV0FMQyxFQUtZLG1CQUxaLEVBS2lDLFFBTGpDLEVBSzJDLFdBTDNDLEVBS3dELFVBTHhELEVBS29FLGNBTHBFLEVBS29GLGVBTHBGLEVBS3FHLFVBTHJHLEVBTVYsU0FOVSxFQU1DLFFBTkQsRUFNVyxVQU5YLEVBTXVCLFdBTnZCLEVBTW9DLGVBTnBDLEVBTXFELFdBTnJELEVBTWtFLFVBTmxFLEVBTThFLFNBTjlFLEVBTXlGLFdBTnpGLEVBTXNHLGFBTnRHLEVBT1YsU0FQVSxFQU9DLFFBUEQsRUFPVyxRQVBYLEVBT3FCLFFBUHJCLEVBTytCLFFBUC9CLEVBT3lDLFlBUHpDLEVBT3VELFFBUHZELEVBT2lFLFNBUGpFLEVBTzRFLFNBUDVFLEVBT3VGLE1BUHZGLEVBTytGLE1BUC9GLEVBT3VHLFNBUHZHLEVBT2tILFFBUGxILEVBTzRILFVBUDVILEVBUVYsU0FSVSxFQVFDLFVBUkQsRUFRYSxnQkFSYixFQVErQixTQVIvQixFQVEwQyxVQVIxQyxFQVFzRCxZQVJ0RCxFQVFvRSxVQVJwRSxFQVFnRixZQVJoRixFQVE4RixNQVI5RixFQVFzRyxVQVJ0RyxFQVFrSCxLQVJsSCxFQVF5SCxJQVJ6SCxFQVNWLElBVFUsRUFTSixJQVRJLEVBU0UsUUFURjtBQTVCWSxDQUExQjtBQXdDQSxNQUFNQyxxQkFBcUIsR0FBR0MsTUFBTSxDQUFDQyxJQUFQLENBQVlILGlCQUFaLENBQTlCO0FBRUE7Ozs7Ozs7QUFNTyxTQUFTSSxlQUFULENBQTBCQyxPQUExQixFQUFtQztBQUN4QyxNQUFJQSxPQUFPLENBQUNDLEtBQVosRUFBbUI7QUFDakIsU0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHUixpQkFBaUIsQ0FBQ1MsTUFBdEMsRUFBOENELENBQUMsRUFBL0MsRUFBbUQ7QUFDakQsWUFBTUUsSUFBSSxHQUFHVixpQkFBaUIsQ0FBQ1EsQ0FBRCxDQUE5Qjs7QUFDQSxVQUFJLENBQUNGLE9BQU8sQ0FBQ0MsS0FBUixJQUFpQixFQUFsQixFQUFzQkksT0FBdEIsQ0FBOEJELElBQTlCLEtBQXVDLENBQTNDLEVBQThDO0FBQzVDSixRQUFBQSxPQUFPLENBQUNNLFVBQVIsR0FBcUJGLElBQXJCO0FBQ0FKLFFBQUFBLE9BQU8sQ0FBQ08sY0FBUixHQUF5QkgsSUFBekI7QUFDQSxlQUFPQSxJQUFQO0FBQ0Q7QUFDRjtBQUNGOztBQUVELFNBQU9JLHFCQUFxQixDQUFDUixPQUFELENBQTVCO0FBQ0Q7O0FBRUQsU0FBU1EscUJBQVQsQ0FBZ0NSLE9BQWhDLEVBQXlDO0FBQ3ZDLFFBQU1TLElBQUksR0FBRyxtQkFBTyxFQUFQLEVBQVcsTUFBWCxFQUFtQlQsT0FBbkIsRUFBNEJVLFdBQTVCLEdBQTBDQyxJQUExQyxFQUFiOztBQUVBLE9BQUssSUFBSVQsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR04scUJBQXFCLENBQUNPLE1BQTFDLEVBQWtERCxDQUFDLEVBQW5ELEVBQXVEO0FBQ3JELFVBQU1FLElBQUksR0FBR1IscUJBQXFCLENBQUNNLENBQUQsQ0FBbEM7O0FBQ0EsUUFBSVAsaUJBQWlCLENBQUNTLElBQUQsQ0FBakIsQ0FBd0JDLE9BQXhCLENBQWdDSSxJQUFoQyxLQUF5QyxDQUE3QyxFQUFnRDtBQUM5Q1QsTUFBQUEsT0FBTyxDQUFDTSxVQUFSLEdBQXFCRixJQUFyQjtBQUNBLGFBQU9BLElBQVA7QUFDRDtBQUNGOztBQUVELFNBQU8sS0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcHJvcE9yIH0gZnJvbSAncmFtZGEnXG5cbmNvbnN0IFNQRUNJQUxfVVNFX0ZMQUdTID0gWydcXFxcQWxsJywgJ1xcXFxBcmNoaXZlJywgJ1xcXFxEcmFmdHMnLCAnXFxcXEZsYWdnZWQnLCAnXFxcXEp1bmsnLCAnXFxcXFNlbnQnLCAnXFxcXFRyYXNoJ11cbmNvbnN0IFNQRUNJQUxfVVNFX0JPWEVTID0ge1xuICAnXFxcXFNlbnQnOiBbXG4gICAgJ2Fpa2EnLCAnYmlkYWxpYWsnLCAnYmlkYWxpdGEnLCAnZGloYW50YXInLCAnZSByb21ldHN3ZW5nJywgJ2UgdGluZGFtaScsICdlbGvDvGxkw7Z0dCcsICdlbGvDvGxkw7Z0dGVrJywgJ2VudmlhZGFzJyxcbiAgICAnZW52aWFkYXMnLCAnZW52aWFkb3MnLCAnZW52aWF0cycsICdlbnZvecOpcycsICdldGh1bnllbHdleW8nLCAnZXhwZWRpYXRlJywgJ2V6aXB1cnUnLCAnZ2VzZW5kZXRlJywgJ2dlc3R1dXInLFxuICAgICdnw7ZuZGVyaWxtacWfIMO2xJ9lbGVyJywgJ2fDtm5kyZlyaWzJmW5syZlyJywgJ2liZXJpbGVuJywgJ2ludmlhdGknLCAnacWhc2nFs3N0aWVqaScsICdrdXRodW55ZWx3ZScsICdsYXNhJywgJ2zDpGhldGV0eXQnLFxuICAgICdtZXNzYWdlcyBlbnZvecOpcycsICduYWlwYWRhbGEnLCAnbmFsZWZhJywgJ25hcGFkYWxhJywgJ25vc8WrdMSrdMSBcyB6acWGYXMnLCAnb2Rlc2xhbsOpJywgJ3BhZGFsYScsICdwb3NsYW5lJyxcbiAgICAncG9zbGFubycsICdwb3NsYW5vJywgJ3Bvc2xhbsOpJywgJ3Bvc2xhdG8nLCAnc2FhZGV0dWQnLCAnc2FhZGV0dWQga2lyamFkJywgJ3NlbmR0JywgJ3NlbmR0JywgJ3NlbnQnLCAnc2VudCBpdGVtcycsXG4gICAgJ3NlbnQgbWVzc2FnZXMnLCAnc8OkbmRhIHBvc3RlcicsICdzw6RudCcsICd0ZXJraXJpbScsICd0aSBmaSByYW7huaPhurknLCAndMOrIGTDq3JndWFyYScsICd2ZXJ6b25kZW4nLCAndmlsaXZ5b3R1bXdhJyxcbiAgICAnd3lzxYJhbmUnLCAnxJHDoyBn4butaScsICfPg8+EzrHOu864zq3Ovc+EzrEnLCAn0LbQuNCx0LXRgNC40LvQs9C10L0nLCAn0LbRltCx0LXRgNGW0LvQs9C10L3QtNC10YAnLCAn0LjQt9C/0YDQsNGC0LXQvdC4JywgJ9C40LvQs9GN0Y3RgdGN0L0nLCAn0LjRgNGB0L7QuyDRiNGD0LQnLCAn0LjRgdC/0YDQsNGC0LXQvdC+JyxcbiAgICAn0L3QsNC00ZbRgdC70LDQvdGWJywgJ9C+0YLQv9GA0LDQstC70LXQvdC90YvQtScsICfQv9Cw0YHQu9Cw0L3Ri9GPJywgJ9GO0LHQvtGA0LjQu9Cz0LDQvScsICfVuNaC1bLVodaA1a/VvtWh1a4nLCAn16DXqdec15fXlScsICfXpNeo15nXmNeZ150g16nXoNep15zXl9eVJywgJ9in2YTZhdix2LPZhNipJywgJ9io2r7bjNis25Ig2q/YptuSJyxcbiAgICAn2LPZiNiy2YXamNuBJywgJ9mE25Daq9mEINi02YjbjCcsICfZhdmI2KfYsdivINin2LHYs9in2YQg2LTYr9mHJywgJ+CkquCkvuCkoOCkteCkv+CksuClhycsICfgpKrgpL7gpKDgpLXgpL/gpLLgpYfgpLLgpYcnLCAn4KSq4KWN4KSw4KWH4KS34KS/4KSkJywgJ+CkreClh+CknOCkviDgpJfgpK/gpL4nLCAn4Kaq4KeN4Kaw4KeH4Kaw4Ka/4KakJywgJ+CmquCnjeCmsOCnh+CmsOCmv+CmpCcsICfgpqrgp43gp7Dgp4fgp7Dgpr/gpqQnLCAn4Kit4KmH4Kic4KmHJywgJ+CqruCri+CqleCqsuCrh+CqsuCqvicsXG4gICAgJ+CsquCsoOCsvuCsl+CssuCsvicsICfgroXgrqngr4Hgrqrgr43grqrgrr/grq/grrXgr4gnLCAn4LCq4LCC4LCq4LC/4LCC4LCa4LCs4LCh4LC/4LCC4LCm4LC/JywgJ+CyleCys+CzgeCyueCyv+CyuOCysuCyvuCypicsICfgtIXgtK/gtJrgtY3gtJrgtYEnLCAn4La64LeQ4LeA4LeUIOC2tOC2q+C3kuC3gOC3lOC2qScsICfguKrguYjguIfguYHguKXguYnguKcnLCAn4YOS4YOQ4YOS4YOW4YOQ4YOV4YOc4YOY4YOa4YOYJywgJ+GLqOGJsOGIi+GKqScsICfhnpThnrbhnpPigIvhnpXhn5Lhnonhnr4nLFxuICAgICflr4Tku7blgpnku70nLCAn5a+E5Lu25YKZ5Lu9JywgJ+W3suWPkeS/oeaBrycsICfpgIHkv6HmuIjjgb/vvpLvvbDvvpknLCAn67Cc7IugIOuplOyLnOyngCcsICfrs7Trgrgg7Y647KeA7ZWoJ1xuICBdLFxuICAnXFxcXFRyYXNoJzogW1xuICAgICdhcnRpY29sZSDImXRlcnNlJywgJ2JpbicsICdib3J0dGFnbmEgb2JqZWt0JywgJ2RlbGV0ZWQnLCAnZGVsZXRlZCBpdGVtcycsICdkZWxldGVkIG1lc3NhZ2VzJywgJ2VsZW1lbnRpIGVsaW1pbmF0aScsXG4gICAgJ2VsZW1lbnRvcyBib3JyYWRvcycsICdlbGVtZW50b3MgZWxpbWluYWRvcycsICdnZWzDtnNjaHRlIG9iamVrdGUnLCAnaXRlbSBkaXBhZGFtJywgJ2l0ZW5zIGFwYWdhZG9zJywgJ2l0ZW5zIGV4Y2x1w61kb3MnLFxuICAgICdt4bulYyDEkcOjIHjDs2EnLCAnb2RzdHJhbsSbbsOpIHBvbG/Fvmt5JywgJ3Blc2FuIHRlcmhhcHVzJywgJ3BvaXN0ZXR1dCcsICdwcmFodCcsICdwcsO8Z2lrYXN0JywgJ3NpbGlubWnFnyDDtsSfZWxlcicsXG4gICAgJ3NsZXR0ZWRlIGJlc2tlZGVyJywgJ3NsZXR0ZWRlIGVsZW1lbnRlcicsICd0cmFzaCcsICd0w7Zyw7ZsdCBlbGVtZWsnLCAndXN1bmnEmXRlIHdpYWRvbW/Fm2NpJywgJ3ZlcndpamRlcmRlIGl0ZW1zJyxcbiAgICAndnltYXphbsOpIHNwcsOhdnknLCAnw6lsw6ltZW50cyBzdXBwcmltw6lzJywgJ9Cy0LjQtNCw0LvQtdC90ZYnLCAn0LbQvtC50YvQu9KT0LDQvdC00LDRgCcsICfRg9C00LDQu9C10L3QvdGL0LUnLCAn16TXqNeZ15jXmdedINep16DXnteX16fXlScsICfYp9mE2LnZhtin2LXYsSDYp9mE2YXYrdiw2YjZgdipJyxcbiAgICAn2YXZiNin2LHYryDYrdiw2YEg2LTYr9mHJywgJ+C4o+C4suC4ouC4geC4suC4o+C4l+C4teC5iOC4peC4micsICflt7LliKDpmaTpgq7ku7YnLCAn5bey5Yiq6Zmk6aCF55uuJywgJ+W3suWIqumZpOmgheebridcbiAgXSxcbiAgJ1xcXFxKdW5rJzogW1xuICAgICdidWxrIG1haWwnLCAnY29ycmVvIG5vIGRlc2VhZG8nLCAnY291cnJpZXIgaW5kw6lzaXJhYmxlJywgJ2lzdGVubWV5ZW4nLCAnaXN0ZW5tZXllbiBlLXBvc3RhJywgJ2p1bmsnLCAnbGV2w6lsc3plbcOpdCcsXG4gICAgJ25ldnnFvmlhZGFuw6EgcG/FoXRhJywgJ25ldnnFvsOhZGFuw6EgcG/FoXRhJywgJ25vIGRlc2VhZG8nLCAncG9zdGEgaW5kZXNpZGVyYXRhJywgJ3BvdXJyaWVsJywgJ3Jvc2thcG9zdGknLCAnc2tyw6RwcG9zdCcsXG4gICAgJ3NwYW0nLCAnc3BhbScsICdzcGFtb3dhbmllJywgJ3PDuHBwZWxwb3N0JywgJ3RoxrAgcsOhYycsICfRgdC/0LDQvCcsICfXk9eV15DXqCDXlteR15wnLCAn2KfZhNix2LPYp9im2YQg2KfZhNi52LTZiNin2KbZitipJywgJ9mH2LHYstmG2KfZhdmHJywgJ+C4quC5geC4m+C4oScsXG4gICAgJ+KAjuWeg+WcvumDteS7ticsICflnoPlnL7pgq7ku7YnLCAn5Z6D5Zy+6Zu76YO1J1xuICBdLFxuICAnXFxcXERyYWZ0cyc6IFtcbiAgICAnYmEgYnJvdWlsbG9uJywgJ2JvcnJhZG9yJywgJ2JvcnJhZG9yJywgJ2JvcnJhZG9yZXMnLCAnYm96emUnLCAnYnJvdWlsbG9ucycsICdi4bqjbiB0aOG6o28nLCAnY2lvcm5lJywgJ2NvbmNlcHRlbicsICdkcmFmJyxcbiAgICAnZHJhZnRzJywgJ2Ryw7ZnJywgJ2VudHfDvHJmZScsICdlc2JvcnJhbnlzJywgJ2dhcmFsYW1hbGFyJywgJ2loZSBlZGV0dXJ1JywgJ2lpZHJhZnRpJywgJ2l6aW5obGFrYScsICdqdW9kcmHFocSNaWFpJywgJ2tsYWRkJyxcbiAgICAna2xhZGRlcicsICdrb25jZXB0eScsICdrb25jZXB0eScsICdrb25zZXAnLCAna29uc2VwdGUnLCAna29waWUgcm9ib2N6ZScsICdsYXlpaMmZbMmZcicsICdsdW9ubm9rc2V0JywgJ21lbG5yYWtzdGknLCAnbWVyYWxvJyxcbiAgICAnbWVzYXpoZSB0w6sgcGFkw6tyZ3VhcmEnLCAnbWdhIGRyYWZ0JywgJ211c3RhbmRpZCcsICduYWNydGknLCAnbmFjcnRpJywgJ29zbnV0a2knLCAncGlzemtvemF0b2snLCAncmFzY3VuaG9zJywgJ3Jhc2ltdScsXG4gICAgJ3NraWNlJywgJ3Rhc2xha2xhcicsICd0c2FyYXJydW4gc2HGmW9ubmknLCAndXRrYXN0JywgJ3Zha2lyYW9rYScsICd2w6F6bGF0b2snLCAnemlycmlib3Jyb2FrJywgJ8Ogd+G7jW4gw6Br4buNcGFt4buNzIEnLCAnz4DPgc+Mz4fOtc65z4HOsScsXG4gICAgJ9C20L7QsdCw0LvQsNGAJywgJ9C90LDRhtGA0YLQuCcsICfQvdC+0L7RgNCz0YPRg9C0JywgJ9GB0LjRkdKz0L3QsNCy0LjRgScsICfRhdC+0LzQsNC60Lgg0YXQsNGC0LvQsNGAJywgJ9GH0LDRgNC90LDQstGW0LrRlicsICfRh9C10YDQvdC10YLQutC4JywgJ9GH0LXRgNC90L7QstC4JywgJ9GH0LXRgNC90L7QstC40LrQuCcsICfRh9C10YDQvdC+0LLQuNC60YLQtdGAJyxcbiAgICAn1b3Wh9Wh1aPWgNWl1oAnLCAn15jXmdeV15jXldeqJywgJ9mF2LPZiNiv2KfYqicsICfZhdiz2YjYr9in2KonLCAn2YXZiNiz2YjYr9uQJywgJ9m+24zYtCDZhtmI24zYs9mH2KcnLCAn2ojYsdin2YHZuS8nLCAn4KSh4KWN4KSw4KS+4KWe4KWN4KSfJywgJ+CkquCljeCksOCkvuCksOClguCkqicsICfgppbgprjgp5zgpr4nLCAn4KaW4Ka44Kec4Ka+JywgJ+CmoeCnjeCnsOCmvuCmq+CnjeCmnycsICfgqKHgqY3gqLDgqL7gqKvgqJ8nLCAn4Kqh4KuN4Kqw4Kq+4Kqr4KuN4Kqf4Kq4JyxcbiAgICAn4Kyh4K2N4Kyw4Ky+4Kyr4K2N4KyfJywgJ+CuteCusOCviOCuteCvgeCuleCus+CvjScsICfgsJrgsL/gsKTgsY3gsKTgsYEg4LCq4LGN4LCw4LCk4LGB4LCy4LGBJywgJ+CyleCysOCyoeCzgeCyl+Cys+CzgScsICfgtJXgtLDgtJ/gtYHgtJXgtLPgtY3igI0nLCAn4Laa4LeZ4Lan4LeU4La44LeKIOC2tOC2reC3iicsICfguInguJrguLHguJrguKPguYjguLLguIcnLCAn4YOb4YOd4YOc4YOQ4YOu4YOQ4YOW4YOU4YOR4YOYJywgJ+GIqOGJguGJhuGJvScsICfhnp/hnrbhnprhnpbhn5LhnprhnrbhnoQnLCAn5LiL5pu444GNJywgJ+iNieeovycsXG4gICAgJ+iNieeovycsICfojYnnqL8nLCAn7J6E7IucIOuztOq0gO2VqCdcbiAgXVxufVxuY29uc3QgU1BFQ0lBTF9VU0VfQk9YX0ZMQUdTID0gT2JqZWN0LmtleXMoU1BFQ0lBTF9VU0VfQk9YRVMpXG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgbWFpbGJveCBpcyBmb3Igc3BlY2lhbCB1c2VcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gbWFpbGJveFxuICogQHJldHVybiB7U3RyaW5nfSBTcGVjaWFsIHVzZSBmbGFnIChpZiBkZXRlY3RlZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrU3BlY2lhbFVzZSAobWFpbGJveCkge1xuICBpZiAobWFpbGJveC5mbGFncykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgU1BFQ0lBTF9VU0VfRkxBR1MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHR5cGUgPSBTUEVDSUFMX1VTRV9GTEFHU1tpXVxuICAgICAgaWYgKChtYWlsYm94LmZsYWdzIHx8IFtdKS5pbmRleE9mKHR5cGUpID49IDApIHtcbiAgICAgICAgbWFpbGJveC5zcGVjaWFsVXNlID0gdHlwZVxuICAgICAgICBtYWlsYm94LnNwZWNpYWxVc2VGbGFnID0gdHlwZVxuICAgICAgICByZXR1cm4gdHlwZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjaGVja1NwZWNpYWxVc2VCeU5hbWUobWFpbGJveClcbn1cblxuZnVuY3Rpb24gY2hlY2tTcGVjaWFsVXNlQnlOYW1lIChtYWlsYm94KSB7XG4gIGNvbnN0IG5hbWUgPSBwcm9wT3IoJycsICduYW1lJywgbWFpbGJveCkudG9Mb3dlckNhc2UoKS50cmltKClcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IFNQRUNJQUxfVVNFX0JPWF9GTEFHUy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHR5cGUgPSBTUEVDSUFMX1VTRV9CT1hfRkxBR1NbaV1cbiAgICBpZiAoU1BFQ0lBTF9VU0VfQk9YRVNbdHlwZV0uaW5kZXhPZihuYW1lKSA+PSAwKSB7XG4gICAgICBtYWlsYm94LnNwZWNpYWxVc2UgPSB0eXBlXG4gICAgICByZXR1cm4gdHlwZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuIl19 \ No newline at end of file diff --git a/res/compression.worker.blob b/res/compression.worker.blob index a14e6b5c..c5c1061c 100644 --- a/res/compression.worker.blob +++ b/res/compression.worker.blob @@ -1 +1 @@ -!function(e){var t={};function a(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,a),i.l=!0,i.exports}a.m=e,a.c=t,a.d=function(e,t,n){a.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},a.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,t){if(1&t&&(e=a(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(a.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)a.d(n,i,function(t){return e[t]}.bind(null,i));return n},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,"a",t),t},a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},a.p="",a(a.s=11)}([function(e,t,a){"use strict";e.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},function(e,t,a){"use strict";e.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}},function(e,t,a){"use strict";var n="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Int32Array;function i(e,t){return Object.prototype.hasOwnProperty.call(e,t)}t.assign=function(e){for(var t=Array.prototype.slice.call(arguments,1);t.length;){var a=t.shift();if(a){if("object"!=typeof a)throw new TypeError(a+"must be non-object");for(var n in a)i(a,n)&&(e[n]=a[n])}}return e},t.shrinkBuf=function(e,t){return e.length===t?e:e.subarray?e.subarray(0,t):(e.length=t,e)};var r={arraySet:function(e,t,a,n,i){if(t.subarray&&e.subarray)e.set(t.subarray(a,a+n),i);else for(var r=0;r4?9:0)}function $(e){for(var t=e.length;--t>=0;)e[t]=0}function ee(e){var t=e.state,a=t.pending;a>e.avail_out&&(a=e.avail_out),0!==a&&(i.arraySet(e.output,t.pending_buf,t.pending_out,a,e.next_out),e.next_out+=a,t.pending_out+=a,e.total_out+=a,e.avail_out-=a,t.pending-=a,0===t.pending&&(t.pending_out=0))}function te(e,t){r._tr_flush_block(e,e.block_start>=0?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,ee(e.strm)}function ae(e,t){e.pending_buf[e.pending++]=t}function ne(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t}function ie(e,t){var a,n,i=e.max_chain_length,r=e.strstart,s=e.prev_length,l=e.nice_match,o=e.strstart>e.w_size-F?e.strstart-(e.w_size-F):0,h=e.window,d=e.w_mask,_=e.prev,f=e.strstart+I,u=h[r+s-1],c=h[r+s];e.prev_length>=e.good_match&&(i>>=2),l>e.lookahead&&(l=e.lookahead);do{if(h[(a=t)+s]===c&&h[a+s-1]===u&&h[a]===h[r]&&h[++a]===h[r+1]){r+=2,a++;do{}while(h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&rs){if(e.match_start=t,s=n,n>=l)break;u=h[r+s-1],c=h[r+s]}}}while((t=_[t&d])>o&&0!=--i);return s<=e.lookahead?s:e.lookahead}function re(e){var t,a,n,r,o,h,d,_,f,u,c=e.w_size;do{if(r=e.window_size-e.lookahead-e.strstart,e.strstart>=c+(c-F)){i.arraySet(e.window,e.window,c,c,0),e.match_start-=c,e.strstart-=c,e.block_start-=c,t=a=e.hash_size;do{n=e.head[--t],e.head[t]=n>=c?n-c:0}while(--a);t=a=c;do{n=e.prev[--t],e.prev[t]=n>=c?n-c:0}while(--a);r+=c}if(0===e.strm.avail_in)break;if(h=e.strm,d=e.window,_=e.strstart+e.lookahead,f=r,u=void 0,(u=h.avail_in)>f&&(u=f),a=0===u?0:(h.avail_in-=u,i.arraySet(d,h.input,h.next_in,u,_),1===h.state.wrap?h.adler=s(h.adler,d,u,_):2===h.state.wrap&&(h.adler=l(h.adler,d,u,_)),h.next_in+=u,h.total_in+=u,u),e.lookahead+=a,e.lookahead+e.insert>=U)for(o=e.strstart-e.insert,e.ins_h=e.window[o],e.ins_h=(e.ins_h<=U&&(e.ins_h=(e.ins_h<=U)if(n=r._tr_tally(e,e.strstart-e.match_start,e.match_length-U),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=U){e.match_length--;do{e.strstart++,e.ins_h=(e.ins_h<=U&&(e.ins_h=(e.ins_h<4096)&&(e.match_length=U-1)),e.prev_length>=U&&e.match_length<=e.prev_length){i=e.strstart+e.lookahead-U,n=r._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-U),e.lookahead-=e.prev_length-1,e.prev_length-=2;do{++e.strstart<=i&&(e.ins_h=(e.ins_h<15&&(l=2,n-=16),r<1||r>A||a!==E||n<8||n>15||t<0||t>9||s<0||s>x)return Q(e,g);8===n&&(n=9);var o=new he;return e.state=o,o.strm=e,o.wrap=l,o.gzhead=null,o.w_bits=n,o.w_size=1<e.pending_buf_size-5&&(a=e.pending_buf_size-5);;){if(e.lookahead<=1){if(re(e),0===e.lookahead&&t===h)return G;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var n=e.block_start+a;if((0===e.strstart||e.strstart>=n)&&(e.lookahead=e.strstart-n,e.strstart=n,te(e,!1),0===e.strm.avail_out))return G;if(e.strstart-e.block_start>=e.w_size-F&&(te(e,!1),0===e.strm.avail_out))return G}return e.insert=0,t===f?(te(e,!0),0===e.strm.avail_out?W:q):(e.strstart>e.block_start&&(te(e,!1),e.strm.avail_out),G)}),new oe(4,4,8,4,se),new oe(4,5,16,8,se),new oe(4,6,32,32,se),new oe(4,4,16,16,le),new oe(8,16,32,32,le),new oe(8,16,128,128,le),new oe(8,32,128,256,le),new oe(32,128,258,1024,le),new oe(32,258,258,4096,le)],t.deflateInit=function(e,t){return fe(e,t,E,Z,O,z)},t.deflateInit2=fe,t.deflateReset=_e,t.deflateResetKeep=de,t.deflateSetHeader=function(e,t){return e&&e.state?2!==e.state.wrap?g:(e.state.gzhead=t,c):g},t.deflate=function(e,t){var a,i,s,o;if(!e||!e.state||t>u||t<0)return e?Q(e,g):g;if(i=e.state,!e.output||!e.input&&0!==e.avail_in||i.status===Y&&t!==f)return Q(e,0===e.avail_out?w:g);if(i.strm=e,a=i.last_flush,i.last_flush=t,i.status===M)if(2===i.wrap)e.adler=0,ae(i,31),ae(i,139),ae(i,8),i.gzhead?(ae(i,(i.gzhead.text?1:0)+(i.gzhead.hcrc?2:0)+(i.gzhead.extra?4:0)+(i.gzhead.name?8:0)+(i.gzhead.comment?16:0)),ae(i,255&i.gzhead.time),ae(i,i.gzhead.time>>8&255),ae(i,i.gzhead.time>>16&255),ae(i,i.gzhead.time>>24&255),ae(i,9===i.level?2:i.strategy>=k||i.level<2?4:0),ae(i,255&i.gzhead.os),i.gzhead.extra&&i.gzhead.extra.length&&(ae(i,255&i.gzhead.extra.length),ae(i,i.gzhead.extra.length>>8&255)),i.gzhead.hcrc&&(e.adler=l(e.adler,i.pending_buf,i.pending,0)),i.gzindex=0,i.status=j):(ae(i,0),ae(i,0),ae(i,0),ae(i,0),ae(i,0),ae(i,9===i.level?2:i.strategy>=k||i.level<2?4:0),ae(i,J),i.status=K);else{var m=E+(i.w_bits-8<<4)<<8;m|=(i.strategy>=k||i.level<2?0:i.level<6?1:6===i.level?2:3)<<6,0!==i.strstart&&(m|=L),m+=31-m%31,i.status=K,ne(i,m),0!==i.strstart&&(ne(i,e.adler>>>16),ne(i,65535&e.adler)),e.adler=1}if(i.status===j)if(i.gzhead.extra){for(s=i.pending;i.gzindex<(65535&i.gzhead.extra.length)&&(i.pending!==i.pending_buf_size||(i.gzhead.hcrc&&i.pending>s&&(e.adler=l(e.adler,i.pending_buf,i.pending-s,s)),ee(e),s=i.pending,i.pending!==i.pending_buf_size));)ae(i,255&i.gzhead.extra[i.gzindex]),i.gzindex++;i.gzhead.hcrc&&i.pending>s&&(e.adler=l(e.adler,i.pending_buf,i.pending-s,s)),i.gzindex===i.gzhead.extra.length&&(i.gzindex=0,i.status=C)}else i.status=C;if(i.status===C)if(i.gzhead.name){s=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>s&&(e.adler=l(e.adler,i.pending_buf,i.pending-s,s)),ee(e),s=i.pending,i.pending===i.pending_buf_size)){o=1;break}o=i.gzindexs&&(e.adler=l(e.adler,i.pending_buf,i.pending-s,s)),0===o&&(i.gzindex=0,i.status=P)}else i.status=P;if(i.status===P)if(i.gzhead.comment){s=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>s&&(e.adler=l(e.adler,i.pending_buf,i.pending-s,s)),ee(e),s=i.pending,i.pending===i.pending_buf_size)){o=1;break}o=i.gzindexs&&(e.adler=l(e.adler,i.pending_buf,i.pending-s,s)),0===o&&(i.status=H)}else i.status=H;if(i.status===H&&(i.gzhead.hcrc?(i.pending+2>i.pending_buf_size&&ee(e),i.pending+2<=i.pending_buf_size&&(ae(i,255&e.adler),ae(i,e.adler>>8&255),e.adler=0,i.status=K)):i.status=K),0!==i.pending){if(ee(e),0===e.avail_out)return i.last_flush=-1,c}else if(0===e.avail_in&&V(t)<=V(a)&&t!==f)return Q(e,w);if(i.status===Y&&0!==e.avail_in)return Q(e,w);if(0!==e.avail_in||0!==i.lookahead||t!==h&&i.status!==Y){var p=i.strategy===k?function(e,t){for(var a;;){if(0===e.lookahead&&(re(e),0===e.lookahead)){if(t===h)return G;break}if(e.match_length=0,a=r._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,a&&(te(e,!1),0===e.strm.avail_out))return G}return e.insert=0,t===f?(te(e,!0),0===e.strm.avail_out?W:q):e.last_lit&&(te(e,!1),0===e.strm.avail_out)?G:X}(i,t):i.strategy===y?function(e,t){for(var a,n,i,s,l=e.window;;){if(e.lookahead<=I){if(re(e),e.lookahead<=I&&t===h)return G;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=U&&e.strstart>0&&(n=l[i=e.strstart-1])===l[++i]&&n===l[++i]&&n===l[++i]){s=e.strstart+I;do{}while(n===l[++i]&&n===l[++i]&&n===l[++i]&&n===l[++i]&&n===l[++i]&&n===l[++i]&&n===l[++i]&&n===l[++i]&&ie.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=U?(a=r._tr_tally(e,1,e.match_length-U),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(a=r._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),a&&(te(e,!1),0===e.strm.avail_out))return G}return e.insert=0,t===f?(te(e,!0),0===e.strm.avail_out?W:q):e.last_lit&&(te(e,!1),0===e.strm.avail_out)?G:X}(i,t):n[i.level].func(i,t);if(p!==W&&p!==q||(i.status=Y),p===G||p===W)return 0===e.avail_out&&(i.last_flush=-1),c;if(p===X&&(t===d?r._tr_align(i):t!==u&&(r._tr_stored_block(i,0,0,!1),t===_&&($(i.head),0===i.lookahead&&(i.strstart=0,i.block_start=0,i.insert=0))),ee(e),0===e.avail_out))return i.last_flush=-1,c}return t!==f?c:i.wrap<=0?b:(2===i.wrap?(ae(i,255&e.adler),ae(i,e.adler>>8&255),ae(i,e.adler>>16&255),ae(i,e.adler>>24&255),ae(i,255&e.total_in),ae(i,e.total_in>>8&255),ae(i,e.total_in>>16&255),ae(i,e.total_in>>24&255)):(ne(i,e.adler>>>16),ne(i,65535&e.adler)),ee(e),i.wrap>0&&(i.wrap=-i.wrap),0!==i.pending?c:b)},t.deflateEnd=function(e){var t;return e&&e.state?(t=e.state.status)!==M&&t!==j&&t!==C&&t!==P&&t!==H&&t!==K&&t!==Y?Q(e,g):(e.state=null,t===K?Q(e,m):c):g},t.deflateSetDictionary=function(e,t){var a,n,r,l,o,h,d,_,f=t.length;if(!e||!e.state)return g;if(2===(l=(a=e.state).wrap)||1===l&&a.status!==M||a.lookahead)return g;for(1===l&&(e.adler=s(e.adler,t,f,0)),a.wrap=0,f>=a.w_size&&(0===l&&($(a.head),a.strstart=0,a.block_start=0,a.insert=0),_=new i.Buf8(a.w_size),i.arraySet(_,t,f-a.w_size,a.w_size,0),t=_,f=a.w_size),o=e.avail_in,h=e.next_in,d=e.input,e.avail_in=f,e.next_in=0,e.input=t,re(a);a.lookahead>=U;){n=a.strstart,r=a.lookahead-(U-1);do{a.ins_h=(a.ins_h<>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function ie(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new n.Buf16(320),this.work=new n.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function re(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=y,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new n.Buf32(ee),t.distcode=t.distdyn=new n.Buf32(te),t.sane=1,t.back=-1,c):m}function se(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,re(e)):m}function le(e,t){var a,n;return e&&e.state?(n=e.state,t<0?(a=0,t=-t):(a=1+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?m:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=a,n.wbits=t,se(e))):m}function oe(e,t){var a,n;return e?(n=new ie,e.state=n,n.window=null,(a=le(e,t))!==c&&(e.state=null),a):m}var he,de,_e=!0;function fe(e){if(_e){var t;for(he=new n.Buf32(512),de=new n.Buf32(32),t=0;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(l(h,e.lens,0,288,he,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;l(d,e.lens,0,32,de,0,e.work,{bits:5}),_e=!1}e.lencode=he,e.lenbits=9,e.distcode=de,e.distbits=5}function ue(e,t,a,i){var r,s=e.state;return null===s.window&&(s.wsize=1<=s.wsize?(n.arraySet(s.window,t,a-s.wsize,s.wsize,0),s.wnext=0,s.whave=s.wsize):((r=s.wsize-s.wnext)>i&&(r=i),n.arraySet(s.window,t,a-i,r,s.wnext),(i-=r)?(n.arraySet(s.window,t,a-i,i,0),s.wnext=i,s.whave=s.wsize):(s.wnext+=r,s.wnext===s.wsize&&(s.wnext=0),s.whave>>8&255,a.check=r(a.check,Ae,2,0),le=0,oe=0,a.mode=x;break}if(a.flags=0,a.head&&(a.head.done=!1),!(1&a.wrap)||(((255&le)<<8)+(le>>8))%31){e.msg="incorrect header check",a.mode=Q;break}if((15&le)!==k){e.msg="unknown compression method",a.mode=Q;break}if(oe-=4,ye=8+(15&(le>>>=4)),0===a.wbits)a.wbits=ye;else if(ye>a.wbits){e.msg="invalid window size",a.mode=Q;break}a.dmax=1<>8&1),512&a.flags&&(Ae[0]=255&le,Ae[1]=le>>>8&255,a.check=r(a.check,Ae,2,0)),le=0,oe=0,a.mode=z;case z:for(;oe<32;){if(0===re)break e;re--,le+=ee[ae++]<>>8&255,Ae[2]=le>>>16&255,Ae[3]=le>>>24&255,a.check=r(a.check,Ae,4,0)),le=0,oe=0,a.mode=S;case S:for(;oe<16;){if(0===re)break e;re--,le+=ee[ae++]<>8),512&a.flags&&(Ae[0]=255&le,Ae[1]=le>>>8&255,a.check=r(a.check,Ae,2,0)),le=0,oe=0,a.mode=E;case E:if(1024&a.flags){for(;oe<16;){if(0===re)break e;re--,le+=ee[ae++]<>>8&255,a.check=r(a.check,Ae,2,0)),le=0,oe=0}else a.head&&(a.head.extra=null);a.mode=A;case A:if(1024&a.flags&&((_e=a.length)>re&&(_e=re),_e&&(a.head&&(ye=a.head.extra_len-a.length,a.head.extra||(a.head.extra=new Array(a.head.extra_len)),n.arraySet(a.head.extra,ee,ae,_e,ye)),512&a.flags&&(a.check=r(a.check,ee,_e,ae)),re-=_e,ae+=_e,a.length-=_e),a.length))break e;a.length=0,a.mode=Z;case Z:if(2048&a.flags){if(0===re)break e;_e=0;do{ye=ee[ae+_e++],a.head&&ye&&a.length<65536&&(a.head.name+=String.fromCharCode(ye))}while(ye&&_e>9&1,a.head.done=!0),e.adler=a.check=0,a.mode=N;break;case B:for(;oe<32;){if(0===re)break e;re--,le+=ee[ae++]<>>=7&oe,oe-=7&oe,a.mode=W;break}for(;oe<3;){if(0===re)break e;re--,le+=ee[ae++]<>>=1)){case 0:a.mode=U;break;case 1:if(fe(a),a.mode=C,t===u){le>>>=2,oe-=2;break e}break;case 2:a.mode=L;break;case 3:e.msg="invalid block type",a.mode=Q}le>>>=2,oe-=2;break;case U:for(le>>>=7&oe,oe-=7&oe;oe<32;){if(0===re)break e;re--,le+=ee[ae++]<>>16^65535)){e.msg="invalid stored block lengths",a.mode=Q;break}if(a.length=65535&le,le=0,oe=0,a.mode=I,t===u)break e;case I:a.mode=F;case F:if(_e=a.length){if(_e>re&&(_e=re),_e>se&&(_e=se),0===_e)break e;n.arraySet(te,ee,ae,_e,ie),re-=_e,ae+=_e,se-=_e,ie+=_e,a.length-=_e;break}a.mode=N;break;case L:for(;oe<14;){if(0===re)break e;re--,le+=ee[ae++]<>>=5,oe-=5,a.ndist=1+(31&le),le>>>=5,oe-=5,a.ncode=4+(15&le),le>>>=4,oe-=4,a.nlen>286||a.ndist>30){e.msg="too many length or distance symbols",a.mode=Q;break}a.have=0,a.mode=M;case M:for(;a.have>>=3,oe-=3}for(;a.have<19;)a.lens[Ze[a.have++]]=0;if(a.lencode=a.lendyn,a.lenbits=7,ze={bits:a.lenbits},xe=l(o,a.lens,0,19,a.lencode,0,a.work,ze),a.lenbits=ze.bits,xe){e.msg="invalid code lengths set",a.mode=Q;break}a.have=0,a.mode=j;case j:for(;a.have>>16&255,we=65535&Ee,!((ge=Ee>>>24)<=oe);){if(0===re)break e;re--,le+=ee[ae++]<>>=ge,oe-=ge,a.lens[a.have++]=we;else{if(16===we){for(Se=ge+2;oe>>=ge,oe-=ge,0===a.have){e.msg="invalid bit length repeat",a.mode=Q;break}ye=a.lens[a.have-1],_e=3+(3&le),le>>>=2,oe-=2}else if(17===we){for(Se=ge+3;oe>>=ge)),le>>>=3,oe-=3}else{for(Se=ge+7;oe>>=ge)),le>>>=7,oe-=7}if(a.have+_e>a.nlen+a.ndist){e.msg="invalid bit length repeat",a.mode=Q;break}for(;_e--;)a.lens[a.have++]=ye}}if(a.mode===Q)break;if(0===a.lens[256]){e.msg="invalid code -- missing end-of-block",a.mode=Q;break}if(a.lenbits=9,ze={bits:a.lenbits},xe=l(h,a.lens,0,a.nlen,a.lencode,0,a.work,ze),a.lenbits=ze.bits,xe){e.msg="invalid literal/lengths set",a.mode=Q;break}if(a.distbits=6,a.distcode=a.distdyn,ze={bits:a.distbits},xe=l(d,a.lens,a.nlen,a.ndist,a.distcode,0,a.work,ze),a.distbits=ze.bits,xe){e.msg="invalid distances set",a.mode=Q;break}if(a.mode=C,t===u)break e;case C:a.mode=P;case P:if(re>=6&&se>=258){e.next_out=ie,e.avail_out=se,e.next_in=ae,e.avail_in=re,a.hold=le,a.bits=oe,s(e,de),ie=e.next_out,te=e.output,se=e.avail_out,ae=e.next_in,ee=e.input,re=e.avail_in,le=a.hold,oe=a.bits,a.mode===N&&(a.back=-1);break}for(a.back=0;me=(Ee=a.lencode[le&(1<>>16&255,we=65535&Ee,!((ge=Ee>>>24)<=oe);){if(0===re)break e;re--,le+=ee[ae++]<>pe)])>>>16&255,we=65535&Ee,!(pe+(ge=Ee>>>24)<=oe);){if(0===re)break e;re--,le+=ee[ae++]<>>=pe,oe-=pe,a.back+=pe}if(le>>>=ge,oe-=ge,a.back+=ge,a.length=we,0===me){a.mode=X;break}if(32&me){a.back=-1,a.mode=N;break}if(64&me){e.msg="invalid literal/length code",a.mode=Q;break}a.extra=15&me,a.mode=H;case H:if(a.extra){for(Se=a.extra;oe>>=a.extra,oe-=a.extra,a.back+=a.extra}a.was=a.length,a.mode=K;case K:for(;me=(Ee=a.distcode[le&(1<>>16&255,we=65535&Ee,!((ge=Ee>>>24)<=oe);){if(0===re)break e;re--,le+=ee[ae++]<>pe)])>>>16&255,we=65535&Ee,!(pe+(ge=Ee>>>24)<=oe);){if(0===re)break e;re--,le+=ee[ae++]<>>=pe,oe-=pe,a.back+=pe}if(le>>>=ge,oe-=ge,a.back+=ge,64&me){e.msg="invalid distance code",a.mode=Q;break}a.offset=we,a.extra=15&me,a.mode=Y;case Y:if(a.extra){for(Se=a.extra;oe>>=a.extra,oe-=a.extra,a.back+=a.extra}if(a.offset>a.dmax){e.msg="invalid distance too far back",a.mode=Q;break}a.mode=G;case G:if(0===se)break e;if(_e=de-se,a.offset>_e){if((_e=a.offset-_e)>a.whave&&a.sane){e.msg="invalid distance too far back",a.mode=Q;break}_e>a.wnext?(_e-=a.wnext,ce=a.wsize-_e):ce=a.wnext-_e,_e>a.length&&(_e=a.length),be=a.window}else be=te,ce=ie-a.offset,_e=a.length;_e>se&&(_e=se),se-=_e,a.length-=_e;do{te[ie++]=be[ce++]}while(--_e);0===a.length&&(a.mode=P);break;case X:if(0===se)break e;te[ie++]=a.length,se--,a.mode=P;break;case W:if(a.wrap){for(;oe<32;){if(0===re)break e;re--,le|=ee[ae++]<>>16&65535|0,s=0;0!==a;){a-=s=a>2e3?2e3:a;do{r=r+(i=i+t[n++]|0)|0}while(--s);i%=65521,r%=65521}return i|r<<16|0}},function(e,t,a){"use strict";var n=function(){for(var e,t=[],a=0;a<256;a++){e=a;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[a]=e}return t}();e.exports=function(e,t,a,i){var r=n,s=i+a;e^=-1;for(var l=i;l>>8^r[255&(e^t[l])];return-1^e}},function(e,t,a){"use strict";var n=a(2),i=4,r=0,s=1,l=2;function o(e){for(var t=e.length;--t>=0;)e[t]=0}var h=0,d=1,_=2,f=29,u=256,c=u+1+f,b=30,g=19,m=2*c+1,w=15,p=16,v=7,k=256,y=16,x=17,z=18,S=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],E=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],A=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],Z=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],O=new Array(2*(c+2));o(O);var R=new Array(2*b);o(R);var B=new Array(512);o(B);var T=new Array(256);o(T);var N=new Array(f);o(N);var D,U,I,F=new Array(b);function L(e,t,a,n,i){this.static_tree=e,this.extra_bits=t,this.extra_base=a,this.elems=n,this.max_length=i,this.has_stree=e&&e.length}function M(e,t){this.dyn_tree=e,this.max_code=0,this.stat_desc=t}function j(e){return e<256?B[e]:B[256+(e>>>7)]}function C(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function P(e,t,a){e.bi_valid>p-a?(e.bi_buf|=t<>p-e.bi_valid,e.bi_valid+=a-p):(e.bi_buf|=t<>>=1,a<<=1}while(--t>0);return a>>>1}function Y(e,t,a){var n,i,r=new Array(w+1),s=0;for(n=1;n<=w;n++)r[n]=s=s+a[n-1]<<1;for(i=0;i<=t;i++){var l=e[2*i+1];0!==l&&(e[2*i]=K(r[l]++,l))}}function G(e){var t;for(t=0;t8?C(e,e.bi_buf):e.bi_valid>0&&(e.pending_buf[e.pending++]=e.bi_buf),e.bi_buf=0,e.bi_valid=0}function W(e,t,a,n){var i=2*t,r=2*a;return e[i]>1;a>=1;a--)q(e,r,a);i=o;do{a=e.heap[1],e.heap[1]=e.heap[e.heap_len--],q(e,r,1),n=e.heap[1],e.heap[--e.heap_max]=a,e.heap[--e.heap_max]=n,r[2*i]=r[2*a]+r[2*n],e.depth[i]=(e.depth[a]>=e.depth[n]?e.depth[a]:e.depth[n])+1,r[2*a+1]=r[2*n+1]=i,e.heap[1]=i++,q(e,r,1)}while(e.heap_len>=2);e.heap[--e.heap_max]=e.heap[1],function(e,t){var a,n,i,r,s,l,o=t.dyn_tree,h=t.max_code,d=t.stat_desc.static_tree,_=t.stat_desc.has_stree,f=t.stat_desc.extra_bits,u=t.stat_desc.extra_base,c=t.stat_desc.max_length,b=0;for(r=0;r<=w;r++)e.bl_count[r]=0;for(o[2*e.heap[e.heap_max]+1]=0,a=e.heap_max+1;ac&&(r=c,b++),o[2*n+1]=r,n>h||(e.bl_count[r]++,s=0,n>=u&&(s=f[n-u]),l=o[2*n],e.opt_len+=l*(r+s),_&&(e.static_len+=l*(d[2*n+1]+s)));if(0!==b){do{for(r=c-1;0===e.bl_count[r];)r--;e.bl_count[r]--,e.bl_count[r+1]+=2,e.bl_count[c]--,b-=2}while(b>0);for(r=c;0!==r;r--)for(n=e.bl_count[r];0!==n;)(i=e.heap[--a])>h||(o[2*i+1]!==r&&(e.opt_len+=(r-o[2*i+1])*o[2*i],o[2*i+1]=r),n--)}}(e,t),Y(r,h,e.bl_count)}function V(e,t,a){var n,i,r=-1,s=t[1],l=0,o=7,h=4;for(0===s&&(o=138,h=3),t[2*(a+1)+1]=65535,n=0;n<=a;n++)i=s,s=t[2*(n+1)+1],++l>=7;n0?(e.strm.data_type===l&&(e.strm.data_type=function(e){var t,a=4093624447;for(t=0;t<=31;t++,a>>>=1)if(1&a&&0!==e.dyn_ltree[2*t])return r;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return s;for(t=32;t=3&&0===e.bl_tree[2*Z[t]+1];t--);return e.opt_len+=3*(t+1)+5+5+4,t}(e),o=e.opt_len+3+7>>>3,(h=e.static_len+3+7>>>3)<=o&&(o=h)):o=h=a+5,a+4<=o&&-1!==t?te(e,t,a,n):e.strategy===i||h===o?(P(e,(d<<1)+(n?1:0),3),J(e,O,R)):(P(e,(_<<1)+(n?1:0),3),function(e,t,a,n){var i;for(P(e,t-257,5),P(e,a-1,5),P(e,n-4,4),i=0;i>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&a,e.last_lit++,0===t?e.dyn_ltree[2*a]++:(e.matches++,t--,e.dyn_ltree[2*(T[a]+u+1)]++,e.dyn_dtree[2*j(t)]++),e.last_lit===e.lit_bufsize-1},t._tr_align=function(e){P(e,d<<1,3),H(e,k,O),function(e){16===e.bi_valid?(C(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):e.bi_valid>=8&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}(e)}},function(e,t,a){"use strict";e.exports=function(e,t){var a,n,i,r,s,l,o,h,d,_,f,u,c,b,g,m,w,p,v,k,y,x,z,S,E;a=e.state,n=e.next_in,S=e.input,i=n+(e.avail_in-5),r=e.next_out,E=e.output,s=r-(t-e.avail_out),l=r+(e.avail_out-257),o=a.dmax,h=a.wsize,d=a.whave,_=a.wnext,f=a.window,u=a.hold,c=a.bits,b=a.lencode,g=a.distcode,m=(1<>>=v=p>>>24,c-=v,0===(v=p>>>16&255))E[r++]=65535&p;else{if(!(16&v)){if(0==(64&v)){p=b[(65535&p)+(u&(1<>>=v,c-=v),c<15&&(u+=S[n++]<>>=v=p>>>24,c-=v,!(16&(v=p>>>16&255))){if(0==(64&v)){p=g[(65535&p)+(u&(1<o){e.msg="invalid distance too far back",a.mode=30;break e}if(u>>>=v,c-=v,y>(v=r-s)){if((v=y-v)>d&&a.sane){e.msg="invalid distance too far back",a.mode=30;break e}if(x=0,z=f,0===_){if(x+=h-v,v2;)E[r++]=z[x++],E[r++]=z[x++],E[r++]=z[x++],k-=3;k&&(E[r++]=z[x++],k>1&&(E[r++]=z[x++]))}else{x=r-y;do{E[r++]=E[x++],E[r++]=E[x++],E[r++]=E[x++],k-=3}while(k>2);k&&(E[r++]=E[x++],k>1&&(E[r++]=E[x++]))}break}}break}}while(n>3,u&=(1<<(c-=k<<3))-1,e.next_in=n,e.next_out=r,e.avail_in=n=1&&0===U[E];E--);if(A>E&&(A=E),0===E)return h[d++]=20971520,h[d++]=20971520,f.bits=1,0;for(S=1;S0&&(0===e||1!==E))return-1;for(I[1]=0,x=1;x<15;x++)I[x+1]=I[x]+U[x];for(z=0;z852||2===e&&B>592)return 1;for(;;){p=x-O,_[z]w?(v=F[L+_[z]],k=N[D+_[z]]):(v=96,k=0),u=1<>O)+(c-=u)]=p<<24|v<<16|k|0}while(0!==c);for(u=1<>=1;if(0!==u?(T&=u-1,T+=u):T=0,z++,0==--U[x]){if(x===E)break;x=t[a+_[z]]}if(x>A&&(T&g)!==b){for(0===O&&(O=A),m+=S,R=1<<(Z=x-O);Z+O852||2===e&&B>592)return 1;h[b=T&g]=A<<24|Z<<16|m-d|0}}return 0!==T&&(h[m+T]=x-O<<24|64<<16|0),f.bits=A,0}},function(e,t,a){"use strict";a.r(t);var n=a(3),i=a.n(n),r=a(4),s=a(5),l=a(1),o=a.n(l),h=a(0),d=16384,_=15;function f(e,t){var a=this;this.inflatedReady=e,this.deflatedReady=t,this._inflate=function(e){var t=new i.a,a=Object(s.inflateInit2)(t,_);if(a!==h.Z_OK)throw new Error("Problem initializing inflate stream: "+o.a[a]);return function(a){if(void 0===a)return e();var n,i,r;t.input=a,t.next_in=0,t.avail_in=t.input.length;var l=!0;do{if(0===t.avail_out&&(t.output=new Uint8Array(d),n=t.next_out=0,t.avail_out=d),(i=Object(s.inflate)(t,h.Z_NO_FLUSH))!==h.Z_STREAM_END&&i!==h.Z_OK)throw new Error("inflate problem: "+o.a[i]);t.next_out&&(0!==t.avail_out&&i!==h.Z_STREAM_END||(r=t.output.subarray(n,n=t.next_out),l=e(r)))}while(t.avail_in>0&&i!==h.Z_STREAM_END);return t.next_out>n&&(r=t.output.subarray(n,n=t.next_out),l=e(r)),l}}(function(e){return a.inflatedReady(e.buffer.slice(e.byteOffset,e.byteOffset+e.length))}),this._deflate=function(e){var t=new i.a,a=Object(r.deflateInit2)(t,h.Z_DEFAULT_COMPRESSION,h.Z_DEFLATED,_,8,h.Z_DEFAULT_STRATEGY);if(a!==h.Z_OK)throw new Error("Problem initializing deflate stream: "+o.a[a]);return function(a){if(void 0===a)return e();var n,i,s;t.input=a,t.next_in=0,t.avail_in=t.input.length;var l=!0;do{if(0===t.avail_out&&(t.output=new Uint8Array(d),s=t.next_out=0,t.avail_out=d),(n=Object(r.deflate)(t,h.Z_SYNC_FLUSH))!==h.Z_STREAM_END&&n!==h.Z_OK)throw new Error("Deflate problem: "+o.a[n]);0===t.avail_out&&t.next_out>s&&(i=t.output.subarray(s,s=t.next_out),l=e(i))}while((t.avail_in>0||0===t.avail_out)&&n!==h.Z_STREAM_END);return t.next_out>s&&(i=t.output.subarray(s,s=t.next_out),l=e(i)),l}}(function(e){return a.deflatedReady(e.buffer.slice(e.byteOffset,e.byteOffset+e.length))})}f.prototype.inflate=function(e){this._inflate(new Uint8Array(e))},f.prototype.deflate=function(e){this._deflate(new Uint8Array(e))};var u=function(e,t){return{message:e,buffer:t}},c=new f(function(e){return self.postMessage(u("inflated_ready",e),[e])},function(e){return self.postMessage(u("deflated_ready",e),[e])});self.onmessage=function(e){var t=e.data.message,a=e.data.buffer;switch(t){case"start":break;case"inflate":c.inflate(a);break;case"deflate":c.deflate(a)}}}]); \ No newline at end of file +!function(e){var t={};function a(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,a),i.l=!0,i.exports}a.m=e,a.c=t,a.d=function(e,t,n){a.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},a.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,t){if(1&t&&(e=a(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(a.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)a.d(n,i,function(t){return e[t]}.bind(null,i));return n},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,"a",t),t},a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},a.p="",a(a.s=11)}([function(e,t,a){"use strict";e.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},function(e,t,a){"use strict";e.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}},function(e,t,a){"use strict";var n="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Int32Array;function i(e,t){return Object.prototype.hasOwnProperty.call(e,t)}t.assign=function(e){for(var t=Array.prototype.slice.call(arguments,1);t.length;){var a=t.shift();if(a){if("object"!=typeof a)throw new TypeError(a+"must be non-object");for(var n in a)i(a,n)&&(e[n]=a[n])}}return e},t.shrinkBuf=function(e,t){return e.length===t?e:e.subarray?e.subarray(0,t):(e.length=t,e)};var r={arraySet:function(e,t,a,n,i){if(t.subarray&&e.subarray)e.set(t.subarray(a,a+n),i);else for(var r=0;r4?9:0)}function _(e){for(var t=e.length;--t>=0;)e[t]=0}function f(e){var t=e.state,a=t.pending;a>e.avail_out&&(a=e.avail_out),0!==a&&(i.arraySet(e.output,t.pending_buf,t.pending_out,a,e.next_out),e.next_out+=a,t.pending_out+=a,e.total_out+=a,e.avail_out-=a,t.pending-=a,0===t.pending&&(t.pending_out=0))}function u(e,t){r._tr_flush_block(e,e.block_start>=0?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,f(e.strm)}function c(e,t){e.pending_buf[e.pending++]=t}function b(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t}function g(e,t){var a,n,i=e.max_chain_length,r=e.strstart,s=e.prev_length,l=e.nice_match,o=e.strstart>e.w_size-262?e.strstart-(e.w_size-262):0,h=e.window,d=e.w_mask,_=e.prev,f=e.strstart+258,u=h[r+s-1],c=h[r+s];e.prev_length>=e.good_match&&(i>>=2),l>e.lookahead&&(l=e.lookahead);do{if(h[(a=t)+s]===c&&h[a+s-1]===u&&h[a]===h[r]&&h[++a]===h[r+1]){r+=2,a++;do{}while(h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&rs){if(e.match_start=t,s=n,n>=l)break;u=h[r+s-1],c=h[r+s]}}}while((t=_[t&d])>o&&0!=--i);return s<=e.lookahead?s:e.lookahead}function m(e){var t,a,n,r,o,h,d,_,f,u,c=e.w_size;do{if(r=e.window_size-e.lookahead-e.strstart,e.strstart>=c+(c-262)){i.arraySet(e.window,e.window,c,c,0),e.match_start-=c,e.strstart-=c,e.block_start-=c,t=a=e.hash_size;do{n=e.head[--t],e.head[t]=n>=c?n-c:0}while(--a);t=a=c;do{n=e.prev[--t],e.prev[t]=n>=c?n-c:0}while(--a);r+=c}if(0===e.strm.avail_in)break;if(h=e.strm,d=e.window,_=e.strstart+e.lookahead,f=r,u=void 0,(u=h.avail_in)>f&&(u=f),a=0===u?0:(h.avail_in-=u,i.arraySet(d,h.input,h.next_in,u,_),1===h.state.wrap?h.adler=s(h.adler,d,u,_):2===h.state.wrap&&(h.adler=l(h.adler,d,u,_)),h.next_in+=u,h.total_in+=u,u),e.lookahead+=a,e.lookahead+e.insert>=3)for(o=e.strstart-e.insert,e.ins_h=e.window[o],e.ins_h=(e.ins_h<=3&&(e.ins_h=(e.ins_h<=3)if(n=r._tr_tally(e,e.strstart-e.match_start,e.match_length-3),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=3){e.match_length--;do{e.strstart++,e.ins_h=(e.ins_h<=3&&(e.ins_h=(e.ins_h<4096)&&(e.match_length=2)),e.prev_length>=3&&e.match_length<=e.prev_length){i=e.strstart+e.lookahead-3,n=r._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-3),e.lookahead-=e.prev_length-1,e.prev_length-=2;do{++e.strstart<=i&&(e.ins_h=(e.ins_h<15&&(l=2,n-=16),r<1||r>9||8!==a||n<8||n>15||t<0||t>9||s<0||s>4)return h(e,-2);8===n&&(n=9);var o=new k;return e.state=o,o.strm=e,o.wrap=l,o.gzhead=null,o.w_bits=n,o.w_size=1<e.pending_buf_size-5&&(a=e.pending_buf_size-5);;){if(e.lookahead<=1){if(m(e),0===e.lookahead&&0===t)return 1;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var n=e.block_start+a;if((0===e.strstart||e.strstart>=n)&&(e.lookahead=e.strstart-n,e.strstart=n,u(e,!1),0===e.strm.avail_out))return 1;if(e.strstart-e.block_start>=e.w_size-262&&(u(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,4===t?(u(e,!0),0===e.strm.avail_out?3:4):(e.strstart>e.block_start&&(u(e,!1),e.strm.avail_out),1)})),new v(4,4,8,4,w),new v(4,5,16,8,w),new v(4,6,32,32,w),new v(4,4,16,16,p),new v(8,16,32,32,p),new v(8,16,128,128,p),new v(8,32,128,256,p),new v(32,128,258,1024,p),new v(32,258,258,4096,p)],t.deflateInit=function(e,t){return z(e,t,8,15,8,0)},t.deflateInit2=z,t.deflateReset=x,t.deflateResetKeep=y,t.deflateSetHeader=function(e,t){return e&&e.state?2!==e.state.wrap?-2:(e.state.gzhead=t,0):-2},t.deflate=function(e,t){var a,i,s,o;if(!e||!e.state||t>5||t<0)return e?h(e,-2):-2;if(i=e.state,!e.output||!e.input&&0!==e.avail_in||666===i.status&&4!==t)return h(e,0===e.avail_out?-5:-2);if(i.strm=e,a=i.last_flush,i.last_flush=t,42===i.status)if(2===i.wrap)e.adler=0,c(i,31),c(i,139),c(i,8),i.gzhead?(c(i,(i.gzhead.text?1:0)+(i.gzhead.hcrc?2:0)+(i.gzhead.extra?4:0)+(i.gzhead.name?8:0)+(i.gzhead.comment?16:0)),c(i,255&i.gzhead.time),c(i,i.gzhead.time>>8&255),c(i,i.gzhead.time>>16&255),c(i,i.gzhead.time>>24&255),c(i,9===i.level?2:i.strategy>=2||i.level<2?4:0),c(i,255&i.gzhead.os),i.gzhead.extra&&i.gzhead.extra.length&&(c(i,255&i.gzhead.extra.length),c(i,i.gzhead.extra.length>>8&255)),i.gzhead.hcrc&&(e.adler=l(e.adler,i.pending_buf,i.pending,0)),i.gzindex=0,i.status=69):(c(i,0),c(i,0),c(i,0),c(i,0),c(i,0),c(i,9===i.level?2:i.strategy>=2||i.level<2?4:0),c(i,3),i.status=113);else{var g=8+(i.w_bits-8<<4)<<8;g|=(i.strategy>=2||i.level<2?0:i.level<6?1:6===i.level?2:3)<<6,0!==i.strstart&&(g|=32),g+=31-g%31,i.status=113,b(i,g),0!==i.strstart&&(b(i,e.adler>>>16),b(i,65535&e.adler)),e.adler=1}if(69===i.status)if(i.gzhead.extra){for(s=i.pending;i.gzindex<(65535&i.gzhead.extra.length)&&(i.pending!==i.pending_buf_size||(i.gzhead.hcrc&&i.pending>s&&(e.adler=l(e.adler,i.pending_buf,i.pending-s,s)),f(e),s=i.pending,i.pending!==i.pending_buf_size));)c(i,255&i.gzhead.extra[i.gzindex]),i.gzindex++;i.gzhead.hcrc&&i.pending>s&&(e.adler=l(e.adler,i.pending_buf,i.pending-s,s)),i.gzindex===i.gzhead.extra.length&&(i.gzindex=0,i.status=73)}else i.status=73;if(73===i.status)if(i.gzhead.name){s=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>s&&(e.adler=l(e.adler,i.pending_buf,i.pending-s,s)),f(e),s=i.pending,i.pending===i.pending_buf_size)){o=1;break}o=i.gzindexs&&(e.adler=l(e.adler,i.pending_buf,i.pending-s,s)),0===o&&(i.gzindex=0,i.status=91)}else i.status=91;if(91===i.status)if(i.gzhead.comment){s=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>s&&(e.adler=l(e.adler,i.pending_buf,i.pending-s,s)),f(e),s=i.pending,i.pending===i.pending_buf_size)){o=1;break}o=i.gzindexs&&(e.adler=l(e.adler,i.pending_buf,i.pending-s,s)),0===o&&(i.status=103)}else i.status=103;if(103===i.status&&(i.gzhead.hcrc?(i.pending+2>i.pending_buf_size&&f(e),i.pending+2<=i.pending_buf_size&&(c(i,255&e.adler),c(i,e.adler>>8&255),e.adler=0,i.status=113)):i.status=113),0!==i.pending){if(f(e),0===e.avail_out)return i.last_flush=-1,0}else if(0===e.avail_in&&d(t)<=d(a)&&4!==t)return h(e,-5);if(666===i.status&&0!==e.avail_in)return h(e,-5);if(0!==e.avail_in||0!==i.lookahead||0!==t&&666!==i.status){var w=2===i.strategy?function(e,t){for(var a;;){if(0===e.lookahead&&(m(e),0===e.lookahead)){if(0===t)return 1;break}if(e.match_length=0,a=r._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,a&&(u(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,4===t?(u(e,!0),0===e.strm.avail_out?3:4):e.last_lit&&(u(e,!1),0===e.strm.avail_out)?1:2}(i,t):3===i.strategy?function(e,t){for(var a,n,i,s,l=e.window;;){if(e.lookahead<=258){if(m(e),e.lookahead<=258&&0===t)return 1;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=3&&e.strstart>0&&(n=l[i=e.strstart-1])===l[++i]&&n===l[++i]&&n===l[++i]){s=e.strstart+258;do{}while(n===l[++i]&&n===l[++i]&&n===l[++i]&&n===l[++i]&&n===l[++i]&&n===l[++i]&&n===l[++i]&&n===l[++i]&&ie.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=3?(a=r._tr_tally(e,1,e.match_length-3),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(a=r._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),a&&(u(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,4===t?(u(e,!0),0===e.strm.avail_out?3:4):e.last_lit&&(u(e,!1),0===e.strm.avail_out)?1:2}(i,t):n[i.level].func(i,t);if(3!==w&&4!==w||(i.status=666),1===w||3===w)return 0===e.avail_out&&(i.last_flush=-1),0;if(2===w&&(1===t?r._tr_align(i):5!==t&&(r._tr_stored_block(i,0,0,!1),3===t&&(_(i.head),0===i.lookahead&&(i.strstart=0,i.block_start=0,i.insert=0))),f(e),0===e.avail_out))return i.last_flush=-1,0}return 4!==t?0:i.wrap<=0?1:(2===i.wrap?(c(i,255&e.adler),c(i,e.adler>>8&255),c(i,e.adler>>16&255),c(i,e.adler>>24&255),c(i,255&e.total_in),c(i,e.total_in>>8&255),c(i,e.total_in>>16&255),c(i,e.total_in>>24&255)):(b(i,e.adler>>>16),b(i,65535&e.adler)),f(e),i.wrap>0&&(i.wrap=-i.wrap),0!==i.pending?0:1)},t.deflateEnd=function(e){var t;return e&&e.state?42!==(t=e.state.status)&&69!==t&&73!==t&&91!==t&&103!==t&&113!==t&&666!==t?h(e,-2):(e.state=null,113===t?h(e,-3):0):-2},t.deflateSetDictionary=function(e,t){var a,n,r,l,o,h,d,f,u=t.length;if(!e||!e.state)return-2;if(2===(l=(a=e.state).wrap)||1===l&&42!==a.status||a.lookahead)return-2;for(1===l&&(e.adler=s(e.adler,t,u,0)),a.wrap=0,u>=a.w_size&&(0===l&&(_(a.head),a.strstart=0,a.block_start=0,a.insert=0),f=new i.Buf8(a.w_size),i.arraySet(f,t,u-a.w_size,a.w_size,0),t=f,u=a.w_size),o=e.avail_in,h=e.next_in,d=e.input,e.avail_in=u,e.next_in=0,e.input=t,m(a);a.lookahead>=3;){n=a.strstart,r=a.lookahead-2;do{a.ins_h=(a.ins_h<>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function h(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new n.Buf16(320),this.work=new n.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function d(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=1,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new n.Buf32(852),t.distcode=t.distdyn=new n.Buf32(592),t.sane=1,t.back=-1,0):-2}function _(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,d(e)):-2}function f(e,t){var a,n;return e&&e.state?(n=e.state,t<0?(a=0,t=-t):(a=1+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?-2:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=a,n.wbits=t,_(e))):-2}function u(e,t){var a,n;return e?(n=new h,e.state=n,n.window=null,0!==(a=f(e,t))&&(e.state=null),a):-2}var c,b,g=!0;function m(e){if(g){var t;for(c=new n.Buf32(512),b=new n.Buf32(32),t=0;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(l(1,e.lens,0,288,c,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;l(2,e.lens,0,32,b,0,e.work,{bits:5}),g=!1}e.lencode=c,e.lenbits=9,e.distcode=b,e.distbits=5}function w(e,t,a,i){var r,s=e.state;return null===s.window&&(s.wsize=1<=s.wsize?(n.arraySet(s.window,t,a-s.wsize,s.wsize,0),s.wnext=0,s.whave=s.wsize):((r=s.wsize-s.wnext)>i&&(r=i),n.arraySet(s.window,t,a-i,r,s.wnext),(i-=r)?(n.arraySet(s.window,t,a-i,i,0),s.wnext=i,s.whave=s.wsize):(s.wnext+=r,s.wnext===s.wsize&&(s.wnext=0),s.whave>>8&255,a.check=r(a.check,U,2,0),b=0,g=0,a.mode=2;break}if(a.flags=0,a.head&&(a.head.done=!1),!(1&a.wrap)||(((255&b)<<8)+(b>>8))%31){e.msg="incorrect header check",a.mode=30;break}if(8!=(15&b)){e.msg="unknown compression method",a.mode=30;break}if(g-=4,R=8+(15&(b>>>=4)),0===a.wbits)a.wbits=R;else if(R>a.wbits){e.msg="invalid window size",a.mode=30;break}a.dmax=1<>8&1),512&a.flags&&(U[0]=255&b,U[1]=b>>>8&255,a.check=r(a.check,U,2,0)),b=0,g=0,a.mode=3;case 3:for(;g<32;){if(0===u)break e;u--,b+=h[_++]<>>8&255,U[2]=b>>>16&255,U[3]=b>>>24&255,a.check=r(a.check,U,4,0)),b=0,g=0,a.mode=4;case 4:for(;g<16;){if(0===u)break e;u--,b+=h[_++]<>8),512&a.flags&&(U[0]=255&b,U[1]=b>>>8&255,a.check=r(a.check,U,2,0)),b=0,g=0,a.mode=5;case 5:if(1024&a.flags){for(;g<16;){if(0===u)break e;u--,b+=h[_++]<>>8&255,a.check=r(a.check,U,2,0)),b=0,g=0}else a.head&&(a.head.extra=null);a.mode=6;case 6:if(1024&a.flags&&((k=a.length)>u&&(k=u),k&&(a.head&&(R=a.head.extra_len-a.length,a.head.extra||(a.head.extra=new Array(a.head.extra_len)),n.arraySet(a.head.extra,h,_,k,R)),512&a.flags&&(a.check=r(a.check,h,k,_)),u-=k,_+=k,a.length-=k),a.length))break e;a.length=0,a.mode=7;case 7:if(2048&a.flags){if(0===u)break e;k=0;do{R=h[_+k++],a.head&&R&&a.length<65536&&(a.head.name+=String.fromCharCode(R))}while(R&&k>9&1,a.head.done=!0),e.adler=a.check=0,a.mode=12;break;case 10:for(;g<32;){if(0===u)break e;u--,b+=h[_++]<>>=7&g,g-=7&g,a.mode=27;break}for(;g<3;){if(0===u)break e;u--,b+=h[_++]<>>=1)){case 0:a.mode=14;break;case 1:if(m(a),a.mode=20,6===t){b>>>=2,g-=2;break e}break;case 2:a.mode=17;break;case 3:e.msg="invalid block type",a.mode=30}b>>>=2,g-=2;break;case 14:for(b>>>=7&g,g-=7&g;g<32;){if(0===u)break e;u--,b+=h[_++]<>>16^65535)){e.msg="invalid stored block lengths",a.mode=30;break}if(a.length=65535&b,b=0,g=0,a.mode=15,6===t)break e;case 15:a.mode=16;case 16:if(k=a.length){if(k>u&&(k=u),k>c&&(k=c),0===k)break e;n.arraySet(d,h,_,k,f),u-=k,_+=k,c-=k,f+=k,a.length-=k;break}a.mode=12;break;case 17:for(;g<14;){if(0===u)break e;u--,b+=h[_++]<>>=5,g-=5,a.ndist=1+(31&b),b>>>=5,g-=5,a.ncode=4+(15&b),b>>>=4,g-=4,a.nlen>286||a.ndist>30){e.msg="too many length or distance symbols",a.mode=30;break}a.have=0,a.mode=18;case 18:for(;a.have>>=3,g-=3}for(;a.have<19;)a.lens[I[a.have++]]=0;if(a.lencode=a.lendyn,a.lenbits=7,T={bits:a.lenbits},B=l(0,a.lens,0,19,a.lencode,0,a.work,T),a.lenbits=T.bits,B){e.msg="invalid code lengths set",a.mode=30;break}a.have=0,a.mode=19;case 19:for(;a.have>>16&255,E=65535&D,!((z=D>>>24)<=g);){if(0===u)break e;u--,b+=h[_++]<>>=z,g-=z,a.lens[a.have++]=E;else{if(16===E){for(N=z+2;g>>=z,g-=z,0===a.have){e.msg="invalid bit length repeat",a.mode=30;break}R=a.lens[a.have-1],k=3+(3&b),b>>>=2,g-=2}else if(17===E){for(N=z+3;g>>=z)),b>>>=3,g-=3}else{for(N=z+7;g>>=z)),b>>>=7,g-=7}if(a.have+k>a.nlen+a.ndist){e.msg="invalid bit length repeat",a.mode=30;break}for(;k--;)a.lens[a.have++]=R}}if(30===a.mode)break;if(0===a.lens[256]){e.msg="invalid code -- missing end-of-block",a.mode=30;break}if(a.lenbits=9,T={bits:a.lenbits},B=l(1,a.lens,0,a.nlen,a.lencode,0,a.work,T),a.lenbits=T.bits,B){e.msg="invalid literal/lengths set",a.mode=30;break}if(a.distbits=6,a.distcode=a.distdyn,T={bits:a.distbits},B=l(2,a.lens,a.nlen,a.ndist,a.distcode,0,a.work,T),a.distbits=T.bits,B){e.msg="invalid distances set",a.mode=30;break}if(a.mode=20,6===t)break e;case 20:a.mode=21;case 21:if(u>=6&&c>=258){e.next_out=f,e.avail_out=c,e.next_in=_,e.avail_in=u,a.hold=b,a.bits=g,s(e,v),f=e.next_out,d=e.output,c=e.avail_out,_=e.next_in,h=e.input,u=e.avail_in,b=a.hold,g=a.bits,12===a.mode&&(a.back=-1);break}for(a.back=0;S=(D=a.lencode[b&(1<>>16&255,E=65535&D,!((z=D>>>24)<=g);){if(0===u)break e;u--,b+=h[_++]<>A)])>>>16&255,E=65535&D,!(A+(z=D>>>24)<=g);){if(0===u)break e;u--,b+=h[_++]<>>=A,g-=A,a.back+=A}if(b>>>=z,g-=z,a.back+=z,a.length=E,0===S){a.mode=26;break}if(32&S){a.back=-1,a.mode=12;break}if(64&S){e.msg="invalid literal/length code",a.mode=30;break}a.extra=15&S,a.mode=22;case 22:if(a.extra){for(N=a.extra;g>>=a.extra,g-=a.extra,a.back+=a.extra}a.was=a.length,a.mode=23;case 23:for(;S=(D=a.distcode[b&(1<>>16&255,E=65535&D,!((z=D>>>24)<=g);){if(0===u)break e;u--,b+=h[_++]<>A)])>>>16&255,E=65535&D,!(A+(z=D>>>24)<=g);){if(0===u)break e;u--,b+=h[_++]<>>=A,g-=A,a.back+=A}if(b>>>=z,g-=z,a.back+=z,64&S){e.msg="invalid distance code",a.mode=30;break}a.offset=E,a.extra=15&S,a.mode=24;case 24:if(a.extra){for(N=a.extra;g>>=a.extra,g-=a.extra,a.back+=a.extra}if(a.offset>a.dmax){e.msg="invalid distance too far back",a.mode=30;break}a.mode=25;case 25:if(0===c)break e;if(k=v-c,a.offset>k){if((k=a.offset-k)>a.whave&&a.sane){e.msg="invalid distance too far back",a.mode=30;break}k>a.wnext?(k-=a.wnext,y=a.wsize-k):y=a.wnext-k,k>a.length&&(k=a.length),x=a.window}else x=d,y=f-a.offset,k=a.length;k>c&&(k=c),c-=k,a.length-=k;do{d[f++]=x[y++]}while(--k);0===a.length&&(a.mode=21);break;case 26:if(0===c)break e;d[f++]=a.length,c--,a.mode=21;break;case 27:if(a.wrap){for(;g<32;){if(0===u)break e;u--,b|=h[_++]<>>16&65535|0,s=0;0!==a;){a-=s=a>2e3?2e3:a;do{r=r+(i=i+t[n++]|0)|0}while(--s);i%=65521,r%=65521}return i|r<<16|0}},function(e,t,a){"use strict";var n=function(){for(var e,t=[],a=0;a<256;a++){e=a;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[a]=e}return t}();e.exports=function(e,t,a,i){var r=n,s=i+a;e^=-1;for(var l=i;l>>8^r[255&(e^t[l])];return-1^e}},function(e,t,a){"use strict";var n=a(2);function i(e){for(var t=e.length;--t>=0;)e[t]=0}var r=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],s=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],l=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],o=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],h=new Array(576);i(h);var d=new Array(60);i(d);var _=new Array(512);i(_);var f=new Array(256);i(f);var u=new Array(29);i(u);var c,b,g,m=new Array(30);function w(e,t,a,n,i){this.static_tree=e,this.extra_bits=t,this.extra_base=a,this.elems=n,this.max_length=i,this.has_stree=e&&e.length}function p(e,t){this.dyn_tree=e,this.max_code=0,this.stat_desc=t}function v(e){return e<256?_[e]:_[256+(e>>>7)]}function k(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function y(e,t,a){e.bi_valid>16-a?(e.bi_buf|=t<>16-e.bi_valid,e.bi_valid+=a-16):(e.bi_buf|=t<>>=1,a<<=1}while(--t>0);return a>>>1}function S(e,t,a){var n,i,r=new Array(16),s=0;for(n=1;n<=15;n++)r[n]=s=s+a[n-1]<<1;for(i=0;i<=t;i++){var l=e[2*i+1];0!==l&&(e[2*i]=z(r[l]++,l))}}function E(e){var t;for(t=0;t<286;t++)e.dyn_ltree[2*t]=0;for(t=0;t<30;t++)e.dyn_dtree[2*t]=0;for(t=0;t<19;t++)e.bl_tree[2*t]=0;e.dyn_ltree[512]=1,e.opt_len=e.static_len=0,e.last_lit=e.matches=0}function A(e){e.bi_valid>8?k(e,e.bi_buf):e.bi_valid>0&&(e.pending_buf[e.pending++]=e.bi_buf),e.bi_buf=0,e.bi_valid=0}function Z(e,t,a,n){var i=2*t,r=2*a;return e[i]>1;a>=1;a--)O(e,r,a);i=o;do{a=e.heap[1],e.heap[1]=e.heap[e.heap_len--],O(e,r,1),n=e.heap[1],e.heap[--e.heap_max]=a,e.heap[--e.heap_max]=n,r[2*i]=r[2*a]+r[2*n],e.depth[i]=(e.depth[a]>=e.depth[n]?e.depth[a]:e.depth[n])+1,r[2*a+1]=r[2*n+1]=i,e.heap[1]=i++,O(e,r,1)}while(e.heap_len>=2);e.heap[--e.heap_max]=e.heap[1],function(e,t){var a,n,i,r,s,l,o=t.dyn_tree,h=t.max_code,d=t.stat_desc.static_tree,_=t.stat_desc.has_stree,f=t.stat_desc.extra_bits,u=t.stat_desc.extra_base,c=t.stat_desc.max_length,b=0;for(r=0;r<=15;r++)e.bl_count[r]=0;for(o[2*e.heap[e.heap_max]+1]=0,a=e.heap_max+1;a<573;a++)(r=o[2*o[2*(n=e.heap[a])+1]+1]+1)>c&&(r=c,b++),o[2*n+1]=r,n>h||(e.bl_count[r]++,s=0,n>=u&&(s=f[n-u]),l=o[2*n],e.opt_len+=l*(r+s),_&&(e.static_len+=l*(d[2*n+1]+s)));if(0!==b){do{for(r=c-1;0===e.bl_count[r];)r--;e.bl_count[r]--,e.bl_count[r+1]+=2,e.bl_count[c]--,b-=2}while(b>0);for(r=c;0!==r;r--)for(n=e.bl_count[r];0!==n;)(i=e.heap[--a])>h||(o[2*i+1]!==r&&(e.opt_len+=(r-o[2*i+1])*o[2*i],o[2*i+1]=r),n--)}}(e,t),S(r,h,e.bl_count)}function T(e,t,a){var n,i,r=-1,s=t[1],l=0,o=7,h=4;for(0===s&&(o=138,h=3),t[2*(a+1)+1]=65535,n=0;n<=a;n++)i=s,s=t[2*(n+1)+1],++l>=7;n<30;n++)for(m[n]=i<<7,e=0;e<1<0?(2===e.strm.data_type&&(e.strm.data_type=function(e){var t,a=4093624447;for(t=0;t<=31;t++,a>>>=1)if(1&a&&0!==e.dyn_ltree[2*t])return 0;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return 1;for(t=32;t<256;t++)if(0!==e.dyn_ltree[2*t])return 1;return 0}(e)),B(e,e.l_desc),B(e,e.d_desc),s=function(e){var t;for(T(e,e.dyn_ltree,e.l_desc.max_code),T(e,e.dyn_dtree,e.d_desc.max_code),B(e,e.bl_desc),t=18;t>=3&&0===e.bl_tree[2*o[t]+1];t--);return e.opt_len+=3*(t+1)+5+5+4,t}(e),i=e.opt_len+3+7>>>3,(r=e.static_len+3+7>>>3)<=i&&(i=r)):i=r=a+5,a+4<=i&&-1!==t?U(e,t,a,n):4===e.strategy||r===i?(y(e,2+(n?1:0),3),R(e,h,d)):(y(e,4+(n?1:0),3),function(e,t,a,n){var i;for(y(e,t-257,5),y(e,a-1,5),y(e,n-4,4),i=0;i>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&a,e.last_lit++,0===t?e.dyn_ltree[2*a]++:(e.matches++,t--,e.dyn_ltree[2*(f[a]+256+1)]++,e.dyn_dtree[2*v(t)]++),e.last_lit===e.lit_bufsize-1},t._tr_align=function(e){y(e,2,3),x(e,256,h),function(e){16===e.bi_valid?(k(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):e.bi_valid>=8&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}(e)}},function(e,t,a){"use strict";e.exports=function(e,t){var a,n,i,r,s,l,o,h,d,_,f,u,c,b,g,m,w,p,v,k,y,x,z,S,E;a=e.state,n=e.next_in,S=e.input,i=n+(e.avail_in-5),r=e.next_out,E=e.output,s=r-(t-e.avail_out),l=r+(e.avail_out-257),o=a.dmax,h=a.wsize,d=a.whave,_=a.wnext,f=a.window,u=a.hold,c=a.bits,b=a.lencode,g=a.distcode,m=(1<>>=v=p>>>24,c-=v,0===(v=p>>>16&255))E[r++]=65535&p;else{if(!(16&v)){if(0==(64&v)){p=b[(65535&p)+(u&(1<>>=v,c-=v),c<15&&(u+=S[n++]<>>=v=p>>>24,c-=v,!(16&(v=p>>>16&255))){if(0==(64&v)){p=g[(65535&p)+(u&(1<o){e.msg="invalid distance too far back",a.mode=30;break e}if(u>>>=v,c-=v,y>(v=r-s)){if((v=y-v)>d&&a.sane){e.msg="invalid distance too far back",a.mode=30;break e}if(x=0,z=f,0===_){if(x+=h-v,v2;)E[r++]=z[x++],E[r++]=z[x++],E[r++]=z[x++],k-=3;k&&(E[r++]=z[x++],k>1&&(E[r++]=z[x++]))}else{x=r-y;do{E[r++]=E[x++],E[r++]=E[x++],E[r++]=E[x++],k-=3}while(k>2);k&&(E[r++]=E[x++],k>1&&(E[r++]=E[x++]))}break}}break}}while(n>3,u&=(1<<(c-=k<<3))-1,e.next_in=n,e.next_out=r,e.avail_in=n=1&&0===U[E];E--);if(A>E&&(A=E),0===E)return h[d++]=20971520,h[d++]=20971520,f.bits=1,0;for(S=1;S0&&(0===e||1!==E))return-1;for(I[1]=0,x=1;x<15;x++)I[x+1]=I[x]+U[x];for(z=0;z852||2===e&&B>592)return 1;for(;;){p=x-O,_[z]w?(v=F[L+_[z]],k=N[D+_[z]]):(v=96,k=0),u=1<>O)+(c-=u)]=p<<24|v<<16|k|0}while(0!==c);for(u=1<>=1;if(0!==u?(T&=u-1,T+=u):T=0,z++,0==--U[x]){if(x===E)break;x=t[a+_[z]]}if(x>A&&(T&g)!==b){for(0===O&&(O=A),m+=S,R=1<<(Z=x-O);Z+O852||2===e&&B>592)return 1;h[b=T&g]=A<<24|Z<<16|m-d|0}}return 0!==T&&(h[m+T]=x-O<<24|64<<16|0),f.bits=A,0}},function(e,t,a){"use strict";a.r(t);var n=a(3),i=a.n(n),r=a(4),s=a(5),l=a(1),o=a.n(l),h=a(0);function d(e,t){var a=this;this.inflatedReady=e,this.deflatedReady=t,this._inflate=function(e){var t=new i.a,a=Object(s.inflateInit2)(t,15);if(a!==h.Z_OK)throw new Error("Problem initializing inflate stream: "+o.a[a]);return function(a){if(void 0===a)return e();var n,i,r;t.input=a,t.next_in=0,t.avail_in=t.input.length;var l=!0;do{if(0===t.avail_out&&(t.output=new Uint8Array(16384),n=t.next_out=0,t.avail_out=16384),(i=Object(s.inflate)(t,h.Z_NO_FLUSH))!==h.Z_STREAM_END&&i!==h.Z_OK)throw new Error("inflate problem: "+o.a[i]);t.next_out&&(0!==t.avail_out&&i!==h.Z_STREAM_END||(r=t.output.subarray(n,n=t.next_out),l=e(r)))}while(t.avail_in>0&&i!==h.Z_STREAM_END);return t.next_out>n&&(r=t.output.subarray(n,n=t.next_out),l=e(r)),l}}((function(e){return a.inflatedReady(e.buffer.slice(e.byteOffset,e.byteOffset+e.length))})),this._deflate=function(e){var t=new i.a,a=Object(r.deflateInit2)(t,h.Z_DEFAULT_COMPRESSION,h.Z_DEFLATED,15,8,h.Z_DEFAULT_STRATEGY);if(a!==h.Z_OK)throw new Error("Problem initializing deflate stream: "+o.a[a]);return function(a){if(void 0===a)return e();var n,i,s;t.input=a,t.next_in=0,t.avail_in=t.input.length;var l=!0;do{if(0===t.avail_out&&(t.output=new Uint8Array(16384),s=t.next_out=0,t.avail_out=16384),(n=Object(r.deflate)(t,h.Z_SYNC_FLUSH))!==h.Z_STREAM_END&&n!==h.Z_OK)throw new Error("Deflate problem: "+o.a[n]);0===t.avail_out&&t.next_out>s&&(i=t.output.subarray(s,s=t.next_out),l=e(i))}while((t.avail_in>0||0===t.avail_out)&&n!==h.Z_STREAM_END);return t.next_out>s&&(i=t.output.subarray(s,s=t.next_out),l=e(i)),l}}((function(e){return a.deflatedReady(e.buffer.slice(e.byteOffset,e.byteOffset+e.length))}))}d.prototype.inflate=function(e){this._inflate(new Uint8Array(e))},d.prototype.deflate=function(e){this._deflate(new Uint8Array(e))};var _=function(e,t){return{message:e,buffer:t}},f=new d((function(e){return self.postMessage(_("inflated_ready",e),[e])}),(function(e){return self.postMessage(_("deflated_ready",e),[e])}));self.onmessage=function(e){var t=e.data.message,a=e.data.buffer;switch(t){case"start":break;case"inflate":f.inflate(a);break;case"deflate":f.deflate(a)}}}]); \ No newline at end of file diff --git a/src/imap.js b/src/imap.js index d40d8b24..f7ce977d 100644 --- a/src/imap.js +++ b/src/imap.js @@ -345,9 +345,9 @@ export default class Imap { this._sendCompressed(buffer) } else { if (!this.socket) { - this._onError(new Error("Error :: Unexpected socket close")); + this._onError(new Error('Error :: Unexpected socket close')) } else { - this.socket.send(buffer); + this.socket.send(buffer) } } }