From 762a72d3fd1d2094395470195f15e2f07491e977 Mon Sep 17 00:00:00 2001 From: LarryG Date: Tue, 28 Feb 2023 15:08:51 +0000 Subject: [PATCH 1/3] major code refactor upgraded to work with cucumber v8 --- .gitignore | 6 + coding-Standards/eslint/.eslintrc.json | 50 + index.js | 6 +- lib/hierarchyReporter.js | 170 ++- lib/jsonDir.js | 45 +- lib/reporter.js | 1042 +++++++++-------- lib/searchFileUp.js | 32 +- package.json | 30 +- .../cucumber_report_bootstrap.html | 14 +- .../cucumber_report_hierarchy.html | 18 +- .../_common/bootstrap.hierarchy/features.html | 4 +- .../_common/bootstrap.hierarchy/piechart.js | 106 +- .../_common/bootstrap.hierarchy/script.js | 26 +- .../_common/bootstrap.hierarchy/style.css | 16 + templates/_common/foundation/script.js | 59 +- templates/_common/screenshot.js | 30 +- templates/bootstrap/index.html | 169 ++- templates/simple/script.js | 22 +- test/assert/assertHtmlReports.js | 57 +- test/createHtmlReports.js | 125 +- test/features/happy/overjoyed/happy.feature | 2 +- test/features/step_definitions/hooks.js | 41 +- test/features/step_definitions/stepDefs.js | 68 +- yarn.lock | 932 +++++++++------ 24 files changed, 1760 insertions(+), 1310 deletions(-) create mode 100755 coding-Standards/eslint/.eslintrc.json diff --git a/.gitignore b/.gitignore index 3580aa5..19ac1b1 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,9 @@ test/report/*.html test/report/*.json *.log +.DS_Store +/samples/.DS_Store +templates/.DS_Store +templates/_common/.DS_Store +test/.DS_Store +test/features/.DS_Store diff --git a/coding-Standards/eslint/.eslintrc.json b/coding-Standards/eslint/.eslintrc.json new file mode 100755 index 0000000..72fa282 --- /dev/null +++ b/coding-Standards/eslint/.eslintrc.json @@ -0,0 +1,50 @@ +{ + "env": { + "browser": true, + "commonjs": true, + "es6": true, + "node": true + }, + "parserOptions": { + "ecmaVersion":2017, + "ecmaFeatures": { + "jsx": true + }, + "sourceType": "module" + }, + "plugins": ["import", "prettier"], + "extends": [ + "eslint:recommended", + "plugin:import/errors", + "plugin:import/warnings" + ], + "rules": { + "prettier/prettier": [ + "warn", + { + "singleQuote": true, + "printWidth": 120 + } + ], + "no-const-assign": "warn", + "no-this-before-super": "warn", + "no-undef": "warn", + "no-unreachable": "warn", + "no-unused-vars": "warn", + "constructor-super": "warn", + "valid-typeof": "warn", + "linebreak-style": [ "error", "unix" ], + "no-console": [ 0, "error" ], + "indent": [ "error", 2 ], + "semi": [ "error", "always" ], + "quotes":["error", "single"] + }, + "globals": { + "noImplicitAny": "readonly", + "noImplicitThis": "readonly", + "strictNullChecks": "readonly", + "strictFunctionTypes": "readonly", + "noEmit": "readonly", + "forceConsistentCasingInFileNames": "readonly" + } +} \ No newline at end of file diff --git a/index.js b/index.js index 505eaa0..9b0e023 100644 --- a/index.js +++ b/index.js @@ -24,12 +24,12 @@ 'use strict'; -var reporter = require('./lib/reporter'); +const reporter = require('./lib/reporter'); function generateReport(options, callback) { - return reporter.generate(options, callback); + return reporter.generate(options, callback); } module.exports = { - generate: generateReport + generate: generateReport, }; diff --git a/lib/hierarchyReporter.js b/lib/hierarchyReporter.js index 7ed3233..2a25b54 100644 --- a/lib/hierarchyReporter.js +++ b/lib/hierarchyReporter.js @@ -1,7 +1,5 @@ -'use strict'; - -var _ = require('lodash'); -var path = require('path'); +// const _ = require('lodash'); +const path = require('path'); /** * hierarchyReporter.js @@ -11,119 +9,117 @@ var path = require('path'); * but they will be harmlessly ignored by other report types */ -/** - * Review each feature in the suite, and find the common baseDir that is shared by all of them. - * We will later use this as the basis from which to construct the feature hierarchy-- - * the basedir prefix needs to be removed since it is not important. - */ -var getBaseDir = function (suite) { - var baseDir = []; +module.exports = { + /** + * Review each feature in the suite, and find the common baseDir that is shared by all of them. + * We will later use this as the basis from which to construct the feature hierarchy-- + * the basedir prefix needs to be removed since it is not important. + */ + getBaseDir: function (suite) { + let baseDir = []; suite.features.forEach(function (feature) { - var uriParts = feature.uri.split(path.sep); - if (!baseDir.length) { - baseDir = uriParts; - } else { - for (var i = uriParts.length; i > 0; i--) { - if ((baseDir.length > i) && (baseDir[i] !== uriParts[i])) { - baseDir.length = i; - } - } - } + baseDir = feature.uri.split(path.sep); + // let uriParts = feature.uri.split(path.sep); + // if (!baseDir?.length) { + // baseDir = uriParts; + // // console.log('this is the result 1 ===> ', suite); + // } else { + // for (let i = uriParts.length; i > 0; i--) { + // // for (let i = 0, l = uriParts.length; i < l; i++) { + // if ((baseDir.length > i) && (baseDir[i] !== uriParts[i])) { + // baseDir.length = i; + // // console.log('this is the result ===> ', baseDir.length = i) + // } + // } + // } }); return baseDir.join(path.sep); -}; + }, -/** - * Given a feature, remove the basedir prefix and the feature name suffix from its URI - * and return the remaining folders (if any) in an array. If the feature is at the top-level, - * it will return [] - * For example: - * @param featureUri: '/home/cstrong/myproj/test/features/authentication/login/guestLogin.feature' - * @param baseDir: '/home/cstrong/myproj/test/features' - * @returns [ 'authentication', 'login' ] - */ -var getFeatureHierarchy = function (featureUri, baseDir) { - var noBaseDir = featureUri.slice(baseDir.length + 1); - var noBadChars = noBaseDir.split('=').join('_'); - var featureDirs = noBadChars.split(path.sep); + /** + * Given a feature, remove the basedir prefix and the feature name suffix from its URI + * and return the remaining folders (if any) in an array. If the feature is at the top-level, + * it will return [] + * For example: + * @param featureUri: '/home/cstrong/myproj/test/features/authentication/login/guestLogin.feature' + * @param baseDir: '/home/cstrong/myproj/test/features' + * @returns [ 'authentication', 'login' ] + */ + getFeatureHierarchy: function (featureUri, baseDir) { + let noBaseDir = featureUri.slice(baseDir.length + 1); + let noBadChars = noBaseDir.split('=').join('_'); + let featureDirs = noBadChars.split(path.sep); // remove the feature name itself featureDirs.length = featureDirs.length - 1; return featureDirs; -}; + }, -/** - * Given the top-level suite and the hierarchy to build, recursively create the hierarchy - * of sub-suites (if needed) and return the lowest level sub-suite. - * - * @param suite - * @param hierarchy e.g. [ 'authentication', 'login' ] - * @returns suite object or null if there is no hierarchy - */ -var findOrCreateSubSuite = function (suite, hierarchy) { - - /* + /** + * Given the top-level suite and the hierarchy to build, recursively create the hierarchy + * of sub-suites (if needed) and return the lowest level sub-suite. + * + * @param suite + * @param hierarchy e.g. [ 'authentication', 'login' ] + * @returns suite object or null if there is no hierarchy + */ + findOrCreateSubSuite: function (suite, hierarchy) { + /** Create a new sub-suite correspond to a folder name. The suite will contain the features that are defined within that folder, and/or sub-suites corresponding to any sub-folders that themselves may contain features. A sub-suite has a reference to its parent suite, so that we can easily aggregate statistics of passed and failed tests up the hierarchy. */ function newSubSuite(name, parent) { - return { - name: { - plain: name, - sanitized: name - }, - passed: 0, - failed: 0, - ambiguous: 0, - skipped: 0, - parent: parent, - features: [], - suites: [] - }; + return { + name: { + plain: name, + sanitized: name, + }, + passed: 0, + failed: 0, + ambiguous: 0, + skipped: 0, + parent: parent, + features: [], + suites: [], + }; } if (hierarchy.length < 1) { - return null; + return null; } - var subSuiteName = hierarchy[0]; + let subSuiteName = hierarchy[0]; if (!suite.suites) { - suite.suites = []; + suite.suites = []; } - var subSuite = suite.suites.find(function (s) { - return s.name.plain === subSuiteName; + let subSuite = suite.suites.find(function (s) { + return s.name.plain === subSuiteName; }); if (!subSuite) { - subSuite = newSubSuite(subSuiteName, suite); - suite.suites.push(subSuite); + let subSuite = newSubSuite(subSuiteName, suite); + suite.suites.push(subSuite); } if (hierarchy.length === 1) { - return subSuite; + return subSuite; } else { - return findOrCreateSubSuite(subSuite, hierarchy.slice(1)); + return this.findOrCreateSubSuite(subSuite, hierarchy.slice(1)); } -}; + }, -/** - * Increment stat such as failed, ambiguous or passed for the current suite - * and follow the parent attribute (if any) recursively up the tree, incrementing all. - * That way the top level suite accumulates all results from child and grandchild suites - * - * @param subSuite - * @param attrName ('passed', 'failed', 'ambiguous', or 'skipped') - */ -var recursivelyIncrementStat = function (subSuite, attrName) { + /** + * Increment stat such as failed, ambiguous or passed for the current suite + * and follow the parent attribute (if any) recursively up the tree, incrementing all. + * That way the top level suite accumulates all results from child and grandchild suites + * + * @param subSuite + * @param attrName ('passed', 'failed', 'ambiguous', or 'skipped') + */ + recursivelyIncrementStat: function (subSuite, attrName) { subSuite[attrName] = subSuite[attrName] + 1; if (subSuite.parent) { - recursivelyIncrementStat(subSuite.parent, attrName); + this.recursivelyIncrementStat(subSuite.parent, attrName); } -}; - -module.exports = { - getBaseDir: getBaseDir, - getFeatureHierarchy: getFeatureHierarchy, - findOrCreateSubSuite: findOrCreateSubSuite, - recursivelyIncrementStat: recursivelyIncrementStat + }, }; diff --git a/lib/jsonDir.js b/lib/jsonDir.js index 7b2260d..fbe0b5d 100644 --- a/lib/jsonDir.js +++ b/lib/jsonDir.js @@ -1,11 +1,12 @@ -'use strict'; +// 'use strict'; +const jsonFile = require('jsonfile'); +const find = require('find'); +const path = require('path'); -var jsonFile = require('jsonfile'); -var find = require('find'); - -var collectJSONS = function (options) { - var jsonOutput = []; - var files; +const collectJSONS = function (options) { + const jsonOutput = []; + const featureCollection = new Map(); + let files; try { files = find.fileSync(/\.json$/, options.jsonDir); @@ -16,10 +17,30 @@ var collectJSONS = function (options) { if (files.length === 0) throw new Error('No JSON files found under \'options.jsonDir\': ' + options.jsonDir); function mergeJSONS(file) { - var cucumberJson = jsonFile.readFileSync(file); + let cucumberJson = jsonFile.readFileSync(file); + function trackScenarioRetries(scenarios) { + // HACK: Very brittle. Will track if cucumber json file name is not in format command.1.1.log.json + let basename = path.basename(file, ".log.json"); + let retried = basename.split(".")[2] ?? "0"; + retried = parseInt(retried); + scenarios.forEach( (scenario) => { + scenario["retried"] = retried; + }); + } + function collect(json) { - jsonOutput.push(json); + trackScenarioRetries(json["elements"] ?? []); + let featureKey = json["uri"] ?? "Feature: URI Not Present"; + if (featureCollection.has(featureKey)) { + const featureItem = featureCollection.get(featureKey); + const elements = featureItem["elements"] ?? []; + elements.push(...(json["elements"] ?? [])); + featureItem["elements"] = elements; + featureCollection.set(featureKey, featureItem); + } else { + featureCollection.set(featureKey, json); + } } if ((!cucumberJson || typeof cucumberJson[0] === 'undefined') && !options.ignoreBadJsonFile) { @@ -38,7 +59,7 @@ var collectJSONS = function (options) { featureItem["elements"][0]["steps"][0]["output"] && featureItem["elements"][0]["steps"][0]["output"][0]) { if (typeof featureItem["elements"][0]["steps"][0]["output"][0] !== 'undefined') { - var timestamp = featureItem["elements"][0]["steps"][0]["output"][0]; + const timestamp = featureItem["elements"][0]["steps"][0]["output"][0]; featureItem["timestamp"] = Date.parse(timestamp.match(/[0-9]{4}-.+:[0-9]{2}/g)); } } @@ -47,6 +68,10 @@ var collectJSONS = function (options) { files.map(mergeJSONS); + featureCollection.forEach( (feature, _) => { + jsonOutput.push(feature); + }); + jsonOutput.map(addTimestamp); if (!jsonOutput.filter(f => !f.timestamp).length) { jsonOutput.sort(function (feature, nextFeature) { diff --git a/lib/reporter.js b/lib/reporter.js index ba117ba..791b078 100644 --- a/lib/reporter.js +++ b/lib/reporter.js @@ -1,549 +1,607 @@ -'use strict'; - -var jsonFile = require('jsonfile'); -var _ = require('lodash'); -var fs = require('fs-extra'); -var path = require('path'); -var jsonDir = require('./jsonDir'); -var open = require('open'); +// 'use strict'; const chalk = require('chalk'); +const jsonFile = require('jsonfile'); +const _ = require('lodash'); +const fs = require('fs-extra'); +const path = require('path'); +const jsonDir = require('./jsonDir'); const emoji = require('node-emoji'); -var searchFileUp = require('./searchFileUp'); -var hierarchyReporter = require('./hierarchyReporter'); -const guid = require('uuid/v4'); -const isBase64 = (data) => /^(?:[A-Z0-9+\/]{4})*(?:[A-Z0-9+\/]{2}==|[A-Z0-9+\/]{3}=|[A-Z0-9+\/]{4})$/i.test(data); - -var generateReport = function (options) { - var featureOutput = jsonFile.readFileSync(options.jsonFile); - var packageJsonPath = searchFileUp('package.json'); - var packageJson = {}; - try { - packageJson = packageJsonPath && jsonFile.readFileSync(packageJsonPath, 'utf8'); - } catch (err) { - console.warn('No package.json file found in: ' + packageJsonPath + ', using default name and version.'); - packageJson.name = 'default'; - packageJson.version = '0.0.0'; +const searchFileUp = require('./searchFileUp'); +const hierarchyReporter = require('./hierarchyReporter'); +const guid = require('uuid').v4; +const open = require('open'); +let isBase64 = (data) => /^(?:[A-Z0-9+/]{4})*(?:[A-Z0-9+/]{2}==|[A-Z0-9+/]{3}=|[A-Z0-9+/]{4})$/i.test(data); + +let stageRerunCount = getStageReRunCount(); + +const generateReport = function (options) { + let featureOutput = jsonFile.readFileSync(options.jsonFile); + let packageJsonPath = searchFileUp('package.json'); + let packageJson = {}; + try { + packageJson = packageJsonPath && jsonFile.readFileSync(packageJsonPath, 'utf8'); + } catch (err) { + console.warn('No package.json file found in: ' + packageJsonPath + ', using default name and version.'); + packageJson.name = 'default'; + packageJson.version = '0.0.0'; + } + + const sanitize = function (name, find) { + const unsafeCharacters = find || /[/|:"*?<>]/g; + if (name !== undefined) { + name = name.trim().replace(unsafeCharacters, '_'); } + return name; + }; + + featureOutput.summary = { + isFailed: false, + passed: 0, + failed: 0, + ambiguous: 0, + skipped: 0, + notdefined: 0, + pending: 0, + }; + + const result = { + status: { + passed: 'passed', + failed: 'failed', + skipped: 'skipped', + pending: 'pending', + undefined: 'undefined', + ambiguous: 'ambiguous', + }, + }; + + let suite = { + name: { + plain: options.name || (packageJson && packageJson.name), + sanitized: sanitize(options.name || (packageJson && packageJson.name), /[^a-z|0-9]/g), + }, + brandTitle: options.brandTitle, + version: packageJson && packageJson.version, + time: new Date(), + features: featureOutput, + passed: 0, + failed: 0, + ambiguous: 0, + rerun: 0, + totalTime: 0, + suites: [], + scenarios: { + passed: 0, + failed: 0, + skipped: 0, + pending: 0, + notdefined: 0, + ambiguous: 0, + rerun: 0, + getTotal: function () { + return this.passed + this.failed + this.skipped + this.pending + this.notdefined + this.ambiguous; + }, + }, + }; + + const createReportDirectoryIfNotExists = function () { + if (!fs.existsSync(options.output)) { + fs.mkdirsSync(path.dirname(options.output)); + } + }; - var sanitize = function (name, find) { - var unsafeCharacters = find || /[/\|:"*?<>]/g; - if (name !== undefined) { - name = name.trim().replace(unsafeCharacters, '_'); - } - return name; - }; - - featureOutput.summary = { - isFailed: false, - passed: 0, - failed: 0, - ambiguous: 0, - skipped: 0, - notdefined: 0, - pending: 0 - }; - - var result = { - status: { - passed: 'passed', - failed: 'failed', - skipped: 'skipped', - pending: 'pending', - undefined: 'undefined', - ambiguous: 'ambiguous' - } - }; - - var suite = { - name: { - plain: options.name || packageJson && packageJson.name, - sanitized: sanitize(options.name || packageJson && packageJson.name, /[^a-z|0-9]/g) - }, - brandTitle: options.brandTitle, - version: packageJson && packageJson.version, - time: new Date(), - features: featureOutput, - passed: 0, - failed: 0, - ambiguous: 0, - totalTime: 0, - suites: [], - scenarios: { - passed: 0, - failed: 0, - skipped: 0, - pending: 0, - notdefined: 0, - ambiguous: 0 - } - }; - - var createReportDirectoryIfNotExists = function () { - if (!fs.existsSync(options.output)) { - fs.mkdirsSync(path.dirname(options.output)); - } - }; - - createReportDirectoryIfNotExists(); + createReportDirectoryIfNotExists(); - function getColumnLayoutWidth() { - const FULL_WIDTH = 12; - const HALF_WIDTH = 6; + function getColumnLayoutWidth() { + const FULL_WIDTH = 12; + const HALF_WIDTH = 6; - if(options.columnLayout === 1) { - return FULL_WIDTH; - } else { - return HALF_WIDTH; - } + if (options.columnLayout === 1) { + return FULL_WIDTH; + } else { + return HALF_WIDTH; + } + } + /** + * Make human-readable duration for scenario steps + * Sample Input: "2005366787" + * Sample Output: "2s 5ms" + */ + const calculateDuration = function (durationInNanoSeconds) { + // convert it to MILLI_SECONDS + const durationInMillis = _.floor(durationInNanoSeconds / 1000000); + + let oneMilliSecond = 1000; + let oneMinute = 60 * oneMilliSecond; + let formattedDuration = '0s'; + + function format(min, sec, ms) { + const MINUTES = 'm '; + const SECONDS = 's '; + const MILLI_SECONDS = 'ms'; + let formattedTimeStamp = ''; + + min > 0 ? (formattedTimeStamp += min + MINUTES) : ''; + sec > 0 ? (formattedTimeStamp += sec + SECONDS) : ''; + ms > 0 ? (formattedTimeStamp += ms + MILLI_SECONDS) : ''; + + return formattedTimeStamp.trim().length === 0 ? '< 1ms' : formattedTimeStamp; } - /** - * Make human-readable duration for scenario steps - * Sample Input: "2005366787" - * Sample Output: "2s 5ms" - */ - var calculateDuration = function (durationInNanoSeconds) { - // convert it to MILLI_SECONDS - var durationInMillis = _.floor(durationInNanoSeconds / 1000000); - - var oneMilliSecond = 1000; - var oneMinute = 60 * oneMilliSecond; - var formattedDuration = '0s'; - - function format(min, sec, ms) { - var MINUTES = 'm '; - var SECONDS = 's '; - var MILLI_SECONDS = 'ms'; - var formattedTimeStamp = ''; - - min > 0 ? formattedTimeStamp += min + MINUTES : ''; - sec > 0 ? formattedTimeStamp += sec + SECONDS : ''; - ms > 0 ? formattedTimeStamp += ms + MILLI_SECONDS : ''; - - return formattedTimeStamp.trim().length === 0 ? '< 1ms' : formattedTimeStamp; - } - if (!isNaN(durationInMillis)) { + if (!isNaN(durationInMillis)) { + const min = _.floor(durationInMillis / oneMinute); + const sec = _.floor((durationInMillis % oneMinute) / oneMilliSecond); + const ms = durationInMillis % oneMilliSecond; - var min = _.floor(durationInMillis / oneMinute); - var sec = _.floor((durationInMillis % oneMinute) / oneMilliSecond); - var ms = durationInMillis % oneMilliSecond; + formattedDuration = format(min, sec, ms); + } - formattedDuration = format(min, sec, ms); - } + return formattedDuration; + }; - return formattedDuration; - }; + const preventOverlappingTheScenarioTitle = function (element) { + let counter = 0; - var preventOverlappingTheScenarioTitle = function (element) { - var counter = 0; + if (element.passed) counter++; + if (element.notdefined) counter++; + if (element.pending) counter++; + if (element.skipped) counter++; + if (element.failed) counter++; + if (element.ambiguous) counter++; - if (element.passed) counter++; - if (element.notdefined) counter++; - if (element.pending) counter++; - if (element.skipped) counter++; - if (element.failed) counter++; - if (element.ambiguous) counter++; + counter = counter * 20 + 10; + if (element.retried) { + // 90px fixed width + counter = Math.max(counter, 90); + } - counter = (counter * 20) + 10; + return counter + 'px'; + }; - return counter + 'px'; - }; + const readFileForRespectiveTemplates = function (filename) { + if (filename === 'script.js' && options.theme === 'foundation') { + return readFile('../_common/foundation/' + filename); + } + return options.theme === 'bootstrap' || options.theme === 'hierarchy' + ? readFile('../_common/bootstrap.hierarchy/' + filename) + : readFile(filename); + }; + + /** + * NOTE: This method is used by hierarchy report template, harmless for others. + * Creates the HTML fragments for any features assigned to this suite, + * and stores them in `featureMarkup` attribute of the suite so we can render them in index.tmpl + * + * @param suite + */ + + const getFeaturesTemplate = function (suite) { + return _.template(readFileForRespectiveTemplates('features.html'))({ + suite: suite, + _: _, + calculateDuration: calculateDuration, + columnLayoutWidth: getColumnLayoutWidth(), + decideScenarioTitlePadding: preventOverlappingTheScenarioTitle, + guid: guid, + }); + }; + + const setupSubSuiteTemplates = function (suite) { + suite.featureMarkup = '
No features
'; + if (suite.features && suite.features.length) { + suite.featureMarkup = getFeaturesTemplate(suite); + } + for (let i = 0; i < suite.suites.length; i++) { + const subSuite = suite.suites[i]; + setupSubSuiteTemplates(subSuite); + } + }; + + const parseScenarioHooks = function (data) { + return data.map((step) => { + const match = step.match && step.match.location ? step.match : { location: 'can not be determined' }; + + if (step.embeddings === undefined) { + return {}; + } + + return { + arguments: step.arguments || [], + result: step.result, + match, + embeddings: step.embeddings || [], + }; + }); + }; + + const setStats = function (suite) { + const featureOutput = suite.features; + const topLevelFeatures = []; + const featuresSummary = suite.features.summary; + let screenshotsDirectory; + suite.reportAs = 'Features'; + if (options.screenshotsDirectory) { + screenshotsDirectory = options.screenshotsDirectory; + } else { + screenshotsDirectory = options.output ? path.join(options.output, '..', 'screenshots') : 'screenshots'; + } - var readFileForRespectiveTemplates = function (filename) { - if (filename === 'script.js' && options.theme === 'foundation') { - return readFile('../_common/foundation/' + filename); - } - return ((options.theme === 'bootstrap') || (options.theme === 'hierarchy')) ? readFile('../_common/bootstrap.hierarchy/' + filename) : readFile(filename); - }; - - /** - * NOTE: This method is used by hierarchy report template, harmless for others. - * Creates the HTML fragments for any features assigned to this suite, - * and stores them in `featureMarkup` attribute of the suite so we can render them in index.tmpl - * - * @param suite - */ - - var getFeaturesTemplate = function (suite) { - return _.template(readFileForRespectiveTemplates('features.html'))({ - suite: suite, - _: _, - calculateDuration: calculateDuration, - columnLayoutWidth: getColumnLayoutWidth(), - decideScenarioTitlePadding: preventOverlappingTheScenarioTitle, - guid: guid + const basedir = hierarchyReporter.getBaseDir(suite); + + featureOutput.forEach(function (feature) { + feature.hierarchy = hierarchyReporter.getFeatureHierarchy(feature.uri, basedir); + feature.scenarios = {}; + feature.scenarios.passed = 0; + feature.scenarios.failed = 0; + feature.scenarios.notdefined = 0; + feature.scenarios.skipped = 0; + feature.scenarios.pending = 0; + feature.scenarios.ambiguous = 0; + feature.scenarios.rerun = 0; + feature.scenarios.count = 0; + feature.time = 0; + featuresSummary.isFailed = false; + featuresSummary.isAmbiguous = false; + + if (!feature.elements) { + return; + } + + if (feature.elements) { + feature.elements.map((scenario) => { + const { before, after } = scenario; + + if (before) { + scenario.steps = parseScenarioHooks(before).concat(scenario.steps); + } + if (after) { + scenario.steps = scenario.steps.concat(parseScenarioHooks(after)); + } }); - }; - - var setupSubSuiteTemplates = function (suite) { - suite.featureMarkup = '
No features
'; - if (suite.features && suite.features.length) { - suite.featureMarkup = getFeaturesTemplate(suite); - } - for (var i = 0; i < suite.suites.length; i++) { - var subSuite = suite.suites[i]; - setupSubSuiteTemplates(subSuite); - } - }; - - var parseScenarioHooks = function(data) { - return data.map(step => { - const match = step.match && step.match.location ? step.match : {location: 'can not be determined'}; - - if(step.embeddings == undefined){ - return {} - } - - return { - arguments: step.arguments || [], - result: step.result, - match, - embeddings: step.embeddings || [] - } - }) - }; - - var setStats = function (suite) { - var featureOutput = suite.features; - var topLevelFeatures = []; - var featuresSummary = suite.features.summary; - var screenshotsDirectory; - suite.reportAs = 'Features'; - if(options.screenshotsDirectory) { - screenshotsDirectory = options.screenshotsDirectory; - } else { - screenshotsDirectory = options.output ? path.join(options.output, '..', 'screenshots') : 'screenshots'; + } + + feature.elements.forEach(function (element) { + element.passed = 0; + element.failed = 0; + element.notdefined = 0; + element.skipped = 0; + element.pending = 0; + element.ambiguous = 0; + element.time = 0; + element.timestamp = ''; + element.notes = ''; + + if (element.type === 'background') { + return; } - var basedir = hierarchyReporter.getBaseDir(suite); - - featureOutput.forEach(function (feature) { - feature.hierarchy = hierarchyReporter.getFeatureHierarchy(feature.uri, basedir); - feature.scenarios = {}; - feature.scenarios.passed = 0; - feature.scenarios.failed = 0; - feature.scenarios.notdefined = 0; - feature.scenarios.skipped = 0; - feature.scenarios.pending = 0; - feature.scenarios.ambiguous = 0; - feature.scenarios.count = 0; - feature.time = 0; - featuresSummary.isFailed = false; - featuresSummary.isAmbiguous = false; - - if (!feature.elements) { - return; - } - - if (feature.elements) { - feature.elements.map(scenario => { - const {before, after} = scenario; - - if (before) { - scenario.steps = parseScenarioHooks(before).concat(scenario.steps); - } - if (after) { - scenario.steps = scenario.steps.concat(parseScenarioHooks(after)); - } - }) - } - - feature.elements.forEach(function (element) { - element.passed = 0; - element.failed = 0; - element.notdefined = 0; - element.skipped = 0; - element.pending = 0; - element.ambiguous = 0; - element.time = 0; - element.timestamp = ''; - element.notes = ''; - - if (element.type === 'background') { - return; - } - - element.steps.forEach(function (step, count) { - if (step.embeddings !== undefined) { - step.embeddings.forEach(function (embedding) { - - var embeddingType = {}; - - if (embedding.mime_type) { - embeddingType = embedding.mime_type; - } else if (embedding.media) { - embeddingType = embedding.media.type; - } - if (['text/plain', 'text/html', 'application/json'].includes(embeddingType)) { - var decoded; - - if (isBase64(embedding.data)) { - decoded = Buffer.from(embedding.data, 'base64').toString('utf8'); - } else { - decoded = embedding.data; - } - - if (!step.text) { - step.text = decoded; - } else { - step.text = step.text.concat(`
${decoded}`); - } - } else if (embeddingType === 'image/png') { - step.image = 'data:image/png;base64,' + embedding.data; - - if (options.storeScreenshots && options.storeScreenshots === true) { - - var name = sanitize(step.name || step.keyword, /[^a-zA-Z0-9-]+/g); // Only allow URL-friendly file names - if (!fs.existsSync(screenshotsDirectory)) { - fs.mkdirSync(screenshotsDirectory); - } - name = name + '_' + Math.round(Math.random() * 10000) + '.png'; //randomize the file name - var filename = path.join(screenshotsDirectory, name); - fs.writeFileSync(filename, embedding.data, 'base64'); - if (options.noInlineScreenshots) step.image = path.relative(path.join(options.output, '..'), filename); - } - } else if (embeddingType === 'image/gif') { - step.image = 'data:image/gif;base64,' + embedding.data; - - if (options.storeScreenshots && options.storeScreenshots === true) { - - var name = sanitize(step.name || step.keyword, /[^a-zA-Z0-9-]+/g); // Only allow URL-friendly file names - if (!fs.existsSync(screenshotsDirectory)) { - fs.mkdirSync(screenshotsDirectory); - } - name = name + '_' + Math.round(Math.random() * 10000) + '.gif'; //randomize the file name - var filename = path.join(screenshotsDirectory, name); - fs.writeFileSync(filename, embedding.data, 'base64'); - if (options.noInlineScreenshots) step.image = path.relative(path.join(options.output, '..'), filename); - } - } else { - var file = 'data:application/octet-stream;base64,' + embedding.data; - var fileType = embedding.mime_type.split('/')[1]; - step.text = step.text || ''; - step.text = step.text.concat('download file'); - } - }); - } - - if (!step.result || (step.hidden && !step.text && !step.image)) { - return 0; - } - - if (step.result.duration) element.time += step.result.duration; - - if (step.output) { - if (options.scenarioTimestamp && count == 0) { - element.timestamp = step.output[0]; - } - step.output.forEach(function(o) { - element.notes += o + '
'; - }); - } - - switch (step.result.status) { - case result.status.passed: - return element.passed++; - case result.status.failed: - return element.failed++; - case result.status.undefined: - return element.notdefined++; - case result.status.pending: - return element.pending++; - case result.status.ambiguous: - return element.ambiguous++; - default: - break; - } - - element.skipped++; - }); - - if (element.time > 0) { - feature.time += element.time; - } - - feature.scenarios.count++; - - if (element.failed > 0) { - feature.scenarios.failed++; - featuresSummary.isFailed = true; - return suite.scenarios.failed++; - } - - if (element.ambiguous > 0) { - feature.scenarios.ambiguous++; - featuresSummary.isAmbiguous = true; - return suite.scenarios.ambiguous++; + element.steps.forEach(function (step, count) { + if (step.embeddings !== undefined) { + step.embeddings.forEach(function (embedding) { + let embeddingType = {}; + + if (embedding.mime_type) { + embeddingType = embedding.mime_type; + } else if (embedding.media) { + embeddingType = embedding.media.type; + } + if (['text/plain', 'text/html', 'application/json'].includes(embeddingType)) { + let decoded; + + if (isBase64(embedding.data)) { + decoded = Buffer.from(embedding.data, 'base64').toString('utf8'); + } else { + decoded = embedding.data; } - if (element.notdefined > 0) { - feature.scenarios.notdefined++; - return suite.scenarios.notdefined++; + if (!step.text) { + step.text = decoded; + } else { + step.text = step.text.concat(`
${decoded}`); } - - if (element.pending > 0) { - feature.scenarios.pending++; - return suite.scenarios.pending++; + } else if (embeddingType === 'image/png') { + step.image = 'data:image/png;base64,' + embedding.data; + + if (options.storeScreenshots && options.storeScreenshots === true) { + let name = sanitize(step.name || step.keyword, /[^a-zA-Z0-9-]+/g); // Only allow URL-friendly file names + if (!fs.existsSync(screenshotsDirectory)) { + fs.mkdirSync(screenshotsDirectory); + } + name = name + '_' + Math.round(Math.random() * 10000) + '.png'; //randomize the file name + const filename = path.join(screenshotsDirectory, name); + fs.writeFileSync(filename, embedding.data, 'base64'); + if (options.noInlineScreenshots) + step.image = path.relative(path.join(options.output, '..'), filename); } - - if (element.skipped > 0) { - feature.scenarios.skipped++; - return suite.scenarios.skipped++; + } else if (embeddingType === 'image/gif') { + step.image = 'data:image/gif;base64,' + embedding.data; + + if (options.storeScreenshots && options.storeScreenshots === true) { + let name = sanitize(step.name || step.keyword, /[^a-zA-Z0-9-]+/g); // Only allow URL-friendly file names + if (!fs.existsSync(screenshotsDirectory)) { + fs.mkdirSync(screenshotsDirectory); + } + name = name + '_' + Math.round(Math.random() * 10000) + '.gif'; //randomize the file name + const filename = path.join(screenshotsDirectory, name); + fs.writeFileSync(filename, embedding.data, 'base64'); + if (options.noInlineScreenshots) + step.image = path.relative(path.join(options.output, '..'), filename); } - - if (element.passed > 0) { - feature.scenarios.passed++; - return suite.scenarios.passed++; - } - + } else { + const file = 'data:application/octet-stream;base64,' + embedding.data; + const fileType = embedding.mime_type.split('/')[1]; + step.text = step.text || ''; + step.text = step.text.concat( + 'download file' + ); + } }); + } - var subSuite = undefined; - if (options.theme === 'hierarchy') { - subSuite = hierarchyReporter.findOrCreateSubSuite(suite, feature.hierarchy); - } - if (subSuite) { - subSuite.features.push(feature); - } else { - topLevelFeatures.push(feature); - } + if (!step.result || (step.hidden && !step.text && !step.image)) { + return 0; + } - if (featuresSummary.isFailed) { - featuresSummary.failed++; - subSuite ? hierarchyReporter.recursivelyIncrementStat(subSuite, 'failed') : suite.failed++; - } else if (featuresSummary.isAmbiguous) { - featuresSummary.ambiguous++; - subSuite ? hierarchyReporter.recursivelyIncrementStat(subSuite, 'ambiguous') : suite.ambiguous++; - } else if (feature.scenarios.count === feature.scenarios.skipped) { - featuresSummary.skipped++; - subSuite ? hierarchyReporter.recursivelyIncrementStat(subSuite, 'skipped') : suite.skipped++; - } else if (feature.scenarios.count === feature.scenarios.notdefined) { - featuresSummary.notdefined++; - subSuite ? hierarchyReporter.recursivelyIncrementStat(subSuite, 'passed') : suite.passed++; - } else if (feature.scenarios.count === feature.scenarios.pending) { - featuresSummary.pending++; - subSuite ? hierarchyReporter.recursivelyIncrementStat(subSuite, 'passed') : suite.passed++; - } else { - featuresSummary.passed++; - subSuite ? hierarchyReporter.recursivelyIncrementStat(subSuite, 'passed') : suite.passed++; - } - - if (options.reportSuiteAsScenarios) { - suite.failed = suite.scenarios.failed; - suite.passed = suite.scenarios.passed; - suite.ambiguous = suite.scenarios.ambiguous; - suite.skipped = suite.scenarios.skipped; - suite.reportAs = 'scenarios'; - } + if (step.result.duration) element.time += step.result.duration; - if (feature.time) { - suite.totalTime += feature.time + if (step.output) { + if (options.scenarioTimestamp && count === 0) { + element.timestamp = step.output[0]; } + step.output.forEach(function (o) { + element.notes += o + '
'; + }); + } + + switch (step.result.status) { + case result.status.passed: + return element.passed++; + case result.status.failed: + return element.failed++; + case result.status.undefined: + return element.notdefined++; + case result.status.pending: + return element.pending++; + case result.status.ambiguous: + return element.ambiguous++; + default: + break; + } + + element.skipped++; + }); - suite.features = topLevelFeatures; - suite.features.summary = featuresSummary; - - return suite; + if (element.time > 0) { + feature.time += element.time; + } - }); + feature.scenarios.count++; - suite.totalTime = calculateDuration(suite.totalTime); + if (element.failed > 0) { + feature.scenarios.failed++; + featuresSummary.isFailed = true; + return suite.scenarios.failed++; + } - if (options.theme === 'hierarchy') { - setupSubSuiteTemplates(suite); + if (element.ambiguous > 0) { + feature.scenarios.ambiguous++; + featuresSummary.isAmbiguous = true; + return suite.scenarios.ambiguous++; } - if (options.metadata) suite.metadata = options.metadata; + if (element.notdefined > 0) { + feature.scenarios.notdefined++; + return suite.scenarios.notdefined++; + } - return suite; - }; + if (element.pending > 0) { + feature.scenarios.pending++; + return suite.scenarios.pending++; + } - function readFile(fileName) { - function getPath(name) { - //use custom template based on user's requirement - if (options.templateDir && fs.existsSync(path.join(options.templateDir, name))) { - return path.join(options.templateDir, name); - } else { - return path.join(__dirname, '..', 'templates', options.theme, name); - } + if (element.skipped > 0) { + feature.scenarios.skipped++; + return suite.scenarios.skipped++; } - return fs.readFileSync(getPath(fileName), 'utf-8'); + if (element.passed > 0) { + feature.scenarios.passed++; + return suite.scenarios.passed++; + } + }); + if (stageRerunCount > 0) { + feature.scenarios.rerun = stageRerunCount; + suite.scenarios.rerun = stageRerunCount; + } + + let subSuite = undefined; + if (options.theme === 'hierarchy') { + subSuite = hierarchyReporter.findOrCreateSubSuite(suite, feature.hierarchy); + } + if (subSuite) { + subSuite.features.push(feature); + } else { + topLevelFeatures.push(feature); + } + + if (featuresSummary.isFailed) { + featuresSummary.failed++; + subSuite ? hierarchyReporter.recursivelyIncrementStat(subSuite, 'failed') : suite.failed++; + } else if (featuresSummary.isAmbiguous) { + featuresSummary.ambiguous++; + subSuite ? hierarchyReporter.recursivelyIncrementStat(subSuite, 'ambiguous') : suite.ambiguous++; + } else if (feature.scenarios.count === feature.scenarios.skipped) { + featuresSummary.skipped++; + subSuite ? hierarchyReporter.recursivelyIncrementStat(subSuite, 'skipped') : suite.skipped++; + } else if (feature.scenarios.count === feature.scenarios.notdefined) { + featuresSummary.notdefined++; + subSuite ? hierarchyReporter.recursivelyIncrementStat(subSuite, 'passed') : suite.passed++; + } else if (feature.scenarios.count === feature.scenarios.pending) { + featuresSummary.pending++; + subSuite ? hierarchyReporter.recursivelyIncrementStat(subSuite, 'passed') : suite.passed++; + } else { + featuresSummary.passed++; + subSuite ? hierarchyReporter.recursivelyIncrementStat(subSuite, 'passed') : suite.passed++; + } + + if (options.reportSuiteAsScenarios) { + suite.failed = suite.scenarios.failed; + suite.passed = suite.scenarios.passed; + suite.ambiguous = suite.scenarios.ambiguous; + suite.skipped = suite.scenarios.skipped; + suite.rerun = suite.scenarios.rerun; + suite.reportAs = 'scenarios'; + } + + if (feature.time) { + suite.totalTime += feature.time; + } + + suite.features = topLevelFeatures; + suite.features.summary = featuresSummary; + + return suite; + }); + + suite.totalTime = calculateDuration(suite.totalTime); + + if (options.theme === 'hierarchy') { + setupSubSuiteTemplates(suite); } - suite = setStats(suite); - - fs.writeFileSync( - options.output, - _.template(readFile('index.html'))({ - suite: suite, - features: getFeaturesTemplate(suite), - styles: readFileForRespectiveTemplates('style.css'), - script: readFileForRespectiveTemplates('script.js'), - screenshot: readFile('../_common/screenshot.js'), - piechart: ((options.theme === 'bootstrap') || (options.theme === 'hierarchy')) ? readFileForRespectiveTemplates('piechart.js') : undefined, - guid: guid - }) - ); - - console.log('\n' + - chalk.green.bold(emoji.emojify(':rocket:') + ' Cucumber HTML report ' + chalk.blue.bold(options.output) + ' generated successfully ') + - emoji.emojify(':thumbsup:') - ); + if (options.metadata) suite.metadata = options.metadata; -}; + return suite; + }; -function generate(options, callback) { - - function isValidJsonFile() { - options.jsonFile = options.jsonFile || options.output + '.json'; + function readFile(fileName) { + function getPath(name) { + //use custom template based on user's requirement + if (options.templateDir && fs.existsSync(path.join(options.templateDir, name))) { + return path.join(options.templateDir, name); + } else { + return path.join(__dirname, '..', 'templates', options.theme, name); + } + } - function isAFile(filePath) { - try { - return fs.statSync(filePath).isFile(); - } catch (err) { - return false; - } - } + return fs.readFileSync(getPath(fileName), 'utf-8'); + } + + suite = setStats(suite); + + fs.writeFileSync( + options.output, + _.template(readFile('index.html'))({ + suite: suite, + features: getFeaturesTemplate(suite), + styles: readFileForRespectiveTemplates('style.css'), + script: readFileForRespectiveTemplates('script.js'), + screenshot: readFile('../_common/screenshot.js'), + piechart: + options.theme === 'bootstrap' || options.theme === 'hierarchy' + ? readFileForRespectiveTemplates('piechart.js') + : undefined, + guid: guid, + }) + ); + + console.log( + '\n' + + chalk.green.bold( + emoji.emojify(':rocket:') + + ' Cucumber HTML report ' + + chalk.blue.bold(options.output) + + ' generated successfully ' + ) + + emoji.emojify(':thumbsup:') + ); +}; - if(!isAFile(options.jsonFile)) { - var jsonFilePath = options.jsonFile; - var dynamicReportJsonFileName = fs.readdirSync(jsonFilePath, 'utf-8'); - options.jsonFile = jsonFilePath + "/" + dynamicReportJsonFileName[0]; - } +function generate(options, callback) { + function isValidJsonFile() { + // options.jsonFile = options.jsonFile || options.output + '.json'; + options.jsonFile = options.jsonFile || options.output + '.json' || options.output + '.ndjson'; + + function isAFile(filePath) { + try { + return fs.statSync(filePath).isFile(); + } catch (err) { + return false; + } + } - try { - JSON.parse(JSON.stringify(jsonFile.readFileSync(options.jsonFile))); - return true; - } catch (e) { - console.log('\n' + - chalk.bold.red(emoji.emojify(':warning: ') + emoji.emojify(':disappointed: ') + 'Unable to parse cucumberjs output into json: \'%s\'', options.jsonFile, e) - ); - if (callback) { - callback('Unable to parse cucumberjs output into json: \'' + options.jsonFile + '\'. Error: ' + e); - } else { - return false; - } - } + if (!isAFile(options.jsonFile)) { + const jsonFilePath = options.jsonFile; + const dynamicReportJsonFileName = fs.readdirSync(jsonFilePath, 'utf-8'); + options.jsonFile = jsonFilePath + '/' + dynamicReportJsonFileName[0]; } - async function launchReport() { - if (fs.existsSync(options.output) && (options.launchReport || options.launchReport === 'true')) { - await open(options.output, {wait: false}); - } + try { + JSON.parse(JSON.stringify(jsonFile.readFileSync(options.jsonFile))); + return true; + } catch (e) { + console.log( + '\n' + + '\n' + + chalk.bold.red( + emoji.emojify(':warning: ') + + emoji.emojify(':disappointed: ') + + "Unable to parse cucumberjs output into json: '%s'", + options.jsonFile, + e + ) + ); + if (callback) { + callback('Unable to parse cucumberjs output into json: \'' + options.jsonFile + '\'. Error: ' + e); + } else { + return false; + } } + } - if (options.jsonDir) { - jsonDir.collectJSONS(options) + async function launchReport() { + if (fs.existsSync(options.output) && (options.launchReport || options.launchReport === 'true')) { + await open(options.output, { wait: false }); } + } - if (isValidJsonFile()) { - generateReport(options); - launchReport(); - return callback ? callback() : true; + if (options.jsonDir) { + jsonDir.collectJSONS(options); + } + + if (isValidJsonFile()) { + generateReport(options); + launchReport(); + return callback ? callback() : true; + } +} + +// Specific to LambdaTest +function getStageReRunCount() { + let retryCount = undefined; + const metaFile = process.env.META_FILE; + try { + const jobReports = jsonFile.readFileSync(metaFile); + retryCount = 0; + if ( + !!jobReports && + !!jobReports['JobSummary'] && + !!jobReports['JobSummary']['Tasks'] && + jobReports['JobSummary']['Tasks'] instanceof Array + ) { + jobReports['JobSummary']['Tasks'].forEach((task) => { + if (!!task && !!task['stages'] && !!task['stages']['retried'] && !isNaN(task['stages']['retried'])) { + // + makes sure that a numeric constiable is getting read as a number + retryCount += +task['stages']['retried']; + } + }); } + } catch (err) { + retryCount = undefined; + } + return retryCount; } module.exports = { - generate: generate + generate: generate, }; diff --git a/lib/searchFileUp.js b/lib/searchFileUp.js index 03fdc74..d5fc90e 100644 --- a/lib/searchFileUp.js +++ b/lib/searchFileUp.js @@ -1,27 +1,27 @@ -'use strict'; +// 'use strict'; -var fs = require('fs-extra'); -var path = require('path'); +const fs = require('fs-extra'); +const path = require('path'); function searchFileUp(fileName) { - var pathParts = process.cwd().split(path.sep); + const pathParts = process.cwd().split(path.sep); - var filePath = pathParts.concat([fileName]).join(path.sep); + let filePath = pathParts.concat([fileName]).join(path.sep); - while (!exists(filePath) && pathParts.length) { - pathParts.pop(); - filePath = pathParts.concat([fileName]).join(path.sep); - } + while (!exists(filePath) && pathParts.length) { + pathParts.pop(); + filePath = pathParts.concat([fileName]).join(path.sep); + } - return filePath; + return filePath; } function exists(filePath) { - try { - return fs.statSync(filePath).isFile(); - } catch (err) { - return false; - } + try { + return fs.statSync(filePath).isFile(); + } catch (err) { + return false; + } } -module.exports = searchFileUp; \ No newline at end of file +module.exports = searchFileUp; diff --git a/package.json b/package.json index 72c3159..1e96399 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cucumber-html-reporter", - "version": "5.2.0", + "version": "6.0.0", "description": "Generates Cucumber HTML reports in three different themes", "main": "index.js", "typings": "./index.d.ts", @@ -141,14 +141,7 @@ "name": "Fabienmrqs ", "url": "https://github.com/Fabienmrqs" } - - ], - "scripts": { - "pretest": "node node_modules/cucumber/bin/cucumber-js test/features/ -r test/features/step_definitions -f json:test/report/cucumber_report.json --no-strict || true", - "clean": "rm -rf screenshots", - "test": "node test/createHtmlReports.js" - }, "repository": { "type": "git", "url": "git+https://github.com/gkushang/cucumber-html-reporter.git" @@ -164,21 +157,26 @@ "html report", "json to html" ], + "scripts": { + "pretest": "node --trace-deprecation node_modules/@cucumber/cucumber/bin/cucumber-js test/features/ -r test/features/step_definitions -f json:test/report/cucumber_report.json --publish-quiet --no-strict || true", + "clean": "rm -rf screenshots", + "test": "node --trace-deprecation test/createHtmlReports.js" + }, "license": "MIT", "homepage": "https://github.com/gkushang/cucumber-html-reporter#readme", "dependencies": { - "chalk": "^2.4.2", + "chalk": "4.1.2", "find": "^0.3.0", - "fs-extra": "^8.1.0", - "js-base64": "^2.3.2", - "jsonfile": "^5.0.0", + "fs-extra": "^11.1.0", + "js-base64": "^3.7.3", + "jsonfile": "^6.1.0", "lodash": "^4.17.11", "node-emoji": "^1.10.0", - "open": "^6.4.0", - "uuid": "^3.3.3" + "open": "^8.4.0", + "uuid": "^9.0.0" }, "devDependencies": { - "chai": "^4.2.0", - "cucumber": "^5.1.0" + "@cucumber/cucumber": "^8.9.1", + "chai": "^4.2.0" } } diff --git a/samples/html_reports/cucumber_report_bootstrap.html b/samples/html_reports/cucumber_report_bootstrap.html index 23185db..087e035 100644 --- a/samples/html_reports/cucumber_report_bootstrap.html +++ b/samples/html_reports/cucumber_report_bootstrap.html @@ -1934,7 +1934,7 @@

- + @@ -2647,7 +2647,7 @@

$(this).siblings('a.screenshot').find('img').show(); } }); - var $generated = $('.generated-on'); + let $generated = $('.generated-on'); $generated.text('Generated ' + moment($generated.text()).fromNow()); @@ -2655,7 +2655,7 @@

}); function drawChart(chartData) { - var data = google.visualization.arrayToDataTable([ + let data = google.visualization.arrayToDataTable([ ['Task', 'Cucumber Results'], ['Passed', chartData.passed], ['Failed', chartData.failed], @@ -2663,8 +2663,8 @@

['Skipped', chartData.skipped] ]); - var total = chartData.passed + chartData.failed + (chartData.notdefined || 0) + (chartData.skipped || 0); - var title; + let total = chartData.passed + chartData.failed + (chartData.notdefined || 0) + (chartData.skipped || 0); + let title; if (total === 1) { title = total + ' ' + chartData.title.slice(0, -1) @@ -2672,7 +2672,7 @@

title = total + ' ' + chartData.title; } - var options = { + let options = { width: '100%', height: 240, title: title, @@ -2691,7 +2691,7 @@

} }; - var chart = new google.visualization.PieChart(document.getElementById('piechart_' + chartData.title.toLowerCase())); + let chart = new google.visualization.PieChart(document.getElementById('piechart_' + chartData.title.toLowerCase())); chart.draw(data, options); } diff --git a/samples/html_reports/cucumber_report_hierarchy.html b/samples/html_reports/cucumber_report_hierarchy.html index f40a9f5..e572bf7 100644 --- a/samples/html_reports/cucumber_report_hierarchy.html +++ b/samples/html_reports/cucumber_report_hierarchy.html @@ -6263,7 +6263,7 @@

$(this).next('a.screenshot').find('img').show(); } }); - var $generated = $('.generated-on'); + let $generated = $('.generated-on'); $generated.text('Generated ' + moment($generated.text()).fromNow()); @@ -6271,7 +6271,7 @@

}); function drawChart(chartData) { - var data = google.visualization.arrayToDataTable([ + let data = google.visualization.arrayToDataTable([ ['Task', 'Cucumber Results'], ['Passed', chartData.passed], ['Failed', chartData.failed], @@ -6281,8 +6281,8 @@

['Skipped', chartData.skipped] ]); - var total = chartData.passed + chartData.failed + (chartData.pending || 0) + (chartData.notdefined || 0) + (chartData.ambiguous || 0) + (chartData.skipped || 0); - var title; + let total = chartData.passed + chartData.failed + (chartData.pending || 0) + (chartData.notdefined || 0) + (chartData.ambiguous || 0) + (chartData.skipped || 0); + let title; if (total === 1) { title = total + ' ' + chartData.title.slice(0, -1) @@ -6290,12 +6290,13 @@

title = total + ' ' + chartData.title; } - var options = { + let options = { width: '100%', height: 240, title: title, is3D: true, - colors: ['#5cb85c', '#d9534f', '#999', '#5bc0de', '#428bca', '#f0ad4e'], + colors: ['#5cb85c', '#d9534f', '#999', '#5bc0de', '#428bca', '#f0ad4e', '#ff9933'], + // colors: ['#5cb85c', '#d9534f', '#428bca', '#f0ad4e', '#999', '#5bc0de'], fontSize: '13', fontName: '"Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif', slices: { @@ -6304,7 +6305,8 @@

3: {offset: 0.4}, 4: {offset: 0.4}, 5: {offset: 0.4}, - 6: {offset: 0.4} + 6: {offset: 0.4}, + 7: {offset: 0.4} }, titleTextStyle: { fontSize: '13', @@ -6312,7 +6314,7 @@

} }; - var chart = new google.visualization.PieChart(document.getElementById('piechart_' + chartData.title.toLowerCase())); + let chart = new google.visualization.PieChart(document.getElementById('piechart_' + chartData.title.toLowerCase())); chart.draw(data, options); } diff --git a/templates/_common/bootstrap.hierarchy/features.html b/templates/_common/bootstrap.hierarchy/features.html index a774aca..a100c42 100644 --- a/templates/_common/bootstrap.hierarchy/features.html +++ b/templates/_common/bootstrap.hierarchy/features.html @@ -64,7 +64,9 @@

<%= element.keyword %>:<%= element.name %>
- + + <% if (element.retried) { %>Re-runs : <%= element.retried %><% } %> <% if (element.passed) { %><%= element.passed %><% } %> <% if (element.notdefined) { %> span:first-child { + min-width: 100%; +} diff --git a/templates/_common/foundation/script.js b/templates/_common/foundation/script.js index 59e3c90..0bc2139 100644 --- a/templates/_common/foundation/script.js +++ b/templates/_common/foundation/script.js @@ -1,30 +1,27 @@ -window.onload = function() { - - // Accordion hide/show - var accordionTitles = document.getElementsByClassName('accordion-title'); - - // Convert node list to array - Array.prototype.slice.call(accordionTitles).forEach(function(title) { - - title.onclick = function() { - - var content = nextElement(title); - var style = window.getComputedStyle(content); - var display = style.getPropertyValue('display'); - - if (display === 'block') { - content.style.display = 'none'; - } else { - content.style.display = 'block'; - } - - return false; - } - }); - - // Update build time to since - var buildTimeElem = document.getElementById("buildTime"); - buildTimeElem.innerHTML = 'Built ' + moment(buildTimeElem.innerHTML).fromNow(); +window.onload = function () { + // Accordion hide/show + let accordionTitles = document.getElementsByClassName('accordion-title'); + + // Convert node list to array + Array.prototype.slice.call(accordionTitles).forEach(function (title) { + title.onclick = function () { + let content = nextElement(title); + let style = window.getComputedStyle(content); + let display = style.getPropertyValue('display'); + + if (display === 'block') { + content.style.display = 'none'; + } else { + content.style.display = 'block'; + } + + return false; + }; + }); + + // Update build time to since + let buildTimeElem = document.getElementById('buildTime'); + buildTimeElem.innerHTML = 'Built ' + moment(buildTimeElem.innerHTML).fromNow(); }; /* @@ -32,9 +29,9 @@ window.onload = function() { taken from Pro JavaScript techniques */ function nextElement(elem) { - do { - elem = elem.nextSibling; - } while (elem && elem.nodeType !== 1); + do { + elem = elem.nextSibling; + } while (elem && elem.nodeType !== 1); - return elem; + return elem; } diff --git a/templates/_common/screenshot.js b/templates/_common/screenshot.js index b968dd6..ad062a1 100644 --- a/templates/_common/screenshot.js +++ b/templates/_common/screenshot.js @@ -1,19 +1,19 @@ -$('a.toggle').on('click', function(e) { - e.preventDefault(); +$('a.toggle').on('click', function (e) { + e.preventDefault(); - if (!$(this).hasClass('collapse')) { - if ($(this).text() === 'Screenshot -') { - // $(this).text('Screenshot +'); - $(this).next('a.screenshot').find('img').hide(); - } else if($(this).text() === 'Screenshot +') { - // $(this).text('Screenshot -'); - $(this).next('a.screenshot').find('img').show(); - } + if (!$(this).hasClass('collapse')) { + if ($(this).text() === 'Screenshot -') { + // $(this).text('Screenshot +'); + $(this).next('a.screenshot').find('img').hide(); + } else if ($(this).text() === 'Screenshot +') { + // $(this).text('Screenshot -'); + $(this).next('a.screenshot').find('img').show(); } + } - if ($(this).text().includes(' -')) { - $(this).text($(this).text().replace(' -', ' +')); - } else { - $(this).text($(this).text().replace(' +', ' -')); - } + if ($(this).text().includes(' -')) { + $(this).text($(this).text().replace(' -', ' +')); + } else { + $(this).text($(this).text().replace(' +', ' -')); + } }); diff --git a/templates/bootstrap/index.html b/templates/bootstrap/index.html index b13c192..63b686f 100644 --- a/templates/bootstrap/index.html +++ b/templates/bootstrap/index.html @@ -2,9 +2,58 @@ Cucumber Feature Report + @@ -17,8 +66,9 @@ <%= brandTitle %>
<%= suite.name.plain %>
- >Passed: <%= suite.passed %> - >Failed: <%= suite.failed %> +
+ <%= suite.time %> +
@@ -26,8 +76,103 @@
-
<%= suite.time %>
- +
+
+
+

All Scenarios

+
+
+
+ <%= suite.scenarios.getTotal() %> +
+
+
+
+
+

Passed Scenarios

+
+
+
+ <%= suite.scenarios.passed %> +
+
+
+
+
+

Failed Scenarios

+
+
+
+ <%= suite.scenarios.failed %> +
+
+
+ <% if (suite.scenarios.rerun) { %> +
+
+

Re-run Scenarios

+
+
+
+ <%= suite.scenarios.rerun %> +
+
+
+ <% } + %> + <% if (suite.scenarios.skipped) { %> +
+
+

Skipped Scenarios

+
+
+
+ <%= suite.scenarios.skipped %> +
+
+
+ <% } + %> + <% if (suite.scenarios.pending) { %> +
+
+

Pending Scenarios

+
+
+
+ <%= suite.scenarios.pending %> +
+
+
+ <% } + %> + <% if (suite.scenarios.notdefined) { %> +
+
+

Undefined Scenarios

+
+
+
+ <%= suite.scenarios.notdefined %> +
+
+
+ <% } + %> + <% if (suite.scenarios.ambiguous) { %> +
+
+

Ambiguous Scenarios

+
+
+
+ <%= suite.scenarios.ambiguous %> +
+
+
+ <% } + %> +
@@ -35,7 +180,7 @@ <% if (suite.metadata) { %>
-
+ -
+
<% var isLeft = true %> @@ -68,17 +213,6 @@

- @@ -100,6 +234,7 @@

"title" : "Scenarios", "failed" : <%= suite.scenarios.failed %>, "passed" : <%= suite.scenarios.passed %>, + "rerun" : <%= suite.scenarios.rerun %>, "notdefined" : <%= suite.scenarios.notdefined %>, "pending" : <%= suite.scenarios.pending %>, "skipped" : <%= suite.scenarios.skipped %>, diff --git a/templates/simple/script.js b/templates/simple/script.js index b10968c..905b42f 100644 --- a/templates/simple/script.js +++ b/templates/simple/script.js @@ -1,15 +1,15 @@ -function toggleScreenshot(e){ - if(this.innerText === "Screenshot -"){ - this.innerText = "Screenshot +"; - this.nextElementSibling.style.display = "none"; - } else { - this.innerText = "Screenshot -"; - this.nextElementSibling.style.display = "block"; - } +function toggleScreenshot(e) { + if (this.innerText === 'Screenshot -') { + this.innerText = 'Screenshot +'; + this.nextElementSibling.style.display = 'none'; + } else { + this.innerText = 'Screenshot -'; + this.nextElementSibling.style.display = 'block'; + } } -var toggleEls = document.querySelectorAll("a.toggle"); +let toggleEls = document.querySelectorAll('a.toggle'); -for(var i = 0; i < toggleEls.length; i++){ - toggleEls[i].addEventListener("click", toggleScreenshot); +for (let i = 0; i < toggleEls.length; i++) { + toggleEls[i].addEventListener('click', toggleScreenshot); } diff --git a/test/assert/assertHtmlReports.js b/test/assert/assertHtmlReports.js index 49a33eb..a6465fd 100644 --- a/test/assert/assertHtmlReports.js +++ b/test/assert/assertHtmlReports.js @@ -1,32 +1,43 @@ 'use strict'; -var chai = require('chai'); -var fs = require('fs-extra'); -var path = require('path'); +const chai = require('chai'); +const fs = require('fs-extra'); +const path = require('path'); -var should = chai.should(); +const should = chai.should(); module.exports = function assertHtmlReports(outputDirectory) { - - function isReportExists(report) { - try { - return fs.statSync(report).isFile(); - } catch (e) { - return false; - } + function isReportExists(report) { + try { + return fs.statSync(report).isFile(); + } catch (e) { + return false; } + } - function isDirectoryExists(dir) { - return fs.existsSync(dir); - } + function isDirectoryExists(dir) { + return fs.existsSync(dir); + } - var hierarchyHtmlFile = path.join(outputDirectory, 'cucumber_report_hierarchy.html'); - var bootstrapHtmlFile = path.join(outputDirectory, 'cucumber_report_bootstrap.html'); - var foundationHtmlFile = path.join(outputDirectory, 'cucumber_report_foundation.html'); - var simpleHtmlFile = path.join(outputDirectory, 'cucumber_report_simple.html'); + const hierarchyHtmlFile = path.join(outputDirectory, 'cucumber_report_hierarchy.html'); + const bootstrapHtmlFile = path.join(outputDirectory, 'cucumber_report_bootstrap.html'); + const foundationHtmlFile = path.join(outputDirectory, 'cucumber_report_foundation.html'); + const simpleHtmlFile = path.join(outputDirectory, 'cucumber_report_simple.html'); - isReportExists(hierarchyHtmlFile).should.be.equal(true, 'hierarchyHtmlFile file \'' + hierarchyHtmlFile + '\' does not exist'); - isReportExists(bootstrapHtmlFile).should.be.equal(true, 'bootstrapHtmlFile file \'' + bootstrapHtmlFile + '\' does not exist'); - isReportExists(foundationHtmlFile).should.be.equal(true, 'foundationHtmlFile file \'' + foundationHtmlFile + '\' does not exist'); - isReportExists(simpleHtmlFile).should.be.equal(true, 'simpleHtmlFile file \'' + simpleHtmlFile + '\' does not exist'); - isDirectoryExists(path.join(outputDirectory, '..', '..','screenshots')).should.be.equal(true, 'screenshots directory does not exists, at "parentDirectory/screenshots"'); + isReportExists(hierarchyHtmlFile).should.be.equal( + true, + 'hierarchyHtmlFile file ' + hierarchyHtmlFile + ' does not exist' + ); + isReportExists(bootstrapHtmlFile).should.be.equal( + true, + 'bootstrapHtmlFile file' + bootstrapHtmlFile + ' does not exist' + ); + isReportExists(foundationHtmlFile).should.be.equal( + true, + 'foundationHtmlFile file' + foundationHtmlFile + ' does not exist' + ); + isReportExists(simpleHtmlFile).should.be.equal(true, 'simpleHtmlFile file ' + simpleHtmlFile + ' does not exist'); + isDirectoryExists(path.join(outputDirectory, '..', '..', 'screenshots')).should.be.equal( + true, + 'screenshots directory does not exists, at "parentDirectory/screenshots"' + ); }; diff --git a/test/createHtmlReports.js b/test/createHtmlReports.js index ae51853..a1c59d7 100644 --- a/test/createHtmlReports.js +++ b/test/createHtmlReports.js @@ -1,92 +1,92 @@ -var path = require('path'); -var fs = require('fs-extra'); -var find = require('find'); -var reporter = require('../index'); -var assertHtmlReports = require('./assert/assertHtmlReports'); - -var theme = { - hierarchy: 'hierarchy', - bootstrap: 'bootstrap', - foundation: 'foundation', - simple: 'simple' +const path = require('path'); +const fs = require('fs-extra'); +const find = require('find'); +const reporter = require('../index.js'); +const assertHtmlReports = require('./assert/assertHtmlReports'); + +let theme = { + hierarchy: 'hierarchy', + bootstrap: 'bootstrap', + foundation: 'foundation', + simple: 'simple', }; -var outputDirectory = 'test/report'; -var jsonFile = 'test/report/cucumber_report.json'; -var jsonDir = 'test/report/multi'; +let outputDirectory = 'test/report'; +let jsonFile = 'test/report/cucumber_report.json'; +let jsonDir = 'test/report/multi'; function removeReports() { - var files = find.fileSync(/\.html/, outputDirectory); - files.map(function (file) { - fs.unlinkSync(file); - }); + let files = find.fileSync(/\.html/, outputDirectory); + files.map(function (file) { + fs.unlinkSync(file); + }); } function getOptions(theme) { - return { - name: '@cucumber-html-reporter/*&!@#$%)(~<>`', //this tests for the sanitized hyperlinks on report, otherwise this should be plain text english - theme: theme, - output: path.join(outputDirectory, 'cucumber_report_' + theme + '.html'), - reportSuiteAsScenarios: true, - launchReport: true, - storeScreenshots: true, - screenshotsDirectory: 'screenshots/', - metadata: { - 'App Version': '0.3.2', - 'Test Environment': 'STAGING', - 'Browser': 'Chrome 54.0.2840.98', - 'Platform': 'Windows 10', - 'Parallel': 'Scenarios', - 'Executed': 'Remote' - } - }; + return { + name: '@cucumber-html-reporter/*&!@#$%)(~<>`', //this tests for the sanitized hyperlinks on report, otherwise this should be plain text english + theme: theme, + output: path.join(outputDirectory, 'cucumber_report_' + theme + '.html'), + reportSuiteAsScenarios: true, + // TODO: change launchReport back to 'true' before final merge + launchReport: false, + storeScreenshots: true, + screenshotsDirectory: 'screenshots/', + metadata: { + 'App Version': '0.3.2', + 'Test Environment': 'STAGING', + Browser: 'Chrome 54.0.2840.98', + Platform: 'Windows 10', + Parallel: 'Scenarios', + Executed: 'Remote', + }, + }; } function getJsonFileOptions(theme) { - var options = getOptions(theme); - options.jsonFile = jsonFile; - return options; + let options = getOptions(theme); + options.jsonFile = jsonFile; + return options; } function getJsonDirOptions(theme) { - var options = getOptions(theme); - options.jsonDir = jsonDir; - return options; + let options = getOptions(theme); + options.jsonDir = jsonDir; + return options; } function assertJsonFile() { + //Generate Hierarchy theme report + reporter.generate(getJsonFileOptions(theme.hierarchy)); - //Generate Hierarchy theme report - reporter.generate(getJsonFileOptions(theme.hierarchy)); + //Generate Bootstrap theme report + reporter.generate(getJsonFileOptions(theme.bootstrap)); - //Generate Bootstrap theme report - reporter.generate(getJsonFileOptions(theme.bootstrap)); + //Generate Foundation theme report + reporter.generate(getJsonFileOptions(theme.foundation)); - //Generate Foundation theme report - reporter.generate(getJsonFileOptions(theme.foundation)); + //Generate Simple theme report + reporter.generate(getJsonFileOptions(theme.simple)); - //Generate Simple theme report - reporter.generate(getJsonFileOptions(theme.simple)); - - //assert reports - assertHtmlReports(outputDirectory); + //assert reports + assertHtmlReports(outputDirectory); } function assertJsonDir() { - //Generate Hierarchy theme report - reporter.generate(getJsonDirOptions(theme.hierarchy)); + //Generate Hierarchy theme report + reporter.generate(getJsonDirOptions(theme.hierarchy)); - // Generate Bootstrap theme report - reporter.generate(getJsonDirOptions(theme.bootstrap)); + // Generate Bootstrap theme report + reporter.generate(getJsonDirOptions(theme.bootstrap)); - //Generate Foundation theme report - reporter.generate(getJsonDirOptions(theme.foundation)); + //Generate Foundation theme report + reporter.generate(getJsonDirOptions(theme.foundation)); - //Generate Simple theme report - reporter.generate(getJsonDirOptions(theme.simple)); + //Generate Simple theme report + reporter.generate(getJsonDirOptions(theme.simple)); - //assert reports - assertHtmlReports(outputDirectory); + //assert reports + assertHtmlReports(outputDirectory); } assertJsonDir(); @@ -94,4 +94,3 @@ assertJsonDir(); removeReports(); assertJsonFile(); - diff --git a/test/features/happy/overjoyed/happy.feature b/test/features/happy/overjoyed/happy.feature index 5bfe0d8..436da50 100644 --- a/test/features/happy/overjoyed/happy.feature +++ b/test/features/happy/overjoyed/happy.feature @@ -11,7 +11,7 @@ Feature: Happy HTML reporting @testPassing Scenario: Fred wants to see passing scenarios in the HTML report - Given Fred runs a passing cucumber step with 2 seconds timeout +# Given Fred runs a passing cucumber step with 2 seconds timeout When he provides cucumber JSON file to reporter Then cucumber-html-reporter should create HTML report diff --git a/test/features/step_definitions/hooks.js b/test/features/step_definitions/hooks.js index adac665..c3d01b7 100644 --- a/test/features/step_definitions/hooks.js +++ b/test/features/step_definitions/hooks.js @@ -1,28 +1,27 @@ -'use strict'; +const { Before, After } = require('@cucumber/cucumber'); -const Before = require('cucumber').Before; -const After = require('cucumber').After; +// const chalk = require('chalk'); -const chalk = require('chalk'); +// Before(function (scenario, callback) { +// console.log( '\n' + chalk.blue.bgYellow.bold('TESTING: ') + chalk.white.bgBlue.bold(' console.log() should not break the report')); +// this.scenario = scenario; +// callback(); +// }); -Before(function (scenario, callback) { - console.log( '\n' + chalk.blue.bgYellow.bold('TESTING: ') + chalk.white.bgBlue.bold(' console.log() should not break the report')); - this.scenario = scenario; - callback(); -}); - -Before({tags: '@testPassing'}, function (scenario, callback) { - this.attach('Tests INFO will print here.' + - '
To attach INFO to Any steps, use scenario.attach function in your step definitions as shown below.' + - '

If you pass HTML\'s to scenario.attach then reporter will format accordingly
' + - '
Simple String : scenario.attach(\'sample data\')' + - '
Pretty JSON : scenario.attach(JSON.stringify(json, null, 2))' + - '
HTML Link : scenario.attach(\'format the link with html-a tag\''); +Before({ tags: '@testPassing' }, function (scenario, callback) { + this.attach( + 'Tests INFO will print here.' + + '
To attach INFO to Any steps, use scenario.attach function in your step definitions as shown below.' + + '

If you pass HTML\'s to scenario.attach then reporter will format accordingly
' + + '
Simple String : scenario.attach(\'sample data\')' + + '
Pretty JSON : scenario.attach(JSON.stringify(json, null, 2))' + + '
HTML Link : scenario.attach(\'format the link with html-a tag\'' + ); - this.attach('some text'); - callback(); + this.attach('some text'); + callback(); }); -After({tags: '@testPassing'}, function (scenario, callback) { - callback(); +After({ tags: '@testPassing' }, function (scenario, callback) { + callback(); }); diff --git a/test/features/step_definitions/stepDefs.js b/test/features/step_definitions/stepDefs.js index 74e8788..01e563b 100644 --- a/test/features/step_definitions/stepDefs.js +++ b/test/features/step_definitions/stepDefs.js @@ -1,87 +1,83 @@ -'use strict'; - -const Given = require('cucumber').Given; -const Then = require('cucumber').Then; -const When = require('cucumber').When; +const { Given, When, Then } = require('@cucumber/cucumber'); Then(/^this feature runs with background$/, function (callback) { - callback(); + callback(); }); Then(/^Fred runs a(?: passing|) cucumber scenario$/, function (callback) { - callback(); + callback(); }); Then(/^Fred runs a passing
 cucumber step with 2 seconds timeout/, function (callback) {
-    setTimeout(callback, 2000);
+  setTimeout(callback, 2000);
 });
 
 Then(/^Fred runs a passing cucumber scenario with the below content$/, function (docString, callback) {
-    callback();
+  callback();
 });
 
 Given(/^Fred runs a passing cucumber scenario on behalf of "([^"]*)"/, function (name, callback) {
-    setTimeout(callback, 1000);
-    callback(null, 'pending');
+  setTimeout(callback, 1000);
+  // callback(null, 'pending');
 });
 
 Then(/^he provides cucumber JSON file to reporter$/, function (callback) {
-    callback();
+  callback();
 });
 
 Then(/^Fred runs a failing cucumber scenario$/, function (callback) {
-    callback();
+  callback();
 });
 
 Then(/^a failing scenario captures a screenshot$/, function (callback) {
-    var imageData = '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7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7P0/LNizqWeuQHIAAAAASUVORK5CYII=';
-    this.attach(new Buffer(imageData, 'base64'), 'image/png');
-    callback();
+  let imageData =
+    'iVBORw0KGgoAAAANSUhEUgAABDgAAAI/CAYAAACSxWkNAAAgAElEQVR4nOzda3Bb+Xnn+XkzNZtUbe3WzJutrdqtGtTW7r6YNwvNJOaUJzvum0Pf4tzAJJ4kZmqdbIZOJpNRzAQMlUwiti00Y8ttWW2zDaBpW+FYMSMvT7fdAmTZiiXBdNy020B3H5Fst0BLAAg10GodUCAFEM++OOd/cAAc3HkBqO+nCtUWCQIHB5TM8+Nz+ScCAAAAAAAw5P7JYR8AAAAAAABAvwg4AAAAAADA0CPgAAAAAAAAQ4+AAwAAAAAADD0CDgAAAAAAMPQIOAAAAAAAwNAj4AAAAAAAAEOPgAMAAAAAAAw9Ag4AAAAAADD0CDgAAAAAAMDQI+AAAAAAAABDj4ADAAAAAAAMPQIOAAAAAAAw9Ag4AAAAAADA0CPgAAAAAAAAQ4+AAwAAAAAADD0CDgAAAAAAMPQIOAAAAAAAwNAj4AAAAAAAAEOPgAMAAAAAAAw9Ag4AAAAAADD0CDgAAAAAAMDQI+AAAAAAAABDj4ADAAAAAAAMPQIOAAAAAAAw9Ag4AAAAAADA0CPgAAAAAAAAQ4+AAwAAAAAADD0CDgAAAAAAMPQIOAAAAAAAwNAj4AAAAAAAAEOPgAMAAAAAAAw9Ag4AAAAAADD0CDgAAAAAAMDQI+AAAAAAAABDj4ADAAAAAAAMPQIOAAAAAAAw9Ag4AAAAAADA0CPgAAAAAAAAQ4+AAwAAAAAADD0CDgAAAAAAMPQIOAAAAAAAwNAj4AAAAAAAAEOPgAMAAAAAAAw9Ag4AAAAAADD0CDgAAAAAAMDQI+AAAAAAAABDj4ADAAAAAAAMPQIOAAAAAAAw9Ag4AAAAAADA0CPgAAAAAAAAQ4+AAwAAAAAADD0CDgAAAAAAMPQIOAAAAAAAwNAj4AAAAAAAAEOPgAMAAAAAAAw9Ag4AAAAAADD0CDgAAAAAAMDQI+AAAAAAAABDj4ADAAAAAAAMPQIOAAAAAAAw9Ag4AAAAAADA0CPgAAAAAAAAQ4+AAwAAAAAADD0CDgAAAAAAMPQIOAAAAAAAwNAj4AAAAAAAAEOPgAMAAAAAAAw9Ag4AAAAAADD0CDgAAAAAAMDQI+AAAAAAAABDj4ADAAAAAAAMPQIOAAAAAAAw9Ag4AAAAAADA0CPgAAAAAAAAQ4+AAwAAAAAADD0CDgAAAAAAMPQIOAAAAAAAwNAj4AAAAAAAAEOPgAMAAAAAAAw9Ag4AAAAAADD0CDgAAAAAAMDQI+AAAAAAAABDj4ADAAAAAAAMPQIOAAAAAAAw9Ag4AAAAAADA0CPgAAAAAAAAQ4+AAwAAAAAADD0CDgAAAAAAMPQIOAAAAAAAwNAj4AAAAAAAAEOPgAMAAAAAAAw9Ag4AAAAAADD0CDgAAACAAbdplA77EABg4BFwAAAAAAMokdqWRKoo/qW0jIWT4tcykkgV7RsAoBYBBwAAADBgEqltGQtvyFg4Kb5QUvxa2vrzhngDa+ILJQk5AKAOAQcAAAAwYMbCSRkLb0hENyTraE9JpIoS0Q3xaxkZC29IMJaTOEEHAIgIAQcAAAAwUKK6IWPhDYnqhZb3C8Zy4g2siV/LHNCRAcBgI+AAAAAABoiqzsi2GSyaNcriDaxJMJY7oCMDgMFGwAEAAAAMkFAsL97AagcBR8luYwEAEHAAAAAAAyWRKpqDRZfSEtUNCcZy4tfS4tcy4tcyEorlJaoXxK+lxRdKtm1lAYCHBQEHAAAAMGBUdcaxwJodbvhCSTkWWJNj1haVsfAGm1QAwIGAAwAAABhQ8dtFu1UlohviDayJN7BGWwoAuCDgAAAAAIZAMJaTsfCGjIU3xL+UPuzDAYCBQ8ABAAAADAH/UlrGwhvmfA5WwwJAAwIOAAAAYAgEYznxhc3ZGwQcANCIgAMAAAAYAvHbRcfgUQIOAKhHwAEAAAAMgahuyFh4Q7yBVQIOAHBBwAEAAAAMgYgVcNCiAgDuCDgAAACAIRDVC+INrMmYNYcDAFCLgAMAAAAYAsHrORkLJ8XLDA4AcEXAAQAAABywrFGSrFGSRGpb/FpaQrG8TGkZCcZykjVKrl8T1Q3xaxnxBtYkGMsd8BEDwOAj4AAAAAAOQNYoWSFFWvxa2p6nEYzlJJHalqhesD6eFL+Wlqhu1Hx9VC/IWHhDfCFaVADADQEHAAAAsE/M0CJjhxJj4aRdqZFIbUvWKDf9mmrYkaluUDm1SosKADRBwAEAAADskUSqKIlU0a62MDeemC0oZqDh3n7S7LH8S2nxBsxQQ92OWf/1a+muHg8AjjoCDgAAAKAPZqBhSCiWl7HwhkxpGRkLb0hUN2SzjwAiniraK2HVBpXqbdUOUAAAJgIOAAAAoEvmPI2CPU/Dv5QWv5aRiG7sWVXFWDgpoVje/rOqCgnF8uLX0nY1x1h4Q+KpYl9hCgAcBQQcAAAAQBeyRskeEppIFSUYy0lUNySiG123obSiqkDqn1tRszq8gTXxnlq1j4e2FQAPKwIOAAAAoEsRa2WrYq58LdrVFcFYTvxauq+KjkSqKL5QUnyhpGzec3+MRKoo3lOr4guZm1dU0OHczkLgAeBhQcABAAAAdGnTquJwY4Yd2xK3qjtUG0solpesUeoqcIjfNh/DF0o2VGdkjZKEYnnxnlqViFXpkUhtSzCWsze2qLBjytrEEozlJJ4q9vfiAWBAEXAAD7mdksh6pizXVksS+VFJvv7DHfnWKyV5OVmWfKFy2IcHAMBASqS2mwYc9TaNksQd1R3+pbQdOHQadtgbWayvHQtv2MNGvYE1STQJLdRxmgNQk+ILJ+2qkL2cFwIAg4CAA3gIpfIV+eJ3tuU/hrfksScNeWSm0PTme7ogTz2/Ld//cUl2KwQeAACImJUVU1qmr/YTv5axb1HdkPjt1pUVqi1myvoatSo2GMt19dzqcXyhpL3GltkdAI4CAg7gIfLq7bL4v3JfHplpHWo0u/3WM1sSjT8Qcg4AwMMuqhtWwFHu63GyRskMHKwtLH4tLVG90FF1Rb+BhNoEMxZO2mEJAAwzAg7gIfD2/Yo8+bWivOvkvZ6CjfrbHzx3X27ldg/7ZR0pj//978i//m+/XHN7Nff6YR8WAKAJc5NK7xUczR4zeD1nBx1j4Y0938zS7HmjumHP7QheN7fCsHYWwLAh4ACOuB9tlOVXP91/qFF/e99TBfn2q/zgs1cIOABguCRS/bWotJM1ylYbS9qcnRFK2oFKIrW9L88pYrav+MKqdSXTdfsLABwmAg7gCLv8Skke/0TrdpRHnyzI//P5ovzV32/L0xd35GxkRwLatvznLxXlfU+1DjkefbIgKzcJOfYCAQcADJd4m4BDtbCEYvm+nkc9vjmkNGdvRKluZemvRabZc0b1gj2jQ7WvMKMDwKAj4ACOqG+98kAe+3jzcGL881ty4fs78laLTSmlckW+9+OS/OVXi/Lok42P8ckXtpnHsUcIOABguKgAw41a0+oLJSWqF/b0eROpbXMV7HVz/axZ2ZHuaiNLM/FU0a5MUVtbvIE1u5ojkSpKnGGkAAYYAQdwBL1yqyxPNKnc+ODfbMnXf1iS3S5HaKymyvL/fmGLcGOfEHAAwHCJWDMr6i/2s0ZZvKdWXT+319Tmk+D1nB1ImFUd3T1v3NEKM2a1p4yFk/awU5FqJUkwltvXFhkA6AcBB3DEGMWK/NrT7lUbH/nClqTf6j2VeFCuyCdfKBJu7AMCDgAYLlHdaNg6kkgV7baOg65y2DRKEorlHZtYjJbtK1mjZLW95O0tKmPhpL2ytpng9ZzEU63X2QLAYSHgAI6YT76w7Rpu/N4XtsQo7k0qQbix9wg4AGC4JFLFhiBjSsuI99Rq33M3+mWufjXbSkKxvMRvVwMJtZY2eD0nvpBaD5uRqF7oKJRRrSoAMIgIOIAj5I3srjzyZGNryq9+ektyBmtdBxkBBwAMl8hrhvhCyZqPqTaPQZhRkUgV7SoTs3UlZ1dtqHYWv5buut3EHKy694NNAWAvEHAAR8jM14qu1RvL6/wgMugIOABguGSNkviXajeLJFLbrtUbm0ZJEqnioa1cda6bDcXyErTCjl4EYzl7LgcADBoCDuCIuLtVcV0J+2cL9w/70NABAg4AGD71AYcbNYzUG1iTY4G1lvMtehXVjbZtIwlr3ka//Fr60IIaAGiHgAM4Ip5fKblWb7y8MaDVG5WKlG/9RIrRb0jhy0ExvnBGCl/6ghQjz0v5Jzf36klkt3BDdlNfkvKPZ6S8OiW7Pz4pu6kviWzd2JNneFCuyMvJsnx1+YEEv70joW9vyws/eCC3890NKukn4Ni997ZsX78ihYV5Mb7wWTHCn5f7L1yQ0hsEJADgRrVv9NNKkjVK4gsnZbPFY2SNkhwLrInXcfM3WS3bD1Wd0So8ieqFPZmdMRbeoIIDwMAi4ACOiL9cbGxP+dBntw77sBpUdnZk68JXJPc7Psk++m+a3t788K/I1oUFkQc73T/JblHKG09L6fq/ktKlf9r8du1fyW7yjMhu9+vu7hUr8vlvbssHPum+seaRmYL8py/el1d+YgZM039XlN+Z26q5OfUScDzQX5W7f/Exyb57pOl5zP3OmNyPvsBkWAAPvUSqKBHdEP9S2rE1ZKPnqgY1ZLSVYCwn3sCqXb3hDazuW/WDmrXRLOSI6saeVHAQcAAYZAQcwBHxa5/ZarjA/tQ3BmvK+YP4D+TN//DBlsFGwwX6b35Qdl5e6fg5Km99R0rX/vfWwUZD0PF/yG7+Ox0/x7UbD+QXP9U82HDeHnuyIIvfeyAf/lzj++PUVcBReiD3PjMrm4/+TMfn8a2PfVQqb9/t+DUCwFESjOXswZoqBMgaJSuAWOtp7WnWKMlYeKNlBUfU0Z7iDayJL5zctwGdWaMkfi0t3sCaa6VGRDf2pHpkSstI8DotKgAGEwEHcARsPxB518l7DRfQL6w8OOxDs92PPC+bT7yjq3BD3e488Q65/6LW9jnKt56T0qWf6i7cULfLPy27t+fbPseFf9yRR2YaZ520vJ005FGX7TZOnQYcle2ivPVffr+n8/jmb/+K7Obf7PxNA4AjIBjLiffUqkSatKQEYzk5Fljrul1FBQpRvdD0PirgULeDWK/q1zIN62tFRILXc3szg2MpLf6ldN+PAwD7gYADOALSb+26Xli/9Eb3vyX67c9tyaMz93q+feTZxh/0tr/zLdl87Gd7uii3b4/9jGx/53LT4y5v/r2ULv2z3sIN6/bg0j+T3c0LTZ/jW6+WXdfw9npz6ijgqFTk7omPtT5Pj7/DvDX5fH7iw1J5MDjBFwDsp6hesOZeNL8gj+rmutde2i46+br47WLTcGU/ZI2SeANrDa0wUb2wJxUcfi3d8nwCwGEi4ACOgJt3yq4X0K/e6j7g+M2z/V20f2C29sJ9dzMjdz7wLveL7Y/8utx/4WtSvv0TqRQMKd/+iRS/fkFyH/l19wqED7xLypnGH6oq95NS+ta/cA8ulv+17N5+Tnbvvy6V0ttS2Xpddm+FpLx8zP3+3/4XUrmfbHiOzbsVee9T7uHG74fuy6VEWTJ3d6WwXZE3smU5d21HfulTjW0p/QQc91+44B5c/Py/FePsJ6X043WRSkUqu7tSen1VjKcDsvlYYxuLEXqm6+8LABg2qoVkSss0DRcSqaLEU0V7Hke31NrVgxaK5e2ZG/HbjVUhfi0jU3Vhhvk1/QccvlCSLSoABhYBB3AE3Mq5V3C8nDz4gOOJj9cOz7x7csr1orwQekYq5SbHt7srheBZ16+7+9dTDXcv/+g3XMOK3R//V5HKrvtzVMqyu37C9evKP/pQw93/+kLjENdHZgry7OUd2W3yFHe3KvIHz93fk4CjUrwvd375icYZJWPvldJ6840w25cvugYi5Uyq6dcAwFEQ1QstQws1f0O1j9QHAp3whXur/OiHmrOhbm6v0RyAmqwJdtqdj86fP3MooQ4AdIKAAzgC7t13Dzguv9J9OWy/AcfjT1Z/0Cunb7u2phQ+/+mOjsV45lOurSrl9G37PpX7b7i2ppTX/rSj5yit/olrq0rl/hv2fTJ3d13nbgS09ttXCtsV+dBn3Ss5nNoFHPdf+FrjbJL3vFNKb6w3f/LKrux877rc+cXHGr723mdnOzo/ADCMVPVGs1kREd0Q76lV8S+lJWuUep6NMRbeaFnNkEgVa27xVFFCsbwEYzmJ6oY9oDSR2u64haU+4Og0bIjqBfGFkn23yvQaBgHAQSDgAI6ID/xN4wV08Nvdr1j93S8U5H1PdXZ7b6Dxwv0DT1UrOAp/+1xjxcGHfqHjGRCVBzty5zfe3/AYWwth+z7lH3+8sQrj+v8pUulwzsTutpSu/m+N1R9vnLLvcu7aTsPrfP/slty739nq1e/o7i1ETu0Cjrt/+oeNrSZfOOP+ku69LVtf+bK8+Zu/2Hxw6y88IpWd7tfjAsAwUAGH2wDQqG7Yczn6vdj3a5matg/1eKFYXqa0jPjCSfGFklaViPlfNQRU3cw/J8UbWJUp63NTWsbe9FIvFMvb4YZfy3S8lcWcwdH/a/aFkgwZBTCwCDiAI+K/fLmxFeIP5/d3WnvyzcYL999+5r79+bcmP9oYTnzli109h1tIcvdjH7U/X37p3Y3VG298sqvnKL0RaHyMlVH788fPNQY5gec7P7e7FZFf+XQfa2Iru5J97881nIfy7Z/Uvo4br8q9p/5KsqPvbDmINPdr75PCl4Oye7+2nQgABl3cqoRod1GvAg636gq/FTzsheD1nB1wqK0qoVjerA7R0taxlmTTqhJxbjfJGmWJ6oZEdUOCMXPDiTpmtdZWPU4wlqupMlHnoRvqnPSzySVrlGUsvEGLCoCBRcABHBFf+k5jlcGjTxYkc7ezKoNefPOVUsNzTn2l+oNT1veehovrVvMi3Dy48WrjsFHfe+zPl678Lw3hRMX4UVfPsfv2S41VIN/5X+3Pu4UT0UR3vwFzm+Hh1CrgKG9mGs/BBx8TEZHK9rYUX9Qk9x8/3DLUuPPYz8hbkx+V7avfaj77BAAGmLroHwsnxRc2qwiazb+IWFUaxwJrNRf0iVTRqqhwDziyRqmrCgfnPApnqJJIFV03jajwwu15g7GcBK9XPxdPFSV43Qo6rNcS1QsSea23mR9qu0q/4QQBB4BBRsABHBHJO+5zOJ651H2bSqc+sdR40f7Ff6g+X/bdIw0X2ruF7n4w2733dsNjbD7xDvvzD6L/XWPAUeryh7/S3cY5HN/8KRERqYi4zt9I/KS7kODZy9s9BxwPVvXGgONXf17ufe60bH7w0dbBxi88IsYzp6X0k/4HywHAQVPbQqK6YW4MsSoiskbJrniIWiGHOUtjW+K3i3b7RzCWqwks1PBNt2Gbzrkdnc/DyEjICiyyRkn8S2a1xaZRkrFw0n7+RGpbonpBprSMXZUR0Q07IFGvxaywaGwfNMMd87iPBdbEv5SW+O32lSxO6rW7te10wxdmiwqAwUXAARwhfzDf2KYyempLUvkmaz76sLVTkfe5rE39kWNzS+bxdzRccFfu32/xqI12C4bLoNGftT/vNmC0Uuqu9aJSuuc6aFSkecDR7Qre0JXGChun1gHHay1DDLfbWxMflvvfWGLOBoCh4wwx1MyIZutY/Vpa/Fpa4qliw2yLZq0Yfi1jVUMYdpgQsQKUY1alhFv1hZuxui0qfi1tBSRl8YWS9qwPc1ZH2v6YCjvU6lbnXA0VIET1gt3i4tcy9utRrS7drrZVFRz9bH2xQ6AOzw8AHDQCDuAIuXbDfZjlH80XpLy7t60q899prEj41U9v1TxP1mWtaWnjja6ep/TG641VCb/0hP35B9/+nxoDjkJ3bTCVwquNLSr/8D/bn//AbGPA8R29uxaVp57vo0UlfbujUOPOe94p9576KyndeLWrYwOAQWC3aVgbRswKh7RdeeAWWER0wxzkGU7alR6bbaovVHDiXLOqwo2o9ZzewFpHVRyqYsOcibFtV5o4KzLMsKZsP3ez7S5qwGjEmsnh1zL2x8zKi2owkTXKEnnNEF/IPfhxo4KRfqsv9mobCwDsBwIO4AipiHsVxyMzBflMZO9+k6+nduWJTzRe9Iev1LbD5P/z7zZchN9/frGr57r/tfON1Ql/9Lv258v/+O8bB4T+ZK6r5yhvPNP4GN9/l/35jz7XeE4/d6m78/nbn+t9i0pltyyb7/l3TYONN3/rl6Vw/pzsGve6OiYAGBSq5cR58e3XMvY8i2YBh5p1EdULXV9wqxBCVVfUV0h0UukQiuUdgUTaDkpCsbz9OOpxs0ZJorphzwBxVpA4j8f5OlT1yjFrY4oKcdR9prSMeAOrHW9HUY/RD7WFhoADwCAi4ACOmNc3y/LuTzReTD8yU5AzF7f7ruTQb5flFz/V+Njvn92St7ZqH7sQfKbhYjz/e/9BpNLhMVQqkvvIrzduYgk/Y99ld/3PG8OJ5Z8RM+7p5Dl2pRT7vxrXxL7+F/ZdPn+5sb1k7OkteVDu7DlevdX/mtj8n0w0Bhu/8m7Z+f53OzuflYrI7t63KgHAXojohjlXoi5kUFULvlDz2RFqc0m31HaTeonUdk9tGCqk8VozMszAImlXdPhC5srYY1blyDFHBYlqX1GvWQUf1fNgvnYVpPi1jPiX0nY1iApqWm1IURtQ+q3gUFtiCDgADCICDuAIWvxe4wW5uv3xl3vbrFKpiHzjhw/kPQH3x1383oOGrym9vuZacbB14b919JyF8+dcv7704/XqcRk/amwvufRPpbzx2Y6eY3fjadevrxhx+z6rafeA4ty19gNcy7uVplU1Tu0CjvsvfM31XGyvfK+j17m19FXJf3Rcyhs3O7o/AByUrFGSKS1TE2CoVg91Ee1WUaFaQyK6YQ/6dHvsRKpYU/XQSjCWs0OHXtapqjabKS1jzwRxtsKo9puoXpCIFWSodhTV0uILJ+2QJHg91xDe+LW0eE+tijewZocV8VTRbtVp9jrVLI9+A47g9Zx4A6s1LTMAMCgIOIAj6lNfb5yRoW7vCWzJ56Lbsvl2+6CjUhFZeaMsf/TFxlWp6vanC1tNiwjyH2usPLjzxDvkfvTrLZ/3/ouabD7+sw1fe/djH224b/mldzeGFN/8aSmn/7blc5Rvf1FKl36q8WtXRhvu+0dfagwpHn+yIJdbrIst7VbklNY4e6OXgKNSLMqdX3l3YxXHLz0u5dfXWr7O4sXnZfMJc+DrndF3ytb5L7EqFsBAqQ84VFvK5j3z31jVWqHaPJwzLvxLZkWDiMimFWiothHnitUp6z7NqCGc/jb364ZZ1VENPKLWcbUKIdR9VEWHszJDzQ9RW1hUdYfa4HLMEXo0e329BDdOqkqlmw0uAHBQCDiAI2p3132Nq/P26JMF+cMv3pfgt3bkUvyBfP/1kvzgZkmur5bk7/9xR2Zf2Jaxp5t//SMzBfn90JZsbTcPSh78eM11XWz20X8jd/9yUh688iO7daKyuysP4j+Ut//iY+5DNN89IqUfN17MV+79SB5886ddKzFKP/o1qdyNiVSs9oxKWSp3Y1L6oc/1/g+++dMijuoNRU+V5bEn3c/BqaVtWc/s2iFPqSwSWyvL7wWbh0LdBhwiIve/sdRkuOi/k8Jzn5NS6nb1zuWyPIj/UO6ecD+Xd//sP3XybQQAB2LKuvhXVJuICj0SqaL4l9J2JUTEqsiIWqtWVfjhs+ZVqHYQvxWceE+t2vM86ttSVGjgHAq6H9TQVOfcD3XcidS263GpkEZtilHbZRRnG4yzCqTZa3CGQb1qtdUGAA4bAQdwhFVEJHxlR9zWnO7F7Y++WBSj2L4K5P6Fr7TeADL6Tnlz7L2SHX1ny/tt/f1Xmj5HOenealINLv57Kf3Dv5TS5f+h5f12N840fY4vX33Q8ny8J2CI7zNbrgNY9yLgkEpF7v71n7U+l7/wLrnje49kf/7fNr/P4z8rxev/0PZ9A4CDouZK1H/M2ZqiqjacFQhqK4maZ+ENrEnwutm64hw8GrJbT8wBn1OOMMBrBSIH1XJRrcLI1AQrKshwDh4VqV0LO6VlaoKQiDXw81jADP/j1n2bhRhqNW0/onrBDlUAYNAQcAAPgeX1kow93bqaoJvbozMFefriTsdDNkVECuHPdbTqtNmtEHqm7XOU16dbhhftbmXHYFE3lYrIp15o3vrT7c2po4BDRCo7O/LWn/5hz+fxzhPvkGLkhY7fNwDYT1HdkOD1nIxZcyecF/dqZoSaXeG2ScV7alWOWcFFKJa3KiLcWyeiesGuiFBhgmp36bdtox1nRYWqTqlWXpizNoKxnF19MhZONrSyBGM58Z6qbkwxt5ms2u0sKrhQoUe87jVtGiU5VneOezVmreUFgEFDwAE8JO7viISu7Mh7n+rvovwjX7gvP3ijt/Ld+y8+L9n3/d9dXZC/+f5/L8WLz3f8HLupeSl96593F258+59L+dYXO3r8ioj87bUH8vjHOz9nZ6M78ptn9ybgEBGplEpS+NynJfvYz3R1LnO+98jOyj92fC4BYL9kjbL4l8zNIap1RF2oO2dxqM0kzkqL6iYRs/pBzdZQ8y7atZiolpD9lEgV7ddkhgFm5YQ6trg1+FRVcjhDF/W6VGWG2qyyaZSqFRpLaTsEEVFDWZP2c6v71L/u+lW8vVBVM1RwABhEBBzAQ6awXZHF7+3I7wfvd9y6MvqJLTnxd9vy3bVSxxtem9l9847c+/Qn5M77fq51sPHenxPj06ekfCfb9XNUtm9L6dWPSulbrdtRSt/+H6V84w+ksn27/YPWeT2zK/6vtD6Hvqe3JGoNIf2tZ+qrYGpLobsJOJQHq6/J3T//Y8m6DGOtqdr4hUelEH5GKlvuKxYB4CCpDSl+LdNQZRCM5cS/lG5YCasqPVQbirmJxHAM3yxbFRx7NyC0U6pyRIUHKtRwVpaowMNNIrVthz0+q4XGfJ2r9utV7TXOOR4Rl0ZrIkwAACAASURBVJklWaNknye3IGNKy7QdttpMIlWUUCxvt/fsd0gEAL0g4AAeYvlCRa68+kC++A8P5Knnt+Uvv7otJ/6uKCcvFOVMZEf+7rs78oObZdnZh3lrleJ92b72bSkEPytvz/y5vP3nfyxv/7VfjGc/I9tXvyWV+/f7f5KyIZXNr8numl/K8Q9J6YcflHL8N6S86pdK9msi5f4v+Dffrsj/9/0d+dQ3duQvvroj/3VxWz53aVuur5ak5GjhGftMbRDy/tmtvp9b2c29KcWLz4txZlbu/uWkeS6f/HMphD8n29+7LpUHjSt8AeCgxa2KBnNTSfNWEnNLx6qMhTfs8EC1czirIBRnRUF9MLLX1LYS5wwPe72rtfVEtdS0CjWaPbba/uLXMnYFh6pYGQsn7fWw3sBazSyNTescqGoQs/2m8Vz00lpSbe1J9rVCFwAOAgEHAOyzUrkij3+8NuD48DN7F3AAwKCL6gU7AGg1zFNt6PCeWhXvqVWZ0jISjOXs9ozaxzTsC29fKNnw+b206dheokIXtdo2qhfsaoq93MAS1QsNW2MiulETcvi1jP3caoZHyy0q1vnsRCJVtIKWVXv2RyK1vW9bZgBgLxBwAEAXSmWRbyZKciu32/HXvJwsNbSv/MVX+e0XgIeDqi5QQUUz8VTRsUY1LccCa64X09W5HElHNcj+XHSr5/I71tj20+bRjahesCsxnK9PbWGx21esFbgq7GkWIKlKl3bbYoKxnD33RL0fm/cINQAMBwIOAOjA5tu7Evr2jvzyp8xKjBNdBBQzXys2BBx/F9vZx6MFgMGhhl66zWzIGiW7SqO6rtVsrXC2e6j5FuZwzQ3xBsyKAtW+0e/gzGbHPWUFG86AIWIN9FQfS6S2ZcpRSbFXonpBvKdWXcMbv5YW76lVO3xRVR2tghc1iLRZyFTd7rJhV2xE9ULLUAoABg0BBwC0cfNOWR59snGY6PkOQorvrpcaBpE+NrMlqbc6rwABgGG2aZQatqNsWmtOVTuKW2WBalfxhar3OeYYuOnX0tZ61JwkUtuSSBX3rE0lkdoWv5Z2DS1UJYTzucxqi4xdSdGsoqSbShNVpdLsc95Tq44hqyWJ6oVq+LPUOGdDnU9nYKHW5lY3uSTtVhQAGEYEHADQgY/9bWMVxiMnDTkT2Zb7LjlHebciS9/flp8/1bhdxb+wBwNUAWCIhGJ5ORZYsyswnLd2LRNZOwypfo2q2nAGEGrF6l6YajGrImIdi9uw06huiH8pbc/GqB/GmUgVJWJtgGkXdqiqllAs3zAwVAUT9R93rtVVQ1lrP5ez1tNm7Pkefi1jb4FhvgaAYUfAAQAdSL1Vkfc95b4O9v2zBXnya0X58rUH8qWrOxLQijL2tPt9n/j4lry+6b45AACOsqhekCnrYlq1nXR6QZ11zPHIOgZ+Ovm1jBwLrPW94UO1vTQTv12UsXCy5fNEdMMOSaa0TMN9VcVFKJaXiG40rTxRlSFmBUvSrBC5bj6mqmppdQwq9Emkig3hUrUlaG9bawDgMBFwAECHvrtWksc/7h5cdHr76neZvQEA3cpabS7NqirUlhZn20av2q1BjeiG+ELNZ1k4bRolu9oiFMvbrTROquoiGMs1DBRV1GOYLSTVmRv+DoedqrW2UauqJGuUJWq9Dp/VlrLXM0QA4DAQcABAF767XpL3zXYfbDw6U5AvXSXcAIBeqTkRTnFrEKia8aE2ifR6sa4qJlpVlqh2mW7mfagQQ7WPRPWCa9ARsVbfNgs64qmi3Qqz2aSSpdnzN7uvs6VFVdcwWBTAsCLgAIAu3c7typ/87f2Ow43fPHtfvrdOWwoA9COqG9Z2j4wEr+fswCPkGOqpKj2m2oQUzZjDRVt/rRrWGXmt1xDFqGnVcasWUStzu23l6ZVaPVsNOjJ20MFcDgDDhIADAHr0yq2y/M3Xi/Khz27VVWtsya89fV9OXtiWb7/2QHYrh32kADD8EqmiHXCYgzcbh3ia99u2h2j2sj7Wv9R67Wx17W1/rTDqONWcjPqBoYqa1dHJYNK9YA8htWZ8OGefAMCgI+AAgD2w/UBk8+6ubL69K/cfkGgAwH5QVQbtqDkZvlBSxsIbEtENyRqNlXTqoj1+u2hXU/i1tOuaVefX+NoMGe1G1ihZFR0ZGQsnmwY3qsXFnOVR3PfAIZEqSvx20T6HnWy8AYDDRsABAACAoZBImRfczvWn9aK6Ybd1qCqJY9ZATrNaolo1oUIFtVEkkSrKprWxpdkcD7XRpdUx9Mrc4JKxW0TcjkHN8zCrPtzDkL1kr7+1qmLctsLEU0X73AHAYSLgAAAAwNAIxnLiCyUbhnxWL/wbL8DVPAs1+2IsvGFtD8nYIUHECkZExJzx0aSKQ83g2I+Aw+21qA0nWaPcULWhwhyzhcV9MOleUudeBUaJ1LZMWS1D+x20AEAnCDgAAAAwNMw2kozdLpFIbdvhhdsci6y1qtVJbVypv59au6rmbDQLMfxL6Z6HjHajWj2Rtis7/FqmYfinCmiCsVzTwaV7dSxmy4oZcvjCyQM7FwDQCQIOAAAADJVQLGcPETUrMLab3jeRKjaEGWrWRj1nW0jkNaPpMFFzVob7UND9kjXKjrAj7Ri2WnDcp7pqtt/BpM7HGgtvyLHAmlW5YVaUqPMSsdpXAGAQEHAAAABg6ER1w1ppmpbg9eZVC+oi3SmRKspUk4vyiBWYqCoOr3VRr1oxgla40moQ6UFIpIqONpZqZYeIGU5sGqWaDSz1LT2tHle18XitUMNrtaS4tcFE9YJrWAQAh4GAAwAAAENJXVyPhc2NKWrwpqpc2DRK4l9KN1yUO+dtuD2m+VgZmbKGfaoZHqpqYsya3zEIVKWFfyltH7Na7Zqwhn9GXqtWdZgbWMoNj6GqQ7ynVsXrCDXaVYCothgAGAQEHAAAABhatRf4aXsrit9xoa/up4IPtWZV3dQcD9WO4Tao1ElVjQyarFGWRGrbnjEyZQUeahCpCmmCsZzErXMQt2aaqFWwavZIpxtRVMXHfg84BYBOEHAAAADgSFDDN9WFvGphUVtTzAGZG+JfStuVDuo+fi0toVi+o1YOs4IjPRSbQ+Kpor1tJRjLSfB6zq7mqLbgZHqe2aFW9xJwABgEBBwAAAA4stSGkahekESqKPHbRXvwaFQvSEQ3Oq5WEDErQbyBVfFrmbZhiPN5BikAUPM71KDWVkNaVWDUbBWsmlUCAIOAgAMAAADoUNYoWZUfybYBR8QxCHVKy0gitd0w/+KwJFLbbeeIZI2yXQGj/uu2XtcXTrYMSQDgoBBwAAAAAB3aNEriDazZgUUrUb1gb2uJ6gXxL5khQdRaRXuY2s3OUC0szm0z1Rkl1a9Tgc8gvCYAIOAAAAAAOpQ1SnIssCZj4Y22MzhUa4dTIlUUn7WFJXg9JxHdOJSqjk2j1HSOiAot3FbpRvWCeE+t2oGGua63fTULABwEAg4AAACgQ1mrgkNtG2klqhtNV6hG9YKEYnnxaxnxhZLWjJDtA53VoYax1lPVG5EmVRnq81mjbAUcG7SoABgIBBwAAABAF1SriVq52qrNo1nAIWLOuMgaJYm8ZtgbXsz/Js2BqNYq1/3ib9JmowKMZsNX1WBRtX7Wr6X37RgBoBsEHAAAAEAXzLWyGbvqwq9lrLCgtk3D3KDS2WyKrFGSRKooUb1gz7qY0jIyZYUo+7GJRT22kwovWgUziVTR3sBSreCgRQXA4SPgAAAAALqgNoo4AwfVcjKlZezWFVXh0Iu4I+zwW0GHL5SUYCxnBwtZo9RX6KHmgDglUtviDay1bTlRFRxmIJIcqDW4AB5eBBwAAABAF6K6Id7AmutgzUSqaIUSafu2F7JGSSK6YbfHeE+t2i0tZptM94NKp7SMjIU3aj6mhojGbzevyIjohvi1tASv5+yBpM3mdQDAQSLgAAAAALqgKjhaVTnEU0XxO6o59oqqlEikihLRDTuk6KWCwi3g8Gtp8YWSLQMT8/Un7aGovlCSgAPAQCDgAAAAALoQGaDNIf1UiagNLs5wRM0U8YWTrl+jKjaiekFEROK3zRYVAg4Ag4CAAwAAAOiCGgLqlNjnjSduskZJ/FpaprRMT88diuXFG1ir2ZaSNUoSiuXFF0paMza2a6o51IBRNVS0GngQcAA4fAQcAAAAQBfGwhvWYE3zwj8Yy4k3sCrewJpMaZkDPRZzg0u6p4BDtaPU2zRK4j21Kt7AqhwLrFmvd0N84aR4A2s1XxOywh62qAAYBAQcAAAAQBf8S2nxBtbsP/vCSfGFk+LXMnLMUd1wEIKxnHhPrfYUcLT6WucWl1AsXw05Glpaig0fA4DDQsABAAAAdCEUy8mxwJp9UR+8nrMDAP/S3mxN6ZTfZVBop8zKk9aBjGpfUW059bM2orrRdF4HABw0Ag4AAACgC26zKzYPqYIhqhd6bhFRrTWdVF9kjZLr/VTw0cuaWgDYawQcAAAAQBdUwDEIW1RUwHAssGavpe007IjoRt+vI6ob1jwSWlQAHD4CDgBHQFm2tnaE3x0BAA6CX8s0VHAclkSqKH4tI1PWMY1Zg0BV2BHVCxLRDdcAIqoX+p4ZouZzEHAAGAQEHMARVEpqMuLxiMfjk2VHq2wxeVWOj3rE4zFvE7MXpdlSt/j8uHk/31zT+9TYuSGnJydlssUtcOGGyM4NCUxOyoUb9/p4hWW5tfyiXLu5JSIi61pAJidPyitbfTwkAAAdUrMrBu2iXrWR+LW0eE+tin8pLb5wUsbCG+INrEkolpdgLGcHGlG90HYGRztqBsgghD0AQMABHDkpmR1RIYZPVlQ6UYzLuKcabqjb6OxywyOU1her9xntNOC4KedOn5azZ8/K2bNnJXDSCjVOm38+e/q0nLtyU2TnhpzsM+DYWtdk0vEY6y+elcnJgNwg4AAAHAC1fWTQqcAjohvi1zLiCyVlLJyUY9Y6W7Pqo7cNLIrZokIFB4DBQMABHDErZ3yOAKMacKQuTlsfG5H55bhoM+p+ExKv+cVNSmZGPN0HHHVuvnhaJicDsl7fN6ICjvUd88/l7htLyjdflMnJSdHUY9x7WU5MnpCXCTgAAAegk+0jgyieKkowlhO/lhG/lhZfKGlXdvTKnAHCDA4Ag4GAAzhCivpCXYWGCjhKoh0fMT82sSglEZHsRauNxSNnVqoRxnJNQNJ7wGG2jbhUVVgtKs9ql+RcQLWvnJTzV9ar9ynfkWsXnpUTdnvLCTn93Itya0dk5+YVu+XlxIkT8uyldVnXAnLi3LLsWF975fzZ6teePC3a8s3mB9riuczjvSnPnQzIhSuX5DmrKmXyRN3xNj6orF+7ICcnHa/v2ro9I+TOy5qcPBmQs2dPm58PnJdXf9D4sXRZ5M6Na/Js4IT9mhuOLRCQ586fk4D1PFfsTwIA9ksolhfvqf4qHw5b1ijZw1LVzI5e+LV0z2tqAWCvEXAAR0ZSpq1Qwjc9Lb6agMOQOZ/1ubm4eXdHy8qZlbz1oXm7ymNkHwMONavjxNnzcuXKi3LWCg609S0R2ZErZ80/nz3/orz00rJcePakeYH/3EsiO2l58TkzBDj57Hm59sqdmod/6ZwZBjynXZGXXroiz6rHvulW3tHmuUREtm5Y4YE6Xk1OnzD//OJN9zDhhhYw73/6nFx7aVkunDWPKaDdqPn85OSknD4bkJNnr0jC5WNvvnLB+thpefHasly6cNb683Nyq2wemzqXJ0+flpMnTssr/Yw2AQB0JGptHxnmgEPEmsFxatWu6OilIoWAA8AgIeAAjoirs6N2IJEv6jKhAo6iiIgh8yrgOLNifkFxpTbgKK3bAcnEoi764kR3Q0brtKvgmHz2il3RUL51SSYnJ+X8y3mRnVty/vRJOau94viivJw7MSmTJy/IPXFpUbHdkwsnJ2Vy8qy8krc+t3NTtPOavHLHJYzo4LnU8Z549lrD8brOESmvm6HD2SuOrS5lufasGVSs74isa2ZAc+6lajjT+DEVvgRqQotb156TyclJefbaLcexXRHqNgDg4FTXxA5Hi0oiVWyyRcUMaqJ6L/9PbyLgADBICDiAI0K1lJxZTomRvGxXcFzUs1IstQ84rs6M2jM5dMOQi9PWn0dmRM/mpdvfUbULOE6/6Ggb2TFDgZMXblgfKMvNl6/JhfPn5OzpamXDZECTLWkcMuqkAgDVGvLs+RfllVutyhpaP5d9vJdqj7fZJpidW9UWmpOBk3Ly5Ek5GThpH88rW+7npvFjaXluclImHcGK8/yddGykqTk2AMC+i1jBwDAEHFG9IGPhpExZa2Odx5xIFcUbWO1rBoe5JjbJFhUAA4GAAzgi6rej1GxKmVuutqjYAYejRWX5xzI32vzrPZ6RmnWznWgVcJhDRrdqPhZQa2Qlb1VhTMrkiYA8+9x5uXTtijx7YlImT7YPOEREttI35NKFc3L6ZHV2xdkrt1zu2f65mh1vs00w6thOnD4nL774omiaJpqmyaVLl+TSpWW5U+404MjL+ROOVhn7uddrAo6GYwMA7DszGBj8FpWsUZKx8IaMhTfsqhPnrA2/lpZjgTWJ9FHBoR4fAAYBAQdwRHhGRmR0dNS6jdjhxMiIRybm4xKfG7c+dlz0kkj28qz151G5nH1LFiZGZWRk1H6MmoBj5LjEjZKsr1yVq1evykqy/W962gYcznDAUZWwowKCmgv7W/LspCPguKE1bVG59FxAzmo3qh/Kv2QO+zx9qaGNo5Pnana8TVfdqraRumDi5pXzcvZZTW7tdBpwbMmLAbPd5qajhOPey+etFpX0nqzcBQB0L2uUh2Y1qrnGNSl+LSNj4Q3xBtbsz6ltML0OGBURCVkrc4fhXAA4+gg4gKPIrs5QMzhEJFXdmlJzm9Bc20/ic766IaN5OWOtjx2ZXW57CL0GHJJ/ydxoEjgvr9xKy60by9XtJQHNnMGRvma2gJw9J9deueVo4diRS6fN+z734kty89ZNWdbMlpWTztBD6eC5ug44ZMeatzEpgXOXZP3WTVl+8Vlro4v5mJ0FHCJ3XjpnHcs5eXn9ptxYvmBtewnIy3n349i6eUlOTJ6QS65DVQHg4ZBIbe9r+0g8VRRfOCmb94bjot6/lHZsS0nbH4+8Zoj31KoEY7meHjdrlMUbWBuasAfA0UfAARxF9nyNcXFsgJXsyoKMOsKNkfE5STb5+U9fUENG562Ao2ivmvXNrbQ9BHNoZvMZHG4Bx+kX10VkR17WnnXM0ZiUk89p1nYT9Xh35IJaMXvCGgZqKedvyDnHWtXJyUkJPHdJ8mVx0cFztTje5pUTebly7nTN4544fV7W7znPzem6gKPxYyIiN6+dd6ywnZTJk8/KS2k1QLXxONq17wDAUafWn+7nBbfZ+pGsCVEG/QI/kSpKRDckkdq2P5Y1SvYWlV4f02fN9xiGeSQAjj4CDuBhUypKPpuVbL73ftuDUN7Zknz+nmztuCYTIiKys7MjzT69s3VP7t1r/fXdPFcvylv3JJ/Py72tPneclHfk3l48DgA8BEKxvER1QxKpogRjOQnGcuLXMhKM5RqGbPZq05ptEXc8ll/LiC+U7Lka4jD4NbOyo9cho4lUUcbCG+LX0jXnAgAOCwEHAAAAjoREqih+LSOJ1LZEdEMiuiHBWM6+CDdXmiYlFMv3NVhTxGz7CDnCjKxRkuD13FCFHGrwaD8tKuZ8j3Tf5xMA9gIBBwAAAI4Ev5aWqONCW7WrONsyIq8ZMqVlrPsWenqeTaNU8/VZoyTBWM7eWjLVx9DOgxS3tsH0erzq9e53wJE1SjXvVTCWq3mfAUAh4AAAAMDQi7xmNFQihGL5ptUJZmVHsqeWFVW54LzIjuiG+MJJ8Z5a7Tk4OWjV1bHp9nd2oWaRjIU3akKkfkWtyhv/Ulr8S2lrFW1Sxqzz67cCql5bawAcXQQcAAAAGGpR3RC/lq4Z9KnaVdzEU0UJxfLmBXSPF/fqwj543dmmUh74YaNOoVhejvVZwWGun03uSQWHqoRJpIoS1Q2J6gWJ3y7a81TGwhv2TBVfKGkHHxHdGKrzDmD/EHAAAABgqPm1TM0FtrrwdqukSFjhhv21VpVA98+ZluD1nDWDIiNZozR0m0QiuiHH+qjgUFtU1DDXfjWruDFDjbRsOkIMs23FsOaqbFibXLYJOoCHHAEHAAAAhlYolm9oVWh2wa3CjWzdhbIvnOyrxWJKy1jVBBtm+8SSOQtkGC62/VpvAY+IWQkzFt6QqF7Yk4BDBUVOEd0Q/1K6ZXiUtWaieANr9tDUiG7UBCIAHg4EHAAAABha/qXa1hRzHax7uOF2Ab1pzZHo9wJdhSfewJrVPpG05nQUBnqFqmr56IVzyGi/8zDcjkM9fruZJolUUaasVcB+O2xKis86/wAeHgQcAAAAGDpqXoPzwjqR2na9WI9bF8D1QUM8VbRXx46FN/bsuBKpbXtmhDewZld2DOLFdlQvyFg42XO1SSiW73tzTLZJyBTRzY03rSox1Hmu354T1Qv2MFK14QbA0UfAAQAAgKFT/xt/NXejftilCj3qWxxUW0Pwes5RKbC3q0erF9rpmg0gakvIIFx0x1NF8YWSPb32hNWiMhbe6KuCI6obMhbeaDgfwViuZohrvXiTqpzq4xbs49urAAvAYCPgAAAAwFDJGmXrwrZsfyx4Pec6LLPZ/Aa/lpYpx8Vx1ijta+CQNUr2rA7vqVW7siNubQw5rAGl8VRRjgXWJPJa9wGHc01sr20uItUgImuUJKIb9pwUX6j5Gl8VaLkFK1mjbK+ZNbexmJUgrJUFjj4CDgAAAAyV+m0bqh3BKWuUXLdyqNYWt4qBg5A1ShK/XayZF6HCDnUBfpDHpVpUeuGcwdHroFKRaqtQ8Hqu9rycWhVfKGm1mtRW56jQov5cqc0ufi1d05KUSG2bH6+b2QLgaCHgAAAAwNAwW06qF6nRJls2VCtIvSktY68UHRSR14yaoGMsnDywwaQJK1zo9fnUYNVeV8061W+3UUGUqhBR50YFWvXDZFXg0qz9R1WFqJYlgg7g6CHgAAAAwFBQczOcwzrdZmeouRf11EDMQRz2mUhVqzqOBdbEG1iVKatyIaoX9vVi3G9tIOmFahXpp0WlU2rmR3VTzUZNi5GqgnG2LtV/fTCWs4Ok/T6vAA4eAQcAAACGQsQazqmEYvmG1ohm62CzRkm8gbWOLuSzRkniqaIkUtvmc2jplsMs95pae6oqFryBNXtAqZpP0cuxqK+rr5TwhZINw1m7Ub/NZr+pmR0q5BARa8ZG8/dWfU0wlrMrQ/p5zQAGEwEHAAAABl7EakVR3IIM9Vv8+naVTWvAZyerTNVjqOGZ1fYIVTHgXh2wH1TFgark8AZWreNIii+UlFAs33GrjZq1oVo9nBf3fi3TcltJ+8c29qRFpVvq3Kiqjmahj3rNqnJHvce+PtbjAhhMBBwAAAAYePWrXlVlhVLdqlF7oZ5IbZshRRfDJc2KDXOuR0Q37KqH+nYYVelxUCKvGXY1iapgqG23cA9fqsNAM9WLe8eGEr+W7roCw/nas0bp0LbAONtW3GZvqPaZpmuCe2zNATCYCDgAAAAw0KJ1rSmqhcN5MVvfviJSvYht1V6SSBVl817t51RVQLVyw2zh8AbW7MoHFaiMhTdkSss0PMZ+U69XbSBRbSzNLth9oaRdwRCM5cR7atUOKMywqPMWHFU94zbE9TAkUtvW3JK1mqBGhR9u1PvXSVUPgOFBwAEAAICBpS5Enb+BD8ZyEnmt9uJ6qm6NqEi1NaHVhbt/KW2vOlXP57Uulv1LZmVDxFpJquZhTGkZ8VktK9XtHo2tMQdFBTlmJcOq6/GoAasqtHFWv2xa57hdwKFW76rAZ1BkjZLZwqSl7dcoIna41UxUL4j31OpAvRYA/SHgAAAAwMBSG1GC13MS1Qv2gMiobtgXpmptqJPZmpJsW2XgX0rbF/1q5sVYONkQoIiYF9JRq5LDG1izKyAiutGw1eMwxFNFu9rlmNW6EozlJGq12ThbW+ov6t1er4gZfqjwwFyxmrYHnQ6iUCwvx6xKDuc6Yae4Y2MNw0aBo4WAAwAAAANLzVcwg4hqlYIKFKasFadZo2T/d9Mo2QM1W8la91OVDipMcV4UqxaQUCwvkdcM84LfmoXhbAeJvGZ0vKXlIIRiefGFk3ZFh9rAEtGNjitN1OYRNWC112BDvTcHUeGiZox4T602zBXZtCpQVKilQo5BabUB0D8CDgAAAAykqFUZUb8ppLrGtWiFHuZGEbVKVc1eaLdhRFVjqAtvt3WnU1rGrBy5XrtaVFWSqPYIFcQcVpuKGxUsqFDIHEhqBjqtBpImUts1VSDdhCJuQrH8ga+RVaGYkjXK9qwR9R6qAbQEHMDRQcABAACAgbR5r9R2+4lz/oI3sCreU6s1K0FbMQeHrtoX7xHdaFiXaq5oTds35+Oqtg2vox1kEJmzM3L2TAp1vH4t7TK3xBxYqj7XbytKNWxqDEgSqaJEXjP2ZRONWgMbv12URGrbnqdS/3poUQGOFgIOAAAADCR1cdzJb9idw0GPBdY6ujBX2zeiumEP2qzfupFIFSWqF6w1rKWGr1dtKcNykVw/i8PZvqIqY/Yi2FBU1US9iG7UDGqN366GHGotbz/UXBQVQjULvFSrCoCjgYADAAAAAylrlO25G51s+FAXy92sPA3F8vaFvtuq0VbPp6odDrL9Yi+oc6OqU5yVL80Gc/YiqhfkWGDNtcXIv1SdYRKK5e3/rVbQTmkZ2ezjOLJGyX4/mw1QFWm/aQXAcCHgAAAAwMByBhetZmoEY7mewga1+lRVaFQHa5otJ+oWTxVl0/q8mv1RHXo6WLM3OuWslFDnz7lmtV9qI01j5Utt28qUY9Bn0NFK02/Qot6bdsdIwAEcHQQcAAAAGGgRaxhoszkXiVTRGjDaoFvk6AAAIABJREFUX/WBGsqpWhuqq1EzNdtE1E09l/p8PxUHh23zXsluUdmripRgLCdTLuFBVC+IL5S0//eUlrGHnvq1dE11R69UMOY2bNYZRjVroQEwnAg4AAAAMPCcLSGqyiCiGzKlZexAot/f+KvKAec8DRVaqEGmzs0k6kJ502qH6GSw6cOk2YBR53rWsfCGPWRU3V9twumX833KGmU7cJmy2pgSqaK9fhjA0UDAAQAAgKGgKgyqq0+r20D24oJYzX5wG3KpVsqq4/CeWrUDDVUt0G7ew8NoSss0tKn4l6qbWuJ11RR7udVEtd2oQMVcd7tttyKpFcPOdbIAhhsBBwAAAIaOumDeq4GY6rHU3AhVSZA1SpJIFa0L9WpbinMg55Rj9apqtYBJzThR50ttb1GtP1HdkITVFjMWNlfu7tV7qlpUmlXWqNYmKm+Ao4OAAwAAAHCIW60LarOI2sbhDDii1hrSsbB5sW62QQzvDI79FtULEorlJRTLSyJVlMhrhr3xZixsthipeRiqIqefdbFqbXD92l8n1VrEmljg6CDgAAAAAFyo6o2obkjweq7mYnvTKElEN6wL9ubbXQ7i+Pxa2t5EooKCYbFZF2KYs1YydrVHKJbrKeTwhZJyzGqDUbNV6tuYskbZbmEBcDQQcADAQ6KYz0p+aH67WJJ8Ni/Dt3RxjxQNyWbzYhSH5f0CcNA2HVtC1Opa87/bdiXEMK6udeq1giN+u2jP+Ni0QiA1JNbZjhLVC+I9tTpUgRCA1gg4gCPC4/G0vM3FDUlqx8Xj8ckK889ESlm5uKBJqo/rx/XFCfF4xiXe5OfH+Nx408/H583PrRgiUtRlosn7NjLqk+m5y2K/ZcW4jHs84ptb6fJoszLr8Yhnts3XFVfE5/HImZW9+mHPkHmfRzzjC12FFaWUJh6PR+bXh/uH80YlWb84L1qLAXrZq2cc3wNn5HB+7LbeN9+cHNw/F3Xnpu33Ym/fW8BR0WyVajxVlERq267s8C/1v11mmGSNsl39Ea37t1Zt4lHBj9rKQ8ABHB0EHMARMe4bl4mJCZmYGJdR6+LINzEhExMTMu4bl0XdkJU5HwGHJX5mVDyeUVnu41zErfPZ7DFafT7ufC8M80LO4/HI8ZlZmZmZkZmZWZmZHrcvdMfn4+YXWhd9o2e6DDiyl83AIN7mBRsrMurxyOxeBxwj3V2om+HRcUnu0VEMCiM+J542F+1zox7xeEZldn5etKuHdQas92304AKOhnNTNL8X2wYcXX5vAXsha5QlfrtoVwYEr+fsCgGzeiJtz5uI6MaeD7FUG0DcqIGoUd2QuD2807zYP+pBhwosvIE18YXc//1U62LV/dWgUwBHAwEHcOQUrQuT+YbfaqqL6rj1803paP+c05I+P15zLrpSqn2MZoFRvEWgVPO54oqMezzi8TW+Z6XkRTOwGrUu4noMOFIXj4vHMyH6ULznRVnwecQzffmwD2TPlfR5q6KqWc1B9e/vYSnVHMfBBRwN50YFHOrPD/M/WNhTqu2h/uYcaplIbUtUL9jhRFQ3JGIFBn4tIz5ry4q6+cJJe2Cmfyld87/VtpC9FIzl2l6UB6/nalo0/NYWmKN8MR+M5axzU7AHjAZjuYYZKebslJz4wsmhb+MBUIuAAzhyqr95rf+tptkyMSKzc7N2lcfI6HG5uO74YaeYlIWZauXAiO+4XNSb/wZ1cdonE7NnZNo3YlYgLOoiUpK4dsZ+Do9nVGa1uDgvT5JX52V8xPr86HFZWJgVn29G1osiUtRlemRUFpw/hDV8rM1zlFKyODshI+rzo+Myd1E3n/vijKMFYFQW4kZHx7x+uXrMI+PHZWLUs8cBh9vFpCFnRvsNOEqiTXjEM6GZr6fFuZGiLtOjzvOcl4tnjtv3HZ2ek4UzE+I7vmgea1GX6VGfnFlckOlR6/FGRmV2MW4f/+K0T8ZnL0pRRFJX52R0dELm5h3fg77670HzNc5czTa8kuW5CRkZPyNJ9cbkV+T46Kgcn1u275O6fEZGRo5L3BApJq/K7ISv+n6PjMrMwor9vhaTl2V6fNT+/Oj4jFxNNvlht+1rNV/v8sJM7ffRovl8RX2x+vdqZESOL8QbHn/G+ntk3scni7rR8jHt1zs6XdMKlbw8K6Ojjr9PbY+79n2emJmViZHWAUdqRZPjjuMdn56XakeRIYvHfXJ8Tqv592R8esG1Lcz13FjfB8fnFmTG53zt7t9bLb+v3d7ONu+9sX7Z/ndNHbv96aIu0z6fTM/OWNVXT8jkR35ZRo8v1Py7W1zXxDcyKvPxfA+POSqLR65F6/A5L/TVulK1JcUMLZL2qlKf+q81rFJ9zhdKStQKPiJWVUS7ygi1TnavtFp96hTVC3Y1h/lnwxrceTB1T1mjJHGrykWdL7V6d78lUtt2q8pYONlkkOneBk8ADh8BB3DkNC8tNwMOqxXizIIszE1bFwPqN/spmRlRn1+UyxfnzQtvj6fJD9rWc3k84hnxyfjoiExfTFqtMB4ZGZ8R7fJFOTNh/kCv5kbkV+bsYEO7elnOHFc/8FvtHG6l6XUfa/ccl2fMP0/PLcrly4ty3Lqwm9MNSS0vmhdvnhGZnp2XlWypg2O25iKMHJfFi5rMTqgLrvG9CzhGZiVZLEnRMMQwDMnnU3J57rj5PCqc6CXgKOky7vHI8Yuptuem9jyX5OK0dR6m5+SiVv1+sAM0R3vNyMSsLC7O2SHQvF4Uu+XCCmhWzvhqvwfPWK/PM223o5jnelSWXX7+NufIeGRBN78fU5en7a83X11RFsY94vHMSMpYti8UzyxclIvavBVKmTNppGTNPhmZkHntslxcmLX+PjRpjWn7Wqvna2RiVrTLmsyOm38enb0qUkzKvNV2NHp8VrTlVN37lJWL87P2Mc/OLchKttj6Me1zWtsKZX4/Wy1YXRy3ep/V/ZvN4Mgvqzkh4zKvXZSFMxP2+7BeEqn5t8EzLnMLCzI7MWod93LjA7qdG/X3wj7uuvev7nur5fd1vTbvfXFdBS4+mdMuyqL6ezgya36fGdVjGx0fl9GRcflSwPzeXkxWL6LMYxqVq/neHtPt7wD6E9EN+7f8zt/2B2M5eyNK8HrO3pySSBXtLR+qyqMXwViuaUtJL9TWFL+WsUOWZuK3zZW3KuRIpIp2wLOf1QtRK8xQAYNZyWIety+UlGAsJ5vWcSesVpr9aqNRrShK1ihZq30PZ/sNgP1DwAEcOe0DjpnLKcfHqhdHqctmZcP0RceFl3VB7ZlYdBnkZ8iczwxI7Iv4kjkE0zOx6Kh+KIl23LzQiRfVhc+E4zfOhsyPO6oh2gUcbZ8jb1Y9eCZkOavK3XWZm52TZeuHuZoWlS6OeaXZMbvoOuBodhudluVsqeb96CbgKMbnxeMZkctZEZE258Z5nvNXZdTjkZHpi9XzYiybx6q+v6zjGTmu2fcprS9IdZZC7fej+h6cdVRn1F+gX50ZaV45YB2Tb878Lb66MPd4RkRLVY/HN7di//ZchSEi1TaIMyt5ERWAjM+LOprs8oLMzjUZPtvutRpuf1cc3yfFTlpUSrUtZh08ptv3Wf33V0fH7fi8ZC9brVFu70NRFiesQNLxV3RdM8Om49q6uP7bIFmZHXFUI9W/cpcWFfO4FhuO2/z+cX5vtf87X6Ple69CstrQKGv9+3hmxXCcU8f7krooIx6PjJ6xAhxrILB5Xnt8TOy5+i0aByXymrEn7RDq66vraYv2GlTVRuMWEKhqBmfIEorl9+UiP367aFbBnFq1XnPj46sKirHwRk1FjaqYie9D8KLe96y1fYbqDeBoIuAAjpxWAYfPvihq+Jjh/O36iIyOjlo36wLSdZBf43NVf0vpkVGf9Rg+VQY+KsuGdeFTN2/C/E18q4Ajbm9UaP8c1Yst9bHjs/OyvF59POfrbv94WfPiqS7kWV9svZWm+4BjXBavXpWrlzX7t90ez4zU/J6/h4Bj5cyoeEZm7Qu5lufGce4Nq9JmtubXyHXvuXU84wuOVgDHe9UYcLT+HhRJyYzHIz41VLWB8/GSctzjkfEZs6T/+MWUGCuzUlNxVEzK5cU5mZk+LuOO1gDz2LLWRbhVJeAblzMLFyXZrCejzWs14lZ4Uvdr9/zyrF110MmQUef56uQxOw042h73Sov3uUZSpusDEcf5Mb833b6+9eBStyGjPo9Hxudrj3u8yXO0+ztfq9V7b1Q/Z/87OGq3CI2eWXE/p3aIYVaBZC9O11ab9PSY2GvBWO7QNmaMhZN9P7fanOKcGSIi1myQtN2S0SxIMQeOVoOWYCy355Uc5uvMdVSJkTXKduWGOh7vqdWaY9xr6hxtHkCbDICDR8ABHDkdBBxNLoTiVpvGxOyczM/NydzcnMzNzcvCwoIsaCuuFRz1z6UuUkbGZ2R+ft56jDnzMRYuSqpk/aBft9rRsNoSagIOx8aPUnLRvvhp/xzWYyZXZOHMjIyPVi9sJxbXG153+8dLmb95rrugy16dqR6zi5UWW1SWZx1bXFyHjJbk4owZcjh/8959wGH+1rz+/k3PjUvAcaZNwFH/XtUGVE0Cjibfg2o97EKL2QPmhhWfaJfNC3MtmTKf4/i8LMyM2KFQcX3Rnscw4puQ6dl5WZyfrruYL8n6VU1mpyccMy5GRHObw9HmtVaDgto33LDamxb0PgKOFo/ZScDR+rjnXJ6jVRhhVWLUD4G1QpO9DDjcjtvn8YivyXO0+jvfqNl7f8dur5mZq/57MD+/IAsL83b7TMOxiUj+qhU8razLomqVcr72Hh4Te0vNpDgM9W0SvQjF8vaA08hrhutFurnFxWxfcQsJ1OdVABGM5WSqyX27Zba/JCXSxyDTqG6I99SqeANrMrXH8zqqG2UOvooHwMEg4ACOnN4DDvPCsf5CJyvz0xMyPXe5o4DDLrOuu/jRF2dl4vicrDvaPZwbPcxWg9q1qROL1UkIWevC4cxKvoPnyMvCtE8m5hwX9ark3gpWajbKdHDM5urO47XHfHyk4Xw6qXkRE/XVCMW42f+vLn6aDhlN2jNRZi5na86vatFoy1oPO2dfNLU5N85wIntZRjweGZl2BCxqTkB9wNF0Xkp3AYdaD9vsktQ83ovVQZLW7A3nfBk1N2XlzKgdAtiHvzxrf48Xk5dlYtQnC443NalaBtyGH7R7rapFYcb5fVQS7fiIHWap0Kh5i0rd36kOHtOsvDLnPCiXZ0bbVEQ5PmYsm61IzudQMypcwwj3v8Pq4v64lmx8HW6vrf5R689Nk+N2D1Ha/513av3eb9ivr+b7MHlZpieOy/zVlPuxiYiU1uW4/b3pkQm7GsPo/TGxp9T61oPgnOMR0Q17fWm/skZJpuz2jrRrMJE1SlZ1hnvViDkTJGNXg0Ss4aN7EXKoLTPqtcdTRUmktrsKKtSslDFrO81ehRzt5pUAGH4EHMCR02qLSrvf9Fo9454RmdWWRdeX7WGb7r8Ftaoxai5YitbsCo/4ZhYkvq7LxXlrmJ51TPaAQt+MXI3rcnFODSisPw6fLFxelqvaGfuCdm4l38FzqFJxj0zPXxZ9Xf//27ublrju9g/g7yUvwa7ul9A3YNZd39vCwEhd2UWHLlwUFw1qugiFQAlkNqnKDYGmkkVuKBruickihtQxk7+zcBQjCtd/cc7vzIyOz+bhZz8fkDajzjlz1JDz9XqI338ufnP/dXXzm6pVfomVbu/Mc04By63xH+OP1ohzHqUKMm7F+Lc/xm+//x7NaojkwDVNMxBGfM32Wr+Wx/lmqN3g1vi38eNPP8WPP/5Yvn0fP44IoTZ+/y5u3fpm4Eb0jGtzZMjof8oZF19/+1M0B4eMjp8/4Pj53AFHeW7f/n7CBU3SvIViPkhxqX+pbipT9UcK7P790+/xan09ng58H33z80p1Y3/rX/+O3/5YiVetP6rv98G5HaNf16jH0myKW/HNj81ovVqJ334sg5d/F9s1DtaLCpWv//19NJ++iuP/zO5fr2759TrrOdP35r+++TH++O/T/vvPG3BErzrGv3/6PVqtp/HjeP/rPOpWMM3rST/D//09XdvxKMarjPq74ehrG3bs2pwj4Ogf4+yf+eHLfPrXvvp5//rb+P2/rVj549fy5/Zf8Z/OwalhxH9/7l//wdDp4s+5F799+3Xc+vq7GPXtyOXUm0WLx2kGt6KMWiW7Wt6wpzkYi62dqioiVUMMrpH9qpwrUYQSI0cYX8rKxl51nJNCm8XWThU2HL2xT9UW6XPnlrvXUjGx2Nqp5mqMz5XDRcvWmotWTqSWGqEEcF4CDrhxyoBjxG8ti99yH725HH5sb+OP/irJ8u3bkdUbxbF+/WbUb2Q78dvAash087UyOJDw958Gfgt/a/iGLCLW/zP8/m+/Lza+9P/xf/oxDjr/HVq5eevWrRj/7tdIszp7K7/1+99/XjnXOa/8Nrhe9l/x3XfHr+dRe+t/DK2FTPMBvv/16UDbSRmEfPPLyN9spxumf33/n4HwZ8TbiBvH3765Fbe++W3oRvrUa1PeQA62cPyRtj3cuhXffPd9WcExvLZ21E1ounke/B459XvwfXGD991/jq+HPar1axFeVKtkq60YP/Znluy1qo0j6e37n38uNuiUPx/rf/wy0J6Qwr0TZiCc+Voj4mAjfv1u/Ni17Q8t3Yifqs1Dp8y1GR/4XjjzOXvRHHr/N/HTTwPzYc553r98+/XA99J48fN3ysDLVvPH4Z/hr7+N/1StPaP+bigfG/F308hrc8p5f/PLyrFjnPUzf9RZX/tXv/905P3j8WvafDPq3JKycuRfR2eUXPg50zDZb4Zm1nA1qXIhWSmrLIqNH8VshvrDdrnxY7NcI9sPKwaHYQ7+ObWE1JubMVEGHXPLW1UVQ6d3EO+2r/8mPVVzpHaOUQFCass4aYtLcd7t6PQOq5kcV23h6PQOY3XjQ/n6P1RbUi7SovOuHEQ61nhp2wlwbgIOYKRetxudbjeu8kuTg143Op1OdHsn/Ov8oBfdTjf2or/VZCgsONiLbrcT3VNO4qxj7PW60e12o7c36jkOYm9vb/jm/8xz3otupxPdC95wHPR60el0otPtjfit/cez1+ueeP1OvzYRcbAeP3/77/jl6WDgUA6YHNyscm0OotvpxEmnc1m9bvE6T37eg/7HXNMxi++jk6/t3t7ehV/nWc9ZfI+d9jrPtlce49zXIf08nPTzcplzuMS1Gfr8s76vh5z1tS9f37X+3H6M5+S8BisBUlvGxMA2j7nlbswtd6uhnak6Y6EMQNKmkoVWL1b+/nKSpxRipGqOo7M5UrXGqIAhrY2dKytb0ms/q9LlvFY3PlSh0EVaYOrNdoxfw2BW4J9FwAF8EU7bOMJncvCqbLH5On5u/hEr//1PVRFRzFkAyNe7gZaTmyKFNvWH7WNtHWk169xy99j7+jM4ikqJ1Y0PMT6/fuWQo1jJun6p+R71h+1rG34K/HMIOIAvwqjWBT6/XqtZtHQMtgv98offPAN8gYoQo13NwDgaDiwOVK0clT4nhR+Lrd6JbS/n8a53EHPL3fiq8bJaA3tei61ejDXWrrx1BvjnEXAAcKZerxvdbu/a20cAuF7FMNQPVcvKypGQY6HVO7E6Y3xu+PGismP9UlUUaZ7HRUOKlY29GGusxfic4aLAxQk4AADgI1gpB4x+DqntZHzueEthCkCOVlbMLm8dCxZWN/Yu3KrS6R3E+Pz6yEqRs8wtd2Psh7VrWakL/PMIOAAA4JqldpHFVm9go8r1bQM5T1VFp3cQY42XUW+2j318qrA4GsAMDhgttqH0N81c5NxGVW+sbuzF+Nz6qc/V6R1UlSNHq08AziLgAADgi7DQ6lU3uO96B0ODL3OzUt7Md3oH0ekdxkS1jvXqFR0pADhp9eugFDbcnh+uzEhVFkdnbCyWLSxpbW4xJHQ9xhprMXHCkNJR6gOvd7G1U67obcdYYy0WzghL0us76+MAjhJwAADwWaXWiLEf1uKrxssYa7ysVoumQZdFJUQ3Zpe3YnVjL971DobWoR5djfq5pa0lg+0dE0f+fBn9lbDrVXXGWRZavRj7oZhrkdbb9geSDn/+YIvI3PJWLPyvFyvltpnBuRqd3uGpx0xDS8d+WKtaZdJckKNWNvaG1sGulKHMda2qBf45BBwAAHw2C61ejDVexvjcetQfFu0RY42X1aDJueVuTJQ3y4M3yUff5pa7VfDxua1s7MViaye+aryM+sN+gFBUMVx8LkWnXGlbBAzrZcvJh2orynkqQ4rrujYUaMz+uVXO4iiqOIrwpHj+UdUTnbKq5vb8mzOvcwotivaWnSJQedge+foXWzsx9sPaUOtK+poCXISAAwCAzyZVaqSBnItl4PFV4+XQzXBq9Ug3+outnaqiY3CgZqowqDc3q5aXTzXo813ZjlGcx/qxdo403POi57PY6lUtI/Xm5tBsijTX4vb8m5j9c+vU5+4HIpvxbrv4uInyWkXEUNXEqAqNTrn69TKrY1OrzNHP7fQOYqK5GWONl0PtSBPNzaFw6Cwr5awQm1fgn03AAVzJ4f5u7J9epQoAQxZbvapdI81a6PQOq5v4sbJN5aItCqsbe7FQPncKPMbni7f6w3bMLXc/ymaT1O6Rqhvq5ayKueVu1B+2Byokjm8pOet5Z//cqqouTvq8IjxYr1p7Fv7XO3EI6WJrJ26X16T4czHvonj8TdXCcvJxzq7eGGVuuXusHWZ1Yy/qD9tlq83m0OsbDF7OsrqxFxNl8LPQ6h17LuCfQ8ABN0StVjv1rflqN9pP7kSt1ogXu1c40GE3ni49ifeHERG70ZyqRW2qGVd5ytF241GjFrWZx7EfEW8fX8O5X9K1XDcAIqIcbjnQapLaUG7Pv6luUlPIcZUZDKkaJFU/1JvtqD9sV0Mzr2u+Q2rbGGusHWuZSS0paRbH0aqUs6TBpOfZmBIRsfJ3PzAYtQY2Wd3YG5rfUW9uxtgPa2dekzQo9DLhwezy1lBFRqomSW8TA6FEcU3Xz32tZv/cqs59rgzNch1OC1yNgANuiOnGdMzMzMTMzHRMlaFGY2YmZmZmYroxHY9f78aLZuPKN+qvHkxFrTYVz3cjInbjQa0WtcmPGHBMNWM7Il5dw7lf1nVcNwAK/SGZb4aqDtK8hcVWrxw0unZt8zRSm0ra0HLRoOE0/S0lb6oVq4PzK/rVHf22lfNYKLeZXEaaaXF7fv3Ea1hsNHlZVb0cDZSOtqislFUilw2GFls75QyQIvAZL6/H6sZerGzsRb3ZrlpvivW2Zwcu/XPtByLjc8IN+CcTcMCNs18GA49i/8h7Ukjwqvw3y+ElWkteP5oeeo72kzsjj3V1/YBjNz5vwPE5jw1wkxQ3uS+rt68G/j8NCa2X8xhGbdu4nnPoVTf216VzZKPLdTxf/QItGqM+f6zxshzcOXpeRhFqrFUzQcYaa1WFRTp+qqhYHJhxcloLy2lWyxCjCoMeDlempCqOfgB1/vkb6flXP0L7EZAXAQfcOMOVD4NeNaejVpuM+837VZXH5NSdePq2f+e+3/4r7s80+u0tk1Nxb+lFHEZE++m9gbaXqVh68SpmarVovtouP/dZ3J2eqj5mavpe/NU+Ofo47VgXCTieN2dicvpBtFNgs/0i7kxNxZ3m8+pj3j97EJOTd+LVbkTst2Pp3nR13MnGnXj6+ujVGrxuxbGfl8d+//xRTE9NRuPuk9jffx13pxrx4PFS3J3qv477j18NfU2eL92rrnmtNhX3H5evc/913GtMxp1HL4bOdWqyEUuvdqvPf3y3EY27jz9CpQzAp5M2eaTNKINrYb8qb8jTf8caa9UchjTTIq2InShv/Fc39mL2z+KxxXMOFE0361/qjXAaRHp7fr0aBHpREwMh0e35NyeGObPLWzH2w1q50nV9YMDoQbmWtxhamipqruOanfQcCwMtK3PL3S9iGw6QHwEH3DjDwcCgIuAobrLvPFiKpebdmKzVolabideHEbH7PBrlDfiDpafx9MmjmJnqz/B4//xxzEzWolabjLv3H8WL7kAJyOHrmKnVojY5E4+ePIunS/fL574TI38Hc8axLhJwFDMyarH0ughT3j+7W77Ou/E+IiL2Y2m6FrXavXgf7+PeZLoGj+PZ00cxXV6Tx29HhzGDlS/dvx6UIcbdIizZfVG+jlpMztyPx4+bMV0+/6PX+xFxGE/vTlbvf/LsSdyfLv48df+v/uscONfHM2VA9OB5da2marVoNF+MPD+AXAxWDaSWgoVyyGVq40gByEo5gDLNoThpPezgLI+xxssYL2/UVzc+HLuZTvMyJr7gIZRpTe5lK0xS+0eqZhifWz+xGiK17AxusknS42lgaxGUfNzWj0+58Qa4mQQccOOcHXDce/Z+4LF+dcL+2yfRmJyqgoKIiMPXj6JWq8WDF0WFw9EWlf5hy8Bi+lGk7uLu86W430wDSYedfawLtKhs/1UGAEXVRAoUarXJePI+IvaLEKLRfBHvnxVVKHef9q9Ben8aaHpUOnbz0f0iqJhu9qtFys+dvPMk0kOHb5f6r2N31HPvxqPpWvF69vsBzeN2RBwWVTG1Wi1qUw9iOyK65TmfFMAA5CLdSKcho2kIZtqwMeq39oM3vJ3eYSy0evGud1BWbexEp3dYVhzslANFixv8tKo1zcaol0HJVYeXfkwpgLnK+aWwKKIfUpwVlhTbbN5UVRyp0mas8TIWW71Y3fgwtM0F4Esl4IAb57SAo1HdVB97LH3wfjuePW7Gvbt3YrqRgoJ+wHFy0NCNZqO/tWWyMR0Plp5G+7SeilOPdZEZHIMf2447tVpM37sXjVot7jx9H7sv7lcBwYsHjSr8mJqaKt/KY08+ONbWU7zmfuVLrVaL+38NfFQZcEwvvR547FU0ytex+6oMbZ4PP/P28/v9apXus5is1WLmcTv2XzdhK7AGAAATHElEQVSjVpuMe/dmymGu+/H0TlF9cr6xdABfpmouRPlWtIkcllsv3gwN5ryOY3V6hzH751a1/jSFG2M/rJ066POybSFXlWaDXGX46dxyt5y70asGd06c8/nSDIt3ZRVFaglKUviiwgL4kgk44MY5R8CxO/qx/bePy7aSWkw2ZuLu/Ufx+NHdcwYcERGH8favJ3H/7szAvInJeDJiDsfZx7rYkNG3j2eiVmvEk2dFoPCk/b74/DuPYuneZNmekp6nFjP3m/Go2YxmsxnN5qNYWlqKpScvTqjgKAKO6bv3yvaTRlR5xf6LmKrV4sGrgRNLjw0GHEdOfPfFg7KtZjcitot1uzOP4umDRtRqD+L9+yL0uPf4cdyp1WJKewqQuXSDnKo40s18UckxehDmdR670zusjn20oiHd0KfhmtcZtpz3/OoP2+UK1ktMAI9+gNRf/Vq0/KxcstUlBSSDq1vrzfZH/1oBXIWAA26cywccLx5MDdx0l89WVhqkG/Sjm1iS/fazmJlqxNLr/jvaZWvF0eqFiPMc64JbVLpPq8AkzbMYrLxI8yuKIORo4NCNR3dn4m7z2aktKq8iYv9Fs3jO6UfF9R0IM/oXY+Cx98V5Td17NvCMh/HkzuTAut2It0sz/eGs959HRDfuT/arRrSnALnrr/JMszaKwaLnXZt6VXPL3Wpby1Gzy1tVu0y92f7ka0YHKy8uK1WAdMr2ncHVu5exuvHhWEvKpwijAK5CwAE3zmlbVE4PONLN/8yDp/G23Y7nTx5UocF0Od8itXjM3H8Ur7YHUo5yEGZtciYe//Uq3r7+Kx7MTA4N/xx09rF2i5aXIwHH8xNbXrbjQTmkdPLu04iI2C+rJ2q1WiylgGD/VTlUdDLuP3ker18/r85z5vHbkc989NjP7hXhzMzS67MDjoGhodP3n8Trt6/i8f0yeJlZ6n+N3vcDmhQIPb9fbqSZvNcfQHpnKmpTd2PEJQX44vWrN9aG1sN+TOlGvWhTGd2usdDqxexyMWPiUwUuydxyN8bn1q80d2N2eSvG59arNavFZpSrzctIK3sH1R+2q1WyAF8iAQfcOGXAMb10rBqhqGg4GnAMPLb/utrwkd7uNZvF5pTy+XZfPa7aT6aar4aev/3Xo4HWlBQivI6RzjxWOYizCjimo1abHpofctTrsgri3l/lP06rzS73Y2CkaOy//6u/0rV8u3NC9cbI63b4Nu6mVpX/e1HN2+gf4Mhjh+9j6W5j6HiNu0tHhq+mgGa6Os522cbSeJDaU9Jw0tOvA8CXqpqDUQ4aLTZ8XH7mxFlWNz5Ua1DPChDS4NKP7V3vIGaXt2KurBoZbCu5jJWNvaGhrakN6LLPtbKxVwwVLWejDM7cqDfbn7x9B+AiBBzAMbvb27G9vR37J7YBH8b+/n6Mfvdh//Ov5Vgfz+72dnS3t2P3Ex37cHc7ut3t2P0cLxbgC7AwcANef9ge2HKyWbWJdHoH1zLoc7G1U62k/dQtJyd5V86xmFvuxurGhyrgucrgzrQed7Vcqzs+d/G5G6mtpdhms1nNRjm6cWaiuRkL/7v+gGOx1ROcANdCwAEAwGexurE30B6yWQYeRegxMXCjnUKB4m0rFlq96nNH3cwX4cbLoVW0n1undxDj5RrWVHUx1nh5pZaP9DrrD9tVNchlW2wWWztDFSwrf+/Fwv96cXu+3/qSrv91Sutnb8+vfzFBFJAvAQcAAJ9dp1xPurqxF4utXlXVUbRzdOP2/JuqFaP479EwpNhC8lXZAjPR3IyVvz9+y8l5pS0ys8tb1f/3t8lcPOTo9A6qkGSxmrtxtRWzJ1WSzP65VW29ua41se+2D6qvb0RRifIpWoSAm03AAQDAF+/d9sGxEGT2zyL8KNpd3lThxljj5ec+3WPSfIxUYVGsrV2vzjnd7BfVGDtn3uzPLW/FWGMt5pa3YqKsdLls+JDW5CazZZXM8PnvxERzMyaam9dSadHpHZTPtRfvysDnusIT4J9LwAEAQPY6vYOol60UX+KN8kq5uvXomtU0KyStzR37Ya1srymGsKZ5HYM6vYP4qqz8WN34UFWxXNbCkRkYs39ujQxYVv7eu9IQ00Fzy93qnBdbOzE+vx6dnhlVwNUIOAAAYIRUMXJdz3XSqtp6czPGGsVq11TZ0A863lStLYutnSrISRUPE+XskstWVXTKrS6DgUYRqoyuIJlb7lYVJ5edb7K6sRdjjbWqPSUNn60/bFevc3Vjr5qzkobPrmzsVdcAYBQBBwAAHNHfKNK+thvqiebmUHgwu7wV4/PrVVvNYBVFcfx2sR2l2a7mj6S38bn1anDpVdbMzi13jwUVJ73mwU0rV1lvu9jaia+ObGhJz3m7fD3prVhXmx4rgh0bV4CTCDgAAGDAQjnktN5sR/3h9QUci62dKpwoNocMBxbJYJVGOp/0cUUYshaLrZ1qc8plh3Om4wy+vjTUdZSideVDvOsdVNUll5VCncVyi85EOVS2Xs75GNygU29uRv1hu/r/2Wve5ALcHAIOAAAYsNjqlTfUmyPX0F5Fp3cQC61eVZFRtWcMVEOkxxZbO2UFw5tqNW6qdEizN64SMowaJnpSe0oKQ95tH0T9YTvGflg7Nk/kIopWl34bTgpVVjeK9bTp9ab1wP2qjk3bVoATCTgAAGCEjzn0crBqov6wXVZ19KtGUugxPrc+FCSkWRQLrV6Mz69fOmRIVSqDr3FURUeSwpY0S+Q6Bo0ulq/h9vybcwdJ5m8ApxFwAADAZzS33K3aVNLwzTR7Y9T61CJkWL/SatV6czPeHfnck9pTFls71cyP4lwvH6wMerd9EAv/6x07D4DLEnAAAMBntrrxodrakqoZ0oyNlXKjyErZspEqKC47bHN2eevYHIuieqM9spKi3tyMxbJl5Pb8uhkYwBdLwAEAAF+oerMdY42XJ25RuahO72Dk55609jVtTYmIWCkDDoAvlYADAAC+UKsbH6rqiZW/96o2kZM2nZxl1GDRd+XsjaPDOxfLYaf91pQ3VdgB8CUScAAAQEYuO3djVGvKSY+ndpRim8nVN7YAfAoCDgAAuOFWNz5EvdkeUaWxE/Vm+1hoklpTOr2DmGhuCjeALAg4AADghqs32yPbWiaam8ceT9UbRSiyGWONlwaLAlkQcAAAwA220OqNnJ2x0OodCzeKFbRvYrG1E7PLWzHWWLuWlbAAn4KAAwAAbqjUYjIqpKg/bA9tTkmrYuvNdiy2dmKs8fLSq2gBPgcBBwAA3FAnbVwZVdUxu7wVt+fflC0qb6LebH+q0wS4FgIOAAC4gVY29mJixPrXNFvj3fbB0Mfenn8Tc8vdWGj14vb8urkbQHYEHAAAcAPNLXdHhhT1ZjtWjoQe9WY7bs+/qVpaxufWP9VpAlwbAQcAANwwqxt7I8ON2eWtY60pi61ejM+tx0KrVw4WfXms6gMgBwIOAAC4YYo2kzfletgi6Fjd2It6czNWNz4MfWy92S4Hju5UbSoAORJwAADADbK68SHG59djrPEy6s12jP2wFrfn38T43Pqx8GJ1Yy/G59fLoaPFBpVO7+CEZwb4sgk4AADgBklhRmoz6fQO4vb8mxhrrB0LOW7Pv4nZ5a1YbO3E+Nz6yHWyALkQcAAAwA0yt7x1bMXrYtmyMru8FePlhpTF1k7Um5vR6R1Evbl5bDYHQG4EHAAAcIMUszbaxx6fW+5G/WE7Vv4uZnHMLXerYaSDFR8AuRJwAADADVJUZhwPOFY3PlSrYOeWu+XA0b24Pf9GawpwIwg4AADgBkmhxdFhoUUrSjsWW73o9A7LoaKbBosCN4aAAwAAbph6sx2z5XrYQYutXswub1UhyO35N7HQ6n2GMwS4fgIOAAC4YVKAMbu8daw6o2hPacdY42XMLXdVbwA3hoADAABuoNWND1FvtmN8bj0WWr3o9A6i0zuI2eWtGPthLcYaawaLAjeKgAMAAG6wYkXsekw0N2OiuRnjc8Wa2BXhBnDDCDgAAOCG6/QOYmVjrxowCnATCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7Ak4AAAAgOwJOAAAAIDsCTgAAACA7P0/LNizqWeuQHIAAAAASUVORK5CYII=';
+  this.attach(new Buffer.from(imageData, 'base64'), 'image/png');
+  callback();
 });
 
 Then(/^a failing scenario captures a json payload/, function (callback) {
-    var jsonData = new Buffer(JSON.stringify({ key: 'value' })).toString('base64');
-    this.attach(new Buffer(jsonData, 'base64'), 'application/json');
-    callback();
+  let jsonData = new Buffer.from(JSON.stringify({ key: 'value' })).toString('base64');
+  this.attach(new Buffer.from(jsonData, 'base64'), 'application/json');
+  callback();
 });
 
 Then(/^he throws the pending exception from this step$/, function (callback) {
-    callback(null, 'pending');
+  callback(null, 'pending');
 });
 
 Then(/^cucumber-html-reporter should report pending step with code-snippets in HTML report$/, function (callback) {
-    callback();
+  callback();
 });
 
 Then(/^Fred attaches the "([^"]*)" to the Given step of passing cucumber scenario$/, function (testData, callback) {
-    this.attach(testData);
+  this.attach(testData);
 
-    var myJsonObject = {
-        name: 'cucumber-html-reporter',
-        format: 'html'
-    };
+  let myJsonObject = {
+    name: 'cucumber-html-reporter',
+    format: 'html',
+  };
 
-    this.attach(JSON.stringify(myJsonObject, null, 2));
+  this.attach(JSON.stringify(myJsonObject, null, 2));
 
-    callback();
+  callback();
 });
 
 Then(/^cucumber-html-reporter should create HTML report/, function (callback) {
-    callback();
+  callback();
 });
 
 Given(/^Fred runs a passing scenario for the following data set$/, function (table, callback) {
-    // Write code here that turns the phrase above into concrete actions
-    callback();
+  // Write code here that turns the phrase above into concrete actions
+  callback();
 });
 
 When(/^he left this step to be ambiguous$/, function (callback) {
-    //Write code here that turns the phrase above into concrete actions
-    callback();
+  //Write code here that turns the phrase above into concrete actions
+  callback();
 });
 
-
 When(/^he left this step as a pending$/, function (callback) {
-    // Write code here that turns the phrase above into concrete actions
-    callback(null, 'pending');
+  // Write code here that turns the phrase above into concrete actions
+  callback(null, 'pending');
 });
diff --git a/yarn.lock b/yarn.lock
index 00691d6..3b9607a 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,25 +2,174 @@
 # yarn lockfile v1
 
 
-"@babel/polyfill@^7.2.3":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.4.4.tgz#78801cf3dbe657844eeabf31c1cae3828051e893"
-  integrity sha512-WlthFLfhQQhh+A2Gn5NSFl0Huxz36x86Jn+E9OW7ibK8edKPq+KLy4apM1yDpQ8kJOVi1OVjpP4vSDLdrI04dg==
-  dependencies:
-    core-js "^2.6.5"
-    regenerator-runtime "^0.13.2"
+"@babel/runtime@^7.15.4":
+  version "7.21.0"
+  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673"
+  integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==
+  dependencies:
+    regenerator-runtime "^0.13.11"
+
+"@colors/colors@1.5.0":
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9"
+  integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==
+
+"@cucumber/ci-environment@9.1.0":
+  version "9.1.0"
+  resolved "https://registry.yarnpkg.com/@cucumber/ci-environment/-/ci-environment-9.1.0.tgz#6d868141c7cfd616931f14723e122a1069401998"
+  integrity sha512-jdnF6APXP3GawMue8kdMxhu6TBhyRUO4KDRxTowf06NtclLjIw2Ybpo9IcIOMvE8kHukvJyM00uxWX+CfS7JgQ==
+
+"@cucumber/cucumber-expressions@16.1.1":
+  version "16.1.1"
+  resolved "https://registry.yarnpkg.com/@cucumber/cucumber-expressions/-/cucumber-expressions-16.1.1.tgz#5f364f39bcf33950544cca2fc3423aca8fa36ed3"
+  integrity sha512-Ugsb9qxfgrgfUKsGvbx0awVk+69NIFjWfxNT+dnm62YrF2gdTHYxAOzOLuPgvE0yqYTh+3otrFLDDfkHGThM1g==
+  dependencies:
+    regexp-match-indices "1.0.2"
+
+"@cucumber/cucumber@^8.9.1":
+  version "8.11.1"
+  resolved "https://registry.yarnpkg.com/@cucumber/cucumber/-/cucumber-8.11.1.tgz#6e9bb23307610f0510470ab755568223da8414e3"
+  integrity sha512-C+wdypoSzHA48GCRorJCAZYuxXo1RSESukAmoz/JhGV7KB4pIlg9Y2aWeZKx6bJQkq8yq4+S4jg9f8FGCdc3jQ==
+  dependencies:
+    "@cucumber/ci-environment" "9.1.0"
+    "@cucumber/cucumber-expressions" "16.1.1"
+    "@cucumber/gherkin" "26.0.3"
+    "@cucumber/gherkin-streams" "5.0.1"
+    "@cucumber/gherkin-utils" "8.0.2"
+    "@cucumber/html-formatter" "20.2.1"
+    "@cucumber/message-streams" "4.0.1"
+    "@cucumber/messages" "21.0.1"
+    "@cucumber/tag-expressions" "5.0.1"
+    assertion-error-formatter "^3.0.0"
+    capital-case "^1.0.4"
+    chalk "^4.1.2"
+    cli-table3 "0.6.3"
+    commander "^9.0.0"
+    debug "^4.3.4"
+    error-stack-parser "^2.1.4"
+    figures "^3.2.0"
+    glob "^7.1.6"
+    has-ansi "^4.0.1"
+    indent-string "^4.0.0"
+    is-installed-globally "^0.4.0"
+    is-stream "^2.0.0"
+    knuth-shuffle-seeded "^1.0.6"
+    lodash.merge "^4.6.2"
+    lodash.mergewith "^4.6.2"
+    luxon "3.2.1"
+    mz "^2.7.0"
+    progress "^2.0.3"
+    resolve-pkg "^2.0.0"
+    semver "7.3.8"
+    string-argv "^0.3.1"
+    strip-ansi "6.0.1"
+    supports-color "^8.1.1"
+    tmp "^0.2.1"
+    util-arity "^1.1.0"
+    verror "^1.10.0"
+    xmlbuilder "^15.1.1"
+    yaml "1.10.2"
+    yup "^0.32.11"
+
+"@cucumber/gherkin-streams@5.0.1":
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/@cucumber/gherkin-streams/-/gherkin-streams-5.0.1.tgz#8c2142d295cd05644456be7282b4bd756c95c4cd"
+  integrity sha512-/7VkIE/ASxIP/jd4Crlp4JHXqdNFxPGQokqWqsaCCiqBiu5qHoKMxcWNlp9njVL/n9yN4S08OmY3ZR8uC5x74Q==
+  dependencies:
+    commander "9.1.0"
+    source-map-support "0.5.21"
+
+"@cucumber/gherkin-utils@8.0.2":
+  version "8.0.2"
+  resolved "https://registry.yarnpkg.com/@cucumber/gherkin-utils/-/gherkin-utils-8.0.2.tgz#deae231f84e91f120501d22187c66d36e6c6b59f"
+  integrity sha512-aQlziN3r3cTwprEDbLEcFoMRQajb9DTOu2OZZp5xkuNz6bjSTowSY90lHUD2pWT7jhEEckZRIREnk7MAwC2d1A==
+  dependencies:
+    "@cucumber/gherkin" "^25.0.0"
+    "@cucumber/messages" "^19.1.4"
+    "@teppeis/multimaps" "2.0.0"
+    commander "9.4.1"
+    source-map-support "^0.5.21"
+
+"@cucumber/gherkin@26.0.3":
+  version "26.0.3"
+  resolved "https://registry.yarnpkg.com/@cucumber/gherkin/-/gherkin-26.0.3.tgz#6ffe37570c608caa329784161305056135a19c96"
+  integrity sha512-xwJHi//bLFEU1drIyw2yswwUHnnVWO4XcyVBbCTDs6DkSh262GkogFI/IWwChZqJfOXnPglzLGxR1DibcZsILA==
+  dependencies:
+    "@cucumber/messages" "19.1.4 - 21"
+
+"@cucumber/gherkin@^25.0.0":
+  version "25.0.2"
+  resolved "https://registry.yarnpkg.com/@cucumber/gherkin/-/gherkin-25.0.2.tgz#e430879f01978d1f9e7a7aa0563031a3a36022e7"
+  integrity sha512-EdsrR33Y5GjuOoe2Kq5Y9DYwgNRtUD32H4y2hCrT6+AWo7ibUQu7H+oiWTgfVhwbkHsZmksxHSxXz/AwqqyCRQ==
+  dependencies:
+    "@cucumber/messages" "^19.1.4"
+
+"@cucumber/html-formatter@20.2.1":
+  version "20.2.1"
+  resolved "https://registry.yarnpkg.com/@cucumber/html-formatter/-/html-formatter-20.2.1.tgz#e12ef35ae99e0a941d03eea3518103eb127f04b5"
+  integrity sha512-bwwyr1WjlOJ5dEFOLGbtYWbUprloB2eymqXBmmTC10s0xapZXkFn4VfHgMshaH91XiCIY/MoabWNAau3AeMHkQ==
+
+"@cucumber/message-streams@4.0.1":
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/@cucumber/message-streams/-/message-streams-4.0.1.tgz#a5339d3504594bb2edb5732aaae94dddb24d0970"
+  integrity sha512-Kxap9uP5jD8tHUZVjTWgzxemi/0uOsbGjd4LBOSxcJoOCRbESFwemUzilJuzNTB8pcTQUh8D5oudUyxfkJOKmA==
+
+"@cucumber/messages@19.1.4 - 21", "@cucumber/messages@21.0.1":
+  version "21.0.1"
+  resolved "https://registry.yarnpkg.com/@cucumber/messages/-/messages-21.0.1.tgz#1468cef60d6da4d4f540a70ab1265f6540f44f51"
+  integrity sha512-pGR7iURM4SF9Qp1IIpNiVQ77J9kfxMkPOEbyy+zRmGABnWWCsqMpJdfHeh9Mb3VskemVw85++e15JT0PYdcR3g==
+  dependencies:
+    "@types/uuid" "8.3.4"
+    class-transformer "0.5.1"
+    reflect-metadata "0.1.13"
+    uuid "9.0.0"
+
+"@cucumber/messages@^19.1.4":
+  version "19.1.4"
+  resolved "https://registry.yarnpkg.com/@cucumber/messages/-/messages-19.1.4.tgz#5cefc47cac3004c0bc38d42933042ec248bb747c"
+  integrity sha512-Pksl0pnDz2l1+L5Ug85NlG6LWrrklN9qkMxN5Mv+1XZ3T6u580dnE6mVaxjJRdcOq4tR17Pc0RqIDZMyVY1FlA==
+  dependencies:
+    "@types/uuid" "8.3.4"
+    class-transformer "0.5.1"
+    reflect-metadata "0.1.13"
+    uuid "9.0.0"
+
+"@cucumber/tag-expressions@5.0.1":
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/@cucumber/tag-expressions/-/tag-expressions-5.0.1.tgz#94ed2299eaa9085f113d71cb4da1186ad57b3de9"
+  integrity sha512-N43uWud8ZXuVjza423T9ZCIJsaZhFekmakt7S9bvogTxqdVGbRobjR663s0+uW0Rz9e+Pa8I6jUuWtoBLQD2Mw==
+
+"@teppeis/multimaps@2.0.0":
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/@teppeis/multimaps/-/multimaps-2.0.0.tgz#2114ee964b702f9777d0e07899087ad9cd89a0de"
+  integrity sha512-TL1adzq1HdxUf9WYduLcQ/DNGYiz71U31QRgbnr0Ef1cPyOUOsBojxHVWpFeOSUucB6Lrs0LxFRA14ntgtkc9w==
 
-ansi-regex@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
-  integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
+"@types/lodash@^4.14.175":
+  version "4.14.191"
+  resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.191.tgz#09511e7f7cba275acd8b419ddac8da9a6a79e2fa"
+  integrity sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==
 
-ansi-styles@^3.2.1:
-  version "3.2.1"
-  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
-  integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+"@types/uuid@8.3.4":
+  version "8.3.4"
+  resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc"
+  integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==
+
+ansi-regex@^4.1.0:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed"
+  integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==
+
+ansi-regex@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+  integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-styles@^4.1.0:
+  version "4.3.0"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+  integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
   dependencies:
-    color-convert "^1.9.0"
+    color-convert "^2.0.1"
 
 any-promise@^1.0.0:
   version "1.3.0"
@@ -32,12 +181,12 @@ assert-plus@^1.0.0:
   resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
   integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
 
-assertion-error-formatter@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/assertion-error-formatter/-/assertion-error-formatter-2.0.1.tgz#6bbdffaec8e2fa9e2b0eb158bfe353132d7c0a9b"
-  integrity sha512-cjC3jUCh9spkroKue5PDSKH5RFQ/KNuZJhk3GwHYmB/8qqETxLOmMdLH+ohi/VukNzxDlMvIe7zScvLoOdhb6Q==
+assertion-error-formatter@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/assertion-error-formatter/-/assertion-error-formatter-3.0.0.tgz#be9c8825dee6a8a6c72183d915912d9b57d5d265"
+  integrity sha512-6YyAVLrEze0kQ7CmJfUgrLHb+Y7XghmL2Ie7ijVa2Y9ynP3LV+VDiwFk62Dn0qtqbmY0BT0ss6p1xxpiF2PYbQ==
   dependencies:
-    diff "^3.0.0"
+    diff "^4.0.1"
     pad-right "^0.2.2"
     repeat-string "^1.6.1"
 
@@ -51,16 +200,6 @@ balanced-match@^1.0.0:
   resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
   integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
 
-becke-ch--regex--s0-0-v1--base--pl--lib@^1.2.0:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/becke-ch--regex--s0-0-v1--base--pl--lib/-/becke-ch--regex--s0-0-v1--base--pl--lib-1.4.0.tgz#429ceebbfa5f7e936e78d73fbdc7da7162b20e20"
-  integrity sha1-Qpzuu/pffpNueNc/vcfacWKyDiA=
-
-bluebird@^3.4.1:
-  version "3.5.5"
-  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f"
-  integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==
-
 brace-expansion@^1.1.7:
   version "1.1.11"
   resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
@@ -69,6 +208,20 @@ brace-expansion@^1.1.7:
     balanced-match "^1.0.0"
     concat-map "0.0.1"
 
+buffer-from@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
+  integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
+
+capital-case@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/capital-case/-/capital-case-1.0.4.tgz#9d130292353c9249f6b00fa5852bee38a717e669"
+  integrity sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==
+  dependencies:
+    no-case "^3.0.4"
+    tslib "^2.0.3"
+    upper-case-first "^2.0.2"
+
 chai@^4.2.0:
   version "4.2.0"
   resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5"
@@ -81,132 +234,76 @@ chai@^4.2.0:
     pathval "^1.1.0"
     type-detect "^4.0.5"
 
-chalk@^2.4.2:
-  version "2.4.2"
-  resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
-  integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+chalk@4.1.2, chalk@^4.1.2:
+  version "4.1.2"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+  integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
   dependencies:
-    ansi-styles "^3.2.1"
-    escape-string-regexp "^1.0.5"
-    supports-color "^5.3.0"
+    ansi-styles "^4.1.0"
+    supports-color "^7.1.0"
 
 check-error@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82"
   integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=
 
-cli-table3@^0.5.1:
+class-transformer@0.5.1:
   version "0.5.1"
-  resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202"
-  integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==
+  resolved "https://registry.yarnpkg.com/class-transformer/-/class-transformer-0.5.1.tgz#24147d5dffd2a6cea930a3250a677addf96ab336"
+  integrity sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==
+
+cli-table3@0.6.3:
+  version "0.6.3"
+  resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2"
+  integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==
   dependencies:
-    object-assign "^4.1.0"
-    string-width "^2.1.1"
+    string-width "^4.2.0"
   optionalDependencies:
-    colors "^1.1.2"
+    "@colors/colors" "1.5.0"
 
-color-convert@^1.9.0:
-  version "1.9.3"
-  resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
-  integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+color-convert@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+  integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
   dependencies:
-    color-name "1.1.3"
+    color-name "~1.1.4"
 
-color-name@1.1.3:
-  version "1.1.3"
-  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
-  integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+color-name@~1.1.4:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+  integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+commander@9.1.0:
+  version "9.1.0"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-9.1.0.tgz#a6b263b2327f2e188c6402c42623327909f2dbec"
+  integrity sha512-i0/MaqBtdbnJ4XQs4Pmyb+oFQl+q0lsAmokVUH92SlSw4fkeAcG3bVon+Qt7hmtF+u3Het6o4VgrcY3qAoEB6w==
 
-colors@^1.1.2:
-  version "1.3.3"
-  resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d"
-  integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==
+commander@9.4.1:
+  version "9.4.1"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-9.4.1.tgz#d1dd8f2ce6faf93147295c0df13c7c21141cfbdd"
+  integrity sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==
 
-commander@^2.9.0:
-  version "2.20.0"
-  resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422"
-  integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==
+commander@^9.0.0:
+  version "9.5.0"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30"
+  integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==
 
 concat-map@0.0.1:
   version "0.0.1"
   resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
   integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
 
-core-js@^2.6.5:
-  version "2.6.9"
-  resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2"
-  integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==
-
 core-util-is@1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
   integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
 
-cross-spawn@^6.0.5:
-  version "6.0.5"
-  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
-  integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
-  dependencies:
-    nice-try "^1.0.4"
-    path-key "^2.0.1"
-    semver "^5.5.0"
-    shebang-command "^1.2.0"
-    which "^1.2.9"
-
-cucumber-expressions@^6.0.0:
-  version "6.6.2"
-  resolved "https://registry.yarnpkg.com/cucumber-expressions/-/cucumber-expressions-6.6.2.tgz#d89640eccc72a78380b6c210eae36a64e7462b81"
-  integrity sha512-WcFSVBiWNLJbIcAAC3t/ACU46vaOKfe1UIF5H3qveoq+Y4XQm9j3YwHurQNufRKBBg8nCnpU7Ttsx7egjS3hwA==
-  dependencies:
-    becke-ch--regex--s0-0-v1--base--pl--lib "^1.2.0"
-
-cucumber-tag-expressions@^1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/cucumber-tag-expressions/-/cucumber-tag-expressions-1.1.1.tgz#7f5c7b70009bc2b666591bfe64854578bedee85a"
-  integrity sha1-f1x7cACbwrZmWRv+ZIVFeL7e6Fo=
-
-cucumber@^5.1.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/cucumber/-/cucumber-5.1.0.tgz#7b166812c255bec7eac4b0df7007a40d089c895d"
-  integrity sha512-zrl2VYTBRgvxucwV2GKAvLqcfA1Naeax8plPvWgPEzl3SCJiuPPv3WxBHIRHtPYcEdbHDR6oqLpZP4bJ8UIdmA==
-  dependencies:
-    "@babel/polyfill" "^7.2.3"
-    assertion-error-formatter "^2.0.1"
-    bluebird "^3.4.1"
-    cli-table3 "^0.5.1"
-    colors "^1.1.2"
-    commander "^2.9.0"
-    cross-spawn "^6.0.5"
-    cucumber-expressions "^6.0.0"
-    cucumber-tag-expressions "^1.1.1"
-    duration "^0.2.1"
-    escape-string-regexp "^1.0.5"
-    figures "2.0.0"
-    gherkin "^5.0.0"
-    glob "^7.1.3"
-    indent-string "^3.1.0"
-    is-generator "^1.0.2"
-    is-stream "^1.1.0"
-    knuth-shuffle-seeded "^1.0.6"
-    lodash "^4.17.10"
-    mz "^2.4.0"
-    progress "^2.0.0"
-    resolve "^1.3.3"
-    serialize-error "^3.0.0"
-    stack-chain "^2.0.0"
-    stacktrace-js "^2.0.0"
-    string-argv "0.1.1"
-    title-case "^2.1.1"
-    util-arity "^1.0.2"
-    verror "^1.9.0"
-
-d@1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
-  integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
+debug@^4.3.4:
+  version "4.3.4"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
+  integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
   dependencies:
-    es5-ext "^0.10.50"
-    type "^1.0.1"
+    ms "2.1.2"
 
 deep-eql@^3.0.1:
   version "3.0.1"
@@ -215,51 +312,27 @@ deep-eql@^3.0.1:
   dependencies:
     type-detect "^4.0.0"
 
-diff@^3.0.0:
-  version "3.5.0"
-  resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
-  integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==
-
-duration@^0.2.1:
-  version "0.2.2"
-  resolved "https://registry.yarnpkg.com/duration/-/duration-0.2.2.tgz#ddf149bc3bc6901150fe9017111d016b3357f529"
-  integrity sha512-06kgtea+bGreF5eKYgI/36A6pLXggY7oR4p1pq4SmdFBn1ReOL5D8RhG64VrqfTTKNucqqtBAwEj8aB88mcqrg==
-  dependencies:
-    d "1"
-    es5-ext "~0.10.46"
-
-error-stack-parser@^2.0.1:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.3.tgz#9d3c000fb9f5c461f7c4e63c1aa75373ac7aaa36"
-  integrity sha512-vRC4rKv87twMZy92X4+TmUdv3iYMsmePbpG/YguHsfzmZ8bYJZYYep7yrXH09yFUaCEPKgNK5X79+Yq7hwLVOA==
-  dependencies:
-    stackframe "^1.0.4"
+define-lazy-prop@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f"
+  integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==
 
-es5-ext@^0.10.35, es5-ext@^0.10.50, es5-ext@~0.10.14, es5-ext@~0.10.46:
-  version "0.10.51"
-  resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.51.tgz#ed2d7d9d48a12df86e0299287e93a09ff478842f"
-  integrity sha512-oRpWzM2WcLHVKpnrcyB7OW8j/s67Ba04JCm0WnNv3RiABSvs7mrQlutB8DBv793gKcp0XENR8Il8WxGTlZ73gQ==
-  dependencies:
-    es6-iterator "~2.0.3"
-    es6-symbol "~3.1.1"
-    next-tick "^1.0.0"
+diff@^4.0.1:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
+  integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
 
-es6-iterator@~2.0.3:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
-  integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c=
-  dependencies:
-    d "1"
-    es5-ext "^0.10.35"
-    es6-symbol "^3.1.1"
+emoji-regex@^8.0.0:
+  version "8.0.0"
+  resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+  integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
 
-es6-symbol@^3.1.1, es6-symbol@~3.1.1:
-  version "3.1.1"
-  resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
-  integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=
+error-stack-parser@^2.1.4:
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286"
+  integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==
   dependencies:
-    d "1"
-    es5-ext "~0.10.14"
+    stackframe "^1.3.4"
 
 escape-string-regexp@^1.0.5:
   version "1.0.5"
@@ -271,10 +344,10 @@ extsprintf@^1.2.0:
   resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
   integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
 
-figures@2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
-  integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=
+figures@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af"
+  integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==
   dependencies:
     escape-string-regexp "^1.0.5"
 
@@ -285,14 +358,14 @@ find@^0.3.0:
   dependencies:
     traverse-chain "~0.1.0"
 
-fs-extra@^8.1.0:
-  version "8.1.0"
-  resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
-  integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
+fs-extra@^11.1.0:
+  version "11.1.0"
+  resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.0.tgz#5784b102104433bb0e090f48bfc4a30742c357ed"
+  integrity sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==
   dependencies:
     graceful-fs "^4.2.0"
-    jsonfile "^4.0.0"
-    universalify "^0.1.0"
+    jsonfile "^6.0.1"
+    universalify "^2.0.0"
 
 fs.realpath@^1.0.0:
   version "1.0.0"
@@ -304,11 +377,6 @@ get-func-name@^2.0.0:
   resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41"
   integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=
 
-gherkin@^5.0.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/gherkin/-/gherkin-5.1.0.tgz#684bbb03add24eaf7bdf544f58033eb28fb3c6d5"
-  integrity sha1-aEu7A63STq9731RPWAM+so+zxtU=
-
 glob@^7.1.3:
   version "7.1.4"
   resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255"
@@ -321,20 +389,46 @@ glob@^7.1.3:
     once "^1.3.0"
     path-is-absolute "^1.0.0"
 
+glob@^7.1.6:
+  version "7.2.3"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
+  integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.1.1"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+global-dirs@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485"
+  integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==
+  dependencies:
+    ini "2.0.0"
+
 graceful-fs@^4.1.6, graceful-fs@^4.2.0:
   version "4.2.2"
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02"
   integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==
 
-has-flag@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
-  integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+has-ansi@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-4.0.1.tgz#f216a8c8d7b129e490dc15f4a62cc1cdb9603ce8"
+  integrity sha512-Qr4RtTm30xvEdqUXbSBVWDu+PrTokJOwe/FU+VdfJPk+MXAPoeOzKpRyrDTnZIJwAkQ4oBLTU53nu0HrkF/Z2A==
+  dependencies:
+    ansi-regex "^4.1.0"
 
-indent-string@^3.1.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289"
-  integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=
+has-flag@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+  integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+indent-string@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
+  integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
 
 inflight@^1.0.4:
   version "1.0.6"
@@ -349,49 +443,57 @@ inherits@2:
   resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
   integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
 
-is-fullwidth-code-point@^2.0.0:
+ini@2.0.0:
   version "2.0.0"
-  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
-  integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
+  resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5"
+  integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==
 
-is-generator@^1.0.2:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/is-generator/-/is-generator-1.0.3.tgz#c14c21057ed36e328db80347966c693f886389f3"
-  integrity sha1-wUwhBX7TbjKNuANHlmxpP4hjifM=
+is-docker@^2.0.0, is-docker@^2.1.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa"
+  integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
 
-is-stream@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
-  integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
+is-fullwidth-code-point@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+  integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
 
-is-wsl@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
-  integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=
+is-installed-globally@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520"
+  integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==
+  dependencies:
+    global-dirs "^3.0.0"
+    is-path-inside "^3.0.2"
 
-isexe@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
-  integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+is-path-inside@^3.0.2:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
+  integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
 
-js-base64@^2.3.2:
-  version "2.5.1"
-  resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.1.tgz#1efa39ef2c5f7980bb1784ade4a8af2de3291121"
-  integrity sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==
+is-stream@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
+  integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
 
-jsonfile@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
-  integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
-  optionalDependencies:
-    graceful-fs "^4.1.6"
+is-wsl@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
+  integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
+  dependencies:
+    is-docker "^2.0.0"
 
-jsonfile@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-5.0.0.tgz#e6b718f73da420d612823996fdf14a03f6ff6922"
-  integrity sha512-NQRZ5CRo74MhMMC3/3r5g2k4fjodJ/wh8MxjFbCViWKFjxrnudWSY5vomh+23ZaXzAS7J3fBZIR2dV6WbmfM0w==
+js-base64@^3.7.3:
+  version "3.7.5"
+  resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-3.7.5.tgz#21e24cf6b886f76d6f5f165bfcd69cc55b9e3fca"
+  integrity sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==
+
+jsonfile@^6.0.1, jsonfile@^6.1.0:
+  version "6.1.0"
+  resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
+  integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
   dependencies:
-    universalify "^0.1.2"
+    universalify "^2.0.0"
   optionalDependencies:
     graceful-fs "^4.1.6"
 
@@ -402,20 +504,49 @@ knuth-shuffle-seeded@^1.0.6:
   dependencies:
     seed-random "~2.2.0"
 
+lodash-es@^4.17.21:
+  version "4.17.21"
+  resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee"
+  integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
+
+lodash.merge@^4.6.2:
+  version "4.6.2"
+  resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
+  integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
+
+lodash.mergewith@^4.6.2:
+  version "4.6.2"
+  resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55"
+  integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==
+
 lodash.toarray@^4.4.0:
   version "4.4.0"
   resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561"
   integrity sha1-JMS/zWsvuji/0FlNsRedjptlZWE=
 
-lodash@^4.17.10, lodash@^4.17.11:
+lodash@^4.17.11, lodash@^4.17.21:
   version "4.17.21"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
   integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
 
-lower-case@^1.1.1:
-  version "1.1.4"
-  resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac"
-  integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw=
+lower-case@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28"
+  integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==
+  dependencies:
+    tslib "^2.0.3"
+
+lru-cache@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+  integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+  dependencies:
+    yallist "^4.0.0"
+
+luxon@3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.2.1.tgz#14f1af209188ad61212578ea7e3d518d18cee45f"
+  integrity sha512-QrwPArQCNLAKGO/C+ZIilgIuDnEnKx5QYODdDtbFaxzsbZcc/a7WFq7MhsVYgRlwawLtvOUESTlfJ+hc/USqPg==
 
 minimatch@^3.0.4:
   version "3.0.4"
@@ -424,7 +555,19 @@ minimatch@^3.0.4:
   dependencies:
     brace-expansion "^1.1.7"
 
-mz@^2.4.0:
+minimatch@^3.1.1:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
+  integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+  dependencies:
+    brace-expansion "^1.1.7"
+
+ms@2.1.2:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+  integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+mz@^2.7.0:
   version "2.7.0"
   resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"
   integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==
@@ -433,22 +576,18 @@ mz@^2.4.0:
     object-assign "^4.0.1"
     thenify-all "^1.0.0"
 
-next-tick@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
-  integrity sha1-yobR/ogoFpsBICCOPchCS524NCw=
-
-nice-try@^1.0.4:
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
-  integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
+nanoclone@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/nanoclone/-/nanoclone-0.2.1.tgz#dd4090f8f1a110d26bb32c49ed2f5b9235209ed4"
+  integrity sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==
 
-no-case@^2.2.0:
-  version "2.3.2"
-  resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac"
-  integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==
+no-case@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d"
+  integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==
   dependencies:
-    lower-case "^1.1.1"
+    lower-case "^2.0.2"
+    tslib "^2.0.3"
 
 node-emoji@^1.10.0:
   version "1.10.0"
@@ -457,7 +596,7 @@ node-emoji@^1.10.0:
   dependencies:
     lodash.toarray "^4.4.0"
 
-object-assign@^4.0.1, object-assign@^4.1.0:
+object-assign@^4.0.1:
   version "4.1.1"
   resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
   integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
@@ -469,12 +608,14 @@ once@^1.3.0:
   dependencies:
     wrappy "1"
 
-open@^6.4.0:
-  version "6.4.0"
-  resolved "https://registry.yarnpkg.com/open/-/open-6.4.0.tgz#5c13e96d0dc894686164f18965ecfe889ecfc8a9"
-  integrity sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==
+open@^8.4.0:
+  version "8.4.2"
+  resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9"
+  integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==
   dependencies:
-    is-wsl "^1.1.0"
+    define-lazy-prop "^2.0.0"
+    is-docker "^2.1.1"
+    is-wsl "^2.2.0"
 
 pad-right@^0.2.2:
   version "0.2.2"
@@ -488,135 +629,131 @@ path-is-absolute@^1.0.0:
   resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
   integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
 
-path-key@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
-  integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
-
-path-parse@^1.0.6:
-  version "1.0.7"
-  resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
-  integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
-
 pathval@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0"
   integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA=
 
-progress@^2.0.0:
+progress@^2.0.3:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
   integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
 
-regenerator-runtime@^0.13.2:
-  version "0.13.3"
-  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5"
-  integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==
+property-expr@^2.0.4:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-2.0.5.tgz#278bdb15308ae16af3e3b9640024524f4dc02cb4"
+  integrity sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==
+
+reflect-metadata@0.1.13:
+  version "0.1.13"
+  resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08"
+  integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==
+
+regenerator-runtime@^0.13.11:
+  version "0.13.11"
+  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9"
+  integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==
+
+regexp-match-indices@1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/regexp-match-indices/-/regexp-match-indices-1.0.2.tgz#cf20054a6f7d5b3e116a701a7b00f82889d10da6"
+  integrity sha512-DwZuAkt8NF5mKwGGER1EGh2PRqyvhRhhLviH+R8y8dIuaQROlUfXjt4s9ZTXstIsSkptf06BSvwcEmmfheJJWQ==
+  dependencies:
+    regexp-tree "^0.1.11"
+
+regexp-tree@^0.1.11:
+  version "0.1.24"
+  resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.24.tgz#3d6fa238450a4d66e5bc9c4c14bb720e2196829d"
+  integrity sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==
 
 repeat-string@^1.5.2, repeat-string@^1.6.1:
   version "1.6.1"
   resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
   integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
 
-resolve@^1.3.3:
-  version "1.12.0"
-  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6"
-  integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==
+resolve-from@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
+  integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
+
+resolve-pkg@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/resolve-pkg/-/resolve-pkg-2.0.0.tgz#ac06991418a7623edc119084edc98b0e6bf05a41"
+  integrity sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ==
+  dependencies:
+    resolve-from "^5.0.0"
+
+rimraf@^3.0.0:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+  integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
   dependencies:
-    path-parse "^1.0.6"
+    glob "^7.1.3"
 
 seed-random@~2.2.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/seed-random/-/seed-random-2.2.0.tgz#2a9b19e250a817099231a5b99a4daf80b7fbed54"
   integrity sha1-KpsZ4lCoFwmSMaW5mk2vgLf77VQ=
 
-semver@^5.5.0:
-  version "5.7.1"
-  resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
-  integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
-
-serialize-error@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-3.0.0.tgz#80100282b09be33c611536f50033481cb9cc87cf"
-  integrity sha512-+y3nkkG/go1Vdw+2f/+XUXM1DXX1XcxTl99FfiD/OEPUNw4uo0i6FKABfTAN5ZcgGtjTRZcEbxcE/jtXbEY19A==
-
-shebang-command@^1.2.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
-  integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
+semver@7.3.8:
+  version "7.3.8"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798"
+  integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==
   dependencies:
-    shebang-regex "^1.0.0"
+    lru-cache "^6.0.0"
 
-shebang-regex@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
-  integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
-
-source-map@0.5.6:
-  version "0.5.6"
-  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412"
-  integrity sha1-dc449SvwczxafwwRjYEzSiu19BI=
-
-stack-chain@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/stack-chain/-/stack-chain-2.0.0.tgz#d73d1172af89565f07438b5bcc086831b6689b2d"
-  integrity sha512-GGrHXePi305aW7XQweYZZwiRwR7Js3MWoK/EHzzB9ROdc75nCnjSJVi21rdAGxFl+yCx2L2qdfl5y7NO4lTyqg==
-
-stack-generator@^2.0.1:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/stack-generator/-/stack-generator-2.0.3.tgz#bb74385c67ffc4ccf3c4dee5831832d4e509c8a0"
-  integrity sha512-kdzGoqrnqsMxOEuXsXyQTmvWXZmG0f3Ql2GDx5NtmZs59sT2Bt9Vdyq0XdtxUi58q/+nxtbF9KOQ9HkV1QznGg==
+source-map-support@0.5.21, source-map-support@^0.5.21:
+  version "0.5.21"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
+  integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
   dependencies:
-    stackframe "^1.0.4"
+    buffer-from "^1.0.0"
+    source-map "^0.6.0"
 
-stackframe@^1.0.4:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.0.4.tgz#357b24a992f9427cba6b545d96a14ed2cbca187b"
-  integrity sha512-to7oADIniaYwS3MhtCa/sQhrxidCCQiF/qp4/m5iN3ipf0Y7Xlri0f6eG29r08aL7JYl8n32AF3Q5GYBZ7K8vw==
+source-map@^0.6.0:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+  integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
 
-stacktrace-gps@^3.0.1:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/stacktrace-gps/-/stacktrace-gps-3.0.2.tgz#33f8baa4467323ab2bd1816efa279942ba431ccc"
-  integrity sha512-9o+nWhiz5wFnrB3hBHs2PTyYrS60M1vvpSzHxwxnIbtY2q9Nt51hZvhrG1+2AxD374ecwyS+IUwfkHRE/2zuGg==
-  dependencies:
-    source-map "0.5.6"
-    stackframe "^1.0.4"
+stackframe@^1.3.4:
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310"
+  integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==
 
-stacktrace-js@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/stacktrace-js/-/stacktrace-js-2.0.0.tgz#776ca646a95bc6c6b2b90776536a7fc72c6ddb58"
-  integrity sha1-d2ymRqlbxsayuQd2U2p/xyxt21g=
-  dependencies:
-    error-stack-parser "^2.0.1"
-    stack-generator "^2.0.1"
-    stacktrace-gps "^3.0.1"
+string-argv@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da"
+  integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==
 
-string-argv@0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.1.1.tgz#66bd5ae3823708eaa1916fa5412703150d4ddfaf"
-  integrity sha512-El1Va5ehZ0XTj3Ekw4WFidXvTmt9SrC0+eigdojgtJMVtPkF0qbBe9fyNSl9eQf+kUHnTSQxdQYzuHfZy8V+DQ==
+string-width@^4.2.0:
+  version "4.2.3"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+  integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+  dependencies:
+    emoji-regex "^8.0.0"
+    is-fullwidth-code-point "^3.0.0"
+    strip-ansi "^6.0.1"
 
-string-width@^2.1.1:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
-  integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
+strip-ansi@6.0.1, strip-ansi@^6.0.1:
+  version "6.0.1"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+  integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
   dependencies:
-    is-fullwidth-code-point "^2.0.0"
-    strip-ansi "^4.0.0"
+    ansi-regex "^5.0.1"
 
-strip-ansi@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
-  integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
+supports-color@^7.1.0:
+  version "7.2.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+  integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
   dependencies:
-    ansi-regex "^3.0.0"
+    has-flag "^4.0.0"
 
-supports-color@^5.3.0:
-  version "5.5.0"
-  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
-  integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+supports-color@^8.1.1:
+  version "8.1.1"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
+  integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
   dependencies:
-    has-flag "^3.0.0"
+    has-flag "^4.0.0"
 
 thenify-all@^1.0.0:
   version "1.6.0"
@@ -632,66 +769,93 @@ thenify-all@^1.0.0:
   dependencies:
     any-promise "^1.0.0"
 
-title-case@^2.1.1:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/title-case/-/title-case-2.1.1.tgz#3e127216da58d2bc5becf137ab91dae3a7cd8faa"
-  integrity sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o=
+tmp@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14"
+  integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==
   dependencies:
-    no-case "^2.2.0"
-    upper-case "^1.0.3"
+    rimraf "^3.0.0"
+
+toposort@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330"
+  integrity sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==
 
 traverse-chain@~0.1.0:
   version "0.1.0"
   resolved "https://registry.yarnpkg.com/traverse-chain/-/traverse-chain-0.1.0.tgz#61dbc2d53b69ff6091a12a168fd7d433107e40f1"
   integrity sha1-YdvC1Ttp/2CRoSoWj9fUMxB+QPE=
 
+tslib@^2.0.3:
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf"
+  integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==
+
 type-detect@^4.0.0, type-detect@^4.0.5:
   version "4.0.8"
   resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
   integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
 
-type@^1.0.1:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/type/-/type-1.0.3.tgz#16f5d39f27a2d28d86e48f8981859e9d3296c179"
-  integrity sha512-51IMtNfVcee8+9GJvj0spSuFcZHe9vSib6Xtgsny1Km9ugyz2mbS08I3rsUIRYgJohFRFU1160sgRodYz378Hg==
-
-universalify@^0.1.0, universalify@^0.1.2:
-  version "0.1.2"
-  resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
-  integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+universalify@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
+  integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
 
-upper-case@^1.0.3:
-  version "1.1.3"
-  resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598"
-  integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=
+upper-case-first@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-2.0.2.tgz#992c3273f882abd19d1e02894cc147117f844324"
+  integrity sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==
+  dependencies:
+    tslib "^2.0.3"
 
-util-arity@^1.0.2:
+util-arity@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/util-arity/-/util-arity-1.1.0.tgz#59d01af1fdb3fede0ac4e632b0ab5f6ce97c9330"
-  integrity sha1-WdAa8f2z/t4KxOYysKtfbOl8kzA=
+  integrity sha512-kkyIsXKwemfSy8ZEoaIz06ApApnWsk5hQO0vLjZS6UkBiGiW++Jsyb8vSBoc0WKlffGoGs5yYy/j5pp8zckrFA==
 
-uuid@^3.3.3:
-  version "3.3.3"
-  resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866"
-  integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==
+uuid@9.0.0, uuid@^9.0.0:
+  version "9.0.0"
+  resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5"
+  integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==
 
-verror@^1.9.0:
-  version "1.10.0"
-  resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
-  integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
+verror@^1.10.0:
+  version "1.10.1"
+  resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.1.tgz#4bf09eeccf4563b109ed4b3d458380c972b0cdeb"
+  integrity sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==
   dependencies:
     assert-plus "^1.0.0"
     core-util-is "1.0.2"
     extsprintf "^1.2.0"
 
-which@^1.2.9:
-  version "1.3.1"
-  resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
-  integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
-  dependencies:
-    isexe "^2.0.0"
-
 wrappy@1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
   integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+xmlbuilder@^15.1.1:
+  version "15.1.1"
+  resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5"
+  integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==
+
+yallist@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+  integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yaml@1.10.2:
+  version "1.10.2"
+  resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
+  integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
+
+yup@^0.32.11:
+  version "0.32.11"
+  resolved "https://registry.yarnpkg.com/yup/-/yup-0.32.11.tgz#d67fb83eefa4698607982e63f7ca4c5ed3cf18c5"
+  integrity sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==
+  dependencies:
+    "@babel/runtime" "^7.15.4"
+    "@types/lodash" "^4.14.175"
+    lodash "^4.17.21"
+    lodash-es "^4.17.21"
+    nanoclone "^0.2.1"
+    property-expr "^2.0.4"
+    toposort "^2.0.2"

From 226eef65897973f8524c520d20371e1f9badb485 Mon Sep 17 00:00:00 2001
From: LarryG 
Date: Wed, 1 Mar 2023 12:47:51 +0000
Subject: [PATCH 2/3] feat(upgrade): upgraded to use cucumber v8 and all other
 dependencies

---
 .eslintrc                              |  7 +++++++
 CHANGELOG.md                           |  5 +++++
 README.md                              | 27 +++++++++++++++++++-------
 coding-Standards/eslint/.eslintrc.json |  1 +
 package.json                           | 12 ++++++++++++
 5 files changed, 45 insertions(+), 7 deletions(-)
 create mode 100755 .eslintrc

diff --git a/.eslintrc b/.eslintrc
new file mode 100755
index 0000000..ca8b3a5
--- /dev/null
+++ b/.eslintrc
@@ -0,0 +1,7 @@
+{
+    // most folder contexts extend rules in a language-specific way (e.g. src, lambda) so these are a catch-all for other folders
+    "root":true,
+    "extends": [
+        "./coding-standards/eslint/.eslintrc.json"
+    ]
+}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2d3af3a..03ecee2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+### 6.0.0 (Mar-02-2023)
+* upgraded to be compatible with cucumber v8.9.1
+* upgraded all other dependencies to their latest versions
+
+
 ### 5.1.0 (Dec-15-2019)
 
 * Bootstrap theme filters [#198](https://github.com/gkushang/cucumber-html-reporter/pull/198) by [@srbarrios](https://github.com/srbarrios/)
diff --git a/README.md b/README.md
index 142250a..396cdc4 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
 
 ***Generate Cucumber HTML reports with pie charts***
 
-[![Build Status](https://travis-ci.org/gkushang/cucumber-html-reporter.svg?branch=develop)](https://travis-ci.org/gkushang/cucumber-html-reporter) [![npm](https://img.shields.io/npm/v/cucumber-html-reporter.svg)](https://www.npmjs.com/package/cucumber-html-reporter)  [![Dependency Status](https://david-dm.org/gkushang/cucumber-html-reporter.svg)](https://david-dm.org/gkushang/cucumber-html-reporter) [![Code Climate](https://codeclimate.com/github/gkushang/cucumber-html-reporter/badges/gpa.svg)](https://codeclimate.com/github/gkushang/cucumber-html-reporter) [![License](https://img.shields.io/npm/l/cucumber-html-reporter.svg)](LICENSE) [![contributors](https://img.shields.io/github/contributors/gkushang/cucumber-html-reporter.svg)](https://github.com/gkushang/cucumber-html-reporter/graphs/contributors)
+[![Build Status](https://travis-ci.org/gkushang/cucumber-html-reporter.svg?branch=develop)](https://travis-ci.org/gkushang/cucumber-html-reporter) [![npm](https://img.shields.io/npm/v/cucumber-html-reporter.svg)](https://www.npmjs.com/package/cucumber-html-reporter) [![Code Climate](https://codeclimate.com/github/gkushang/cucumber-html-reporter/badges/gpa.svg)](https://codeclimate.com/github/gkushang/cucumber-html-reporter) [![License](https://img.shields.io/npm/l/cucumber-html-reporter.svg)](LICENSE) [![contributors](https://img.shields.io/github/contributors/gkushang/cucumber-html-reporter.svg)](https://github.com/gkushang/cucumber-html-reporter/graphs/contributors)
 
 
 > Available HTML themes: `['bootstrap', 'hierarchy', 'foundation', 'simple']`
@@ -30,7 +30,8 @@ npm install cucumber-html-reporter --save-dev
 
 ***Notes:***
 
-* Latest version supports Cucumber 3
+* Latest version supports Cucumber 8
+* Install `cucumber-html-reporter@5.5.0` for cucumber version `< Cucumber@8`
 * Install `cucumber-html-reporter@2.0.3` for cucumber version `< Cucumber@3`
 * Install `cucumber-html-reporter@0.5.0` for cucumber version `< Cucumber@2`
 * Install `cucumber-html-reporter@0.4.0` for node version <0.12
@@ -40,7 +41,7 @@ npm install cucumber-html-reporter --save-dev
 
 Let's get you started:
 
-1. Install the package through npm 
+1. Install the package through npm or yarn
 2. Create an index.js and specify the options. Example of `bootstrap` theme:
 
 ```js
@@ -249,12 +250,15 @@ Pass the _Key-Value_ pair as per your need, as shown in below example,
 
 Capture and Attach screenshots to the Cucumber Scenario and HTML report will render the screenshot image
 
-**for Cucumber V1**
+**for Cucumber V8**
 ```javascript
 
-  driver.takeScreenshot().then(function (buffer) {
-    return scenario.attach(new Buffer(buffer, 'base64'), 'image/png');
-  };
+  let world = this;
+
+  return browser.takeScreenshot().then((screenShot) => {
+      // screenShot is a base-64 encoded PNG
+      world.attach(screenShot, 'image/png');
+  });
 
 ```
 
@@ -269,6 +273,15 @@ Capture and Attach screenshots to the Cucumber Scenario and HTML report will ren
 
 ```
 
+**for Cucumber V1**
+```javascript
+
+  driver.takeScreenshot().then(function (buffer) {
+    return scenario.attach(new Buffer(buffer, 'base64'), 'image/png');
+  };
+
+```
+
 #### Attach Plain Text to HTML report
 
 Attach plain-texts/data to HTML report to help debug/review the results
diff --git a/coding-Standards/eslint/.eslintrc.json b/coding-Standards/eslint/.eslintrc.json
index 72fa282..727bcc1 100755
--- a/coding-Standards/eslint/.eslintrc.json
+++ b/coding-Standards/eslint/.eslintrc.json
@@ -1,4 +1,5 @@
 {
+    "root": true,
     "env": {
         "browser": true,
         "commonjs": true,
diff --git a/package.json b/package.json
index 1e96399..4ba10f0 100644
--- a/package.json
+++ b/package.json
@@ -140,6 +140,18 @@
     {
       "name": "Fabienmrqs ",
       "url": "https://github.com/Fabienmrqs"
+    },
+    {
+      "name": "carlosbermejop",
+      "url": "https://github.com/carlosbermejop"
+    },
+    {
+      "name": "BatsFanatic",
+      "url": "https://github.com/BatsFanatic"
+    },
+    {
+      "name": "larryG",
+      "url": "https://github.com/larryg01"
     }
   ],
   "repository": {

From e3d9cb6ed1170766ca2344ba4807231bec8a1025 Mon Sep 17 00:00:00 2001
From: LarryG 
Date: Wed, 1 Mar 2023 12:51:11 +0000
Subject: [PATCH 3/3] feat(upgrade): upgraded to use cucumber v8 and all other
 dependencies

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 396cdc4..41ff173 100644
--- a/README.md
+++ b/README.md
@@ -255,7 +255,7 @@ Capture and Attach screenshots to the Cucumber Scenario and HTML report will ren
 
   let world = this;
 
-  return browser.takeScreenshot().then((screenShot) => {
+  return driver.takeScreenshot().then((screenShot) => {
       // screenShot is a base-64 encoded PNG
       world.attach(screenShot, 'image/png');
   });