Skip to content

Instantly share code, notes, and snippets.

@alunny

alunny/bundle.js Secret

Created March 29, 2016 23:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save alunny/d79798d417959489172aa60e8dd4b253 to your computer and use it in GitHub Desktop.
Save alunny/d79798d417959489172aa60e8dd4b253 to your computer and use it in GitHub Desktop.
/******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/ // Flag the module as loaded
/******/ module.loaded = true;
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/ // Load entry module and return exports
/******/ return __webpack_require__(0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ function(module, exports, __webpack_require__) {
var normalizr = __webpack_require__(1);
var richTimelineSchema = __webpack_require__(99);
function appendResult(msg) {
var logNode = document.getElementById('log');
var entry = document.createElement('p');
var text = document.createTextNode((new Date).toISOString() + ' ' + msg);
entry.appendChild(text);
logNode.appendChild(entry);
}
function getTimeline(callback) {
var xhr = new XMLHttpRequest();
xhr.open('GET', 'twitter_timeline.json');
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
callback(xhr.responseText);
}
}
xhr.send();
}
function assert(predicate, msg) {
if (!predicate) { throw new Error(msg); }
}
function verifyNormalized(raw, normed) {
if (!normed.entities.tweets) {
appendResult('missing entities.tweets');
} else if (!normed.entities.users) {
appendResult('missing entities.users');
} else {
appendResult('looks okay');
}
}
document.addEventListener('DOMContentLoaded', function () {
console.log('here');
appendResult('loaded');
setInterval(function () {
getTimeline(function (text) {
var body = JSON.parse(text);
var normalized = normalizr.normalize(body, richTimelineSchema);
verifyNormalized(body, normalized);
});
}, 5000)
}, false);
/***/ },
/* 1 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
exports.__esModule = true;
exports.arrayOf = arrayOf;
exports.valuesOf = valuesOf;
exports.unionOf = unionOf;
exports.normalize = normalize;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _EntitySchema = __webpack_require__(2);
var _EntitySchema2 = _interopRequireDefault(_EntitySchema);
var _IterableSchema = __webpack_require__(3);
var _IterableSchema2 = _interopRequireDefault(_IterableSchema);
var _UnionSchema = __webpack_require__(5);
var _UnionSchema2 = _interopRequireDefault(_UnionSchema);
var _lodashIsObject = __webpack_require__(4);
var _lodashIsObject2 = _interopRequireDefault(_lodashIsObject);
var _lodashIsEqual = __webpack_require__(6);
var _lodashIsEqual2 = _interopRequireDefault(_lodashIsEqual);
var _lodashMapValues = __webpack_require__(70);
var _lodashMapValues2 = _interopRequireDefault(_lodashMapValues);
function defaultAssignEntity(normalized, key, entity) {
normalized[key] = entity;
}
function visitObject(obj, schema, bag, options) {
var _options$assignEntity = options.assignEntity;
var assignEntity = _options$assignEntity === undefined ? defaultAssignEntity : _options$assignEntity;
var normalized = {};
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
var entity = visit(obj[key], schema[key], bag, options);
assignEntity.call(null, normalized, key, entity);
}
}
return normalized;
}
function defaultMapper(iterableSchema, itemSchema, bag, options) {
return function (obj) {
return visit(obj, itemSchema, bag, options);
};
}
function polymorphicMapper(iterableSchema, itemSchema, bag, options) {
return function (obj) {
var schemaKey = iterableSchema.getSchemaKey(obj);
var result = visit(obj, itemSchema[schemaKey], bag, options);
return { id: result, schema: schemaKey };
};
}
function visitIterable(obj, iterableSchema, bag, options) {
var itemSchema = iterableSchema.getItemSchema();
var curriedItemMapper = defaultMapper(iterableSchema, itemSchema, bag, options);
if (Array.isArray(obj)) {
return obj.map(curriedItemMapper);
} else {
return _lodashMapValues2['default'](obj, curriedItemMapper);
}
}
function visitUnion(obj, unionSchema, bag, options) {
var itemSchema = unionSchema.getItemSchema();
return polymorphicMapper(unionSchema, itemSchema, bag, options)(obj);
}
function defaultMergeIntoEntity(entityA, entityB, entityKey) {
for (var key in entityB) {
if (!entityB.hasOwnProperty(key)) {
continue;
}
if (!entityA.hasOwnProperty(key) || _lodashIsEqual2['default'](entityA[key], entityB[key])) {
entityA[key] = entityB[key];
continue;
}
console.warn('When merging two ' + entityKey + ', found unequal data in their "' + key + '" values. Using the earlier value.', entityA[key], entityB[key]);
}
}
function visitEntity(entity, entitySchema, bag, options) {
var _options$mergeIntoEntity = options.mergeIntoEntity;
var mergeIntoEntity = _options$mergeIntoEntity === undefined ? defaultMergeIntoEntity : _options$mergeIntoEntity;
var entityKey = entitySchema.getKey();
var id = entitySchema.getId(entity);
if (!bag.hasOwnProperty(entityKey)) {
bag[entityKey] = {};
}
if (!bag[entityKey].hasOwnProperty(id)) {
bag[entityKey][id] = {};
}
var stored = bag[entityKey][id];
var normalized = visitObject(entity, entitySchema, bag, options);
mergeIntoEntity(stored, normalized, entityKey);
return id;
}
function visit(obj, schema, bag, options) {
if (!_lodashIsObject2['default'](obj) || !_lodashIsObject2['default'](schema)) {
return obj;
}
if (schema instanceof _EntitySchema2['default']) {
return visitEntity(obj, schema, bag, options);
} else if (schema instanceof _IterableSchema2['default']) {
return visitIterable(obj, schema, bag, options);
} else if (schema instanceof _UnionSchema2['default']) {
return visitUnion(obj, schema, bag, options);
} else {
return visitObject(obj, schema, bag, options);
}
}
function arrayOf(schema, options) {
return new _IterableSchema2['default'](schema, options);
}
function valuesOf(schema, options) {
return new _IterableSchema2['default'](schema, options);
}
function unionOf(schema, options) {
return new _UnionSchema2['default'](schema, options);
}
exports.Schema = _EntitySchema2['default'];
function normalize(obj, schema) {
var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
if (!_lodashIsObject2['default'](obj) && !Array.isArray(obj)) {
throw new Error('Normalize accepts an object or an array as its input.');
}
if (!_lodashIsObject2['default'](schema) || Array.isArray(schema)) {
throw new Error('Normalize accepts an object for schema.');
}
var bag = {};
var result = visit(obj, schema, bag, options);
return {
entities: bag,
result: result
};
}
/***/ },
/* 2 */
/***/ function(module, exports) {
'use strict';
exports.__esModule = true;
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
var EntitySchema = (function () {
function EntitySchema(key) {
var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
_classCallCheck(this, EntitySchema);
if (!key || typeof key !== 'string') {
throw new Error('A string non-empty key is required');
}
this._key = key;
var idAttribute = options.idAttribute || 'id';
this._getId = typeof idAttribute === 'function' ? idAttribute : function (x) {
return x[idAttribute];
};
this._idAttribute = idAttribute;
}
EntitySchema.prototype.getKey = function getKey() {
return this._key;
};
EntitySchema.prototype.getId = function getId(entity) {
return this._getId(entity);
};
EntitySchema.prototype.getIdAttribute = function getIdAttribute() {
return this._idAttribute;
};
EntitySchema.prototype.define = function define(nestedSchema) {
for (var key in nestedSchema) {
if (nestedSchema.hasOwnProperty(key)) {
this[key] = nestedSchema[key];
}
}
};
return EntitySchema;
})();
exports['default'] = EntitySchema;
module.exports = exports['default'];
/***/ },
/* 3 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
var _lodashIsObject = __webpack_require__(4);
var _lodashIsObject2 = _interopRequireDefault(_lodashIsObject);
var _UnionSchema = __webpack_require__(5);
var _UnionSchema2 = _interopRequireDefault(_UnionSchema);
var ArraySchema = (function () {
function ArraySchema(itemSchema) {
var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
_classCallCheck(this, ArraySchema);
if (!_lodashIsObject2['default'](itemSchema)) {
throw new Error('ArraySchema requires item schema to be an object.');
}
if (options.schemaAttribute) {
var schemaAttribute = options.schemaAttribute;
this._itemSchema = new _UnionSchema2['default'](itemSchema, { schemaAttribute: schemaAttribute });
} else {
this._itemSchema = itemSchema;
}
}
ArraySchema.prototype.getItemSchema = function getItemSchema() {
return this._itemSchema;
};
return ArraySchema;
})();
exports['default'] = ArraySchema;
module.exports = exports['default'];
/***/ },
/* 4 */
/***/ function(module, exports) {
/**
* Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
* (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
*
* @static
* @memberOf _
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is an object, else `false`.
* @example
*
* _.isObject({});
* // => true
*
* _.isObject([1, 2, 3]);
* // => true
*
* _.isObject(_.noop);
* // => true
*
* _.isObject(null);
* // => false
*/
function isObject(value) {
var type = typeof value;
return !!value && (type == 'object' || type == 'function');
}
module.exports = isObject;
/***/ },
/* 5 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
var _lodashIsObject = __webpack_require__(4);
var _lodashIsObject2 = _interopRequireDefault(_lodashIsObject);
var UnionSchema = (function () {
function UnionSchema(itemSchema, options) {
_classCallCheck(this, UnionSchema);
if (!_lodashIsObject2['default'](itemSchema)) {
throw new Error('UnionSchema requires item schema to be an object.');
}
if (!options || !options.schemaAttribute) {
throw new Error('UnionSchema requires schemaAttribute option.');
}
this._itemSchema = itemSchema;
var schemaAttribute = options.schemaAttribute;
this._getSchema = typeof schemaAttribute === 'function' ? schemaAttribute : function (x) {
return x[schemaAttribute];
};
}
UnionSchema.prototype.getItemSchema = function getItemSchema() {
return this._itemSchema;
};
UnionSchema.prototype.getSchemaKey = function getSchemaKey(item) {
return this._getSchema(item);
};
return UnionSchema;
})();
exports['default'] = UnionSchema;
module.exports = exports['default'];
/***/ },
/* 6 */
/***/ function(module, exports, __webpack_require__) {
var baseIsEqual = __webpack_require__(7);
/**
* Performs a deep comparison between two values to determine if they are
* equivalent.
*
* **Note:** This method supports comparing arrays, array buffers, booleans,
* date objects, error objects, maps, numbers, `Object` objects, regexes,
* sets, strings, symbols, and typed arrays. `Object` objects are compared
* by their own, not inherited, enumerable properties. Functions and DOM
* nodes are **not** supported.
*
* @static
* @memberOf _
* @category Lang
* @param {*} value The value to compare.
* @param {*} other The other value to compare.
* @returns {boolean} Returns `true` if the values are equivalent, else `false`.
* @example
*
* var object = { 'user': 'fred' };
* var other = { 'user': 'fred' };
*
* _.isEqual(object, other);
* // => true
*
* object === other;
* // => false
*/
function isEqual(value, other) {
return baseIsEqual(value, other);
}
module.exports = isEqual;
/***/ },
/* 7 */
/***/ function(module, exports, __webpack_require__) {
var baseIsEqualDeep = __webpack_require__(8),
isObject = __webpack_require__(4),
isObjectLike = __webpack_require__(28);
/**
* The base implementation of `_.isEqual` which supports partial comparisons
* and tracks traversed objects.
*
* @private
* @param {*} value The value to compare.
* @param {*} other The other value to compare.
* @param {Function} [customizer] The function to customize comparisons.
* @param {boolean} [bitmask] The bitmask of comparison flags.
* The bitmask may be composed of the following flags:
* 1 - Unordered comparison
* 2 - Partial comparison
* @param {Object} [stack] Tracks traversed `value` and `other` objects.
* @returns {boolean} Returns `true` if the values are equivalent, else `false`.
*/
function baseIsEqual(value, other, customizer, bitmask, stack) {
if (value === other) {
return true;
}
if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {
return value !== value && other !== other;
}
return baseIsEqualDeep(value, other, baseIsEqual, customizer, bitmask, stack);
}
module.exports = baseIsEqual;
/***/ },
/* 8 */
/***/ function(module, exports, __webpack_require__) {
var Stack = __webpack_require__(9),
equalArrays = __webpack_require__(43),
equalByTag = __webpack_require__(45),
equalObjects = __webpack_require__(50),
getTag = __webpack_require__(66),
isArray = __webpack_require__(62),
isHostObject = __webpack_require__(27),
isTypedArray = __webpack_require__(69);
/** Used to compose bitmasks for comparison styles. */
var PARTIAL_COMPARE_FLAG = 2;
/** `Object#toString` result references. */
var argsTag = '[object Arguments]',
arrayTag = '[object Array]',
objectTag = '[object Object]';
/** Used for built-in method references. */
var objectProto = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/**
* A specialized version of `baseIsEqual` for arrays and objects which performs
* deep comparisons and tracks traversed objects enabling objects with circular
* references to be compared.
*
* @private
* @param {Object} object The object to compare.
* @param {Object} other The other object to compare.
* @param {Function} equalFunc The function to determine equivalents of values.
* @param {Function} [customizer] The function to customize comparisons.
* @param {number} [bitmask] The bitmask of comparison flags. See `baseIsEqual` for more details.
* @param {Object} [stack] Tracks traversed `object` and `other` objects.
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
*/
function baseIsEqualDeep(object, other, equalFunc, customizer, bitmask, stack) {
var objIsArr = isArray(object),
othIsArr = isArray(other),
objTag = arrayTag,
othTag = arrayTag;
if (!objIsArr) {
objTag = getTag(object);
objTag = objTag == argsTag ? objectTag : objTag;
}
if (!othIsArr) {
othTag = getTag(other);
othTag = othTag == argsTag ? objectTag : othTag;
}
var objIsObj = objTag == objectTag && !isHostObject(object),
othIsObj = othTag == objectTag && !isHostObject(other),
isSameTag = objTag == othTag;
if (isSameTag && !objIsObj) {
stack || (stack = new Stack);
return (objIsArr || isTypedArray(object))
? equalArrays(object, other, equalFunc, customizer, bitmask, stack)
: equalByTag(object, other, objTag, equalFunc, customizer, bitmask, stack);
}
if (!(bitmask & PARTIAL_COMPARE_FLAG)) {
var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
if (objIsWrapped || othIsWrapped) {
stack || (stack = new Stack);
return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, customizer, bitmask, stack);
}
}
if (!isSameTag) {
return false;
}
stack || (stack = new Stack);
return equalObjects(object, other, equalFunc, customizer, bitmask, stack);
}
module.exports = baseIsEqualDeep;
/***/ },
/* 9 */
/***/ function(module, exports, __webpack_require__) {
var stackClear = __webpack_require__(10),
stackDelete = __webpack_require__(11),
stackGet = __webpack_require__(15),
stackHas = __webpack_require__(17),
stackSet = __webpack_require__(19);
/**
* Creates a stack cache object to store key-value pairs.
*
* @private
* @constructor
* @param {Array} [values] The values to cache.
*/
function Stack(values) {
var index = -1,
length = values ? values.length : 0;
this.clear();
while (++index < length) {
var entry = values[index];
this.set(entry[0], entry[1]);
}
}
// Add functions to the `Stack` cache.
Stack.prototype.clear = stackClear;
Stack.prototype['delete'] = stackDelete;
Stack.prototype.get = stackGet;
Stack.prototype.has = stackHas;
Stack.prototype.set = stackSet;
module.exports = Stack;
/***/ },
/* 10 */
/***/ function(module, exports) {
/**
* Removes all key-value entries from the stack.
*
* @private
* @name clear
* @memberOf Stack
*/
function stackClear() {
this.__data__ = { 'array': [], 'map': null };
}
module.exports = stackClear;
/***/ },
/* 11 */
/***/ function(module, exports, __webpack_require__) {
var assocDelete = __webpack_require__(12);
/**
* Removes `key` and its value from the stack.
*
* @private
* @name delete
* @memberOf Stack
* @param {string} key The key of the value to remove.
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
*/
function stackDelete(key) {
var data = this.__data__,
array = data.array;
return array ? assocDelete(array, key) : data.map['delete'](key);
}
module.exports = stackDelete;
/***/ },
/* 12 */
/***/ function(module, exports, __webpack_require__) {
var assocIndexOf = __webpack_require__(13);
/** Used for built-in method references. */
var arrayProto = Array.prototype;
/** Built-in value references. */
var splice = arrayProto.splice;
/**
* Removes `key` and its value from the associative array.
*
* @private
* @param {Array} array The array to query.
* @param {string} key The key of the value to remove.
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
*/
function assocDelete(array, key) {
var index = assocIndexOf(array, key);
if (index < 0) {
return false;
}
var lastIndex = array.length - 1;
if (index == lastIndex) {
array.pop();
} else {
splice.call(array, index, 1);
}
return true;
}
module.exports = assocDelete;
/***/ },
/* 13 */
/***/ function(module, exports, __webpack_require__) {
var eq = __webpack_require__(14);
/**
* Gets the index at which the first occurrence of `key` is found in `array`
* of key-value pairs.
*
* @private
* @param {Array} array The array to search.
* @param {*} key The key to search for.
* @returns {number} Returns the index of the matched value, else `-1`.
*/
function assocIndexOf(array, key) {
var length = array.length;
while (length--) {
if (eq(array[length][0], key)) {
return length;
}
}
return -1;
}
module.exports = assocIndexOf;
/***/ },
/* 14 */
/***/ function(module, exports) {
/**
* Performs a [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
* comparison between two values to determine if they are equivalent.
*
* @static
* @memberOf _
* @category Lang
* @param {*} value The value to compare.
* @param {*} other The other value to compare.
* @returns {boolean} Returns `true` if the values are equivalent, else `false`.
* @example
*
* var object = { 'user': 'fred' };
* var other = { 'user': 'fred' };
*
* _.eq(object, object);
* // => true
*
* _.eq(object, other);
* // => false
*
* _.eq('a', 'a');
* // => true
*
* _.eq('a', Object('a'));
* // => false
*
* _.eq(NaN, NaN);
* // => true
*/
function eq(value, other) {
return value === other || (value !== value && other !== other);
}
module.exports = eq;
/***/ },
/* 15 */
/***/ function(module, exports, __webpack_require__) {
var assocGet = __webpack_require__(16);
/**
* Gets the stack value for `key`.
*
* @private
* @name get
* @memberOf Stack
* @param {string} key The key of the value to get.
* @returns {*} Returns the entry value.
*/
function stackGet(key) {
var data = this.__data__,
array = data.array;
return array ? assocGet(array, key) : data.map.get(key);
}
module.exports = stackGet;
/***/ },
/* 16 */
/***/ function(module, exports, __webpack_require__) {
var assocIndexOf = __webpack_require__(13);
/**
* Gets the associative array value for `key`.
*
* @private
* @param {Array} array The array to query.
* @param {string} key The key of the value to get.
* @returns {*} Returns the entry value.
*/
function assocGet(array, key) {
var index = assocIndexOf(array, key);
return index < 0 ? undefined : array[index][1];
}
module.exports = assocGet;
/***/ },
/* 17 */
/***/ function(module, exports, __webpack_require__) {
var assocHas = __webpack_require__(18);
/**
* Checks if a stack value for `key` exists.
*
* @private
* @name has
* @memberOf Stack
* @param {string} key The key of the entry to check.
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
*/
function stackHas(key) {
var data = this.__data__,
array = data.array;
return array ? assocHas(array, key) : data.map.has(key);
}
module.exports = stackHas;
/***/ },
/* 18 */
/***/ function(module, exports, __webpack_require__) {
var assocIndexOf = __webpack_require__(13);
/**
* Checks if an associative array value for `key` exists.
*
* @private
* @param {Array} array The array to query.
* @param {string} key The key of the entry to check.
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
*/
function assocHas(array, key) {
return assocIndexOf(array, key) > -1;
}
module.exports = assocHas;
/***/ },
/* 19 */
/***/ function(module, exports, __webpack_require__) {
var MapCache = __webpack_require__(20),
assocSet = __webpack_require__(41);
/** Used as the size to enable large array optimizations. */
var LARGE_ARRAY_SIZE = 200;
/**
* Sets the stack `key` to `value`.
*
* @private
* @name set
* @memberOf Stack
* @param {string} key The key of the value to set.
* @param {*} value The value to set.
* @returns {Object} Returns the stack cache object.
*/
function stackSet(key, value) {
var data = this.__data__,
array = data.array;
if (array) {
if (array.length < (LARGE_ARRAY_SIZE - 1)) {
assocSet(array, key, value);
} else {
data.array = null;
data.map = new MapCache(array);
}
}
var map = data.map;
if (map) {
map.set(key, value);
}
return this;
}
module.exports = stackSet;
/***/ },
/* 20 */
/***/ function(module, exports, __webpack_require__) {
var mapClear = __webpack_require__(21),
mapDelete = __webpack_require__(33),
mapGet = __webpack_require__(37),
mapHas = __webpack_require__(39),
mapSet = __webpack_require__(40);
/**
* Creates a map cache object to store key-value pairs.
*
* @private
* @constructor
* @param {Array} [values] The values to cache.
*/
function MapCache(values) {
var index = -1,
length = values ? values.length : 0;
this.clear();
while (++index < length) {
var entry = values[index];
this.set(entry[0], entry[1]);
}
}
// Add functions to the `MapCache`.
MapCache.prototype.clear = mapClear;
MapCache.prototype['delete'] = mapDelete;
MapCache.prototype.get = mapGet;
MapCache.prototype.has = mapHas;
MapCache.prototype.set = mapSet;
module.exports = MapCache;
/***/ },
/* 21 */
/***/ function(module, exports, __webpack_require__) {
var Hash = __webpack_require__(22),
Map = __webpack_require__(29);
/**
* Removes all key-value entries from the map.
*
* @private
* @name clear
* @memberOf MapCache
*/
function mapClear() {
this.__data__ = {
'hash': new Hash,
'map': Map ? new Map : [],
'string': new Hash
};
}
module.exports = mapClear;
/***/ },
/* 22 */
/***/ function(module, exports, __webpack_require__) {
var nativeCreate = __webpack_require__(23);
/** Used for built-in method references. */
var objectProto = Object.prototype;
/**
* Creates an hash object.
*
* @private
* @constructor
* @returns {Object} Returns the new hash object.
*/
function Hash() {}
// Avoid inheriting from `Object.prototype` when possible.
Hash.prototype = nativeCreate ? nativeCreate(null) : objectProto;
module.exports = Hash;
/***/ },
/* 23 */
/***/ function(module, exports, __webpack_require__) {
var getNative = __webpack_require__(24);
/* Built-in method references that are verified to be native. */
var nativeCreate = getNative(Object, 'create');
module.exports = nativeCreate;
/***/ },
/* 24 */
/***/ function(module, exports, __webpack_require__) {
var isNative = __webpack_require__(25);
/**
* Gets the native function at `key` of `object`.
*
* @private
* @param {Object} object The object to query.
* @param {string} key The key of the method to get.
* @returns {*} Returns the function if it's native, else `undefined`.
*/
function getNative(object, key) {
var value = object[key];
return isNative(value) ? value : undefined;
}
module.exports = getNative;
/***/ },
/* 25 */
/***/ function(module, exports, __webpack_require__) {
var isFunction = __webpack_require__(26),
isHostObject = __webpack_require__(27),
isObjectLike = __webpack_require__(28);
/** Used to match `RegExp` [syntax characters](http://ecma-international.org/ecma-262/6.0/#sec-patterns). */
var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
/** Used to detect host constructors (Safari > 5). */
var reIsHostCtor = /^\[object .+?Constructor\]$/;
/** Used for built-in method references. */
var objectProto = Object.prototype;
/** Used to resolve the decompiled source of functions. */
var funcToString = Function.prototype.toString;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/** Used to detect if a method is native. */
var reIsNative = RegExp('^' +
funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
.replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
);
/**
* Checks if `value` is a native function.
*
* @static
* @memberOf _
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a native function, else `false`.
* @example
*
* _.isNative(Array.prototype.push);
* // => true
*
* _.isNative(_);
* // => false
*/
function isNative(value) {
if (value == null) {
return false;
}
if (isFunction(value)) {
return reIsNative.test(funcToString.call(value));
}
return isObjectLike(value) &&
(isHostObject(value) ? reIsNative : reIsHostCtor).test(value);
}
module.exports = isNative;
/***/ },
/* 26 */
/***/ function(module, exports, __webpack_require__) {
var isObject = __webpack_require__(4);
/** `Object#toString` result references. */
var funcTag = '[object Function]',
genTag = '[object GeneratorFunction]';
/** Used for built-in method references. */
var objectProto = Object.prototype;
/**
* Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
* of values.
*/
var objectToString = objectProto.toString;
/**
* Checks if `value` is classified as a `Function` object.
*
* @static
* @memberOf _
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
* @example
*
* _.isFunction(_);
* // => true
*
* _.isFunction(/abc/);
* // => false
*/
function isFunction(value) {
// The use of `Object#toString` avoids issues with the `typeof` operator
// in Safari 8 which returns 'object' for typed array and weak map constructors,
// and PhantomJS 1.9 which returns 'function' for `NodeList` instances.
var tag = isObject(value) ? objectToString.call(value) : '';
return tag == funcTag || tag == genTag;
}
module.exports = isFunction;
/***/ },
/* 27 */
/***/ function(module, exports) {
/**
* Checks if `value` is a host object in IE < 9.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a host object, else `false`.
*/
function isHostObject(value) {
// Many host objects are `Object` objects that can coerce to strings
// despite having improperly defined `toString` methods.
var result = false;
if (value != null && typeof value.toString != 'function') {
try {
result = !!(value + '');
} catch (e) {}
}
return result;
}
module.exports = isHostObject;
/***/ },
/* 28 */
/***/ function(module, exports) {
/**
* Checks if `value` is object-like. A value is object-like if it's not `null`
* and has a `typeof` result of "object".
*
* @static
* @memberOf _
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is object-like, else `false`.
* @example
*
* _.isObjectLike({});
* // => true
*
* _.isObjectLike([1, 2, 3]);
* // => true
*
* _.isObjectLike(_.noop);
* // => false
*
* _.isObjectLike(null);
* // => false
*/
function isObjectLike(value) {
return !!value && typeof value == 'object';
}
module.exports = isObjectLike;
/***/ },
/* 29 */
/***/ function(module, exports, __webpack_require__) {
var getNative = __webpack_require__(24),
root = __webpack_require__(30);
/* Built-in method references that are verified to be native. */
var Map = getNative(root, 'Map');
module.exports = Map;
/***/ },
/* 30 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(module, global) {var checkGlobal = __webpack_require__(32);
/** Used to determine if values are of the language type `Object`. */
var objectTypes = {
'function': true,
'object': true
};
/** Detect free variable `exports`. */
var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType)
? exports
: undefined;
/** Detect free variable `module`. */
var freeModule = (objectTypes[typeof module] && module && !module.nodeType)
? module
: undefined;
/** Detect free variable `global` from Node.js. */
var freeGlobal = checkGlobal(freeExports && freeModule && typeof global == 'object' && global);
/** Detect free variable `self`. */
var freeSelf = checkGlobal(objectTypes[typeof self] && self);
/** Detect free variable `window`. */
var freeWindow = checkGlobal(objectTypes[typeof window] && window);
/** Detect `this` as the global object. */
var thisGlobal = checkGlobal(objectTypes[typeof this] && this);
/**
* Used as a reference to the global object.
*
* The `this` value is used if it's the global object to avoid Greasemonkey's
* restricted `window` object, otherwise the `window` object is used.
*/
var root = freeGlobal ||
((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) ||
freeSelf || thisGlobal || Function('return this')();
module.exports = root;
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(31)(module), (function() { return this; }())))
/***/ },
/* 31 */
/***/ function(module, exports) {
module.exports = function(module) {
if(!module.webpackPolyfill) {
module.deprecate = function() {};
module.paths = [];
// module.parent = undefined by default
module.children = [];
module.webpackPolyfill = 1;
}
return module;
}
/***/ },
/* 32 */
/***/ function(module, exports) {
/**
* Checks if `value` is a global object.
*
* @private
* @param {*} value The value to check.
* @returns {null|Object} Returns `value` if it's a global object, else `null`.
*/
function checkGlobal(value) {
return (value && value.Object === Object) ? value : null;
}
module.exports = checkGlobal;
/***/ },
/* 33 */
/***/ function(module, exports, __webpack_require__) {
var Map = __webpack_require__(29),
assocDelete = __webpack_require__(12),
hashDelete = __webpack_require__(34),
isKeyable = __webpack_require__(36);
/**
* Removes `key` and its value from the map.
*
* @private
* @name delete
* @memberOf MapCache
* @param {string} key The key of the value to remove.
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
*/
function mapDelete(key) {
var data = this.__data__;
if (isKeyable(key)) {
return hashDelete(typeof key == 'string' ? data.string : data.hash, key);
}
return Map ? data.map['delete'](key) : assocDelete(data.map, key);
}
module.exports = mapDelete;
/***/ },
/* 34 */
/***/ function(module, exports, __webpack_require__) {
var hashHas = __webpack_require__(35);
/**
* Removes `key` and its value from the hash.
*
* @private
* @param {Object} hash The hash to modify.
* @param {string} key The key of the value to remove.
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
*/
function hashDelete(hash, key) {
return hashHas(hash, key) && delete hash[key];
}
module.exports = hashDelete;
/***/ },
/* 35 */
/***/ function(module, exports, __webpack_require__) {
var nativeCreate = __webpack_require__(23);
/** Used for built-in method references. */
var objectProto = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/**
* Checks if a hash value for `key` exists.
*
* @private
* @param {Object} hash The hash to query.
* @param {string} key The key of the entry to check.
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
*/
function hashHas(hash, key) {
return nativeCreate ? hash[key] !== undefined : hasOwnProperty.call(hash, key);
}
module.exports = hashHas;
/***/ },
/* 36 */
/***/ function(module, exports) {
/**
* Checks if `value` is suitable for use as unique object key.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is suitable, else `false`.
*/
function isKeyable(value) {
var type = typeof value;
return type == 'number' || type == 'boolean' ||
(type == 'string' && value != '__proto__') || value == null;
}
module.exports = isKeyable;
/***/ },
/* 37 */
/***/ function(module, exports, __webpack_require__) {
var Map = __webpack_require__(29),
assocGet = __webpack_require__(16),
hashGet = __webpack_require__(38),
isKeyable = __webpack_require__(36);
/**
* Gets the map value for `key`.
*
* @private
* @name get
* @memberOf MapCache
* @param {string} key The key of the value to get.
* @returns {*} Returns the entry value.
*/
function mapGet(key) {
var data = this.__data__;
if (isKeyable(key)) {
return hashGet(typeof key == 'string' ? data.string : data.hash, key);
}
return Map ? data.map.get(key) : assocGet(data.map, key);
}
module.exports = mapGet;
/***/ },
/* 38 */
/***/ function(module, exports, __webpack_require__) {
var nativeCreate = __webpack_require__(23);
/** Used to stand-in for `undefined` hash values. */
var HASH_UNDEFINED = '__lodash_hash_undefined__';
/** Used for built-in method references. */
var objectProto = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/**
* Gets the hash value for `key`.
*
* @private
* @param {Object} hash The hash to query.
* @param {string} key The key of the value to get.
* @returns {*} Returns the entry value.
*/
function hashGet(hash, key) {
if (nativeCreate) {
var result = hash[key];
return result === HASH_UNDEFINED ? undefined : result;
}
return hasOwnProperty.call(hash, key) ? hash[key] : undefined;
}
module.exports = hashGet;
/***/ },
/* 39 */
/***/ function(module, exports, __webpack_require__) {
var Map = __webpack_require__(29),
assocHas = __webpack_require__(18),
hashHas = __webpack_require__(35),
isKeyable = __webpack_require__(36);
/**
* Checks if a map value for `key` exists.
*
* @private
* @name has
* @memberOf MapCache
* @param {string} key The key of the entry to check.
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
*/
function mapHas(key) {
var data = this.__data__;
if (isKeyable(key)) {
return hashHas(typeof key == 'string' ? data.string : data.hash, key);
}
return Map ? data.map.has(key) : assocHas(data.map, key);
}
module.exports = mapHas;
/***/ },
/* 40 */
/***/ function(module, exports, __webpack_require__) {
var Map = __webpack_require__(29),
assocSet = __webpack_require__(41),
hashSet = __webpack_require__(42),
isKeyable = __webpack_require__(36);
/**
* Sets the map `key` to `value`.
*
* @private
* @name set
* @memberOf MapCache
* @param {string} key The key of the value to set.
* @param {*} value The value to set.
* @returns {Object} Returns the map cache object.
*/
function mapSet(key, value) {
var data = this.__data__;
if (isKeyable(key)) {
hashSet(typeof key == 'string' ? data.string : data.hash, key, value);
} else if (Map) {
data.map.set(key, value);
} else {
assocSet(data.map, key, value);
}
return this;
}
module.exports = mapSet;
/***/ },
/* 41 */
/***/ function(module, exports, __webpack_require__) {
var assocIndexOf = __webpack_require__(13);
/**
* Sets the associative array `key` to `value`.
*
* @private
* @param {Array} array The array to modify.
* @param {string} key The key of the value to set.
* @param {*} value The value to set.
*/
function assocSet(array, key, value) {
var index = assocIndexOf(array, key);
if (index < 0) {
array.push([key, value]);
} else {
array[index][1] = value;
}
}
module.exports = assocSet;
/***/ },
/* 42 */
/***/ function(module, exports, __webpack_require__) {
var nativeCreate = __webpack_require__(23);
/** Used to stand-in for `undefined` hash values. */
var HASH_UNDEFINED = '__lodash_hash_undefined__';
/**
* Sets the hash `key` to `value`.
*
* @private
* @param {Object} hash The hash to modify.
* @param {string} key The key of the value to set.
* @param {*} value The value to set.
*/
function hashSet(hash, key, value) {
hash[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
}
module.exports = hashSet;
/***/ },
/* 43 */
/***/ function(module, exports, __webpack_require__) {
var arraySome = __webpack_require__(44);
/** Used to compose bitmasks for comparison styles. */
var UNORDERED_COMPARE_FLAG = 1,
PARTIAL_COMPARE_FLAG = 2;
/**
* A specialized version of `baseIsEqualDeep` for arrays with support for
* partial deep comparisons.
*
* @private
* @param {Array} array The array to compare.
* @param {Array} other The other array to compare.
* @param {Function} equalFunc The function to determine equivalents of values.
* @param {Function} customizer The function to customize comparisons.
* @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual` for more details.
* @param {Object} stack Tracks traversed `array` and `other` objects.
* @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
*/
function equalArrays(array, other, equalFunc, customizer, bitmask, stack) {
var index = -1,
isPartial = bitmask & PARTIAL_COMPARE_FLAG,
isUnordered = bitmask & UNORDERED_COMPARE_FLAG,
arrLength = array.length,
othLength = other.length;
if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
return false;
}
// Assume cyclic values are equal.
var stacked = stack.get(array);
if (stacked) {
return stacked == other;
}
var result = true;
stack.set(array, other);
// Ignore non-index properties.
while (++index < arrLength) {
var arrValue = array[index],
othValue = other[index];
if (customizer) {
var compared = isPartial
? customizer(othValue, arrValue, index, other, array, stack)
: customizer(arrValue, othValue, index, array, other, stack);
}
if (compared !== undefined) {
if (compared) {
continue;
}
result = false;
break;
}
// Recursively compare arrays (susceptible to call stack limits).
if (isUnordered) {
if (!arraySome(other, function(othValue) {
return arrValue === othValue || equalFunc(arrValue, othValue, customizer, bitmask, stack);
})) {
result = false;
break;
}
} else if (!(arrValue === othValue || equalFunc(arrValue, othValue, customizer, bitmask, stack))) {
result = false;
break;
}
}
stack['delete'](array);
return result;
}
module.exports = equalArrays;
/***/ },
/* 44 */
/***/ function(module, exports) {
/**
* A specialized version of `_.some` for arrays without support for iteratee
* shorthands.
*
* @private
* @param {Array} array The array to iterate over.
* @param {Function} predicate The function invoked per iteration.
* @returns {boolean} Returns `true` if any element passes the predicate check, else `false`.
*/
function arraySome(array, predicate) {
var index = -1,
length = array.length;
while (++index < length) {
if (predicate(array[index], index, array)) {
return true;
}
}
return false;
}
module.exports = arraySome;
/***/ },
/* 45 */
/***/ function(module, exports, __webpack_require__) {
var Symbol = __webpack_require__(46),
Uint8Array = __webpack_require__(47),
equalArrays = __webpack_require__(43),
mapToArray = __webpack_require__(48),
setToArray = __webpack_require__(49);
/** Used to compose bitmasks for comparison styles. */
var UNORDERED_COMPARE_FLAG = 1,
PARTIAL_COMPARE_FLAG = 2;
/** `Object#toString` result references. */
var boolTag = '[object Boolean]',
dateTag = '[object Date]',
errorTag = '[object Error]',
mapTag = '[object Map]',
numberTag = '[object Number]',
regexpTag = '[object RegExp]',
setTag = '[object Set]',
stringTag = '[object String]',
symbolTag = '[object Symbol]';
var arrayBufferTag = '[object ArrayBuffer]';
/** Used to convert symbols to primitives and strings. */
var symbolProto = Symbol ? Symbol.prototype : undefined,
symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
/**
* A specialized version of `baseIsEqualDeep` for comparing objects of
* the same `toStringTag`.
*
* **Note:** This function only supports comparing values with tags of
* `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
*
* @private
* @param {Object} object The object to compare.
* @param {Object} other The other object to compare.
* @param {string} tag The `toStringTag` of the objects to compare.
* @param {Function} equalFunc The function to determine equivalents of values.
* @param {Function} customizer The function to customize comparisons.
* @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual` for more details.
* @param {Object} stack Tracks traversed `object` and `other` objects.
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
*/
function equalByTag(object, other, tag, equalFunc, customizer, bitmask, stack) {
switch (tag) {
case arrayBufferTag:
if ((object.byteLength != other.byteLength) ||
!equalFunc(new Uint8Array(object), new Uint8Array(other))) {
return false;
}
return true;
case boolTag:
case dateTag:
// Coerce dates and booleans to numbers, dates to milliseconds and booleans
// to `1` or `0` treating invalid dates coerced to `NaN` as not equal.
return +object == +other;
case errorTag:
return object.name == other.name && object.message == other.message;
case numberTag:
// Treat `NaN` vs. `NaN` as equal.
return (object != +object) ? other != +other : object == +other;
case regexpTag:
case stringTag:
// Coerce regexes to strings and treat strings primitives and string
// objects as equal. See https://es5.github.io/#x15.10.6.4 for more details.
return object == (other + '');
case mapTag:
var convert = mapToArray;
case setTag:
var isPartial = bitmask & PARTIAL_COMPARE_FLAG;
convert || (convert = setToArray);
if (object.size != other.size && !isPartial) {
return false;
}
// Assume cyclic values are equal.
var stacked = stack.get(object);
if (stacked) {
return stacked == other;
}
// Recursively compare objects (susceptible to call stack limits).
return equalArrays(convert(object), convert(other), equalFunc, customizer, bitmask | UNORDERED_COMPARE_FLAG, stack.set(object, other));
case symbolTag:
if (symbolValueOf) {
return symbolValueOf.call(object) == symbolValueOf.call(other);
}
}
return false;
}
module.exports = equalByTag;
/***/ },
/* 46 */
/***/ function(module, exports, __webpack_require__) {
var root = __webpack_require__(30);
/** Built-in value references. */
var Symbol = root.Symbol;
module.exports = Symbol;
/***/ },
/* 47 */
/***/ function(module, exports, __webpack_require__) {
var root = __webpack_require__(30);
/** Built-in value references. */
var Uint8Array = root.Uint8Array;
module.exports = Uint8Array;
/***/ },
/* 48 */
/***/ function(module, exports) {
/**
* Converts `map` to an array.
*
* @private
* @param {Object} map The map to convert.
* @returns {Array} Returns the converted array.
*/
function mapToArray(map) {
var index = -1,
result = Array(map.size);
map.forEach(function(value, key) {
result[++index] = [key, value];
});
return result;
}
module.exports = mapToArray;
/***/ },
/* 49 */
/***/ function(module, exports) {
/**
* Converts `set` to an array.
*
* @private
* @param {Object} set The set to convert.
* @returns {Array} Returns the converted array.
*/
function setToArray(set) {
var index = -1,
result = Array(set.size);
set.forEach(function(value) {
result[++index] = value;
});
return result;
}
module.exports = setToArray;
/***/ },
/* 50 */
/***/ function(module, exports, __webpack_require__) {
var baseHas = __webpack_require__(51),
keys = __webpack_require__(52);
/** Used to compose bitmasks for comparison styles. */
var PARTIAL_COMPARE_FLAG = 2;
/**
* A specialized version of `baseIsEqualDeep` for objects with support for
* partial deep comparisons.
*
* @private
* @param {Object} object The object to compare.
* @param {Object} other The other object to compare.
* @param {Function} equalFunc The function to determine equivalents of values.
* @param {Function} customizer The function to customize comparisons.
* @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual` for more details.
* @param {Object} stack Tracks traversed `object` and `other` objects.
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
*/
function equalObjects(object, other, equalFunc, customizer, bitmask, stack) {
var isPartial = bitmask & PARTIAL_COMPARE_FLAG,
objProps = keys(object),
objLength = objProps.length,
othProps = keys(other),
othLength = othProps.length;
if (objLength != othLength && !isPartial) {
return false;
}
var index = objLength;
while (index--) {
var key = objProps[index];
if (!(isPartial ? key in other : baseHas(other, key))) {
return false;
}
}
// Assume cyclic values are equal.
var stacked = stack.get(object);
if (stacked) {
return stacked == other;
}
var result = true;
stack.set(object, other);
var skipCtor = isPartial;
while (++index < objLength) {
key = objProps[index];
var objValue = object[key],
othValue = other[key];
if (customizer) {
var compared = isPartial
? customizer(othValue, objValue, key, other, object, stack)
: customizer(objValue, othValue, key, object, other, stack);
}
// Recursively compare objects (susceptible to call stack limits).
if (!(compared === undefined
? (objValue === othValue || equalFunc(objValue, othValue, customizer, bitmask, stack))
: compared
)) {
result = false;
break;
}
skipCtor || (skipCtor = key == 'constructor');
}
if (result && !skipCtor) {
var objCtor = object.constructor,
othCtor = other.constructor;
// Non `Object` object instances with different constructors are not equal.
if (objCtor != othCtor &&
('constructor' in object && 'constructor' in other) &&
!(typeof objCtor == 'function' && objCtor instanceof objCtor &&
typeof othCtor == 'function' && othCtor instanceof othCtor)) {
result = false;
}
}
stack['delete'](object);
return result;
}
module.exports = equalObjects;
/***/ },
/* 51 */
/***/ function(module, exports) {
/** Used for built-in method references. */
var objectProto = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/** Built-in value references. */
var getPrototypeOf = Object.getPrototypeOf;
/**
* The base implementation of `_.has` without support for deep paths.
*
* @private
* @param {Object} object The object to query.
* @param {Array|string} key The key to check.
* @returns {boolean} Returns `true` if `key` exists, else `false`.
*/
function baseHas(object, key) {
// Avoid a bug in IE 10-11 where objects with a [[Prototype]] of `null`,
// that are composed entirely of index properties, return `false` for
// `hasOwnProperty` checks of them.
return hasOwnProperty.call(object, key) ||
(typeof object == 'object' && key in object && getPrototypeOf(object) === null);
}
module.exports = baseHas;
/***/ },
/* 52 */
/***/ function(module, exports, __webpack_require__) {
var baseHas = __webpack_require__(51),
baseKeys = __webpack_require__(53),
indexKeys = __webpack_require__(54),
isArrayLike = __webpack_require__(58),
isIndex = __webpack_require__(64),
isPrototype = __webpack_require__(65);
/**
* Creates an array of the own enumerable property names of `object`.
*
* **Note:** Non-object values are coerced to objects. See the
* [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)
* for more details.
*
* @static
* @memberOf _
* @category Object
* @param {Object} object The object to query.
* @returns {Array} Returns the array of property names.
* @example
*
* function Foo() {
* this.a = 1;
* this.b = 2;
* }
*
* Foo.prototype.c = 3;
*
* _.keys(new Foo);
* // => ['a', 'b'] (iteration order is not guaranteed)
*
* _.keys('hi');
* // => ['0', '1']
*/
function keys(object) {
var isProto = isPrototype(object);
if (!(isProto || isArrayLike(object))) {
return baseKeys(object);
}
var indexes = indexKeys(object),
skipIndexes = !!indexes,
result = indexes || [],
length = result.length;
for (var key in object) {
if (baseHas(object, key) &&
!(skipIndexes && (key == 'length' || isIndex(key, length))) &&
!(isProto && key == 'constructor')) {
result.push(key);
}
}
return result;
}
module.exports = keys;
/***/ },
/* 53 */
/***/ function(module, exports) {
/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeKeys = Object.keys;
/**
* The base implementation of `_.keys` which doesn't skip the constructor
* property of prototypes or treat sparse arrays as dense.
*
* @private
* @param {Object} object The object to query.
* @returns {Array} Returns the array of property names.
*/
function baseKeys(object) {
return nativeKeys(Object(object));
}
module.exports = baseKeys;
/***/ },
/* 54 */
/***/ function(module, exports, __webpack_require__) {
var baseTimes = __webpack_require__(55),
isArguments = __webpack_require__(56),
isArray = __webpack_require__(62),
isLength = __webpack_require__(61),
isString = __webpack_require__(63);
/**
* Creates an array of index keys for `object` values of arrays,
* `arguments` objects, and strings, otherwise `null` is returned.
*
* @private
* @param {Object} object The object to query.
* @returns {Array|null} Returns index keys, else `null`.
*/
function indexKeys(object) {
var length = object ? object.length : undefined;
if (isLength(length) &&
(isArray(object) || isString(object) || isArguments(object))) {
return baseTimes(length, String);
}
return null;
}
module.exports = indexKeys;
/***/ },
/* 55 */
/***/ function(module, exports) {
/**
* The base implementation of `_.times` without support for iteratee shorthands
* or max array length checks.
*
* @private
* @param {number} n The number of times to invoke `iteratee`.
* @param {Function} iteratee The function invoked per iteration.
* @returns {Array} Returns the array of results.
*/
function baseTimes(n, iteratee) {
var index = -1,
result = Array(n);
while (++index < n) {
result[index] = iteratee(index);
}
return result;
}
module.exports = baseTimes;
/***/ },
/* 56 */
/***/ function(module, exports, __webpack_require__) {
var isArrayLikeObject = __webpack_require__(57);
/** `Object#toString` result references. */
var argsTag = '[object Arguments]';
/** Used for built-in method references. */
var objectProto = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/**
* Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
* of values.
*/
var objectToString = objectProto.toString;
/** Built-in value references. */
var propertyIsEnumerable = objectProto.propertyIsEnumerable;
/**
* Checks if `value` is likely an `arguments` object.
*
* @static
* @memberOf _
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
* @example
*
* _.isArguments(function() { return arguments; }());
* // => true
*
* _.isArguments([1, 2, 3]);
* // => false
*/
function isArguments(value) {
// Safari 8.1 incorrectly makes `arguments.callee` enumerable in strict mode.
return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&
(!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);
}
module.exports = isArguments;
/***/ },
/* 57 */
/***/ function(module, exports, __webpack_require__) {
var isArrayLike = __webpack_require__(58),
isObjectLike = __webpack_require__(28);
/**
* This method is like `_.isArrayLike` except that it also checks if `value`
* is an object.
*
* @static
* @memberOf _
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is an array-like object, else `false`.
* @example
*
* _.isArrayLikeObject([1, 2, 3]);
* // => true
*
* _.isArrayLikeObject(document.body.children);
* // => true
*
* _.isArrayLikeObject('abc');
* // => false
*
* _.isArrayLikeObject(_.noop);
* // => false
*/
function isArrayLikeObject(value) {
return isObjectLike(value) && isArrayLike(value);
}
module.exports = isArrayLikeObject;
/***/ },
/* 58 */
/***/ function(module, exports, __webpack_require__) {
var getLength = __webpack_require__(59),
isFunction = __webpack_require__(26),
isLength = __webpack_require__(61);
/**
* Checks if `value` is array-like. A value is considered array-like if it's
* not a function and has a `value.length` that's an integer greater than or
* equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
*
* @static
* @memberOf _
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is array-like, else `false`.
* @example
*
* _.isArrayLike([1, 2, 3]);
* // => true
*
* _.isArrayLike(document.body.children);
* // => true
*
* _.isArrayLike('abc');
* // => true
*
* _.isArrayLike(_.noop);
* // => false
*/
function isArrayLike(value) {
return value != null && isLength(getLength(value)) && !isFunction(value);
}
module.exports = isArrayLike;
/***/ },
/* 59 */
/***/ function(module, exports, __webpack_require__) {
var baseProperty = __webpack_require__(60);
/**
* Gets the "length" property value of `object`.
*
* **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)
* that affects Safari on at least iOS 8.1-8.3 ARM64.
*
* @private
* @param {Object} object The object to query.
* @returns {*} Returns the "length" value.
*/
var getLength = baseProperty('length');
module.exports = getLength;
/***/ },
/* 60 */
/***/ function(module, exports) {
/**
* The base implementation of `_.property` without support for deep paths.
*
* @private
* @param {string} key The key of the property to get.
* @returns {Function} Returns the new function.
*/
function baseProperty(key) {
return function(object) {
return object == null ? undefined : object[key];
};
}
module.exports = baseProperty;
/***/ },
/* 61 */
/***/ function(module, exports) {
/** Used as references for various `Number` constants. */
var MAX_SAFE_INTEGER = 9007199254740991;
/**
* Checks if `value` is a valid array-like length.
*
* **Note:** This function is loosely based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).
*
* @static
* @memberOf _
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
* @example
*
* _.isLength(3);
* // => true
*
* _.isLength(Number.MIN_VALUE);
* // => false
*
* _.isLength(Infinity);
* // => false
*
* _.isLength('3');
* // => false
*/
function isLength(value) {
return typeof value == 'number' &&
value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
}
module.exports = isLength;
/***/ },
/* 62 */
/***/ function(module, exports) {
/**
* Checks if `value` is classified as an `Array` object.
*
* @static
* @memberOf _
* @type {Function}
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
* @example
*
* _.isArray([1, 2, 3]);
* // => true
*
* _.isArray(document.body.children);
* // => false
*
* _.isArray('abc');
* // => false
*
* _.isArray(_.noop);
* // => false
*/
var isArray = Array.isArray;
module.exports = isArray;
/***/ },
/* 63 */
/***/ function(module, exports, __webpack_require__) {
var isArray = __webpack_require__(62),
isObjectLike = __webpack_require__(28);
/** `Object#toString` result references. */
var stringTag = '[object String]';
/** Used for built-in method references. */
var objectProto = Object.prototype;
/**
* Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
* of values.
*/
var objectToString = objectProto.toString;
/**
* Checks if `value` is classified as a `String` primitive or object.
*
* @static
* @memberOf _
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
* @example
*
* _.isString('abc');
* // => true
*
* _.isString(1);
* // => false
*/
function isString(value) {
return typeof value == 'string' ||
(!isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag);
}
module.exports = isString;
/***/ },
/* 64 */
/***/ function(module, exports) {
/** Used as references for various `Number` constants. */
var MAX_SAFE_INTEGER = 9007199254740991;
/** Used to detect unsigned integer values. */
var reIsUint = /^(?:0|[1-9]\d*)$/;
/**
* Checks if `value` is a valid array-like index.
*
* @private
* @param {*} value The value to check.
* @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
* @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
*/
function isIndex(value, length) {
value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;
length = length == null ? MAX_SAFE_INTEGER : length;
return value > -1 && value % 1 == 0 && value < length;
}
module.exports = isIndex;
/***/ },
/* 65 */
/***/ function(module, exports) {
/** Used for built-in method references. */
var objectProto = Object.prototype;
/**
* Checks if `value` is likely a prototype object.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
*/
function isPrototype(value) {
var Ctor = value && value.constructor,
proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;
return value === proto;
}
module.exports = isPrototype;
/***/ },
/* 66 */
/***/ function(module, exports, __webpack_require__) {
var Map = __webpack_require__(29),
Set = __webpack_require__(67),
WeakMap = __webpack_require__(68);
/** `Object#toString` result references. */
var mapTag = '[object Map]',
objectTag = '[object Object]',
setTag = '[object Set]',
weakMapTag = '[object WeakMap]';
/** Used for built-in method references. */
var objectProto = Object.prototype;
/** Used to resolve the decompiled source of functions. */
var funcToString = Function.prototype.toString;
/**
* Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
* of values.
*/
var objectToString = objectProto.toString;
/** Used to detect maps, sets, and weakmaps. */
var mapCtorString = Map ? funcToString.call(Map) : '',
setCtorString = Set ? funcToString.call(Set) : '',
weakMapCtorString = WeakMap ? funcToString.call(WeakMap) : '';
/**
* Gets the `toStringTag` of `value`.
*
* @private
* @param {*} value The value to query.
* @returns {string} Returns the `toStringTag`.
*/
function getTag(value) {
return objectToString.call(value);
}
// Fallback for IE 11 providing `toStringTag` values for maps, sets, and weakmaps.
if ((Map && getTag(new Map) != mapTag) ||
(Set && getTag(new Set) != setTag) ||
(WeakMap && getTag(new WeakMap) != weakMapTag)) {
getTag = function(value) {
var result = objectToString.call(value),
Ctor = result == objectTag ? value.constructor : null,
ctorString = typeof Ctor == 'function' ? funcToString.call(Ctor) : '';
if (ctorString) {
switch (ctorString) {
case mapCtorString: return mapTag;
case setCtorString: return setTag;
case weakMapCtorString: return weakMapTag;
}
}
return result;
};
}
module.exports = getTag;
/***/ },
/* 67 */
/***/ function(module, exports, __webpack_require__) {
var getNative = __webpack_require__(24),
root = __webpack_require__(30);
/* Built-in method references that are verified to be native. */
var Set = getNative(root, 'Set');
module.exports = Set;
/***/ },
/* 68 */
/***/ function(module, exports, __webpack_require__) {
var getNative = __webpack_require__(24),
root = __webpack_require__(30);
/* Built-in method references that are verified to be native. */
var WeakMap = getNative(root, 'WeakMap');
module.exports = WeakMap;
/***/ },
/* 69 */
/***/ function(module, exports, __webpack_require__) {
var isLength = __webpack_require__(61),
isObjectLike = __webpack_require__(28);
/** `Object#toString` result references. */
var argsTag = '[object Arguments]',
arrayTag = '[object Array]',
boolTag = '[object Boolean]',
dateTag = '[object Date]',
errorTag = '[object Error]',
funcTag = '[object Function]',
mapTag = '[object Map]',
numberTag = '[object Number]',
objectTag = '[object Object]',
regexpTag = '[object RegExp]',
setTag = '[object Set]',
stringTag = '[object String]',
weakMapTag = '[object WeakMap]';
var arrayBufferTag = '[object ArrayBuffer]',
float32Tag = '[object Float32Array]',
float64Tag = '[object Float64Array]',
int8Tag = '[object Int8Array]',
int16Tag = '[object Int16Array]',
int32Tag = '[object Int32Array]',
uint8Tag = '[object Uint8Array]',
uint8ClampedTag = '[object Uint8ClampedArray]',
uint16Tag = '[object Uint16Array]',
uint32Tag = '[object Uint32Array]';
/** Used to identify `toStringTag` values of typed arrays. */
var typedArrayTags = {};
typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
typedArrayTags[uint32Tag] = true;
typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
typedArrayTags[dateTag] = typedArrayTags[errorTag] =
typedArrayTags[funcTag] = typedArrayTags[mapTag] =
typedArrayTags[numberTag] = typedArrayTags[objectTag] =
typedArrayTags[regexpTag] = typedArrayTags[setTag] =
typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;
/** Used for built-in method references. */
var objectProto = Object.prototype;
/**
* Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
* of values.
*/
var objectToString = objectProto.toString;
/**
* Checks if `value` is classified as a typed array.
*
* @static
* @memberOf _
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
* @example
*
* _.isTypedArray(new Uint8Array);
* // => true
*
* _.isTypedArray([]);
* // => false
*/
function isTypedArray(value) {
return isObjectLike(value) &&
isLength(value.length) && !!typedArrayTags[objectToString.call(value)];
}
module.exports = isTypedArray;
/***/ },
/* 70 */
/***/ function(module, exports, __webpack_require__) {
var baseForOwn = __webpack_require__(71),
baseIteratee = __webpack_require__(74);
/**
* Creates an object with the same keys as `object` and values generated by
* running each own enumerable property of `object` through `iteratee`. The
* iteratee is invoked with three arguments: (value, key, object).
*
* @static
* @memberOf _
* @category Object
* @param {Object} object The object to iterate over.
* @param {Function|Object|string} [iteratee=_.identity] The function invoked per iteration.
* @returns {Object} Returns the new mapped object.
* @example
*
* var users = {
* 'fred': { 'user': 'fred', 'age': 40 },
* 'pebbles': { 'user': 'pebbles', 'age': 1 }
* };
*
* _.mapValues(users, function(o) { return o.age; });
* // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
*
* // The `_.property` iteratee shorthand.
* _.mapValues(users, 'age');
* // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
*/
function mapValues(object, iteratee) {
var result = {};
iteratee = baseIteratee(iteratee, 3);
baseForOwn(object, function(value, key, object) {
result[key] = iteratee(value, key, object);
});
return result;
}
module.exports = mapValues;
/***/ },
/* 71 */
/***/ function(module, exports, __webpack_require__) {
var baseFor = __webpack_require__(72),
keys = __webpack_require__(52);
/**
* The base implementation of `_.forOwn` without support for iteratee shorthands.
*
* @private
* @param {Object} object The object to iterate over.
* @param {Function} iteratee The function invoked per iteration.
* @returns {Object} Returns `object`.
*/
function baseForOwn(object, iteratee) {
return object && baseFor(object, iteratee, keys);
}
module.exports = baseForOwn;
/***/ },
/* 72 */
/***/ function(module, exports, __webpack_require__) {
var createBaseFor = __webpack_require__(73);
/**
* The base implementation of `baseForIn` and `baseForOwn` which iterates
* over `object` properties returned by `keysFunc` invoking `iteratee` for
* each property. Iteratee functions may exit iteration early by explicitly
* returning `false`.
*
* @private
* @param {Object} object The object to iterate over.
* @param {Function} iteratee The function invoked per iteration.
* @param {Function} keysFunc The function to get the keys of `object`.
* @returns {Object} Returns `object`.
*/
var baseFor = createBaseFor();
module.exports = baseFor;
/***/ },
/* 73 */
/***/ function(module, exports) {
/**
* Creates a base function for methods like `_.forIn`.
*
* @private
* @param {boolean} [fromRight] Specify iterating from right to left.
* @returns {Function} Returns the new base function.
*/
function createBaseFor(fromRight) {
return function(object, iteratee, keysFunc) {
var index = -1,
iterable = Object(object),
props = keysFunc(object),
length = props.length;
while (length--) {
var key = props[fromRight ? length : ++index];
if (iteratee(iterable[key], key, iterable) === false) {
break;
}
}
return object;
};
}
module.exports = createBaseFor;
/***/ },
/* 74 */
/***/ function(module, exports, __webpack_require__) {
var baseMatches = __webpack_require__(75),
baseMatchesProperty = __webpack_require__(82),
identity = __webpack_require__(96),
isArray = __webpack_require__(62),
property = __webpack_require__(97);
/**
* The base implementation of `_.iteratee`.
*
* @private
* @param {*} [value=_.identity] The value to convert to an iteratee.
* @returns {Function} Returns the iteratee.
*/
function baseIteratee(value) {
var type = typeof value;
if (type == 'function') {
return value;
}
if (value == null) {
return identity;
}
if (type == 'object') {
return isArray(value)
? baseMatchesProperty(value[0], value[1])
: baseMatches(value);
}
return property(value);
}
module.exports = baseIteratee;
/***/ },
/* 75 */
/***/ function(module, exports, __webpack_require__) {
var baseIsMatch = __webpack_require__(76),
getMatchData = __webpack_require__(77);
/**
* The base implementation of `_.matches` which doesn't clone `source`.
*
* @private
* @param {Object} source The object of property values to match.
* @returns {Function} Returns the new function.
*/
function baseMatches(source) {
var matchData = getMatchData(source);
if (matchData.length == 1 && matchData[0][2]) {
var key = matchData[0][0],
value = matchData[0][1];
return function(object) {
if (object == null) {
return false;
}
return object[key] === value &&
(value !== undefined || (key in Object(object)));
};
}
return function(object) {
return object === source || baseIsMatch(object, source, matchData);
};
}
module.exports = baseMatches;
/***/ },
/* 76 */
/***/ function(module, exports, __webpack_require__) {
var Stack = __webpack_require__(9),
baseIsEqual = __webpack_require__(7);
/** Used to compose bitmasks for comparison styles. */
var UNORDERED_COMPARE_FLAG = 1,
PARTIAL_COMPARE_FLAG = 2;
/**
* The base implementation of `_.isMatch` without support for iteratee shorthands.
*
* @private
* @param {Object} object The object to inspect.
* @param {Object} source The object of property values to match.
* @param {Array} matchData The property names, values, and compare flags to match.
* @param {Function} [customizer] The function to customize comparisons.
* @returns {boolean} Returns `true` if `object` is a match, else `false`.
*/
function baseIsMatch(object, source, matchData, customizer) {
var index = matchData.length,
length = index,
noCustomizer = !customizer;
if (object == null) {
return !length;
}
object = Object(object);
while (index--) {
var data = matchData[index];
if ((noCustomizer && data[2])
? data[1] !== object[data[0]]
: !(data[0] in object)
) {
return false;
}
}
while (++index < length) {
data = matchData[index];
var key = data[0],
objValue = object[key],
srcValue = data[1];
if (noCustomizer && data[2]) {
if (objValue === undefined && !(key in object)) {
return false;
}
} else {
var stack = new Stack,
result = customizer ? customizer(objValue, srcValue, key, object, source, stack) : undefined;
if (!(result === undefined
? baseIsEqual(srcValue, objValue, customizer, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG, stack)
: result
)) {
return false;
}
}
}
return true;
}
module.exports = baseIsMatch;
/***/ },
/* 77 */
/***/ function(module, exports, __webpack_require__) {
var isStrictComparable = __webpack_require__(78),
toPairs = __webpack_require__(79);
/**
* Gets the property names, values, and compare flags of `object`.
*
* @private
* @param {Object} object The object to query.
* @returns {Array} Returns the match data of `object`.
*/
function getMatchData(object) {
var result = toPairs(object),
length = result.length;
while (length--) {
result[length][2] = isStrictComparable(result[length][1]);
}
return result;
}
module.exports = getMatchData;
/***/ },
/* 78 */
/***/ function(module, exports, __webpack_require__) {
var isObject = __webpack_require__(4);
/**
* Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` if suitable for strict
* equality comparisons, else `false`.
*/
function isStrictComparable(value) {
return value === value && !isObject(value);
}
module.exports = isStrictComparable;
/***/ },
/* 79 */
/***/ function(module, exports, __webpack_require__) {
var baseToPairs = __webpack_require__(80),
keys = __webpack_require__(52);
/**
* Creates an array of own enumerable key-value pairs for `object` which
* can be consumed by `_.fromPairs`.
*
* @static
* @memberOf _
* @category Object
* @param {Object} object The object to query.
* @returns {Array} Returns the new array of key-value pairs.
* @example
*
* function Foo() {
* this.a = 1;
* this.b = 2;
* }
*
* Foo.prototype.c = 3;
*
* _.toPairs(new Foo);
* // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
*/
function toPairs(object) {
return baseToPairs(object, keys(object));
}
module.exports = toPairs;
/***/ },
/* 80 */
/***/ function(module, exports, __webpack_require__) {
var arrayMap = __webpack_require__(81);
/**
* The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array
* of key-value pairs for `object` corresponding to the property names of `props`.
*
* @private
* @param {Object} object The object to query.
* @param {Array} props The property names to get values for.
* @returns {Object} Returns the new array of key-value pairs.
*/
function baseToPairs(object, props) {
return arrayMap(props, function(key) {
return [key, object[key]];
});
}
module.exports = baseToPairs;
/***/ },
/* 81 */
/***/ function(module, exports) {
/**
* A specialized version of `_.map` for arrays without support for iteratee
* shorthands.
*
* @private
* @param {Array} array The array to iterate over.
* @param {Function} iteratee The function invoked per iteration.
* @returns {Array} Returns the new mapped array.
*/
function arrayMap(array, iteratee) {
var index = -1,
length = array.length,
result = Array(length);
while (++index < length) {
result[index] = iteratee(array[index], index, array);
}
return result;
}
module.exports = arrayMap;
/***/ },
/* 82 */
/***/ function(module, exports, __webpack_require__) {
var baseIsEqual = __webpack_require__(7),
get = __webpack_require__(83),
hasIn = __webpack_require__(90);
/** Used to compose bitmasks for comparison styles. */
var UNORDERED_COMPARE_FLAG = 1,
PARTIAL_COMPARE_FLAG = 2;
/**
* The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
*
* @private
* @param {string} path The path of the property to get.
* @param {*} srcValue The value to match.
* @returns {Function} Returns the new function.
*/
function baseMatchesProperty(path, srcValue) {
return function(object) {
var objValue = get(object, path);
return (objValue === undefined && objValue === srcValue)
? hasIn(object, path)
: baseIsEqual(srcValue, objValue, undefined, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG);
};
}
module.exports = baseMatchesProperty;
/***/ },
/* 83 */
/***/ function(module, exports, __webpack_require__) {
var baseGet = __webpack_require__(84);
/**
* Gets the value at `path` of `object`. If the resolved value is
* `undefined` the `defaultValue` is used in its place.
*
* @static
* @memberOf _
* @category Object
* @param {Object} object The object to query.
* @param {Array|string} path The path of the property to get.
* @param {*} [defaultValue] The value returned if the resolved value is `undefined`.
* @returns {*} Returns the resolved value.
* @example
*
* var object = { 'a': [{ 'b': { 'c': 3 } }] };
*
* _.get(object, 'a[0].b.c');
* // => 3
*
* _.get(object, ['a', '0', 'b', 'c']);
* // => 3
*
* _.get(object, 'a.b.c', 'default');
* // => 'default'
*/
function get(object, path, defaultValue) {
var result = object == null ? undefined : baseGet(object, path);
return result === undefined ? defaultValue : result;
}
module.exports = get;
/***/ },
/* 84 */
/***/ function(module, exports, __webpack_require__) {
var baseCastPath = __webpack_require__(85),
isKey = __webpack_require__(89);
/**
* The base implementation of `_.get` without support for default values.
*
* @private
* @param {Object} object The object to query.
* @param {Array|string} path The path of the property to get.
* @returns {*} Returns the resolved value.
*/
function baseGet(object, path) {
path = isKey(path, object) ? [path + ''] : baseCastPath(path);
var index = 0,
length = path.length;
while (object != null && index < length) {
object = object[path[index++]];
}
return (index && index == length) ? object : undefined;
}
module.exports = baseGet;
/***/ },
/* 85 */
/***/ function(module, exports, __webpack_require__) {
var isArray = __webpack_require__(62),
stringToPath = __webpack_require__(86);
/**
* Casts `value` to a path array if it's not one.
*
* @private
* @param {*} value The value to inspect.
* @returns {Array} Returns the cast property path array.
*/
function baseCastPath(value) {
return isArray(value) ? value : stringToPath(value);
}
module.exports = baseCastPath;
/***/ },
/* 86 */
/***/ function(module, exports, __webpack_require__) {
var toString = __webpack_require__(87);
/** Used to match property names within property paths. */
var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]/g;
/** Used to match backslashes in property paths. */
var reEscapeChar = /\\(\\)?/g;
/**
* Converts `string` to a property path array.
*
* @private
* @param {string} string The string to convert.
* @returns {Array} Returns the property path array.
*/
function stringToPath(string) {
var result = [];
toString(string).replace(rePropName, function(match, number, quote, string) {
result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));
});
return result;
}
module.exports = stringToPath;
/***/ },
/* 87 */
/***/ function(module, exports, __webpack_require__) {
var Symbol = __webpack_require__(46),
isSymbol = __webpack_require__(88);
/** Used as references for various `Number` constants. */
var INFINITY = 1 / 0;
/** Used to convert symbols to primitives and strings. */
var symbolProto = Symbol ? Symbol.prototype : undefined,
symbolToString = symbolProto ? symbolProto.toString : undefined;
/**
* Converts `value` to a string if it's not one. An empty string is returned
* for `null` and `undefined` values. The sign of `-0` is preserved.
*
* @static
* @memberOf _
* @category Lang
* @param {*} value The value to process.
* @returns {string} Returns the string.
* @example
*
* _.toString(null);
* // => ''
*
* _.toString(-0);
* // => '-0'
*
* _.toString([1, 2, 3]);
* // => '1,2,3'
*/
function toString(value) {
// Exit early for strings to avoid a performance hit in some environments.
if (typeof value == 'string') {
return value;
}
if (value == null) {
return '';
}
if (isSymbol(value)) {
return symbolToString ? symbolToString.call(value) : '';
}
var result = (value + '');
return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
}
module.exports = toString;
/***/ },
/* 88 */
/***/ function(module, exports, __webpack_require__) {
var isObjectLike = __webpack_require__(28);
/** `Object#toString` result references. */
var symbolTag = '[object Symbol]';
/** Used for built-in method references. */
var objectProto = Object.prototype;
/**
* Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
* of values.
*/
var objectToString = objectProto.toString;
/**
* Checks if `value` is classified as a `Symbol` primitive or object.
*
* @static
* @memberOf _
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
* @example
*
* _.isSymbol(Symbol.iterator);
* // => true
*
* _.isSymbol('abc');
* // => false
*/
function isSymbol(value) {
return typeof value == 'symbol' ||
(isObjectLike(value) && objectToString.call(value) == symbolTag);
}
module.exports = isSymbol;
/***/ },
/* 89 */
/***/ function(module, exports, __webpack_require__) {
var isArray = __webpack_require__(62);
/** Used to match property names within property paths. */
var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
reIsPlainProp = /^\w*$/;
/**
* Checks if `value` is a property name and not a property path.
*
* @private
* @param {*} value The value to check.
* @param {Object} [object] The object to query keys on.
* @returns {boolean} Returns `true` if `value` is a property name, else `false`.
*/
function isKey(value, object) {
if (typeof value == 'number') {
return true;
}
return !isArray(value) &&
(reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
(object != null && value in Object(object)));
}
module.exports = isKey;
/***/ },
/* 90 */
/***/ function(module, exports, __webpack_require__) {
var baseHasIn = __webpack_require__(91),
hasPath = __webpack_require__(92);
/**
* Checks if `path` is a direct or inherited property of `object`.
*
* @static
* @memberOf _
* @category Object
* @param {Object} object The object to query.
* @param {Array|string} path The path to check.
* @returns {boolean} Returns `true` if `path` exists, else `false`.
* @example
*
* var object = _.create({ 'a': _.create({ 'b': _.create({ 'c': 3 }) }) });
*
* _.hasIn(object, 'a');
* // => true
*
* _.hasIn(object, 'a.b.c');
* // => true
*
* _.hasIn(object, ['a', 'b', 'c']);
* // => true
*
* _.hasIn(object, 'b');
* // => false
*/
function hasIn(object, path) {
return hasPath(object, path, baseHasIn);
}
module.exports = hasIn;
/***/ },
/* 91 */
/***/ function(module, exports) {
/**
* The base implementation of `_.hasIn` without support for deep paths.
*
* @private
* @param {Object} object The object to query.
* @param {Array|string} key The key to check.
* @returns {boolean} Returns `true` if `key` exists, else `false`.
*/
function baseHasIn(object, key) {
return key in Object(object);
}
module.exports = baseHasIn;
/***/ },
/* 92 */
/***/ function(module, exports, __webpack_require__) {
var baseCastPath = __webpack_require__(85),
isArguments = __webpack_require__(56),
isArray = __webpack_require__(62),
isIndex = __webpack_require__(64),
isKey = __webpack_require__(89),
isLength = __webpack_require__(61),
isString = __webpack_require__(63),
last = __webpack_require__(93),
parent = __webpack_require__(94);
/**
* Checks if `path` exists on `object`.
*
* @private
* @param {Object} object The object to query.
* @param {Array|string} path The path to check.
* @param {Function} hasFunc The function to check properties.
* @returns {boolean} Returns `true` if `path` exists, else `false`.
*/
function hasPath(object, path, hasFunc) {
if (object == null) {
return false;
}
var result = hasFunc(object, path);
if (!result && !isKey(path)) {
path = baseCastPath(path);
object = parent(object, path);
if (object != null) {
path = last(path);
result = hasFunc(object, path);
}
}
var length = object ? object.length : undefined;
return result || (
!!length && isLength(length) && isIndex(path, length) &&
(isArray(object) || isString(object) || isArguments(object))
);
}
module.exports = hasPath;
/***/ },
/* 93 */
/***/ function(module, exports) {
/**
* Gets the last element of `array`.
*
* @static
* @memberOf _
* @category Array
* @param {Array} array The array to query.
* @returns {*} Returns the last element of `array`.
* @example
*
* _.last([1, 2, 3]);
* // => 3
*/
function last(array) {
var length = array ? array.length : 0;
return length ? array[length - 1] : undefined;
}
module.exports = last;
/***/ },
/* 94 */
/***/ function(module, exports, __webpack_require__) {
var baseSlice = __webpack_require__(95),
get = __webpack_require__(83);
/**
* Gets the parent value at `path` of `object`.
*
* @private
* @param {Object} object The object to query.
* @param {Array} path The path to get the parent value of.
* @returns {*} Returns the parent value.
*/
function parent(object, path) {
return path.length == 1 ? object : get(object, baseSlice(path, 0, -1));
}
module.exports = parent;
/***/ },
/* 95 */
/***/ function(module, exports) {
/**
* The base implementation of `_.slice` without an iteratee call guard.
*
* @private
* @param {Array} array The array to slice.
* @param {number} [start=0] The start position.
* @param {number} [end=array.length] The end position.
* @returns {Array} Returns the slice of `array`.
*/
function baseSlice(array, start, end) {
var index = -1,
length = array.length;
if (start < 0) {
start = -start > length ? 0 : (length + start);
}
end = end > length ? length : end;
if (end < 0) {
end += length;
}
length = start > end ? 0 : ((end - start) >>> 0);
start >>>= 0;
var result = Array(length);
while (++index < length) {
result[index] = array[index + start];
}
return result;
}
module.exports = baseSlice;
/***/ },
/* 96 */
/***/ function(module, exports) {
/**
* This method returns the first argument given to it.
*
* @static
* @memberOf _
* @category Util
* @param {*} value Any value.
* @returns {*} Returns `value`.
* @example
*
* var object = { 'user': 'fred' };
*
* _.identity(object) === object;
* // => true
*/
function identity(value) {
return value;
}
module.exports = identity;
/***/ },
/* 97 */
/***/ function(module, exports, __webpack_require__) {
var baseProperty = __webpack_require__(60),
basePropertyDeep = __webpack_require__(98),
isKey = __webpack_require__(89);
/**
* Creates a function that returns the value at `path` of a given object.
*
* @static
* @memberOf _
* @category Util
* @param {Array|string} path The path of the property to get.
* @returns {Function} Returns the new function.
* @example
*
* var objects = [
* { 'a': { 'b': { 'c': 2 } } },
* { 'a': { 'b': { 'c': 1 } } }
* ];
*
* _.map(objects, _.property('a.b.c'));
* // => [2, 1]
*
* _.map(_.sortBy(objects, _.property(['a', 'b', 'c'])), 'a.b.c');
* // => [1, 2]
*/
function property(path) {
return isKey(path) ? baseProperty(path) : basePropertyDeep(path);
}
module.exports = property;
/***/ },
/* 98 */
/***/ function(module, exports, __webpack_require__) {
var baseGet = __webpack_require__(84);
/**
* A specialized version of `baseProperty` which supports deep paths.
*
* @private
* @param {Array|string} path The path of the property to get.
* @returns {Function} Returns the new function.
*/
function basePropertyDeep(path) {
return function(object) {
return baseGet(object, path);
};
}
module.exports = basePropertyDeep;
/***/ },
/* 99 */
/***/ function(module, exports, __webpack_require__) {
var normalizr = __webpack_require__(1);
var User = new normalizr.Schema('users', { idAttribute: 'id_str' });
var Tweet = new normalizr.Schema('tweets', { idAttribute: 'id_str' });
Tweet.define({
card: {
users: normalizr.arrayOf(User)
},
quoted_status: Tweet,
retweeted_status: Tweet,
user: User
});
var RichTimeline = {
twitter_objects: {
tweets: normalizr.arrayOf(Tweet),
users: normalizr.arrayOf(User),
}
};
module.exports = RichTimeline;
/***/ }
/******/ ]);
<!doctype html>
<html>
<head>
<title>Safri Repro Error</title>
</head>
<body>
<div id="log"></div>
<script src="bundle.js"></script>
</body>
</html>
var normalizr = require('normalizr');
var richTimelineSchema = require('./schema');
function appendResult(msg) {
var logNode = document.getElementById('log');
var entry = document.createElement('p');
var text = document.createTextNode((new Date).toISOString() + ' ' + msg);
entry.appendChild(text);
logNode.appendChild(entry);
}
function getTimeline(callback) {
var xhr = new XMLHttpRequest();
xhr.open('GET', 'twitter_timeline.json');
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
callback(xhr.responseText);
}
}
xhr.send();
}
function assert(predicate, msg) {
if (!predicate) { throw new Error(msg); }
}
function verifyNormalized(raw, normed) {
if (!normed.entities.tweets) {
appendResult('missing entities.tweets');
} else if (!normed.entities.users) {
appendResult('missing entities.users');
} else {
appendResult('looks okay');
}
}
document.addEventListener('DOMContentLoaded', function () {
console.log('here');
appendResult('loaded');
setInterval(function () {
getTimeline(function (text) {
var body = JSON.parse(text);
var normalized = normalizr.normalize(body, richTimelineSchema);
verifyNormalized(body, normalized);
});
}, 5000)
}, false);
{
"name": "safari-repro",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"normalizr": "^2.0.0"
},
"devDependencies": {
"webpack": "^1.12.14"
}
}
var normalizr = require('normalizr');
var User = new normalizr.Schema('users', { idAttribute: 'id_str' });
var Tweet = new normalizr.Schema('tweets', { idAttribute: 'id_str' });
Tweet.define({
card: {
users: normalizr.arrayOf(User)
},
quoted_status: Tweet,
retweeted_status: Tweet,
user: User
});
var RichTimeline = {
twitter_objects: {
tweets: normalizr.arrayOf(Tweet),
users: normalizr.arrayOf(User),
}
};
module.exports = RichTimeline;
{"twitter_objects":{"tweets":{"712036553414078466":{"created_at":"Mon Mar 21 22:01:57 +0000 2016","id":712036553414078466,"id_str":"712036553414078466","text":"Thank you Twitter for letting me take today off, and not paging me yet #LoveTwitter","entities":{"hashtags":[{"text":"LoveTwitter","indices":[71,83]}],"symbols":[],"user_mentions":[],"urls":[]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\/download\/iphone\" rel=\"nofollow\"\u003eTwitter for iPhone\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":0,"favorite_count":9,"conversation_id":712036553414078466,"favorited":false,"retweeted":false,"lang":"en"},"712421685735981057":{"created_at":"Tue Mar 22 23:32:20 +0000 2016","id":712421685735981057,"id_str":"712421685735981057","text":"reminder for everyone blaming that one guy for unpublishing his modules and breaking their build: https:\/\/t.co\/XATtMIhxzh","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[{"url":"https:\/\/t.co\/XATtMIhxzh","expanded_url":"http:\/\/www.whoownsmyavailability.com\/","display_url":"whoownsmyavailability.com","indices":[98,121]}]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":99,"favorite_count":87,"conversation_id":712421685735981057,"favorited":false,"retweeted":false,"possibly_sensitive":false,"possibly_sensitive_appealable":false,"lang":"en"},"709154664332177408":{"created_at":"Sun Mar 13 23:10:22 +0000 2016","id":709154664332177408,"id_str":"709154664332177408","text":"Preparing tax documents, or \"downloading the software I deleted last April\"","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":0,"favorite_count":1,"conversation_id":709154664332177408,"favorited":false,"retweeted":false,"lang":"en"},"709854827879096320":{"created_at":"Tue Mar 15 21:32:34 +0000 2016","id":709854827879096320,"id_str":"709854827879096320","text":"Today in \"cognitive biases are a bitch\": https:\/\/t.co\/O8ZMLm9Shv","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[{"url":"https:\/\/t.co\/O8ZMLm9Shv","expanded_url":"https:\/\/en.wikipedia.org\/wiki\/Choice-supportive_bias","display_url":"en.wikipedia.org\/wiki\/Choice-su\u2026","indices":[41,64]}]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":0,"favorite_count":1,"conversation_id":709854827879096320,"favorited":false,"retweeted":false,"possibly_sensitive":false,"possibly_sensitive_appealable":false,"lang":"en"},"705477603608506368":{"created_at":"Thu Mar 03 19:39:02 +0000 2016","id":705477603608506368,"id_str":"705477603608506368","text":"clearly, the best way to configure a watch for the vision impaired is by poking a paper clip into a recessed sensor https:\/\/t.co\/VeMrzkCIxm","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[{"url":"https:\/\/t.co\/VeMrzkCIxm","expanded_url":"https:\/\/youtu.be\/aRYZCRZ0UG0?t=126","display_url":"youtu.be\/aRYZCRZ0UG0?t=\u2026","indices":[116,139]}]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":1,"favorite_count":3,"conversation_id":705477603608506368,"favorited":false,"retweeted":false,"possibly_sensitive":false,"possibly_sensitive_appealable":false,"lang":"en"},"709446797945536512":{"created_at":"Mon Mar 14 18:31:12 +0000 2016","id":709446797945536512,"id_str":"709446797945536512","text":"OH: \"Reached the point where everything compiled and all the tests in macaw-swift failed\"","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":0,"favorite_count":3,"conversation_id":709446797945536512,"favorited":false,"retweeted":false,"lang":"en"},"713481205845372928":{"created_at":"Fri Mar 25 21:42:29 +0000 2016","id":713481205845372928,"id_str":"713481205845372928","text":"Don't worry everyone, the website's still up! https:\/\/t.co\/LbHhTEsTzf https:\/\/t.co\/pD6DAH2Blq","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[{"url":"https:\/\/t.co\/LbHhTEsTzf","expanded_url":"http:\/\/status.hipchat.com","display_url":"status.hipchat.com","indices":[46,69]}],"media":[{"id":713481205287497728,"id_str":"713481205287497728","indices":[70,93],"media_url":"http:\/\/pbs.twimg.com\/media\/CebLYEMUMAAmUnT.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/CebLYEMUMAAmUnT.jpg","url":"https:\/\/t.co\/pD6DAH2Blq","display_url":"pic.twitter.com\/pD6DAH2Blq","expanded_url":"http:\/\/twitter.com\/alunny\/status\/713481205845372928\/photo\/1","type":"photo","sizes":{"medium":{"w":600,"h":352,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"small":{"w":340,"h":199,"resize":"fit"},"large":{"w":1024,"h":600,"resize":"fit"}},"features":{"orig":{"faces":[{"x":61,"y":552,"h":186,"w":186}]},"medium":{"faces":[{"x":21,"y":190,"h":64,"w":64}]},"small":{"faces":[{"x":11,"y":107,"h":36,"w":36}]},"large":{"faces":[{"x":35,"y":324,"h":109,"w":109}]}}}]},"extended_entities":{"media":[{"id":713481205287497728,"id_str":"713481205287497728","indices":[70,93],"media_url":"http:\/\/pbs.twimg.com\/media\/CebLYEMUMAAmUnT.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/CebLYEMUMAAmUnT.jpg","url":"https:\/\/t.co\/pD6DAH2Blq","display_url":"pic.twitter.com\/pD6DAH2Blq","expanded_url":"http:\/\/twitter.com\/alunny\/status\/713481205845372928\/photo\/1","type":"photo","sizes":{"medium":{"w":600,"h":352,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"small":{"w":340,"h":199,"resize":"fit"},"large":{"w":1024,"h":600,"resize":"fit"}},"features":{"orig":{"faces":[{"x":61,"y":552,"h":186,"w":186}]},"medium":{"faces":[{"x":21,"y":190,"h":64,"w":64}]},"small":{"faces":[{"x":11,"y":107,"h":36,"w":36}]},"large":{"faces":[{"x":35,"y":324,"h":109,"w":109}]}}}]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":0,"favorite_count":1,"conversation_id":713481205845372928,"favorited":false,"retweeted":false,"possibly_sensitive":false,"possibly_sensitive_appealable":false,"lang":"en"},"714267325541654528":{"created_at":"Mon Mar 28 01:46:15 +0000 2016","id":714267325541654528,"id_str":"714267325541654528","text":"The muted response to that tweet suggests a lot of followers are in the pocket of big TP.","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\/download\/iphone\" rel=\"nofollow\"\u003eTwitter for iPhone\u003c\/a\u003e","in_reply_to_status_id":713912592201199616,"in_reply_to_status_id_str":"713912592201199616","in_reply_to_user_id":15990366,"in_reply_to_user_id_str":"15990366","in_reply_to_screen_name":"alunny","user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":0,"favorite_count":3,"conversation_id":713912592201199616,"favorited":false,"retweeted":false,"lang":"en"},"706612586582667264":{"created_at":"Sun Mar 06 22:49:03 +0000 2016","id":706612586582667264,"id_str":"706612586582667264","text":"TFW you get paged for a service you didn't know exists.","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":1,"favorite_count":10,"conversation_id":706612586582667264,"favorited":false,"retweeted":false,"lang":"en"},"710895576758374400":{"created_at":"Fri Mar 18 18:28:07 +0000 2016","id":710895576758374400,"id_str":"710895576758374400","text":"Presets:\n Offline (0 kb\/s \u2b06 0 kb\/s \u2b07 0ms RTT) https:\/\/t.co\/9oMUH0AAv8","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[],"media":[{"id":710895510207344641,"id_str":"710895510207344641","indices":[47,70],"media_url":"http:\/\/pbs.twimg.com\/tweet_video_thumb\/Cd2bszZUMAEWZtR.jpg","media_url_https":"https:\/\/pbs.twimg.com\/tweet_video_thumb\/Cd2bszZUMAEWZtR.jpg","url":"https:\/\/t.co\/9oMUH0AAv8","display_url":"pic.twitter.com\/9oMUH0AAv8","expanded_url":"http:\/\/twitter.com\/alunny\/status\/710895576758374400\/photo\/1","type":"photo","sizes":{"large":{"w":498,"h":338,"resize":"fit"},"medium":{"w":498,"h":338,"resize":"fit"},"small":{"w":340,"h":231,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"}},"features":{}}]},"extended_entities":{"media":[{"id":710895510207344641,"id_str":"710895510207344641","indices":[47,70],"media_url":"http:\/\/pbs.twimg.com\/tweet_video_thumb\/Cd2bszZUMAEWZtR.jpg","media_url_https":"https:\/\/pbs.twimg.com\/tweet_video_thumb\/Cd2bszZUMAEWZtR.jpg","url":"https:\/\/t.co\/9oMUH0AAv8","display_url":"pic.twitter.com\/9oMUH0AAv8","expanded_url":"http:\/\/twitter.com\/alunny\/status\/710895576758374400\/photo\/1","type":"animated_gif","sizes":{"large":{"w":498,"h":338,"resize":"fit"},"medium":{"w":498,"h":338,"resize":"fit"},"small":{"w":340,"h":231,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"}},"video_info":{"aspect_ratio":[249,169],"variants":[{"bitrate":0,"content_type":"video\/mp4","url":"https:\/\/pbs.twimg.com\/tweet_video\/Cd2bszZUMAEWZtR.mp4"}]},"features":{}}]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":0,"favorite_count":4,"conversation_id":710895576758374400,"favorited":false,"retweeted":false,"possibly_sensitive":false,"possibly_sensitive_appealable":false,"lang":"en"},"705898768818896896":{"created_at":"Fri Mar 04 23:32:36 +0000 2016","id":705898768818896896,"id_str":"705898768818896896","text":"\"the outcome generally only goes as far as a loss in quality of life\" ~~cool story~~ https:\/\/t.co\/nfIskHSm1C","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[{"url":"https:\/\/t.co\/nfIskHSm1C","expanded_url":"http:\/\/www.cbc.ca\/news\/canada\/british-columbia\/bc-allergy-season-1.3475617?utm_content=bufferbdb38&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer","display_url":"cbc.ca\/news\/canada\/br\u2026","indices":[85,108]}]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":0,"favorite_count":1,"conversation_id":705898768818896896,"favorited":false,"retweeted":false,"possibly_sensitive":false,"possibly_sensitive_appealable":false,"lang":"en"},"705815825018707968":{"created_at":"Fri Mar 04 18:03:00 +0000 2016","id":705815825018707968,"id_str":"705815825018707968","text":"This web page was very disappointing: https:\/\/t.co\/xscppwyQW5","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[{"url":"https:\/\/t.co\/xscppwyQW5","expanded_url":"http:\/\/adjective1.com\/for-soup\/","display_url":"adjective1.com\/for-soup\/","indices":[38,61]}]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":0,"favorite_count":1,"conversation_id":705815825018707968,"favorited":false,"retweeted":false,"possibly_sensitive":false,"possibly_sensitive_appealable":false,"lang":"en"},"712011567919837188":{"created_at":"Mon Mar 21 20:22:40 +0000 2016","id":712011567919837188,"id_str":"712011567919837188","text":"RT @biz: watching jack nicholson in wolf","entities":{"hashtags":[],"symbols":[],"user_mentions":[{"screen_name":"biz","name":"Biz Stone","id":13,"id_str":"13","indices":[3,7]}],"urls":[]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\/download\/iphone\" rel=\"nofollow\"\u003eTwitter for iPhone\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweeted_status":{"created_at":"Sun Apr 09 03:55:08 +0000 2006","id":1637,"id_str":"1637","text":"watching jack nicholson in wolf","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":13,"id_str":"13"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":10,"favorite_count":8,"conversation_id":1637,"favorited":false,"retweeted":true,"lang":"en"},"is_quote_status":false,"retweet_count":10,"favorite_count":0,"conversation_id":712011567919837188,"favorited":false,"retweeted":true,"lang":"en"},"713255109015175170":{"created_at":"Fri Mar 25 06:44:04 +0000 2016","id":713255109015175170,"id_str":"713255109015175170","text":"Putting scraps of paper on your cat's head without her noticing: the true meaning of Good Friday. https:\/\/t.co\/u4jxZrIE8E","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[],"media":[{"id":713255092225314818,"id_str":"713255092225314818","indices":[98,121],"media_url":"http:\/\/pbs.twimg.com\/media\/CeX9ujZUEAI5NUP.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/CeX9ujZUEAI5NUP.jpg","url":"https:\/\/t.co\/u4jxZrIE8E","display_url":"pic.twitter.com\/u4jxZrIE8E","expanded_url":"http:\/\/twitter.com\/alunny\/status\/713255109015175170\/photo\/1","type":"photo","sizes":{"medium":{"w":600,"h":693,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"small":{"w":340,"h":393,"resize":"fit"},"large":{"w":1024,"h":1183,"resize":"fit"}},"features":{"orig":{"faces":[]},"medium":{"faces":[]},"small":{"faces":[]},"large":{"faces":[]}}}]},"extended_entities":{"media":[{"id":713255092225314818,"id_str":"713255092225314818","indices":[98,121],"media_url":"http:\/\/pbs.twimg.com\/media\/CeX9ujZUEAI5NUP.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/CeX9ujZUEAI5NUP.jpg","url":"https:\/\/t.co\/u4jxZrIE8E","display_url":"pic.twitter.com\/u4jxZrIE8E","expanded_url":"http:\/\/twitter.com\/alunny\/status\/713255109015175170\/photo\/1","type":"photo","sizes":{"medium":{"w":600,"h":693,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"small":{"w":340,"h":393,"resize":"fit"},"large":{"w":1024,"h":1183,"resize":"fit"}},"features":{"orig":{"faces":[]},"medium":{"faces":[]},"small":{"faces":[]},"large":{"faces":[]}}}]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\/download\/iphone\" rel=\"nofollow\"\u003eTwitter for iPhone\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":0,"favorite_count":5,"conversation_id":713255109015175170,"favorited":false,"retweeted":false,"possibly_sensitive":false,"possibly_sensitive_appealable":false,"lang":"en"},"714704904825266176":{"created_at":"Tue Mar 29 06:45:02 +0000 2016","id":714704904825266176,"id_str":"714704904825266176","text":"A fun thing to do is to stay up late drinking whisky aggregating the number of days you spent in the US for the past three years for tax pur","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":0,"favorite_count":5,"conversation_id":714704904825266176,"favorited":false,"retweeted":false,"lang":"en"},"713063516408643584":{"created_at":"Thu Mar 24 18:02:45 +0000 2016","id":713063516408643584,"id_str":"713063516408643584","text":"RT @JFriedhoff: The Tay disaster reminds me of this v smart post by @tinysubversions on basic transphobic joke prevention in his bot https:\u2026","entities":{"hashtags":[],"symbols":[],"user_mentions":[{"screen_name":"JFriedhoff","name":"jane frie(n)dhoff","id":379875798,"id_str":"379875798","indices":[3,14]},{"screen_name":"tinysubversions","name":"Darius Kazemi","id":14475298,"id_str":"14475298","indices":[68,84]}],"urls":[{"url":"https:\/\/t.co\/bmoRuN0tHi","expanded_url":"http:\/\/tinysubversions.com\/notes\/transphobic-joke-detection\/","display_url":"tinysubversions.com\/notes\/transpho\u2026","indices":[139,140]}]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweeted_status":{"created_at":"Thu Mar 24 13:32:19 +0000 2016","id":712995459892174848,"id_str":"712995459892174848","text":"The Tay disaster reminds me of this v smart post by @tinysubversions on basic transphobic joke prevention in his bot https:\/\/t.co\/bmoRuN0tHi","entities":{"hashtags":[],"symbols":[],"user_mentions":[{"screen_name":"tinysubversions","name":"Darius Kazemi","id":14475298,"id_str":"14475298","indices":[52,68]}],"urls":[{"url":"https:\/\/t.co\/bmoRuN0tHi","expanded_url":"http:\/\/tinysubversions.com\/notes\/transphobic-joke-detection\/","display_url":"tinysubversions.com\/notes\/transpho\u2026","indices":[117,140]}]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":379875798,"id_str":"379875798"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":141,"favorite_count":104,"conversation_id":712995459892174848,"favorited":false,"retweeted":true,"possibly_sensitive":false,"possibly_sensitive_appealable":false,"lang":"en"},"is_quote_status":false,"retweet_count":141,"favorite_count":0,"conversation_id":713063516408643584,"favorited":false,"retweeted":true,"possibly_sensitive":false,"possibly_sensitive_appealable":false,"lang":"en"},"1637":{"created_at":"Sun Apr 09 03:55:08 +0000 2006","id":1637,"id_str":"1637","text":"watching jack nicholson in wolf","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":13,"id_str":"13"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":10,"favorite_count":8,"conversation_id":1637,"favorited":false,"retweeted":true,"current_user_retweet":{"id":712011567919837188,"id_str":"712011567919837188"},"lang":"en"},"707670300083642368":{"created_at":"Wed Mar 09 20:52:02 +0000 2016","id":707670300083642368,"id_str":"707670300083642368","text":"achievement unlocked: built and launched chromium for iOS","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":0,"favorite_count":1,"conversation_id":707670300083642368,"favorited":false,"retweeted":false,"lang":"en"},"706981235910782982":{"created_at":"Mon Mar 07 23:13:56 +0000 2016","id":706981235910782982,"id_str":"706981235910782982","text":"ReferenceError: undefine is not defined","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":0,"favorite_count":4,"conversation_id":706981235910782982,"favorited":false,"retweeted":false,"lang":"en"},"713912592201199616":{"created_at":"Sun Mar 27 02:16:40 +0000 2016","id":713912592201199616,"id_str":"713912592201199616","text":"Biggest joke in retail: n double rolls = 2n single rolls","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\/download\/iphone\" rel=\"nofollow\"\u003eTwitter for iPhone\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":0,"favorite_count":4,"conversation_id":713912592201199616,"favorited":false,"retweeted":false,"lang":"en"},"712995459892174848":{"created_at":"Thu Mar 24 13:32:19 +0000 2016","id":712995459892174848,"id_str":"712995459892174848","text":"The Tay disaster reminds me of this v smart post by @tinysubversions on basic transphobic joke prevention in his bot https:\/\/t.co\/bmoRuN0tHi","entities":{"hashtags":[],"symbols":[],"user_mentions":[{"screen_name":"tinysubversions","name":"Darius Kazemi","id":14475298,"id_str":"14475298","indices":[52,68]}],"urls":[{"url":"https:\/\/t.co\/bmoRuN0tHi","expanded_url":"http:\/\/tinysubversions.com\/notes\/transphobic-joke-detection\/","display_url":"tinysubversions.com\/notes\/transpho\u2026","indices":[117,140]}]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":379875798,"id_str":"379875798"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":141,"favorite_count":104,"conversation_id":712995459892174848,"favorited":false,"retweeted":true,"possibly_sensitive":false,"possibly_sensitive_appealable":false,"current_user_retweet":{"id":713063516408643584,"id_str":"713063516408643584"},"lang":"en"}},"users":{"55323056":{"id":55323056,"id_str":"55323056","counts":{"saved_searches":0,"lists":{"subscribed":3,"owned":17}},"name":"City of Vancouver","screen_name":"CityofVancouver","location":"Vancouver, BC, Canada","description":"Tweeting news, events, and more about the beautiful City of Vancouver in British Columbia, Canada. For urgent requests, please call 3-1-1!","url":"http:\/\/t.co\/pdOVEWp6y7","entities":{"url":{"urls":[{"url":"http:\/\/t.co\/pdOVEWp6y7","expanded_url":"http:\/\/vancouver.ca","display_url":"vancouver.ca","indices":[0,22]}]},"description":{"urls":[]}},"protected":false,"followers_count":112056,"friends_count":3573,"listed_count":1692,"created_at":"Thu Jul 09 18:47:58 +0000 2009","favourites_count":1970,"utc_offset":-25200,"time_zone":"Pacific Time (US & Canada)","geo_enabled":true,"verified":true,"statuses_count":21481,"lang":"en","contributors_enabled":false,"is_translator":false,"is_translation_enabled":false,"profile_background_color":"005582","profile_background_image_url":"http:\/\/pbs.twimg.com\/profile_background_images\/471072671325630464\/mJgDamTa.jpeg","profile_background_image_url_https":"https:\/\/pbs.twimg.com\/profile_background_images\/471072671325630464\/mJgDamTa.jpeg","profile_background_tile":false,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/610511664748695552\/g2OBM_H3_normal.jpg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/610511664748695552\/g2OBM_H3_normal.jpg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/55323056\/1458750908","profile_link_color":"005582","profile_sidebar_border_color":"FFFFFF","profile_sidebar_fill_color":"85C335","profile_text_color":"444444","profile_use_background_image":true,"has_extended_profile":false,"default_profile":false,"default_profile_image":false,"following":true,"follow_request_sent":false,"notifications":false},"13":{"id":13,"id_str":"13","counts":{"saved_searches":0,"lists":{"subscribed":1,"owned":2}},"name":"Biz Stone","screen_name":"biz","location":"San Francisco, CA","description":"Co-founder Twitter, Medium, and now Co-founder and CEO of https:\/\/t.co\/r8cfF8q2u5","url":"https:\/\/t.co\/Z0lDe7sSrF","entities":{"url":{"urls":[{"url":"https:\/\/t.co\/Z0lDe7sSrF","expanded_url":"http:\/\/www.jelly.co","display_url":"jelly.co","indices":[0,23]}]},"description":{"urls":[{"url":"https:\/\/t.co\/r8cfF8q2u5","expanded_url":"http:\/\/Askjelly.com","display_url":"Askjelly.com","indices":[58,81]}]}},"protected":false,"followers_count":2716335,"friends_count":693,"listed_count":21208,"created_at":"Tue Mar 21 20:51:43 +0000 2006","favourites_count":2692,"utc_offset":-25200,"time_zone":"Pacific Time (US & Canada)","geo_enabled":true,"verified":true,"statuses_count":6214,"lang":"en","contributors_enabled":false,"is_translator":false,"is_translation_enabled":false,"profile_background_color":"022330","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme15\/bg.png","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme15\/bg.png","profile_background_tile":false,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/679561536243761153\/Hbf3WwO6_normal.jpg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/679561536243761153\/Hbf3WwO6_normal.jpg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/13\/1349568220","profile_link_color":"0084B4","profile_sidebar_border_color":"A8C7F7","profile_sidebar_fill_color":"C0DFEC","profile_text_color":"333333","profile_use_background_image":true,"has_extended_profile":true,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"15990366":{"id":15990366,"id_str":"15990366","counts":{"saved_searches":0,"lists":{"subscribed":0,"owned":0}},"name":"Andrew Lunny","screen_name":"alunny","location":"Vancouver","description":"recovering gooner, @twitter curmudgeon","url":null,"entities":{"description":{"urls":[]}},"protected":false,"followers_count":1523,"friends_count":401,"listed_count":112,"created_at":"Tue Aug 26 01:09:08 +0000 2008","favourites_count":2418,"utc_offset":-25200,"time_zone":"Pacific Time (US & Canada)","geo_enabled":true,"verified":false,"statuses_count":5232,"lang":"en","contributors_enabled":false,"is_translator":false,"is_translation_enabled":false,"profile_background_color":"131516","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme14\/bg.gif","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme14\/bg.gif","profile_background_tile":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/627594097847472128\/Nzzt0Ykc_normal.jpg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/627594097847472128\/Nzzt0Ykc_normal.jpg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/15990366\/1428389769","profile_link_color":"066B4D","profile_sidebar_border_color":"FFFFFF","profile_sidebar_fill_color":"EFEFEF","profile_text_color":"333333","profile_use_background_image":true,"has_extended_profile":false,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"50653645":{"id":50653645,"id_str":"50653645","counts":{"saved_searches":0,"lists":{"subscribed":0,"owned":3}},"name":"James Broadhead","screen_name":"jamesbroadhead","location":"Londres, Angleterre","description":"Gentooist, pythonista and oboist. Working on @tweetdeck for @twitter.","url":null,"entities":{"description":{"urls":[]}},"protected":false,"followers_count":948,"friends_count":1114,"listed_count":46,"created_at":"Thu Jun 25 14:04:30 +0000 2009","favourites_count":6891,"utc_offset":-21600,"time_zone":"America\/Denver","geo_enabled":true,"verified":false,"statuses_count":9113,"lang":"en","contributors_enabled":false,"is_translator":false,"is_translation_enabled":false,"profile_background_color":"C0DEED","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_tile":false,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/3339716823\/ad833e14175b3caa6f21299519342087_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/3339716823\/ad833e14175b3caa6f21299519342087_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/50653645\/1352981524","profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"has_extended_profile":false,"default_profile":true,"default_profile_image":false,"following":true,"follow_request_sent":false,"notifications":false},"17198118":{"id":17198118,"id_str":"17198118","counts":{"saved_searches":0,"lists":{"subscribed":0,"owned":0}},"name":"Sam Saccone","screen_name":"samccone","location":"Mountain View, CA","description":"Software Engineer @google","url":"https:\/\/t.co\/t4VuIXcHYa","entities":{"url":{"urls":[{"url":"https:\/\/t.co\/t4VuIXcHYa","expanded_url":"http:\/\/github.com\/samccone","display_url":"github.com\/samccone","indices":[0,23]}]},"description":{"urls":[]}},"protected":false,"followers_count":2793,"friends_count":97,"listed_count":110,"created_at":"Wed Nov 05 21:30:36 +0000 2008","favourites_count":6519,"utc_offset":-18000,"time_zone":"Central Time (US & Canada)","geo_enabled":true,"verified":false,"statuses_count":10204,"lang":"en","contributors_enabled":false,"is_translator":false,"is_translation_enabled":false,"profile_background_color":"050505","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_tile":false,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/3275266259\/5ceb1b3f831115bd62e85b24ba5d8e4f_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/3275266259\/5ceb1b3f831115bd62e85b24ba5d8e4f_normal.jpeg","profile_link_color":"9266CC","profile_sidebar_border_color":"E07B00","profile_sidebar_fill_color":"10181C","profile_text_color":"ADADAD","profile_use_background_image":false,"has_extended_profile":true,"default_profile":false,"default_profile_image":false,"following":true,"follow_request_sent":false,"notifications":false},"4745674136":{"id":4745674136,"id_str":"4745674136","counts":{"saved_searches":0,"lists":{"subscribed":0,"owned":0}},"name":"Begin","screen_name":"begin","location":"San Francisco, CA","description":"Happier people and stronger teams don't do the most work \u2014 they do their best work.","url":"https:\/\/t.co\/Rh0KwyVp0K","entities":{"url":{"urls":[{"url":"https:\/\/t.co\/Rh0KwyVp0K","expanded_url":"https:\/\/begin.com\/","display_url":"begin.com","indices":[0,23]}]},"description":{"urls":[]}},"protected":false,"followers_count":376,"friends_count":6,"listed_count":3,"created_at":"Tue Jan 12 00:43:55 +0000 2016","favourites_count":2,"utc_offset":-25200,"time_zone":"Pacific Time (US & Canada)","geo_enabled":false,"verified":false,"statuses_count":29,"lang":"en","contributors_enabled":false,"is_translator":false,"is_translation_enabled":false,"profile_background_color":"000000","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_tile":false,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/710924965894160384\/pYEkHc8D_normal.jpg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/710924965894160384\/pYEkHc8D_normal.jpg","profile_link_color":"F2AC03","profile_sidebar_border_color":"000000","profile_sidebar_fill_color":"000000","profile_text_color":"000000","profile_use_background_image":false,"has_extended_profile":false,"default_profile":false,"default_profile_image":false,"following":true,"follow_request_sent":false,"notifications":false},"379875798":{"id":379875798,"id_str":"379875798","counts":{"saved_searches":0,"lists":{"subscribed":0,"owned":0}},"name":"jane frie(n)dhoff","screen_name":"JFriedhoff","location":"github.com\/friej715","description":"riot grrl gamedev | creative researcher @The_O_C_R | alumna @nytimes | @slamcityoracles | cofounder @codeliberation | member @DBAArcade | underslept&overexcited","url":"https:\/\/t.co\/llehUW59d5","entities":{"url":{"urls":[{"url":"https:\/\/t.co\/llehUW59d5","expanded_url":"http:\/\/janefriedhoff.com\/","display_url":"janefriedhoff.com","indices":[0,23]}]},"description":{"urls":[]}},"protected":false,"followers_count":1326,"friends_count":470,"listed_count":80,"created_at":"Sun Sep 25 18:16:22 +0000 2011","favourites_count":12307,"utc_offset":-18000,"time_zone":"Central Time (US & Canada)","geo_enabled":false,"verified":false,"statuses_count":8267,"lang":"en","contributors_enabled":false,"is_translator":false,"is_translation_enabled":false,"profile_background_color":"00728F","profile_background_image_url":"http:\/\/pbs.twimg.com\/profile_background_images\/545666727\/interactive_glitter_1.png","profile_background_image_url_https":"https:\/\/pbs.twimg.com\/profile_background_images\/545666727\/interactive_glitter_1.png","profile_background_tile":false,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/708800158591377408\/Qaw9iIOW_normal.jpg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/708800158591377408\/Qaw9iIOW_normal.jpg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/379875798\/1446149702","profile_link_color":"045F80","profile_sidebar_border_color":"000000","profile_sidebar_fill_color":"EFEFEF","profile_text_color":"333333","profile_use_background_image":false,"has_extended_profile":false,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"308665722":{"id":308665722,"id_str":"308665722","counts":{"saved_searches":0,"lists":{"subscribed":1,"owned":0}},"name":"Nolan Lawson","screen_name":"nolanlawson","location":"NYC","description":"Dual-wield Webomancer\/Android paladin. Currently: @Squarespace and @PouchDB. Formerly: CatLog, KeepScore, Pok\u00e9droid. Opinions expressed are mine.","url":"http:\/\/t.co\/B4s57WuWZL","entities":{"url":{"urls":[{"url":"http:\/\/t.co\/B4s57WuWZL","expanded_url":"http:\/\/nolanlawson.com","display_url":"nolanlawson.com","indices":[0,22]}]},"description":{"urls":[]}},"protected":false,"followers_count":2760,"friends_count":593,"listed_count":131,"created_at":"Tue May 31 19:59:13 +0000 2011","favourites_count":3273,"utc_offset":-14400,"time_zone":"Eastern Time (US & Canada)","geo_enabled":false,"verified":false,"statuses_count":5400,"lang":"en","contributors_enabled":false,"is_translator":false,"is_translation_enabled":false,"profile_background_color":"BADFCD","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme12\/bg.gif","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme12\/bg.gif","profile_background_tile":false,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/432810491988041728\/v_2KkjCm_normal.png","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/432810491988041728\/v_2KkjCm_normal.png","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/308665722\/1428343824","profile_link_color":"FF0000","profile_sidebar_border_color":"F2E195","profile_sidebar_fill_color":"FFF7CC","profile_text_color":"0C3E53","profile_use_background_image":true,"has_extended_profile":false,"default_profile":false,"default_profile_image":false,"following":true,"follow_request_sent":false,"notifications":false}},"custom_timelines":{},"moments":{}},"response":{"timeline":[{"entity_id":{"type":"tweet","ids":["1459233902542"]},"sort_index":"714704904825266176","tweet":{"id":"714704904825266176"}},{"entity_id":{"type":"tweet","ids":["1459129575511"]},"sort_index":"714267325541654528","tweet":{"id":"714267325541654528"}},{"entity_id":{"type":"tweet","ids":["1459045000492"]},"sort_index":"713912592201199616","tweet":{"id":"713912592201199616"}},{"entity_id":{"type":"tweet","ids":["1458942149970"]},"sort_index":"713481205845372928","tweet":{"id":"713481205845372928"}},{"entity_id":{"type":"tweet","ids":["1458888244285"]},"sort_index":"713255109015175170","tweet":{"id":"713255109015175170"}},{"entity_id":{"type":"tweet","ids":["1458842565048"]},"sort_index":"713063516408643584","tweet":{"id":"713063516408643584"}},{"entity_id":{"type":"tweet","ids":["1458689540691"]},"sort_index":"712421685735981057","tweet":{"id":"712421685735981057"}},{"entity_id":{"type":"tweet","ids":["1458597717990"]},"sort_index":"712036553414078466","tweet":{"id":"712036553414078466"}},{"entity_id":{"type":"tweet","ids":["1458591760984"]},"sort_index":"712011567919837188","tweet":{"id":"712011567919837188"}},{"entity_id":{"type":"tweet","ids":["1458325687957"]},"sort_index":"710895576758374400","tweet":{"id":"710895576758374400"}},{"entity_id":{"type":"tweet","ids":["1458077554088"]},"sort_index":"709854827879096320","tweet":{"id":"709854827879096320"}},{"entity_id":{"type":"tweet","ids":["1457980272171"]},"sort_index":"709446797945536512","tweet":{"id":"709446797945536512"}},{"entity_id":{"type":"tweet","ids":["1457910622090"]},"sort_index":"709154664332177408","tweet":{"id":"709154664332177408"}},{"entity_id":{"type":"tweet","ids":["1457556722075"]},"sort_index":"707670300083642368","tweet":{"id":"707670300083642368"}},{"follow_activity":{"user_id":"15990366","following_user_ids":["50653645","55323056","308665722","4745674136","17198118"]}},{"entity_id":{"type":"tweet","ids":["1457392436374"]},"sort_index":"706981235910782982","tweet":{"id":"706981235910782982"}},{"entity_id":{"type":"tweet","ids":["1457304543525"]},"sort_index":"706612586582667264","tweet":{"id":"706612586582667264"}},{"entity_id":{"type":"tweet","ids":["1457134356108"]},"sort_index":"705898768818896896","tweet":{"id":"705898768818896896"}},{"entity_id":{"type":"tweet","ids":["1457114580765"]},"sort_index":"705815825018707968","tweet":{"id":"705815825018707968"}},{"entity_id":{"type":"tweet","ids":["1457033942497"]},"sort_index":"705477603608506368","tweet":{"id":"705477603608506368"}}],"cursor":{"top":"1459233902542","bottom":"1457033942497","gaps":["bottom"]}}}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment