/*! For license information please see component---src-pages-gallery-tsx-8d7416249168a6e451cb.js.LICENSE.txt */
(window.webpackJsonp=window.webpackJsonp||[]).push([[75],{"+vvU":function(e,t,n){e.exports=n("n9FV")},"0hL1":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if("display"===e&&r[t])return{display:["-webkit-box","-moz-box","-ms-"+t+"box","-webkit-"+t,t]}};var r={flex:!0,"inline-flex":!0};e.exports=t.default},"1W/U":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if("string"==typeof t&&u[e]){var n,l=function(e){if((0,i.default)(e))return e;var t=e.split(/,(?![^()]*(?:\([^()]*\))?\))/g);return t.forEach((function(e,n){t[n]=Object.keys(a.default).reduce((function(t,n){var o="-"+n.toLowerCase()+"-";return Object.keys(a.default[n]).forEach((function(n){var i=(0,r.default)(n);e.indexOf(i)>-1&&"order"!==i&&(t=e.replace(i,o+i)+","+t)})),t}),e)})),t.join(",")}(t),c=l.split(/,(?![^()]*(?:\([^()]*\))?\))/g).filter((function(e){return null===e.match(/-moz-|-ms-/)})).join(",");return e.indexOf("Webkit")>-1?s({},e,c):(s(n={},"Webkit"+(0,o.default)(e),c),s(n,e,l),n)}};var r=l(n("MAmL")),o=l(n("HiWe")),i=l(n("ZlNK")),a=l(n("i3Rp"));function l(e){return e&&e.__esModule?e:{default:e}}function s(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var u={transition:!0,transitionProperty:!0,WebkitTransition:!0,WebkitTransitionProperty:!0};e.exports=t.default},"1w3K":function(e,t,n){"use strict";var r=l(n("Si88")),o=l(n("PAGr")),i=l(n("UnXY")),a=l(n("S3Uj"));function l(e){return e&&e.__esModule?e:{default:e}}e.exports={Transition:a.default,TransitionGroup:i.default,ReplaceTransition:o.default,CSSTransition:r.default}},"2rMq":function(e,t,n){var r;!function(){"use strict";var o=!("undefined"==typeof window||!window.document||!window.document.createElement),i={canUseDOM:o,canUseWorkers:"undefined"!=typeof Worker,canUseEventListeners:o&&!(!window.addEventListener&&!window.attachEvent),canUseViewport:o&&!!window.screen};void 0===(r=function(){return i}.call(t,n,t,e))||(e.exports=r)}()},"42J/":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},o=c(n("17x9")),i=c(n("q1tI")),a=n("Rz3U"),l=c(n("iRxY")),s=c(n("gPbE")),u=c(n("HFUj"));function c(e){return e&&e.__esModule?e:{default:e}}function f(e,t){var n=t.theme,o=e.customControls,c=e.onClose,f=e.showCloseButton,d=e.closeButtonTitle,h=function(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}(e,["customControls","onClose","showCloseButton","closeButtonTitle"]),m=a.StyleSheet.create((0,s.default)(p,n));return i.default.createElement("div",r({className:(0,a.css)(m.header)},h),o||i.default.createElement("span",null),!!f&&i.default.createElement("button",{title:d,className:(0,a.css)(m.close),onClick:c},i.default.createElement(u.default,{fill:!!n.close&&n.close.fill||l.default.close.fill,type:"close"})))}f.propTypes={customControls:o.default.array,onClose:o.default.func.isRequired,showCloseButton:o.default.bool},f.contextTypes={theme:o.default.object.isRequired};var p={header:{display:"flex",justifyContent:"space-between",height:l.default.header.height},close:{background:"none",border:"none",cursor:"pointer",outline:"none",position:"relative",top:0,verticalAlign:"bottom",zIndex:1,height:40,marginRight:-10,padding:10,width:40}};t.default=f},"51uJ":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return'<svg fill="'+e+'" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="100%" height="100%" viewBox="0 0 512 512" xml:space="preserve">\n\t\t<path d="M298.3,256L298.3,256L298.3,256L131.1,81.9c-4.2-4.3-4.1-11.4,0.2-15.8l29.9-30.6c4.3-4.4,11.3-4.5,15.5-0.2l204.2,212.7 c2.2,2.2,3.2,5.2,3,8.1c0.1,3-0.9,5.9-3,8.1L176.7,476.8c-4.2,4.3-11.2,4.2-15.5-0.2L131.3,446c-4.3-4.4-4.4-11.5-0.2-15.8 L298.3,256z"/>\n\t</svg>'}},"8PcY":function(e,t,n){"use strict";t.__esModule=!0,t.getChildMapping=o,t.mergeChildMappings=i,t.getInitialChildMapping=function(e,t){return o(e.children,(function(n){return(0,r.cloneElement)(n,{onExited:t.bind(null,n),in:!0,appear:a(n,"appear",e),enter:a(n,"enter",e),exit:a(n,"exit",e)})}))},t.getNextChildMapping=function(e,t,n){var l=o(e.children),s=i(t,l);return Object.keys(s).forEach((function(o){var i=s[o];if((0,r.isValidElement)(i)){var u=o in t,c=o in l,f=t[o],p=(0,r.isValidElement)(f)&&!f.props.in;!c||u&&!p?c||!u||p?c&&u&&(0,r.isValidElement)(f)&&(s[o]=(0,r.cloneElement)(i,{onExited:n.bind(null,i),in:f.props.in,exit:a(i,"exit",e),enter:a(i,"enter",e)})):s[o]=(0,r.cloneElement)(i,{in:!1}):s[o]=(0,r.cloneElement)(i,{onExited:n.bind(null,i),in:!0,exit:a(i,"exit",e),enter:a(i,"enter",e)})}})),s};var r=n("q1tI");function o(e,t){var n=Object.create(null);return e&&r.Children.map(e,(function(e){return e})).forEach((function(e){n[e.key]=function(e){return t&&(0,r.isValidElement)(e)?t(e):e}(e)})),n}function i(e,t){function n(n){return n in t?t[n]:e[n]}e=e||{},t=t||{};var r,o=Object.create(null),i=[];for(var a in e)a in t?i.length&&(o[a]=i,i=[]):i.push(a);var l={};for(var s in t){if(o[s])for(r=0;r<o[s].length;r++){var u=o[s][r];l[o[s][r]]=n(u)}l[s]=n(s)}for(r=0;r<i.length;r++)l[i[r]]=n(i[r]);return l}function a(e,t,n){return null!=n[t]?n[t]:e.props[t]}},CGmC:function(e,t,n){"use strict";var r=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=c(n("17x9")),a=n("q1tI"),l=c(a),s=c(n("wbUH")),u=c(n("TuFc"));function c(e){return e&&e.__esModule?e:{default:e}}var f=function(e){function t(e){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t);var n=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.state={images:n.props.images,thumbnails:[],lightboxIsOpen:n.props.isOpen,currentImage:n.props.currentImage,containerWidth:0},n.onResize=n.onResize.bind(n),n.closeLightbox=n.closeLightbox.bind(n),n.gotoImage=n.gotoImage.bind(n),n.gotoNext=n.gotoNext.bind(n),n.gotoPrevious=n.gotoPrevious.bind(n),n.onClickImage=n.onClickImage.bind(n),n.openLightbox=n.openLightbox.bind(n),n.onSelectImage=n.onSelectImage.bind(n),n}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),o(t,[{key:"componentDidMount",value:function(){this.onResize()}},{key:"componentWillReceiveProps",value:function(e){this.state.currentImage>e.images.length-1&&this.setState({currentImage:e.images.length-1}),this.state.images==e.images&&this.props.maxRows==e.maxRows||this.setState({images:e.images,thumbnails:this.renderThumbs(this._gallery.clientWidth,e.images)})}},{key:"componentDidUpdate",value:function(){this._gallery&&this._gallery.clientWidth!==this.state.containerWidth&&this.onResize()}},{key:"onResize",value:function(){this._gallery&&this.setState({containerWidth:Math.floor(this._gallery.clientWidth),thumbnails:this.renderThumbs(this._gallery.clientWidth)})}},{key:"openLightbox",value:function(e,t){t&&t.preventDefault(),this.props.lightboxWillOpen&&this.props.lightboxWillOpen.call(this,e),this.props.currentImageWillChange&&this.props.currentImageWillChange.call(this,e),this.setState({currentImage:e,lightboxIsOpen:!0})}},{key:"closeLightbox",value:function(){this.props.lightboxWillClose&&this.props.lightboxWillClose.call(this),this.props.currentImageWillChange&&this.props.currentImageWillChange.call(this,0),this.setState({currentImage:0,lightboxIsOpen:!1})}},{key:"gotoPrevious",value:function(){this.props.currentImageWillChange&&this.props.currentImageWillChange.call(this,this.state.currentImage-1),this.setState({currentImage:this.state.currentImage-1})}},{key:"gotoNext",value:function(){this.props.currentImageWillChange&&this.props.currentImageWillChange.call(this,this.state.currentImage+1),this.setState({currentImage:this.state.currentImage+1})}},{key:"onClickImage",value:function(){this.state.currentImage!==this.props.images.length-1&&this.gotoNext()}},{key:"onSelectImage",value:function(e,t){t.preventDefault(),this.props.onSelectImage&&this.props.onSelectImage.call(this,e,this.state.images[e])}},{key:"gotoImage",value:function(e){this.props.currentImageWillChange&&this.props.currentImageWillChange.call(this,e),this.setState({currentImage:e})}},{key:"getOnClickThumbnailFn",value:function(){return!this.props.onClickThumbnail&&this.props.enableLightbox?this.openLightbox:this.props.onClickThumbnail?this.props.onClickThumbnail:null}},{key:"getOnClickLightboxThumbnailFn",value:function(){return!this.props.onClickLightboxThumbnail&&this.props.showLightboxThumbnails?this.gotoImage:this.props.onClickLightboxThumbnail&&this.props.showLightboxThumbnails?this.props.onClickLightboxThumbnail:null}},{key:"getOnClickImageFn",value:function(){return this.props.onClickImage?this.props.onClickImage:this.onClickImage}},{key:"getOnClickPrevFn",value:function(){return this.props.onClickPrev?this.props.onClickPrev:this.gotoPrevious}},{key:"getOnClickNextFn",value:function(){return this.props.onClickNext?this.props.onClickNext:this.gotoNext}},{key:"calculateCutOff",value:function(e,t,n){var r=[],o=0;for(var i in n){var a=n[i].scaletwidth/e;r[i]=Math.floor(a*t),o+=r[i]}for(var l=t-o;l>0;)for(i in r)if(r[i]++,--l<0)break;return r}},{key:"buildImageRow",value:function(e,t){for(var n=[],r=0,o=2*this.props.margin;e.length>0&&r<t;){var i=e.shift();n.push(i),r+=i.scaletwidth+o}var a=r-t;if(n.length>0&&a>0){var l=this.calculateCutOff(r,a,n);for(var s in n){var u=l[s];(i=n[s]).marginLeft=-Math.abs(Math.floor(u/2)),i.vwidth=i.scaletwidth-u}}else for(var c in n)(i=n[c]).marginLeft=0,i.vwidth=i.scaletwidth;return n}},{key:"setThumbScale",value:function(e){e.scaletwidth=Math.floor(this.props.rowHeight*(e.thumbnailWidth/e.thumbnailHeight))}},{key:"renderThumbs",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.state.images;if(!t)return[];if(0==e)return[];var n=t.slice();for(var r in n)this.setThumbScale(n[r]);for(var o=[],i=[];n.length>0;)i.push(this.buildImageRow(n,e));for(var a in i)for(var l in i[a]){var s=i[a][l];this.props.maxRows?a<this.props.maxRows&&o.push(s):o.push(s)}return o}},{key:"render",value:function(){var e=this,t=this.state.thumbnails.map((function(t,n){return l.default.createElement(u.default,{key:"Image-"+n+"-"+t.src,item:t,index:n,margin:e.props.margin,height:e.props.rowHeight,isSelectable:e.props.enableImageSelection,onClick:e.getOnClickThumbnailFn(),onSelectImage:e.onSelectImage,tagStyle:e.props.tagStyle,tileViewportStyle:e.props.tileViewportStyle,thumbnailStyle:e.props.thumbnailStyle,thumbnailImageComponent:e.props.thumbnailImageComponent})}));return l.default.createElement("div",{id:this.props.id,className:"ReactGridGallery",ref:function(t){return e._gallery=t}},l.default.createElement("iframe",{style:{height:0,margin:0,padding:0,overflow:"hidden",borderWidth:0,position:"fixed",backgroundColor:"transparent",width:"100%"},ref:function(t){return t&&t.contentWindow&&t.contentWindow.addEventListener("resize",e.onResize)}}),t,l.default.createElement(s.default,r({images:this.props.images,backdropClosesModal:this.props.backdropClosesModal,currentImage:this.state.currentImage,preloadNextImage:this.props.preloadNextImage,customControls:this.props.customControls,enableKeyboardInput:this.props.enableKeyboardInput,imageCountSeparator:this.props.imageCountSeparator,isOpen:this.state.lightboxIsOpen,onClickImage:this.getOnClickImageFn(),onClickNext:this.getOnClickNextFn(),onClickPrev:this.getOnClickPrevFn(),showCloseButton:this.props.showCloseButton,showImageCount:this.props.showImageCount,onClose:this.closeLightbox,width:this.props.lightboxWidth,theme:this.props.theme,onClickThumbnail:this.getOnClickLightboxThumbnailFn(),showThumbnails:this.props.showLightboxThumbnails},this.props.lightBoxProps)))}}]),t}(a.Component);f.displayName="Gallery",f.propTypes={images:i.default.arrayOf(i.default.shape({src:i.default.string.isRequired,nano:i.default.string,alt:i.default.string,thumbnail:i.default.string.isRequired,srcset:i.default.array,caption:i.default.string,tags:i.default.arrayOf(i.default.shape({value:i.default.string.isRequired,title:i.default.string.isRequired})),thumbnailWidth:i.default.number.isRequired,thumbnailHeight:i.default.number.isRequired,isSelected:i.default.bool,thumbnailCaption:i.default.oneOfType([i.default.string,i.default.element])})).isRequired,id:i.default.string,enableImageSelection:i.default.bool,onSelectImage:i.default.func,rowHeight:i.default.number,maxRows:i.default.number,margin:i.default.number,onClickThumbnail:i.default.func,lightboxWillOpen:i.default.func,lightboxWillClose:i.default.func,enableLightbox:i.default.bool,backdropClosesModal:i.default.bool,currentImage:i.default.number,preloadNextImage:i.default.bool,customControls:i.default.arrayOf(i.default.node),currentImageWillChange:i.default.func,enableKeyboardInput:i.default.bool,imageCountSeparator:i.default.string,isOpen:i.default.bool,onClickImage:i.default.func,onClickNext:i.default.func,onClickPrev:i.default.func,onClose:i.default.func,showCloseButton:i.default.bool,showImageCount:i.default.bool,lightboxWidth:i.default.number,tileViewportStyle:i.default.func,thumbnailStyle:i.default.func,showLightboxThumbnails:i.default.bool,onClickLightboxThumbnail:i.default.func,tagStyle:i.default.object,thumbnailImageComponent:i.default.func,lightBoxProps:i.default.object},f.defaultProps={id:"ReactGridGallery",enableImageSelection:!0,rowHeight:180,margin:2,enableLightbox:!0,backdropClosesModal:!1,currentImage:0,preloadNextImage:!0,enableKeyboardInput:!0,imageCountSeparator:" of ",isOpen:!1,showCloseButton:!0,showImageCount:!0,lightboxWidth:1024,showLightboxThumbnails:!1,lightBoxProps:{}},e.exports=f},D3gc:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return Object.keys(e).sort((function(e,t){return(0,i.default)(e)&&!(0,i.default)(t)?-1:!(0,i.default)(e)&&(0,i.default)(t)?1:0})).reduce((function(t,n){return t[n]=e[n],t}),{})};var r,o=n("eIMV"),i=(r=o)&&r.__esModule?r:{default:r};e.exports=t.default},DIV9:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var a,l=e[Symbol.iterator]();!(r=(a=l.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(s){o=!0,i=s}finally{try{!r&&l.return&&l.return()}finally{if(o)throw i}}return n}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")},o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=function(e){return Object.keys(e).map((function(t){return[t,e[t]]}))};t.objectToPairs=i;t.mapObj=function(e,t){return n=i(e).map(t),o={},n.forEach((function(e){var t=r(e,2),n=t[0],i=t[1];o[n]=i})),o;var n,o};t.flatten=function(e){return e.reduce((function(e,t){return e.concat(t)}),[])};var a=/([A-Z])/g,l=/^ms-/;t.kebabifyStyleName=function(e){return function(e){return e.replace(a,"-$1").toLowerCase()}(e).replace(l,"-ms-")};t.recursiveMerge=function e(t,n){if("object"!=typeof t)return n;var r=o({},t);return Object.keys(n).forEach((function(o){r.hasOwnProperty(o)?r[o]=e(t[o],n[o]):r[o]=n[o]})),r};var s={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridRow:!0,gridColumn:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0};var u=["Webkit","ms","Moz","O"];Object.keys(s).forEach((function(e){u.forEach((function(t){s[function(e,t){return e+t.charAt(0).toUpperCase()+t.substring(1)}(t,e)]=s[e]}))}));t.stringifyValue=function(e,t){return"number"==typeof t?s[e]?""+t:t+"px":t};t.hashObject=function(e){return function(e){for(var t=e.length,n=t,r=0,o=void 0;t>=4;)o=1540483477*(65535&(o=255&e.charCodeAt(r)|(255&e.charCodeAt(++r))<<8|(255&e.charCodeAt(++r))<<16|(255&e.charCodeAt(++r))<<24))+((1540483477*(o>>>16)&65535)<<16),n=1540483477*(65535&n)+((1540483477*(n>>>16)&65535)<<16)^(o=1540483477*(65535&(o^=o>>>24))+((1540483477*(o>>>16)&65535)<<16)),t-=4,++r;switch(t){case 3:n^=(255&e.charCodeAt(r+2))<<16;case 2:n^=(255&e.charCodeAt(r+1))<<8;case 1:n=1540483477*(65535&(n^=255&e.charCodeAt(r)))+((1540483477*(n>>>16)&65535)<<16)}return n=1540483477*(65535&(n^=n>>>13))+((1540483477*(n>>>16)&65535)<<16),((n^=n>>>15)>>>0).toString(36)}(JSON.stringify(e))};var c=/^([^:]+:.*?)( !important)?;$/;t.importantify=function(e){return e.replace(c,(function(e,t,n){return t+" !important;"}))}},DYNA:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if("string"==typeof t&&!(0,o.default)(t)&&t.indexOf("calc(")>-1)return(0,r.default)(e,t,(function(e,t){return t.replace(/calc\(/g,e+"calc(")}))};var r=i(n("m4M4")),o=i(n("ZlNK"));function i(e){return e&&e.__esModule?e:{default:e}}e.exports=t.default},FeGr:function(e,t,n){"use strict";(function(t){function n(e){o.length||(r(),!0),o[o.length]=e}e.exports=n;var r,o=[],i=0;function a(){for(;i<o.length;){var e=i;if(i+=1,o[e].call(),i>1024){for(var t=0,n=o.length-i;t<n;t++)o[t]=o[t+i];o.length-=i,i=0}}o.length=0,i=0,!1}var l,s,u,c=void 0!==t?t:self,f=c.MutationObserver||c.WebKitMutationObserver;function p(e){return function(){var t=setTimeout(r,0),n=setInterval(r,50);function r(){clearTimeout(t),clearInterval(n),e()}}}"function"==typeof f?(l=1,s=new f(a),u=document.createTextNode(""),s.observe(u,{characterData:!0}),r=function(){l=-l,u.data=l}):r=p(a),n.requestFlush=r,n.makeRequestCallFromTimer=p}).call(this,n("yLpj"))},"G/iT":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}();t.default=function(e){return function(t){function n(){var e,t,r;u(this,n);for(var o=arguments.length,i=Array(o),a=0;a<o;a++)i[a]=arguments[a];return t=r=c(this,(e=n.__proto__||Object.getPrototypeOf(n)).call.apply(e,[this].concat(i))),r.listenerOptions={capture:!1,passive:!1},c(r,t)}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(n,t),r(n,[{key:"componentDidMount",value:function(){if(l.canUseDOM){var e=this.props.touchScrollTarget,t=document.body;t&&(0,s.isTouchDevice)()&&(t.addEventListener("touchmove",s.preventTouchMove,this.listenerOptions),e&&(e.addEventListener("touchstart",s.preventInertiaScroll,this.listenerOptions),e.addEventListener("touchmove",s.allowTouchMove,this.listenerOptions)))}}},{key:"componentWillUnmount",value:function(){if(l.canUseDOM){var e=this.props.touchScrollTarget,t=document.body;t&&(0,s.isTouchDevice)()&&(t.removeEventListener("touchmove",s.preventTouchMove,this.listenerOptions),e&&(e.removeEventListener("touchstart",s.preventInertiaScroll,this.listenerOptions),e.removeEventListener("touchmove",s.allowTouchMove,this.listenerOptions)))}}},{key:"render",value:function(){return a.default.createElement(e,this.props)}}]),n}(i.PureComponent)};var o,i=n("q1tI"),a=(o=i)&&o.__esModule?o:{default:o},l=n("2rMq"),s=n("hq1F");function u(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function c(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}},GuKG:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=!("undefined"==typeof window||!window.document||!window.document.createElement)},"GuY/":function(e,t,n){"use strict";n.r(t);var r=n("FqMR"),o=(n("q1tI"),n("qKvR")),i=n("Wbzz"),a=n("CGmC"),l=n.n(a),s=n("9Dj+");function u(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function c(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?u(Object(n),!0).forEach((function(t){Object(r.a)(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):u(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}var f={name:"1k47tuo",styles:"margin-bottom:25px;padding-top:100px;padding-left:50px;padding-right:50px;text-align:center;.ReactGridGallery_tile-viewport{overflow:visible !important;}.ReactGridGallery img{box-shadow:0px 0px 3px 1px #AAA;}"},p={"worldbank_dashboard.png":{caption:"World's Bank Dashboard"},"sqllab.png":{caption:"SQL Lab"},"explore.png":{caption:"Explore!"},"visualizations.png":{caption:"Visualizations"},"chord_diagram.png":{caption:"Explore"},"deck_scatter.png":{caption:"Geospatial Scatterplot"},"deck_polygon.png":{caption:"Geospatial Polygon"},"deck_arc.png":{caption:"Geospatial Arc"},"deck_path.png":{caption:"Geospatial Path"}},d=function(){var e=Object(i.useStaticQuery)("3508387268"),t={};e.allImages.edges.map((function(e){return e.node})).forEach((function(e){t[e.thumb.fixed.originalName]={src:e.full.fixed.src,thumbnail:e.thumb.fixed.src}}));var n=[];return Object.keys(p).forEach((function(e){var r=t[e];delete t[e],n.push(c(c({},r),p[e]))})),Object.values(t).forEach((function(e){n.push(e)})),Object(o.jsx)(s.a,null,Object(o.jsx)("div",{css:f},Object(o.jsx)(l.a,{images:n,margin:10,rowHeight:200,enableImageSelection:!1})))};t.default=d,void 0!==d&&d&&d===Object(d)&&Object.isExtensible(d)&&!d.hasOwnProperty("__filemeta")&&Object.defineProperty(d,"__filemeta",{configurable:!0,value:{name:"GalleryPage",filename:"src/pages/gallery.tsx"}})},HFUj:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},o=u(n("17x9")),i=u(n("q1tI")),a=u(n("aO/s")),l=u(n("51uJ")),s=u(n("bcWM"));function u(e){return e&&e.__esModule?e:{default:e}}var c={arrowLeft:a.default,arrowRight:l.default,close:s.default},f=function(e){var t=e.fill,n=e.type,o=function(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}(e,["fill","type"]),a=c[n];return i.default.createElement("span",r({dangerouslySetInnerHTML:{__html:a(t)}},o))};f.propTypes={fill:o.default.string,type:o.default.oneOf(Object.keys(c))},f.defaultProps={fill:"white"},t.default=f},HiWe:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return e.charAt(0).toUpperCase()+e.slice(1)},e.exports=t.default},HqMp:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=c(n("17x9")),i=n("q1tI"),a=c(i),l=n("1w3K"),s=n("i8i4"),u=c(n("zPGp"));function c(e){return e&&e.__esModule?e:{default:e}}var f=function(e){function t(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t);var e=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return e.portalElement=null,e}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),r(t,[{key:"componentDidMount",value:function(){var e=document.createElement("div");document.body.appendChild(e),this.portalElement=e,this.componentDidUpdate()}},{key:"componentDidUpdate",value:function(){(0,s.render)(a.default.createElement(u.default,{context:this.context},a.default.createElement("div",null,a.default.createElement("style",null,"\n\t\t\t\t.fade-enter { opacity: 0.01; }\n\t\t\t\t.fade-enter.fade-enter-active { opacity: 1; transition: opacity 200ms; }\n\t\t\t\t.fade-leave { opacity: 1; }\n\t\t\t\t.fade-leave.fade-leave-active { opacity: 0.01; transition: opacity 200ms; }\n\t\t"),a.default.createElement(l.TransitionGroup,this.props,a.default.createElement(l.CSSTransition,{timeout:{enter:200,exit:200},classNames:"fade"},this.props.children)))),this.portalElement)}},{key:"componentWillUnmount",value:function(){(0,s.unmountComponentAtNode)(this.portalElement),document.body.removeChild(this.portalElement)}},{key:"render",value:function(){return null}}]),t}(i.Component);t.default=f,f.contextTypes={theme:o.default.object.isRequired}},I13A:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=a(n("17x9")),o=a(n("q1tI")),i=n("Rz3U");function a(e){return e&&e.__esModule?e:{default:e}}var l=function(e){var t=i.StyleSheet.create(u(e));return o.default.createElement("div",{className:(0,i.css)(t.spinner)},o.default.createElement("div",{className:(0,i.css)(t.ripple)}))};l.propTypes={color:r.default.string,size:r.default.number};var s={"0%":{top:"50%",left:"50%",width:0,height:0,opacity:1},"100%":{top:0,left:0,width:"100%",height:"100%",opacity:0}},u=function(e){var t=e.color,n=e.size;return{spinner:{display:"inline-block",position:"relative",width:n,height:n},ripple:{position:"absolute",border:"4px solid "+t,opacity:1,borderRadius:"50%",animationName:s,animationDuration:"1s",animationTimingFunction:"cubic-bezier(0, 0.2, 0.8, 1)",animationIterationCount:"infinite"}}};t.default=l},"IEa/":function(e,t,n){"use strict";var r=n("FeGr"),o=[],i=[],a=r.makeRequestCallFromTimer((function(){if(i.length)throw i.shift()}));function l(e){var t;(t=o.length?o.pop():new s).task=e,r(t)}function s(){this.task=null}e.exports=l,s.prototype.call=function(){try{this.task.call()}catch(e){l.onerror?l.onerror(e):(i.push(e),a())}finally{this.task=null,o[o.length]=this}}},Jd5T:function(e,t,n){"use strict";var r=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=l(n("17x9")),i=n("q1tI"),a=l(i);function l(e){return e&&e.__esModule?e:{default:e}}var s=function(e){function t(e){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t);var n=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.state={hover:n.props.hover},n.fill=n.fill.bind(n),n.visibility=n.visibility.bind(n),n}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),r(t,[{key:"fill",value:function(){return this.props.isSelected?this.props.selectedColor:this.state.hover?this.props.hoverColor:this.props.color}},{key:"visibility",value:function(){return this.props.isSelected||this.props.isSelectable&&this.props.parentHover?"visible":"hidden"}},{key:"render",value:function(){var e=this,t={display:this.props.isSelected?"block":"none"};return a.default.createElement("div",{title:"Select",style:{visibility:this.visibility(),background:"none",float:"left",width:"36px",height:"36px",border:"none",padding:"6px",cursor:"pointer",pointerEvents:"visible"},onClick:this.props.onClick?function(t){return e.props.onClick(e.props.index,t)}:null,onMouseOver:function(t){return e.setState({hover:!0})},onMouseOut:function(t){return e.setState({hover:!1})}},a.default.createElement("svg",{fill:this.fill(),height:"24",viewBox:"0 0 24 24",width:"24",xmlns:"http://www.w3.org/2000/svg"},a.default.createElement("radialGradient",{id:"shadow",cx:"38",cy:"95.488",r:"10.488",gradientTransform:"matrix(1 0 0 -1 -26 109)",gradientUnits:"userSpaceOnUse"},a.default.createElement("stop",{offset:".832",stopColor:"#010101"}),a.default.createElement("stop",{offset:"1",stopColor:"#010101",stopOpacity:"0"})),a.default.createElement("circle",{style:t,opacity:".26",fill:"url(#shadow)",cx:"12",cy:"13.512",r:"10.488"}),a.default.createElement("circle",{style:t,fill:"#FFF",cx:"12",cy:"12.2",r:"8.292"}),a.default.createElement("path",{d:"M0 0h24v24H0z",fill:"none"}),a.default.createElement("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"})))}}]),t}(i.Component);s.propTypes={index:o.default.number,color:o.default.string,isSelectable:o.default.bool,isSelected:o.default.bool,selectedColor:o.default.string,parentHover:o.default.bool,hover:o.default.bool,hoverColor:o.default.string,onClick:o.default.func},s.defaultProps={isSelectable:!0,isSelected:!1,parentHover:!1,hover:!1},e.exports=s},Jose:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var a,l=e[Symbol.iterator]();!(r=(a=l.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(s){o=!0,i=s}finally{try{!r&&l.return&&l.return()}finally{if(o)throw i}}return n}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")};var o,i=n("+vvU"),a=(o=i)&&o.__esModule?o:{default:o},l=n("DIV9");t.generateCSS=function e(t,n,r,o){var i=n.reduce(l.recursiveMerge),a={},u={},c={};return Object.keys(i).forEach((function(e){":"===e[0]?c[e]=i[e]:"@"===e[0]?u[e]=i[e]:a[e]=i[e]})),s(t,a,r,o)+Object.keys(c).map((function(e){return s(t+e,c[e],r,o)})).join("")+Object.keys(u).map((function(n){return n+"{"+e(t,[u[n]],r,o)+"}"})).join("")};var s=function(e,t,n,o){var i=function(e,t){var n={};return Object.keys(e).forEach((function(r){t&&t.hasOwnProperty(r)?n[r]=t[r](e[r]):n[r]=e[r]})),n}(t,n),s=(0,a.default)(i),u=(0,l.flatten)((0,l.objectToPairs)(s).map((function(e){var t,n,o=r(e,2),i=o[0],a=o[1];if(Array.isArray(a)){var l=(t=[],n=[],a.forEach((function(e){0===e.indexOf("-")?t.push(e):n.push(e)})),t.sort(),n.sort(),{v:t.concat(n).map((function(e){return[i,e]}))});if("object"==typeof l)return l.v}return[[i,a]]}))).map((function(e){var t=r(e,2),n=t[0],i=t[1],a=(0,l.stringifyValue)(n,i),s=(0,l.kebabifyStyleName)(n)+":"+a+";";return!1===o?s:(0,l.importantify)(s)})).join("");return u?e+"{"+u+"}":""};t.generateCSSRuleset=s},MAmL:function(e,t,n){"use strict";n.r(t);var r=/[A-Z]/g,o=/^ms-/,i={};function a(e){return"-"+e.toLowerCase()}t.default=function(e){if(i.hasOwnProperty(e))return i[e];var t=e.replace(r,a);return i[e]=o.test(t)?"-"+t:t}},NBt2:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r,o=n("IEa/"),i=(r=o)&&r.__esModule?r:{default:r},a=n("Jose"),l=n("DIV9"),s=null,u={fontFamily:function e(t){return Array.isArray(t)?t.map(e).join(","):"object"==typeof t?(h(t.fontFamily,"@font-face",[t],!1),'"'+t.fontFamily+'"'):t},animationName:function(e){if("object"!=typeof e)return e;var t="keyframe_"+(0,l.hashObject)(e),n="@keyframes "+t+"{";return Object.keys(e).forEach((function(t){n+=(0,a.generateCSS)(t,[e[t]],u,!1)})),d(t,n+="}"),t}},c={},f="",p=!1,d=function(e,t){if(!c[e]){if(!p){if("undefined"==typeof document)throw new Error("Cannot automatically buffer without a document");p=!0,(0,i.default)(g)}f+=t,c[e]=!0}},h=function(e,t,n,r){if(!c[e]){var o=(0,a.generateCSS)(t,n,u,r);d(e,o)}};t.injectStyleOnce=h;t.reset=function(){f="",c={},p=!1,s=null};t.startBuffering=function(){if(p)throw new Error("Cannot buffer while already buffering");p=!0};var m=function(){p=!1;var e=f;return f="",e};t.flushToString=m;var g=function(){var e=m();e.length>0&&function(e){if(null==s&&null==(s=document.querySelector("style[data-aphrodite]"))){var t=document.head||document.getElementsByTagName("head")[0];(s=document.createElement("style")).type="text/css",s.setAttribute("data-aphrodite",""),t.appendChild(s)}s.styleSheet?s.styleSheet.cssText+=e:s.appendChild(document.createTextNode(e))}(e)};t.flushToStyleTag=g;t.getRenderedClassNames=function(){return Object.keys(c)};t.addRenderedClassNames=function(e){e.forEach((function(e){c[e]=!0}))};t.injectAndGetClassName=function(e,t){var n=t.filter((function(e){return e}));if(0===n.length)return"";var r=n.map((function(e){return e._name})).join("-o_O-");return h(r,"."+r,n.map((function(e){return e._definition})),e),r}},O4bN:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if("position"===e&&"sticky"===t)return{position:["-webkit-sticky","sticky"]}},e.exports=t.default},PAGr:function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;a(n("17x9"));var r=a(n("q1tI")),o=n("i8i4"),i=a(n("UnXY"));function a(e){return e&&e.__esModule?e:{default:e}}var l=function(e){var t,n;function a(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(t=e.call.apply(e,[this].concat(r))||this).handleEnter=function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];return t.handleLifecycle("onEnter",0,n)},t.handleEntering=function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];return t.handleLifecycle("onEntering",0,n)},t.handleEntered=function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];return t.handleLifecycle("onEntered",0,n)},t.handleExit=function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];return t.handleLifecycle("onExit",1,n)},t.handleExiting=function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];return t.handleLifecycle("onExiting",1,n)},t.handleExited=function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];return t.handleLifecycle("onExited",1,n)},t}n=e,(t=a).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var l=a.prototype;return l.handleLifecycle=function(e,t,n){var i,a=this.props.children,l=r.default.Children.toArray(a)[t];l.props[e]&&(i=l.props)[e].apply(i,n),this.props[e]&&this.props[e]((0,o.findDOMNode)(this))},l.render=function(){var e=this.props,t=e.children,n=e.in,o=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,["children","in"]),a=r.default.Children.toArray(t),l=a[0],s=a[1];return delete o.onEnter,delete o.onEntering,delete o.onEntered,delete o.onExit,delete o.onExiting,delete o.onExited,r.default.createElement(i.default,o,n?r.default.cloneElement(l,{key:"first",onEnter:this.handleEnter,onEntering:this.handleEntering,onEntered:this.handleEntered}):r.default.cloneElement(s,{key:"second",onEnter:this.handleExit,onEntering:this.handleExiting,onEntered:this.handleExited}))},a}(r.default.Component);l.propTypes={};var s=l;t.default=s,e.exports=t.default},Rz3U:function(e,t,n){e.exports=n("X23O")},S3Uj:function(e,t,n){"use strict";t.__esModule=!0,t.default=t.EXITING=t.ENTERED=t.ENTERING=t.EXITED=t.UNMOUNTED=void 0;var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}return t.default=e,t}(n("17x9")),o=l(n("q1tI")),i=l(n("i8i4")),a=n("94VI");n("xfxO");function l(e){return e&&e.__esModule?e:{default:e}}t.UNMOUNTED="unmounted";t.EXITED="exited";t.ENTERING="entering";t.ENTERED="entered";t.EXITING="exiting";var s=function(e){var t,n;function r(t,n){var r;r=e.call(this,t,n)||this;var o,i=n.transitionGroup,a=i&&!i.isMounting?t.enter:t.appear;return r.appearStatus=null,t.in?a?(o="exited",r.appearStatus="entering"):o="entered":o=t.unmountOnExit||t.mountOnEnter?"unmounted":"exited",r.state={status:o},r.nextCallback=null,r}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var a=r.prototype;return a.getChildContext=function(){return{transitionGroup:null}},r.getDerivedStateFromProps=function(e,t){return e.in&&"unmounted"===t.status?{status:"exited"}:null},a.componentDidMount=function(){this.updateStatus(!0,this.appearStatus)},a.componentDidUpdate=function(e){var t=null;if(e!==this.props){var n=this.state.status;this.props.in?"entering"!==n&&"entered"!==n&&(t="entering"):"entering"!==n&&"entered"!==n||(t="exiting")}this.updateStatus(!1,t)},a.componentWillUnmount=function(){this.cancelNextCallback()},a.getTimeouts=function(){var e,t,n,r=this.props.timeout;return e=t=n=r,null!=r&&"number"!=typeof r&&(e=r.exit,t=r.enter,n=void 0!==r.appear?r.appear:t),{exit:e,enter:t,appear:n}},a.updateStatus=function(e,t){if(void 0===e&&(e=!1),null!==t){this.cancelNextCallback();var n=i.default.findDOMNode(this);"entering"===t?this.performEnter(n,e):this.performExit(n)}else this.props.unmountOnExit&&"exited"===this.state.status&&this.setState({status:"unmounted"})},a.performEnter=function(e,t){var n=this,r=this.props.enter,o=this.context.transitionGroup?this.context.transitionGroup.isMounting:t,i=this.getTimeouts(),a=o?i.appear:i.enter;t||r?(this.props.onEnter(e,o),this.safeSetState({status:"entering"},(function(){n.props.onEntering(e,o),n.onTransitionEnd(e,a,(function(){n.safeSetState({status:"entered"},(function(){n.props.onEntered(e,o)}))}))}))):this.safeSetState({status:"entered"},(function(){n.props.onEntered(e)}))},a.performExit=function(e){var t=this,n=this.props.exit,r=this.getTimeouts();n?(this.props.onExit(e),this.safeSetState({status:"exiting"},(function(){t.props.onExiting(e),t.onTransitionEnd(e,r.exit,(function(){t.safeSetState({status:"exited"},(function(){t.props.onExited(e)}))}))}))):this.safeSetState({status:"exited"},(function(){t.props.onExited(e)}))},a.cancelNextCallback=function(){null!==this.nextCallback&&(this.nextCallback.cancel(),this.nextCallback=null)},a.safeSetState=function(e,t){t=this.setNextCallback(t),this.setState(e,t)},a.setNextCallback=function(e){var t=this,n=!0;return this.nextCallback=function(r){n&&(n=!1,t.nextCallback=null,e(r))},this.nextCallback.cancel=function(){n=!1},this.nextCallback},a.onTransitionEnd=function(e,t,n){this.setNextCallback(n);var r=null==t&&!this.props.addEndListener;e&&!r?(this.props.addEndListener&&this.props.addEndListener(e,this.nextCallback),null!=t&&setTimeout(this.nextCallback,t)):setTimeout(this.nextCallback,0)},a.render=function(){var e=this.state.status;if("unmounted"===e)return null;var t=this.props,n=t.children,r=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(t,["children"]);if(delete r.in,delete r.mountOnEnter,delete r.unmountOnExit,delete r.appear,delete r.enter,delete r.exit,delete r.timeout,delete r.addEndListener,delete r.onEnter,delete r.onEntering,delete r.onEntered,delete r.onExit,delete r.onExiting,delete r.onExited,"function"==typeof n)return n(e,r);var i=o.default.Children.only(n);return o.default.cloneElement(i,r)},r}(o.default.Component);function u(){}s.contextTypes={transitionGroup:r.object},s.childContextTypes={transitionGroup:function(){}},s.propTypes={},s.defaultProps={in:!1,mountOnEnter:!1,unmountOnExit:!1,appear:!1,enter:!0,exit:!0,onEnter:u,onEntering:u,onEntered:u,onExit:u,onExiting:u,onExited:u},s.UNMOUNTED=0,s.EXITED=1,s.ENTERING=2,s.ENTERED=3,s.EXITING=4;var c=(0,a.polyfill)(s);t.default=c},Si88:function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;!function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}t.default=e}(n("17x9"));var r=l(n("ycFn")),o=l(n("VOcB")),i=l(n("q1tI")),a=l(n("S3Uj"));n("xfxO");function l(e){return e&&e.__esModule?e:{default:e}}function s(){return(s=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}var u=function(e,t){return e&&t&&t.split(" ").forEach((function(t){return(0,r.default)(e,t)}))},c=function(e,t){return e&&t&&t.split(" ").forEach((function(t){return(0,o.default)(e,t)}))},f=function(e){var t,n;function r(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(t=e.call.apply(e,[this].concat(r))||this).onEnter=function(e,n){var r=t.getClassNames(n?"appear":"enter").className;t.removeClasses(e,"exit"),u(e,r),t.props.onEnter&&t.props.onEnter(e,n)},t.onEntering=function(e,n){var r=t.getClassNames(n?"appear":"enter").activeClassName;t.reflowAndAddClass(e,r),t.props.onEntering&&t.props.onEntering(e,n)},t.onEntered=function(e,n){var r=t.getClassNames("appear").doneClassName,o=t.getClassNames("enter").doneClassName,i=n?r+" "+o:o;t.removeClasses(e,n?"appear":"enter"),u(e,i),t.props.onEntered&&t.props.onEntered(e,n)},t.onExit=function(e){var n=t.getClassNames("exit").className;t.removeClasses(e,"appear"),t.removeClasses(e,"enter"),u(e,n),t.props.onExit&&t.props.onExit(e)},t.onExiting=function(e){var n=t.getClassNames("exit").activeClassName;t.reflowAndAddClass(e,n),t.props.onExiting&&t.props.onExiting(e)},t.onExited=function(e){var n=t.getClassNames("exit").doneClassName;t.removeClasses(e,"exit"),u(e,n),t.props.onExited&&t.props.onExited(e)},t.getClassNames=function(e){var n=t.props.classNames,r="string"==typeof n,o=r?(r&&n?n+"-":"")+e:n[e];return{className:o,activeClassName:r?o+"-active":n[e+"Active"],doneClassName:r?o+"-done":n[e+"Done"]}},t}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var o=r.prototype;return o.removeClasses=function(e,t){var n=this.getClassNames(t),r=n.className,o=n.activeClassName,i=n.doneClassName;r&&c(e,r),o&&c(e,o),i&&c(e,i)},o.reflowAndAddClass=function(e,t){t&&(e&&e.scrollTop,u(e,t))},o.render=function(){var e=s({},this.props);return delete e.classNames,i.default.createElement(a.default,s({},e,{onEnter:this.onEnter,onEntered:this.onEntered,onEntering:this.onEntering,onExit:this.onExit,onExiting:this.onExiting,onExited:this.onExited}))},r}(i.default.Component);f.defaultProps={classNames:""},f.propTypes={};var p=f;t.default=p,e.exports=t.default},TuFc:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=u(n("17x9")),a=n("q1tI"),l=u(a),s=u(n("Jd5T"));function u(e){return e&&e.__esModule?e:{default:e}}var c=function(e){function t(e){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t);var n=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.state={hover:!1},n}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),o(t,[{key:"tagStyle",value:function(){return this.props.tagStyle?this.props.tagStyle:{display:"inline",padding:".2em .6em .3em",fontSize:"75%",fontWeight:"600",lineHeight:"1",color:"yellow",background:"rgba(0,0,0,0.65)",textAlign:"center",whiteSpace:"nowrap",verticalAlign:"baseline",borderRadius:".25em"}}},{key:"tileViewportStyle",value:function(){if(this.props.tileViewportStyle)return this.props.tileViewportStyle.call(this);var e={};return this.props.item.nano&&(e={background:"url("+this.props.item.nano+")",backgroundSize:"cover",backgroundPosition:"center center"}),this.props.item.isSelected?Object.assign({width:this.props.item.vwidth-32,height:this.props.height-32,margin:16,overflow:"hidden"},e):Object.assign({width:this.props.item.vwidth,height:this.props.height,overflow:"hidden"},e)}},{key:"thumbnailStyle",value:function(){if(this.props.thumbnailStyle)return this.props.thumbnailStyle.call(this);var e=void 0;switch(this.props.item.orientation){case 3:e="rotate(180deg)";break;case 6:e="rotate(90deg)";break;case 8:e="rotate(270deg)";break;case 2:e="rotateY(180deg)";break;case 4:e="rotate(180deg) rotateY(180deg)";break;case 5:e="rotate(270deg) rotateY(180deg)";break;case 7:e="rotate(90deg) rotateY(180deg)"}if(this.props.item.isSelected){var t=this.props.item.scaletwidth/this.props.height,n=0,r=0,o=this.props.height-32,i=this.props.item.vwidth-32;this.props.item.scaletwidth>this.props.height?(r=this.props.item.scaletwidth-32,n=Math.floor(r/t)):(n=this.props.height-32,r=Math.floor(n*t));var a=-Math.abs(Math.floor((o-n)/2));return{cursor:"pointer",width:r,height:n,marginLeft:-Math.abs(Math.floor((i-r)/2)),marginTop:a,transform:e}}return{cursor:"pointer",width:this.props.item.scaletwidth,height:this.props.height,marginLeft:this.props.item.marginLeft,marginTop:0,transform:e}}},{key:"renderCheckButton",value:function(){return l.default.createElement(s.default,{key:"Select",index:this.props.index,color:"rgba(255, 255, 255, 0.7)",selectedColor:"#4285f4",hoverColor:"rgba(255, 255, 255, 1)",isSelected:this.props.item.isSelected,isSelectable:this.props.isSelectable,onClick:this.props.isSelectable?this.props.onSelectImage:null,parentHover:this.state.hover})}},{key:"render",value:function(){var e=this,t=this.props.item.alt?this.props.item.alt:"",n=void 0===this.props.item.tags?l.default.createElement("noscript",null):this.props.item.tags.map((function(t){return l.default.createElement("div",{title:t.title,key:"tag-"+t.value,style:{display:"inline-block",cursor:"pointer",pointerEvents:"visible",margin:"2px"}},l.default.createElement("span",{style:e.tagStyle()},t.value))})),o=void 0===this.props.item.customOverlay?l.default.createElement("noscript",null):l.default.createElement("div",{className:"ReactGridGallery_custom-overlay",key:"custom-overlay-"+this.props.index,style:{pointerEvents:"none",opacity:this.state.hover?1:0,position:"absolute",height:"100%",width:"100%"}},this.props.item.customOverlay),i={key:"img-"+this.props.index,src:this.props.item.thumbnail,alt:t,title:this.props.item.caption,style:this.thumbnailStyle()},a=this.props.thumbnailImageComponent;return l.default.createElement("div",{className:"ReactGridGallery_tile",key:"tile-"+this.props.index,onMouseEnter:function(t){return e.setState({hover:!0})},onMouseLeave:function(t){return e.setState({hover:!1})},style:{margin:this.props.margin,WebkitUserSelect:"none",position:"relative",float:"left",background:"#eee",padding:"0px"}},l.default.createElement("div",{className:"ReactGridGallery_tile-icon-bar",key:"tile-icon-bar-"+this.props.index,style:{pointerEvents:"none",opacity:1,position:"absolute",height:"36px",width:"100%"}},this.renderCheckButton()),l.default.createElement("div",{className:"ReactGridGallery_tile-bottom-bar",key:"tile-bottom-bar-"+this.props.index,style:{padding:"2px",pointerEvents:"none",position:"absolute",minHeight:"0px",maxHeight:"160px",width:"100%",bottom:"0px",overflow:"hidden"}},n),o,l.default.createElement("div",{className:"ReactGridGallery_tile-overlay",key:"tile-overlay-"+this.props.index,style:{pointerEvents:"none",opacity:1,position:"absolute",height:"100%",width:"100%",background:this.state.hover&&!this.props.item.isSelected&&this.props.isSelectable?"linear-gradient(to bottom,rgba(0,0,0,0.26),transparent 56px,transparent)":"none"}}),l.default.createElement("div",{className:"ReactGridGallery_tile-viewport",style:this.tileViewportStyle(),key:"tile-viewport-"+this.props.index,onClick:this.props.onClick?function(t){return e.props.onClick.call(e,e.props.index,t)}:null},a?l.default.createElement(a,r({},this.props,{imageProps:i})):l.default.createElement("img",i)),this.props.item.thumbnailCaption&&l.default.createElement("div",{className:"ReactGridGallery_tile-description",style:{background:"white",height:"100%",width:"100%",margin:0,userSelect:"text",WebkitUserSelect:"text",MozUserSelect:"text",overflow:"hidden"}},this.props.item.thumbnailCaption))}}]),t}(a.Component);c.propTypes={item:i.default.object,index:i.default.number,margin:i.default.number,height:i.default.number,isSelectable:i.default.bool,onClick:i.default.func,onSelectImage:i.default.func,tileViewportStyle:i.default.func,thumbnailStyle:i.default.func,tagStyle:i.default.object,customOverlay:i.default.element,thumbnailImageComponent:i.default.func},c.defaultProps={isSelectable:!0,hover:!1},t.default=c},UnXY:function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var r=l(n("17x9")),o=l(n("q1tI")),i=n("94VI"),a=n("8PcY");function l(e){return e&&e.__esModule?e:{default:e}}function s(){return(s=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function u(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}var c=Object.values||function(e){return Object.keys(e).map((function(t){return e[t]}))},f=function(e){var t,n;function r(t,n){var r,o=(r=e.call(this,t,n)||this).handleExited.bind(u(u(r)));return r.state={handleExited:o,firstRender:!0},r}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var i=r.prototype;return i.getChildContext=function(){return{transitionGroup:{isMounting:!this.appeared}}},i.componentDidMount=function(){this.appeared=!0,this.mounted=!0},i.componentWillUnmount=function(){this.mounted=!1},r.getDerivedStateFromProps=function(e,t){var n=t.children,r=t.handleExited;return{children:t.firstRender?(0,a.getInitialChildMapping)(e,r):(0,a.getNextChildMapping)(e,n,r),firstRender:!1}},i.handleExited=function(e,t){var n=(0,a.getChildMapping)(this.props.children);e.key in n||(e.props.onExited&&e.props.onExited(t),this.mounted&&this.setState((function(t){var n=s({},t.children);return delete n[e.key],{children:n}})))},i.render=function(){var e=this.props,t=e.component,n=e.childFactory,r=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,["component","childFactory"]),i=c(this.state.children).map(n);return delete r.appear,delete r.enter,delete r.exit,null===t?i:o.default.createElement(t,r,i)},r}(o.default.Component);f.childContextTypes={transitionGroup:r.default.object.isRequired},f.propTypes={},f.defaultProps={component:"div",childFactory:function(e){return e}};var p=(0,i.polyfill)(f);t.default=p,e.exports=t.default},V6UX:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n("dtEx");Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i(r).default}});var o=n("WXsj");function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"SimpleToggle",{enumerable:!0,get:function(){return i(o).default}})},VOcB:function(e,t,n){"use strict";function r(e,t){return e.replace(new RegExp("(^|\\s)"+t+"(?:\\s|$)","g"),"$1").replace(/\s+/g," ").replace(/^\s*|\s*$/g,"")}e.exports=function(e,t){e.classList?e.classList.remove(t):"string"==typeof e.className?e.className=r(e.className,t):e.setAttribute("class",r(e.className&&e.className.baseVal||"",t))}},W9PW:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if(a[e]&&l[t])return(0,i.default)(e,t)};var r,o=n("m4M4"),i=(r=o)&&r.__esModule?r:{default:r};var a={maxHeight:!0,maxWidth:!0,width:!0,height:!0,columnWidth:!0,minWidth:!0,minHeight:!0},l={"min-content":!0,"max-content":!0,"fill-available":!0,"fit-content":!0,"contain-floats":!0};e.exports=t.default},WXsj:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.defaultProps=void 0;var r,o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=n("q1tI");(r=i)&&r.__esModule;function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}var s=t.defaultProps={attributes:{},styles:{}},u=function(e){function t(){var e,n,r;a(this,t);for(var o=arguments.length,i=Array(o),s=0;s<o;s++)i[s]=arguments[s];return n=r=l(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(i))),r.originalAttributes={},r.originalStyles={},l(r,n)}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),o(t,[{key:"componentDidMount",value:function(){var e=this,t=this.props,n=t.attributes,r=t.styles,o=t.target,i=void 0===o?document.body:o;i&&(this.attributeKeys=Object.keys(n),this.styleKeys=Object.keys(r),this.styleKeys.length&&this.styleKeys.forEach((function(t){e.originalStyles[t]=i.style.getPropertyValue(t),i.style.setProperty(t,r[t])})),this.attributeKeys.length&&this.attributeKeys.forEach((function(t){e.originalAttributes[t]=i.getAttribute(t)||"",i.setAttribute(t,n[t])})))}},{key:"componentWillUnmount",value:function(){var e=this,t=this.props.target,n=void 0===t?document.body:t;n&&(this.styleKeys.length&&this.styleKeys.forEach((function(t){n.style.setProperty(t,e.originalStyles[t])})),this.attributeKeys.length&&this.attributeKeys.forEach((function(t){e.originalAttributes[t]?n.setAttribute(t,e.originalAttributes[t]):n.removeAttribute(t)})))}},{key:"render",value:function(){return null}}]),t}(i.PureComponent);u.defaultProps=s,t.default=u},"X+Jn":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=this;e.forEach((function(e){return t[e]=t[e].bind(t)}))}},X23O:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n("NBt2"),o=n("mR6N");t.StyleSheet=o.StyleSheet,t.StyleSheetServer=o.StyleSheetServer,t.StyleSheetTestUtils=o.StyleSheetTestUtils,t.css=function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];var o=!1;return(0,r.injectAndGetClassName)(o,t)}},ZlNK:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return Array.isArray(e)&&(e=e.join(",")),null!==e.match(/-webkit-|-moz-|-ms-/)},e.exports=t.default},"aO/s":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return'<svg fill="'+e+'" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="100%" height="100%" viewBox="0 0 512 512" xml:space="preserve">\n\t\t<path d="M213.7,256L213.7,256L213.7,256L380.9,81.9c4.2-4.3,4.1-11.4-0.2-15.8l-29.9-30.6c-4.3-4.4-11.3-4.5-15.5-0.2L131.1,247.9 c-2.2,2.2-3.2,5.2-3,8.1c-0.1,3,0.9,5.9,3,8.1l204.2,212.7c4.2,4.3,11.2,4.2,15.5-0.2l29.9-30.6c4.3-4.4,4.4-11.5,0.2-15.8 L213.7,256z"/>\n\t</svg>'}},bOv5:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if("string"==typeof t&&!(0,o.default)(t)&&null!==t.match(a))return(0,r.default)(e,t)};var r=i(n("m4M4")),o=i(n("ZlNK"));function i(e){return e&&e.__esModule?e:{default:e}}var a=/linear-gradient|radial-gradient|repeating-linear-gradient|repeating-radial-gradient/;e.exports=t.default},bcWM:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return'<svg fill="'+e+'" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="100%" height="100%" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">\n\t\t<path d="M443.6,387.1L312.4,255.4l131.5-130c5.4-5.4,5.4-14.2,0-19.6l-37.4-37.6c-2.6-2.6-6.1-4-9.8-4c-3.7,0-7.2,1.5-9.8,4 L256,197.8L124.9,68.3c-2.6-2.6-6.1-4-9.8-4c-3.7,0-7.2,1.5-9.8,4L68,105.9c-5.4,5.4-5.4,14.2,0,19.6l131.5,130L68.4,387.1 c-2.6,2.6-4.1,6.1-4.1,9.8c0,3.7,1.4,7.2,4.1,9.8l37.4,37.6c2.7,2.7,6.2,4.1,9.8,4.1c3.5,0,7.1-1.3,9.8-4.1L256,313.1l130.7,131.1 c2.7,2.7,6.2,4.1,9.8,4.1c3.5,0,7.1-1.3,9.8-4.1l37.4-37.6c2.6-2.6,4.1-6.1,4.1-9.8C447.7,393.2,446.2,389.7,443.6,387.1z"/>\n\t</svg>'}},dtEx:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=a(n("q1tI")),o=n("WXsj"),i=a(o);function a(e){return e&&e.__esModule?e:{default:e}}var l=function(e){var t=e.isActive,n=function(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}(e,["isActive"]);return t?r.default.createElement(i.default,n):null};l.defaultProps=o.defaultProps,t.default=l},eIMV:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return null!==e.match(/^(Webkit|Moz|O|ms)/)},e.exports=t.default},foek:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=n("q1tI"),a=f(i),l=n("2rMq"),s=n("V6UX"),u=n("hq1F"),c=f(n("G/iT"));function f(e){return e&&e.__esModule?e:{default:e}}function p(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function d(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}var h=0,m=function(e){function t(){return p(this,t),d(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),o(t,[{key:"componentDidMount",value:function(){h++,l.canUseDOM&&(this.initialHeight=window.innerHeight)}},{key:"componentWillUnmount",value:function(){if(h=Math.max(h-1,0),l.canUseDOM){var e=window.innerHeight-this.initialHeight;e&&window.scrollTo(0,window.pageYOffset+e)}this.initialHeight=window.innerHeight}},{key:"render",value:function(){var e=this.props.accountForScrollbars&&h<1?{"padding-right":(0,u.getPadding)()+"px"}:{},t=(0,u.getDocumentHeight)()+"px";return a.default.createElement(s.SimpleToggle,{styles:r({"box-sizing":"border-box",overflow:"hidden",position:"relative",height:t},e)})}}]),t}(i.PureComponent);m.defaultProps={accountForScrollbars:!0},t.default=(0,c.default)(m)},gPbE:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e};t.default=function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=o({},t);return Object.keys(n).forEach((function(o){"object"===r(n[o])&&n[o]&&t[o]?i[o]=e(t[o],n[o]):i[o]=n[o]})),i}},hq1F:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.preventTouchMove=function(e){e.preventDefault()},t.allowTouchMove=function(e){e.stopPropagation()},t.preventInertiaScroll=function(){var e=this.scrollTop,t=this.scrollHeight,n=e+this.offsetHeight;0===e?this.scrollTop=1:n===t&&(this.scrollTop=e-1)},t.isTouchDevice=function(){return!!window&&("ontouchstart"in window||navigator.maxTouchPoints)},t.getPadding=function(){if(!document||!window)return 0;var e=parseInt(document.body.paddingRight,10)||0,t=document.body?document.body.clientWidth:0;return window.innerWidth-t+e||0},t.camelToKebab=function(e){return e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()},t.getWindowHeight=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;if(window&&window.innerHeight)return window.innerHeight*e},t.getDocumentHeight=function(){if(document&&document.body)return document.body.clientHeight},t.parse=function(e){return isNaN(e)?e:e+"px"}},i3Rp:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={Webkit:{transform:!0,transformOrigin:!0,transformOriginX:!0,transformOriginY:!0,backfaceVisibility:!0,perspective:!0,perspectiveOrigin:!0,transformStyle:!0,transformOriginZ:!0,animation:!0,animationDelay:!0,animationDirection:!0,animationFillMode:!0,animationDuration:!0,animationIterationCount:!0,animationName:!0,animationPlayState:!0,animationTimingFunction:!0,appearance:!0,userSelect:!0,fontKerning:!0,textEmphasisPosition:!0,textEmphasis:!0,textEmphasisStyle:!0,textEmphasisColor:!0,boxDecorationBreak:!0,clipPath:!0,maskImage:!0,maskMode:!0,maskRepeat:!0,maskPosition:!0,maskClip:!0,maskOrigin:!0,maskSize:!0,maskComposite:!0,mask:!0,maskBorderSource:!0,maskBorderMode:!0,maskBorderSlice:!0,maskBorderWidth:!0,maskBorderOutset:!0,maskBorderRepeat:!0,maskBorder:!0,maskType:!0,textDecorationStyle:!0,textDecorationSkip:!0,textDecorationLine:!0,textDecorationColor:!0,filter:!0,fontFeatureSettings:!0,breakAfter:!0,breakBefore:!0,breakInside:!0,columnCount:!0,columnFill:!0,columnGap:!0,columnRule:!0,columnRuleColor:!0,columnRuleStyle:!0,columnRuleWidth:!0,columns:!0,columnSpan:!0,columnWidth:!0,flex:!0,flexBasis:!0,flexDirection:!0,flexGrow:!0,flexFlow:!0,flexShrink:!0,flexWrap:!0,alignContent:!0,alignItems:!0,alignSelf:!0,justifyContent:!0,order:!0,transition:!0,transitionDelay:!0,transitionDuration:!0,transitionProperty:!0,transitionTimingFunction:!0,backdropFilter:!0,scrollSnapType:!0,scrollSnapPointsX:!0,scrollSnapPointsY:!0,scrollSnapDestination:!0,scrollSnapCoordinate:!0,shapeImageThreshold:!0,shapeImageMargin:!0,shapeImageOutside:!0,hyphens:!0,flowInto:!0,flowFrom:!0,regionFragment:!0,textSizeAdjust:!0},Moz:{appearance:!0,userSelect:!0,boxSizing:!0,textAlignLast:!0,textDecorationStyle:!0,textDecorationSkip:!0,textDecorationLine:!0,textDecorationColor:!0,tabSize:!0,hyphens:!0,fontFeatureSettings:!0,breakAfter:!0,breakBefore:!0,breakInside:!0,columnCount:!0,columnFill:!0,columnGap:!0,columnRule:!0,columnRuleColor:!0,columnRuleStyle:!0,columnRuleWidth:!0,columns:!0,columnSpan:!0,columnWidth:!0},ms:{flex:!0,flexBasis:!1,flexDirection:!0,flexGrow:!1,flexFlow:!0,flexShrink:!1,flexWrap:!0,alignContent:!1,alignItems:!1,alignSelf:!1,justifyContent:!1,order:!1,transform:!0,transformOrigin:!0,transformOriginX:!0,transformOriginY:!0,userSelect:!0,wrapFlow:!0,wrapThrough:!0,wrapMargin:!0,scrollSnapType:!0,scrollSnapPointsX:!0,scrollSnapPointsY:!0,scrollSnapDestination:!0,scrollSnapCoordinate:!0,touchAction:!0,hyphens:!0,flowInto:!0,flowFrom:!0,breakBefore:!0,breakAfter:!0,breakInside:!0,regionFragment:!0,gridTemplateColumns:!0,gridTemplateRows:!0,gridTemplateAreas:!0,gridTemplate:!0,gridAutoColumns:!0,gridAutoRows:!0,gridAutoFlow:!0,grid:!0,gridRowStart:!0,gridColumnStart:!0,gridRowEnd:!0,gridRow:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnGap:!0,gridRowGap:!0,gridArea:!0,gridGap:!0,textSizeAdjust:!0}},e.exports=t.default},iRxY:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r={container:{background:"rgba(0, 0, 0, 0.8)",gutter:{horizontal:10,vertical:10},zIndex:2001},header:{height:40},close:{fill:"white"},footer:{color:"white",count:{color:"rgba(255, 255, 255, 0.75)",fontSize:"0.85em"},height:40,gutter:{horizontal:0,vertical:5}},thumbnail:{activeBorderColor:"white",size:50,gutter:2},arrow:{background:"none",fill:"white",height:120}};t.default=r},m4M4:function(e,t,n){"use strict";function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var n=arguments.length<=2||void 0===arguments[2]?function(e,t){return e+t}:arguments[2];return r({},e,["-webkit-","-moz-",""].map((function(e){return n(e,t)})))},e.exports=t.default},mR6N:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var a,l=e[Symbol.iterator]();!(r=(a=l.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(s){o=!0,i=s}finally{try{!r&&l.return&&l.return()}finally{if(o)throw i}}return n}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")},o=n("DIV9"),i=n("NBt2"),a={create:function(e){return(0,o.mapObj)(e,(function(e){var t=r(e,2),n=t[0],i=t[1];return[n,{_name:n+"_"+(0,o.hashObject)(i),_definition:i}]}))},rehydrate:function(){var e=arguments.length<=0||void 0===arguments[0]?[]:arguments[0];(0,i.addRenderedClassNames)(e)}},l={renderStatic:function(e){return(0,i.reset)(),(0,i.startBuffering)(),{html:e(),css:{content:(0,i.flushToString)(),renderedClassNames:(0,i.getRenderedClassNames)()}}}},s={suppressStyleInjection:function(){(0,i.reset)(),(0,i.startBuffering)()},clearBufferAndResumeStyleInjection:function(){(0,i.reset)()}};t.default={StyleSheet:a,StyleSheetServer:l,StyleSheetTestUtils:s,css:function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];var r=!0;return(0,i.injectAndGetClassName)(r,t)}},e.exports=t.default},"mi6+":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=p(n("17x9")),a=n("q1tI"),l=p(a),s=n("Rz3U"),u=p(n("yp6X")),c=p(n("qqHo")),f=p(n("iRxY"));function p(e){return e&&e.__esModule?e:{default:e}}var d=s.StyleSheet.create({paginatedThumbnails:{bottom:f.default.container.gutter.vertical,height:f.default.thumbnail.size,padding:"0 50px",position:"absolute",textAlign:"center",whiteSpace:"nowrap",left:"50%",transform:"translateX(-50%)"}}),h={height:f.default.thumbnail.size+2*f.default.thumbnail.gutter,width:40},m=function(e){function t(e){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t);var n=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.state={hasCustomPage:!1},n.gotoPrev=n.gotoPrev.bind(n),n.gotoNext=n.gotoNext.bind(n),n}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),o(t,[{key:"componentWillReceiveProps",value:function(e){e.currentImage!==this.props.currentImage&&this.setState({hasCustomPage:!1})}},{key:"getFirst",value:function(){var e=this.props,t=e.currentImage,n=e.offset;return this.state.hasCustomPage?this.clampFirst(this.state.first):this.clampFirst(t-n)}},{key:"setFirst",value:function(e,t){var n=this.state.first;e&&(e.preventDefault(),e.stopPropagation()),n!==t&&this.setState({hasCustomPage:!0,first:t})}},{key:"gotoPrev",value:function(e){this.setFirst(e,this.getFirst()-this.props.offset)}},{key:"gotoNext",value:function(e){this.setFirst(e,this.getFirst()+this.props.offset)}},{key:"clampFirst",value:function(e){var t=this.props,n=t.images,r=2*t.offset+1;return e<0?0:e+r>n.length?n.length-r:e}},{key:"renderArrowPrev",value:function(){return this.getFirst()<=0?null:l.default.createElement(c.default,{direction:"left",size:"small",icon:"arrowLeft",onClick:this.gotoPrev,style:h,title:"Previous (Left arrow key)",type:"button"})}},{key:"renderArrowNext",value:function(){var e=this.props,t=e.offset,n=e.images,r=2*t+1;return this.getFirst()+r>=n.length?null:l.default.createElement(c.default,{direction:"right",size:"small",icon:"arrowRight",onClick:this.gotoNext,style:h,title:"Next (Right arrow key)",type:"button"})}},{key:"render",value:function(){var e=this.props,t=e.images,n=e.currentImage,o=e.onClickThumbnail,i=2*e.offset+1,a=[],c=0;return t.length<=i?a=t:(c=this.getFirst(),a=t.slice(c,c+i)),l.default.createElement("div",{className:(0,s.css)(d.paginatedThumbnails)},this.renderArrowPrev(),a.map((function(e,t){return l.default.createElement(u.default,r({key:c+t},e,{index:c+t,onClick:o,active:c+t===n}))})),this.renderArrowNext())}}]),t}(a.Component);t.default=m,m.propTypes={currentImage:i.default.number,images:i.default.array,offset:i.default.number,onClickThumbnail:i.default.func.isRequired}},n9FV:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function e(t){return Object.keys(t).forEach((function(n){var i=t[n];i instanceof Object&&!Array.isArray(i)?t[n]=e(i):Object.keys(r.default).forEach((function(e){r.default[e][n]&&(t[e+(0,o.default)(n)]=i)}))})),Object.keys(t).forEach((function(e){[].concat(t[e]).forEach((function(n,r){g.forEach((function(r){return function(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];Object.keys(t).forEach((function(n){var r=e[n];Array.isArray(r)?[].concat(t[n]).forEach((function(t){var o=r.indexOf(t);o>-1&&e[n].splice(o,1),e[n].push(t)})):e[n]=t[n]}))}(t,r(e,n))}))}))})),(0,i.default)(t)};var r=m(n("i3Rp")),o=m(n("HiWe")),i=m(n("D3gc")),a=m(n("O4bN")),l=m(n("DYNA")),s=m(n("zcjc")),u=m(n("0hL1")),c=m(n("W9PW")),f=m(n("bOv5")),p=m(n("1W/U")),d=m(n("rPUN")),h=m(n("qbN4"));function m(e){return e&&e.__esModule?e:{default:e}}var g=[a.default,l.default,s.default,c.default,f.default,p.default,d.default,h.default,u.default];e.exports=t.default},pxNp:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n("foek");Object.defineProperty(t,"default",{enumerable:!0,get:function(){return(e=r,e&&e.__esModule?e:{default:e}).default;var e}})},qbN4:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if("flexDirection"===e&&"string"==typeof t)return{WebkitBoxOrient:t.indexOf("column")>-1?"vertical":"horizontal",WebkitBoxDirection:t.indexOf("reverse")>-1?"reverse":"normal"};if(o[e])return function(e,t,n){t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n;return e}({},o[e],r[t]||t)};var r={"space-around":"justify","space-between":"justify","flex-start":"start","flex-end":"end","wrap-reverse":"multiple",wrap:"multiple"},o={alignItems:"WebkitBoxAlign",justifyContent:"WebkitBoxPack",flexWrap:"WebkitBoxLines"};e.exports=t.default},qqHo:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},o=c(n("17x9")),i=c(n("q1tI")),a=n("Rz3U"),l=c(n("iRxY")),s=c(n("gPbE")),u=c(n("HFUj"));function c(e){return e&&e.__esModule?e:{default:e}}function f(e,t){var n=t.theme,o=e.direction,c=e.icon,f=e.onClick,d=e.size,h=function(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}(e,["direction","icon","onClick","size"]),m=a.StyleSheet.create((0,s.default)(p,n));return i.default.createElement("button",r({type:"button",className:(0,a.css)(m.arrow,m["arrow__direction__"+o],d&&m["arrow__size__"+d]),onClick:f,onTouchEnd:f},h),i.default.createElement(u.default,{fill:!!n.arrow&&n.arrow.fill||l.default.arrow.fill,type:c}))}f.propTypes={direction:o.default.oneOf(["left","right"]),icon:o.default.string,onClick:o.default.func.isRequired,size:o.default.oneOf(["medium","small"]).isRequired},f.defaultProps={size:"medium"},f.contextTypes={theme:o.default.object.isRequired};var p={arrow:{background:"none",border:"none",borderRadius:4,cursor:"pointer",outline:"none",padding:10,position:"absolute",top:"50%",WebkitTouchCallout:"none",userSelect:"none"},arrow__size__medium:{height:l.default.arrow.height,marginTop:l.default.arrow.height/-2,width:40,"@media (min-width: 768px)":{width:70}},arrow__size__small:{height:l.default.thumbnail.size,marginTop:l.default.thumbnail.size/-2,width:30,"@media (min-width: 500px)":{width:40}},arrow__direction__right:{right:l.default.container.gutter.horizontal},arrow__direction__left:{left:l.default.container.gutter.horizontal}};t.default=f},rPUN:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if(o[e])return function(e,t,n){t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n;return e}({},o[e],r[t]||t)};var r={"space-around":"distribute","space-between":"justify","flex-start":"start","flex-end":"end"},o={alignContent:"msFlexLinePack",alignSelf:"msFlexItemAlign",alignItems:"msFlexAlign",justifyContent:"msFlexPack",order:"msFlexOrder",flexGrow:"msFlexPositive",flexShrink:"msFlexNegative",flexBasis:"msPreferredSize"};e.exports=t.default},tMJ1:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},o=u(n("17x9")),i=u(n("q1tI")),a=n("Rz3U"),l=u(n("iRxY")),s=u(n("gPbE"));function u(e){return e&&e.__esModule?e:{default:e}}function c(e,t){var n=t.theme,o=e.caption,l=e.countCurrent,u=e.countSeparator,c=e.countTotal,p=e.showCount,d=function(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}(e,["caption","countCurrent","countSeparator","countTotal","showCount"]);if(!o&&!p)return null;var h=a.StyleSheet.create((0,s.default)(f,n)),m=p?i.default.createElement("div",{className:(0,a.css)(h.footerCount)},l,u,c):i.default.createElement("span",null);return i.default.createElement("div",r({className:(0,a.css)(h.footer)},d),o?i.default.createElement("figcaption",{className:(0,a.css)(h.footerCaption)},o):i.default.createElement("span",null),m)}c.propTypes={caption:o.default.oneOfType([o.default.string,o.default.element]),countCurrent:o.default.number,countSeparator:o.default.string,countTotal:o.default.number,showCount:o.default.bool},c.contextTypes={theme:o.default.object.isRequired};var f={footer:{boxSizing:"border-box",color:l.default.footer.color,cursor:"auto",display:"flex",justifyContent:"space-between",left:0,lineHeight:1.3,paddingBottom:l.default.footer.gutter.vertical,paddingLeft:l.default.footer.gutter.horizontal,paddingRight:l.default.footer.gutter.horizontal,paddingTop:l.default.footer.gutter.vertical},footerCount:{color:l.default.footer.count.color,fontSize:l.default.footer.count.fontSize,paddingLeft:"1em"},footerCaption:{flex:"1 1 0"}};t.default=c},wbUH:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=x(n("17x9")),i=n("q1tI"),a=x(i),l=n("mR6N"),s=x(n("pxNp")),u=x(n("iRxY")),c=x(n("qqHo")),f=x(n("xNvb")),p=x(n("tMJ1")),d=x(n("42J/")),h=x(n("mi6+")),m=x(n("HqMp")),g=x(n("I13A")),b=x(n("X+Jn")),y=x(n("GuKG")),v=x(n("gPbE"));function x(e){return e&&e.__esModule?e:{default:e}}function w(e){var t=e.srcSet||e.srcset;return Array.isArray(t)?t.join():t}var O=function(e){function t(e){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t);var n=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.theme=(0,v.default)(u.default,e.theme),n.classes=l.StyleSheet.create((0,v.default)(k,n.theme)),n.state={imageLoaded:!1},b.default.call(n,["gotoNext","gotoPrev","closeBackdrop","handleKeyboardInput","handleImageLoaded"]),n}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),r(t,[{key:"getChildContext",value:function(){return{theme:this.theme}}},{key:"componentDidMount",value:function(){this.props.isOpen&&(this.props.enableKeyboardInput&&window.addEventListener("keydown",this.handleKeyboardInput),"number"==typeof this.props.currentImage&&this.preloadImage(this.props.currentImage,this.handleImageLoaded))}},{key:"componentWillReceiveProps",value:function(e){if(y.default){if(e.preloadNextImage){var t=this.props.currentImage,n=e.currentImage+1,r=e.currentImage-1,o=void 0;t&&e.currentImage>t?o=n:t&&e.currentImage<t&&(o=r),o?this.preloadImage(o):(this.preloadImage(r),this.preloadImage(n))}if(this.props.currentImage!==e.currentImage||!this.props.isOpen&&e.isOpen){var i=this.preloadImageData(e.images[e.currentImage],this.handleImageLoaded);i&&this.setState({imageLoaded:i.complete})}!this.props.isOpen&&e.isOpen&&e.enableKeyboardInput&&window.addEventListener("keydown",this.handleKeyboardInput),!e.isOpen&&e.enableKeyboardInput&&window.removeEventListener("keydown",this.handleKeyboardInput)}}},{key:"componentWillUnmount",value:function(){this.props.enableKeyboardInput&&window.removeEventListener("keydown",this.handleKeyboardInput)}},{key:"preloadImage",value:function(e,t){return this.preloadImageData(this.props.images[e],t)}},{key:"preloadImageData",value:function(e,t){if(e){var n=new Image,r=w(e);return n.onerror=t,n.onload=t,n.src=e.src,r&&(n.srcset=r),n}}},{key:"gotoNext",value:function(e){var t=this.props,n=t.currentImage,r=t.images;this.state.imageLoaded&&n!==r.length-1&&(e&&(e.preventDefault(),e.stopPropagation()),this.props.onClickNext())}},{key:"gotoPrev",value:function(e){var t=this.props.currentImage;this.state.imageLoaded&&0!==t&&(e&&(e.preventDefault(),e.stopPropagation()),this.props.onClickPrev())}},{key:"closeBackdrop",value:function(e){"lightboxBackdrop"!==e.target.id&&"FIGURE"!==e.target.tagName||this.props.onClose()}},{key:"handleKeyboardInput",value:function(e){return 37===e.keyCode?(this.gotoPrev(e),!0):39===e.keyCode?(this.gotoNext(e),!0):27===e.keyCode&&(this.props.onClose(),!0)}},{key:"handleImageLoaded",value:function(){this.setState({imageLoaded:!0})}},{key:"renderArrowPrev",value:function(){return 0===this.props.currentImage?null:a.default.createElement(c.default,{direction:"left",icon:"arrowLeft",onClick:this.gotoPrev,title:this.props.leftArrowTitle,type:"button"})}},{key:"renderArrowNext",value:function(){return this.props.currentImage===this.props.images.length-1?null:a.default.createElement(c.default,{direction:"right",icon:"arrowRight",onClick:this.gotoNext,title:this.props.rightArrowTitle,type:"button"})}},{key:"renderDialog",value:function(){var e=this.props,t=e.backdropClosesModal,n=e.isOpen,r=e.showThumbnails,o=e.width,i=this.state.imageLoaded;if(!n)return a.default.createElement("span",{key:"closed"});var u=0;return r&&(u=this.theme.thumbnail.size+this.theme.container.gutter.vertical),a.default.createElement(f.default,{key:"open",onClick:t&&this.closeBackdrop,onTouchEnd:t&&this.closeBackdrop},a.default.createElement("div",null,a.default.createElement("div",{className:(0,l.css)(this.classes.content),style:{marginBottom:u,maxWidth:o}},i&&this.renderHeader(),this.renderImages(),this.renderSpinner(),i&&this.renderFooter()),i&&this.renderThumbnails(),i&&this.renderArrowPrev(),i&&this.renderArrowNext(),this.props.preventScroll&&a.default.createElement(s.default,null)))}},{key:"renderImages",value:function(){var e=this.props,t=e.currentImage,n=e.images,r=e.onClickImage,o=e.showThumbnails,i=this.state.imageLoaded;if(!n||!n.length)return null;var s=n[t],u=w(s),c=u?"100vw":null,f=o?this.theme.thumbnail.size:0,p=this.theme.header.height+this.theme.footer.height+f+this.theme.container.gutter.vertical+"px";return a.default.createElement("figure",{className:(0,l.css)(this.classes.figure)},a.default.createElement("img",{className:(0,l.css)(this.classes.image,i&&this.classes.imageLoaded),onClick:r,sizes:c,alt:s.alt,src:s.src,srcSet:u,style:{cursor:r?"pointer":"auto",maxHeight:"calc(100vh - "+p+")"}}))}},{key:"renderThumbnails",value:function(){var e=this.props,t=e.images,n=e.currentImage,r=e.onClickThumbnail,o=e.showThumbnails,i=e.thumbnailOffset;if(o)return a.default.createElement(h.default,{currentImage:n,images:t,offset:i,onClickThumbnail:r})}},{key:"renderHeader",value:function(){var e=this.props,t=e.closeButtonTitle,n=e.customControls,r=e.onClose,o=e.showCloseButton;return a.default.createElement(d.default,{customControls:n,onClose:r,showCloseButton:o,closeButtonTitle:t})}},{key:"renderFooter",value:function(){var e=this.props,t=e.currentImage,n=e.images,r=e.imageCountSeparator,o=e.showImageCount;return n&&n.length?a.default.createElement(p.default,{caption:n[t].caption,countCurrent:t+1,countSeparator:r,countTotal:n.length,showCount:o}):null}},{key:"renderSpinner",value:function(){var e=this.props,t=e.spinner,n=e.spinnerColor,r=e.spinnerSize,o=this.state.imageLoaded,i=t;return a.default.createElement("div",{className:(0,l.css)(this.classes.spinner,!o&&this.classes.spinnerActive)},a.default.createElement(i,{color:n,size:r}))}},{key:"render",value:function(){return a.default.createElement(m.default,null,this.renderDialog())}}]),t}(i.Component);O.propTypes={backdropClosesModal:o.default.bool,closeButtonTitle:o.default.string,currentImage:o.default.number,customControls:o.default.arrayOf(o.default.node),enableKeyboardInput:o.default.bool,imageCountSeparator:o.default.string,images:o.default.arrayOf(o.default.shape({src:o.default.string.isRequired,srcSet:o.default.oneOfType([o.default.string,o.default.arrayOf(o.default.string)]),caption:o.default.oneOfType([o.default.string,o.default.element]),thumbnail:o.default.string})).isRequired,isOpen:o.default.bool,leftArrowTitle:o.default.string,onClickImage:o.default.func,onClickNext:o.default.func,onClickPrev:o.default.func,onClose:o.default.func.isRequired,preloadNextImage:o.default.bool,preventScroll:o.default.bool,rightArrowTitle:o.default.string,showCloseButton:o.default.bool,showImageCount:o.default.bool,showThumbnails:o.default.bool,spinner:o.default.func,spinnerColor:o.default.string,spinnerSize:o.default.number,theme:o.default.object,thumbnailOffset:o.default.number,width:o.default.number},O.defaultProps={closeButtonTitle:"Close (Esc)",currentImage:0,enableKeyboardInput:!0,imageCountSeparator:" of ",leftArrowTitle:"Previous (Left arrow key)",onClickShowNextImage:!0,preloadNextImage:!0,preventScroll:!0,rightArrowTitle:"Next (Right arrow key)",showCloseButton:!0,showImageCount:!0,spinner:g.default,spinnerColor:"white",spinnerSize:100,theme:{},thumbnailOffset:2,width:1024},O.childContextTypes={theme:o.default.object.isRequired};var k={content:{position:"relative"},figure:{margin:0},image:{display:"block",height:"auto",margin:"0 auto",maxWidth:"100%",WebkitTouchCallout:"none",userSelect:"none",opacity:0,transition:"opacity 0.3s"},imageLoaded:{opacity:1},spinner:{position:"absolute",top:"50%",left:"50%",transform:"translate(-50%, -50%)",opacity:0,transition:"opacity 0.3s",pointerEvents:"none"},spinnerActive:{opacity:1}};t.default=O},xNvb:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},o=u(n("17x9")),i=u(n("q1tI")),a=n("Rz3U"),l=u(n("iRxY")),s=u(n("gPbE"));function u(e){return e&&e.__esModule?e:{default:e}}function c(e,t){var n=t.theme,o=function(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}(e,[]),l=a.StyleSheet.create((0,s.default)(f,n));return i.default.createElement("div",r({id:"lightboxBackdrop",className:(0,a.css)(l.container)},o))}c.contextTypes={theme:o.default.object.isRequired};var f={container:{alignItems:"center",backgroundColor:l.default.container.background,boxSizing:"border-box",display:"flex",height:"100%",justifyContent:"center",left:0,paddingBottom:l.default.container.gutter.vertical,paddingLeft:l.default.container.gutter.horizontal,paddingRight:l.default.container.gutter.horizontal,paddingTop:l.default.container.gutter.vertical,position:"fixed",top:0,width:"100%",zIndex:l.default.container.zIndex}};t.default=c},xfxO:function(e,t,n){"use strict";t.__esModule=!0,t.classNamesShape=t.timeoutsShape=void 0;var r;(r=n("17x9"))&&r.__esModule;t.timeoutsShape=null;t.classNamesShape=null},yD6e:function(e,t,n){"use strict";t.__esModule=!0,t.default=function(e,t){return e.classList?!!t&&e.classList.contains(t):-1!==(" "+(e.className.baseVal||e.className)+" ").indexOf(" "+t+" ")},e.exports=t.default},ycFn:function(e,t,n){"use strict";var r=n("5NKs");t.__esModule=!0,t.default=function(e,t){e.classList?e.classList.add(t):(0,o.default)(e,t)||("string"==typeof e.className?e.className=e.className+" "+t:e.setAttribute("class",(e.className&&e.className.baseVal||"")+" "+t))};var o=r(n("yD6e"));e.exports=t.default},yp6X:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=s(n("17x9")),o=s(n("q1tI")),i=n("Rz3U"),a=s(n("iRxY")),l=s(n("gPbE"));function s(e){return e&&e.__esModule?e:{default:e}}function u(e,t){var n=e.index,r=e.src,a=e.thumbnail,s=e.active,u=e.onClick,f=t.theme,p=a||r,d=i.StyleSheet.create((0,l.default)(c,f));return o.default.createElement("div",{className:(0,i.css)(d.thumbnail,s&&d.thumbnail__active),onClick:function(e){e.preventDefault(),e.stopPropagation(),u(n)},style:{backgroundImage:'url("'+p+'")'}})}u.propTypes={active:r.default.bool,index:r.default.number,onClick:r.default.func.isRequired,src:r.default.string,thumbnail:r.default.string},u.contextTypes={theme:r.default.object.isRequired};var c={thumbnail:{backgroundPosition:"center",backgroundSize:"cover",borderRadius:2,boxShadow:"inset 0 0 0 1px hsla(0,0%,100%,.2)",cursor:"pointer",display:"inline-block",height:a.default.thumbnail.size,margin:a.default.thumbnail.gutter,overflow:"hidden",width:a.default.thumbnail.size},thumbnail__active:{boxShadow:"inset 0 0 0 2px "+a.default.thumbnail.activeBorderColor}};t.default=u},zPGp:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r,o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=n("17x9"),a=(r=i)&&r.__esModule?r:{default:r},l=n("q1tI");function s(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function u(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}var c=function(e){function t(){return s(this,t),u(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),o(t,[{key:"getChildContext",value:function(){return this.props.context}},{key:"render",value:function(){return l.Children.only(this.props.children)}}]),t}(l.Component);c.propTypes={context:a.default.object.isRequired},c.childContextTypes={theme:a.default.object},t.default=c},zcjc:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if("cursor"===e&&a[t])return(0,i.default)(e,t)};var r,o=n("m4M4"),i=(r=o)&&r.__esModule?r:{default:r};var a={"zoom-in":!0,"zoom-out":!0,grab:!0,grabbing:!0};e.exports=t.default}}]);
//# sourceMappingURL=component---src-pages-gallery-tsx-8d7416249168a6e451cb.js.map