array-includes-polyfill
Version:
Exposing a richer set of Array features for JavaScript
366 lines (283 loc) • 34.9 kB
JavaScript
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
function inherit (extendthis, fromthese) {
var keys=[];
if(extendthis.prototype == undefined){
var Empty = function(){}
Empty.prototype = Object.prototype;
extendthis.prototype = Empty.prototype;
}
fromthese.map(function(fromthis){
keys = Object.getOwnPropertyNames(fromthis.prototype);
keys.shift();
keys.map(function(key){
extendthis.prototype[key]= fromthis.prototype[key];
});
});
}
module.exports = inherit;
},{}],2:[function(require,module,exports){
;
var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var includes = require('./polyfills/includes');
var lookup = require('./polyfills/find-object');
var trash = require('./polyfills/trash');
var copy = require('./polyfills/copy');
var clear = require('./polyfills/clear');
var inherit = require('inherit-prototypes');
var dependencies = [includes, lookup, copy, clear, trash];
var ArrayIncludesPollyfills = (function (_Array) {
_inherits(ArrayIncludesPollyfills, _Array);
function ArrayIncludesPollyfills(array) {
var _this = this;
_classCallCheck(this, ArrayIncludesPollyfills);
_get(Object.getPrototypeOf(ArrayIncludesPollyfills.prototype), 'constructor', this).call(this);
this.length = 0;
if (typeof array == 'array') array.map(function (element) {
_this.push(element);
});
if (typeof array == 'object') {
var keys = Object.keys(array);
keys.map(function (key) {
_this.push(array[key]);
});
}
}
return ArrayIncludesPollyfills;
})(Array);
inherit(ArrayIncludesPollyfills, dependencies);
module.exports = ArrayIncludesPollyfills;
},{"./polyfills/clear":4,"./polyfills/copy":5,"./polyfills/find-object":6,"./polyfills/includes":7,"./polyfills/trash":8,"inherit-prototypes":1}],3:[function(require,module,exports){
;
var arrES6 = require('./array-includes-polyfill-es6');
var arr = new arrES6();
var defaultLength = new arrES6();
console.log(defaultLength);
arr.push('Has includes polyfill');
console.log(arr.includes('Has includes polyfill'));
console.log(arr);
var obj1 = { id: '_$1QA2WS3ED', user: 'john doe', details: { dob: '01/01/99' } };
var obj2 = { id: '_$1QA2WS3EF', user: 'john doe', details: { dob: '01/02/99' } };
var obj3 = { id: '_$1QA2WS3EG', user: 'john doe', details: { dob: '01/01/99' } };
var obj4 = { id: '_$1QA2WS3EH', user: 'jane doe', details: { dob: '01/02/99' } };
var obj5 = { id: '_$1QA2WS3EI', user: 'jack doe', details: { dob: '01/05/99' } };
var obj6 = { id: '_$1QA2WS3EJ', user: 'july doe', details: { dob: '01/06/99' } };
arr.push(obj1, obj2, obj3, obj4, obj6);
arr.lookup({ id: '_$1QA2WS3ED' }).details.occupation = "programmer";
console.log(arr.lookup({ id: '_$1QA2WS3ED' }));
arr.lookup({ user: 'john doe', details: { dob: '01/02/99' } }).details.occupation = "programmer";
console.log(arr.lookup({ user: 'john doe', details: { dob: '01/02/99' } }));
arr.trash({ id: '_$1QA2WS3EJ' });
console.log(arr); //<-- Deletes user july doe from the array permanently.
var destination = arr.copy();
arr.copy(destination);
var test = [{ hello: 'world', id: 1234 }];
var arr = new arrES6(test); //<-- will return a new array-inc-polyfill object generated from test array
console.log(arr.lookup({ id: 1234 })); //<-- will return the object from lookup method.
var arr = new arrES6([{ id: 123 }, { id: 321 }, { id: 213 }]);
console.log(arr); //<-- should equal an empty an Array like object;
arr.clear();
var arr = new arrES6({ test: 123, testa: 321, testb: 213 });
console.log(arr);
arr.clear();
},{"./array-includes-polyfill-es6":2}],4:[function(require,module,exports){
;
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var Clear = (function () {
function Clear() {
_classCallCheck(this, Clear);
}
_createClass(Clear, [{
key: "clear",
value: function clear() {
this.splice(0, this.length);
if (this.length == 0) return true;
return false;
}
}]);
return Clear;
})();
module.exports = Clear;
},{}],5:[function(require,module,exports){
;
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var Copy = (function () {
function Copy() {
_classCallCheck(this, Copy);
}
_createClass(Copy, [{
key: "copy",
value: function copy(arr) {
if (arr) {
this.map(function (data) {
arr.push(data);
});
} else {
var x = [];
this.map(function (data) {
x.push(data);
});
return x;
}
}
}]);
return Copy;
})();
module.exports = Copy;
},{}],6:[function(require,module,exports){
;
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var Lookup = (function () {
function Lookup() {
_classCallCheck(this, Lookup);
}
_createClass(Lookup, [{
key: "lookup",
value: function lookup(obj, withIndex) {
var O = Object(this);
var result = [];
O.map(function (object, index) {
if (_isFlat(object)) {
if (_compareObjs(obj, object)) {
if (withIndex) _define$$index(object, index);
result.push(object);
}
}
if (!_isFlat(object)) {
var tempObj1 = _flattenObjs(object, withIndex, index);
var tempObj2 = _flattenObjs(obj, withIndex, index);
if (_compareObjs(tempObj2, tempObj1)) {
_define$$index(object, index);
result.push(object);
}
}
});
var x = result;
result = [];
if (x.length === 1) x = x[0];
if (x === undefined || x === null || x == '') x = false;
return x;
}
}]);
return Lookup;
})();
function _define$$index(object, index) {
Object.defineProperty(object, "_$$index_", {
enumerable: true,
configurable: true,
writable: false,
value: index
});
}
function _compareObjs(obj1, obj2) {
var validate = [];
var keys = Object.keys(obj1);
var state;
keys.map(function (key) {
if (obj1[key] === obj2[key]) validate.push(true);
});
validate.length === keys.length ? state = true : state = false;
return state;
}
var _flattend = {};
var _recursion = false;
function _flattenObjs(object, withIndex, index) {
if (!_recursion) _flattend = {};
var keys = Object.keys(object);
keys.map(function (key) {
if (!_isObject(object[key])) _flattend[key] = object[key];
if (_isObject(object[key])) {
_recursion = true;
_flattenObjs(object[key]);
}
});
_recursion = false;
if (withIndex) _define$$index(_flattend, index);
return _flattend;
}
function _isFlat(object) {
var validate = [];
if (object instanceof Object) {
var keys = Object.keys(object);
keys.map(function (key) {
if (object[key] instanceof Object) validate.push(true);
});
}
if (validate.length > 0) return false;
return true;
}
function _isObject(object) {
if (object instanceof Object) return true;
return false;
}
module.exports = Lookup;
},{}],7:[function(require,module,exports){
;
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var Includes = (function () {
function Includes() {
_classCallCheck(this, Includes);
}
_createClass(Includes, [{
key: "includes",
value: function includes(searchElement /*, fromIndex*/) {
var O = Object(this);
var len = parseInt(O.length) || 0;
if (len === 0) {
return false;
}
var n = parseInt(arguments[1]) || 0;
var k;
if (n >= 0) {
k = n;
} else {
k = len + n;
if (k < 0) {
k = 0;
}
}
var currentElement;
while (k < len) {
currentElement = O[k];
if (searchElement === currentElement || searchElement !== searchElement && currentElement !== currentElement) {
return true;
}
k++;
}
return false;
}
}]);
return Includes;
})();
module.exports = Includes;
},{}],8:[function(require,module,exports){
;
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
var Trash = (function () {
function Trash() {
_classCallCheck(this, Trash);
}
_createClass(Trash, [{
key: 'trash',
value: function trash(obj) {
if (typeof obj == 'object' && Object.keys(obj).length != 0) {
if (this.lookup(obj)) {
var index = this.lookup(obj, true)._$$index_;
this.splice(index, 1);
return true;
}
return false;
}
}
}]);
return Trash;
})();
module.exports = Trash;
},{}]},{},[3])
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvaW5oZXJpdC1wcm90b3R5cGVzL3NyYy9pbmhlcml0LXByb3RvdHlwZXMuanMiLCIvVm9sdW1lcy9kYW5pZWxIRC9QZXJzb25hbC9ucG1fcGFja2FnZXMvYXJyYXktaW5jbHVkZXMtcG9seWZpbGwvc3JjL2FycmF5LWluY2x1ZGVzLXBvbHlmaWxsLWVzNi5qcyIsIi9Wb2x1bWVzL2RhbmllbEhEL1BlcnNvbmFsL25wbV9wYWNrYWdlcy9hcnJheS1pbmNsdWRlcy1wb2x5ZmlsbC9zcmMvZXhhbXBsZS5qcyIsIi9Wb2x1bWVzL2RhbmllbEhEL1BlcnNvbmFsL25wbV9wYWNrYWdlcy9hcnJheS1pbmNsdWRlcy1wb2x5ZmlsbC9zcmMvcG9seWZpbGxzL2NsZWFyLmpzIiwiL1ZvbHVtZXMvZGFuaWVsSEQvUGVyc29uYWwvbnBtX3BhY2thZ2VzL2FycmF5LWluY2x1ZGVzLXBvbHlmaWxsL3NyYy9wb2x5ZmlsbHMvY29weS5qcyIsIi9Wb2x1bWVzL2RhbmllbEhEL1BlcnNvbmFsL25wbV9wYWNrYWdlcy9hcnJheS1pbmNsdWRlcy1wb2x5ZmlsbC9zcmMvcG9seWZpbGxzL2ZpbmQtb2JqZWN0LmpzIiwiL1ZvbHVtZXMvZGFuaWVsSEQvUGVyc29uYWwvbnBtX3BhY2thZ2VzL2FycmF5LWluY2x1ZGVzLXBvbHlmaWxsL3NyYy9wb2x5ZmlsbHMvaW5jbHVkZXMuanMiLCIvVm9sdW1lcy9kYW5pZWxIRC9QZXJzb25hbC9ucG1fcGFja2FnZXMvYXJyYXktaW5jbHVkZXMtcG9seWZpbGwvc3JjL3BvbHlmaWxscy90cmFzaC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7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LENBQUM7QUFDbkIsYUFBTyxDQUFDLEdBQUcsR0FBRyxFQUFFO0FBQ2Qsc0JBQWMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsWUFBSSxhQUFhLEtBQUssY0FBYyxJQUNoQyxhQUFhLEtBQUssYUFBYSxJQUFJLGNBQWMsS0FBSyxjQUFjLEFBQUMsRUFBRTtBQUN6RSxpQkFBTyxJQUFJLENBQUM7U0FDYjtBQUNELFNBQUMsRUFBRSxDQUFDO09BQ0w7QUFDRCxhQUFPLEtBQUssQ0FBQztLQUNkOzs7U0F6QkcsUUFBUTs7O0FBNEJaLE1BQU0sQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDOzs7Ozs7Ozs7SUM1QnRCLEtBQUs7V0FBTCxLQUFLOzBCQUFMLEtBQUs7OztlQUFMLEtBQUs7O1dBQ0osZUFBQyxHQUFHLEVBQUM7QUFDUixVQUFHLE9BQU8sR0FBRyxJQUFJLFFBQVEsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUM7QUFDeEQsWUFBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFDO0FBQ2hCLGNBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUM3QyxjQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBQyxDQUFDLENBQUMsQ0FBQztBQUNyQixpQkFBTyxJQUFJLENBQUM7U0FDZjtBQUNELGVBQU8sS0FBSyxDQUFDO09BQ2Q7S0FDRjs7O1NBVkcsS0FBSzs7O0FBY1gsTUFBTSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiZnVuY3Rpb24gaW5oZXJpdCAoZXh0ZW5kdGhpcywgZnJvbXRoZXNlKSB7XG4gIHZhciBrZXlzPVtdO1xuICBpZihleHRlbmR0aGlzLnByb3RvdHlwZSA9PSB1bmRlZmluZWQpe1xuICAgICAgdmFyIEVtcHR5ID0gZnVuY3Rpb24oKXt9XG4gICAgICBFbXB0eS5wcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlO1xuICAgICAgZXh0ZW5kdGhpcy5wcm90b3R5cGUgPSBFbXB0eS5wcm90b3R5cGU7XG4gIH1cbiAgZnJvbXRoZXNlLm1hcChmdW5jdGlvbihmcm9tdGhpcyl7XG4gICAga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGZyb210aGlzLnByb3RvdHlwZSk7XG4gICAga2V5cy5zaGlmdCgpO1xuICAgIGtleXMubWFwKGZ1bmN0aW9uKGtleSl7XG4gICAgICAgIGV4dGVuZHRoaXMucHJvdG90eXBlW2tleV09IGZyb210aGlzLnByb3RvdHlwZVtrZXldO1xuICAgIH0pO1xuICB9KTtcbn1cbm1vZHVsZS5leHBvcnRzID0gaW5oZXJpdDtcbiIsInZhciBpbmNsdWRlcyAgICA9IHJlcXVpcmUoJy4vcG9seWZpbGxzL2luY2x1ZGVzJyk7XG52YXIgbG9va3VwICAgICAgPSByZXF1aXJlKCcuL3BvbHlmaWxscy9maW5kLW9iamVjdCcpO1xudmFyIHRyYXNoICAgICAgID0gcmVxdWlyZSgnLi9wb2x5ZmlsbHMvdHJhc2gnKTtcbnZhciBjb3B5ICAgICAgICA9IHJlcXVpcmUoJy4vcG9seWZpbGxzL2NvcHknKTtcbnZhciBjbGVhciAgICAgICA9IHJlcXVpcmUoJy4vcG9seWZpbGxzL2NsZWFyJyk7XG5cbnZhciBpbmhlcml0ID0gcmVxdWlyZSgnaW5oZXJpdC1wcm90b3R5cGVzJyk7XG5cblxubGV0IGRlcGVuZGVuY2llcyA9IFtpbmNsdWRlcywgbG9va3VwLCBjb3B5LCBjbGVhciwgdHJhc2hdO1xuXG5jbGFzcyBBcnJheUluY2x1ZGVzUG9sbHlmaWxscyBleHRlbmRzIEFycmF5IHtcbiAgY29uc3RydWN0b3IoYXJyYXkpe1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuICAgIGlmKHR5cGVvZiBhcnJheSA9PSAnYXJyYXknKVxuICAgIGFycmF5Lm1hcCgoZWxlbWVudCk9PntcbiAgICAgIHRoaXMucHVzaChlbGVtZW50KTtcbiAgICB9KTtcblxuICAgIGlmKHR5cGVvZiBhcnJheSA9PSAnb2JqZWN0Jyl7XG4gICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGFycmF5KTtcbiAgICAgIGtleXMubWFwKChrZXkpPT57XG4gICAgICAgIHRoaXMucHVzaChhcnJheVtrZXldKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICB9XG59XG5cblxuaW5oZXJpdChBcnJheUluY2x1ZGVzUG9sbHlmaWxscywgZGVwZW5kZW5jaWVzKTtcblxubW9kdWxlLmV4cG9ydHMgPSBBcnJheUluY2x1ZGVzUG9sbHlmaWxsc1xuIiwidmFyIGFyckVTNiA9IHJlcXVpcmUoJy4vYXJyYXktaW5jbHVkZXMtcG9seWZpbGwtZXM2Jyk7XG52YXIgYXJyID0gbmV3IGFyckVTNigpO1xudmFyIGRlZmF1bHRMZW5ndGggPSBuZXcgYXJyRVM2KCk7XG5jb25zb2xlLmxvZyhkZWZhdWx0TGVuZ3RoKTtcblxuYXJyLnB1c2goJ0hhcyBpbmNsdWRlcyBwb2x5ZmlsbCcpO1xuY29uc29sZS5sb2coYXJyLmluY2x1ZGVzKCdIYXMgaW5jbHVkZXMgcG9seWZpbGwnKSk7XG5jb25zb2xlLmxvZyhhcnIpO1xuXG52YXIgb2JqMSA9IHtpZDonXyQxUUEyV1MzRUQnLCB1c2VyOidqb2huIGRvZScsIGRldGFpbHM6e2RvYjonMDEvMDEvOTknfX07XG52YXIgb2JqMiA9IHtpZDonXyQxUUEyV1MzRUYnLCB1c2VyOidqb2huIGRvZScsIGRldGFpbHM6e2RvYjonMDEvMDIvOTknfX07XG52YXIgb2JqMyA9IHtpZDonXyQxUUEyV1MzRUcnLCB1c2VyOidqb2huIGRvZScsIGRldGFpbHM6e2RvYjonMDEvMDEvOTknfX07XG5cbnZhciBvYmo0ID0ge2lkOidfJDFRQTJXUzNFSCcsIHVzZXI6J2phbmUgZG9lJywgZGV0YWlsczp7ZG9iOicwMS8wMi85OSd9fTtcbnZhciBvYmo1ID0ge2lkOidfJDFRQTJXUzNFSScsIHVzZXI6J2phY2sgZG9lJywgZGV0YWlsczp7ZG9iOicwMS8wNS85OSd9fTtcbnZhciBvYmo2ID0ge2lkOidfJDFRQTJXUzNFSicsIHVzZXI6J2p1bHkgZG9lJywgZGV0YWlsczp7ZG9iOicwMS8wNi85OSd9fTtcblxuYXJyLnB1c2gob2JqMSwgb2JqMiwgb2JqMywgb2JqNCwgb2JqNik7XG5cbmFyci5sb29rdXAoe2lkOidfJDFRQTJXUzNFRCd9KS5kZXRhaWxzLm9jY3VwYXRpb249XCJwcm9ncmFtbWVyXCI7XG5jb25zb2xlLmxvZyhhcnIubG9va3VwKHtpZDonXyQxUUEyV1MzRUQnfSkpO1xuXG5hcnIubG9va3VwKHt1c2VyOidqb2huIGRvZScsIGRldGFpbHM6e2RvYjonMDEvMDIvOTknfX0pLmRldGFpbHMub2NjdXBhdGlvbj1cInByb2dyYW1tZXJcIjtcbmNvbnNvbGUubG9nKGFyci5sb29rdXAoe3VzZXI6J2pvaG4gZG9lJywgZGV0YWlsczp7ZG9iOicwMS8wMi85OSd9fSkpO1xuXG5hcnIudHJhc2goe2lkOidfJDFRQTJXUzNFSid9KTtcbmNvbnNvbGUubG9nKGFycik7IC8vPC0tIERlbGV0ZXMgdXNlciBqdWx5IGRvZSBmcm9tIHRoZSBhcnJheSBwZXJtYW5lbnRseS5cblxudmFyIGRlc3RpbmF0aW9uID0gYXJyLmNvcHkoKTtcbmFyci5jb3B5KGRlc3RpbmF0aW9uKTtcblxudmFyIHRlc3QgPSBbe2hlbGxvOid3b3JsZCcsIGlkOjEyMzR9XTtcbnZhciBhcnIgPSBuZXcgYXJyRVM2KHRlc3QpOyAvLzwtLSB3aWxsIHJldHVybiBhIG5ldyBhcnJheS1pbmMtcG9seWZpbGwgb2JqZWN0IGdlbmVyYXRlZCBmcm9tIHRlc3QgYXJyYXlcbmNvbnNvbGUubG9nKGFyci5sb29rdXAoe2lkOjEyMzR9KSk7IC8vPC0tIHdpbGwgcmV0dXJuIHRoZSBvYmplY3QgZnJvbSBsb29rdXAgbWV0aG9kLlxuXG52YXIgYXJyID0gbmV3IGFyckVTNihbe2lkOjEyM30sIHtpZDozMjF9LCB7aWQ6MjEzfV0pO1xuY29uc29sZS5sb2coYXJyKTsgLy88LS0gc2hvdWxkIGVxdWFsIGFuIGVtcHR5IGFuIEFycmF5IGxpa2Ugb2JqZWN0O1xuYXJyLmNsZWFyKCk7XG5cbnZhciBhcnIgPSBuZXcgYXJyRVM2KHt0ZXN0OjEyMywgdGVzdGE6MzIxLCB0ZXN0YjoyMTN9KTtcbmNvbnNvbGUubG9nKGFycik7XG5hcnIuY2xlYXIoKTtcbiIsImNsYXNzIENsZWFye1xuICBjbGVhcigpe1xuICAgIHRoaXMuc3BsaWNlKDAsdGhpcy5sZW5ndGgpO1xuICAgIGlmKHRoaXMubGVuZ3RoPT0wKVxuICAgIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENsZWFyO1xuIiwiY2xhc3MgQ29weXtcbiAgY29weShhcnIpe1xuICAgIGlmKGFycil7XG4gICAgICB0aGlzLm1hcCgoZGF0YSk9PntcbiAgICAgICAgYXJyLnB1c2goZGF0YSk7XG4gICAgICB9KTtcbiAgICB9ZWxzZXtcbiAgICAgIHZhciB4ID0gW107XG4gICAgICB0aGlzLm1hcCgoZGF0YSk9PntcbiAgICAgICAgeC5wdXNoKGRhdGEpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4geDtcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBDb3B5O1xuIiwiY2xhc3MgTG9va3Vwe1xuXG4gIGxvb2t1cChvYmosIHdpdGhJbmRleCkge1xuICAgIGxldCBPID0gT2JqZWN0KHRoaXMpO1xuICAgIHZhciByZXN1bHQgPSBbXTtcblxuICAgIE8ubWFwKGZ1bmN0aW9uKG9iamVjdCwgaW5kZXgpe1xuICAgICAgaWYoX2lzRmxhdChvYmplY3QpKXtcbiAgICAgICAgaWYoX2NvbXBhcmVPYmpzKG9iaiwgb2JqZWN0KSl7XG5cbiAgICAgICAgICBpZih3aXRoSW5kZXgpXG4gICAgICAgICAgX2RlZmluZSQkaW5kZXgob2JqZWN0LCBpbmRleCk7XG4gICAgICAgICAgcmVzdWx0LnB1c2gob2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZighX2lzRmxhdChvYmplY3QpKXtcbiAgICAgICAgdmFyIHRlbXBPYmoxID0gX2ZsYXR0ZW5PYmpzKG9iamVjdCwgd2l0aEluZGV4LCBpbmRleCk7XG4gICAgICAgIHZhciB0ZW1wT2JqMiA9IF9mbGF0dGVuT2JqcyhvYmosIHdpdGhJbmRleCwgaW5kZXgpO1xuICAgICAgICBpZihfY29tcGFyZU9ianModGVtcE9iajIsIHRlbXBPYmoxKSl7XG4gICAgICAgICAgX2RlZmluZSQkaW5kZXgob2JqZWN0LCBpbmRleCk7XG4gICAgICAgICAgcmVzdWx0LnB1c2gob2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfSk7XG4gICAgdmFyIHggPSByZXN1bHQ7XG4gICAgcmVzdWx0ID0gW107XG5cblxuICAgIGlmKHgubGVuZ3RoID09PSAxKVxuICAgIHggPSB4WzBdO1xuXG4gICAgaWYoeCA9PT0gdW5kZWZpbmVkIHx8IHggPT09IG51bGwgfHwgeCA9PSAnJylcbiAgICB4ID0gZmFsc2U7XG5cbiAgICByZXR1cm4geDtcblxuICB9XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmUkJGluZGV4KG9iamVjdCwgaW5kZXgpe1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBcIl8kJGluZGV4X1wiLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIHZhbHVlOmluZGV4LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gX2NvbXBhcmVPYmpzIChvYmoxLCBvYmoyKXtcbiAgdmFyIHZhbGlkYXRlID0gW107XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqMSk7XG4gIHZhciBzdGF0ZTtcblxuICBrZXlzLm1hcChmdW5jdGlvbihrZXkpe1xuICAgIGlmKG9iajFba2V5XSA9PT0gb2JqMltrZXldKVxuICAgIHZhbGlkYXRlLnB1c2godHJ1ZSk7XG4gIH0pO1xuXG4gICh2YWxpZGF0ZS5sZW5ndGggPT09IGtleXMubGVuZ3RoKSA/IHN0YXRlPXRydWUgOiBzdGF0ZT1mYWxzZTtcbiAgcmV0dXJuIHN0YXRlO1xufVxuXG5sZXQgX2ZsYXR0ZW5kID0ge307XG5sZXQgX3JlY3Vyc2lvbiA9IGZhbHNlO1xuXG5mdW5jdGlvbiBfZmxhdHRlbk9ianMob2JqZWN0LCB3aXRoSW5kZXgsIGluZGV4KXtcbiAgaWYoIV9yZWN1cnNpb24pIF9mbGF0dGVuZCA9IHt9O1xuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBrZXlzLm1hcChmdW5jdGlvbihrZXkpe1xuXG4gICAgaWYoIV9pc09iamVjdChvYmplY3Rba2V5XSkpXG4gICAgICBfZmxhdHRlbmRba2V5XSA9IG9iamVjdFtrZXldO1xuICAgIGlmKF9pc09iamVjdChvYmplY3Rba2V5XSkpe1xuICAgICAgX3JlY3Vyc2lvbiA9IHRydWU7XG4gICAgICBfZmxhdHRlbk9ianMob2JqZWN0W2tleV0pO1xuICAgIH1cbiAgfSk7XG5cbiAgX3JlY3Vyc2lvbiA9IGZhbHNlO1xuICBpZih3aXRoSW5kZXgpXG4gIF9kZWZpbmUkJGluZGV4KF9mbGF0dGVuZCwgaW5kZXgpO1xuICByZXR1cm4gX2ZsYXR0ZW5kO1xufVxuXG5mdW5jdGlvbiBfaXNGbGF0KG9iamVjdCl7XG4gICAgdmFyIHZhbGlkYXRlID0gW107XG4gICAgaWYob2JqZWN0IGluc3RhbmNlb2YgT2JqZWN0KXtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG4gICAgICBrZXlzLm1hcChmdW5jdGlvbihrZXkpe1xuICAgICAgICBpZihvYmplY3Rba2V5XSBpbnN0YW5jZW9mIE9iamVjdClcbiAgICAgICAgdmFsaWRhdGUucHVzaCh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh2YWxpZGF0ZS5sZW5ndGggPiAwKVxuICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbiBmdW5jdGlvbiBfaXNPYmplY3Qob2JqZWN0KXtcbiAgIGlmKG9iamVjdCBpbnN0YW5jZW9mIE9iamVjdClcbiAgIHJldHVybiB0cnVlO1xuICAgcmV0dXJuIGZhbHNlO1xuIH1cblxubW9kdWxlLmV4cG9ydHMgPSBMb29rdXA7XG4iLCJjbGFzcyBJbmNsdWRlcyB7XG4gaW5jbHVkZXMgKHNlYXJjaEVsZW1lbnQgLyosIGZyb21JbmRleCovICl7XG4gICAgdmFyIE8gPSBPYmplY3QodGhpcyk7XG4gICAgdmFyIGxlbiA9IHBhcnNlSW50KE8ubGVuZ3RoKSB8fCAwO1xuICAgIGlmIChsZW4gPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIG4gPSBwYXJzZUludChhcmd1bWVudHNbMV0pIHx8IDA7XG4gICAgdmFyIGs7XG4gICAgaWYgKG4gPj0gMCkge1xuICAgICAgayA9IG47XG4gICAgfSBlbHNlIHtcbiAgICAgIGsgPSBsZW4gKyBuO1xuICAgICAgaWYgKGsgPCAwKSB7ayA9IDA7fVxuICAgIH1cbiAgICB2YXIgY3VycmVudEVsZW1lbnQ7XG4gICAgd2hpbGUgKGsgPCBsZW4pIHtcbiAgICAgIGN1cnJlbnRFbGVtZW50ID0gT1trXTtcbiAgICAgIGlmIChzZWFyY2hFbGVtZW50ID09PSBjdXJyZW50RWxlbWVudCB8fFxuICAgICAgICAgKHNlYXJjaEVsZW1lbnQgIT09IHNlYXJjaEVsZW1lbnQgJiYgY3VycmVudEVsZW1lbnQgIT09IGN1cnJlbnRFbGVtZW50KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGsrKztcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG59XG4gIG1vZHVsZS5leHBvcnRzID0gSW5jbHVkZXM7XG4iLCJjbGFzcyBUcmFzaHtcbiAgdHJhc2gob2JqKXtcbiAgICBpZih0eXBlb2Ygb2JqID09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoICE9IDApe1xuICAgICAgaWYodGhpcy5sb29rdXAob2JqKSl7XG4gICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5sb29rdXAob2JqLCB0cnVlKS5fJCRpbmRleF87XG4gICAgICAgICAgdGhpcy5zcGxpY2UoaW5kZXgsMSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBUcmFzaDtcbiJdfQ==