OSDN Git Service

Regular updates
[twpd/master.git] / assets / packed / app.js.map
1 {"version":3,"sources":["webpack:///app.js","webpack:////app/_js/helpers/store.js","webpack:////app/_js/helpers/dismiss.js","webpack:////app/_js/initializers /\\.js$/","webpack:////app/_js/initializers/onmount.js","webpack:////app/_js/helpers/preview.js","webpack:////app/_js/behaviors/disqus.js","webpack:////app/node_modules/dom101/matches.js","webpack:////app/_js/helpers/data.js","webpack:////app/_js/behaviors/search-form.js","webpack:////app/_js/helpers/search.js","webpack:////app/_js/behaviors/h3-section-list.js","webpack:////app/node_modules/dom101/query-selector-all.js","webpack:////app/_js/helpers/permutate.js","webpack:////app/node_modules/isotope-layout/dist/isotope.pkgd.js","webpack:////app/node_modules/dom101/closest.js","webpack:////app/node_modules/dom101/on.js","webpack:////app/node_modules/dom101/each.js","webpack:////app/_js/behaviors/dismissable.js","webpack:////app/_js/helpers/dom.js","webpack:////app/_js/behaviors/dismiss.js","webpack:////app/node_modules/dom101/remove-class.js","webpack:////app/_js/behaviors /\\.js$/","webpack:////app/_js/helpers/inject_disqus.js","webpack:////app/node_modules/dom101/prepend.js","webpack:////app/_js/helpers/qs.js","webpack:////app/_js/behaviors/no-preview.js","webpack:////app/node_modules/dom101/add-class.js","webpack:////app/_js/behaviors/anchors.js","webpack:////app/_js/behaviors/searchable-item.js","webpack:////app/node_modules/dom101/ready.js","webpack:////app/_js/behaviors/searchable-header.js","webpack:////app/node_modules/dom101/remove.js","webpack:////app/node_modules/onmount/index.js","webpack:////app/_js/app.js","webpack:////app/_js/behaviors/search-input.js"],"names":["webpackJsonp","/k7tj9kxRFhFtZjlt346","module","exports","__webpack_require__","update","key","fn","window","localStorage","data","JSON","parse","stringify","fetch","Object","defineProperty","value","2QOxTCxkuzN0PP2kJ2jn","setDismissed","id","Store","isDismissed","_store","obj","__esModule","newObj","prototype","hasOwnProperty","call","default","2tov+8o2NrZdw/Lg8JZA","webpackContext","req","webpackContextResolve","map","Error","./onmount.js","keys","resolve","6hLKOGpXaWUwTDQA5TL2","_interopRequireDefault","_ready","_ready2","_onmount","_onmount2","setTimeout","BF4TFfJ+K+wsuHfLZ/S3","isPreview","location","search","indexOf","BuWMdGeXUEK0GmkN01pU","_inject_disqus","_inject_disqus2","this","getAttribute","$parent","parentNode","setAttribute","disqus_config","page","url","identifier","addEventListener","host","removeAttribute","C2mk7N9JzKWlcOYJrkfi","matches","el","selector","_matches","matchesSelector","msMatchesSelector","mozMatchesSelector","webkitMatchesSelector","oMatchesSelector","nodes","querySelectorAll","i","length","CjZN/azBHJxH2NsOjfdD","val","getData","setData","str","D3SYMdNAenu80VOO7/Dv","_on","_on2","e","preventDefault","link","document","querySelector","href","DfTyEU8lscjHXmCMlptO","showAll","_querySelectorAll2","forEach","show","keywords","_permutate","splitwords","selectors","k","join","_querySelectorAll","E+dCGfS1pT5WowYv7jpv","_isotopePkgd","_isotopePkgd2","iso","itemSelector","transitionDuration","image","layout","EvxNxLK9yKFmn1U14Kvw","query","context","Array","slice","GOdGag34TlRuHa2OZoh9","permutate","words","slug","concat","permutateString","category","word","permutateWord","len","push","substr","toLowerCase","split","filter","GbzL7C/QFmiBZDICkla+","__WEBPACK_AMD_DEFINE_ARRAY__","__WEBPACK_AMD_DEFINE_RESULT__","__WEBPACK_LOCAL_MODULE_1__","__WEBPACK_LOCAL_MODULE_1__factory","__WEBPACK_LOCAL_MODULE_1__module","__WEBPACK_LOCAL_MODULE_2__","__WEBPACK_LOCAL_MODULE_3__","__WEBPACK_LOCAL_MODULE_3__factory","__WEBPACK_LOCAL_MODULE_3__module","__WEBPACK_LOCAL_MODULE_4__","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_LOCAL_MODULE_5__","__WEBPACK_LOCAL_MODULE_6__","__WEBPACK_LOCAL_MODULE_7__","__WEBPACK_LOCAL_MODULE_8__","__WEBPACK_LOCAL_MODULE_9__","__WEBPACK_LOCAL_MODULE_10__","__WEBPACK_LOCAL_MODULE_11__","__WEBPACK_LOCAL_MODULE_12__","factory","undefined","jQuery","apply","jQueryBridget","namespace","PluginClass","$","methodCall","$elems","methodName","args","returnValue","pluginMethodStr","each","elem","instance","logError","method","charAt","plainCall","options","option","_init","opts","isPlainObject","extend","arg0","arraySlice","arguments","updateJQuery","bridget","console","message","error","global","loaded","EvEmitter","proto","on","eventName","listener","events","_events","listeners","once","onceEvents","_onceEvents","off","index","splice","emitEvent","onceListeners","isOnce","getStyleSize","num","parseFloat","isNaN","noop","getZeroSize","size","width","height","innerWidth","innerHeight","outerWidth","outerHeight","measurementsLength","measurements","getStyle","style","getComputedStyle","setup","isSetup","div","createElement","padding","borderStyle","borderWidth","boxSizing","body","documentElement","appendChild","getSize","isBoxSizeOuter","removeChild","nodeType","display","offsetWidth","offsetHeight","isBorderBox","measurement","paddingWidth","paddingLeft","paddingRight","paddingHeight","paddingTop","paddingBottom","marginWidth","marginLeft","marginRight","marginHeight","marginTop","marginBottom","borderLeftWidth","borderRightWidth","borderHeight","borderTopWidth","borderBottomWidth","isBorderBoxSizeOuter","styleWidth","styleHeight","matchesMethod","ElemProto","Element","prefixes","prefix","utils","a","b","prop","modulo","makeArray","ary","isArray","removeFrom","getParent","getQueryElement","handleEvent","event","type","filterFindElements","elems","ffElems","HTMLElement","childElems","debounceMethod","_class","threshold","timeoutName","timeout","clearTimeout","_this","docReady","callback","readyState","toDashed","replace","match","$1","$2","htmlInit","WidgetClass","dashedNamespace","dataAttr","dataAttrElems","jsDashElems","dataOptionsAttr","attr","className","isEmptyObj","Item","element","position","x","y","_create","docElemStyle","transitionProperty","transition","transformProperty","transform","transitionEndEvent","WebkitTransition","vendorProperties","transitionDelay","create","constructor","_transn","ingProperties","clean","onEnd","css","elemStyle","getPosition","isOriginLeft","_getOption","isOriginTop","xValue","yValue","layoutSize","parseInt","layoutPosition","xPadding","xProperty","xResetProperty","getXValue","yPadding","yProperty","yResetProperty","getYValue","isHorizontal","percentPosition","_transitionTo","curX","curY","compareX","compareY","didNotMove","setPosition","isTransitioning","transX","transY","transitionStyle","getTranslate","to","onTransitionEnd","isCleaning","goTo","moveTo","_nonTransition","_removeStyles","_transition","from","enableTransition","transitionProps","duration","staggerDelay","onwebkitTransitionEnd","ontransitionend","onotransitionend","dashedVendorProperties","-webkit-transform","target","propertyName","disableTransition","removeTransitionStyles","removeEventListener","cleanStyle","cleanTransitionStyle","stagger","delay","removeElem","remove","hide","reveal","isHidden","getHideRevealTransitionEndProperty","onRevealTransitionEnd","hiddenStyle","visibleStyle","styleProperty","optionStyle","opacity","onHideTransitionEnd","destroy","left","right","top","bottom","Outlayer","queryElement","$element","defaults","GUID","outlayerGUID","instances","subclass","Parent","SubClass","getMilliseconds","time","unit","msUnits","containerStyle","initLayout","originLeft","originTop","resize","resizeContainer","oldOption","compatOptions","horizontal","layoutInstant","reloadItems","stamps","stamp","bindResize","items","_itemize","children","itemElems","_filterFindItemElements","item","getItemElements","_resetLayout","_manageStamps","isInstant","_isLayoutInited","layoutItems","_getMeasurement","_getItemsForLayout","_layoutItems","_postLayout","isIgnored","_emitCompleteOnItems","queue","_getItemLayoutPosition","isLayoutInstant","_processLayoutQueue","updateStagger","_positionItem","_getContainerSize","_setContainerMeasure","measure","isWidth","elemSize","Math","max","onComplete","dispatchEvent","tick","doneCount","count","emitArgs","$event","Event","trigger","ignore","getItem","unignore","_find","unstamp","_getBoundingRect","_manageStamp","boundingRect","getBoundingClientRect","_boundingRect","_getElementOffset","thisRect","isResizeBound","unbindResize","onresize","needsResizeLayout","addItems","appended","prepended","previousItems","revealItemElements","getItems","hideItemElements","removeItems","removeData","Layout","ms","s","itemGUID","sortData","updateSortData","random","getSortData","sorters","_sorters","sorter","_destroy","LayoutMode","isotope","filteredItems","needsVerticalResizeLayout","getColumnWidth","getSegmentSize","getRowHeight","segment","segmentName","outerSize","firstItemSize","getFirstItemSize","firstItem","modes","Mode","Masonry","fitWidth","measureColumns","colYs","cols","maxY","horizontalColIndex","getContainerWidth","columnWidth","firstItemElem","containerWidth","gutter","excess","mathMethod","isFitWidth","container","remainder","colSpan","min","colPosMethod","horizontalOrder","colPosition","col","setHeight","setMax","_getTopColPosition","colGroup","_getTopColGroup","minimumY","groupCount","_getColGroupY","groupColYs","_getHorizontalColPosition","hasSize","stampSize","offset","firstX","lastX","firstCol","floor","lastCol","stampMaxY","_getContainerFitWidth","unusedCols","previousWidth","MasonryMode","keepModeMethods","FitRows","itemWidth","Vertical","horizontalAlignment","getItemSorter","sortBys","sortAsc","itemA","itemB","sortBy","isAscending","direction","trim","String","Isotope","layoutMode","isJQueryFiltering","sortAscending","_getSorters","sortHistory","name","_initLayoutMode","_updateItemsSortData","initialOpts","arrange","_layout","_getIsInstant","filtered","_filter","_bindArrangeComplete","_isInstant","_noTransition","_hideReveal","_sort","needReveal","needHide","arrangeParallelCallback","isLayoutComplete","isHideComplete","isRevealComplete","hiddenMatched","visibleUnmatched","test","_getFilterTest","isMatched","is","mungeSorter","attrMatch","getValue","getValueGetter","parser","sortDataParsers","child","textContent","_getIsSameSortBy","itemSorter","sort","_mode","mode","_filterRevealAdded","insert","filteredInsertItems","_remove","shuffle","getFilteredItemElements","Gz0TuoFFs6JdDvtR2PYZ","closest","sel","MKJaVdnD9jF7rk6rW6AJ","handler","attachEvent","O7wD3s+p+jjyw5ivWGEg","list","idx","XxGrbZud7DE4W4TdQZtc","_remove2","_removeClass","_removeClass2","_data","_dismiss","_preview","ahJreyGRfWuLMDCl+A3L","_toConsumableArray","arr","arr2","appendMany","nextUntil","nextUntilTick","nextSibling","acc","_matches2","before","reference","newNode","insertBefore","findChildren","createDiv","props","d","azEBDvunS5n/qbuQInIF","_closest","_closest2","Dismiss","parent","dismissable","bq+j3PCtCSGVXgg8xWPw","removeClass","classList","classNames","Boolean","expr","RegExp","cBdQffYQOU2SCSRXjSUx","./anchors.js","./dismiss.js","./dismissable.js","./disqus.js","./h3-section-list.js","./main-body.js","./no-preview.js","./search-form.js","./search-input.js","./searchable-header.js","./searchable-item.js","cYqQDyTPtD7lV79ovj4Y","inject","injectEmbed","injectCount","src","Date","head","async","djrEhtin0g5nRB/RnnLU","prepend","firstChild","g2okcHDGBNRpe9zqR9sR","g3wkw0XZUos0Eo8rU7p6","j059HZGO2uzpV/UZMXr3","qs","p","reduce","result","part","qsdecode","string","k6EYej2Qda8Mq9A5Oeqn","_addClass","_addClass2","lGfezzQL7fc5RE8kg33g","addClass","add","lpgA2dewefHNQWX4X3Mh","_prepend","_prepend2","DEFAULTS","rule","text","shouldAppend","rules","assign","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","Symbol","iterator","next","done","_ref","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","hasAttribute","anchor","innerText","err","return","tcev71HWHlq3Ur/sw7Ir","_permutate2","tqbVxj9+xGAhlFrQpyTS","ready","isReady","veOabZWTWtixkn1TyITD","_dom","els","n","wYegCzKWCG2ZRJZfGEZa","yfX/NEeqeNrvWENPWWKS","root","onmount","init","exit","isjQuery","isEvent","poll","be","Behavior","behaviors","register","bid","selectify","detectMutate","isAttached","parentElement","eachOf","has","handlers","noConflict","log","cid","Zepto","Ender","MutationObserver","WebKitMutationObserver","MozMutationObserver","debug","observe","obs","mutations","mutation","addedNodes","visitEnter","removedNodes","doExit","subtree","childList","observer","unobserve","disconnect","teardown","reset","visitExit","styles","enter","navigator","userAgent","z+w/DGZianwIMo5d4qOD","requireAll","r","Prism","zNHHVy5XxvKjnqTgwxy7","_search","Search","_qs","_qs2","q"],"mappings":"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","file":"app.js","sourcesContent":["webpackJsonp([0],{\n\n/***/ \"/k7tj9kxRFhFtZjlt346\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.update = update;\nexports.fetch = fetch;\n/**\n * Updates a local storage key. If it doesn't exist, it defaults to an empty\n * object.\n *\n * @example\n *     update('dismissed', (data) => {\n *       data.lol = true\n *       return data\n *     })\n */\n\nfunction update(key, fn) {\n  if (!window.localStorage) return;\n  var data = JSON.parse(window.localStorage[key] || '{}');\n  data = fn(data);\n  window.localStorage[key] = JSON.stringify(data);\n}\n\n/**\n * Fetches a local storage key.\n *\n * @example\n *     const data = fetch('dismissed')\n */\n\nfunction fetch(key) {\n  if (!window.localStorage) return;\n  return JSON.parse(window.localStorage[key] || '{}');\n}\n\n/***/ }),\n\n/***/ \"2QOxTCxkuzN0PP2kJ2jn\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.setDismissed = setDismissed;\nexports.isDismissed = isDismissed;\n\nvar _store = __webpack_require__(\"/k7tj9kxRFhFtZjlt346\");\n\nvar Store = _interopRequireWildcard(_store);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\n/**\n * Dismisses an announcement.\n *\n * @example\n *     setDismissed('2017-09-02-happy-birthday')\n */\n\nfunction setDismissed(id) {\n  Store.update('dismissed', function (data) {\n    data[id] = true;\n    return data;\n  });\n}\n\n/**\n * Checks if an announcement has been dismissed before.\n *\n * @example\n *     setDismissed('2017-09-02-happy-birthday')\n *     isDismissed('2017-09-02-happy-birthday') => true\n */\n\nfunction isDismissed(id) {\n  var data = Store.fetch('dismissed');\n  return data && data[id];\n}\n\n/***/ }),\n\n/***/ \"2tov+8o2NrZdw/Lg8JZA\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar map = {\n\t\"./onmount.js\": \"6hLKOGpXaWUwTDQA5TL2\"\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"2tov+8o2NrZdw/Lg8JZA\";\n\n/***/ }),\n\n/***/ \"6hLKOGpXaWUwTDQA5TL2\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _ready = __webpack_require__(\"tqbVxj9+xGAhlFrQpyTS\");\n\nvar _ready2 = _interopRequireDefault(_ready);\n\nvar _onmount = __webpack_require__(\"yfX/NEeqeNrvWENPWWKS\");\n\nvar _onmount2 = _interopRequireDefault(_onmount);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Behavior: Wrapping\n */\n\n(0, _ready2.default)(function () {\n  setTimeout(function () {\n    (0, _onmount2.default)();\n  });\n});\n\n/***/ }),\n\n/***/ \"BF4TFfJ+K+wsuHfLZ/S3\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.isPreview = isPreview;\n/**\n * Checks if we're in preview mode (?preview=1).\n */\n\nfunction isPreview() {\n  return window.location.search.indexOf('preview=1') !== -1;\n}\n\n/***/ }),\n\n/***/ \"BuWMdGeXUEK0GmkN01pU\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _onmount = __webpack_require__(\"yfX/NEeqeNrvWENPWWKS\");\n\nvar _onmount2 = _interopRequireDefault(_onmount);\n\nvar _inject_disqus = __webpack_require__(\"cYqQDyTPtD7lV79ovj4Y\");\n\nvar _inject_disqus2 = _interopRequireDefault(_inject_disqus);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Delay disqus by some time. It's at the bottom of the page, there's no need\n * for it to load fast. This will give more time to load more critical assets.\n */\n\nvar DISQUS_DELAY = 100;\n\n/**\n * Injects Disqus onto the page.\n */\n\n(0, _onmount2.default)('[data-js-disqus]', function () {\n  var data = JSON.parse(this.getAttribute('data-js-disqus'));\n  var $parent = this.parentNode;\n  $parent.setAttribute('hidden', true);\n\n  window.disqus_config = function () {\n    this.page.url = data.url;\n    this.page.identifier = data.identifier;\n  };\n\n  // Disqus takes a while to load, don't do it so eagerly.\n  window.addEventListener('load', function () {\n    setTimeout(function () {\n      (0, _inject_disqus2.default)(data.host);\n      $parent.removeAttribute('hidden');\n    }, DISQUS_DELAY);\n  });\n});\n\n/***/ }),\n\n/***/ \"C2mk7N9JzKWlcOYJrkfi\":\n/***/ (function(module, exports) {\n\n/**\n * matches : matches(el, selector)\n * Checks if a given element `el` matches `selector`.\n * Compare with [$.fn.is](http://api.jquery.com/is/).\n *\n *     var matches = require('dom101/matches');\n *\n *     matches(button, ':focus');\n */\n\nfunction matches (el, selector) {\n  var _matches = el.matches ||\n    el.matchesSelector ||\n    el.msMatchesSelector ||\n    el.mozMatchesSelector ||\n    el.webkitMatchesSelector ||\n    el.oMatchesSelector\n\n  if (_matches) {\n    return _matches.call(el, selector)\n  } else if (el.parentNode) {\n    // IE8 and below\n    var nodes = el.parentNode.querySelectorAll(selector)\n    for (var i = nodes.length; i--; 0) {\n      if (nodes[i] === el) return true\n    }\n    return false\n  }\n}\n\nmodule.exports = matches\n\n\n/***/ }),\n\n/***/ \"CjZN/azBHJxH2NsOjfdD\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.data = data;\nexports.getData = getData;\nexports.setData = setData;\n/**\n * Stores and retrieves data from an element. Works like jQuery.data().\n */\n\nfunction data(el, key, val) {\n  if (typeof val !== 'undefined') {\n    return getData(el, key);\n  } else {\n    return setData(el, key, val);\n  }\n}\n\nfunction getData(el, key) {\n  var str = el.getAttribute('data-' + key);\n  return JSON.parse(str || '{}');\n}\n\nfunction setData(el, key, val) {\n  el.setAttribute('data-' + key, JSON.stringify(val));\n}\n\n/***/ }),\n\n/***/ \"D3SYMdNAenu80VOO7/Dv\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _onmount = __webpack_require__(\"yfX/NEeqeNrvWENPWWKS\");\n\nvar _onmount2 = _interopRequireDefault(_onmount);\n\nvar _on = __webpack_require__(\"MKJaVdnD9jF7rk6rW6AJ\");\n\nvar _on2 = _interopRequireDefault(_on);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Submitting the search form\n */\n\n(0, _onmount2.default)('[data-js-search-form]', function () {\n  (0, _on2.default)(this, 'submit', function (e) {\n    e.preventDefault();\n\n    var link = document.querySelector('a[data-search-index]:visible');\n    var href = link && link.getAttribute('href');\n\n    if (href) window.location = href;\n  });\n});\n\n/***/ }),\n\n/***/ \"DfTyEU8lscjHXmCMlptO\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.showAll = showAll;\nexports.show = show;\n\nvar _permutate = __webpack_require__(\"GOdGag34TlRuHa2OZoh9\");\n\nvar _querySelectorAll = __webpack_require__(\"EvxNxLK9yKFmn1U14Kvw\");\n\nvar _querySelectorAll2 = _interopRequireDefault(_querySelectorAll);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Show everything.\n *\n * @example\n *     Search.showAll()\n */\n\nfunction showAll() {\n  (0, _querySelectorAll2.default)('[data-search-index]').forEach(function (el) {\n    el.removeAttribute('aria-hidden');\n  });\n}\n\n/**\n * Search for a given keyword.\n *\n * @example\n *     Search.show('hello')\n */\n\nfunction show(val) {\n  var keywords = (0, _permutate.splitwords)(val);\n\n  if (!keywords.length) return showAll();\n\n  var selectors = keywords.map(function (k) {\n    return '[data-search-index~=' + JSON.stringify(k) + ']';\n  }).join('');\n\n  (0, _querySelectorAll2.default)('[data-search-index]').forEach(function (el) {\n    el.setAttribute('aria-hidden', true);\n  });\n\n  (0, _querySelectorAll2.default)(selectors).forEach(function (el) {\n    el.removeAttribute('aria-hidden');\n  });\n}\n\n/***/ }),\n\n/***/ \"E+dCGfS1pT5WowYv7jpv\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _isotopePkgd = __webpack_require__(\"GbzL7C/QFmiBZDICkla+\");\n\nvar _isotopePkgd2 = _interopRequireDefault(_isotopePkgd);\n\nvar _onmount = __webpack_require__(\"yfX/NEeqeNrvWENPWWKS\");\n\nvar _onmount2 = _interopRequireDefault(_onmount);\n\nvar _on = __webpack_require__(\"MKJaVdnD9jF7rk6rW6AJ\");\n\nvar _on2 = _interopRequireDefault(_on);\n\nvar _querySelectorAll = __webpack_require__(\"EvxNxLK9yKFmn1U14Kvw\");\n\nvar _querySelectorAll2 = _interopRequireDefault(_querySelectorAll);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/*\n * Behavior: Isotope\n */\n\n/* eslint-disable no-new */\n\n(0, _onmount2.default)('[data-js-h3-section-list]', function () {\n  var iso = new _isotopePkgd2.default(this, {\n    itemSelector: '.h3-section',\n    transitionDuration: 0\n  });\n\n  var images = (0, _querySelectorAll2.default)('img', this);\n\n  images.forEach(function (image) {\n    (0, _on2.default)(image, 'load', function () {\n      iso.layout();\n    });\n  });\n\n  // Insurance against weirdness on pages like devhints.io/vim, where the\n  // critical path CSS may look different from the final CSS (because of the\n  // tables).\n  (0, _on2.default)(window, 'load', function () {\n    iso.layout();\n  });\n});\n\n/***/ }),\n\n/***/ \"EvxNxLK9yKFmn1U14Kvw\":\n/***/ (function(module, exports) {\n\n/**\n * querySelectorAll : querySelectorAll(query, [element])\n * Convenience function to access `document.querySelectorAll`. Unlike the\n * default version, this always returns an array.\n *\n * If a 2nd parameter `element` is given, it only searches for descendants of\n * that element.\n *\n *     var each = require('dom101/each');\n *     var qsa = require('dom101/query-selector-all');\n *\n *     qsa('.button').each(el => {\n *       addClass('el', 'selected');\n *     };\n */\n\nfunction querySelectorAll (query, context) {\n  return Array.prototype.slice.call(\n    (context || document).querySelectorAll(query)\n  )\n}\n\nmodule.exports = querySelectorAll\n\n\n/***/ }),\n\n/***/ \"GOdGag34TlRuHa2OZoh9\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = permutate;\nexports.permutateString = permutateString;\nexports.permutateWord = permutateWord;\nexports.splitwords = splitwords;\n/**\n * Permutates a searcheable item.\n *\n *     permutate({\n *       slug: 'hello-world',\n *       category: 'greetings'\n *     })\n */\n\nfunction permutate(data) {\n  var words = [];\n  if (data.slug) {\n    words = words.concat(permutateString(data.slug));\n  }\n  if (data.category) {\n    words = words.concat(permutateString(data.category));\n  }\n  return words;\n}\n\n/**\n * Permutates strings.\n *\n * @example\n *     permutateString('hi joe')\n *     => ['h', 'hi', 'j', 'jo', 'joe']\n */\n\nfunction permutateString(str) {\n  var words = [];\n  var inputs = splitwords(str);\n\n  inputs.forEach(function (word) {\n    words = words.concat(permutateWord(word));\n  });\n\n  return words;\n}\n\n/**\n * Permutates a word.\n *\n * @example\n *     permutateWord('hello')\n *     => ['h', 'he', 'hel', 'hell', 'hello']\n */\n\nfunction permutateWord(str) {\n  var words = [];\n  var len = str.length;\n  for (var i = 1; i <= len; ++i) {\n    words.push(str.substr(0, i));\n  }\n  return words;\n}\n\n/**\n * Helper for splitting to words.\n *\n * @example\n *     splitWords('Hello, world!')\n *     => ['hello', 'world']\n */\n\nfunction splitwords(str) {\n  var words = str.toLowerCase().split(/[ /\\-_]/).filter(function (k) {\n    return k && k.length !== 0;\n  });\n\n  return words;\n}\n\n/***/ }),\n\n/***/ \"GbzL7C/QFmiBZDICkla+\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __WEBPACK_LOCAL_MODULE_1__, __WEBPACK_LOCAL_MODULE_1__factory, __WEBPACK_LOCAL_MODULE_1__module;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_LOCAL_MODULE_2__;var __WEBPACK_LOCAL_MODULE_3__, __WEBPACK_LOCAL_MODULE_3__factory, __WEBPACK_LOCAL_MODULE_3__module;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_LOCAL_MODULE_4__;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_LOCAL_MODULE_5__;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_LOCAL_MODULE_6__;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_LOCAL_MODULE_7__;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_LOCAL_MODULE_8__;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_LOCAL_MODULE_9__;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_LOCAL_MODULE_10__;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_LOCAL_MODULE_11__;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_LOCAL_MODULE_12__;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * Isotope PACKAGED v3.0.4\n *\n * Licensed GPLv3 for open source use\n * or Isotope Commercial License for commercial use\n *\n * http://isotope.metafizzy.co\n * Copyright 2017 Metafizzy\n */\n\n/**\n * Bridget makes jQuery widgets\n * v2.0.1\n * MIT license\n */\n\n/* jshint browser: true, strict: true, undef: true, unused: true */\n\n( function( window, factory ) {\n  // universal module definition\n  /*jshint strict: false */ /* globals define, module, require */\n  if ( true ) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(\"g2okcHDGBNRpe9zqR9sR\") ], __WEBPACK_AMD_DEFINE_RESULT__ = function( jQuery ) {\n      return factory( window, jQuery );\n    }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('jquery')\n    );\n  } else {\n    // browser global\n    window.jQueryBridget = factory(\n      window,\n      window.jQuery\n    );\n  }\n\n}( window, function factory( window, jQuery ) {\n'use strict';\n\n// ----- utils ----- //\n\nvar arraySlice = Array.prototype.slice;\n\n// helper function for logging errors\n// $.error breaks jQuery chaining\nvar console = window.console;\nvar logError = typeof console == 'undefined' ? function() {} :\n  function( message ) {\n    console.error( message );\n  };\n\n// ----- jQueryBridget ----- //\n\nfunction jQueryBridget( namespace, PluginClass, $ ) {\n  $ = $ || jQuery || window.jQuery;\n  if ( !$ ) {\n    return;\n  }\n\n  // add option method -> $().plugin('option', {...})\n  if ( !PluginClass.prototype.option ) {\n    // option setter\n    PluginClass.prototype.option = function( opts ) {\n      // bail out if not an object\n      if ( !$.isPlainObject( opts ) ){\n        return;\n      }\n      this.options = $.extend( true, this.options, opts );\n    };\n  }\n\n  // make jQuery plugin\n  $.fn[ namespace ] = function( arg0 /*, arg1 */ ) {\n    if ( typeof arg0 == 'string' ) {\n      // method call $().plugin( 'methodName', { options } )\n      // shift arguments by 1\n      var args = arraySlice.call( arguments, 1 );\n      return methodCall( this, arg0, args );\n    }\n    // just $().plugin({ options })\n    plainCall( this, arg0 );\n    return this;\n  };\n\n  // $().plugin('methodName')\n  function methodCall( $elems, methodName, args ) {\n    var returnValue;\n    var pluginMethodStr = '$().' + namespace + '(\"' + methodName + '\")';\n\n    $elems.each( function( i, elem ) {\n      // get instance\n      var instance = $.data( elem, namespace );\n      if ( !instance ) {\n        logError( namespace + ' not initialized. Cannot call methods, i.e. ' +\n          pluginMethodStr );\n        return;\n      }\n\n      var method = instance[ methodName ];\n      if ( !method || methodName.charAt(0) == '_' ) {\n        logError( pluginMethodStr + ' is not a valid method' );\n        return;\n      }\n\n      // apply method, get return value\n      var value = method.apply( instance, args );\n      // set return value if value is returned, use only first value\n      returnValue = returnValue === undefined ? value : returnValue;\n    });\n\n    return returnValue !== undefined ? returnValue : $elems;\n  }\n\n  function plainCall( $elems, options ) {\n    $elems.each( function( i, elem ) {\n      var instance = $.data( elem, namespace );\n      if ( instance ) {\n        // set options & init\n        instance.option( options );\n        instance._init();\n      } else {\n        // initialize new instance\n        instance = new PluginClass( elem, options );\n        $.data( elem, namespace, instance );\n      }\n    });\n  }\n\n  updateJQuery( $ );\n\n}\n\n// ----- updateJQuery ----- //\n\n// set $.bridget for v1 backwards compatibility\nfunction updateJQuery( $ ) {\n  if ( !$ || ( $ && $.bridget ) ) {\n    return;\n  }\n  $.bridget = jQueryBridget;\n}\n\nupdateJQuery( jQuery || window.jQuery );\n\n// -----  ----- //\n\nreturn jQueryBridget;\n\n}));\n\n/**\n * EvEmitter v1.0.3\n * Lil' event emitter\n * MIT License\n */\n\n/* jshint unused: true, undef: true, strict: true */\n\n( function( global, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /* globals define, module, window */\n  if ( true ) {\n    // AMD - RequireJS\n    !(__WEBPACK_LOCAL_MODULE_1__factory = (factory), (__WEBPACK_LOCAL_MODULE_1__module = { id: \"ev-emitter/ev-emitter\", exports: {}, loaded: false }), __WEBPACK_LOCAL_MODULE_1__ = (typeof __WEBPACK_LOCAL_MODULE_1__factory === 'function' ? (__WEBPACK_LOCAL_MODULE_1__factory.call(__WEBPACK_LOCAL_MODULE_1__module.exports, __webpack_require__, __WEBPACK_LOCAL_MODULE_1__module.exports, __WEBPACK_LOCAL_MODULE_1__module)) : __WEBPACK_LOCAL_MODULE_1__factory), (__WEBPACK_LOCAL_MODULE_1__module.loaded = true), __WEBPACK_LOCAL_MODULE_1__ === undefined && (__WEBPACK_LOCAL_MODULE_1__ = __WEBPACK_LOCAL_MODULE_1__module.exports));\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS - Browserify, Webpack\n    module.exports = factory();\n  } else {\n    // Browser globals\n    global.EvEmitter = factory();\n  }\n\n}( typeof window != 'undefined' ? window : this, function() {\n\n\n\nfunction EvEmitter() {}\n\nvar proto = EvEmitter.prototype;\n\nproto.on = function( eventName, listener ) {\n  if ( !eventName || !listener ) {\n    return;\n  }\n  // set events hash\n  var events = this._events = this._events || {};\n  // set listeners array\n  var listeners = events[ eventName ] = events[ eventName ] || [];\n  // only add once\n  if ( listeners.indexOf( listener ) == -1 ) {\n    listeners.push( listener );\n  }\n\n  return this;\n};\n\nproto.once = function( eventName, listener ) {\n  if ( !eventName || !listener ) {\n    return;\n  }\n  // add event\n  this.on( eventName, listener );\n  // set once flag\n  // set onceEvents hash\n  var onceEvents = this._onceEvents = this._onceEvents || {};\n  // set onceListeners object\n  var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\n  // set flag\n  onceListeners[ listener ] = true;\n\n  return this;\n};\n\nproto.off = function( eventName, listener ) {\n  var listeners = this._events && this._events[ eventName ];\n  if ( !listeners || !listeners.length ) {\n    return;\n  }\n  var index = listeners.indexOf( listener );\n  if ( index != -1 ) {\n    listeners.splice( index, 1 );\n  }\n\n  return this;\n};\n\nproto.emitEvent = function( eventName, args ) {\n  var listeners = this._events && this._events[ eventName ];\n  if ( !listeners || !listeners.length ) {\n    return;\n  }\n  var i = 0;\n  var listener = listeners[i];\n  args = args || [];\n  // once stuff\n  var onceListeners = this._onceEvents && this._onceEvents[ eventName ];\n\n  while ( listener ) {\n    var isOnce = onceListeners && onceListeners[ listener ];\n    if ( isOnce ) {\n      // remove listener\n      // remove before trigger to prevent recursion\n      this.off( eventName, listener );\n      // unset once flag\n      delete onceListeners[ listener ];\n    }\n    // trigger listener\n    listener.apply( this, args );\n    // get next listener\n    i += isOnce ? 0 : 1;\n    listener = listeners[i];\n  }\n\n  return this;\n};\n\nreturn EvEmitter;\n\n}));\n\n/*!\n * getSize v2.0.2\n * measure size of elements\n * MIT license\n */\n\n/*jshint browser: true, strict: true, undef: true, unused: true */\n/*global define: false, module: false, console: false */\n\n( function( window, factory ) {\n  'use strict';\n\n  if ( true ) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_LOCAL_MODULE_2__ = (function() {\n      return factory();\n    }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)));\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory();\n  } else {\n    // browser global\n    window.getSize = factory();\n  }\n\n})( window, function factory() {\n'use strict';\n\n// -------------------------- helpers -------------------------- //\n\n// get a number from a string, not a percentage\nfunction getStyleSize( value ) {\n  var num = parseFloat( value );\n  // not a percent like '100%', and a number\n  var isValid = value.indexOf('%') == -1 && !isNaN( num );\n  return isValid && num;\n}\n\nfunction noop() {}\n\nvar logError = typeof console == 'undefined' ? noop :\n  function( message ) {\n    console.error( message );\n  };\n\n// -------------------------- measurements -------------------------- //\n\nvar measurements = [\n  'paddingLeft',\n  'paddingRight',\n  'paddingTop',\n  'paddingBottom',\n  'marginLeft',\n  'marginRight',\n  'marginTop',\n  'marginBottom',\n  'borderLeftWidth',\n  'borderRightWidth',\n  'borderTopWidth',\n  'borderBottomWidth'\n];\n\nvar measurementsLength = measurements.length;\n\nfunction getZeroSize() {\n  var size = {\n    width: 0,\n    height: 0,\n    innerWidth: 0,\n    innerHeight: 0,\n    outerWidth: 0,\n    outerHeight: 0\n  };\n  for ( var i=0; i < measurementsLength; i++ ) {\n    var measurement = measurements[i];\n    size[ measurement ] = 0;\n  }\n  return size;\n}\n\n// -------------------------- getStyle -------------------------- //\n\n/**\n * getStyle, get style of element, check for Firefox bug\n * https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n */\nfunction getStyle( elem ) {\n  var style = getComputedStyle( elem );\n  if ( !style ) {\n    logError( 'Style returned ' + style +\n      '. Are you running this code in a hidden iframe on Firefox? ' +\n      'See http://bit.ly/getsizebug1' );\n  }\n  return style;\n}\n\n// -------------------------- setup -------------------------- //\n\nvar isSetup = false;\n\nvar isBoxSizeOuter;\n\n/**\n * setup\n * check isBoxSizerOuter\n * do on first getSize() rather than on page load for Firefox bug\n */\nfunction setup() {\n  // setup once\n  if ( isSetup ) {\n    return;\n  }\n  isSetup = true;\n\n  // -------------------------- box sizing -------------------------- //\n\n  /**\n   * WebKit measures the outer-width on style.width on border-box elems\n   * IE & Firefox<29 measures the inner-width\n   */\n  var div = document.createElement('div');\n  div.style.width = '200px';\n  div.style.padding = '1px 2px 3px 4px';\n  div.style.borderStyle = 'solid';\n  div.style.borderWidth = '1px 2px 3px 4px';\n  div.style.boxSizing = 'border-box';\n\n  var body = document.body || document.documentElement;\n  body.appendChild( div );\n  var style = getStyle( div );\n\n  getSize.isBoxSizeOuter = isBoxSizeOuter = getStyleSize( style.width ) == 200;\n  body.removeChild( div );\n\n}\n\n// -------------------------- getSize -------------------------- //\n\nfunction getSize( elem ) {\n  setup();\n\n  // use querySeletor if elem is string\n  if ( typeof elem == 'string' ) {\n    elem = document.querySelector( elem );\n  }\n\n  // do not proceed on non-objects\n  if ( !elem || typeof elem != 'object' || !elem.nodeType ) {\n    return;\n  }\n\n  var style = getStyle( elem );\n\n  // if hidden, everything is 0\n  if ( style.display == 'none' ) {\n    return getZeroSize();\n  }\n\n  var size = {};\n  size.width = elem.offsetWidth;\n  size.height = elem.offsetHeight;\n\n  var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';\n\n  // get all measurements\n  for ( var i=0; i < measurementsLength; i++ ) {\n    var measurement = measurements[i];\n    var value = style[ measurement ];\n    var num = parseFloat( value );\n    // any 'auto', 'medium' value will be 0\n    size[ measurement ] = !isNaN( num ) ? num : 0;\n  }\n\n  var paddingWidth = size.paddingLeft + size.paddingRight;\n  var paddingHeight = size.paddingTop + size.paddingBottom;\n  var marginWidth = size.marginLeft + size.marginRight;\n  var marginHeight = size.marginTop + size.marginBottom;\n  var borderWidth = size.borderLeftWidth + size.borderRightWidth;\n  var borderHeight = size.borderTopWidth + size.borderBottomWidth;\n\n  var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;\n\n  // overwrite width and height if we can get it from style\n  var styleWidth = getStyleSize( style.width );\n  if ( styleWidth !== false ) {\n    size.width = styleWidth +\n      // add padding and border unless it's already including it\n      ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth );\n  }\n\n  var styleHeight = getStyleSize( style.height );\n  if ( styleHeight !== false ) {\n    size.height = styleHeight +\n      // add padding and border unless it's already including it\n      ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight );\n  }\n\n  size.innerWidth = size.width - ( paddingWidth + borderWidth );\n  size.innerHeight = size.height - ( paddingHeight + borderHeight );\n\n  size.outerWidth = size.width + marginWidth;\n  size.outerHeight = size.height + marginHeight;\n\n  return size;\n}\n\nreturn getSize;\n\n});\n\n/**\n * matchesSelector v2.0.2\n * matchesSelector( element, '.selector' )\n * MIT license\n */\n\n/*jshint browser: true, strict: true, undef: true, unused: true */\n\n( function( window, factory ) {\n  /*global define: false, module: false */\n  'use strict';\n  // universal module definition\n  if ( true ) {\n    // AMD\n    !(__WEBPACK_LOCAL_MODULE_3__factory = (factory), (__WEBPACK_LOCAL_MODULE_3__module = { id: \"desandro-matches-selector/matches-selector\", exports: {}, loaded: false }), __WEBPACK_LOCAL_MODULE_3__ = (typeof __WEBPACK_LOCAL_MODULE_3__factory === 'function' ? (__WEBPACK_LOCAL_MODULE_3__factory.call(__WEBPACK_LOCAL_MODULE_3__module.exports, __webpack_require__, __WEBPACK_LOCAL_MODULE_3__module.exports, __WEBPACK_LOCAL_MODULE_3__module)) : __WEBPACK_LOCAL_MODULE_3__factory), (__WEBPACK_LOCAL_MODULE_3__module.loaded = true), __WEBPACK_LOCAL_MODULE_3__ === undefined && (__WEBPACK_LOCAL_MODULE_3__ = __WEBPACK_LOCAL_MODULE_3__module.exports));\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory();\n  } else {\n    // browser global\n    window.matchesSelector = factory();\n  }\n\n}( window, function factory() {\n  'use strict';\n\n  var matchesMethod = ( function() {\n    var ElemProto = window.Element.prototype;\n    // check for the standard method name first\n    if ( ElemProto.matches ) {\n      return 'matches';\n    }\n    // check un-prefixed\n    if ( ElemProto.matchesSelector ) {\n      return 'matchesSelector';\n    }\n    // check vendor prefixes\n    var prefixes = [ 'webkit', 'moz', 'ms', 'o' ];\n\n    for ( var i=0; i < prefixes.length; i++ ) {\n      var prefix = prefixes[i];\n      var method = prefix + 'MatchesSelector';\n      if ( ElemProto[ method ] ) {\n        return method;\n      }\n    }\n  })();\n\n  return function matchesSelector( elem, selector ) {\n    return elem[ matchesMethod ]( selector );\n  };\n\n}));\n\n/**\n * Fizzy UI utils v2.0.5\n * MIT license\n */\n\n/*jshint browser: true, undef: true, unused: true, strict: true */\n\n( function( window, factory ) {\n  // universal module definition\n  /*jshint strict: false */ /*globals define, module, require */\n\n  if ( true ) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n      __WEBPACK_LOCAL_MODULE_3__\n    ], __WEBPACK_LOCAL_MODULE_4__ = (function( matchesSelector ) {\n      return factory( window, matchesSelector );\n    }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)));\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('desandro-matches-selector')\n    );\n  } else {\n    // browser global\n    window.fizzyUIUtils = factory(\n      window,\n      window.matchesSelector\n    );\n  }\n\n}( window, function factory( window, matchesSelector ) {\n\n\n\nvar utils = {};\n\n// ----- extend ----- //\n\n// extends objects\nutils.extend = function( a, b ) {\n  for ( var prop in b ) {\n    a[ prop ] = b[ prop ];\n  }\n  return a;\n};\n\n// ----- modulo ----- //\n\nutils.modulo = function( num, div ) {\n  return ( ( num % div ) + div ) % div;\n};\n\n// ----- makeArray ----- //\n\n// turn element or nodeList into an array\nutils.makeArray = function( obj ) {\n  var ary = [];\n  if ( Array.isArray( obj ) ) {\n    // use object if already an array\n    ary = obj;\n  } else if ( obj && typeof obj == 'object' &&\n    typeof obj.length == 'number' ) {\n    // convert nodeList to array\n    for ( var i=0; i < obj.length; i++ ) {\n      ary.push( obj[i] );\n    }\n  } else {\n    // array of single index\n    ary.push( obj );\n  }\n  return ary;\n};\n\n// ----- removeFrom ----- //\n\nutils.removeFrom = function( ary, obj ) {\n  var index = ary.indexOf( obj );\n  if ( index != -1 ) {\n    ary.splice( index, 1 );\n  }\n};\n\n// ----- getParent ----- //\n\nutils.getParent = function( elem, selector ) {\n  while ( elem.parentNode && elem != document.body ) {\n    elem = elem.parentNode;\n    if ( matchesSelector( elem, selector ) ) {\n      return elem;\n    }\n  }\n};\n\n// ----- getQueryElement ----- //\n\n// use element as selector string\nutils.getQueryElement = function( elem ) {\n  if ( typeof elem == 'string' ) {\n    return document.querySelector( elem );\n  }\n  return elem;\n};\n\n// ----- handleEvent ----- //\n\n// enable .ontype to trigger from .addEventListener( elem, 'type' )\nutils.handleEvent = function( event ) {\n  var method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\n// ----- filterFindElements ----- //\n\nutils.filterFindElements = function( elems, selector ) {\n  // make array of elems\n  elems = utils.makeArray( elems );\n  var ffElems = [];\n\n  elems.forEach( function( elem ) {\n    // check that elem is an actual element\n    if ( !( elem instanceof HTMLElement ) ) {\n      return;\n    }\n    // add elem if no selector\n    if ( !selector ) {\n      ffElems.push( elem );\n      return;\n    }\n    // filter & find items if we have a selector\n    // filter\n    if ( matchesSelector( elem, selector ) ) {\n      ffElems.push( elem );\n    }\n    // find children\n    var childElems = elem.querySelectorAll( selector );\n    // concat childElems to filterFound array\n    for ( var i=0; i < childElems.length; i++ ) {\n      ffElems.push( childElems[i] );\n    }\n  });\n\n  return ffElems;\n};\n\n// ----- debounceMethod ----- //\n\nutils.debounceMethod = function( _class, methodName, threshold ) {\n  // original method\n  var method = _class.prototype[ methodName ];\n  var timeoutName = methodName + 'Timeout';\n\n  _class.prototype[ methodName ] = function() {\n    var timeout = this[ timeoutName ];\n    if ( timeout ) {\n      clearTimeout( timeout );\n    }\n    var args = arguments;\n\n    var _this = this;\n    this[ timeoutName ] = setTimeout( function() {\n      method.apply( _this, args );\n      delete _this[ timeoutName ];\n    }, threshold || 100 );\n  };\n};\n\n// ----- docReady ----- //\n\nutils.docReady = function( callback ) {\n  var readyState = document.readyState;\n  if ( readyState == 'complete' || readyState == 'interactive' ) {\n    // do async to allow for other scripts to run. metafizzy/flickity#441\n    setTimeout( callback );\n  } else {\n    document.addEventListener( 'DOMContentLoaded', callback );\n  }\n};\n\n// ----- htmlInit ----- //\n\n// http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/\nutils.toDashed = function( str ) {\n  return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {\n    return $1 + '-' + $2;\n  }).toLowerCase();\n};\n\nvar console = window.console;\n/**\n * allow user to initialize classes via [data-namespace] or .js-namespace class\n * htmlInit( Widget, 'widgetName' )\n * options are parsed from data-namespace-options\n */\nutils.htmlInit = function( WidgetClass, namespace ) {\n  utils.docReady( function() {\n    var dashedNamespace = utils.toDashed( namespace );\n    var dataAttr = 'data-' + dashedNamespace;\n    var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' );\n    var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace );\n    var elems = utils.makeArray( dataAttrElems )\n      .concat( utils.makeArray( jsDashElems ) );\n    var dataOptionsAttr = dataAttr + '-options';\n    var jQuery = window.jQuery;\n\n    elems.forEach( function( elem ) {\n      var attr = elem.getAttribute( dataAttr ) ||\n        elem.getAttribute( dataOptionsAttr );\n      var options;\n      try {\n        options = attr && JSON.parse( attr );\n      } catch ( error ) {\n        // log error, do not initialize\n        if ( console ) {\n          console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className +\n          ': ' + error );\n        }\n        return;\n      }\n      // initialize\n      var instance = new WidgetClass( elem, options );\n      // make available via $().data('namespace')\n      if ( jQuery ) {\n        jQuery.data( elem, namespace, instance );\n      }\n    });\n\n  });\n};\n\n// -----  ----- //\n\nreturn utils;\n\n}));\n\n/**\n * Outlayer Item\n */\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /* globals define, module, require */\n  if ( true ) {\n    // AMD - RequireJS\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n        __WEBPACK_LOCAL_MODULE_1__,\n        __WEBPACK_LOCAL_MODULE_2__\n      ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_LOCAL_MODULE_5__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__));\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS - Browserify, Webpack\n    module.exports = factory(\n      require('ev-emitter'),\n      require('get-size')\n    );\n  } else {\n    // browser global\n    window.Outlayer = {};\n    window.Outlayer.Item = factory(\n      window.EvEmitter,\n      window.getSize\n    );\n  }\n\n}( window, function factory( EvEmitter, getSize ) {\n'use strict';\n\n// ----- helpers ----- //\n\nfunction isEmptyObj( obj ) {\n  for ( var prop in obj ) {\n    return false;\n  }\n  prop = null;\n  return true;\n}\n\n// -------------------------- CSS3 support -------------------------- //\n\n\nvar docElemStyle = document.documentElement.style;\n\nvar transitionProperty = typeof docElemStyle.transition == 'string' ?\n  'transition' : 'WebkitTransition';\nvar transformProperty = typeof docElemStyle.transform == 'string' ?\n  'transform' : 'WebkitTransform';\n\nvar transitionEndEvent = {\n  WebkitTransition: 'webkitTransitionEnd',\n  transition: 'transitionend'\n}[ transitionProperty ];\n\n// cache all vendor properties that could have vendor prefix\nvar vendorProperties = {\n  transform: transformProperty,\n  transition: transitionProperty,\n  transitionDuration: transitionProperty + 'Duration',\n  transitionProperty: transitionProperty + 'Property',\n  transitionDelay: transitionProperty + 'Delay'\n};\n\n// -------------------------- Item -------------------------- //\n\nfunction Item( element, layout ) {\n  if ( !element ) {\n    return;\n  }\n\n  this.element = element;\n  // parent layout class, i.e. Masonry, Isotope, or Packery\n  this.layout = layout;\n  this.position = {\n    x: 0,\n    y: 0\n  };\n\n  this._create();\n}\n\n// inherit EvEmitter\nvar proto = Item.prototype = Object.create( EvEmitter.prototype );\nproto.constructor = Item;\n\nproto._create = function() {\n  // transition objects\n  this._transn = {\n    ingProperties: {},\n    clean: {},\n    onEnd: {}\n  };\n\n  this.css({\n    position: 'absolute'\n  });\n};\n\n// trigger specified handler for event type\nproto.handleEvent = function( event ) {\n  var method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\nproto.getSize = function() {\n  this.size = getSize( this.element );\n};\n\n/**\n * apply CSS styles to element\n * @param {Object} style\n */\nproto.css = function( style ) {\n  var elemStyle = this.element.style;\n\n  for ( var prop in style ) {\n    // use vendor property if available\n    var supportedProp = vendorProperties[ prop ] || prop;\n    elemStyle[ supportedProp ] = style[ prop ];\n  }\n};\n\n // measure position, and sets it\nproto.getPosition = function() {\n  var style = getComputedStyle( this.element );\n  var isOriginLeft = this.layout._getOption('originLeft');\n  var isOriginTop = this.layout._getOption('originTop');\n  var xValue = style[ isOriginLeft ? 'left' : 'right' ];\n  var yValue = style[ isOriginTop ? 'top' : 'bottom' ];\n  // convert percent to pixels\n  var layoutSize = this.layout.size;\n  var x = xValue.indexOf('%') != -1 ?\n    ( parseFloat( xValue ) / 100 ) * layoutSize.width : parseInt( xValue, 10 );\n  var y = yValue.indexOf('%') != -1 ?\n    ( parseFloat( yValue ) / 100 ) * layoutSize.height : parseInt( yValue, 10 );\n\n  // clean up 'auto' or other non-integer values\n  x = isNaN( x ) ? 0 : x;\n  y = isNaN( y ) ? 0 : y;\n  // remove padding from measurement\n  x -= isOriginLeft ? layoutSize.paddingLeft : layoutSize.paddingRight;\n  y -= isOriginTop ? layoutSize.paddingTop : layoutSize.paddingBottom;\n\n  this.position.x = x;\n  this.position.y = y;\n};\n\n// set settled position, apply padding\nproto.layoutPosition = function() {\n  var layoutSize = this.layout.size;\n  var style = {};\n  var isOriginLeft = this.layout._getOption('originLeft');\n  var isOriginTop = this.layout._getOption('originTop');\n\n  // x\n  var xPadding = isOriginLeft ? 'paddingLeft' : 'paddingRight';\n  var xProperty = isOriginLeft ? 'left' : 'right';\n  var xResetProperty = isOriginLeft ? 'right' : 'left';\n\n  var x = this.position.x + layoutSize[ xPadding ];\n  // set in percentage or pixels\n  style[ xProperty ] = this.getXValue( x );\n  // reset other property\n  style[ xResetProperty ] = '';\n\n  // y\n  var yPadding = isOriginTop ? 'paddingTop' : 'paddingBottom';\n  var yProperty = isOriginTop ? 'top' : 'bottom';\n  var yResetProperty = isOriginTop ? 'bottom' : 'top';\n\n  var y = this.position.y + layoutSize[ yPadding ];\n  // set in percentage or pixels\n  style[ yProperty ] = this.getYValue( y );\n  // reset other property\n  style[ yResetProperty ] = '';\n\n  this.css( style );\n  this.emitEvent( 'layout', [ this ] );\n};\n\nproto.getXValue = function( x ) {\n  var isHorizontal = this.layout._getOption('horizontal');\n  return this.layout.options.percentPosition && !isHorizontal ?\n    ( ( x / this.layout.size.width ) * 100 ) + '%' : x + 'px';\n};\n\nproto.getYValue = function( y ) {\n  var isHorizontal = this.layout._getOption('horizontal');\n  return this.layout.options.percentPosition && isHorizontal ?\n    ( ( y / this.layout.size.height ) * 100 ) + '%' : y + 'px';\n};\n\nproto._transitionTo = function( x, y ) {\n  this.getPosition();\n  // get current x & y from top/left\n  var curX = this.position.x;\n  var curY = this.position.y;\n\n  var compareX = parseInt( x, 10 );\n  var compareY = parseInt( y, 10 );\n  var didNotMove = compareX === this.position.x && compareY === this.position.y;\n\n  // save end position\n  this.setPosition( x, y );\n\n  // if did not move and not transitioning, just go to layout\n  if ( didNotMove && !this.isTransitioning ) {\n    this.layoutPosition();\n    return;\n  }\n\n  var transX = x - curX;\n  var transY = y - curY;\n  var transitionStyle = {};\n  transitionStyle.transform = this.getTranslate( transX, transY );\n\n  this.transition({\n    to: transitionStyle,\n    onTransitionEnd: {\n      transform: this.layoutPosition\n    },\n    isCleaning: true\n  });\n};\n\nproto.getTranslate = function( x, y ) {\n  // flip cooridinates if origin on right or bottom\n  var isOriginLeft = this.layout._getOption('originLeft');\n  var isOriginTop = this.layout._getOption('originTop');\n  x = isOriginLeft ? x : -x;\n  y = isOriginTop ? y : -y;\n  return 'translate3d(' + x + 'px, ' + y + 'px, 0)';\n};\n\n// non transition + transform support\nproto.goTo = function( x, y ) {\n  this.setPosition( x, y );\n  this.layoutPosition();\n};\n\nproto.moveTo = proto._transitionTo;\n\nproto.setPosition = function( x, y ) {\n  this.position.x = parseInt( x, 10 );\n  this.position.y = parseInt( y, 10 );\n};\n\n// ----- transition ----- //\n\n/**\n * @param {Object} style - CSS\n * @param {Function} onTransitionEnd\n */\n\n// non transition, just trigger callback\nproto._nonTransition = function( args ) {\n  this.css( args.to );\n  if ( args.isCleaning ) {\n    this._removeStyles( args.to );\n  }\n  for ( var prop in args.onTransitionEnd ) {\n    args.onTransitionEnd[ prop ].call( this );\n  }\n};\n\n/**\n * proper transition\n * @param {Object} args - arguments\n *   @param {Object} to - style to transition to\n *   @param {Object} from - style to start transition from\n *   @param {Boolean} isCleaning - removes transition styles after transition\n *   @param {Function} onTransitionEnd - callback\n */\nproto.transition = function( args ) {\n  // redirect to nonTransition if no transition duration\n  if ( !parseFloat( this.layout.options.transitionDuration ) ) {\n    this._nonTransition( args );\n    return;\n  }\n\n  var _transition = this._transn;\n  // keep track of onTransitionEnd callback by css property\n  for ( var prop in args.onTransitionEnd ) {\n    _transition.onEnd[ prop ] = args.onTransitionEnd[ prop ];\n  }\n  // keep track of properties that are transitioning\n  for ( prop in args.to ) {\n    _transition.ingProperties[ prop ] = true;\n    // keep track of properties to clean up when transition is done\n    if ( args.isCleaning ) {\n      _transition.clean[ prop ] = true;\n    }\n  }\n\n  // set from styles\n  if ( args.from ) {\n    this.css( args.from );\n    // force redraw. http://blog.alexmaccaw.com/css-transitions\n    var h = this.element.offsetHeight;\n    // hack for JSHint to hush about unused var\n    h = null;\n  }\n  // enable transition\n  this.enableTransition( args.to );\n  // set styles that are transitioning\n  this.css( args.to );\n\n  this.isTransitioning = true;\n\n};\n\n// dash before all cap letters, including first for\n// WebkitTransform => -webkit-transform\nfunction toDashedAll( str ) {\n  return str.replace( /([A-Z])/g, function( $1 ) {\n    return '-' + $1.toLowerCase();\n  });\n}\n\nvar transitionProps = 'opacity,' + toDashedAll( transformProperty );\n\nproto.enableTransition = function(/* style */) {\n  // HACK changing transitionProperty during a transition\n  // will cause transition to jump\n  if ( this.isTransitioning ) {\n    return;\n  }\n\n  // make `transition: foo, bar, baz` from style object\n  // HACK un-comment this when enableTransition can work\n  // while a transition is happening\n  // var transitionValues = [];\n  // for ( var prop in style ) {\n  //   // dash-ify camelCased properties like WebkitTransition\n  //   prop = vendorProperties[ prop ] || prop;\n  //   transitionValues.push( toDashedAll( prop ) );\n  // }\n  // munge number to millisecond, to match stagger\n  var duration = this.layout.options.transitionDuration;\n  duration = typeof duration == 'number' ? duration + 'ms' : duration;\n  // enable transition styles\n  this.css({\n    transitionProperty: transitionProps,\n    transitionDuration: duration,\n    transitionDelay: this.staggerDelay || 0\n  });\n  // listen for transition end event\n  this.element.addEventListener( transitionEndEvent, this, false );\n};\n\n// ----- events ----- //\n\nproto.onwebkitTransitionEnd = function( event ) {\n  this.ontransitionend( event );\n};\n\nproto.onotransitionend = function( event ) {\n  this.ontransitionend( event );\n};\n\n// properties that I munge to make my life easier\nvar dashedVendorProperties = {\n  '-webkit-transform': 'transform'\n};\n\nproto.ontransitionend = function( event ) {\n  // disregard bubbled events from children\n  if ( event.target !== this.element ) {\n    return;\n  }\n  var _transition = this._transn;\n  // get property name of transitioned property, convert to prefix-free\n  var propertyName = dashedVendorProperties[ event.propertyName ] || event.propertyName;\n\n  // remove property that has completed transitioning\n  delete _transition.ingProperties[ propertyName ];\n  // check if any properties are still transitioning\n  if ( isEmptyObj( _transition.ingProperties ) ) {\n    // all properties have completed transitioning\n    this.disableTransition();\n  }\n  // clean style\n  if ( propertyName in _transition.clean ) {\n    // clean up style\n    this.element.style[ event.propertyName ] = '';\n    delete _transition.clean[ propertyName ];\n  }\n  // trigger onTransitionEnd callback\n  if ( propertyName in _transition.onEnd ) {\n    var onTransitionEnd = _transition.onEnd[ propertyName ];\n    onTransitionEnd.call( this );\n    delete _transition.onEnd[ propertyName ];\n  }\n\n  this.emitEvent( 'transitionEnd', [ this ] );\n};\n\nproto.disableTransition = function() {\n  this.removeTransitionStyles();\n  this.element.removeEventListener( transitionEndEvent, this, false );\n  this.isTransitioning = false;\n};\n\n/**\n * removes style property from element\n * @param {Object} style\n**/\nproto._removeStyles = function( style ) {\n  // clean up transition styles\n  var cleanStyle = {};\n  for ( var prop in style ) {\n    cleanStyle[ prop ] = '';\n  }\n  this.css( cleanStyle );\n};\n\nvar cleanTransitionStyle = {\n  transitionProperty: '',\n  transitionDuration: '',\n  transitionDelay: ''\n};\n\nproto.removeTransitionStyles = function() {\n  // remove transition\n  this.css( cleanTransitionStyle );\n};\n\n// ----- stagger ----- //\n\nproto.stagger = function( delay ) {\n  delay = isNaN( delay ) ? 0 : delay;\n  this.staggerDelay = delay + 'ms';\n};\n\n// ----- show/hide/remove ----- //\n\n// remove element from DOM\nproto.removeElem = function() {\n  this.element.parentNode.removeChild( this.element );\n  // remove display: none\n  this.css({ display: '' });\n  this.emitEvent( 'remove', [ this ] );\n};\n\nproto.remove = function() {\n  // just remove element if no transition support or no transition\n  if ( !transitionProperty || !parseFloat( this.layout.options.transitionDuration ) ) {\n    this.removeElem();\n    return;\n  }\n\n  // start transition\n  this.once( 'transitionEnd', function() {\n    this.removeElem();\n  });\n  this.hide();\n};\n\nproto.reveal = function() {\n  delete this.isHidden;\n  // remove display: none\n  this.css({ display: '' });\n\n  var options = this.layout.options;\n\n  var onTransitionEnd = {};\n  var transitionEndProperty = this.getHideRevealTransitionEndProperty('visibleStyle');\n  onTransitionEnd[ transitionEndProperty ] = this.onRevealTransitionEnd;\n\n  this.transition({\n    from: options.hiddenStyle,\n    to: options.visibleStyle,\n    isCleaning: true,\n    onTransitionEnd: onTransitionEnd\n  });\n};\n\nproto.onRevealTransitionEnd = function() {\n  // check if still visible\n  // during transition, item may have been hidden\n  if ( !this.isHidden ) {\n    this.emitEvent('reveal');\n  }\n};\n\n/**\n * get style property use for hide/reveal transition end\n * @param {String} styleProperty - hiddenStyle/visibleStyle\n * @returns {String}\n */\nproto.getHideRevealTransitionEndProperty = function( styleProperty ) {\n  var optionStyle = this.layout.options[ styleProperty ];\n  // use opacity\n  if ( optionStyle.opacity ) {\n    return 'opacity';\n  }\n  // get first property\n  for ( var prop in optionStyle ) {\n    return prop;\n  }\n};\n\nproto.hide = function() {\n  // set flag\n  this.isHidden = true;\n  // remove display: none\n  this.css({ display: '' });\n\n  var options = this.layout.options;\n\n  var onTransitionEnd = {};\n  var transitionEndProperty = this.getHideRevealTransitionEndProperty('hiddenStyle');\n  onTransitionEnd[ transitionEndProperty ] = this.onHideTransitionEnd;\n\n  this.transition({\n    from: options.visibleStyle,\n    to: options.hiddenStyle,\n    // keep hidden stuff hidden\n    isCleaning: true,\n    onTransitionEnd: onTransitionEnd\n  });\n};\n\nproto.onHideTransitionEnd = function() {\n  // check if still hidden\n  // during transition, item may have been un-hidden\n  if ( this.isHidden ) {\n    this.css({ display: 'none' });\n    this.emitEvent('hide');\n  }\n};\n\nproto.destroy = function() {\n  this.css({\n    position: '',\n    left: '',\n    right: '',\n    top: '',\n    bottom: '',\n    transition: '',\n    transform: ''\n  });\n};\n\nreturn Item;\n\n}));\n\n/*!\n * Outlayer v2.1.0\n * the brains and guts of a layout library\n * MIT license\n */\n\n( function( window, factory ) {\n  'use strict';\n  // universal module definition\n  /* jshint strict: false */ /* globals define, module, require */\n  if ( true ) {\n    // AMD - RequireJS\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n        __WEBPACK_LOCAL_MODULE_1__,\n        __WEBPACK_LOCAL_MODULE_2__,\n        __WEBPACK_LOCAL_MODULE_4__,\n        __WEBPACK_LOCAL_MODULE_5__\n      ], __WEBPACK_LOCAL_MODULE_6__ = (function( EvEmitter, getSize, utils, Item ) {\n        return factory( window, EvEmitter, getSize, utils, Item);\n      }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)));\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS - Browserify, Webpack\n    module.exports = factory(\n      window,\n      require('ev-emitter'),\n      require('get-size'),\n      require('fizzy-ui-utils'),\n      require('./item')\n    );\n  } else {\n    // browser global\n    window.Outlayer = factory(\n      window,\n      window.EvEmitter,\n      window.getSize,\n      window.fizzyUIUtils,\n      window.Outlayer.Item\n    );\n  }\n\n}( window, function factory( window, EvEmitter, getSize, utils, Item ) {\n'use strict';\n\n// ----- vars ----- //\n\nvar console = window.console;\nvar jQuery = window.jQuery;\nvar noop = function() {};\n\n// -------------------------- Outlayer -------------------------- //\n\n// globally unique identifiers\nvar GUID = 0;\n// internal store of all Outlayer intances\nvar instances = {};\n\n\n/**\n * @param {Element, String} element\n * @param {Object} options\n * @constructor\n */\nfunction Outlayer( element, options ) {\n  var queryElement = utils.getQueryElement( element );\n  if ( !queryElement ) {\n    if ( console ) {\n      console.error( 'Bad element for ' + this.constructor.namespace +\n        ': ' + ( queryElement || element ) );\n    }\n    return;\n  }\n  this.element = queryElement;\n  // add jQuery\n  if ( jQuery ) {\n    this.$element = jQuery( this.element );\n  }\n\n  // options\n  this.options = utils.extend( {}, this.constructor.defaults );\n  this.option( options );\n\n  // add id for Outlayer.getFromElement\n  var id = ++GUID;\n  this.element.outlayerGUID = id; // expando\n  instances[ id ] = this; // associate via id\n\n  // kick it off\n  this._create();\n\n  var isInitLayout = this._getOption('initLayout');\n  if ( isInitLayout ) {\n    this.layout();\n  }\n}\n\n// settings are for internal use only\nOutlayer.namespace = 'outlayer';\nOutlayer.Item = Item;\n\n// default options\nOutlayer.defaults = {\n  containerStyle: {\n    position: 'relative'\n  },\n  initLayout: true,\n  originLeft: true,\n  originTop: true,\n  resize: true,\n  resizeContainer: true,\n  // item options\n  transitionDuration: '0.4s',\n  hiddenStyle: {\n    opacity: 0,\n    transform: 'scale(0.001)'\n  },\n  visibleStyle: {\n    opacity: 1,\n    transform: 'scale(1)'\n  }\n};\n\nvar proto = Outlayer.prototype;\n// inherit EvEmitter\nutils.extend( proto, EvEmitter.prototype );\n\n/**\n * set options\n * @param {Object} opts\n */\nproto.option = function( opts ) {\n  utils.extend( this.options, opts );\n};\n\n/**\n * get backwards compatible option value, check old name\n */\nproto._getOption = function( option ) {\n  var oldOption = this.constructor.compatOptions[ option ];\n  return oldOption && this.options[ oldOption ] !== undefined ?\n    this.options[ oldOption ] : this.options[ option ];\n};\n\nOutlayer.compatOptions = {\n  // currentName: oldName\n  initLayout: 'isInitLayout',\n  horizontal: 'isHorizontal',\n  layoutInstant: 'isLayoutInstant',\n  originLeft: 'isOriginLeft',\n  originTop: 'isOriginTop',\n  resize: 'isResizeBound',\n  resizeContainer: 'isResizingContainer'\n};\n\nproto._create = function() {\n  // get items from children\n  this.reloadItems();\n  // elements that affect layout, but are not laid out\n  this.stamps = [];\n  this.stamp( this.options.stamp );\n  // set container style\n  utils.extend( this.element.style, this.options.containerStyle );\n\n  // bind resize method\n  var canBindResize = this._getOption('resize');\n  if ( canBindResize ) {\n    this.bindResize();\n  }\n};\n\n// goes through all children again and gets bricks in proper order\nproto.reloadItems = function() {\n  // collection of item elements\n  this.items = this._itemize( this.element.children );\n};\n\n\n/**\n * turn elements into Outlayer.Items to be used in layout\n * @param {Array or NodeList or HTMLElement} elems\n * @returns {Array} items - collection of new Outlayer Items\n */\nproto._itemize = function( elems ) {\n\n  var itemElems = this._filterFindItemElements( elems );\n  var Item = this.constructor.Item;\n\n  // create new Outlayer Items for collection\n  var items = [];\n  for ( var i=0; i < itemElems.length; i++ ) {\n    var elem = itemElems[i];\n    var item = new Item( elem, this );\n    items.push( item );\n  }\n\n  return items;\n};\n\n/**\n * get item elements to be used in layout\n * @param {Array or NodeList or HTMLElement} elems\n * @returns {Array} items - item elements\n */\nproto._filterFindItemElements = function( elems ) {\n  return utils.filterFindElements( elems, this.options.itemSelector );\n};\n\n/**\n * getter method for getting item elements\n * @returns {Array} elems - collection of item elements\n */\nproto.getItemElements = function() {\n  return this.items.map( function( item ) {\n    return item.element;\n  });\n};\n\n// ----- init & layout ----- //\n\n/**\n * lays out all items\n */\nproto.layout = function() {\n  this._resetLayout();\n  this._manageStamps();\n\n  // don't animate first layout\n  var layoutInstant = this._getOption('layoutInstant');\n  var isInstant = layoutInstant !== undefined ?\n    layoutInstant : !this._isLayoutInited;\n  this.layoutItems( this.items, isInstant );\n\n  // flag for initalized\n  this._isLayoutInited = true;\n};\n\n// _init is alias for layout\nproto._init = proto.layout;\n\n/**\n * logic before any new layout\n */\nproto._resetLayout = function() {\n  this.getSize();\n};\n\n\nproto.getSize = function() {\n  this.size = getSize( this.element );\n};\n\n/**\n * get measurement from option, for columnWidth, rowHeight, gutter\n * if option is String -> get element from selector string, & get size of element\n * if option is Element -> get size of element\n * else use option as a number\n *\n * @param {String} measurement\n * @param {String} size - width or height\n * @private\n */\nproto._getMeasurement = function( measurement, size ) {\n  var option = this.options[ measurement ];\n  var elem;\n  if ( !option ) {\n    // default to 0\n    this[ measurement ] = 0;\n  } else {\n    // use option as an element\n    if ( typeof option == 'string' ) {\n      elem = this.element.querySelector( option );\n    } else if ( option instanceof HTMLElement ) {\n      elem = option;\n    }\n    // use size of element, if element\n    this[ measurement ] = elem ? getSize( elem )[ size ] : option;\n  }\n};\n\n/**\n * layout a collection of item elements\n * @api public\n */\nproto.layoutItems = function( items, isInstant ) {\n  items = this._getItemsForLayout( items );\n\n  this._layoutItems( items, isInstant );\n\n  this._postLayout();\n};\n\n/**\n * get the items to be laid out\n * you may want to skip over some items\n * @param {Array} items\n * @returns {Array} items\n */\nproto._getItemsForLayout = function( items ) {\n  return items.filter( function( item ) {\n    return !item.isIgnored;\n  });\n};\n\n/**\n * layout items\n * @param {Array} items\n * @param {Boolean} isInstant\n */\nproto._layoutItems = function( items, isInstant ) {\n  this._emitCompleteOnItems( 'layout', items );\n\n  if ( !items || !items.length ) {\n    // no items, emit event with empty array\n    return;\n  }\n\n  var queue = [];\n\n  items.forEach( function( item ) {\n    // get x/y object from method\n    var position = this._getItemLayoutPosition( item );\n    // enqueue\n    position.item = item;\n    position.isInstant = isInstant || item.isLayoutInstant;\n    queue.push( position );\n  }, this );\n\n  this._processLayoutQueue( queue );\n};\n\n/**\n * get item layout position\n * @param {Outlayer.Item} item\n * @returns {Object} x and y position\n */\nproto._getItemLayoutPosition = function( /* item */ ) {\n  return {\n    x: 0,\n    y: 0\n  };\n};\n\n/**\n * iterate over array and position each item\n * Reason being - separating this logic prevents 'layout invalidation'\n * thx @paul_irish\n * @param {Array} queue\n */\nproto._processLayoutQueue = function( queue ) {\n  this.updateStagger();\n  queue.forEach( function( obj, i ) {\n    this._positionItem( obj.item, obj.x, obj.y, obj.isInstant, i );\n  }, this );\n};\n\n// set stagger from option in milliseconds number\nproto.updateStagger = function() {\n  var stagger = this.options.stagger;\n  if ( stagger === null || stagger === undefined ) {\n    this.stagger = 0;\n    return;\n  }\n  this.stagger = getMilliseconds( stagger );\n  return this.stagger;\n};\n\n/**\n * Sets position of item in DOM\n * @param {Outlayer.Item} item\n * @param {Number} x - horizontal position\n * @param {Number} y - vertical position\n * @param {Boolean} isInstant - disables transitions\n */\nproto._positionItem = function( item, x, y, isInstant, i ) {\n  if ( isInstant ) {\n    // if not transition, just set CSS\n    item.goTo( x, y );\n  } else {\n    item.stagger( i * this.stagger );\n    item.moveTo( x, y );\n  }\n};\n\n/**\n * Any logic you want to do after each layout,\n * i.e. size the container\n */\nproto._postLayout = function() {\n  this.resizeContainer();\n};\n\nproto.resizeContainer = function() {\n  var isResizingContainer = this._getOption('resizeContainer');\n  if ( !isResizingContainer ) {\n    return;\n  }\n  var size = this._getContainerSize();\n  if ( size ) {\n    this._setContainerMeasure( size.width, true );\n    this._setContainerMeasure( size.height, false );\n  }\n};\n\n/**\n * Sets width or height of container if returned\n * @returns {Object} size\n *   @param {Number} width\n *   @param {Number} height\n */\nproto._getContainerSize = noop;\n\n/**\n * @param {Number} measure - size of width or height\n * @param {Boolean} isWidth\n */\nproto._setContainerMeasure = function( measure, isWidth ) {\n  if ( measure === undefined ) {\n    return;\n  }\n\n  var elemSize = this.size;\n  // add padding and border width if border box\n  if ( elemSize.isBorderBox ) {\n    measure += isWidth ? elemSize.paddingLeft + elemSize.paddingRight +\n      elemSize.borderLeftWidth + elemSize.borderRightWidth :\n      elemSize.paddingBottom + elemSize.paddingTop +\n      elemSize.borderTopWidth + elemSize.borderBottomWidth;\n  }\n\n  measure = Math.max( measure, 0 );\n  this.element.style[ isWidth ? 'width' : 'height' ] = measure + 'px';\n};\n\n/**\n * emit eventComplete on a collection of items events\n * @param {String} eventName\n * @param {Array} items - Outlayer.Items\n */\nproto._emitCompleteOnItems = function( eventName, items ) {\n  var _this = this;\n  function onComplete() {\n    _this.dispatchEvent( eventName + 'Complete', null, [ items ] );\n  }\n\n  var count = items.length;\n  if ( !items || !count ) {\n    onComplete();\n    return;\n  }\n\n  var doneCount = 0;\n  function tick() {\n    doneCount++;\n    if ( doneCount == count ) {\n      onComplete();\n    }\n  }\n\n  // bind callback\n  items.forEach( function( item ) {\n    item.once( eventName, tick );\n  });\n};\n\n/**\n * emits events via EvEmitter and jQuery events\n * @param {String} type - name of event\n * @param {Event} event - original event\n * @param {Array} args - extra arguments\n */\nproto.dispatchEvent = function( type, event, args ) {\n  // add original event to arguments\n  var emitArgs = event ? [ event ].concat( args ) : args;\n  this.emitEvent( type, emitArgs );\n\n  if ( jQuery ) {\n    // set this.$element\n    this.$element = this.$element || jQuery( this.element );\n    if ( event ) {\n      // create jQuery event\n      var $event = jQuery.Event( event );\n      $event.type = type;\n      this.$element.trigger( $event, args );\n    } else {\n      // just trigger with type if no event available\n      this.$element.trigger( type, args );\n    }\n  }\n};\n\n// -------------------------- ignore & stamps -------------------------- //\n\n\n/**\n * keep item in collection, but do not lay it out\n * ignored items do not get skipped in layout\n * @param {Element} elem\n */\nproto.ignore = function( elem ) {\n  var item = this.getItem( elem );\n  if ( item ) {\n    item.isIgnored = true;\n  }\n};\n\n/**\n * return item to layout collection\n * @param {Element} elem\n */\nproto.unignore = function( elem ) {\n  var item = this.getItem( elem );\n  if ( item ) {\n    delete item.isIgnored;\n  }\n};\n\n/**\n * adds elements to stamps\n * @param {NodeList, Array, Element, or String} elems\n */\nproto.stamp = function( elems ) {\n  elems = this._find( elems );\n  if ( !elems ) {\n    return;\n  }\n\n  this.stamps = this.stamps.concat( elems );\n  // ignore\n  elems.forEach( this.ignore, this );\n};\n\n/**\n * removes elements to stamps\n * @param {NodeList, Array, or Element} elems\n */\nproto.unstamp = function( elems ) {\n  elems = this._find( elems );\n  if ( !elems ){\n    return;\n  }\n\n  elems.forEach( function( elem ) {\n    // filter out removed stamp elements\n    utils.removeFrom( this.stamps, elem );\n    this.unignore( elem );\n  }, this );\n};\n\n/**\n * finds child elements\n * @param {NodeList, Array, Element, or String} elems\n * @returns {Array} elems\n */\nproto._find = function( elems ) {\n  if ( !elems ) {\n    return;\n  }\n  // if string, use argument as selector string\n  if ( typeof elems == 'string' ) {\n    elems = this.element.querySelectorAll( elems );\n  }\n  elems = utils.makeArray( elems );\n  return elems;\n};\n\nproto._manageStamps = function() {\n  if ( !this.stamps || !this.stamps.length ) {\n    return;\n  }\n\n  this._getBoundingRect();\n\n  this.stamps.forEach( this._manageStamp, this );\n};\n\n// update boundingLeft / Top\nproto._getBoundingRect = function() {\n  // get bounding rect for container element\n  var boundingRect = this.element.getBoundingClientRect();\n  var size = this.size;\n  this._boundingRect = {\n    left: boundingRect.left + size.paddingLeft + size.borderLeftWidth,\n    top: boundingRect.top + size.paddingTop + size.borderTopWidth,\n    right: boundingRect.right - ( size.paddingRight + size.borderRightWidth ),\n    bottom: boundingRect.bottom - ( size.paddingBottom + size.borderBottomWidth )\n  };\n};\n\n/**\n * @param {Element} stamp\n**/\nproto._manageStamp = noop;\n\n/**\n * get x/y position of element relative to container element\n * @param {Element} elem\n * @returns {Object} offset - has left, top, right, bottom\n */\nproto._getElementOffset = function( elem ) {\n  var boundingRect = elem.getBoundingClientRect();\n  var thisRect = this._boundingRect;\n  var size = getSize( elem );\n  var offset = {\n    left: boundingRect.left - thisRect.left - size.marginLeft,\n    top: boundingRect.top - thisRect.top - size.marginTop,\n    right: thisRect.right - boundingRect.right - size.marginRight,\n    bottom: thisRect.bottom - boundingRect.bottom - size.marginBottom\n  };\n  return offset;\n};\n\n// -------------------------- resize -------------------------- //\n\n// enable event handlers for listeners\n// i.e. resize -> onresize\nproto.handleEvent = utils.handleEvent;\n\n/**\n * Bind layout to window resizing\n */\nproto.bindResize = function() {\n  window.addEventListener( 'resize', this );\n  this.isResizeBound = true;\n};\n\n/**\n * Unbind layout to window resizing\n */\nproto.unbindResize = function() {\n  window.removeEventListener( 'resize', this );\n  this.isResizeBound = false;\n};\n\nproto.onresize = function() {\n  this.resize();\n};\n\nutils.debounceMethod( Outlayer, 'onresize', 100 );\n\nproto.resize = function() {\n  // don't trigger if size did not change\n  // or if resize was unbound. See #9\n  if ( !this.isResizeBound || !this.needsResizeLayout() ) {\n    return;\n  }\n\n  this.layout();\n};\n\n/**\n * check if layout is needed post layout\n * @returns Boolean\n */\nproto.needsResizeLayout = function() {\n  var size = getSize( this.element );\n  // check that this.size and size are there\n  // IE8 triggers resize on body size change, so they might not be\n  var hasSizes = this.size && size;\n  return hasSizes && size.innerWidth !== this.size.innerWidth;\n};\n\n// -------------------------- methods -------------------------- //\n\n/**\n * add items to Outlayer instance\n * @param {Array or NodeList or Element} elems\n * @returns {Array} items - Outlayer.Items\n**/\nproto.addItems = function( elems ) {\n  var items = this._itemize( elems );\n  // add items to collection\n  if ( items.length ) {\n    this.items = this.items.concat( items );\n  }\n  return items;\n};\n\n/**\n * Layout newly-appended item elements\n * @param {Array or NodeList or Element} elems\n */\nproto.appended = function( elems ) {\n  var items = this.addItems( elems );\n  if ( !items.length ) {\n    return;\n  }\n  // layout and reveal just the new items\n  this.layoutItems( items, true );\n  this.reveal( items );\n};\n\n/**\n * Layout prepended elements\n * @param {Array or NodeList or Element} elems\n */\nproto.prepended = function( elems ) {\n  var items = this._itemize( elems );\n  if ( !items.length ) {\n    return;\n  }\n  // add items to beginning of collection\n  var previousItems = this.items.slice(0);\n  this.items = items.concat( previousItems );\n  // start new layout\n  this._resetLayout();\n  this._manageStamps();\n  // layout new stuff without transition\n  this.layoutItems( items, true );\n  this.reveal( items );\n  // layout previous items\n  this.layoutItems( previousItems );\n};\n\n/**\n * reveal a collection of items\n * @param {Array of Outlayer.Items} items\n */\nproto.reveal = function( items ) {\n  this._emitCompleteOnItems( 'reveal', items );\n  if ( !items || !items.length ) {\n    return;\n  }\n  var stagger = this.updateStagger();\n  items.forEach( function( item, i ) {\n    item.stagger( i * stagger );\n    item.reveal();\n  });\n};\n\n/**\n * hide a collection of items\n * @param {Array of Outlayer.Items} items\n */\nproto.hide = function( items ) {\n  this._emitCompleteOnItems( 'hide', items );\n  if ( !items || !items.length ) {\n    return;\n  }\n  var stagger = this.updateStagger();\n  items.forEach( function( item, i ) {\n    item.stagger( i * stagger );\n    item.hide();\n  });\n};\n\n/**\n * reveal item elements\n * @param {Array}, {Element}, {NodeList} items\n */\nproto.revealItemElements = function( elems ) {\n  var items = this.getItems( elems );\n  this.reveal( items );\n};\n\n/**\n * hide item elements\n * @param {Array}, {Element}, {NodeList} items\n */\nproto.hideItemElements = function( elems ) {\n  var items = this.getItems( elems );\n  this.hide( items );\n};\n\n/**\n * get Outlayer.Item, given an Element\n * @param {Element} elem\n * @param {Function} callback\n * @returns {Outlayer.Item} item\n */\nproto.getItem = function( elem ) {\n  // loop through items to get the one that matches\n  for ( var i=0; i < this.items.length; i++ ) {\n    var item = this.items[i];\n    if ( item.element == elem ) {\n      // return item\n      return item;\n    }\n  }\n};\n\n/**\n * get collection of Outlayer.Items, given Elements\n * @param {Array} elems\n * @returns {Array} items - Outlayer.Items\n */\nproto.getItems = function( elems ) {\n  elems = utils.makeArray( elems );\n  var items = [];\n  elems.forEach( function( elem ) {\n    var item = this.getItem( elem );\n    if ( item ) {\n      items.push( item );\n    }\n  }, this );\n\n  return items;\n};\n\n/**\n * remove element(s) from instance and DOM\n * @param {Array or NodeList or Element} elems\n */\nproto.remove = function( elems ) {\n  var removeItems = this.getItems( elems );\n\n  this._emitCompleteOnItems( 'remove', removeItems );\n\n  // bail if no items to remove\n  if ( !removeItems || !removeItems.length ) {\n    return;\n  }\n\n  removeItems.forEach( function( item ) {\n    item.remove();\n    // remove item from collection\n    utils.removeFrom( this.items, item );\n  }, this );\n};\n\n// ----- destroy ----- //\n\n// remove and disable Outlayer instance\nproto.destroy = function() {\n  // clean up dynamic styles\n  var style = this.element.style;\n  style.height = '';\n  style.position = '';\n  style.width = '';\n  // destroy items\n  this.items.forEach( function( item ) {\n    item.destroy();\n  });\n\n  this.unbindResize();\n\n  var id = this.element.outlayerGUID;\n  delete instances[ id ]; // remove reference to instance by id\n  delete this.element.outlayerGUID;\n  // remove data for jQuery\n  if ( jQuery ) {\n    jQuery.removeData( this.element, this.constructor.namespace );\n  }\n\n};\n\n// -------------------------- data -------------------------- //\n\n/**\n * get Outlayer instance from element\n * @param {Element} elem\n * @returns {Outlayer}\n */\nOutlayer.data = function( elem ) {\n  elem = utils.getQueryElement( elem );\n  var id = elem && elem.outlayerGUID;\n  return id && instances[ id ];\n};\n\n\n// -------------------------- create Outlayer class -------------------------- //\n\n/**\n * create a layout class\n * @param {String} namespace\n */\nOutlayer.create = function( namespace, options ) {\n  // sub-class Outlayer\n  var Layout = subclass( Outlayer );\n  // apply new options and compatOptions\n  Layout.defaults = utils.extend( {}, Outlayer.defaults );\n  utils.extend( Layout.defaults, options );\n  Layout.compatOptions = utils.extend( {}, Outlayer.compatOptions  );\n\n  Layout.namespace = namespace;\n\n  Layout.data = Outlayer.data;\n\n  // sub-class Item\n  Layout.Item = subclass( Item );\n\n  // -------------------------- declarative -------------------------- //\n\n  utils.htmlInit( Layout, namespace );\n\n  // -------------------------- jQuery bridge -------------------------- //\n\n  // make into jQuery plugin\n  if ( jQuery && jQuery.bridget ) {\n    jQuery.bridget( namespace, Layout );\n  }\n\n  return Layout;\n};\n\nfunction subclass( Parent ) {\n  function SubClass() {\n    Parent.apply( this, arguments );\n  }\n\n  SubClass.prototype = Object.create( Parent.prototype );\n  SubClass.prototype.constructor = SubClass;\n\n  return SubClass;\n}\n\n// ----- helpers ----- //\n\n// how many milliseconds are in each unit\nvar msUnits = {\n  ms: 1,\n  s: 1000\n};\n\n// munge time-like parameter into millisecond number\n// '0.4s' -> 40\nfunction getMilliseconds( time ) {\n  if ( typeof time == 'number' ) {\n    return time;\n  }\n  var matches = time.match( /(^\\d*\\.?\\d*)(\\w*)/ );\n  var num = matches && matches[1];\n  var unit = matches && matches[2];\n  if ( !num.length ) {\n    return 0;\n  }\n  num = parseFloat( num );\n  var mult = msUnits[ unit ] || 1;\n  return num * mult;\n}\n\n// ----- fin ----- //\n\n// back in global\nOutlayer.Item = Item;\n\nreturn Outlayer;\n\n}));\n\n/**\n * Isotope Item\n**/\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /*globals define, module, require */\n  if ( true ) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n        __WEBPACK_LOCAL_MODULE_6__\n      ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_LOCAL_MODULE_7__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__));\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      require('outlayer')\n    );\n  } else {\n    // browser global\n    window.Isotope = window.Isotope || {};\n    window.Isotope.Item = factory(\n      window.Outlayer\n    );\n  }\n\n}( window, function factory( Outlayer ) {\n'use strict';\n\n// -------------------------- Item -------------------------- //\n\n// sub-class Outlayer Item\nfunction Item() {\n  Outlayer.Item.apply( this, arguments );\n}\n\nvar proto = Item.prototype = Object.create( Outlayer.Item.prototype );\n\nvar _create = proto._create;\nproto._create = function() {\n  // assign id, used for original-order sorting\n  this.id = this.layout.itemGUID++;\n  _create.call( this );\n  this.sortData = {};\n};\n\nproto.updateSortData = function() {\n  if ( this.isIgnored ) {\n    return;\n  }\n  // default sorters\n  this.sortData.id = this.id;\n  // for backward compatibility\n  this.sortData['original-order'] = this.id;\n  this.sortData.random = Math.random();\n  // go thru getSortData obj and apply the sorters\n  var getSortData = this.layout.options.getSortData;\n  var sorters = this.layout._sorters;\n  for ( var key in getSortData ) {\n    var sorter = sorters[ key ];\n    this.sortData[ key ] = sorter( this.element, this );\n  }\n};\n\nvar _destroy = proto.destroy;\nproto.destroy = function() {\n  // call super\n  _destroy.apply( this, arguments );\n  // reset display, #741\n  this.css({\n    display: ''\n  });\n};\n\nreturn Item;\n\n}));\n\n/**\n * Isotope LayoutMode\n */\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /*globals define, module, require */\n  if ( true ) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n        __WEBPACK_LOCAL_MODULE_2__,\n        __WEBPACK_LOCAL_MODULE_6__\n      ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_LOCAL_MODULE_8__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__));\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      require('get-size'),\n      require('outlayer')\n    );\n  } else {\n    // browser global\n    window.Isotope = window.Isotope || {};\n    window.Isotope.LayoutMode = factory(\n      window.getSize,\n      window.Outlayer\n    );\n  }\n\n}( window, function factory( getSize, Outlayer ) {\n  'use strict';\n\n  // layout mode class\n  function LayoutMode( isotope ) {\n    this.isotope = isotope;\n    // link properties\n    if ( isotope ) {\n      this.options = isotope.options[ this.namespace ];\n      this.element = isotope.element;\n      this.items = isotope.filteredItems;\n      this.size = isotope.size;\n    }\n  }\n\n  var proto = LayoutMode.prototype;\n\n  /**\n   * some methods should just defer to default Outlayer method\n   * and reference the Isotope instance as `this`\n  **/\n  var facadeMethods = [\n    '_resetLayout',\n    '_getItemLayoutPosition',\n    '_manageStamp',\n    '_getContainerSize',\n    '_getElementOffset',\n    'needsResizeLayout',\n    '_getOption'\n  ];\n\n  facadeMethods.forEach( function( methodName ) {\n    proto[ methodName ] = function() {\n      return Outlayer.prototype[ methodName ].apply( this.isotope, arguments );\n    };\n  });\n\n  // -----  ----- //\n\n  // for horizontal layout modes, check vertical size\n  proto.needsVerticalResizeLayout = function() {\n    // don't trigger if size did not change\n    var size = getSize( this.isotope.element );\n    // check that this.size and size are there\n    // IE8 triggers resize on body size change, so they might not be\n    var hasSizes = this.isotope.size && size;\n    return hasSizes && size.innerHeight != this.isotope.size.innerHeight;\n  };\n\n  // ----- measurements ----- //\n\n  proto._getMeasurement = function() {\n    this.isotope._getMeasurement.apply( this, arguments );\n  };\n\n  proto.getColumnWidth = function() {\n    this.getSegmentSize( 'column', 'Width' );\n  };\n\n  proto.getRowHeight = function() {\n    this.getSegmentSize( 'row', 'Height' );\n  };\n\n  /**\n   * get columnWidth or rowHeight\n   * segment: 'column' or 'row'\n   * size 'Width' or 'Height'\n  **/\n  proto.getSegmentSize = function( segment, size ) {\n    var segmentName = segment + size;\n    var outerSize = 'outer' + size;\n    // columnWidth / outerWidth // rowHeight / outerHeight\n    this._getMeasurement( segmentName, outerSize );\n    // got rowHeight or columnWidth, we can chill\n    if ( this[ segmentName ] ) {\n      return;\n    }\n    // fall back to item of first element\n    var firstItemSize = this.getFirstItemSize();\n    this[ segmentName ] = firstItemSize && firstItemSize[ outerSize ] ||\n      // or size of container\n      this.isotope.size[ 'inner' + size ];\n  };\n\n  proto.getFirstItemSize = function() {\n    var firstItem = this.isotope.filteredItems[0];\n    return firstItem && firstItem.element && getSize( firstItem.element );\n  };\n\n  // ----- methods that should reference isotope ----- //\n\n  proto.layout = function() {\n    this.isotope.layout.apply( this.isotope, arguments );\n  };\n\n  proto.getSize = function() {\n    this.isotope.getSize();\n    this.size = this.isotope.size;\n  };\n\n  // -------------------------- create -------------------------- //\n\n  LayoutMode.modes = {};\n\n  LayoutMode.create = function( namespace, options ) {\n\n    function Mode() {\n      LayoutMode.apply( this, arguments );\n    }\n\n    Mode.prototype = Object.create( proto );\n    Mode.prototype.constructor = Mode;\n\n    // default options\n    if ( options ) {\n      Mode.options = options;\n    }\n\n    Mode.prototype.namespace = namespace;\n    // register in Isotope\n    LayoutMode.modes[ namespace ] = Mode;\n\n    return Mode;\n  };\n\n  return LayoutMode;\n\n}));\n\n/*!\n * Masonry v4.2.0\n * Cascading grid layout library\n * http://masonry.desandro.com\n * MIT License\n * by David DeSandro\n */\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /*globals define, module, require */\n  if ( true ) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n        __WEBPACK_LOCAL_MODULE_6__,\n        __WEBPACK_LOCAL_MODULE_2__\n      ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_LOCAL_MODULE_9__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__));\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      require('outlayer'),\n      require('get-size')\n    );\n  } else {\n    // browser global\n    window.Masonry = factory(\n      window.Outlayer,\n      window.getSize\n    );\n  }\n\n}( window, function factory( Outlayer, getSize ) {\n\n\n\n// -------------------------- masonryDefinition -------------------------- //\n\n  // create an Outlayer layout class\n  var Masonry = Outlayer.create('masonry');\n  // isFitWidth -> fitWidth\n  Masonry.compatOptions.fitWidth = 'isFitWidth';\n\n  var proto = Masonry.prototype;\n\n  proto._resetLayout = function() {\n    this.getSize();\n    this._getMeasurement( 'columnWidth', 'outerWidth' );\n    this._getMeasurement( 'gutter', 'outerWidth' );\n    this.measureColumns();\n\n    // reset column Y\n    this.colYs = [];\n    for ( var i=0; i < this.cols; i++ ) {\n      this.colYs.push( 0 );\n    }\n\n    this.maxY = 0;\n    this.horizontalColIndex = 0;\n  };\n\n  proto.measureColumns = function() {\n    this.getContainerWidth();\n    // if columnWidth is 0, default to outerWidth of first item\n    if ( !this.columnWidth ) {\n      var firstItem = this.items[0];\n      var firstItemElem = firstItem && firstItem.element;\n      // columnWidth fall back to item of first element\n      this.columnWidth = firstItemElem && getSize( firstItemElem ).outerWidth ||\n        // if first elem has no width, default to size of container\n        this.containerWidth;\n    }\n\n    var columnWidth = this.columnWidth += this.gutter;\n\n    // calculate columns\n    var containerWidth = this.containerWidth + this.gutter;\n    var cols = containerWidth / columnWidth;\n    // fix rounding errors, typically with gutters\n    var excess = columnWidth - containerWidth % columnWidth;\n    // if overshoot is less than a pixel, round up, otherwise floor it\n    var mathMethod = excess && excess < 1 ? 'round' : 'floor';\n    cols = Math[ mathMethod ]( cols );\n    this.cols = Math.max( cols, 1 );\n  };\n\n  proto.getContainerWidth = function() {\n    // container is parent if fit width\n    var isFitWidth = this._getOption('fitWidth');\n    var container = isFitWidth ? this.element.parentNode : this.element;\n    // check that this.size and size are there\n    // IE8 triggers resize on body size change, so they might not be\n    var size = getSize( container );\n    this.containerWidth = size && size.innerWidth;\n  };\n\n  proto._getItemLayoutPosition = function( item ) {\n    item.getSize();\n    // how many columns does this brick span\n    var remainder = item.size.outerWidth % this.columnWidth;\n    var mathMethod = remainder && remainder < 1 ? 'round' : 'ceil';\n    // round if off by 1 pixel, otherwise use ceil\n    var colSpan = Math[ mathMethod ]( item.size.outerWidth / this.columnWidth );\n    colSpan = Math.min( colSpan, this.cols );\n    // use horizontal or top column position\n    var colPosMethod = this.options.horizontalOrder ?\n      '_getHorizontalColPosition' : '_getTopColPosition';\n    var colPosition = this[ colPosMethod ]( colSpan, item );\n    // position the brick\n    var position = {\n      x: this.columnWidth * colPosition.col,\n      y: colPosition.y\n    };\n    // apply setHeight to necessary columns\n    var setHeight = colPosition.y + item.size.outerHeight;\n    var setMax = colSpan + colPosition.col;\n    for ( var i = colPosition.col; i < setMax; i++ ) {\n      this.colYs[i] = setHeight;\n    }\n\n    return position;\n  };\n\n  proto._getTopColPosition = function( colSpan ) {\n    var colGroup = this._getTopColGroup( colSpan );\n    // get the minimum Y value from the columns\n    var minimumY = Math.min.apply( Math, colGroup );\n\n    return {\n      col: colGroup.indexOf( minimumY ),\n      y: minimumY,\n    };\n  };\n\n  /**\n   * @param {Number} colSpan - number of columns the element spans\n   * @returns {Array} colGroup\n   */\n  proto._getTopColGroup = function( colSpan ) {\n    if ( colSpan < 2 ) {\n      // if brick spans only one column, use all the column Ys\n      return this.colYs;\n    }\n\n    var colGroup = [];\n    // how many different places could this brick fit horizontally\n    var groupCount = this.cols + 1 - colSpan;\n    // for each group potential horizontal position\n    for ( var i = 0; i < groupCount; i++ ) {\n      colGroup[i] = this._getColGroupY( i, colSpan );\n    }\n    return colGroup;\n  };\n\n  proto._getColGroupY = function( col, colSpan ) {\n    if ( colSpan < 2 ) {\n      return this.colYs[ col ];\n    }\n    // make an array of colY values for that one group\n    var groupColYs = this.colYs.slice( col, col + colSpan );\n    // and get the max value of the array\n    return Math.max.apply( Math, groupColYs );\n  };\n\n  // get column position based on horizontal index. #873\n  proto._getHorizontalColPosition = function( colSpan, item ) {\n    var col = this.horizontalColIndex % this.cols;\n    var isOver = colSpan > 1 && col + colSpan > this.cols;\n    // shift to next row if item can't fit on current row\n    col = isOver ? 0 : col;\n    // don't let zero-size items take up space\n    var hasSize = item.size.outerWidth && item.size.outerHeight;\n    this.horizontalColIndex = hasSize ? col + colSpan : this.horizontalColIndex;\n\n    return {\n      col: col,\n      y: this._getColGroupY( col, colSpan ),\n    };\n  };\n\n  proto._manageStamp = function( stamp ) {\n    var stampSize = getSize( stamp );\n    var offset = this._getElementOffset( stamp );\n    // get the columns that this stamp affects\n    var isOriginLeft = this._getOption('originLeft');\n    var firstX = isOriginLeft ? offset.left : offset.right;\n    var lastX = firstX + stampSize.outerWidth;\n    var firstCol = Math.floor( firstX / this.columnWidth );\n    firstCol = Math.max( 0, firstCol );\n    var lastCol = Math.floor( lastX / this.columnWidth );\n    // lastCol should not go over if multiple of columnWidth #425\n    lastCol -= lastX % this.columnWidth ? 0 : 1;\n    lastCol = Math.min( this.cols - 1, lastCol );\n    // set colYs to bottom of the stamp\n\n    var isOriginTop = this._getOption('originTop');\n    var stampMaxY = ( isOriginTop ? offset.top : offset.bottom ) +\n      stampSize.outerHeight;\n    for ( var i = firstCol; i <= lastCol; i++ ) {\n      this.colYs[i] = Math.max( stampMaxY, this.colYs[i] );\n    }\n  };\n\n  proto._getContainerSize = function() {\n    this.maxY = Math.max.apply( Math, this.colYs );\n    var size = {\n      height: this.maxY\n    };\n\n    if ( this._getOption('fitWidth') ) {\n      size.width = this._getContainerFitWidth();\n    }\n\n    return size;\n  };\n\n  proto._getContainerFitWidth = function() {\n    var unusedCols = 0;\n    // count unused columns\n    var i = this.cols;\n    while ( --i ) {\n      if ( this.colYs[i] !== 0 ) {\n        break;\n      }\n      unusedCols++;\n    }\n    // fit container to columns that have been used\n    return ( this.cols - unusedCols ) * this.columnWidth - this.gutter;\n  };\n\n  proto.needsResizeLayout = function() {\n    var previousWidth = this.containerWidth;\n    this.getContainerWidth();\n    return previousWidth != this.containerWidth;\n  };\n\n  return Masonry;\n\n}));\n\n/*!\n * Masonry layout mode\n * sub-classes Masonry\n * http://masonry.desandro.com\n */\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /*globals define, module, require */\n  if ( true ) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n        __WEBPACK_LOCAL_MODULE_8__,\n        __WEBPACK_LOCAL_MODULE_9__\n      ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_LOCAL_MODULE_10__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__));\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      require('../layout-mode'),\n      require('masonry-layout')\n    );\n  } else {\n    // browser global\n    factory(\n      window.Isotope.LayoutMode,\n      window.Masonry\n    );\n  }\n\n}( window, function factory( LayoutMode, Masonry ) {\n'use strict';\n\n// -------------------------- masonryDefinition -------------------------- //\n\n  // create an Outlayer layout class\n  var MasonryMode = LayoutMode.create('masonry');\n\n  var proto = MasonryMode.prototype;\n\n  var keepModeMethods = {\n    _getElementOffset: true,\n    layout: true,\n    _getMeasurement: true\n  };\n\n  // inherit Masonry prototype\n  for ( var method in Masonry.prototype ) {\n    // do not inherit mode methods\n    if ( !keepModeMethods[ method ] ) {\n      proto[ method ] = Masonry.prototype[ method ];\n    }\n  }\n\n  var measureColumns = proto.measureColumns;\n  proto.measureColumns = function() {\n    // set items, used if measuring first item\n    this.items = this.isotope.filteredItems;\n    measureColumns.call( this );\n  };\n\n  // point to mode options for fitWidth\n  var _getOption = proto._getOption;\n  proto._getOption = function( option ) {\n    if ( option == 'fitWidth' ) {\n      return this.options.isFitWidth !== undefined ?\n        this.options.isFitWidth : this.options.fitWidth;\n    }\n    return _getOption.apply( this.isotope, arguments );\n  };\n\n  return MasonryMode;\n\n}));\n\n/**\n * fitRows layout mode\n */\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /*globals define, module, require */\n  if ( true ) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n        __WEBPACK_LOCAL_MODULE_8__\n      ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_LOCAL_MODULE_11__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__));\n  } else if ( typeof exports == 'object' ) {\n    // CommonJS\n    module.exports = factory(\n      require('../layout-mode')\n    );\n  } else {\n    // browser global\n    factory(\n      window.Isotope.LayoutMode\n    );\n  }\n\n}( window, function factory( LayoutMode ) {\n'use strict';\n\nvar FitRows = LayoutMode.create('fitRows');\n\nvar proto = FitRows.prototype;\n\nproto._resetLayout = function() {\n  this.x = 0;\n  this.y = 0;\n  this.maxY = 0;\n  this._getMeasurement( 'gutter', 'outerWidth' );\n};\n\nproto._getItemLayoutPosition = function( item ) {\n  item.getSize();\n\n  var itemWidth = item.size.outerWidth + this.gutter;\n  // if this element cannot fit in the current row\n  var containerWidth = this.isotope.size.innerWidth + this.gutter;\n  if ( this.x !== 0 && itemWidth + this.x > containerWidth ) {\n    this.x = 0;\n    this.y = this.maxY;\n  }\n\n  var position = {\n    x: this.x,\n    y: this.y\n  };\n\n  this.maxY = Math.max( this.maxY, this.y + item.size.outerHeight );\n  this.x += itemWidth;\n\n  return position;\n};\n\nproto._getContainerSize = function() {\n  return { height: this.maxY };\n};\n\nreturn FitRows;\n\n}));\n\n/**\n * vertical layout mode\n */\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /*globals define, module, require */\n  if ( true ) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n        __WEBPACK_LOCAL_MODULE_8__\n      ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_LOCAL_MODULE_12__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__));\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      require('../layout-mode')\n    );\n  } else {\n    // browser global\n    factory(\n      window.Isotope.LayoutMode\n    );\n  }\n\n}( window, function factory( LayoutMode ) {\n'use strict';\n\nvar Vertical = LayoutMode.create( 'vertical', {\n  horizontalAlignment: 0\n});\n\nvar proto = Vertical.prototype;\n\nproto._resetLayout = function() {\n  this.y = 0;\n};\n\nproto._getItemLayoutPosition = function( item ) {\n  item.getSize();\n  var x = ( this.isotope.size.innerWidth - item.size.outerWidth ) *\n    this.options.horizontalAlignment;\n  var y = this.y;\n  this.y += item.size.outerHeight;\n  return { x: x, y: y };\n};\n\nproto._getContainerSize = function() {\n  return { height: this.y };\n};\n\nreturn Vertical;\n\n}));\n\n/*!\n * Isotope v3.0.4\n *\n * Licensed GPLv3 for open source use\n * or Isotope Commercial License for commercial use\n *\n * http://isotope.metafizzy.co\n * Copyright 2017 Metafizzy\n */\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /*globals define, module, require */\n  if ( true ) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n        __WEBPACK_LOCAL_MODULE_6__,\n        __WEBPACK_LOCAL_MODULE_2__,\n        __WEBPACK_LOCAL_MODULE_3__,\n        __WEBPACK_LOCAL_MODULE_4__,\n        __WEBPACK_LOCAL_MODULE_7__,\n        __WEBPACK_LOCAL_MODULE_8__,\n        // include default layout modes\n        __WEBPACK_LOCAL_MODULE_10__,\n        __WEBPACK_LOCAL_MODULE_11__,\n        __WEBPACK_LOCAL_MODULE_12__\n      ], __WEBPACK_AMD_DEFINE_RESULT__ = function( Outlayer, getSize, matchesSelector, utils, Item, LayoutMode ) {\n        return factory( window, Outlayer, getSize, matchesSelector, utils, Item, LayoutMode );\n      }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('outlayer'),\n      require('get-size'),\n      require('desandro-matches-selector'),\n      require('fizzy-ui-utils'),\n      require('isotope/js/item'),\n      require('isotope/js/layout-mode'),\n      // include default layout modes\n      require('isotope/js/layout-modes/masonry'),\n      require('isotope/js/layout-modes/fit-rows'),\n      require('isotope/js/layout-modes/vertical')\n    );\n  } else {\n    // browser global\n    window.Isotope = factory(\n      window,\n      window.Outlayer,\n      window.getSize,\n      window.matchesSelector,\n      window.fizzyUIUtils,\n      window.Isotope.Item,\n      window.Isotope.LayoutMode\n    );\n  }\n\n}( window, function factory( window, Outlayer, getSize, matchesSelector, utils,\n  Item, LayoutMode ) {\n\n\n\n// -------------------------- vars -------------------------- //\n\nvar jQuery = window.jQuery;\n\n// -------------------------- helpers -------------------------- //\n\nvar trim = String.prototype.trim ?\n  function( str ) {\n    return str.trim();\n  } :\n  function( str ) {\n    return str.replace( /^\\s+|\\s+$/g, '' );\n  };\n\n// -------------------------- isotopeDefinition -------------------------- //\n\n  // create an Outlayer layout class\n  var Isotope = Outlayer.create( 'isotope', {\n    layoutMode: 'masonry',\n    isJQueryFiltering: true,\n    sortAscending: true\n  });\n\n  Isotope.Item = Item;\n  Isotope.LayoutMode = LayoutMode;\n\n  var proto = Isotope.prototype;\n\n  proto._create = function() {\n    this.itemGUID = 0;\n    // functions that sort items\n    this._sorters = {};\n    this._getSorters();\n    // call super\n    Outlayer.prototype._create.call( this );\n\n    // create layout modes\n    this.modes = {};\n    // start filteredItems with all items\n    this.filteredItems = this.items;\n    // keep of track of sortBys\n    this.sortHistory = [ 'original-order' ];\n    // create from registered layout modes\n    for ( var name in LayoutMode.modes ) {\n      this._initLayoutMode( name );\n    }\n  };\n\n  proto.reloadItems = function() {\n    // reset item ID counter\n    this.itemGUID = 0;\n    // call super\n    Outlayer.prototype.reloadItems.call( this );\n  };\n\n  proto._itemize = function() {\n    var items = Outlayer.prototype._itemize.apply( this, arguments );\n    // assign ID for original-order\n    for ( var i=0; i < items.length; i++ ) {\n      var item = items[i];\n      item.id = this.itemGUID++;\n    }\n    this._updateItemsSortData( items );\n    return items;\n  };\n\n\n  // -------------------------- layout -------------------------- //\n\n  proto._initLayoutMode = function( name ) {\n    var Mode = LayoutMode.modes[ name ];\n    // set mode options\n    // HACK extend initial options, back-fill in default options\n    var initialOpts = this.options[ name ] || {};\n    this.options[ name ] = Mode.options ?\n      utils.extend( Mode.options, initialOpts ) : initialOpts;\n    // init layout mode instance\n    this.modes[ name ] = new Mode( this );\n  };\n\n\n  proto.layout = function() {\n    // if first time doing layout, do all magic\n    if ( !this._isLayoutInited && this._getOption('initLayout') ) {\n      this.arrange();\n      return;\n    }\n    this._layout();\n  };\n\n  // private method to be used in layout() & magic()\n  proto._layout = function() {\n    // don't animate first layout\n    var isInstant = this._getIsInstant();\n    // layout flow\n    this._resetLayout();\n    this._manageStamps();\n    this.layoutItems( this.filteredItems, isInstant );\n\n    // flag for initalized\n    this._isLayoutInited = true;\n  };\n\n  // filter + sort + layout\n  proto.arrange = function( opts ) {\n    // set any options pass\n    this.option( opts );\n    this._getIsInstant();\n    // filter, sort, and layout\n\n    // filter\n    var filtered = this._filter( this.items );\n    this.filteredItems = filtered.matches;\n\n    this._bindArrangeComplete();\n\n    if ( this._isInstant ) {\n      this._noTransition( this._hideReveal, [ filtered ] );\n    } else {\n      this._hideReveal( filtered );\n    }\n\n    this._sort();\n    this._layout();\n  };\n  // alias to _init for main plugin method\n  proto._init = proto.arrange;\n\n  proto._hideReveal = function( filtered ) {\n    this.reveal( filtered.needReveal );\n    this.hide( filtered.needHide );\n  };\n\n  // HACK\n  // Don't animate/transition first layout\n  // Or don't animate/transition other layouts\n  proto._getIsInstant = function() {\n    var isLayoutInstant = this._getOption('layoutInstant');\n    var isInstant = isLayoutInstant !== undefined ? isLayoutInstant :\n      !this._isLayoutInited;\n    this._isInstant = isInstant;\n    return isInstant;\n  };\n\n  // listen for layoutComplete, hideComplete and revealComplete\n  // to trigger arrangeComplete\n  proto._bindArrangeComplete = function() {\n    // listen for 3 events to trigger arrangeComplete\n    var isLayoutComplete, isHideComplete, isRevealComplete;\n    var _this = this;\n    function arrangeParallelCallback() {\n      if ( isLayoutComplete && isHideComplete && isRevealComplete ) {\n        _this.dispatchEvent( 'arrangeComplete', null, [ _this.filteredItems ] );\n      }\n    }\n    this.once( 'layoutComplete', function() {\n      isLayoutComplete = true;\n      arrangeParallelCallback();\n    });\n    this.once( 'hideComplete', function() {\n      isHideComplete = true;\n      arrangeParallelCallback();\n    });\n    this.once( 'revealComplete', function() {\n      isRevealComplete = true;\n      arrangeParallelCallback();\n    });\n  };\n\n  // -------------------------- filter -------------------------- //\n\n  proto._filter = function( items ) {\n    var filter = this.options.filter;\n    filter = filter || '*';\n    var matches = [];\n    var hiddenMatched = [];\n    var visibleUnmatched = [];\n\n    var test = this._getFilterTest( filter );\n\n    // test each item\n    for ( var i=0; i < items.length; i++ ) {\n      var item = items[i];\n      if ( item.isIgnored ) {\n        continue;\n      }\n      // add item to either matched or unmatched group\n      var isMatched = test( item );\n      // item.isFilterMatched = isMatched;\n      // add to matches if its a match\n      if ( isMatched ) {\n        matches.push( item );\n      }\n      // add to additional group if item needs to be hidden or revealed\n      if ( isMatched && item.isHidden ) {\n        hiddenMatched.push( item );\n      } else if ( !isMatched && !item.isHidden ) {\n        visibleUnmatched.push( item );\n      }\n    }\n\n    // return collections of items to be manipulated\n    return {\n      matches: matches,\n      needReveal: hiddenMatched,\n      needHide: visibleUnmatched\n    };\n  };\n\n  // get a jQuery, function, or a matchesSelector test given the filter\n  proto._getFilterTest = function( filter ) {\n    if ( jQuery && this.options.isJQueryFiltering ) {\n      // use jQuery\n      return function( item ) {\n        return jQuery( item.element ).is( filter );\n      };\n    }\n    if ( typeof filter == 'function' ) {\n      // use filter as function\n      return function( item ) {\n        return filter( item.element );\n      };\n    }\n    // default, use filter as selector string\n    return function( item ) {\n      return matchesSelector( item.element, filter );\n    };\n  };\n\n  // -------------------------- sorting -------------------------- //\n\n  /**\n   * @params {Array} elems\n   * @public\n   */\n  proto.updateSortData = function( elems ) {\n    // get items\n    var items;\n    if ( elems ) {\n      elems = utils.makeArray( elems );\n      items = this.getItems( elems );\n    } else {\n      // update all items if no elems provided\n      items = this.items;\n    }\n\n    this._getSorters();\n    this._updateItemsSortData( items );\n  };\n\n  proto._getSorters = function() {\n    var getSortData = this.options.getSortData;\n    for ( var key in getSortData ) {\n      var sorter = getSortData[ key ];\n      this._sorters[ key ] = mungeSorter( sorter );\n    }\n  };\n\n  /**\n   * @params {Array} items - of Isotope.Items\n   * @private\n   */\n  proto._updateItemsSortData = function( items ) {\n    // do not update if no items\n    var len = items && items.length;\n\n    for ( var i=0; len && i < len; i++ ) {\n      var item = items[i];\n      item.updateSortData();\n    }\n  };\n\n  // ----- munge sorter ----- //\n\n  // encapsulate this, as we just need mungeSorter\n  // other functions in here are just for munging\n  var mungeSorter = ( function() {\n    // add a magic layer to sorters for convienent shorthands\n    // `.foo-bar` will use the text of .foo-bar querySelector\n    // `[foo-bar]` will use attribute\n    // you can also add parser\n    // `.foo-bar parseInt` will parse that as a number\n    function mungeSorter( sorter ) {\n      // if not a string, return function or whatever it is\n      if ( typeof sorter != 'string' ) {\n        return sorter;\n      }\n      // parse the sorter string\n      var args = trim( sorter ).split(' ');\n      var query = args[0];\n      // check if query looks like [an-attribute]\n      var attrMatch = query.match( /^\\[(.+)\\]$/ );\n      var attr = attrMatch && attrMatch[1];\n      var getValue = getValueGetter( attr, query );\n      // use second argument as a parser\n      var parser = Isotope.sortDataParsers[ args[1] ];\n      // parse the value, if there was a parser\n      sorter = parser ? function( elem ) {\n        return elem && parser( getValue( elem ) );\n      } :\n      // otherwise just return value\n      function( elem ) {\n        return elem && getValue( elem );\n      };\n\n      return sorter;\n    }\n\n    // get an attribute getter, or get text of the querySelector\n    function getValueGetter( attr, query ) {\n      // if query looks like [foo-bar], get attribute\n      if ( attr ) {\n        return function getAttribute( elem ) {\n          return elem.getAttribute( attr );\n        };\n      }\n\n      // otherwise, assume its a querySelector, and get its text\n      return function getChildText( elem ) {\n        var child = elem.querySelector( query );\n        return child && child.textContent;\n      };\n    }\n\n    return mungeSorter;\n  })();\n\n  // parsers used in getSortData shortcut strings\n  Isotope.sortDataParsers = {\n    'parseInt': function( val ) {\n      return parseInt( val, 10 );\n    },\n    'parseFloat': function( val ) {\n      return parseFloat( val );\n    }\n  };\n\n  // ----- sort method ----- //\n\n  // sort filteredItem order\n  proto._sort = function() {\n    if ( !this.options.sortBy ) {\n      return;\n    }\n    // keep track of sortBy History\n    var sortBys = utils.makeArray( this.options.sortBy );\n    if ( !this._getIsSameSortBy( sortBys ) ) {\n      // concat all sortBy and sortHistory, add to front, oldest goes in last\n      this.sortHistory = sortBys.concat( this.sortHistory );\n    }\n    // sort magic\n    var itemSorter = getItemSorter( this.sortHistory, this.options.sortAscending );\n    this.filteredItems.sort( itemSorter );\n  };\n\n  // check if sortBys is same as start of sortHistory\n  proto._getIsSameSortBy = function( sortBys ) {\n    for ( var i=0; i < sortBys.length; i++ ) {\n      if ( sortBys[i] != this.sortHistory[i] ) {\n        return false;\n      }\n    }\n    return true;\n  };\n\n  // returns a function used for sorting\n  function getItemSorter( sortBys, sortAsc ) {\n    return function sorter( itemA, itemB ) {\n      // cycle through all sortKeys\n      for ( var i = 0; i < sortBys.length; i++ ) {\n        var sortBy = sortBys[i];\n        var a = itemA.sortData[ sortBy ];\n        var b = itemB.sortData[ sortBy ];\n        if ( a > b || a < b ) {\n          // if sortAsc is an object, use the value given the sortBy key\n          var isAscending = sortAsc[ sortBy ] !== undefined ? sortAsc[ sortBy ] : sortAsc;\n          var direction = isAscending ? 1 : -1;\n          return ( a > b ? 1 : -1 ) * direction;\n        }\n      }\n      return 0;\n    };\n  }\n\n  // -------------------------- methods -------------------------- //\n\n  // get layout mode\n  proto._mode = function() {\n    var layoutMode = this.options.layoutMode;\n    var mode = this.modes[ layoutMode ];\n    if ( !mode ) {\n      // TODO console.error\n      throw new Error( 'No layout mode: ' + layoutMode );\n    }\n    // HACK sync mode's options\n    // any options set after init for layout mode need to be synced\n    mode.options = this.options[ layoutMode ];\n    return mode;\n  };\n\n  proto._resetLayout = function() {\n    // trigger original reset layout\n    Outlayer.prototype._resetLayout.call( this );\n    this._mode()._resetLayout();\n  };\n\n  proto._getItemLayoutPosition = function( item  ) {\n    return this._mode()._getItemLayoutPosition( item );\n  };\n\n  proto._manageStamp = function( stamp ) {\n    this._mode()._manageStamp( stamp );\n  };\n\n  proto._getContainerSize = function() {\n    return this._mode()._getContainerSize();\n  };\n\n  proto.needsResizeLayout = function() {\n    return this._mode().needsResizeLayout();\n  };\n\n  // -------------------------- adding & removing -------------------------- //\n\n  // HEADS UP overwrites default Outlayer appended\n  proto.appended = function( elems ) {\n    var items = this.addItems( elems );\n    if ( !items.length ) {\n      return;\n    }\n    // filter, layout, reveal new items\n    var filteredItems = this._filterRevealAdded( items );\n    // add to filteredItems\n    this.filteredItems = this.filteredItems.concat( filteredItems );\n  };\n\n  // HEADS UP overwrites default Outlayer prepended\n  proto.prepended = function( elems ) {\n    var items = this._itemize( elems );\n    if ( !items.length ) {\n      return;\n    }\n    // start new layout\n    this._resetLayout();\n    this._manageStamps();\n    // filter, layout, reveal new items\n    var filteredItems = this._filterRevealAdded( items );\n    // layout previous items\n    this.layoutItems( this.filteredItems );\n    // add to items and filteredItems\n    this.filteredItems = filteredItems.concat( this.filteredItems );\n    this.items = items.concat( this.items );\n  };\n\n  proto._filterRevealAdded = function( items ) {\n    var filtered = this._filter( items );\n    this.hide( filtered.needHide );\n    // reveal all new items\n    this.reveal( filtered.matches );\n    // layout new items, no transition\n    this.layoutItems( filtered.matches, true );\n    return filtered.matches;\n  };\n\n  /**\n   * Filter, sort, and layout newly-appended item elements\n   * @param {Array or NodeList or Element} elems\n   */\n  proto.insert = function( elems ) {\n    var items = this.addItems( elems );\n    if ( !items.length ) {\n      return;\n    }\n    // append item elements\n    var i, item;\n    var len = items.length;\n    for ( i=0; i < len; i++ ) {\n      item = items[i];\n      this.element.appendChild( item.element );\n    }\n    // filter new stuff\n    var filteredInsertItems = this._filter( items ).matches;\n    // set flag\n    for ( i=0; i < len; i++ ) {\n      items[i].isLayoutInstant = true;\n    }\n    this.arrange();\n    // reset flag\n    for ( i=0; i < len; i++ ) {\n      delete items[i].isLayoutInstant;\n    }\n    this.reveal( filteredInsertItems );\n  };\n\n  var _remove = proto.remove;\n  proto.remove = function( elems ) {\n    elems = utils.makeArray( elems );\n    var removeItems = this.getItems( elems );\n    // do regular thing\n    _remove.call( this, elems );\n    // bail if no items to remove\n    var len = removeItems && removeItems.length;\n    // remove elems from filteredItems\n    for ( var i=0; len && i < len; i++ ) {\n      var item = removeItems[i];\n      // remove item from collection\n      utils.removeFrom( this.filteredItems, item );\n    }\n  };\n\n  proto.shuffle = function() {\n    // update random sortData\n    for ( var i=0; i < this.items.length; i++ ) {\n      var item = this.items[i];\n      item.sortData.random = Math.random();\n    }\n    this.options.sortBy = 'random';\n    this._sort();\n    this._layout();\n  };\n\n  /**\n   * trigger fn without transition\n   * kind of hacky to have this in the first place\n   * @param {Function} fn\n   * @param {Array} args\n   * @returns ret\n   * @private\n   */\n  proto._noTransition = function( fn, args ) {\n    // save transitionDuration before disabling\n    var transitionDuration = this.options.transitionDuration;\n    // disable transition\n    this.options.transitionDuration = 0;\n    // do it\n    var returnValue = fn.apply( this, args );\n    // re-enable transition for reveal\n    this.options.transitionDuration = transitionDuration;\n    return returnValue;\n  };\n\n  // ----- helper methods ----- //\n\n  /**\n   * getter method for getting filtered item elements\n   * @returns {Array} elems - collection of item elements\n   */\n  proto.getFilteredItemElements = function() {\n    return this.filteredItems.map( function( item ) {\n      return item.element;\n    });\n  };\n\n  // -----  ----- //\n\n  return Isotope;\n\n}));\n\n\n\n/***/ }),\n\n/***/ \"Gz0TuoFFs6JdDvtR2PYZ\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar matches = __webpack_require__(\"C2mk7N9JzKWlcOYJrkfi\")\n\n/**\n * closest : closest(el, selector)\n * Looks for the closest ancestor of element `el` that matches `selector`.\n * Compare with [$.fn.closest](http://api.jquery.com/closest/).\n *\n *     var closest = require('dom101/closest');\n *\n *     closest(input, 'label');\n */\n\nfunction closest (el, sel) {\n  if (!el) return\n  if (matches(el, sel)) {\n    return el\n  } else {\n    return closest(el.parentNode, sel)\n  }\n}\n\nmodule.exports = closest\n\n\n/***/ }),\n\n/***/ \"MKJaVdnD9jF7rk6rW6AJ\":\n/***/ (function(module, exports) {\n\n/**\n * on : on(el, event, fn)\n * Adds an event handler.\n *\n *     var on = require('dom101/on');\n *\n *     on(el, 'click', function () {\n *       ...\n *     });\n */\n\nfunction on (el, event, handler) {\n  if (el.addEventListener) {\n    el.addEventListener(event, handler)\n  } else {\n    el.attachEvent('on' + event, function () {\n      handler.call(el)\n    })\n  }\n}\n\nmodule.exports = on\n\n\n/***/ }),\n\n/***/ \"O7wD3s+p+jjyw5ivWGEg\":\n/***/ (function(module, exports) {\n\n/**\n * each : each(list, fn)\n * Iterates through `list` (an array or an object). This is useful when dealing\n * with NodeLists like `document.querySelectorAll`.\n *\n *     var each = require('dom101/each');\n *     var qa = require('dom101/query-selector-all');\n *\n *     each(qa('.button'), function (el) {\n *       addClass('el', 'selected');\n *     });\n */\n\nfunction each (list, fn) {\n  var i\n  var len = list.length\n  var idx\n\n  if (typeof len === 'number') {\n    for (i = 0; i < len; i++) {\n      fn(list[i], i)\n    }\n  } else {\n    idx = 0\n    for (i in list) {\n      if (list.hasOwnProperty(i)) {\n        fn(list[i], i, idx++)\n      }\n    }\n  }\n\n  return list\n}\n\nmodule.exports = each\n\n\n/***/ }),\n\n/***/ \"XxGrbZud7DE4W4TdQZtc\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _onmount = __webpack_require__(\"yfX/NEeqeNrvWENPWWKS\");\n\nvar _onmount2 = _interopRequireDefault(_onmount);\n\nvar _remove = __webpack_require__(\"wYegCzKWCG2ZRJZfGEZa\");\n\nvar _remove2 = _interopRequireDefault(_remove);\n\nvar _removeClass = __webpack_require__(\"bq+j3PCtCSGVXgg8xWPw\");\n\nvar _removeClass2 = _interopRequireDefault(_removeClass);\n\nvar _data = __webpack_require__(\"CjZN/azBHJxH2NsOjfdD\");\n\nvar _dismiss = __webpack_require__(\"2QOxTCxkuzN0PP2kJ2jn\");\n\nvar _preview = __webpack_require__(\"BF4TFfJ+K+wsuHfLZ/S3\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(0, _onmount2.default)('[data-js-dismissable]', function () {\n  var id = (0, _data.getData)(this, 'js-dismissable').id || '';\n\n  if ((0, _preview.isPreview)() || (0, _dismiss.isDismissed)(id)) {\n    (0, _remove2.default)(this);\n  } else {\n    (0, _removeClass2.default)(this, '-hide');\n  }\n});\n\n/***/ }),\n\n/***/ \"ahJreyGRfWuLMDCl+A3L\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.appendMany = appendMany;\nexports.nextUntil = nextUntil;\nexports.before = before;\nexports.findChildren = findChildren;\nexports.createDiv = createDiv;\n\nvar _matches = __webpack_require__(\"C2mk7N9JzKWlcOYJrkfi\");\n\nvar _matches2 = _interopRequireDefault(_matches);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n/*\n * Just like jQuery.append\n */\n\nfunction appendMany(el, children) {\n  children.forEach(function (child) {\n    el.appendChild(child);\n  });\n}\n\n/*\n * Just like jQuery.nextUntil\n */\n\nfunction nextUntil(el, selector) {\n  var nextEl = el.nextSibling;\n  return nextUntilTick(nextEl, selector, []);\n}\n\nfunction nextUntilTick(el, selector, acc) {\n  if (!el) return acc;\n\n  var isMatch = (0, _matches2.default)(el, selector);\n  if (isMatch) return acc;\n\n  return nextUntilTick(el.nextSibling, selector, [].concat(_toConsumableArray(acc), [el]));\n}\n\n/*\n * Just like jQuery.before\n */\n\nfunction before(reference, newNode) {\n  reference.parentNode.insertBefore(newNode, reference);\n}\n\n/*\n * Like jQuery.children('selector')\n */\n\nfunction findChildren(el, selector) {\n  return [].slice.call(el.children).filter(function (child) {\n    return (0, _matches2.default)(child, selector);\n  });\n}\n\n/**\n * Creates a div\n * @private\n *\n * @example\n *\n *     createDiv({ class: 'foo' })\n */\n\nfunction createDiv(props) {\n  var d = document.createElement('div');\n  Object.keys(props).forEach(function (key) {\n    d.setAttribute(key, props[key]);\n  });\n  return d;\n}\n\n/***/ }),\n\n/***/ \"azEBDvunS5n/qbuQInIF\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _closest = __webpack_require__(\"Gz0TuoFFs6JdDvtR2PYZ\");\n\nvar _closest2 = _interopRequireDefault(_closest);\n\nvar _remove = __webpack_require__(\"wYegCzKWCG2ZRJZfGEZa\");\n\nvar _remove2 = _interopRequireDefault(_remove);\n\nvar _on = __webpack_require__(\"MKJaVdnD9jF7rk6rW6AJ\");\n\nvar _on2 = _interopRequireDefault(_on);\n\nvar _data = __webpack_require__(\"CjZN/azBHJxH2NsOjfdD\");\n\nvar _onmount = __webpack_require__(\"yfX/NEeqeNrvWENPWWKS\");\n\nvar _onmount2 = _interopRequireDefault(_onmount);\n\nvar _dismiss = __webpack_require__(\"2QOxTCxkuzN0PP2kJ2jn\");\n\nvar Dismiss = _interopRequireWildcard(_dismiss);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Dismiss button\n */\n\n(0, _onmount2.default)('[data-js-dismiss]', function () {\n  var parent = (0, _closest2.default)(this, '[data-js-dismissable]');\n  var dismissable = (0, _data.getData)(parent, 'js-dismissable');\n  var id = dismissable && dismissable.id || '';\n\n  (0, _on2.default)(this, 'click', function (e) {\n    Dismiss.setDismissed(id);\n    e.preventDefault();\n    if (parent) (0, _remove2.default)(parent);\n  });\n});\n\n/***/ }),\n\n/***/ \"bq+j3PCtCSGVXgg8xWPw\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar each = __webpack_require__(\"O7wD3s+p+jjyw5ivWGEg\")\n\n/**\n * removeClass : removeClass(el, className)\n * Removes a classname.\n *\n *     var removeClass = require('dom101/remove-class');\n *\n *     el.className = 'selected active';\n *     removeClass(el, 'active');\n *\n *     el.className\n *     => \"selected\"\n */\n\nfunction removeClass (el, className) {\n  if (!className) return\n\n  if (Array.isArray(className)) {\n    each(className, function (className) {\n      removeClass(el, className)\n    })\n\n    return\n  }\n\n  if (el.classList) {\n    var classNames = className.split(' ').filter(Boolean)\n    each(classNames, function (className) {\n      el.classList.remove(className)\n    })\n  } else {\n    var expr =\n      new RegExp('(^|\\\\b)' + className.split(' ').join('|') + '(\\\\b|$)', 'gi')\n\n    el.className = el.className.replace(expr, ' ')\n  }\n}\n\nmodule.exports = removeClass\n\n\n/***/ }),\n\n/***/ \"cBdQffYQOU2SCSRXjSUx\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar map = {\n\t\"./anchors.js\": \"lpgA2dewefHNQWX4X3Mh\",\n\t\"./dismiss.js\": \"azEBDvunS5n/qbuQInIF\",\n\t\"./dismissable.js\": \"XxGrbZud7DE4W4TdQZtc\",\n\t\"./disqus.js\": \"BuWMdGeXUEK0GmkN01pU\",\n\t\"./h3-section-list.js\": \"E+dCGfS1pT5WowYv7jpv\",\n\t\"./main-body.js\": \"g3wkw0XZUos0Eo8rU7p6\",\n\t\"./no-preview.js\": \"k6EYej2Qda8Mq9A5Oeqn\",\n\t\"./search-form.js\": \"D3SYMdNAenu80VOO7/Dv\",\n\t\"./search-input.js\": \"zNHHVy5XxvKjnqTgwxy7\",\n\t\"./searchable-header.js\": \"veOabZWTWtixkn1TyITD\",\n\t\"./searchable-item.js\": \"tcev71HWHlq3Ur/sw7Ir\"\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"cBdQffYQOU2SCSRXjSUx\";\n\n/***/ }),\n\n/***/ \"cYqQDyTPtD7lV79ovj4Y\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = inject;\nexports.injectEmbed = injectEmbed;\nexports.injectCount = injectCount;\n/**\n * Injects disqus's scripts into the page.\n *\n * @example\n *     inject('devhints.disqus.com')\n */\n\nfunction inject(host) {\n  injectEmbed(host);\n  injectCount(host);\n}\n\nfunction injectEmbed(host) {\n  var d = document;\n  var s = d.createElement('script');\n  s.src = 'https://' + host + '/embed.js';\n  s.setAttribute('data-timestamp', +new Date());(d.head || d.body).appendChild(s);\n}\n\nfunction injectCount(host) {\n  var d = document;\n  var s = d.createElement('script');\n  s.src = 'https://' + host + '/count.js';\n  s.id = 'dsq-count-scr';\n  s.async = true;(d.head || d.body).appendChild(s);\n}\n\n/***/ }),\n\n/***/ \"djrEhtin0g5nRB/RnnLU\":\n/***/ (function(module, exports) {\n\n/**\n * prepend : prepend(el, child)\n * Prepends a `child` into a parent `el`. Compare with `$.fn.prepend`.\n *\n *     var prepend = require('dom101/prepend');\n *\n *     prepend(el, child);\n */\n\nfunction prepend (el, child) {\n  if (el.firstChild) {\n    el.insertBefore(child, el.firstChild)\n  } else {\n    el.appendChild(child)\n  }\n}\n\nmodule.exports = prepend\n\n\n/***/ }),\n\n/***/ \"g2okcHDGBNRpe9zqR9sR\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* blank */\n\n\n/***/ }),\n\n/***/ \"g3wkw0XZUos0Eo8rU7p6\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/***/ }),\n\n/***/ \"j059HZGO2uzpV/UZMXr3\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = qs;\nexports.qsdecode = qsdecode;\n/*\n * Helper: minimal qs implementation\n */\n\nfunction qs(search) {\n  search = search.substr(1);\n  var parts = search.split('&').map(function (p) {\n    return p.split('=');\n  });\n  return parts.reduce(function (result, part) {\n    result[part[0]] = qsdecode(part[1]);\n    return result;\n  }, {});\n}\n\nfunction qsdecode(string) {\n  if (!string) string = '';\n  string = string.replace(/\\+/g, ' ');\n  return string;\n}\n\n/***/ }),\n\n/***/ \"k6EYej2Qda8Mq9A5Oeqn\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _remove = __webpack_require__(\"wYegCzKWCG2ZRJZfGEZa\");\n\nvar _remove2 = _interopRequireDefault(_remove);\n\nvar _onmount = __webpack_require__(\"yfX/NEeqeNrvWENPWWKS\");\n\nvar _onmount2 = _interopRequireDefault(_onmount);\n\nvar _addClass = __webpack_require__(\"lGfezzQL7fc5RE8kg33g\");\n\nvar _addClass2 = _interopRequireDefault(_addClass);\n\nvar _preview = __webpack_require__(\"BF4TFfJ+K+wsuHfLZ/S3\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/*\n * Behavior: Things to remove when preview mode is on\n */\n\n(0, _onmount2.default)('[data-js-no-preview]', function (b) {\n  if ((0, _preview.isPreview)()) {\n    (0, _remove2.default)(this);\n    (0, _addClass2.default)(document.documentElement, 'PreviewMode');\n  }\n});\n\n/***/ }),\n\n/***/ \"lGfezzQL7fc5RE8kg33g\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar each = __webpack_require__(\"O7wD3s+p+jjyw5ivWGEg\")\n\n/**\n * addClass : addClass(el, className)\n * Adds a class name to an element. Compare with `$.fn.addClass`.\n *\n *     var addClass = require('dom101/add-class');\n *\n *     addClass(el, 'active');\n */\n\nfunction addClass (el, className) {\n  if (!className) return\n\n  if (Array.isArray(className)) {\n    each(className, function (className) {\n      addClass(el, className)\n    })\n\n    return\n  }\n\n  if (el.classList) {\n    var classNames = className.split(' ').filter(Boolean)\n    each(classNames, function (className) {\n      el.classList.add(className)\n    })\n  } else {\n    el.className += ' ' + className\n  }\n}\n\nmodule.exports = addClass\n\n\n/***/ }),\n\n/***/ \"lpgA2dewefHNQWX4X3Mh\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _onmount = __webpack_require__(\"yfX/NEeqeNrvWENPWWKS\");\n\nvar _onmount2 = _interopRequireDefault(_onmount);\n\nvar _prepend = __webpack_require__(\"djrEhtin0g5nRB/RnnLU\");\n\nvar _prepend2 = _interopRequireDefault(_prepend);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar DEFAULTS = {\n  // select elements to put anchor on\n  rule: 'h2[id]',\n  // class name for anchor\n  className: 'local-anchor anchor',\n  // text of anchor\n  text: '#',\n  // append before or after innerText?\n  shouldAppend: false\n\n  /*\n   * Behavior: Add local anchors\n   */\n\n};(0, _onmount2.default)('[data-js-anchors]', function () {\n  var data = JSON.parse(this.getAttribute('data-js-anchors') || '{}');\n  var rules = Array.isArray(data) ? data.length ? data : [DEFAULTS] : [Object.assign({}, DEFAULTS, data)];\n\n  var _iteratorNormalCompletion = true;\n  var _didIteratorError = false;\n  var _iteratorError = undefined;\n\n  try {\n    for (var _iterator = rules[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n      var _ref = _step.value;\n      var rule = _ref.rule;\n      var className = _ref.className;\n      var text = _ref.text;\n      var shouldAppend = _ref.shouldAppend;\n      var _iteratorNormalCompletion2 = true;\n      var _didIteratorError2 = false;\n      var _iteratorError2 = undefined;\n\n      try {\n        for (var _iterator2 = this.querySelectorAll(rule)[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n          var el = _step2.value;\n\n          if (!el.hasAttribute('id')) {\n            continue;\n          }\n\n          var id = el.getAttribute('id');\n          var anchor = document.createElement('a');\n          anchor.setAttribute('href', '#' + id);\n          anchor.setAttribute('class', className);\n          anchor.innerText = String(text || DEFAULTS.text);\n\n          if (shouldAppend) {\n            el.appendChild(anchor);\n          } else {\n            (0, _prepend2.default)(el, anchor);\n          }\n        }\n      } catch (err) {\n        _didIteratorError2 = true;\n        _iteratorError2 = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion2 && _iterator2.return) {\n            _iterator2.return();\n          }\n        } finally {\n          if (_didIteratorError2) {\n            throw _iteratorError2;\n          }\n        }\n      }\n    }\n  } catch (err) {\n    _didIteratorError = true;\n    _iteratorError = err;\n  } finally {\n    try {\n      if (!_iteratorNormalCompletion && _iterator.return) {\n        _iterator.return();\n      }\n    } finally {\n      if (_didIteratorError) {\n        throw _iteratorError;\n      }\n    }\n  }\n});\n\n/***/ }),\n\n/***/ \"tcev71HWHlq3Ur/sw7Ir\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _onmount = __webpack_require__(\"yfX/NEeqeNrvWENPWWKS\");\n\nvar _onmount2 = _interopRequireDefault(_onmount);\n\nvar _permutate = __webpack_require__(\"GOdGag34TlRuHa2OZoh9\");\n\nvar _permutate2 = _interopRequireDefault(_permutate);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Sets search indices (`data-search-index` attribute)\n */\n\n(0, _onmount2.default)('[data-js-searchable-item]', function () {\n  var data = JSON.parse(this.getAttribute('data-js-searchable-item') || '{}');\n  var words = (0, _permutate2.default)(data);\n\n  this.setAttribute('data-search-index', words.join(' '));\n});\n\n/***/ }),\n\n/***/ \"tqbVxj9+xGAhlFrQpyTS\":\n/***/ (function(module, exports) {\n\n/**\n * ready : ready(fn)\n * Executes `fn` when the DOM is ready. If the DOM is already ready, the given\n * callback will be called immediately.\n *\n *     var ready = require('dom101/ready');\n *\n *     ready(function () {\n *       ...\n *     });\n */\n\nfunction ready (fn) {\n  if (isReady()) {\n    return fn()\n  } else if (document.addEventListener) {\n    document.addEventListener('DOMContentLoaded', fn)\n  } else {\n    document.attachEvent('onreadystatechange', function () {\n      if (isReady()) fn()\n    })\n  }\n}\n\nfunction isReady () {\n  return (document.readyState === 'complete' || document.readyState === 'interactive')\n}\n\nmodule.exports = ready\n\n\n/***/ }),\n\n/***/ \"veOabZWTWtixkn1TyITD\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _onmount = __webpack_require__(\"yfX/NEeqeNrvWENPWWKS\");\n\nvar _onmount2 = _interopRequireDefault(_onmount);\n\nvar _dom = __webpack_require__(\"ahJreyGRfWuLMDCl+A3L\");\n\nvar _matches = __webpack_require__(\"C2mk7N9JzKWlcOYJrkfi\");\n\nvar _matches2 = _interopRequireDefault(_matches);\n\n__webpack_require__(\"tcev71HWHlq3Ur/sw7Ir\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Propagate item search indices to headers\n */\n\n(0, _onmount2.default)('[data-js-searchable-header]', function () {\n  var els = (0, _dom.nextUntil)(this, '[data-js-searchable-header]').filter(function (el) {\n    return (0, _matches2.default)(el, '[data-search-index]');\n  });\n\n  var keywords = els.map(function (n) {\n    return n.getAttribute('data-search-index');\n  }).join(' ').split(' ');\n\n  this.setAttribute('data-search-index', keywords.join(' '));\n});\n\n// Ensure that search-index is set first\n\n/***/ }),\n\n/***/ \"wYegCzKWCG2ZRJZfGEZa\":\n/***/ (function(module, exports) {\n\n/**\n * remove : remove(el)\n * Removes an element from the DOM.\n *\n *     var remove = require('dom101/remove');\n *\n *     remove(el);\n */\n\nfunction remove (el) {\n  el && el.parentNode && el.parentNode.removeChild(el)\n}\n\nmodule.exports = remove\n\n\n/***/ }),\n\n/***/ \"yfX/NEeqeNrvWENPWWKS\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/* global define */\nvoid (function (root, factory) {\n  if (true) !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\n  else if (typeof exports === 'object') module.exports = factory()\n  else {\n    if (window.jQuery) window.jQuery.onmount = factory()\n    else root.onmount = factory()\n  }\n}(this, function ($) {\n  /*\n   * Internal: Registry.\n   */\n\n  var handlers, behaviors, selectors, log\n\n  /*\n   * Internal: IDs for auto-incrementing.\n   */\n\n  var bid = 0 /* behavior ID */\n  var cid = 0 /* component ID */\n\n  /**\n   * (Module) Adds a behavior, or triggers behaviors.\n   *\n   * When no parameters are passed, it triggers all behaviors. When one\n   * parameter is passed, it triggers the given behavior. Otherwise, it adds a\n   * behavior.\n   *\n   *     // define a behavior\n   *     $.onmount('.select-box', function () {\n   *       $(this).on('...')\n   *     })\n   *\n   *     // define a behavior with exit\n   *     $.onmount('.select-box', function () {\n   *       $(document).on('...')\n   *     }, function () {\n   *       $(document).off('...')\n   *     })\n   *\n   *     // retrigger a onmount\n   *     $.onmount('.select-box')\n   *\n   *     // retriggers all behaviors\n   *     $.onmount()\n   */\n\n  function onmount (selector, init, exit, options) {\n    if (typeof exit === 'object') {\n      options = exit\n      exit = undefined\n    }\n\n    if (arguments.length === 0 || isjQuery(selector) || isEvent(selector)) {\n      // onmount() - trigger all behaviors. Also account for cases such as\n      // $($.onmount), where it's triggered with a jQuery event object.\n      onmount.poll()\n    } else if (arguments.length === 1) {\n      // onmount(selector) - trigger for a given selector.\n      onmount.poll(selector)\n    } else {\n      // onmount(sel, fn, [fn]) - register a new behavior.\n      var be = new Behavior(selector, init, exit, options)\n      behaviors.push(be)\n      be.register()\n    }\n\n    return this\n  }\n\n  /*\n   * Use jQuery (or a jQuery-like) when available. This will allow\n   * the use of jQuery selectors.\n   */\n\n  onmount.$ = window.jQuery || window.Zepto || window.Ender\n\n  /*\n   * Detect MutationObserver support for `onmount.observe()`.\n   * You may even add a polyfill here via\n   * `onmount.MutationObserver = require('mutation-observer')`.\n   */\n\n  onmount.MutationObserver =\n    window.MutationObserver ||\n    window.WebKitMutationObserver ||\n    window.MozMutationObserver\n\n  /**\n   * Set this to true if you want to see debug messages.\n   */\n\n  onmount.debug = false\n\n  /**\n   * Internal: triggers behaviors for a selector or for all.\n   *\n   *     onmount.poll()\n   *     onmount.poll('.js-button')\n   */\n\n  onmount.poll = function poll (selector) {\n    if (selector) selector = onmount.selectify(selector)\n    var functions = (selector ? selectors[selector] : handlers) || []\n    each(functions, function (fn) { fn() })\n  }\n\n  /**\n   * Observes automatically using MutationObserver events.\n   *\n   *     onmount.observe()\n   */\n\n  onmount.observe = function observe () {\n    var MutationObserver = onmount.MutationObserver\n    if (typeof MutationObserver === 'undefined') return\n\n    var obs = new MutationObserver(function (mutations) {\n      each(behaviors, function (be) {\n        each(mutations, function (mutation) {\n          each(mutation.addedNodes, function (el) {\n            if (matches(el, be.selector)) be.visitEnter(el)\n          })\n\n          each(mutation.removedNodes, function (el) {\n            if (matches(el, be.selector)) be.doExit(el)\n          })\n        })\n      })\n    })\n\n    obs.observe(document, { subtree: true, childList: true })\n    onmount.observer = obs\n\n    // trigger everything before going\n    onmount()\n    return true\n  }\n\n  /**\n   * Turns off observation first issued by `onmount.observe()`.\n   */\n\n  onmount.unobserve = function unobserve () {\n    if (!this.observer) return\n    this.observer.disconnect()\n    delete this.observer\n  }\n\n  /**\n   * Forces teardown of all behaviors currently applied.\n   */\n\n  onmount.teardown = function teardown () {\n    each(behaviors, function (be) {\n      each(be.loaded, function (el, i) {\n        if (el) be.doExit(el, i)\n      })\n    })\n  }\n\n  /**\n   * Clears all behaviors. Useful for tests.\n   * This will NOT call exit handlers.\n   */\n\n  onmount.reset = function reset () {\n    handlers = onmount.handlers = []\n    selectors = onmount.selectors = {}\n    behaviors = onmount.behaviors = []\n  }\n\n  /**\n   * Internal: Converts `@role` to `[role~=\"role\"]` if needed. You can override\n   * this by reimplementing `onmount.selectify`.\n   *\n   *     selectify('@hi')   //=> '[role=\"hi\"]'\n   *     selectify('.btn')  //=> '.btn'\n   */\n\n  onmount.selectify = function selectify (selector) {\n    if (selector[0] === '@') {\n      return '[role~=\"' + selector.substr(1).replace(/\"/g, '\\\\\"') + '\"]'\n    }\n    return selector\n  }\n\n  /**\n   * Internal: behavior class\n   */\n\n  function Behavior (selector, init, exit, options) {\n    this.id = 'b' + bid++\n    this.init = init\n    this.exit = exit\n    this.selector = onmount.selectify(selector)\n    this.loaded = [] // keep track of dom elements loaded for this behavior\n    this.key = '__onmount:' + bid // leave the state in el['__onmount:12']\n    this.detectMutate = options && options.detectMutate\n  }\n\n  /**\n   * Internal: initialize this behavior by registering itself to the internal\n   * `selectors` map. This allows you to call `onmount(selector)` later on.\n   */\n\n  Behavior.prototype.register = function () {\n    var be = this\n    var loaded = this.loaded\n    var selector = this.selector\n\n    register(selector, function () {\n      var list = query(selector)\n\n      // This is the function invoked on `onmount(selector)`.\n      // Clean up old ones (if they're not in the DOM anymore).\n      each(loaded, function (element, i) {\n        be.visitExit(element, i, list)\n      })\n\n      // Clean up new ones (if they're not loaded yet).\n      eachOf(list, function (element) {\n        be.visitEnter(element)\n      })\n    })\n  }\n\n  /**\n   * Internal: visits the element `el` and turns it on if applicable.\n   */\n\n  Behavior.prototype.visitEnter = function (el) {\n    if (el[this.key]) return\n    var options = { id: 'c' + cid, selector: this.selector }\n    if (this.init.call(el, options) !== false) {\n      if (onmount.debug) log('enter', this.selector, el)\n      el[this.key] = options\n      this.loaded.push(el)\n      cid++\n    }\n  }\n\n  /**\n   * Internal: visits the element `el` and sees if it needs its exit handler\n   * called.\n   */\n\n  Behavior.prototype.visitExit = function (el, i, list) {\n    if (!el) return\n    if (this.detectMutate) {\n      if (!has(list, el)) return this.doExit(el, i)\n    } else {\n      if (!isAttached(el)) return this.doExit(el, i)\n    }\n  }\n\n  /**\n   * Internal: calls the exit handler for the behavior for element `el` (if\n   * available), and marks the behavior/element as uninitialized.\n   */\n\n  Behavior.prototype.doExit = function (el, i) {\n    if (typeof i === 'undefined') i = this.loaded.indexOf(el)\n    this.loaded[i] = undefined\n    if (this.exit && this.exit.call(el, el[this.key]) !== false) {\n      if (onmount.debug) log('exit', this.selector, el)\n      delete el[this.key]\n    }\n  }\n\n  /**\n   * Internal: check if an element is still attached to its document.\n   */\n\n  function isAttached (el) {\n    while (el) {\n      if (el === document.documentElement) return true\n      el = el.parentElement\n    }\n  }\n\n  /**\n   * Internal: reimplementation of `$('...')`. If jQuery is available,\n   * use it (I guess to preserve IE compatibility and to enable special jQuery\n   * attribute selectors). Use with `eachOf()` or `has()`.\n   */\n\n  function query (selector, fn) {\n    if (onmount.$) return onmount.$(selector)\n    return document.querySelectorAll(selector)\n  }\n\n  /**\n   * Internal: iterates through a `query()` result.\n   */\n\n  function eachOf (list, fn) {\n    if (onmount.$) return list.each(function (i) { fn(this, i) })\n    return each(list, fn)\n  }\n\n  /**\n   * Interanl: checks if given element `el` is in the query result `list`.\n   */\n\n  function has (list, el) {\n    if (onmount.$) return list.index(el) > -1\n    return list.indexOf(el) > -1\n  }\n\n  /**\n   * Internal: registers a behavior handler for a selector.\n   */\n\n  function register (selector, fn) {\n    if (!selectors[selector]) selectors[selector] = []\n    selectors[selector].push(fn)\n    handlers.push(fn)\n  }\n\n  /**\n   * Checks if a given element `el` matches `selector`.\n   * Compare with [$.fn.is](http://api.jquery.com/is/).\n   *\n   *     var matches = require('dom101/matches');\n   *\n   *     matches(button, ':focus');\n   */\n\n  function matches (el, selector) {\n    var _matches = el.matches ||\n      el.matchesSelector ||\n      el.msMatchesSelector ||\n      el.mozMatchesSelector ||\n      el.webkitMatchesSelector ||\n      el.oMatchesSelector\n\n    if (onmount.$) {\n      return onmount.$(el).is(selector)\n    } else if (_matches) {\n      return _matches.call(el, selector)\n    } else if (el.parentNode) {\n      // IE8 and below\n      var nodes = el.parentNode.querySelectorAll(selector)\n      for (var i = nodes.length; i--; 0) {\n        if (nodes[i] === el) return true\n      }\n      return false\n    }\n  }\n\n  /**\n   * Iterates through `list` (an array or an object). This is useful when dealing\n   * with NodeLists like `document.querySelectorAll`.\n   *\n   *     var each = require('dom101/each');\n   *     var qa = require('dom101/query-selector-all');\n   *\n   *     each(qa('.button'), function (el) {\n   *       addClass('el', 'selected');\n   *     });\n   */\n\n  function each (list, fn) {\n    var i\n    var len = list.length\n\n    if (len === +len) {\n      for (i = 0; i < len; i++) { fn(list[i], i) }\n    } else {\n      for (i in list) {\n        if (list.hasOwnProperty(i)) fn(list[i], i)\n      }\n    }\n\n    return list\n  }\n\n  /**\n   * Internal: Check if a given object is jQuery\n   */\n\n  function isjQuery ($) {\n    return typeof $ === 'function' && $.fn && $.noConflict\n  }\n\n  function isEvent (e) {\n    return typeof e === 'object' && e.target\n  }\n\n  /**\n   * Internal: logging\n   */\n\n  var styles = {\n    enter: 'background-color:#dfd;font-weight:bold;color:#141',\n    exit: 'background-color:#fdd;font-weight:bold;color:#411'\n  }\n\n  if (~navigator.userAgent.indexOf('Mozilla')) {\n    log = function (type, selector, el) {\n      console.log('%c %s ', styles[type], selector, el)\n    }\n  } else {\n    log = function (type, selector, el) {\n      console.log('(onmount)', type, selector)\n    }\n  }\n\n  /*\n   * Export\n   */\n\n  onmount.reset()\n  return onmount\n}))\n\n\n/***/ }),\n\n/***/ \"z+w/DGZianwIMo5d4qOD\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// 3rd party libs\nwindow.Prism = __webpack_require__(\"+HohgKHTHTXOIAa8uoqY\");\n\n// All the others\nfunction requireAll(r) {\n  r.keys().forEach(r);\n}\nrequireAll(__webpack_require__(\"2tov+8o2NrZdw/Lg8JZA\"));\nrequireAll(__webpack_require__(\"cBdQffYQOU2SCSRXjSUx\"));\n\n/***/ }),\n\n/***/ \"zNHHVy5XxvKjnqTgwxy7\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _onmount = __webpack_require__(\"yfX/NEeqeNrvWENPWWKS\");\n\nvar _onmount2 = _interopRequireDefault(_onmount);\n\nvar _search = __webpack_require__(\"DfTyEU8lscjHXmCMlptO\");\n\nvar Search = _interopRequireWildcard(_search);\n\nvar _qs = __webpack_require__(\"j059HZGO2uzpV/UZMXr3\");\n\nvar _qs2 = _interopRequireDefault(_qs);\n\nvar _on = __webpack_require__(\"MKJaVdnD9jF7rk6rW6AJ\");\n\nvar _on2 = _interopRequireDefault(_on);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(0, _onmount2.default)('[data-js-search-input]', function () {\n  var _this = this;\n\n  (0, _on2.default)(this, 'input', function () {\n    var val = _this.value;\n\n    if (val === '') {\n      Search.showAll();\n    } else {\n      Search.show(val);\n    }\n  });\n\n  var query = ((0, _qs2.default)(window.location.search) || {}).q;\n  if (query && query.length) {\n    this.value = query;\n    setTimeout(function () {\n      Search.show(query);\n    });\n  }\n});\n\n/***/ })\n\n},[\"z+w/DGZianwIMo5d4qOD\"]);\n\n\n// WEBPACK FOOTER //\n// app.js","/**\n * Updates a local storage key. If it doesn't exist, it defaults to an empty\n * object.\n *\n * @example\n *     update('dismissed', (data) => {\n *       data.lol = true\n *       return data\n *     })\n */\n\nexport function update (key, fn) {\n  if (!window.localStorage) return\n  let data = JSON.parse(window.localStorage[key] || '{}')\n  data = fn(data)\n  window.localStorage[key] = JSON.stringify(data)\n}\n\n/**\n * Fetches a local storage key.\n *\n * @example\n *     const data = fetch('dismissed')\n */\n\nexport function fetch (key) {\n  if (!window.localStorage) return\n  return JSON.parse(window.localStorage[key] || '{}')\n}\n\n\n\n// WEBPACK FOOTER //\n// ./_js/helpers/store.js","import * as Store from './store'\n\n/**\n * Dismisses an announcement.\n *\n * @example\n *     setDismissed('2017-09-02-happy-birthday')\n */\n\nexport function setDismissed (id) {\n  Store.update('dismissed', function (data) {\n    data[id] = true\n    return data\n  })\n}\n\n/**\n * Checks if an announcement has been dismissed before.\n *\n * @example\n *     setDismissed('2017-09-02-happy-birthday')\n *     isDismissed('2017-09-02-happy-birthday') => true\n */\n\nexport function isDismissed (id) {\n  const data = Store.fetch('dismissed')\n  return data && data[id]\n}\n\n\n\n// WEBPACK FOOTER //\n// ./_js/helpers/dismiss.js","var map = {\n\t\"./onmount.js\": \"6hLKOGpXaWUwTDQA5TL2\"\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"2tov+8o2NrZdw/Lg8JZA\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./_js/initializers \\.js$\n// module id = 2tov+8o2NrZdw/Lg8JZA\n// module chunks = 0","import ready from 'dom101/ready'\nimport onmount from 'onmount'\n\n/**\n * Behavior: Wrapping\n */\n\nready(() => {\n  setTimeout(() => { onmount() })\n})\n\n\n\n// WEBPACK FOOTER //\n// ./_js/initializers/onmount.js","/**\n * Checks if we're in preview mode (?preview=1).\n */\n\nexport function isPreview () {\n  return window.location.search.indexOf('preview=1') !== -1\n}\n\n\n\n// WEBPACK FOOTER //\n// ./_js/helpers/preview.js","import onmount from 'onmount'\nimport injectDisqus from '../helpers/inject_disqus'\n\n/**\n * Delay disqus by some time. It's at the bottom of the page, there's no need\n * for it to load fast. This will give more time to load more critical assets.\n */\n\nconst DISQUS_DELAY = 100\n\n/**\n * Injects Disqus onto the page.\n */\n\nonmount('[data-js-disqus]', function () {\n  const data = JSON.parse(this.getAttribute('data-js-disqus'))\n  const $parent = this.parentNode\n  $parent.setAttribute('hidden', true)\n\n  window.disqus_config = function () {\n    this.page.url = data.url\n    this.page.identifier = data.identifier\n  }\n\n  // Disqus takes a while to load, don't do it so eagerly.\n  window.addEventListener('load', () => {\n    setTimeout(() => {\n      injectDisqus(data.host)\n      $parent.removeAttribute('hidden')\n    }, DISQUS_DELAY)\n  })\n})\n\n\n\n// WEBPACK FOOTER //\n// ./_js/behaviors/disqus.js","/**\n * matches : matches(el, selector)\n * Checks if a given element `el` matches `selector`.\n * Compare with [$.fn.is](http://api.jquery.com/is/).\n *\n *     var matches = require('dom101/matches');\n *\n *     matches(button, ':focus');\n */\n\nfunction matches (el, selector) {\n  var _matches = el.matches ||\n    el.matchesSelector ||\n    el.msMatchesSelector ||\n    el.mozMatchesSelector ||\n    el.webkitMatchesSelector ||\n    el.oMatchesSelector\n\n  if (_matches) {\n    return _matches.call(el, selector)\n  } else if (el.parentNode) {\n    // IE8 and below\n    var nodes = el.parentNode.querySelectorAll(selector)\n    for (var i = nodes.length; i--; 0) {\n      if (nodes[i] === el) return true\n    }\n    return false\n  }\n}\n\nmodule.exports = matches\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom101/matches.js\n// module id = C2mk7N9JzKWlcOYJrkfi\n// module chunks = 0","/**\n * Stores and retrieves data from an element. Works like jQuery.data().\n */\n\nexport function data (el, key, val) {\n  if (typeof val !== 'undefined') {\n    return getData(el, key)\n  } else {\n    return setData(el, key, val)\n  }\n}\n\nexport function getData (el, key) {\n  const str = el.getAttribute('data-' + key)\n  return JSON.parse(str || '{}')\n}\n\nexport function setData (el, key, val) {\n  el.setAttribute('data-' + key, JSON.stringify(val))\n}\n\n\n\n// WEBPACK FOOTER //\n// ./_js/helpers/data.js","import onmount from 'onmount'\nimport on from 'dom101/on'\n\n/**\n * Submitting the search form\n */\n\nonmount('[data-js-search-form]', function () {\n  on(this, 'submit', e => {\n    e.preventDefault()\n\n    const link = document.querySelector('a[data-search-index]:visible')\n    const href = link && link.getAttribute('href')\n\n    if (href) window.location = href\n  })\n})\n\n\n\n// WEBPACK FOOTER //\n// ./_js/behaviors/search-form.js","import { splitwords } from './permutate'\nimport qsa from 'dom101/query-selector-all'\n\n/**\n * Show everything.\n *\n * @example\n *     Search.showAll()\n */\n\nexport function showAll () {\n  qsa('[data-search-index]').forEach(el => {\n    el.removeAttribute('aria-hidden')\n  })\n}\n\n/**\n * Search for a given keyword.\n *\n * @example\n *     Search.show('hello')\n */\n\nexport function show (val) {\n  const keywords = splitwords(val)\n\n  if (!keywords.length) return showAll()\n\n  const selectors = keywords\n    .map(k => `[data-search-index~=${JSON.stringify(k)}]`)\n    .join('')\n\n  qsa('[data-search-index]').forEach(el => {\n    el.setAttribute('aria-hidden', true)\n  })\n\n  qsa(selectors).forEach(el => {\n    el.removeAttribute('aria-hidden')\n  })\n}\n\n\n\n// WEBPACK FOOTER //\n// ./_js/helpers/search.js","/* eslint-disable no-new */\n\nimport Isotope from 'isotope-layout/dist/isotope.pkgd.js'\nimport onmount from 'onmount'\nimport on from 'dom101/on'\nimport qsa from 'dom101/query-selector-all'\n\n/*\n * Behavior: Isotope\n */\n\nonmount('[data-js-h3-section-list]', function () {\n  const iso = new Isotope(this, {\n    itemSelector: '.h3-section',\n    transitionDuration: 0\n  })\n\n  const images = qsa('img', this)\n\n  images.forEach(image => {\n    on(image, 'load', () => {\n      iso.layout()\n    })\n  })\n\n  // Insurance against weirdness on pages like devhints.io/vim, where the\n  // critical path CSS may look different from the final CSS (because of the\n  // tables).\n  on(window, 'load', () => {\n    iso.layout()\n  })\n})\n\n\n\n// WEBPACK FOOTER //\n// ./_js/behaviors/h3-section-list.js","/**\n * querySelectorAll : querySelectorAll(query, [element])\n * Convenience function to access `document.querySelectorAll`. Unlike the\n * default version, this always returns an array.\n *\n * If a 2nd parameter `element` is given, it only searches for descendants of\n * that element.\n *\n *     var each = require('dom101/each');\n *     var qsa = require('dom101/query-selector-all');\n *\n *     qsa('.button').each(el => {\n *       addClass('el', 'selected');\n *     };\n */\n\nfunction querySelectorAll (query, context) {\n  return Array.prototype.slice.call(\n    (context || document).querySelectorAll(query)\n  )\n}\n\nmodule.exports = querySelectorAll\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom101/query-selector-all.js\n// module id = EvxNxLK9yKFmn1U14Kvw\n// module chunks = 0","/**\n * Permutates a searcheable item.\n *\n *     permutate({\n *       slug: 'hello-world',\n *       category: 'greetings'\n *     })\n */\n\nexport default function permutate (data) {\n  let words = []\n  if (data.slug) {\n    words = words.concat(permutateString(data.slug))\n  }\n  if (data.category) {\n    words = words.concat(permutateString(data.category))\n  }\n  return words\n}\n\n/**\n * Permutates strings.\n *\n * @example\n *     permutateString('hi joe')\n *     => ['h', 'hi', 'j', 'jo', 'joe']\n */\n\nexport function permutateString (str) {\n  let words = []\n  let inputs = splitwords(str)\n\n  inputs.forEach(word => {\n    words = words.concat(permutateWord(word))\n  })\n\n  return words\n}\n\n/**\n * Permutates a word.\n *\n * @example\n *     permutateWord('hello')\n *     => ['h', 'he', 'hel', 'hell', 'hello']\n */\n\nexport function permutateWord (str) {\n  let words = []\n  const len = str.length\n  for (var i = 1; i <= len; ++i) {\n    words.push(str.substr(0, i))\n  }\n  return words\n}\n\n/**\n * Helper for splitting to words.\n *\n * @example\n *     splitWords('Hello, world!')\n *     => ['hello', 'world']\n */\n\nexport function splitwords (str) {\n  const words = str.toLowerCase()\n    .split(/[ /\\-_]/)\n    .filter(k => k && k.length !== 0)\n\n  return words\n}\n\n\n\n// WEBPACK FOOTER //\n// ./_js/helpers/permutate.js","/*!\n * Isotope PACKAGED v3.0.4\n *\n * Licensed GPLv3 for open source use\n * or Isotope Commercial License for commercial use\n *\n * http://isotope.metafizzy.co\n * Copyright 2017 Metafizzy\n */\n\n/**\n * Bridget makes jQuery widgets\n * v2.0.1\n * MIT license\n */\n\n/* jshint browser: true, strict: true, undef: true, unused: true */\n\n( function( window, factory ) {\n  // universal module definition\n  /*jshint strict: false */ /* globals define, module, require */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( 'jquery-bridget/jquery-bridget',[ 'jquery' ], function( jQuery ) {\n      return factory( window, jQuery );\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('jquery')\n    );\n  } else {\n    // browser global\n    window.jQueryBridget = factory(\n      window,\n      window.jQuery\n    );\n  }\n\n}( window, function factory( window, jQuery ) {\n'use strict';\n\n// ----- utils ----- //\n\nvar arraySlice = Array.prototype.slice;\n\n// helper function for logging errors\n// $.error breaks jQuery chaining\nvar console = window.console;\nvar logError = typeof console == 'undefined' ? function() {} :\n  function( message ) {\n    console.error( message );\n  };\n\n// ----- jQueryBridget ----- //\n\nfunction jQueryBridget( namespace, PluginClass, $ ) {\n  $ = $ || jQuery || window.jQuery;\n  if ( !$ ) {\n    return;\n  }\n\n  // add option method -> $().plugin('option', {...})\n  if ( !PluginClass.prototype.option ) {\n    // option setter\n    PluginClass.prototype.option = function( opts ) {\n      // bail out if not an object\n      if ( !$.isPlainObject( opts ) ){\n        return;\n      }\n      this.options = $.extend( true, this.options, opts );\n    };\n  }\n\n  // make jQuery plugin\n  $.fn[ namespace ] = function( arg0 /*, arg1 */ ) {\n    if ( typeof arg0 == 'string' ) {\n      // method call $().plugin( 'methodName', { options } )\n      // shift arguments by 1\n      var args = arraySlice.call( arguments, 1 );\n      return methodCall( this, arg0, args );\n    }\n    // just $().plugin({ options })\n    plainCall( this, arg0 );\n    return this;\n  };\n\n  // $().plugin('methodName')\n  function methodCall( $elems, methodName, args ) {\n    var returnValue;\n    var pluginMethodStr = '$().' + namespace + '(\"' + methodName + '\")';\n\n    $elems.each( function( i, elem ) {\n      // get instance\n      var instance = $.data( elem, namespace );\n      if ( !instance ) {\n        logError( namespace + ' not initialized. Cannot call methods, i.e. ' +\n          pluginMethodStr );\n        return;\n      }\n\n      var method = instance[ methodName ];\n      if ( !method || methodName.charAt(0) == '_' ) {\n        logError( pluginMethodStr + ' is not a valid method' );\n        return;\n      }\n\n      // apply method, get return value\n      var value = method.apply( instance, args );\n      // set return value if value is returned, use only first value\n      returnValue = returnValue === undefined ? value : returnValue;\n    });\n\n    return returnValue !== undefined ? returnValue : $elems;\n  }\n\n  function plainCall( $elems, options ) {\n    $elems.each( function( i, elem ) {\n      var instance = $.data( elem, namespace );\n      if ( instance ) {\n        // set options & init\n        instance.option( options );\n        instance._init();\n      } else {\n        // initialize new instance\n        instance = new PluginClass( elem, options );\n        $.data( elem, namespace, instance );\n      }\n    });\n  }\n\n  updateJQuery( $ );\n\n}\n\n// ----- updateJQuery ----- //\n\n// set $.bridget for v1 backwards compatibility\nfunction updateJQuery( $ ) {\n  if ( !$ || ( $ && $.bridget ) ) {\n    return;\n  }\n  $.bridget = jQueryBridget;\n}\n\nupdateJQuery( jQuery || window.jQuery );\n\n// -----  ----- //\n\nreturn jQueryBridget;\n\n}));\n\n/**\n * EvEmitter v1.0.3\n * Lil' event emitter\n * MIT License\n */\n\n/* jshint unused: true, undef: true, strict: true */\n\n( function( global, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /* globals define, module, window */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD - RequireJS\n    define( 'ev-emitter/ev-emitter',factory );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS - Browserify, Webpack\n    module.exports = factory();\n  } else {\n    // Browser globals\n    global.EvEmitter = factory();\n  }\n\n}( typeof window != 'undefined' ? window : this, function() {\n\n\n\nfunction EvEmitter() {}\n\nvar proto = EvEmitter.prototype;\n\nproto.on = function( eventName, listener ) {\n  if ( !eventName || !listener ) {\n    return;\n  }\n  // set events hash\n  var events = this._events = this._events || {};\n  // set listeners array\n  var listeners = events[ eventName ] = events[ eventName ] || [];\n  // only add once\n  if ( listeners.indexOf( listener ) == -1 ) {\n    listeners.push( listener );\n  }\n\n  return this;\n};\n\nproto.once = function( eventName, listener ) {\n  if ( !eventName || !listener ) {\n    return;\n  }\n  // add event\n  this.on( eventName, listener );\n  // set once flag\n  // set onceEvents hash\n  var onceEvents = this._onceEvents = this._onceEvents || {};\n  // set onceListeners object\n  var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\n  // set flag\n  onceListeners[ listener ] = true;\n\n  return this;\n};\n\nproto.off = function( eventName, listener ) {\n  var listeners = this._events && this._events[ eventName ];\n  if ( !listeners || !listeners.length ) {\n    return;\n  }\n  var index = listeners.indexOf( listener );\n  if ( index != -1 ) {\n    listeners.splice( index, 1 );\n  }\n\n  return this;\n};\n\nproto.emitEvent = function( eventName, args ) {\n  var listeners = this._events && this._events[ eventName ];\n  if ( !listeners || !listeners.length ) {\n    return;\n  }\n  var i = 0;\n  var listener = listeners[i];\n  args = args || [];\n  // once stuff\n  var onceListeners = this._onceEvents && this._onceEvents[ eventName ];\n\n  while ( listener ) {\n    var isOnce = onceListeners && onceListeners[ listener ];\n    if ( isOnce ) {\n      // remove listener\n      // remove before trigger to prevent recursion\n      this.off( eventName, listener );\n      // unset once flag\n      delete onceListeners[ listener ];\n    }\n    // trigger listener\n    listener.apply( this, args );\n    // get next listener\n    i += isOnce ? 0 : 1;\n    listener = listeners[i];\n  }\n\n  return this;\n};\n\nreturn EvEmitter;\n\n}));\n\n/*!\n * getSize v2.0.2\n * measure size of elements\n * MIT license\n */\n\n/*jshint browser: true, strict: true, undef: true, unused: true */\n/*global define: false, module: false, console: false */\n\n( function( window, factory ) {\n  'use strict';\n\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( 'get-size/get-size',[],function() {\n      return factory();\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory();\n  } else {\n    // browser global\n    window.getSize = factory();\n  }\n\n})( window, function factory() {\n'use strict';\n\n// -------------------------- helpers -------------------------- //\n\n// get a number from a string, not a percentage\nfunction getStyleSize( value ) {\n  var num = parseFloat( value );\n  // not a percent like '100%', and a number\n  var isValid = value.indexOf('%') == -1 && !isNaN( num );\n  return isValid && num;\n}\n\nfunction noop() {}\n\nvar logError = typeof console == 'undefined' ? noop :\n  function( message ) {\n    console.error( message );\n  };\n\n// -------------------------- measurements -------------------------- //\n\nvar measurements = [\n  'paddingLeft',\n  'paddingRight',\n  'paddingTop',\n  'paddingBottom',\n  'marginLeft',\n  'marginRight',\n  'marginTop',\n  'marginBottom',\n  'borderLeftWidth',\n  'borderRightWidth',\n  'borderTopWidth',\n  'borderBottomWidth'\n];\n\nvar measurementsLength = measurements.length;\n\nfunction getZeroSize() {\n  var size = {\n    width: 0,\n    height: 0,\n    innerWidth: 0,\n    innerHeight: 0,\n    outerWidth: 0,\n    outerHeight: 0\n  };\n  for ( var i=0; i < measurementsLength; i++ ) {\n    var measurement = measurements[i];\n    size[ measurement ] = 0;\n  }\n  return size;\n}\n\n// -------------------------- getStyle -------------------------- //\n\n/**\n * getStyle, get style of element, check for Firefox bug\n * https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n */\nfunction getStyle( elem ) {\n  var style = getComputedStyle( elem );\n  if ( !style ) {\n    logError( 'Style returned ' + style +\n      '. Are you running this code in a hidden iframe on Firefox? ' +\n      'See http://bit.ly/getsizebug1' );\n  }\n  return style;\n}\n\n// -------------------------- setup -------------------------- //\n\nvar isSetup = false;\n\nvar isBoxSizeOuter;\n\n/**\n * setup\n * check isBoxSizerOuter\n * do on first getSize() rather than on page load for Firefox bug\n */\nfunction setup() {\n  // setup once\n  if ( isSetup ) {\n    return;\n  }\n  isSetup = true;\n\n  // -------------------------- box sizing -------------------------- //\n\n  /**\n   * WebKit measures the outer-width on style.width on border-box elems\n   * IE & Firefox<29 measures the inner-width\n   */\n  var div = document.createElement('div');\n  div.style.width = '200px';\n  div.style.padding = '1px 2px 3px 4px';\n  div.style.borderStyle = 'solid';\n  div.style.borderWidth = '1px 2px 3px 4px';\n  div.style.boxSizing = 'border-box';\n\n  var body = document.body || document.documentElement;\n  body.appendChild( div );\n  var style = getStyle( div );\n\n  getSize.isBoxSizeOuter = isBoxSizeOuter = getStyleSize( style.width ) == 200;\n  body.removeChild( div );\n\n}\n\n// -------------------------- getSize -------------------------- //\n\nfunction getSize( elem ) {\n  setup();\n\n  // use querySeletor if elem is string\n  if ( typeof elem == 'string' ) {\n    elem = document.querySelector( elem );\n  }\n\n  // do not proceed on non-objects\n  if ( !elem || typeof elem != 'object' || !elem.nodeType ) {\n    return;\n  }\n\n  var style = getStyle( elem );\n\n  // if hidden, everything is 0\n  if ( style.display == 'none' ) {\n    return getZeroSize();\n  }\n\n  var size = {};\n  size.width = elem.offsetWidth;\n  size.height = elem.offsetHeight;\n\n  var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';\n\n  // get all measurements\n  for ( var i=0; i < measurementsLength; i++ ) {\n    var measurement = measurements[i];\n    var value = style[ measurement ];\n    var num = parseFloat( value );\n    // any 'auto', 'medium' value will be 0\n    size[ measurement ] = !isNaN( num ) ? num : 0;\n  }\n\n  var paddingWidth = size.paddingLeft + size.paddingRight;\n  var paddingHeight = size.paddingTop + size.paddingBottom;\n  var marginWidth = size.marginLeft + size.marginRight;\n  var marginHeight = size.marginTop + size.marginBottom;\n  var borderWidth = size.borderLeftWidth + size.borderRightWidth;\n  var borderHeight = size.borderTopWidth + size.borderBottomWidth;\n\n  var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;\n\n  // overwrite width and height if we can get it from style\n  var styleWidth = getStyleSize( style.width );\n  if ( styleWidth !== false ) {\n    size.width = styleWidth +\n      // add padding and border unless it's already including it\n      ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth );\n  }\n\n  var styleHeight = getStyleSize( style.height );\n  if ( styleHeight !== false ) {\n    size.height = styleHeight +\n      // add padding and border unless it's already including it\n      ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight );\n  }\n\n  size.innerWidth = size.width - ( paddingWidth + borderWidth );\n  size.innerHeight = size.height - ( paddingHeight + borderHeight );\n\n  size.outerWidth = size.width + marginWidth;\n  size.outerHeight = size.height + marginHeight;\n\n  return size;\n}\n\nreturn getSize;\n\n});\n\n/**\n * matchesSelector v2.0.2\n * matchesSelector( element, '.selector' )\n * MIT license\n */\n\n/*jshint browser: true, strict: true, undef: true, unused: true */\n\n( function( window, factory ) {\n  /*global define: false, module: false */\n  'use strict';\n  // universal module definition\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( 'desandro-matches-selector/matches-selector',factory );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory();\n  } else {\n    // browser global\n    window.matchesSelector = factory();\n  }\n\n}( window, function factory() {\n  'use strict';\n\n  var matchesMethod = ( function() {\n    var ElemProto = window.Element.prototype;\n    // check for the standard method name first\n    if ( ElemProto.matches ) {\n      return 'matches';\n    }\n    // check un-prefixed\n    if ( ElemProto.matchesSelector ) {\n      return 'matchesSelector';\n    }\n    // check vendor prefixes\n    var prefixes = [ 'webkit', 'moz', 'ms', 'o' ];\n\n    for ( var i=0; i < prefixes.length; i++ ) {\n      var prefix = prefixes[i];\n      var method = prefix + 'MatchesSelector';\n      if ( ElemProto[ method ] ) {\n        return method;\n      }\n    }\n  })();\n\n  return function matchesSelector( elem, selector ) {\n    return elem[ matchesMethod ]( selector );\n  };\n\n}));\n\n/**\n * Fizzy UI utils v2.0.5\n * MIT license\n */\n\n/*jshint browser: true, undef: true, unused: true, strict: true */\n\n( function( window, factory ) {\n  // universal module definition\n  /*jshint strict: false */ /*globals define, module, require */\n\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( 'fizzy-ui-utils/utils',[\n      'desandro-matches-selector/matches-selector'\n    ], function( matchesSelector ) {\n      return factory( window, matchesSelector );\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('desandro-matches-selector')\n    );\n  } else {\n    // browser global\n    window.fizzyUIUtils = factory(\n      window,\n      window.matchesSelector\n    );\n  }\n\n}( window, function factory( window, matchesSelector ) {\n\n\n\nvar utils = {};\n\n// ----- extend ----- //\n\n// extends objects\nutils.extend = function( a, b ) {\n  for ( var prop in b ) {\n    a[ prop ] = b[ prop ];\n  }\n  return a;\n};\n\n// ----- modulo ----- //\n\nutils.modulo = function( num, div ) {\n  return ( ( num % div ) + div ) % div;\n};\n\n// ----- makeArray ----- //\n\n// turn element or nodeList into an array\nutils.makeArray = function( obj ) {\n  var ary = [];\n  if ( Array.isArray( obj ) ) {\n    // use object if already an array\n    ary = obj;\n  } else if ( obj && typeof obj == 'object' &&\n    typeof obj.length == 'number' ) {\n    // convert nodeList to array\n    for ( var i=0; i < obj.length; i++ ) {\n      ary.push( obj[i] );\n    }\n  } else {\n    // array of single index\n    ary.push( obj );\n  }\n  return ary;\n};\n\n// ----- removeFrom ----- //\n\nutils.removeFrom = function( ary, obj ) {\n  var index = ary.indexOf( obj );\n  if ( index != -1 ) {\n    ary.splice( index, 1 );\n  }\n};\n\n// ----- getParent ----- //\n\nutils.getParent = function( elem, selector ) {\n  while ( elem.parentNode && elem != document.body ) {\n    elem = elem.parentNode;\n    if ( matchesSelector( elem, selector ) ) {\n      return elem;\n    }\n  }\n};\n\n// ----- getQueryElement ----- //\n\n// use element as selector string\nutils.getQueryElement = function( elem ) {\n  if ( typeof elem == 'string' ) {\n    return document.querySelector( elem );\n  }\n  return elem;\n};\n\n// ----- handleEvent ----- //\n\n// enable .ontype to trigger from .addEventListener( elem, 'type' )\nutils.handleEvent = function( event ) {\n  var method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\n// ----- filterFindElements ----- //\n\nutils.filterFindElements = function( elems, selector ) {\n  // make array of elems\n  elems = utils.makeArray( elems );\n  var ffElems = [];\n\n  elems.forEach( function( elem ) {\n    // check that elem is an actual element\n    if ( !( elem instanceof HTMLElement ) ) {\n      return;\n    }\n    // add elem if no selector\n    if ( !selector ) {\n      ffElems.push( elem );\n      return;\n    }\n    // filter & find items if we have a selector\n    // filter\n    if ( matchesSelector( elem, selector ) ) {\n      ffElems.push( elem );\n    }\n    // find children\n    var childElems = elem.querySelectorAll( selector );\n    // concat childElems to filterFound array\n    for ( var i=0; i < childElems.length; i++ ) {\n      ffElems.push( childElems[i] );\n    }\n  });\n\n  return ffElems;\n};\n\n// ----- debounceMethod ----- //\n\nutils.debounceMethod = function( _class, methodName, threshold ) {\n  // original method\n  var method = _class.prototype[ methodName ];\n  var timeoutName = methodName + 'Timeout';\n\n  _class.prototype[ methodName ] = function() {\n    var timeout = this[ timeoutName ];\n    if ( timeout ) {\n      clearTimeout( timeout );\n    }\n    var args = arguments;\n\n    var _this = this;\n    this[ timeoutName ] = setTimeout( function() {\n      method.apply( _this, args );\n      delete _this[ timeoutName ];\n    }, threshold || 100 );\n  };\n};\n\n// ----- docReady ----- //\n\nutils.docReady = function( callback ) {\n  var readyState = document.readyState;\n  if ( readyState == 'complete' || readyState == 'interactive' ) {\n    // do async to allow for other scripts to run. metafizzy/flickity#441\n    setTimeout( callback );\n  } else {\n    document.addEventListener( 'DOMContentLoaded', callback );\n  }\n};\n\n// ----- htmlInit ----- //\n\n// http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/\nutils.toDashed = function( str ) {\n  return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {\n    return $1 + '-' + $2;\n  }).toLowerCase();\n};\n\nvar console = window.console;\n/**\n * allow user to initialize classes via [data-namespace] or .js-namespace class\n * htmlInit( Widget, 'widgetName' )\n * options are parsed from data-namespace-options\n */\nutils.htmlInit = function( WidgetClass, namespace ) {\n  utils.docReady( function() {\n    var dashedNamespace = utils.toDashed( namespace );\n    var dataAttr = 'data-' + dashedNamespace;\n    var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' );\n    var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace );\n    var elems = utils.makeArray( dataAttrElems )\n      .concat( utils.makeArray( jsDashElems ) );\n    var dataOptionsAttr = dataAttr + '-options';\n    var jQuery = window.jQuery;\n\n    elems.forEach( function( elem ) {\n      var attr = elem.getAttribute( dataAttr ) ||\n        elem.getAttribute( dataOptionsAttr );\n      var options;\n      try {\n        options = attr && JSON.parse( attr );\n      } catch ( error ) {\n        // log error, do not initialize\n        if ( console ) {\n          console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className +\n          ': ' + error );\n        }\n        return;\n      }\n      // initialize\n      var instance = new WidgetClass( elem, options );\n      // make available via $().data('namespace')\n      if ( jQuery ) {\n        jQuery.data( elem, namespace, instance );\n      }\n    });\n\n  });\n};\n\n// -----  ----- //\n\nreturn utils;\n\n}));\n\n/**\n * Outlayer Item\n */\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /* globals define, module, require */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD - RequireJS\n    define( 'outlayer/item',[\n        'ev-emitter/ev-emitter',\n        'get-size/get-size'\n      ],\n      factory\n    );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS - Browserify, Webpack\n    module.exports = factory(\n      require('ev-emitter'),\n      require('get-size')\n    );\n  } else {\n    // browser global\n    window.Outlayer = {};\n    window.Outlayer.Item = factory(\n      window.EvEmitter,\n      window.getSize\n    );\n  }\n\n}( window, function factory( EvEmitter, getSize ) {\n'use strict';\n\n// ----- helpers ----- //\n\nfunction isEmptyObj( obj ) {\n  for ( var prop in obj ) {\n    return false;\n  }\n  prop = null;\n  return true;\n}\n\n// -------------------------- CSS3 support -------------------------- //\n\n\nvar docElemStyle = document.documentElement.style;\n\nvar transitionProperty = typeof docElemStyle.transition == 'string' ?\n  'transition' : 'WebkitTransition';\nvar transformProperty = typeof docElemStyle.transform == 'string' ?\n  'transform' : 'WebkitTransform';\n\nvar transitionEndEvent = {\n  WebkitTransition: 'webkitTransitionEnd',\n  transition: 'transitionend'\n}[ transitionProperty ];\n\n// cache all vendor properties that could have vendor prefix\nvar vendorProperties = {\n  transform: transformProperty,\n  transition: transitionProperty,\n  transitionDuration: transitionProperty + 'Duration',\n  transitionProperty: transitionProperty + 'Property',\n  transitionDelay: transitionProperty + 'Delay'\n};\n\n// -------------------------- Item -------------------------- //\n\nfunction Item( element, layout ) {\n  if ( !element ) {\n    return;\n  }\n\n  this.element = element;\n  // parent layout class, i.e. Masonry, Isotope, or Packery\n  this.layout = layout;\n  this.position = {\n    x: 0,\n    y: 0\n  };\n\n  this._create();\n}\n\n// inherit EvEmitter\nvar proto = Item.prototype = Object.create( EvEmitter.prototype );\nproto.constructor = Item;\n\nproto._create = function() {\n  // transition objects\n  this._transn = {\n    ingProperties: {},\n    clean: {},\n    onEnd: {}\n  };\n\n  this.css({\n    position: 'absolute'\n  });\n};\n\n// trigger specified handler for event type\nproto.handleEvent = function( event ) {\n  var method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\nproto.getSize = function() {\n  this.size = getSize( this.element );\n};\n\n/**\n * apply CSS styles to element\n * @param {Object} style\n */\nproto.css = function( style ) {\n  var elemStyle = this.element.style;\n\n  for ( var prop in style ) {\n    // use vendor property if available\n    var supportedProp = vendorProperties[ prop ] || prop;\n    elemStyle[ supportedProp ] = style[ prop ];\n  }\n};\n\n // measure position, and sets it\nproto.getPosition = function() {\n  var style = getComputedStyle( this.element );\n  var isOriginLeft = this.layout._getOption('originLeft');\n  var isOriginTop = this.layout._getOption('originTop');\n  var xValue = style[ isOriginLeft ? 'left' : 'right' ];\n  var yValue = style[ isOriginTop ? 'top' : 'bottom' ];\n  // convert percent to pixels\n  var layoutSize = this.layout.size;\n  var x = xValue.indexOf('%') != -1 ?\n    ( parseFloat( xValue ) / 100 ) * layoutSize.width : parseInt( xValue, 10 );\n  var y = yValue.indexOf('%') != -1 ?\n    ( parseFloat( yValue ) / 100 ) * layoutSize.height : parseInt( yValue, 10 );\n\n  // clean up 'auto' or other non-integer values\n  x = isNaN( x ) ? 0 : x;\n  y = isNaN( y ) ? 0 : y;\n  // remove padding from measurement\n  x -= isOriginLeft ? layoutSize.paddingLeft : layoutSize.paddingRight;\n  y -= isOriginTop ? layoutSize.paddingTop : layoutSize.paddingBottom;\n\n  this.position.x = x;\n  this.position.y = y;\n};\n\n// set settled position, apply padding\nproto.layoutPosition = function() {\n  var layoutSize = this.layout.size;\n  var style = {};\n  var isOriginLeft = this.layout._getOption('originLeft');\n  var isOriginTop = this.layout._getOption('originTop');\n\n  // x\n  var xPadding = isOriginLeft ? 'paddingLeft' : 'paddingRight';\n  var xProperty = isOriginLeft ? 'left' : 'right';\n  var xResetProperty = isOriginLeft ? 'right' : 'left';\n\n  var x = this.position.x + layoutSize[ xPadding ];\n  // set in percentage or pixels\n  style[ xProperty ] = this.getXValue( x );\n  // reset other property\n  style[ xResetProperty ] = '';\n\n  // y\n  var yPadding = isOriginTop ? 'paddingTop' : 'paddingBottom';\n  var yProperty = isOriginTop ? 'top' : 'bottom';\n  var yResetProperty = isOriginTop ? 'bottom' : 'top';\n\n  var y = this.position.y + layoutSize[ yPadding ];\n  // set in percentage or pixels\n  style[ yProperty ] = this.getYValue( y );\n  // reset other property\n  style[ yResetProperty ] = '';\n\n  this.css( style );\n  this.emitEvent( 'layout', [ this ] );\n};\n\nproto.getXValue = function( x ) {\n  var isHorizontal = this.layout._getOption('horizontal');\n  return this.layout.options.percentPosition && !isHorizontal ?\n    ( ( x / this.layout.size.width ) * 100 ) + '%' : x + 'px';\n};\n\nproto.getYValue = function( y ) {\n  var isHorizontal = this.layout._getOption('horizontal');\n  return this.layout.options.percentPosition && isHorizontal ?\n    ( ( y / this.layout.size.height ) * 100 ) + '%' : y + 'px';\n};\n\nproto._transitionTo = function( x, y ) {\n  this.getPosition();\n  // get current x & y from top/left\n  var curX = this.position.x;\n  var curY = this.position.y;\n\n  var compareX = parseInt( x, 10 );\n  var compareY = parseInt( y, 10 );\n  var didNotMove = compareX === this.position.x && compareY === this.position.y;\n\n  // save end position\n  this.setPosition( x, y );\n\n  // if did not move and not transitioning, just go to layout\n  if ( didNotMove && !this.isTransitioning ) {\n    this.layoutPosition();\n    return;\n  }\n\n  var transX = x - curX;\n  var transY = y - curY;\n  var transitionStyle = {};\n  transitionStyle.transform = this.getTranslate( transX, transY );\n\n  this.transition({\n    to: transitionStyle,\n    onTransitionEnd: {\n      transform: this.layoutPosition\n    },\n    isCleaning: true\n  });\n};\n\nproto.getTranslate = function( x, y ) {\n  // flip cooridinates if origin on right or bottom\n  var isOriginLeft = this.layout._getOption('originLeft');\n  var isOriginTop = this.layout._getOption('originTop');\n  x = isOriginLeft ? x : -x;\n  y = isOriginTop ? y : -y;\n  return 'translate3d(' + x + 'px, ' + y + 'px, 0)';\n};\n\n// non transition + transform support\nproto.goTo = function( x, y ) {\n  this.setPosition( x, y );\n  this.layoutPosition();\n};\n\nproto.moveTo = proto._transitionTo;\n\nproto.setPosition = function( x, y ) {\n  this.position.x = parseInt( x, 10 );\n  this.position.y = parseInt( y, 10 );\n};\n\n// ----- transition ----- //\n\n/**\n * @param {Object} style - CSS\n * @param {Function} onTransitionEnd\n */\n\n// non transition, just trigger callback\nproto._nonTransition = function( args ) {\n  this.css( args.to );\n  if ( args.isCleaning ) {\n    this._removeStyles( args.to );\n  }\n  for ( var prop in args.onTransitionEnd ) {\n    args.onTransitionEnd[ prop ].call( this );\n  }\n};\n\n/**\n * proper transition\n * @param {Object} args - arguments\n *   @param {Object} to - style to transition to\n *   @param {Object} from - style to start transition from\n *   @param {Boolean} isCleaning - removes transition styles after transition\n *   @param {Function} onTransitionEnd - callback\n */\nproto.transition = function( args ) {\n  // redirect to nonTransition if no transition duration\n  if ( !parseFloat( this.layout.options.transitionDuration ) ) {\n    this._nonTransition( args );\n    return;\n  }\n\n  var _transition = this._transn;\n  // keep track of onTransitionEnd callback by css property\n  for ( var prop in args.onTransitionEnd ) {\n    _transition.onEnd[ prop ] = args.onTransitionEnd[ prop ];\n  }\n  // keep track of properties that are transitioning\n  for ( prop in args.to ) {\n    _transition.ingProperties[ prop ] = true;\n    // keep track of properties to clean up when transition is done\n    if ( args.isCleaning ) {\n      _transition.clean[ prop ] = true;\n    }\n  }\n\n  // set from styles\n  if ( args.from ) {\n    this.css( args.from );\n    // force redraw. http://blog.alexmaccaw.com/css-transitions\n    var h = this.element.offsetHeight;\n    // hack for JSHint to hush about unused var\n    h = null;\n  }\n  // enable transition\n  this.enableTransition( args.to );\n  // set styles that are transitioning\n  this.css( args.to );\n\n  this.isTransitioning = true;\n\n};\n\n// dash before all cap letters, including first for\n// WebkitTransform => -webkit-transform\nfunction toDashedAll( str ) {\n  return str.replace( /([A-Z])/g, function( $1 ) {\n    return '-' + $1.toLowerCase();\n  });\n}\n\nvar transitionProps = 'opacity,' + toDashedAll( transformProperty );\n\nproto.enableTransition = function(/* style */) {\n  // HACK changing transitionProperty during a transition\n  // will cause transition to jump\n  if ( this.isTransitioning ) {\n    return;\n  }\n\n  // make `transition: foo, bar, baz` from style object\n  // HACK un-comment this when enableTransition can work\n  // while a transition is happening\n  // var transitionValues = [];\n  // for ( var prop in style ) {\n  //   // dash-ify camelCased properties like WebkitTransition\n  //   prop = vendorProperties[ prop ] || prop;\n  //   transitionValues.push( toDashedAll( prop ) );\n  // }\n  // munge number to millisecond, to match stagger\n  var duration = this.layout.options.transitionDuration;\n  duration = typeof duration == 'number' ? duration + 'ms' : duration;\n  // enable transition styles\n  this.css({\n    transitionProperty: transitionProps,\n    transitionDuration: duration,\n    transitionDelay: this.staggerDelay || 0\n  });\n  // listen for transition end event\n  this.element.addEventListener( transitionEndEvent, this, false );\n};\n\n// ----- events ----- //\n\nproto.onwebkitTransitionEnd = function( event ) {\n  this.ontransitionend( event );\n};\n\nproto.onotransitionend = function( event ) {\n  this.ontransitionend( event );\n};\n\n// properties that I munge to make my life easier\nvar dashedVendorProperties = {\n  '-webkit-transform': 'transform'\n};\n\nproto.ontransitionend = function( event ) {\n  // disregard bubbled events from children\n  if ( event.target !== this.element ) {\n    return;\n  }\n  var _transition = this._transn;\n  // get property name of transitioned property, convert to prefix-free\n  var propertyName = dashedVendorProperties[ event.propertyName ] || event.propertyName;\n\n  // remove property that has completed transitioning\n  delete _transition.ingProperties[ propertyName ];\n  // check if any properties are still transitioning\n  if ( isEmptyObj( _transition.ingProperties ) ) {\n    // all properties have completed transitioning\n    this.disableTransition();\n  }\n  // clean style\n  if ( propertyName in _transition.clean ) {\n    // clean up style\n    this.element.style[ event.propertyName ] = '';\n    delete _transition.clean[ propertyName ];\n  }\n  // trigger onTransitionEnd callback\n  if ( propertyName in _transition.onEnd ) {\n    var onTransitionEnd = _transition.onEnd[ propertyName ];\n    onTransitionEnd.call( this );\n    delete _transition.onEnd[ propertyName ];\n  }\n\n  this.emitEvent( 'transitionEnd', [ this ] );\n};\n\nproto.disableTransition = function() {\n  this.removeTransitionStyles();\n  this.element.removeEventListener( transitionEndEvent, this, false );\n  this.isTransitioning = false;\n};\n\n/**\n * removes style property from element\n * @param {Object} style\n**/\nproto._removeStyles = function( style ) {\n  // clean up transition styles\n  var cleanStyle = {};\n  for ( var prop in style ) {\n    cleanStyle[ prop ] = '';\n  }\n  this.css( cleanStyle );\n};\n\nvar cleanTransitionStyle = {\n  transitionProperty: '',\n  transitionDuration: '',\n  transitionDelay: ''\n};\n\nproto.removeTransitionStyles = function() {\n  // remove transition\n  this.css( cleanTransitionStyle );\n};\n\n// ----- stagger ----- //\n\nproto.stagger = function( delay ) {\n  delay = isNaN( delay ) ? 0 : delay;\n  this.staggerDelay = delay + 'ms';\n};\n\n// ----- show/hide/remove ----- //\n\n// remove element from DOM\nproto.removeElem = function() {\n  this.element.parentNode.removeChild( this.element );\n  // remove display: none\n  this.css({ display: '' });\n  this.emitEvent( 'remove', [ this ] );\n};\n\nproto.remove = function() {\n  // just remove element if no transition support or no transition\n  if ( !transitionProperty || !parseFloat( this.layout.options.transitionDuration ) ) {\n    this.removeElem();\n    return;\n  }\n\n  // start transition\n  this.once( 'transitionEnd', function() {\n    this.removeElem();\n  });\n  this.hide();\n};\n\nproto.reveal = function() {\n  delete this.isHidden;\n  // remove display: none\n  this.css({ display: '' });\n\n  var options = this.layout.options;\n\n  var onTransitionEnd = {};\n  var transitionEndProperty = this.getHideRevealTransitionEndProperty('visibleStyle');\n  onTransitionEnd[ transitionEndProperty ] = this.onRevealTransitionEnd;\n\n  this.transition({\n    from: options.hiddenStyle,\n    to: options.visibleStyle,\n    isCleaning: true,\n    onTransitionEnd: onTransitionEnd\n  });\n};\n\nproto.onRevealTransitionEnd = function() {\n  // check if still visible\n  // during transition, item may have been hidden\n  if ( !this.isHidden ) {\n    this.emitEvent('reveal');\n  }\n};\n\n/**\n * get style property use for hide/reveal transition end\n * @param {String} styleProperty - hiddenStyle/visibleStyle\n * @returns {String}\n */\nproto.getHideRevealTransitionEndProperty = function( styleProperty ) {\n  var optionStyle = this.layout.options[ styleProperty ];\n  // use opacity\n  if ( optionStyle.opacity ) {\n    return 'opacity';\n  }\n  // get first property\n  for ( var prop in optionStyle ) {\n    return prop;\n  }\n};\n\nproto.hide = function() {\n  // set flag\n  this.isHidden = true;\n  // remove display: none\n  this.css({ display: '' });\n\n  var options = this.layout.options;\n\n  var onTransitionEnd = {};\n  var transitionEndProperty = this.getHideRevealTransitionEndProperty('hiddenStyle');\n  onTransitionEnd[ transitionEndProperty ] = this.onHideTransitionEnd;\n\n  this.transition({\n    from: options.visibleStyle,\n    to: options.hiddenStyle,\n    // keep hidden stuff hidden\n    isCleaning: true,\n    onTransitionEnd: onTransitionEnd\n  });\n};\n\nproto.onHideTransitionEnd = function() {\n  // check if still hidden\n  // during transition, item may have been un-hidden\n  if ( this.isHidden ) {\n    this.css({ display: 'none' });\n    this.emitEvent('hide');\n  }\n};\n\nproto.destroy = function() {\n  this.css({\n    position: '',\n    left: '',\n    right: '',\n    top: '',\n    bottom: '',\n    transition: '',\n    transform: ''\n  });\n};\n\nreturn Item;\n\n}));\n\n/*!\n * Outlayer v2.1.0\n * the brains and guts of a layout library\n * MIT license\n */\n\n( function( window, factory ) {\n  'use strict';\n  // universal module definition\n  /* jshint strict: false */ /* globals define, module, require */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD - RequireJS\n    define( 'outlayer/outlayer',[\n        'ev-emitter/ev-emitter',\n        'get-size/get-size',\n        'fizzy-ui-utils/utils',\n        './item'\n      ],\n      function( EvEmitter, getSize, utils, Item ) {\n        return factory( window, EvEmitter, getSize, utils, Item);\n      }\n    );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS - Browserify, Webpack\n    module.exports = factory(\n      window,\n      require('ev-emitter'),\n      require('get-size'),\n      require('fizzy-ui-utils'),\n      require('./item')\n    );\n  } else {\n    // browser global\n    window.Outlayer = factory(\n      window,\n      window.EvEmitter,\n      window.getSize,\n      window.fizzyUIUtils,\n      window.Outlayer.Item\n    );\n  }\n\n}( window, function factory( window, EvEmitter, getSize, utils, Item ) {\n'use strict';\n\n// ----- vars ----- //\n\nvar console = window.console;\nvar jQuery = window.jQuery;\nvar noop = function() {};\n\n// -------------------------- Outlayer -------------------------- //\n\n// globally unique identifiers\nvar GUID = 0;\n// internal store of all Outlayer intances\nvar instances = {};\n\n\n/**\n * @param {Element, String} element\n * @param {Object} options\n * @constructor\n */\nfunction Outlayer( element, options ) {\n  var queryElement = utils.getQueryElement( element );\n  if ( !queryElement ) {\n    if ( console ) {\n      console.error( 'Bad element for ' + this.constructor.namespace +\n        ': ' + ( queryElement || element ) );\n    }\n    return;\n  }\n  this.element = queryElement;\n  // add jQuery\n  if ( jQuery ) {\n    this.$element = jQuery( this.element );\n  }\n\n  // options\n  this.options = utils.extend( {}, this.constructor.defaults );\n  this.option( options );\n\n  // add id for Outlayer.getFromElement\n  var id = ++GUID;\n  this.element.outlayerGUID = id; // expando\n  instances[ id ] = this; // associate via id\n\n  // kick it off\n  this._create();\n\n  var isInitLayout = this._getOption('initLayout');\n  if ( isInitLayout ) {\n    this.layout();\n  }\n}\n\n// settings are for internal use only\nOutlayer.namespace = 'outlayer';\nOutlayer.Item = Item;\n\n// default options\nOutlayer.defaults = {\n  containerStyle: {\n    position: 'relative'\n  },\n  initLayout: true,\n  originLeft: true,\n  originTop: true,\n  resize: true,\n  resizeContainer: true,\n  // item options\n  transitionDuration: '0.4s',\n  hiddenStyle: {\n    opacity: 0,\n    transform: 'scale(0.001)'\n  },\n  visibleStyle: {\n    opacity: 1,\n    transform: 'scale(1)'\n  }\n};\n\nvar proto = Outlayer.prototype;\n// inherit EvEmitter\nutils.extend( proto, EvEmitter.prototype );\n\n/**\n * set options\n * @param {Object} opts\n */\nproto.option = function( opts ) {\n  utils.extend( this.options, opts );\n};\n\n/**\n * get backwards compatible option value, check old name\n */\nproto._getOption = function( option ) {\n  var oldOption = this.constructor.compatOptions[ option ];\n  return oldOption && this.options[ oldOption ] !== undefined ?\n    this.options[ oldOption ] : this.options[ option ];\n};\n\nOutlayer.compatOptions = {\n  // currentName: oldName\n  initLayout: 'isInitLayout',\n  horizontal: 'isHorizontal',\n  layoutInstant: 'isLayoutInstant',\n  originLeft: 'isOriginLeft',\n  originTop: 'isOriginTop',\n  resize: 'isResizeBound',\n  resizeContainer: 'isResizingContainer'\n};\n\nproto._create = function() {\n  // get items from children\n  this.reloadItems();\n  // elements that affect layout, but are not laid out\n  this.stamps = [];\n  this.stamp( this.options.stamp );\n  // set container style\n  utils.extend( this.element.style, this.options.containerStyle );\n\n  // bind resize method\n  var canBindResize = this._getOption('resize');\n  if ( canBindResize ) {\n    this.bindResize();\n  }\n};\n\n// goes through all children again and gets bricks in proper order\nproto.reloadItems = function() {\n  // collection of item elements\n  this.items = this._itemize( this.element.children );\n};\n\n\n/**\n * turn elements into Outlayer.Items to be used in layout\n * @param {Array or NodeList or HTMLElement} elems\n * @returns {Array} items - collection of new Outlayer Items\n */\nproto._itemize = function( elems ) {\n\n  var itemElems = this._filterFindItemElements( elems );\n  var Item = this.constructor.Item;\n\n  // create new Outlayer Items for collection\n  var items = [];\n  for ( var i=0; i < itemElems.length; i++ ) {\n    var elem = itemElems[i];\n    var item = new Item( elem, this );\n    items.push( item );\n  }\n\n  return items;\n};\n\n/**\n * get item elements to be used in layout\n * @param {Array or NodeList or HTMLElement} elems\n * @returns {Array} items - item elements\n */\nproto._filterFindItemElements = function( elems ) {\n  return utils.filterFindElements( elems, this.options.itemSelector );\n};\n\n/**\n * getter method for getting item elements\n * @returns {Array} elems - collection of item elements\n */\nproto.getItemElements = function() {\n  return this.items.map( function( item ) {\n    return item.element;\n  });\n};\n\n// ----- init & layout ----- //\n\n/**\n * lays out all items\n */\nproto.layout = function() {\n  this._resetLayout();\n  this._manageStamps();\n\n  // don't animate first layout\n  var layoutInstant = this._getOption('layoutInstant');\n  var isInstant = layoutInstant !== undefined ?\n    layoutInstant : !this._isLayoutInited;\n  this.layoutItems( this.items, isInstant );\n\n  // flag for initalized\n  this._isLayoutInited = true;\n};\n\n// _init is alias for layout\nproto._init = proto.layout;\n\n/**\n * logic before any new layout\n */\nproto._resetLayout = function() {\n  this.getSize();\n};\n\n\nproto.getSize = function() {\n  this.size = getSize( this.element );\n};\n\n/**\n * get measurement from option, for columnWidth, rowHeight, gutter\n * if option is String -> get element from selector string, & get size of element\n * if option is Element -> get size of element\n * else use option as a number\n *\n * @param {String} measurement\n * @param {String} size - width or height\n * @private\n */\nproto._getMeasurement = function( measurement, size ) {\n  var option = this.options[ measurement ];\n  var elem;\n  if ( !option ) {\n    // default to 0\n    this[ measurement ] = 0;\n  } else {\n    // use option as an element\n    if ( typeof option == 'string' ) {\n      elem = this.element.querySelector( option );\n    } else if ( option instanceof HTMLElement ) {\n      elem = option;\n    }\n    // use size of element, if element\n    this[ measurement ] = elem ? getSize( elem )[ size ] : option;\n  }\n};\n\n/**\n * layout a collection of item elements\n * @api public\n */\nproto.layoutItems = function( items, isInstant ) {\n  items = this._getItemsForLayout( items );\n\n  this._layoutItems( items, isInstant );\n\n  this._postLayout();\n};\n\n/**\n * get the items to be laid out\n * you may want to skip over some items\n * @param {Array} items\n * @returns {Array} items\n */\nproto._getItemsForLayout = function( items ) {\n  return items.filter( function( item ) {\n    return !item.isIgnored;\n  });\n};\n\n/**\n * layout items\n * @param {Array} items\n * @param {Boolean} isInstant\n */\nproto._layoutItems = function( items, isInstant ) {\n  this._emitCompleteOnItems( 'layout', items );\n\n  if ( !items || !items.length ) {\n    // no items, emit event with empty array\n    return;\n  }\n\n  var queue = [];\n\n  items.forEach( function( item ) {\n    // get x/y object from method\n    var position = this._getItemLayoutPosition( item );\n    // enqueue\n    position.item = item;\n    position.isInstant = isInstant || item.isLayoutInstant;\n    queue.push( position );\n  }, this );\n\n  this._processLayoutQueue( queue );\n};\n\n/**\n * get item layout position\n * @param {Outlayer.Item} item\n * @returns {Object} x and y position\n */\nproto._getItemLayoutPosition = function( /* item */ ) {\n  return {\n    x: 0,\n    y: 0\n  };\n};\n\n/**\n * iterate over array and position each item\n * Reason being - separating this logic prevents 'layout invalidation'\n * thx @paul_irish\n * @param {Array} queue\n */\nproto._processLayoutQueue = function( queue ) {\n  this.updateStagger();\n  queue.forEach( function( obj, i ) {\n    this._positionItem( obj.item, obj.x, obj.y, obj.isInstant, i );\n  }, this );\n};\n\n// set stagger from option in milliseconds number\nproto.updateStagger = function() {\n  var stagger = this.options.stagger;\n  if ( stagger === null || stagger === undefined ) {\n    this.stagger = 0;\n    return;\n  }\n  this.stagger = getMilliseconds( stagger );\n  return this.stagger;\n};\n\n/**\n * Sets position of item in DOM\n * @param {Outlayer.Item} item\n * @param {Number} x - horizontal position\n * @param {Number} y - vertical position\n * @param {Boolean} isInstant - disables transitions\n */\nproto._positionItem = function( item, x, y, isInstant, i ) {\n  if ( isInstant ) {\n    // if not transition, just set CSS\n    item.goTo( x, y );\n  } else {\n    item.stagger( i * this.stagger );\n    item.moveTo( x, y );\n  }\n};\n\n/**\n * Any logic you want to do after each layout,\n * i.e. size the container\n */\nproto._postLayout = function() {\n  this.resizeContainer();\n};\n\nproto.resizeContainer = function() {\n  var isResizingContainer = this._getOption('resizeContainer');\n  if ( !isResizingContainer ) {\n    return;\n  }\n  var size = this._getContainerSize();\n  if ( size ) {\n    this._setContainerMeasure( size.width, true );\n    this._setContainerMeasure( size.height, false );\n  }\n};\n\n/**\n * Sets width or height of container if returned\n * @returns {Object} size\n *   @param {Number} width\n *   @param {Number} height\n */\nproto._getContainerSize = noop;\n\n/**\n * @param {Number} measure - size of width or height\n * @param {Boolean} isWidth\n */\nproto._setContainerMeasure = function( measure, isWidth ) {\n  if ( measure === undefined ) {\n    return;\n  }\n\n  var elemSize = this.size;\n  // add padding and border width if border box\n  if ( elemSize.isBorderBox ) {\n    measure += isWidth ? elemSize.paddingLeft + elemSize.paddingRight +\n      elemSize.borderLeftWidth + elemSize.borderRightWidth :\n      elemSize.paddingBottom + elemSize.paddingTop +\n      elemSize.borderTopWidth + elemSize.borderBottomWidth;\n  }\n\n  measure = Math.max( measure, 0 );\n  this.element.style[ isWidth ? 'width' : 'height' ] = measure + 'px';\n};\n\n/**\n * emit eventComplete on a collection of items events\n * @param {String} eventName\n * @param {Array} items - Outlayer.Items\n */\nproto._emitCompleteOnItems = function( eventName, items ) {\n  var _this = this;\n  function onComplete() {\n    _this.dispatchEvent( eventName + 'Complete', null, [ items ] );\n  }\n\n  var count = items.length;\n  if ( !items || !count ) {\n    onComplete();\n    return;\n  }\n\n  var doneCount = 0;\n  function tick() {\n    doneCount++;\n    if ( doneCount == count ) {\n      onComplete();\n    }\n  }\n\n  // bind callback\n  items.forEach( function( item ) {\n    item.once( eventName, tick );\n  });\n};\n\n/**\n * emits events via EvEmitter and jQuery events\n * @param {String} type - name of event\n * @param {Event} event - original event\n * @param {Array} args - extra arguments\n */\nproto.dispatchEvent = function( type, event, args ) {\n  // add original event to arguments\n  var emitArgs = event ? [ event ].concat( args ) : args;\n  this.emitEvent( type, emitArgs );\n\n  if ( jQuery ) {\n    // set this.$element\n    this.$element = this.$element || jQuery( this.element );\n    if ( event ) {\n      // create jQuery event\n      var $event = jQuery.Event( event );\n      $event.type = type;\n      this.$element.trigger( $event, args );\n    } else {\n      // just trigger with type if no event available\n      this.$element.trigger( type, args );\n    }\n  }\n};\n\n// -------------------------- ignore & stamps -------------------------- //\n\n\n/**\n * keep item in collection, but do not lay it out\n * ignored items do not get skipped in layout\n * @param {Element} elem\n */\nproto.ignore = function( elem ) {\n  var item = this.getItem( elem );\n  if ( item ) {\n    item.isIgnored = true;\n  }\n};\n\n/**\n * return item to layout collection\n * @param {Element} elem\n */\nproto.unignore = function( elem ) {\n  var item = this.getItem( elem );\n  if ( item ) {\n    delete item.isIgnored;\n  }\n};\n\n/**\n * adds elements to stamps\n * @param {NodeList, Array, Element, or String} elems\n */\nproto.stamp = function( elems ) {\n  elems = this._find( elems );\n  if ( !elems ) {\n    return;\n  }\n\n  this.stamps = this.stamps.concat( elems );\n  // ignore\n  elems.forEach( this.ignore, this );\n};\n\n/**\n * removes elements to stamps\n * @param {NodeList, Array, or Element} elems\n */\nproto.unstamp = function( elems ) {\n  elems = this._find( elems );\n  if ( !elems ){\n    return;\n  }\n\n  elems.forEach( function( elem ) {\n    // filter out removed stamp elements\n    utils.removeFrom( this.stamps, elem );\n    this.unignore( elem );\n  }, this );\n};\n\n/**\n * finds child elements\n * @param {NodeList, Array, Element, or String} elems\n * @returns {Array} elems\n */\nproto._find = function( elems ) {\n  if ( !elems ) {\n    return;\n  }\n  // if string, use argument as selector string\n  if ( typeof elems == 'string' ) {\n    elems = this.element.querySelectorAll( elems );\n  }\n  elems = utils.makeArray( elems );\n  return elems;\n};\n\nproto._manageStamps = function() {\n  if ( !this.stamps || !this.stamps.length ) {\n    return;\n  }\n\n  this._getBoundingRect();\n\n  this.stamps.forEach( this._manageStamp, this );\n};\n\n// update boundingLeft / Top\nproto._getBoundingRect = function() {\n  // get bounding rect for container element\n  var boundingRect = this.element.getBoundingClientRect();\n  var size = this.size;\n  this._boundingRect = {\n    left: boundingRect.left + size.paddingLeft + size.borderLeftWidth,\n    top: boundingRect.top + size.paddingTop + size.borderTopWidth,\n    right: boundingRect.right - ( size.paddingRight + size.borderRightWidth ),\n    bottom: boundingRect.bottom - ( size.paddingBottom + size.borderBottomWidth )\n  };\n};\n\n/**\n * @param {Element} stamp\n**/\nproto._manageStamp = noop;\n\n/**\n * get x/y position of element relative to container element\n * @param {Element} elem\n * @returns {Object} offset - has left, top, right, bottom\n */\nproto._getElementOffset = function( elem ) {\n  var boundingRect = elem.getBoundingClientRect();\n  var thisRect = this._boundingRect;\n  var size = getSize( elem );\n  var offset = {\n    left: boundingRect.left - thisRect.left - size.marginLeft,\n    top: boundingRect.top - thisRect.top - size.marginTop,\n    right: thisRect.right - boundingRect.right - size.marginRight,\n    bottom: thisRect.bottom - boundingRect.bottom - size.marginBottom\n  };\n  return offset;\n};\n\n// -------------------------- resize -------------------------- //\n\n// enable event handlers for listeners\n// i.e. resize -> onresize\nproto.handleEvent = utils.handleEvent;\n\n/**\n * Bind layout to window resizing\n */\nproto.bindResize = function() {\n  window.addEventListener( 'resize', this );\n  this.isResizeBound = true;\n};\n\n/**\n * Unbind layout to window resizing\n */\nproto.unbindResize = function() {\n  window.removeEventListener( 'resize', this );\n  this.isResizeBound = false;\n};\n\nproto.onresize = function() {\n  this.resize();\n};\n\nutils.debounceMethod( Outlayer, 'onresize', 100 );\n\nproto.resize = function() {\n  // don't trigger if size did not change\n  // or if resize was unbound. See #9\n  if ( !this.isResizeBound || !this.needsResizeLayout() ) {\n    return;\n  }\n\n  this.layout();\n};\n\n/**\n * check if layout is needed post layout\n * @returns Boolean\n */\nproto.needsResizeLayout = function() {\n  var size = getSize( this.element );\n  // check that this.size and size are there\n  // IE8 triggers resize on body size change, so they might not be\n  var hasSizes = this.size && size;\n  return hasSizes && size.innerWidth !== this.size.innerWidth;\n};\n\n// -------------------------- methods -------------------------- //\n\n/**\n * add items to Outlayer instance\n * @param {Array or NodeList or Element} elems\n * @returns {Array} items - Outlayer.Items\n**/\nproto.addItems = function( elems ) {\n  var items = this._itemize( elems );\n  // add items to collection\n  if ( items.length ) {\n    this.items = this.items.concat( items );\n  }\n  return items;\n};\n\n/**\n * Layout newly-appended item elements\n * @param {Array or NodeList or Element} elems\n */\nproto.appended = function( elems ) {\n  var items = this.addItems( elems );\n  if ( !items.length ) {\n    return;\n  }\n  // layout and reveal just the new items\n  this.layoutItems( items, true );\n  this.reveal( items );\n};\n\n/**\n * Layout prepended elements\n * @param {Array or NodeList or Element} elems\n */\nproto.prepended = function( elems ) {\n  var items = this._itemize( elems );\n  if ( !items.length ) {\n    return;\n  }\n  // add items to beginning of collection\n  var previousItems = this.items.slice(0);\n  this.items = items.concat( previousItems );\n  // start new layout\n  this._resetLayout();\n  this._manageStamps();\n  // layout new stuff without transition\n  this.layoutItems( items, true );\n  this.reveal( items );\n  // layout previous items\n  this.layoutItems( previousItems );\n};\n\n/**\n * reveal a collection of items\n * @param {Array of Outlayer.Items} items\n */\nproto.reveal = function( items ) {\n  this._emitCompleteOnItems( 'reveal', items );\n  if ( !items || !items.length ) {\n    return;\n  }\n  var stagger = this.updateStagger();\n  items.forEach( function( item, i ) {\n    item.stagger( i * stagger );\n    item.reveal();\n  });\n};\n\n/**\n * hide a collection of items\n * @param {Array of Outlayer.Items} items\n */\nproto.hide = function( items ) {\n  this._emitCompleteOnItems( 'hide', items );\n  if ( !items || !items.length ) {\n    return;\n  }\n  var stagger = this.updateStagger();\n  items.forEach( function( item, i ) {\n    item.stagger( i * stagger );\n    item.hide();\n  });\n};\n\n/**\n * reveal item elements\n * @param {Array}, {Element}, {NodeList} items\n */\nproto.revealItemElements = function( elems ) {\n  var items = this.getItems( elems );\n  this.reveal( items );\n};\n\n/**\n * hide item elements\n * @param {Array}, {Element}, {NodeList} items\n */\nproto.hideItemElements = function( elems ) {\n  var items = this.getItems( elems );\n  this.hide( items );\n};\n\n/**\n * get Outlayer.Item, given an Element\n * @param {Element} elem\n * @param {Function} callback\n * @returns {Outlayer.Item} item\n */\nproto.getItem = function( elem ) {\n  // loop through items to get the one that matches\n  for ( var i=0; i < this.items.length; i++ ) {\n    var item = this.items[i];\n    if ( item.element == elem ) {\n      // return item\n      return item;\n    }\n  }\n};\n\n/**\n * get collection of Outlayer.Items, given Elements\n * @param {Array} elems\n * @returns {Array} items - Outlayer.Items\n */\nproto.getItems = function( elems ) {\n  elems = utils.makeArray( elems );\n  var items = [];\n  elems.forEach( function( elem ) {\n    var item = this.getItem( elem );\n    if ( item ) {\n      items.push( item );\n    }\n  }, this );\n\n  return items;\n};\n\n/**\n * remove element(s) from instance and DOM\n * @param {Array or NodeList or Element} elems\n */\nproto.remove = function( elems ) {\n  var removeItems = this.getItems( elems );\n\n  this._emitCompleteOnItems( 'remove', removeItems );\n\n  // bail if no items to remove\n  if ( !removeItems || !removeItems.length ) {\n    return;\n  }\n\n  removeItems.forEach( function( item ) {\n    item.remove();\n    // remove item from collection\n    utils.removeFrom( this.items, item );\n  }, this );\n};\n\n// ----- destroy ----- //\n\n// remove and disable Outlayer instance\nproto.destroy = function() {\n  // clean up dynamic styles\n  var style = this.element.style;\n  style.height = '';\n  style.position = '';\n  style.width = '';\n  // destroy items\n  this.items.forEach( function( item ) {\n    item.destroy();\n  });\n\n  this.unbindResize();\n\n  var id = this.element.outlayerGUID;\n  delete instances[ id ]; // remove reference to instance by id\n  delete this.element.outlayerGUID;\n  // remove data for jQuery\n  if ( jQuery ) {\n    jQuery.removeData( this.element, this.constructor.namespace );\n  }\n\n};\n\n// -------------------------- data -------------------------- //\n\n/**\n * get Outlayer instance from element\n * @param {Element} elem\n * @returns {Outlayer}\n */\nOutlayer.data = function( elem ) {\n  elem = utils.getQueryElement( elem );\n  var id = elem && elem.outlayerGUID;\n  return id && instances[ id ];\n};\n\n\n// -------------------------- create Outlayer class -------------------------- //\n\n/**\n * create a layout class\n * @param {String} namespace\n */\nOutlayer.create = function( namespace, options ) {\n  // sub-class Outlayer\n  var Layout = subclass( Outlayer );\n  // apply new options and compatOptions\n  Layout.defaults = utils.extend( {}, Outlayer.defaults );\n  utils.extend( Layout.defaults, options );\n  Layout.compatOptions = utils.extend( {}, Outlayer.compatOptions  );\n\n  Layout.namespace = namespace;\n\n  Layout.data = Outlayer.data;\n\n  // sub-class Item\n  Layout.Item = subclass( Item );\n\n  // -------------------------- declarative -------------------------- //\n\n  utils.htmlInit( Layout, namespace );\n\n  // -------------------------- jQuery bridge -------------------------- //\n\n  // make into jQuery plugin\n  if ( jQuery && jQuery.bridget ) {\n    jQuery.bridget( namespace, Layout );\n  }\n\n  return Layout;\n};\n\nfunction subclass( Parent ) {\n  function SubClass() {\n    Parent.apply( this, arguments );\n  }\n\n  SubClass.prototype = Object.create( Parent.prototype );\n  SubClass.prototype.constructor = SubClass;\n\n  return SubClass;\n}\n\n// ----- helpers ----- //\n\n// how many milliseconds are in each unit\nvar msUnits = {\n  ms: 1,\n  s: 1000\n};\n\n// munge time-like parameter into millisecond number\n// '0.4s' -> 40\nfunction getMilliseconds( time ) {\n  if ( typeof time == 'number' ) {\n    return time;\n  }\n  var matches = time.match( /(^\\d*\\.?\\d*)(\\w*)/ );\n  var num = matches && matches[1];\n  var unit = matches && matches[2];\n  if ( !num.length ) {\n    return 0;\n  }\n  num = parseFloat( num );\n  var mult = msUnits[ unit ] || 1;\n  return num * mult;\n}\n\n// ----- fin ----- //\n\n// back in global\nOutlayer.Item = Item;\n\nreturn Outlayer;\n\n}));\n\n/**\n * Isotope Item\n**/\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /*globals define, module, require */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( 'isotope/js/item',[\n        'outlayer/outlayer'\n      ],\n      factory );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      require('outlayer')\n    );\n  } else {\n    // browser global\n    window.Isotope = window.Isotope || {};\n    window.Isotope.Item = factory(\n      window.Outlayer\n    );\n  }\n\n}( window, function factory( Outlayer ) {\n'use strict';\n\n// -------------------------- Item -------------------------- //\n\n// sub-class Outlayer Item\nfunction Item() {\n  Outlayer.Item.apply( this, arguments );\n}\n\nvar proto = Item.prototype = Object.create( Outlayer.Item.prototype );\n\nvar _create = proto._create;\nproto._create = function() {\n  // assign id, used for original-order sorting\n  this.id = this.layout.itemGUID++;\n  _create.call( this );\n  this.sortData = {};\n};\n\nproto.updateSortData = function() {\n  if ( this.isIgnored ) {\n    return;\n  }\n  // default sorters\n  this.sortData.id = this.id;\n  // for backward compatibility\n  this.sortData['original-order'] = this.id;\n  this.sortData.random = Math.random();\n  // go thru getSortData obj and apply the sorters\n  var getSortData = this.layout.options.getSortData;\n  var sorters = this.layout._sorters;\n  for ( var key in getSortData ) {\n    var sorter = sorters[ key ];\n    this.sortData[ key ] = sorter( this.element, this );\n  }\n};\n\nvar _destroy = proto.destroy;\nproto.destroy = function() {\n  // call super\n  _destroy.apply( this, arguments );\n  // reset display, #741\n  this.css({\n    display: ''\n  });\n};\n\nreturn Item;\n\n}));\n\n/**\n * Isotope LayoutMode\n */\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /*globals define, module, require */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( 'isotope/js/layout-mode',[\n        'get-size/get-size',\n        'outlayer/outlayer'\n      ],\n      factory );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      require('get-size'),\n      require('outlayer')\n    );\n  } else {\n    // browser global\n    window.Isotope = window.Isotope || {};\n    window.Isotope.LayoutMode = factory(\n      window.getSize,\n      window.Outlayer\n    );\n  }\n\n}( window, function factory( getSize, Outlayer ) {\n  'use strict';\n\n  // layout mode class\n  function LayoutMode( isotope ) {\n    this.isotope = isotope;\n    // link properties\n    if ( isotope ) {\n      this.options = isotope.options[ this.namespace ];\n      this.element = isotope.element;\n      this.items = isotope.filteredItems;\n      this.size = isotope.size;\n    }\n  }\n\n  var proto = LayoutMode.prototype;\n\n  /**\n   * some methods should just defer to default Outlayer method\n   * and reference the Isotope instance as `this`\n  **/\n  var facadeMethods = [\n    '_resetLayout',\n    '_getItemLayoutPosition',\n    '_manageStamp',\n    '_getContainerSize',\n    '_getElementOffset',\n    'needsResizeLayout',\n    '_getOption'\n  ];\n\n  facadeMethods.forEach( function( methodName ) {\n    proto[ methodName ] = function() {\n      return Outlayer.prototype[ methodName ].apply( this.isotope, arguments );\n    };\n  });\n\n  // -----  ----- //\n\n  // for horizontal layout modes, check vertical size\n  proto.needsVerticalResizeLayout = function() {\n    // don't trigger if size did not change\n    var size = getSize( this.isotope.element );\n    // check that this.size and size are there\n    // IE8 triggers resize on body size change, so they might not be\n    var hasSizes = this.isotope.size && size;\n    return hasSizes && size.innerHeight != this.isotope.size.innerHeight;\n  };\n\n  // ----- measurements ----- //\n\n  proto._getMeasurement = function() {\n    this.isotope._getMeasurement.apply( this, arguments );\n  };\n\n  proto.getColumnWidth = function() {\n    this.getSegmentSize( 'column', 'Width' );\n  };\n\n  proto.getRowHeight = function() {\n    this.getSegmentSize( 'row', 'Height' );\n  };\n\n  /**\n   * get columnWidth or rowHeight\n   * segment: 'column' or 'row'\n   * size 'Width' or 'Height'\n  **/\n  proto.getSegmentSize = function( segment, size ) {\n    var segmentName = segment + size;\n    var outerSize = 'outer' + size;\n    // columnWidth / outerWidth // rowHeight / outerHeight\n    this._getMeasurement( segmentName, outerSize );\n    // got rowHeight or columnWidth, we can chill\n    if ( this[ segmentName ] ) {\n      return;\n    }\n    // fall back to item of first element\n    var firstItemSize = this.getFirstItemSize();\n    this[ segmentName ] = firstItemSize && firstItemSize[ outerSize ] ||\n      // or size of container\n      this.isotope.size[ 'inner' + size ];\n  };\n\n  proto.getFirstItemSize = function() {\n    var firstItem = this.isotope.filteredItems[0];\n    return firstItem && firstItem.element && getSize( firstItem.element );\n  };\n\n  // ----- methods that should reference isotope ----- //\n\n  proto.layout = function() {\n    this.isotope.layout.apply( this.isotope, arguments );\n  };\n\n  proto.getSize = function() {\n    this.isotope.getSize();\n    this.size = this.isotope.size;\n  };\n\n  // -------------------------- create -------------------------- //\n\n  LayoutMode.modes = {};\n\n  LayoutMode.create = function( namespace, options ) {\n\n    function Mode() {\n      LayoutMode.apply( this, arguments );\n    }\n\n    Mode.prototype = Object.create( proto );\n    Mode.prototype.constructor = Mode;\n\n    // default options\n    if ( options ) {\n      Mode.options = options;\n    }\n\n    Mode.prototype.namespace = namespace;\n    // register in Isotope\n    LayoutMode.modes[ namespace ] = Mode;\n\n    return Mode;\n  };\n\n  return LayoutMode;\n\n}));\n\n/*!\n * Masonry v4.2.0\n * Cascading grid layout library\n * http://masonry.desandro.com\n * MIT License\n * by David DeSandro\n */\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /*globals define, module, require */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( 'masonry/masonry',[\n        'outlayer/outlayer',\n        'get-size/get-size'\n      ],\n      factory );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      require('outlayer'),\n      require('get-size')\n    );\n  } else {\n    // browser global\n    window.Masonry = factory(\n      window.Outlayer,\n      window.getSize\n    );\n  }\n\n}( window, function factory( Outlayer, getSize ) {\n\n\n\n// -------------------------- masonryDefinition -------------------------- //\n\n  // create an Outlayer layout class\n  var Masonry = Outlayer.create('masonry');\n  // isFitWidth -> fitWidth\n  Masonry.compatOptions.fitWidth = 'isFitWidth';\n\n  var proto = Masonry.prototype;\n\n  proto._resetLayout = function() {\n    this.getSize();\n    this._getMeasurement( 'columnWidth', 'outerWidth' );\n    this._getMeasurement( 'gutter', 'outerWidth' );\n    this.measureColumns();\n\n    // reset column Y\n    this.colYs = [];\n    for ( var i=0; i < this.cols; i++ ) {\n      this.colYs.push( 0 );\n    }\n\n    this.maxY = 0;\n    this.horizontalColIndex = 0;\n  };\n\n  proto.measureColumns = function() {\n    this.getContainerWidth();\n    // if columnWidth is 0, default to outerWidth of first item\n    if ( !this.columnWidth ) {\n      var firstItem = this.items[0];\n      var firstItemElem = firstItem && firstItem.element;\n      // columnWidth fall back to item of first element\n      this.columnWidth = firstItemElem && getSize( firstItemElem ).outerWidth ||\n        // if first elem has no width, default to size of container\n        this.containerWidth;\n    }\n\n    var columnWidth = this.columnWidth += this.gutter;\n\n    // calculate columns\n    var containerWidth = this.containerWidth + this.gutter;\n    var cols = containerWidth / columnWidth;\n    // fix rounding errors, typically with gutters\n    var excess = columnWidth - containerWidth % columnWidth;\n    // if overshoot is less than a pixel, round up, otherwise floor it\n    var mathMethod = excess && excess < 1 ? 'round' : 'floor';\n    cols = Math[ mathMethod ]( cols );\n    this.cols = Math.max( cols, 1 );\n  };\n\n  proto.getContainerWidth = function() {\n    // container is parent if fit width\n    var isFitWidth = this._getOption('fitWidth');\n    var container = isFitWidth ? this.element.parentNode : this.element;\n    // check that this.size and size are there\n    // IE8 triggers resize on body size change, so they might not be\n    var size = getSize( container );\n    this.containerWidth = size && size.innerWidth;\n  };\n\n  proto._getItemLayoutPosition = function( item ) {\n    item.getSize();\n    // how many columns does this brick span\n    var remainder = item.size.outerWidth % this.columnWidth;\n    var mathMethod = remainder && remainder < 1 ? 'round' : 'ceil';\n    // round if off by 1 pixel, otherwise use ceil\n    var colSpan = Math[ mathMethod ]( item.size.outerWidth / this.columnWidth );\n    colSpan = Math.min( colSpan, this.cols );\n    // use horizontal or top column position\n    var colPosMethod = this.options.horizontalOrder ?\n      '_getHorizontalColPosition' : '_getTopColPosition';\n    var colPosition = this[ colPosMethod ]( colSpan, item );\n    // position the brick\n    var position = {\n      x: this.columnWidth * colPosition.col,\n      y: colPosition.y\n    };\n    // apply setHeight to necessary columns\n    var setHeight = colPosition.y + item.size.outerHeight;\n    var setMax = colSpan + colPosition.col;\n    for ( var i = colPosition.col; i < setMax; i++ ) {\n      this.colYs[i] = setHeight;\n    }\n\n    return position;\n  };\n\n  proto._getTopColPosition = function( colSpan ) {\n    var colGroup = this._getTopColGroup( colSpan );\n    // get the minimum Y value from the columns\n    var minimumY = Math.min.apply( Math, colGroup );\n\n    return {\n      col: colGroup.indexOf( minimumY ),\n      y: minimumY,\n    };\n  };\n\n  /**\n   * @param {Number} colSpan - number of columns the element spans\n   * @returns {Array} colGroup\n   */\n  proto._getTopColGroup = function( colSpan ) {\n    if ( colSpan < 2 ) {\n      // if brick spans only one column, use all the column Ys\n      return this.colYs;\n    }\n\n    var colGroup = [];\n    // how many different places could this brick fit horizontally\n    var groupCount = this.cols + 1 - colSpan;\n    // for each group potential horizontal position\n    for ( var i = 0; i < groupCount; i++ ) {\n      colGroup[i] = this._getColGroupY( i, colSpan );\n    }\n    return colGroup;\n  };\n\n  proto._getColGroupY = function( col, colSpan ) {\n    if ( colSpan < 2 ) {\n      return this.colYs[ col ];\n    }\n    // make an array of colY values for that one group\n    var groupColYs = this.colYs.slice( col, col + colSpan );\n    // and get the max value of the array\n    return Math.max.apply( Math, groupColYs );\n  };\n\n  // get column position based on horizontal index. #873\n  proto._getHorizontalColPosition = function( colSpan, item ) {\n    var col = this.horizontalColIndex % this.cols;\n    var isOver = colSpan > 1 && col + colSpan > this.cols;\n    // shift to next row if item can't fit on current row\n    col = isOver ? 0 : col;\n    // don't let zero-size items take up space\n    var hasSize = item.size.outerWidth && item.size.outerHeight;\n    this.horizontalColIndex = hasSize ? col + colSpan : this.horizontalColIndex;\n\n    return {\n      col: col,\n      y: this._getColGroupY( col, colSpan ),\n    };\n  };\n\n  proto._manageStamp = function( stamp ) {\n    var stampSize = getSize( stamp );\n    var offset = this._getElementOffset( stamp );\n    // get the columns that this stamp affects\n    var isOriginLeft = this._getOption('originLeft');\n    var firstX = isOriginLeft ? offset.left : offset.right;\n    var lastX = firstX + stampSize.outerWidth;\n    var firstCol = Math.floor( firstX / this.columnWidth );\n    firstCol = Math.max( 0, firstCol );\n    var lastCol = Math.floor( lastX / this.columnWidth );\n    // lastCol should not go over if multiple of columnWidth #425\n    lastCol -= lastX % this.columnWidth ? 0 : 1;\n    lastCol = Math.min( this.cols - 1, lastCol );\n    // set colYs to bottom of the stamp\n\n    var isOriginTop = this._getOption('originTop');\n    var stampMaxY = ( isOriginTop ? offset.top : offset.bottom ) +\n      stampSize.outerHeight;\n    for ( var i = firstCol; i <= lastCol; i++ ) {\n      this.colYs[i] = Math.max( stampMaxY, this.colYs[i] );\n    }\n  };\n\n  proto._getContainerSize = function() {\n    this.maxY = Math.max.apply( Math, this.colYs );\n    var size = {\n      height: this.maxY\n    };\n\n    if ( this._getOption('fitWidth') ) {\n      size.width = this._getContainerFitWidth();\n    }\n\n    return size;\n  };\n\n  proto._getContainerFitWidth = function() {\n    var unusedCols = 0;\n    // count unused columns\n    var i = this.cols;\n    while ( --i ) {\n      if ( this.colYs[i] !== 0 ) {\n        break;\n      }\n      unusedCols++;\n    }\n    // fit container to columns that have been used\n    return ( this.cols - unusedCols ) * this.columnWidth - this.gutter;\n  };\n\n  proto.needsResizeLayout = function() {\n    var previousWidth = this.containerWidth;\n    this.getContainerWidth();\n    return previousWidth != this.containerWidth;\n  };\n\n  return Masonry;\n\n}));\n\n/*!\n * Masonry layout mode\n * sub-classes Masonry\n * http://masonry.desandro.com\n */\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /*globals define, module, require */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( 'isotope/js/layout-modes/masonry',[\n        '../layout-mode',\n        'masonry/masonry'\n      ],\n      factory );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      require('../layout-mode'),\n      require('masonry-layout')\n    );\n  } else {\n    // browser global\n    factory(\n      window.Isotope.LayoutMode,\n      window.Masonry\n    );\n  }\n\n}( window, function factory( LayoutMode, Masonry ) {\n'use strict';\n\n// -------------------------- masonryDefinition -------------------------- //\n\n  // create an Outlayer layout class\n  var MasonryMode = LayoutMode.create('masonry');\n\n  var proto = MasonryMode.prototype;\n\n  var keepModeMethods = {\n    _getElementOffset: true,\n    layout: true,\n    _getMeasurement: true\n  };\n\n  // inherit Masonry prototype\n  for ( var method in Masonry.prototype ) {\n    // do not inherit mode methods\n    if ( !keepModeMethods[ method ] ) {\n      proto[ method ] = Masonry.prototype[ method ];\n    }\n  }\n\n  var measureColumns = proto.measureColumns;\n  proto.measureColumns = function() {\n    // set items, used if measuring first item\n    this.items = this.isotope.filteredItems;\n    measureColumns.call( this );\n  };\n\n  // point to mode options for fitWidth\n  var _getOption = proto._getOption;\n  proto._getOption = function( option ) {\n    if ( option == 'fitWidth' ) {\n      return this.options.isFitWidth !== undefined ?\n        this.options.isFitWidth : this.options.fitWidth;\n    }\n    return _getOption.apply( this.isotope, arguments );\n  };\n\n  return MasonryMode;\n\n}));\n\n/**\n * fitRows layout mode\n */\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /*globals define, module, require */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( 'isotope/js/layout-modes/fit-rows',[\n        '../layout-mode'\n      ],\n      factory );\n  } else if ( typeof exports == 'object' ) {\n    // CommonJS\n    module.exports = factory(\n      require('../layout-mode')\n    );\n  } else {\n    // browser global\n    factory(\n      window.Isotope.LayoutMode\n    );\n  }\n\n}( window, function factory( LayoutMode ) {\n'use strict';\n\nvar FitRows = LayoutMode.create('fitRows');\n\nvar proto = FitRows.prototype;\n\nproto._resetLayout = function() {\n  this.x = 0;\n  this.y = 0;\n  this.maxY = 0;\n  this._getMeasurement( 'gutter', 'outerWidth' );\n};\n\nproto._getItemLayoutPosition = function( item ) {\n  item.getSize();\n\n  var itemWidth = item.size.outerWidth + this.gutter;\n  // if this element cannot fit in the current row\n  var containerWidth = this.isotope.size.innerWidth + this.gutter;\n  if ( this.x !== 0 && itemWidth + this.x > containerWidth ) {\n    this.x = 0;\n    this.y = this.maxY;\n  }\n\n  var position = {\n    x: this.x,\n    y: this.y\n  };\n\n  this.maxY = Math.max( this.maxY, this.y + item.size.outerHeight );\n  this.x += itemWidth;\n\n  return position;\n};\n\nproto._getContainerSize = function() {\n  return { height: this.maxY };\n};\n\nreturn FitRows;\n\n}));\n\n/**\n * vertical layout mode\n */\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /*globals define, module, require */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( 'isotope/js/layout-modes/vertical',[\n        '../layout-mode'\n      ],\n      factory );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      require('../layout-mode')\n    );\n  } else {\n    // browser global\n    factory(\n      window.Isotope.LayoutMode\n    );\n  }\n\n}( window, function factory( LayoutMode ) {\n'use strict';\n\nvar Vertical = LayoutMode.create( 'vertical', {\n  horizontalAlignment: 0\n});\n\nvar proto = Vertical.prototype;\n\nproto._resetLayout = function() {\n  this.y = 0;\n};\n\nproto._getItemLayoutPosition = function( item ) {\n  item.getSize();\n  var x = ( this.isotope.size.innerWidth - item.size.outerWidth ) *\n    this.options.horizontalAlignment;\n  var y = this.y;\n  this.y += item.size.outerHeight;\n  return { x: x, y: y };\n};\n\nproto._getContainerSize = function() {\n  return { height: this.y };\n};\n\nreturn Vertical;\n\n}));\n\n/*!\n * Isotope v3.0.4\n *\n * Licensed GPLv3 for open source use\n * or Isotope Commercial License for commercial use\n *\n * http://isotope.metafizzy.co\n * Copyright 2017 Metafizzy\n */\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /*globals define, module, require */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n        'outlayer/outlayer',\n        'get-size/get-size',\n        'desandro-matches-selector/matches-selector',\n        'fizzy-ui-utils/utils',\n        'isotope/js/item',\n        'isotope/js/layout-mode',\n        // include default layout modes\n        'isotope/js/layout-modes/masonry',\n        'isotope/js/layout-modes/fit-rows',\n        'isotope/js/layout-modes/vertical'\n      ],\n      function( Outlayer, getSize, matchesSelector, utils, Item, LayoutMode ) {\n        return factory( window, Outlayer, getSize, matchesSelector, utils, Item, LayoutMode );\n      });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('outlayer'),\n      require('get-size'),\n      require('desandro-matches-selector'),\n      require('fizzy-ui-utils'),\n      require('isotope/js/item'),\n      require('isotope/js/layout-mode'),\n      // include default layout modes\n      require('isotope/js/layout-modes/masonry'),\n      require('isotope/js/layout-modes/fit-rows'),\n      require('isotope/js/layout-modes/vertical')\n    );\n  } else {\n    // browser global\n    window.Isotope = factory(\n      window,\n      window.Outlayer,\n      window.getSize,\n      window.matchesSelector,\n      window.fizzyUIUtils,\n      window.Isotope.Item,\n      window.Isotope.LayoutMode\n    );\n  }\n\n}( window, function factory( window, Outlayer, getSize, matchesSelector, utils,\n  Item, LayoutMode ) {\n\n\n\n// -------------------------- vars -------------------------- //\n\nvar jQuery = window.jQuery;\n\n// -------------------------- helpers -------------------------- //\n\nvar trim = String.prototype.trim ?\n  function( str ) {\n    return str.trim();\n  } :\n  function( str ) {\n    return str.replace( /^\\s+|\\s+$/g, '' );\n  };\n\n// -------------------------- isotopeDefinition -------------------------- //\n\n  // create an Outlayer layout class\n  var Isotope = Outlayer.create( 'isotope', {\n    layoutMode: 'masonry',\n    isJQueryFiltering: true,\n    sortAscending: true\n  });\n\n  Isotope.Item = Item;\n  Isotope.LayoutMode = LayoutMode;\n\n  var proto = Isotope.prototype;\n\n  proto._create = function() {\n    this.itemGUID = 0;\n    // functions that sort items\n    this._sorters = {};\n    this._getSorters();\n    // call super\n    Outlayer.prototype._create.call( this );\n\n    // create layout modes\n    this.modes = {};\n    // start filteredItems with all items\n    this.filteredItems = this.items;\n    // keep of track of sortBys\n    this.sortHistory = [ 'original-order' ];\n    // create from registered layout modes\n    for ( var name in LayoutMode.modes ) {\n      this._initLayoutMode( name );\n    }\n  };\n\n  proto.reloadItems = function() {\n    // reset item ID counter\n    this.itemGUID = 0;\n    // call super\n    Outlayer.prototype.reloadItems.call( this );\n  };\n\n  proto._itemize = function() {\n    var items = Outlayer.prototype._itemize.apply( this, arguments );\n    // assign ID for original-order\n    for ( var i=0; i < items.length; i++ ) {\n      var item = items[i];\n      item.id = this.itemGUID++;\n    }\n    this._updateItemsSortData( items );\n    return items;\n  };\n\n\n  // -------------------------- layout -------------------------- //\n\n  proto._initLayoutMode = function( name ) {\n    var Mode = LayoutMode.modes[ name ];\n    // set mode options\n    // HACK extend initial options, back-fill in default options\n    var initialOpts = this.options[ name ] || {};\n    this.options[ name ] = Mode.options ?\n      utils.extend( Mode.options, initialOpts ) : initialOpts;\n    // init layout mode instance\n    this.modes[ name ] = new Mode( this );\n  };\n\n\n  proto.layout = function() {\n    // if first time doing layout, do all magic\n    if ( !this._isLayoutInited && this._getOption('initLayout') ) {\n      this.arrange();\n      return;\n    }\n    this._layout();\n  };\n\n  // private method to be used in layout() & magic()\n  proto._layout = function() {\n    // don't animate first layout\n    var isInstant = this._getIsInstant();\n    // layout flow\n    this._resetLayout();\n    this._manageStamps();\n    this.layoutItems( this.filteredItems, isInstant );\n\n    // flag for initalized\n    this._isLayoutInited = true;\n  };\n\n  // filter + sort + layout\n  proto.arrange = function( opts ) {\n    // set any options pass\n    this.option( opts );\n    this._getIsInstant();\n    // filter, sort, and layout\n\n    // filter\n    var filtered = this._filter( this.items );\n    this.filteredItems = filtered.matches;\n\n    this._bindArrangeComplete();\n\n    if ( this._isInstant ) {\n      this._noTransition( this._hideReveal, [ filtered ] );\n    } else {\n      this._hideReveal( filtered );\n    }\n\n    this._sort();\n    this._layout();\n  };\n  // alias to _init for main plugin method\n  proto._init = proto.arrange;\n\n  proto._hideReveal = function( filtered ) {\n    this.reveal( filtered.needReveal );\n    this.hide( filtered.needHide );\n  };\n\n  // HACK\n  // Don't animate/transition first layout\n  // Or don't animate/transition other layouts\n  proto._getIsInstant = function() {\n    var isLayoutInstant = this._getOption('layoutInstant');\n    var isInstant = isLayoutInstant !== undefined ? isLayoutInstant :\n      !this._isLayoutInited;\n    this._isInstant = isInstant;\n    return isInstant;\n  };\n\n  // listen for layoutComplete, hideComplete and revealComplete\n  // to trigger arrangeComplete\n  proto._bindArrangeComplete = function() {\n    // listen for 3 events to trigger arrangeComplete\n    var isLayoutComplete, isHideComplete, isRevealComplete;\n    var _this = this;\n    function arrangeParallelCallback() {\n      if ( isLayoutComplete && isHideComplete && isRevealComplete ) {\n        _this.dispatchEvent( 'arrangeComplete', null, [ _this.filteredItems ] );\n      }\n    }\n    this.once( 'layoutComplete', function() {\n      isLayoutComplete = true;\n      arrangeParallelCallback();\n    });\n    this.once( 'hideComplete', function() {\n      isHideComplete = true;\n      arrangeParallelCallback();\n    });\n    this.once( 'revealComplete', function() {\n      isRevealComplete = true;\n      arrangeParallelCallback();\n    });\n  };\n\n  // -------------------------- filter -------------------------- //\n\n  proto._filter = function( items ) {\n    var filter = this.options.filter;\n    filter = filter || '*';\n    var matches = [];\n    var hiddenMatched = [];\n    var visibleUnmatched = [];\n\n    var test = this._getFilterTest( filter );\n\n    // test each item\n    for ( var i=0; i < items.length; i++ ) {\n      var item = items[i];\n      if ( item.isIgnored ) {\n        continue;\n      }\n      // add item to either matched or unmatched group\n      var isMatched = test( item );\n      // item.isFilterMatched = isMatched;\n      // add to matches if its a match\n      if ( isMatched ) {\n        matches.push( item );\n      }\n      // add to additional group if item needs to be hidden or revealed\n      if ( isMatched && item.isHidden ) {\n        hiddenMatched.push( item );\n      } else if ( !isMatched && !item.isHidden ) {\n        visibleUnmatched.push( item );\n      }\n    }\n\n    // return collections of items to be manipulated\n    return {\n      matches: matches,\n      needReveal: hiddenMatched,\n      needHide: visibleUnmatched\n    };\n  };\n\n  // get a jQuery, function, or a matchesSelector test given the filter\n  proto._getFilterTest = function( filter ) {\n    if ( jQuery && this.options.isJQueryFiltering ) {\n      // use jQuery\n      return function( item ) {\n        return jQuery( item.element ).is( filter );\n      };\n    }\n    if ( typeof filter == 'function' ) {\n      // use filter as function\n      return function( item ) {\n        return filter( item.element );\n      };\n    }\n    // default, use filter as selector string\n    return function( item ) {\n      return matchesSelector( item.element, filter );\n    };\n  };\n\n  // -------------------------- sorting -------------------------- //\n\n  /**\n   * @params {Array} elems\n   * @public\n   */\n  proto.updateSortData = function( elems ) {\n    // get items\n    var items;\n    if ( elems ) {\n      elems = utils.makeArray( elems );\n      items = this.getItems( elems );\n    } else {\n      // update all items if no elems provided\n      items = this.items;\n    }\n\n    this._getSorters();\n    this._updateItemsSortData( items );\n  };\n\n  proto._getSorters = function() {\n    var getSortData = this.options.getSortData;\n    for ( var key in getSortData ) {\n      var sorter = getSortData[ key ];\n      this._sorters[ key ] = mungeSorter( sorter );\n    }\n  };\n\n  /**\n   * @params {Array} items - of Isotope.Items\n   * @private\n   */\n  proto._updateItemsSortData = function( items ) {\n    // do not update if no items\n    var len = items && items.length;\n\n    for ( var i=0; len && i < len; i++ ) {\n      var item = items[i];\n      item.updateSortData();\n    }\n  };\n\n  // ----- munge sorter ----- //\n\n  // encapsulate this, as we just need mungeSorter\n  // other functions in here are just for munging\n  var mungeSorter = ( function() {\n    // add a magic layer to sorters for convienent shorthands\n    // `.foo-bar` will use the text of .foo-bar querySelector\n    // `[foo-bar]` will use attribute\n    // you can also add parser\n    // `.foo-bar parseInt` will parse that as a number\n    function mungeSorter( sorter ) {\n      // if not a string, return function or whatever it is\n      if ( typeof sorter != 'string' ) {\n        return sorter;\n      }\n      // parse the sorter string\n      var args = trim( sorter ).split(' ');\n      var query = args[0];\n      // check if query looks like [an-attribute]\n      var attrMatch = query.match( /^\\[(.+)\\]$/ );\n      var attr = attrMatch && attrMatch[1];\n      var getValue = getValueGetter( attr, query );\n      // use second argument as a parser\n      var parser = Isotope.sortDataParsers[ args[1] ];\n      // parse the value, if there was a parser\n      sorter = parser ? function( elem ) {\n        return elem && parser( getValue( elem ) );\n      } :\n      // otherwise just return value\n      function( elem ) {\n        return elem && getValue( elem );\n      };\n\n      return sorter;\n    }\n\n    // get an attribute getter, or get text of the querySelector\n    function getValueGetter( attr, query ) {\n      // if query looks like [foo-bar], get attribute\n      if ( attr ) {\n        return function getAttribute( elem ) {\n          return elem.getAttribute( attr );\n        };\n      }\n\n      // otherwise, assume its a querySelector, and get its text\n      return function getChildText( elem ) {\n        var child = elem.querySelector( query );\n        return child && child.textContent;\n      };\n    }\n\n    return mungeSorter;\n  })();\n\n  // parsers used in getSortData shortcut strings\n  Isotope.sortDataParsers = {\n    'parseInt': function( val ) {\n      return parseInt( val, 10 );\n    },\n    'parseFloat': function( val ) {\n      return parseFloat( val );\n    }\n  };\n\n  // ----- sort method ----- //\n\n  // sort filteredItem order\n  proto._sort = function() {\n    if ( !this.options.sortBy ) {\n      return;\n    }\n    // keep track of sortBy History\n    var sortBys = utils.makeArray( this.options.sortBy );\n    if ( !this._getIsSameSortBy( sortBys ) ) {\n      // concat all sortBy and sortHistory, add to front, oldest goes in last\n      this.sortHistory = sortBys.concat( this.sortHistory );\n    }\n    // sort magic\n    var itemSorter = getItemSorter( this.sortHistory, this.options.sortAscending );\n    this.filteredItems.sort( itemSorter );\n  };\n\n  // check if sortBys is same as start of sortHistory\n  proto._getIsSameSortBy = function( sortBys ) {\n    for ( var i=0; i < sortBys.length; i++ ) {\n      if ( sortBys[i] != this.sortHistory[i] ) {\n        return false;\n      }\n    }\n    return true;\n  };\n\n  // returns a function used for sorting\n  function getItemSorter( sortBys, sortAsc ) {\n    return function sorter( itemA, itemB ) {\n      // cycle through all sortKeys\n      for ( var i = 0; i < sortBys.length; i++ ) {\n        var sortBy = sortBys[i];\n        var a = itemA.sortData[ sortBy ];\n        var b = itemB.sortData[ sortBy ];\n        if ( a > b || a < b ) {\n          // if sortAsc is an object, use the value given the sortBy key\n          var isAscending = sortAsc[ sortBy ] !== undefined ? sortAsc[ sortBy ] : sortAsc;\n          var direction = isAscending ? 1 : -1;\n          return ( a > b ? 1 : -1 ) * direction;\n        }\n      }\n      return 0;\n    };\n  }\n\n  // -------------------------- methods -------------------------- //\n\n  // get layout mode\n  proto._mode = function() {\n    var layoutMode = this.options.layoutMode;\n    var mode = this.modes[ layoutMode ];\n    if ( !mode ) {\n      // TODO console.error\n      throw new Error( 'No layout mode: ' + layoutMode );\n    }\n    // HACK sync mode's options\n    // any options set after init for layout mode need to be synced\n    mode.options = this.options[ layoutMode ];\n    return mode;\n  };\n\n  proto._resetLayout = function() {\n    // trigger original reset layout\n    Outlayer.prototype._resetLayout.call( this );\n    this._mode()._resetLayout();\n  };\n\n  proto._getItemLayoutPosition = function( item  ) {\n    return this._mode()._getItemLayoutPosition( item );\n  };\n\n  proto._manageStamp = function( stamp ) {\n    this._mode()._manageStamp( stamp );\n  };\n\n  proto._getContainerSize = function() {\n    return this._mode()._getContainerSize();\n  };\n\n  proto.needsResizeLayout = function() {\n    return this._mode().needsResizeLayout();\n  };\n\n  // -------------------------- adding & removing -------------------------- //\n\n  // HEADS UP overwrites default Outlayer appended\n  proto.appended = function( elems ) {\n    var items = this.addItems( elems );\n    if ( !items.length ) {\n      return;\n    }\n    // filter, layout, reveal new items\n    var filteredItems = this._filterRevealAdded( items );\n    // add to filteredItems\n    this.filteredItems = this.filteredItems.concat( filteredItems );\n  };\n\n  // HEADS UP overwrites default Outlayer prepended\n  proto.prepended = function( elems ) {\n    var items = this._itemize( elems );\n    if ( !items.length ) {\n      return;\n    }\n    // start new layout\n    this._resetLayout();\n    this._manageStamps();\n    // filter, layout, reveal new items\n    var filteredItems = this._filterRevealAdded( items );\n    // layout previous items\n    this.layoutItems( this.filteredItems );\n    // add to items and filteredItems\n    this.filteredItems = filteredItems.concat( this.filteredItems );\n    this.items = items.concat( this.items );\n  };\n\n  proto._filterRevealAdded = function( items ) {\n    var filtered = this._filter( items );\n    this.hide( filtered.needHide );\n    // reveal all new items\n    this.reveal( filtered.matches );\n    // layout new items, no transition\n    this.layoutItems( filtered.matches, true );\n    return filtered.matches;\n  };\n\n  /**\n   * Filter, sort, and layout newly-appended item elements\n   * @param {Array or NodeList or Element} elems\n   */\n  proto.insert = function( elems ) {\n    var items = this.addItems( elems );\n    if ( !items.length ) {\n      return;\n    }\n    // append item elements\n    var i, item;\n    var len = items.length;\n    for ( i=0; i < len; i++ ) {\n      item = items[i];\n      this.element.appendChild( item.element );\n    }\n    // filter new stuff\n    var filteredInsertItems = this._filter( items ).matches;\n    // set flag\n    for ( i=0; i < len; i++ ) {\n      items[i].isLayoutInstant = true;\n    }\n    this.arrange();\n    // reset flag\n    for ( i=0; i < len; i++ ) {\n      delete items[i].isLayoutInstant;\n    }\n    this.reveal( filteredInsertItems );\n  };\n\n  var _remove = proto.remove;\n  proto.remove = function( elems ) {\n    elems = utils.makeArray( elems );\n    var removeItems = this.getItems( elems );\n    // do regular thing\n    _remove.call( this, elems );\n    // bail if no items to remove\n    var len = removeItems && removeItems.length;\n    // remove elems from filteredItems\n    for ( var i=0; len && i < len; i++ ) {\n      var item = removeItems[i];\n      // remove item from collection\n      utils.removeFrom( this.filteredItems, item );\n    }\n  };\n\n  proto.shuffle = function() {\n    // update random sortData\n    for ( var i=0; i < this.items.length; i++ ) {\n      var item = this.items[i];\n      item.sortData.random = Math.random();\n    }\n    this.options.sortBy = 'random';\n    this._sort();\n    this._layout();\n  };\n\n  /**\n   * trigger fn without transition\n   * kind of hacky to have this in the first place\n   * @param {Function} fn\n   * @param {Array} args\n   * @returns ret\n   * @private\n   */\n  proto._noTransition = function( fn, args ) {\n    // save transitionDuration before disabling\n    var transitionDuration = this.options.transitionDuration;\n    // disable transition\n    this.options.transitionDuration = 0;\n    // do it\n    var returnValue = fn.apply( this, args );\n    // re-enable transition for reveal\n    this.options.transitionDuration = transitionDuration;\n    return returnValue;\n  };\n\n  // ----- helper methods ----- //\n\n  /**\n   * getter method for getting filtered item elements\n   * @returns {Array} elems - collection of item elements\n   */\n  proto.getFilteredItemElements = function() {\n    return this.filteredItems.map( function( item ) {\n      return item.element;\n    });\n  };\n\n  // -----  ----- //\n\n  return Isotope;\n\n}));\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/isotope-layout/dist/isotope.pkgd.js\n// module id = GbzL7C/QFmiBZDICkla+\n// module chunks = 0","var matches = require('./matches')\n\n/**\n * closest : closest(el, selector)\n * Looks for the closest ancestor of element `el` that matches `selector`.\n * Compare with [$.fn.closest](http://api.jquery.com/closest/).\n *\n *     var closest = require('dom101/closest');\n *\n *     closest(input, 'label');\n */\n\nfunction closest (el, sel) {\n  if (!el) return\n  if (matches(el, sel)) {\n    return el\n  } else {\n    return closest(el.parentNode, sel)\n  }\n}\n\nmodule.exports = closest\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom101/closest.js\n// module id = Gz0TuoFFs6JdDvtR2PYZ\n// module chunks = 0","/**\n * on : on(el, event, fn)\n * Adds an event handler.\n *\n *     var on = require('dom101/on');\n *\n *     on(el, 'click', function () {\n *       ...\n *     });\n */\n\nfunction on (el, event, handler) {\n  if (el.addEventListener) {\n    el.addEventListener(event, handler)\n  } else {\n    el.attachEvent('on' + event, function () {\n      handler.call(el)\n    })\n  }\n}\n\nmodule.exports = on\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom101/on.js\n// module id = MKJaVdnD9jF7rk6rW6AJ\n// module chunks = 0","/**\n * each : each(list, fn)\n * Iterates through `list` (an array or an object). This is useful when dealing\n * with NodeLists like `document.querySelectorAll`.\n *\n *     var each = require('dom101/each');\n *     var qa = require('dom101/query-selector-all');\n *\n *     each(qa('.button'), function (el) {\n *       addClass('el', 'selected');\n *     });\n */\n\nfunction each (list, fn) {\n  var i\n  var len = list.length\n  var idx\n\n  if (typeof len === 'number') {\n    for (i = 0; i < len; i++) {\n      fn(list[i], i)\n    }\n  } else {\n    idx = 0\n    for (i in list) {\n      if (list.hasOwnProperty(i)) {\n        fn(list[i], i, idx++)\n      }\n    }\n  }\n\n  return list\n}\n\nmodule.exports = each\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom101/each.js\n// module id = O7wD3s+p+jjyw5ivWGEg\n// module chunks = 0","import onmount from 'onmount'\nimport remove from 'dom101/remove'\nimport removeClass from 'dom101/remove-class'\n\nimport { getData } from '../helpers/data'\nimport { isDismissed } from '../helpers/dismiss'\nimport { isPreview } from '../helpers/preview'\n\nonmount('[data-js-dismissable]', function () {\n  const id = getData(this, 'js-dismissable').id || ''\n\n  if (isPreview() || isDismissed(id)) {\n    remove(this)\n  } else {\n    removeClass(this, '-hide')\n  }\n})\n\n\n\n// WEBPACK FOOTER //\n// ./_js/behaviors/dismissable.js","import matches from 'dom101/matches'\n\n/*\n * Just like jQuery.append\n */\n\nexport function appendMany (el, children) {\n  children.forEach(child => { el.appendChild(child) })\n}\n\n/*\n * Just like jQuery.nextUntil\n */\n\nexport function nextUntil (el, selector) {\n  const nextEl = el.nextSibling\n  return nextUntilTick(nextEl, selector, [])\n}\n\nfunction nextUntilTick (el, selector, acc) {\n  if (!el) return acc\n\n  const isMatch = matches(el, selector)\n  if (isMatch) return acc\n\n  return nextUntilTick(el.nextSibling, selector, [ ...acc, el ])\n}\n\n/*\n * Just like jQuery.before\n */\n\nexport function before (reference, newNode) {\n  reference.parentNode.insertBefore(newNode, reference)\n}\n\n/*\n * Like jQuery.children('selector')\n */\n\nexport function findChildren (el, selector) {\n  return [].slice.call(el.children)\n    .filter(child => matches(child, selector))\n}\n\n/**\n * Creates a div\n * @private\n *\n * @example\n *\n *     createDiv({ class: 'foo' })\n */\n\nexport function createDiv (props) {\n  const d = document.createElement('div')\n  Object.keys(props).forEach(key => {\n    d.setAttribute(key, props[key])\n  })\n  return d\n}\n\n\n\n// WEBPACK FOOTER //\n// ./_js/helpers/dom.js","import closest from 'dom101/closest'\nimport remove from 'dom101/remove'\nimport on from 'dom101/on'\nimport { getData } from '../helpers/data'\nimport onmount from 'onmount'\nimport * as Dismiss from '../helpers/dismiss'\n\n/**\n * Dismiss button\n */\n\nonmount('[data-js-dismiss]', function () {\n  const parent = closest(this, '[data-js-dismissable]')\n  const dismissable = getData(parent, 'js-dismissable')\n  const id = (dismissable && dismissable.id) || ''\n\n  on(this, 'click', e => {\n    Dismiss.setDismissed(id)\n    e.preventDefault()\n    if (parent) remove(parent)\n  })\n})\n\n\n\n// WEBPACK FOOTER //\n// ./_js/behaviors/dismiss.js","var each = require('./each')\n\n/**\n * removeClass : removeClass(el, className)\n * Removes a classname.\n *\n *     var removeClass = require('dom101/remove-class');\n *\n *     el.className = 'selected active';\n *     removeClass(el, 'active');\n *\n *     el.className\n *     => \"selected\"\n */\n\nfunction removeClass (el, className) {\n  if (!className) return\n\n  if (Array.isArray(className)) {\n    each(className, function (className) {\n      removeClass(el, className)\n    })\n\n    return\n  }\n\n  if (el.classList) {\n    var classNames = className.split(' ').filter(Boolean)\n    each(classNames, function (className) {\n      el.classList.remove(className)\n    })\n  } else {\n    var expr =\n      new RegExp('(^|\\\\b)' + className.split(' ').join('|') + '(\\\\b|$)', 'gi')\n\n    el.className = el.className.replace(expr, ' ')\n  }\n}\n\nmodule.exports = removeClass\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom101/remove-class.js\n// module id = bq+j3PCtCSGVXgg8xWPw\n// module chunks = 0","var map = {\n\t\"./anchors.js\": \"lpgA2dewefHNQWX4X3Mh\",\n\t\"./dismiss.js\": \"azEBDvunS5n/qbuQInIF\",\n\t\"./dismissable.js\": \"XxGrbZud7DE4W4TdQZtc\",\n\t\"./disqus.js\": \"BuWMdGeXUEK0GmkN01pU\",\n\t\"./h3-section-list.js\": \"E+dCGfS1pT5WowYv7jpv\",\n\t\"./main-body.js\": \"g3wkw0XZUos0Eo8rU7p6\",\n\t\"./no-preview.js\": \"k6EYej2Qda8Mq9A5Oeqn\",\n\t\"./search-form.js\": \"D3SYMdNAenu80VOO7/Dv\",\n\t\"./search-input.js\": \"zNHHVy5XxvKjnqTgwxy7\",\n\t\"./searchable-header.js\": \"veOabZWTWtixkn1TyITD\",\n\t\"./searchable-item.js\": \"tcev71HWHlq3Ur/sw7Ir\"\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"cBdQffYQOU2SCSRXjSUx\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./_js/behaviors \\.js$\n// module id = cBdQffYQOU2SCSRXjSUx\n// module chunks = 0","/**\n * Injects disqus's scripts into the page.\n *\n * @example\n *     inject('devhints.disqus.com')\n */\n\nexport default function inject (host) {\n  injectEmbed(host)\n  injectCount(host)\n}\n\nexport function injectEmbed (host) {\n  const d = document\n  const s = d.createElement('script')\n  s.src = `https://${host}/embed.js`\n  s.setAttribute('data-timestamp', +new Date())\n  ;(d.head || d.body).appendChild(s)\n}\n\nexport function injectCount (host) {\n  const d = document\n  const s = d.createElement('script')\n  s.src = `https://${host}/count.js`\n  s.id = 'dsq-count-scr'\n  s.async = true\n  ;(d.head || d.body).appendChild(s)\n}\n\n\n\n// WEBPACK FOOTER //\n// ./_js/helpers/inject_disqus.js","/**\n * prepend : prepend(el, child)\n * Prepends a `child` into a parent `el`. Compare with `$.fn.prepend`.\n *\n *     var prepend = require('dom101/prepend');\n *\n *     prepend(el, child);\n */\n\nfunction prepend (el, child) {\n  if (el.firstChild) {\n    el.insertBefore(child, el.firstChild)\n  } else {\n    el.appendChild(child)\n  }\n}\n\nmodule.exports = prepend\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom101/prepend.js\n// module id = djrEhtin0g5nRB/RnnLU\n// module chunks = 0","/*\n * Helper: minimal qs implementation\n */\n\nexport default function qs (search) {\n  search = search.substr(1)\n  const parts = search.split('&').map(p => p.split('='))\n  return parts.reduce((result, part) => {\n    result[part[0]] = qsdecode(part[1])\n    return result\n  }, {})\n}\n\nexport function qsdecode (string) {\n  if (!string) string = ''\n  string = string.replace(/\\+/g, ' ')\n  return string\n}\n\n\n\n// WEBPACK FOOTER //\n// ./_js/helpers/qs.js","import remove from 'dom101/remove'\nimport onmount from 'onmount'\nimport addClass from 'dom101/add-class'\n\nimport { isPreview } from '../helpers/preview'\n\n/*\n * Behavior: Things to remove when preview mode is on\n */\n\nonmount('[data-js-no-preview]', function (b) {\n  if (isPreview()) {\n    remove(this)\n    addClass(document.documentElement, 'PreviewMode')\n  }\n})\n\n\n\n// WEBPACK FOOTER //\n// ./_js/behaviors/no-preview.js","var each = require('./each')\n\n/**\n * addClass : addClass(el, className)\n * Adds a class name to an element. Compare with `$.fn.addClass`.\n *\n *     var addClass = require('dom101/add-class');\n *\n *     addClass(el, 'active');\n */\n\nfunction addClass (el, className) {\n  if (!className) return\n\n  if (Array.isArray(className)) {\n    each(className, function (className) {\n      addClass(el, className)\n    })\n\n    return\n  }\n\n  if (el.classList) {\n    var classNames = className.split(' ').filter(Boolean)\n    each(classNames, function (className) {\n      el.classList.add(className)\n    })\n  } else {\n    el.className += ' ' + className\n  }\n}\n\nmodule.exports = addClass\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom101/add-class.js\n// module id = lGfezzQL7fc5RE8kg33g\n// module chunks = 0","import onmount from 'onmount'\nimport prepend from 'dom101/prepend'\n\nconst DEFAULTS = {\n  // select elements to put anchor on\n  rule: 'h2[id]',\n  // class name for anchor\n  className: 'local-anchor anchor',\n  // text of anchor\n  text: '#',\n  // append before or after innerText?\n  shouldAppend: false,\n}\n\n/*\n * Behavior: Add local anchors\n */\n\nonmount('[data-js-anchors]', function () {\n  const data = JSON.parse(this.getAttribute('data-js-anchors') || '{}')\n  const rules = Array.isArray(data)\n    ? (data.length ? data : [DEFAULTS])\n    : [Object.assign({}, DEFAULTS, data)]\n\n  for (const { rule, className, text, shouldAppend } of rules) {\n    for (const el of this.querySelectorAll(rule)) {\n      if (!el.hasAttribute('id')) {\n        continue\n      }\n\n      const id = el.getAttribute('id')\n      const anchor = document.createElement('a')\n      anchor.setAttribute('href', `#${id}`)\n      anchor.setAttribute('class', className)\n      anchor.innerText = String(text || DEFAULTS.text)\n\n      if (shouldAppend) {\n        el.appendChild(anchor)\n      } else {\n        prepend(el, anchor)\n      }\n    }\n  }\n})\n\n\n\n// WEBPACK FOOTER //\n// ./_js/behaviors/anchors.js","import onmount from 'onmount'\nimport permutate from '../helpers/permutate'\n\n/**\n * Sets search indices (`data-search-index` attribute)\n */\n\nonmount('[data-js-searchable-item]', function () {\n  const data = JSON.parse(this.getAttribute('data-js-searchable-item') || '{}')\n  const words = permutate(data)\n\n  this.setAttribute('data-search-index', words.join(' '))\n})\n\n\n\n// WEBPACK FOOTER //\n// ./_js/behaviors/searchable-item.js","/**\n * ready : ready(fn)\n * Executes `fn` when the DOM is ready. If the DOM is already ready, the given\n * callback will be called immediately.\n *\n *     var ready = require('dom101/ready');\n *\n *     ready(function () {\n *       ...\n *     });\n */\n\nfunction ready (fn) {\n  if (isReady()) {\n    return fn()\n  } else if (document.addEventListener) {\n    document.addEventListener('DOMContentLoaded', fn)\n  } else {\n    document.attachEvent('onreadystatechange', function () {\n      if (isReady()) fn()\n    })\n  }\n}\n\nfunction isReady () {\n  return (document.readyState === 'complete' || document.readyState === 'interactive')\n}\n\nmodule.exports = ready\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom101/ready.js\n// module id = tqbVxj9+xGAhlFrQpyTS\n// module chunks = 0","import onmount from 'onmount'\nimport { nextUntil } from '../helpers/dom'\nimport matches from 'dom101/matches'\n\n// Ensure that search-index is set first\nimport './searchable-item'\n\n/**\n * Propagate item search indices to headers\n */\n\nonmount('[data-js-searchable-header]', function () {\n  const els = nextUntil(this, '[data-js-searchable-header]')\n    .filter(el => matches(el, '[data-search-index]'))\n\n  const keywords = els\n    .map(n => n.getAttribute('data-search-index'))\n    .join(' ')\n    .split(' ')\n\n  this.setAttribute('data-search-index', keywords.join(' '))\n})\n\n\n\n// WEBPACK FOOTER //\n// ./_js/behaviors/searchable-header.js","/**\n * remove : remove(el)\n * Removes an element from the DOM.\n *\n *     var remove = require('dom101/remove');\n *\n *     remove(el);\n */\n\nfunction remove (el) {\n  el && el.parentNode && el.parentNode.removeChild(el)\n}\n\nmodule.exports = remove\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom101/remove.js\n// module id = wYegCzKWCG2ZRJZfGEZa\n// module chunks = 0","/* global define */\nvoid (function (root, factory) {\n  if (typeof define === 'function' && define.amd) define(factory)\n  else if (typeof exports === 'object') module.exports = factory()\n  else {\n    if (window.jQuery) window.jQuery.onmount = factory()\n    else root.onmount = factory()\n  }\n}(this, function ($) {\n  /*\n   * Internal: Registry.\n   */\n\n  var handlers, behaviors, selectors, log\n\n  /*\n   * Internal: IDs for auto-incrementing.\n   */\n\n  var bid = 0 /* behavior ID */\n  var cid = 0 /* component ID */\n\n  /**\n   * (Module) Adds a behavior, or triggers behaviors.\n   *\n   * When no parameters are passed, it triggers all behaviors. When one\n   * parameter is passed, it triggers the given behavior. Otherwise, it adds a\n   * behavior.\n   *\n   *     // define a behavior\n   *     $.onmount('.select-box', function () {\n   *       $(this).on('...')\n   *     })\n   *\n   *     // define a behavior with exit\n   *     $.onmount('.select-box', function () {\n   *       $(document).on('...')\n   *     }, function () {\n   *       $(document).off('...')\n   *     })\n   *\n   *     // retrigger a onmount\n   *     $.onmount('.select-box')\n   *\n   *     // retriggers all behaviors\n   *     $.onmount()\n   */\n\n  function onmount (selector, init, exit, options) {\n    if (typeof exit === 'object') {\n      options = exit\n      exit = undefined\n    }\n\n    if (arguments.length === 0 || isjQuery(selector) || isEvent(selector)) {\n      // onmount() - trigger all behaviors. Also account for cases such as\n      // $($.onmount), where it's triggered with a jQuery event object.\n      onmount.poll()\n    } else if (arguments.length === 1) {\n      // onmount(selector) - trigger for a given selector.\n      onmount.poll(selector)\n    } else {\n      // onmount(sel, fn, [fn]) - register a new behavior.\n      var be = new Behavior(selector, init, exit, options)\n      behaviors.push(be)\n      be.register()\n    }\n\n    return this\n  }\n\n  /*\n   * Use jQuery (or a jQuery-like) when available. This will allow\n   * the use of jQuery selectors.\n   */\n\n  onmount.$ = window.jQuery || window.Zepto || window.Ender\n\n  /*\n   * Detect MutationObserver support for `onmount.observe()`.\n   * You may even add a polyfill here via\n   * `onmount.MutationObserver = require('mutation-observer')`.\n   */\n\n  onmount.MutationObserver =\n    window.MutationObserver ||\n    window.WebKitMutationObserver ||\n    window.MozMutationObserver\n\n  /**\n   * Set this to true if you want to see debug messages.\n   */\n\n  onmount.debug = false\n\n  /**\n   * Internal: triggers behaviors for a selector or for all.\n   *\n   *     onmount.poll()\n   *     onmount.poll('.js-button')\n   */\n\n  onmount.poll = function poll (selector) {\n    if (selector) selector = onmount.selectify(selector)\n    var functions = (selector ? selectors[selector] : handlers) || []\n    each(functions, function (fn) { fn() })\n  }\n\n  /**\n   * Observes automatically using MutationObserver events.\n   *\n   *     onmount.observe()\n   */\n\n  onmount.observe = function observe () {\n    var MutationObserver = onmount.MutationObserver\n    if (typeof MutationObserver === 'undefined') return\n\n    var obs = new MutationObserver(function (mutations) {\n      each(behaviors, function (be) {\n        each(mutations, function (mutation) {\n          each(mutation.addedNodes, function (el) {\n            if (matches(el, be.selector)) be.visitEnter(el)\n          })\n\n          each(mutation.removedNodes, function (el) {\n            if (matches(el, be.selector)) be.doExit(el)\n          })\n        })\n      })\n    })\n\n    obs.observe(document, { subtree: true, childList: true })\n    onmount.observer = obs\n\n    // trigger everything before going\n    onmount()\n    return true\n  }\n\n  /**\n   * Turns off observation first issued by `onmount.observe()`.\n   */\n\n  onmount.unobserve = function unobserve () {\n    if (!this.observer) return\n    this.observer.disconnect()\n    delete this.observer\n  }\n\n  /**\n   * Forces teardown of all behaviors currently applied.\n   */\n\n  onmount.teardown = function teardown () {\n    each(behaviors, function (be) {\n      each(be.loaded, function (el, i) {\n        if (el) be.doExit(el, i)\n      })\n    })\n  }\n\n  /**\n   * Clears all behaviors. Useful for tests.\n   * This will NOT call exit handlers.\n   */\n\n  onmount.reset = function reset () {\n    handlers = onmount.handlers = []\n    selectors = onmount.selectors = {}\n    behaviors = onmount.behaviors = []\n  }\n\n  /**\n   * Internal: Converts `@role` to `[role~=\"role\"]` if needed. You can override\n   * this by reimplementing `onmount.selectify`.\n   *\n   *     selectify('@hi')   //=> '[role=\"hi\"]'\n   *     selectify('.btn')  //=> '.btn'\n   */\n\n  onmount.selectify = function selectify (selector) {\n    if (selector[0] === '@') {\n      return '[role~=\"' + selector.substr(1).replace(/\"/g, '\\\\\"') + '\"]'\n    }\n    return selector\n  }\n\n  /**\n   * Internal: behavior class\n   */\n\n  function Behavior (selector, init, exit, options) {\n    this.id = 'b' + bid++\n    this.init = init\n    this.exit = exit\n    this.selector = onmount.selectify(selector)\n    this.loaded = [] // keep track of dom elements loaded for this behavior\n    this.key = '__onmount:' + bid // leave the state in el['__onmount:12']\n    this.detectMutate = options && options.detectMutate\n  }\n\n  /**\n   * Internal: initialize this behavior by registering itself to the internal\n   * `selectors` map. This allows you to call `onmount(selector)` later on.\n   */\n\n  Behavior.prototype.register = function () {\n    var be = this\n    var loaded = this.loaded\n    var selector = this.selector\n\n    register(selector, function () {\n      var list = query(selector)\n\n      // This is the function invoked on `onmount(selector)`.\n      // Clean up old ones (if they're not in the DOM anymore).\n      each(loaded, function (element, i) {\n        be.visitExit(element, i, list)\n      })\n\n      // Clean up new ones (if they're not loaded yet).\n      eachOf(list, function (element) {\n        be.visitEnter(element)\n      })\n    })\n  }\n\n  /**\n   * Internal: visits the element `el` and turns it on if applicable.\n   */\n\n  Behavior.prototype.visitEnter = function (el) {\n    if (el[this.key]) return\n    var options = { id: 'c' + cid, selector: this.selector }\n    if (this.init.call(el, options) !== false) {\n      if (onmount.debug) log('enter', this.selector, el)\n      el[this.key] = options\n      this.loaded.push(el)\n      cid++\n    }\n  }\n\n  /**\n   * Internal: visits the element `el` and sees if it needs its exit handler\n   * called.\n   */\n\n  Behavior.prototype.visitExit = function (el, i, list) {\n    if (!el) return\n    if (this.detectMutate) {\n      if (!has(list, el)) return this.doExit(el, i)\n    } else {\n      if (!isAttached(el)) return this.doExit(el, i)\n    }\n  }\n\n  /**\n   * Internal: calls the exit handler for the behavior for element `el` (if\n   * available), and marks the behavior/element as uninitialized.\n   */\n\n  Behavior.prototype.doExit = function (el, i) {\n    if (typeof i === 'undefined') i = this.loaded.indexOf(el)\n    this.loaded[i] = undefined\n    if (this.exit && this.exit.call(el, el[this.key]) !== false) {\n      if (onmount.debug) log('exit', this.selector, el)\n      delete el[this.key]\n    }\n  }\n\n  /**\n   * Internal: check if an element is still attached to its document.\n   */\n\n  function isAttached (el) {\n    while (el) {\n      if (el === document.documentElement) return true\n      el = el.parentElement\n    }\n  }\n\n  /**\n   * Internal: reimplementation of `$('...')`. If jQuery is available,\n   * use it (I guess to preserve IE compatibility and to enable special jQuery\n   * attribute selectors). Use with `eachOf()` or `has()`.\n   */\n\n  function query (selector, fn) {\n    if (onmount.$) return onmount.$(selector)\n    return document.querySelectorAll(selector)\n  }\n\n  /**\n   * Internal: iterates through a `query()` result.\n   */\n\n  function eachOf (list, fn) {\n    if (onmount.$) return list.each(function (i) { fn(this, i) })\n    return each(list, fn)\n  }\n\n  /**\n   * Interanl: checks if given element `el` is in the query result `list`.\n   */\n\n  function has (list, el) {\n    if (onmount.$) return list.index(el) > -1\n    return list.indexOf(el) > -1\n  }\n\n  /**\n   * Internal: registers a behavior handler for a selector.\n   */\n\n  function register (selector, fn) {\n    if (!selectors[selector]) selectors[selector] = []\n    selectors[selector].push(fn)\n    handlers.push(fn)\n  }\n\n  /**\n   * Checks if a given element `el` matches `selector`.\n   * Compare with [$.fn.is](http://api.jquery.com/is/).\n   *\n   *     var matches = require('dom101/matches');\n   *\n   *     matches(button, ':focus');\n   */\n\n  function matches (el, selector) {\n    var _matches = el.matches ||\n      el.matchesSelector ||\n      el.msMatchesSelector ||\n      el.mozMatchesSelector ||\n      el.webkitMatchesSelector ||\n      el.oMatchesSelector\n\n    if (onmount.$) {\n      return onmount.$(el).is(selector)\n    } else if (_matches) {\n      return _matches.call(el, selector)\n    } else if (el.parentNode) {\n      // IE8 and below\n      var nodes = el.parentNode.querySelectorAll(selector)\n      for (var i = nodes.length; i--; 0) {\n        if (nodes[i] === el) return true\n      }\n      return false\n    }\n  }\n\n  /**\n   * Iterates through `list` (an array or an object). This is useful when dealing\n   * with NodeLists like `document.querySelectorAll`.\n   *\n   *     var each = require('dom101/each');\n   *     var qa = require('dom101/query-selector-all');\n   *\n   *     each(qa('.button'), function (el) {\n   *       addClass('el', 'selected');\n   *     });\n   */\n\n  function each (list, fn) {\n    var i\n    var len = list.length\n\n    if (len === +len) {\n      for (i = 0; i < len; i++) { fn(list[i], i) }\n    } else {\n      for (i in list) {\n        if (list.hasOwnProperty(i)) fn(list[i], i)\n      }\n    }\n\n    return list\n  }\n\n  /**\n   * Internal: Check if a given object is jQuery\n   */\n\n  function isjQuery ($) {\n    return typeof $ === 'function' && $.fn && $.noConflict\n  }\n\n  function isEvent (e) {\n    return typeof e === 'object' && e.target\n  }\n\n  /**\n   * Internal: logging\n   */\n\n  var styles = {\n    enter: 'background-color:#dfd;font-weight:bold;color:#141',\n    exit: 'background-color:#fdd;font-weight:bold;color:#411'\n  }\n\n  if (~navigator.userAgent.indexOf('Mozilla')) {\n    log = function (type, selector, el) {\n      console.log('%c %s ', styles[type], selector, el)\n    }\n  } else {\n    log = function (type, selector, el) {\n      console.log('(onmount)', type, selector)\n    }\n  }\n\n  /*\n   * Export\n   */\n\n  onmount.reset()\n  return onmount\n}))\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/onmount/index.js\n// module id = yfX/NEeqeNrvWENPWWKS\n// module chunks = 0","// 3rd party libs\nwindow.Prism = require('prismjs')\n\n// All the others\nfunction requireAll (r) { r.keys().forEach(r) }\nrequireAll(require.context('./initializers/', true, /\\.js$/))\nrequireAll(require.context('./behaviors/', true, /\\.js$/))\n\n\n\n// WEBPACK FOOTER //\n// ./_js/app.js","import onmount from 'onmount'\nimport * as Search from '../helpers/search'\nimport qs from '../helpers/qs'\nimport on from 'dom101/on'\n\nonmount('[data-js-search-input]', function () {\n  on(this, 'input', () => {\n    const val = this.value\n\n    if (val === '') {\n      Search.showAll()\n    } else {\n      Search.show(val)\n    }\n  })\n\n  const query = (qs(window.location.search) || {}).q\n  if (query && query.length) {\n    this.value = query\n    setTimeout(() => { Search.show(query) })\n  }\n})\n\n\n\n// WEBPACK FOOTER //\n// ./_js/behaviors/search-input.js"],"sourceRoot":""}