UNPKG

foop

Version:

interfaces that describe their intentions.

298 lines (281 loc) 23.7 kB
/* eslint complexity: "OFF" */ var isObjNotNull = require('../is/objNotNull') var isArray = require('../is/array') var isTrue = require('../is/true') var ObjectKeys = require('../util/keys') var ObjectAssign = require('../util/assign') var isUndefined = require('../is/undefined') var isRegExp = require('../is/regexp') var isDate = require('../is/date') var isBoolean = require('../is/boolean') var isString = require('../is/string') var simpleKindOf = require('../util/simpleKindOf') var includes = require('../conditional/includes/haystackNeedle') var emptyTarget = require('./emptyTarget') /** * @desc 1: not null object * 2: object toString is not a date or regex * * @category merge * @memberOf dopemerge * * @since 2.0.0 * @param {*} x value to check * @return {boolean} * * @example * * isMergeableObj({}) * //=> true * * isMergeableObj(Object.create(null)) * //=> true * * isMergeableObj(new Date()) * //=> false * * isMergeableObj(/eh/) * //=> false * */ function isMergeableObj(x) { return isObjNotNull(x) && !isRegExp(x) && !isDate(x) } /** * Defaults to `false`. * If `clone` is `true` then both `x` and `y` are recursively cloned as part of the merge. * * @memberOf dopemerge * @since 2.0.0 * * @param {*} value value to clone if needed * @param {DopeMergeOptions} optsArg dopemerge options, could contain .clone * @return {Object | Array | any} cloned or original value * * @see emptyTarget * @see isMergeableObj * * @example * * var obj = {eh: true} * * cloneIfNeeded(obj, {clone: true}) === obj * //=> false * * cloneIfNeeded(obj, {clone: false}) === obj * //=> true * */ function cloneIfNeeded(value, optsArg) { return isTrue(optsArg.clone) && isMergeableObj(value) ? deepmerge(emptyTarget(value), value, optsArg) : value } /* prettier-ignore */ /** * The merge will also merge arrays and array values by default. * However, there are nigh-infinite valid ways to merge arrays, * and you may want to supply your own. * You can do this by passing an `arrayMerge` function as an option. * * @memberOf dopemerge * @since 2.0.0 * * @param {*} target array merged onto, could be emptyTarget if cloning * @param {*} source original source array * @param {*} optsArg dopemerge options * @return {Array | *} merged array * * @example * * function concatMerge(destinationArray, sourceArray, options) { * destinationArray * //=> [1, 2, 3] * * sourceArray * //=> [3, 2, 1] * * options * //=> { arrayMerge: concatMerge } * * return destinationArray.concat(sourceArray) * } * merge([1, 2, 3], [3, 2, 1], { arrayMerge: concatMerge }) * //=> [1, 2, 3, 3, 2, 1] * */ function defaultArrayMerge(target, source, optsArg) { var destination = target.slice() for (var i = 0; i < source.length; i++) { var v = source[i] if (isUndefined(destination[i])) { destination[i] = cloneIfNeeded(v, optsArg) } else if (isMergeableObj(v)) { destination[i] = deepmerge(target[i], v, optsArg) } // @see https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_NOT // === -1 // eslint-disable-next-line prefer-includes/prefer-includes else if (!~target.indexOf(v)) { destination.push(cloneIfNeeded(v, optsArg)) } } return destination } function mergeObj(target, source, optsArg) { var destination = {} if (isMergeableObj(target)) { var targetKeys = ObjectKeys(target) for (var k = 0; k < targetKeys.length; k++) { destination[targetKeys[k]] = cloneIfNeeded(target[targetKeys[k]], optsArg) } } var sourceKeys = ObjectKeys(source) for (var s = 0; s < sourceKeys.length; s++) { var key = sourceKeys[s] if (!isMergeableObj(source[key]) || !target[key]) { destination[key] = cloneIfNeeded(source[key], optsArg) } else { destination[key] = deepmerge(target[key], source[key], optsArg) } } return destination } function deepmerge(target, source, optsArg) { if (isArray(source)) { var arrayMerge = optsArg.arrayMerge; return isArray(target) ? arrayMerge(target, source, optsArg) : cloneIfNeeded(source, optsArg) } // else return mergeObj(target, source, optsArg) } /* prettier-ignore */ /** * Merge the enumerable attributes of two objects deeply. * Merge two objects `x` and `y` deeply, returning a new merged object with the * elements from both `x` and `y`. * If an element at the same key is present for both `x` and `y`, the value from * `y` will appear in the result. * Merging creates a new object, so that neither `x` or `y` are be modified. * However, child objects on `x` or `y` are copied over - * if you want to copy all values, you must pass `true` to the clone option. * * * @member dopemerge * @category merge * * @param {*} obj1 left * @param {*} obj2 right * @param {*} opts dopemerge options * @return {Object | Array | any} merged * * {@link https://github.com/facebook/immutable-js/blob/master/src/Map.js#L145 immutable-js-merge} * {@link https://github.com/ramda/ramda/blob/master/src/merge.js ramda-merge} * {@link https://github.com/lodash/lodash/blob/master/merge.js lodash-merge} * {@link https://github.com/KyleAMathews/deepmerge deepmerge} * @see {@link deepmerge} * * @types dopemerge * @tests deepmerge * * @example * * var x = { * foo: {bar: 3}, * array: [{ * does: 'work', * too: [1, 2, 3], * }], * } * * var y = { * foo: {baz: 4}, * quux: 5, * array: [ * { * does: 'work', * too: [4, 5, 6], * }, * { * really: 'yes', * }, * ], * } * * var expected = { * foo: { * bar: 3, * baz: 4, * }, * array: [ * { * does: 'work', * too: [1, 2, 3, 4, 5, 6], * }, * { * really: 'yes', * }, * ], * quux: 5, * } * * merge(x, y) * //=> expected * */ function dopemerge(obj1, obj2, opts) { // if they are identical, fastest === check if (obj1 === obj2) { return obj1 } // setup options var options = ObjectAssign( { arrayMerge: defaultArrayMerge, stringToArray: true, boolToArray: false, ignoreTypes: ['null', 'undefined'], // debug: true, }, opts // || {} ) var ignoreTypes = options.ignoreTypes; var stringToArray = options.stringToArray; var boolToArray = options.boolToArray; var clone = options.clone; // @NOTE: much better size but oh well // const ignoreTypes = ['null', 'undefined'] // const stringToArray = true // const boolToArray = false // const clone = true // @NOTE uglifier optimizes into a wicked ternary // check one then check the other if (isTrue(includes(ignoreTypes, simpleKindOf(obj1)))) { return obj2 } else if (isTrue(includes(ignoreTypes, simpleKindOf(obj2)))) { return obj1 } else if (isBoolean(obj1) && isBoolean(obj2)) { return boolToArray ? [obj1, obj2] : obj2 } else if (isString(obj1) && isString(obj2)) { return stringToArray ? [obj1, obj2] : obj1 + obj2 } else if (isArray(obj1) && isString(obj2)) { return (clone ? obj1.slice(0) : obj1).concat([obj2]) } else if (isString(obj1) && isArray(obj2)) { return (clone ? obj2.slice(0) : obj2).concat([obj1]) } else { return deepmerge(obj1, obj2, options) } } module.exports = dopemerge //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9wZW1lcmdlLmpzIiwic291cmNlcyI6WyJkb3BlbWVyZ2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50IGNvbXBsZXhpdHk6IFwiT0ZGXCIgKi9cbmNvbnN0IGlzT2JqTm90TnVsbCA9IHJlcXVpcmUoJy4uL2lzL29iak5vdE51bGwnKVxuY29uc3QgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2lzL2FycmF5JylcbmNvbnN0IGlzVHJ1ZSA9IHJlcXVpcmUoJy4uL2lzL3RydWUnKVxuY29uc3QgT2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL3V0aWwva2V5cycpXG5jb25zdCBPYmplY3RBc3NpZ24gPSByZXF1aXJlKCcuLi91dGlsL2Fzc2lnbicpXG5jb25zdCBpc1VuZGVmaW5lZCA9IHJlcXVpcmUoJy4uL2lzL3VuZGVmaW5lZCcpXG5jb25zdCBpc1JlZ0V4cCA9IHJlcXVpcmUoJy4uL2lzL3JlZ2V4cCcpXG5jb25zdCBpc0RhdGUgPSByZXF1aXJlKCcuLi9pcy9kYXRlJylcbmNvbnN0IGlzQm9vbGVhbiA9IHJlcXVpcmUoJy4uL2lzL2Jvb2xlYW4nKVxuY29uc3QgaXNTdHJpbmcgPSByZXF1aXJlKCcuLi9pcy9zdHJpbmcnKVxuY29uc3Qgc2ltcGxlS2luZE9mID0gcmVxdWlyZSgnLi4vdXRpbC9zaW1wbGVLaW5kT2YnKVxuY29uc3QgaW5jbHVkZXMgPSByZXF1aXJlKCcuLi9jb25kaXRpb25hbC9pbmNsdWRlcy9oYXlzdGFja05lZWRsZScpXG5jb25zdCBlbXB0eVRhcmdldCA9IHJlcXVpcmUoJy4vZW1wdHlUYXJnZXQnKVxuXG4vKipcbiAqIEBkZXNjIDE6IG5vdCBudWxsIG9iamVjdFxuICogICAgICAgMjogb2JqZWN0IHRvU3RyaW5nIGlzIG5vdCBhIGRhdGUgb3IgcmVnZXhcbiAqXG4gKiBAY2F0ZWdvcnkgbWVyZ2VcbiAqIEBtZW1iZXJPZiBkb3BlbWVyZ2VcbiAqXG4gKiBAc2luY2UgMi4wLjBcbiAqIEBwYXJhbSB7Kn0geCB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgIGlzTWVyZ2VhYmxlT2JqKHt9KVxuICogICAgLy89PiB0cnVlXG4gKlxuICogICAgaXNNZXJnZWFibGVPYmooT2JqZWN0LmNyZWF0ZShudWxsKSlcbiAqICAgIC8vPT4gdHJ1ZVxuICpcbiAqICAgIGlzTWVyZ2VhYmxlT2JqKG5ldyBEYXRlKCkpXG4gKiAgICAvLz0+IGZhbHNlXG4gKlxuICogICAgaXNNZXJnZWFibGVPYmooL2VoLylcbiAqICAgIC8vPT4gZmFsc2VcbiAqXG4gKi9cbmZ1bmN0aW9uIGlzTWVyZ2VhYmxlT2JqKHgpIHtcbiAgcmV0dXJuIGlzT2JqTm90TnVsbCh4KSAmJiAhaXNSZWdFeHAoeCkgJiYgIWlzRGF0ZSh4KVxufVxuXG4vKipcbiAqIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gKiBJZiBgY2xvbmVgIGlzIGB0cnVlYCB0aGVuIGJvdGggYHhgIGFuZCBgeWAgYXJlIHJlY3Vyc2l2ZWx5IGNsb25lZCBhcyBwYXJ0IG9mIHRoZSBtZXJnZS5cbiAqXG4gKiBAbWVtYmVyT2YgZG9wZW1lcmdlXG4gKiBAc2luY2UgMi4wLjBcbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlIHZhbHVlIHRvIGNsb25lIGlmIG5lZWRlZFxuICogQHBhcmFtIHtEb3BlTWVyZ2VPcHRpb25zfSBvcHRzQXJnIGRvcGVtZXJnZSBvcHRpb25zLCBjb3VsZCBjb250YWluIC5jbG9uZVxuICogQHJldHVybiB7T2JqZWN0IHwgQXJyYXkgfCBhbnl9IGNsb25lZCBvciBvcmlnaW5hbCB2YWx1ZVxuICpcbiAqIEBzZWUgZW1wdHlUYXJnZXRcbiAqIEBzZWUgaXNNZXJnZWFibGVPYmpcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmogPSB7ZWg6IHRydWV9XG4gKlxuICogY2xvbmVJZk5lZWRlZChvYmosIHtjbG9uZTogdHJ1ZX0pID09PSBvYmpcbiAqIC8vPT4gZmFsc2VcbiAqXG4gKiBjbG9uZUlmTmVlZGVkKG9iaiwge2Nsb25lOiBmYWxzZX0pID09PSBvYmpcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqL1xuZnVuY3Rpb24gY2xvbmVJZk5lZWRlZCh2YWx1ZSwgb3B0c0FyZykge1xuICByZXR1cm4gaXNUcnVlKG9wdHNBcmcuY2xvbmUpICYmIGlzTWVyZ2VhYmxlT2JqKHZhbHVlKVxuICAgID8gZGVlcG1lcmdlKGVtcHR5VGFyZ2V0KHZhbHVlKSwgdmFsdWUsIG9wdHNBcmcpXG4gICAgOiB2YWx1ZVxufVxuXG4vKiBwcmV0dGllci1pZ25vcmUgKi9cbi8qKlxuICogVGhlIG1lcmdlIHdpbGwgYWxzbyBtZXJnZSBhcnJheXMgYW5kIGFycmF5IHZhbHVlcyBieSBkZWZhdWx0LlxuICogSG93ZXZlciwgdGhlcmUgYXJlIG5pZ2gtaW5maW5pdGUgdmFsaWQgd2F5cyB0byBtZXJnZSBhcnJheXMsXG4gKiBhbmQgeW91IG1heSB3YW50IHRvIHN1cHBseSB5b3VyIG93bi5cbiAqIFlvdSBjYW4gZG8gdGhpcyBieSBwYXNzaW5nIGFuIGBhcnJheU1lcmdlYCBmdW5jdGlvbiBhcyBhbiBvcHRpb24uXG4gKlxuICogQG1lbWJlck9mIGRvcGVtZXJnZVxuICogQHNpbmNlIDIuMC4wXG4gKlxuICogQHBhcmFtIHsqfSB0YXJnZXQgYXJyYXkgbWVyZ2VkIG9udG8sIGNvdWxkIGJlIGVtcHR5VGFyZ2V0IGlmIGNsb25pbmdcbiAqIEBwYXJhbSB7Kn0gc291cmNlIG9yaWdpbmFsIHNvdXJjZSBhcnJheVxuICogQHBhcmFtIHsqfSBvcHRzQXJnIGRvcGVtZXJnZSBvcHRpb25zXG4gKiBAcmV0dXJuIHtBcnJheSB8ICp9IG1lcmdlZCBhcnJheVxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogICAgZnVuY3Rpb24gY29uY2F0TWVyZ2UoZGVzdGluYXRpb25BcnJheSwgc291cmNlQXJyYXksIG9wdGlvbnMpIHtcbiAqICAgICAgZGVzdGluYXRpb25BcnJheVxuICogICAgICAvLz0+IFsxLCAyLCAzXVxuICpcbiAqICAgICAgc291cmNlQXJyYXlcbiAqICAgICAgLy89PiBbMywgMiwgMV1cbiAqXG4gKiAgICAgIG9wdGlvbnNcbiAqICAgICAgLy89PiB7IGFycmF5TWVyZ2U6IGNvbmNhdE1lcmdlIH1cbiAqXG4gKiAgICAgIHJldHVybiBkZXN0aW5hdGlvbkFycmF5LmNvbmNhdChzb3VyY2VBcnJheSlcbiAqICAgIH1cbiAqICAgIG1lcmdlKFsxLCAyLCAzXSwgWzMsIDIsIDFdLCB7IGFycmF5TWVyZ2U6IGNvbmNhdE1lcmdlIH0pXG4gKiAgICAvLz0+IFsxLCAyLCAzLCAzLCAyLCAxXVxuICpcbiAqL1xuZnVuY3Rpb24gZGVmYXVsdEFycmF5TWVyZ2UodGFyZ2V0LCBzb3VyY2UsIG9wdHNBcmcpIHtcbiAgdmFyIGRlc3RpbmF0aW9uID0gdGFyZ2V0LnNsaWNlKClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykge1xuICAgIHZhciB2ID0gc291cmNlW2ldXG5cbiAgICBpZiAoaXNVbmRlZmluZWQoZGVzdGluYXRpb25baV0pKSB7XG4gICAgICBkZXN0aW5hdGlvbltpXSA9IGNsb25lSWZOZWVkZWQodiwgb3B0c0FyZylcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNNZXJnZWFibGVPYmoodikpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2ldID0gZGVlcG1lcmdlKHRhcmdldFtpXSwgdiwgb3B0c0FyZylcbiAgICB9XG4gICAgLy8gQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9PcGVyYXRvcnMvQml0d2lzZV9PcGVyYXRvcnMjQml0d2lzZV9OT1RcbiAgICAvLyA9PT0gLTFcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWluY2x1ZGVzL3ByZWZlci1pbmNsdWRlc1xuICAgIGVsc2UgaWYgKCF+dGFyZ2V0LmluZGV4T2YodikpIHtcbiAgICAgIGRlc3RpbmF0aW9uLnB1c2goY2xvbmVJZk5lZWRlZCh2LCBvcHRzQXJnKSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGVzdGluYXRpb25cbn1cblxuZnVuY3Rpb24gbWVyZ2VPYmoodGFyZ2V0LCBzb3VyY2UsIG9wdHNBcmcpIHtcbiAgdmFyIGRlc3RpbmF0aW9uID0ge31cbiAgaWYgKGlzTWVyZ2VhYmxlT2JqKHRhcmdldCkpIHtcbiAgICB2YXIgdGFyZ2V0S2V5cyA9IE9iamVjdEtleXModGFyZ2V0KVxuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdGFyZ2V0S2V5cy5sZW5ndGg7IGsrKykge1xuICAgICAgZGVzdGluYXRpb25bdGFyZ2V0S2V5c1trXV0gPSBjbG9uZUlmTmVlZGVkKHRhcmdldFt0YXJnZXRLZXlzW2tdXSwgb3B0c0FyZylcbiAgICB9XG4gIH1cblxuICB2YXIgc291cmNlS2V5cyA9IE9iamVjdEtleXMoc291cmNlKVxuICBmb3IgKHZhciBzID0gMDsgcyA8IHNvdXJjZUtleXMubGVuZ3RoOyBzKyspIHtcbiAgICB2YXIga2V5ID0gc291cmNlS2V5c1tzXVxuICAgIGlmICghaXNNZXJnZWFibGVPYmooc291cmNlW2tleV0pIHx8ICF0YXJnZXRba2V5XSkge1xuICAgICAgZGVzdGluYXRpb25ba2V5XSA9IGNsb25lSWZOZWVkZWQoc291cmNlW2tleV0sIG9wdHNBcmcpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgZGVzdGluYXRpb25ba2V5XSA9IGRlZXBtZXJnZSh0YXJnZXRba2V5XSwgc291cmNlW2tleV0sIG9wdHNBcmcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRlc3RpbmF0aW9uXG59XG5cbmZ1bmN0aW9uIGRlZXBtZXJnZSh0YXJnZXQsIHNvdXJjZSwgb3B0c0FyZykge1xuICBpZiAoaXNBcnJheShzb3VyY2UpKSB7XG4gICAgY29uc3Qge2FycmF5TWVyZ2V9ID0gb3B0c0FyZ1xuICAgIHJldHVybiBpc0FycmF5KHRhcmdldClcbiAgICAgID8gYXJyYXlNZXJnZSh0YXJnZXQsIHNvdXJjZSwgb3B0c0FyZylcbiAgICAgIDogY2xvbmVJZk5lZWRlZChzb3VyY2UsIG9wdHNBcmcpXG4gIH1cblxuICAvLyBlbHNlXG4gIHJldHVybiBtZXJnZU9iaih0YXJnZXQsIHNvdXJjZSwgb3B0c0FyZylcbn1cblxuLyogcHJldHRpZXItaWdub3JlICovXG4vKipcbiAqICBNZXJnZSB0aGUgZW51bWVyYWJsZSBhdHRyaWJ1dGVzIG9mIHR3byBvYmplY3RzIGRlZXBseS5cbiAqICBNZXJnZSB0d28gb2JqZWN0cyBgeGAgYW5kIGB5YCBkZWVwbHksIHJldHVybmluZyBhIG5ldyBtZXJnZWQgb2JqZWN0IHdpdGggdGhlXG4gKiAgZWxlbWVudHMgZnJvbSBib3RoIGB4YCBhbmQgYHlgLlxuICogIElmIGFuIGVsZW1lbnQgYXQgdGhlIHNhbWUga2V5IGlzIHByZXNlbnQgZm9yIGJvdGggYHhgIGFuZCBgeWAsIHRoZSB2YWx1ZSBmcm9tXG4gKiBgeWAgd2lsbCBhcHBlYXIgaW4gdGhlIHJlc3VsdC5cbiAqICBNZXJnaW5nIGNyZWF0ZXMgYSBuZXcgb2JqZWN0LCBzbyB0aGF0IG5laXRoZXIgYHhgIG9yIGB5YCBhcmUgYmUgbW9kaWZpZWQuXG4gKiAgSG93ZXZlciwgY2hpbGQgb2JqZWN0cyBvbiBgeGAgb3IgYHlgIGFyZSBjb3BpZWQgb3ZlciAtXG4gKiAgaWYgeW91IHdhbnQgdG8gY29weSBhbGwgdmFsdWVzLCB5b3UgbXVzdCBwYXNzIGB0cnVlYCB0byB0aGUgY2xvbmUgb3B0aW9uLlxuICpcbiAqXG4gKiBAbWVtYmVyIGRvcGVtZXJnZVxuICogQGNhdGVnb3J5IG1lcmdlXG4gKlxuICogQHBhcmFtIHsqfSBvYmoxIGxlZnRcbiAqIEBwYXJhbSB7Kn0gb2JqMiByaWdodFxuICogQHBhcmFtIHsqfSBvcHRzIGRvcGVtZXJnZSBvcHRpb25zXG4gKiBAcmV0dXJuIHtPYmplY3QgfCBBcnJheSB8IGFueX0gbWVyZ2VkXG4gKlxuICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9pbW11dGFibGUtanMvYmxvYi9tYXN0ZXIvc3JjL01hcC5qcyNMMTQ1IGltbXV0YWJsZS1qcy1tZXJnZX1cbiAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vcmFtZGEvcmFtZGEvYmxvYi9tYXN0ZXIvc3JjL21lcmdlLmpzIHJhbWRhLW1lcmdlfVxuICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9sb2Rhc2gvbG9kYXNoL2Jsb2IvbWFzdGVyL21lcmdlLmpzIGxvZGFzaC1tZXJnZX1cbiAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vS3lsZUFNYXRoZXdzL2RlZXBtZXJnZSBkZWVwbWVyZ2V9XG4gKiBAc2VlIHtAbGluayBkZWVwbWVyZ2V9XG4gKlxuICogQHR5cGVzIGRvcGVtZXJnZVxuICogQHRlc3RzIGRlZXBtZXJnZVxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogICAgdmFyIHggPSB7XG4gKiAgICAgIGZvbzoge2JhcjogM30sXG4gKiAgICAgIGFycmF5OiBbe1xuICogICAgICAgIGRvZXM6ICd3b3JrJyxcbiAqICAgICAgICB0b286IFsxLCAyLCAzXSxcbiAqICAgICAgfV0sXG4gKiAgICB9XG4gKlxuICogICAgdmFyIHkgPSB7XG4gKiAgICAgIGZvbzoge2JhejogNH0sXG4gKiAgICAgIHF1dXg6IDUsXG4gKiAgICAgIGFycmF5OiBbXG4gKiAgICAgICAge1xuICogICAgICAgICAgZG9lczogJ3dvcmsnLFxuICogICAgICAgICAgdG9vOiBbNCwgNSwgNl0sXG4gKiAgICAgICAgfSxcbiAqICAgICAgICB7XG4gKiAgICAgICAgICByZWFsbHk6ICd5ZXMnLFxuICogICAgICAgIH0sXG4gKiAgICAgIF0sXG4gKiAgICB9XG4gKlxuICogICAgdmFyIGV4cGVjdGVkID0ge1xuICogICAgICBmb286IHtcbiAqICAgICAgICBiYXI6IDMsXG4gKiAgICAgICAgYmF6OiA0LFxuICogICAgICB9LFxuICogICAgICBhcnJheTogW1xuICogICAgICAgIHtcbiAqICAgICAgICAgIGRvZXM6ICd3b3JrJyxcbiAqICAgICAgICAgIHRvbzogWzEsIDIsIDMsIDQsIDUsIDZdLFxuICogICAgICAgIH0sXG4gKiAgICAgICAge1xuICogICAgICAgICAgcmVhbGx5OiAneWVzJyxcbiAqICAgICAgICB9LFxuICogICAgICBdLFxuICogICAgICBxdXV4OiA1LFxuICogICAgfVxuICpcbiAqICAgIG1lcmdlKHgsIHkpXG4gKiAgICAvLz0+IGV4cGVjdGVkXG4gKlxuICovXG5mdW5jdGlvbiBkb3BlbWVyZ2Uob2JqMSwgb2JqMiwgb3B0cykge1xuICAvLyBpZiB0aGV5IGFyZSBpZGVudGljYWwsIGZhc3Rlc3QgPT09IGNoZWNrXG4gIGlmIChvYmoxID09PSBvYmoyKSB7XG4gICAgcmV0dXJuIG9iajFcbiAgfVxuXG4gIC8vIHNldHVwIG9wdGlvbnNcbiAgY29uc3Qgb3B0aW9ucyA9IE9iamVjdEFzc2lnbihcbiAgICB7XG4gICAgICBhcnJheU1lcmdlOiBkZWZhdWx0QXJyYXlNZXJnZSxcbiAgICAgIHN0cmluZ1RvQXJyYXk6IHRydWUsXG4gICAgICBib29sVG9BcnJheTogZmFsc2UsXG4gICAgICBpZ25vcmVUeXBlczogWydudWxsJywgJ3VuZGVmaW5lZCddLFxuICAgICAgLy8gZGVidWc6IHRydWUsXG4gICAgfSxcbiAgICBvcHRzXG4gICAgLy8gfHwge31cbiAgKVxuICBjb25zdCB7aWdub3JlVHlwZXMsIHN0cmluZ1RvQXJyYXksIGJvb2xUb0FycmF5LCBjbG9uZX0gPSBvcHRpb25zXG5cbiAgLy8gQE5PVEU6IG11Y2ggYmV0dGVyIHNpemUgYnV0IG9oIHdlbGxcbiAgLy8gY29uc3QgaWdub3JlVHlwZXMgPSBbJ251bGwnLCAndW5kZWZpbmVkJ11cbiAgLy8gY29uc3Qgc3RyaW5nVG9BcnJheSA9IHRydWVcbiAgLy8gY29uc3QgYm9vbFRvQXJyYXkgPSBmYWxzZVxuICAvLyBjb25zdCBjbG9uZSA9IHRydWVcblxuICAvLyBATk9URSB1Z2xpZmllciBvcHRpbWl6ZXMgaW50byBhIHdpY2tlZCB0ZXJuYXJ5XG4gIC8vIGNoZWNrIG9uZSB0aGVuIGNoZWNrIHRoZSBvdGhlclxuICBpZiAoaXNUcnVlKGluY2x1ZGVzKGlnbm9yZVR5cGVzLCBzaW1wbGVLaW5kT2Yob2JqMSkpKSkge1xuICAgIHJldHVybiBvYmoyXG4gIH1cbiAgZWxzZSBpZiAoaXNUcnVlKGluY2x1ZGVzKGlnbm9yZVR5cGVzLCBzaW1wbGVLaW5kT2Yob2JqMikpKSkge1xuICAgIHJldHVybiBvYmoxXG4gIH1cbiAgZWxzZSBpZiAoaXNCb29sZWFuKG9iajEpICYmIGlzQm9vbGVhbihvYmoyKSkge1xuICAgIHJldHVybiBib29sVG9BcnJheSA/IFtvYmoxLCBvYmoyXSA6IG9iajJcbiAgfVxuICBlbHNlIGlmIChpc1N0cmluZyhvYmoxKSAmJiBpc1N0cmluZyhvYmoyKSkge1xuICAgIHJldHVybiBzdHJpbmdUb0FycmF5ID8gW29iajEsIG9iajJdIDogb2JqMSArIG9iajJcbiAgfVxuICBlbHNlIGlmIChpc0FycmF5KG9iajEpICYmIGlzU3RyaW5nKG9iajIpKSB7XG4gICAgcmV0dXJuIChjbG9uZSA/IG9iajEuc2xpY2UoMCkgOiBvYmoxKS5jb25jYXQoW29iajJdKVxuICB9XG4gIGVsc2UgaWYgKGlzU3RyaW5nKG9iajEpICYmIGlzQXJyYXkob2JqMikpIHtcbiAgICByZXR1cm4gKGNsb25lID8gb2JqMi5zbGljZSgwKSA6IG9iajIpLmNvbmNhdChbb2JqMV0pXG4gIH1cbiAgZWxzZSB7XG4gICAgcmV0dXJuIGRlZXBtZXJnZShvYmoxLCBvYmoyLCBvcHRpb25zKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZG9wZW1lcmdlXG4iXSwibmFtZXMiOlsiY29uc3QiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0FBLEdBQUssQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDO0FBQ2hEQSxHQUFLLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7QUFDdENBLEdBQUssQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQztBQUNwQ0EsR0FBSyxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMs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