tedious 20.0.6 → 20.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,6 +6,7 @@ import Debug from './debug';
6
6
  import Message from './message';
7
7
  import OutgoingMessageStream from './outgoing-message-stream';
8
8
  declare class MessageIO extends EventEmitter {
9
+ static readonly MAX_TLS_SEND_FRAGMENT_SIZE = 16384;
9
10
  socket: Socket;
10
11
  debug: Debug;
11
12
  tlsNegotiationComplete: boolean;
package/lib/message-io.js CHANGED
@@ -15,6 +15,10 @@ var _outgoingMessageStream = _interopRequireDefault(require("./outgoing-message-
15
15
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
16
16
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
17
17
  class MessageIO extends _events.EventEmitter {
18
+ // Node's `tls.TLSSocket#setMaxSendFragment` silently ignores values outside this range.
19
+ // (A static class property rather than a named export, as the `module.exports`
20
+ // assignment at the bottom of this file would clobber named exports for CJS consumers.)
21
+ static MAX_TLS_SEND_FRAGMENT_SIZE = 16384;
18
22
  constructor(socket, packetSize, debug) {
19
23
  super();
20
24
  this.socket = socket;
@@ -34,8 +38,15 @@ class MessageIO extends _events.EventEmitter {
34
38
  this.debug.log('Packet size changed from ' + this.outgoingMessageStream.packetSize + ' to ' + packetSize);
35
39
  this.outgoingMessageStream.packetSize = packetSize;
36
40
  }
41
+ const maxSendFragment = Math.min(this.outgoingMessageStream.packetSize, MessageIO.MAX_TLS_SEND_FRAGMENT_SIZE);
37
42
  if (this.securePair) {
38
- this.securePair.cleartext.setMaxSendFragment(this.outgoingMessageStream.packetSize);
43
+ // Classic `encrypt: true` path: TLS is layered over a `DuplexPair`.
44
+ this.securePair.cleartext.setMaxSendFragment(maxSendFragment);
45
+ } else if (this.socket instanceof tls.TLSSocket) {
46
+ // `encrypt: "strict"` (TDS 8.0) path: the socket itself is the TLS socket. Without
47
+ // this, a server-initiated packet size change (ENVCHANGE) after login would leave
48
+ // the original cap in place, potentially allowing oversized TLS records again.
49
+ this.socket.setMaxSendFragment(maxSendFragment);
39
50
  }
40
51
  return this.outgoingMessageStream.packetSize;
41
52
  }
@@ -78,7 +89,7 @@ class MessageIO extends _events.EventEmitter {
78
89
  this.debug.log('TLS negotiated (' + cipher.name + ', ' + cipher.version + ')');
79
90
  }
80
91
  this.emit('secure', securePair.cleartext);
81
- securePair.cleartext.setMaxSendFragment(this.outgoingMessageStream.packetSize);
92
+ securePair.cleartext.setMaxSendFragment(Math.min(this.outgoingMessageStream.packetSize, MessageIO.MAX_TLS_SEND_FRAGMENT_SIZE));
82
93
  this.outgoingMessageStream.unpipe(this.socket);
83
94
  this.socket.unpipe(this.incomingMessageStream);
84
95
  this.socket.pipe(securePair.encrypted);
@@ -156,4 +167,4 @@ class MessageIO extends _events.EventEmitter {
156
167
  }
157
168
  var _default = exports.default = MessageIO;
158
169
  module.exports = MessageIO;
159
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbmF0aXZlRHVwbGV4cGFpciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwidGxzIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfbmV0IiwiX2V2ZW50cyIsIl9tZXNzYWdlIiwiX3BhY2tldCIsIl9pbmNvbWluZ01lc3NhZ2VTdHJlYW0iLCJfb3V0Z29pbmdNZXNzYWdlU3RyZWFtIiwiZSIsInQiLCJXZWFrTWFwIiwiciIsIm4iLCJfX2VzTW9kdWxlIiwibyIsImkiLCJmIiwiX19wcm90b19fIiwiZGVmYXVsdCIsImhhcyIsImdldCIsInNldCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiTWVzc2FnZUlPIiwiRXZlbnRFbWl0dGVyIiwiY29uc3RydWN0b3IiLCJzb2NrZXQiLCJwYWNrZXRTaXplIiwiZGVidWciLCJ0bHNOZWdvdGlhdGlvbkNvbXBsZXRlIiwiaW5jb21pbmdNZXNzYWdlU3RyZWFtIiwiSW5jb21pbmdNZXNzYWdlU3RyZWFtIiwiaW5jb21pbmdNZXNzYWdlSXRlcmF0b3IiLCJTeW1ib2wiLCJhc3luY0l0ZXJhdG9yIiwib3V0Z29pbmdNZXNzYWdlU3RyZWFtIiwiT3V0Z29pbmdNZXNzYWdlU3RyZWFtIiwicGlwZSIsImFyZ3MiLCJsZW5ndGgiLCJsb2ciLCJzZWN1cmVQYWlyIiwiY2xlYXJ0ZXh0Iiwic2V0TWF4U2VuZEZyYWdtZW50Iiwic3RhcnRUbHMiLCJjcmVkZW50aWFsc0RldGFpbHMiLCJob3N0bmFtZSIsInRydXN0U2VydmVyQ2VydGlmaWNhdGUiLCJtYXhWZXJzaW9uIiwiaW5jbHVkZXMiLCJzZWN1cmVDb250ZXh0IiwiY3JlYXRlU2VjdXJlQ29udGV4dCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZHVwbGV4cGFpciIsIkR1cGxleFBhaXIiLCJjb25uZWN0Iiwic29ja2V0MSIsImhvc3QiLCJzZXJ2ZXJuYW1lIiwiaXNJUCIsInJlamVjdFVuYXV0aG9yaXplZCIsImVuY3J5cHRlZCIsInNvY2tldDIiLCJvblNlY3VyZUNvbm5lY3QiLCJyZW1vdmVMaXN0ZW5lciIsIm9uUmVhZGFibGUiLCJvbkVycm9yIiwib25jZSIsImVyciIsImRlc3Ryb3kiLCJjaXBoZXIiLCJnZXRDaXBoZXIiLCJuYW1lIiwidmVyc2lvbiIsImVtaXQiLCJ1bnBpcGUiLCJtZXNzYWdlIiwiTWVzc2FnZSIsInR5cGUiLCJUWVBFIiwiUFJFTE9HSU4iLCJyZXNldENvbm5lY3Rpb24iLCJjaHVuayIsInJlYWQiLCJ3cml0ZSIsImVuZCIsInJlYWRNZXNzYWdlIiwidGhlbiIsInJlc3BvbnNlIiwiZGF0YSIsImNhdGNoIiwic2VuZE1lc3NhZ2UiLCJwYWNrZXRUeXBlIiwicmVzdWx0IiwibmV4dCIsImRvbmUiLCJFcnJvciIsInZhbHVlIiwiX2RlZmF1bHQiLCJleHBvcnRzIiwibW9kdWxlIl0sInNvdXJjZXMiOlsiLi4vc3JjL21lc3NhZ2UtaW8udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IER1cGxleFBhaXIgZnJvbSAnbmF0aXZlLWR1cGxleHBhaXInO1xuXG5pbXBvcnQgeyBEdXBsZXggfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0ICogYXMgdGxzIGZyb20gJ3Rscyc7XG5pbXBvcnQgeyBpc0lQLCBTb2NrZXQgfSBmcm9tICduZXQnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcblxuaW1wb3J0IERlYnVnIGZyb20gJy4vZGVidWcnO1xuXG5pbXBvcnQgTWVzc2FnZSBmcm9tICcuL21lc3NhZ2UnO1xuaW1wb3J0IHsgVFlQRSB9IGZyb20gJy4vcGFja2V0JztcblxuaW1wb3J0IEluY29taW5nTWVzc2FnZVN0cmVhbSBmcm9tICcuL2luY29taW5nLW1lc3NhZ2Utc3RyZWFtJztcbmltcG9ydCBPdXRnb2luZ01lc3NhZ2VTdHJlYW0gZnJvbSAnLi9vdXRnb2luZy1tZXNzYWdlLXN0cmVhbSc7XG5cbmNsYXNzIE1lc3NhZ2VJTyBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIGRlY2xhcmUgc29ja2V0OiBTb2NrZXQ7XG4gIGRlY2xhcmUgZGVidWc6IERlYnVnO1xuXG4gIGRlY2xhcmUgdGxzTmVnb3RpYXRpb25Db21wbGV0ZTogYm9vbGVhbjtcblxuICBkZWNsYXJlIHByaXZhdGUgaW5jb21pbmdNZXNzYWdlU3RyZWFtOiBJbmNvbWluZ01lc3NhZ2VTdHJlYW07XG4gIGRlY2xhcmUgb3V0Z29pbmdNZXNzYWdlU3RyZWFtOiBPdXRnb2luZ01lc3NhZ2VTdHJlYW07XG5cbiAgZGVjbGFyZSBzZWN1cmVQYWlyPzoge1xuICAgIGNsZWFydGV4dDogdGxzLlRMU1NvY2tldDtcbiAgICBlbmNyeXB0ZWQ6IER1cGxleDtcbiAgfTtcblxuICBkZWNsYXJlIGluY29taW5nTWVzc2FnZUl0ZXJhdG9yOiBBc3luY0l0ZXJhYmxlSXRlcmF0b3I8TWVzc2FnZT47XG5cbiAgY29uc3RydWN0b3Ioc29ja2V0OiBTb2NrZXQsIHBhY2tldFNpemU6IG51bWJlciwgZGVidWc6IERlYnVnKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuc29ja2V0ID0gc29ja2V0O1xuICAgIHRoaXMuZGVidWcgPSBkZWJ1ZztcblxuICAgIHRoaXMudGxzTmVnb3RpYXRpb25Db21wbGV0ZSA9IGZhbHNlO1xuXG4gICAgdGhpcy5pbmNvbWluZ01lc3NhZ2VTdHJlYW0gPSBuZXcgSW5jb21pbmdNZXNzYWdlU3RyZWFtKHRoaXMuZGVidWcpO1xuICAgIHRoaXMuaW5jb21pbmdNZXNzYWdlSXRlcmF0b3IgPSB0aGlzLmluY29taW5nTWVzc2FnZVN0cmVhbVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcblxuICAgIHRoaXMub3V0Z29pbmdNZXNzYWdlU3RyZWFtID0gbmV3IE91dGdvaW5nTWVzc2FnZVN0cmVhbSh0aGlzLmRlYnVnLCB7IHBhY2tldFNpemU6IHBhY2tldFNpemUgfSk7XG5cbiAgICB0aGlzLnNvY2tldC5waXBlKHRoaXMuaW5jb21pbmdNZXNzYWdlU3RyZWFtKTtcbiAgICB0aGlzLm91dGdvaW5nTWVzc2FnZVN0cmVhbS5waXBlKHRoaXMuc29ja2V0KTtcbiAgfVxuXG4gIHBhY2tldFNpemUoLi4uYXJnczogW251bWJlcl0pIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBwYWNrZXRTaXplID0gYXJnc1swXTtcbiAgICAgIHRoaXMuZGVidWcubG9nKCdQYWNrZXQgc2l6ZSBjaGFuZ2VkIGZyb20gJyArIHRoaXMub3V0Z29pbmdNZXNzYWdlU3RyZWFtLnBhY2tldFNpemUgKyAnIHRvICcgKyBwYWNrZXRTaXplKTtcbiAgICAgIHRoaXMub3V0Z29pbmdNZXNzYWdlU3RyZWFtLnBhY2tldFNpemUgPSBwYWNrZXRTaXplO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNlY3VyZVBhaXIpIHtcbiAgICAgIHRoaXMuc2VjdXJlUGFpci5jbGVhcnRleHQuc2V0TWF4U2VuZEZyYWdtZW50KHRoaXMub3V0Z29pbmdNZXNzYWdlU3RyZWFtLnBhY2tldFNpemUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm91dGdvaW5nTWVzc2FnZVN0cmVhbS5wYWNrZXRTaXplO1xuICB9XG5cbiAgLy8gTmVnb3RpYXRlIFRMUyBlbmNyeXB0aW9uLlxuICBzdGFydFRscyhjcmVkZW50aWFsc0RldGFpbHM6IHRscy5TZWN1cmVDb250ZXh0T3B0aW9ucywgaG9zdG5hbWU6IHN0cmluZywgdHJ1c3RTZXJ2ZXJDZXJ0aWZpY2F0ZTogYm9vbGVhbikge1xuICAgIGlmICghY3JlZGVudGlhbHNEZXRhaWxzLm1heFZlcnNpb24gfHwgIVsnVExTdjEuMicsICdUTFN2MS4xJywgJ1RMU3YxJ10uaW5jbHVkZXMoY3JlZGVudGlhbHNEZXRhaWxzLm1heFZlcnNpb24pKSB7XG4gICAgICBjcmVkZW50aWFsc0RldGFpbHMubWF4VmVyc2lvbiA9ICdUTFN2MS4yJztcbiAgICB9XG5cbiAgICBjb25zdCBzZWN1cmVDb250ZXh0ID0gdGxzLmNyZWF0ZVNlY3VyZUNvbnRleHQoY3JlZGVudGlhbHNEZXRhaWxzKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBkdXBsZXhwYWlyID0gbmV3IER1cGxleFBhaXIoKTtcbiAgICAgIGNvbnN0IHNlY3VyZVBhaXIgPSB0aGlzLnNlY3VyZVBhaXIgPSB7XG4gICAgICAgIGNsZWFydGV4dDogdGxzLmNvbm5lY3Qoe1xuICAgICAgICAgIHNvY2tldDogZHVwbGV4cGFpci5zb2NrZXQxIGFzIFNvY2tldCxcbiAgICAgICAgICAvLyBUaGUgYGhvc3RgIGlzIHVzZWQgdG8gdmVyaWZ5IHRoZSBzZXJ2ZXIncyBjZXJ0aWZpY2F0ZSBpZGVudGl0eS5cbiAgICAgICAgICAvLyBJdCBpcyBub3QgdXNlZCB0byBlc3RhYmxpc2ggYSBjb25uZWN0aW9uIGFzIGEgYHNvY2tldGAgaXNcbiAgICAgICAgICAvLyBzcGVjaWZpZWQuXG4gICAgICAgICAgaG9zdDogaG9zdG5hbWUsXG4gICAgICAgICAgLy8gUkZDIDYwNjYgZG9lcyBub3QgYWxsb3cgSVAgYWRkcmVzc2VzIHRvIGJlIHVzZWQgYXMgdGhlIHNlcnZlclxuICAgICAgICAgIC8vIG5hbWUsIHNvIG9taXQgdGhlIFNOSSBleHRlbnNpb24gaW4gdGhhdCBjYXNlLlxuICAgICAgICAgIHNlcnZlcm5hbWU6IGlzSVAoaG9zdG5hbWUpID8gJycgOiBob3N0bmFtZSxcbiAgICAgICAgICBzZWN1cmVDb250ZXh0OiBzZWN1cmVDb250ZXh0LFxuICAgICAgICAgIHJlamVjdFVuYXV0aG9yaXplZDogIXRydXN0U2VydmVyQ2VydGlmaWNhdGVcbiAgICAgICAgfSksXG4gICAgICAgIGVuY3J5cHRlZDogZHVwbGV4cGFpci5zb2NrZXQyXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvblNlY3VyZUNvbm5lY3QgPSAoKSA9PiB7XG4gICAgICAgIHNlY3VyZVBhaXIuZW5jcnlwdGVkLnJlbW92ZUxpc3RlbmVyKCdyZWFkYWJsZScsIG9uUmVhZGFibGUpO1xuICAgICAgICBzZWN1cmVQYWlyLmNsZWFydGV4dC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgc2VjdXJlUGFpci5jbGVhcnRleHQucmVtb3ZlTGlzdGVuZXIoJ3NlY3VyZUNvbm5lY3QnLCBvblNlY3VyZUNvbm5lY3QpO1xuXG4gICAgICAgIC8vIElmIHdlIGVuY291bnRlciBhbnkgZXJyb3JzIGZyb20gdGhpcyBwb2ludCBvbixcbiAgICAgICAgLy8gd2UganVzdCBmb3J3YXJkIHRoZW0gdG8gdGhlIGFjdHVhbCBuZXR3b3JrIHNvY2tldC5cbiAgICAgICAgc2VjdXJlUGFpci5jbGVhcnRleHQub25jZSgnZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgICAgdGhpcy5zb2NrZXQuZGVzdHJveShlcnIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBjaXBoZXIgPSBzZWN1cmVQYWlyLmNsZWFydGV4dC5nZXRDaXBoZXIoKTtcbiAgICAgICAgaWYgKGNpcGhlcikge1xuICAgICAgICAgIHRoaXMuZGVidWcubG9nKCdUTFMgbmVnb3RpYXRlZCAoJyArIGNpcGhlci5uYW1lICsgJywgJyArIGNpcGhlci52ZXJzaW9uICsgJyknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW1pdCgnc2VjdXJlJywgc2VjdXJlUGFpci5jbGVhcnRleHQpO1xuXG4gICAgICAgIHNlY3VyZVBhaXIuY2xlYXJ0ZXh0LnNldE1heFNlbmRGcmFnbWVudCh0aGlzLm91dGdvaW5nTWVzc2FnZVN0cmVhbS5wYWNrZXRTaXplKTtcblxuICAgICAgICB0aGlzLm91dGdvaW5nTWVzc2FnZVN0cmVhbS51bnBpcGUodGhpcy5zb2NrZXQpO1xuICAgICAgICB0aGlzLnNvY2tldC51bnBpcGUodGhpcy5pbmNvbWluZ01lc3NhZ2VTdHJlYW0pO1xuXG4gICAgICAgIHRoaXMuc29ja2V0LnBpcGUoc2VjdXJlUGFpci5lbmNyeXB0ZWQpO1xuICAgICAgICBzZWN1cmVQYWlyLmVuY3J5cHRlZC5waXBlKHRoaXMuc29ja2V0KTtcblxuICAgICAgICBzZWN1cmVQYWlyLmNsZWFydGV4dC5waXBlKHRoaXMuaW5jb21pbmdNZXNzYWdlU3RyZWFtKTtcbiAgICAgICAgdGhpcy5vdXRnb2luZ01lc3NhZ2VTdHJlYW0ucGlwZShzZWN1cmVQYWlyLmNsZWFydGV4dCk7XG5cbiAgICAgICAgdGhpcy50bHNOZWdvdGlhdGlvbkNvbXBsZXRlID0gdHJ1ZTtcblxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvbkVycm9yID0gKGVycj86IEVycm9yKSA9PiB7XG4gICAgICAgIHNlY3VyZVBhaXIuZW5jcnlwdGVkLnJlbW92ZUxpc3RlbmVyKCdyZWFkYWJsZScsIG9uUmVhZGFibGUpO1xuICAgICAgICBzZWN1cmVQYWlyLmNsZWFydGV4dC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgc2VjdXJlUGFpci5jbGVhcnRleHQucmVtb3ZlTGlzdGVuZXIoJ3NlY3VyZUNvbm5lY3QnLCBvblNlY3VyZUNvbm5lY3QpO1xuXG4gICAgICAgIHNlY3VyZVBhaXIuY2xlYXJ0ZXh0LmRlc3Ryb3koKTtcbiAgICAgICAgc2VjdXJlUGFpci5lbmNyeXB0ZWQuZGVzdHJveSgpO1xuXG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgb25SZWFkYWJsZSA9ICgpID0+IHtcbiAgICAgICAgLy8gV2hlbiB0aGVyZSBpcyBoYW5kc2hha2UgZGF0YSBvbiB0aGUgZW5jcnlwdGVkIHN0cmVhbSBvZiB0aGUgc2VjdXJlIHBhaXIsXG4gICAgICAgIC8vIHdlIHdyYXAgaXQgaW50byBhIGBQUkVMT0dJTmAgbWVzc2FnZSBhbmQgc2VuZCBpdCB0byB0aGUgc2VydmVyLlxuICAgICAgICAvL1xuICAgICAgICAvLyBGb3IgZWFjaCBgUFJFTE9HSU5gIG1lc3NhZ2Ugd2Ugc2VudCB3ZSBnZXQgYmFjayBleGFjdGx5IG9uZSByZXNwb25zZSBtZXNzYWdlXG4gICAgICAgIC8vIHRoYXQgY29udGFpbnMgdGhlIHNlcnZlcidzIGhhbmRzaGFrZSByZXNwb25zZSBkYXRhLlxuICAgICAgICBjb25zdCBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoeyB0eXBlOiBUWVBFLlBSRUxPR0lOLCByZXNldENvbm5lY3Rpb246IGZhbHNlIH0pO1xuXG4gICAgICAgIGxldCBjaHVuaztcbiAgICAgICAgd2hpbGUgKGNodW5rID0gc2VjdXJlUGFpci5lbmNyeXB0ZWQucmVhZCgpKSB7XG4gICAgICAgICAgbWVzc2FnZS53cml0ZShjaHVuayk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vdXRnb2luZ01lc3NhZ2VTdHJlYW0ud3JpdGUobWVzc2FnZSk7XG4gICAgICAgIG1lc3NhZ2UuZW5kKCk7XG5cbiAgICAgICAgdGhpcy5yZWFkTWVzc2FnZSgpLnRoZW4oYXN5bmMgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgLy8gU2V0dXAgcmVhZGFibGUgaGFuZGxlciBmb3IgdGhlIG5leHQgcm91bmQgb2YgaGFuZHNoYWtpbmcuXG4gICAgICAgICAgLy8gSWYgd2UgZW5jb3VudGVyIGEgYHNlY3VyZUNvbm5lY3RgIG9uIHRoZSBjbGVhcnRleHQgc2lkZVxuICAgICAgICAgIC8vIG9mIHRoZSBzZWN1cmUgcGFpciwgdGhlIGByZWFkYWJsZWAgaGFuZGxlciBpcyBjbGVhcmVkXG4gICAgICAgICAgLy8gYW5kIG5vIGZ1cnRoZXIgaGFuZHNoYWtlIGhhbmRsaW5nIHdpbGwgaGFwcGVuLlxuICAgICAgICAgIHNlY3VyZVBhaXIuZW5jcnlwdGVkLm9uY2UoJ3JlYWRhYmxlJywgb25SZWFkYWJsZSk7XG5cbiAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGRhdGEgb2YgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgIC8vIFdlIGZlZWQgdGhlIHNlcnZlcidzIGhhbmRzaGFrZSByZXNwb25zZSBiYWNrIGludG8gdGhlXG4gICAgICAgICAgICAvLyBlbmNyeXB0ZWQgZW5kIG9mIHRoZSBzZWN1cmUgcGFpci5cbiAgICAgICAgICAgIHNlY3VyZVBhaXIuZW5jcnlwdGVkLndyaXRlKGRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkuY2F0Y2gob25FcnJvcik7XG4gICAgICB9O1xuXG4gICAgICBzZWN1cmVQYWlyLmNsZWFydGV4dC5vbmNlKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgc2VjdXJlUGFpci5jbGVhcnRleHQub25jZSgnc2VjdXJlQ29ubmVjdCcsIG9uU2VjdXJlQ29ubmVjdCk7XG4gICAgICBzZWN1cmVQYWlyLmVuY3J5cHRlZC5vbmNlKCdyZWFkYWJsZScsIG9uUmVhZGFibGUpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gVE9ETyBsaXN0ZW4gZm9yICdkcmFpbicgZXZlbnQgd2hlbiBzb2NrZXQud3JpdGUgcmV0dXJucyBmYWxzZS5cbiAgLy8gVE9ETyBpbXBsZW1lbnQgaW5jb21wbGV0ZSByZXF1ZXN0IGNhbmNlbGxhdGlvbiAoMi4yLjEuNilcbiAgc2VuZE1lc3NhZ2UocGFja2V0VHlwZTogbnVtYmVyLCBkYXRhPzogQnVmZmVyLCByZXNldENvbm5lY3Rpb24/OiBib29sZWFuKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKHsgdHlwZTogcGFja2V0VHlwZSwgcmVzZXRDb25uZWN0aW9uOiByZXNldENvbm5lY3Rpb24gfSk7XG4gICAgbWVzc2FnZS5lbmQoZGF0YSk7XG4gICAgdGhpcy5vdXRnb2luZ01lc3NhZ2VTdHJlYW0ud3JpdGUobWVzc2FnZSk7XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH1cblxuICAvKipcbiAgICogUmVhZCB0aGUgbmV4dCBpbmNvbWluZyBtZXNzYWdlIGZyb20gdGhlIHNvY2tldC5cbiAgICovXG4gIGFzeW5jIHJlYWRNZXNzYWdlKCk6IFByb21pc2U8TWVzc2FnZT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuaW5jb21pbmdNZXNzYWdlSXRlcmF0b3IubmV4dCgpO1xuXG4gICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuZXhwZWN0ZWQgZW5kIG9mIG1lc3NhZ2Ugc3RyZWFtJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBNZXNzYWdlSU87XG5tb2R1bGUuZXhwb3J0cyA9IE1lc3NhZ2VJTztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsSUFBQUEsaUJBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUdBLElBQUFDLEdBQUEsR0FBQUMsdUJBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLElBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLE9BQUEsR0FBQUosT0FBQTtBQUlBLElBQUFLLFFBQUEsR0FBQU4sc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFNLE9BQUEsR0FBQU4sT0FBQTtBQUVBLElBQUFPLHNCQUFBLEdBQUFSLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBUSxzQkFBQSxHQUFBVCxzQkFBQSxDQUFBQyxPQUFBO0FBQThELFNBQUFFLHdCQUFBTyxDQUFBLEVBQUFDLENBQUEsNkJBQUFDLE9BQUEsTUFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBVCx1QkFBQSxZQUFBQSxDQUFBTyxDQUFBLEVBQUFDLENBQUEsU0FBQUEsQ0FBQSxJQUFBRCxDQUFBLElBQUFBLENBQUEsQ0FBQUssVUFBQSxTQUFBTCxDQUFBLE1BQUFNLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLEtBQUFDLFNBQUEsUUFBQUMsT0FBQSxFQUFBVixDQUFBLGlCQUFBQSxDQUFBLHVCQUFBQSxDQUFBLHlCQUFBQSxDQUFBLFNBQUFRLENBQUEsTUFBQUYsQ0FBQSxHQUFBTCxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxRQUFBRyxDQUFBLENBQUFLLEdBQUEsQ0FBQVgsQ0FBQSxVQUFBTSxDQUFBLENBQUFNLEdBQUEsQ0FB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
170
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbmF0aXZlRHVwbGV4cGFpciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwidGxzIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfbmV0IiwiX2V2ZW50cyIsIl9tZXNzYWdlIiwiX3BhY2tldCIsIl9pbmNvbWluZ01lc3NhZ2VTdHJlYW0iLCJfb3V0Z29pbmdNZXNzYWdlU3RyZWFtIiwiZSIsInQiLCJXZWFrTWFwIiwiciIsIm4iLCJfX2VzTW9kdWxlIiwibyIsImkiLCJmIiwiX19wcm90b19fIiwiZGVmYXVsdCIsImhhcyIsImdldCIsInNldCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiTWVzc2FnZUlPIiwiRXZlbnRFbWl0dGVyIiwiTUFYX1RMU19TRU5EX0ZSQUdNRU5UX1NJWkUiLCJjb25zdHJ1Y3RvciIsInNvY2tldCIsInBhY2tldFNpemUiLCJkZWJ1ZyIsInRsc05lZ290aWF0aW9uQ29tcGxldGUiLCJpbmNvbWluZ01lc3NhZ2VTdHJlYW0iLCJJbmNvbWluZ01lc3NhZ2VTdHJlYW0iLCJpbmNvbWluZ01lc3NhZ2VJdGVyYXRvciIsIlN5bWJvbCIsImFzeW5jSXRlcmF0b3IiLCJvdXRnb2luZ01lc3NhZ2VTdHJlYW0iLCJPdXRnb2luZ01lc3NhZ2VTdHJlYW0iLCJwaXBlIiwiYXJncyIsImxlbmd0aCIsImxvZyIsIm1heFNlbmRGcmFnbWVudCIsIk1hdGgiLCJtaW4iLCJzZWN1cmVQYWlyIiwiY2xlYXJ0ZXh0Iiwic2V0TWF4U2VuZEZyYWdtZW50IiwiVExTU29ja2V0Iiwic3RhcnRUbHMiLCJjcmVkZW50aWFsc0RldGFpbHMiLCJob3N0bmFtZSIsInRydXN0U2VydmVyQ2VydGlmaWNhdGUiLCJtYXhWZXJzaW9uIiwiaW5jbHVkZXMiLCJzZWN1cmVDb250ZXh0IiwiY3JlYXRlU2VjdXJlQ29udGV4dCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZHVwbGV4cGFpciIsIkR1cGxleFBhaXIiLCJjb25uZWN0Iiwic29ja2V0MSIsImhvc3QiLCJzZXJ2ZXJuYW1lIiwiaXNJUCIsInJlamVjdFVuYXV0aG9yaXplZCIsImVuY3J5cHRlZCIsInNvY2tldDIiLCJvblNlY3VyZUNvbm5lY3QiLCJyZW1vdmVMaXN0ZW5lciIsIm9uUmVhZGFibGUiLCJvbkVycm9yIiwib25jZSIsImVyciIsImRlc3Ryb3kiLCJjaXBoZXIiLCJnZXRDaXBoZXIiLCJuYW1lIiwidmVyc2lvbiIsImVtaXQiLCJ1bnBpcGUiLCJtZXNzYWdlIiwiTWVzc2FnZSIsInR5cGUiLCJUWVBFIiwiUFJFTE9HSU4iLCJyZXNldENvbm5lY3Rpb24iLCJjaHVuayIsInJlYWQiLCJ3cml0ZSIsImVuZCIsInJlYWRNZXNzYWdlIiwidGhlbiIsInJlc3BvbnNlIiwiZGF0YSIsImNhdGNoIiwic2VuZE1lc3NhZ2UiLCJwYWNrZXRUeXBlIiwicmVzdWx0IiwibmV4dCIsImRvbmUiLCJFcnJvciIsInZhbHVlIiwiX2RlZmF1bHQiLCJleHBvcnRzIiwibW9kdWxlIl0sInNvdXJjZXMiOlsiLi4vc3JjL21lc3NhZ2UtaW8udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IER1cGxleFBhaXIgZnJvbSAnbmF0aXZlLWR1cGxleHBhaXInO1xuXG5pbXBvcnQgeyBEdXBsZXggfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0ICogYXMgdGxzIGZyb20gJ3Rscyc7XG5pbXBvcnQgeyBpc0lQLCBTb2NrZXQgfSBmcm9tICduZXQnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcblxuaW1wb3J0IERlYnVnIGZyb20gJy4vZGVidWcnO1xuXG5pbXBvcnQgTWVzc2FnZSBmcm9tICcuL21lc3NhZ2UnO1xuaW1wb3J0IHsgVFlQRSB9IGZyb20gJy4vcGFja2V0JztcblxuaW1wb3J0IEluY29taW5nTWVzc2FnZVN0cmVhbSBmcm9tICcuL2luY29taW5nLW1lc3NhZ2Utc3RyZWFtJztcbmltcG9ydCBPdXRnb2luZ01lc3NhZ2VTdHJlYW0gZnJvbSAnLi9vdXRnb2luZy1tZXNzYWdlLXN0cmVhbSc7XG5cbmNsYXNzIE1lc3NhZ2VJTyBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIC8vIE5vZGUncyBgdGxzLlRMU1NvY2tldCNzZXRNYXhTZW5kRnJhZ21lbnRgIHNpbGVudGx5IGlnbm9yZXMgdmFsdWVzIG91dHNpZGUgdGhpcyByYW5nZS5cbiAgLy8gKEEgc3RhdGljIGNsYXNzIHByb3BlcnR5IHJhdGhlciB0aGFuIGEgbmFtZWQgZXhwb3J0LCBhcyB0aGUgYG1vZHVsZS5leHBvcnRzYFxuICAvLyBhc3NpZ25tZW50IGF0IHRoZSBib3R0b20gb2YgdGhpcyBmaWxlIHdvdWxkIGNsb2JiZXIgbmFtZWQgZXhwb3J0cyBmb3IgQ0pTIGNvbnN1bWVycy4pXG4gIHN0YXRpYyByZWFkb25seSBNQVhfVExTX1NFTkRfRlJBR01FTlRfU0laRSA9IDE2Mzg0O1xuXG4gIGRlY2xhcmUgc29ja2V0OiBTb2NrZXQ7XG4gIGRlY2xhcmUgZGVidWc6IERlYnVnO1xuXG4gIGRlY2xhcmUgdGxzTmVnb3RpYXRpb25Db21wbGV0ZTogYm9vbGVhbjtcblxuICBkZWNsYXJlIHByaXZhdGUgaW5jb21pbmdNZXNzYWdlU3RyZWFtOiBJbmNvbWluZ01lc3NhZ2VTdHJlYW07XG4gIGRlY2xhcmUgb3V0Z29pbmdNZXNzYWdlU3RyZWFtOiBPdXRnb2luZ01lc3NhZ2VTdHJlYW07XG5cbiAgZGVjbGFyZSBzZWN1cmVQYWlyPzoge1xuICAgIGNsZWFydGV4dDogdGxzLlRMU1NvY2tldDtcbiAgICBlbmNyeXB0ZWQ6IER1cGxleDtcbiAgfTtcblxuICBkZWNsYXJlIGluY29taW5nTWVzc2FnZUl0ZXJhdG9yOiBBc3luY0l0ZXJhYmxlSXRlcmF0b3I8TWVzc2FnZT47XG5cbiAgY29uc3RydWN0b3Ioc29ja2V0OiBTb2NrZXQsIHBhY2tldFNpemU6IG51bWJlciwgZGVidWc6IERlYnVnKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuc29ja2V0ID0gc29ja2V0O1xuICAgIHRoaXMuZGVidWcgPSBkZWJ1ZztcblxuICAgIHRoaXMudGxzTmVnb3RpYXRpb25Db21wbGV0ZSA9IGZhbHNlO1xuXG4gICAgdGhpcy5pbmNvbWluZ01lc3NhZ2VTdHJlYW0gPSBuZXcgSW5jb21pbmdNZXNzYWdlU3RyZWFtKHRoaXMuZGVidWcpO1xuICAgIHRoaXMuaW5jb21pbmdNZXNzYWdlSXRlcmF0b3IgPSB0aGlzLmluY29taW5nTWVzc2FnZVN0cmVhbVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcblxuICAgIHRoaXMub3V0Z29pbmdNZXNzYWdlU3RyZWFtID0gbmV3IE91dGdvaW5nTWVzc2FnZVN0cmVhbSh0aGlzLmRlYnVnLCB7IHBhY2tldFNpemU6IHBhY2tldFNpemUgfSk7XG5cbiAgICB0aGlzLnNvY2tldC5waXBlKHRoaXMuaW5jb21pbmdNZXNzYWdlU3RyZWFtKTtcbiAgICB0aGlzLm91dGdvaW5nTWVzc2FnZVN0cmVhbS5waXBlKHRoaXMuc29ja2V0KTtcbiAgfVxuXG4gIHBhY2tldFNpemUoLi4uYXJnczogW251bWJlcl0pIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBwYWNrZXRTaXplID0gYXJnc1swXTtcbiAgICAgIHRoaXMuZGVidWcubG9nKCdQYWNrZXQgc2l6ZSBjaGFuZ2VkIGZyb20gJyArIHRoaXMub3V0Z29pbmdNZXNzYWdlU3RyZWFtLnBhY2tldFNpemUgKyAnIHRvICcgKyBwYWNrZXRTaXplKTtcbiAgICAgIHRoaXMub3V0Z29pbmdNZXNzYWdlU3RyZWFtLnBhY2tldFNpemUgPSBwYWNrZXRTaXplO1xuICAgIH1cblxuICAgIGNvbnN0IG1heFNlbmRGcmFnbWVudCA9IE1hdGgubWluKHRoaXMub3V0Z29pbmdNZXNzYWdlU3RyZWFtLnBhY2tldFNpemUsIE1lc3NhZ2VJTy5NQVhfVExTX1NFTkRfRlJBR01FTlRfU0laRSk7XG5cbiAgICBpZiAodGhpcy5zZWN1cmVQYWlyKSB7XG4gICAgICAvLyBDbGFzc2ljIGBlbmNyeXB0OiB0cnVlYCBwYXRoOiBUTFMgaXMgbGF5ZXJlZCBvdmVyIGEgYER1cGxleFBhaXJgLlxuICAgICAgdGhpcy5zZWN1cmVQYWlyLmNsZWFydGV4dC5zZXRNYXhTZW5kRnJhZ21lbnQobWF4U2VuZEZyYWdtZW50KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc29ja2V0IGluc3RhbmNlb2YgdGxzLlRMU1NvY2tldCkge1xuICAgICAgLy8gYGVuY3J5cHQ6IFwic3RyaWN0XCJgIChURFMgOC4wKSBwYXRoOiB0aGUgc29ja2V0IGl0c2VsZiBpcyB0aGUgVExTIHNvY2tldC4gV2l0aG91dFxuICAgICAgLy8gdGhpcywgYSBzZXJ2ZXItaW5pdGlhdGVkIHBhY2tldCBzaXplIGNoYW5nZSAoRU5WQ0hBTkdFKSBhZnRlciBsb2dpbiB3b3VsZCBsZWF2ZVxuICAgICAgLy8gdGhlIG9yaWdpbmFsIGNhcCBpbiBwbGFjZSwgcG90ZW50aWFsbHkgYWxsb3dpbmcgb3ZlcnNpemVkIFRMUyByZWNvcmRzIGFnYWluLlxuICAgICAgdGhpcy5zb2NrZXQuc2V0TWF4U2VuZEZyYWdtZW50KG1heFNlbmRGcmFnbWVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMub3V0Z29pbmdNZXNzYWdlU3RyZWFtLnBhY2tldFNpemU7XG4gIH1cblxuICAvLyBOZWdvdGlhdGUgVExTIGVuY3J5cHRpb24uXG4gIHN0YXJ0VGxzKGNyZWRlbnRpYWxzRGV0YWlsczogdGxzLlNlY3VyZUNvbnRleHRPcHRpb25zLCBob3N0bmFtZTogc3RyaW5nLCB0cnVzdFNlcnZlckNlcnRpZmljYXRlOiBib29sZWFuKSB7XG4gICAgaWYgKCFjcmVkZW50aWFsc0RldGFpbHMubWF4VmVyc2lvbiB8fCAhWydUTFN2MS4yJywgJ1RMU3YxLjEnLCAnVExTdjEnXS5pbmNsdWRlcyhjcmVkZW50aWFsc0RldGFpbHMubWF4VmVyc2lvbikpIHtcbiAgICAgIGNyZWRlbnRpYWxzRGV0YWlscy5tYXhWZXJzaW9uID0gJ1RMU3YxLjInO1xuICAgIH1cblxuICAgIGNvbnN0IHNlY3VyZUNvbnRleHQgPSB0bHMuY3JlYXRlU2VjdXJlQ29udGV4dChjcmVkZW50aWFsc0RldGFpbHMpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGR1cGxleHBhaXIgPSBuZXcgRHVwbGV4UGFpcigpO1xuICAgICAgY29uc3Qgc2VjdXJlUGFpciA9IHRoaXMuc2VjdXJlUGFpciA9IHtcbiAgICAgICAgY2xlYXJ0ZXh0OiB0bHMuY29ubmVjdCh7XG4gICAgICAgICAgc29ja2V0OiBkdXBsZXhwYWlyLnNvY2tldDEgYXMgU29ja2V0LFxuICAgICAgICAgIC8vIFRoZSBgaG9zdGAgaXMgdXNlZCB0byB2ZXJpZnkgdGhlIHNlcnZlcidzIGNlcnRpZmljYXRlIGlkZW50aXR5LlxuICAgICAgICAgIC8vIEl0IGlzIG5vdCB1c2VkIHRvIGVzdGFibGlzaCBhIGNvbm5lY3Rpb24gYXMgYSBgc29ja2V0YCBpc1xuICAgICAgICAgIC8vIHNwZWNpZmllZC5cbiAgICAgICAgICBob3N0OiBob3N0bmFtZSxcbiAgICAgICAgICAvLyBSRkMgNjA2NiBkb2VzIG5vdCBhbGxvdyBJUCBhZGRyZXNzZXMgdG8gYmUgdXNlZCBhcyB0aGUgc2VydmVyXG4gICAgICAgICAgLy8gbmFtZSwgc28gb21pdCB0aGUgU05JIGV4dGVuc2lvbiBpbiB0aGF0IGNhc2UuXG4gICAgICAgICAgc2VydmVybmFtZTogaXNJUChob3N0bmFtZSkgPyAnJyA6IGhvc3RuYW1lLFxuICAgICAgICAgIHNlY3VyZUNvbnRleHQ6IHNlY3VyZUNvbnRleHQsXG4gICAgICAgICAgcmVqZWN0VW5hdXRob3JpemVkOiAhdHJ1c3RTZXJ2ZXJDZXJ0aWZpY2F0ZVxuICAgICAgICB9KSxcbiAgICAgICAgZW5jcnlwdGVkOiBkdXBsZXhwYWlyLnNvY2tldDJcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG9uU2VjdXJlQ29ubmVjdCA9ICgpID0+IHtcbiAgICAgICAgc2VjdXJlUGFpci5lbmNyeXB0ZWQucmVtb3ZlTGlzdGVuZXIoJ3JlYWRhYmxlJywgb25SZWFkYWJsZSk7XG4gICAgICAgIHNlY3VyZVBhaXIuY2xlYXJ0ZXh0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICBzZWN1cmVQYWlyLmNsZWFydGV4dC5yZW1vdmVMaXN0ZW5lcignc2VjdXJlQ29ubmVjdCcsIG9uU2VjdXJlQ29ubmVjdCk7XG5cbiAgICAgICAgLy8gSWYgd2UgZW5jb3VudGVyIGFueSBlcnJvcnMgZnJvbSB0aGlzIHBvaW50IG9uLFxuICAgICAgICAvLyB3ZSBqdXN0IGZvcndhcmQgdGhlbSB0byB0aGUgYWN0dWFsIG5ldHdvcmsgc29ja2V0LlxuICAgICAgICBzZWN1cmVQYWlyLmNsZWFydGV4dC5vbmNlKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgICAgICB0aGlzLnNvY2tldC5kZXN0cm95KGVycik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGNpcGhlciA9IHNlY3VyZVBhaXIuY2xlYXJ0ZXh0LmdldENpcGhlcigpO1xuICAgICAgICBpZiAoY2lwaGVyKSB7XG4gICAgICAgICAgdGhpcy5kZWJ1Zy5sb2coJ1RMUyBuZWdvdGlhdGVkICgnICsgY2lwaGVyLm5hbWUgKyAnLCAnICsgY2lwaGVyLnZlcnNpb24gKyAnKScpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbWl0KCdzZWN1cmUnLCBzZWN1cmVQYWlyLmNsZWFydGV4dCk7XG5cbiAgICAgICAgc2VjdXJlUGFpci5jbGVhcnRleHQuc2V0TWF4U2VuZEZyYWdtZW50KE1hdGgubWluKHRoaXMub3V0Z29pbmdNZXNzYWdlU3RyZWFtLnBhY2tldFNpemUsIE1lc3NhZ2VJTy5NQVhfVExTX1NFTkRfRlJBR01FTlRfU0laRSkpO1xuXG4gICAgICAgIHRoaXMub3V0Z29pbmdNZXNzYWdlU3RyZWFtLnVucGlwZSh0aGlzLnNvY2tldCk7XG4gICAgICAgIHRoaXMuc29ja2V0LnVucGlwZSh0aGlzLmluY29taW5nTWVzc2FnZVN0cmVhbSk7XG5cbiAgICAgICAgdGhpcy5zb2NrZXQucGlwZShzZWN1cmVQYWlyLmVuY3J5cHRlZCk7XG4gICAgICAgIHNlY3VyZVBhaXIuZW5jcnlwdGVkLnBpcGUodGhpcy5zb2NrZXQpO1xuXG4gICAgICAgIHNlY3VyZVBhaXIuY2xlYXJ0ZXh0LnBpcGUodGhpcy5pbmNvbWluZ01lc3NhZ2VTdHJlYW0pO1xuICAgICAgICB0aGlzLm91dGdvaW5nTWVzc2FnZVN0cmVhbS5waXBlKHNlY3VyZVBhaXIuY2xlYXJ0ZXh0KTtcblxuICAgICAgICB0aGlzLnRsc05lZ290aWF0aW9uQ29tcGxldGUgPSB0cnVlO1xuXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG9uRXJyb3IgPSAoZXJyPzogRXJyb3IpID0+IHtcbiAgICAgICAgc2VjdXJlUGFpci5lbmNyeXB0ZWQucmVtb3ZlTGlzdGVuZXIoJ3JlYWRhYmxlJywgb25SZWFkYWJsZSk7XG4gICAgICAgIHNlY3VyZVBhaXIuY2xlYXJ0ZXh0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICBzZWN1cmVQYWlyLmNsZWFydGV4dC5yZW1vdmVMaXN0ZW5lcignc2VjdXJlQ29ubmVjdCcsIG9uU2VjdXJlQ29ubmVjdCk7XG5cbiAgICAgICAgc2VjdXJlUGFpci5jbGVhcnRleHQuZGVzdHJveSgpO1xuICAgICAgICBzZWN1cmVQYWlyLmVuY3J5cHRlZC5kZXN0cm95KCk7XG5cbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvblJlYWRhYmxlID0gKCkgPT4ge1xuICAgICAgICAvLyBXaGVuIHRoZXJlIGlzIGhhbmRzaGFrZSBkYXRhIG9uIHRoZSBlbmNyeXB0ZWQgc3RyZWFtIG9mIHRoZSBzZWN1cmUgcGFpcixcbiAgICAgICAgLy8gd2Ugd3JhcCBpdCBpbnRvIGEgYFBSRUxPR0lOYCBtZXNzYWdlIGFuZCBzZW5kIGl0IHRvIHRoZSBzZXJ2ZXIuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEZvciBlYWNoIGBQUkVMT0dJTmAgbWVzc2FnZSB3ZSBzZW50IHdlIGdldCBiYWNrIGV4YWN0bHkgb25lIHJlc3BvbnNlIG1lc3NhZ2VcbiAgICAgICAgLy8gdGhhdCBjb250YWlucyB0aGUgc2VydmVyJ3MgaGFuZHNoYWtlIHJlc3BvbnNlIGRhdGEuXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBuZXcgTWVzc2FnZSh7IHR5cGU6IFRZUEUuUFJFTE9HSU4sIHJlc2V0Q29ubmVjdGlvbjogZmFsc2UgfSk7XG5cbiAgICAgICAgbGV0IGNodW5rO1xuICAgICAgICB3aGlsZSAoY2h1bmsgPSBzZWN1cmVQYWlyLmVuY3J5cHRlZC5yZWFkKCkpIHtcbiAgICAgICAgICBtZXNzYWdlLndyaXRlKGNodW5rKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm91dGdvaW5nTWVzc2FnZVN0cmVhbS53cml0ZShtZXNzYWdlKTtcbiAgICAgICAgbWVzc2FnZS5lbmQoKTtcblxuICAgICAgICB0aGlzLnJlYWRNZXNzYWdlKCkudGhlbihhc3luYyAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAvLyBTZXR1cCByZWFkYWJsZSBoYW5kbGVyIGZvciB0aGUgbmV4dCByb3VuZCBvZiBoYW5kc2hha2luZy5cbiAgICAgICAgICAvLyBJZiB3ZSBlbmNvdW50ZXIgYSBgc2VjdXJlQ29ubmVjdGAgb24gdGhlIGNsZWFydGV4dCBzaWRlXG4gICAgICAgICAgLy8gb2YgdGhlIHNlY3VyZSBwYWlyLCB0aGUgYHJlYWRhYmxlYCBoYW5kbGVyIGlzIGNsZWFyZWRcbiAgICAgICAgICAvLyBhbmQgbm8gZnVydGhlciBoYW5kc2hha2UgaGFuZGxpbmcgd2lsbCBoYXBwZW4uXG4gICAgICAgICAgc2VjdXJlUGFpci5lbmNyeXB0ZWQub25jZSgncmVhZGFibGUnLCBvblJlYWRhYmxlKTtcblxuICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgZGF0YSBvZiByZXNwb25zZSkge1xuICAgICAgICAgICAgLy8gV2UgZmVlZCB0aGUgc2VydmVyJ3MgaGFuZHNoYWtlIHJlc3BvbnNlIGJhY2sgaW50byB0aGVcbiAgICAgICAgICAgIC8vIGVuY3J5cHRlZCBlbmQgb2YgdGhlIHNlY3VyZSBwYWlyLlxuICAgICAgICAgICAgc2VjdXJlUGFpci5lbmNyeXB0ZWQud3JpdGUoZGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KS5jYXRjaChvbkVycm9yKTtcbiAgICAgIH07XG5cbiAgICAgIHNlY3VyZVBhaXIuY2xlYXJ0ZXh0Lm9uY2UoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICBzZWN1cmVQYWlyLmNsZWFydGV4dC5vbmNlKCdzZWN1cmVDb25uZWN0Jywgb25TZWN1cmVDb25uZWN0KTtcbiAgICAgIHNlY3VyZVBhaXIuZW5jcnlwdGVkLm9uY2UoJ3JlYWRhYmxlJywgb25SZWFkYWJsZSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBUT0RPIGxpc3RlbiBmb3IgJ2RyYWluJyBldmVudCB3aGVuIHNvY2tldC53cml0ZSByZXR1cm5zIGZhbHNlLlxuICAvLyBUT0RPIGltcGxlbWVudCBpbmNvbXBsZXRlIHJlcXVlc3QgY2FuY2VsbGF0aW9uICgyLjIuMS42KVxuICBzZW5kTWVzc2FnZShwYWNrZXRUeXBlOiBudW1iZXIsIGRhdGE/OiBCdWZmZXIsIHJlc2V0Q29ubmVjdGlvbj86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoeyB0eXBlOiBwYWNrZXRUeXBlLCByZXNldENvbm5lY3Rpb246IHJlc2V0Q29ubmVjdGlvbiB9KTtcbiAgICBtZXNzYWdlLmVuZChkYXRhKTtcbiAgICB0aGlzLm91dGdvaW5nTWVzc2FnZVN0cmVhbS53cml0ZShtZXNzYWdlKTtcbiAgICByZXR1cm4gbWVzc2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIHRoZSBuZXh0IGluY29taW5nIG1lc3NhZ2UgZnJvbSB0aGUgc29ja2V0LlxuICAgKi9cbiAgYXN5bmMgcmVhZE1lc3NhZ2UoKTogUHJvbWlzZTxNZXNzYWdlPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5pbmNvbWluZ01lc3NhZ2VJdGVyYXRvci5uZXh0KCk7XG5cbiAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5leHBlY3RlZCBlbmQgb2YgbWVzc2FnZSBzdHJlYW0nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE1lc3NhZ2VJTztcbm1vZHVsZS5leHBvcnRzID0gTWVzc2FnZUlPO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxpQkFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBR0EsSUFBQUMsR0FBQSxHQUFBQyx1QkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsSUFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksT0FBQSxHQUFBSixPQUFBO0FBSUEsSUFBQUssUUFBQSxHQUFBTixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQU0sT0FBQSxHQUFBTixPQUFBO0FBRUEsSUFBQU8sc0JBQUEsR0FBQVIsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFRLHNCQUFBLEdBQUFULHNCQUFBLENBQUFDLE9BQUE7QUFBOEQsU0FBQUUsd0JBQUFPLENBQUEsRUFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxNQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFULHVCQUFBLFlBQUFBLENBQUFPLENBQUEsRUFBQUMsQ0FBQSxTQUFBQSxDQUFBLElBQUFELENBQUEsSUFBQUEsQ0FBQSxDQUFBSyxVQUFBLFNBQUFMLENBQUEsTUFBQU0sQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEsS0FBQUMsU0FBQSxRQUFBQyxPQUFBLEVBQUFWLENBQUEsaUJBQUFBLENBQUEsdUJBQUFBLENBQUEseUJBQUFBLENBQUEsU0FBQVEsQ0FBQSxNQUFBRixDQUFBLEdBQUFMLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLFFBQUFHLENBQUEsQ0FBQUssR0FBQSxDQUFBWCxDQUFBLFVBQUFNLENBQUEsQ0FBQU0sR0FBQSxDQUFBWixDQUFBLEdBQUFNLENBQUEsQ0FBQU8sR0FBQSxDQUFBYixDQUFBLEVBQUFRLENBQUEsZ0JBQUFQLENBQUEsSUFBQUQsQ0FBQSxnQkFBQUMsQ0FBQSxPQUFBYSxjQUFBLENBQUFDLElBQUEsQ0FBQWYsQ0FBQSxFQUFBQyxDQUFBLE9BQUFNLENBQUEsSUFBQUQsQ0FBQSxHQUFBVSxNQUFBLENBQUFDLGNBQUEsS0FBQUQsTUFBQSxDQUFBRSx3QkFBQSxDQUFBbEIsQ0FBQSxFQUFBQyxDQUFBLE9BQUFNLENBQUEsQ0FBQUssR0FBQSxJQUFBTCxDQUFBLENBQUFNLEdBQUEsSUFBQVAsQ0FBQSxDQUFBRSxDQUFBLEVBQUFQLENBQUEsRUFBQU0sQ0FBQSxJQUFBQyxDQUFBLENBQUFQLENBQUEsSUFBQUQsQ0FBQSxDQUFBQyxDQUFBLFdBQUFPLENBQUEsS0FBQVIsQ0FBQSxFQUFBQyxDQUFBO0FBQUEsU0FBQVgsdUJBQUFVLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFLLFVBQUEsR0FBQUwsQ0FBQSxLQUFBVSxPQUFBLEVBQUFWLENBQUE7QUFFOUQsTUFBTW1CLFNBQVMsU0FBU0Msb0JBQVksQ0FBQztFQUNuQztFQUNBO0VBQ0E7RUFDQSxPQUFnQkMsMEJBQTBCLEdBQUcsS0FBSztFQWlCbERDLFdBQVdBLENBQUNDLE1BQWMsRUFBRUMsVUFBa0IsRUFBRUMsS0FBWSxFQUFFO0lBQzVELEtBQUssQ0FBQyxDQUFDO0lBRVAsSUFBSSxDQUFDRixNQUFNLEdBQUdBLE1BQU07SUFDcEIsSUFBSSxDQUFDRSxLQUFLLEdBQUdBLEtBQUs7SUFFbEIsSUFBSSxDQUFDQyxzQkFBc0IsR0FBRyxLQUFLO0lBRW5DLElBQUksQ0FBQ0MscUJBQXFCLEdBQUcsSUFBSUMsOEJBQXFCLENBQUMsSUFBSSxDQUFDSCxLQUFLLENBQUM7SUFDbEUsSUFBSSxDQUFDSSx1QkFBdUIsR0FBRyxJQUFJLENBQUNGLHFCQUFxQixDQUFDRyxNQUFNLENBQUNDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFakYsSUFBSSxDQUFDQyxxQkFBcUIsR0FBRyxJQUFJQyw4QkFBcUIsQ0FBQyxJQUFJLENBQUNSLEtBQUssRUFBRTtNQUFFRCxVQUFVLEVBQUVBO0lBQVcsQ0FBQyxDQUFDO0lBRTlGLElBQUksQ0FBQ0QsTUFBTSxDQUFDVyxJQUFJLENBQUMsSUFBSSxDQUFDUCxxQkFBcUIsQ0FBQztJQUM1QyxJQUFJLENBQUNLLHFCQUFxQixDQUFDRSxJQUFJLENBQUMsSUFBSSxDQUFDWCxNQUFNLENBQUM7RUFDOUM7RUFFQUMsVUFBVUEsQ0FBQyxHQUFHVyxJQUFjLEVBQUU7SUFDNUIsSUFBSUEsSUFBSSxDQUFDQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO01BQ25CLE1BQU1aLFVBQVUsR0FBR1csSUFBSSxDQUFDLENBQUMsQ0FBQztNQUMxQixJQUFJLENBQUNWLEtBQUssQ0FBQ1ksR0FBRyxDQUFDLDJCQUEyQixHQUFHLElBQUksQ0FBQ0wscUJBQXFCLENBQUNSLFVBQVUsR0FBRyxNQUFNLEdBQUdBLFVBQVUsQ0FBQztNQUN6RyxJQUFJLENBQUNRLHFCQUFxQixDQUFDUixVQUFVLEdBQUdBLFVBQVU7SUFDcEQ7SUFFQSxNQUFNYyxlQUFlLEdBQUdDLElBQUksQ0FBQ0MsR0FBRyxDQUFDLElBQUksQ0FBQ1IscUJBQXFCLENBQUNSLFVBQVUsRUFBRUwsU0FBUyxDQUFDRSwwQkFBMEIsQ0FBQztJQUU3RyxJQUFJLElBQUksQ0FBQ29CLFVBQVUsRUFBRTtNQUNuQjtNQUNBLElBQUksQ0FBQ0EsVUFBVSxDQUFDQyxTQUFTLENBQUNDLGtCQUFrQixDQUFDTCxlQUFlLENBQUM7SUFDL0QsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDZixNQUFNLFlBQVkvQixHQUFHLENBQUNvRCxTQUFTLEVBQUU7TUFDL0M7TUFDQTtNQUNBO01BQ0EsSUFBSSxDQUFDckIsTUFBTSxDQUFDb0Isa0JBQWtCLENBQUNMLGVBQWUsQ0FBQztJQUNqRDtJQUVBLE9BQU8sSUFBSSxDQUFDTixxQkFBcUIsQ0FBQ1IsVUFBVTtFQUM5Qzs7RUFFQTtFQUNBcUIsUUFBUUEsQ0FBQ0Msa0JBQTRDLEVBQUVDLFFBQWdCLEVBQUVDLHNCQUErQixFQUFFO0lBQ3hHLElBQUksQ0FBQ0Ysa0JBQWtCLENBQUNHLFVBQVUsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQ0MsUUFBUSxDQUFDSixrQkFBa0IsQ0FBQ0csVUFBVSxDQUFDLEVBQUU7TUFDOUdILGtCQUFrQixDQUFDRyxVQUFVLEdBQUcsU0FBUztJQUMzQztJQUVBLE1BQU1FLGFBQWEsR0FBRzNELEdBQUcsQ0FBQzRELG1CQUFtQixDQUFDTixrQkFBa0IsQ0FBQztJQUVqRSxPQUFPLElBQUlPLE9BQU8sQ0FBTyxDQUFDQyxPQUFPLEVBQUVDLE1BQU0sS0FBSztNQUM1QyxNQUFNQyxVQUFVLEdBQUcsSUFBSUMseUJBQVUsQ0FBQyxDQUFDO01BQ25DLE1BQU1oQixVQUFVLEdBQUcsSUFBSSxDQUFDQSxVQUFVLEdBQUc7UUFDbkNDLFNBQVMsRUFBRWxELEdBQUcsQ0FBQ2tFLE9BQU8sQ0FBQztVQUNyQm5DLE1BQU0sRUFBRWlDLFVBQVUsQ0FBQ0csT0FBaUI7VUFDcEM7VUFDQTtVQUNBO1VBQ0FDLElBQUksRUFBRWIsUUFBUTtVQUNkO1VBQ0E7VUFDQWMsVUFBVSxFQUFFLElBQUFDLFNBQUksRUFBQ2YsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHQSxRQUFRO1VBQzFDSSxhQUFhLEVBQUVBLGFBQWE7VUFDNUJZLGtCQUFrQixFQUFFLENBQUNmO1FBQ3ZCLENBQUMsQ0FBQztRQUNGZ0IsU0FBUyxFQUFFUixVQUFVLENBQUNTO01BQ3hCLENBQUM7TUFFRCxNQUFNQyxlQUFlLEdBQUdBLENBQUEsS0FBTTtRQUM1QnpCLFVBQVUsQ0FBQ3VCLFNBQVMsQ0FBQ0csY0FBYyxDQUFDLFVBQVUsRUFBRUMsVUFBVSxDQUFDO1FBQzNEM0IsVUFBVSxDQUFDQyxTQUFTLENBQUN5QixjQUFjLENBQUMsT0FBTyxFQUFFRSxPQUFPLENBQUM7UUFDckQ1QixVQUFVLENBQUNDLFNBQVMsQ0FBQ3lCLGNBQWMsQ0FBQyxlQUFlLEVBQUVELGVBQWUsQ0FBQzs7UUFFckU7UUFDQTtRQUNBekIsVUFBVSxDQUFDQyxTQUFTLENBQUM0QixJQUFJLENBQUMsT0FBTyxFQUFHQyxHQUFHLElBQUs7VUFDMUMsSUFBSSxDQUFDaEQsTUFBTSxDQUFDaUQsT0FBTyxDQUFDRCxHQUFHLENBQUM7UUFDMUIsQ0FBQyxDQUFDO1FBRUYsTUFBTUUsTUFBTSxHQUFHaEMsVUFBVSxDQUFDQyxTQUFTLENBQUNnQyxTQUFTLENBQUMsQ0FBQztRQUMvQyxJQUFJRCxNQUFNLEVBQUU7VUFDVixJQUFJLENBQUNoRCxLQUFLLENBQUNZLEdBQUcsQ0FBQyxrQkFBa0IsR0FBR29DLE1BQU0sQ0FBQ0UsSUFBSSxHQUFHLElBQUksR0FBR0YsTUFBTSxDQUFDRyxPQUFPLEdBQUcsR0FBRyxDQUFDO1FBQ2hGO1FBRUEsSUFBSSxDQUFDQyxJQUFJLENBQUMsUUFBUSxFQUFFcEMsVUFBVSxDQUFDQyxTQUFTLENBQUM7UUFFekNELFVBQVUsQ0FBQ0MsU0FBUyxDQUFDQyxrQkFBa0IsQ0FBQ0osSUFBSSxDQUFDQyxHQUFHLENBQUMsSUFBSSxDQUFDUixxQkFBcUIsQ0FBQ1IsVUFBVSxFQUFFTCxTQUFTLENBQUNFLDBCQUEwQixDQUFDLENBQUM7UUFFOUgsSUFBSSxDQUFDVyxxQkFBcUIsQ0FBQzhDLE1BQU0sQ0FBQyxJQUFJLENBQUN2RCxNQUFNLENBQUM7UUFDOUMsSUFBSSxDQUFDQSxNQUFNLENBQUN1RCxNQUFNLENBQUMsSUFBSSxDQUFDbkQscUJBQXFCLENBQUM7UUFFOUMsSUFBSSxDQUFDSixNQUFNLENBQUNXLElBQUksQ0FBQ08sVUFBVSxDQUFDdUIsU0FBUyxDQUFDO1FBQ3RDdkIsVUFBVSxDQUFDdUIsU0FBUyxDQUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQ1gsTUFBTSxDQUFDO1FBRXRDa0IsVUFBVSxDQUFDQyxTQUFTLENBQUNSLElBQUksQ0FBQyxJQUFJLENBQUNQLHFCQUFxQixDQUFDO1FBQ3JELElBQUksQ0FBQ0sscUJBQXFCLENBQUNFLElBQUksQ0FBQ08sVUFBVSxDQUFDQyxTQUFTLENBQUM7UUFFckQsSUFBSSxDQUFDaEIsc0JBQXNCLEdBQUcsSUFBSTtRQUVsQzRCLE9BQU8sQ0FBQyxDQUFDO01BQ1gsQ0FBQztNQUVELE1BQU1lLE9BQU8sR0FBSUUsR0FBVyxJQUFLO1FBQy9COUIsVUFBVSxDQUFDdUIsU0FBUyxDQUFDRyxjQUFjLENBQUMsVUFBVSxFQUFFQyxVQUFVLENBQUM7UUFDM0QzQixVQUFVLENBQUNDLFNBQVMsQ0FBQ3lCLGNBQWMsQ0FBQyxPQUFPLEVBQUVFLE9BQU8sQ0FBQztRQUNyRDVCLFVBQVUsQ0FBQ0MsU0FBUyxDQUFDeUIsY0FBYyxDQUFDLGVBQWUsRUFBRUQsZUFBZSxDQUFDO1FBRXJFekIsVUFBVSxDQUFDQyxTQUFTLENBQUM4QixPQUFPLENBQUMsQ0FBQztRQUM5Qi9CLFVBQVUsQ0FBQ3VCLFNBQVMsQ0FBQ1EsT0FBTyxDQUFDLENBQUM7UUFFOUJqQixNQUFNLENBQUNnQixHQUFHLENBQUM7TUFDYixDQUFDO01BRUQsTUFBTUgsVUFBVSxHQUFHQSxDQUFBLEtBQU07UUFDdkI7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLE1BQU1XLE9BQU8sR0FBRyxJQUFJQyxnQkFBTyxDQUFDO1VBQUVDLElBQUksRUFBRUMsWUFBSSxDQUFDQyxRQUFRO1VBQUVDLGVBQWUsRUFBRTtRQUFNLENBQUMsQ0FBQztRQUU1RSxJQUFJQyxLQUFLO1FBQ1QsT0FBT0EsS0FBSyxHQUFHNUMsVUFBVSxDQUFDdUIsU0FBUyxDQUFDc0IsSUFBSSxDQUFDLENBQUMsRUFBRTtVQUMxQ1AsT0FBTyxDQUFDUSxLQUFLLENBQUNGLEtBQUssQ0FBQztRQUN0QjtRQUNBLElBQUksQ0FBQ3JELHFCQUFxQixDQUFDdUQsS0FBSyxDQUFDUixPQUFPLENBQUM7UUFDekNBLE9BQU8sQ0FBQ1MsR0FBRyxDQUFDLENBQUM7UUFFYixJQUFJLENBQUNDLFdBQVcsQ0FBQyxDQUFDLENBQUNDLElBQUksQ0FBQyxNQUFPQyxRQUFRLElBQUs7VUFDMUM7VUFDQTtVQUNBO1VBQ0E7VUFDQWxELFVBQVUsQ0FBQ3VCLFNBQVMsQ0FBQ00sSUFBSSxDQUFDLFVBQVUsRUFBRUYsVUFBVSxDQUFDO1VBRWpELFdBQVcsTUFBTXdCLElBQUksSUFBSUQsUUFBUSxFQUFFO1lBQ2pDO1lBQ0E7WUFDQWxELFVBQVUsQ0FBQ3VCLFNBQVMsQ0FBQ3VCLEtBQUssQ0FBQ0ssSUFBSSxDQUFDO1VBQ2xDO1FBQ0YsQ0FBQyxDQUFDLENBQUNDLEtBQUssQ0FBQ3hCLE9BQU8sQ0FBQztNQUNuQixDQUFDO01BRUQ1QixVQUFVLENBQUNDLFNBQVMsQ0FBQzRCLElBQUksQ0FBQyxPQUFPLEVBQUVELE9BQU8sQ0FBQztNQUMzQzVCLFVBQVUsQ0FBQ0MsU0FBUyxDQUFDNEIsSUFBSSxDQUFDLGVBQWUsRUFBRUosZUFBZSxDQUFDO01BQzNEekIsVUFBVSxDQUFDdUIsU0FBUyxDQUFDTSxJQUFJLENBQUMsVUFBVSxFQUFFRixVQUFVLENBQUM7SUFDbkQsQ0FBQyxDQUFDO0VBQ0o7O0VBRUE7RUFDQTtFQUNBMEIsV0FBV0EsQ0FBQ0MsVUFBa0IsRUFBRUgsSUFBYSxFQUFFUixlQUF5QixFQUFFO0lBQ3hFLE1BQU1MLE9BQU8sR0FBRyxJQUFJQyxnQkFBTyxDQUFDO01BQUVDLElBQUksRUFBRWMsVUFBVTtNQUFFWCxlQUFlLEVBQUVBO0lBQWdCLENBQUMsQ0FBQztJQUNuRkwsT0FBTyxDQUFDUyxHQUFHLENBQUNJLElBQUksQ0FBQztJQUNqQixJQUFJLENBQUM1RCxxQkFBcUIsQ0FBQ3VELEtBQUssQ0FBQ1IsT0FBTyxDQUFDO0lBQ3pDLE9BQU9BLE9BQU87RUFDaEI7O0VBRUE7QUFDRjtBQUNBO0VBQ0UsTUFBTVUsV0FBV0EsQ0FBQSxFQUFxQjtJQUNwQyxNQUFNTyxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUNuRSx1QkFBdUIsQ0FBQ29FLElBQUksQ0FBQyxDQUFDO0lBRXhELElBQUlELE1BQU0sQ0FBQ0UsSUFBSSxFQUFFO01BQ2YsTUFBTSxJQUFJQyxLQUFLLENBQUMsa0NBQWtDLENBQUM7SUFDckQ7SUFFQSxPQUFPSCxNQUFNLENBQUNJLEtBQUs7RUFDckI7QUFDRjtBQUFDLElBQUFDLFFBQUEsR0FBQUMsT0FBQSxDQUFBNUYsT0FBQSxHQUVjUyxTQUFTO0FBQ3hCb0YsTUFBTSxDQUFDRCxPQUFPLEdBQUduRixTQUFTIiwiaWdub3JlTGlzdCI6W119
@@ -1 +1 @@
1
- {"version":3,"file":"message-io.js","names":["_nativeDuplexpair","_interopRequireDefault","require","tls","_interopRequireWildcard","_net","_events","_message","_packet","_incomingMessageStream","_outgoingMessageStream","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","MessageIO","EventEmitter","constructor","socket","packetSize","debug","tlsNegotiationComplete","incomingMessageStream","IncomingMessageStream","incomingMessageIterator","Symbol","asyncIterator","outgoingMessageStream","OutgoingMessageStream","pipe","args","length","log","securePair","cleartext","setMaxSendFragment","startTls","credentialsDetails","hostname","trustServerCertificate","maxVersion","includes","secureContext","createSecureContext","Promise","resolve","reject","duplexpair","DuplexPair","connect","socket1","host","servername","isIP","rejectUnauthorized","encrypted","socket2","onSecureConnect","removeListener","onReadable","onError","once","err","destroy","cipher","getCipher","name","version","emit","unpipe","message","Message","type","TYPE","PRELOGIN","resetConnection","chunk","read","write","end","readMessage","then","response","data","catch","sendMessage","packetType","result","next","done","Error","value","_default","exports","module"],"sources":["../src/message-io.ts"],"sourcesContent":["import DuplexPair from 'native-duplexpair';\n\nimport { Duplex } from 'stream';\nimport * as tls from 'tls';\nimport { isIP, Socket } from 'net';\nimport { EventEmitter } from 'events';\n\nimport Debug from './debug';\n\nimport Message from './message';\nimport { TYPE } from './packet';\n\nimport IncomingMessageStream from './incoming-message-stream';\nimport OutgoingMessageStream from './outgoing-message-stream';\n\nclass MessageIO extends EventEmitter {\n declare socket: Socket;\n declare debug: Debug;\n\n declare tlsNegotiationComplete: boolean;\n\n declare private incomingMessageStream: IncomingMessageStream;\n declare outgoingMessageStream: OutgoingMessageStream;\n\n declare securePair?: {\n cleartext: tls.TLSSocket;\n encrypted: Duplex;\n };\n\n declare incomingMessageIterator: AsyncIterableIterator<Message>;\n\n constructor(socket: Socket, packetSize: number, debug: Debug) {\n super();\n\n this.socket = socket;\n this.debug = debug;\n\n this.tlsNegotiationComplete = false;\n\n this.incomingMessageStream = new IncomingMessageStream(this.debug);\n this.incomingMessageIterator = this.incomingMessageStream[Symbol.asyncIterator]();\n\n this.outgoingMessageStream = new OutgoingMessageStream(this.debug, { packetSize: packetSize });\n\n this.socket.pipe(this.incomingMessageStream);\n this.outgoingMessageStream.pipe(this.socket);\n }\n\n packetSize(...args: [number]) {\n if (args.length > 0) {\n const packetSize = args[0];\n this.debug.log('Packet size changed from ' + this.outgoingMessageStream.packetSize + ' to ' + packetSize);\n this.outgoingMessageStream.packetSize = packetSize;\n }\n\n if (this.securePair) {\n this.securePair.cleartext.setMaxSendFragment(this.outgoingMessageStream.packetSize);\n }\n\n return this.outgoingMessageStream.packetSize;\n }\n\n // Negotiate TLS encryption.\n startTls(credentialsDetails: tls.SecureContextOptions, hostname: string, trustServerCertificate: boolean) {\n if (!credentialsDetails.maxVersion || !['TLSv1.2', 'TLSv1.1', 'TLSv1'].includes(credentialsDetails.maxVersion)) {\n credentialsDetails.maxVersion = 'TLSv1.2';\n }\n\n const secureContext = tls.createSecureContext(credentialsDetails);\n\n return new Promise<void>((resolve, reject) => {\n const duplexpair = new DuplexPair();\n const securePair = this.securePair = {\n cleartext: tls.connect({\n socket: duplexpair.socket1 as Socket,\n // The `host` is used to verify the server's certificate identity.\n // It is not used to establish a connection as a `socket` is\n // specified.\n host: hostname,\n // RFC 6066 does not allow IP addresses to be used as the server\n // name, so omit the SNI extension in that case.\n servername: isIP(hostname) ? '' : hostname,\n secureContext: secureContext,\n rejectUnauthorized: !trustServerCertificate\n }),\n encrypted: duplexpair.socket2\n };\n\n const onSecureConnect = () => {\n securePair.encrypted.removeListener('readable', onReadable);\n securePair.cleartext.removeListener('error', onError);\n securePair.cleartext.removeListener('secureConnect', onSecureConnect);\n\n // If we encounter any errors from this point on,\n // we just forward them to the actual network socket.\n securePair.cleartext.once('error', (err) => {\n this.socket.destroy(err);\n });\n\n const cipher = securePair.cleartext.getCipher();\n if (cipher) {\n this.debug.log('TLS negotiated (' + cipher.name + ', ' + cipher.version + ')');\n }\n\n this.emit('secure', securePair.cleartext);\n\n securePair.cleartext.setMaxSendFragment(this.outgoingMessageStream.packetSize);\n\n this.outgoingMessageStream.unpipe(this.socket);\n this.socket.unpipe(this.incomingMessageStream);\n\n this.socket.pipe(securePair.encrypted);\n securePair.encrypted.pipe(this.socket);\n\n securePair.cleartext.pipe(this.incomingMessageStream);\n this.outgoingMessageStream.pipe(securePair.cleartext);\n\n this.tlsNegotiationComplete = true;\n\n resolve();\n };\n\n const onError = (err?: Error) => {\n securePair.encrypted.removeListener('readable', onReadable);\n securePair.cleartext.removeListener('error', onError);\n securePair.cleartext.removeListener('secureConnect', onSecureConnect);\n\n securePair.cleartext.destroy();\n securePair.encrypted.destroy();\n\n reject(err);\n };\n\n const onReadable = () => {\n // When there is handshake data on the encrypted stream of the secure pair,\n // we wrap it into a `PRELOGIN` message and send it to the server.\n //\n // For each `PRELOGIN` message we sent we get back exactly one response message\n // that contains the server's handshake response data.\n const message = new Message({ type: TYPE.PRELOGIN, resetConnection: false });\n\n let chunk;\n while (chunk = securePair.encrypted.read()) {\n message.write(chunk);\n }\n this.outgoingMessageStream.write(message);\n message.end();\n\n this.readMessage().then(async (response) => {\n // Setup readable handler for the next round of handshaking.\n // If we encounter a `secureConnect` on the cleartext side\n // of the secure pair, the `readable` handler is cleared\n // and no further handshake handling will happen.\n securePair.encrypted.once('readable', onReadable);\n\n for await (const data of response) {\n // We feed the server's handshake response back into the\n // encrypted end of the secure pair.\n securePair.encrypted.write(data);\n }\n }).catch(onError);\n };\n\n securePair.cleartext.once('error', onError);\n securePair.cleartext.once('secureConnect', onSecureConnect);\n securePair.encrypted.once('readable', onReadable);\n });\n }\n\n // TODO listen for 'drain' event when socket.write returns false.\n // TODO implement incomplete request cancellation (2.2.1.6)\n sendMessage(packetType: number, data?: Buffer, resetConnection?: boolean) {\n const message = new Message({ type: packetType, resetConnection: resetConnection });\n message.end(data);\n this.outgoingMessageStream.write(message);\n return message;\n }\n\n /**\n * Read the next incoming message from the socket.\n */\n async readMessage(): Promise<Message> {\n const result = await this.incomingMessageIterator.next();\n\n if (result.done) {\n throw new Error('unexpected end of message stream');\n }\n\n return result.value;\n }\n}\n\nexport default MessageIO;\nmodule.exports = MessageIO;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"message-io.js","names":["_nativeDuplexpair","_interopRequireDefault","require","tls","_interopRequireWildcard","_net","_events","_message","_packet","_incomingMessageStream","_outgoingMessageStream","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","MessageIO","EventEmitter","MAX_TLS_SEND_FRAGMENT_SIZE","constructor","socket","packetSize","debug","tlsNegotiationComplete","incomingMessageStream","IncomingMessageStream","incomingMessageIterator","Symbol","asyncIterator","outgoingMessageStream","OutgoingMessageStream","pipe","args","length","log","maxSendFragment","Math","min","securePair","cleartext","setMaxSendFragment","TLSSocket","startTls","credentialsDetails","hostname","trustServerCertificate","maxVersion","includes","secureContext","createSecureContext","Promise","resolve","reject","duplexpair","DuplexPair","connect","socket1","host","servername","isIP","rejectUnauthorized","encrypted","socket2","onSecureConnect","removeListener","onReadable","onError","once","err","destroy","cipher","getCipher","name","version","emit","unpipe","message","Message","type","TYPE","PRELOGIN","resetConnection","chunk","read","write","end","readMessage","then","response","data","catch","sendMessage","packetType","result","next","done","Error","value","_default","exports","module"],"sources":["../src/message-io.ts"],"sourcesContent":["import DuplexPair from 'native-duplexpair';\n\nimport { Duplex } from 'stream';\nimport * as tls from 'tls';\nimport { isIP, Socket } from 'net';\nimport { EventEmitter } from 'events';\n\nimport Debug from './debug';\n\nimport Message from './message';\nimport { TYPE } from './packet';\n\nimport IncomingMessageStream from './incoming-message-stream';\nimport OutgoingMessageStream from './outgoing-message-stream';\n\nclass MessageIO extends EventEmitter {\n // Node's `tls.TLSSocket#setMaxSendFragment` silently ignores values outside this range.\n // (A static class property rather than a named export, as the `module.exports`\n // assignment at the bottom of this file would clobber named exports for CJS consumers.)\n static readonly MAX_TLS_SEND_FRAGMENT_SIZE = 16384;\n\n declare socket: Socket;\n declare debug: Debug;\n\n declare tlsNegotiationComplete: boolean;\n\n declare private incomingMessageStream: IncomingMessageStream;\n declare outgoingMessageStream: OutgoingMessageStream;\n\n declare securePair?: {\n cleartext: tls.TLSSocket;\n encrypted: Duplex;\n };\n\n declare incomingMessageIterator: AsyncIterableIterator<Message>;\n\n constructor(socket: Socket, packetSize: number, debug: Debug) {\n super();\n\n this.socket = socket;\n this.debug = debug;\n\n this.tlsNegotiationComplete = false;\n\n this.incomingMessageStream = new IncomingMessageStream(this.debug);\n this.incomingMessageIterator = this.incomingMessageStream[Symbol.asyncIterator]();\n\n this.outgoingMessageStream = new OutgoingMessageStream(this.debug, { packetSize: packetSize });\n\n this.socket.pipe(this.incomingMessageStream);\n this.outgoingMessageStream.pipe(this.socket);\n }\n\n packetSize(...args: [number]) {\n if (args.length > 0) {\n const packetSize = args[0];\n this.debug.log('Packet size changed from ' + this.outgoingMessageStream.packetSize + ' to ' + packetSize);\n this.outgoingMessageStream.packetSize = packetSize;\n }\n\n const maxSendFragment = Math.min(this.outgoingMessageStream.packetSize, MessageIO.MAX_TLS_SEND_FRAGMENT_SIZE);\n\n if (this.securePair) {\n // Classic `encrypt: true` path: TLS is layered over a `DuplexPair`.\n this.securePair.cleartext.setMaxSendFragment(maxSendFragment);\n } else if (this.socket instanceof tls.TLSSocket) {\n // `encrypt: \"strict\"` (TDS 8.0) path: the socket itself is the TLS socket. Without\n // this, a server-initiated packet size change (ENVCHANGE) after login would leave\n // the original cap in place, potentially allowing oversized TLS records again.\n this.socket.setMaxSendFragment(maxSendFragment);\n }\n\n return this.outgoingMessageStream.packetSize;\n }\n\n // Negotiate TLS encryption.\n startTls(credentialsDetails: tls.SecureContextOptions, hostname: string, trustServerCertificate: boolean) {\n if (!credentialsDetails.maxVersion || !['TLSv1.2', 'TLSv1.1', 'TLSv1'].includes(credentialsDetails.maxVersion)) {\n credentialsDetails.maxVersion = 'TLSv1.2';\n }\n\n const secureContext = tls.createSecureContext(credentialsDetails);\n\n return new Promise<void>((resolve, reject) => {\n const duplexpair = new DuplexPair();\n const securePair = this.securePair = {\n cleartext: tls.connect({\n socket: duplexpair.socket1 as Socket,\n // The `host` is used to verify the server's certificate identity.\n // It is not used to establish a connection as a `socket` is\n // specified.\n host: hostname,\n // RFC 6066 does not allow IP addresses to be used as the server\n // name, so omit the SNI extension in that case.\n servername: isIP(hostname) ? '' : hostname,\n secureContext: secureContext,\n rejectUnauthorized: !trustServerCertificate\n }),\n encrypted: duplexpair.socket2\n };\n\n const onSecureConnect = () => {\n securePair.encrypted.removeListener('readable', onReadable);\n securePair.cleartext.removeListener('error', onError);\n securePair.cleartext.removeListener('secureConnect', onSecureConnect);\n\n // If we encounter any errors from this point on,\n // we just forward them to the actual network socket.\n securePair.cleartext.once('error', (err) => {\n this.socket.destroy(err);\n });\n\n const cipher = securePair.cleartext.getCipher();\n if (cipher) {\n this.debug.log('TLS negotiated (' + cipher.name + ', ' + cipher.version + ')');\n }\n\n this.emit('secure', securePair.cleartext);\n\n securePair.cleartext.setMaxSendFragment(Math.min(this.outgoingMessageStream.packetSize, MessageIO.MAX_TLS_SEND_FRAGMENT_SIZE));\n\n this.outgoingMessageStream.unpipe(this.socket);\n this.socket.unpipe(this.incomingMessageStream);\n\n this.socket.pipe(securePair.encrypted);\n securePair.encrypted.pipe(this.socket);\n\n securePair.cleartext.pipe(this.incomingMessageStream);\n this.outgoingMessageStream.pipe(securePair.cleartext);\n\n this.tlsNegotiationComplete = true;\n\n resolve();\n };\n\n const onError = (err?: Error) => {\n securePair.encrypted.removeListener('readable', onReadable);\n securePair.cleartext.removeListener('error', onError);\n securePair.cleartext.removeListener('secureConnect', onSecureConnect);\n\n securePair.cleartext.destroy();\n securePair.encrypted.destroy();\n\n reject(err);\n };\n\n const onReadable = () => {\n // When there is handshake data on the encrypted stream of the secure pair,\n // we wrap it into a `PRELOGIN` message and send it to the server.\n //\n // For each `PRELOGIN` message we sent we get back exactly one response message\n // that contains the server's handshake response data.\n const message = new Message({ type: TYPE.PRELOGIN, resetConnection: false });\n\n let chunk;\n while (chunk = securePair.encrypted.read()) {\n message.write(chunk);\n }\n this.outgoingMessageStream.write(message);\n message.end();\n\n this.readMessage().then(async (response) => {\n // Setup readable handler for the next round of handshaking.\n // If we encounter a `secureConnect` on the cleartext side\n // of the secure pair, the `readable` handler is cleared\n // and no further handshake handling will happen.\n securePair.encrypted.once('readable', onReadable);\n\n for await (const data of response) {\n // We feed the server's handshake response back into the\n // encrypted end of the secure pair.\n securePair.encrypted.write(data);\n }\n }).catch(onError);\n };\n\n securePair.cleartext.once('error', onError);\n securePair.cleartext.once('secureConnect', onSecureConnect);\n securePair.encrypted.once('readable', onReadable);\n });\n }\n\n // TODO listen for 'drain' event when socket.write returns false.\n // TODO implement incomplete request cancellation (2.2.1.6)\n sendMessage(packetType: number, data?: Buffer, resetConnection?: boolean) {\n const message = new Message({ type: packetType, resetConnection: resetConnection });\n message.end(data);\n this.outgoingMessageStream.write(message);\n return message;\n }\n\n /**\n * Read the next incoming message from the socket.\n */\n async readMessage(): Promise<Message> {\n const result = await this.incomingMessageIterator.next();\n\n if (result.done) {\n throw new Error('unexpected end of message stream');\n }\n\n return result.value;\n }\n}\n\nexport default MessageIO;\nmodule.exports = MessageIO;\n"],"mappings":"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","ignoreList":[]}
@@ -6,6 +6,16 @@ import BulkLoad from '../bulk-load';
6
6
  export declare class UnexpectedTokenError extends Error {
7
7
  constructor(handler: TokenHandler, token: Token);
8
8
  }
9
+ /**
10
+ * Emits a warning (once per process) when a connection is established
11
+ * using TDS 7.1.
12
+ *
13
+ * @private
14
+ */
15
+ export declare const tds71DeprecationWarning: {
16
+ emitted: boolean;
17
+ emit(): void;
18
+ };
9
19
  export declare class TokenHandler {
10
20
  onInfoMessage(token: InfoMessageToken): void;
11
21
  onErrorMessage(token: ErrorMessageToken): void;
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.UnexpectedTokenError = exports.TokenHandler = exports.RequestTokenHandler = exports.Login7TokenHandler = exports.InitialSqlTokenHandler = exports.AttentionTokenHandler = void 0;
6
+ exports.tds71DeprecationWarning = exports.UnexpectedTokenError = exports.TokenHandler = exports.RequestTokenHandler = exports.Login7TokenHandler = exports.InitialSqlTokenHandler = exports.AttentionTokenHandler = void 0;
7
7
  var _request = _interopRequireDefault(require("../request"));
8
8
  var _errors = require("../errors");
9
9
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
@@ -12,7 +12,27 @@ class UnexpectedTokenError extends Error {
12
12
  super('Unexpected token `' + token.name + '` in `' + handler.constructor.name + '`');
13
13
  }
14
14
  }
15
+
16
+ /**
17
+ * Emits a warning (once per process) when a connection is established
18
+ * using TDS 7.1.
19
+ *
20
+ * @private
21
+ */
15
22
  exports.UnexpectedTokenError = UnexpectedTokenError;
23
+ const tds71DeprecationWarning = exports.tds71DeprecationWarning = {
24
+ emitted: false,
25
+ emit() {
26
+ if (this.emitted) {
27
+ return;
28
+ }
29
+ this.emitted = true;
30
+ process.emitWarning('Support for TDS 7.1 (used by SQL Server 2000) is deprecated and will be removed in a future version of `tedious`.', {
31
+ type: 'DeprecationWarning',
32
+ code: 'TEDIOUS_DEP_TDS71'
33
+ });
34
+ }
35
+ };
16
36
  class TokenHandler {
17
37
  onInfoMessage(token) {
18
38
  throw new UnexpectedTokenError(this, token);
@@ -245,6 +265,9 @@ class Login7TokenHandler extends TokenHandler {
245
265
 
246
266
  // use negotiated version
247
267
  this.connection.config.options.tdsVersion = token.tdsVersion;
268
+ if (token.tdsVersion < '7_2') {
269
+ tds71DeprecationWarning.emit();
270
+ }
248
271
  this.loginAckReceived = true;
249
272
  }
250
273
  onRoutingChange(token) {
@@ -443,4 +466,4 @@ class AttentionTokenHandler extends TokenHandler {
443
466
  }
444
467
  }
445
468
  exports.AttentionTokenHandler = AttentionTokenHandler;
446
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVxdWVzdCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2Vycm9ycyIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIlVuZXhwZWN0ZWRUb2tlbkVycm9yIiwiRXJyb3IiLCJjb25zdHJ1Y3RvciIsImhhbmRsZXIiLCJ0b2tlbiIsIm5hbWUiLCJleHBvcnRzIiwiVG9rZW5IYW5kbGVyIiwib25JbmZvTWVzc2FnZSIsIm9uRXJyb3JNZXNzYWdlIiwib25TU1BJIiwib25EYXRhYmFzZUNoYW5nZSIsIm9uTGFuZ3VhZ2VDaGFuZ2UiLCJvbkNoYXJzZXRDaGFuZ2UiLCJvblNxbENvbGxhdGlvbkNoYW5nZSIsIm9uUm91dGluZ0NoYW5nZSIsIm9uUGFja2V0U2l6ZUNoYW5nZSIsIm9uUmVzZXRDb25uZWN0aW9uIiwib25CZWdpblRyYW5zYWN0aW9uIiwib25Db21taXRUcmFuc2FjdGlvbiIsIm9uUm9sbGJhY2tUcmFuc2FjdGlvbiIsIm9uRmVkQXV0aEluZm8iLCJvbkZlYXR1cmVFeHRBY2siLCJvbkxvZ2luQWNrIiwib25Db2xNZXRhZGF0YSIsIm9uT3JkZXIiLCJvblJvdyIsIm9uUmV0dXJuU3RhdHVzIiwib25SZXR1cm5WYWx1ZSIsIm9uRG9uZVByb2MiLCJvbkRvbmVJblByb2MiLCJvbkRvbmUiLCJvbkRhdGFiYXNlTWlycm9yaW5nUGFydG5lciIsIkluaXRpYWxTcWxUb2tlbkhhbmRsZXIiLCJjb25uZWN0aW9uIiwiZW1pdCIsIm5ld1ZhbHVlIiwiZGF0YWJhc2VDb2xsYXRpb24iLCJtZXNzYWdlSW8iLCJwYWNrZXRTaXplIiwidHJhbnNhY3Rpb25EZXNjcmlwdG9ycyIsInB1c2giLCJpblRyYW5zYWN0aW9uIiwibGVuZ3RoIiwiY2xvc2UiLCJMb2dpbjdUb2tlbkhhbmRsZXIiLCJsb2dpbkFja1JlY2VpdmVkIiwibG9naW5FcnJvciIsInVuZGVmaW5lZCIsImVycm9yIiwiQ29ubmVjdGlvbkVycm9yIiwibWVzc2FnZSIsImlzTG9naW5FcnJvclRyYW5zaWVudCIsInRyYW5zaWVudEVycm9yTG9va3VwIiwiaXNUcmFuc2llbnRFcnJvciIsIm51bWJlciIsImN1clRyYW5zaWVudFJldHJ5Q291bnQiLCJjb25maWciLCJvcHRpb25zIiwibWF4UmV0cmllc09uVHJhbnNpZW50RXJyb3JzIiwiaXNUcmFuc2llbnQiLCJudGxtcGFja2V0IiwibnRsbXBhY2tldEJ1ZmZlciIsImZlZEF1dGhJbmZvVG9rZW4iLCJhdXRoZW50aWNhdGlvbiIsInR5cGUiLCJmZWRBdXRoIiwidXRmOFN1cHBvcnQiLCJ0ZHNWZXJzaW9uIiwiaW50ZXJmYWNlIiwic2VydmVyIiwiaW5zdGFuY2UiLCJzcGxpdCIsInJvdXRpbmdEYXRhIiwicG9ydCIsIlJlcXVlc3RUb2tlbkhhbmRsZXIiLCJyZXF1ZXN0IiwiZXJyb3JzIiwiY2FuY2VsZWQiLCJSZXF1ZXN0RXJyb3IiLCJzdGF0ZSIsImNsYXNzIiwic2VydmVyTmFtZSIsInByb2NOYW1lIiwibGluZU51bWJlciIsIlJlcXVlc3QiLCJBZ2dyZWdhdGVFcnJvciIsInVzZUNvbHVtbk5hbWVzIiwiY29sdW1ucyIsIk9iamVjdCIsImNyZWF0ZSIsImoiLCJsZW4iLCJjb2wiLCJjb2xOYW1lIiwib3JkZXJDb2x1bW5zIiwicm93Q29sbGVjdGlvbk9uUmVxdWVzdENvbXBsZXRpb24iLCJyb3dzIiwicm93Q29sbGVjdGlvbk9uRG9uZSIsInJzdCIsInByb2NSZXR1cm5TdGF0dXNWYWx1ZSIsInZhbHVlIiwicGFyYW1OYW1lIiwibWV0YWRhdGEiLCJzcWxFcnJvciIsInJvd0NvdW50IiwibW9yZSIsIkF0dGVudGlvblRva2VuSGFuZGxlciIsImF0dGVudGlvblJlY2VpdmVkIiwiYXR0ZW50aW9uIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rva2VuL2hhbmRsZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IENvbm5lY3Rpb24gZnJvbSAnLi4vY29ubmVjdGlvbic7XG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuLi9yZXF1ZXN0JztcbmltcG9ydCB7IENvbm5lY3Rpb25FcnJvciwgUmVxdWVzdEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IHR5cGUgQ29sdW1uTWV0YWRhdGEgfSBmcm9tICcuL2NvbG1ldGFkYXRhLXRva2VuLXBhcnNlcic7XG5pbXBvcnQge1xuICBCZWdpblRyYW5zYWN0aW9uRW52Q2hhbmdlVG9rZW4sXG4gIENoYXJzZXRFbnZDaGFuZ2VUb2tlbixcbiAgQ29sbGF0aW9uQ2hhbmdlVG9rZW4sXG4gIENvbE1ldGFkYXRhVG9rZW4sXG4gIENvbW1pdFRyYW5zYWN0aW9uRW52Q2hhbmdlVG9rZW4sXG4gIERhdGFiYXNlRW52Q2hhbmdlVG9rZW4sXG4gIERhdGFiYXNlTWlycm9yaW5nUGFydG5lckVudkNoYW5nZVRva2VuLFxuICBEb25lSW5Qcm9jVG9rZW4sXG4gIERvbmVQcm9jVG9rZW4sXG4gIERvbmVUb2tlbixcbiAgRXJyb3JNZXNzYWdlVG9rZW4sXG4gIEZlYXR1cmVFeHRBY2tUb2tlbixcbiAgRmVkQXV0aEluZm9Ub2tlbixcbiAgSW5mb01lc3NhZ2VUb2tlbixcbiAgTGFuZ3VhZ2VFbnZDaGFuZ2VUb2tlbixcbiAgTG9naW5BY2tUb2tlbixcbiAgTkJDUm93VG9rZW4sXG4gIE9yZGVyVG9rZW4sXG4gIFBhY2tldFNpemVFbnZDaGFuZ2VUb2tlbixcbiAgUmVzZXRDb25uZWN0aW9uRW52Q2hhbmdlVG9rZW4sXG4gIFJldHVyblN0YXR1c1Rva2VuLFxuICBSZXR1cm5WYWx1ZVRva2VuLFxuICBSb2xsYmFja1RyYW5zYWN0aW9uRW52Q2hhbmdlVG9rZW4sXG4gIFJvdXRpbmdFbnZDaGFuZ2VUb2tlbixcbiAgUm93VG9rZW4sXG4gIFNTUElUb2tlbixcbiAgVG9rZW5cbn0gZnJvbSAnLi90b2tlbic7XG5pbXBvcnQgQnVsa0xvYWQgZnJvbSAnLi4vYnVsay1sb2FkJztcblxuZXhwb3J0IGNsYXNzIFVuZXhwZWN0ZWRUb2tlbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihoYW5kbGVyOiBUb2tlbkhhbmRsZXIsIHRva2VuOiBUb2tlbikge1xuICAgIHN1cGVyKCdVbmV4cGVjdGVkIHRva2VuIGAnICsgdG9rZW4ubmFtZSArICdgIGluIGAnICsgaGFuZGxlci5jb25zdHJ1Y3Rvci5uYW1lICsgJ2AnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVG9rZW5IYW5kbGVyIHtcbiAgb25JbmZvTWVzc2FnZSh0b2tlbjogSW5mb01lc3NhZ2VUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvbkVycm9yTWVzc2FnZSh0b2tlbjogRXJyb3JNZXNzYWdlVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25TU1BJKHRva2VuOiBTU1BJVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25EYXRhYmFzZUNoYW5nZSh0b2tlbjogRGF0YWJhc2VFbnZDaGFuZ2VUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvbkxhbmd1YWdlQ2hhbmdlKHRva2VuOiBMYW5ndWFnZUVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uQ2hhcnNldENoYW5nZSh0b2tlbjogQ2hhcnNldEVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uU3FsQ29sbGF0aW9uQ2hhbmdlKHRva2VuOiBDb2xsYXRpb25DaGFuZ2VUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvblJvdXRpbmdDaGFuZ2UodG9rZW46IFJvdXRpbmdFbnZDaGFuZ2VUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvblBhY2tldFNpemVDaGFuZ2UodG9rZW46IFBhY2tldFNpemVFbnZDaGFuZ2VUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvblJlc2V0Q29ubmVjdGlvbih0b2tlbjogUmVzZXRDb25uZWN0aW9uRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25CZWdpblRyYW5zYWN0aW9uKHRva2VuOiBCZWdpblRyYW5zYWN0aW9uRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25Db21taXRUcmFuc2FjdGlvbih0b2tlbjogQ29tbWl0VHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvblJvbGxiYWNrVHJhbnNhY3Rpb24odG9rZW46IFJvbGxiYWNrVHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvbkZlZEF1dGhJbmZvKHRva2VuOiBGZWRBdXRoSW5mb1Rva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uRmVhdHVyZUV4dEFjayh0b2tlbjogRmVhdHVyZUV4dEFja1Rva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uTG9naW5BY2sodG9rZW46IExvZ2luQWNrVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25Db2xNZXRhZGF0YSh0b2tlbjogQ29sTWV0YWRhdGFUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvbk9yZGVyKHRva2VuOiBPcmRlclRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uUm93KHRva2VuOiBSb3dUb2tlbiB8IE5CQ1Jvd1Rva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uUmV0dXJuU3RhdHVzKHRva2VuOiBSZXR1cm5TdGF0dXNUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvblJldHVyblZhbHVlKHRva2VuOiBSZXR1cm5WYWx1ZVRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uRG9uZVByb2ModG9rZW46IERvbmVQcm9jVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25Eb25lSW5Qcm9jKHRva2VuOiBEb25lSW5Qcm9jVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25Eb25lKHRva2VuOiBEb25lVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25EYXRhYmFzZU1pcnJvcmluZ1BhcnRuZXIodG9rZW46IERhdGFiYXNlTWlycm9yaW5nUGFydG5lckVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgaGFuZGxlciBmb3IgdG9rZW5zIHJlY2VpdmVkIGluIHRoZSByZXNwb25zZSBtZXNzYWdlIHRvIHRoZSBpbml0aWFsIFNRTCBCYXRjaCByZXF1ZXN0XG4gKiB0aGF0IHNldHMgdXAgZGlmZmVyZW50IGNvbm5lY3Rpb24gc2V0dGluZ3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBJbml0aWFsU3FsVG9rZW5IYW5kbGVyIGV4dGVuZHMgVG9rZW5IYW5kbGVyIHtcbiAgZGVjbGFyZSBjb25uZWN0aW9uOiBDb25uZWN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKGNvbm5lY3Rpb246IENvbm5lY3Rpb24pIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgfVxuXG4gIG9uSW5mb01lc3NhZ2UodG9rZW46IEluZm9NZXNzYWdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnaW5mb01lc3NhZ2UnLCB0b2tlbik7XG4gIH1cblxuICBvbkVycm9yTWVzc2FnZSh0b2tlbjogRXJyb3JNZXNzYWdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnZXJyb3JNZXNzYWdlJywgdG9rZW4pO1xuICB9XG5cbiAgb25EYXRhYmFzZUNoYW5nZSh0b2tlbjogRGF0YWJhc2VFbnZDaGFuZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5lbWl0KCdkYXRhYmFzZUNoYW5nZScsIHRva2VuLm5ld1ZhbHVlKTtcbiAgfVxuXG4gIG9uTGFuZ3VhZ2VDaGFuZ2UodG9rZW46IExhbmd1YWdlRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnbGFuZ3VhZ2VDaGFuZ2UnLCB0b2tlbi5uZXdWYWx1ZSk7XG4gIH1cblxuICBvbkNoYXJzZXRDaGFuZ2UodG9rZW46IENoYXJzZXRFbnZDaGFuZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5lbWl0KCdjaGFyc2V0Q2hhbmdlJywgdG9rZW4ubmV3VmFsdWUpO1xuICB9XG5cbiAgb25TcWxDb2xsYXRpb25DaGFuZ2UodG9rZW46IENvbGxhdGlvbkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmRhdGFiYXNlQ29sbGF0aW9uID0gdG9rZW4ubmV3VmFsdWU7XG4gIH1cblxuICBvblBhY2tldFNpemVDaGFuZ2UodG9rZW46IFBhY2tldFNpemVFbnZDaGFuZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5tZXNzYWdlSW8ucGFja2V0U2l6ZSh0b2tlbi5uZXdWYWx1ZSk7XG4gIH1cblxuICBvbkJlZ2luVHJhbnNhY3Rpb24odG9rZW46IEJlZ2luVHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi50cmFuc2FjdGlvbkRlc2NyaXB0b3JzLnB1c2godG9rZW4ubmV3VmFsdWUpO1xuICAgIHRoaXMuY29ubmVjdGlvbi5pblRyYW5zYWN0aW9uID0gdHJ1ZTtcbiAgfVxuXG4gIG9uQ29tbWl0VHJhbnNhY3Rpb24odG9rZW46IENvbW1pdFRyYW5zYWN0aW9uRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24udHJhbnNhY3Rpb25EZXNjcmlwdG9ycy5sZW5ndGggPSAxO1xuICAgIHRoaXMuY29ubmVjdGlvbi5pblRyYW5zYWN0aW9uID0gZmFsc2U7XG4gIH1cblxuICBvblJvbGxiYWNrVHJhbnNhY3Rpb24odG9rZW46IFJvbGxiYWNrVHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi50cmFuc2FjdGlvbkRlc2NyaXB0b3JzLmxlbmd0aCA9IDE7XG4gICAgLy8gQW4gb3V0ZXJtb3N0IHRyYW5zYWN0aW9uIHdhcyByb2xsZWQgYmFjay4gUmVzZXQgdGhlIHRyYW5zYWN0aW9uIGNvdW50ZXJcbiAgICB0aGlzLmNvbm5lY3Rpb24uaW5UcmFuc2FjdGlvbiA9IGZhbHNlO1xuICAgIHRoaXMuY29ubmVjdGlvbi5lbWl0KCdyb2xsYmFja1RyYW5zYWN0aW9uJyk7XG4gIH1cblxuICBvbkNvbE1ldGFkYXRhKHRva2VuOiBDb2xNZXRhZGF0YVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKFwiUmVjZWl2ZWQgJ2NvbHVtbk1ldGFkYXRhJyB3aGVuIG5vIHNxbFJlcXVlc3QgaXMgaW4gcHJvZ3Jlc3NcIikpO1xuICAgIHRoaXMuY29ubmVjdGlvbi5jbG9zZSgpO1xuICB9XG5cbiAgb25PcmRlcih0b2tlbjogT3JkZXJUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcihcIlJlY2VpdmVkICdvcmRlcicgd2hlbiBubyBzcWxSZXF1ZXN0IGlzIGluIHByb2dyZXNzXCIpKTtcbiAgICB0aGlzLmNvbm5lY3Rpb24uY2xvc2UoKTtcbiAgfVxuXG4gIG9uUm93KHRva2VuOiBSb3dUb2tlbiB8IE5CQ1Jvd1Rva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKFwiUmVjZWl2ZWQgJ3Jvdycgd2hlbiBubyBzcWxSZXF1ZXN0IGlzIGluIHByb2dyZXNzXCIpKTtcbiAgICB0aGlzLmNvbm5lY3Rpb24uY2xvc2UoKTtcbiAgfVxuXG4gIG9uUmV0dXJuU3RhdHVzKHRva2VuOiBSZXR1cm5TdGF0dXNUb2tlbikge1xuICAgIC8vIERvIG5vdGhpbmdcbiAgfVxuXG4gIG9uUmV0dXJuVmFsdWUodG9rZW46IFJldHVyblZhbHVlVG9rZW4pIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH1cblxuICBvbkRvbmVQcm9jKHRva2VuOiBEb25lUHJvY1Rva2VuKSB7XG4gICAgLy8gRG8gbm90aGluZ1xuICB9XG5cbiAgb25Eb25lSW5Qcm9jKHRva2VuOiBEb25lSW5Qcm9jVG9rZW4pIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH1cblxuICBvbkRvbmUodG9rZW46IERvbmVUb2tlbikge1xuICAgIC8vIERvIG5vdGhpbmdcbiAgfVxuXG4gIG9uUmVzZXRDb25uZWN0aW9uKHRva2VuOiBSZXNldENvbm5lY3Rpb25FbnZDaGFuZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5lbWl0KCdyZXNldENvbm5lY3Rpb24nKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgaGFuZGxlciBmb3IgdG9rZW5zIHJlY2VpdmVkIGluIHRoZSByZXNwb25zZSBtZXNzYWdlIHRvIGEgTG9naW43IG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dpbjdUb2tlbkhhbmRsZXIgZXh0ZW5kcyBUb2tlbkhhbmRsZXIge1xuICBkZWNsYXJlIGNvbm5lY3Rpb246IENvbm5lY3Rpb247XG5cbiAgZGVjbGFyZSBmZWRBdXRoSW5mb1Rva2VuOiBGZWRBdXRoSW5mb1Rva2VuIHwgdW5kZWZpbmVkO1xuICBkZWNsYXJlIHJvdXRpbmdEYXRhOiB7IHNlcnZlcjogc3RyaW5nLCBwb3J0OiBudW1iZXIsIGluc3RhbmNlOiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcblxuICBkZWNsYXJlIGxvZ2luQWNrUmVjZWl2ZWQ6IGJvb2xlYW47XG5cbiAgZGVjbGFyZSBsb2dpbkVycm9yOiBDb25uZWN0aW9uRXJyb3IgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoY29ubmVjdGlvbjogQ29ubmVjdGlvbikge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5sb2dpbkFja1JlY2VpdmVkID0gZmFsc2U7XG4gICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICB0aGlzLmxvZ2luRXJyb3IgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBvbkluZm9NZXNzYWdlKHRva2VuOiBJbmZvTWVzc2FnZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2luZm9NZXNzYWdlJywgdG9rZW4pO1xuICB9XG5cbiAgb25FcnJvck1lc3NhZ2UodG9rZW46IEVycm9yTWVzc2FnZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2Vycm9yTWVzc2FnZScsIHRva2VuKTtcblxuICAgIGNvbnN0IGVycm9yID0gbmV3IENvbm5lY3Rpb25FcnJvcih0b2tlbi5tZXNzYWdlLCAnRUxPR0lOJyk7XG5cbiAgICBjb25zdCBpc0xvZ2luRXJyb3JUcmFuc2llbnQgPSB0aGlzLmNvbm5lY3Rpb24udHJhbnNpZW50RXJyb3JMb29rdXAuaXNUcmFuc2llbnRFcnJvcih0b2tlbi5udW1iZXIpO1xuICAgIGlmIChpc0xvZ2luRXJyb3JUcmFuc2llbnQgJiYgdGhpcy5jb25uZWN0aW9uLmN1clRyYW5zaWVudFJldHJ5Q291bnQgIT09IHRoaXMuY29ubmVjdGlvbi5jb25maWcub3B0aW9ucy5tYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnMpIHtcbiAgICAgIGVycm9yLmlzVHJhbnNpZW50ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLmxvZ2luRXJyb3IgPSBlcnJvcjtcbiAgfVxuXG4gIG9uU1NQSSh0b2tlbjogU1NQSVRva2VuKSB7XG4gICAgaWYgKHRva2VuLm50bG1wYWNrZXQpIHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbi5udGxtcGFja2V0ID0gdG9rZW4ubnRsbXBhY2tldDtcbiAgICAgIHRoaXMuY29ubmVjdGlvbi5udGxtcGFja2V0QnVmZmVyID0gdG9rZW4ubnRsbXBhY2tldEJ1ZmZlcjtcbiAgICB9XG4gIH1cblxuICBvbkRhdGFiYXNlQ2hhbmdlKHRva2VuOiBEYXRhYmFzZUVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2RhdGFiYXNlQ2hhbmdlJywgdG9rZW4ubmV3VmFsdWUpO1xuICB9XG5cbiAgb25EYXRhYmFzZU1pcnJvcmluZ1BhcnRuZXIodG9rZW46IERhdGFiYXNlTWlycm9yaW5nUGFydG5lckVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2RhdGFiYXNlTWlycm9yaW5nUGFydG5lcicsIHRva2VuLm5ld1ZhbHVlKTtcbiAgfVxuXG4gIG9uTGFuZ3VhZ2VDaGFuZ2UodG9rZW46IExhbmd1YWdlRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnbGFuZ3VhZ2VDaGFuZ2UnLCB0b2tlbi5uZXdWYWx1ZSk7XG4gIH1cblxuICBvbkNoYXJzZXRDaGFuZ2UodG9rZW46IENoYXJzZXRFbnZDaGFuZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5lbWl0KCdjaGFyc2V0Q2hhbmdlJywgdG9rZW4ubmV3VmFsdWUpO1xuICB9XG5cbiAgb25TcWxDb2xsYXRpb25DaGFuZ2UodG9rZW46IENvbGxhdGlvbkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmRhdGFiYXNlQ29sbGF0aW9uID0gdG9rZW4ubmV3VmFsdWU7XG4gIH1cblxuICBvbkZlZEF1dGhJbmZvKHRva2VuOiBGZWRBdXRoSW5mb1Rva2VuKSB7XG4gICAgdGhpcy5mZWRBdXRoSW5mb1Rva2VuID0gdG9rZW47XG4gIH1cblxuICBvbkZlYXR1cmVFeHRBY2sodG9rZW46IEZlYXR1cmVFeHRBY2tUb2tlbikge1xuICAgIGNvbnN0IHsgYXV0aGVudGljYXRpb24gfSA9IHRoaXMuY29ubmVjdGlvbi5jb25maWc7XG5cbiAgICBpZiAoYXV0aGVudGljYXRpb24udHlwZSA9PT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktcGFzc3dvcmQnIHx8IGF1dGhlbnRpY2F0aW9uLnR5cGUgPT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWFjY2Vzcy10b2tlbicgfHwgYXV0aGVudGljYXRpb24udHlwZSA9PT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLXZtJyB8fCBhdXRoZW50aWNhdGlvbi50eXBlID09PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktYXBwLXNlcnZpY2UnIHx8IGF1dGhlbnRpY2F0aW9uLnR5cGUgPT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXNlcnZpY2UtcHJpbmNpcGFsLXNlY3JldCcgfHwgYXV0aGVudGljYXRpb24udHlwZSA9PT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktZGVmYXVsdCcpIHtcbiAgICAgIGlmICh0b2tlbi5mZWRBdXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2dpbkVycm9yID0gbmV3IENvbm5lY3Rpb25FcnJvcignRGlkIG5vdCByZWNlaXZlIEFjdGl2ZSBEaXJlY3RvcnkgYXV0aGVudGljYXRpb24gYWNrbm93bGVkZ2VtZW50Jyk7XG4gICAgICB9IGVsc2UgaWYgKHRva2VuLmZlZEF1dGgubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHRoaXMubG9naW5FcnJvciA9IG5ldyBDb25uZWN0aW9uRXJyb3IoYEFjdGl2ZSBEaXJlY3RvcnkgYXV0aGVudGljYXRpb24gYWNrbm93bGVkZ21lbnQgZm9yICR7YXV0aGVudGljYXRpb24udHlwZX0gYXV0aGVudGljYXRpb24gbWV0aG9kIGluY2x1ZGVzIGV4dHJhIGRhdGFgKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRva2VuLmZlZEF1dGggPT09IHVuZGVmaW5lZCAmJiB0b2tlbi51dGY4U3VwcG9ydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZ2luRXJyb3IgPSBuZXcgQ29ubmVjdGlvbkVycm9yKCdSZWNlaXZlZCBhY2tub3dsZWRnZW1lbnQgZm9yIHVua25vd24gZmVhdHVyZScpO1xuICAgIH0gZWxzZSBpZiAodG9rZW4uZmVkQXV0aCkge1xuICAgICAgdGhpcy5sb2dpbkVycm9yID0gbmV3IENvbm5lY3Rpb25FcnJvcignRGlkIG5vdCByZXF1ZXN0IEFjdGl2ZSBEaXJlY3RvcnkgYXV0aGVudGljYXRpb24sIGJ1dCByZWNlaXZlZCB0aGUgYWNrbm93bGVkZ21lbnQnKTtcbiAgICB9XG4gIH1cblxuICBvbkxvZ2luQWNrKHRva2VuOiBMb2dpbkFja1Rva2VuKSB7XG4gICAgaWYgKCF0b2tlbi50ZHNWZXJzaW9uKSB7XG4gICAgICAvLyB1bnN1cHBvcnRlZCBURFMgdmVyc2lvblxuICAgICAgdGhpcy5sb2dpbkVycm9yID0gbmV3IENvbm5lY3Rpb25FcnJvcignU2VydmVyIHJlc3BvbmRlZCB3aXRoIHVua25vd24gVERTIHZlcnNpb24uJywgJ0VURFMnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRva2VuLmludGVyZmFjZSkge1xuICAgICAgLy8gdW5zdXBwb3J0ZWQgaW50ZXJmYWNlXG4gICAgICB0aGlzLmxvZ2luRXJyb3IgPSBuZXcgQ29ubmVjdGlvbkVycm9yKCdTZXJ2ZXIgcmVzcG9uZGVkIHdpdGggdW5zdXBwb3J0ZWQgaW50ZXJmYWNlLicsICdFSU5URVJGQUNFTk9UU1VQUCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHVzZSBuZWdvdGlhdGVkIHZlcnNpb25cbiAgICB0aGlzLmNvbm5lY3Rpb24uY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvbiA9IHRva2VuLnRkc1ZlcnNpb247XG5cbiAgICB0aGlzLmxvZ2luQWNrUmVjZWl2ZWQgPSB0cnVlO1xuICB9XG5cbiAgb25Sb3V0aW5nQ2hhbmdlKHRva2VuOiBSb3V0aW5nRW52Q2hhbmdlVG9rZW4pIHtcbiAgICAvLyBTcGxpdHMgaW5zdGFuY2UgbmFtZSBhdHRhY2hlZCB0byB0aGUgcmVkaXJlY3QgdXJsLiBFLmcuLCByZWRpcmVjdC5kYi5uZXRcXGluc3RhbmNlMSAtLT4gW3JlZGlyZWN0LmRiLm5ldCwgaW5zdGFuY2UxXVxuICAgIGNvbnN0IFsgc2VydmVyLCBpbnN0YW5jZSBdID0gdG9rZW4ubmV3VmFsdWUuc2VydmVyLnNwbGl0KCdcXFxcJyk7XG5cbiAgICB0aGlzLnJvdXRpbmdEYXRhID0ge1xuICAgICAgc2VydmVyLCBwb3J0OiB0b2tlbi5uZXdWYWx1ZS5wb3J0LCBpbnN0YW5jZVxuICAgIH07XG4gIH1cblxuICBvbkRvbmVJblByb2ModG9rZW46IERvbmVJblByb2NUb2tlbikge1xuICAgIC8vIERvIG5vdGhpbmdcbiAgfVxuXG4gIG9uRG9uZSh0b2tlbjogRG9uZVRva2VuKSB7XG4gICAgLy8gRG8gbm90aGluZ1xuICB9XG5cbiAgb25QYWNrZXRTaXplQ2hhbmdlKHRva2VuOiBQYWNrZXRTaXplRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24ubWVzc2FnZUlvLnBhY2tldFNpemUodG9rZW4ubmV3VmFsdWUpO1xuICB9XG59XG5cbi8qKlxuICogQSBoYW5kbGVyIGZvciB0b2tlbnMgcmVjZWl2ZWQgaW4gdGhlIHJlc3BvbnNlIG1lc3NhZ2UgdG8gYSBSUEMgUmVxdWVzdCxcbiAqIGEgU1FMIEJhdGNoIFJlcXVlc3QsIGEgQnVsayBMb2FkIEJDUCBSZXF1ZXN0IG9yIGEgVHJhbnNhY3Rpb24gTWFuYWdlciBSZXF1ZXN0LlxuICovXG5leHBvcnQgY2xhc3MgUmVxdWVzdFRva2VuSGFuZGxlciBleHRlbmRzIFRva2VuSGFuZGxlciB7XG4gIGRlY2xhcmUgY29ubmVjdGlvbjogQ29ubmVjdGlvbjtcbiAgZGVjbGFyZSByZXF1ZXN0OiBSZXF1ZXN0IHwgQnVsa0xvYWQ7XG4gIGRlY2xhcmUgZXJyb3JzOiBSZXF1ZXN0RXJyb3JbXTtcblxuICBjb25zdHJ1Y3Rvcihjb25uZWN0aW9uOiBDb25uZWN0aW9uLCByZXF1ZXN0OiBSZXF1ZXN0IHwgQnVsa0xvYWQpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xuICAgIHRoaXMuZXJyb3JzID0gW107XG4gIH1cblxuICBvbkluZm9NZXNzYWdlKHRva2VuOiBJbmZvTWVzc2FnZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2luZm9NZXNzYWdlJywgdG9rZW4pO1xuICB9XG5cbiAgb25FcnJvck1lc3NhZ2UodG9rZW46IEVycm9yTWVzc2FnZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2Vycm9yTWVzc2FnZScsIHRva2VuKTtcblxuICAgIGlmICghdGhpcy5yZXF1ZXN0LmNhbmNlbGVkKSB7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBSZXF1ZXN0RXJyb3IodG9rZW4ubWVzc2FnZSwgJ0VSRVFVRVNUJyk7XG5cbiAgICAgIGVycm9yLm51bWJlciA9IHRva2VuLm51bWJlcjtcbiAgICAgIGVycm9yLnN0YXRlID0gdG9rZW4uc3RhdGU7XG4gICAgICBlcnJvci5jbGFzcyA9IHRva2VuLmNsYXNzO1xuICAgICAgZXJyb3Iuc2VydmVyTmFtZSA9IHRva2VuLnNlcnZlck5hbWU7XG4gICAgICBlcnJvci5wcm9jTmFtZSA9IHRva2VuLnByb2NOYW1lO1xuICAgICAgZXJyb3IubGluZU51bWJlciA9IHRva2VuLmxpbmVOdW1iZXI7XG4gICAgICB0aGlzLmVycm9ycy5wdXNoKGVycm9yKTtcbiAgICAgIHRoaXMucmVxdWVzdC5lcnJvciA9IGVycm9yO1xuICAgICAgaWYgKHRoaXMucmVxdWVzdCBpbnN0YW5jZW9mIFJlcXVlc3QgJiYgdGhpcy5lcnJvcnMubGVuZ3RoID4gMSkge1xuICAgICAgICB0aGlzLnJlcXVlc3QuZXJyb3IgPSBuZXcgQWdncmVnYXRlRXJyb3IodGhpcy5lcnJvcnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uRGF0YWJhc2VDaGFuZ2UodG9rZW46IERhdGFiYXNlRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnZGF0YWJhc2VDaGFuZ2UnLCB0b2tlbi5uZXdWYWx1ZSk7XG4gIH1cblxuICBvbkxhbmd1YWdlQ2hhbmdlKHRva2VuOiBMYW5ndWFnZUVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2xhbmd1YWdlQ2hhbmdlJywgdG9rZW4ubmV3VmFsdWUpO1xuICB9XG5cbiAgb25DaGFyc2V0Q2hhbmdlKHRva2VuOiBDaGFyc2V0RW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnY2hhcnNldENoYW5nZScsIHRva2VuLm5ld1ZhbHVlKTtcbiAgfVxuXG4gIG9uU3FsQ29sbGF0aW9uQ2hhbmdlKHRva2VuOiBDb2xsYXRpb25DaGFuZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5kYXRhYmFzZUNvbGxhdGlvbiA9IHRva2VuLm5ld1ZhbHVlO1xuICB9XG5cbiAgb25QYWNrZXRTaXplQ2hhbmdlKHRva2VuOiBQYWNrZXRTaXplRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24ubWVzc2FnZUlvLnBhY2tldFNpemUodG9rZW4ubmV3VmFsdWUpO1xuICB9XG5cbiAgb25CZWdpblRyYW5zYWN0aW9uKHRva2VuOiBCZWdpblRyYW5zYWN0aW9uRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24udHJhbnNhY3Rpb25EZXNjcmlwdG9ycy5wdXNoKHRva2VuLm5ld1ZhbHVlKTtcbiAgICB0aGlzLmNvbm5lY3Rpb24uaW5UcmFuc2FjdGlvbiA9IHRydWU7XG4gIH1cblxuICBvbkNvbW1pdFRyYW5zYWN0aW9uKHRva2VuOiBDb21taXRUcmFuc2FjdGlvbkVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLnRyYW5zYWN0aW9uRGVzY3JpcHRvcnMubGVuZ3RoID0gMTtcbiAgICB0aGlzLmNvbm5lY3Rpb24uaW5UcmFuc2FjdGlvbiA9IGZhbHNlO1xuICB9XG5cbiAgb25Sb2xsYmFja1RyYW5zYWN0aW9uKHRva2VuOiBSb2xsYmFja1RyYW5zYWN0aW9uRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24udHJhbnNhY3Rpb25EZXNjcmlwdG9ycy5sZW5ndGggPSAxO1xuICAgIC8vIEFuIG91dGVybW9zdCB0cmFuc2FjdGlvbiB3YXMgcm9sbGVkIGJhY2suIFJlc2V0IHRoZSB0cmFuc2FjdGlvbiBjb3VudGVyXG4gICAgdGhpcy5jb25uZWN0aW9uLmluVHJhbnNhY3Rpb24gPSBmYWxzZTtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgncm9sbGJhY2tUcmFuc2FjdGlvbicpO1xuICB9XG5cbiAgb25Db2xNZXRhZGF0YSh0b2tlbjogQ29sTWV0YWRhdGFUb2tlbikge1xuICAgIGlmICghdGhpcy5yZXF1ZXN0LmNhbmNlbGVkKSB7XG4gICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmNvbmZpZy5vcHRpb25zLnVzZUNvbHVtbk5hbWVzKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbnM6IHsgW2tleTogc3RyaW5nXTogQ29sdW1uTWV0YWRhdGEgfSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICAgICAgZm9yIChsZXQgaiA9IDAsIGxlbiA9IHRva2VuLmNvbHVtbnMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHtcbiAgICAgICAgICBjb25zdCBjb2wgPSB0b2tlbi5jb2x1bW5zW2pdO1xuICAgICAgICAgIGlmIChjb2x1bW5zW2NvbC5jb2xOYW1lXSA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb2x1bW5zW2NvbC5jb2xOYW1lXSA9IGNvbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlcXVlc3QuZW1pdCgnY29sdW1uTWV0YWRhdGEnLCBjb2x1bW5zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVxdWVzdC5lbWl0KCdjb2x1bW5NZXRhZGF0YScsIHRva2VuLmNvbHVtbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uT3JkZXIodG9rZW46IE9yZGVyVG9rZW4pIHtcbiAgICBpZiAoIXRoaXMucmVxdWVzdC5jYW5jZWxlZCkge1xuICAgICAgdGhpcy5yZXF1ZXN0LmVtaXQoJ29yZGVyJywgdG9rZW4ub3JkZXJDb2x1bW5zKTtcbiAgICB9XG4gIH1cblxuICBvblJvdyh0b2tlbjogUm93VG9rZW4gfCBOQkNSb3dUb2tlbikge1xuICAgIGlmICghdGhpcy5yZXF1ZXN0LmNhbmNlbGVkKSB7XG4gICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmNvbmZpZy5vcHRpb25zLnJvd0NvbGxlY3Rpb25PblJlcXVlc3RDb21wbGV0aW9uKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdC5yb3dzIS5wdXNoKHRva2VuLmNvbHVtbnMpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmNvbmZpZy5vcHRpb25zLnJvd0NvbGxlY3Rpb25PbkRvbmUpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0LnJzdCEucHVzaCh0b2tlbi5jb2x1bW5zKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZXF1ZXN0LmVtaXQoJ3JvdycsIHRva2VuLmNvbHVtbnMpO1xuICAgIH1cbiAgfVxuXG4gIG9uUmV0dXJuU3RhdHVzKHRva2VuOiBSZXR1cm5TdGF0dXNUb2tlbikge1xuICAgIGlmICghdGhpcy5yZXF1ZXN0LmNhbmNlbGVkKSB7XG4gICAgICAvLyBLZWVwIHZhbHVlIGZvciBwYXNzaW5nIGluICdkb25lUHJvYycgZXZlbnQuXG4gICAgICB0aGlzLmNvbm5lY3Rpb24ucHJvY1JldHVyblN0YXR1c1ZhbHVlID0gdG9rZW4udmFsdWU7XG4gICAgfVxuICB9XG5cbiAgb25SZXR1cm5WYWx1ZSh0b2tlbjogUmV0dXJuVmFsdWVUb2tlbikge1xuICAgIGlmICghdGhpcy5yZXF1ZXN0LmNhbmNlbGVkKSB7XG4gICAgICB0aGlzLnJlcXVlc3QuZW1pdCgncmV0dXJuVmFsdWUnLCB0b2tlbi5wYXJhbU5hbWUsIHRva2VuLnZhbHVlLCB0b2tlbi5tZXRhZGF0YSk7XG4gICAgfVxuICB9XG5cbiAgb25Eb25lUHJvYyh0b2tlbjogRG9uZVByb2NUb2tlbikge1xuICAgIGlmICghdGhpcy5yZXF1ZXN0LmNhbmNlbGVkKSB7XG4gICAgICBpZiAodG9rZW4uc3FsRXJyb3IgJiYgIXRoaXMucmVxdWVzdC5lcnJvcikge1xuICAgICAgICAvLyBjaGVjayBpZiB0aGUgRE9ORV9FUlJPUiBmbGFncyB3YXMgc2V0LCBidXQgYW4gRVJST1IgdG9rZW4gd2FzIG5vdCBzZW50LlxuICAgICAgICB0aGlzLnJlcXVlc3QuZXJyb3IgPSBuZXcgUmVxdWVzdEVycm9yKCdBbiB1bmtub3duIGVycm9yIGhhcyBvY2N1cnJlZC4nLCAnVU5LTk9XTicpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnJlcXVlc3QuZW1pdCgnZG9uZVByb2MnLCB0b2tlbi5yb3dDb3VudCwgdG9rZW4ubW9yZSwgdGhpcy5jb25uZWN0aW9uLnByb2NSZXR1cm5TdGF0dXNWYWx1ZSwgdGhpcy5yZXF1ZXN0LnJzdCk7XG5cbiAgICAgIHRoaXMuY29ubmVjdGlvbi5wcm9jUmV0dXJuU3RhdHVzVmFsdWUgPSB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICh0b2tlbi5yb3dDb3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdC5yb3dDb3VudCEgKz0gdG9rZW4ucm93Q291bnQ7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uY29uZmlnLm9wdGlvbnMucm93Q29sbGVjdGlvbk9uRG9uZSkge1xuICAgICAgICB0aGlzLnJlcXVlc3QucnN0ID0gW107XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25Eb25lSW5Qcm9jKHRva2VuOiBEb25lSW5Qcm9jVG9rZW4pIHtcbiAgICBpZiAoIXRoaXMucmVxdWVzdC5jYW5jZWxlZCkge1xuICAgICAgdGhpcy5yZXF1ZXN0LmVtaXQoJ2RvbmVJblByb2MnLCB0b2tlbi5yb3dDb3VudCwgdG9rZW4ubW9yZSwgdGhpcy5yZXF1ZXN0LnJzdCk7XG5cbiAgICAgIGlmICh0b2tlbi5yb3dDb3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdC5yb3dDb3VudCEgKz0gdG9rZW4ucm93Q291bnQ7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uY29uZmlnLm9wdGlvbnMucm93Q29sbGVjdGlvbk9uRG9uZSkge1xuICAgICAgICB0aGlzLnJlcXVlc3QucnN0ID0gW107XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25Eb25lKHRva2VuOiBEb25lVG9rZW4pIHtcbiAgICBpZiAoIXRoaXMucmVxdWVzdC5jYW5jZWxlZCkge1xuICAgICAgaWYgKHRva2VuLnNxbEVycm9yICYmICF0aGlzLnJlcXVlc3QuZXJyb3IpIHtcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlIERPTkVfRVJST1IgZmxhZ3Mgd2FzIHNldCwgYnV0IGFuIEVSUk9SIHRva2VuIHdhcyBub3Qgc2VudC5cbiAgICAgICAgdGhpcy5yZXF1ZXN0LmVycm9yID0gbmV3IFJlcXVlc3RFcnJvcignQW4gdW5rbm93biBlcnJvciBoYXMgb2NjdXJyZWQuJywgJ1VOS05PV04nKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZXF1ZXN0LmVtaXQoJ2RvbmUnLCB0b2tlbi5yb3dDb3VudCwgdG9rZW4ubW9yZSwgdGhpcy5yZXF1ZXN0LnJzdCk7XG5cbiAgICAgIGlmICh0b2tlbi5yb3dDb3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdC5yb3dDb3VudCEgKz0gdG9rZW4ucm93Q291bnQ7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uY29uZmlnLm9wdGlvbnMucm93Q29sbGVjdGlvbk9uRG9uZSkge1xuICAgICAgICB0aGlzLnJlcXVlc3QucnN0ID0gW107XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25SZXNldENvbm5lY3Rpb24odG9rZW46IFJlc2V0Q29ubmVjdGlvbkVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ3Jlc2V0Q29ubmVjdGlvbicpO1xuICB9XG59XG5cbi8qKlxuICogQSBoYW5kbGVyIGZvciB0aGUgYXR0ZW50aW9uIGFja25vd2xlZGdlbWVudCBtZXNzYWdlLlxuICpcbiAqIFRoaXMgbWVzc2FnZSBvbmx5IGNvbnRhaW5zIGEgYERPTkVgIHRva2VuIHRoYXQgYWNrbm93bGVkZ2VzXG4gKiB0aGF0IHRoZSBhdHRlbnRpb24gbWVzc2FnZSB3YXMgcmVjZWl2ZWQgYnkgdGhlIHNlcnZlci5cbiAqL1xuZXhwb3J0IGNsYXNzIEF0dGVudGlvblRva2VuSGFuZGxlciBleHRlbmRzIFRva2VuSGFuZGxlciB7XG4gIGRlY2xhcmUgY29ubmVjdGlvbjogQ29ubmVjdGlvbjtcbiAgZGVjbGFyZSByZXF1ZXN0OiBSZXF1ZXN0IHwgQnVsa0xvYWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBhbiBhdHRlbnRpb24gYWNrbm93bGVkZ2VtZW50IHdhcyByZWNlaXZlZC5cbiAgICovXG4gIGRlY2xhcmUgYXR0ZW50aW9uUmVjZWl2ZWQ6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoY29ubmVjdGlvbjogQ29ubmVjdGlvbiwgcmVxdWVzdDogUmVxdWVzdCB8IEJ1bGtMb2FkKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcblxuICAgIHRoaXMuYXR0ZW50aW9uUmVjZWl2ZWQgPSBmYWxzZTtcbiAgfVxuXG4gIG9uRG9uZSh0b2tlbjogRG9uZVRva2VuKSB7XG4gICAgaWYgKHRva2VuLmF0dGVudGlvbikge1xuICAgICAgdGhpcy5hdHRlbnRpb25SZWNlaXZlZCA9IHRydWU7XG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLElBQUFBLFFBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUEwRCxTQUFBRCx1QkFBQUcsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtBQWlDbkQsTUFBTUcsb0JBQW9CLFNBQVNDLEtBQUssQ0FBQztFQUM5Q0MsV0FBV0EsQ0FBQ0MsT0FBcUIsRUFBRUMsS0FBWSxFQUFFO0lBQy9DLEtBQUssQ0FBQyxvQkFBb0IsR0FBR0EsS0FBSyxDQUFDQyxJQUFJLEdBQUcsUUFBUSxHQUFHRixPQUFP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
469
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVxdWVzdCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2Vycm9ycyIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIlVuZXhwZWN0ZWRUb2tlbkVycm9yIiwiRXJyb3IiLCJjb25zdHJ1Y3RvciIsImhhbmRsZXIiLCJ0b2tlbiIsIm5hbWUiLCJleHBvcnRzIiwidGRzNzFEZXByZWNhdGlvbldhcm5pbmciLCJlbWl0dGVkIiwiZW1pdCIsInByb2Nlc3MiLCJlbWl0V2FybmluZyIsInR5cGUiLCJjb2RlIiwiVG9rZW5IYW5kbGVyIiwib25JbmZvTWVzc2FnZSIsIm9uRXJyb3JNZXNzYWdlIiwib25TU1BJIiwib25EYXRhYmFzZUNoYW5nZSIsIm9uTGFuZ3VhZ2VDaGFuZ2UiLCJvbkNoYXJzZXRDaGFuZ2UiLCJvblNxbENvbGxhdGlvbkNoYW5nZSIsIm9uUm91dGluZ0NoYW5nZSIsIm9uUGFja2V0U2l6ZUNoYW5nZSIsIm9uUmVzZXRDb25uZWN0aW9uIiwib25CZWdpblRyYW5zYWN0aW9uIiwib25Db21taXRUcmFuc2FjdGlvbiIsIm9uUm9sbGJhY2tUcmFuc2FjdGlvbiIsIm9uRmVkQXV0aEluZm8iLCJvbkZlYXR1cmVFeHRBY2siLCJvbkxvZ2luQWNrIiwib25Db2xNZXRhZGF0YSIsIm9uT3JkZXIiLCJvblJvdyIsIm9uUmV0dXJuU3RhdHVzIiwib25SZXR1cm5WYWx1ZSIsIm9uRG9uZVByb2MiLCJvbkRvbmVJblByb2MiLCJvbkRvbmUiLCJvbkRhdGFiYXNlTWlycm9yaW5nUGFydG5lciIsIkluaXRpYWxTcWxUb2tlbkhhbmRsZXIiLCJjb25uZWN0aW9uIiwibmV3VmFsdWUiLCJkYXRhYmFzZUNvbGxhdGlvbiIsIm1lc3NhZ2VJbyIsInBhY2tldFNpemUiLCJ0cmFuc2FjdGlvbkRlc2NyaXB0b3JzIiwicHVzaCIsImluVHJhbnNhY3Rpb24iLCJsZW5ndGgiLCJjbG9zZSIsIkxvZ2luN1Rva2VuSGFuZGxlciIsImxvZ2luQWNrUmVjZWl2ZWQiLCJsb2dpbkVycm9yIiwidW5kZWZpbmVkIiwiZXJyb3IiLCJDb25uZWN0aW9uRXJyb3IiLCJtZXNzYWdlIiwiaXNMb2dpbkVycm9yVHJhbnNpZW50IiwidHJhbnNpZW50RXJyb3JMb29rdXAiLCJpc1RyYW5zaWVudEVycm9yIiwibnVtYmVyIiwiY3VyVHJhbnNpZW50UmV0cnlDb3VudCIsImNvbmZpZyIsIm9wdGlvbnMiLCJtYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnMiLCJpc1RyYW5zaWVudCIsIm50bG1wYWNrZXQiLCJudGxtcGFja2V0QnVmZmVyIiwiZmVkQXV0aEluZm9Ub2tlbiIsImF1dGhlbnRpY2F0aW9uIiwiZmVkQXV0aCIsInV0ZjhTdXBwb3J0IiwidGRzVmVyc2lvbiIsImludGVyZmFjZSIsInNlcnZlciIsImluc3RhbmNlIiwic3BsaXQiLCJyb3V0aW5nRGF0YSIsInBvcnQiLCJSZXF1ZXN0VG9rZW5IYW5kbGVyIiwicmVxdWVzdCIsImVycm9ycyIsImNhbmNlbGVkIiwiUmVxdWVzdEVycm9yIiwic3RhdGUiLCJjbGFzcyIsInNlcnZlck5hbWUiLCJwcm9jTmFtZSIsImxpbmVOdW1iZXIiLCJSZXF1ZXN0IiwiQWdncmVnYXRlRXJyb3IiLCJ1c2VDb2x1bW5OYW1lcyIsImNvbHVtbnMiLCJPYmplY3QiLCJjcmVhdGUiLCJqIiwibGVuIiwiY29sIiwiY29sTmFtZSIsIm9yZGVyQ29sdW1ucyIsInJvd0NvbGxlY3Rpb25PblJlcXVlc3RDb21wbGV0aW9uIiwicm93cyIsInJvd0NvbGxlY3Rpb25PbkRvbmUiLCJyc3QiLCJwcm9jUmV0dXJuU3RhdHVzVmFsdWUiLCJ2YWx1ZSIsInBhcmFtTmFtZSIsIm1ldGFkYXRhIiwic3FsRXJyb3IiLCJyb3dDb3VudCIsIm1vcmUiLCJBdHRlbnRpb25Ub2tlbkhhbmRsZXIiLCJhdHRlbnRpb25SZWNlaXZlZCIsImF0dGVudGlvbiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b2tlbi9oYW5kbGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBDb25uZWN0aW9uIGZyb20gJy4uL2Nvbm5lY3Rpb24nO1xuaW1wb3J0IFJlcXVlc3QgZnJvbSAnLi4vcmVxdWVzdCc7XG5pbXBvcnQgeyBDb25uZWN0aW9uRXJyb3IsIFJlcXVlc3RFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyB0eXBlIENvbHVtbk1ldGFkYXRhIH0gZnJvbSAnLi9jb2xtZXRhZGF0YS10b2tlbi1wYXJzZXInO1xuaW1wb3J0IHtcbiAgQmVnaW5UcmFuc2FjdGlvbkVudkNoYW5nZVRva2VuLFxuICBDaGFyc2V0RW52Q2hhbmdlVG9rZW4sXG4gIENvbGxhdGlvbkNoYW5nZVRva2VuLFxuICBDb2xNZXRhZGF0YVRva2VuLFxuICBDb21taXRUcmFuc2FjdGlvbkVudkNoYW5nZVRva2VuLFxuICBEYXRhYmFzZUVudkNoYW5nZVRva2VuLFxuICBEYXRhYmFzZU1pcnJvcmluZ1BhcnRuZXJFbnZDaGFuZ2VUb2tlbixcbiAgRG9uZUluUHJvY1Rva2VuLFxuICBEb25lUHJvY1Rva2VuLFxuICBEb25lVG9rZW4sXG4gIEVycm9yTWVzc2FnZVRva2VuLFxuICBGZWF0dXJlRXh0QWNrVG9rZW4sXG4gIEZlZEF1dGhJbmZvVG9rZW4sXG4gIEluZm9NZXNzYWdlVG9rZW4sXG4gIExhbmd1YWdlRW52Q2hhbmdlVG9rZW4sXG4gIExvZ2luQWNrVG9rZW4sXG4gIE5CQ1Jvd1Rva2VuLFxuICBPcmRlclRva2VuLFxuICBQYWNrZXRTaXplRW52Q2hhbmdlVG9rZW4sXG4gIFJlc2V0Q29ubmVjdGlvbkVudkNoYW5nZVRva2VuLFxuICBSZXR1cm5TdGF0dXNUb2tlbixcbiAgUmV0dXJuVmFsdWVUb2tlbixcbiAgUm9sbGJhY2tUcmFuc2FjdGlvbkVudkNoYW5nZVRva2VuLFxuICBSb3V0aW5nRW52Q2hhbmdlVG9rZW4sXG4gIFJvd1Rva2VuLFxuICBTU1BJVG9rZW4sXG4gIFRva2VuXG59IGZyb20gJy4vdG9rZW4nO1xuaW1wb3J0IEJ1bGtMb2FkIGZyb20gJy4uL2J1bGstbG9hZCc7XG5cbmV4cG9ydCBjbGFzcyBVbmV4cGVjdGVkVG9rZW5FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoaGFuZGxlcjogVG9rZW5IYW5kbGVyLCB0b2tlbjogVG9rZW4pIHtcbiAgICBzdXBlcignVW5leHBlY3RlZCB0b2tlbiBgJyArIHRva2VuLm5hbWUgKyAnYCBpbiBgJyArIGhhbmRsZXIuY29uc3RydWN0b3IubmFtZSArICdgJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBFbWl0cyBhIHdhcm5pbmcgKG9uY2UgcGVyIHByb2Nlc3MpIHdoZW4gYSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkXG4gKiB1c2luZyBURFMgNy4xLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjb25zdCB0ZHM3MURlcHJlY2F0aW9uV2FybmluZyA9IHtcbiAgZW1pdHRlZDogZmFsc2UsXG5cbiAgZW1pdCgpIHtcbiAgICBpZiAodGhpcy5lbWl0dGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZW1pdHRlZCA9IHRydWU7XG5cbiAgICBwcm9jZXNzLmVtaXRXYXJuaW5nKFxuICAgICAgJ1N1cHBvcnQgZm9yIFREUyA3LjEgKHVzZWQgYnkgU1FMIFNlcnZlciAyMDAwKSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiBgdGVkaW91c2AuJyxcbiAgICAgIHsgdHlwZTogJ0RlcHJlY2F0aW9uV2FybmluZycsIGNvZGU6ICdURURJT1VTX0RFUF9URFM3MScgfVxuICAgICk7XG4gIH1cbn07XG5cbmV4cG9ydCBjbGFzcyBUb2tlbkhhbmRsZXIge1xuICBvbkluZm9NZXNzYWdlKHRva2VuOiBJbmZvTWVzc2FnZVRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uRXJyb3JNZXNzYWdlKHRva2VuOiBFcnJvck1lc3NhZ2VUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvblNTUEkodG9rZW46IFNTUElUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvbkRhdGFiYXNlQ2hhbmdlKHRva2VuOiBEYXRhYmFzZUVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uTGFuZ3VhZ2VDaGFuZ2UodG9rZW46IExhbmd1YWdlRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25DaGFyc2V0Q2hhbmdlKHRva2VuOiBDaGFyc2V0RW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25TcWxDb2xsYXRpb25DaGFuZ2UodG9rZW46IENvbGxhdGlvbkNoYW5nZVRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uUm91dGluZ0NoYW5nZSh0b2tlbjogUm91dGluZ0VudkNoYW5nZVRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uUGFja2V0U2l6ZUNoYW5nZSh0b2tlbjogUGFja2V0U2l6ZUVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uUmVzZXRDb25uZWN0aW9uKHRva2VuOiBSZXNldENvbm5lY3Rpb25FbnZDaGFuZ2VUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvbkJlZ2luVHJhbnNhY3Rpb24odG9rZW46IEJlZ2luVHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvbkNvbW1pdFRyYW5zYWN0aW9uKHRva2VuOiBDb21taXRUcmFuc2FjdGlvbkVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uUm9sbGJhY2tUcmFuc2FjdGlvbih0b2tlbjogUm9sbGJhY2tUcmFuc2FjdGlvbkVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uRmVkQXV0aEluZm8odG9rZW46IEZlZEF1dGhJbmZvVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25GZWF0dXJlRXh0QWNrKHRva2VuOiBGZWF0dXJlRXh0QWNrVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25Mb2dpbkFjayh0b2tlbjogTG9naW5BY2tUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvbkNvbE1ldGFkYXRhKHRva2VuOiBDb2xNZXRhZGF0YVRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uT3JkZXIodG9rZW46IE9yZGVyVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25Sb3codG9rZW46IFJvd1Rva2VuIHwgTkJDUm93VG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25SZXR1cm5TdGF0dXModG9rZW46IFJldHVyblN0YXR1c1Rva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uUmV0dXJuVmFsdWUodG9rZW46IFJldHVyblZhbHVlVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25Eb25lUHJvYyh0b2tlbjogRG9uZVByb2NUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvbkRvbmVJblByb2ModG9rZW46IERvbmVJblByb2NUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvbkRvbmUodG9rZW46IERvbmVUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvbkRhdGFiYXNlTWlycm9yaW5nUGFydG5lcih0b2tlbjogRGF0YWJhc2VNaXJyb3JpbmdQYXJ0bmVyRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG59XG5cbi8qKlxuICogQSBoYW5kbGVyIGZvciB0b2tlbnMgcmVjZWl2ZWQgaW4gdGhlIHJlc3BvbnNlIG1lc3NhZ2UgdG8gdGhlIGluaXRpYWwgU1FMIEJhdGNoIHJlcXVlc3RcbiAqIHRoYXQgc2V0cyB1cCBkaWZmZXJlbnQgY29ubmVjdGlvbiBzZXR0aW5ncy5cbiAqL1xuZXhwb3J0IGNsYXNzIEluaXRpYWxTcWxUb2tlbkhhbmRsZXIgZXh0ZW5kcyBUb2tlbkhhbmRsZXIge1xuICBkZWNsYXJlIGNvbm5lY3Rpb246IENvbm5lY3Rpb247XG5cbiAgY29uc3RydWN0b3IoY29ubmVjdGlvbjogQ29ubmVjdGlvbikge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICB9XG5cbiAgb25JbmZvTWVzc2FnZSh0b2tlbjogSW5mb01lc3NhZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5lbWl0KCdpbmZvTWVzc2FnZScsIHRva2VuKTtcbiAgfVxuXG4gIG9uRXJyb3JNZXNzYWdlKHRva2VuOiBFcnJvck1lc3NhZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5lbWl0KCdlcnJvck1lc3NhZ2UnLCB0b2tlbik7XG4gIH1cblxuICBvbkRhdGFiYXNlQ2hhbmdlKHRva2VuOiBEYXRhYmFzZUVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2RhdGFiYXNlQ2hhbmdlJywgdG9rZW4ubmV3VmFsdWUpO1xuICB9XG5cbiAgb25MYW5ndWFnZUNoYW5nZSh0b2tlbjogTGFuZ3VhZ2VFbnZDaGFuZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5lbWl0KCdsYW5ndWFnZUNoYW5nZScsIHRva2VuLm5ld1ZhbHVlKTtcbiAgfVxuXG4gIG9uQ2hhcnNldENoYW5nZSh0b2tlbjogQ2hhcnNldEVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2NoYXJzZXRDaGFuZ2UnLCB0b2tlbi5uZXdWYWx1ZSk7XG4gIH1cblxuICBvblNxbENvbGxhdGlvbkNoYW5nZSh0b2tlbjogQ29sbGF0aW9uQ2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZGF0YWJhc2VDb2xsYXRpb24gPSB0b2tlbi5uZXdWYWx1ZTtcbiAgfVxuXG4gIG9uUGFja2V0U2l6ZUNoYW5nZSh0b2tlbjogUGFja2V0U2l6ZUVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLm1lc3NhZ2VJby5wYWNrZXRTaXplKHRva2VuLm5ld1ZhbHVlKTtcbiAgfVxuXG4gIG9uQmVnaW5UcmFuc2FjdGlvbih0b2tlbjogQmVnaW5UcmFuc2FjdGlvbkVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLnRyYW5zYWN0aW9uRGVzY3JpcHRvcnMucHVzaCh0b2tlbi5uZXdWYWx1ZSk7XG4gICAgdGhpcy5jb25uZWN0aW9uLmluVHJhbnNhY3Rpb24gPSB0cnVlO1xuICB9XG5cbiAgb25Db21taXRUcmFuc2FjdGlvbih0b2tlbjogQ29tbWl0VHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi50cmFuc2FjdGlvbkRlc2NyaXB0b3JzLmxlbmd0aCA9IDE7XG4gICAgdGhpcy5jb25uZWN0aW9uLmluVHJhbnNhY3Rpb24gPSBmYWxzZTtcbiAgfVxuXG4gIG9uUm9sbGJhY2tUcmFuc2FjdGlvbih0b2tlbjogUm9sbGJhY2tUcmFuc2FjdGlvbkVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLnRyYW5zYWN0aW9uRGVzY3JpcHRvcnMubGVuZ3RoID0gMTtcbiAgICAvLyBBbiBvdXRlcm1vc3QgdHJhbnNhY3Rpb24gd2FzIHJvbGxlZCBiYWNrLiBSZXNldCB0aGUgdHJhbnNhY3Rpb24gY291bnRlclxuICAgIHRoaXMuY29ubmVjdGlvbi5pblRyYW5zYWN0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ3JvbGxiYWNrVHJhbnNhY3Rpb24nKTtcbiAgfVxuXG4gIG9uQ29sTWV0YWRhdGEodG9rZW46IENvbE1ldGFkYXRhVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoXCJSZWNlaXZlZCAnY29sdW1uTWV0YWRhdGEnIHdoZW4gbm8gc3FsUmVxdWVzdCBpcyBpbiBwcm9ncmVzc1wiKSk7XG4gICAgdGhpcy5jb25uZWN0aW9uLmNsb3NlKCk7XG4gIH1cblxuICBvbk9yZGVyKHRva2VuOiBPcmRlclRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKFwiUmVjZWl2ZWQgJ29yZGVyJyB3aGVuIG5vIHNxbFJlcXVlc3QgaXMgaW4gcHJvZ3Jlc3NcIikpO1xuICAgIHRoaXMuY29ubmVjdGlvbi5jbG9zZSgpO1xuICB9XG5cbiAgb25Sb3codG9rZW46IFJvd1Rva2VuIHwgTkJDUm93VG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoXCJSZWNlaXZlZCAncm93JyB3aGVuIG5vIHNxbFJlcXVlc3QgaXMgaW4gcHJvZ3Jlc3NcIikpO1xuICAgIHRoaXMuY29ubmVjdGlvbi5jbG9zZSgpO1xuICB9XG5cbiAgb25SZXR1cm5TdGF0dXModG9rZW46IFJldHVyblN0YXR1c1Rva2VuKSB7XG4gICAgLy8gRG8gbm90aGluZ1xuICB9XG5cbiAgb25SZXR1cm5WYWx1ZSh0b2tlbjogUmV0dXJuVmFsdWVUb2tlbikge1xuICAgIC8vIERvIG5vdGhpbmdcbiAgfVxuXG4gIG9uRG9uZVByb2ModG9rZW46IERvbmVQcm9jVG9rZW4pIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH1cblxuICBvbkRvbmVJblByb2ModG9rZW46IERvbmVJblByb2NUb2tlbikge1xuICAgIC8vIERvIG5vdGhpbmdcbiAgfVxuXG4gIG9uRG9uZSh0b2tlbjogRG9uZVRva2VuKSB7XG4gICAgLy8gRG8gbm90aGluZ1xuICB9XG5cbiAgb25SZXNldENvbm5lY3Rpb24odG9rZW46IFJlc2V0Q29ubmVjdGlvbkVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ3Jlc2V0Q29ubmVjdGlvbicpO1xuICB9XG59XG5cbi8qKlxuICogQSBoYW5kbGVyIGZvciB0b2tlbnMgcmVjZWl2ZWQgaW4gdGhlIHJlc3BvbnNlIG1lc3NhZ2UgdG8gYSBMb2dpbjcgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGNsYXNzIExvZ2luN1Rva2VuSGFuZGxlciBleHRlbmRzIFRva2VuSGFuZGxlciB7XG4gIGRlY2xhcmUgY29ubmVjdGlvbjogQ29ubmVjdGlvbjtcblxuICBkZWNsYXJlIGZlZEF1dGhJbmZvVG9rZW46IEZlZEF1dGhJbmZvVG9rZW4gfCB1bmRlZmluZWQ7XG4gIGRlY2xhcmUgcm91dGluZ0RhdGE6IHsgc2VydmVyOiBzdHJpbmcsIHBvcnQ6IG51bWJlciwgaW5zdGFuY2U6IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuXG4gIGRlY2xhcmUgbG9naW5BY2tSZWNlaXZlZDogYm9vbGVhbjtcblxuICBkZWNsYXJlIGxvZ2luRXJyb3I6IENvbm5lY3Rpb25FcnJvciB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcihjb25uZWN0aW9uOiBDb25uZWN0aW9uKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmxvZ2luQWNrUmVjZWl2ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgIHRoaXMubG9naW5FcnJvciA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIG9uSW5mb01lc3NhZ2UodG9rZW46IEluZm9NZXNzYWdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnaW5mb01lc3NhZ2UnLCB0b2tlbik7XG4gIH1cblxuICBvbkVycm9yTWVzc2FnZSh0b2tlbjogRXJyb3JNZXNzYWdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnZXJyb3JNZXNzYWdlJywgdG9rZW4pO1xuXG4gICAgY29uc3QgZXJyb3IgPSBuZXcgQ29ubmVjdGlvbkVycm9yKHRva2VuLm1lc3NhZ2UsICdFTE9HSU4nKTtcblxuICAgIGNvbnN0IGlzTG9naW5FcnJvclRyYW5zaWVudCA9IHRoaXMuY29ubmVjdGlvbi50cmFuc2llbnRFcnJvckxvb2t1cC5pc1RyYW5zaWVudEVycm9yKHRva2VuLm51bWJlcik7XG4gICAgaWYgKGlzTG9naW5FcnJvclRyYW5zaWVudCAmJiB0aGlzLmNvbm5lY3Rpb24uY3VyVHJhbnNpZW50UmV0cnlDb3VudCAhPT0gdGhpcy5jb25uZWN0aW9uLmNvbmZpZy5vcHRpb25zLm1heFJldHJpZXNPblRyYW5zaWVudEVycm9ycykge1xuICAgICAgZXJyb3IuaXNUcmFuc2llbnQgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMubG9naW5FcnJvciA9IGVycm9yO1xuICB9XG5cbiAgb25TU1BJKHRva2VuOiBTU1BJVG9rZW4pIHtcbiAgICBpZiAodG9rZW4ubnRsbXBhY2tldCkge1xuICAgICAgdGhpcy5jb25uZWN0aW9uLm50bG1wYWNrZXQgPSB0b2tlbi5udGxtcGFja2V0O1xuICAgICAgdGhpcy5jb25uZWN0aW9uLm50bG1wYWNrZXRCdWZmZXIgPSB0b2tlbi5udGxtcGFja2V0QnVmZmVyO1xuICAgIH1cbiAgfVxuXG4gIG9uRGF0YWJhc2VDaGFuZ2UodG9rZW46IERhdGFiYXNlRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnZGF0YWJhc2VDaGFuZ2UnLCB0b2tlbi5uZXdWYWx1ZSk7XG4gIH1cblxuICBvbkRhdGFiYXNlTWlycm9yaW5nUGFydG5lcih0b2tlbjogRGF0YWJhc2VNaXJyb3JpbmdQYXJ0bmVyRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnZGF0YWJhc2VNaXJyb3JpbmdQYXJ0bmVyJywgdG9rZW4ubmV3VmFsdWUpO1xuICB9XG5cbiAgb25MYW5ndWFnZUNoYW5nZSh0b2tlbjogTGFuZ3VhZ2VFbnZDaGFuZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5lbWl0KCdsYW5ndWFnZUNoYW5nZScsIHRva2VuLm5ld1ZhbHVlKTtcbiAgfVxuXG4gIG9uQ2hhcnNldENoYW5nZSh0b2tlbjogQ2hhcnNldEVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2NoYXJzZXRDaGFuZ2UnLCB0b2tlbi5uZXdWYWx1ZSk7XG4gIH1cblxuICBvblNxbENvbGxhdGlvbkNoYW5nZSh0b2tlbjogQ29sbGF0aW9uQ2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZGF0YWJhc2VDb2xsYXRpb24gPSB0b2tlbi5uZXdWYWx1ZTtcbiAgfVxuXG4gIG9uRmVkQXV0aEluZm8odG9rZW46IEZlZEF1dGhJbmZvVG9rZW4pIHtcbiAgICB0aGlzLmZlZEF1dGhJbmZvVG9rZW4gPSB0b2tlbjtcbiAgfVxuXG4gIG9uRmVhdHVyZUV4dEFjayh0b2tlbjogRmVhdHVyZUV4dEFja1Rva2VuKSB7XG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGlvbiB9ID0gdGhpcy5jb25uZWN0aW9uLmNvbmZpZztcblxuICAgIGlmIChhdXRoZW50aWNhdGlvbi50eXBlID09PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1wYXNzd29yZCcgfHwgYXV0aGVudGljYXRpb24udHlwZSA9PT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktYWNjZXNzLXRva2VuJyB8fCBhdXRoZW50aWNhdGlvbi50eXBlID09PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktdm0nIHx8IGF1dGhlbnRpY2F0aW9uLnR5cGUgPT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS1hcHAtc2VydmljZScgfHwgYXV0aGVudGljYXRpb24udHlwZSA9PT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3Rvcnktc2VydmljZS1wcmluY2lwYWwtc2VjcmV0JyB8fCBhdXRoZW50aWNhdGlvbi50eXBlID09PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1kZWZhdWx0Jykge1xuICAgICAgaWYgKHRva2VuLmZlZEF1dGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZ2luRXJyb3IgPSBuZXcgQ29ubmVjdGlvbkVycm9yKCdEaWQgbm90IHJlY2VpdmUgQWN0aXZlIERpcmVjdG9yeSBhdXRoZW50aWNhdGlvbiBhY2tub3dsZWRnZW1lbnQnKTtcbiAgICAgIH0gZWxzZSBpZiAodG9rZW4uZmVkQXV0aC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgdGhpcy5sb2dpbkVycm9yID0gbmV3IENvbm5lY3Rpb25FcnJvcihgQWN0aXZlIERpcmVjdG9yeSBhdXRoZW50aWNhdGlvbiBhY2tub3dsZWRnbWVudCBmb3IgJHthdXRoZW50aWNhdGlvbi50eXBlfSBhdXRoZW50aWNhdGlvbiBtZXRob2QgaW5jbHVkZXMgZXh0cmEgZGF0YWApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodG9rZW4uZmVkQXV0aCA9PT0gdW5kZWZpbmVkICYmIHRva2VuLnV0ZjhTdXBwb3J0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9naW5FcnJvciA9IG5ldyBDb25uZWN0aW9uRXJyb3IoJ1JlY2VpdmVkIGFja25vd2xlZGdlbWVudCBmb3IgdW5rbm93biBmZWF0dXJlJyk7XG4gICAgfSBlbHNlIGlmICh0b2tlbi5mZWRBdXRoKSB7XG4gICAgICB0aGlzLmxvZ2luRXJyb3IgPSBuZXcgQ29ubmVjdGlvbkVycm9yKCdEaWQgbm90IHJlcXVlc3QgQWN0aXZlIERpcmVjdG9yeSBhdXRoZW50aWNhdGlvbiwgYnV0IHJlY2VpdmVkIHRoZSBhY2tub3dsZWRnbWVudCcpO1xuICAgIH1cbiAgfVxuXG4gIG9uTG9naW5BY2sodG9rZW46IExvZ2luQWNrVG9rZW4pIHtcbiAgICBpZiAoIXRva2VuLnRkc1ZlcnNpb24pIHtcbiAgICAgIC8vIHVuc3VwcG9ydGVkIFREUyB2ZXJzaW9uXG4gICAgICB0aGlzLmxvZ2luRXJyb3IgPSBuZXcgQ29ubmVjdGlvbkVycm9yKCdTZXJ2ZXIgcmVzcG9uZGVkIHdpdGggdW5rbm93biBURFMgdmVyc2lvbi4nLCAnRVREUycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdG9rZW4uaW50ZXJmYWNlKSB7XG4gICAgICAvLyB1bnN1cHBvcnRlZCBpbnRlcmZhY2VcbiAgICAgIHRoaXMubG9naW5FcnJvciA9IG5ldyBDb25uZWN0aW9uRXJyb3IoJ1NlcnZlciByZXNwb25kZWQgd2l0aCB1bnN1cHBvcnRlZCBpbnRlcmZhY2UuJywgJ0VJTlRFUkZBQ0VOT1RTVVBQJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gdXNlIG5lZ290aWF0ZWQgdmVyc2lvblxuICAgIHRoaXMuY29ubmVjdGlvbi5jb25maWcub3B0aW9ucy50ZHNWZXJzaW9uID0gdG9rZW4udGRzVmVyc2lvbjtcblxuICAgIGlmICh0b2tlbi50ZHNWZXJzaW9uIDwgJzdfMicpIHtcbiAgICAgIHRkczcxRGVwcmVjYXRpb25XYXJuaW5nLmVtaXQoKTtcbiAgICB9XG5cbiAgICB0aGlzLmxvZ2luQWNrUmVjZWl2ZWQgPSB0cnVlO1xuICB9XG5cbiAgb25Sb3V0aW5nQ2hhbmdlKHRva2VuOiBSb3V0aW5nRW52Q2hhbmdlVG9rZW4pIHtcbiAgICAvLyBTcGxpdHMgaW5zdGFuY2UgbmFtZSBhdHRhY2hlZCB0byB0aGUgcmVkaXJlY3QgdXJsLiBFLmcuLCByZWRpcmVjdC5kYi5uZXRcXGluc3RhbmNlMSAtLT4gW3JlZGlyZWN0LmRiLm5ldCwgaW5zdGFuY2UxXVxuICAgIGNvbnN0IFsgc2VydmVyLCBpbnN0YW5jZSBdID0gdG9rZW4ubmV3VmFsdWUuc2VydmVyLnNwbGl0KCdcXFxcJyk7XG5cbiAgICB0aGlzLnJvdXRpbmdEYXRhID0ge1xuICAgICAgc2VydmVyLCBwb3J0OiB0b2tlbi5uZXdWYWx1ZS5wb3J0LCBpbnN0YW5jZVxuICAgIH07XG4gIH1cblxuICBvbkRvbmVJblByb2ModG9rZW46IERvbmVJblByb2NUb2tlbikge1xuICAgIC8vIERvIG5vdGhpbmdcbiAgfVxuXG4gIG9uRG9uZSh0b2tlbjogRG9uZVRva2VuKSB7XG4gICAgLy8gRG8gbm90aGluZ1xuICB9XG5cbiAgb25QYWNrZXRTaXplQ2hhbmdlKHRva2VuOiBQYWNrZXRTaXplRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24ubWVzc2FnZUlvLnBhY2tldFNpemUodG9rZW4ubmV3VmFsdWUpO1xuICB9XG59XG5cbi8qKlxuICogQSBoYW5kbGVyIGZvciB0b2tlbnMgcmVjZWl2ZWQgaW4gdGhlIHJlc3BvbnNlIG1lc3NhZ2UgdG8gYSBSUEMgUmVxdWVzdCxcbiAqIGEgU1FMIEJhdGNoIFJlcXVlc3QsIGEgQnVsayBMb2FkIEJDUCBSZXF1ZXN0IG9yIGEgVHJhbnNhY3Rpb24gTWFuYWdlciBSZXF1ZXN0LlxuICovXG5leHBvcnQgY2xhc3MgUmVxdWVzdFRva2VuSGFuZGxlciBleHRlbmRzIFRva2VuSGFuZGxlciB7XG4gIGRlY2xhcmUgY29ubmVjdGlvbjogQ29ubmVjdGlvbjtcbiAgZGVjbGFyZSByZXF1ZXN0OiBSZXF1ZXN0IHwgQnVsa0xvYWQ7XG4gIGRlY2xhcmUgZXJyb3JzOiBSZXF1ZXN0RXJyb3JbXTtcblxuICBjb25zdHJ1Y3Rvcihjb25uZWN0aW9uOiBDb25uZWN0aW9uLCByZXF1ZXN0OiBSZXF1ZXN0IHwgQnVsa0xvYWQpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xuICAgIHRoaXMuZXJyb3JzID0gW107XG4gIH1cblxuICBvbkluZm9NZXNzYWdlKHRva2VuOiBJbmZvTWVzc2FnZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2luZm9NZXNzYWdlJywgdG9rZW4pO1xuICB9XG5cbiAgb25FcnJvck1lc3NhZ2UodG9rZW46IEVycm9yTWVzc2FnZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2Vycm9yTWVzc2FnZScsIHRva2VuKTtcblxuICAgIGlmICghdGhpcy5yZXF1ZXN0LmNhbmNlbGVkKSB7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBSZXF1ZXN0RXJyb3IodG9rZW4ubWVzc2FnZSwgJ0VSRVFVRVNUJyk7XG5cbiAgICAgIGVycm9yLm51bWJlciA9IHRva2VuLm51bWJlcjtcbiAgICAgIGVycm9yLnN0YXRlID0gdG9rZW4uc3RhdGU7XG4gICAgICBlcnJvci5jbGFzcyA9IHRva2VuLmNsYXNzO1xuICAgICAgZXJyb3Iuc2VydmVyTmFtZSA9IHRva2VuLnNlcnZlck5hbWU7XG4gICAgICBlcnJvci5wcm9jTmFtZSA9IHRva2VuLnByb2NOYW1lO1xuICAgICAgZXJyb3IubGluZU51bWJlciA9IHRva2VuLmxpbmVOdW1iZXI7XG4gICAgICB0aGlzLmVycm9ycy5wdXNoKGVycm9yKTtcbiAgICAgIHRoaXMucmVxdWVzdC5lcnJvciA9IGVycm9yO1xuICAgICAgaWYgKHRoaXMucmVxdWVzdCBpbnN0YW5jZW9mIFJlcXVlc3QgJiYgdGhpcy5lcnJvcnMubGVuZ3RoID4gMSkge1xuICAgICAgICB0aGlzLnJlcXVlc3QuZXJyb3IgPSBuZXcgQWdncmVnYXRlRXJyb3IodGhpcy5lcnJvcnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uRGF0YWJhc2VDaGFuZ2UodG9rZW46IERhdGFiYXNlRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnZGF0YWJhc2VDaGFuZ2UnLCB0b2tlbi5uZXdWYWx1ZSk7XG4gIH1cblxuICBvbkxhbmd1YWdlQ2hhbmdlKHRva2VuOiBMYW5ndWFnZUVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2xhbmd1YWdlQ2hhbmdlJywgdG9rZW4ubmV3VmFsdWUpO1xuICB9XG5cbiAgb25DaGFyc2V0Q2hhbmdlKHRva2VuOiBDaGFyc2V0RW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnY2hhcnNldENoYW5nZScsIHRva2VuLm5ld1ZhbHVlKTtcbiAgfVxuXG4gIG9uU3FsQ29sbGF0aW9uQ2hhbmdlKHRva2VuOiBDb2xsYXRpb25DaGFuZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5kYXRhYmFzZUNvbGxhdGlvbiA9IHRva2VuLm5ld1ZhbHVlO1xuICB9XG5cbiAgb25QYWNrZXRTaXplQ2hhbmdlKHRva2VuOiBQYWNrZXRTaXplRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24ubWVzc2FnZUlvLnBhY2tldFNpemUodG9rZW4ubmV3VmFsdWUpO1xuICB9XG5cbiAgb25CZWdpblRyYW5zYWN0aW9uKHRva2VuOiBCZWdpblRyYW5zYWN0aW9uRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24udHJhbnNhY3Rpb25EZXNjcmlwdG9ycy5wdXNoKHRva2VuLm5ld1ZhbHVlKTtcbiAgICB0aGlzLmNvbm5lY3Rpb24uaW5UcmFuc2FjdGlvbiA9IHRydWU7XG4gIH1cblxuICBvbkNvbW1pdFRyYW5zYWN0aW9uKHRva2VuOiBDb21taXRUcmFuc2FjdGlvbkVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLnRyYW5zYWN0aW9uRGVzY3JpcHRvcnMubGVuZ3RoID0gMTtcbiAgICB0aGlzLmNvbm5lY3Rpb24uaW5UcmFuc2FjdGlvbiA9IGZhbHNlO1xuICB9XG5cbiAgb25Sb2xsYmFja1RyYW5zYWN0aW9uKHRva2VuOiBSb2xsYmFja1RyYW5zYWN0aW9uRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24udHJhbnNhY3Rpb25EZXNjcmlwdG9ycy5sZW5ndGggPSAxO1xuICAgIC8vIEFuIG91dGVybW9zdCB0cmFuc2FjdGlvbiB3YXMgcm9sbGVkIGJhY2suIFJlc2V0IHRoZSB0cmFuc2FjdGlvbiBjb3VudGVyXG4gICAgdGhpcy5jb25uZWN0aW9uLmluVHJhbnNhY3Rpb24gPSBmYWxzZTtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgncm9sbGJhY2tUcmFuc2FjdGlvbicpO1xuICB9XG5cbiAgb25Db2xNZXRhZGF0YSh0b2tlbjogQ29sTWV0YWRhdGFUb2tlbikge1xuICAgIGlmICghdGhpcy5yZXF1ZXN0LmNhbmNlbGVkKSB7XG4gICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmNvbmZpZy5vcHRpb25zLnVzZUNvbHVtbk5hbWVzKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbnM6IHsgW2tleTogc3RyaW5nXTogQ29sdW1uTWV0YWRhdGEgfSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICAgICAgZm9yIChsZXQgaiA9IDAsIGxlbiA9IHRva2VuLmNvbHVtbnMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHtcbiAgICAgICAgICBjb25zdCBjb2wgPSB0b2tlbi5jb2x1bW5zW2pdO1xuICAgICAgICAgIGlmIChjb2x1bW5zW2NvbC5jb2xOYW1lXSA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb2x1bW5zW2NvbC5jb2xOYW1lXSA9IGNvbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlcXVlc3QuZW1pdCgnY29sdW1uTWV0YWRhdGEnLCBjb2x1bW5zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVxdWVzdC5lbWl0KCdjb2x1bW5NZXRhZGF0YScsIHRva2VuLmNvbHVtbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uT3JkZXIodG9rZW46IE9yZGVyVG9rZW4pIHtcbiAgICBpZiAoIXRoaXMucmVxdWVzdC5jYW5jZWxlZCkge1xuICAgICAgdGhpcy5yZXF1ZXN0LmVtaXQoJ29yZGVyJywgdG9rZW4ub3JkZXJDb2x1bW5zKTtcbiAgICB9XG4gIH1cblxuICBvblJvdyh0b2tlbjogUm93VG9rZW4gfCBOQkNSb3dUb2tlbikge1xuICAgIGlmICghdGhpcy5yZXF1ZXN0LmNhbmNlbGVkKSB7XG4gICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmNvbmZpZy5vcHRpb25zLnJvd0NvbGxlY3Rpb25PblJlcXVlc3RDb21wbGV0aW9uKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdC5yb3dzIS5wdXNoKHRva2VuLmNvbHVtbnMpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmNvbmZpZy5vcHRpb25zLnJvd0NvbGxlY3Rpb25PbkRvbmUpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0LnJzdCEucHVzaCh0b2tlbi5jb2x1bW5zKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZXF1ZXN0LmVtaXQoJ3JvdycsIHRva2VuLmNvbHVtbnMpO1xuICAgIH1cbiAgfVxuXG4gIG9uUmV0dXJuU3RhdHVzKHRva2VuOiBSZXR1cm5TdGF0dXNUb2tlbikge1xuICAgIGlmICghdGhpcy5yZXF1ZXN0LmNhbmNlbGVkKSB7XG4gICAgICAvLyBLZWVwIHZhbHVlIGZvciBwYXNzaW5nIGluICdkb25lUHJvYycgZXZlbnQuXG4gICAgICB0aGlzLmNvbm5lY3Rpb24ucHJvY1JldHVyblN0YXR1c1ZhbHVlID0gdG9rZW4udmFsdWU7XG4gICAgfVxuICB9XG5cbiAgb25SZXR1cm5WYWx1ZSh0b2tlbjogUmV0dXJuVmFsdWVUb2tlbikge1xuICAgIGlmICghdGhpcy5yZXF1ZXN0LmNhbmNlbGVkKSB7XG4gICAgICB0aGlzLnJlcXVlc3QuZW1pdCgncmV0dXJuVmFsdWUnLCB0b2tlbi5wYXJhbU5hbWUsIHRva2VuLnZhbHVlLCB0b2tlbi5tZXRhZGF0YSk7XG4gICAgfVxuICB9XG5cbiAgb25Eb25lUHJvYyh0b2tlbjogRG9uZVByb2NUb2tlbikge1xuICAgIGlmICghdGhpcy5yZXF1ZXN0LmNhbmNlbGVkKSB7XG4gICAgICBpZiAodG9rZW4uc3FsRXJyb3IgJiYgIXRoaXMucmVxdWVzdC5lcnJvcikge1xuICAgICAgICAvLyBjaGVjayBpZiB0aGUgRE9ORV9FUlJPUiBmbGFncyB3YXMgc2V0LCBidXQgYW4gRVJST1IgdG9rZW4gd2FzIG5vdCBzZW50LlxuICAgICAgICB0aGlzLnJlcXVlc3QuZXJyb3IgPSBuZXcgUmVxdWVzdEVycm9yKCdBbiB1bmtub3duIGVycm9yIGhhcyBvY2N1cnJlZC4nLCAnVU5LTk9XTicpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnJlcXVlc3QuZW1pdCgnZG9uZVByb2MnLCB0b2tlbi5yb3dDb3VudCwgdG9rZW4ubW9yZSwgdGhpcy5jb25uZWN0aW9uLnByb2NSZXR1cm5TdGF0dXNWYWx1ZSwgdGhpcy5yZXF1ZXN0LnJzdCk7XG5cbiAgICAgIHRoaXMuY29ubmVjdGlvbi5wcm9jUmV0dXJuU3RhdHVzVmFsdWUgPSB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICh0b2tlbi5yb3dDb3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdC5yb3dDb3VudCEgKz0gdG9rZW4ucm93Q291bnQ7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uY29uZmlnLm9wdGlvbnMucm93Q29sbGVjdGlvbk9uRG9uZSkge1xuICAgICAgICB0aGlzLnJlcXVlc3QucnN0ID0gW107XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25Eb25lSW5Qcm9jKHRva2VuOiBEb25lSW5Qcm9jVG9rZW4pIHtcbiAgICBpZiAoIXRoaXMucmVxdWVzdC5jYW5jZWxlZCkge1xuICAgICAgdGhpcy5yZXF1ZXN0LmVtaXQoJ2RvbmVJblByb2MnLCB0b2tlbi5yb3dDb3VudCwgdG9rZW4ubW9yZSwgdGhpcy5yZXF1ZXN0LnJzdCk7XG5cbiAgICAgIGlmICh0b2tlbi5yb3dDb3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdC5yb3dDb3VudCEgKz0gdG9rZW4ucm93Q291bnQ7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uY29uZmlnLm9wdGlvbnMucm93Q29sbGVjdGlvbk9uRG9uZSkge1xuICAgICAgICB0aGlzLnJlcXVlc3QucnN0ID0gW107XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25Eb25lKHRva2VuOiBEb25lVG9rZW4pIHtcbiAgICBpZiAoIXRoaXMucmVxdWVzdC5jYW5jZWxlZCkge1xuICAgICAgaWYgKHRva2VuLnNxbEVycm9yICYmICF0aGlzLnJlcXVlc3QuZXJyb3IpIHtcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlIERPTkVfRVJST1IgZmxhZ3Mgd2FzIHNldCwgYnV0IGFuIEVSUk9SIHRva2VuIHdhcyBub3Qgc2VudC5cbiAgICAgICAgdGhpcy5yZXF1ZXN0LmVycm9yID0gbmV3IFJlcXVlc3RFcnJvcignQW4gdW5rbm93biBlcnJvciBoYXMgb2NjdXJyZWQuJywgJ1VOS05PV04nKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZXF1ZXN0LmVtaXQoJ2RvbmUnLCB0b2tlbi5yb3dDb3VudCwgdG9rZW4ubW9yZSwgdGhpcy5yZXF1ZXN0LnJzdCk7XG5cbiAgICAgIGlmICh0b2tlbi5yb3dDb3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdC5yb3dDb3VudCEgKz0gdG9rZW4ucm93Q291bnQ7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uY29uZmlnLm9wdGlvbnMucm93Q29sbGVjdGlvbk9uRG9uZSkge1xuICAgICAgICB0aGlzLnJlcXVlc3QucnN0ID0gW107XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25SZXNldENvbm5lY3Rpb24odG9rZW46IFJlc2V0Q29ubmVjdGlvbkVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ3Jlc2V0Q29ubmVjdGlvbicpO1xuICB9XG59XG5cbi8qKlxuICogQSBoYW5kbGVyIGZvciB0aGUgYXR0ZW50aW9uIGFja25vd2xlZGdlbWVudCBtZXNzYWdlLlxuICpcbiAqIFRoaXMgbWVzc2FnZSBvbmx5IGNvbnRhaW5zIGEgYERPTkVgIHRva2VuIHRoYXQgYWNrbm93bGVkZ2VzXG4gKiB0aGF0IHRoZSBhdHRlbnRpb24gbWVzc2FnZSB3YXMgcmVjZWl2ZWQgYnkgdGhlIHNlcnZlci5cbiAqL1xuZXhwb3J0IGNsYXNzIEF0dGVudGlvblRva2VuSGFuZGxlciBleHRlbmRzIFRva2VuSGFuZGxlciB7XG4gIGRlY2xhcmUgY29ubmVjdGlvbjogQ29ubmVjdGlvbjtcbiAgZGVjbGFyZSByZXF1ZXN0OiBSZXF1ZXN0IHwgQnVsa0xvYWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBhbiBhdHRlbnRpb24gYWNrbm93bGVkZ2VtZW50IHdhcyByZWNlaXZlZC5cbiAgICovXG4gIGRlY2xhcmUgYXR0ZW50aW9uUmVjZWl2ZWQ6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoY29ubmVjdGlvbjogQ29ubmVjdGlvbiwgcmVxdWVzdDogUmVxdWVzdCB8IEJ1bGtMb2FkKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcblxuICAgIHRoaXMuYXR0ZW50aW9uUmVjZWl2ZWQgPSBmYWxzZTtcbiAgfVxuXG4gIG9uRG9uZSh0b2tlbjogRG9uZVRva2VuKSB7XG4gICAgaWYgKHRva2VuLmF0dGVudGlvbikge1xuICAgICAgdGhpcy5hdHRlbnRpb25SZWNlaXZlZCA9IHRydWU7XG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLElBQUFBLFFBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUEwRCxTQUFBRCx1QkFBQUcsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtBQWlDbkQsTUFBTUcsb0JBQW9CLFNBQVNDLEtBQUssQ0FBQztFQUM5Q0MsV0FBV0EsQ0FBQ0MsT0FBcUIsRUFBRUMsS0FBWSxFQUFFO0lBQy9DLEtBQUssQ0FBQyxvQkFBb0IsR0FBR0EsS0FBSyxDQUFDQyxJQUFJLEdBQUcsUUFBUSxHQUFHRixPQUFPLENBQUNELFdBQVcsQ0FBQ0csSUFBSSxHQUFHLEdBQUcsQ0FBQztFQUN0RjtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBQyxPQUFBLENBQUFOLG9CQUFBLEdBQUFBLG9CQUFBO0FBTU8sTUFBTU8sdUJBQXVCLEdBQUFELE9BQUEsQ0FBQUMsdUJBQUEsR0FBRztFQUNyQ0MsT0FBTyxFQUFFLEtBQUs7RUFFZEMsSUFBSUEsQ0FBQSxFQUFHO0lBQ0wsSUFBSSxJQUFJLENBQUNELE9BQU8sRUFBRTtNQUNoQjtJQUNG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