geomancy
Version:
Geomantic utilities
686 lines (607 loc) • 51.5 kB
JavaScript
'use strict';
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getHouseMeanings = getHouseMeanings;
exports.houseRange = houseRange;
exports.slugify = slugify;
exports.getFigureArray = getFigureArray;
exports.House = exports.FigureDetails = exports.Figures = exports.Figure = void 0;
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
require("source-map-support/register");
var R = require('ramda');
var houseMeanings = require('./data/houses').meanings;
function getHouseMeanings() {
return houseMeanings;
}
var COMPANY_DEMI_SIMPLE = [['carcer', 'tristitia', 'cauda-draconis'], ['acquisitio', 'laetitia', 'caput-draconis'], ['puer', 'rubeus', 'cauda-draconis'], ['fortuna-major', 'fortuna-minor'], ['amisso', 'puella', 'caput-draconis'], ['albus', 'conjunctio'], ['populus', 'via']];
var COMPANY_COMPOUND = [['puer', 'puella'], ['amisso', 'acquisitio'], ['albus', 'rubeus'], ['populus', 'via'], ['fortuna-major', 'fortuna-minor'], ['conjunctio', 'carcer'], ['tristitia', 'laetitia'], ['cauda-draconis', 'caput-draconis']];
/**
* Forces `x` into the range 0-11
* @param {number} x input
* @return {number} safe number
*/
function houseRange(x) {
while (x < 0) {
x = x + 12;
}
return x % 12;
}
/**
* Converts a simple string into a slug for urls
* @param {String} name to slugify
* @return {String} slugified version
*/
function slugify(name) {
return name.toLowerCase().replace(' ', '-');
}
function zero1(flag) {
return flag ? '1' : '0';
}
function xor(a, b) {
return !a != !b;
}
function padLeft(nr, n, str) {
var binary = new Number(nr);
binary = binary.toString(2);
return Array(n - binary.length + 1).join(str || '0') + binary;
}
/**
* Gets all Geomantic Figures, in binary order.
* @return {Array<Figure>} All figrues
*/
function getFigureArray() {
var rv = new Array(16);
for (var i = 0; i < 16; i++) {
rv[i] = Figure.byFlags(padLeft(i, 4, '0'));
}
return rv;
}
/**
* A Geomantic Figure
*
* @param {String} flags element flags
*/
var Figure =
/*#__PURE__*/
function () {
function Figure(flags) {
(0, _classCallCheck2["default"])(this, Figure);
this.flags = flags;
}
/**
* Gets one Figure by name.
*
* @param {String} name to find
* @returns {Figure} named figure
*/
(0, _createClass2["default"])(Figure, [{
key: "getCompanyType",
value: function getCompanyType(other) {
if (this.equals(other)) {
return 'simple';
}
var me = this.slug;
var them = other.slug;
var company = null;
COMPANY_DEMI_SIMPLE.forEach(function (figureSet) {
if (figureSet.indexOf(me) > -1 && figureSet.indexOf(them) > -1) {
company = 'demi-simple';
}
});
if (company) return company;
COMPANY_COMPOUND.forEach(function (figureSet) {
if (figureSet.indexOf(me) > -1 && figureSet.indexOf(them) > -1) {
company = 'compound';
}
});
if (company) return company;
if (this.fire === other.fire) {
return 'capitular';
}
return null;
}
}, {
key: "getLine",
value: function getLine(ix) {
switch (ix) {
case 0:
return this.fire;
case 1:
return this.air;
case 2:
return this.water;
case 3:
return this.earth;
default:
throw new Error('IndexError');
}
}
}, {
key: "getActivePoints",
value: function getActivePoints() {
var _this = this;
return ['fire', 'air', 'water', 'earth'].reduce(function (points, element) {
if (_this[element]) {
return points + 1;
} else {
return points;
}
}, 0);
}
}, {
key: "getPoints",
value: function getPoints() {
var _this2 = this;
return ['fire', 'air', 'water', 'earth'].reduce(function (points, element) {
if (_this2[element]) {
return points + 1;
} else {
return points + 2;
}
}, 0);
}
}, {
key: "getStrength",
value: function getStrength(house) {
var shouldBeStrong = 0;
if (this.details.houses.strong === house) shouldBeStrong++;else if (this.details.houses.weak === house) shouldBeStrong--;
return shouldBeStrong;
}
}, {
key: "add",
value: function add() {
var sum = this;
var flags;
for (var _len = arguments.length, others = new Array(_len), _key = 0; _key < _len; _key++) {
others[_key] = arguments[_key];
}
others.forEach(function (other) {
flags = zero1(xor(sum.earth, other.earth)) + zero1(xor(sum.water, other.water)) + zero1(xor(sum.air, other.air)) + zero1(xor(sum.fire, other.fire));
sum = Figure.byFlags(flags);
});
return sum;
}
}, {
key: "equals",
value: function equals(other) {
if (!(other && other instanceof Figure)) {
return false;
}
return other.flags === this.flags;
}
}, {
key: "toJSON",
value: function toJSON() {
return JSON.stringify(this.details);
}
}, {
key: "toTextFigure",
value: function toTextFigure() {
var letter = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '*';
var width = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '3';
var lineToText = function lineToText(element) {
var work = element ? letter : "".concat(letter, " ").concat(letter);
while (work.length < width) {
work = work.length % 2 ? " ".concat(work) : "".concat(work, " ");
}
return work;
};
return [lineToText(this.fire), lineToText(this.air), lineToText(this.water), lineToText(this.earth)].join('\n');
}
}, {
key: "details",
get: function get() {
if (!this._details) {
var flags = this.flags;
if (!FigureDetails.has(flags)) {
throw new Error('No such figure with flags: ' + flags);
}
this._details = FigureDetails.get(flags);
}
return this._details;
}
}, {
key: "flags",
get: function get() {
return zero1(this.earth) + zero1(this.water) + zero1(this.air) + zero1(this.fire);
},
set: function set(raw) {
var flags = raw + '';
if (flags.length < 4) {
flags = '0'.repeat(4 - flags.length) + flags;
}
this._details = null;
this.earth = flags[0] == '1';
this.water = flags[1] == '1';
this.air = flags[2] == '1';
this.fire = flags[3] == '1';
}
}, {
key: "name",
get: function get() {
return this.details.name;
}
}, {
key: "number",
get: function get() {
return parseInt(this.flags, 10);
}
}, {
key: "slug",
get: function get() {
return slugify(this.name);
}
}], [{
key: "byName",
value: function byName(name) {
var key = slugify(name);
if (R.has(key, Figures)) {
return Figures[key];
}
throw new Error("Figure Not Found: ".concat(name));
}
/**
* Gets one Figure by its Flags.
*
* @param {String} flags element flags
* @returns {Fgure} figure with flags
*/
}, {
key: "byFlags",
value: function byFlags(flags) {
if (!FigureDetails.has(flags)) {
throw new Error('Figure Not Found');
}
return Figure.byName(FigureDetails.get(flags).name);
}
/**
* Gets a Figure by elements.
*
* @param {Object<String, Boolean>} elements element dictionary
* @returns {Figure} figure with specified flags.
*/
}, {
key: "byElements",
value: function byElements(elements) {
var flags = zero1(elements.earth) + zero1(elements.water) + zero1(elements.air) + zero1(elements.fire);
return Figure.byFlags(flags);
}
}]);
return Figure;
}();
exports.Figure = Figure;
var Figures = {};
exports.Figures = Figures;
var FigureDetails = new Map();
exports.FigureDetails = FigureDetails;
function makeFigures(figures) {
figures.forEach(function (details) {
FigureDetails.set(details.flags, details);
var figure = new Figure(details.flags);
Figures[figure.slug] = figure;
});
} // note that the houses are in zero-index order
makeFigures([{
name: 'Puer',
english: 'Boy',
flags: '1011',
houses: {
strong: 0,
weak: 6
}
}, {
name: 'Amisso',
english: 'Loss',
flags: '0101',
houses: {
strong: 1,
weak: 7
}
}, {
name: 'Albus',
english: 'White',
flags: '0100',
houses: {
strong: 2,
weak: 8
}
}, {
name: 'Populus',
english: 'People',
flags: '0000',
houses: {
strong: 3,
weak: 9
}
}, {
name: 'Fortuna Major',
english: 'Greater Fortune',
flags: '1100',
houses: {
strong: 4,
weak: 10
}
}, {
name: 'Conjunctio',
english: 'Confunction',
flags: '0110',
houses: {
strong: 5,
weak: 11
}
}, {
name: 'Puella',
english: 'Girl',
flags: '1101',
houses: {
strong: 6,
weak: 0
}
}, {
name: 'Rubeus',
english: 'Red',
flags: '0010',
houses: {
strong: 7,
weak: 1
}
}, {
name: 'Acquisitio',
english: 'Gain',
flags: '1010',
houses: {
strong: 8,
weak: 2
}
}, {
name: 'Carcer',
english: 'Prison',
flags: '1001',
houses: {
strong: 9,
weak: 3
}
}, {
name: 'Tristitia',
english: 'Sorrow',
flags: '1000',
houses: {
strong: 10,
weak: 4
}
}, {
name: 'Laetitia',
english: 'Joy',
flags: '0001',
houses: {
strong: 11,
weak: 5
}
}, {
name: 'Cauda Draconis',
english: 'Tail of the Dragon',
flags: '0111',
houses: {
strong: 8,
weak: 2
}
}, {
name: 'Caput Draconis',
english: 'Head of the Dragon',
flags: '1110',
houses: {
strong: 5,
weak: 11
}
}, {
name: 'Fortuna Minor',
english: 'Lesser Fortune',
flags: '0011',
houses: {
strong: 4,
weak: 10
}
}, {
name: 'Via',
english: 'Way',
flags: '1111',
houses: {
strong: 3,
weak: 9
}
}]);
var House =
/*#__PURE__*/
function () {
function House(index, figure, querent, quesited) {
(0, _classCallCheck2["default"])(this, House);
this.index = index;
this.figure = figure;
this.querent = querent;
this.quesited = quesited;
this._meaning = index < 12 ? houseMeanings[index] : null;
}
(0, _createClass2["default"])(House, [{
key: "equals",
value: function equals(other) {
return other.index === this.index;
}
}, {
key: "indexPlus",
value: function indexPlus(delta) {
return houseRange(this.index + delta);
}
/**
* returns the companion house index.
*/
}, {
key: "isTrineTo",
value: function isTrineTo(other) {
return this.trines.indexOf(other.index) > -1;
}
}, {
key: "isSquareTo",
value: function isSquareTo(other) {
return this.squares.indexOf(other.index) > -1;
}
}, {
key: "isSextileTo",
value: function isSextileTo(other) {
return this.sextiles.indexOf(other.index) > -1;
}
}, {
key: "isOpposedTo",
value: function isOpposedTo(other) {
return this.opposition === other.index;
}
}, {
key: "getCompanyType",
value: function getCompanyType(other) {
return this.figure.getCompanyType(other.figure);
}
/**
* Gets the meaning of this house with its figure if any
* @return {Object} with members "house" and "figure"
*/
}, {
key: "getMeaning",
value: function getMeaning() {
var meaning = this._meaning;
if (!meaning) {
return {
house: null,
figure: null
};
}
var houseMeaning = meaning['Meaning'];
if (meaning['Geo Meaning']) {
houseMeaning = "".concat(houseMeaning, ", ").concat(meaning['Geo Meaning']);
}
var figureMeaning = '';
if (this.figure) {
figureMeaning = meaning[this.figure.name];
}
return {
house: houseMeaning,
figure: figureMeaning
};
}
}, {
key: "hasFigure",
value: function hasFigure(other) {
if (other instanceof House) {
other = other.figure;
}
if (!other) {
return false;
}
return this.figure.equals(other);
}
}, {
key: "isLessThan",
value: function isLessThan(other) {
var quesited = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
if (quesited instanceof House) {
quesited = house.index;
}
if (other instanceof House) {
other = other.index;
}
other = other - quesited;
return this.index < other;
}
/**
* returns whether 'other' is sinister to this House
* @param {House|Number} other House or index of it
* @returns {Boolean} true if this one is sinister to other one
*/
}, {
key: "isSinisterOf",
value: function isSinisterOf(other) {
if (other instanceof House) {
other = other.index;
}
var range = [];
for (var i = 1; i < 6; i++) {
range.push(this.indexPlus(i));
}
return range.indexOf(other) > -1;
}
/**
* returns whether 'other' is dexter to this House
* @param {House|Number} other House or index of it
* @returns {Boolean} true if this one is dexter to other one
*/
}, {
key: "isDexterOf",
value: function isDexterOf(other) {
if (other instanceof House) {
other = other.index;
}
return other !== this.index && other !== this.indexPlus(6) && !this.isSinisterOf(other);
}
}, {
key: "getNeighbors",
value: function getNeighbors(houses) {
return [houses[houseRange(this.index - 1)], houses[houseRange(this.index + 1)]];
}
}, {
key: "isNextTo",
value: function isNextTo(other) {
if (other instanceof House) {
other = other.index;
} else {
other = houseRange(other);
}
return other === houseRange(this.index - 1) || other === houseRange(this.index + 1);
}
}, {
key: "companion",
get: function get() {
var isEven = this.index % 2 === 0;
return this.indexPlus(isEven ? 1 : -1);
}
}, {
key: "trines",
get: function get() {
return [this.indexPlus(4), this.indexPlus(8)];
}
}, {
key: "squares",
get: function get() {
return [this.indexPlus(3), this.indexPlus(-3)];
}
}, {
key: "sextiles",
get: function get() {
return [this.indexPlus(2), this.indexPlus(-2)];
}
}, {
key: "opposition",
get: function get() {
return this.indexPlus(6);
}
}, {
key: "parents",
get: function get() {
if (this.index < 8) {
return [];
}
return [(this.index - 8) * 2, (this.index - 8) * 2 + 1];
}
}, {
key: "strength",
get: function get() {
if (!this.figure) {
return false;
}
return this.figure.getStrength(this.index);
}
}]);
return House;
}();
exports.House = House;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2xpYi9tb2RlbHMuanMiXSwibmFtZXMiOlsiUiIsInJlcXVpcmUiLCJob3VzZU1lYW5pbmdzIiwibWVhbmluZ3MiLCJnZXRIb3VzZU1lYW5pbmdzIiwiQ09NUEFOWV9ERU1JX1NJTVBMRSIsIkNPTVBBTllfQ09NUE9VTkQiLCJob3VzZVJhbmdlIiwieCIsInNsdWdpZnkiLCJuYW1lIiwidG9Mb3dlckNhc2UiLCJyZXBsYWNlIiwiemVybzEiLCJmbGFnIiwieG9yIiwiYSIsImIiLCJwYWRMZWZ0IiwibnIiLCJuIiwic3RyIiwiYmluYXJ5IiwiTnVtYmVyIiwidG9TdHJpbmciLCJBcnJheSIsImxlbmd0aCIsImpvaW4iLCJnZXRGaWd1cmVBcnJheSIsInJ2IiwiaSIsIkZpZ3VyZSIsImJ5RmxhZ3MiLCJmbGFncyIsIm90aGVyIiwiZXF1YWxzIiwibWUiLCJzbHVnIiwidGhlbSIsImNvbXBhbnkiLCJmb3JFYWNoIiwiZmlndXJlU2V0IiwiaW5kZXhPZiIsImZpcmUiLCJpeCIsImFpciIsIndhdGVyIiwiZWFydGgiLCJFcnJvciIsInJlZHVjZSIsInBvaW50cyIsImVsZW1lbnQiLCJob3VzZSIsInNob3VsZEJlU3Ryb25nIiwiZGV0YWlscyIsImhvdXNlcyIsInN0cm9uZyIsIndlYWsiLCJzdW0iLCJvdGhlcnMiLCJKU09OIiwic3RyaW5naWZ5IiwibGV0dGVyIiwid2lkdGgiLCJsaW5lVG9UZXh0Iiwid29yayIsIl9kZXRhaWxzIiwiRmlndXJlRGV0YWlscyIsImhhcyIsImdldCIsInJhdyIsInJlcGVhdCIsInBhcnNlSW50Iiwia2V5IiwiRmlndXJlcyIsImJ5TmFtZSIsImVsZW1lbnRzIiwiTWFwIiwibWFrZUZpZ3VyZXMiLCJmaWd1cmVzIiwic2V0IiwiZmlndXJlIiwiZW5nbGlzaCIsIkhvdXNlIiwiaW5kZXgiLCJxdWVyZW50IiwicXVlc2l0ZWQiLCJfbWVhbmluZyIsImRlbHRhIiwidHJpbmVzIiwic3F1YXJlcyIsInNleHRpbGVzIiwib3Bwb3NpdGlvbiIsImdldENvbXBhbnlUeXBlIiwibWVhbmluZyIsImhvdXNlTWVhbmluZyIsImZpZ3VyZU1lYW5pbmciLCJyYW5nZSIsInB1c2giLCJpbmRleFBsdXMiLCJpc1NpbmlzdGVyT2YiLCJpc0V2ZW4iLCJnZXRTdHJlbmd0aCJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxJQUFNQSxDQUFDLEdBQUdDLE9BQU8sQ0FBQyxPQUFELENBQWpCOztBQUNBLElBQU1DLGFBQWEsR0FBR0QsT0FBTyxDQUFDLGVBQUQsQ0FBUCxDQUF5QkUsUUFBL0M7O0FBRU8sU0FBU0MsZ0JBQVQsR0FBNEI7QUFDakMsU0FBT0YsYUFBUDtBQUNEOztBQUVELElBQU1HLG1CQUFtQixHQUFHLENBQ3hCLENBQUMsUUFBRCxFQUFXLFdBQVgsRUFBd0IsZ0JBQXhCLENBRHdCLEVBRXhCLENBQUMsWUFBRCxFQUFlLFVBQWYsRUFBMkIsZ0JBQTNCLENBRndCLEVBR3hCLENBQUMsTUFBRCxFQUFTLFFBQVQsRUFBbUIsZ0JBQW5CLENBSHdCLEVBSXhCLENBQUMsZUFBRCxFQUFrQixlQUFsQixDQUp3QixFQUt4QixDQUFDLFFBQUQsRUFBVyxRQUFYLEVBQXFCLGdCQUFyQixDQUx3QixFQU14QixDQUFDLE9BQUQsRUFBVSxZQUFWLENBTndCLEVBT3hCLENBQUMsU0FBRCxFQUFZLEtBQVosQ0FQd0IsQ0FBNUI7QUFVQSxJQUFNQyxnQkFBZ0IsR0FBRyxDQUN2QixDQUFDLE1BQUQsRUFBUyxRQUFULENBRHVCLEVBRXZCLENBQUMsUUFBRCxFQUFXLFlBQVgsQ0FGdUIsRUFHdkIsQ0FBQyxPQUFELEVBQVUsUUFBVixDQUh1QixFQUl2QixDQUFDLFNBQUQsRUFBWSxLQUFaLENBSnVCLEVBS3ZCLENBQUMsZUFBRCxFQUFrQixlQUFsQixDQUx1QixFQU12QixDQUFDLFlBQUQsRUFBZSxRQUFmLENBTnVCLEVBT3ZCLENBQUMsV0FBRCxFQUFjLFVBQWQsQ0FQdUIsRUFRdkIsQ0FBQyxnQkFBRCxFQUFtQixnQkFBbkIsQ0FS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OztBQUNELGFBQU8sQ0FBQyxDQUFDLEtBQUtBLEtBQUwsR0FBYSxDQUFkLElBQW1CLENBQXBCLEVBQXVCLENBQUMsS0FBS0EsS0FBTCxHQUFhLENBQWQsSUFBbUIsQ0FBbkIsR0FBdUIsQ0FBOUMsQ0FBUDtBQUNEOzs7d0JBaUZlO0FBQ2QsVUFBSSxDQUFDLEtBQUtILE1BQVYsRUFBa0I7QUFDaEIsZUFBTyxLQUFQO0FBQ0Q7O0FBQ0QsYUFBTyxLQUFLQSxNQUFMLENBQVlxQixXQUFaLENBQXdCLEtBQUtsQixLQUE3QixDQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5jb25zdCBSID0gcmVxdWlyZSgncmFtZGEnKTtcbmNvbnN0IGhvdXNlTWVhbmluZ3MgPSByZXF1aXJlKCcuL2RhdGEvaG91c2VzJykubWVhbmluZ3M7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRIb3VzZU1lYW5pbmdzKCkge1xuICByZXR1cm4gaG91c2VNZWFuaW5ncztcbn1cblxuY29uc3QgQ09NUEFOWV9ERU1JX1NJTVBMRSA9IFtcbiAgICBbJ2NhcmNlcicsICd0cmlzdGl0aWEnLCAnY2F1ZGEtZHJhY29uaXMnXSxcbiAgICBbJ2FjcXVpc2l0aW8nLCAnbGFldGl0aWEnLCAnY2FwdXQtZHJhY29uaXMnXSxcbiAgICBbJ3B1ZXInLCAncnViZXVzJywgJ2NhdWRhLWRyYWNvbmlzJ10sXG4gICAgWydmb3J0dW5hLW1ham9yJywgJ2ZvcnR1bmEtbWlub3InXSxcbiAgICBbJ2FtaXNzbycsICdwdWVsbGEnLCAnY2FwdXQtZHJhY29uaXMnXSxcbiAgICBbJ2FsYnVzJywgJ2Nvbmp1bmN0aW8nXSxcbiAgICBbJ3BvcHVsdXMnLCAndmlhJ11cbl07XG5cbmNvbnN0IENPTVBBTllfQ09NUE9VTkQgPSBbXG4gIFsncHVlcicsICdwdWVsbGEnXSxcbiAgWydhbWlzc28nLCAnYWNxdWlzaXRpbyddLFxuICBbJ2FsYnVzJywgJ3J1YmV1cyddLFxuICBbJ3BvcHVsdXMnLCAndmlhJ10sXG4gIFsnZm9ydHVuYS1tYWpvcicsICdmb3J0dW5hLW1pbm9yJ10sXG4gIFsnY29uanVuY3RpbycsICdjYXJjZXInXSxcbiAgWyd0cmlzdGl0aWEnLCAnbGFldGl0aWEnXSxcbiAgWydjYXVkYS1kcmFjb25pcycsICdjYXB1dC1kcmFjb25pcyddXG5dO1xuXG4vKipcbiAqIEZvcmNlcyBgeGAgaW50byB0aGUgcmFuZ2UgMC0xMVxuICogQHBhcmFtICB7bnVtYmVyfSB4IGlucHV0XG4gKiBAcmV0dXJuIHtudW1iZXJ9IHNhZmUgbnVtYmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBob3VzZVJhbmdlICh4KSB7XG4gIHdoaWxlICh4IDwgMCkgeyB4ID0geCArIDEyOyB9XG4gIHJldHVybiB4ICUgMTI7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBzaW1wbGUgc3RyaW5nIGludG8gYSBzbHVnIGZvciB1cmxzXG4gKiBAcGFyYW0gIHtTdHJpbmd9IG5hbWUgdG8gc2x1Z2lmeVxuICogQHJldHVybiB7U3RyaW5nfSBzbHVnaWZpZWQgdmVyc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gc2x1Z2lmeSAobmFtZSkge1xuICByZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoJyAnLCAnLScpO1xufVxuXG5mdW5jdGlvbiB6ZXJvMSAoZmxhZykge1xuICByZXR1cm4gZmxhZyA/ICcxJyA6ICcwJztcbn1cblxuZnVuY3Rpb24geG9yIChhLCBiKSB7XG4gIHJldHVybiAhYSAhPSAhYjtcbn1cblxuZnVuY3Rpb24gcGFkTGVmdChuciwgbiwgc3RyKXtcbiAgdmFyIGJpbmFyeSA9IG5ldyBOdW1iZXIobnIpO1xuICBiaW5hcnkgPSBiaW5hcnkudG9TdHJpbmcoMik7XG4gIHJldHVybiBBcnJheShuLWJpbmFyeS5sZW5ndGgrMSkuam9pbihzdHJ8fCcwJykrYmluYXJ5O1xufVxuXG4vKipcbiAqIEdldHMgYWxsIEdlb21hbnRpYyBGaWd1cmVzLCBpbiBiaW5hcnkgb3JkZXIuXG4gKiBAcmV0dXJuIHtBcnJheTxGaWd1cmU+fSBBbGwgZmlncnVlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlndXJlQXJyYXkoKSB7XG4gICAgbGV0IHJ2ID0gbmV3IEFycmF5KDE2KTtcbiAgICBmb3IgKGxldCBpPTA7IGk8MTY7IGkrKykge1xuICAgICAgcnZbaV0gPSBGaWd1cmUuYnlGbGFncyhwYWRMZWZ0KGksIDQsICcwJykpO1xuICAgIH1cbiAgICByZXR1cm4gcnY7XG59XG5cbi8qKlxuICogQSBHZW9tYW50aWMgRmlndXJlXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGZsYWdzIGVsZW1lbnQgZmxhZ3NcbiAqL1xuZXhwb3J0IGNsYXNzIEZpZ3VyZSB7XG4gIGNvbnN0cnVjdG9yIChmbGFncykge1xuICAgIHRoaXMuZmxhZ3MgPSBmbGFncztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIG9uZSBGaWd1cmUgYnkgbmFtZS5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdG8gZmluZFxuICAgKiBAcmV0dXJucyB7RmlndXJlfSBuYW1lZCBmaWd1cmVcbiAgICovXG4gIHN0YXRpYyBieU5hbWUgKG5hbWUpIHtcbiAgICBjb25zdCBrZXkgPSBzbHVnaWZ5KG5hbWUpO1xuICAgIGlmIChSLmhhcyhrZXksIEZpZ3VyZXMpKSB7XG4gICAgICByZXR1cm4gRmlndXJlc1trZXldO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZpZ3VyZSBOb3QgRm91bmQ6ICR7bmFtZX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIG9uZSBGaWd1cmUgYnkgaXRzIEZsYWdzLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gZmxhZ3MgZWxlbWVudCBmbGFnc1xuICAgKiBAcmV0dXJucyB7Rmd1cmV9IGZpZ3VyZSB3aXRoIGZsYWdzXG4gICAqL1xuICBzdGF0aWMgYnlGbGFncyAoZmxhZ3MpIHtcbiAgICBpZiAoIUZpZ3VyZURldGFpbHMuaGFzKGZsYWdzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGaWd1cmUgTm90IEZvdW5kJyk7XG4gICAgfVxuICAgIHJldHVybiBGaWd1cmUuYnlOYW1lKEZpZ3VyZURldGFpbHMuZ2V0KGZsYWdzKS5uYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgRmlndXJlIGJ5IGVsZW1lbnRzLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdDxTdHJpbmcsIEJvb2xlYW4+fSBlbGVtZW50cyBlbGVtZW50IGRpY3Rpb25hcnlcbiAgICogQHJldHVybnMge0ZpZ3VyZX0gZmlndXJlIHdpdGggc3BlY2lmaWVkIGZsYWdzLlxuICAgKi9cbiAgc3RhdGljIGJ5RWxlbWVudHMgKGVsZW1lbnRzKSB7XG4gICAgY29uc3QgZmxhZ3MgPSAoXG4gICAgemVybzEoZWxlbWVudHMuZWFydGgpXG4gICAgKyB6ZXJvMShlbGVtZW50cy53YXRlcilcbiAgICArIHplcm8xKGVsZW1lbnRzLmFpcilcbiAgICArIHplcm8xKGVsZW1lbnRzLmZpcmUpXG4gICAgKTtcblxuICAgIHJldHVybiBGaWd1cmUuYnlGbGFncyhmbGFncyk7XG4gIH1cblxuICBnZXQgZGV0YWlscyAoKSB7XG4gICAgaWYgKCF0aGlzLl9kZXRhaWxzKSB7XG4gICAgICBjb25zdCBmbGFncyA9IHRoaXMuZmxhZ3M7XG4gICAgICBpZiAoIUZpZ3VyZURldGFpbHMuaGFzKGZsYWdzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHN1Y2ggZmlndXJlIHdpdGggZmxhZ3M6ICcgKyBmbGFncyk7XG4gICAgICB9XG4gICAgICB0aGlzLl9kZXRhaWxzID0gRmlndXJlRGV0YWlscy5nZXQoZmxhZ3MpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZGV0YWlscztcbiAgfVxuXG4gIGdldCBmbGFncyAoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHplcm8xKHRoaXMuZWFydGgpXG4gICAgICArIHplcm8xKHRoaXMud2F0ZXIpXG4gICAgICArIHplcm8xKHRoaXMuYWlyKVxuICAgICAgKyB6ZXJvMSh0aGlzLmZpcmUpXG4gICAgKTtcbiAgfVxuXG4gIHNldCBmbGFncyAocmF3KSB7XG4gICAgbGV0IGZsYWdzID0gcmF3ICsgJyc7XG4gICAgaWYgKGZsYWdzLmxlbmd0aCA8IDQpIHtcbiAgICAgIGZsYWdzID0gJzAnLnJlcGVhdCg0IC0gZmxhZ3MubGVuZ3RoKSArIGZsYWdzO1xuICAgIH1cbiAgICB0aGlzLl9kZXRhaWxzID0gbnVsbDtcbiAgICB0aGlzLmVhcnRoID0gZmxhZ3NbMF0gPT0gJzEnO1xuICAgIHRoaXMud2F0ZXIgPSBmbGFnc1sxXSA9PSAnMSc7XG4gICAgdGhpcy5haXIgPSBmbGFnc1syXSA9PSAnMSc7XG4gICAgdGhpcy5maXJlID0gZmxhZ3NbM10gPT0gJzEnO1xuICB9XG5cbiAgZ2V0IG5hbWUgKCkge1xuICAgIHJldHVybiB0aGlzLmRldGFpbHMubmFtZTtcbiAgfVxuXG4gIGdldCBudW1iZXIgKCkge1xuICAgIHJldHVybiBwYXJzZUludCh0aGlzLmZsYWdzLCAxMCk7XG4gIH1cblxuICBnZXRDb21wYW55VHlwZSAob3RoZXIpIHtcbiAgICBpZiAodGhpcy5lcXVhbHMob3RoZXIpKSB7XG4gICAgICByZXR1cm4gJ3NpbXBsZSc7XG4gICAgfVxuXG4gICAgY29uc3QgbWUgPSB0aGlzLnNsdWc7XG4gICAgY29uc3QgdGhlbSA9IG90aGVyLnNsdWc7XG4gICAgbGV0IGNvbXBhbnkgPSBudWxsO1xuXG4gICAgQ09NUEFOWV9ERU1JX1NJTVBMRS5mb3JFYWNoKGZpZ3VyZVNldCA9PiB7XG4gICAgICBpZiAoZmlndXJlU2V0LmluZGV4T2YobWUpID4gLTEgJiYgZmlndXJlU2V0LmluZGV4T2YodGhlbSkgPiAtMSkge1xuICAgICAgICBjb21wYW55ID0gJ2RlbWktc2ltcGxlJztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChjb21wYW55KSByZXR1cm4gY29tcGFueTtcblxuICAgIENPTVBBTllfQ09NUE9VTkQuZm9yRWFjaChmaWd1cmVTZXQgPT4ge1xuICAgICAgaWYgKGZpZ3VyZVNldC5pbmRleE9mKG1lKSA+IC0xICYmIGZpZ3VyZVNldC5pbmRleE9mKHRoZW0pID4gLTEpIHtcbiAgICAgICAgY29tcGFueSA9ICdjb21wb3VuZCc7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoY29tcGFueSkgcmV0dXJuIGNvbXBhbnk7XG5cbiAgICBpZiAodGhpcy5maXJlID09PSBvdGhlci5maXJlKSB7XG4gICAgICByZXR1cm4gJ2NhcGl0dWxhcic7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXRMaW5lIChpeCkge1xuICAgIHN3aXRjaCAoaXgpIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlyZTtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIHRoaXMuYWlyO1xuICAgICAgY2FzZSAyOlxuICAgICAgICByZXR1cm4gdGhpcy53YXRlcjtcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZWFydGg7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luZGV4RXJyb3InKTtcbiAgICB9XG4gIH1cblxuICBnZXRBY3RpdmVQb2ludHMgKCkge1xuICAgIHJldHVybiBbJ2ZpcmUnLCAnYWlyJywgJ3dhdGVyJywgJ2VhcnRoJ10ucmVkdWNlKChwb2ludHMsIGVsZW1lbnQpID0+IHtcbiAgICAgIGlmICh0aGlzW2VsZW1lbnRdKSB7XG4gICAgICAgIHJldHVybiBwb2ludHMgKyAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHBvaW50cztcbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfVxuXG4gIGdldFBvaW50cyAoKSB7XG4gICAgcmV0dXJuIFsnZmlyZScsICdhaXInLCAnd2F0ZXInLCAnZWFydGgnXS5yZWR1Y2UoKHBvaW50cywgZWxlbWVudCkgPT4ge1xuICAgICAgaWYgKHRoaXNbZWxlbWVudF0pIHtcbiAgICAgICAgcmV0dXJuIHBvaW50cyArIDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcG9pbnRzICsgMjtcbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfVxuXG4gIGdldFN0cmVuZ3RoIChob3VzZSkge1xuICAgIGxldCBzaG91bGRCZVN0cm9uZyA9IDA7XG4gICAgaWYgKHRoaXMuZGV0YWlscy5ob3VzZXMuc3Ryb25nID09PSBob3VzZSkgc2hvdWxkQmVTdHJvbmcrKztcbiAgICBlbHNlIGlmICh0aGlzLmRldGFpbHMuaG91c2VzLndlYWsgPT09IGhvdXNlKSBzaG91bGRCZVN0cm9uZy0tO1xuICAgIHJldHVybiBzaG91bGRCZVN0cm9uZztcbiAgfVxuXG4gIGFkZCAoLi4ub3RoZXJzKSB7XG4gICAgbGV0IHN1bSA9IHRoaXM7XG4gICAgbGV0IGZsYWdzO1xuICAgIG90aGVycy5mb3JFYWNoKG90aGVyID0+IHtcbiAgICAgIGZsYWdzID0gKFxuICAgICAgICB6ZXJvMSh4b3Ioc3VtLmVhcnRoLCBvdGhlci5lYXJ0aCkpICtcbiAgICAgICAgemVybzEoeG9yKHN1bS53YXRlciwgb3RoZXIud2F0ZXIpKSArXG4gICAgICAgIHplcm8xKHhvcihzdW0uYWlyLCBvdGhlci5haXIpKSArXG4gICAgICAgIHplcm8xKHhvcihzdW0uZmlyZSwgb3RoZXIuZmlyZSkpXG4gICAgICApO1xuICAgICAgc3VtID0gRmlndXJlLmJ5RmxhZ3MoZmxhZ3MpO1xuICAgIH0pO1xuICAgIHJldHVybiBzdW07XG4gIH1cblxuICBlcXVhbHMgKG90aGVyKSB7XG4gICAgaWYgKCEob3RoZXIgJiYgb3RoZXIgaW5zdGFuY2VvZiBGaWd1cmUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBvdGhlci5mbGFncyA9PT0gdGhpcy5mbGFncztcbiAgfVxuXG4gIGdldCBzbHVnICgpIHtcbiAgICByZXR1cm4gc2x1Z2lmeSh0aGlzLm5hbWUpO1xuICB9XG5cbiAgdG9KU09OICgpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5kZXRhaWxzKTtcbiAgfVxuXG4gIHRvVGV4dEZpZ3VyZSAobGV0dGVyID0gJyonLCB3aWR0aCA9ICczJykge1xuICAgIGNvbnN0IGxpbmVUb1RleHQgPSAoZWxlbWVudCkgPT4ge1xuICAgICAgbGV0IHdvcmsgPSBlbGVtZW50ID8gbGV0dGVyIDogYCR7bGV0dGVyfSAke2xldHRlcn1gO1xuICAgICAgd2hpbGUgKHdvcmsubGVuZ3RoIDwgd2lkdGgpIHtcbiAgICAgICAgd29yayA9ICh3b3JrLmxlbmd0aCAlIDIpID8gYCAke3dvcmt9YCA6IGAke3dvcmt9IGA7XG4gICAgICB9XG4gICAgICByZXR1cm4gd29yaztcbiAgICB9O1xuICAgIHJldHVybiBbXG4gICAgICBsaW5lVG9UZXh0KHRoaXMuZmlyZSksXG4gICAgICBsaW5lVG9UZXh0KHRoaXMuYWlyKSxcbiAgICAgIGxpbmVUb1RleHQodGhpcy53YXRlciksXG4gICAgICBsaW5lVG9UZXh0KHRoaXMuZWFydGgpXG4gICAgXS5qb2luKCdcXG4nKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgRmlndXJlcyA9IHt9O1xuXG5leHBvcnQgY29uc3QgRmlndXJlRGV0YWlscyA9IG5ldyBNYXAoKTtcblxuZnVuY3Rpb24gbWFrZUZpZ3VyZXMgKGZpZ3VyZXMpIHtcbiAgZmlndXJlcy5mb3JFYWNoKGRldGFpbHMgPT4ge1xuICAgIEZpZ3VyZURldGFpbHMuc2V0KGRldGFpbHMuZmxhZ3MsIGRldGFpbHMpO1xuICAgIGNvbnN0IGZpZ3VyZSA9IG5ldyBGaWd1cmUoZGV0YWlscy5mbGFncyk7XG4gICAgRmlndXJlc1tmaWd1cmUuc2x1Z10gPSBmaWd1cmU7XG4gIH0pO1xufVxuXG4vLyBub3RlIHRoYXQgdGhlIGhvdXNlcyBhcmUgaW4gemVyby1pbmRleCBvcmRlclxubWFrZUZpZ3VyZXMoW1xuICB7XG4gICAgbmFtZTogJ1B1ZXInLFxuICAgIGVuZ2xpc2g6ICdCb3knLFxuICAgIGZsYWdzOiAnMTAxMScsXG4gICAgaG91c2VzOiB7c3Ryb25nOiAwLCB3ZWFrOiA2fVxuICB9LCB7XG4gICAgbmFtZTogJ0FtaXNzbycsXG4gICAgZW5nbGlzaDogJ0xvc3MnLFxuICAgIGZsYWdzOiAnMDEwMScsXG4gICAgaG91c2VzOiB7c3Ryb25nOiAxLCB3ZWFrOiA3fVxuICB9LCB7XG4gICAgbmFtZTogJ0FsYnVzJyxcbiAgICBlbmdsaXNoOiAnV2hpdGUnLFxuICAgIGZsYWdzOiAnMDEwMCcsXG4gICAgaG91c2VzOiB7c3Ryb25nOiAyLCB3ZWFrOiA4fVxuICB9LCB7XG4gICAgbmFtZTogJ1BvcHVsdXMnLFxuICAgIGVuZ2xpc2g6ICdQZW9wbGUnLFxuICAgIGZsYWdzOiAnMDAwMCcsXG4gICAgaG91c2VzOiB7c3Ryb25nOiAzLCB3ZWFrOiA5fVxuICB9LCB7XG4gICAgbmFtZTogJ0ZvcnR1bmEgTWFqb3InLFxuICAgIGVuZ2xpc2g6ICdHcmVhdGVyIEZvcnR1bmUnLFxuICAgIGZsYWdzOiAnMTEwMCcsXG4gICAgaG91c2VzOiB7c3Ryb25nOiA0LCB3ZWFrOiAxMH1cbiAgfSwge1xuICAgIG5hbWU6ICdDb25qdW5jdGlvJyxcbiAgICBlbmdsaXNoOiAnQ29uZnVuY3Rpb24nLFxuICAgIGZsYWdzOiAnMDExMCcsXG4gICAgaG91c2VzOiB7c3Ryb25nOiA1LCB3ZWFrOiAxMX1cbiAgfSwge1xuICAgIG5hbWU6ICdQdWVsbGEnLFxuICAgIGVuZ2xpc2g6ICdHaXJsJyxcbiAgICBmbGFnczogJzExMDEnLFxuICAgIGhvdXNlczoge3N0cm9uZzogNiwgd2VhazogMH1cbiAgfSwge1xuICAgIG5hbWU6ICdSdWJldXMnLFxuICAgIGVuZ2xpc2g6ICdSZWQnLFxuICAgIGZsYWdzOiAnMDAxMCcsXG4gICAgaG91c2VzOiB7c3Ryb25nOiA3LCB3ZWFrOiAxfVxuICB9LCB7XG4gICAgbmFtZTogJ0FjcXVpc2l0aW8nLFxuICAgIGVuZ2xpc2g6ICdHYWluJyxcbiAgICBmbGFnczogJzEwMTAnLFxuICAgIGhvdXNlczoge3N0cm9uZzogOCwgd2VhazogMn1cbiAgfSwge1xuICAgIG5hbWU6ICdDYXJjZXInLFxuICAgIGVuZ2xpc2g6ICdQcmlzb24nLFxuICAgIGZsYWdzOiAnMTAwMScsXG4gICAgaG91c2VzOiB7c3Ryb25nOiA5LCB3ZWFrOiAzfVxuICB9LCB7XG4gICAgbmFtZTogJ1RyaXN0aXRpYScsXG4gICAgZW5nbGlzaDogJ1NvcnJvdycsXG4gICAgZmxhZ3M6ICcxMDAwJyxcbiAgICBob3VzZXM6IHtzdHJvbmc6IDEwLCB3ZWFrOiA0fVxuICB9LCB7XG4gICAgbmFtZTogJ0xhZXRpdGlhJyxcbiAgICBlbmdsaXNoOiAnSm95JyxcbiAgICBmbGFnczogJzAwMDEnLFxuICAgIGhvdXNlczoge3N0cm9uZzogMTEsIHdlYWs6IDV9XG4gIH0sIHtcbiAgICBuYW1lOiAnQ2F1ZGEgRHJhY29uaXMnLFxuICAgIGVuZ2xpc2g6ICdUYWlsIG9mIHRoZSBEcmFnb24nLFxuICAgIGZsYWdzOiAnMDExMScsXG4gICAgaG91c2VzOiB7c3Ryb25nOiA4LCB3ZWFrOiAyfVxuICB9LCB7XG4gICAgbmFtZTogJ0NhcHV0IERyYWNvbmlzJyxcbiAgICBlbmdsaXNoOiAnSGVhZCBvZiB0aGUgRHJhZ29uJyxcbiAgICBmbGFnczogJzExMTAnLFxuICAgIGhvdXNlczoge3N0cm9uZzogNSwgd2VhazogMTF9XG4gIH0sIHtcbiAgICBuYW1lOiAnRm9ydHVuYSBNaW5vcicsXG4gICAgZW5nbGlzaDogJ0xlc3NlciBGb3J0dW5lJyxcbiAgICBmbGFnczogJzAwMTEnLFxuICAgIGhvdXNlczoge3N0cm9uZzogNCwgd2VhazogMTB9XG4gIH0sIHtcbiAgICBuYW1lOiAnVmlhJyxcbiAgICBlbmdsaXNoOiAnV2F5JyxcbiAgICBmbGFnczogJzExMTEnLFxuICAgIGhvdXNlczoge3N0cm9uZzogMywgd2VhazogOX1cbiAgfVxuXSk7XG5cbmV4cG9ydCBjbGFzcyBIb3VzZSB7XG4gIGNvbnN0cnVjdG9yIChpbmRleCwgZmlndXJlLCBxdWVyZW50LCBxdWVzaXRlZCkge1xuICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICB0aGlzLmZpZ3VyZSA9IGZpZ3VyZTtcbiAgICB0aGlzLnF1ZXJlbnQgPSBxdWVyZW50O1xuICAgIHRoaXMucXVlc2l0ZWQgPSBxdWVzaXRlZDtcbiAgICB0aGlzLl9tZWFuaW5nID0gaW5kZXggPCAxMiA/IGhvdXNlTWVhbmluZ3NbaW5kZXhdIDogbnVsbDtcbiAgfVxuXG4gIGVxdWFscyAob3RoZXIpIHtcbiAgICByZXR1cm4gb3RoZXIuaW5kZXggPT09IHRoaXMuaW5kZXg7XG4gIH1cblxuICBpbmRleFBsdXMgKGRlbHRhKSB7XG4gICAgcmV0dXJuIGhvdXNlUmFuZ2UodGhpcy5pbmRleCArIGRlbHRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm5zIHRoZSBjb21wYW5pb24gaG91c2UgaW5kZXguXG4gICAqL1xuICBnZXQgY29tcGFuaW9uICgpIHtcbiAgICBjb25zdCBpc0V2ZW4gPSB0aGlzLmluZGV4ICUgMiA9PT0gMDtcbiAgICByZXR1cm4gdGhpcy5pbmRleFBsdXMoaXNFdmVuID8gMSA6IC0xKTtcbiAgfVxuXG4gIGdldCB0cmluZXMgKCkge1xuICAgIHJldHVybiBbdGhpcy5pbmRleFBsdXMoNCksIHRoaXMuaW5kZXhQbHVzKDgpXTtcbiAgfVxuXG4gIGlzVHJpbmVUbyAob3RoZXIpIHtcbiAgICByZXR1cm4gdGhpcy50cmluZXMuaW5kZXhPZihvdGhlci5pbmRleCkgPiAtMTtcbiAgfVxuXG4gIGdldCBzcXVhcmVzICgpIHtcbiAgICByZXR1cm4gW3RoaXMuaW5kZXhQbHVzKDMpLCB0aGlzLmluZGV4UGx1cygtMyldO1xuICB9XG5cbiAgaXNTcXVhcmVUbyAob3RoZXIpIHtcbiAgICByZXR1cm4gdGhpcy5zcXVhcmVzLmluZGV4T2Yob3RoZXIuaW5kZXgpID4gLTE7XG4gIH1cblxuICBnZXQgc2V4dGlsZXMgKCkge1xuICAgIHJldHVybiBbdGhpcy5pbmRleFBsdXMoMiksIHRoaXMuaW5kZXhQbHVzKC0yKV07XG4gIH1cblxuICBpc1NleHRpbGVUbyAob3RoZXIpIHtcbiAgICByZXR1cm4gdGhpcy5zZXh0aWxlcy5pbmRleE9mKG90aGVyLmluZGV4KSA+IC0xO1xuICB9XG5cbiAgZ2V0IG9wcG9zaXRpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmluZGV4UGx1cyg2KTtcbiAgfVxuXG4gIGlzT3Bwb3NlZFRvIChvdGhlcikge1xuICAgIHJldHVybiB0aGlzLm9wcG9zaXRpb24gPT09IG90aGVyLmluZGV4O1xuICB9XG5cbiAgZ2V0IHBhcmVudHMgKCkge1xuICAgIGlmICh0aGlzLmluZGV4IDwgOCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gWyh0aGlzLmluZGV4IC0gOCkgKiAyLCAodGhpcy5pbmRleCAtIDgpICogMiArIDFdO1xuICB9XG5cbiAgZ2V0Q29tcGFueVR5cGUgKG90aGVyKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlndXJlLmdldENvbXBhbnlUeXBlKG90aGVyLmZpZ3VyZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbWVhbmluZyBvZiB0aGlzIGhvdXNlIHdpdGggaXRzIGZpZ3VyZSBpZiBhbnlcbiAgICogQHJldHVybiB7T2JqZWN0fSB3aXRoIG1lbWJlcnMgXCJob3VzZVwiIGFuZCBcImZpZ3VyZVwiXG4gICAqL1xuICBnZXRNZWFuaW5nICgpIHtcbiAgICBjb25zdCBtZWFuaW5nID0gdGhpcy5fbWVhbmluZztcbiAgICBpZiAoIW1lYW5pbmcpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhvdXNlOiBudWxsLFxuICAgICAgICBmaWd1cmU6IG51bGxcbiAgICAgIH07XG4gICAgfVxuICAgIGxldCBob3VzZU1lYW5pbmcgPSBtZWFuaW5nWydNZWFuaW5nJ107XG4gICAgaWYgKG1lYW5pbmdbJ0dlbyBNZWFuaW5nJ10pIHtcbiAgICAgIGhvdXNlTWVhbmluZyA9IGAke2hvdXNlTWVhbmluZ30sICR7bWVhbmluZ1snR2VvIE1lYW5pbmcnXX1gO1xuICAgIH1cbiAgICBsZXQgZmlndXJlTWVhbmluZyA9ICcnO1xuICAgIGlmICh0aGlzLmZpZ3VyZSkge1xuICAgICAgZmlndXJlTWVhbmluZyA9IG1lYW5pbmdbdGhpcy5maWd1cmUubmFtZV07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBob3VzZTogaG91c2VNZWFuaW5nLFxuICAgICAgZmlndXJlOiBmaWd1cmVNZWFuaW5nXG4gICAgfTtcbiAgfVxuXG4gIGhhc0ZpZ3VyZSAob3RoZXIpIHtcbiAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBIb3VzZSkge1xuICAgICAgb3RoZXIgPSBvdGhlci5maWd1cmU7XG4gICAgfVxuICAgIGlmICghb3RoZXIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmlndXJlLmVxdWFscyhvdGhlcik7XG4gIH1cblxuICBpc0xlc3NUaGFuIChvdGhlciwgcXVlc2l0ZWQgPSAwKSB7XG4gICAgaWYgKHF1ZXNpdGVkIGluc3RhbmNlb2YgSG91c2UpIHtcbiAgICAgIHF1ZXNpdGVkID0gaG91c2UuaW5kZXg7XG4gICAgfVxuICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIEhvdXNlKSB7XG4gICAgICBvdGhlciA9IG90aGVyLmluZGV4O1xuICAgIH1cbiAgICBvdGhlciA9IG90aGVyIC0gcXVlc2l0ZWQ7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXggPCBvdGhlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm5zIHdoZXRoZXIgJ290aGVyJyBpcyBzaW5pc3RlciB0byB0aGlzIEhvdXNlXG4gICAqIEBwYXJhbSB7SG91c2V8TnVtYmVyfSBvdGhlciBIb3VzZSBvciBpbmRleCBvZiBpdFxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGlzIG9uZSBpcyBzaW5pc3RlciB0byBvdGhlciBvbmVcbiAgICovXG4gIGlzU2luaXN0ZXJPZiAob3RoZXIpIHtcbiAgICBpZiAob3Ro