Innovenergy_trunk/frontend/node_modules/testcafe/lib/api/request-hooks/request-logger.js

114 lines
19 KiB
JavaScript

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const testcafe_hammerhead_1 = require("testcafe-hammerhead");
const hook_1 = __importDefault(require("./hook"));
const parse_user_agent_1 = require("../../utils/parse-user-agent");
const test_run_tracker_1 = __importDefault(require("../test-run-tracker"));
const re_executable_promise_1 = __importDefault(require("../../utils/re-executable-promise"));
const runtime_1 = require("../../errors/runtime");
const types_1 = require("../../errors/types");
const DEFAULT_OPTIONS = {
logRequestHeaders: false,
logRequestBody: false,
stringifyRequestBody: false,
logResponseHeaders: false,
logResponseBody: false,
stringifyResponseBody: false,
};
const REQUEST_LOGGER_CLASS_NAME = 'RequestLogger';
class RequestLoggerImplementation extends hook_1.default {
constructor(requestFilterRuleInit, options) {
const effectiveOptions = Object.assign({}, DEFAULT_OPTIONS, options);
RequestLoggerImplementation._assertLogOptions(effectiveOptions);
const configureResponseEventOptions = new testcafe_hammerhead_1.ConfigureResponseEventOptions(effectiveOptions.logResponseHeaders, effectiveOptions.logResponseBody);
super(requestFilterRuleInit, configureResponseEventOptions);
this._className = REQUEST_LOGGER_CLASS_NAME;
this._options = effectiveOptions;
this._internalRequests = {};
}
static _assertLogOptions(logOptions) {
if (!logOptions.logRequestBody && logOptions.stringifyRequestBody)
throw new runtime_1.APIError('RequestLogger', types_1.RUNTIME_ERRORS.requestHookConfigureAPIError, 'RequestLogger', 'Cannot stringify the request body because it is not logged. Specify { logRequestBody: true } in log options.');
if (!logOptions.logResponseBody && logOptions.stringifyResponseBody)
throw new runtime_1.APIError('RequestLogger', types_1.RUNTIME_ERRORS.requestHookConfigureAPIError, 'RequestLogger', 'Cannot stringify the response body because it is not logged. Specify { logResponseBody: true } in log options.');
}
async onRequest(event) {
const loggedReq = {
id: event._requestInfo.requestId,
testRunId: event._requestInfo.sessionId,
userAgent: (0, parse_user_agent_1.parseUserAgent)(event._requestInfo.userAgent).prettyUserAgent,
request: {
timestamp: Date.now(),
url: event._requestInfo.url,
method: event._requestInfo.method,
},
};
if (this._options.logRequestHeaders)
loggedReq.request.headers = Object.assign({}, event._requestInfo.headers);
if (this._options.logRequestBody)
loggedReq.request.body = this._options.stringifyRequestBody ? event._requestInfo.body.toString() : event._requestInfo.body;
this._internalRequests[loggedReq.id] = loggedReq;
}
async onResponse(event) {
const loggedReq = this._internalRequests[event.requestId];
// NOTE: If the 'clear' method is called during a long running request,
// we should not save a response part - request part has been already removed.
if (!loggedReq)
return;
loggedReq.response = {
statusCode: event.statusCode,
timestamp: Date.now(),
};
if (this._options.logResponseHeaders)
loggedReq.response.headers = Object.assign({}, event.headers);
if (this._options.logResponseBody) {
loggedReq.response.body = this._options.stringifyResponseBody && event.body
? event.body.toString()
: event.body;
}
}
_prepareInternalRequestInfo() {
const testRun = test_run_tracker_1.default.resolveContextTestRun();
let preparedRequests = Object.values(this._internalRequests);
if (testRun)
preparedRequests = preparedRequests.filter(r => r.testRunId === testRun.id);
return preparedRequests;
}
_getCompletedRequests() {
return this._prepareInternalRequestInfo().filter(r => r.response);
}
// API
contains(predicate) {
return re_executable_promise_1.default.fromFn(async () => {
return !!this._getCompletedRequests().find(predicate);
});
}
count(predicate) {
return re_executable_promise_1.default.fromFn(async () => {
return this._getCompletedRequests().filter(predicate).length;
});
}
clear() {
const testRun = test_run_tracker_1.default.resolveContextTestRun();
if (testRun) {
Object.keys(this._internalRequests).forEach(id => {
if (this._internalRequests[id].testRunId === testRun.id)
delete this._internalRequests[id];
});
}
else
this._internalRequests = {};
}
get requests() {
return this._prepareInternalRequestInfo();
}
}
function createRequestLogger(requestFilterRuleInit, logOptions) {
return new RequestLoggerImplementation(requestFilterRuleInit, logOptions);
}
exports.default = createRequestLogger;
module.exports = exports.default;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1sb2dnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3JlcXVlc3QtaG9va3MvcmVxdWVzdC1sb2dnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2REFLNkI7QUFFN0Isa0RBQWlDO0FBQ2pDLG1FQUE4RDtBQUM5RCwyRUFBaUQ7QUFDakQsOEZBQW9FO0FBQ3BFLGtEQUFnRDtBQUNoRCw4Q0FBb0Q7QUFVcEQsTUFBTSxlQUFlLEdBQTBCO0lBQzNDLGlCQUFpQixFQUFNLEtBQUs7SUFDNUIsY0FBYyxFQUFTLEtBQUs7SUFDNUIsb0JBQW9CLEVBQUcsS0FBSztJQUM1QixrQkFBa0IsRUFBSyxLQUFLO0lBQzVCLGVBQWUsRUFBUSxLQUFLO0lBQzVCLHFCQUFxQixFQUFFLEtBQUs7Q0FDL0IsQ0FBQztBQXlCRixNQUFNLHlCQUF5QixHQUFHLGVBQWUsQ0FBQztBQUVsRCxNQUFNLDJCQUE0QixTQUFRLGNBQVc7SUFJakQsWUFBb0IscUJBQXVFLEVBQUUsT0FBbUM7UUFDNUgsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxlQUFlLEVBQUUsT0FBTyxDQUEwQixDQUFDO1FBRTlGLDJCQUEyQixDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFaEUsTUFBTSw2QkFBNkIsR0FBRyxJQUFJLG1EQUE2QixDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixFQUFFLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRS9JLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSw2QkFBNkIsQ0FBQyxDQUFDO1FBRTVELElBQUksQ0FBQyxVQUFVLEdBQVUseUJBQXlCLENBQUM7UUFDbkQsSUFBSSxDQUFDLFFBQVEsR0FBWSxnQkFBZ0IsQ0FBQztRQUMxQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFTyxNQUFNLENBQUMsaUJB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aUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMxQyxDQUFDLENBQUMsQ0FBQztTQUNOOztZQUVHLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELElBQVcsUUFBUTtRQUNmLE9BQU8sSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7SUFDOUMsQ0FBQztDQUNKO0FBRUQsU0FBd0IsbUJBQW1CLENBQUUscUJBQWtGLEVBQUUsVUFBcUM7SUFDbEssT0FBTyxJQUFJLDJCQUEyQixDQUFDLHFCQUFxQixFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQzlFLENBQUM7QUFGRCxzQ0FFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29uZmlndXJlUmVzcG9uc2VFdmVudE9wdGlvbnMsXG4gICAgUmVxdWVzdEV2ZW50LFxuICAgIFJlc3BvbnNlRXZlbnQsXG4gICAgUmVxdWVzdEZpbHRlclJ1bGVJbml0LFxufSBmcm9tICd0ZXN0Y2FmZS1oYW1tZXJoZWFkJztcblxuaW1wb3J0IFJlcXVlc3RIb29rIGZyb20gJy4vaG9vayc7XG5pbXBvcnQgeyBwYXJzZVVzZXJBZ2VudCB9IGZyb20gJy4uLy4uL3V0aWxzL3BhcnNlLXVzZXItYWdlbnQnO1xuaW1wb3J0IHRlc3RSdW5UcmFja2VyIGZyb20gJy4uL3Rlc3QtcnVuLXRyYWNrZXInO1xuaW1wb3J0IFJlRXhlY3V0YWJsZVByb21pc2UgZnJvbSAnLi4vLi4vdXRpbHMvcmUtZXhlY3V0YWJsZS1wcm9taXNlJztcbmltcG9ydCB7IEFQSUVycm9yIH0gZnJvbSAnLi4vLi4vZXJyb3JzL3J1bnRpbWUnO1xuaW1wb3J0IHsgUlVOVElNRV9FUlJPUlMgfSBmcm9tICcuLi8uLi9lcnJvcnMvdHlwZXMnO1xuXG5pbXBvcnQge1xuICAgIFJlcXVlc3RIb29rTG9nT3B0aW9uc0luaXQsXG4gICAgUmVxdWVzdEhvb2tMb2dPcHRpb25zLFxufSBmcm9tICcuL2ludGVyZmFjZXMnO1xuXG5pbXBvcnQgeyBEaWN0aW9uYXJ5IH0gZnJvbSAnLi4vLi4vY29uZmlndXJhdGlvbi9pbnRlcmZhY2VzJztcblxuXG5jb25zdCBERUZBVUxUX09QVElPTlM6IFJlcXVlc3RIb29rTG9nT3B0aW9ucyA9IHtcbiAgICBsb2dSZXF1ZXN0SGVhZGVyczogICAgIGZhbHNlLFxuICAgIGxvZ1JlcXVlc3RCb2R5OiAgICAgICAgZmFsc2UsXG4gICAgc3RyaW5naWZ5UmVxdWVzdEJvZHk6ICBmYWxzZSxcbiAgICBsb2dSZXNwb25zZUhlYWRlcnM6ICAgIGZhbHNlLFxuICAgIGxvZ1Jlc3BvbnNlQm9keTogICAgICAgZmFsc2UsXG4gICAgc3RyaW5naWZ5UmVzcG9uc2VCb2R5OiBmYWxzZSxcbn07XG5cbmludGVyZmFjZSBPcHRpb25hbGx5TG9nZ2VkUGFydCB7XG4gICAgaGVhZGVycz86IGFueTtcbiAgICBib2R5PzogQnVmZmVyIHwgc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgTG9nZ2VkUmVxdWVzdFBhcnQgZXh0ZW5kcyBPcHRpb25hbGx5TG9nZ2VkUGFydCB7XG4gICAgdGltZXN0YW1wOiBudW1iZXI7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgbWV0aG9kOiBzdHJpbmc7XG59XG5pbnRlcmZhY2UgTG9nZ2VkUmVzcG9uc2VQYXJ0IGV4dGVuZHMgT3B0aW9uYWxseUxvZ2dlZFBhcnQge1xuICAgIHN0YXR1c0NvZGU6IG51bWJlcjtcbiAgICB0aW1lc3RhbXA6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIExvZ2dlZFJlcXVlc3Qge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdGVzdFJ1bklkOiBzdHJpbmc7XG4gICAgdXNlckFnZW50OiBzdHJpbmc7XG4gICAgcmVxdWVzdDogTG9nZ2VkUmVxdWVzdFBhcnQ7XG4gICAgcmVzcG9uc2U/OiBMb2dnZWRSZXNwb25zZVBhcnQ7XG59XG5cbmNvbnN0IFJFUVVFU1RfTE9HR0VSX0NMQVNTX05BTUUgPSAnUmVxdWVzdExvZ2dlcic7XG5cbmNsYXNzIFJlcXVlc3RMb2dnZXJJbXBsZW1lbnRhdGlvbiBleHRlbmRzIFJlcXVlc3RIb29rIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zOiBSZXF1ZXN0SG9va0xvZ09wdGlvbnM7XG4gICAgcHJpdmF0ZSBfaW50ZXJuYWxSZXF1ZXN0czogRGljdGlvbmFyeTxMb2dnZWRSZXF1ZXN0PjtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAocmVxdWVzdEZpbHRlclJ1bGVJbml0PzogUmVxdWVzdEZpbHRlclJ1bGVJbml0IHwgUmVxdWVzdEZpbHRlclJ1bGVJbml0W10sIG9wdGlvbnM/OiBSZXF1ZXN0SG9va0xvZ09wdGlvbnNJbml0KSB7XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZU9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX09QVElPTlMsIG9wdGlvbnMpIGFzIFJlcXVlc3RIb29rTG9nT3B0aW9ucztcblxuICAgICAgICBSZXF1ZXN0TG9nZ2VySW1wbGVtZW50YXRpb24uX2Fzc2VydExvZ09wdGlvbnMoZWZmZWN0aXZlT3B0aW9ucyk7XG5cbiAgICAgICAgY29uc3QgY29uZmlndXJlUmVzcG9uc2VFdmVudE9wdGlvbnMgPSBuZXcgQ29uZmlndXJlUmVzcG9uc2VFdmVudE9wdGlvbnMoZWZmZWN0aXZlT3B0aW9ucy5sb2dSZXNwb25zZUhlYWRlcnMsIGVmZmVjdGl2ZU9wdGlvbnMubG9nUmVzcG9uc2VCb2R5KTtcblxuICAgICAgICBzdXBlcihyZXF1ZXN0RmlsdGVyUnVsZUluaXQsIGNvbmZpZ3VyZVJlc3BvbnNlRXZlbnRPcHRpb25zKTtcblxuICAgICAgICB0aGlzLl9jbGFzc05hbWUgICAgICAgID0gUkVRVUVTVF9MT0dHRVJfQ0xBU1NfTkFNRTtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyAgICAgICAgICA9IGVmZmVjdGl2ZU9wdGlvbnM7XG4gICAgICAgIHRoaXMuX2ludGVybmFsUmVxdWVzdHMgPSB7fTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfYXNzZXJ0TG9nT3B0aW9ucyAobG9nT3B0aW9uczogUmVxdWVzdEhvb2tMb2dPcHRpb25zKTogdm9pZCB7XG4gICAgICAgIGlmICghbG9nT3B0aW9ucy5sb2dSZXF1ZXN0Qm9keSAmJiBsb2dPcHRpb25zLnN0cmluZ2lmeVJlcXVlc3RCb2R5KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEFQSUVycm9yKCdSZXF1ZXN0TG9nZ2VyJywgUlVOVElNRV9FUlJPUlMucmVxdWVzdEhvb2tDb25maWd1cmVBUElFcnJvciwgJ1JlcXVlc3RMb2dnZXInLCAnQ2Fubm90IHN0cmluZ2lmeSB0aGUgcmVxdWVzdCBib2R5IGJlY2F1c2UgaXQgaXMgbm90IGxvZ2dlZC4gU3BlY2lmeSB7IGxvZ1JlcXVlc3RCb2R5OiB0cnVlIH0gaW4gbG9nIG9wdGlvbnMuJyk7XG5cbiAgICAgICAgaWYgKCFsb2dPcHRpb25zLmxvZ1Jlc3BvbnNlQm9keSAmJiBsb2dPcHRpb25zLnN0cmluZ2lmeVJlc3BvbnNlQm9keSlcbiAgICAgICAgICAgIHRocm93IG5ldyBBUElFcnJvcignUmVxdWVzdExvZ2dlcicsIFJVTlRJTUVfRVJST1JTLnJlcXVlc3RIb29rQ29uZmlndXJlQVBJRXJyb3IsICdSZXF1ZXN0TG9nZ2VyJywgJ0Nhbm5vdCBzdHJpbmdpZnkgdGhlIHJlc3BvbnNlIGJvZHkgYmVjYXVzZSBpdCBpcyBub3QgbG9nZ2VkLiBTcGVjaWZ5IHsgbG9nUmVzcG9uc2VCb2R5OiB0cnVlIH0gaW4gbG9nIG9wdGlvbnMuJyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG9uUmVxdWVzdCAoZXZlbnQ6IFJlcXVlc3RFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBsb2dnZWRSZXE6IExvZ2dlZFJlcXVlc3QgPSB7XG4gICAgICAgICAgICBpZDogICAgICAgIGV2ZW50Ll9yZXF1ZXN0SW5mby5yZXF1ZXN0SWQsXG4gICAgICAgICAgICB0ZXN0UnVuSWQ6IGV2ZW50Ll9yZXF1ZXN0SW5mby5zZXNzaW9uSWQsXG4gICAgICAgICAgICB1c2VyQWdlbnQ6IHBhcnNlVXNlckFnZW50KGV2ZW50Ll9yZXF1ZXN0SW5mby51c2VyQWdlbnQpLnByZXR0eVVzZXJBZ2VudCxcbiAgICAgICAgICAgIHJlcXVlc3Q6ICAge1xuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICB1cmw6ICAgICAgIGV2ZW50Ll9yZXF1ZXN0SW5mby51cmwsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAgICBldmVudC5fcmVxdWVzdEluZm8ubWV0aG9kLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5sb2dSZXF1ZXN0SGVhZGVycylcbiAgICAgICAgICAgIGxvZ2dlZFJlcS5yZXF1ZXN0LmhlYWRlcnMgPSBPYmplY3QuYXNzaWduKHt9LCBldmVudC5fcmVxdWVzdEluZm8uaGVhZGVycyk7XG5cbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMubG9nUmVxdWVzdEJvZHkpXG4gICAgICAgICAgICBsb2dnZWRSZXEucmVxdWVzdC5ib2R5ID0gdGhpcy5fb3B0aW9ucy5zdHJpbmdpZnlSZXF1ZXN0Qm9keSA/IGV2ZW50Ll9yZXF1ZXN0SW5mby5ib2R5LnRvU3RyaW5nKCkgOiBldmVudC5fcmVxdWVzdEluZm8uYm9keTtcblxuICAgICAgICB0aGlzLl9pbnRlcm5hbFJlcXVlc3RzW2xvZ2dlZFJlcS5pZF0gPSBsb2dnZWRSZXE7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG9uUmVzcG9uc2UgKGV2ZW50OiBSZXNwb25zZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGxvZ2dlZFJlcSA9IHRoaXMuX2ludGVybmFsUmVxdWVzdHNbZXZlbnQucmVxdWVzdElkXTtcblxuICAgICAgICAvLyBOT1RFOiBJZiB0aGUgJ2NsZWFyJyBtZXRob2QgaXMgY2FsbGVkIGR1cmluZyBhIGxvbmcgcnVubmluZyByZXF1ZXN0LFxuICAgICAgICAvLyB3ZSBzaG91bGQgbm90IHNhdmUgYSByZXNwb25zZSBwYXJ0IC0gcmVxdWVzdCBwYXJ0IGhhcyBiZWVuIGFscmVhZHkgcmVtb3ZlZC5cbiAgICAgICAgaWYgKCFsb2dnZWRSZXEpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgbG9nZ2VkUmVxLnJlc3BvbnNlID0ge1xuICAgICAgICAgICAgc3RhdHVzQ29kZTogZXZlbnQuc3RhdHVzQ29kZSxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogIERhdGUubm93KCksXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMubG9nUmVzcG9uc2VIZWFkZXJzKVxuICAgICAgICAgICAgbG9nZ2VkUmVxLnJlc3BvbnNlLmhlYWRlcnMgPSBPYmplY3QuYXNzaWduKHt9LCBldmVudC5oZWFkZXJzKTtcblxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5sb2dSZXNwb25zZUJvZHkpIHtcbiAgICAgICAgICAgIGxvZ2dlZFJlcS5yZXNwb25zZS5ib2R5ID0gdGhpcy5fb3B0aW9ucy5zdHJpbmdpZnlSZXNwb25zZUJvZHkgJiYgZXZlbnQuYm9keVxuICAgICAgICAgICAgICAgID8gZXZlbnQuYm9keS50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgOiBldmVudC5ib2R5O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcHJlcGFyZUludGVybmFsUmVxdWVzdEluZm8gKCk6IExvZ2dlZFJlcXVlc3RbXSB7XG4gICAgICAgIGNvbnN0IHRlc3RSdW4gICAgICAgID0gdGVzdFJ1blRyYWNrZXIucmVzb2x2ZUNvbnRleHRUZXN0UnVuKCk7XG4gICAgICAgIGxldCBwcmVwYXJlZFJlcXVlc3RzID0gT2JqZWN0LnZhbHVlcyh0aGlzLl9pbnRlcm5hbFJlcXVlc3RzKTtcblxuICAgICAgICBpZiAodGVzdFJ1bilcbiAgICAgICAgICAgIHByZXBhcmVkUmVxdWVzdHMgPSBwcmVwYXJlZFJlcXVlc3RzLmZpbHRlcihyID0+IHIudGVzdFJ1bklkID09PSB0ZXN0UnVuLmlkKTtcblxuICAgICAgICByZXR1cm4gcHJlcGFyZWRSZXF1ZXN0cztcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRDb21wbGV0ZWRSZXF1ZXN0cyAoKTogTG9nZ2VkUmVxdWVzdFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ByZXBhcmVJbnRlcm5hbFJlcXVlc3RJbmZvKCkuZmlsdGVyKHIgPT4gci5yZXNwb25zZSk7XG4gICAgfVxuXG4gICAgLy8gQVBJXG4gICAgcHVibGljIGNvbnRhaW5zIChwcmVkaWNhdGU6IChyZXF1ZXN0OiBMb2dnZWRSZXF1ZXN0KSA9PiBib29sZWFuKTogUmVFeGVjdXRhYmxlUHJvbWlzZSB7XG4gICAgICAgIHJldHVybiBSZUV4ZWN1dGFibGVQcm9taXNlLmZyb21Gbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gISF0aGlzLl9nZXRDb21wbGV0ZWRSZXF1ZXN0cygpLmZpbmQocHJlZGljYXRlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvdW50IChwcmVkaWNhdGU6IChyZXF1ZXN0OiBMb2dnZWRSZXF1ZXN0KSA9PiBib29sZWFuKTogUmVFeGVjdXRhYmxlUHJvbWlzZSB7XG4gICAgICAgIHJldHVybiBSZUV4ZWN1dGFibGVQcm9taXNlLmZyb21Gbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Q29tcGxldGVkUmVxdWVzdHMoKS5maWx0ZXIocHJlZGljYXRlKS5sZW5ndGg7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhciAoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRlc3RSdW4gPSB0ZXN0UnVuVHJhY2tlci5yZXNvbHZlQ29udGV4dFRlc3RSdW4oKTtcblxuICAgICAgICBpZiAodGVzdFJ1bikge1xuICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5faW50ZXJuYWxSZXF1ZXN0cykuZm9yRWFjaChpZCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2ludGVybmFsUmVxdWVzdHNbaWRdLnRlc3RSdW5JZCA9PT0gdGVzdFJ1bi5pZClcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2ludGVybmFsUmVxdWVzdHNbaWRdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5faW50ZXJuYWxSZXF1ZXN0cyA9IHt9O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmVxdWVzdHMgKCk6IExvZ2dlZFJlcXVlc3RbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcmVwYXJlSW50ZXJuYWxSZXF1ZXN0SW5mbygpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlUmVxdWVzdExvZ2dlciAocmVxdWVzdEZpbHRlclJ1bGVJbml0OiBSZXF1ZXN0RmlsdGVyUnVsZUluaXQgfCBSZXF1ZXN0RmlsdGVyUnVsZUluaXRbXSB8IHVuZGVmaW5lZCwgbG9nT3B0aW9uczogUmVxdWVzdEhvb2tMb2dPcHRpb25zSW5pdCk6IFJlcXVlc3RMb2dnZXJJbXBsZW1lbnRhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBSZXF1ZXN0TG9nZ2VySW1wbGVtZW50YXRpb24ocmVxdWVzdEZpbHRlclJ1bGVJbml0LCBsb2dPcHRpb25zKTtcbn1cbiJdfQ==