UNPKG

22.3 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
8
9var _fs = require("fs");
10
11var _fs2 = _interopRequireDefault(_fs);
12
13var _path = require("path");
14
15var _path2 = _interopRequireDefault(_path);
16
17var _Credentials = require("./Credentials");
18
19var _Credentials2 = _interopRequireDefault(_Credentials);
20
21var _JwtGenerator = require("./JwtGenerator");
22
23var _JwtGenerator2 = _interopRequireDefault(_JwtGenerator);
24
25var _HashGenerator = require("./HashGenerator");
26
27var _HashGenerator2 = _interopRequireDefault(_HashGenerator);
28
29var _Message = require("./Message");
30
31var _Message2 = _interopRequireDefault(_Message);
32
33var _Voice = require("./Voice");
34
35var _Voice2 = _interopRequireDefault(_Voice);
36
37var _Number = require("./Number");
38
39var _Number2 = _interopRequireDefault(_Number);
40
41var _Verify = require("./Verify");
42
43var _Verify2 = _interopRequireDefault(_Verify);
44
45var _NumberInsight = require("./NumberInsight");
46
47var _NumberInsight2 = _interopRequireDefault(_NumberInsight);
48
49var _App = require("./App");
50
51var _App2 = _interopRequireDefault(_App);
52
53var _Account = require("./Account");
54
55var _Account2 = _interopRequireDefault(_Account);
56
57var _CallsResource = require("./CallsResource");
58
59var _CallsResource2 = _interopRequireDefault(_CallsResource);
60
61var _FilesResource = require("./FilesResource");
62
63var _FilesResource2 = _interopRequireDefault(_FilesResource);
64
65var _Conversion = require("./Conversion");
66
67var _Conversion2 = _interopRequireDefault(_Conversion);
68
69var _Media = require("./Media");
70
71var _Media2 = _interopRequireDefault(_Media);
72
73var _Redact = require("./Redact");
74
75var _Redact2 = _interopRequireDefault(_Redact);
76
77var _Pricing = require("./Pricing");
78
79var _Pricing2 = _interopRequireDefault(_Pricing);
80
81var _HttpClient = require("./HttpClient");
82
83var _HttpClient2 = _interopRequireDefault(_HttpClient);
84
85var _NullLogger = require("./NullLogger");
86
87var _NullLogger2 = _interopRequireDefault(_NullLogger);
88
89var _ConsoleLogger = require("./ConsoleLogger");
90
91var _ConsoleLogger2 = _interopRequireDefault(_ConsoleLogger);
92
93function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
94
95function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
96
97var jwtGeneratorInstance = new _JwtGenerator2.default();
98var hashGeneratorInstance = new _HashGenerator2.default();
99
100var Nexmo = function () {
101 /**
102 * @param {Credentials} credentials - Nexmo API credentials
103 * @param {string} credentials.apiKey - the Nexmo API key
104 * @param {string} credentials.apiSecret - the Nexmo API secret
105 * @param {Object} options - Additional options
106 * @param {boolean} options.debug - `true` to turn on debug logging
107 * @param {Object} options.logger - Set a custom logger.
108 * @param {string} options.appendToUserAgent - A value to append to the user agent.
109 * The value will be prefixed with a `/`
110 */
111 function Nexmo(credentials) {
112 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { debug: false };
113
114 _classCallCheck(this, Nexmo);
115
116 this.credentials = _Credentials2.default.parse(credentials);
117 this.options = options;
118
119 // If no logger has been supplied but debug has been set
120 // default to using the ConsoleLogger
121 if (!this.options.logger && this.options.debug) {
122 this.options.logger = new _ConsoleLogger2.default();
123 } else if (!this.options.logger) {
124 // Swallow the logging
125 this.options.logger = new _NullLogger2.default();
126 }
127
128 var userAgent = "nexmo-node/UNKNOWN node/UNKNOWN";
129 try {
130 var packageDetails = require(_path2.default.join(__dirname, "..", "package.json"));
131 userAgent = "nexmo-node/" + packageDetails.version + " node/" + process.version.replace("v", "");
132 } catch (e) {
133 console.warn("Could not load package details");
134 }
135 this.options.userAgent = userAgent;
136 if (this.options.appendToUserAgent) {
137 this.options.userAgent += " " + this.options.appendToUserAgent;
138 }
139
140 // This is legacy, everything should use rest or api going forward
141 this.options.httpClient = new _HttpClient2.default(Object.assign({ host: this.options.restHost || "rest.nexmo.com" }, this.options), this.credentials);
142
143 // We have two different hosts, so we use two different HttpClients
144 this.options.api = new _HttpClient2.default(Object.assign({ host: this.options.apiHost || "api.nexmo.com" }, this.options), this.credentials);
145 this.options.rest = new _HttpClient2.default(Object.assign({ host: this.options.restHost || "rest.nexmo.com" }, this.options), this.credentials);
146
147 this.message = new _Message2.default(this.credentials, this.options);
148 this.voice = new _Voice2.default(this.credentials, this.options);
149 this.number = new _Number2.default(this.credentials, this.options);
150 this.verify = new _Verify2.default(this.credentials, this.options);
151 this.numberInsight = new _NumberInsight2.default(this.credentials, this.options);
152 this.applications = new _App2.default(this.credentials, this.options);
153 this.account = new _Account2.default(this.credentials, this.options);
154 this.calls = new _CallsResource2.default(this.credentials, this.options);
155 this.files = new _FilesResource2.default(this.credentials, this.options);
156 this.conversion = new _Conversion2.default(this.credentials, this.options);
157 this.media = new _Media2.default(this.credentials, this.options);
158 this.redact = new _Redact2.default(this.credentials, this.options);
159 this.pricing = new _Pricing2.default(this.credentials, this.options);
160
161 /**
162 * @deprecated Please use nexmo.applications
163 */
164 this.app = this.applications;
165 }
166
167 /**
168 * Generate a JSON Web Token (JWT).
169 *
170 * The private key used upon Nexmo instance construction will be used to sign
171 * the JWT. The application_id you used upon Nexmo instance creation will be
172 * included in the claims for the JWT, however this can be overridden by passing
173 * an application_id as part of the claims.
174 *
175 * @param {Object} claims - name/value pair claims to sign within the JWT
176 *
177 * @returns {String} the generated token
178 */
179
180 _createClass(Nexmo, [{
181 key: "generateJwt",
182 value: function generateJwt() {
183 var claims = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
184
185 if (claims.application_id === undefined) {
186 claims.application_id = this.credentials.applicationId;
187 }
188 return Nexmo.generateJwt(this.credentials.privateKey, claims);
189 }
190
191 /**
192 * Generate a Signature Hash.
193 *
194 * @param {Object} params - params to generate hash from
195 *
196 * @returns {String} the generated token
197 */
198
199 }, {
200 key: "generateSignature",
201 value: function generateSignature(params) {
202 return this.credentials.generateSignature(params);
203 }
204 }]);
205
206 return Nexmo;
207}();
208
209/**
210 * Generate a JSON Web Token (JWT).
211 *
212 * @param {String|Buffer} privateKey - the path to the private key certificate
213 * to be used when signing the claims.
214 * @param {Object} claims - name/value pair claims to sign within the JWT
215 *
216 * @returns {String} the generated token
217 */
218
219
220Nexmo.generateJwt = function (privateKey, claims) {
221 if (!(privateKey instanceof Buffer)) {
222 if (!_fs2.default.existsSync(privateKey)) {
223 throw new Error("File \"" + privateKey + "\" not found.");
224 } else {
225 privateKey = _fs2.default.readFileSync(privateKey);
226 }
227 }
228 return jwtGeneratorInstance.generate(privateKey, claims);
229};
230
231/**
232 * Generate a Signature Hash.
233 *
234 * @param {String} method - the method to be used when creating the hash
235 * @param {String} secret - the secret to be used when creating the hash
236 * @param {Object} params - params to generate hash from
237 *
238 * @returns {String} the generated token
239 */
240Nexmo.generateSignature = function (method, secret, params) {
241 return hashGeneratorInstance.generate(method, secret, params);
242};
243
244exports.default = Nexmo;
245module.exports = exports["default"];
246//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9OZXhtby5qcyJdLCJuYW1lcyI6WyJqd3RHZW5lcmF0b3JJbnN0YW5jZSIsImhhc2hHZW5lcmF0b3JJbnN0YW5jZSIsIk5leG1vIiwiY3JlZGVudGlhbHMiLCJvcHRpb25zIiwiZGVidWciLCJwYXJzZSIsImxvZ2dlciIsInVzZXJBZ2VudCIsInBhY2thZ2VEZXRhaWxzIiwicmVxdWlyZSIsImpvaW4iLCJfX2Rpcm5hbWUiLCJ2ZXJzaW9uIiwicHJvY2VzcyIsInJlcGxhY2UiLCJlIiwiY29uc29sZSIsIndhcm4iLCJhcHBlbmRUb1VzZXJBZ2VudCIsImh0dHBDbGllbnQiLCJPYmplY3QiLCJhc3NpZ24iLCJob3N0IiwicmVzdEhvc3QiLCJhcGkiLCJhcGlIb3N0IiwicmVzdCIsIm1lc3NhZ2UiLCJ2b2ljZSIsIm51bWJlciIsInZlcmlmeSIsIm51bWJlckluc2lnaHQiLCJhcHBsaWNhdGlvbnMiLCJhY2NvdW50IiwiY2FsbHMiLCJmaWxlcyIsImNvbnZlcnNpb24iLCJtZWRpYSIsInJlZGFjdCIsInByaWNpbmciLCJhcHAiLCJjbGFpbXMiLCJhcHBsaWNhdGlvbl9pZCIsInVuZGVmaW5lZCIsImFwcGxpY2F0aW9uSWQiLCJnZW5lcmF0ZUp3dCIsInByaXZhdGVLZXkiLCJwYXJhbXMiLCJnZW5lcmF0ZVNpZ25hdHVyZSIsIkJ1ZmZlciIsImV4aXN0c1N5bmMiLCJFcnJvciIsInJlYWRGaWxlU3luYyIsImdlbmVyYXRlIiwibWV0aG9kIiwic2VjcmV0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFFQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7QUFFQSxJQUFNQSx1QkFBdUIsNEJBQTdCO0FB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WUFBTSxJQUFJSyxLQUFKLGFBQW1CTCxVQUFuQixtQkFBTjtBQUNELEtBRkQsTUFFTztBQUNMQSxtQkFBYSxhQUFHTSxZQUFILENBQWdCTixVQUFoQixDQUFiO0FBQ0Q7QUFDRjtBQUNELFNBQU8vQyxxQkFBcUJzRCxRQUFyQixDQUE4QlAsVUFBOUIsRUFBMENMLE1BQTFDLENBQVA7QUFDRCxDQVREOztBQVdBOzs7Ozs7Ozs7QUFTQXhDLE1BQU0rQyxpQkFBTixHQUEwQixVQUFDTSxNQUFELEVBQVNDLE1BQVQsRUFBaUJSLE1BQWpCLEVBQTRCO0FBQ3BELFNBQU8vQyxzQkFBc0JxRCxRQUF0QixDQUErQkMsTUFBL0IsRUFBdUNDLE1BQXZDLEVBQStDUixNQUEvQyxDQUFQO0FBQ0QsQ0FGRDs7a0JBSWU5QyxLIiwiZmlsZSI6Ik5leG1vLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IENyZWRlbnRpYWxzIGZyb20gXCIuL0NyZWRlbnRpYWxzXCI7XG5pbXBvcnQgSnd0R2VuZXJhdG9yIGZyb20gXCIuL0p3dEdlbmVyYXRvclwiO1xuaW1wb3J0IEhhc2hHZW5lcmF0b3IgZnJvbSBcIi4vSGFzaEdlbmVyYXRvclwiO1xuaW1wb3J0IE1lc3NhZ2UgZnJvbSBcIi4vTWVzc2FnZVwiO1xuaW1wb3J0IFZvaWNlIGZyb20gXCIuL1ZvaWNlXCI7XG5pbXBvcnQgTnVtYmVyIGZyb20gXCIuL051bWJlclwiO1xuaW1wb3J0IFZlcmlmeSBmcm9tIFwiLi9WZXJpZnlcIjtcbmltcG9ydCBOdW1iZXJJbnNpZ2h0IGZyb20gXCIuL051bWJlckluc2lnaHRcIjtcbmltcG9ydCBBcHAgZnJvbSBcIi4vQXBwXCI7XG5pbXBvcnQgQWNjb3VudCBmcm9tIFwiLi9BY2NvdW50XCI7XG5pbXBvcnQgQ2FsbHNSZXNvdXJjZSBmcm9tIFwiLi9DYWxsc1Jlc291cmNlXCI7XG5pbXBvcnQgRmlsZXNSZXNvdXJjZSBmcm9tIFwiLi9GaWxlc1Jlc291cmNlXCI7XG5pbXBvcnQgQ29udmVyc2lvbiBmcm9tIFwiLi9Db252ZXJzaW9uXCI7XG5pbXBvcnQgTWVkaWEgZnJvbSBcIi4vTWVkaWFcIjtcbmltcG9ydCBSZWRhY3QgZnJvbSBcIi4vUmVkYWN0XCI7XG5pbXBvcnQgUHJpY2luZyBmcm9tIFwiLi9QcmljaW5nXCI7XG5pbXBvcnQgSHR0cENsaWVudCBmcm9tIFwiLi9IdHRwQ2xpZW50XCI7XG5pbXBvcnQgTnVsbExvZ2dlciBmcm9tIFwiLi9OdWxsTG9nZ2VyXCI7XG5pbXBvcnQgQ29uc29sZUxvZ2dlciBmcm9tIFwiLi9Db25zb2xlTG9nZ2VyXCI7XG5cbmNvbnN0IGp3dEdlbmVyYXRvckluc3RhbmNlID0gbmV3IEp3dEdlbmVyYXRvcigpO1xuY29uc3QgaGFzaEdlbmVyYXRvckluc3RhbmNlID0gbmV3IEhhc2hHZW5lcmF0b3IoKTtcblxuY2xhc3MgTmV4bW8ge1xuICAvKipcbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gY3JlZGVudGlhbHMgLSBOZXhtbyBBUEkgY3JlZGVudGlhbHNcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNyZWRlbnRpYWxzLmFwaUtleSAtIHRoZSBOZXhtbyBBUEkga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjcmVkZW50aWFscy5hcGlTZWNyZXQgLSB0aGUgTmV4bW8gQVBJIHNlY3JldFxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIEFkZGl0aW9uYWwgb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMuZGVidWcgLSBgdHJ1ZWAgdG8gdHVybiBvbiBkZWJ1ZyBsb2dnaW5nXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLmxvZ2dlciAtIFNldCBhIGN1c3RvbSBsb2dnZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLmFwcGVuZFRvVXNlckFnZW50IC0gQSB2YWx1ZSB0byBhcHBlbmQgdG8gdGhlIHVzZXIgYWdlbnQuXG4gICAqICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgd2lsbCBiZSBwcmVmaXhlZCB3aXRoIGEgYC9gXG4gICAqL1xuICBjb25zdHJ1Y3RvcihjcmVkZW50aWFscywgb3B0aW9ucyA9IHsgZGVidWc6IGZhbHNlIH0pIHtcbiAgICB0aGlzLmNyZWRlbnRpYWxzID0gQ3JlZGVudGlhbHMucGFyc2UoY3JlZGVudGlhbHMpO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICAvLyBJZiBubyBsb2dnZXIgaGFzIGJlZW4gc3VwcGxpZWQgYnV0IGRlYnVnIGhhcyBiZWVuIHNldFxuICAgIC8vIGRlZmF1bHQgdG8gdXNpbmcgdGhlIENvbnNvbGVMb2dnZXJcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5sb2dnZXIgJiYgdGhpcy5vcHRpb25zLmRlYnVnKSB7XG4gICAgICB0aGlzLm9wdGlvbnMubG9nZ2VyID0gbmV3IENvbnNvbGVMb2dnZXIoKTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLm9wdGlvbnMubG9nZ2VyKSB7XG4gICAgICAvLyBTd2FsbG93IHRoZSBsb2dnaW5nXG4gICAgICB0aGlzLm9wdGlvbnMubG9nZ2VyID0gbmV3IE51bGxMb2dnZXIoKTtcbiAgICB9XG5cbiAgICBsZXQgdXNlckFnZW50ID0gXCJuZXhtby1ub2RlL1VOS05PV04gbm9kZS9VTktOT1dOXCI7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBwYWNrYWdlRGV0YWlscyA9IHJlcXVpcmUocGF0aC5qb2luKF9fZGlybmFtZSwgXCIuLlwiLCBcInBhY2thZ2UuanNvblwiKSk7XG4gICAgICB1c2VyQWdlbnQgPSBgbmV4bW8tbm9kZS8ke1xuICAgICAgICBwYWNrYWdlRGV0YWlscy52ZXJzaW9uXG4gICAgICB9IG5vZGUvJHtwcm9jZXNzLnZlcnNpb24ucmVwbGFjZShcInZcIiwgXCJcIil9YDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJDb3VsZCBub3QgbG9hZCBwYWNrYWdlIGRldGFpbHNcIik7XG4gICAgfVxuICAgIHRoaXMub3B0aW9ucy51c2VyQWdlbnQgPSB1c2VyQWdlbnQ7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5hcHBlbmRUb1VzZXJBZ2VudCkge1xuICAgICAgdGhpcy5vcHRpb25zLnVzZXJBZ2VudCArPSBgICR7dGhpcy5vcHRpb25zLmFwcGVuZFRvVXNlckFnZW50fWA7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBpcyBsZWdhY3ksIGV2ZXJ5dGhpbmcgc2hvdWxkIHVzZSByZXN0IG9yIGFwaSBnb2luZyBmb3J3YXJkXG4gICAgdGhpcy5vcHRpb25zLmh0dHBDbGllbnQgPSBuZXcgSHR0cENsaWVudChcbiAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgIHsgaG9zdDogdGhpcy5vcHRpb25zLnJlc3RIb3N0IHx8IFwicmVzdC5uZXhtby5jb21cIiB9LFxuICAgICAgICB0aGlzLm9wdGlvbnNcbiAgICAgICksXG4gICAgICB0aGlzLmNyZWRlbnRpYWxzXG4gICAgKTtcblxuICAgIC8vIFdlIGhhdmUgdHdvIGRpZmZlcmVudCBob3N0cywgc28gd2UgdXNlIHR3byBkaWZmZXJlbnQgSHR0cENsaWVudHNcbiAgICB0aGlzLm9wdGlvbnMuYXBpID0gbmV3IEh0dHBDbGllbnQoXG4gICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICB7IGhvc3Q6IHRoaXMub3B0aW9ucy5hcGlIb3N0IHx8IFwiYXBpLm5leG1vLmNvbVwiIH0sXG4gICAgICAgIHRoaXMub3B0aW9uc1xuICAgICAgKSxcbiAgICAgIHRoaXMuY3JlZGVudGlhbHNcbiAgICApO1xuICAgIHRoaXMub3B0aW9ucy5yZXN0ID0gbmV3IEh0dHBDbGllbnQoXG4gICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICB7IGhvc3Q6IHRoaXMub3B0aW9ucy5yZXN0SG9zdCB8fCBcInJlc3QubmV4bW8uY29tXCIgfSxcbiAgICAgICAgdGhpcy5vcHRpb25zXG4gICAgICApLFxuICAgICAgdGhpcy5jcmVkZW50aWFsc1xuICAgICk7XG5cbiAgICB0aGlzLm1lc3NhZ2UgPSBuZXcgTWVzc2FnZSh0aGlzLmNyZWRlbnRpYWxzLCB0aGlzLm9wdGlvbnMpO1xuICAgIHRoaXMudm9pY2UgPSBuZXcgVm9pY2UodGhpcy5jcmVkZW50aWFscywgdGhpcy5vcHRpb25zKTtcbiAgICB0aGlzLm51bWJlciA9IG5ldyBOdW1iZXIodGhpcy5jcmVkZW50aWFscywgdGhpcy5vcHRpb25zKTtcbiAgICB0aGlzLnZlcmlmeSA9IG5ldyBWZXJpZnkodGhpcy5jcmVkZW50aWFscywgdGhpcy5vcHRpb25zKTtcbiAgICB0aGlzLm51bWJlckluc2lnaHQgPSBuZXcgTnVtYmVySW5zaWdodCh0aGlzLmNyZWRlbnRpYWxzLCB0aGlzLm9wdGlvbnMpO1xuICAgIHRoaXMuYXBwbGljYXRpb25zID0gbmV3IEFwcCh0aGlzLmNyZWRlbnRpYWxzLCB0aGlzLm9wdGlvbnMpO1xuICAgIHRoaXMuYWNjb3VudCA9IG5ldyBBY2NvdW50KHRoaXMuY3JlZGVudGlhbHMsIHRoaXMub3B0aW9ucyk7XG4gICAgdGhpcy5jYWxscyA9IG5ldyBDYWxsc1Jlc291cmNlKHRoaXMuY3JlZGVudGlhbHMsIHRoaXMub3B0aW9ucyk7XG4gICAgdGhpcy5maWxlcyA9IG5ldyBGaWxlc1Jlc291cmNlKHRoaXMuY3JlZGVudGlhbHMsIHRoaXMub3B0aW9ucyk7XG4gICAgdGhpcy5jb252ZXJzaW9uID0gbmV3IENvbnZlcnNpb24odGhpcy5jcmVkZW50aWFscywgdGhpcy5vcHRpb25zKTtcbiAgICB0aGlzLm1lZGlhID0gbmV3IE1lZGlhKHRoaXMuY3JlZGVudGlhbHMsIHRoaXMub3B0aW9ucyk7XG4gICAgdGhpcy5yZWRhY3QgPSBuZXcgUmVkYWN0KHRoaXMuY3JlZGVudGlhbHMsIHRoaXMub3B0aW9ucyk7XG4gICAgdGhpcy5wcmljaW5nID0gbmV3IFByaWNpbmcodGhpcy5jcmVkZW50aWFscywgdGhpcy5vcHRpb25zKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgbmV4bW8uYXBwbGljYXRpb25zXG4gICAgICovXG4gICAgdGhpcy5hcHAgPSB0aGlzLmFwcGxpY2F0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIEpTT04gV2ViIFRva2VuIChKV1QpLlxuICAgKlxuICAgKiBUaGUgcHJpdmF0ZSBrZXkgdXNlZCB1cG9uIE5leG1vIGluc3RhbmNlIGNvbnN0cnVjdGlvbiB3aWxsIGJlIHVzZWQgdG8gc2lnblxuICAgKiB0aGUgSldULiBUaGUgYXBwbGljYXRpb25faWQgeW91IHVzZWQgdXBvbiBOZXhtbyBpbnN0YW5jZSBjcmVhdGlvbiB3aWxsIGJlXG4gICAqIGluY2x1ZGVkIGluIHRoZSBjbGFpbXMgZm9yIHRoZSBKV1QsIGhvd2V2ZXIgdGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBwYXNzaW5nXG4gICAqIGFuIGFwcGxpY2F0aW9uX2lkIGFzIHBhcnQgb2YgdGhlIGNsYWltcy5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IGNsYWltcyAtIG5hbWUvdmFsdWUgcGFpciBjbGFpbXMgdG8gc2lnbiB3aXRoaW4gdGhlIEpXVFxuICAgKlxuICAgKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUgZ2VuZXJhdGVkIHRva2VuXG4gICAqL1xuXG4gIGdlbmVyYXRlSnd0KGNsYWltcyA9IHt9KSB7XG4gICAgaWYgKGNsYWltcy5hcHBsaWNhdGlvbl9pZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjbGFpbXMuYXBwbGljYXRpb25faWQgPSB0aGlzLmNyZWRlbnRpYWxzLmFwcGxpY2F0aW9uSWQ7XG4gICAgfVxuICAgIHJldHVybiBOZXhtby5nZW5lcmF0ZUp3dCh0aGlzLmNyZWRlbnRpYWxzLnByaXZhdGVLZXksIGNsYWltcyk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYSBTaWduYXR1cmUgSGFzaC5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtcyB0byBnZW5lcmF0ZSBoYXNoIGZyb21cbiAgICpcbiAgICogQHJldHVybnMge1N0cmluZ30gdGhlIGdlbmVyYXRlZCB0b2tlblxuICAgKi9cbiAgZ2VuZXJhdGVTaWduYXR1cmUocGFyYW1zKSB7XG4gICAgcmV0dXJuIHRoaXMuY3JlZGVudGlhbHMuZ2VuZXJhdGVTaWduYXR1cmUocGFyYW1zKTtcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEgSlNPTiBXZWIgVG9rZW4gKEpXVCkuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8QnVmZmVyfSBwcml2YXRlS2V5IC0gdGhlIHBhdGggdG8gdGhlIHByaXZhdGUga2V5IGNlcnRpZmljYXRlXG4gKiAgICAgICAgICB0byBiZSB1c2VkIHdoZW4gc2lnbmluZyB0aGUgY2xhaW1zLlxuICogQHBhcmFtIHtPYmplY3R9IGNsYWltcyAtIG5hbWUvdmFsdWUgcGFpciBjbGFpbXMgdG8gc2lnbiB3aXRoaW4gdGhlIEpXVFxuICpcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHRoZSBnZW5lcmF0ZWQgdG9rZW5cbiAqL1xuTmV4bW8uZ2VuZXJhdGVKd3QgPSAocHJpdmF0ZUtleSwgY2xhaW1zKSA9PiB7XG4gIGlmICghKHByaXZhdGVLZXkgaW5zdGFuY2VvZiBCdWZmZXIpKSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHByaXZhdGVLZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgXCIke3ByaXZhdGVLZXl9XCIgbm90IGZvdW5kLmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcml2YXRlS2V5ID0gZnMucmVhZEZpbGVTeW5jKHByaXZhdGVLZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gand0R2VuZXJhdG9ySW5zdGFuY2UuZ2VuZXJhdGUocHJpdmF0ZUtleSwgY2xhaW1zKTtcbn07XG5cbi8qKlxuICogR2VuZXJhdGUgYSBTaWduYXR1cmUgSGFzaC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kIC0gdGhlIG1ldGhvZCB0byBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgdGhlIGhhc2hcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWNyZXQgLSB0aGUgc2VjcmV0IHRvIGJlIHVzZWQgd2hlbiBjcmVhdGluZyB0aGUgaGFzaFxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtcyB0byBnZW5lcmF0ZSBoYXNoIGZyb21cbiAqXG4gKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUgZ2VuZXJhdGVkIHRva2VuXG4gKi9cbk5leG1vLmdlbmVyYXRlU2lnbmF0dXJlID0gKG1ldGhvZCwgc2VjcmV0LCBwYXJhbXMpID0+IHtcbiAgcmV0dXJuIGhhc2hHZW5lcmF0b3JJbnN0YW5jZS5nZW5lcmF0ZShtZXRob2QsIHNlY3JldCwgcGFyYW1zKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE5leG1vO1xuIl19
\No newline at end of file