font-awesome-assets
Version:
Convert any of @FortAwesome's Font-Awesome icons to an asset, such as an <svg> tag or a Base64-encoded PNG/SVG <img> tag! It supports Retina devices and custom tag attributes too! This package was built for @CrocodileJS.
169 lines (129 loc) • 18.6 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.iconsByUnicodeHex = exports.icons = exports.aliases = undefined;
exports.svg = svg;
exports.img = img;
exports.png = png;
exports.png2x = png2x;
exports.png3x = png3x;
var _cheerio = require('cheerio');
var _cheerio2 = _interopRequireDefault(_cheerio);
var _svg2png = require('svg2png');
var _svg2png2 = _interopRequireDefault(_svg2png);
var _lodash = require('lodash');
var _lodash2 = _interopRequireDefault(_lodash);
var _svgfont2js = require('@ladjs/svgfont2js');
var _svgfont2js2 = _interopRequireDefault(_svgfont2js);
var _fs = require('fs');
var _fs2 = _interopRequireDefault(_fs);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function applyAttributes($el, attrs) {
// [ [ attr, val ], ... ]
if (!_lodash2.default.isArray(attrs) || attrs.length === 0) return $el;
var hasMissing = _lodash2.default.some(attrs, function (pair) {
return !_lodash2.default.isArray(pair) || pair.length !== 2;
});
if (hasMissing) throw new Error('attribute pairs must be arrays with two keys [ attr, val ]');
_lodash2.default.each(attrs, function (pair) {
$el.attr(pair[0], pair[1]);
});
return $el;
}
// inspired by <https://github.com/riobard/font-awesome-svg/blob/master/extract.js>
function loadAliases(less) {
var pairs = _lodash2.default.compact(_lodash2.default.map(less.split('\n'), function (line) {
// line is `@fa-var-dropbox: "\f16b";`
if (line.indexOf('@fa-var-') !== 0) return;
// now it is `dropbox: "\f16b";`
line = line.split('@fa-var-', 2)[1];
// split the line by the `: ` delimiter
line = line.split(': ');
// now we have a line array that looks like:
// [0] = `dropbox`
// [1] = "\f16b";`
// clean up the first key
line[1] = line[1].split('"')[1].substring(1);
return { name: line[0], unicode: line[1] };
}));
return _lodash2.default.zipObject(_lodash2.default.map(pairs, 'name'), _lodash2.default.map(pairs, 'unicode'));
}
var aliases = exports.aliases = loadAliases(_fs2.default.readFileSync(require.resolve('font-awesome/less/variables.less'), 'utf8'));
var icons = exports.icons = (0, _svgfont2js2.default)(_fs2.default.readFileSync(require.resolve('font-awesome/fonts/fontawesome-webfont.svg'), 'utf8'));
var iconsByUnicodeHex = exports.iconsByUnicodeHex = _lodash2.default.zipObject(_lodash2.default.map(icons, 'unicode_hex'), icons);
function svg(name, color, width, height, attrs) {
// set defaults
name = name || 'smile-o';
color = color || '#000';
width = (width || '100%').toString();
height = (height || '100%').toString();
// check variable types
if (!_lodash2.default.isString(name)) throw new Error('fa.svg `name` must be a String');
if (!_lodash2.default.isString(color)) throw new Error('fa.svg `color` must be a String');
// convert name to lowercase
name = name.toLowerCase();
// remove "fa-" prefix from name if it exists
if (name.indexOf('fa-') === 0) name = name.substring(3);
// ensure that the font exists, otherwise throw an error
if (!_lodash2.default.isString(aliases[name])) throw new Error('fa.svg name "' + name + '" must be a valid FontAwesome icon name');
// get the icon svg information
var icon = iconsByUnicodeHex[aliases[name]];
// ensure that the font svg exists, otherwise throw an error
if (!_lodash2.default.isObject(icon)) throw new Error('fa.svg name "' + name + '" was missing its font SVG value parsed');
// return the svg
var $svg = (0, _cheerio2.default)('<svg>', {
xmlMode: true
});
$svg.attr('xmlns', 'http://www.w3.org/2000/svg');
$svg.attr('width', width);
$svg.attr('height', height);
$svg.attr('viewBox', '0 0 ' + icon.width + ' ' + icon.height);
$svg = applyAttributes($svg, attrs);
$svg.append('<path fill="' + color + '" d="' + icon.path + '" />');
return _cheerio2.default.html($svg);
}
function img(name, color, width, height, attrs) {
var str = svg(name, color);
var $img = (0, _cheerio2.default)('<img>');
$img.attr('width', width);
$img.attr('height', height);
$img.attr('src', 'data:image/svg+xml;base64,' + new Buffer(str, 'binary').toString('base64'));
$img = applyAttributes($img, attrs);
return _cheerio2.default.html($img);
}
function png(name, color, width, height, attrs, size) {
var str = svg(name, color);
width = parseInt(width, 10) || 16;
height = parseInt(height, 10) || 16;
size = parseInt(size, 10) || 1;
if (!_lodash2.default.isNumber(width)) throw new Error('fa.png width must be a number');
if (!_lodash2.default.isNumber(height)) throw new Error('fa.png height must be a number');
str = _svg2png2.default.sync(new Buffer(str, 'utf8'), {
width: parseInt(width * size, 10),
height: parseInt(height * size, 10)
});
var $img = (0, _cheerio2.default)('<img>');
$img.attr('width', width);
$img.attr('height', height);
$img.attr('src', 'data:image/png;base64,' + str.toString('base64'));
$img = applyAttributes($img, attrs);
return _cheerio2.default.html($img);
}
function png2x(name, color, width, height, attrs) {
return png(name, color, width, height, attrs, 2);
}
function png3x(name, color, width, height, attrs) {
return png(name, color, width, height, attrs, 3);
}
exports.default = {
aliases: aliases,
icons: icons,
iconsByUnicodeHex: iconsByUnicodeHex,
img: img,
svg: svg,
png: png,
png2x: png2x,
png3x: png3x
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJzdmciLCJpbWciLCJwbmciLCJwbmcyeCIsInBuZzN4IiwiYXBwbHlBdHRyaWJ1dGVzIiwiJGVsIiwiYXR0cnMiLCJfIiwiaXNBcnJheSIsImxlbmd0aCIsImhhc01pc3NpbmciLCJzb21lIiwicGFpciIsIkVycm9yIiwiZWFjaCIsImF0dHIiLCJsb2FkQWxpYXNlcyIsImxlc3MiLCJwYWlycyIsImNvbXBhY3QiLCJtYXAiLCJzcGxpdCIsImxpbmUiLCJpbmRleE9mIiwic3Vic3RyaW5nIiwibmFtZSIsInVuaWNvZGUiLCJ6aXBPYmplY3QiLCJhbGlhc2VzIiwiZnMiLCJyZWFkRmlsZVN5bmMiLCJyZXF1aXJlIiwicmVzb2x2ZSIsImljb25zIiwiaWNvbnNCeVVuaWNvZGVIZXgiLCJjb2xvciIsIndpZHRoIiwiaGVpZ2h0IiwidG9TdHJpbmciLCJpc1N0cmluZyIsInRvTG93ZXJDYXNlIiwiaWNvbiIsImlzT2JqZWN0IiwiJHN2ZyIsInhtbE1vZGUiLCJhcHBlbmQiLCJwYXRoIiwiJCIsImh0bWwiLCJzdHIiLCIkaW1nIiwiQnVmZmVyIiwic2l6ZSIsInBhcnNlSW50IiwiaXNOdW1iZXIiLCJzdmcycG5nIiwic3luYyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O1FBeUVnQkEsRyxHQUFBQSxHO1FBNENBQyxHLEdBQUFBLEc7UUFVQUMsRyxHQUFBQSxHO1FBbUJBQyxLLEdBQUFBLEs7UUFJQUMsSyxHQUFBQSxLOztBQXJKaEI7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7O0FBRUEsU0FBU0MsZUFBVCxDQUF5QkMsR0FBekIsRUFBOEJDLEtBQTlCLEVBQXFDO0FBQ25DO0FBQ0EsTUFBSSxDQUFDQyxpQkFBRUMsT0FBRixDQUFVRixLQUFWLENBQUQsSUFBcUJBLE1BQU1HLE1BQU4sS0FBaUIsQ0FBMUMsRUFDRSxPQUFPSixHQUFQO0FBQ0YsTUFBTUssYUFBYUgsaUJBQUVJLElBQUYsQ0FBT0wsS0FBUCxFQUFjLGdCQUFRO0FBQ3ZDLFdBQU8sQ0FBQ0MsaUJBQUVDLE9BQUYsQ0FBVUksSUFBVixDQUFELElBQW9CQSxLQUFLSCxNQUFMLEtBQWdCLENBQTNDO0FBQ0QsR0FGa0IsQ0FBbkI7QUFHQSxNQUFJQyxVQUFKLEVBQWdCLE1BQU0sSUFBSUcsS0FBSixDQUFVLDREQUFWLENBQU47QUFDaEJOLG1CQUFFTyxJQUFGLENBQU9SLEtBQVAsRUFBYyxnQkFBUTtBQUNwQkQsUUFBSVUsSUFBSixDQUFTSCxLQUFLLENBQUwsQ0FBVCxFQUFrQkEsS0FBSyxDQUFMLENBQWxCO0FBQ0QsR0FGRDtBQUdBLFNBQU9QLEdBQVA7QUFDRDs7QUFFRDs7QUFFQSxTQUFTVyxXQUFULENBQXFCQyxJQUFyQixFQUEyQjs7QUFFekIsTUFBTUMsUUFBUVgsaUJBQUVZLE9BQUYsQ0FBVVosaUJBQUVhLEdBQUYsQ0FBTUgsS0FBS0ksS0FBTCxDQUFXLElBQVgsQ0FBTixFQUF3QixnQkFBUTs7QUFFdEQ7QUFDQSxRQUFJQyxLQUFLQyxPQUFMLENBQWEsVUFBYixNQUE2QixDQUFqQyxFQUFvQzs7QUFFcEM7QUFDQUQsV0FBT0EsS0FBS0QsS0FBTCxDQUFXLFVBQVgsRUFBdUIsQ0FBdkIsRUFBMEIsQ0FBMUIsQ0FBUDs7QUFFQTtBQUNBQyxXQUFPQSxLQUFLRCxLQUFMLENBQVcsSUFBWCxDQUFQOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBQyxTQUFLLENBQUwsSUFBVUEsS0FBSyxDQUFMLEVBQVFELEtBQVIsQ0FBYyxHQUFkLEVBQW1CLENBQW5CLEVBQXNCRyxTQUF0QixDQUFnQyxDQUFoQyxDQUFWOztBQUVBLFdBQU8sRUFBRUMsTUFBTUgsS0FBSyxDQUFMLENBQVIsRUFBaUJJLFNBQVNKLEtBQUssQ0FBTCxDQUExQixFQUFQO0FBRUQsR0FwQnVCLENBQVYsQ0FBZDs7QUFzQkEsU0FBT2YsaUJBQUVvQixTQUFGLENBQ0xwQixpQkFBRWEsR0FBRixDQUFNRixLQUFOLEVBQWEsTUFBYixDQURLLEVBRUxYLGlCQUFFYSxHQUFGLENBQU1GLEtBQU4sRUFBYSxTQUFiLENBRkssQ0FBUDtBQUtEOztBQUVNLElBQU1VLDRCQUFVWixZQUNyQmEsYUFBR0MsWUFBSCxDQUNFQyxRQUFRQyxPQUFSLENBQWdCLGtDQUFoQixDQURGLEVBRUUsTUFGRixDQURxQixDQUFoQjs7QUFPQSxJQUFNQyx3QkFBUSwwQkFDbkJKLGFBQUdDLFlBQUgsQ0FDRUMsUUFBUUMsT0FBUixDQUFnQiw0Q0FBaEIsQ0FERixFQUVFLE1BRkYsQ0FEbUIsQ0FBZDs7QUFPQSxJQUFNRSxnREFBb0IzQixpQkFBRW9CLFNBQUYsQ0FDL0JwQixpQkFBRWEsR0FBRixDQUFNYSxLQUFOLEVBQWEsYUFBYixDQUQrQixFQUUvQkEsS0FGK0IsQ0FBMUI7O0FBS0EsU0FBU2xDLEdBQVQsQ0FBYTBCLElBQWIsRUFBbUJVLEtBQW5CLEVBQTBCQyxLQUExQixFQUFpQ0MsTUFBakMsRUFBeUMvQixLQUF6QyxFQUFnRDs7QUFFckQ7QUFDQW1CLFNBQU9BLFFBQVEsU0FBZjtBQUNBVSxVQUFRQSxTQUFTLE1BQWpCO0FBQ0FDLFVBQVEsQ0FBQ0EsU0FBUyxNQUFWLEVBQWtCRSxRQUFsQixFQUFSO0FBQ0FELFdBQVMsQ0FBQ0EsVUFBVSxNQUFYLEVBQW1CQyxRQUFuQixFQUFUOztBQUVBO0FBQ0EsTUFBSSxDQUFDL0IsaUJBQUVnQyxRQUFGLENBQVdkLElBQVgsQ0FBTCxFQUF1QixNQUFNLElBQUlaLEtBQUosQ0FBVSxnQ0FBVixDQUFOO0FBQ3ZCLE1BQUksQ0FBQ04saUJBQUVnQyxRQUFGLENBQVdKLEtBQVgsQ0FBTCxFQUF3QixNQUFNLElBQUl0QixLQUFKLENBQVUsaUNBQVYsQ0FBTjs7QUFFeEI7QUFDQVksU0FBT0EsS0FBS2UsV0FBTCxFQUFQOztBQUVBO0FBQ0EsTUFBSWYsS0FBS0YsT0FBTCxDQUFhLEtBQWIsTUFBd0IsQ0FBNUIsRUFDRUUsT0FBT0EsS0FBS0QsU0FBTCxDQUFlLENBQWYsQ0FBUDs7QUFFRjtBQUNBLE1BQUksQ0FBQ2pCLGlCQUFFZ0MsUUFBRixDQUFXWCxRQUFRSCxJQUFSLENBQVgsQ0FBTCxFQUNFLE1BQU0sSUFBSVosS0FBSixtQkFBMEJZLElBQTFCLDZDQUFOOztBQUVGO0FBQ0EsTUFBTWdCLE9BQU9QLGtCQUFrQk4sUUFBUUgsSUFBUixDQUFsQixDQUFiOztBQUVBO0FBQ0EsTUFBSSxDQUFDbEIsaUJBQUVtQyxRQUFGLENBQVdELElBQVgsQ0FBTCxFQUNFLE1BQU0sSUFBSTVCLEtBQUosbUJBQTBCWSxJQUExQiw2Q0FBTjs7QUFFRjtBQUNBLE1BQUlrQixPQUFPLHVCQUFFLE9BQUYsRUFBVztBQUNwQkMsYUFBUztBQURXLEdBQVgsQ0FBWDtBQUdBRCxPQUFLNUIsSUFBTCxDQUFVLE9BQVYsRUFBbUIsNEJBQW5CO0FBQ0E0QixPQUFLNUIsSUFBTCxDQUFVLE9BQVYsRUFBbUJxQixLQUFuQjtBQUNBTyxPQUFLNUIsSUFBTCxDQUFVLFFBQVYsRUFBb0JzQixNQUFwQjtBQUNBTSxPQUFLNUIsSUFBTCxDQUFVLFNBQVYsV0FBNEIwQixLQUFLTCxLQUFqQyxTQUEwQ0ssS0FBS0osTUFBL0M7QUFDQU0sU0FBT3ZDLGdCQUFnQnVDLElBQWhCLEVBQXNCckMsS0FBdEIsQ0FBUDtBQUNBcUMsT0FBS0UsTUFBTCxrQkFBMkJWLEtBQTNCLGFBQXdDTSxLQUFLSyxJQUE3QztBQUNBLFNBQU9DLGtCQUFFQyxJQUFGLENBQU9MLElBQVAsQ0FBUDtBQUVEOztBQUVNLFNBQVMzQyxHQUFULENBQWF5QixJQUFiLEVBQW1CVSxLQUFuQixFQUEwQkMsS0FBMUIsRUFBaUNDLE1BQWpDLEVBQXlDL0IsS0FBekMsRUFBZ0Q7QUFDckQsTUFBTTJDLE1BQU1sRCxJQUFJMEIsSUFBSixFQUFVVSxLQUFWLENBQVo7QUFDQSxNQUFJZSxPQUFPLHVCQUFFLE9BQUYsQ0FBWDtBQUNBQSxPQUFLbkMsSUFBTCxDQUFVLE9BQVYsRUFBbUJxQixLQUFuQjtBQUNBYyxPQUFLbkMsSUFBTCxDQUFVLFFBQVYsRUFBb0JzQixNQUFwQjtBQUNBYSxPQUFLbkMsSUFBTCxDQUFVLEtBQVYsaUNBQThDLElBQUlvQyxNQUFKLENBQVdGLEdBQVgsRUFBZ0IsUUFBaEIsRUFBMEJYLFFBQTFCLENBQW1DLFFBQW5DLENBQTlDO0FBQ0FZLFNBQU85QyxnQkFBZ0I4QyxJQUFoQixFQUFzQjVDLEtBQXRCLENBQVA7QUFDQSxTQUFPeUMsa0JBQUVDLElBQUYsQ0FBT0UsSUFBUCxDQUFQO0FBQ0Q7O0FBRU0sU0FBU2pELEdBQVQsQ0FBYXdCLElBQWIsRUFBbUJVLEtBQW5CLEVBQTBCQyxLQUExQixFQUFpQ0MsTUFBakMsRUFBeUMvQixLQUF6QyxFQUFnRDhDLElBQWhELEVBQXNEO0FBQzNELE1BQUlILE1BQU1sRCxJQUFJMEIsSUFBSixFQUFVVSxLQUFWLENBQVY7QUFDQUMsVUFBUWlCLFNBQVNqQixLQUFULEVBQWdCLEVBQWhCLEtBQXVCLEVBQS9CO0FBQ0FDLFdBQVNnQixTQUFTaEIsTUFBVCxFQUFpQixFQUFqQixLQUF3QixFQUFqQztBQUNBZSxTQUFPQyxTQUFTRCxJQUFULEVBQWUsRUFBZixLQUFzQixDQUE3QjtBQUNBLE1BQUksQ0FBQzdDLGlCQUFFK0MsUUFBRixDQUFXbEIsS0FBWCxDQUFMLEVBQXdCLE1BQU0sSUFBSXZCLEtBQUosQ0FBVSwrQkFBVixDQUFOO0FBQ3hCLE1BQUksQ0FBQ04saUJBQUUrQyxRQUFGLENBQVdqQixNQUFYLENBQUwsRUFBeUIsTUFBTSxJQUFJeEIsS0FBSixDQUFVLGdDQUFWLENBQU47QUFDekJvQyxRQUFNTSxrQkFBUUMsSUFBUixDQUFhLElBQUlMLE1BQUosQ0FBV0YsR0FBWCxFQUFnQixNQUFoQixDQUFiLEVBQXNDO0FBQzFDYixXQUFPaUIsU0FBU2pCLFFBQVFnQixJQUFqQixFQUF1QixFQUF2QixDQURtQztBQUUxQ2YsWUFBUWdCLFNBQVNoQixTQUFTZSxJQUFsQixFQUF3QixFQUF4QjtBQUZrQyxHQUF0QyxDQUFOO0FBSUEsTUFBSUYsT0FBTyx1QkFBRSxPQUFGLENBQVg7QUFDQUEsT0FBS25DLElBQUwsQ0FBVSxPQUFWLEVBQW1CcUIsS0FBbkI7QUFDQWMsT0FBS25DLElBQUwsQ0FBVSxRQUFWLEVBQW9Cc0IsTUFBcEI7QUFDQWEsT0FBS25DLElBQUwsQ0FBVSxLQUFWLDZCQUEwQ2tDLElBQUlYLFFBQUosQ0FBYSxRQUFiLENBQTFDO0FBQ0FZLFNBQU85QyxnQkFBZ0I4QyxJQUFoQixFQUFzQjVDLEtBQXRCLENBQVA7QUFDQSxTQUFPeUMsa0JBQUVDLElBQUYsQ0FBT0UsSUFBUCxDQUFQO0FBQ0Q7O0FBRU0sU0FBU2hELEtBQVQsQ0FBZXVCLElBQWYsRUFBcUJVLEtBQXJCLEVBQTRCQyxLQUE1QixFQUFtQ0MsTUFBbkMsRUFBMkMvQixLQUEzQyxFQUFrRDtBQUN2RCxTQUFPTCxJQUFJd0IsSUFBSixFQUFVVSxLQUFWLEVBQWlCQyxLQUFqQixFQUF3QkMsTUFBeEIsRUFBZ0MvQixLQUFoQyxFQUF1QyxDQUF2QyxDQUFQO0FBQ0Q7O0FBRU0sU0FBU0gsS0FBVCxDQUFlc0IsSUFBZixFQUFxQlUsS0FBckIsRUFBNEJDLEtBQTVCLEVBQW1DQyxNQUFuQyxFQUEyQy9CLEtBQTNDLEVBQWtEO0FBQ3ZELFNBQU9MLElBQUl3QixJQUFKLEVBQVVVLEtBQVYsRUFBaUJDLEtBQWpCLEVBQXdCQyxNQUF4QixFQUFnQy9CLEtBQWhDLEVBQXVDLENBQXZDLENBQVA7QUFDRDs7a0JBRWM7QUFDYnNCLGtCQURhO0FBRWJLLGNBRmE7QUFHYkMsc0NBSGE7QUFJYmxDLFVBSmE7QUFLYkQsVUFMYTtBQU1iRSxVQU5hO0FBT2JDLGNBUGE7QUFRYkM7QUFSYSxDIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgJCBmcm9tICdjaGVlcmlvJztcbmltcG9ydCBzdmcycG5nIGZyb20gJ3N2ZzJwbmcnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBzdmdmb250MmpzIGZyb20gJ0BsYWRqcy9zdmdmb250MmpzJztcbmltcG9ydCBmcyBmcm9tICdmcyc7XG5cbmZ1bmN0aW9uIGFwcGx5QXR0cmlidXRlcygkZWwsIGF0dHJzKSB7XG4gIC8vIFsgWyBhdHRyLCB2YWwgXSwgLi4uIF1cbiAgaWYgKCFfLmlzQXJyYXkoYXR0cnMpIHx8IGF0dHJzLmxlbmd0aCA9PT0gMClcbiAgICByZXR1cm4gJGVsO1xuICBjb25zdCBoYXNNaXNzaW5nID0gXy5zb21lKGF0dHJzLCBwYWlyID0+IHtcbiAgICByZXR1cm4gIV8uaXNBcnJheShwYWlyKSB8fCBwYWlyLmxlbmd0aCAhPT0gMjtcbiAgfSk7XG4gIGlmIChoYXNNaXNzaW5nKSB0aHJvdyBuZXcgRXJyb3IoJ2F0dHJpYnV0ZSBwYWlycyBtdXN0IGJlIGFycmF5cyB3aXRoIHR3byBrZXlzIFsgYXR0ciwgdmFsIF0nKTtcbiAgXy5lYWNoKGF0dHJzLCBwYWlyID0+IHtcbiAgICAkZWwuYXR0cihwYWlyWzBdLCBwYWlyWzFdKTtcbiAgfSk7XG4gIHJldHVybiAkZWw7XG59XG5cbi8vIGluc3BpcmVkIGJ5IDxodHRwczovL2dpdGh1Yi5jb20vcmlvYmFyZC9mb250LWF3ZXNvbWUtc3ZnL2Jsb2IvbWFzdGVyL2V4dHJhY3QuanM+XG5cbmZ1bmN0aW9uIGxvYWRBbGlhc2VzKGxlc3MpIHtcblxuICBjb25zdCBwYWlycyA9IF8uY29tcGFjdChfLm1hcChsZXNzLnNwbGl0KCdcXG4nKSwgbGluZSA9PiB7XG5cbiAgICAvLyBsaW5lIGlzIGBAZmEtdmFyLWRyb3Bib3g6IFwiXFxmMTZiXCI7YFxuICAgIGlmIChsaW5lLmluZGV4T2YoJ0BmYS12YXItJykgIT09IDApIHJldHVybjtcblxuICAgIC8vIG5vdyBpdCBpcyBgZHJvcGJveDogXCJcXGYxNmJcIjtgXG4gICAgbGluZSA9IGxpbmUuc3BsaXQoJ0BmYS12YXItJywgMilbMV07XG5cbiAgICAvLyBzcGxpdCB0aGUgbGluZSBieSB0aGUgYDogYCBkZWxpbWl0ZXJcbiAgICBsaW5lID0gbGluZS5zcGxpdCgnOiAnKTtcblxuICAgIC8vIG5vdyB3ZSBoYXZlIGEgbGluZSBhcnJheSB0aGF0IGxvb2tzIGxpa2U6XG4gICAgLy8gWzBdID0gYGRyb3Bib3hgXG4gICAgLy8gWzFdID0gXCJcXGYxNmJcIjtgXG5cbiAgICAvLyBjbGVhbiB1cCB0aGUgZmlyc3Qga2V5XG4gICAgbGluZVsxXSA9IGxpbmVbMV0uc3BsaXQoJ1wiJylbMV0uc3Vic3RyaW5nKDEpO1xuXG4gICAgcmV0dXJuIHsgbmFtZTogbGluZVswXSwgdW5pY29kZTogbGluZVsxXSB9O1xuXG4gIH0pKTtcblxuICByZXR1cm4gXy56aXBPYmplY3QoXG4gICAgXy5tYXAocGFpcnMsICduYW1lJyksXG4gICAgXy5tYXAocGFpcnMsICd1bmljb2RlJylcbiAgKTtcblxufVxuXG5leHBvcnQgY29uc3QgYWxpYXNlcyA9IGxvYWRBbGlhc2VzKFxuICBmcy5yZWFkRmlsZVN5bmMoXG4gICAgcmVxdWlyZS5yZXNvbHZlKCdmb250LWF3ZXNvbWUvbGVzcy92YXJpYWJsZXMubGVzcycpLFxuICAgICd1dGY4J1xuICApXG4pO1xuXG5leHBvcnQgY29uc3QgaWNvbnMgPSBzdmdmb250MmpzKFxuICBmcy5yZWFkRmlsZVN5bmMoXG4gICAgcmVxdWlyZS5yZXNvbHZlKCdmb250LWF3ZXNvbWUvZm9udHMvZm9udGF3ZXNvbWUtd2ViZm9udC5zdmcnKSxcbiAgICAndXRmOCdcbiAgKVxuKTtcblxuZXhwb3J0IGNvbnN0IGljb25zQnlVbmljb2RlSGV4ID0gXy56aXBPYmplY3QoXG4gIF8ubWFwKGljb25zLCAndW5pY29kZV9oZXgnKSxcbiAgaWNvbnNcbik7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdmcobmFtZSwgY29sb3IsIHdpZHRoLCBoZWlnaHQsIGF0dHJzKSB7XG5cbiAgLy8gc2V0IGRlZmF1bHRzXG4gIG5hbWUgPSBuYW1lIHx8ICdzbWlsZS1vJztcbiAgY29sb3IgPSBjb2xvciB8fCAnIzAwMCc7XG4gIHdpZHRoID0gKHdpZHRoIHx8ICcxMDAlJykudG9TdHJpbmcoKTtcbiAgaGVpZ2h0ID0gKGhlaWdodCB8fCAnMTAwJScpLnRvU3RyaW5nKCk7XG5cbiAgLy8gY2hlY2sgdmFyaWFibGUgdHlwZXNcbiAgaWYgKCFfLmlzU3RyaW5nKG5hbWUpKSB0aHJvdyBuZXcgRXJyb3IoJ2ZhLnN2ZyBgbmFtZWAgbXVzdCBiZSBhIFN0cmluZycpO1xuICBpZiAoIV8uaXNTdHJpbmcoY29sb3IpKSB0aHJvdyBuZXcgRXJyb3IoJ2ZhLnN2ZyBgY29sb3JgIG11c3QgYmUgYSBTdHJpbmcnKTtcblxuICAvLyBjb252ZXJ0IG5hbWUgdG8gbG93ZXJjYXNlXG4gIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgLy8gcmVtb3ZlIFwiZmEtXCIgcHJlZml4IGZyb20gbmFtZSBpZiBpdCBleGlzdHNcbiAgaWYgKG5hbWUuaW5kZXhPZignZmEtJykgPT09IDApXG4gICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDMpO1xuXG4gIC8vIGVuc3VyZSB0aGF0IHRoZSBmb250IGV4aXN0cywgb3RoZXJ3aXNlIHRocm93IGFuIGVycm9yXG4gIGlmICghXy5pc1N0cmluZyhhbGlhc2VzW25hbWVdKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGZhLnN2ZyBuYW1lIFwiJHtuYW1lfVwiIG11c3QgYmUgYSB2YWxpZCBGb250QXdlc29tZSBpY29uIG5hbWVgKTtcblxuICAvLyBnZXQgdGhlIGljb24gc3ZnIGluZm9ybWF0aW9uXG4gIGNvbnN0IGljb24gPSBpY29uc0J5VW5pY29kZUhleFthbGlhc2VzW25hbWVdXTtcblxuICAvLyBlbnN1cmUgdGhhdCB0aGUgZm9udCBzdmcgZXhpc3RzLCBvdGhlcndpc2UgdGhyb3cgYW4gZXJyb3JcbiAgaWYgKCFfLmlzT2JqZWN0KGljb24pKVxuICAgIHRocm93IG5ldyBFcnJvcihgZmEuc3ZnIG5hbWUgXCIke25hbWV9XCIgd2FzIG1pc3NpbmcgaXRzIGZvbnQgU1ZHIHZhbHVlIHBhcnNlZGApO1xuXG4gIC8vIHJldHVybiB0aGUgc3ZnXG4gIGxldCAkc3ZnID0gJCgnPHN2Zz4nLCB7XG4gICAgeG1sTW9kZTogdHJ1ZVxuICB9KTtcbiAgJHN2Zy5hdHRyKCd4bWxucycsICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycpO1xuICAkc3ZnLmF0dHIoJ3dpZHRoJywgd2lkdGgpO1xuICAkc3ZnLmF0dHIoJ2hlaWdodCcsIGhlaWdodCk7XG4gICRzdmcuYXR0cigndmlld0JveCcsIGAwIDAgJHtpY29uLndpZHRofSAke2ljb24uaGVpZ2h0fWApO1xuICAkc3ZnID0gYXBwbHlBdHRyaWJ1dGVzKCRzdmcsIGF0dHJzKTtcbiAgJHN2Zy5hcHBlbmQoYDxwYXRoIGZpbGw9XCIke2NvbG9yfVwiIGQ9XCIke2ljb24ucGF0aH1cIiAvPmApO1xuICByZXR1cm4gJC5odG1sKCRzdmcpO1xuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbWcobmFtZSwgY29sb3IsIHdpZHRoLCBoZWlnaHQsIGF0dHJzKSB7XG4gIGNvbnN0IHN0ciA9IHN2ZyhuYW1lLCBjb2xvcik7XG4gIGxldCAkaW1nID0gJCgnPGltZz4nKTtcbiAgJGltZy5hdHRyKCd3aWR0aCcsIHdpZHRoKTtcbiAgJGltZy5hdHRyKCdoZWlnaHQnLCBoZWlnaHQpO1xuICAkaW1nLmF0dHIoJ3NyYycsIGBkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCR7bmV3IEJ1ZmZlcihzdHIsICdiaW5hcnknKS50b1N0cmluZygnYmFzZTY0Jyl9YCk7XG4gICRpbWcgPSBhcHBseUF0dHJpYnV0ZXMoJGltZywgYXR0cnMpO1xuICByZXR1cm4gJC5odG1sKCRpbWcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcG5nKG5hbWUsIGNvbG9yLCB3aWR0aCwgaGVpZ2h0LCBhdHRycywgc2l6ZSkge1xuICBsZXQgc3RyID0gc3ZnKG5hbWUsIGNvbG9yKTtcbiAgd2lkdGggPSBwYXJzZUludCh3aWR0aCwgMTApIHx8IDE2O1xuICBoZWlnaHQgPSBwYXJzZUludChoZWlnaHQsIDEwKSB8fCAxNjtcbiAgc2l6ZSA9IHBhcnNlSW50KHNpemUsIDEwKSB8fCAxO1xuICBpZiAoIV8uaXNOdW1iZXIod2lkdGgpKSB0aHJvdyBuZXcgRXJyb3IoJ2ZhLnBuZyB3aWR0aCBtdXN0IGJlIGEgbnVtYmVyJyk7XG4gIGlmICghXy5pc051bWJlcihoZWlnaHQpKSB0aHJvdyBuZXcgRXJyb3IoJ2ZhLnBuZyBoZWlnaHQgbXVzdCBiZSBhIG51bWJlcicpO1xuICBzdHIgPSBzdmcycG5nLnN5bmMobmV3IEJ1ZmZlcihzdHIsICd1dGY4JyksIHtcbiAgICB3aWR0aDogcGFyc2VJbnQod2lkdGggKiBzaXplLCAxMCksXG4gICAgaGVpZ2h0OiBwYXJzZUludChoZWlnaHQgKiBzaXplLCAxMClcbiAgfSk7XG4gIGxldCAkaW1nID0gJCgnPGltZz4nKTtcbiAgJGltZy5hdHRyKCd3aWR0aCcsIHdpZHRoKTtcbiAgJGltZy5hdHRyKCdoZWlnaHQnLCBoZWlnaHQpO1xuICAkaW1nLmF0dHIoJ3NyYycsIGBkYXRhOmltYWdlL3BuZztiYXNlNjQsJHtzdHIudG9TdHJpbmcoJ2Jhc2U2NCcpfWApO1xuICAkaW1nID0gYXBwbHlBdHRyaWJ1dGVzKCRpbWcsIGF0dHJzKTtcbiAgcmV0dXJuICQuaHRtbCgkaW1nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBuZzJ4KG5hbWUsIGNvbG9yLCB3aWR0aCwgaGVpZ2h0LCBhdHRycykge1xuICByZXR1cm4gcG5nKG5hbWUsIGNvbG9yLCB3aWR0aCwgaGVpZ2h0LCBhdHRycywgMik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwbmczeChuYW1lLCBjb2xvciwgd2lkdGgsIGhlaWdodCwgYXR0cnMpIHtcbiAgcmV0dXJuIHBuZyhuYW1lLCBjb2xvciwgd2lkdGgsIGhlaWdodCwgYXR0cnMsIDMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGFsaWFzZXMsXG4gIGljb25zLFxuICBpY29uc0J5VW5pY29kZUhleCxcbiAgaW1nLFxuICBzdmcsXG4gIHBuZyxcbiAgcG5nMngsXG4gIHBuZzN4XG59O1xuIl19