UNPKG

87.9 kBJavaScriptView Raw
1"use strict";
2
3var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
4
5var querystring = require("querystring");
6
7var msgpath = { host: "rest.nexmo.com", path: "/sms/json" };
8var shortcodePath = { host: "rest.nexmo.com", path: "/sc/us/${type}/json" };
9var ttsEndpoint = { host: "api.nexmo.com", path: "/tts/json" };
10var ttsPromptEndpoint = { host: "api.nexmo.com", path: "/tts-prompt/json" };
11var callEndpoint = { host: "rest.nexmo.com", path: "/call/json" };
12var verifyEndpoint = { host: "api.nexmo.com", path: "/verify/json" };
13var checkVerifyEndpoint = { host: "api.nexmo.com", path: "/verify/check/json" };
14var controlVerifyEndpoint = {
15 host: "api.nexmo.com",
16 path: "/verify/control/json"
17};
18var searchVerifyEndpoint = {
19 host: "api.nexmo.com",
20 path: "/verify/search/json"
21};
22var niEndpoint = { host: "api.nexmo.com", path: "/ni/advanced/async/json" };
23var niBasicEndpoint = { host: "api.nexmo.com", path: "/ni/basic/json" };
24var niStandardEndpoint = { host: "api.nexmo.com", path: "/ni/standard/json" };
25var niAdvancedEndpoint = { host: "api.nexmo.com", path: "/ni/advanced/json" };
26var applicationsEndpoint = { host: "api.nexmo.com", path: "/v1/applications" };
27var up = {};
28var numberPattern = new RegExp("^[0-9 +()-]*$");
29
30var _options = null;
31
32// Error message resources are maintained globally in one place for easy management
33var ERROR_MESSAGES = {
34 sender: "Invalid from address",
35 to: "Invalid to address",
36 msg: "Invalid Text Message",
37 msgParams: "Invalid shortcode message parameters",
38 countrycode: "Invalid Country Code",
39 msisdn: "Invalid MSISDN passed",
40 body: "Invalid Body value in Binary Message",
41 udh: "Invalid udh value in Binary Message",
42 title: "Invalid title in WAP Push message",
43 url: "Invalid url in WAP Push message",
44 maxDigits: "Invalid max digits for TTS prompt",
45 byeText: "Invalid bye text for TTS prompt",
46 pinCode: "Invalid pin code for TTS confirm",
47 failedText: "Invalid failed text for TTS confirm",
48 answerUrl: "Invalid answer URL for call",
49 verifyValidation: "Missing Mandatory fields (number and/or brand)",
50 checkVerifyValidation: "Missing Mandatory fields (request_id and/or code)",
51 controlVerifyValidation: "Missing Mandatory fields (request_id and/or cmd-command)",
52 searchVerifyValidation: "Missing Mandatory fields (request_id or request_ids)",
53 numberInsightAdvancedValidation: "Missing Mandatory fields (number and/or callback url)",
54 numberInsightValidation: "Missing Mandatory field - number",
55 numberInsightPatternFailure: "Number can contain digits and may include any or all of the following: white space, -,+, (, ).",
56 optionsNotAnObject: "Options parameter should be a dictionary. Check the docs for valid properties for options",
57 applicationName: "Invalid argument: name",
58 applicationType: "Invalid argument: type",
59 applicationAnswerUrl: "Invalid argument: answerUrl",
60 applicationEventUrl: "Invalid argument: eventUrl",
61 applicationId: "Invalid argument: appId",
62 product: "Invalid product. Should be one of [voice, sms]"
63};
64
65exports.initialize = function (pkey, psecret, options) {
66 if (!pkey || !psecret) {
67 throw "key and secret cannot be empty, set valid values";
68 }
69 up = {
70 api_key: pkey,
71 api_secret: psecret
72 };
73 _options = options;
74};
75
76exports.sendBinaryMessage = function (sender, recipient, body, udh, callback) {
77 if (!body) {
78 sendError(callback, new Error(ERROR_MESSAGES.body));
79 } else if (!udh) {
80 sendError(callback, new Error(ERROR_MESSAGES.udh));
81 } else {
82 sendMessage({
83 from: sender,
84 to: recipient,
85 type: "binary",
86 body: body,
87 udh: udh
88 }, callback);
89 }
90};
91
92exports.sendWapPushMessage = function (sender, recipient, title, url, validity, callback) {
93 if (!title) {
94 sendError(callback, new Error(ERROR_MESSAGES.title));
95 } else if (!url) {
96 sendError(callback, new Error(ERROR_MESSAGES.url));
97 } else {
98 if (typeof validity === "function") {
99 callback = validity;
100 validity = 86400000;
101 }
102 sendMessage({
103 from: sender,
104 to: recipient,
105 type: "wappush",
106 title: title,
107 validity: validity,
108 url: url
109 }, callback);
110 }
111};
112
113exports.sendTextMessage = function (sender, recipient, message, opts, callback) {
114 if (!message) {
115 sendError(callback, new Error(ERROR_MESSAGES.msg));
116 } else {
117 if (!callback) {
118 callback = opts;
119 opts = {};
120 }
121 opts["from"] = sender;
122 opts["to"] = recipient;
123 opts["text"] = message;
124 sendMessage(opts, callback);
125 }
126};
127
128exports.sendMessage = function (opts, callback) {
129 sendMessage(opts, callback);
130};
131function sendMessage(data, callback) {
132 if (!data.from) {
133 sendError(callback, new Error(ERROR_MESSAGES.sender));
134 } else if (!data.to) {
135 sendError(callback, new Error(ERROR_MESSAGES.to));
136 } else {
137 var path = clone(msgpath);
138 path.path += "?" + querystring.stringify(data);
139 _options.logger.info("sending message from " + data.from + " to " + data.to + " with message " + data.text);
140 sendRequest(path, "POST", function (err, apiResponse) {
141 if (!err && apiResponse.status && apiResponse.messages[0].status > 0) {
142 sendError(callback, new Error(apiResponse.messages[0]["error-text"]), apiResponse);
143 } else {
144 if (callback) callback(err, apiResponse);
145 }
146 });
147 }
148}
149
150function sendViaShortcode(type, recipient, messageParams, opts, callback) {
151 if (!recipient) {
152 sendError(callback, new Error(ERROR_MESSAGES.to));
153 }
154 if (!messageParams || !Object.keys(messageParams)) {
155 sendError(callback, new Error(ERROR_MESSAGES.msgParams));
156 }
157 opts = opts || {};
158 var path = clone(shortcodePath);
159 path.path = path.path.replace("${type}", type);
160 Object.keys(messageParams).forEach(function (key) {
161 opts[key] = messageParams[key];
162 });
163 opts.to = recipient;
164 path.path += "?" + querystring.stringify(opts);
165 _options.logger.info("sending message from shortcode " + type + " to " + recipient + " with parameters " + JSON.stringify(messageParams));
166 sendRequest(path, "POST", function (err, apiResponse) {
167 if (!err && apiResponse.status && apiResponse.messages[0].status > 0) {
168 sendError(callback, new Error(apiResponse.messages[0]["error-text"]), apiResponse);
169 } else {
170 if (callback) callback(err, apiResponse);
171 }
172 });
173}
174exports.shortcodeAlert = function (recipient, messageParams, opts, callback) {
175 sendViaShortcode("alert", recipient, messageParams, opts, callback);
176};
177exports.shortcode2FA = function (recipient, messageParams, opts, callback) {
178 sendViaShortcode("2fa", recipient, messageParams, opts, callback);
179};
180exports.shortcodeMarketing = function (recipient, messageParams, opts, callback) {
181 sendViaShortcode("marketing", recipient, messageParams, opts, callback);
182};
183
184function clone(a) {
185 return JSON.parse(JSON.stringify(a));
186}
187
188function getEndpoint(action) {
189 return { path: action };
190}
191
192function sendRequest(endpoint, method, callback) {
193 endpoint.path = endpoint.path + (endpoint.path.indexOf("?") > 0 ? "&" : "?") + querystring.stringify(up);
194 _options.httpClient.request(endpoint, method, callback);
195}
196
197exports.checkBalance = function (callback) {
198 var balanceEndpoint = getEndpoint("/account/get-balance");
199 sendRequest(balanceEndpoint, callback);
200};
201
202exports.getPricing = function (countryCode, callback) {
203 if (!countryCode || countryCode.length !== 2) {
204 sendError(callback, new Error(ERROR_MESSAGES.countrycode));
205 } else {
206 var pricingEndpoint = getEndpoint("/account/get-pricing/outbound");
207 pricingEndpoint.path += "?country=" + countryCode;
208 sendRequest(pricingEndpoint, callback);
209 }
210};
211
212exports.getPhonePricing = function (product, msisdn, callback) {
213 if (!product || product !== "sms" && product !== "voice") {
214 sendError(callback, new Error(ERROR_MESSAGES.product));
215 } else if (!msisdn) {
216 sendError(callback, new Error(ERROR_MESSAGES.msisdn));
217 } else {
218 var pricingEndpoint = getEndpoint("/account/get-phone-pricing/outbound");
219 pricingEndpoint.path += "/" + product + "/" + up.api_key + "/" + up.api_secret + "/" + msisdn;
220 sendRequest(pricingEndpoint, callback);
221 }
222};
223
224exports.getNumbers = function (options, callback) {
225 var numbersEndpoint = getEndpoint("/account/numbers");
226 if (typeof options === "function") {
227 callback = options;
228 } else if ((typeof options === "undefined" ? "undefined" : _typeof(options)) === "object") {
229 numbersEndpoint.path = numbersEndpoint.path + "?";
230 for (var key in options) {
231 numbersEndpoint.path = numbersEndpoint.path + key + "=" + options[key] + "&";
232 }
233 } else {
234 sendError(callback, new Error(ERROR_MESSAGES.optionsNotAnObject));
235 return;
236 }
237 sendRequest(numbersEndpoint, callback);
238};
239
240exports.searchNumbers = function (countryCode, pattern, callback) {
241 if (!countryCode || countryCode.length !== 2) {
242 sendError(callback, new Error(ERROR_MESSAGES.countrycode));
243 } else {
244 var searchEndpoint = getEndpoint("/number/search");
245 searchEndpoint.path += "?country=" + countryCode;
246 if (typeof pattern === "function") {
247 callback = pattern;
248 } else if ((typeof pattern === "undefined" ? "undefined" : _typeof(pattern)) === "object") {
249 searchEndpoint.path = searchEndpoint.path + "&";
250 for (var arg in pattern) {
251 searchEndpoint.path = searchEndpoint.path + arg + "=" + pattern[arg] + "&";
252 }
253 } else {
254 searchEndpoint.path = searchEndpoint.path + "&pattern=" + pattern;
255 }
256 sendRequest(searchEndpoint, callback);
257 }
258};
259
260exports.buyNumber = function (countryCode, msisdn, callback) {
261 if (!countryCode || countryCode.length !== 2) {
262 sendError(callback, new Error(ERROR_MESSAGES.countrycode));
263 } else if (!msisdn) {
264 sendError(callback, new Error(ERROR_MESSAGES.msisdn));
265 } else {
266 var buyEndpoint = getEndpoint("/number/buy");
267 buyEndpoint.path += "?country=" + countryCode + "&msisdn=" + msisdn;
268 sendRequest(buyEndpoint, "POST", callback);
269 }
270};
271
272exports.cancelNumber = function (countryCode, msisdn, callback) {
273 if (!countryCode || countryCode.length !== 2) {
274 sendError(callback, new Error(ERROR_MESSAGES.countrycode));
275 } else if (!msisdn) {
276 sendError(callback, new Error(ERROR_MESSAGES.msisdn));
277 } else {
278 var cancelEndpoint = getEndpoint("/number/cancel");
279 cancelEndpoint.path += "?country=" + countryCode + "&msisdn=" + msisdn;
280 sendRequest(cancelEndpoint, "POST", callback);
281 }
282};
283
284exports.cancelNumber = function (countryCode, msisdn, callback) {
285 if (!countryCode || countryCode.length !== 2) {
286 sendError(callback, new Error(ERROR_MESSAGES.countrycode));
287 } else if (!msisdn) {
288 sendError(callback, new Error(ERROR_MESSAGES.msisdn));
289 } else {
290 var cancelEndpoint = getEndpoint("/number/cancel");
291 cancelEndpoint.path += "?country=" + countryCode + "&msisdn=" + msisdn;
292 sendRequest(cancelEndpoint, "POST", callback);
293 }
294};
295
296exports.updateNumber = function (countryCode, msisdn, params, callback) {
297 if (!countryCode || countryCode.length !== 2) {
298 sendError(callback, new Error(ERROR_MESSAGES.countrycode));
299 } else if (!msisdn) {
300 sendError(callback, new Error(ERROR_MESSAGES.msisdn));
301 } else {
302 var updateEndpoint = getEndpoint("/number/update");
303 updateEndpoint.path += "?country=" + countryCode + "&msisdn=" + msisdn;
304 updateEndpoint.path = updateEndpoint.path + "&";
305 for (var arg in params) {
306 updateEndpoint.path = updateEndpoint.path + arg + "=" + encodeURIComponent(params[arg]) + "&";
307 }
308 sendRequest(updateEndpoint, "POST", callback);
309 }
310};
311
312exports.getApplications = function (options, callback) {
313 var endpoint = getEndpoint(applicationsEndpoint.path);
314 endpoint.host = applicationsEndpoint.host;
315 if (typeof options === "function") {
316 callback = options;
317 } else if ((typeof options === "undefined" ? "undefined" : _typeof(options)) === "object") {
318 endpoint.path += "?";
319 for (var key in options) {
320 endpoint.path += key + "=" + options[key] + "&";
321 }
322 } else {
323 sendError(callback, new Error(ERROR_MESSAGES.optionsNotAnObject));
324 return;
325 }
326 sendRequest(endpoint, callback);
327};
328
329exports.createApplication = function (name, type, answerUrl, eventUrl, options, callback) {
330 if (!name || name.length < 1) {
331 sendError(callback, new Error(ERROR_MESSAGES.applicationName));
332 } else if (!type) {
333 sendError(callback, new Error(ERROR_MESSAGES.applicationType));
334 } else if (!answerUrl) {
335 sendError(callback, new Error(ERROR_MESSAGES.applicationAnswerUrl));
336 } else if (!eventUrl) {
337 sendError(callback, new Error(ERROR_MESSAGES.applicationEventUrl));
338 } else {
339 var createEndpoint = getEndpoint(applicationsEndpoint.path);
340 createEndpoint.host = applicationsEndpoint.host;
341 createEndpoint.path += "?name=" + encodeURIComponent(name) + "&type=" + type + "&answer_url=" + answerUrl + "&event_url=" + eventUrl;
342 for (var key in options) {
343 createEndpoint.path += "&" + key + "=" + options[key];
344 }
345 sendRequest(createEndpoint, "POST", callback);
346 }
347};
348
349exports.getApplication = function (appId, callback) {
350 if (!appId || appId.length < 36) {
351 sendError(callback, new Error(ERROR_MESSAGES.applicationId));
352 } else {
353 var showEndpoint = getEndpoint(applicationsEndpoint.path + "/" + appId);
354 showEndpoint.host = applicationsEndpoint.host;
355 sendRequest(showEndpoint, callback);
356 }
357};
358
359exports.updateApplication = function (appId, name, type, answerUrl, eventUrl, options, callback) {
360 if (!appId || appId.length < 36) {
361 sendError(callback, new Error(ERROR_MESSAGES.applicationId));
362 } else if (!name || name.length < 1) {
363 sendError(callback, new Error(ERROR_MESSAGES.applicationName));
364 } else if (!type) {
365 sendError(callback, new Error(ERROR_MESSAGES.applicationType));
366 } else if (!answerUrl) {
367 sendError(callback, new Error(ERROR_MESSAGES.applicationAnswerUrl));
368 } else if (!eventUrl) {
369 sendError(callback, new Error(ERROR_MESSAGES.applicationEventUrl));
370 } else {
371 var updateEndpoint = getEndpoint(applicationsEndpoint.path + "/" + appId);
372 updateEndpoint.path += "?name=" + encodeURIComponent(name) + "&type=" + type + "&answer_url=" + answerUrl + "&event_url=" + eventUrl;
373 updateEndpoint.host = applicationsEndpoint.host;
374 for (var key in options) {
375 updateEndpoint.path = updateEndpoint.path + "&" + key + "=" + options[key];
376 }
377 sendRequest(updateEndpoint, "PUT", callback);
378 }
379};
380
381exports.deleteApplication = function (appId, callback) {
382 if (!appId || appId.length < 36) {
383 sendError(callback, new Error(ERROR_MESSAGES.applicationId));
384 } else {
385 var deleteEndpoint = getEndpoint(applicationsEndpoint.path + "/" + appId);
386 deleteEndpoint.host = applicationsEndpoint.host;
387 sendRequest(deleteEndpoint, "DELETE", callback);
388 }
389};
390
391exports.changePassword = function (newSecret, callback) {
392 var settingsEndpoint = getEndpoint("/account/settings");
393 settingsEndpoint.path += "?newSecret=" + encodeURIComponent(newSecret);
394 sendRequest(settingsEndpoint, "POST", callback);
395};
396
397exports.changeMoCallbackUrl = function (newUrl, callback) {
398 var settingsEndpoint = getEndpoint("/account/settings");
399 settingsEndpoint.path += "?moCallBackUrl=" + encodeURIComponent(newUrl);
400 sendRequest(settingsEndpoint, "POST", callback);
401};
402
403exports.changeDrCallbackUrl = function (newUrl, callback) {
404 var settingsEndpoint = getEndpoint("/account/settings");
405 settingsEndpoint.path += "?drCallBackUrl=" + encodeURIComponent(newUrl);
406 sendRequest(settingsEndpoint, "POST", callback);
407};
408
409exports.verifyNumber = function (inputParams, callback) {
410 if (!inputParams.number || !inputParams.brand) {
411 sendError(callback, new Error(ERROR_MESSAGES.verifyValidation));
412 } else {
413 var vEndpoint = clone(verifyEndpoint);
414 vEndpoint.path += "?" + querystring.stringify(inputParams);
415 sendRequest(vEndpoint, callback);
416 }
417};
418
419exports.checkVerifyRequest = function (inputParams, callback) {
420 if (!inputParams.request_id || !inputParams.code) {
421 sendError(callback, new Error(ERROR_MESSAGES.checkVerifyValidation));
422 } else {
423 var vEndpoint = clone(checkVerifyEndpoint);
424 vEndpoint.path += "?" + querystring.stringify(inputParams);
425 sendRequest(vEndpoint, callback);
426 }
427};
428
429exports.controlVerifyRequest = function (inputParams, callback) {
430 if (!inputParams.request_id || !inputParams.cmd) {
431 sendError(callback, new Error(ERROR_MESSAGES.controlVerifyValidation));
432 } else {
433 var vEndpoint = clone(controlVerifyEndpoint);
434 vEndpoint.path += "?" + querystring.stringify(inputParams);
435 sendRequest(vEndpoint, callback);
436 }
437};
438
439exports.searchVerifyRequest = function (requestIds, callback) {
440 var requestIdParam = {};
441 if (!requestIds) {
442 sendError(callback, new Error(ERROR_MESSAGES.searchVerifyValidation));
443 } else {
444 if (Array.isArray(requestIds)) {
445 if (requestIds.length === 1) {
446 requestIdParam.request_id = requestIds;
447 } else {
448 requestIdParam.request_ids = requestIds;
449 }
450 } else {
451 requestIdParam.request_id = requestIds;
452 }
453 var vEndpoint = clone(searchVerifyEndpoint);
454 vEndpoint.path += "?" + querystring.stringify(requestIdParam);
455 sendRequest(vEndpoint, callback);
456 }
457};
458
459exports.numberInsight = function (inputParams, callback) {
460 numberInsightAsync(inputParams, callback);
461};
462
463exports.numberInsightBasic = function (inputParams, callback) {
464 numberInsightCommon(niBasicEndpoint, inputParams, callback);
465};
466
467exports.numberInsightStandard = function (inputParams, callback) {
468 numberInsightCommon(niStandardEndpoint, inputParams, callback);
469};
470
471exports.numberInsightAdvanced = function (inputParams, callback) {
472 numberInsightCommon(niAdvancedEndpoint, inputParams, callback);
473};
474
475exports.numberInsightAdvancedAsync = function (inputParams, callback) {
476 numberInsightAsync(inputParams, callback);
477};
478
479function numberInsightAsync(inputParams, callback) {
480 if (!inputParams.number || !inputParams.callback) {
481 sendError(callback, new Error(ERROR_MESSAGES.numberInsightAdvancedValidation));
482 } else {
483 var nEndpoint = clone(niEndpoint);
484 nEndpoint.path += "?" + querystring.stringify(inputParams);
485 sendRequest(nEndpoint, callback);
486 }
487}
488
489function numberInsightCommon(endpoint, inputParams, callback) {
490 if (validateNumber(inputParams, callback)) {
491 var inputObj;
492 if ((typeof inputParams === "undefined" ? "undefined" : _typeof(inputParams)) !== "object") {
493 inputObj = { number: inputParams };
494 } else {
495 inputObj = inputParams;
496 }
497 var nEndpoint = clone(endpoint);
498 nEndpoint.path += "?" + querystring.stringify(inputObj);
499 sendRequest(nEndpoint, callback);
500 }
501}
502function validateNumber(inputParams, callback) {
503 if ((typeof inputParams === "undefined" ? "undefined" : _typeof(inputParams)) === "object" && !inputParams.number) {
504 sendError(callback, new Error(ERROR_MESSAGES.numberInsightValidation));
505 return false;
506 } else if ((typeof inputParams === "undefined" ? "undefined" : _typeof(inputParams)) === "object" && !numberPattern.test(inputParams.number)) {
507 sendError(callback, new Error(ERROR_MESSAGES.numberInsightPatternFailure));
508 return false;
509 } else if ((typeof inputParams === "undefined" ? "undefined" : _typeof(inputParams)) !== "object" && (!inputParams || !numberPattern.test(inputParams))) {
510 sendError(callback, new Error(ERROR_MESSAGES.numberInsightPatternFailure));
511 return false;
512 }
513 return true;
514}
515
516function sendVoiceMessage(voiceEndpoint, data, callback) {
517 if (!data.to) {
518 sendError(callback, new Error(ERROR_MESSAGES.to));
519 } else {
520 var endpoint = clone(voiceEndpoint);
521 endpoint.path += "?" + querystring.stringify(data);
522 _options.logger.info("sending TTS message to " + data.to + " with message " + data.text);
523 sendRequest(endpoint, "POST", function (err, apiResponse) {
524 if (!err && apiResponse.status && apiResponse.status > 0) {
525 sendError(callback, new Error(apiResponse["error-text"]), apiResponse);
526 } else {
527 if (callback) callback(err, apiResponse);
528 }
529 });
530 }
531}
532
533exports.sendTTSMessage = function (recipient, message, opts, callback) {
534 if (!message) {
535 sendError(callback, new Error(ERROR_MESSAGES.msg));
536 } else {
537 if (!opts) {
538 opts = {};
539 }
540 opts["to"] = recipient;
541 opts["text"] = message;
542 sendVoiceMessage(ttsEndpoint, opts, callback);
543 }
544};
545
546exports.sendTTSPromptWithCapture = function (recipient, message, maxDigits, byeText, opts, callback) {
547 if (!message) {
548 sendError(callback, new Error(ERROR_MESSAGES.msg));
549 } else if (!maxDigits || isNaN(maxDigits) || maxDigits.length > 16) {
550 sendError(callback, new Error(ERROR_MESSAGES.maxDigits));
551 } else if (!byeText) {
552 sendError(callback, new Error(ERROR_MESSAGES.byeText));
553 } else {
554 if (!opts) {
555 opts = {};
556 }
557 opts["to"] = recipient;
558 opts["text"] = message;
559 opts["max_digits"] = maxDigits;
560 opts["bye_text"] = byeText;
561 sendVoiceMessage(ttsPromptEndpoint, opts, callback);
562 }
563};
564
565exports.sendTTSPromptWithConfirm = function (recipient, message, maxDigits, pinCode, byeText, failedText, opts, callback) {
566 if (!message) {
567 sendError(callback, new Error(ERROR_MESSAGES.msg));
568 } else if (!maxDigits || isNaN(maxDigits) || maxDigits.length > 16) {
569 sendError(callback, new Error(ERROR_MESSAGES.maxDigits));
570 } else if (!pinCode || pinCode.length !== maxDigits) {
571 sendError(callback, new Error(ERROR_MESSAGES.pinCode));
572 } else if (!byeText) {
573 sendError(callback, new Error(ERROR_MESSAGES.byeText));
574 } else if (!failedText) {
575 sendError(callback, new Error(ERROR_MESSAGES.failedText));
576 } else {
577 if (!opts) {
578 opts = {};
579 }
580 opts["to"] = recipient;
581 opts["text"] = message;
582 opts["max_digits"] = maxDigits;
583 opts["pin_code"] = pinCode;
584 opts["bye_text"] = byeText;
585 opts["failed_text"] = failedText;
586 sendVoiceMessage(ttsPromptEndpoint, opts, callback);
587 }
588};
589
590exports.call = function (recipient, answerUrl, opts, callback) {
591 if (!answerUrl) {
592 sendError(callback, new Error(ERROR_MESSAGES.answerUrl));
593 } else {
594 if (!opts) {
595 opts = {};
596 }
597 opts["to"] = recipient;
598 opts["answer_url"] = answerUrl;
599 sendVoiceMessage(callEndpoint, opts, callback);
600 }
601};
602
603function sendError(callback, err, returnData) {
604 // Throw the error in case if there is no callback passed
605 if (callback) {
606 callback(err, returnData);
607 } else {
608 throw err;
609 }
610}
611
612exports.setHost = function (aHost) {
613 msgpath.host = aHost;
614 shortcodePath.host = aHost;
615 ttsEndpoint.host = aHost;
616 ttsPromptEndpoint.host = aHost;
617 callEndpoint.host = aHost;
618 verifyEndpoint.host = aHost;
619 checkVerifyEndpoint.host = aHost;
620 controlVerifyEndpoint.host = aHost;
621 searchVerifyEndpoint.host = aHost;
622 niEndpoint.host = aHost;
623 niBasicEndpoint.host = aHost;
624 niStandardEndpoint.host = aHost;
625 applicationsEndpoint.host = aHost;
626};
627//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJxdWVyeXN0cmluZyIsInJlcXVpcmUiLCJtc2dwYXRoIiwiaG9zdCIsInBhdGgiLCJzaG9ydGNvZGVQYXRoIiwidHRzRW5kcG9pbnQiLCJ0dHNQcm9tcHRFbmRwb2ludCIsImNhbGxFbmRwb2ludCIsInZlcmlmeUVuZHBvaW50IiwiY2hlY2tWZXJpZnlFbmRwb2ludCIsImNvbnRyb2xWZXJpZnlFbmRwb2ludCIsInNlYXJjaFZlcmlmeUVuZHBvaW50IiwibmlFbmRwb2ludCIsIm5pQmFzaWNFbmRwb2ludCIsIm5pU3RhbmRhcmRFbmRwb2ludCIsIm5pQWR2YW5jZWRFbmRwb2ludCIsImFwcGxpY2F0aW9uc0VuZHBvaW50IiwidXAiLCJudW1iZXJQYXR0ZXJuIiwiUmVnRXhwIiwiX29wdGlvbnMiLCJFUlJPUl9NRVNTQUdFUyIsInNlbmRlciIsInRvIiwibXNnIiwibXNnUGFyYW1zIiwiY291bnRyeWNvZGUiLCJtc2lzZG4iLCJib2R5IiwidWRoIiwidGl0bGUiLCJ1cmwiLCJtYXhEaWdpdHMiLCJieWVUZXh0IiwicGluQ29kZSIsImZhaWxlZFRleHQiLCJhbnN3ZXJVcmwiLCJ2ZXJpZnlWYWxpZGF0aW9uIiwiY2hlY2tWZXJpZnlWYWxpZGF0aW9uIiwiY29udHJvbFZlcmlmeVZhbGlkYXRpb24iLCJzZWFyY2hWZXJpZnlWYWxpZGF0aW9uIiwibnVtYmVySW5zaWdodEFkdmFuY2VkVmFsaWRhdGlvbiIsIm51bWJlckluc2lnaHRWYWxpZGF0aW9uIiwibnVtYmVySW5zaWdodFBhdHRlcm5GYWlsdXJlIiwib3B0aW9uc05vdEFuT2JqZWN0IiwiYXBwbGljYXRpb25OYW1lIiwiYXBwbGljYXRpb25UeXBlIiwiYXBwbGljYXRpb25BbnN3ZXJVcmwiLCJhcHBsaWNhdGlvbkV2ZW50VXJsIiwiYXBwbGljYXRpb25JZCIsInByb2R1Y3QiLCJleHBvcnRzIiwiaW5pdGlhbGl6ZSIsInBrZXkiLCJwc2VjcmV0Iiwib3B0aW9ucyIsImFwaV9rZXkiLCJhcGlfc2VjcmV0Iiwic2VuZEJpbmFyeU1lc3NhZ2UiLCJyZWNpcGllbnQiLCJjYWxsYmFjayIsInNlbmRFcnJvciIsIkVycm9yIiwic2VuZE1lc3NhZ2UiLCJmcm9tIiwidHlwZSIsInNlbmRXYXBQdXNoTWVzc2FnZSIsInZhbGlkaXR5Iiwic2VuZFRleHRNZXNzYWdlIiwibWVzc2FnZSIsIm9wdHMiLCJkYXRhIiwiY2xvbmUiLCJzdHJpbmdpZnkiLCJsb2dnZXIiLCJpbmZvIiwidGV4dCIsInNlbmRSZXF1ZXN0IiwiZXJyIiwiYXBpUmVzcG9uc2UiLCJzdGF0dXMiLCJtZXNzYWdlcyIsInNlbmRWaWFTaG9ydGNvZGUiLCJtZXNzYWdlUGFyYW1zIiwiT2JqZWN0Iiwia2V5cyIsInJlcGxhY2UiLCJmb3JFYWNoIiwia2V5IiwiSlNPTiIsInNob3J0Y29kZUFsZXJ0Iiwic2hvcnRjb2RlMkZBIiwic2hvcnRjb2RlTWFya2V0aW5nIiwiYSIsInBhcnNlIiwiZ2V0RW5kcG9pbnQiLCJhY3Rpb24iLCJlbmRwb2ludCIsIm1ldGhvZCIsImluZGV4T2YiLCJodHRwQ2xpZW50IiwicmVxdWVzdCIsImNoZWNrQmFsYW5jZSIsImJhbGFuY2VFbmRwb2ludCIsImdldFByaWNpbmciLCJjb3VudHJ5Q29kZSIsImxlbmd0aCIsInByaWNpbmdFbmRwb2ludCIsImdldFBob25lUHJpY2luZyIsImdldE51bWJlcnMiLCJudW1iZXJzRW5kcG9pbnQiLCJzZWFyY2hOdW1iZXJzIiwicGF0dGVybiIsInNlYXJjaEVuZHBvaW50IiwiYXJnIiwiYnV5TnVtYmVyIiwiYnV5RW5kcG9pbnQiLCJjYW5jZWxOdW1iZXIiLCJjYW5jZWxFbmRwb2ludCIsInVwZGF0ZU51bWJlciIsInBhcmFtcyIsInVwZGF0ZUVuZHBvaW50IiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiZ2V0QXBwbGljYXRpb25zIiwiY3JlYXRlQXBwbGljYXRpb24iLCJuYW1lIiwiZXZlbnRVcmwiLCJjcmVhdGVFbmRwb2ludCIsImdldEFwcGxpY2F0aW9uIiwiYXBwSWQiLCJzaG93RW5kcG9pbnQiLCJ1cGRhdGVBcHBsaWNhdGlvbiIsImRlbGV0ZUFwcGxpY2F0aW9uIiwiZGVsZXRlRW5kcG9pbnQiLCJjaGFuZ2VQYXNzd29yZCIsIm5ld1NlY3JldCIsInNldHRpbmdzRW5kcG9pbnQiLCJjaGFuZ2VNb0NhbGxiYWNrVXJsIiwibmV3VXJsIiwiY2hhbmdlRHJDYWxsYmFja1VybCIsInZlcmlmeU51bWJlciIsImlucHV0UGFyYW1zIiwibnVtYmVyIiwiYnJhbmQiLCJ2RW5kcG9pbnQiLCJjaGVja1ZlcmlmeVJlcXVlc3QiLCJyZXF1ZXN0X2lkIiwiY29kZSIsImNvbnRyb2xWZXJpZnlSZXF1ZXN0IiwiY21kIiwic2VhcmNoVmVyaWZ5UmVxdWVzdCIsInJlcXVlc3RJZHMiLCJyZXF1ZXN0SWRQYXJhbSIsIkFycmF5IiwiaXNBcnJheSIsInJlcXVlc3RfaWRzIiwibnVtYmVySW5zaWdodCIsIm51bWJlckluc2lnaHRBc3luYyIsIm51bWJlckluc2lnaHRCYXNpYyIsIm51bWJlckluc2lnaHRDb21tb24iLCJudW1iZXJJbnNpZ2h0U3RhbmRhcmQiLCJudW1iZXJJbnNpZ2h0QWR2YW5jZWQiLCJudW1iZXJJbnNpZ2h0QWR2YW5jZWRBc3luYyIsIm5FbmRwb2ludCIsInZhbGlkYXRlTnVtYmVyIiwiaW5wdXRPYmoiLCJ0ZXN0Iiwic2VuZFZvaWNlTWVzc2FnZSIsInZvaWNlRW5kcG9pbnQiLCJzZW5kVFRTTWVzc2FnZSIsInNlbmRUVFNQcm9tcHRXaXRoQ2FwdHVyZSIsImlzTmFOIiwic2VuZFRUU1Byb21wdFdpdGhDb25maXJtIiwiY2FsbCIsInJldHVybkRhdGEiLCJzZXRIb3N0IiwiYUhvc3QiXSwibWFwcGluZ3MiOiJBQUFBOzs7O0FBRUEsSUFBSUEsY0FBY0MsUUFBUSxhQUFSLENBQWxCOztBQUVBLElBQUlDLFVBQVUsRUFBRUMsTUFBTSxnQkFBUixFQUEwQkMsTUFBTSxXQUFoQyxFQUFkO0FBQ0EsSUFBSUMsZ0JBQWdCLEVBQUVGLE1BQU0s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ZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG52YXIgcXVlcnlzdHJpbmcgPSByZXF1aXJlKFwicXVlcnlzdHJpbmdcIik7XG5cbnZhciBtc2dwYXRoID0geyBob3N0OiBcInJlc3QubmV4bW8uY29tXCIsIHBhdGg6IFwiL3Ntcy9qc29uXCIgfTtcbnZhciBzaG9ydGNvZGVQYXRoID0geyBob3N0OiBcInJlc3QubmV4bW8uY29tXCIsIHBhdGg6IFwiL3NjL3VzLyR7dHlwZX0vanNvblwiIH07XG52YXIgdHRzRW5kcG9pbnQgPSB7IGhvc3Q6IFwiYXBpLm5leG1vLmNvbVwiLCBwYXRoOiBcIi90dHMvanNvblwiIH07XG52YXIgdHRzUHJvbXB0RW5kcG9pbnQgPSB7IGhvc3Q6IFwiYXBpLm5leG1vLmNvbVwiLCBwYXRoOiBcIi90dHMtcHJvbXB0L2pzb25cIiB9O1xudmFyIGNhbGxFbmRwb2ludCA9IHsgaG9zdDogXCJyZXN0Lm5leG1vLmNvbVwiLCBwYXRoOiBcIi9jYWxsL2pzb25cIiB9O1xudmFyIHZlcmlmeUVuZHBvaW50ID0geyBob3N0OiBcImFwaS5uZXhtby5jb21cIiwgcGF0aDogXCIvdmVyaWZ5L2pzb25cIiB9O1xudmFyIGNoZWNrVmVyaWZ5RW5kcG9pbnQgPSB7IGhvc3Q6IFwiYXBpLm5leG1vLmNvbVwiLCBwYXRoOiBcIi92ZXJpZnkvY2hlY2svanNvblwiIH07XG52YXIgY29udHJvbFZlcmlmeUVuZHBvaW50ID0ge1xuICBob3N0OiBcImFwaS5uZXhtby5jb21cIixcbiAgcGF0aDogXCIvdmVyaWZ5L2NvbnRyb2wvanNvblwiXG59O1xudmFyIHNlYXJjaFZlcmlmeUVuZHBvaW50ID0ge1xuICBob3N0OiBcImFwaS5uZXhtby5jb21cIixcbiAgcGF0aDogXCIvdmVyaWZ5L3NlYXJjaC9qc29uXCJcbn07XG52YXIgbmlFbmRwb2ludCA9IHsgaG9zdDogXCJhcGkubmV4bW8uY29tXCIsIHBhdGg6IFwiL25pL2FkdmFuY2VkL2FzeW5jL2pzb25cIiB9O1xudmFyIG5pQmFzaWNFbmRwb2ludCA9IHsgaG9zdDogXCJhcGkubmV4bW8uY29tXCIsIHBhdGg6IFwiL25pL2Jhc2ljL2pzb25cIiB9O1xudmFyIG5pU3RhbmRhcmRFbmRwb2ludCA9IHsgaG9zdDogXCJhcGkubmV4bW8uY29tXCIsIHBhdGg6IFwiL25pL3N0YW5kYXJkL2pzb25cIiB9O1xudmFyIG5pQWR2YW5jZWRFbmRwb2ludCA9IHsgaG9zdDogXCJhcGkubmV4bW8uY29tXCIsIHBhdGg6IFwiL25pL2FkdmFuY2VkL2pzb25cIiB9O1xudmFyIGFwcGxpY2F0aW9uc0VuZHBvaW50ID0geyBob3N0OiBcImFwaS5uZXhtby5jb21cIiwgcGF0aDogXCIvdjEvYXBwbGljYXRpb25zXCIgfTtcbnZhciB1cCA9IHt9O1xudmFyIG51bWJlclBhdHRlcm4gPSBuZXcgUmVnRXhwKFwiXlswLTkgKygpLV0qJFwiKTtcblxudmFyIF9vcHRpb25zID0gbnVsbDtcblxuLy8gRXJyb3IgbWVzc2FnZSByZXNvdXJjZXMgYXJlIG1haW50YWluZWQgZ2xvYmFsbHkgaW4gb25lIHBsYWNlIGZvciBlYXN5IG1hbmFnZW1lbnRcbnZhciBFUlJPUl9NRVNTQUdFUyA9IHtcbiAgc2VuZGVyOiBcIkludmFsaWQgZnJvbSBhZGRyZXNzXCIsXG4gIHRvOiBcIkludmFsaWQgdG8gYWRkcmVzc1wiLFxuICBtc2c6IFwiSW52YWxpZCBUZXh0IE1lc3NhZ2VcIixcbiAgbXNnUGFyYW1zOiBcIkludmFsaWQgc2hvcnRjb2RlIG1lc3NhZ2UgcGFyYW1ldGVyc1wiLFxuICBjb3VudHJ5Y29kZTogXCJJbnZhbGlkIENvdW50cnkgQ29kZVwiLFxuICBtc2lzZG46IFwiSW52YWxpZCBNU0lTRE4gcGFzc2VkXCIsXG4gIGJvZHk6IFwiSW52YWxpZCBCb2R5IHZhbHVlIGluIEJpbmFyeSBNZXNzYWdlXCIsXG4gIHVkaDogXCJJbnZhbGlkIHVkaCB2YWx1ZSBpbiBCaW5hcnkgTWVzc2FnZVwiLFxuICB0aXRsZTogXCJJbnZhbGlkIHRpdGxlIGluIFdBUCBQdXNoIG1lc3NhZ2VcIixcbiAgdXJsOiBcIkludmFsaWQgdXJsIGluIFdBUCBQdXNoIG1lc3NhZ2VcIixcbiAgbWF4RGlnaXRzOiBcIkludmFsaWQgbWF4IGRpZ2l0cyBmb3IgVFRTIHByb21wdFwiLFxuICBieWVUZXh0OiBcIkludmFsaWQgYnllIHRleHQgZm9yIFRUUyBwcm9tcHRcIixcbiAgcGluQ29kZTogXCJJbnZhbGlkIHBpbiBjb2RlIGZvciBUVFMgY29uZmlybVwiLFxuICBmYWlsZWRUZXh0OiBcIkludmFsaWQgZmFpbGVkIHRleHQgZm9yIFRUUyBjb25maXJtXCIsXG4gIGFuc3dlclVybDogXCJJbnZhbGlkIGFuc3dlciBVUkwgZm9yIGNhbGxcIixcbiAgdmVyaWZ5VmFsaWRhdGlvbjogXCJNaXNzaW5nIE1hbmRhdG9yeSBmaWVsZHMgKG51bWJlciBhbmQvb3IgYnJhbmQpXCIsXG4gIGNoZWNrVmVyaWZ5VmFsaWRhdGlvbjogXCJNaXNzaW5nIE1hbmRhdG9yeSBmaWVsZHMgKHJlcXVlc3RfaWQgYW5kL29yIGNvZGUpXCIsXG4gIGNvbnRyb2xWZXJpZnlWYWxpZGF0aW9uOlxuICAgIFwiTWlzc2luZyBNYW5kYXRvcnkgZmllbGRzIChyZXF1ZXN0X2lkIGFuZC9vciBjbWQtY29tbWFuZClcIixcbiAgc2VhcmNoVmVyaWZ5VmFsaWRhdGlvbjpcbiAgICBcIk1pc3NpbmcgTWFuZGF0b3J5IGZpZWxkcyAocmVxdWVzdF9pZCBvciByZXF1ZXN0X2lkcylcIixcbiAgbnVtYmVySW5zaWdodEFkdmFuY2VkVmFsaWRhdGlvbjpcbiAgICBcIk1pc3NpbmcgTWFuZGF0b3J5IGZpZWxkcyAobnVtYmVyIGFuZC9vciBjYWxsYmFjayB1cmwpXCIsXG4gIG51bWJlckluc2lnaHRWYWxpZGF0aW9uOiBcIk1pc3NpbmcgTWFuZGF0b3J5IGZpZWxkIC0gbnVtYmVyXCIsXG4gIG51bWJlckluc2lnaHRQYXR0ZXJuRmFpbHVyZTpcbiAgICBcIk51bWJlciBjYW4gY29udGFpbiBkaWdpdHMgYW5kIG1heSBpbmNsdWRlIGFueSBvciBhbGwgb2YgdGhlIGZvbGxvd2luZzogd2hpdGUgc3BhY2UsIC0sKywgKCwgKS5cIixcbiAgb3B0aW9uc05vdEFuT2JqZWN0OlxuICAgIFwiT3B0aW9ucyBwYXJhbWV0ZXIgc2hvdWxkIGJlIGEgZGljdGlvbmFyeS4gQ2hlY2sgdGhlIGRvY3MgZm9yIHZhbGlkIHByb3BlcnRpZXMgZm9yIG9wdGlvbnNcIixcbiAgYXBwbGljYXRpb25OYW1lOiBcIkludmFsaWQgYXJndW1lbnQ6IG5hbWVcIixcbiAgYXBwbGljYXRpb25UeXBlOiBcIkludmFsaWQgYXJndW1lbnQ6IHR5cGVcIixcbiAgYXBwbGljYXRpb25BbnN3ZXJVcmw6IFwiSW52YWxpZCBhcmd1bWVudDogYW5zd2VyVXJsXCIsXG4gIGFwcGxpY2F0aW9uRXZlbnRVcmw6IFwiSW52YWxpZCBhcmd1bWVudDogZXZlbnRVcmxcIixcbiAgYXBwbGljYXRpb25JZDogXCJJbnZhbGlkIGFyZ3VtZW50OiBhcHBJZFwiLFxuICBwcm9kdWN0OiBcIkludmFsaWQgcHJvZHVjdC4gU2hvdWxkIGJlIG9uZSBvZiBbdm9pY2UsIHNtc11cIlxufTtcblxuZXhwb3J0cy5pbml0aWFsaXplID0gZnVuY3Rpb24ocGtleSwgcHNlY3JldCwgb3B0aW9ucykge1xuICBpZiAoIXBrZXkgfHwgIXBzZWNyZXQpIHtcbiAgICB0aHJvdyBcImtleSBhbmQgc2VjcmV0IGNhbm5vdCBiZSBlbXB0eSwgc2V0IHZhbGlkIHZhbHVlc1wiO1xuICB9XG4gIHVwID0ge1xuICAgIGFwaV9rZXk6IHBrZXksXG4gICAgYXBpX3NlY3JldDogcHNlY3JldFxuICB9O1xuICBfb3B0aW9ucyA9IG9wdGlvbnM7XG59O1xuXG5leHBvcnRzLnNlbmRCaW5hcnlNZXNzYWdlID0gZnVuY3Rpb24oc2VuZGVyLCByZWNpcGllbnQsIGJvZHksIHVkaCwgY2FsbGJhY2spIHtcbiAgaWYgKCFib2R5KSB7XG4gICAgc2VuZEVycm9yKGNhbGxiYWNrLCBuZXcgRXJyb3IoRVJST1JfTUVTU0FHRVMuYm9keSkpO1xuICB9IGVsc2UgaWYgKCF1ZGgpIHtcbiAgICBzZW5kRXJyb3IoY2FsbGJhY2ssIG5ldyBFcnJvcihFUlJPUl9NRVNTQUdFUy51ZGgpKTtcbiAgfSBlbHNlIHtcbiAgICBzZW5kTWVzc2FnZShcbiAgICAgIHtcbiAgICAgICAgZnJvbTogc2VuZGVyLFxuICAgICAgICB0bzogcmVjaXBpZW50LFxuICAgICAgICB0eXBlOiBcImJpbmFyeVwiLFxuICAgICAgICBib2R5OiBib2R5LFxuICAgICAgICB1ZGg6IHVkaFxuICAgICAgfSxcbiAgICAgIGNhbGxiYWNrXG4gICAgKTtcbiAgfVxufTtcblxuZXhwb3J0cy5zZW5kV2FwUHVzaE1lc3NhZ2UgPSBmdW5jdGlvbihcbiAgc2VuZGVyLFxuICByZWNpcGllbnQsXG4gIHRpdGxlLFxuICB1cmwsXG4gIHZhbGlkaXR5LFxuICBjYWxsYmFja1xuKSB7XG4gIGlmICghdGl0bGUpIHtcbiAgICBzZW5kRXJyb3IoY2FsbGJhY2ssIG5ldyBFcnJvcihFUlJPUl9NRVNTQUdFUy50aXRsZSkpO1xuICB9IGVsc2UgaWYgKCF1cmwpIHtcbiAgICBzZW5kRXJyb3IoY2FsbGJhY2ssIG5ldyBFcnJvcihFUlJPUl9NRVNTQUdFUy51cmwpKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIHZhbGlkaXR5ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNhbGxiYWNrID0gdmFsaWRpdHk7XG4gICAgICB2YWxpZGl0eSA9IDg2NDAwMDAwO1xuICAgIH1cbiAgICBzZW5kTWVzc2FnZShcbiAgICAgIHtcbiAgICAgICAgZnJvbTogc2VuZGVyLFxuICAgICAgICB0bzogcmVjaXBpZW50LFxuICAgICAgICB0eXBlOiBcIndhcHB1c2hcIixcbiAgICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgICB2YWxpZGl0eTogdmFsaWRpdHksXG4gICAgICAgIHVybDogdXJsXG4gICAgICB9LFxuICAgICAgY2FsbGJhY2tcbiAgICApO1xuICB9XG59O1xuXG5leHBvcnRzLnNlbmRUZXh0TWVzc2FnZSA9IGZ1bmN0aW9uKHNlbmRlciwgcmVjaXBpZW50LCBtZXNzYWdlLCBvcHRzLCBjYWxsYmFjaykge1xuICBpZiAoIW1lc3NhZ2UpIHtcbiAgICBzZW5kRXJyb3IoY2FsbGJhY2ssIG5ldyBFcnJvcihFUlJPUl9NRVNTQUdFUy5tc2cpKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuICAgIG9wdHNbXCJmcm9tXCJdID0gc2VuZGVyO1xuICAgIG9wdHNbXCJ0b1wiXSA9IHJlY2lwaWVudDtcbiAgICBvcHRzW1widGV4dFwiXSA9IG1lc3NhZ2U7XG4gICAgc2VuZE1lc3NhZ2Uob3B0cywgY2FsbGJhY2spO1xuICB9XG59O1xuXG5leHBvcnRzLnNlbmRNZXNzYWdlID0gZnVuY3Rpb24ob3B0cywgY2FsbGJhY2spIHtcbiAgc2VuZE1lc3NhZ2Uob3B0cywgY2FsbGJhY2spO1xufTtcbmZ1bmN0aW9uIHNlbmRNZXNzYWdlKGRhdGEsIGNhbGxiYWNrKSB7XG4gIGlmICghZGF0YS5mcm9tKSB7XG4gICAgc2VuZEVycm9yKGNhbGxiYWNrLCBuZXcgRXJyb3IoRVJST1JfTUVTU0FHRVMuc2VuZGVyKSk7XG4gIH0gZWxzZSBpZiAoIWRhdGEudG8pIHtcbiAgICBzZW5kRXJyb3IoY2FsbGJhY2ssIG5ldyBFcnJvcihFUlJPUl9NRVNTQUdFUy50bykpO1xuICB9IGVsc2Uge1xuICAgIHZhciBwYXRoID0gY2xvbmUobXNncGF0aCk7XG4gICAgcGF0aC5wYXRoICs9IFwiP1wiICsgcXVlcnlzdHJpbmcuc3RyaW5naWZ5KGRhdGEpO1xuICAgIF9vcHRpb25zLmxvZ2dlci5pbmZvKFxuICAgICAgXCJzZW5kaW5nIG1lc3NhZ2UgZnJvbSBcIiArXG4gICAgICAgIGRhdGEuZnJvbSArXG4gICAgICAgIFwiIHRvIFwiICtcbiAgICAgICAgZGF0YS50byArXG4gICAgICAgIFwiIHdpdGggbWVzc2FnZSBcIiArXG4gICAgICAgIGRhdGEudGV4dFxuICAgICk7XG4gICAgc2VuZFJlcXVlc3QocGF0aCwgXCJQT1NUXCIsIGZ1bmN0aW9uKGVyciwgYXBpUmVzcG9uc2UpIHtcbiAgICAgIGlmICghZXJyICYmIGFwaVJlc3BvbnNlLnN0YXR1cyAmJiBhcGlSZXNwb25zZS5tZXNzYWdlc1swXS5zdGF0dXMgPiAwKSB7XG4gICAgICAgIHNlbmRFcnJvcihcbiAgICAgICAgICBjYWxsYmFjayxcbiAgICAgICAgICBuZXcgRXJyb3IoYXBpUmVzcG9uc2UubWVzc2FnZXNbMF1bXCJlcnJvci10ZXh0XCJdKSxcbiAgICAgICAgICBhcGlSZXNwb25zZVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhlcnIsIGFwaVJlc3BvbnNlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzZW5kVmlhU2hvcnRjb2RlKHR5cGUsIHJlY2lwaWVudCwgbWVzc2FnZVBhcmFtcywgb3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKCFyZWNpcGllbnQpIHtcbiAgICBzZW5kRXJyb3IoY2FsbGJhY2ssIG5ldyBFcnJvcihFUlJPUl9NRVNTQUdFUy50bykpO1xuICB9XG4gIGlmICghbWVzc2FnZVBhcmFtcyB8fCAhT2JqZWN0LmtleXMobWVzc2FnZVBhcmFtcykpIHtcbiAgICBzZW5kRXJyb3IoY2FsbGJhY2ssIG5ldyBFcnJvcihFUlJPUl9NRVNTQUdFUy5tc2dQYXJhbXMpKTtcbiAgfVxuICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgdmFyIHBhdGggPSBjbG9uZShzaG9ydGNvZGVQYXRoKTtcbiAgcGF0aC5wYXRoID0gcGF0aC5wYXRoLnJlcGxhY2UoXCIke3R5cGV9XCIsIHR5cGUpO1xuICBPYmplY3Qua2V5cyhtZXNzYWdlUGFyYW1zKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIG9wdHNba2V5XSA9IG1lc3NhZ2VQYXJhbXNba2V5XTtcbiAgfSk7XG4gIG9wdHMudG8gPSByZWNpcGllbnQ7XG4gIHBhdGgucGF0aCArPSBcIj9cIiArIHF1ZXJ5c3RyaW5nLnN0cmluZ2lmeShvcHRzKTtcbiAgX29wdGlvbnMubG9nZ2VyLmluZm8oXG4gICAgXCJzZW5kaW5nIG1lc3NhZ2UgZnJvbSBzaG9ydGNvZGUgXCIgK1xuICAgICAgdHlwZSArXG4gICAgICBcIiB0byBcIiArXG4gICAgICByZWNpcGllbnQgK1xuICAgICAgXCIgd2l0aCBwYXJhbWV0ZXJzIFwiICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KG1lc3NhZ2VQYXJhbXMpXG4gICk7XG4gIHNlbmRSZXF1ZXN0KHBhdGgsIFwiUE9TVFwiLCBmdW5jdGlvbihlcnIsIGFwaVJlc3BvbnNlKSB7XG4gICAgaWYgKCFlcnIgJiYgYXBpUmVzcG9uc2Uuc3RhdHVzICYmIGFwaVJlc3BvbnNlLm1lc3NhZ2VzWzBdLnN0YXR1cyA+IDApIHtcbiAgICAgIHNlbmRFcnJvcihcbiAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgIG5ldyBFcnJvcihhcGlSZXNwb25zZS5tZXNzYWdlc1swXVtcImVycm9yLXRleHRcIl0pLFxuICAgICAgICBhcGlSZXNwb25zZVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhlcnIsIGFwaVJlc3BvbnNlKTtcbiAgICB9XG4gIH0pO1xufVxuZXhwb3J0cy5zaG9ydGNvZGVBbGVydCA9IGZ1bmN0aW9uKHJlY2lwaWVudCwgbWVzc2FnZVBhcmFtcywgb3B0cywgY2FsbGJhY2spIHtcbiAgc2VuZFZpYVNob3J0Y29kZShcImFsZXJ0XCIsIHJlY2lwaWVudCwgbWVzc2FnZVBhcmFtcywgb3B0cywgY2FsbGJhY2spO1xufTtcbmV4cG9ydHMuc2hvcnRjb2RlMkZBID0gZnVuY3Rpb24ocmVjaXBpZW50LCBtZXNzYWdlUGFyYW1zLCBvcHRzLCBjYWxsYmFjaykge1xuICBzZW5kVmlhU2hvcnRjb2RlKFwiMmZhXCIsIHJlY2lwaWVudCwgbWVzc2FnZVBhcmFtcywgb3B0cywgY2FsbGJhY2spO1xufTtcbmV4cG9ydHMuc2hvcnRjb2RlTWFya2V0aW5nID0gZnVuY3Rpb24oXG4gIHJlY2lwaWVudCxcbiAgbWVzc2FnZVBhcmFtcyxcbiAgb3B0cyxcbiAgY2FsbGJhY2tcbikge1xuICBzZW5kVmlhU2hvcnRjb2RlKFwibWFya2V0aW5nXCIsIHJlY2lwaWVudCwgbWVzc2FnZVBhcmFtcywgb3B0cywgY2FsbGJhY2spO1xufTtcblxuZnVuY3Rpb24gY2xvbmUoYSkge1xuICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShhKSk7XG59XG5cbmZ1bmN0aW9uIGdldEVuZHBvaW50KGFjdGlvbikge1xuICByZXR1cm4geyBwYXRoOiBhY3Rpb24gfTtcbn1cblxuZnVuY3Rpb24gc2VuZFJlcXVlc3QoZW5kcG9pbnQsIG1ldGhvZCwgY2FsbGJhY2spIHtcbiAgZW5kcG9pbnQucGF0aCA9XG4gICAgZW5kcG9pbnQucGF0aCArXG4gICAgKGVuZHBvaW50LnBhdGguaW5kZXhPZihcIj9cIikgPiAwID8gXCImXCIgOiBcIj9cIikgK1xuICAgIHF1ZXJ5c3RyaW5nLnN0cmluZ2lmeSh1cCk7XG4gIF9vcHRpb25zLmh0dHBDbGllbnQucmVxdWVzdChlbmRwb2ludCwgbWV0aG9kLCBjYWxsYmFjayk7XG59XG5cbmV4cG9ydHMuY2hlY2tCYWxhbmNlID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgdmFyIGJhbGFuY2VFbmRwb2ludCA9IGdldEVuZHBvaW50KFwiL2FjY291bnQvZ2V0LWJhbGFuY2VcIik7XG4gIHNlbmRSZXF1ZXN0KGJhbGFuY2VFbmRwb2ludCwgY2FsbGJhY2spO1xufTtcblxuZXhwb3J0cy5nZXRQcmljaW5nID0gZnVuY3Rpb24oY291bnRyeUNvZGUsIGNhbGxiYWNrKSB7XG4gIGlmICghY291bnRyeUNvZGUgfHwgY291bnRyeUNvZGUubGVuZ3RoICE9PSAyKSB7XG4gICAgc2VuZEVycm9yKGNhbGxiYWNrLCBuZXcgRXJyb3IoRVJST1JfTUVTU0FHRVMuY291bnRyeWNvZGUpKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgcHJpY2luZ0VuZHBvaW50ID0gZ2V0RW5kcG9pbnQoXCIvYWNjb3VudC9nZXQtcHJpY2luZy9vdXRib3VuZFwiKTtcbiAgICBwcmljaW5nRW5kcG9pbnQucGF0aCArPSBcIj9jb3VudHJ5PVwiICsgY291bnRyeUNvZGU7XG4gICAgc2VuZFJlcXVlc3QocHJpY2luZ0VuZHBvaW50LCBjYWxsYmFjayk7XG4gIH1cbn07XG5cbmV4cG9ydHMuZ2V0UGhvbmVQcmljaW5nID0gZnVuY3Rpb24ocHJvZHVjdCwgbXNpc2RuLCBjYWxsYmFjaykge1xuICBpZiAoIXByb2R1Y3QgfHwgKHByb2R1Y3QgIT09IFwic21zXCIgJiYgcHJvZHVjdCAhPT0gXCJ2b2ljZVwiKSkge1xuICAgIHNlbmRFcnJvcihjYWxsYmFjaywgbmV3IEVycm9yKEVSUk9SX01FU1NBR0VTLnByb2R1Y3QpKTtcbiAgfSBlbHNlIGlmICghbXNpc2RuKSB7XG4gICAgc2VuZEVycm9yKGNhbGxiYWNrLCBuZXcgRXJyb3IoRVJST1JfTUVTU0FHRVMubXNpc2RuKSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHByaWNpbmdFbmRwb2ludCA9IGdldEVuZHBvaW50KFwiL2FjY291bnQvZ2V0LXBob25lLXByaWNpbmcvb3V0Ym91bmRcIik7XG4gICAgcHJpY2luZ0VuZHBvaW50LnBhdGggKz1cbiAgICAgIFwiL1wiICsgcHJvZHVjdCArIFwiL1wiICsgdXAuYXBpX2tleSArIFwiL1wiICsgdXAuYXBpX3NlY3JldCArIFwiL1wiICsgbXNpc2RuO1xuICAgIHNlbmRSZXF1ZXN0KHByaWNpbmdFbmRwb2ludCwgY2FsbGJhY2spO1xuICB9XG59O1xuXG5leHBvcnRzLmdldE51bWJlcnMgPSBmdW5jdGlvbihvcHRpb25zLCBjYWxsYmFjaykge1xuICB2YXIgbnVtYmVyc0VuZHBvaW50ID0gZ2V0RW5kcG9pbnQoXCIvYWNjb3VudC9udW1iZXJzXCIpO1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgfSBlbHNlIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gXCJvYmplY3RcIikge1xuICAgIG51bWJlcnNFbmRwb2ludC5wYXRoID0gbnVtYmVyc0VuZHBvaW50LnBhdGggKyBcIj9cIjtcbiAgICBmb3IgKHZhciBrZXkgaW4gb3B0aW9ucykge1xuICAgICAgbnVtYmVyc0VuZHBvaW50LnBhdGggPVxuICAgICAgICBudW1iZXJzRW5kcG9pbnQucGF0aCArIGtleSArIFwiPVwiICsgb3B0aW9uc1trZXldICsgXCImXCI7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHNlbmRFcnJvcihjYWxsYmFjaywgbmV3IEVycm9yKEVSUk9SX01FU1NBR0VTLm9wdGlvbnNOb3RBbk9iamVjdCkpO1xuICAgIHJldHVybjtcbiAgfVxuICBzZW5kUmVxdWVzdChudW1iZXJzRW5kcG9pbnQsIGNhbGxiYWNrKTtcbn07XG5cbmV4cG9ydHMuc2VhcmNoTnVtYmVycyA9IGZ1bmN0aW9uKGNvdW50cnlDb2RlLCBwYXR0ZXJuLCBjYWxsYmFjaykge1xuICBpZiAoIWNvdW50cnlDb2RlIHx8IGNvdW50cnlDb2RlLmxlbmd0aCAhPT0gMikge1xuICAgIHNlbmRFcnJvcihjYWxsYmFjaywgbmV3IEVycm9yKEVSUk9SX01FU1NBR0VTLmNvdW50cnljb2RlKSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHNlYXJjaEVuZHBvaW50ID0gZ2V0RW5kcG9pbnQoXCIvbnVtYmVyL3NlYXJjaFwiKTtcbiAgICBzZWFyY2hFbmRwb2ludC5wYXRoICs9IFwiP2NvdW50cnk9XCIgKyBjb3VudHJ5Q29kZTtcbiAgICBpZiAodHlwZW9mIHBhdHRlcm4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY2FsbGJhY2sgPSBwYXR0ZXJuO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhdHRlcm4gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHNlYXJjaEVuZHBvaW50LnBhdGggPSBzZWFyY2hFbmRwb2ludC5wYXRoICsgXCImXCI7XG4gICAgICBmb3IgKHZhciBhcmcgaW4gcGF0dGVybikge1xuICAgICAgICBzZWFyY2hFbmRwb2ludC5wYXRoID1cbiAgICAgICAgICBzZWFyY2hFbmRwb2ludC5wYXRoICsgYXJnICsgXCI9XCIgKyBwYXR0ZXJuW2FyZ10gKyBcIiZcIjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2VhcmNoRW5kcG9pbnQucGF0aCA9IHNlYXJjaEVuZHBvaW50LnBhdGggKyBcIiZwYXR0ZXJuPVwiICsgcGF0dGVybjtcbiAgICB9XG4gICAgc2VuZFJlcXVlc3Qoc2VhcmNoRW5kcG9pbnQsIGNhbGxiYWNrKTtcbiAgfVxufTtcblxuZXhwb3J0cy5idXlOdW1iZXIgPSBmdW5jdGlvbihjb3VudHJ5Q29kZSwgbXNpc2RuLCBjYWxsYmFjaykge1xuICBpZiAoIWNvdW50cnlDb2RlIHx8IGNvdW50cnlDb2RlLmxlbmd0aCAhPT0gMikge1xuICAgIHNlbmRFcnJvcihjYWxsYmFjaywgbmV3IEVycm9yKEVSUk9SX01FU1NBR0VTLmNvdW50cnljb2RlKSk7XG4gIH0gZWxzZSBpZiAoIW1zaXNkbikge1xuICAgIHNlbmRFcnJvcihjYWxsYmFjaywgbmV3IEVycm9yKEVSUk9SX01FU1NBR0VTLm1zaXNkbikpO1xuICB9IGVsc2Uge1xuICAgIHZhciBidXlFbmRwb2ludCA9IGdldEVuZHBvaW50KFwiL251bWJlci9idXlcIik7XG4gICAgYnV5RW5kcG9pbnQucGF0aCArPSBcIj9jb3VudHJ5PVwiICsgY291bnRyeUNvZGUgKyBcIiZtc2lzZG49XCIgKyBtc2lzZG47XG4gICAgc2VuZFJlcXVlc3QoYnV5RW5kcG9pbnQsIFwiUE9TVFwiLCBjYWxsYmFjayk7XG4gIH1cbn07XG5cbmV4cG9ydHMuY2FuY2VsTnVtYmVyID0gZnVuY3Rpb24oY291bnRyeUNvZGUsIG1zaXNkbiwgY2FsbGJhY2spIHtcbiAgaWYgKCFjb3VudHJ5Q29kZSB8fCBjb3VudHJ5Q29kZS5sZW5ndGggIT09IDIpIHtcbiAgICBzZW5kRXJyb3IoY2FsbGJhY2ssIG5ldyBFcnJvcihFUlJPUl9NRVNTQUdFUy5jb3VudHJ5Y29kZSkpO1xuICB9IGVsc2UgaWYgKCFtc2lzZG4pIHtcbiAgICBzZW5kRXJyb3IoY2FsbGJhY2ssIG5ldyBFcnJvcihFUlJPUl9NRVNTQUdFUy5tc2lzZG4pKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgY2FuY2VsRW5kcG9pbnQgPSBnZXRFbmRwb2ludChcIi9udW1iZXIvY2FuY2VsXCIpO1xuICAgIGNhbmNlbEVuZHBvaW50LnBhdGggKz0gXCI/Y291bnRyeT1cIiArIGNvdW50cnlDb2RlICsgXCImbXNpc2RuPVwiICsgbXNpc2RuO1xuICAgIHNlbmRSZXF1ZXN0KGNhbmNlbEVuZHBvaW50LCBcIlBPU1RcIiwgY2FsbGJhY2spO1xuICB9XG59O1xuXG5leHBvcnRzLmNhbmNlbE51bWJlciA9IGZ1bmN0aW9uKGNvdW50cnlDb2RlLCBtc2lzZG4sIGNhbGxiYWNrKSB7XG4gIGlmICghY291bnRyeUNvZGUgfHwgY291bnRyeUNvZGUubGVuZ3RoICE9PSAyKSB7XG4gICAgc2VuZEVycm9yKGNhbGxiYWNrLCBuZXcgRXJyb3IoRVJST1JfTUVTU0FHRVMuY291bnRyeWNvZGUpKTtcbiAgfSBlbHNlIGlmICghbXNpc2RuKSB7XG4gICAgc2VuZEVycm9yKGNhbGxiYWNrLCBuZXcgRXJyb3IoRVJST1JfTUVTU0FHRVMubXNpc2RuKSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGNhbmNlbEVuZHBvaW50ID0gZ2V0RW5kcG9pbnQoXCIvbnVtYmVyL2NhbmNlbFwiKTtcbiAgICBjYW5jZWxFbmRwb2ludC5wYXRoICs9IFwiP2NvdW50cnk9XCIgKyBjb3VudHJ5Q29kZSArIFwiJm1zaXNkbj1cIiArIG1zaXNkbjtcbiAgICBzZW5kUmVxdWVzdChjYW5jZWxFbmRwb2ludCwgXCJQT1NUXCIsIGNhbGxiYWNrKTtcbiAgfVxufTtcblxuZXhwb3J0cy51cGRhdGVOdW1iZXIgPSBmdW5jdGlvbihjb3VudHJ5Q29kZSwgbXNpc2RuLCBwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIGlmICghY291bnRyeUNvZGUgfHwgY291bnRyeUNvZGUubGVuZ3RoICE9PSAyKSB7XG4gICAgc2VuZEVycm9yKGNhbGxiYWNrLCBuZXcgRXJyb3IoRVJST1JfTUVTU0FHRVMuY291bnRyeWNvZGUpKTtcbiAgfSBlbHNlIGlmICghbXNpc2RuKSB7XG4gICAgc2VuZEVycm9yKGNhbGxiYWNrLCBuZXcgRXJyb3IoRVJST1JfTUVTU0FHRVMubXNpc2RuKSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHVwZGF0ZUVuZHBvaW50ID0gZ2V0RW5kcG9pbnQoXCIvbnVtYmVyL3VwZGF0ZVwiKTtcbiAgICB1cGRhdGVFbmRwb2ludC5wYXRoICs9IFwiP2NvdW50cnk9XCIgKyBjb3VudHJ5Q29kZSArIFwiJm1zaXNkbj1cIiArIG1zaXNkbjtcbiAgICB1cGRhdGVFbmRwb2ludC5wYXRoID0gdXBkYXRlRW5kcG9pbnQucGF0aCArIFwiJlwiO1xuICAgIGZvciAodmFyIGFyZyBpbiBwYXJhbXMpIHtcbiAgICAgIHVwZGF0ZUVuZHBvaW50LnBhdGggPVxuICAgICAgICB1cGRhdGVFbmRwb2ludC5wYXRoICsgYXJnICsgXCI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQocGFyYW1zW2FyZ10pICsgXCImXCI7XG4gICAgfVxuICAgIHNlbmRSZXF1ZXN0KHVwZGF0ZUVuZHBvaW50LCBcIlBPU1RcIiwgY2FsbGJhY2spO1xuICB9XG59O1xuXG5leHBvcnRzLmdldEFwcGxpY2F0aW9ucyA9IGZ1bmN0aW9uKG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIHZhciBlbmRwb2ludCA9IGdldEVuZHBvaW50KGFwcGxpY2F0aW9uc0VuZHBvaW50LnBhdGgpO1xuICBlbmRwb2ludC5ob3N0ID0gYXBwbGljYXRpb25zRW5kcG9pbnQuaG9zdDtcbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMgPT09IFwib2JqZWN0XCIpIHtcbiAgICBlbmRwb2ludC5wYXRoICs9IFwiP1wiO1xuICAgIGZvciAodmFyIGtleSBpbiBvcHRpb25zKSB7XG4gICAgICBlbmRwb2ludC5wYXRoICs9IGtleSArIFwiPVwiICsgb3B0aW9uc1trZXldICsgXCImXCI7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHNlbmRFcnJvcihjYWxsYmFjaywgbmV3IEVycm9yKEVSUk9SX01FU1NBR0VTLm9wdGlvbnNOb3RBbk9iamVjdCkpO1xuICAgIHJldHVybjtcbiAgfVxuICBzZW5kUmVxdWVzdChlbmRwb2ludCwgY2FsbGJhY2spO1xufTtcblxuZXhwb3J0cy5jcmVhdGVBcHBsaWNhdGlvbiA9IGZ1bmN0aW9uKFxuICBuYW1lLFxuICB0eXBlLFxuICBhbnN3ZXJVcmwsXG4gIGV2ZW50VXJsLFxuICBvcHRpb25zLFxuICBjYWxsYmFja1xuKSB7XG4gIGlmICghbmFtZSB8fCBuYW1lLmxlbmd0aCA8IDEpIHtcbiAgICBzZW5kRXJyb3IoY2FsbGJhY2ssIG5ldyBFcnJvcihFUlJPUl9NRVNTQUdFUy5hcHBsaWNhdGlvbk5hbWUpKTtcbiAgfSBlbHNlIGlmICghdHlwZSkge1xuICAgIHNlbmRFcnJvcihjYWxsYmFjaywgbmV3IEVycm9yKEVSUk9SX01FU1NBR0VTLmFwcGxpY2F0aW9uVHlwZSkpO1xuICB9IGVsc2UgaWYgKCFhbnN3ZXJVcmwpIHtcbiAgICBzZW5kRXJyb3IoY2FsbGJhY2ssIG5ldyBFcnJvcihFUlJPUl9NRVNTQUdFUy5hcHBsaWNhdGlvbkFuc3dlclVybCkpO1xuICB9IGVsc2UgaWYgKCFldmVudFVybCkge1xuICAgIHNlbmRFcnJvcihjYWxsYmFjaywgbmV3IEVycm9yKEVSUk9SX01FU1NBR0VTLmFwcGxpY2F0aW9uRXZlbnRVcmwpKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgY3JlYXRlRW5kcG9pbnQgPSBnZXRFbmRwb2ludChhcHBsaWNhdGlvbnNFbmRwb2ludC5wYXRoKTtcbiAgICBjcmVhdGVFbmRwb2ludC5ob3N0ID0gYXBwbGljYXRpb25zRW5kcG9pbnQuaG9zdDtcbiAgICBjcmVhdGVFbmRwb2ludC5wYXRoICs9XG4gICAgICBcIj9uYW1lPVwiICtcbiAgICAgIGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSArXG4gICAgICBcIiZ0eXBlPVwiICtcbiAgICAgIHR5cGUgK1xuICAgICAgXCImYW5zd2VyX3VybD1cIiArXG4gICAgICBhbnN3ZXJVcmwgK1xuICAgICAgXCImZXZlbnRfdXJsPVwiICtcbiAgICAgIGV2ZW50VXJsO1xuICAgIGZvciAodmFyIGtleSBpbiBvcHRpb25zKSB7XG4gICAgICBjcmVhdGVFbmRwb2ludC5wYXRoICs9IFwiJlwiICsga2V5ICsgXCI9XCIgKyBvcHRpb25zW2tleV07XG4gICAgfVxuICAgIHNlbmRSZXF1ZXN0KGNyZWF0ZUVuZHBvaW50LCBcIlBPU1RcIiwgY2FsbGJhY2spO1xuICB9XG59O1xuXG5leHBvcnRzLmdldEFwcGxpY2F0aW9uID0gZnVuY3Rpb24oYXBwSWQsIGNhbGxiYWNrKSB7XG4gIGlmICghYXBwSWQgfHwgYXBwSWQubGVuZ3RoIDwgMzYpIHtcbiAgICBzZW5kRXJyb3IoY2FsbGJhY2ssIG5ldyBFcnJvcihFUlJPUl9NRVNTQUdFUy5hcHBsaWNhdGlvbklkKSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHNob3dFbmRwb2ludCA9IGdldEVuZHBvaW50KGFwcGxpY2F0aW9uc0VuZHBvaW50LnBhdGggKyBcIi9cIiArIGFwcElkKTtcbiAgICBzaG93RW5kcG9pbnQuaG9zdCA9IGFwcGxpY2F0aW9uc0VuZHBvaW50Lmhvc3Q7XG4gICAgc2VuZFJlcXVlc3Qoc2hvd0VuZHBvaW50LCBjYWxsYmFjayk7XG4gIH1cbn07XG5cbmV4cG9ydHMudXBkYXRlQXBwbGljYXRpb24gPSBmdW5jdGlvbihcbiAgYXBwSWQsXG4gIG5hbWUsXG4gIHR5cGUsXG4gIGFuc3dlclVybCxcbiAgZXZlbnRVcmwsXG4gIG9wdGlvbnMsXG4gIGNhbGxiYWNrXG4pIHtcbiAgaWYgKCFhcHBJZCB8fCBhcHBJZC5sZW5ndGggPCAzNikge1xuICAgIHNlbmRFcnJvcihjYWxsYmFjaywgbmV3IEVycm9yKEVSUk9SX01FU1NBR0VTLmFwcGxpY2F0aW9uSWQpKTtcbiAgfSBlbHNlIGlmICghbmFtZSB8fCBuYW1lLmxlbmd0aCA8IDEpIHtcbiAgICBzZW5kRXJyb3IoY2FsbGJhY2ssIG5ldyBFcnJvcihFUlJPUl9NRVNTQUdFUy5hcHBsaWNhdGlvbk5hbWUpKTtcbiAgfSBlbHNlIGlmICghdHlwZSkge1xuICAgIHNlbmRFcnJvcihjYWxsYmFjaywgbmV3IEVycm9yKEVSUk9SX01FU1NBR0VTLmFwcGxpY2F0aW9uVHlwZSkpO1xuICB9IGVsc2UgaWYgKCFhbnN3ZXJVcmwpIHtcbiAgICBzZW5kRXJyb3IoY2FsbGJhY2ssIG5ldyBFcnJvcihFUlJPUl9NRVNTQUdFUy5hcHBsaWNhdGlvbkFuc3dlclVybCkpO1xuICB9IGVsc2UgaWYgKCFldmVudFVybCkge1xuICAgIHNlbmRFcnJvcihjYWxsYmFjaywgbmV3IEVycm9yKEVSUk9SX01FU1NBR0VTLmFwcGxpY2F0aW9uRXZlbnRVcmwpKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgdXBkYXRlRW5kcG9pbnQgPSBnZXRFbmRwb2ludChhcHBsaWNhdGlvbnNFbmRwb2ludC5wYXRoICsgXCIvXCIgKyBhcHBJZCk7XG4gICAgdXBkYXRlRW5kcG9pbnQucGF0aCArPVxuICAgICAgXCI/bmFtZT1cIiArXG4gICAgICBlbmNvZGVVUklDb21wb25lbnQobmFtZSkgK1xuICAgICAgXCImdHlwZT1cIiArXG4gICAgICB0eXBlICtcbiAgICAgIFwiJmFuc3dlcl91cmw9XCIgK1xuICAgICAgYW5zd2VyVXJsICtcbiAgICAgIFwiJmV2ZW50X3VybD1cIiArXG4gICAgICBldmVudFVybDtcbiAgICB1cGRhdGVFbmRwb2ludC5ob3N0ID0gYXBwbGljYXRpb25zRW5kcG9pbnQuaG9zdDtcbiAgICBmb3IgKHZhciBrZXkgaW4gb3B0aW9ucykge1xuICAgICAgdXBkYXRlRW5kcG9pbnQucGF0aCA9XG4gICAgICAgIHVwZGF0ZUVuZHBvaW50LnBhdGggKyBcIiZcIiArIGtleSArIFwiPVwiICsgb3B0aW9uc1trZXldO1xuICAgIH1cbiAgICBzZW5kUmVxdWVzdCh1cGRhdGVFbmRwb2ludCwgXCJQVVRcIiwgY2FsbGJhY2spO1xuICB9XG59O1xuXG5leHBvcnRzLmRlbGV0ZUFwcGxpY2F0aW9uID0gZnVuY3Rpb24oYXBwSWQsIGNhbGxiYWNrKSB7XG4gIGlmICghYXBwSWQgfHwgYXBwSWQubGVuZ3RoIDwgMzYpIHtcbiAgICBzZW5kRXJyb3IoY2FsbGJhY2ssIG5ldyBFcnJvcihFUlJPUl9NRVNTQUdFUy5hcHBsaWNhdGlvbklkKSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGRlbGV0ZUVuZHBvaW50ID0gZ2V0RW5kcG9pbnQoYXBwbGljYXRpb25zRW5kcG9pbnQucGF0aCArIFwiL1wiICsgYXBwSWQpO1xuICAgIGRlbGV0ZUVuZHBvaW50Lmhvc3QgPSBhcHBsaWNhdGlvbnNFbmRwb2ludC5ob3N0O1xuICAgIHNlbmRSZXF1ZXN0KGRlbGV0ZUVuZHBvaW50LCBcIkRFTEVURVwiLCBjYWxsYmFjayk7XG4gIH1cbn07XG5cbmV4cG9ydHMuY2hhbmdlUGFzc3dvcmQgPSBmdW5jdGlvbihuZXdTZWNyZXQsIGNhbGxiYWNrKSB7XG4gIHZhciBzZXR0aW5nc0VuZHBvaW50ID0gZ2V0RW5kcG9pbnQoXCIvYWNjb3VudC9zZXR0aW5nc1wiKTtcbiAgc2V0dGluZ3NFbmRwb2ludC5wYXRoICs9IFwiP25ld1NlY3JldD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChuZXdTZWNyZXQpO1xuICBzZW5kUmVxdWVzdChzZXR0aW5nc0VuZHBvaW50LCBcIlBPU1RcIiwgY2FsbGJhY2spO1xufTtcblxuZXhwb3J0cy5jaGFuZ2VNb0NhbGxiYWNrVXJsID0gZnVuY3Rpb24obmV3VXJsLCBjYWxsYmFjaykge1xuICB2YXIgc2V0dGluZ3NFbmRwb2ludCA9IGdldEVuZHBvaW50KFwiL2FjY291bnQvc2V0dGluZ3NcIik7XG4gIHNldHRpbmdzRW5kcG9pbnQucGF0aCArPSBcIj9tb0NhbGxCYWNrVXJsPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KG5ld1VybCk7XG4gIHNlbmRSZXF1ZXN0KHNldHRpbmdzRW5kcG9pbnQsIFwiUE9TVFwiLCBjYWxsYmFjayk7XG59O1xuXG5leHBvcnRzLmNoYW5nZURyQ2FsbGJhY2tVcmwgPSBmdW5jdGlvbihuZXdVcmwsIGNhbGxiYWNrKSB7XG4gIHZhciBzZXR0aW5nc0VuZHBvaW50ID0gZ2V0RW5kcG9pbnQoXCIvYWNjb3VudC9zZXR0aW5nc1wiKTtcbiAgc2V0dGluZ3NFbmRwb2ludC5wYXRoICs9IFwiP2RyQ2FsbEJhY2tVcmw9XCIgKyBlbmNvZGVVUklDb21wb25lbnQobmV3VXJsKTtcbiAgc2VuZFJlcXVlc3Qoc2V0dGluZ3NFbmRwb2ludCwgXCJQT1NUXCIsIGNhbGxiYWNrKTtcbn07XG5cbmV4cG9ydHMudmVyaWZ5TnVtYmVyID0gZnVuY3Rpb24oaW5wdXRQYXJhbXMsIGNhbGxiYWNrKSB7XG4gIGlmICghaW5wdXRQYXJhbXMubnVtYmVyIHx8ICFpbnB1dFBhcmFtcy5icmFuZCkge1xuICAgIHNlbmRFcnJvcihjYWxsYmFjaywgbmV3IEVycm9yKEVSUk9SX01FU1NBR0VTLnZlcmlmeVZhbGlkYXRpb24pKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgdkVuZHBvaW50ID0gY2xvbmUodmVyaWZ5RW5kcG9pbnQpO1xuICAgIHZFbmRwb2ludC5wYXRoICs9IFwiP1wiICsgcXVlcnlzdHJpbmcuc3RyaW5naWZ5KGlucHV0UGFyYW1zKTtcbiAgICBzZW5kUmVxdWVzdCh2RW5kcG9pbnQsIGNhbGxiYWNrKTtcbiAgfVxufTtcblxuZXhwb3J0cy5jaGVja1ZlcmlmeVJlcXVlc3QgPSBmdW5jdGlvbihpbnB1dFBhcmFtcywgY2FsbGJhY2spIHtcbiAgaWYgKCFpbnB1dFBhcmFtcy5yZXF1ZXN0X2lkIHx8ICFpbnB1dFBhcmFtcy5jb2RlKSB7XG4gICAgc2VuZEVycm9yKGNhbGxiYWNrLCBuZXcgRXJyb3IoRVJST1JfTUVTU0FHRVMuY2hlY2tWZXJpZnlWYWxpZGF0aW9uKSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHZFbmRwb2ludCA9IGNsb25lKGNoZWNrVmVyaWZ5RW5kcG9pbnQpO1xuICAgIHZFbmRwb2ludC5wYXRoICs9IFwiP1wiICsgcXVlcnlzdHJpbmcuc3RyaW5naWZ5KGlucHV0UGFyYW1zKTtcbiAgICBzZW5kUmVxdWVzdCh2RW5kcG9pbnQsIGNhbGxiYWNrKTtcbiAgfVxufTtcblxuZXhwb3J0cy5jb250cm9sVmVyaWZ5UmVxdWVzdCA9IGZ1bmN0aW9uKGlucHV0UGFyYW1zLCBjYWxsYmFjaykge1xuICBpZiAoIWlucHV0UGFyYW1zLnJlcXVlc3RfaWQgfHwgIWlucHV0UGFyYW1zLmNtZCkge1xuICAgIHNlbmRFcnJvcihjYWxsYmFjaywgbmV3IEVycm9yKEVSUk9SX01FU1NBR0VTLmNvbnRyb2xWZXJpZnlWYWxpZGF0aW9uKSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHZFbmRwb2ludCA9IGNsb25lKGNvbnRyb2xWZXJpZnlFbmRwb2ludCk7XG4gICAgdkVuZHBvaW50LnBhdGggKz0gXCI/XCIgKyBxdWVyeXN0cmluZy5zdHJpbmdpZnkoaW5wdXRQYXJhbXMpO1xuICAgIHNlbmRSZXF1ZXN0KHZFbmRwb2ludCwgY2FsbGJhY2spO1xuICB9XG59O1xuXG5leHBvcnRzLnNlYXJjaFZlcmlmeVJlcXVlc3QgPSBmdW5jdGlvbihyZXF1ZXN0SWRzLCBjYWxsYmFjaykge1xuICB2YXIgcmVxdWVzdElkUGFyYW0gPSB7fTtcbiAgaWYgKCFyZXF1ZXN0SWRzKSB7XG4gICAgc2VuZEVycm9yKGNhbGxiYWNrLCBuZXcgRXJyb3IoRVJST1JfTUVTU0FHRVMuc2VhcmNoVmVyaWZ5VmFsaWRhdGlvbikpO1xuICB9IGVsc2Uge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHJlcXVlc3RJZHMpKSB7XG4gICAgICBpZiAocmVxdWVzdElkcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmVxdWVzdElkUGFyYW0ucmVxdWVzdF9pZCA9IHJlcXVlc3RJZHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXF1ZXN0SWRQYXJhbS5yZXF1ZXN0X2lkcyA9IHJlcXVlc3RJZHM7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcXVlc3RJZFBhcmFtLnJlcXVlc3RfaWQgPSByZXF1ZXN0SWRzO1xuICAgIH1cbiAgICB2YXIgdkVuZHBvaW50ID0gY2xvbmUoc2VhcmNoVmVyaWZ5RW5kcG9pbnQpO1xuICAgIHZFbmRwb2ludC5wYXRoICs9IFwiP1wiICsgcXVlcnlzdHJpbmcuc3RyaW5naWZ5KHJlcXVlc3RJZFBhcmFtKTtcbiAgICBzZW5kUmVxdWVzdCh2RW5kcG9pbnQsIGNhbGxiYWNrKTtcbiAgfVxufTtcblxuZXhwb3J0cy5udW1iZXJJbnNpZ2h0ID0gZnVuY3Rpb24oaW5wdXRQYXJhbXMsIGNhbGxiYWNrKSB7XG4gIG51bWJlckluc2lnaHRBc3luYyhpbnB1dFBhcmFtcywgY2FsbGJhY2spO1xufTtcblxuZXhwb3J0cy5udW1iZXJJbnNpZ2h0QmFzaWMgPSBmdW5jdGlvbihpbnB1dFBhcmFtcywgY2FsbGJhY2spIHtcbiAgbnVtYmVySW5zaWdodENvbW1vbihuaUJhc2ljRW5kcG9pbnQsIGlucHV0UGFyYW1zLCBjYWxsYmFjayk7XG59O1xuXG5leHBvcnRzLm51bWJlckluc2lnaHRTdGFuZGFyZCA9IGZ1bmN0aW9uKGlucHV0UGFyYW1zLCBjYWxsYmFjaykge1xuICBudW1iZXJJbnNpZ2h0Q29tbW9uKG5pU3RhbmRhcmRFbmRwb2ludCwgaW5wdXRQYXJhbXMsIGNhbGxiYWNrKTtcbn07XG5cbmV4cG9ydHMubnVtYmVySW5zaWdodEFkdmFuY2VkID0gZnVuY3Rpb24oaW5wdXRQYXJhbXMsIGNhbGxiYWNrKSB7XG4gIG51bWJlckluc2lnaHRDb21tb24obmlBZHZhbmNlZEVuZHBvaW50LCBpbnB1dFBhcmFtcywgY2FsbGJhY2spO1xufTtcblxuZXhwb3J0cy5udW1iZXJJbnNpZ2h0QWR2YW5jZWRBc3luYyA9IGZ1bmN0aW9uKGlucHV0UGFyYW1zLCBjYWxsYmFjaykge1xuICBudW1iZXJJbnNpZ2h0QXN5bmMoaW5wdXRQYXJhbXMsIGNhbGxiYWNrKTtcbn07XG5cbmZ1bmN0aW9uIG51bWJlckluc2lnaHRBc3luYyhpbnB1dFBhcmFtcywgY2FsbGJhY2spIHtcbiAgaWYgKCFpbnB1dFBhcmFtcy5udW1iZXIgfHwgIWlucHV0UGFyYW1zLmNhbGxiYWNrKSB7XG4gICAgc2VuZEVycm9yKFxuICAgICAgY2FsbGJhY2ssXG4gICAgICBuZXcgRXJyb3IoRVJST1JfTUVTU0FHRVMubnVtYmVySW5zaWdodEFkdmFuY2VkVmFsaWRhdGlvbilcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIHZhciBuRW5kcG9pbnQgPSBjbG9uZShuaUVuZHBvaW50KTtcbiAgICBuRW5kcG9pbnQucGF0aCArPSBcIj9cIiArIHF1ZXJ5c3RyaW5nLnN0cmluZ2lmeShpbnB1dFBhcmFtcyk7XG4gICAgc2VuZFJlcXVlc3QobkVuZHBvaW50LCBjYWxsYmFjayk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbnVtYmVySW5zaWdodENvbW1vbihlbmRwb2ludCwgaW5wdXRQYXJhbXMsIGNhbGxiYWNrKSB7XG4gIGlmICh2YWxpZGF0ZU51bWJlcihpbnB1dFBhcmFtcywgY2FsbGJhY2spKSB7XG4gICAgdmFyIGlucHV0T2JqO1xuICAgIGlmICh0eXBlb2YgaW5wdXRQYXJhbXMgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGlucHV0T2JqID0geyBudW1iZXI6IGlucHV0UGFyYW1zIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlucHV0T2JqID0gaW5wdXRQYXJhbXM7XG4gICAgfVxuICAgIHZhciBuRW5kcG9pbnQgPSBjbG9uZShlbmRwb2ludCk7XG4gICAgbkVuZHBvaW50LnBhdGggKz0gXCI/XCIgKyBxdWVyeXN0cmluZy5zdHJpbmdpZnkoaW5wdXRPYmopO1xuICAgIHNlbmRSZXF1ZXN0KG5FbmRwb2ludCwgY2FsbGJhY2spO1xuICB9XG59XG5mdW5jdGlvbiB2YWxpZGF0ZU51bWJlcihpbnB1dFBhcmFtcywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBpbnB1dFBhcmFtcyA9PT0gXCJvYmplY3RcIiAmJiAhaW5wdXRQYXJhbXMubnVtYmVyKSB7XG4gICAgc2VuZEVycm9yKGNhbGxiYWNrLCBuZXcgRXJyb3IoRVJST1JfTUVTU0FHRVMubnVtYmVySW5zaWdodFZhbGlkYXRpb24pKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSBpZiAoXG4gICAgdHlwZW9mIGlucHV0UGFyYW1zID09PSBcIm9iamVjdFwiICYmXG4gICAgIW51bWJlclBhdHRlcm4udGVzdChpbnB1dFBhcmFtcy5udW1iZXIpXG4gICkge1xuICAgIHNlbmRFcnJvcihjYWxsYmFjaywgbmV3IEVycm9yKEVSUk9SX01FU1NBR0VTLm51bWJlckluc2lnaHRQYXR0ZXJuRmFpbHVyZSkpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIGlmIChcbiAgICB0eXBlb2YgaW5wdXRQYXJhbXMgIT09IFwib2JqZWN0XCIgJiZcbiAgICAoIWlucHV0UGFyYW1zIHx8ICFudW1iZXJQYXR0ZXJuLnRlc3QoaW5wdXRQYXJhbXMpKVxuICApIHtcbiAgICBzZW5kRXJyb3IoY2FsbGJhY2ssIG5ldyBFcnJvcihFUlJPUl9NRVNTQUdFUy5udW1iZXJJbnNpZ2h0UGF0dGVybkZhaWx1cmUpKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHNlbmRWb2ljZU1lc3NhZ2Uodm9pY2VFbmRwb2ludCwgZGF0YSwgY2FsbGJhY2spIHtcbiAgaWYgKCFkYXRhLnRvKSB7XG4gICAgc2VuZEVycm9yKGNhbGxiYWNrLCBuZXcgRXJyb3IoRVJST1JfTUVTU0FHRVMudG8pKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZW5kcG9pbnQgPSBjbG9uZSh2b2ljZUVuZHBvaW50KTtcbiAgICBlbmRwb2ludC5wYXRoICs9IFwiP1wiICsgcXVlcnlzdHJpbmcuc3RyaW5naWZ5KGRhdGEpO1xuICAgIF9vcHRpb25zLmxvZ2dlci5pbmZvKFxuICAgICAgXCJzZW5kaW5nIFRUUyBtZXNzYWdlIHRvIFwiICsgZGF0YS50byArIFwiIHdpdGggbWVzc2FnZSBcIiArIGRhdGEudGV4dFxuICAgICk7XG4gICAgc2VuZFJlcXVlc3QoZW5kcG9pbnQsIFwiUE9TVFwiLCBmdW5jdGlvbihlcnIsIGFwaVJlc3BvbnNlKSB7XG4gICAgICBpZiAoIWVyciAmJiBhcGlSZXNwb25zZS5zdGF0dXMgJiYgYXBpUmVzcG9uc2Uuc3RhdHVzID4gMCkge1xuICAgICAgICBzZW5kRXJyb3IoY2FsbGJhY2ssIG5ldyBFcnJvcihhcGlSZXNwb25zZVtcImVycm9yLXRleHRcIl0pLCBhcGlSZXNwb25zZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKGVyciwgYXBpUmVzcG9uc2UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydHMuc2VuZFRUU01lc3NhZ2UgPSBmdW5jdGlvbihyZWNpcGllbnQsIG1lc3NhZ2UsIG9wdHMsIGNhbGxiYWNrKSB7XG4gIGlmICghbWVzc2FnZSkge1xuICAgIHNlbmRFcnJvcihjYWxsYmFjaywgbmV3IEVycm9yKEVSUk9SX01FU1NBR0VTLm1zZykpO1xuICB9IGVsc2Uge1xuICAgIGlmICghb3B0cykge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cbiAgICBvcHRzW1widG9cIl0gPSByZWNpcGllbnQ7XG4gICAgb3B0c1tcInRleHRcIl0gPSBtZXNzYWdlO1xuICAgIHNlbmRWb2ljZU1lc3NhZ2UodHRzRW5kcG9pbnQsIG9wdHMsIGNhbGxiYWNrKTtcbiAgfVxufTtcblxuZXhwb3J0cy5zZW5kVFRTUHJvbXB0V2l0aENhcHR1cmUgPSBmdW5jdGlvbihcbiAgcmVjaXBpZW50LFxuICBtZXNzYWdlLFxuICBtYXhEaWdpdHMsXG4gIGJ5ZVRleHQsXG4gIG9wdHMsXG4gIGNhbGxiYWNrXG4pIHtcbiAgaWYgKCFtZXNzYWdlKSB7XG4gICAgc2VuZEVycm9yKGNhbGxiYWNrLCBuZXcgRXJyb3IoRVJST1JfTUVTU0FHRVMubXNnKSk7XG4gIH0gZWxzZSBpZiAoIW1heERpZ2l0cyB8fCBpc05hTihtYXhEaWdpdHMpIHx8IG1heERpZ2l0cy5sZW5ndGggPiAxNikge1xuICAgIHNlbmRFcnJvcihjYWxsYmFjaywgbmV3IEVycm9yKEVSUk9SX01FU1NBR0VTLm1heERpZ2l0cykpO1xuICB9IGVsc2UgaWYgKCFieWVUZXh0KSB7XG4gICAgc2VuZEVycm9yKGNhbGxiYWNrLCBuZXcgRXJyb3IoRVJST1JfTUVTU0FHRVMuYnllVGV4dCkpO1xuICB9IGVsc2Uge1xuICAgIGlmICghb3B0cykge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cbiAgICBvcHRzW1widG9cIl0gPSByZWNpcGllbnQ7XG4gICAgb3B0c1tcInRleHRcIl0gPSBtZXNzYWdlO1xuICAgIG9wdHNbXCJtYXhfZGlnaXRzXCJdID0gbWF4RGlnaXRzO1xuICAgIG9wdHNbXCJieWVfdGV4dFwiXSA9IGJ5ZVRleHQ7XG4gICAgc2VuZFZvaWNlTWVzc2FnZSh0dHNQcm9tcHRFbmRwb2ludCwgb3B0cywgY2FsbGJhY2spO1xuICB9XG59O1xuXG5leHBvcnRzLnNlbmRUVFNQcm9tcHRXaXRoQ29uZmlybSA9IGZ1bmN0aW9uKFxuICByZWNpcGllbnQsXG4gIG1lc3NhZ2UsXG4gIG1heERpZ2l0cyxcbiAgcGluQ29kZSxcbiAgYnllVGV4dCxcbiAgZmFpbGVkVGV4dCxcbiAgb3B0cyxcbiAgY2FsbGJhY2tcbikge1xuICBpZiAoIW1lc3NhZ2UpIHtcbiAgICBzZW5kRXJyb3IoY2FsbGJhY2ssIG5ldyBFcnJvcihFUlJPUl9NRVNTQUdFUy5tc2cpKTtcbiAgfSBlbHNlIGlmICghbWF4RGlnaXRzIHx8IGlzTmFOKG1heERpZ2l0cykgfHwgbWF4RGlnaXRzLmxlbmd0aCA+IDE2KSB7XG4gICAgc2VuZEVycm9yKGNhbGxiYWNrLCBuZXcgRXJyb3IoRVJST1JfTUVTU0FHRVMubWF4RGlnaXRzKSk7XG4gIH0gZWxzZSBpZiAoIXBpbkNvZGUgfHwgcGluQ29kZS5sZW5ndGggIT09IG1heERpZ2l0cykge1xuICAgIHNlbmRFcnJvcihjYWxsYmFjaywgbmV3IEVycm9yKEVSUk9SX01FU1NBR0VTLnBpbkNvZGUpKTtcbiAgfSBlbHNlIGlmICghYnllVGV4dCkge1xuICAgIHNlbmRFcnJvcihjYWxsYmFjaywgbmV3IEVycm9yKEVSUk9SX01FU1NBR0VTLmJ5ZVRleHQpKTtcbiAgfSBlbHNlIGlmICghZmFpbGVkVGV4dCkge1xuICAgIHNlbmRFcnJvcihjYWxsYmFjaywgbmV3IEVycm9yKEVSUk9SX01FU1NBR0VTLmZhaWxlZFRleHQpKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIW9wdHMpIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG4gICAgb3B0c1tcInRvXCJdID0gcmVjaXBpZW50O1xuICAgIG9wdHNbXCJ0ZXh0XCJdID0gbWVzc2FnZTtcbiAgICBvcHRzW1wibWF4X2RpZ2l0c1wiXSA9IG1heERpZ2l0cztcbiAgICBvcHRzW1wicGluX2NvZGVcIl0gPSBwaW5Db2RlO1xuICAgIG9wdHNbXCJieWVfdGV4dFwiXSA9IGJ5ZVRleHQ7XG4gICAgb3B0c1tcImZhaWxlZF90ZXh0XCJdID0gZmFpbGVkVGV4dDtcbiAgICBzZW5kVm9pY2VNZXNzYWdlKHR0c1Byb21wdEVuZHBvaW50LCBvcHRzLCBjYWxsYmFjayk7XG4gIH1cbn07XG5cbmV4cG9ydHMuY2FsbCA9IGZ1bmN0aW9uKHJlY2lwaWVudCwgYW5zd2VyVXJsLCBvcHRzLCBjYWxsYmFjaykge1xuICBpZiAoIWFuc3dlclVybCkge1xuICAgIHNlbmRFcnJvcihjYWxsYmFjaywgbmV3IEVycm9yKEVSUk9SX01FU1NBR0VTLmFuc3dlclVybCkpO1xuICB9IGVsc2Uge1xuICAgIGlmICghb3B0cykge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cbiAgICBvcHRzW1widG9cIl0gPSByZWNpcGllbnQ7XG4gICAgb3B0c1tcImFuc3dlcl91cmxcIl0gPSBhbnN3ZXJVcmw7XG4gICAgc2VuZFZvaWNlTWVzc2FnZShjYWxsRW5kcG9pbnQsIG9wdHMsIGNhbGxiYWNrKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gc2VuZEVycm9yKGNhbGxiYWNrLCBlcnIsIHJldHVybkRhdGEpIHtcbiAgLy8gVGhyb3cgdGhlIGVycm9yIGluIGNhc2UgaWYgdGhlcmUgaXMgbm8gY2FsbGJhY2sgcGFzc2VkXG4gIGlmIChjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrKGVyciwgcmV0dXJuRGF0YSk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbmV4cG9ydHMuc2V0SG9zdCA9IGZ1bmN0aW9uKGFIb3N0KSB7XG4gIG1zZ3BhdGguaG9zdCA9IGFIb3N0O1xuICBzaG9ydGNvZGVQYXRoLmhvc3QgPSBhSG9zdDtcbiAgdHRzRW5kcG9pbnQuaG9zdCA9IGFIb3N0O1xuICB0dHNQcm9tcHRFbmRwb2ludC5ob3N0ID0gYUhvc3Q7XG4gIGNhbGxFbmRwb2ludC5ob3N0ID0gYUhvc3Q7XG4gIHZlcmlmeUVuZHBvaW50Lmhvc3QgPSBhSG9zdDtcbiAgY2hlY2tWZXJpZnlFbmRwb2ludC5ob3N0ID0gYUhvc3Q7XG4gIGNvbnRyb2xWZXJpZnlFbmRwb2ludC5ob3N0ID0gYUhvc3Q7XG4gIHNlYXJjaFZlcmlmeUVuZHBvaW50Lmhvc3QgPSBhSG9zdDtcbiAgbmlFbmRwb2ludC5ob3N0ID0gYUhvc3Q7XG4gIG5pQmFzaWNFbmRwb2ludC5ob3N0ID0gYUhvc3Q7XG4gIG5pU3RhbmRhcmRFbmRwb2ludC5ob3N0ID0gYUhvc3Q7XG4gIGFwcGxpY2F0aW9uc0VuZHBvaW50Lmhvc3QgPSBhSG9zdDtcbn07XG4iXX0=
\No newline at end of file