'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _lodash = require('lodash'); var _lodash2 = _interopRequireDefault(_lodash); var _2 = require('./'); var _3 = _interopRequireDefault(_2); var _status = require('../status'); var _status2 = _interopRequireDefault(_status); var _helpers = require('./helpers'); var _step_arguments = require('../step_arguments'); var _assertionErrorFormatter = require('assertion-error-formatter'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var getStepLineToKeywordMap = _helpers.GherkinDocumentParser.getStepLineToKeywordMap, getScenarioLineToDescriptionMap = _helpers.GherkinDocumentParser.getScenarioLineToDescriptionMap; var getScenarioDescription = _helpers.PickleParser.getScenarioDescription, getStepLineToPickledStepMap = _helpers.PickleParser.getStepLineToPickledStepMap, getStepKeyword = _helpers.PickleParser.getStepKeyword; var JsonFormatter = function (_Formatter) { (0, _inherits3.default)(JsonFormatter, _Formatter); function JsonFormatter(options) { (0, _classCallCheck3.default)(this, JsonFormatter); var _this = (0, _possibleConstructorReturn3.default)(this, (JsonFormatter.__proto__ || Object.getPrototypeOf(JsonFormatter)).call(this, options)); options.eventBroadcaster.on('test-run-finished', _this.onTestRunFinished.bind(_this)); return _this; } (0, _createClass3.default)(JsonFormatter, [{ key: 'convertNameToId', value: function convertNameToId(obj) { return obj.name.replace(/ /g, '-').toLowerCase(); } }, { key: 'formatDataTable', value: function formatDataTable(dataTable) { return { rows: dataTable.rows.map(function (row) { return { cells: _lodash2.default.map(row.cells, 'value') }; }) }; } }, { key: 'formatDocString', value: function formatDocString(docString) { return { content: docString.content, line: docString.location.line }; } }, { key: 'formatStepArguments', value: function formatStepArguments(stepArguments) { var iterator = (0, _step_arguments.buildStepArgumentIterator)({ dataTable: this.formatDataTable.bind(this), docString: this.formatDocString.bind(this) }); return _lodash2.default.map(stepArguments, iterator); } }, { key: 'onTestRunFinished', value: function onTestRunFinished() { var _this2 = this; var groupedTestCases = {}; _lodash2.default.each(this.eventDataCollector.testCaseMap, function (testCase) { var uri = testCase.sourceLocation.uri; if (!groupedTestCases[uri]) { groupedTestCases[uri] = []; } groupedTestCases[uri].push(testCase); }); var features = _lodash2.default.map(groupedTestCases, function (group, uri) { var gherkinDocument = _this2.eventDataCollector.gherkinDocumentMap[uri]; var featureData = _this2.getFeatureData(gherkinDocument.feature, uri); var stepLineToKeywordMap = getStepLineToKeywordMap(gherkinDocument); var scenarioLineToDescriptionMap = getScenarioLineToDescriptionMap(gherkinDocument); featureData.elements = group.map(function (testCase) { var _eventDataCollector$g = _this2.eventDataCollector.getTestCaseData(testCase.sourceLocation), pickle = _eventDataCollector$g.pickle; var scenarioData = _this2.getScenarioData({ featureId: featureData.id, pickle: pickle, scenarioLineToDescriptionMap: scenarioLineToDescriptionMap }); var stepLineToPickledStepMap = getStepLineToPickledStepMap(pickle); var isBeforeHook = true; scenarioData.steps = testCase.steps.map(function (testStep) { isBeforeHook = isBeforeHook && !testStep.sourceLocation; return _this2.getStepData({ isBeforeHook: isBeforeHook, stepLineToKeywordMap: stepLineToKeywordMap, stepLineToPickledStepMap: stepLineToPickledStepMap, testStep: testStep }); }); return scenarioData; }); return featureData; }); this.log(JSON.stringify(features, null, 2)); } }, { key: 'getFeatureData', value: function getFeatureData(feature, uri) { return { description: feature.description, keyword: feature.keyword, name: feature.name, line: feature.location.line, id: this.convertNameToId(feature), tags: this.getTags(feature), uri: uri }; } }, { key: 'getScenarioData', value: function getScenarioData(_ref) { var featureId = _ref.featureId, pickle = _ref.pickle, scenarioLineToDescriptionMap = _ref.scenarioLineToDescriptionMap; var description = getScenarioDescription({ pickle: pickle, scenarioLineToDescriptionMap: scenarioLineToDescriptionMap }); return { description: description, id: featureId + ';' + this.convertNameToId(pickle), keyword: 'Scenario', line: pickle.locations[0].line, name: pickle.name, tags: this.getTags(pickle), type: 'scenario' }; } }, { key: 'getStepData', value: function getStepData(_ref2) { var isBeforeHook = _ref2.isBeforeHook, stepLineToKeywordMap = _ref2.stepLineToKeywordMap, stepLineToPickledStepMap = _ref2.stepLineToPickledStepMap, testStep = _ref2.testStep; var data = {}; if (testStep.sourceLocation) { var line = testStep.sourceLocation.line; var pickleStep = stepLineToPickledStepMap[line]; data.arguments = this.formatStepArguments(pickleStep.arguments); data.keyword = getStepKeyword({ pickleStep: pickleStep, stepLineToKeywordMap: stepLineToKeywordMap }); data.line = line; data.name = pickleStep.text; } else { data.keyword = isBeforeHook ? 'Before' : 'After'; data.hidden = true; } if (testStep.actionLocation) { data.match = { location: (0, _helpers.formatLocation)(testStep.actionLocation) }; } if (testStep.result) { var _testStep$result = testStep.result, exception = _testStep$result.exception, status = _testStep$result.status; data.result = { status: status }; if (testStep.result.duration) { data.result.duration = testStep.result.duration * 1000000; } if (status === _status2.default.FAILED && exception) { data.result.error_message = (0, _assertionErrorFormatter.format)(exception); } } if (_lodash2.default.size(testStep.attachments) > 0) { data.embeddings = testStep.attachments.map(function (attachment) { return { data: attachment.data, mime_type: attachment.media.type }; }); } return data; } }, { key: 'getTags', value: function getTags(obj) { return _lodash2.default.map(obj.tags, function (tagData) { return { name: tagData.name, line: tagData.location.line }; }); } }]); return JsonFormatter; }(_3.default); exports.default = JsonFormatter; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mb3JtYXR0ZXIvanNvbl9mb3JtYXR0ZXIuanMiXSwibmFtZXMiOlsiZ2V0U3RlcExpbmVUb0tleXdvcmRNYXAiLCJnZXRTY2VuYXJpb0xpbmVUb0Rlc2NyaXB0aW9uTWFwIiwiZ2V0U2NlbmFyaW9EZXNjcmlwdGlvbiIsImdldFN0ZXBMaW5lVG9QaWNrbGVkU3RlcE1hcCIsImdldFN0ZXBLZXl3b3JkIiwiSnNvbkZvcm1hdHRlciIsIm9wdGlvbnMiLCJldmVudEJyb2FkY2FzdGVyIiwib24iLCJvblRlc3RSdW5GaW5pc2hlZCIsIm9iaiIsIm5hbWUiLCJyZXBsYWNlIiwidG9Mb3dlckNhc2UiLCJkYXRhVGFibGUiLCJyb3dzIiwibWFwIiwiY2VsbHMiLCJyb3ciLCJkb2NTdHJpbmciLCJjb250ZW50IiwibGluZSIsImxvY2F0aW9uIiwic3RlcEFyZ3VtZW50cyIsIml0ZXJhdG9yIiwiZm9ybWF0RGF0YVRhYmxlIiwiYmluZCIsImZvcm1hdERvY1N0cmluZyIsImdyb3VwZWRUZXN0Q2FzZXMiLCJlYWNoIiwiZXZlbnREYXRhQ29sbGVjdG9yIiwidGVzdENhc2VNYXAiLCJ1cmkiLCJ0ZXN0Q2FzZSIsInNvdXJjZUxvY2F0aW9uIiwicHVzaCIsImZlYXR1cmVzIiwiZ3JvdXAiLCJnaGVya2luRG9jdW1lbnQiLCJnaGVya2luRG9jdW1lbnRNYXAiLCJmZWF0dXJlRGF0YSIsImdldEZlYXR1cmVEYXRhIiwiZmVhdHVyZSIsInN0ZXBMaW5lVG9LZXl3b3JkTWFwIiwic2NlbmFyaW9MaW5lVG9EZXNjcmlwdGlvbk1hcCIsImVsZW1lbnRzIiwiZ2V0VGVzdENhc2VEYXRhIiwicGlja2xlIiwic2NlbmFyaW9EYXRhIiwiZ2V0U2NlbmFyaW9EYXRhIiwiZmVhdHVyZUlkIiwiaWQiLCJzdGVwTGluZVRvUGlja2xlZFN0ZXBNYXAiLCJpc0JlZm9yZUhvb2siLCJzdGVwcyIsInRlc3RTdGVwIiwiZ2V0U3RlcERhdGEiLCJsb2ciLCJKU09OIiwic3RyaW5naWZ5IiwiZGVzY3JpcHRpb24iLCJrZXl3b3JkIiwiY29udmVydE5hbWVUb0lkIiwidGFncyIsImdldFRhZ3MiLCJsb2NhdGlvbnMiLCJ0eXBlIiwiZGF0YSIsInBpY2tsZVN0ZXAiLCJhcmd1bWVudHMiLCJmb3JtYXRTdGVwQXJndW1lbnRzIiwidGV4dCIsImhpZGRlbiIsImFjdGlvbkxvY2F0aW9uIiwibWF0Y2giLCJyZXN1bHQiLCJleGNlcHRpb24iLCJzdGF0dXMiLCJkdXJhdGlvbiIsIkZBSUxFRCIsImVycm9yX21lc3NhZ2UiLCJzaXplIiwiYXR0YWNobWVudHMiLCJlbWJlZGRpbmdzIiwiYXR0YWNobWVudCIsIm1pbWVfdHlwZSIsIm1lZGlhIiwidGFnRGF0YSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOztBQUNBOztBQUNBOzs7O0lBR0VBLHVCLGtDQUFBQSx1QjtJQUNBQywrQixrQ0FBQUEsK0I7SUFJQUMsc0IseUJBQUFBLHNCO0lBQ0FDLDJCLHlCQUFBQSwyQjtJQUNBQyxjLHlCQUFBQSxjOztJQUdtQkMsYTs7O0FBQ25CLHlCQUFZQyxPQUFaLEVBQXFCO0FBQUE7O0FBQUEsNElBQ2JBLE9BRGE7O0FBRW5CQSxZQUFRQyxnQkFBUixDQUF5QkMsRUFBekIsQ0FBNEIsbUJBQTVCLEVBQW1ELE1BQUtDLGlCQUF4RDtBQUZtQjtBQUdwQjs7OztvQ0FFZUMsRyxFQUFLO0FBQ25CLGFBQU9BLElBQUlDLElBQUosQ0FBU0MsT0FBVCxDQUFpQixJQUFqQixFQUF1QixHQUF2QixFQUE0QkMsV0FBNUIsRUFBUDtBQUNEOzs7b0NBRWVDLFMsRUFBVztBQUN6QixhQUFPO0FBQ0xDLGNBQU1ELFVBQVVDLElBQVYsQ0FBZUMsR0FBZixDQUFtQjtBQUFBLGlCQUFRLEVBQUVDLE9BQU8saUJBQUVELEdBQUYsQ0FBTUUsSUFBSUQsS0FBVixFQUFpQixPQUFqQixDQUFULEVBQVI7QUFBQSxTQUFuQjtBQURELE9BQVA7QUFHRDs7O29DQUVl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NEUsUUFBUTVFLElBRG1CO0FBRWpDVSxnQkFBTWtFLFFBQVFqRSxRQUFSLENBQWlCRDtBQUZVLFNBQVo7QUFBQSxPQUFoQixDQUFQO0FBSUQ7Ozs7O2tCQW5Ka0JoQixhIiwiZmlsZSI6Impzb25fZm9ybWF0dGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJ1xuaW1wb3J0IEZvcm1hdHRlciBmcm9tICcuLydcbmltcG9ydCBTdGF0dXMgZnJvbSAnLi4vc3RhdHVzJ1xuaW1wb3J0IHsgZm9ybWF0TG9jYXRpb24sIEdoZXJraW5Eb2N1bWVudFBhcnNlciwgUGlja2xlUGFyc2VyIH0gZnJvbSAnLi9oZWxwZXJzJ1xuaW1wb3J0IHsgYnVpbGRTdGVwQXJndW1lbnRJdGVyYXRvciB9IGZyb20gJy4uL3N0ZXBfYXJndW1lbnRzJ1xuaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSAnYXNzZXJ0aW9uLWVycm9yLWZvcm1hdHRlcidcblxuY29uc3Qge1xuICBnZXRTdGVwTGluZVRvS2V5d29yZE1hcCxcbiAgZ2V0U2NlbmFyaW9MaW5lVG9EZXNjcmlwdGlvbk1hcCxcbn0gPSBHaGVya2luRG9jdW1lbnRQYXJzZXJcblxuY29uc3Qge1xuICBnZXRTY2VuYXJpb0Rlc2NyaXB0aW9uLFxuICBnZXRTdGVwTGluZVRvUGlja2xlZFN0ZXBNYXAsXG4gIGdldFN0ZXBLZXl3b3JkLFxufSA9IFBpY2tsZVBhcnNlclxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBKc29uRm9ybWF0dGVyIGV4dGVuZHMgRm9ybWF0dGVyIHtcbiAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgIHN1cGVyKG9wdGlvbnMpXG4gICAgb3B0aW9ucy5ldmVudEJyb2FkY2FzdGVyLm9uKCd0ZXN0LXJ1bi1maW5pc2hlZCcsIDo6dGhpcy5vblRlc3RSdW5GaW5pc2hlZClcbiAgfVxuXG4gIGNvbnZlcnROYW1lVG9JZChvYmopIHtcbiAgICByZXR1cm4gb2JqLm5hbWUucmVwbGFjZSgvIC9nLCAnLScpLnRvTG93ZXJDYXNlKClcbiAgfVxuXG4gIGZvcm1hdERhdGFUYWJsZShkYXRhVGFibGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcm93czogZGF0YVRhYmxlLnJvd3MubWFwKHJvdyA9PiAoeyBjZWxsczogXy5tYXAocm93LmNlbGxzLCAndmFsdWUnKSB9KSksXG4gICAgfVxuICB9XG5cbiAgZm9ybWF0RG9jU3RyaW5nKGRvY1N0cmluZykge1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBkb2NTdHJpbmcuY29udGVudCxcbiAgICAgIGxpbmU6IGRvY1N0cmluZy5sb2NhdGlvbi5saW5lLFxuICAgIH1cbiAgfVxuXG4gIGZvcm1hdFN0ZXBBcmd1bWVudHMoc3RlcEFyZ3VtZW50cykge1xuICAgIGNvbnN0IGl0ZXJhdG9yID0gYnVpbGRTdGVwQXJndW1lbnRJdGVyYXRvcih7XG4gICAgICBkYXRhVGFibGU6IHRoaXMuZm9ybWF0RGF0YVRhYmxlLmJpbmQodGhpcyksXG4gICAgICBkb2NTdHJpbmc6IHRoaXMuZm9ybWF0RG9jU3RyaW5nLmJpbmQodGhpcyksXG4gICAgfSlcbiAgICByZXR1cm4gXy5tYXAoc3RlcEFyZ3VtZW50cywgaXRlcmF0b3IpXG4gIH1cblxuICBvblRlc3RSdW5GaW5pc2hlZCgpIHtcbiAgICBjb25zdCBncm91cGVkVGVzdENhc2VzID0ge31cbiAgICBfLmVhY2godGhpcy5ldmVudERhdGFDb2xsZWN0b3IudGVzdENhc2VNYXAsIHRlc3RDYXNlID0+IHtcbiAgICAgIGNvbnN0IHsgc291cmNlTG9jYXRpb246IHsgdXJpIH0gfSA9IHRlc3RDYXNlXG4gICAgICBpZiAoIWdyb3VwZWRUZXN0Q2FzZXNbdXJpXSkge1xuICAgICAgICBncm91cGVkVGVzdENhc2VzW3VyaV0gPSBbXVxuICAgICAgfVxuICAgICAgZ3JvdXBlZFRlc3RDYXNlc1t1cmldLnB1c2godGVzdENhc2UpXG4gICAgfSlcbiAgICBjb25zdCBmZWF0dXJlcyA9IF8ubWFwKGdyb3VwZWRUZXN0Q2FzZXMsIChncm91cCwgdXJpKSA9PiB7XG4gICAgICBjb25zdCBnaGVya2luRG9jdW1lbnQgPSB0aGlzLmV2ZW50RGF0YUNvbGxlY3Rvci5naGVya2luRG9jdW1lbnRNYXBbdXJpXVxuICAgICAgY29uc3QgZmVhdHVyZURhdGEgPSB0aGlzLmdldEZlYXR1cmVEYXRhKGdoZXJraW5Eb2N1bWVudC5mZWF0dXJlLCB1cmkpXG4gICAgICBjb25zdCBzdGVwTGluZVRvS2V5d29yZE1hcCA9IGdldFN0ZXBMaW5lVG9LZXl3b3JkTWFwKGdoZXJraW5Eb2N1bWVudClcbiAgICAgIGNvbnN0IHNjZW5hcmlvTGluZVRvRGVzY3JpcHRpb25NYXAgPSBnZXRTY2VuYXJpb0xpbmVUb0Rlc2NyaXB0aW9uTWFwKFxuICAgICAgICBnaGVya2luRG9jdW1lbnRcbiAgICAgIClcbiAgICAgIGZlYXR1cmVEYXRhLmVsZW1lbnRzID0gZ3JvdXAubWFwKHRlc3RDYXNlID0+IHtcbiAgICAgICAgY29uc3QgeyBwaWNrbGUgfSA9IHRoaXMuZXZlbnREYXRhQ29sbGVjdG9yLmdldFRlc3RDYXNlRGF0YShcbiAgICAgICAgICB0ZXN0Q2FzZS5zb3VyY2VMb2NhdGlvblxuICAgICAgICApXG4gICAgICAgIGNvbnN0IHNjZW5hcmlvRGF0YSA9IHRoaXMuZ2V0U2NlbmFyaW9EYXRhKHtcbiAgICAgICAgICBmZWF0dXJlSWQ6IGZlYXR1cmVEYXRhLmlkLFxuICAgICAgICAgIHBpY2tsZSxcbiAgICAgICAgICBzY2VuYXJpb0xpbmVUb0Rlc2NyaXB0aW9uTWFwLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBzdGVwTGluZVRvUGlja2xlZFN0ZXBNYXAgPSBnZXRTdGVwTGluZVRvUGlja2xlZFN0ZXBNYXAocGlja2xlKVxuICAgICAgICBsZXQgaXNCZWZvcmVIb29rID0gdHJ1ZVxuICAgICAgICBzY2VuYXJpb0RhdGEuc3RlcHMgPSB0ZXN0Q2FzZS5zdGVwcy5tYXAodGVzdFN0ZXAgPT4ge1xuICAgICAgICAgIGlzQmVmb3JlSG9vayA9IGlzQmVmb3JlSG9vayAmJiAhdGVzdFN0ZXAuc291cmNlTG9jYXRpb25cbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRTdGVwRGF0YSh7XG4gICAgICAgICAgICBpc0JlZm9yZUhvb2ssXG4gICAgICAgICAgICBzdGVwTGluZVRvS2V5d29yZE1hcCxcbiAgICAgICAgICAgIHN0ZXBMaW5lVG9QaWNrbGVkU3RlcE1hcCxcbiAgICAgICAgICAgIHRlc3RTdGVwLFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBzY2VuYXJpb0RhdGFcbiAgICAgIH0pXG4gICAgICByZXR1cm4gZmVhdHVyZURhdGFcbiAgICB9KVxuICAgIHRoaXMubG9nKEpTT04uc3RyaW5naWZ5KGZlYXR1cmVzLCBudWxsLCAyKSlcbiAgfVxuXG4gIGdldEZlYXR1cmVEYXRhKGZlYXR1cmUsIHVyaSkge1xuICAgIHJldHVybiB7XG4gICAgICBkZXNjcmlwdGlvbjogZmVhdHVyZS5kZXNjcmlwdGlvbixcbiAgICAgIGtleXdvcmQ6IGZlYXR1cmUua2V5d29yZCxcbiAgICAgIG5hbWU6IGZlYXR1cmUubmFtZSxcbiAgICAgIGxpbmU6IGZlYXR1cmUubG9jYXRpb24ubGluZSxcbiAgICAgIGlkOiB0aGlzLmNvbnZlcnROYW1lVG9JZChmZWF0dXJlKSxcbiAgICAgIHRhZ3M6IHRoaXMuZ2V0VGFncyhmZWF0dXJlKSxcbiAgICAgIHVyaSxcbiAgICB9XG4gIH1cblxuICBnZXRTY2VuYXJpb0RhdGEoeyBmZWF0dXJlSWQsIHBpY2tsZSwgc2NlbmFyaW9MaW5lVG9EZXNjcmlwdGlvbk1hcCB9KSB7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSBnZXRTY2VuYXJpb0Rlc2NyaXB0aW9uKHtcbiAgICAgIHBpY2tsZSxcbiAgICAgIHNjZW5hcmlvTGluZVRvRGVzY3JpcHRpb25NYXAsXG4gICAgfSlcbiAgICByZXR1cm4ge1xuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBpZDogYCR7ZmVhdHVyZUlkfTske3RoaXMuY29udmVydE5hbWVUb0lkKHBpY2tsZSl9YCxcbiAgICAgIGtleXdvcmQ6ICdTY2VuYXJpbycsXG4gICAgICBsaW5lOiBwaWNrbGUubG9jYXRpb25zWzBdLmxpbmUsXG4gICAgICBuYW1lOiBwaWNrbGUubmFtZSxcbiAgICAgIHRhZ3M6IHRoaXMuZ2V0VGFncyhwaWNrbGUpLFxuICAgICAgdHlwZTogJ3NjZW5hcmlvJyxcbiAgICB9XG4gIH1cblxuICBnZXRTdGVwRGF0YSh7XG4gICAgaXNCZWZvcmVIb29rLFxuICAgIHN0ZXBMaW5lVG9LZXl3b3JkTWFwLFxuICAgIHN0ZXBMaW5lVG9QaWNrbGVkU3RlcE1hcCxcbiAgICB0ZXN0U3RlcCxcbiAgfSkge1xuICAgIGNvbnN0IGRhdGEgPSB7fVxuICAgIGlmICh0ZXN0U3RlcC5zb3VyY2VMb2NhdGlvbikge1xuICAgICAgY29uc3QgeyBsaW5lIH0gPSB0ZXN0U3RlcC5zb3VyY2VMb2NhdGlvblxuICAgICAgY29uc3QgcGlja2xlU3RlcCA9IHN0ZXBMaW5lVG9QaWNrbGVkU3RlcE1hcFtsaW5lXVxuICAgICAgZGF0YS5hcmd1bWVudHMgPSB0aGlzLmZvcm1hdFN0ZXBBcmd1bWVudHMocGlja2xlU3RlcC5hcmd1bWVudHMpXG4gICAgICBkYXRhLmtleXdvcmQgPSBnZXRTdGVwS2V5d29yZCh7IHBpY2tsZVN0ZXAsIHN0ZXBMaW5lVG9LZXl3b3JkTWFwIH0pXG4gICAgICBkYXRhLmxpbmUgPSBsaW5lXG4gICAgICBkYXRhLm5hbWUgPSBwaWNrbGVTdGVwLnRleHRcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0YS5rZXl3b3JkID0gaXNCZWZvcmVIb29rID8gJ0JlZm9yZScgOiAnQWZ0ZXInXG4gICAgICBkYXRhLmhpZGRlbiA9IHRydWVcbiAgICB9XG4gICAgaWYgKHRlc3RTdGVwLmFjdGlvbkxvY2F0aW9uKSB7XG4gICAgICBkYXRhLm1hdGNoID0geyBsb2NhdGlvbjogZm9ybWF0TG9jYXRpb24odGVzdFN0ZXAuYWN0aW9uTG9jYXRpb24pIH1cbiAgICB9XG4gICAgaWYgKHRlc3RTdGVwLnJlc3VsdCkge1xuICAgICAgY29uc3QgeyByZXN1bHQ6IHsgZXhjZXB0aW9uLCBzdGF0dXMgfSB9ID0gdGVzdFN0ZXBcbiAgICAgIGRhdGEucmVzdWx0ID0geyBzdGF0dXMgfVxuICAgICAgaWYgKHRlc3RTdGVwLnJlc3VsdC5kdXJhdGlvbikge1xuICAgICAgICBkYXRhLnJlc3VsdC5kdXJhdGlvbiA9IHRlc3RTdGVwLnJlc3VsdC5kdXJhdGlvbiAqIDEwMDAwMDBcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0dXMgPT09IFN0YXR1cy5GQUlMRUQgJiYgZXhjZXB0aW9uKSB7XG4gICAgICAgIGRhdGEucmVzdWx0LmVycm9yX21lc3NhZ2UgPSBmb3JtYXQoZXhjZXB0aW9uKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoXy5zaXplKHRlc3RTdGVwLmF0dGFjaG1lbnRzKSA+IDApIHtcbiAgICAgIGRhdGEuZW1iZWRkaW5ncyA9IHRlc3RTdGVwLmF0dGFjaG1lbnRzLm1hcChhdHRhY2htZW50ID0+ICh7XG4gICAgICAgIGRhdGE6IGF0dGFjaG1lbnQuZGF0YSxcbiAgICAgICAgbWltZV90eXBlOiBhdHRhY2htZW50Lm1lZGlhLnR5cGUsXG4gICAgICB9KSlcbiAgICB9XG4gICAgcmV0dXJuIGRhdGFcbiAgfVxuXG4gIGdldFRhZ3Mob2JqKSB7XG4gICAgcmV0dXJuIF8ubWFwKG9iai50YWdzLCB0YWdEYXRhID0+ICh7XG4gICAgICBuYW1lOiB0YWdEYXRhLm5hbWUsXG4gICAgICBsaW5lOiB0YWdEYXRhLmxvY2F0aW9uLmxpbmUsXG4gICAgfSkpXG4gIH1cbn1cbiJdfQ==