Socket
Socket
Sign inDemoInstall

email-templates

Package Overview
Dependencies
Maintainers
1
Versions
137
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

email-templates - npm Package Compare versions

Comparing version 5.1.0 to 6.0.0

303

lib/index.js
"use strict";
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
const fs = require('fs');
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
const path = require('path');
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
const I18N = require('@ladjs/i18n');
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
const _ = require('lodash');
const fs = require('fs');
const autoBind = require('auto-bind');
const path = require('path');
const consolidate = require('consolidate');
const juice = require('juice');
const debug = require('debug')('email-templates');
const getPaths = require('get-paths');
const htmlToText = require('html-to-text');
const I18N = require('@ladjs/i18n');
const is = require('@sindresorhus/is');
const autoBind = require('auto-bind');
const juice = require('juice');
const nodemailer = require('nodemailer');
const consolidate = require('consolidate');
const pify = require('pify');
const previewEmail = require('preview-email');
const previewEmail = require('preview-email'); // promise version of `juice.juiceResources`
const _ = require('lodash');
const _Promise = require('bluebird');
const s = require('underscore.string');
const getPaths = require('get-paths'); // promise version of `juice.juiceResources`
const juiceResources = (html, options) => {
return new _Promise((resolve, reject) => {
return new Promise((resolve, reject) => {
juice.juiceResources(html, options, (err, html) => {

@@ -54,7 +46,5 @@ if (err) return reject(err);

const env = (process.env.NODE_ENV || 'development').toLowerCase();
const stat = pify(fs.stat);
const readFile = pify(fs.readFile);
const stat = _Promise.promisify(fs.stat);
const readFile = _Promise.promisify(fs.readFile);
class Email {

@@ -144,18 +134,10 @@ constructor(config = {}) {

getTemplatePath(template) {
var _this = this;
return _asyncToGenerator(function* () {
const _ref = path.isAbsolute(template) ? [path.dirname(template), path.basename(template)] : [_this.config.views.root, template],
_ref2 = _slicedToArray(_ref, 2),
root = _ref2[0],
view = _ref2[1];
const paths = yield getPaths(root, view, _this.config.views.options.extension);
const filePath = path.resolve(root, paths.rel);
return {
filePath,
paths
};
})();
async getTemplatePath(template) {
const [root, view] = path.isAbsolute(template) ? [path.dirname(template), path.basename(template)] : [this.config.views.root, template];
const paths = await getPaths(root, view, this.config.views.options.extension);
const filePath = path.resolve(root, paths.rel);
return {
filePath,
paths
};
} // returns true or false if a template exists

@@ -165,18 +147,27 @@ // (uses same look-up approach as `render` function)

templateExists(view) {
var _this2 = this;
async templateExists(view) {
try {
const {
filePath
} = await this.getTemplatePath(view);
const stats = await stat(filePath);
if (!stats.isFile()) throw new Error(`${filePath} was not a file`);
return true;
} catch (err) {
debug('templateExists', err);
return false;
}
}
return _asyncToGenerator(function* () {
try {
const _ref3 = yield _this2.getTemplatePath(view),
filePath = _ref3.filePath;
async checkAndRender(type, template, locals) {
const str = `${template}/${type}`;
const stats = yield stat(filePath);
if (!stats.isFile()) throw new Error(`${filePath} was not a file`);
return true;
} catch (err) {
debug('templateExists', err);
return false;
}
})();
if (!this.config.customRender) {
const exists = await this.templateExists(str);
if (!exists) return;
}
return this.render(str, _objectSpread({}, locals, type === 'html' ? {} : {
pretty: false
}));
} // promise version of consolidate's render

@@ -187,133 +178,105 @@ // inspired by koa-views and re-uses the same config

render(view, locals = {}) {
var _this3 = this;
async render(view, locals = {}) {
const {
map,
engineSource
} = this.config.views.options;
const {
filePath,
paths
} = await this.getTemplatePath(view);
return _asyncToGenerator(function* () {
const _this3$config$views$o = _this3.config.views.options,
map = _this3$config$views$o.map,
engineSource = _this3$config$views$o.engineSource;
if (paths.ext === 'html' && !map) {
const res = await readFile(filePath, 'utf8');
return res;
}
const _ref4 = yield _this3.getTemplatePath(view),
filePath = _ref4.filePath,
paths = _ref4.paths;
const engineName = map && map[paths.ext] ? map[paths.ext] : paths.ext;
const renderFn = engineSource[engineName];
if (!engineName || !renderFn) throw new Error(`Engine not found for the ".${paths.ext}" file extension`);
if (paths.ext === 'html' && !map) {
const res = yield readFile(filePath, 'utf8');
return res;
}
if (_.isObject(this.config.i18n)) {
const i18n = new I18N(_objectSpread({}, this.config.i18n, {
register: locals
})); // support `locals.user.last_locale`
// (e.g. for <https://lad.js.org>)
const engineName = map && map[paths.ext] ? map[paths.ext] : paths.ext;
const renderFn = engineSource[engineName];
if (!engineName || !renderFn) throw new Error(`Engine not found for the ".${paths.ext}" file extension`);
if (_.isObject(locals.user) && _.isString(locals.user.last_locale)) locals.locale = locals.user.last_locale;
if (_.isString(locals.locale)) i18n.setLocale(locals.locale);
}
if (_.isObject(_this3.config.i18n)) {
const i18n = new I18N(Object.assign({}, _this3.config.i18n, {
register: locals
})); // support `locals.user.last_locale`
// (e.g. for <https://lad.js.org>)
const res = await pify(renderFn)(filePath, locals); // transform the html with juice using remote paths
// google now supports media queries
// https://developers.google.com/gmail/design/reference/supported_css
if (_.isObject(locals.user) && _.isString(locals.user.last_locale)) locals.locale = locals.user.last_locale;
if (_.isString(locals.locale)) i18n.setLocale(locals.locale);
}
if (!this.config.juice) return res;
const html = await this.juiceResources(res);
return html;
}
const res = yield _Promise.promisify(renderFn)(filePath, locals); // transform the html with juice using remote paths
// google now supports media queries
// https://developers.google.com/gmail/design/reference/supported_css
async renderAll(template, locals = {}, nodemailerMessage = {}) {
const message = _objectSpread({}, nodemailerMessage);
if (!_this3.config.juice) return res;
const html = yield _this3.juiceResources(res);
return html;
})();
} // TODO: this needs refactored
// so that we render templates asynchronously
if (template) {
const [subject, html, text] = await Promise.all(['subject', 'html', 'text'].map(type => this.checkAndRender(type, template, locals)));
if (subject) message.subject = subject.trim();
if (html) message.html = html;
if (text) message.text = text;
}
if (message.subject && this.config.subjectPrefix) message.subject = this.config.subjectPrefix + message.subject;
if (this.config.htmlToText && message.html && !message.text) // we'd use nodemailer-html-to-text plugin
// but we really don't need to support cid
// <https://github.com/andris9/nodemailer-html-to-text>
message.text = htmlToText.fromString(message.html, this.config.htmlToText); // if we only want a text-based version of the email
renderAll(template, locals = {}, message = {}) {
var _this4 = this;
if (this.config.textOnly) delete message.html; // if no subject, html, or text content exists then we should
// throw an error that says at least one must be found
// otherwise the email would be blank (defeats purpose of email-templates)
return _asyncToGenerator(function* () {
let subjectTemplateExists = _this4.config.customRender;
let htmlTemplateExists = _this4.config.customRender;
let textTemplateExists = _this4.config.customRender;
if (template && !_this4.config.customRender) {
var _ref5 = yield _Promise.all([_this4.templateExists(`${template}/subject`), _this4.templateExists(`${template}/html`), _this4.templateExists(`${template}/text`)]);
var _ref6 = _slicedToArray(_ref5, 3);
subjectTemplateExists = _ref6[0];
htmlTemplateExists = _ref6[1];
textTemplateExists = _ref6[2];
}
if (!message.subject && subjectTemplateExists) {
message.subject = yield _this4.render(`${template}/subject`, Object.assign({}, locals, {
pretty: false
}));
message.subject = message.subject.trim();
}
if (message.subject && _this4.config.subjectPrefix) message.subject = _this4.config.subjectPrefix + message.subject;
if (!message.html && htmlTemplateExists) message.html = yield _this4.render(`${template}/html`, locals);
if (!message.text && textTemplateExists) message.text = yield _this4.render(`${template}/text`, Object.assign({}, locals, {
pretty: false
}));
if (_this4.config.htmlToText && message.html && !message.text) // we'd use nodemailer-html-to-text plugin
// but we really don't need to support cid
// <https://github.com/andris9/nodemailer-html-to-text>
message.text = htmlToText.fromString(message.html, _this4.config.htmlToText); // if we only want a text-based version of the email
if (_this4.config.textOnly) delete message.html; // if no subject, html, or text content exists then we should
// throw an error that says at least one must be found
// otherwise the email would be blank (defeats purpose of email-templates)
if (s.isBlank(message.subject) && s.isBlank(message.text) && s.isBlank(message.html) && _.isArray(message.attachments) && _.isEmpty(message.attachments)) throw new Error(`No content was passed for subject, html, text, nor attachments message props. Check that the files for the template "${template}" exist.`);
return message;
})();
if ((!is.string(message.subject) || is.emptyStringOrWhitespace(message.subject)) && (!is.string(message.text) || is.emptyStringOrWhitespace(message.text)) && (!is.string(message.html) || is.emptyStringOrWhitespace(message.html)) && _.isArray(message.attachments) && _.isEmpty(message.attachments)) throw new Error(`No content was passed for subject, html, text, nor attachments message props. Check that the files for the template "${template}" exist.`);
return message;
}
send(options = {}) {
var _this5 = this;
async send(options = {}) {
options = _objectSpread({
template: '',
message: {},
locals: {}
}, options);
let {
template,
message,
locals
} = options;
const attachments = message.attachments || this.config.message.attachments || [];
message = _.defaultsDeep({}, _.omit(message, 'attachments'), _.omit(this.config.message, 'attachments'));
locals = _.defaultsDeep({}, this.config.views.locals, locals);
if (attachments) message.attachments = attachments;
debug('template %s', template);
debug('message %O', message);
debug('locals (keys only): %O', Object.keys(locals)); // get all available templates
return _asyncToGenerator(function* () {
options = Object.assign({
template: '',
message: {},
locals: {}
}, options);
let _options = options,
template = _options.template,
message = _options.message,
locals = _options.locals;
const attachments = message.attachments || _this5.config.message.attachments || [];
message = _.defaultsDeep({}, _.omit(message, 'attachments'), _.omit(_this5.config.message, 'attachments'));
locals = _.defaultsDeep({}, _this5.config.views.locals, locals);
if (attachments) message.attachments = attachments;
debug('template %s', template);
debug('message %O', message);
debug('locals (keys only): %O', Object.keys(locals)); // get all available templates
const obj = await this.renderAll(template, locals, message); // assign the object variables over to the message
const obj = yield _this5.renderAll(template, locals, message); // assign the object variables over to the message
Object.assign(message, obj);
Object.assign(message, obj);
if (this.config.preview) {
debug('using `preview-email` to preview email');
if (_.isObject(this.config.preview)) await previewEmail(message, this.config.preview);else await previewEmail(message);
}
if (_this5.config.preview) {
debug('using `preview-email` to preview email');
if (_.isObject(_this5.config.preview)) yield previewEmail(message, null, true, _this5.config.preview);else yield previewEmail(message);
}
if (!this.config.send) {
debug('send disabled so we are ensuring JSONTransport'); // <https://github.com/nodemailer/nodemailer/issues/798>
// if (this.config.transport.name !== 'JSONTransport')
if (!_this5.config.send) {
debug('send disabled so we are ensuring JSONTransport'); // <https://github.com/nodemailer/nodemailer/issues/798>
// if (this.config.transport.name !== 'JSONTransport')
this.config.transport = nodemailer.createTransport({
jsonTransport: true
});
}
_this5.config.transport = nodemailer.createTransport({
jsonTransport: true
});
}
const res = yield _this5.config.transport.sendMail(message);
debug('message sent');
res.originalMessage = message;
return res;
})();
const res = await this.config.transport.sendMail(message);
debug('message sent');
res.originalMessage = message;
return res;
}

@@ -324,2 +287,2 @@

module.exports = Email;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJmcyIsInJlcXVpcmUiLCJwYXRoIiwianVpY2UiLCJkZWJ1ZyIsImh0bWxUb1RleHQiLCJJMThOIiwiYXV0b0JpbmQiLCJub2RlbWFpbGVyIiwiY29uc29saWRhdGUiLCJwcmV2aWV3RW1haWwiLCJfIiwiUHJvbWlzZSIsInMiLCJnZXRQYXRocyIsImp1aWNlUmVzb3VyY2VzIiwiaHRtbCIsIm9wdGlvbnMiLCJyZXNvbHZlIiwicmVqZWN0IiwiZXJyIiwiZW52IiwicHJvY2VzcyIsIk5PREVfRU5WIiwidG9Mb3dlckNhc2UiLCJzdGF0IiwicHJvbWlzaWZ5IiwicmVhZEZpbGUiLCJFbWFpbCIsImNvbnN0cnVjdG9yIiwiY29uZmlnIiwianVpY2VPcHRpb25zIiwiZGlzYWJsZUp1aWNlIiwicmVuZGVyIiwiY3VzdG9tUmVuZGVyIiwibWVyZ2UiLCJ2aWV3cyIsInJvb3QiLCJleHRlbnNpb24iLCJtYXAiLCJoYnMiLCJuamsiLCJlbmdpbmVTb3VyY2UiLCJsb2NhbHMiLCJjYWNoZSIsImluY2x1ZGVzIiwicHJldHR5IiwibWVzc2FnZSIsInNlbmQiLCJwcmV2aWV3IiwiaTE4biIsImJpbmQiLCJ0ZXh0T25seSIsImlnbm9yZUltYWdlIiwic3ViamVjdFByZWZpeCIsInByZXNlcnZlSW1wb3J0YW50Iiwid2ViUmVzb3VyY2VzIiwicmVsYXRpdmVUbyIsImltYWdlcyIsInRyYW5zcG9ydCIsImlzRnVuY3Rpb24iLCJzZW5kTWFpbCIsImNyZWF0ZVRyYW5zcG9ydCIsImdldFRlbXBsYXRlUGF0aCIsInRlbXBsYXRlIiwiaXNBYnNvbHV0ZSIsImRpcm5hbWUiLCJiYXNlbmFtZSIsInZpZXciLCJwYXRocyIsImZpbGVQYXRoIiwicmVsIiwidGVtcGxhdGVFeGlzdHMiLCJzdGF0cyIsImlzRmlsZSIsIkVycm9yIiwiZXh0IiwicmVzIiwiZW5naW5lTmFtZSIsInJlbmRlckZuIiwiaXNPYmplY3QiLCJPYmplY3QiLCJhc3NpZ24iLCJyZWdpc3RlciIsInVzZXIiLCJpc1N0cmluZyIsImxhc3RfbG9jYWxlIiwibG9jYWxlIiwic2V0TG9jYWxlIiwicmVuZGVyQWxsIiwic3ViamVjdFRlbXBsYXRlRXhpc3RzIiwiaHRtbFRlbXBsYXRlRXhpc3RzIiwidGV4dFRlbXBsYXRlRXhpc3RzIiwiYWxsIiwic3ViamVjdCIsInRyaW0iLCJ0ZXh0IiwiZnJvbVN0cmluZyIsImlzQmxhbmsiLCJpc0FycmF5IiwiYXR0YWNobWVudHMiLCJpc0VtcHR5IiwiZGVmYXVsdHNEZWVwIiwib21pdCIsImtleXMiLCJvYmoiLCJqc29uVHJhbnNwb3J0Iiwib3JpZ2luYWxNZXNzYWdlIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBQSxNQUFNQSxFQUFFLEdBQUdDLE9BQU8sQ0FBQyxJQUFELENBQWxCOztBQUNBLE1BQU1DLElBQUksR0FBR0QsT0FBTyxDQUFDLE1BQUQsQ0FBcEI7O0FBQ0EsTUFBTUUsS0FBSyxHQUFHRixPQUFPLENBQUMsT0FBRCxDQUFyQjs7QUFDQSxNQUFNRyxLQUFLLEdBQUdILE9BQU8sQ0FBQyxPQUFELENBQVAsQ0FBaUIsaUJBQWpCLENBQWQ7O0FBQ0EsTUFBTUksVUFBVSxHQUFHSixPQUFPLENBQUMsY0FBRCxDQUExQjs7QUFDQSxNQUFNSyxJQUFJLEdBQUdMLE9BQU8sQ0FBQyxhQUFELENBQXBCOztBQUNBLE1BQU1NLFFBQVEsR0FBR04sT0FBTyxDQUFDLFdBQUQsQ0FBeEI7O0FBQ0EsTUFBTU8sVUFBVSxHQUFHUCxPQUFPLENBQUMsWUFBRCxDQUExQjs7QUFDQSxNQUFNUSxXQUFXLEdBQUdSLE9BQU8sQ0FBQyxhQUFELENBQTNCOztBQUNBLE1BQU1TLFlBQVksR0FBR1QsT0FBTyxDQUFDLGVBQUQsQ0FBNUI7O0FBQ0EsTUFBTVUsQ0FBQyxHQUFHVixPQUFPLENBQUMsUUFBRCxDQUFqQjs7QUFDQSxNQUFNVyxRQUFPLEdBQUdYLE9BQU8sQ0FBQyxVQUFELENBQXZCOztBQUNB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LE9BQS9CLENBQWxCO0FBQ0EzQyxNQUFBQSxLQUFLLENBQUMsY0FBRCxDQUFMO0FBQ0F5RSxNQUFBQSxHQUFHLENBQUM4QixlQUFKLEdBQXNCNUQsT0FBdEI7QUFDQSxhQUFPOEIsR0FBUDtBQXJEdUI7QUFzRHhCOztBQTNSUzs7QUE4UlorQixNQUFNLENBQUNDLE9BQVAsR0FBaUJqRixLQUFqQiIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCBqdWljZSA9IHJlcXVpcmUoJ2p1aWNlJyk7XG5jb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJ2RlYnVnJykoJ2VtYWlsLXRlbXBsYXRlcycpO1xuY29uc3QgaHRtbFRvVGV4dCA9IHJlcXVpcmUoJ2h0bWwtdG8tdGV4dCcpO1xuY29uc3QgSTE4TiA9IHJlcXVpcmUoJ0BsYWRqcy9pMThuJyk7XG5jb25zdCBhdXRvQmluZCA9IHJlcXVpcmUoJ2F1dG8tYmluZCcpO1xuY29uc3Qgbm9kZW1haWxlciA9IHJlcXVpcmUoJ25vZGVtYWlsZXInKTtcbmNvbnN0IGNvbnNvbGlkYXRlID0gcmVxdWlyZSgnY29uc29saWRhdGUnKTtcbmNvbnN0IHByZXZpZXdFbWFpbCA9IHJlcXVpcmUoJ3ByZXZpZXctZW1haWwnKTtcbmNvbnN0IF8gPSByZXF1aXJlKCdsb2Rhc2gnKTtcbmNvbnN0IFByb21pc2UgPSByZXF1aXJlKCdibHVlYmlyZCcpO1xuY29uc3QgcyA9IHJlcXVpcmUoJ3VuZGVyc2NvcmUuc3RyaW5nJyk7XG5cbmNvbnN0IGdldFBhdGhzID0gcmVxdWlyZSgnZ2V0LXBhdGhzJyk7XG5cbi8vIHByb21pc2UgdmVyc2lvbiBvZiBganVpY2UuanVpY2VSZXNvdXJjZXNgXG5jb25zdCBqdWljZVJlc291cmNlcyA9IChodG1sLCBvcHRpb25zKSA9PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAganVpY2UuanVpY2VSZXNvdXJjZXMoaHRtbCwgb3B0aW9ucywgKGVyciwgaHRtbCkgPT4ge1xuICAgICAgaWYgKGVycikgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgcmVzb2x2ZShodG1sKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG5jb25zdCBlbnYgPSAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50JykudG9Mb3dlckNhc2UoKTtcbmNvbnN0IHN0YXQgPSBQcm9taXNlLnByb21pc2lmeShmcy5zdGF0KTtcbmNvbnN0IHJlYWRGaWxlID0gUHJvbWlzZS5wcm9taXNpZnkoZnMucmVhZEZpbGUpO1xuXG5jbGFzcyBFbWFpbCB7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZyA9IHt9KSB7XG4gICAgZGVidWcoJ2NvbmZpZyBwYXNzZWQgJU8nLCBjb25maWcpO1xuXG4gICAgLy8gMi54IGJhY2t3YXJkcyBjb21wYXRpYmxlIHN1cHBvcnRcbiAgICBpZiAoY29uZmlnLmp1aWNlT3B0aW9ucykge1xuICAgICAgY29uZmlnLmp1aWNlUmVzb3VyY2VzID0gY29uZmlnLmp1aWNlT3B0aW9ucztcbiAgICAgIGRlbGV0ZSBjb25maWcuanVpY2VPcHRpb25zO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGlzYWJsZUp1aWNlKSB7XG4gICAgICBjb25maWcuanVpY2UgPSBmYWxzZTtcbiAgICAgIGRlbGV0ZSBjb25maWcuZGlzYWJsZUp1aWNlO1xuICAgIH1cblxuICAgIGlmIChjb25maWcucmVuZGVyKSB7XG4gICAgICBjb25maWcuY3VzdG9tUmVuZGVyID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbmZpZyA9IF8ubWVyZ2UoXG4gICAgICB7XG4gICAgICAgIHZpZXdzOiB7XG4gICAgICAgICAgLy8gZGlyZWN0b3J5IHdoZXJlIGVtYWlsIHRlbXBsYXRlcyByZXNpZGVcbiAgICAgICAgICByb290OiBwYXRoLnJlc29sdmUoJ2VtYWlscycpLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIC8vIGRlZmF1bHQgZmlsZSBleHRlbnNpb24gZm9yIHRlbXBsYXRlXG4gICAgICAgICAgICBleHRlbnNpb246ICdwdWcnLFxuICAgICAgICAgICAgbWFwOiB7XG4gICAgICAgICAgICAgIGhiczogJ2hhbmRsZWJhcnMnLFxuICAgICAgICAgICAgICBuams6ICdudW5qdWNrcydcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmdpbmVTb3VyY2U6IGNvbnNvbGlkYXRlXG4gICAgICAgICAgfSxcbiAgICAgICAgICAvLyBsb2NhbHMgdG8gcGFzcyB0byB0ZW1wbGF0ZXMgZm9yIHJlbmRlcmluZ1xuICAgICAgICAgIGxvY2Fsczoge1xuICAgICAgICAgICAgLy8gdHVybiBvbiBjYWNoaW5nIGZvciBub24tZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzXG4gICAgICAgICAgICBjYWNoZTogIVsnZGV2ZWxvcG1lbnQnLCAndGVzdCddLmluY2x1ZGVzKGVudiksXG4gICAgICAgICAgICAvLyBwcmV0dHkgaXMgYXV0b21hdGljYWxseSBzZXQgdG8gYGZhbHNlYCBmb3Igc3ViamVjdC90ZXh0XG4gICAgICAgICAgICBwcmV0dHk6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIC8vIDxodHRwczovL25vZGVtYWlsZXIuY29tL21lc3NhZ2UvPlxuICAgICAgICBtZXNzYWdlOiB7fSxcbiAgICAgICAgc2VuZDogIVsnZGV2ZWxvcG1lbnQnLCAndGVzdCddLmluY2x1ZGVzKGVudiksXG4gICAgICAgIHByZXZpZXc6IGVudiA9PT0gJ2RldmVsb3BtZW50JyxcbiAgICAgICAgLy8gPGh0dHBzOi8vZ2l0aHViLmNvbS9sYWRqcy9pMThuPlxuICAgICAgICAvLyBzZXQgdG8gYW4gb2JqZWN0IHRvIGNvbmZpZ3VyZSBhbmQgZW5hYmxlIGl0XG4gICAgICAgIGkxOG46IGZhbHNlLFxuICAgICAgICAvLyBwYXNzIGEgY3VzdG9tIHJlbmRlciBmdW5jdGlvbiBpZiBuZWNlc3NhcnlcbiAgICAgICAgcmVuZGVyOiB0aGlzLnJlbmRlci5iaW5kKHRoaXMpLFxuICAgICAgICBjdXN0b21SZW5kZXI6IGZhbHNlLFxuICAgICAgICAvLyBmb3JjZSB0ZXh0LW9ubHkgcmVuZGVyaW5nIG9mIHRlbXBsYXRlIChkaXNyZWdhcmRzIHRlbXBsYXRlIGZvbGRlcilcbiAgICAgICAgdGV4dE9ubHk6IGZhbHNlLFxuICAgICAgICAvLyA8aHR0cHM6Ly9naXRodWIuY29tL3dlcms4NS9ub2RlLWh0bWwtdG8tdGV4dD5cbiAgICAgICAgaHRtbFRvVGV4dDoge1xuICAgICAgICAgIGlnbm9yZUltYWdlOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIHN1YmplY3RQcmVmaXg6IGZhbHNlLFxuICAgICAgICAvLyA8aHR0cHM6Ly9naXRodWIuY29tL0F1dG9tYXR0aWMvanVpY2U+XG4gICAgICAgIGp1aWNlOiB0cnVlLFxuICAgICAgICBqdWljZVJlc291cmNlczoge1xuICAgICAgICAgIHByZXNlcnZlSW1wb3J0YW50OiB0cnVlLFxuICAgICAgICAgIHdlYlJlc291cmNlczoge1xuICAgICAgICAgICAgcmVsYXRpdmVUbzogcGF0aC5yZXNvbHZlKCdidWlsZCcpLFxuICAgICAgICAgICAgaW1hZ2VzOiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLy8gcGFzcyBhIHRyYW5zcG9ydCBjb25maWd1cmF0aW9uIG9iamVjdCBvciBhIHRyYW5zcG9ydCBpbnN0YW5jZVxuICAgICAgICAvLyAoZS5nLiBhbiBpbnN0YW5jZSBpcyBjcmVhdGVkIHZpYSBgbm9kZW1haWxlci5jcmVhdGVUcmFuc3BvcnRgKVxuICAgICAgICAvLyA8aHR0cHM6Ly9ub2RlbWFpbGVyLmNvbS90cmFuc3BvcnRzLz5cbiAgICAgICAgdHJhbnNwb3J0OiB7fVxuICAgICAgfSxcbiAgICAgIGNvbmZpZ1xuICAgICk7XG5cbiAgICAvLyBvdmVycmlkZSBleGlzdGluZyBtZXRob2RcbiAgICB0aGlzLnJlbmRlciA9IHRoaXMuY29uZmlnLnJlbmRlcjtcblxuICAgIGlmICghXy5pc0Z1bmN0aW9uKHRoaXMuY29uZmlnLnRyYW5zcG9ydC5zZW5kTWFpbCkpXG4gICAgICB0aGlzLmNvbmZpZy50cmFuc3BvcnQgPSBub2RlbWFpbGVyLmNyZWF0ZVRyYW5zcG9ydCh0aGlzLmNvbmZpZy50cmFuc3BvcnQpO1xuXG4gICAgZGVidWcoJ3RyYW5zZm9ybWVkIGNvbmZpZyAlTycsIHRoaXMuY29uZmlnKTtcblxuICAgIGF1dG9CaW5kKHRoaXMpO1xuICB9XG5cbiAgLy8gc2hvcnRoYW5kIHVzZSBvZiBganVpY2VSZXNvdXJjZXNgIHdpdGggdGhlIGNvbmZpZ1xuICAvLyAobWFpbmx5IGZvciBjdXN0b20gcmVuZGVycyBsaWtlIGZyb20gYSBkYXRhYmFzZSlcbiAganVpY2VSZXNvdXJjZXMoaHRtbCkge1xuICAgIHJldHVybiBqdWljZVJlc291cmNlcyhodG1sLCB0aGlzLmNvbmZpZy5qdWljZVJlc291cmNlcyk7XG4gIH1cblxuICAvLyBhIHNpbXBsZSBoZWxwZXIgZnVuY3Rpb24gdGhhdCBnZXRzIHRoZSBhY3R1YWwgZmlsZSBwYXRoIGZvciB0aGUgdGVtcGxhdGVcbiAgYXN5bmMgZ2V0VGVtcGxhdGVQYXRoKHRlbXBsYXRlKSB7XG4gICAgY29uc3QgW3Jvb3QsIHZpZXddID0gcGF0aC5pc0Fic29sdXRlKHRlbXBsYXRlKVxuICAgICAgPyBbcGF0aC5kaXJuYW1lKHRlbXBsYXRlKSwgcGF0aC5iYXNlbmFtZSh0ZW1wbGF0ZSldXG4gICAgICA6IFt0aGlzLmNvbmZpZy52aWV3cy5yb290LCB0ZW1wbGF0ZV07XG4gICAgY29uc3QgcGF0aHMgPSBhd2FpdCBnZXRQYXRocyhcbiAgICAgIHJvb3QsXG4gICAgICB2aWV3LFxuICAgICAgdGhpcy5jb25maWcudmlld3Mub3B0aW9ucy5leHRlbnNpb25cbiAgICApO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3QsIHBhdGhzLnJlbCk7XG4gICAgcmV0dXJuIHsgZmlsZVBhdGgsIHBhdGhzIH07XG4gIH1cblxuICAvLyByZXR1cm5zIHRydWUgb3IgZmFsc2UgaWYgYSB0ZW1wbGF0ZSBleGlzdHNcbiAgLy8gKHVzZXMgc2FtZSBsb29rLXVwIGFwcHJvYWNoIGFzIGByZW5kZXJgIGZ1bmN0aW9uKVxuICBhc3luYyB0ZW1wbGF0ZUV4aXN0cyh2aWV3KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgZmlsZVBhdGggfSA9IGF3YWl0IHRoaXMuZ2V0VGVtcGxhdGVQYXRoKHZpZXcpO1xuICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBzdGF0KGZpbGVQYXRoKTtcbiAgICAgIGlmICghc3RhdHMuaXNGaWxlKCkpIHRocm93IG5ldyBFcnJvcihgJHtmaWxlUGF0aH0gd2FzIG5vdCBhIGZpbGVgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgZGVidWcoJ3RlbXBsYXRlRXhpc3RzJywgZXJyKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvLyBwcm9taXNlIHZlcnNpb24gb2YgY29uc29saWRhdGUncyByZW5kZXJcbiAgLy8gaW5zcGlyZWQgYnkga29hLXZpZXdzIGFuZCByZS11c2VzIHRoZSBzYW1lIGNvbmZpZ1xuICAvLyA8aHR0cHM6Ly9naXRodWIuY29tL3F1ZWNrZXp6L2tvYS12aWV3cz5cbiAgYXN5bmMgcmVuZGVyKHZpZXcsIGxvY2FscyA9IHt9KSB7XG4gICAgY29uc3QgeyBtYXAsIGVuZ2luZVNvdXJjZSB9ID0gdGhpcy5jb25maWcudmlld3Mub3B0aW9ucztcbiAgICBjb25zdCB7IGZpbGVQYXRoLCBwYXRocyB9ID0gYXdhaXQgdGhpcy5nZXRUZW1wbGF0ZVBhdGgodmlldyk7XG4gICAgaWYgKHBhdGhzLmV4dCA9PT0gJ2h0bWwnICYmICFtYXApIHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBjb25zdCBlbmdpbmVOYW1lID0gbWFwICYmIG1hcFtwYXRocy5leHRdID8gbWFwW3BhdGhzLmV4dF0gOiBwYXRocy5leHQ7XG4gICAgY29uc3QgcmVuZGVyRm4gPSBlbmdpbmVTb3VyY2VbZW5naW5lTmFtZV07XG4gICAgaWYgKCFlbmdpbmVOYW1lIHx8ICFyZW5kZXJGbilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEVuZ2luZSBub3QgZm91bmQgZm9yIHRoZSBcIi4ke3BhdGhzLmV4dH1cIiBmaWxlIGV4dGVuc2lvbmBcbiAgICAgICk7XG5cbiAgICBpZiAoXy5pc09iamVjdCh0aGlzLmNvbmZpZy5pMThuKSkge1xuICAgICAgY29uc3QgaTE4biA9IG5ldyBJMThOKFxuICAgICAgICBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmNvbmZpZy5pMThuLCB7XG4gICAgICAgICAgcmVnaXN0ZXI6IGxvY2Fsc1xuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgLy8gc3VwcG9ydCBgbG9jYWxzLnVzZXIubGFzdF9sb2NhbGVgXG4gICAgICAvLyAoZS5nLiBmb3IgPGh0dHBzOi8vbGFkLmpzLm9yZz4pXG4gICAgICBpZiAoXy5pc09iamVjdChsb2NhbHMudXNlcikgJiYgXy5pc1N0cmluZyhsb2NhbHMudXNlci5sYXN0X2xvY2FsZSkpXG4gICAgICAgIGxvY2Fscy5sb2NhbGUgPSBsb2NhbHMudXNlci5sYXN0X2xvY2FsZTtcblxuICAgICAgaWYgKF8uaXNTdHJpbmcobG9jYWxzLmxvY2FsZSkpIGkxOG4uc2V0TG9jYWxlKGxvY2Fscy5sb2NhbGUpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IFByb21pc2UucHJvbWlzaWZ5KHJlbmRlckZuKShmaWxlUGF0aCwgbG9jYWxzKTtcbiAgICAvLyB0cmFuc2Zvcm0gdGhlIGh0bWwgd2l0aCBqdWljZSB1c2luZyByZW1vdGUgcGF0aHNcbiAgICAvLyBnb29nbGUgbm93IHN1cHBvcnRzIG1lZGlhIHF1ZXJpZXNcbiAgICAvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9nbWFpbC9kZXNpZ24vcmVmZXJlbmNlL3N1cHBvcnRlZF9jc3NcbiAgICBpZiAoIXRoaXMuY29uZmlnLmp1aWNlKSByZXR1cm4gcmVzO1xuICAgIGNvbnN0IGh0bWwgPSBhd2FpdCB0aGlzLmp1aWNlUmVzb3VyY2VzKHJlcyk7XG4gICAgcmV0dXJuIGh0bWw7XG4gIH1cblxuICAvLyBUT0RPOiB0aGlzIG5lZWRzIHJlZmFjdG9yZWRcbiAgLy8gc28gdGhhdCB3ZSByZW5kZXIgdGVtcGxhdGVzIGFzeW5jaHJvbm91c2x5XG4gIGFzeW5jIHJlbmRlckFsbCh0ZW1wbGF0ZSwgbG9jYWxzID0ge30sIG1lc3NhZ2UgPSB7fSkge1xuICAgIGxldCBzdWJqZWN0VGVtcGxhdGVFeGlzdHMgPSB0aGlzLmNvbmZpZy5jdXN0b21SZW5kZXI7XG4gICAgbGV0IGh0bWxUZW1wbGF0ZUV4aXN0cyA9IHRoaXMuY29uZmlnLmN1c3RvbVJlbmRlcjtcbiAgICBsZXQgdGV4dFRlbXBsYXRlRXhpc3RzID0gdGhpcy5jb25maWcuY3VzdG9tUmVuZGVyO1xuXG4gICAgaWYgKHRlbXBsYXRlICYmICF0aGlzLmNvbmZpZy5jdXN0b21SZW5kZXIpXG4gICAgICBbXG4gICAgICAgIHN1YmplY3RUZW1wbGF0ZUV4aXN0cyxcbiAgICAgICAgaHRtbFRlbXBsYXRlRXhpc3RzLFxuICAgICAgICB0ZXh0VGVtcGxhdGVFeGlzdHNcbiAgICAgIF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHRoaXMudGVtcGxhdGVFeGlzdHMoYCR7dGVtcGxhdGV9L3N1YmplY3RgKSxcbiAgICAgICAgdGhpcy50ZW1wbGF0ZUV4aXN0cyhgJHt0ZW1wbGF0ZX0vaHRtbGApLFxuICAgICAgICB0aGlzLnRlbXBsYXRlRXhpc3RzKGAke3RlbXBsYXRlfS90ZXh0YClcbiAgICAgIF0pO1xuXG4gICAgaWYgKCFtZXNzYWdlLnN1YmplY3QgJiYgc3ViamVjdFRlbXBsYXRlRXhpc3RzKSB7XG4gICAgICBtZXNzYWdlLnN1YmplY3QgPSBhd2FpdCB0aGlzLnJlbmRlcihcbiAgICAgICAgYCR7dGVtcGxhdGV9L3N1YmplY3RgLFxuICAgICAgICBPYmplY3QuYXNzaWduKHt9LCBsb2NhbHMsIHsgcHJldHR5OiBmYWxzZSB9KVxuICAgICAgKTtcbiAgICAgIG1lc3NhZ2Uuc3ViamVjdCA9IG1lc3NhZ2Uuc3ViamVjdC50cmltKCk7XG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2Uuc3ViamVjdCAmJiB0aGlzLmNvbmZpZy5zdWJqZWN0UHJlZml4KVxuICAgICAgbWVzc2FnZS5zdWJqZWN0ID0gdGhpcy5jb25maWcuc3ViamVjdFByZWZpeCArIG1lc3NhZ2Uuc3ViamVjdDtcblxuICAgIGlmICghbWVzc2FnZS5odG1sICYmIGh0bWxUZW1wbGF0ZUV4aXN0cylcbiAgICAgIG1lc3NhZ2UuaHRtbCA9IGF3YWl0IHRoaXMucmVuZGVyKGAke3RlbXBsYXRlfS9odG1sYCwgbG9jYWxzKTtcblxuICAgIGlmICghbWVzc2FnZS50ZXh0ICYmIHRleHRUZW1wbGF0ZUV4aXN0cylcbiAgICAgIG1lc3NhZ2UudGV4dCA9IGF3YWl0IHRoaXMucmVuZGVyKFxuICAgICAgICBgJHt0ZW1wbGF0ZX0vdGV4dGAsXG4gICAgICAgIE9iamVjdC5hc3NpZ24oe30sIGxvY2FscywgeyBwcmV0dHk6IGZhbHNlIH0pXG4gICAgICApO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLmh0bWxUb1RleHQgJiYgbWVzc2FnZS5odG1sICYmICFtZXNzYWdlLnRleHQpXG4gICAgICAvLyB3ZSdkIHVzZSBub2RlbWFpbGVyLWh0bWwtdG8tdGV4dCBwbHVnaW5cbiAgICAgIC8vIGJ1dCB3ZSByZWFsbHkgZG9uJ3QgbmVlZCB0byBzdXBwb3J0IGNpZFxuICAgICAgLy8gPGh0dHBzOi8vZ2l0aHViLmNvbS9hbmRyaXM5L25vZGVtYWlsZXItaHRtbC10by10ZXh0PlxuICAgICAgbWVzc2FnZS50ZXh0ID0gaHRtbFRvVGV4dC5mcm9tU3RyaW5nKFxuICAgICAgICBtZXNzYWdlLmh0bWwsXG4gICAgICAgIHRoaXMuY29uZmlnLmh0bWxUb1RleHRcbiAgICAgICk7XG5cbiAgICAvLyBpZiB3ZSBvbmx5IHdhbnQgYSB0ZXh0LWJhc2VkIHZlcnNpb24gb2YgdGhlIGVtYWlsXG4gICAgaWYgKHRoaXMuY29uZmlnLnRleHRPbmx5KSBkZWxldGUgbWVzc2FnZS5odG1sO1xuXG4gICAgLy8gaWYgbm8gc3ViamVjdCwgaHRtbCwgb3IgdGV4dCBjb250ZW50IGV4aXN0cyB0aGVuIHdlIHNob3VsZFxuICAgIC8vIHRocm93IGFuIGVycm9yIHRoYXQgc2F5cyBhdCBsZWFzdCBvbmUgbXVzdCBiZSBmb3VuZFxuICAgIC8vIG90aGVyd2lzZSB0aGUgZW1haWwgd291bGQgYmUgYmxhbmsgKGRlZmVhdHMgcHVycG9zZSBvZiBlbWFpbC10ZW1wbGF0ZXMpXG4gICAgaWYgKFxuICAgICAgcy5pc0JsYW5rKG1lc3NhZ2Uuc3ViamVjdCkgJiZcbiAgICAgIHMuaXNCbGFuayhtZXNzYWdlLnRleHQpICYmXG4gICAgICBzLmlzQmxhbmsobWVzc2FnZS5odG1sKSAmJlxuICAgICAgXy5pc0FycmF5KG1lc3NhZ2UuYXR0YWNobWVudHMpICYmXG4gICAgICBfLmlzRW1wdHkobWVzc2FnZS5hdHRhY2htZW50cylcbiAgICApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBObyBjb250ZW50IHdhcyBwYXNzZWQgZm9yIHN1YmplY3QsIGh0bWwsIHRleHQsIG5vciBhdHRhY2htZW50cyBtZXNzYWdlIHByb3BzLiBDaGVjayB0aGF0IHRoZSBmaWxlcyBmb3IgdGhlIHRlbXBsYXRlIFwiJHt0ZW1wbGF0ZX1cIiBleGlzdC5gXG4gICAgICApO1xuXG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH1cblxuICBhc3luYyBzZW5kKG9wdGlvbnMgPSB7fSkge1xuICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKFxuICAgICAge1xuICAgICAgICB0ZW1wbGF0ZTogJycsXG4gICAgICAgIG1lc3NhZ2U6IHt9LFxuICAgICAgICBsb2NhbHM6IHt9XG4gICAgICB9LFxuICAgICAgb3B0aW9uc1xuICAgICk7XG5cbiAgICBsZXQgeyB0ZW1wbGF0ZSwgbWVzc2FnZSwgbG9jYWxzIH0gPSBvcHRpb25zO1xuXG4gICAgY29uc3QgYXR0YWNobWVudHMgPVxuICAgICAgbWVzc2FnZS5hdHRhY2htZW50cyB8fCB0aGlzLmNvbmZpZy5tZXNzYWdlLmF0dGFjaG1lbnRzIHx8IFtdO1xuXG4gICAgbWVzc2FnZSA9IF8uZGVmYXVsdHNEZWVwKFxuICAgICAge30sXG4gICAgICBfLm9taXQobWVzc2FnZSwgJ2F0dGFjaG1lbnRzJyksXG4gICAgICBfLm9taXQodGhpcy5jb25maWcubWVzc2FnZSwgJ2F0dGFjaG1lbnRzJylcbiAgICApO1xuICAgIGxvY2FscyA9IF8uZGVmYXVsdHNEZWVwKHt9LCB0aGlzLmNvbmZpZy52aWV3cy5sb2NhbHMsIGxvY2Fscyk7XG5cbiAgICBpZiAoYXR0YWNobWVudHMpIG1lc3NhZ2UuYXR0YWNobWVudHMgPSBhdHRhY2htZW50cztcblxuICAgIGRlYnVnKCd0ZW1wbGF0ZSAlcycsIHRlbXBsYXRlKTtcbiAgICBkZWJ1ZygnbWVzc2FnZSAlTycsIG1lc3NhZ2UpO1xuICAgIGRlYnVnKCdsb2NhbHMgKGtleXMgb25seSk6ICVPJywgT2JqZWN0LmtleXMobG9jYWxzKSk7XG5cbiAgICAvLyBnZXQgYWxsIGF2YWlsYWJsZSB0ZW1wbGF0ZXNcbiAgICBjb25zdCBvYmogPSBhd2FpdCB0aGlzLnJlbmRlckFsbCh0ZW1wbGF0ZSwgbG9jYWxzLCBtZXNzYWdlKTtcblxuICAgIC8vIGFzc2lnbiB0aGUgb2JqZWN0IHZhcmlhYmxlcyBvdmVyIHRvIHRoZSBtZXNzYWdlXG4gICAgT2JqZWN0LmFzc2lnbihtZXNzYWdlLCBvYmopO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLnByZXZpZXcpIHtcbiAgICAgIGRlYnVnKCd1c2luZyBgcHJldmlldy1lbWFpbGAgdG8gcHJldmlldyBlbWFpbCcpO1xuICAgICAgaWYgKF8uaXNPYmplY3QodGhpcy5jb25maWcucHJldmlldykpXG4gICAgICAgIGF3YWl0IHByZXZpZXdFbWFpbChtZXNzYWdlLCBudWxsLCB0cnVlLCB0aGlzLmNvbmZpZy5wcmV2aWV3KTtcbiAgICAgIGVsc2UgYXdhaXQgcHJldmlld0VtYWlsKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5jb25maWcuc2VuZCkge1xuICAgICAgZGVidWcoJ3NlbmQgZGlzYWJsZWQgc28gd2UgYXJlIGVuc3VyaW5nIEpTT05UcmFuc3BvcnQnKTtcbiAgICAgIC8vIDxodHRwczovL2dpdGh1Yi5jb20vbm9kZW1haWxlci9ub2RlbWFpbGVyL2lzc3Vlcy83OTg+XG4gICAgICAvLyBpZiAodGhpcy5jb25maWcudHJhbnNwb3J0Lm5hbWUgIT09ICdKU09OVHJhbnNwb3J0JylcbiAgICAgIHRoaXMuY29uZmlnLnRyYW5zcG9ydCA9IG5vZGVtYWlsZXIuY3JlYXRlVHJhbnNwb3J0KHtcbiAgICAgICAganNvblRyYW5zcG9ydDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jb25maWcudHJhbnNwb3J0LnNlbmRNYWlsKG1lc3NhZ2UpO1xuICAgIGRlYnVnKCdtZXNzYWdlIHNlbnQnKTtcbiAgICByZXMub3JpZ2luYWxNZXNzYWdlID0gbWVzc2FnZTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gRW1haWw7XG4iXX0=
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJmcyIsInJlcXVpcmUiLCJwYXRoIiwiSTE4TiIsIl8iLCJhdXRvQmluZCIsImNvbnNvbGlkYXRlIiwiZGVidWciLCJnZXRQYXRocyIsImh0bWxUb1RleHQiLCJpcyIsImp1aWNlIiwibm9kZW1haWxlciIsInBpZnkiLCJwcmV2aWV3RW1haWwiLCJqdWljZVJlc291cmNlcyIsImh0bWwiLCJvcHRpb25zIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJlcnIiLCJlbnYiLCJwcm9jZXNzIiwiTk9ERV9FTlYiLCJ0b0xvd2VyQ2FzZSIsInN0YXQiLCJyZWFkRmlsZSIsIkVtYWlsIiwiY29uc3RydWN0b3IiLCJjb25maWciLCJqdWljZU9wdGlvbnMiLCJkaXNhYmxlSnVpY2UiLCJyZW5kZXIiLCJjdXN0b21SZW5kZXIiLCJtZXJnZSIsInZpZXdzIiwicm9vdCIsImV4dGVuc2lvbiIsIm1hcCIsImhicyIsIm5qayIsImVuZ2luZVNvdXJjZSIsImxvY2FscyIsImNhY2hlIiwiaW5jbHVkZXMiLCJwcmV0dHkiLCJtZXNzYWdlIiwic2VuZCIsInByZXZpZXciLCJpMThuIiwiYmluZCIsInRleHRPbmx5IiwiaWdub3JlSW1hZ2UiLCJzdWJqZWN0UHJlZml4IiwicHJlc2VydmVJbXBvcnRhbnQiLCJ3ZWJSZXNvdXJjZXMiLCJyZWxhdGl2ZVRvIiwiaW1hZ2VzIiwidHJhbnNwb3J0IiwiaXNGdW5jdGlvbiIsInNlbmRNYWlsIiwiY3JlYXRlVHJhbnNwb3J0IiwiZ2V0VGVtcGxhdGVQYXRoIiwidGVtcGxhdGUiLCJ2aWV3IiwiaXNBYnNvbHV0ZSIsImRpcm5hbWUiLCJiYXNlbmFtZSIsInBhdGhzIiwiZmlsZVBhdGgiLCJyZWwiLCJ0ZW1wbGF0ZUV4aXN0cyIsInN0YXRzIiwiaXNGaWxlIiwiRXJyb3IiLCJjaGVja0FuZFJlbmRlciIsInR5cGUiLCJzdHIiLCJleGlzdHMiLCJleHQiLCJyZXMiLCJlbmdpbmVOYW1lIiwicmVuZGVyRm4iLCJpc09iamVjdCIsInJlZ2lzdGVyIiwidXNlciIsImlzU3RyaW5nIiwibGFzdF9sb2NhbGUiLCJsb2NhbGUiLCJzZXRMb2NhbGUiLCJyZW5kZXJBbGwiLCJub2RlbWFpbGVyTWVzc2FnZSIsInN1YmplY3QiLCJ0ZXh0IiwiYWxsIiwidHJpbSIsImZyb21TdHJpbmciLCJzdHJpbmciLCJlbXB0eVN0cmluZ09yV2hpdGVzcGFjZSIsImlzQXJyYXkiLCJhdHRhY2htZW50cyIsImlzRW1wdHkiLCJkZWZhdWx0c0RlZXAiLCJvbWl0IiwiT2JqZWN0Iiwia2V5cyIsIm9iaiIsImFzc2lnbiIsImpzb25UcmFuc3BvcnQiLCJvcmlnaW5hbE1lc3NhZ2UiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxNQUFNQSxFQUFFLEdBQUdDLE9BQU8sQ0FBQyxJQUFELENBQWxCOztBQUNBLE1BQU1DLElBQUksR0FBR0QsT0FBTyxDQUFDLE1BQUQsQ0FBcEI7O0FBQ0EsTUFBTUUsSUFBSSxHQUFHRixPQUFPLENBQUMsYUFBRCxDQUFwQjs7QUFDQSxNQUFNRyxDQUFDLEdBQUdILE9BQU8sQ0FBQyxRQUFELENBQWpCOztBQUNBLE1BQU1JLFFBQVEsR0FBR0osT0FBTyxDQUFDLFdBQUQsQ0FBeEI7O0FBQ0EsTUFBTUssV0FBVyxHQUFHTCxPQUFPLENBQUMsYUFBRCxDQUEzQjs7QUFDQSxNQUFNTSxLQUFLLEdBQUdOLE9BQU8sQ0FBQyxPQUFELENBQVAsQ0FBaUIsaUJBQWpCLENBQWQ7O0FBQ0EsTUFBTU8sUUFBUSxHQUFHUCxPQUFPLENBQUMsV0FBRCxDQUF4Qjs7QUFDQSxNQUFNUSxVQUFVLEdBQUdSLE9BQU8sQ0FBQyxjQUFELENBQTFCOztBQUNBLE1BQU1TLEVBQUUsR0FBR1QsT0FBTyxDQUFDLGtCQUFELENBQWxCOztBQUNBLE1BQU1VLEtBQUssR0FBR1YsT0FBTyxDQUFDLE9BQUQsQ0FBckI7O0FBQ0EsTUFBTVcsVUFBVSxHQUFHWCxPQUFPLENBQUMsWUFBRCxDQUExQjs7QUFDQSxNQUFNWSxJQUFJLEdBQUdaLE9BQU8sQ0FBQyxNQUFELENBQXBCOztBQUNBLE1BQU1hLFlBQVksR0FBR2IsT0FBTyxDQUFDLGVBQUQsQ0FBNUIsQyxDQUVBOzs7QUFDQSxNQUFNYyxjQUFjLEdBQUcsQ0FBQ0MsSUFBRCxFQUFPQyxPQUFQLEtBQW1CO0FBQ3hDLFNBQU8sSUFBSUMsT0FBSixDQUFZLENBQUNDLE9BQUQsRUFBVUMsTUFBVixLQUFxQjtBQUN0Q1QsSUFBQUEsS0FBSyxDQUFDSSxjQUFOLENBQXFCQyxJQUFyQixFQUEyQkMsT0FBM0IsRUFBb0MsQ0FBQ0ksR0FBRCxFQUFNTCxJQUFOLEtBQWU7QUFDakQsVUFBSUssR0FBSixFQUFTLE9BQU9ELE1BQU0sQ0FBQ0MsR0FBRCxDQUFiO0FBQ1RGLE1BQUFBLE9BQU8sQ0FBQ0gsSUFBRCxDQUFQO0FBQ0QsS0FIRDtBQUlELEdBTE0sQ0FBUDtBQU1ELENBUEQ7O0FBU0EsTUFBTU0sR0FBRyxHQUFHLENBQUNDLE9BQU8sQ0FBQ0QsR0FBUixDQUFZRSxRQUFaLElBQXdCLGFBQXpCLEVBQXdDQyxXQUF4QyxFQUFaO0FBQ0EsTUFBTUMsSUFBSSxHQUFHYixJQUFJLENBQUNiLEVBQUUsQ0FBQzBCLElBQUosQ0FBakI7QUFDQSxNQUFNQyxRQUFRLEdBQUdkLElBQUksQ0FBQ2IsRUFBRSxDQUFDMkIsUUFBSixDQUFyQjs7QUFFQSxNQUFNQyxLQUFOLENBQVk7QUFDVkMsRUFBQUEsV0FBVyxDQUFDQyxNQUFNLEdBQUcsRUFBVixFQUFjO0FBQ3ZCdkIsSUFBQUEsS0FBSyxDQUFDLGtCQUFELEVBQXFCdUIsTUFBckIsQ0FBTCxDQUR1QixDQUd2Qjs7QUFDQSxRQUFJQSxNQUFNLENBQUNDLFlBQVgsRUFBeUI7QUFDdkJELE1BQUFBLE1BQU0sQ0FBQ2YsY0FBUCxHQUF3QmUsTUFBTSxDQUFDQyxZQUEvQjtBQUNBLGFBQU9ELE1BQU0sQ0FBQ0MsWUFBZDtBQUNEOztBQUVELFFBQUlELE1BQU0sQ0FBQ0UsWUFBWCxFQUF5QjtBQUN2QkYsTUFBQUEsTUFBTSxDQUFDbkIsS0FBUCxHQUFlLEtBQWY7QUFDQSxhQUFPbUIsTUFBTSxDQUFDRSxZQUFkO0FBQ0Q7O0FBRUQsUUFBSUYsTUFBTSxDQUFDRyxNQUFYLEVBQW1CO0FBQ2pCSCxNQUFBQSxNQUFNLENBQUNJLFlBQVAsR0FBc0IsSUFBdEI7QUFDRDs7QUFFRCxTQUFLSixNQUFMLEdBQWMxQixDQUFDLENBQUMrQixLQUFGLENBQ1o7QUFDRUMsTUFBQUEsS0FBSyxFQUFFO0FBQ0w7QUFDQUMsUUFBQUEsSUFBSSxFQUFFbkMsSUFBSSxDQUFDaUIsT0FBTCxDQUFhLFFBQWIsQ0FGRDtBQUdMRixRQUFBQSxPQUFPLEVBQUU7QUFDUDtBQUNBcUIsVUFBQUEsU0FBUyxFQUFFLEtBRko7QUFHUEMsVUFBQUEsR0FBRyxFQUFFO0FBQ0hDLFlBQUFBLEdBQUcsRUFBRSxZQURGO0FBRUhDLFlBQUFBLEdBQUcsRUFBRTtBQUZGLFdBSEU7QUFPUEMsVUFBQUEsWUFBWSxFQUFFcEM7QUFQUCxTQUhKO0FBWUw7QUFDQXFDLFFBQUFBLE1BQU0sRUFBRTtBQUNOO0FBQ0FDLFVBQUFBLEtBQUssRUFBRSxDQUFDLENBQUMsYUFBRCxFQUFnQixNQUFoQixFQUF3QkMsUUFBeEIsQ0FBaUN2QixHQUFqQyxDQUZGO0FBR047QUFDQXdCLFVBQUFBLE1BQU0sRUFBRTtBQUpGO0FBYkgsT0FEVDtBQXFCRTtBQUNBQyxNQUFBQSxPQUFPLEVBQUUsRUF0Qlg7QUF1QkVDLE1BQUFBLElBQUksRUFBRSxDQUFDLENBQUMsYUFBRCxFQUFnQixNQUFoQixFQUF3QkgsUUFBeEIsQ0FBaUN2QixHQUFqQyxDQXZCVDtBQXdCRTJCLE1BQUFBLE9BQU8sRUFBRTNCLEdBQUcsS0FBSyxhQXhCbkI7QUF5QkU7QUFDQTtBQUNBNEIsTUFBQUEsSUFBSSxFQUFFLEtBM0JSO0FBNEJFO0FBQ0FqQixNQUFBQSxNQUFNLEVBQUUsS0FBS0EsTUFBTCxDQUFZa0IsSUFBWixDQUFpQixJQUFqQixDQTdCVjtBQThCRWpCLE1BQUFBLFlBQVksRUFBRSxLQTlCaEI7QUErQkU7QUFDQWtCLE1BQUFBLFFBQVEsRUFBRSxLQWhDWjtBQWlDRTtBQUNBM0MsTUFBQUEsVUFBVSxFQUFFO0FBQ1Y0QyxRQUFBQSxXQUFXLEVBQUU7QUFESCxPQWxDZDtBQXFDRUMsTUFBQUEsYUFBYSxFQUFFLEtBckNqQjtBQXNDRTtBQUNBM0MsTUFBQUEsS0FBSyxFQUFFLElBdkNUO0FBd0NFSSxNQUFBQSxjQUFjLEVBQUU7QUFDZHdDLFFBQUFBLGlCQUFpQixFQUFFLElBREw7QUFFZEMsUUFBQUEsWUFBWSxFQUFFO0FBQ1pDLFVBQUFBLFVBQVUsRUFBRXZELElBQUksQ0FBQ2lCLE9BQUwsQ0FBYSxPQUFiLENBREE7QUFFWnVDLFVBQUFBLE1BQU0sRUFBRTtBQUZJO0FBRkEsT0F4Q2xCO0FBK0NFO0FBQ0E7QUFDQTtBQUNBQyxNQUFBQSxTQUFTLEVBQUU7QUFsRGIsS0FEWSxFQXFEWjdCLE1BckRZLENBQWQsQ0FsQnVCLENBMEV2Qjs7QUFDQSxTQUFLRyxNQUFMLEdBQWMsS0FBS0gsTUFBTCxDQUFZRyxNQUExQjtBQUVBLFFBQUksQ0FBQzdCLENBQUMsQ0FBQ3dELFVBQUYsQ0FBYSxLQUFLOUIsTUFBTCxDQUFZNkIsU0FBWixDQUFzQkUsUUFBbkMsQ0FBTCxFQUNFLEtBQUsvQixNQUFMLENBQVk2QixTQUFaLEdBQXdCL0MsVUFBVSxDQUFDa0QsZUFBWCxDQUEyQixLQUFLaEMsTUFBTCxDQUFZNkIsU0FBdkMsQ0FBeEI7QUFFRnBELElBQUFBLEtBQUssQ0FBQyx1QkFBRCxFQUEwQixLQUFLdUIsTUFBL0IsQ0FBTDtBQUVBekIsSUFBQUEsUUFBUSxDQUFDLElBQUQsQ0FBUjtBQUNELEdBcEZTLENBc0ZWO0FBQ0E7OztBQUNBVSxFQUFBQSxjQUFjLENBQUNDLElBQUQsRUFBTztBQUNuQixXQUFPRCxjQUFjLENBQUNDLElBQUQsRUFBTyxLQUFLYyxNQUFMLENBQVlmLGNBQW5CLENBQXJCO0FBQ0QsR0ExRlMsQ0E0RlY7OztBQUNBLFFBQU1nRCxlQUFOLENBQXNCQyxRQUF0QixFQUFnQztBQUM5QixVQUFNLENBQUMzQixJQUFELEVBQU80QixJQUFQLElBQWUvRCxJQUFJLENBQUNnRSxVQUFMLENBQWdCRixRQUFoQixJQUNqQixDQUFDOUQsSUFBSSxDQUFDaUUsT0FBTCxDQUFhSCxRQUFiLENBQUQsRUFBeUI5RCxJQUFJLENBQUNrRSxRQUFMLENBQWNKLFFBQWQsQ0FBekIsQ0FEaUIsR0FFakIsQ0FBQyxLQUFLbEMsTUFBTCxDQUFZTSxLQUFaLENBQWtCQyxJQUFuQixFQUF5QjJCLFFBQXpCLENBRko7QUFHQSxVQUFNSyxLQUFLLEdBQUcsTUFBTTdELFFBQVEsQ0FDMUI2QixJQUQwQixFQUUxQjRCLElBRjBCLEVBRzFCLEtBQUtuQyxNQUFMLENBQVlNLEtBQVosQ0FBa0JuQixPQUFsQixDQUEwQnFCLFNBSEEsQ0FBNUI7QUFLQSxVQUFNZ0MsUUFBUSxHQUFHcEUsSUFBSSxDQUFDaUIsT0FBTCxDQUFha0IsSUFBYixFQUFtQmdDLEtBQUssQ0FBQ0UsR0FBekIsQ0FBakI7QUFDQSxXQUFPO0FBQUVELE1BQUFBLFFBQUY7QUFBWUQsTUFBQUE7QUFBWixLQUFQO0FBQ0QsR0F4R1MsQ0EwR1Y7QUFDQTs7O0FBQ0EsUUFBTUcsY0FBTixDQUFxQlAsSUFBckIsRUFBMkI7QUFDekIsUUFBSTtBQUNGLFlBQU07QUFBRUssUUFBQUE7QUFBRixVQUFlLE1BQU0sS0FBS1AsZUFBTCxDQUFxQkUsSUFBckIsQ0FBM0I7QUFDQSxZQUFNUSxLQUFLLEdBQUcsTUFBTS9DLElBQUksQ0FBQzRDLFFBQUQsQ0FBeEI7QUFDQSxVQUFJLENBQUNHLEtBQUssQ0FBQ0MsTUFBTixFQUFMLEVBQXFCLE1BQU0sSUFBSUMsS0FBSixDQUFXLEdBQUVMLFFBQVMsaUJBQXRCLENBQU47QUFDckIsYUFBTyxJQUFQO0FBQ0QsS0FMRCxDQUtFLE9BQU9qRCxHQUFQLEVBQVk7QUFDWmQsTUFBQUEsS0FBSyxDQUFDLGdCQUFELEVBQW1CYyxHQUFuQixDQUFMO0FBQ0EsYUFBTyxLQUFQO0FBQ0Q7QUFDRjs7QUFFRCxRQUFNdUQsY0FBTixDQUFxQkMsSUFBckIsRUFBMkJiLFFBQTNCLEVBQXFDckIsTUFBckMsRUFBNkM7QUFDM0MsVUFBTW1DLEdBQUcsR0FBSSxHQUFFZCxRQUFTLElBQUdhLElBQUssRUFBaEM7O0FBQ0EsUUFBSSxDQUFDLEtBQUsvQyxNQUFMLENBQVlJLFlBQWpCLEVBQStCO0FBQzdCLFlBQU02QyxNQUFNLEdBQUcsTUFBTSxLQUFLUCxjQUFMLENBQW9CTSxHQUFwQixDQUFyQjtBQUNBLFVBQUksQ0FBQ0MsTUFBTCxFQUFhO0FBQ2Q7O0FBRUQsV0FBTyxLQUFLOUMsTUFBTCxDQUFZNkMsR0FBWixvQkFDRm5DLE1BREUsRUFFRGtDLElBQUksS0FBSyxNQUFULEdBQWtCLEVBQWxCLEdBQXVCO0FBQUUvQixNQUFBQSxNQUFNLEVBQUU7QUFBVixLQUZ0QixFQUFQO0FBSUQsR0FuSVMsQ0FxSVY7QUFDQTtBQUNBOzs7QUFDQSxRQUFNYixNQUFOLENBQWFnQyxJQUFiLEVBQW1CdEIsTUFBTSxHQUFHLEVBQTVCLEVBQWdDO0FBQzlCLFVBQU07QUFBRUosTUFBQUEsR0FBRjtBQUFPRyxNQUFBQTtBQUFQLFFBQXdCLEtBQUtaLE1BQUwsQ0FBWU0sS0FBWixDQUFrQm5CLE9BQWhEO0FBQ0EsVUFBTTtBQUFFcUQsTUFBQUEsUUFBRjtBQUFZRCxNQUFBQTtBQUFaLFFBQXNCLE1BQU0sS0FBS04sZUFBTCxDQUFxQkUsSUFBckIsQ0FBbEM7O0FBQ0EsUUFBSUksS0FBSyxDQUFDVyxHQUFOLEtBQWMsTUFBZCxJQUF3QixDQUFDekMsR0FBN0IsRUFBa0M7QUFDaEMsWUFBTTBDLEdBQUcsR0FBRyxNQUFNdEQsUUFBUSxDQUFDMkMsUUFBRCxFQUFXLE1BQVgsQ0FBMUI7QUFDQSxhQUFPVyxHQUFQO0FBQ0Q7O0FBRUQsVUFBTUMsVUFBVSxHQUFHM0MsR0FBRyxJQUFJQSxHQUFHLENBQUM4QixLQUFLLENBQUNXLEdBQVAsQ0FBVixHQUF3QnpDLEdBQUcsQ0FBQzhCLEtBQUssQ0FBQ1csR0FBUCxDQUEzQixHQUF5Q1gsS0FBSyxDQUFDVyxHQUFsRTtBQUNBLFVBQU1HLFFBQVEsR0FBR3pDLFlBQVksQ0FBQ3dDLFVBQUQsQ0FBN0I7QUFDQSxRQUFJLENBQUNBLFVBQUQsSUFBZSxDQUFDQyxRQUFwQixFQUNFLE1BQU0sSUFBSVIsS0FBSixDQUNILDhCQUE2Qk4sS0FBSyxDQUFDVyxHQUFJLGtCQURwQyxDQUFOOztBQUlGLFFBQUk1RSxDQUFDLENBQUNnRixRQUFGLENBQVcsS0FBS3RELE1BQUwsQ0FBWW9CLElBQXZCLENBQUosRUFBa0M7QUFDaEMsWUFBTUEsSUFBSSxHQUFHLElBQUkvQyxJQUFKLG1CQUFjLEtBQUsyQixNQUFMLENBQVlvQixJQUExQjtBQUFnQ21DLFFBQUFBLFFBQVEsRUFBRTFDO0FBQTFDLFNBQWIsQ0FEZ0MsQ0FHaEM7QUFDQTs7QUFDQSxVQUFJdkMsQ0FBQyxDQUFDZ0YsUUFBRixDQUFXekMsTUFBTSxDQUFDMkMsSUFBbEIsS0FBMkJsRixDQUFDLENBQUNtRixRQUFGLENBQVc1QyxNQUFNLENBQUMyQyxJQUFQLENBQVlFLFdBQXZCLENBQS9CLEVBQ0U3QyxNQUFNLENBQUM4QyxNQUFQLEdBQWdCOUMsTUFBTSxDQUFDMkMsSUFBUCxDQUFZRSxXQUE1QjtBQUVGLFVBQUlwRixDQUFDLENBQUNtRixRQUFGLENBQVc1QyxNQUFNLENBQUM4QyxNQUFsQixDQUFKLEVBQStCdkMsSUFBSSxDQUFDd0MsU0FBTCxDQUFlL0MsTUFBTSxDQUFDOEMsTUFBdEI7QUFDaEM7O0FBRUQsVUFBTVIsR0FBRyxHQUFHLE1BQU1wRSxJQUFJLENBQUNzRSxRQUFELENBQUosQ0FBZWIsUUFBZixFQUF5QjNCLE1BQXpCLENBQWxCLENBMUI4QixDQTJCOUI7QUFDQTtBQUNBOztBQUNBLFFBQUksQ0FBQyxLQUFLYixNQUFMLENBQVluQixLQUFqQixFQUF3QixPQUFPc0UsR0FBUDtBQUN4QixVQUFNakUsSUFBSSxHQUFHLE1BQU0sS0FBS0QsY0FBTCxDQUFvQmtFLEdBQXBCLENBQW5CO0FBQ0EsV0FBT2pFLElBQVA7QUFDRDs7QUFFRCxRQUFNMkUsU0FBTixDQUFnQjNCLFFBQWhCLEVBQTBCckIsTUFBTSxHQUFHLEVBQW5DLEVBQXVDaUQsaUJBQWlCLEdBQUcsRUFBM0QsRUFBK0Q7QUFDN0QsVUFBTTdDLE9BQU8scUJBQVE2QyxpQkFBUixDQUFiOztBQUVBLFFBQUk1QixRQUFKLEVBQWM7QUFDWixZQUFNLENBQUM2QixPQUFELEVBQVU3RSxJQUFWLEVBQWdCOEUsSUFBaEIsSUFBd0IsTUFBTTVFLE9BQU8sQ0FBQzZFLEdBQVIsQ0FDbEMsQ0FBQyxTQUFELEVBQVksTUFBWixFQUFvQixNQUFwQixFQUE0QnhELEdBQTVCLENBQWdDc0MsSUFBSSxJQUNsQyxLQUFLRCxjQUFMLENBQW9CQyxJQUFwQixFQUEwQmIsUUFBMUIsRUFBb0NyQixNQUFwQyxDQURGLENBRGtDLENBQXBDO0FBTUEsVUFBSWtELE9BQUosRUFBYTlDLE9BQU8sQ0FBQzhDLE9BQVIsR0FBa0JBLE9BQU8sQ0FBQ0csSUFBUixFQUFsQjtBQUNiLFVBQUloRixJQUFKLEVBQVUrQixPQUFPLENBQUMvQixJQUFSLEdBQWVBLElBQWY7QUFDVixVQUFJOEUsSUFBSixFQUFVL0MsT0FBTyxDQUFDK0MsSUFBUixHQUFlQSxJQUFmO0FBQ1g7O0FBRUQsUUFBSS9DLE9BQU8sQ0FBQzhDLE9BQVIsSUFBbUIsS0FBSy9ELE1BQUwsQ0FBWXdCLGFBQW5DLEVBQ0VQLE9BQU8sQ0FBQzhDLE9BQVIsR0FBa0IsS0FBSy9ELE1BQUwsQ0FBWXdCLGFBQVosR0FBNEJQLE9BQU8sQ0FBQzhDLE9BQXREO0FBRUYsUUFBSSxLQUFLL0QsTUFBTCxDQUFZckIsVUFBWixJQUEwQnNDLE9BQU8sQ0FBQy9CLElBQWxDLElBQTBDLENBQUMrQixPQUFPLENBQUMrQyxJQUF2RCxFQUNFO0FBQ0E7QUFDQTtBQUNBL0MsTUFBQUEsT0FBTyxDQUFDK0MsSUFBUixHQUFlckYsVUFBVSxDQUFDd0YsVUFBWCxDQUNibEQsT0FBTyxDQUFDL0IsSUFESyxFQUViLEtBQUtjLE1BQUwsQ0FBWXJCLFVBRkMsQ0FBZixDQXRCMkQsQ0EyQjdEOztBQUNBLFFBQUksS0FBS3FCLE1BQUwsQ0FBWXNCLFFBQWhCLEVBQTBCLE9BQU9MLE9BQU8sQ0FBQy9CLElBQWYsQ0E1Qm1DLENBOEI3RDtBQUNBO0FBQ0E7O0FBQ0EsUUFDRSxDQUFDLENBQUNOLEVBQUUsQ0FBQ3dGLE1BQUgsQ0FBVW5ELE9BQU8sQ0FBQzhDLE9BQWxCLENBQUQsSUFDQ25GLEVBQUUsQ0FBQ3lGLHVCQUFILENBQTJCcEQsT0FBTyxDQUFDOEMsT0FBbkMsQ0FERixNQUVDLENBQUNuRixFQUFFLENBQUN3RixNQUFILENBQVVuRCxPQUFPLENBQUMrQyxJQUFsQixDQUFELElBQTRCcEYsRUFBRSxDQUFDeUYsdUJBQUgsQ0FBMkJwRCxPQUFPLENBQUMrQyxJQUFuQyxDQUY3QixNQUdDLENBQUNwRixFQUFFLENBQUN3RixNQUFILENBQVVuRCxPQUFPLENBQUMvQixJQUFsQixDQUFELElBQTRCTixFQUFFLENBQUN5Rix1QkFBSCxDQUEyQnBELE9BQU8sQ0FBQy9CLElBQW5DLENBSDdCLEtBSUFaLENBQUMsQ0FBQ2dHLE9BQUYsQ0FBVXJELE9BQU8sQ0FBQ3NELFdBQWxCLENBSkEsSUFLQWpHLENBQUMsQ0FBQ2tHLE9BQUYsQ0FBVXZELE9BQU8sQ0FBQ3NELFdBQWxCLENBTkYsRUFRRSxNQUFNLElBQUkxQixLQUFKLENBQ0gsd0hBQXVIWCxRQUFTLFVBRDdILENBQU47QUFJRixXQUFPakIsT0FBUDtBQUNEOztBQUVELFFBQU1DLElBQU4sQ0FBVy9CLE9BQU8sR0FBRyxFQUFyQixFQUF5QjtBQUN2QkEsSUFBQUEsT0FBTztBQUNMK0MsTUFBQUEsUUFBUSxFQUFFLEVBREw7QUFFTGpCLE1BQUFBLE9BQU8sRUFBRSxFQUZKO0FBR0xKLE1BQUFBLE1BQU0sRUFBRTtBQUhILE9BSUYxQixPQUpFLENBQVA7QUFPQSxRQUFJO0FBQUUrQyxNQUFBQSxRQUFGO0FBQVlqQixNQUFBQSxPQUFaO0FBQXFCSixNQUFBQTtBQUFyQixRQUFnQzFCLE9BQXBDO0FBRUEsVUFBTW9GLFdBQVcsR0FDZnRELE9BQU8sQ0FBQ3NELFdBQVIsSUFBdUIsS0FBS3ZFLE1BQUwsQ0FBWWlCLE9BQVosQ0FBb0JzRCxXQUEzQyxJQUEwRCxFQUQ1RDtBQUdBdEQsSUFBQUEsT0FBTyxHQUFHM0MsQ0FBQyxDQUFDbUcsWUFBRixDQUNSLEVBRFEsRUFFUm5HLENBQUMsQ0FBQ29HLElBQUYsQ0FBT3pELE9BQVAsRUFBZ0IsYUFBaEIsQ0FGUSxFQUdSM0MsQ0FBQyxDQUFDb0csSUFBRixDQUFPLEtBQUsxRSxNQUFMLENBQVlpQixPQUFuQixFQUE0QixhQUE1QixDQUhRLENBQVY7QUFLQUosSUFBQUEsTUFBTSxHQUFHdkMsQ0FBQyxDQUFDbUcsWUFBRixDQUFlLEVBQWYsRUFBbUIsS0FBS3pFLE1BQUwsQ0FBWU0sS0FBWixDQUFrQk8sTUFBckMsRUFBNkNBLE1BQTdDLENBQVQ7QUFFQSxRQUFJMEQsV0FBSixFQUFpQnRELE9BQU8sQ0FBQ3NELFdBQVIsR0FBc0JBLFdBQXRCO0FBRWpCOUYsSUFBQUEsS0FBSyxDQUFDLGFBQUQsRUFBZ0J5RCxRQUFoQixDQUFMO0FBQ0F6RCxJQUFBQSxLQUFLLENBQUMsWUFBRCxFQUFld0MsT0FBZixDQUFMO0FBQ0F4QyxJQUFBQSxLQUFLLENBQUMsd0JBQUQsRUFBMkJrRyxNQUFNLENBQUNDLElBQVAsQ0FBWS9ELE1BQVosQ0FBM0IsQ0FBTCxDQXhCdUIsQ0EwQnZCOztBQUNBLFVBQU1nRSxHQUFHLEdBQUcsTUFBTSxLQUFLaEIsU0FBTCxDQUFlM0IsUUFBZixFQUF5QnJCLE1BQXpCLEVBQWlDSSxPQUFqQyxDQUFsQixDQTNCdUIsQ0E2QnZCOztBQUNBMEQsSUFBQUEsTUFBTSxDQUFDRyxNQUFQLENBQWM3RCxPQUFkLEVBQXVCNEQsR0FBdkI7O0FBRUEsUUFBSSxLQUFLN0UsTUFBTCxDQUFZbUIsT0FBaEIsRUFBeUI7QUFDdkIxQyxNQUFBQSxLQUFLLENBQUMsd0NBQUQsQ0FBTDtBQUNBLFVBQUlILENBQUMsQ0FBQ2dGLFFBQUYsQ0FBVyxLQUFLdEQsTUFBTCxDQUFZbUIsT0FBdkIsQ0FBSixFQUNFLE1BQU1uQyxZQUFZLENBQUNpQyxPQUFELEVBQVUsS0FBS2pCLE1BQUwsQ0FBWW1CLE9BQXRCLENBQWxCLENBREYsS0FFSyxNQUFNbkMsWUFBWSxDQUFDaUMsT0FBRCxDQUFsQjtBQUNOOztBQUVELFFBQUksQ0FBQyxLQUFLakIsTUFBTCxDQUFZa0IsSUFBakIsRUFBdUI7QUFDckJ6QyxNQUFBQSxLQUFLLENBQUMsZ0RBQUQsQ0FBTCxDQURxQixDQUVyQjtBQUNBOztBQUNBLFdBQUt1QixNQUFMLENBQVk2QixTQUFaLEdBQXdCL0MsVUFBVSxDQUFDa0QsZUFBWCxDQUEyQjtBQUNqRCtDLFFBQUFBLGFBQWEsRUFBRTtBQURrQyxPQUEzQixDQUF4QjtBQUdEOztBQUVELFVBQU01QixHQUFHLEdBQUcsTUFBTSxLQUFLbkQsTUFBTCxDQUFZNkIsU0FBWixDQUFzQkUsUUFBdEIsQ0FBK0JkLE9BQS9CLENBQWxCO0FBQ0F4QyxJQUFBQSxLQUFLLENBQUMsY0FBRCxDQUFMO0FBQ0EwRSxJQUFBQSxHQUFHLENBQUM2QixlQUFKLEdBQXNCL0QsT0FBdEI7QUFDQSxXQUFPa0MsR0FBUDtBQUNEOztBQS9RUzs7QUFrUlo4QixNQUFNLENBQUNDLE9BQVAsR0FBaUJwRixLQUFqQiIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCBJMThOID0gcmVxdWlyZSgnQGxhZGpzL2kxOG4nKTtcbmNvbnN0IF8gPSByZXF1aXJlKCdsb2Rhc2gnKTtcbmNvbnN0IGF1dG9CaW5kID0gcmVxdWlyZSgnYXV0by1iaW5kJyk7XG5jb25zdCBjb25zb2xpZGF0ZSA9IHJlcXVpcmUoJ2NvbnNvbGlkYXRlJyk7XG5jb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJ2RlYnVnJykoJ2VtYWlsLXRlbXBsYXRlcycpO1xuY29uc3QgZ2V0UGF0aHMgPSByZXF1aXJlKCdnZXQtcGF0aHMnKTtcbmNvbnN0IGh0bWxUb1RleHQgPSByZXF1aXJlKCdodG1sLXRvLXRleHQnKTtcbmNvbnN0IGlzID0gcmVxdWlyZSgnQHNpbmRyZXNvcmh1cy9pcycpO1xuY29uc3QganVpY2UgPSByZXF1aXJlKCdqdWljZScpO1xuY29uc3Qgbm9kZW1haWxlciA9IHJlcXVpcmUoJ25vZGVtYWlsZXInKTtcbmNvbnN0IHBpZnkgPSByZXF1aXJlKCdwaWZ5Jyk7XG5jb25zdCBwcmV2aWV3RW1haWwgPSByZXF1aXJlKCdwcmV2aWV3LWVtYWlsJyk7XG5cbi8vIHByb21pc2UgdmVyc2lvbiBvZiBganVpY2UuanVpY2VSZXNvdXJjZXNgXG5jb25zdCBqdWljZVJlc291cmNlcyA9IChodG1sLCBvcHRpb25zKSA9PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAganVpY2UuanVpY2VSZXNvdXJjZXMoaHRtbCwgb3B0aW9ucywgKGVyciwgaHRtbCkgPT4ge1xuICAgICAgaWYgKGVycikgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgcmVzb2x2ZShodG1sKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG5jb25zdCBlbnYgPSAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50JykudG9Mb3dlckNhc2UoKTtcbmNvbnN0IHN0YXQgPSBwaWZ5KGZzLnN0YXQpO1xuY29uc3QgcmVhZEZpbGUgPSBwaWZ5KGZzLnJlYWRGaWxlKTtcblxuY2xhc3MgRW1haWwge1xuICBjb25zdHJ1Y3Rvcihjb25maWcgPSB7fSkge1xuICAgIGRlYnVnKCdjb25maWcgcGFzc2VkICVPJywgY29uZmlnKTtcblxuICAgIC8vIDIueCBiYWNrd2FyZHMgY29tcGF0aWJsZSBzdXBwb3J0XG4gICAgaWYgKGNvbmZpZy5qdWljZU9wdGlvbnMpIHtcbiAgICAgIGNvbmZpZy5qdWljZVJlc291cmNlcyA9IGNvbmZpZy5qdWljZU9wdGlvbnM7XG4gICAgICBkZWxldGUgY29uZmlnLmp1aWNlT3B0aW9ucztcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRpc2FibGVKdWljZSkge1xuICAgICAgY29uZmlnLmp1aWNlID0gZmFsc2U7XG4gICAgICBkZWxldGUgY29uZmlnLmRpc2FibGVKdWljZTtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLnJlbmRlcikge1xuICAgICAgY29uZmlnLmN1c3RvbVJlbmRlciA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5jb25maWcgPSBfLm1lcmdlKFxuICAgICAge1xuICAgICAgICB2aWV3czoge1xuICAgICAgICAgIC8vIGRpcmVjdG9yeSB3aGVyZSBlbWFpbCB0ZW1wbGF0ZXMgcmVzaWRlXG4gICAgICAgICAgcm9vdDogcGF0aC5yZXNvbHZlKCdlbWFpbHMnKSxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAvLyBkZWZhdWx0IGZpbGUgZXh0ZW5zaW9uIGZvciB0ZW1wbGF0ZVxuICAgICAgICAgICAgZXh0ZW5zaW9uOiAncHVnJyxcbiAgICAgICAgICAgIG1hcDoge1xuICAgICAgICAgICAgICBoYnM6ICdoYW5kbGViYXJzJyxcbiAgICAgICAgICAgICAgbmprOiAnbnVuanVja3MnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5naW5lU291cmNlOiBjb25zb2xpZGF0ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgLy8gbG9jYWxzIHRvIHBhc3MgdG8gdGVtcGxhdGVzIGZvciByZW5kZXJpbmdcbiAgICAgICAgICBsb2NhbHM6IHtcbiAgICAgICAgICAgIC8vIHR1cm4gb24gY2FjaGluZyBmb3Igbm9uLWRldmVsb3BtZW50IGVudmlyb25tZW50c1xuICAgICAgICAgICAgY2FjaGU6ICFbJ2RldmVsb3BtZW50JywgJ3Rlc3QnXS5pbmNsdWRlcyhlbnYpLFxuICAgICAgICAgICAgLy8gcHJldHR5IGlzIGF1dG9tYXRpY2FsbHkgc2V0IHRvIGBmYWxzZWAgZm9yIHN1YmplY3QvdGV4dFxuICAgICAgICAgICAgcHJldHR5OiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAvLyA8aHR0cHM6Ly9ub2RlbWFpbGVyLmNvbS9tZXNzYWdlLz5cbiAgICAgICAgbWVzc2FnZToge30sXG4gICAgICAgIHNlbmQ6ICFbJ2RldmVsb3BtZW50JywgJ3Rlc3QnXS5pbmNsdWRlcyhlbnYpLFxuICAgICAgICBwcmV2aWV3OiBlbnYgPT09ICdkZXZlbG9wbWVudCcsXG4gICAgICAgIC8vIDxodHRwczovL2dpdGh1Yi5jb20vbGFkanMvaTE4bj5cbiAgICAgICAgLy8gc2V0IHRvIGFuIG9iamVjdCB0byBjb25maWd1cmUgYW5kIGVuYWJsZSBpdFxuICAgICAgICBpMThuOiBmYWxzZSxcbiAgICAgICAgLy8gcGFzcyBhIGN1c3RvbSByZW5kZXIgZnVuY3Rpb24gaWYgbmVjZXNzYXJ5XG4gICAgICAgIHJlbmRlcjogdGhpcy5yZW5kZXIuYmluZCh0aGlzKSxcbiAgICAgICAgY3VzdG9tUmVuZGVyOiBmYWxzZSxcbiAgICAgICAgLy8gZm9yY2UgdGV4dC1vbmx5IHJlbmRlcmluZyBvZiB0ZW1wbGF0ZSAoZGlzcmVnYXJkcyB0ZW1wbGF0ZSBmb2xkZXIpXG4gICAgICAgIHRleHRPbmx5OiBmYWxzZSxcbiAgICAgICAgLy8gPGh0dHBzOi8vZ2l0aHViLmNvbS93ZXJrODUvbm9kZS1odG1sLXRvLXRleHQ+XG4gICAgICAgIGh0bWxUb1RleHQ6IHtcbiAgICAgICAgICBpZ25vcmVJbWFnZTogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBzdWJqZWN0UHJlZml4OiBmYWxzZSxcbiAgICAgICAgLy8gPGh0dHBzOi8vZ2l0aHViLmNvbS9BdXRvbWF0dGljL2p1aWNlPlxuICAgICAgICBqdWljZTogdHJ1ZSxcbiAgICAgICAganVpY2VSZXNvdXJjZXM6IHtcbiAgICAgICAgICBwcmVzZXJ2ZUltcG9ydGFudDogdHJ1ZSxcbiAgICAgICAgICB3ZWJSZXNvdXJjZXM6IHtcbiAgICAgICAgICAgIHJlbGF0aXZlVG86IHBhdGgucmVzb2x2ZSgnYnVpbGQnKSxcbiAgICAgICAgICAgIGltYWdlczogZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIC8vIHBhc3MgYSB0cmFuc3BvcnQgY29uZmlndXJhdGlvbiBvYmplY3Qgb3IgYSB0cmFuc3BvcnQgaW5zdGFuY2VcbiAgICAgICAgLy8gKGUuZy4gYW4gaW5zdGFuY2UgaXMgY3JlYXRlZCB2aWEgYG5vZGVtYWlsZXIuY3JlYXRlVHJhbnNwb3J0YClcbiAgICAgICAgLy8gPGh0dHBzOi8vbm9kZW1haWxlci5jb20vdHJhbnNwb3J0cy8+XG4gICAgICAgIHRyYW5zcG9ydDoge31cbiAgICAgIH0sXG4gICAgICBjb25maWdcbiAgICApO1xuXG4gICAgLy8gb3ZlcnJpZGUgZXhpc3RpbmcgbWV0aG9kXG4gICAgdGhpcy5yZW5kZXIgPSB0aGlzLmNvbmZpZy5yZW5kZXI7XG5cbiAgICBpZiAoIV8uaXNGdW5jdGlvbih0aGlzLmNvbmZpZy50cmFuc3BvcnQuc2VuZE1haWwpKVxuICAgICAgdGhpcy5jb25maWcudHJhbnNwb3J0ID0gbm9kZW1haWxlci5jcmVhdGVUcmFuc3BvcnQodGhpcy5jb25maWcudHJhbnNwb3J0KTtcblxuICAgIGRlYnVnKCd0cmFuc2Zvcm1lZCBjb25maWcgJU8nLCB0aGlzLmNvbmZpZyk7XG5cbiAgICBhdXRvQmluZCh0aGlzKTtcbiAgfVxuXG4gIC8vIHNob3J0aGFuZCB1c2Ugb2YgYGp1aWNlUmVzb3VyY2VzYCB3aXRoIHRoZSBjb25maWdcbiAgLy8gKG1haW5seSBmb3IgY3VzdG9tIHJlbmRlcnMgbGlrZSBmcm9tIGEgZGF0YWJhc2UpXG4gIGp1aWNlUmVzb3VyY2VzKGh0bWwpIHtcbiAgICByZXR1cm4ganVpY2VSZXNvdXJjZXMoaHRtbCwgdGhpcy5jb25maWcuanVpY2VSZXNvdXJjZXMpO1xuICB9XG5cbiAgLy8gYSBzaW1wbGUgaGVscGVyIGZ1bmN0aW9uIHRoYXQgZ2V0cyB0aGUgYWN0dWFsIGZpbGUgcGF0aCBmb3IgdGhlIHRlbXBsYXRlXG4gIGFzeW5jIGdldFRlbXBsYXRlUGF0aCh0ZW1wbGF0ZSkge1xuICAgIGNvbnN0IFtyb290LCB2aWV3XSA9IHBhdGguaXNBYnNvbHV0ZSh0ZW1wbGF0ZSlcbiAgICAgID8gW3BhdGguZGlybmFtZSh0ZW1wbGF0ZSksIHBhdGguYmFzZW5hbWUodGVtcGxhdGUpXVxuICAgICAgOiBbdGhpcy5jb25maWcudmlld3Mucm9vdCwgdGVtcGxhdGVdO1xuICAgIGNvbnN0IHBhdGhzID0gYXdhaXQgZ2V0UGF0aHMoXG4gICAgICByb290LFxuICAgICAgdmlldyxcbiAgICAgIHRoaXMuY29uZmlnLnZpZXdzLm9wdGlvbnMuZXh0ZW5zaW9uXG4gICAgKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290LCBwYXRocy5yZWwpO1xuICAgIHJldHVybiB7IGZpbGVQYXRoLCBwYXRocyB9O1xuICB9XG5cbiAgLy8gcmV0dXJucyB0cnVlIG9yIGZhbHNlIGlmIGEgdGVtcGxhdGUgZXhpc3RzXG4gIC8vICh1c2VzIHNhbWUgbG9vay11cCBhcHByb2FjaCBhcyBgcmVuZGVyYCBmdW5jdGlvbilcbiAgYXN5bmMgdGVtcGxhdGVFeGlzdHModmlldykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGZpbGVQYXRoIH0gPSBhd2FpdCB0aGlzLmdldFRlbXBsYXRlUGF0aCh2aWV3KTtcbiAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgc3RhdChmaWxlUGF0aCk7XG4gICAgICBpZiAoIXN0YXRzLmlzRmlsZSgpKSB0aHJvdyBuZXcgRXJyb3IoYCR7ZmlsZVBhdGh9IHdhcyBub3QgYSBmaWxlYCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGRlYnVnKCd0ZW1wbGF0ZUV4aXN0cycsIGVycik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY2hlY2tBbmRSZW5kZXIodHlwZSwgdGVtcGxhdGUsIGxvY2Fscykge1xuICAgIGNvbnN0IHN0ciA9IGAke3RlbXBsYXRlfS8ke3R5cGV9YDtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmN1c3RvbVJlbmRlcikge1xuICAgICAgY29uc3QgZXhpc3RzID0gYXdhaXQgdGhpcy50ZW1wbGF0ZUV4aXN0cyhzdHIpO1xuICAgICAgaWYgKCFleGlzdHMpIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5yZW5kZXIoc3RyLCB7XG4gICAgICAuLi5sb2NhbHMsXG4gICAgICAuLi4odHlwZSA9PT0gJ2h0bWwnID8ge30gOiB7IHByZXR0eTogZmFsc2UgfSlcbiAgICB9KTtcbiAgfVxuXG4gIC8vIHByb21pc2UgdmVyc2lvbiBvZiBjb25zb2xpZGF0ZSdzIHJlbmRlclxuICAvLyBpbnNwaXJlZCBieSBrb2Etdmlld3MgYW5kIHJlLXVzZXMgdGhlIHNhbWUgY29uZmlnXG4gIC8vIDxodHRwczovL2dpdGh1Yi5jb20vcXVlY2tlenova29hLXZpZXdzPlxuICBhc3luYyByZW5kZXIodmlldywgbG9jYWxzID0ge30pIHtcbiAgICBjb25zdCB7IG1hcCwgZW5naW5lU291cmNlIH0gPSB0aGlzLmNvbmZpZy52aWV3cy5vcHRpb25zO1xuICAgIGNvbnN0IHsgZmlsZVBhdGgsIHBhdGhzIH0gPSBhd2FpdCB0aGlzLmdldFRlbXBsYXRlUGF0aCh2aWV3KTtcbiAgICBpZiAocGF0aHMuZXh0ID09PSAnaHRtbCcgJiYgIW1hcCkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgcmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGNvbnN0IGVuZ2luZU5hbWUgPSBtYXAgJiYgbWFwW3BhdGhzLmV4dF0gPyBtYXBbcGF0aHMuZXh0XSA6IHBhdGhzLmV4dDtcbiAgICBjb25zdCByZW5kZXJGbiA9IGVuZ2luZVNvdXJjZVtlbmdpbmVOYW1lXTtcbiAgICBpZiAoIWVuZ2luZU5hbWUgfHwgIXJlbmRlckZuKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRW5naW5lIG5vdCBmb3VuZCBmb3IgdGhlIFwiLiR7cGF0aHMuZXh0fVwiIGZpbGUgZXh0ZW5zaW9uYFxuICAgICAgKTtcblxuICAgIGlmIChfLmlzT2JqZWN0KHRoaXMuY29uZmlnLmkxOG4pKSB7XG4gICAgICBjb25zdCBpMThuID0gbmV3IEkxOE4oeyAuLi50aGlzLmNvbmZpZy5pMThuLCByZWdpc3RlcjogbG9jYWxzIH0pO1xuXG4gICAgICAvLyBzdXBwb3J0IGBsb2NhbHMudXNlci5sYXN0X2xvY2FsZWBcbiAgICAgIC8vIChlLmcuIGZvciA8aHR0cHM6Ly9sYWQuanMub3JnPilcbiAgICAgIGlmIChfLmlzT2JqZWN0KGxvY2Fscy51c2VyKSAmJiBfLmlzU3RyaW5nKGxvY2Fscy51c2VyLmxhc3RfbG9jYWxlKSlcbiAgICAgICAgbG9jYWxzLmxvY2FsZSA9IGxvY2Fscy51c2VyLmxhc3RfbG9jYWxlO1xuXG4gICAgICBpZiAoXy5pc1N0cmluZyhsb2NhbHMubG9jYWxlKSkgaTE4bi5zZXRMb2NhbGUobG9jYWxzLmxvY2FsZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgcGlmeShyZW5kZXJGbikoZmlsZVBhdGgsIGxvY2Fscyk7XG4gICAgLy8gdHJhbnNmb3JtIHRoZSBodG1sIHdpdGgganVpY2UgdXNpbmcgcmVtb3RlIHBhdGhzXG4gICAgLy8gZ29vZ2xlIG5vdyBzdXBwb3J0cyBtZWRpYSBxdWVyaWVzXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vZ21haWwvZGVzaWduL3JlZmVyZW5jZS9zdXBwb3J0ZWRfY3NzXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5qdWljZSkgcmV0dXJuIHJlcztcbiAgICBjb25zdCBodG1sID0gYXdhaXQgdGhpcy5qdWljZVJlc291cmNlcyhyZXMpO1xuICAgIHJldHVybiBodG1sO1xuICB9XG5cbiAgYXN5bmMgcmVuZGVyQWxsKHRlbXBsYXRlLCBsb2NhbHMgPSB7fSwgbm9kZW1haWxlck1lc3NhZ2UgPSB7fSkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB7IC4uLm5vZGVtYWlsZXJNZXNzYWdlIH07XG5cbiAgICBpZiAodGVtcGxhdGUpIHtcbiAgICAgIGNvbnN0IFtzdWJqZWN0LCBodG1sLCB0ZXh0XSA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBbJ3N1YmplY3QnLCAnaHRtbCcsICd0ZXh0J10ubWFwKHR5cGUgPT5cbiAgICAgICAgICB0aGlzLmNoZWNrQW5kUmVuZGVyKHR5cGUsIHRlbXBsYXRlLCBsb2NhbHMpXG4gICAgICAgIClcbiAgICAgICk7XG5cbiAgICAgIGlmIChzdWJqZWN0KSBtZXNzYWdlLnN1YmplY3QgPSBzdWJqZWN0LnRyaW0oKTtcbiAgICAgIGlmIChodG1sKSBtZXNzYWdlLmh0bWwgPSBodG1sO1xuICAgICAgaWYgKHRleHQpIG1lc3NhZ2UudGV4dCA9IHRleHQ7XG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2Uuc3ViamVjdCAmJiB0aGlzLmNvbmZpZy5zdWJqZWN0UHJlZml4KVxuICAgICAgbWVzc2FnZS5zdWJqZWN0ID0gdGhpcy5jb25maWcuc3ViamVjdFByZWZpeCArIG1lc3NhZ2Uuc3ViamVjdDtcblxuICAgIGlmICh0aGlzLmNvbmZpZy5odG1sVG9UZXh0ICYmIG1lc3NhZ2UuaHRtbCAmJiAhbWVzc2FnZS50ZXh0KVxuICAgICAgLy8gd2UnZCB1c2Ugbm9kZW1haWxlci1odG1sLXRvLXRleHQgcGx1Z2luXG4gICAgICAvLyBidXQgd2UgcmVhbGx5IGRvbid0IG5lZWQgdG8gc3VwcG9ydCBjaWRcbiAgICAgIC8vIDxodHRwczovL2dpdGh1Yi5jb20vYW5kcmlzOS9ub2RlbWFpbGVyLWh0bWwtdG8tdGV4dD5cbiAgICAgIG1lc3NhZ2UudGV4dCA9IGh0bWxUb1RleHQuZnJvbVN0cmluZyhcbiAgICAgICAgbWVzc2FnZS5odG1sLFxuICAgICAgICB0aGlzLmNvbmZpZy5odG1sVG9UZXh0XG4gICAgICApO1xuXG4gICAgLy8gaWYgd2Ugb25seSB3YW50IGEgdGV4dC1iYXNlZCB2ZXJzaW9uIG9mIHRoZSBlbWFpbFxuICAgIGlmICh0aGlzLmNvbmZpZy50ZXh0T25seSkgZGVsZXRlIG1lc3NhZ2UuaHRtbDtcblxuICAgIC8vIGlmIG5vIHN1YmplY3QsIGh0bWwsIG9yIHRleHQgY29udGVudCBleGlzdHMgdGhlbiB3ZSBzaG91bGRcbiAgICAvLyB0aHJvdyBhbiBlcnJvciB0aGF0IHNheXMgYXQgbGVhc3Qgb25lIG11c3QgYmUgZm91bmRcbiAgICAvLyBvdGhlcndpc2UgdGhlIGVtYWlsIHdvdWxkIGJlIGJsYW5rIChkZWZlYXRzIHB1cnBvc2Ugb2YgZW1haWwtdGVtcGxhdGVzKVxuICAgIGlmIChcbiAgICAgICghaXMuc3RyaW5nKG1lc3NhZ2Uuc3ViamVjdCkgfHxcbiAgICAgICAgaXMuZW1wdHlTdHJpbmdPcldoaXRlc3BhY2UobWVzc2FnZS5zdWJqZWN0KSkgJiZcbiAgICAgICghaXMuc3RyaW5nKG1lc3NhZ2UudGV4dCkgfHwgaXMuZW1wdHlTdHJpbmdPcldoaXRlc3BhY2UobWVzc2FnZS50ZXh0KSkgJiZcbiAgICAgICghaXMuc3RyaW5nKG1lc3NhZ2UuaHRtbCkgfHwgaXMuZW1wdHlTdHJpbmdPcldoaXRlc3BhY2UobWVzc2FnZS5odG1sKSkgJiZcbiAgICAgIF8uaXNBcnJheShtZXNzYWdlLmF0dGFjaG1lbnRzKSAmJlxuICAgICAgXy5pc0VtcHR5KG1lc3NhZ2UuYXR0YWNobWVudHMpXG4gICAgKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTm8gY29udGVudCB3YXMgcGFzc2VkIGZvciBzdWJqZWN0LCBodG1sLCB0ZXh0LCBub3IgYXR0YWNobWVudHMgbWVzc2FnZSBwcm9wcy4gQ2hlY2sgdGhhdCB0aGUgZmlsZXMgZm9yIHRoZSB0ZW1wbGF0ZSBcIiR7dGVtcGxhdGV9XCIgZXhpc3QuYFxuICAgICAgKTtcblxuICAgIHJldHVybiBtZXNzYWdlO1xuICB9XG5cbiAgYXN5bmMgc2VuZChvcHRpb25zID0ge30pIHtcbiAgICBvcHRpb25zID0ge1xuICAgICAgdGVtcGxhdGU6ICcnLFxuICAgICAgbWVzc2FnZToge30sXG4gICAgICBsb2NhbHM6IHt9LFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH07XG5cbiAgICBsZXQgeyB0ZW1wbGF0ZSwgbWVzc2FnZSwgbG9jYWxzIH0gPSBvcHRpb25zO1xuXG4gICAgY29uc3QgYXR0YWNobWVudHMgPVxuICAgICAgbWVzc2FnZS5hdHRhY2htZW50cyB8fCB0aGlzLmNvbmZpZy5tZXNzYWdlLmF0dGFjaG1lbnRzIHx8IFtdO1xuXG4gICAgbWVzc2FnZSA9IF8uZGVmYXVsdHNEZWVwKFxuICAgICAge30sXG4gICAgICBfLm9taXQobWVzc2FnZSwgJ2F0dGFjaG1lbnRzJyksXG4gICAgICBfLm9taXQodGhpcy5jb25maWcubWVzc2FnZSwgJ2F0dGFjaG1lbnRzJylcbiAgICApO1xuICAgIGxvY2FscyA9IF8uZGVmYXVsdHNEZWVwKHt9LCB0aGlzLmNvbmZpZy52aWV3cy5sb2NhbHMsIGxvY2Fscyk7XG5cbiAgICBpZiAoYXR0YWNobWVudHMpIG1lc3NhZ2UuYXR0YWNobWVudHMgPSBhdHRhY2htZW50cztcblxuICAgIGRlYnVnKCd0ZW1wbGF0ZSAlcycsIHRlbXBsYXRlKTtcbiAgICBkZWJ1ZygnbWVzc2FnZSAlTycsIG1lc3NhZ2UpO1xuICAgIGRlYnVnKCdsb2NhbHMgKGtleXMgb25seSk6ICVPJywgT2JqZWN0LmtleXMobG9jYWxzKSk7XG5cbiAgICAvLyBnZXQgYWxsIGF2YWlsYWJsZSB0ZW1wbGF0ZXNcbiAgICBjb25zdCBvYmogPSBhd2FpdCB0aGlzLnJlbmRlckFsbCh0ZW1wbGF0ZSwgbG9jYWxzLCBtZXNzYWdlKTtcblxuICAgIC8vIGFzc2lnbiB0aGUgb2JqZWN0IHZhcmlhYmxlcyBvdmVyIHRvIHRoZSBtZXNzYWdlXG4gICAgT2JqZWN0LmFzc2lnbihtZXNzYWdlLCBvYmopO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLnByZXZpZXcpIHtcbiAgICAgIGRlYnVnKCd1c2luZyBgcHJldmlldy1lbWFpbGAgdG8gcHJldmlldyBlbWFpbCcpO1xuICAgICAgaWYgKF8uaXNPYmplY3QodGhpcy5jb25maWcucHJldmlldykpXG4gICAgICAgIGF3YWl0IHByZXZpZXdFbWFpbChtZXNzYWdlLCB0aGlzLmNvbmZpZy5wcmV2aWV3KTtcbiAgICAgIGVsc2UgYXdhaXQgcHJldmlld0VtYWlsKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5jb25maWcuc2VuZCkge1xuICAgICAgZGVidWcoJ3NlbmQgZGlzYWJsZWQgc28gd2UgYXJlIGVuc3VyaW5nIEpTT05UcmFuc3BvcnQnKTtcbiAgICAgIC8vIDxodHRwczovL2dpdGh1Yi5jb20vbm9kZW1haWxlci9ub2RlbWFpbGVyL2lzc3Vlcy83OTg+XG4gICAgICAvLyBpZiAodGhpcy5jb25maWcudHJhbnNwb3J0Lm5hbWUgIT09ICdKU09OVHJhbnNwb3J0JylcbiAgICAgIHRoaXMuY29uZmlnLnRyYW5zcG9ydCA9IG5vZGVtYWlsZXIuY3JlYXRlVHJhbnNwb3J0KHtcbiAgICAgICAganNvblRyYW5zcG9ydDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jb25maWcudHJhbnNwb3J0LnNlbmRNYWlsKG1lc3NhZ2UpO1xuICAgIGRlYnVnKCdtZXNzYWdlIHNlbnQnKTtcbiAgICByZXMub3JpZ2luYWxNZXNzYWdlID0gbWVzc2FnZTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gRW1haWw7XG4iXX0=
{
"name": "email-templates",
"description": "Create, preview, and send custom email templates for Node.js. Highly configurable and supports automatic inline CSS, stylesheets, embedded images and fonts, and much more! Made for sending beautiful emails with Lad.",
"version": "5.1.0",
"version": "6.0.0",
"author": "Nick Baugh <niftylettuce@gmail.com> (http://niftylettuce.com)",

@@ -20,4 +20,4 @@ "bugs": {

"@ladjs/i18n": "^1.1.0",
"@sindresorhus/is": "^0.17.1",
"auto-bind": "^2.1.0",
"bluebird": "^3.5.5",
"consolidate": "^0.15.1",

@@ -30,4 +30,4 @@ "debug": "^4.1.1",

"nodemailer": "^6.2.1",
"preview-email": "^0.0.10",
"underscore.string": "^3.3.5"
"pify": "^4.0.1",
"preview-email": "^1.0.1"
},

@@ -38,24 +38,24 @@ "devDependencies": {

"@babel/preset-env": "^7.4.5",
"@commitlint/cli": "^7.6.1",
"@commitlint/config-conventional": "^7.6.0",
"ava": "^1.4.1",
"@commitlint/cli": "^8.0.0",
"@commitlint/config-conventional": "^8.0.0",
"ava": "^2.1.0",
"cheerio": "^1.0.0-rc.2",
"codecov": "^3.5.0",
"cross-env": "^5.2.0",
"ejs": "^2.6.1",
"eslint": "^5.16.0",
"ejs": "^2.6.2",
"eslint": "^6.0.0",
"eslint-config-xo-lass": "^1.0.3",
"eslint-plugin-node": "^9.1.0",
"fixpack": "^2.3.1",
"husky": "^2.3.0",
"lint-staged": "^8.1.7",
"husky": "^2.4.1",
"lint-staged": "^8.2.1",
"nodemailer-sendgrid": "^1.0.3",
"nyc": "^14.1.1",
"pug": "^2.0.3",
"pug": "^2.0.4",
"remark-cli": "^6.0.1",
"remark-preset-github": "^0.0.13",
"remark-preset-github": "^0.0.14",
"xo": "^0.24.0"
},
"engines": {
"node": ">=6.4.0"
"node": ">=8"
},

@@ -143,7 +143,4 @@ "files": [

"config.js"
],
"rules": {
"no-use-extend-native/no-use-extend-native": "off"
}
]
}
}

@@ -14,7 +14,3 @@ # [**Email Templates**](https://github.com/niftylettuce/email-templates)

**Still on v4.x?**: v5.x is released with only one minor breaking change, see [breaking changes below](#v5-breaking-changes).
**Still on v2.x?**: v3.x is released (you'll need Node v6.4.0+); see [breaking changes below](#v3-breaking-changes). [2.x branch][2-x-branch] docs available if necessary.
## Table of Contents

@@ -42,4 +38,7 @@

* [Plugins](#plugins)
* [V5 Breaking Changes](#v5-breaking-changes)
* [V3 Breaking Changes](#v3-breaking-changes)
* [Breaking Changes](#breaking-changes)
* [v6.0.0](#v600)
* [v5.0.0](#v500)
* [v4.0.0](#v400)
* [v3.0.0](#v300)
* [Tip](#tip)

@@ -74,5 +73,5 @@ * [Related](#related)

If you have trouble previewing emails in your browser, you can configure a `preview` option which gets passed along to [opn's options][opn-options] (e.g. `{ app: 'firefox' }`). See the example below for [Open Email Previews in Firefox](#open-email-previews-in-firefox).
If you have trouble previewing emails in your browser, you can configure a `preview` option which gets passed along to [open's options][open-options] (e.g. `preview: { open: { app: 'firefox' } }`).
<a target="_blank" href="https://github.com/niftylettuce/preview-email/blob/master/demo.png">View the demo</a>
See the example below for [Open Email Previews in Firefox](#open-email-previews-in-firefox).

@@ -82,4 +81,2 @@

> **UPGRADING?** If you are upgrading from v2 to v3, see [v3 Breaking Changes](#v3-breaking-changes) below. You'll need Node v6.4.0+ now.
### Debugging

@@ -664,3 +661,3 @@

The `preview` option can be a custom Object of options to pass along to [opn's options][opn-options].
The `preview` option can be a custom Object of options to pass along to [open's options][open-options].

@@ -673,4 +670,6 @@ > Firefox example:

preview: {
app: 'firefox',
wait: false
open: {
app: 'firefox',
wait: false
}
}

@@ -740,9 +739,39 @@ });

## V5 Breaking Changes
## Breaking Changes
In version 5.x+, we changed the order of defaults being set. See [#313](https://github.com/niftylettuce/email-templates/issues/313) for more information. This allows you to override message options such as `from` (even if you have a global default `from` set).
See the [Releases](https://github.com/niftylettuce/email-templates/releases) page for an up to date changelog.
### v6.0.0
## V3 Breaking Changes
* Performance should be significantly improved as the rendering of subject, html, and text parts now occurs asynchronously in parallel (previously it was in series and had blocking lookup calls).
* We removed [bluebird][] and replaced it with a lightweight alternative [pify][] (since all we were using was the `Promise.promisify` method from `bluebird` as well).
* This package now only supports Node v8.x+ (due to [preview-email][]'s [open][] dependency requiring it).
* Configuration for the `preview` option has slightly changed, which now allows you to [specify a custom template and stylesheets](https://github.com/niftylettuce/preview-email#custom-preview-template-and-stylesheets) for preview rendering.
> If you were using a custom `preview` option before, you will need to change it slightly:
```diff
const email = new Email({
// ...
preview: {
+ open: {
+ app: 'firefox',
+ wait: false
+ }
- app: 'firefox',
- wait: false
}
});
```
### v5.0.0
In version 4.x+, we changed the order of defaults being set. See [#313](https://github.com/niftylettuce/email-templates/issues/313) for more information. This allows you to override message options such as `from` (even if you have a global default `from` set).
### v4.0.0
See v5.0.0 above
### v3.0.0
> If you are upgrading from v2 or prior to v3, please note that the following breaking API changes occurred:

@@ -784,3 +813,3 @@

6. There are new options `options.send` and `options.preview`. Both are Boolean values and configured automatically based off the environment. Take a look at the [configuration object](src/index.js). Note that you can optionally pass an Object to `preview` option, which gets passed along to [opn's options][opn-options].
6. There are new options `options.send` and `options.preview`. Both are Boolean values and configured automatically based off the environment. Take a look at the [configuration object](src/index.js). Note that you can optionally pass an Object to `preview` option, which gets passed along to [open's options][open-options].

@@ -838,4 +867,2 @@ 7. If you wish to send emails in development or test environment (disabled by default), set `options.send` to `true`.

[2-x-branch]: https://github.com/niftylettuce/node-email-templates/tree/2.x
[i18n]: https://github.com/ladjs/i18n#options

@@ -871,3 +898,3 @@

[opn-options]: https://github.com/sindresorhus/opn#options
[open-options]: https://github.com/sindresorhus/open#options

@@ -887,1 +914,7 @@ [mandarin]: https://github.com/niftylettuce/mandarin

[juice]: https://github.com/Automattic/juice
[bluebird]: https://github.com/petkaantonov/bluebird
[pify]: https://github.com/sindresorhus/pify
[open]: https://github.com/sindresorhus/open
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc