diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index 7bee028b..00000000 --- a/.dockerignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -Dockerfile* -.dockerignore -.git -.gitignore diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 52de427a..00000000 --- a/.eslintrc.js +++ /dev/null @@ -1,28 +0,0 @@ -module.exports = { - "env": { - "browser": true, - "es6": true, - }, - "plugins": [ - "react", - ], - "parserOptions": { - "sourceType": "module", - "ecmaVersion": 2018, - "ecmaFeatures": { - "jsx": true, - }, - }, - "rules": { - "react/jsx-uses-vars": 2, - 'no-console': [ - 'warn', - { - allow: [ - 'error', - 'warn', - ], - }, - ], - } -} diff --git a/.gitignore b/.gitignore deleted file mode 100644 index a3a3ef8d..00000000 --- a/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -node_modules/ -public/ -.gatsby-context.js -.DS_Store -.intermediate-representation/ -.cache/ -package-lock.json - -.vercel diff --git a/static/.nojekyll b/.nojekyll similarity index 100% rename from static/.nojekyll rename to .nojekyll diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 5149b1b7..00000000 --- a/.prettierrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "trailingComma": "es5", - "semi": false, - "singleQuote": true -} diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index d6cc5317..00000000 --- a/.travis.yml +++ /dev/null @@ -1,18 +0,0 @@ -language: node_js -node_js: - - "14" - -before_script: - - npm install -g gatsby-cli -script: - - npm run build -deploy: - provider: pages - skip-cleanup: true - github-token: "$GITHUB_TOKEN" - local_dir: public - keep-history: true - name: "Travis Deploy" - target_branch: master - on: - branch: source diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 64e65e28..00000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "configurations": [ - { - "name": "Launch Generate image direct", - "program": "${workspaceFolder}/scripts/generatePostPreviewImages.js", - "request": "launch", - "type": "node" - }, - { - "type": "node", - "request": "launch", - "name": "Generate Image", - "runtimeExecutable": "yarn", - "runtimeArgs": [ - "generatePostPreviewImages" - ] - } - ] - } \ No newline at end of file diff --git a/1-03cd128f0661328d250d.js b/1-03cd128f0661328d250d.js new file mode 100644 index 00000000..0ee40ce0 --- /dev/null +++ b/1-03cd128f0661328d250d.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{154:function(t,e,r){"use strict";(function(t){r.d(e,"a",function(){return te});var n=r(263),a=r.n(n),o=r(264),i=r.n(o),s=r(0),l=r.n(s),u=r(265),c=r(195),f=r(267),d=(r(4),r(35),r(293)),p=function(t,e){for(var r=[t[0]],n=0,a=e.length;n=0||Object.prototype.hasOwnProperty.call(t,n)&&(r[n]=t[n]);return r},x=function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e},T=function(t){return"object"===(void 0===t?"undefined":h(t))&&t.constructor===Object},C=Object.freeze([]),w=Object.freeze({});function A(t){return"function"==typeof t}function E(t){return t.displayName||t.name||"Component"}function S(t){return t&&"string"==typeof t.styledComponentId}var k=void 0!==t&&{}.SC_ATTR||"data-styled",O="undefined"!=typeof window&&"HTMLElement"in window,F="boolean"==typeof SC_DISABLE_SPEEDY&&SC_DISABLE_SPEEDY||!1,M={};var _=function(t){function e(r){m(this,e);for(var n=arguments.length,a=Array(n>1?n-1:0),o=1;o0&&-1!==r.slice(0,e).indexOf(z)&&r.slice(e-z.length,e)!==z?"."+G:t};B.use([function(t,e,r){2===t&&r.length&&r[0].lastIndexOf(z)>0&&(r[0]=r[0].replace(H,q))},D,L]),j.use([D,L]);function W(t,e,r){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"&",a=t.join("").replace(P,""),o=e&&r?r+" "+e+" { "+a+" }":a;return G=n,z=e,H=new RegExp("\\"+z+"\\b","g"),B(r||!e?"":e,o)}var U=function(){return r.nc},Y=function(t,e,r){r&&((t[e]||(t[e]=Object.create(null)))[r]=!0)},$=function(t,e){t[e]=Object.create(null)},V=function(t){return function(e,r){return void 0!==t[e]&&t[e][r]}},X=function(t){var e="";for(var r in t)e+=Object.keys(t[r]).join(" ")+" ";return e.trim()},K=function(t){if(t.sheet)return t.sheet;for(var e=document.styleSheets.length,r=0;r"+t()+""}},et=function(t,e){return function(){var r,n=((r={})[k]=X(e),r["data-styled-version"]="4.2.0",r),a=U();return a&&(n.nonce=a),l.a.createElement("style",v({},n,{dangerouslySetInnerHTML:{__html:t()}}))}},rt=function(t){return function(){return Object.keys(t)}},nt=function(t){return document.createTextNode(Q(t))},at=function t(e,r){var n=void 0===e?Object.create(null):e,a=void 0===r?Object.create(null):r,o=function(t){var e=a[t];return void 0!==e?e:a[t]=[""]},i=function(){var t="";for(var e in a){var r=a[e][0];r&&(t+=Q(e)+r)}return t};return{clone:function(){var e=function(t){var e=Object.create(null);for(var r in t)e[r]=v({},t[r]);return e}(n),r=Object.create(null);for(var o in a)r[o]=[a[o][0]];return t(e,r)},css:i,getIds:rt(a),hasNameForId:V(n),insertMarker:o,insertRules:function(t,e,r){o(t)[0]+=e.join(" "),Y(n,t,r)},removeRules:function(t){var e=a[t];void 0!==e&&(e[0]="",$(n,t))},sealed:!1,styleTag:null,toElement:et(i,n),toHTML:tt(i,n)}},ot=function(t,e,r,n,a){if(O&&!r){var o=function(t,e,r){var n=document.createElement("style");n.setAttribute(k,""),n.setAttribute("data-styled-version","4.2.0");var a=U();if(a&&n.setAttribute("nonce",a),n.appendChild(document.createTextNode("")),t&&!e)t.appendChild(n);else{if(!e||!t||!e.parentNode)throw new _(6);e.parentNode.insertBefore(n,r?e:e.nextSibling)}return n}(t,e,n);return F?function(t,e){var r=Object.create(null),n=Object.create(null),a=void 0!==e,o=!1,i=function(e){var a=n[e];return void 0!==a?a:(n[e]=nt(e),t.appendChild(n[e]),r[e]=Object.create(null),n[e])},s=function(){var t="";for(var e in n)t+=n[e].data;return t};return{clone:function(){throw new _(5)},css:s,getIds:rt(n),hasNameForId:V(r),insertMarker:i,insertRules:function(t,n,s){for(var l=i(t),u=[],c=n.length,f=0;f0&&(o=!0,e().insertRules(t+"-import",u))},removeRules:function(i){var s=n[i];if(void 0!==s){var l=nt(i);t.replaceChild(l,s),n[i]=l,$(r,i),a&&o&&e().removeRules(i+"-import")}},sealed:!1,styleTag:t,toElement:et(s,r),toHTML:tt(s,r)}}(o,a):function(t,e){var r=Object.create(null),n=Object.create(null),a=[],o=void 0!==e,i=!1,s=function(t){var e=n[t];return void 0!==e?e:(n[t]=a.length,a.push(0),$(r,t),n[t])},l=function(){var e=K(t).cssRules,r="";for(var o in n){r+=Q(o);for(var i=n[o],s=J(a,i),l=s-a[i];l0&&(i=!0,e().insertRules(n+"-import",h)),a[c]+=p,Y(r,n,u)},removeRules:function(s){var l=n[s];if(void 0!==l){var u=a[l];!function(t,e,r){for(var n=e-r,a=e;a>n;a-=1)t.deleteRule(a)}(K(t),J(a,l)-1,u),a[l]=0,$(r,s),o&&i&&e().removeRules(s+"-import")}},sealed:!1,styleTag:t,toElement:et(l,r),toHTML:tt(l,r)}}(o,a)}return at()},it=/\s+/,st=void 0;st=O?F?40:1e3:-1;var lt=0,ut=void 0,ct=function(){function t(){var e=this,r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:O?document.head:null,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];m(this,t),this.getImportRuleTag=function(){var t=e.importRuleTag;if(void 0!==t)return t;var r=e.tags[0];return e.importRuleTag=ot(e.target,r?r.styleTag:null,e.forceServer,!0)},lt+=1,this.id=lt,this.forceServer=n,this.target=n?null:r,this.tagMap={},this.deferred={},this.rehydratedNames={},this.ignoreRehydratedNames={},this.tags=[],this.capacity=1,this.clones=[]}return t.prototype.rehydrate=function(){if(!O||this.forceServer)return this;var t=[],e=[],r=!1,n=document.querySelectorAll("style["+k+'][data-styled-version="4.2.0"]'),a=n.length;if(!a)return this;for(var o=0;o0&&void 0!==arguments[0]&&arguments[0];ut=new t(void 0,e).rehydrate()},t.prototype.clone=function(){var e=new t(this.target,this.forceServer);return this.clones.push(e),e.tags=this.tags.map(function(t){for(var r=t.getIds(),n=t.clone(),a=0;a1?e-1:0),n=1;n=4;)e=1540483477*(65535&(e=255&t.charCodeAt(a)|(255&t.charCodeAt(++a))<<8|(255&t.charCodeAt(++a))<<16|(255&t.charCodeAt(++a))<<24))+((1540483477*(e>>>16)&65535)<<16),n=1540483477*(65535&n)+((1540483477*(n>>>16)&65535)<<16)^(e=1540483477*(65535&(e^=e>>>24))+((1540483477*(e>>>16)&65535)<<16)),r-=4,++a;switch(r){case 3:n^=(255&t.charCodeAt(a+2))<<16;case 2:n^=(255&t.charCodeAt(a+1))<<8;case 1:n=1540483477*(65535&(n^=255&t.charCodeAt(a)))+((1540483477*(n>>>16)&65535)<<16)}return((n=1540483477*(65535&(n^=n>>>13))+((1540483477*(n>>>16)&65535)<<16))^n>>>15)>>>0}var bt=52,xt=function(t){return String.fromCharCode(t+(t>25?39:97))};function Tt(t){var e="",r=void 0;for(r=t;r>bt;r=Math.floor(r/bt))e=xt(r%bt)+e;return xt(r%bt)+e}function Ct(t,e){for(var r=0;r2&&void 0!==arguments[2]?arguments[2]:w,n=!!r&&t.theme===r.theme;return t.theme&&!n?t.theme:e||r.theme},Ot=/[[\].#*$><+~=|^:(),"'`-]+/g,Ft=/(^-|-$)/g;function Mt(t){return t.replace(Ot,"-").replace(Ft,"")}function _t(t){return"string"==typeof t&&!0}var Nt={childContextTypes:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDerivedStateFromProps:!0,propTypes:!0,type:!0},It={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},Pt=((wt={})[c.ForwardRef]={$$typeof:!0,render:!0},wt),jt=Object.defineProperty,Bt=Object.getOwnPropertyNames,Rt=Object.getOwnPropertySymbols,Lt=void 0===Rt?function(){return[]}:Rt,Dt=Object.getOwnPropertyDescriptor,Gt=Object.getPrototypeOf,zt=Object.prototype,Ht=Array.prototype;function qt(t,e,r){if("string"!=typeof e){var n=Gt(e);n&&n!==zt&&qt(t,n,r);for(var a=Ht.concat(Bt(e),Lt(e)),o=Pt[t.$$typeof]||Nt,i=Pt[e.$$typeof]||Nt,s=a.length,l=void 0,u=void 0;s--;)if(u=a[s],!(It[u]||r&&r[u]||i&&i[u]||o&&o[u])&&(l=Dt(e,u)))try{jt(t,u,l)}catch(c){}return t}return t}var Wt=Object(s.createContext)(),Ut=Wt.Consumer,Yt=(function(t){function e(r){m(this,e);var n=x(this,t.call(this,r));return n.getContext=Object(f.a)(n.getContext.bind(n)),n.renderInner=n.renderInner.bind(n),n}y(e,t),e.prototype.render=function(){return this.props.children?l.a.createElement(Wt.Consumer,null,this.renderInner):null},e.prototype.renderInner=function(t){var e=this.getContext(this.props.theme,t);return l.a.createElement(Wt.Provider,{value:e},l.a.Children.only(this.props.children))},e.prototype.getTheme=function(t,e){if(A(t))return t(e);if(null===t||Array.isArray(t)||"object"!==(void 0===t?"undefined":h(t)))throw new _(8);return v({},e,t)},e.prototype.getContext=function(t,e){return this.getTheme(t,e)}}(s.Component),function(){function t(){m(this,t),this.masterSheet=ct.master,this.instance=this.masterSheet.clone(),this.sealed=!1}t.prototype.seal=function(){if(!this.sealed){var t=this.masterSheet.clones.indexOf(this.instance);this.masterSheet.clones.splice(t,1),this.sealed=!0}},t.prototype.collectStyles=function(t){if(this.sealed)throw new _(2);return l.a.createElement(Vt,{sheet:this.instance},t)},t.prototype.getStyleTags=function(){return this.seal(),this.instance.toHTML()},t.prototype.getStyleElement=function(){return this.seal(),this.instance.toReactElements()},t.prototype.interleaveWithNodeStream=function(t){throw new _(3)}}(),Object(s.createContext)()),$t=Yt.Consumer,Vt=function(t){function e(r){m(this,e);var n=x(this,t.call(this,r));return n.getContext=Object(f.a)(n.getContext),n}return y(e,t),e.prototype.getContext=function(t,e){if(t)return t;if(e)return new ct(e);throw new _(4)},e.prototype.render=function(){var t=this.props,e=t.children,r=t.sheet,n=t.target;return l.a.createElement(Yt.Provider,{value:this.getContext(r,n)},e)},e}(s.Component),Xt=(new Set,{});var Kt=function(t){function e(){m(this,e);var r=x(this,t.call(this));return r.attrs={},r.renderOuter=r.renderOuter.bind(r),r.renderInner=r.renderInner.bind(r),r}return y(e,t),e.prototype.render=function(){return l.a.createElement($t,null,this.renderOuter)},e.prototype.renderOuter=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ct.master;return this.styleSheet=t,this.props.forwardedComponent.componentStyle.isStatic?this.renderInner():l.a.createElement(Ut,null,this.renderInner)},e.prototype.renderInner=function(t){var e=this.props.forwardedComponent,r=e.componentStyle,n=e.defaultProps,a=(e.displayName,e.foldedComponentIds),o=e.styledComponentId,i=e.target,l=void 0;l=r.isStatic?this.generateAndInjectStyles(w,this.props):void 0!==t?this.generateAndInjectStyles(kt(this.props,t,n),this.props):this.generateAndInjectStyles(this.props.theme||w,this.props);var u=this.props.as||this.attrs.as||i,c=_t(u),f={},p=v({},this.attrs,this.props),h=void 0;for(h in p)"forwardedComponent"!==h&&"as"!==h&&"suppressClassNameWarning"!==h&&("forwardedRef"===h?f.ref=p[h]:c&&!Object(d.a)(h)||(f[h]=p[h]));return this.props.style&&this.attrs.style&&(f.style=v({},this.attrs.style,this.props.style)),f.className=Array.prototype.concat(a,this.props.className,o,this.attrs.className,l).filter(Boolean).join(" "),Object(s.createElement)(u,f)},e.prototype.buildExecutionContext=function(t,e,r){var n=this,a=v({},e,{theme:t});return r.length?(this.attrs={},r.forEach(function(t){var e,r=t,o=!1,i=void 0,s=void 0;for(s in A(r)&&(r=r(a),o=!0),r)i=r[s],o||!A(i)||(e=i)&&e.prototype&&e.prototype.isReactComponent||S(i)||(i=i(a)),n.attrs[s]=i,a[s]=i}),a):a},e.prototype.generateAndInjectStyles=function(t,e){var r=e.forwardedComponent,n=r.attrs,a=r.componentStyle;r.warnTooManyClasses;return a.isStatic&&!n.length?a.generateAndInjectStyles(w,this.styleSheet):a.generateAndInjectStyles(this.buildExecutionContext(t,e,n),this.styleSheet)},e}(s.Component);function Zt(t,e,r){var n=S(t),a=!_t(t),o=e.displayName,i=void 0===o?function(t){return _t(t)?"styled."+t:"Styled("+E(t)+")"}(t):o,s=e.componentId,u=void 0===s?function(t,e,r){var n="string"!=typeof e?"sc":Mt(e),a=(Xt[n]||0)+1;Xt[n]=a;var o=n+"-"+t.generateName(n+a);return r?r+"-"+o:o}(St,e.displayName,e.parentComponentId):s,c=e.ParentComponent,f=void 0===c?Kt:c,d=e.attrs,p=void 0===d?C:d,h=e.displayName&&e.componentId?Mt(e.displayName)+"-"+e.componentId:e.componentId||u,m=n&&t.attrs?Array.prototype.concat(t.attrs,p).filter(Boolean):p,g=new St(n?t.componentStyle.rules.concat(r):r,m,h),y=l.a.forwardRef(function(t,e){return l.a.createElement(f,v({},t,{forwardedComponent:y,forwardedRef:e}))});return y.attrs=m,y.componentStyle=g,y.displayName=i,y.foldedComponentIds=n?Array.prototype.concat(t.foldedComponentIds,t.styledComponentId):C,y.styledComponentId=h,y.target=n?t.target:t,y.withComponent=function(t){var n=e.componentId,a=b(e,["componentId"]),o=n&&n+"-"+(_t(t)?t:Mt(E(t)));return Zt(t,v({},a,{attrs:m,componentId:o,ParentComponent:f}),r)},y.toString=function(){return"."+y.styledComponentId},a&&qt(y,t,{attrs:!0,componentStyle:!0,displayName:!0,foldedComponentIds:!0,styledComponentId:!0,target:!0,withComponent:!0}),y}var Qt=function(t){return function t(e,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:w;if(!Object(c.isValidElementType)(r))throw new _(1,String(r));var a=function(){return e(r,n,vt.apply(void 0,arguments))};return a.withConfig=function(a){return t(e,r,v({},n,a))},a.attrs=function(a){return t(e,r,v({},n,{attrs:Array.prototype.concat(n.attrs,a).filter(Boolean)}))},a}(Zt,t)};["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","marquee","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr","circle","clipPath","defs","ellipse","foreignObject","g","image","line","linearGradient","marker","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","svg","text","tspan"].forEach(function(t){Qt[t]=Qt(t)});var Jt=function(){function t(e,r){m(this,t),this.rules=e,this.componentId=r,this.isStatic=Ct(e,C),ct.master.hasId(r)||ct.master.deferredInject(r,[])}return t.prototype.createStyles=function(t,e){var r=W(gt(this.rules,t,e),"");e.inject(this.componentId,r)},t.prototype.removeStyles=function(t){var e=this.componentId;t.hasId(e)&&t.remove(e)},t.prototype.renderStyles=function(t,e){this.removeStyles(e),this.createStyles(t,e)},t}();function te(t){for(var e=arguments.length,r=Array(e>1?e-1:0),n=1;n=0||Object.prototype.hasOwnProperty.call(t,n)&&(r[n]=t[n]);return r}var p,h,m,g=(0,s.default)(u.reducePropsToState,u.handleClientStateChange,u.mapStateOnServer)(function(){return null}),v=(p=g,m=h=function(t){function e(){return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,e),function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}(this,t.apply(this,arguments))}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),e.prototype.shouldComponentUpdate=function(t){return!(0,l.default)(this.props,t)},e.prototype.mapNestedChildrenToProps=function(t,e){if(!e)return null;switch(t.type){case c.TAG_NAMES.SCRIPT:case c.TAG_NAMES.NOSCRIPT:return{innerHTML:e};case c.TAG_NAMES.STYLE:return{cssText:e}}throw new Error("<"+t.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")},e.prototype.flattenArrayTypeChildren=function(t){var e,r=t.child,a=t.arrayTypeChildren,o=t.newChildProps,i=t.nestedChildren;return n({},a,((e={})[r.type]=[].concat(a[r.type]||[],[n({},o,this.mapNestedChildrenToProps(r,i))]),e))},e.prototype.mapObjectTypeChildren=function(t){var e,r,a=t.child,o=t.newProps,i=t.newChildProps,s=t.nestedChildren;switch(a.type){case c.TAG_NAMES.TITLE:return n({},o,((e={})[a.type]=s,e.titleAttributes=n({},i),e));case c.TAG_NAMES.BODY:return n({},o,{bodyAttributes:n({},i)});case c.TAG_NAMES.HTML:return n({},o,{htmlAttributes:n({},i)})}return n({},o,((r={})[a.type]=n({},i),r))},e.prototype.mapArrayTypeChildrenToProps=function(t,e){var r=n({},e);return Object.keys(t).forEach(function(e){var a;r=n({},r,((a={})[e]=t[e],a))}),r},e.prototype.warnOnInvalidChildren=function(t,e){return!0},e.prototype.mapChildrenToProps=function(t,e){var r=this,n={};return o.default.Children.forEach(t,function(t){if(t&&t.props){var a=t.props,o=a.children,i=d(a,["children"]),s=(0,u.convertReactPropstoHtmlAttributes)(i);switch(r.warnOnInvalidChildren(t,o),t.type){case c.TAG_NAMES.LINK:case c.TAG_NAMES.META:case c.TAG_NAMES.NOSCRIPT:case c.TAG_NAMES.SCRIPT:case c.TAG_NAMES.STYLE:n=r.flattenArrayTypeChildren({child:t,arrayTypeChildren:n,newChildProps:s,nestedChildren:o});break;default:e=r.mapObjectTypeChildren({child:t,newProps:e,newChildProps:s,nestedChildren:o})}}}),e=this.mapArrayTypeChildrenToProps(n,e)},e.prototype.render=function(){var t=this.props,e=t.children,r=d(t,["children"]),a=n({},r);return e&&(a=this.mapChildrenToProps(e,a)),o.default.createElement(p,a)},a(e,null,[{key:"canUseDOM",set:function(t){p.canUseDOM=t}}]),e}(o.default.Component),h.propTypes={base:i.default.object,bodyAttributes:i.default.object,children:i.default.oneOfType([i.default.arrayOf(i.default.node),i.default.node]),defaultTitle:i.default.string,defer:i.default.bool,encodeSpecialCharacters:i.default.bool,htmlAttributes:i.default.object,link:i.default.arrayOf(i.default.object),meta:i.default.arrayOf(i.default.object),noscript:i.default.arrayOf(i.default.object),onChangeClientState:i.default.func,script:i.default.arrayOf(i.default.object),style:i.default.arrayOf(i.default.object),title:i.default.string,titleAttributes:i.default.object,titleTemplate:i.default.string},h.defaultProps={defer:!0,encodeSpecialCharacters:!0},h.peek=p.peek,h.rewind=function(){var t=p.rewind();return t||(t=(0,u.mapStateOnServer)({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}})),t},m);v.renderStatic=v.rewind,e.Helmet=v,e.default=v},170:function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default={slide:r(247),stack:r(251),elastic:r(252),bubble:r(255),push:r(256),pushRotate:r(257),scaleDown:r(258),scaleRotate:r(259),fallDown:r(260),reveal:r(261)},t.exports=e.default},171:function(t,e,r){"use strict";var n=r(11),a=r(14),o=r(75),i="".startsWith;n(n.P+n.F*r(76)("startsWith"),"String",{startsWith:function(t){var e=o(this,t,"startsWith"),r=a(Math.min(arguments.length>1?arguments[1]:void 0,e.length)),n=String(t);return i?i.call(e,n,r):e.slice(r,r+n.length)===n}})},173:function(t,e){t.exports=function(t,e){return e||(e=t.slice(0)),t.raw=e,t}},194:function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(){var t=void 0;try{t=r(253)}finally{return t}},t.exports=e.default},195:function(t,e,r){"use strict";t.exports=r(266)},196:function(t,e){e.__esModule=!0;e.ATTRIBUTE_NAMES={BODY:"bodyAttributes",HTML:"htmlAttributes",TITLE:"titleAttributes"};var r=e.TAG_NAMES={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title"},n=(e.VALID_TAG_NAMES=Object.keys(r).map(function(t){return r[t]}),e.TAG_PROPERTIES={CHARSET:"charset",CSS_TEXT:"cssText",HREF:"href",HTTPEQUIV:"http-equiv",INNER_HTML:"innerHTML",ITEM_PROP:"itemprop",NAME:"name",PROPERTY:"property",REL:"rel",SRC:"src"},e.REACT_TAG_MAP={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"});e.HELMET_PROPS={DEFAULT_TITLE:"defaultTitle",DEFER:"defer",ENCODE_SPECIAL_CHARACTERS:"encodeSpecialCharacters",ON_CHANGE_CLIENT_STATE:"onChangeClientState",TITLE_TEMPLATE:"titleTemplate"},e.HTML_TAG_MAP=Object.keys(n).reduce(function(t,e){return t[n[e]]=e,t},{}),e.SELF_CLOSING_TAGS=[r.NOSCRIPT,r.SCRIPT,r.STYLE],e.HELMET_ATTRIBUTE="data-react-helmet"},247:function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n,a=r(163),o=(n=a)&&n.__esModule?n:{default:n};e.default=(0,o.default)({}),t.exports=e.default},248:function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0});e.default={overlay:function(t){return{position:"fixed",zIndex:1e3,width:"100%",height:"100%",background:"rgba(0, 0, 0, 0.3)",opacity:t?1:0,MozTransform:t?"":"translate3d(100%, 0, 0)",MsTransform:t?"":"translate3d(100%, 0, 0)",OTransform:t?"":"translate3d(100%, 0, 0)",WebkitTransform:t?"":"translate3d(100%, 0, 0)",transform:t?"":"translate3d(100%, 0, 0)",transition:t?"opacity 0.3s":"opacity 0.3s, transform 0s 0.3s"}},menuWrap:function(t,e,r){return{position:"fixed",right:r?0:"inherit",zIndex:1100,width:e,height:"100%",MozTransform:t?"":r?"translate3d(100%, 0, 0)":"translate3d(-100%, 0, 0)",MsTransform:t?"":r?"translate3d(100%, 0, 0)":"translate3d(-100%, 0, 0)",OTransform:t?"":r?"translate3d(100%, 0, 0)":"translate3d(-100%, 0, 0)",WebkitTransform:t?"":r?"translate3d(100%, 0, 0)":"translate3d(-100%, 0, 0)",transform:t?"":r?"translate3d(100%, 0, 0)":"translate3d(-100%, 0, 0)",transition:"all 0.5s"}},menu:function(){return{height:"100%",boxSizing:"border-box",overflow:"auto"}},itemList:function(){return{height:"100%"}},item:function(){return{display:"block"}}},t.exports=e.default},249:function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=Object.assign||function(t){for(var e=1;e=1&&(delete r[i],s.s=1,o--,function(e){setTimeout(function(){t("mina.finish."+e.id,e)})}(s)),s.update()}e=!!o&&n(m)}else e||(e=n(m))},g=function(t,e,n,a,s,v,y){var b={id:i+(o++).toString(36),start:t,end:e,b:n,s:0,dur:a-n,spd:1,get:s,set:v,easing:y||g.linear,status:l,speed:u,duration:c,stop:f,pause:d,resume:p,update:h};r[b.id]=b;var x,T=0;for(x in r)if(r.hasOwnProperty(x)&&2==++T)break;return 1==T&&m(),b};return g.time=s,g.getById=function(t){return r[t]||null},g.linear=function(t){return t},g.easeout=function(t){return Math.pow(t,1.7)},g.easein=function(t){return Math.pow(t,.48)},g.easeinout=function(t){if(1==t)return 1;if(0==t)return 0;var e=.48-t/1.04,r=Math.sqrt(.1734+e*e),n=r-e,a=-r-e,o=Math.pow(Math.abs(n),1/3)*(n<0?-1:1)+Math.pow(Math.abs(a),1/3)*(a<0?-1:1)+.5;return 3*(1-o)*o*o+o*o*o},g.backin=function(t){if(1==t)return 1;var e=1.70158;return t*t*((e+1)*t-e)},g.backout=function(t){if(0==t)return 0;var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},g.elastic=function(t){return t==!!t?t:Math.pow(2,-10*t)*Math.sin((t-.075)*(2*Math.PI)/.3)+1},g.bounce=function(t){var e=7.5625,r=2.75;return t<1/r?e*t*t:t<2/r?e*(t-=1.5/r)*t+.75:t<2.5/r?e*(t-=2.25/r)*t+.9375:e*(t-=2.625/r)*t+.984375},window.mina=g,g}("undefined"==typeof eve?function(){}:eve),a=function(t){function e(t,n){if(t){if(t.nodeType)return Y(t);if(M(t,"array")&&e.set)return e.set.apply(e,t);if(t instanceof H)return t;if(null==n)try{return Y(t=r.doc.querySelector(String(t)))}catch(a){return null}}return new U(t=null==t?"100%":t,n=null==n?"100%":n)}e.version="0.5.1",e.toString=function(){return"Snap v"+this.version},e._={};var r={win:t.window,doc:t.window.document};e._.glob=r;var n,a,o="hasOwnProperty",i=String,s=parseFloat,l=parseInt,u=Math,c=u.max,f=u.min,d=u.abs,p=(u.pow,u.PI),h=(u.round,""),m=Object.prototype.toString,v=/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?%?)\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?%?)\s*\))\s*$/i,y=(e._.separator=/[,\s]+/,/[\s]*,[\s]*/),b={hs:1,rg:1},x=/([a-z])[\s,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\s]*,?[\s]*)+)/gi,T=/([rstm])[\s,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\s]*,?[\s]*)+)/gi,C=/(-?\d*\.?\d*(?:e[\-+]?\d+)?)[\s]*,?[\s]*/gi,w=0,A="S"+(+new Date).toString(36),E=function(t){return(t&&t.type?t.type:h)+A+(w++).toString(36)},S="http://www.w3.org/1999/xlink",k="http://www.w3.org/2000/svg",O={};e.url=function(t){return"url('#"+t+"')"};function F(t,e){if(e){if("#text"==t&&(t=r.doc.createTextNode(e.text||e["#text"]||"")),"#comment"==t&&(t=r.doc.createComment(e.text||e["#text"]||"")),"string"==typeof t&&(t=F(t)),"string"==typeof e)return 1==t.nodeType?"xlink:"==e.substring(0,6)?t.getAttributeNS(S,e.substring(6)):"xml:"==e.substring(0,4)?t.getAttributeNS(k,e.substring(4)):t.getAttribute(e):"text"==e?t.nodeValue:null;if(1==t.nodeType){for(var n in e)if(e[o](n)){var a=i(e[n]);a?"xlink:"==n.substring(0,6)?t.setAttributeNS(S,n.substring(6),a):"xml:"==n.substring(0,4)?t.setAttributeNS(k,n.substring(4),a):t.setAttribute(n,a):t.removeAttribute(n)}}else"text"in e&&(t.nodeValue=e.text)}else t=r.doc.createElementNS(k,t);return t}function M(t,e){return"finite"==(e=i.prototype.toLowerCase.call(e))?isFinite(t):!("array"!=e||!(t instanceof Array||Array.isArray&&Array.isArray(t)))||("null"==e&&null===t||e==typeof t&&null!==t||"object"==e&&t===Object(t)||m.call(t).slice(8,-1).toLowerCase()==e)}function _(t,e,r){return function n(){var a=Array.prototype.slice.call(arguments,0),i=a.join("␀"),s=n.cache=n.cache||{},l=n.count=n.count||[];return s[o](i)?(function(t,e){for(var r=0,n=t.length;r=1e3&&delete s[l.shift()],l.push(i),s[i]=t.apply(e,a),r?r(s[i]):s[i])}}function N(t){return t%360*p/180}e._.$=F,e._.id=E,e.format=(n=/\{([^\}]+)\}/g,a=/(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g,function(t,e){return i(t).replace(n,function(t,r){return function(t,e,r){var n=r;return e.replace(a,function(t,e,r,a,o){e=e||a,n&&(e in n&&(n=n[e]),"function"==typeof n&&o&&(n=n()))}),n=(null==n||n==r?t:n)+""}(t,r,e)})}),e._.clone=function t(e){if("function"==typeof e||Object(e)!==e)return e;var r=new e.constructor;for(var n in e)e[o](n)&&(r[n]=t(e[n]));return r},e._.cacher=_,e.rad=N,e.deg=function(t){return 180*t/p%360},e.sin=function(t){return u.sin(e.rad(t))},e.tan=function(t){return u.tan(e.rad(t))},e.cos=function(t){return u.cos(e.rad(t))},e.asin=function(t){return e.deg(u.asin(t))},e.acos=function(t){return e.deg(u.acos(t))},e.atan=function(t){return e.deg(u.atan(t))},e.atan2=function(t){return e.deg(u.atan2(t))},e.angle=function t(e,r,n,a,o,i){if(null==o){var s=e-n,l=r-a;return s||l?(180+180*u.atan2(-l,-s)/p+360)%360:0}return t(e,r,o,i)-t(n,a,o,i)},e.len=function(t,r,n,a){return Math.sqrt(e.len2(t,r,n,a))},e.len2=function(t,e,r,n){return(t-r)*(t-r)+(e-n)*(e-n)},e.closestPoint=function(t,e,r){function n(t){var n=t.x-e,a=t.y-r;return n*n+a*a}for(var a,o,i,s,l=t.node,u=l.getTotalLength(),c=u/l.pathSegList.numberOfItems*.125,f=1/0,d=0;d<=u;d+=c)(s=n(i=l.getPointAtLength(d))).5;){var p,h,m,g,v,y;(m=o-c)>=0&&(v=n(p=l.getPointAtLength(m)))t-r)return e-a+t}return e},e.getRGB=_(function(t){if(!t||(t=i(t)).indexOf("-")+1)return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:B};if("none"==t)return{r:-1,g:-1,b:-1,hex:"none",toString:B};if(!b[o](t.toLowerCase().substring(0,2))&&"#"!=t.charAt()&&(t=I(t)),!t)return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:B};var r,n,a,d,p,h,m=t.match(v);return m?(m[2]&&(a=l(m[2].substring(5),16),n=l(m[2].substring(3,5),16),r=l(m[2].substring(1,3),16)),m[3]&&(a=l((p=m[3].charAt(3))+p,16),n=l((p=m[3].charAt(2))+p,16),r=l((p=m[3].charAt(1))+p,16)),m[4]&&(h=m[4].split(y),r=s(h[0]),"%"==h[0].slice(-1)&&(r*=2.55),n=s(h[1]),"%"==h[1].slice(-1)&&(n*=2.55),a=s(h[2]),"%"==h[2].slice(-1)&&(a*=2.55),"rgba"==m[1].toLowerCase().slice(0,4)&&(d=s(h[3])),h[3]&&"%"==h[3].slice(-1)&&(d/=100)),m[5]?(h=m[5].split(y),r=s(h[0]),"%"==h[0].slice(-1)&&(r/=100),n=s(h[1]),"%"==h[1].slice(-1)&&(n/=100),a=s(h[2]),"%"==h[2].slice(-1)&&(a/=100),("deg"==h[0].slice(-3)||"°"==h[0].slice(-1))&&(r/=360),"hsba"==m[1].toLowerCase().slice(0,4)&&(d=s(h[3])),h[3]&&"%"==h[3].slice(-1)&&(d/=100),e.hsb2rgb(r,n,a,d)):m[6]?(h=m[6].split(y),r=s(h[0]),"%"==h[0].slice(-1)&&(r/=100),n=s(h[1]),"%"==h[1].slice(-1)&&(n/=100),a=s(h[2]),"%"==h[2].slice(-1)&&(a/=100),("deg"==h[0].slice(-3)||"°"==h[0].slice(-1))&&(r/=360),"hsla"==m[1].toLowerCase().slice(0,4)&&(d=s(h[3])),h[3]&&"%"==h[3].slice(-1)&&(d/=100),e.hsl2rgb(r,n,a,d)):(r=f(u.round(r),255),n=f(u.round(n),255),a=f(u.round(a),255),d=f(c(d,0),1),(m={r:r,g:n,b:a,toString:B}).hex="#"+(16777216|a|n<<8|r<<16).toString(16).slice(1),m.opacity=M(d,"finite")?d:1,m)):{r:-1,g:-1,b:-1,hex:"none",error:1,toString:B}},e),e.hsb=_(function(t,r,n){return e.hsb2rgb(t,r,n).hex}),e.hsl=_(function(t,r,n){return e.hsl2rgb(t,r,n).hex}),e.rgb=_(function(t,e,r,n){if(M(n,"finite")){var a=u.round;return"rgba("+[a(t),a(e),a(r),+n.toFixed(2)]+")"}return"#"+(16777216|r|e<<8|t<<16).toString(16).slice(1)});var I=function(t){var e=r.doc.getElementsByTagName("head")[0]||r.doc.getElementsByTagName("svg")[0],n="rgb(255, 0, 0)";return(I=_(function(t){if("red"==t.toLowerCase())return n;e.style.color=n,e.style.color=t;var a=r.doc.defaultView.getComputedStyle(e,h).getPropertyValue("color");return a==n?null:a}))(t)},P=function(){return"hsb("+[this.h,this.s,this.b]+")"},j=function(){return"hsl("+[this.h,this.s,this.l]+")"},B=function(){return 1==this.opacity||null==this.opacity?this.hex:"rgba("+[this.r,this.g,this.b,this.opacity]+")"},R=function(t,r,n){if(null==r&&M(t,"object")&&"r"in t&&"g"in t&&"b"in t&&(n=t.b,r=t.g,t=t.r),null==r&&M(t,string)){var a=e.getRGB(t);t=a.r,r=a.g,n=a.b}return(t>1||r>1||n>1)&&(t/=255,r/=255,n/=255),[t,r,n]},L=function(t,r,n,a){var o={r:t=u.round(255*t),g:r=u.round(255*r),b:n=u.round(255*n),opacity:M(a,"finite")?a:1,hex:e.rgb(t,r,n),toString:B};return M(a,"finite")&&(o.opacity=a),o};e.color=function(t){var r;return M(t,"object")&&"h"in t&&"s"in t&&"b"in t?(r=e.hsb2rgb(t),t.r=r.r,t.g=r.g,t.b=r.b,t.opacity=1,t.hex=r.hex):M(t,"object")&&"h"in t&&"s"in t&&"l"in t?(r=e.hsl2rgb(t),t.r=r.r,t.g=r.g,t.b=r.b,t.opacity=1,t.hex=r.hex):(M(t,"string")&&(t=e.getRGB(t)),M(t,"object")&&"r"in t&&"g"in t&&"b"in t&&!("error"in t)?(r=e.rgb2hsl(t),t.h=r.h,t.s=r.s,t.l=r.l,r=e.rgb2hsb(t),t.v=r.b):((t={hex:"none"}).r=t.g=t.b=t.h=t.s=t.v=t.l=-1,t.error=1)),t.toString=B,t},e.hsb2rgb=function(t,e,r,n){var a,o,i,s,l;return M(t,"object")&&"h"in t&&"s"in t&&"b"in t&&(r=t.b,e=t.s,n=t.o,t=t.h),s=(l=r*e)*(1-d((t=(t*=360)%360/60)%2-1)),a=o=i=r-l,L(a+=[l,s,0,0,s,l][t=~~t],o+=[s,l,l,s,0,0][t],i+=[0,0,s,l,l,s][t],n)},e.hsl2rgb=function(t,e,r,n){var a,o,i,s,l;return M(t,"object")&&"h"in t&&"s"in t&&"l"in t&&(r=t.l,e=t.s,t=t.h),(t>1||e>1||r>1)&&(t/=360,e/=100,r/=100),s=(l=2*e*(r<.5?r:1-r))*(1-d((t=(t*=360)%360/60)%2-1)),a=o=i=r-l/2,L(a+=[l,s,0,0,s,l][t=~~t],o+=[s,l,l,s,0,0][t],i+=[0,0,s,l,l,s][t],n)},e.rgb2hsb=function(t,e,r){var n,a;return t=(r=R(t,e,r))[0],e=r[1],r=r[2],{h:((0==(a=(n=c(t,e,r))-f(t,e,r))?null:n==t?(e-r)/a:n==e?(r-t)/a+2:(t-e)/a+4)+360)%6*60/360,s:0==a?0:a/n,b:n,toString:P}},e.rgb2hsl=function(t,e,r){var n,a,o,i;return t=(r=R(t,e,r))[0],e=r[1],r=r[2],n=((a=c(t,e,r))+(o=f(t,e,r)))/2,{h:((0==(i=a-o)?null:a==t?(e-r)/i:a==e?(r-t)/i+2:(t-e)/i+4)+360)%6*60/360,s:0==i?0:n<.5?i/(2*n):i/(2-2*n),l:n,toString:j}},e.parsePathString=function(t){if(!t)return null;var r=e.path(t);if(r.arr)return e.path.clone(r.arr);var n={a:7,c:6,o:2,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,u:3,z:0},a=[];return M(t,"array")&&M(t[0],"array")&&(a=e.path.clone(t)),a.length||i(t).replace(x,function(t,e,r){var o=[],i=e.toLowerCase();if(r.replace(C,function(t,e){e&&o.push(+e)}),"m"==i&&o.length>2&&(a.push([e].concat(o.splice(0,2))),i="l",e="m"==e?"l":"L"),"o"==i&&1==o.length&&a.push([e,o[0]]),"r"==i)a.push([e].concat(o));else for(;o.length>=n[i]&&(a.push([e].concat(o.splice(0,n[i]))),n[i]););}),a.toString=e.path.toString,r.arr=e.path.clone(a),a};var D=e.parseTransformString=function(t){if(!t)return null;var r=[];return M(t,"array")&&M(t[0],"array")&&(r=e.path.clone(t)),r.length||i(t).replace(T,function(t,e,n){var a=[];e.toLowerCase();n.replace(C,function(t,e){e&&a.push(+e)}),r.push([e].concat(a))}),r.toString=e.path.toString,r};e._.svgTransform2string=function(t){var e=[];return t=t.replace(/(?:^|\s)(\w+)\(([^)]+)\)/g,function(t,r,n){return n=n.split(/\s*,\s*|\s+/),"rotate"==r&&1==n.length&&n.push(0,0),"scale"==r&&(n.length>2?n=n.slice(0,2):2==n.length&&n.push(0,0),1==n.length&&n.push(n[0],0,0)),"skewX"==r?e.push(["m",1,0,u.tan(N(n[0])),1,0,0]):"skewY"==r?e.push(["m",1,u.tan(N(n[0])),0,1,0,0]):e.push([r.charAt(0)].concat(n)),t}),e},e._.rgTransform=/^[a-z][\s]*-?\.?\d/i,e._.transform2matrix=function(t,r){var n=D(t),a=new e.Matrix;if(n)for(var o=0,s=n.length;o1))return eve("snap.util.getattr."+t,this).firstDefined();var l={};l[t]=e,t=l}for(var u in t)t[o](u)&&eve("snap.util.attr."+u,this,t[u]);return this},e.parse=function(t){var e=r.doc.createDocumentFragment(),n=!0,a=r.doc.createElement("div");if((t=i(t)).match(/^\s*<\s*svg(?:\s|>)/)||(t=""+t+"",n=!1),a.innerHTML=t,t=a.getElementsByTagName("svg")[0])if(n)e=t;else for(;t.firstChild;)e.appendChild(t.firstChild);return new q(e)},e.fragment=function(){for(var t=Array.prototype.slice.call(arguments,0),n=r.doc.createDocumentFragment(),a=0,o=t.length;a")}else t&&(e+="/>");return e}}o.data=function(e,r){var n=m[this.id]=m[this.id]||{};if(0==arguments.length)return eve("snap.data.get."+this.id,this,n,null),n;if(1==arguments.length){if(t.is(e,"object")){for(var a in e)e.hasOwnProperty(a)&&this.data(a,e[a]);return this}return eve("snap.data.get."+this.id,this,n[e],e),n[e]}return n[e]=r,eve("snap.data.set."+this.id,this,r,e),this},o.removeData=function(t){return null==t?m[this.id]={}:m[this.id]&&delete m[this.id][t],this},o.outerSVG=o.toString=g(1),o.innerSVG=g(),o.toDataURL=function(){if(window&&window.btoa){var e=this.getBBox(),r=t.format('{contents}',{x:+e.x.toFixed(3),y:+e.y.toFixed(3),width:+e.width.toFixed(3),height:+e.height.toFixed(3),contents:this.outerSVG()});return"data:image/svg+xml;base64,"+btoa(unescape(encodeURIComponent(r)))}},a.prototype.select=o.select,a.prototype.selectAll=o.selectAll}),a.plugin(function(t,e,r,n,a){var o=Object.prototype.toString,i=String,s=Math;function l(t,e,r,n,a,i){if(null==e&&"[object SVGMatrix]"==o.call(t))return this.a=t.a,this.b=t.b,this.c=t.c,this.d=t.d,this.e=t.e,void(this.f=t.f);null!=t?(this.a=+t,this.b=+e,this.c=+r,this.d=+n,this.e=+a,this.f=+i):(this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0)}!function(e){function r(t){return t[0]*t[0]+t[1]*t[1]}function n(t){var e=s.sqrt(r(t));t[0]&&(t[0]/=e),t[1]&&(t[1]/=e)}e.add=function(t,e,r,n,a,o){if(t&&t instanceof l)return this.add(t.a,t.b,t.c,t.d,t.e,t.f);var i=t*this.a+e*this.c,s=t*this.b+e*this.d;return this.e+=a*this.a+o*this.c,this.f+=a*this.b+o*this.d,this.c=r*this.a+n*this.c,this.d=r*this.b+n*this.d,this.a=i,this.b=s,this},l.prototype.multLeft=function(t,e,r,n,a,o){if(t&&t instanceof l)return this.multLeft(t.a,t.b,t.c,t.d,t.e,t.f);var i=t*this.a+r*this.b,s=t*this.c+r*this.d,u=t*this.e+r*this.f+a;return this.b=e*this.a+n*this.b,this.d=e*this.c+n*this.d,this.f=e*this.e+n*this.f+o,this.a=i,this.c=s,this.e=u,this},e.invert=function(){var t=this,e=t.a*t.d-t.b*t.c;return new l(t.d/e,-t.b/e,-t.c/e,t.a/e,(t.c*t.f-t.d*t.e)/e,(t.b*t.e-t.a*t.f)/e)},e.clone=function(){return new l(this.a,this.b,this.c,this.d,this.e,this.f)},e.translate=function(t,e){return this.e+=t*this.a+e*this.c,this.f+=t*this.b+e*this.d,this},e.scale=function(t,e,r,n){return null==e&&(e=t),(r||n)&&this.translate(r,n),this.a*=t,this.b*=t,this.c*=e,this.d*=e,(r||n)&&this.translate(-r,-n),this},e.rotate=function(e,r,n){e=t.rad(e),r=r||0,n=n||0;var a=+s.cos(e).toFixed(9),o=+s.sin(e).toFixed(9);return this.add(a,o,-o,a,r,n),this.add(1,0,0,1,-r,-n)},e.skewX=function(t){return this.skew(t,0)},e.skewY=function(t){return this.skew(0,t)},e.skew=function(e,r){e=e||0,r=r||0,e=t.rad(e),r=t.rad(r);var n=s.tan(e).toFixed(9),a=s.tan(r).toFixed(9);return this.add(1,a,n,1,0,0)},e.x=function(t,e){return t*this.a+e*this.c+this.e},e.y=function(t,e){return t*this.b+e*this.d+this.f},e.get=function(t){return+this[i.fromCharCode(97+t)].toFixed(4)},e.toString=function(){return"matrix("+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)].join()+")"},e.offset=function(){return[this.e.toFixed(4),this.f.toFixed(4)]},e.determinant=function(){return this.a*this.d-this.b*this.c},e.split=function(){var e={};e.dx=this.e,e.dy=this.f;var a=[[this.a,this.b],[this.c,this.d]];e.scalex=s.sqrt(r(a[0])),n(a[0]),e.shear=a[0][0]*a[1][0]+a[0][1]*a[1][1],a[1]=[a[1][0]-a[0][0]*e.shear,a[1][1]-a[0][1]*e.shear],e.scaley=s.sqrt(r(a[1])),n(a[1]),e.shear/=e.scaley,this.determinant()<0&&(e.scalex=-e.scalex);var o=a[0][1],i=a[1][1];return i<0?(e.rotate=t.deg(s.acos(i)),o<0&&(e.rotate=360-e.rotate)):e.rotate=t.deg(s.asin(o)),e.isSimple=!(+e.shear.toFixed(9)||e.scalex.toFixed(9)!=e.scaley.toFixed(9)&&e.rotate),e.isSuperSimple=!+e.shear.toFixed(9)&&e.scalex.toFixed(9)==e.scaley.toFixed(9)&&!e.rotate,e.noRotation=!+e.shear.toFixed(9)&&!e.rotate,e},e.toTransformString=function(t){var e=t||this.split();return+e.shear.toFixed(9)?"m"+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)]:(e.scalex=+e.scalex.toFixed(4),e.scaley=+e.scaley.toFixed(4),e.rotate=+e.rotate.toFixed(4),(e.dx||e.dy?"t"+[+e.dx.toFixed(4),+e.dy.toFixed(4)]:"")+(e.rotate?"r"+[+e.rotate.toFixed(4),0,0]:"")+(1!=e.scalex||1!=e.scaley?"s"+[e.scalex,e.scaley,0,0]:""))}}(l.prototype),t.Matrix=l,t.matrix=function(t,e,r,n,a,o){return new l(t,e,r,n,a,o)}}),a.plugin(function(t,e,r,n,a){var o,i=t._.make,s=t._.wrap,l=t.is,u=t._.getSomeDefs,c=/^url\((['"]?)([^)]+)\1\)$/,f=t._.$,d=t.url,p=String,h=t._.separator,m="";function g(r){return function(n){if(eve.stop(),n instanceof a&&1==n.node.childNodes.length&&("radialGradient"==n.node.firstChild.tagName||"linearGradient"==n.node.firstChild.tagName||"pattern"==n.node.firstChild.tagName)&&(n=n.node.firstChild,u(this).appendChild(n),n=s(n)),n instanceof e)if("radialGradient"==n.type||"linearGradient"==n.type||"pattern"==n.type){n.node.id||f(n.node,{id:n.id});var o=d(n.node.id)}else o=n.attr(r);else if((o=t.color(n)).error){var i=t(u(this).ownerSVGElement).gradient(n);i?(i.node.id||f(i.node,{id:i.id}),o=d(i.node.id)):o=n}else o=p(o);var l={};l[r]=o,f(this.node,l),this.node.style[r]=m}}t.deurl=function(t){var e=String(t).match(c);return e?e[2]:t},eve.on("snap.util.attr.mask",function(t){if(t instanceof e||t instanceof a){if(eve.stop(),t instanceof a&&1==t.node.childNodes.length&&(t=t.node.firstChild,u(this).appendChild(t),t=s(t)),"mask"==t.type)var r=t;else(r=i("mask",u(this))).node.appendChild(t.node);!r.node.id&&f(r.node,{id:r.id}),f(this.node,{mask:d(r.id)})}}),o=function(t){if(t instanceof e||t instanceof a){eve.stop();for(var r,n=t.node;n;){if("clipPath"===n.nodeName){r=new e(n);break}if("svg"===n.nodeName){r=void 0;break}n=n.parentNode}r||((r=i("clipPath",u(this))).node.appendChild(t.node),!r.node.id&&f(r.node,{id:r.id})),f(this.node,{"clip-path":d(r.node.id||r.id)})}},eve.on("snap.util.attr.clip",o),eve.on("snap.util.attr.clip-path",o),eve.on("snap.util.attr.clipPath",o),eve.on("snap.util.attr.fill",g("fill")),eve.on("snap.util.attr.stroke",g("stroke"));var v=/^([lr])(?:\(([^)]*)\))?(.*)$/i;function y(t){eve.stop(),t==+t&&(t+="px"),this.node.style.fontSize=t}function b(){return eve.stop(),this.node.style.fontSize}eve.on("snap.util.grad.parse",function(t){var e=(t=p(t)).match(v);if(!e)return null;var r=e[1],n=e[2],a=e[3];1==(n=n.split(/\s*,\s*/).map(function(t){return+t==t?+t:t})).length&&0==n[0]&&(n=[]);var o=(a=(a=a.split("-")).map(function(t){var e={color:(t=t.split(":"))[0]};return t[1]&&(e.offset=parseFloat(t[1])),e})).length,i=0,s=0;function l(t,e){for(var r=(e-i)/(t-s),n=s;n1&&(t=Array.prototype.slice.call(arguments,0));var e={};return i(t,"object")&&!i(t,"array")?e=t:null!=t&&(e={points:t}),this.el("polyline",e)},o.polygon=function(t){arguments.length>1&&(t=Array.prototype.slice.call(arguments,0));var e={};return i(t,"object")&&!i(t,"array")?e=t:null!=t&&(e={points:t}),this.el("polygon",e)},function(){var e=t._.$;function r(){return this.selectAll("stop")}function n(r,n){var a=e("stop"),o={offset:+n+"%"};r=t.color(r),o["stop-color"]=r.hex,r.opacity<1&&(o["stop-opacity"]=r.opacity),e(a,o);for(var i,s=this.stops(),l=0;ln){this.node.insertBefore(a,s[l].node),i=!0;break}}return i||this.node.appendChild(a),this}function a(){if("linearGradient"==this.type){var r=e(this.node,"x1")||0,n=e(this.node,"x2")||1,a=e(this.node,"y1")||0,o=e(this.node,"y2")||0;return t._.box(r,a,math.abs(n-r),math.abs(o-a))}var i=this.node.cx||.5,s=this.node.cy||.5,l=this.node.r||0;return t._.box(i-l,s-l,2*l,2*l)}function i(e){var r=e,n=this.stops();if("string"==typeof e&&(r=eve("snap.util.grad.parse",null,"l(0,0,0,1)"+e).firstDefined().stops),t.is(r,"array")){for(var a=0;a.01;)u=M(t,e,r,n,a,o,i,s,f+=(uo){if(n&&!p.start){if(d+=["C"+a((f=x(s,l,u[1],u[2],u[3],u[4],u[5],u[6],o-h)).start.x),a(f.start.y),a(f.m.x),a(f.m.y),a(f.x),a(f.y)],i)return d;p.start=d,d=["M"+a(f.x),a(f.y)+"C"+a(f.n.x),a(f.n.y),a(f.end.x),a(f.end.y),a(u[5]),a(u[6])].join(),h+=c,s=+u[5],l=+u[6];continue}if(!r&&!n)return f=x(s,l,u[1],u[2],u[3],u[4],u[5],u[6],o-h)}h+=c,s=+u[5],l=+u[6]}d+=u.shift()+u}return p.end=d,f=r?h:n?p:E(s,l,u[0],u[1],u[2],u[3],u[4],u[5],1)},null,t._.clone)}var C=T(1),w=T(),A=T(0,1);function E(t,e,r,n,a,o,i,s,l){var u=1-l,d=h(u,3),p=h(u,2),m=l*l,g=m*l,v=t+2*l*(r-t)+m*(a-2*r+t),y=e+2*l*(n-e)+m*(o-2*n+e),b=r+2*l*(a-r)+m*(i-2*a+r),x=n+2*l*(o-n)+m*(s-2*o+n);return{x:d*t+3*p*l*r+3*u*l*l*a+g*i,y:d*e+3*p*l*n+3*u*l*l*o+g*s,m:{x:v,y:y},n:{x:b,y:x},start:{x:u*t+l*r,y:u*e+l*n},end:{x:u*a+l*i,y:u*o+l*s},alpha:90-180*c.atan2(v-b,y-x)/f}}function S(e,r,n,a,o,i,s,l){t.is(e,"array")||(e=[e,r,n,a,o,i,s,l]);var u=H.apply(null,e);return v(u.min.x,u.min.y,u.max.x-u.min.x,u.max.y-u.min.y)}function k(t,e,r){return e>=t.x&&e<=t.x+t.width&&r>=t.y&&r<=t.y+t.height}function O(t,e){return t=v(t),k(e=v(e),t.x,t.y)||k(e,t.x2,t.y)||k(e,t.x,t.y2)||k(e,t.x2,t.y2)||k(t,e.x,e.y)||k(t,e.x2,e.y)||k(t,e.x,e.y2)||k(t,e.x2,e.y2)||(t.xe.x||e.xt.x)&&(t.ye.y||e.yt.y)}function F(t,e,r,n,a){return t*(t*(-3*e+9*r-9*n+3*a)+6*e-12*r+6*n)-3*e+3*r}function M(t,e,r,n,a,o,i,s,l){null==l&&(l=1);for(var u=(l=l>1?1:l<0?0:l)/2,f=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],d=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],p=0,h=0;h<12;h++){var m=u*f[h]+u,g=F(m,t,r,a,i),v=F(m,e,n,o,s),y=g*g+v*v;p+=d[h]*c.sqrt(y)}return u*p}function _(t,e,r,n,a,o,i,s){if(!(p(t,r)p(a,i)||p(e,n)p(o,s))){var l=(t-r)*(o-s)-(e-n)*(a-i);if(l){var u=((t*n-e*r)*(a-i)-(t-r)*(a*s-o*i))/l,c=((t*n-e*r)*(o-s)-(e-n)*(a*s-o*i))/l,f=+u.toFixed(2),h=+c.toFixed(2);if(!(f<+d(t,r).toFixed(2)||f>+p(t,r).toFixed(2)||f<+d(a,i).toFixed(2)||f>+p(a,i).toFixed(2)||h<+d(e,n).toFixed(2)||h>+p(e,n).toFixed(2)||h<+d(o,s).toFixed(2)||h>+p(o,s).toFixed(2)))return{x:u,y:c}}}}function N(t,e,r){if(!O(S(t),S(e)))return r?0:[];for(var n=~~(M.apply(0,t)/8),a=~~(M.apply(0,e)/8),o=[],i=[],s={},l=r?0:[],u=0;u=0&&x<=1&&T>=0&&T<=1&&(r?l++:l.push({x:b.x,y:b.y,t1:x,t2:T}))}}return l}function I(t,e,r){t=q(t),e=q(e);for(var n,a,o,i,s,l,u,c,f,d,p=r?0:[],h=0,m=t.length;h180),0,s,e+r*Math.sin(-a*o)]];else l=[["M",t,e],["m",0,-n],["a",r,n,0,1,1,0,2*n],["a",r,n,0,1,1,0,-2*n],["z"]];return l.toString=y,l}var R=t._unit2px,L={path:function(t){return t.attr("path")},circle:function(t){var e=R(t);return B(e.cx,e.cy,e.r)},ellipse:function(t){var e=R(t);return B(e.cx||0,e.cy||0,e.rx,e.ry)},rect:function(t){var e=R(t);return j(e.x||0,e.y||0,e.width,e.height,e.rx,e.ry)},image:function(t){var e=R(t);return j(e.x||0,e.y||0,e.width,e.height)},line:function(t){return"M"+[t.attr("x1")||0,t.attr("y1")||0,t.attr("x2"),t.attr("y2")]},polyline:function(t){return"M"+t.attr("points")},polygon:function(t){return"M"+t.attr("points")+"z"},deflt:function(t){var e=t.node.getBBox();return j(e.x,e.y,e.width,e.height)}};function D(e){var r=g(e);if(r.abs)return b(r.abs);if(o(e,"array")&&o(e&&e[0],"array")||(e=t.parsePathString(e)),!e||!e.length)return[["M",0,0]];var n,a=[],i=0,s=0,l=0,u=0,c=0;"M"==e[0][0]&&(l=i=+e[0][1],u=s=+e[0][2],c++,a[0]=["M",i,s]);for(var f,d,p=3==e.length&&"M"==e[0][0]&&"R"==e[1][0].toUpperCase()&&"Z"==e[2][0].toUpperCase(),h=c,m=e.length;h1&&(a*=C=c.sqrt(C),o*=C);var w=a*a,A=o*o,E=(s==l?-1:1)*c.sqrt(m((w*A-w*T*T-A*x*x)/(w*T*T+A*x*x))),S=E*a*T/o+(r+u)/2,k=E*-o*x/a+(n+d)/2,O=c.asin(((n-k)/o).toFixed(9)),F=c.asin(((d-k)/o).toFixed(9));(O=rF&&(O-=2*f),!l&&F>O&&(F-=2*f)}var M=F-O;if(m(M)>g){var _=F,N=u,I=d;F=O+g*(l&&F>O?1:-1),y=e(u=S+a*c.cos(F),d=k+o*c.sin(F),a,o,i,0,l,N,I,[F,_,S,k])}M=F-O;var P=c.cos(O),j=c.sin(O),B=c.cos(F),R=c.sin(F),L=c.tan(M/4),D=4/3*a*L,G=4/3*o*L,z=[r,n],H=[r+D*j,n-G*P],q=[u+D*R,d-G*B],W=[u,d];if(H[0]=2*z[0]-H[0],H[1]=2*z[1]-H[1],p)return[H,q,W].concat(y);for(var U=[],Y=0,$=(y=[H,q,W].concat(y).join().split(",")).length;Y<$;Y++)U[Y]=Y%2?b(y[Y-1],y[Y],v).y:b(y[Y],y[Y+1],v).x;return U}.apply(0,[r.x,r.y].concat(e.slice(1))));break;case"S":"C"==n||"S"==n?(a=2*r.x-r.bx,o=2*r.y-r.by):(a=r.x,o=r.y),e=["C",a,o].concat(e.slice(1));break;case"T":"Q"==n||"T"==n?(r.qx=2*r.x-r.qx,r.qy=2*r.y-r.qy):(r.qx=r.x,r.qy=r.y),e=["C"].concat(z(r.x,r.y,r.qx,r.qy,e[1],e[2]));break;case"Q":r.qx=e[1],r.qy=e[2],e=["C"].concat(z(r.x,r.y,e[1],e[2],e[3],e[4]));break;case"L":e=["C"].concat(G(r.x,r.y,e[1],e[2]));break;case"H":e=["C"].concat(G(r.x,r.y,e[1],r.y));break;case"V":e=["C"].concat(G(r.x,r.y,r.x,e[1]));break;case"Z":e=["C"].concat(G(r.x,r.y,r.X,r.Y))}return e},d=function(t,e){if(t[e].length>7){t[e].shift();for(var r=t[e];r.length;)v[e]="A",o&&(y[e]="A"),t.splice(e++,0,["C"].concat(r.splice(0,6)));t.splice(e,1),w=p(a.length,o&&o.length||0)}},h=function(t,e,r,n,i){t&&e&&"M"==t[i][0]&&"M"!=e[i][0]&&(e.splice(i,0,["M",n.x,n.y]),r.bx=0,r.by=0,r.x=t[i][1],r.y=t[i][2],w=p(a.length,o&&o.length||0))},v=[],y=[],x="",T="",C=0,w=p(a.length,o&&o.length||0);Cn;n+=2){var o=[{x:+t[n-2],y:+t[n-1]},{x:+t[n],y:+t[n+1]},{x:+t[n+2],y:+t[n+3]},{x:+t[n+4],y:+t[n+5]}];e?n?a-4==n?o[3]={x:+t[0],y:+t[1]}:a-2==n&&(o[2]={x:+t[0],y:+t[1]},o[3]={x:+t[2],y:+t[3]}):o[0]={x:+t[a-2],y:+t[a-1]}:a-4==n?o[3]=o[2]:n||(o[0]={x:+t[n],y:+t[n+1]}),r.push(["C",(-o[0].x+6*o[1].x+o[2].x)/6,(-o[0].y+6*o[1].y+o[2].y)/6,(o[1].x+6*o[2].x-o[3].x)/6,(o[1].y+6*o[2].y-o[3].y)/6,o[2].x,o[2].y])}return r}t.path=g,t.path.getTotalLength=C,t.path.getPointAtLength=w,t.path.getSubpath=function(t,e,r){if(this.getTotalLength(t)-r<1e-6)return A(t,e).end;var n=A(t,r,1);return e?A(n,e).end:n},a.getTotalLength=function(){if(this.node.getTotalLength)return this.node.getTotalLength()},a.getPointAtLength=function(t){return w(this.attr("d"),t)},a.getSubpath=function(e,r){return t.path.getSubpath(this.attr("d"),e,r)},t._.box=v,t.path.findDotsAtSegment=E,t.path.bezierBBox=S,t.path.isPointInsideBBox=k,t.closest=function(e,r,n,a){for(var o=100,i=v(e-o/2,r-o/2,o,o),s=[],l=n[0].hasOwnProperty("x")?function(t){return{x:n[t].x,y:n[t].y}}:function(t){return{x:n[t],y:a[t]}},u=0;o<=1e6&&!u;){for(var c=0,f=n.length;cm&&(h=m,s[c].len=m,p=s[c])}return p}},t.path.isBBoxIntersect=O,t.path.intersection=function(t,e){return I(t,e)},t.path.intersectionNumber=function(t,e){return I(t,e,1)},t.path.isPointInside=function(t,e,r){var n=P(t);return k(n,e,r)&&I(t,[["M",e,r],["H",n.x2+10]],1)%2==1},t.path.getBBox=P,t.path.get=L,t.path.toRelative=function(e){var r=g(e),n=String.prototype.toLowerCase;if(r.rel)return b(r.rel);t.is(e,"array")&&t.is(e&&e[0],"array")||(e=t.parsePathString(e));var a=[],o=0,i=0,s=0,l=0,u=0;"M"==e[0][0]&&(s=o=e[0][1],l=i=e[0][2],u++,a.push(["M",o,i]));for(var c=u,f=e.length;c',{def:n})},t.filter.blur.toString=function(){return this()},t.filter.shadow=function(e,r,n,a,o){return null==o&&(null==a?(o=n,n=4,a="#000"):(o=a,a=n,n=4)),null==n&&(n=4),null==o&&(o=1),null==e&&(e=0,r=2),null==r&&(r=e),a=t.color(a),t.format('',{color:a,dx:e,dy:r,blur:n,opacity:o})},t.filter.shadow.toString=function(){return this()},t.filter.grayscale=function(e){return null==e&&(e=1),t.format('',{a:.2126+.7874*(1-e),b:.7152-.7152*(1-e),c:.0722-.0722*(1-e),d:.2126-.2126*(1-e),e:.7152+.2848*(1-e),f:.0722-.0722*(1-e),g:.2126-.2126*(1-e),h:.0722+.9278*(1-e)})},t.filter.grayscale.toString=function(){return this()},t.filter.sepia=function(e){return null==e&&(e=1),t.format('',{a:.393+.607*(1-e),b:.769-.769*(1-e),c:.189-.189*(1-e),d:.349-.349*(1-e),e:.686+.314*(1-e),f:.168-.168*(1-e),g:.272-.272*(1-e),h:.534-.534*(1-e),i:.131+.869*(1-e)})},t.filter.sepia.toString=function(){return this()},t.filter.saturate=function(e){return null==e&&(e=1),t.format('',{amount:1-e})},t.filter.saturate.toString=function(){return this()},t.filter.hueRotate=function(e){return e=e||0,t.format('',{angle:e})},t.filter.hueRotate.toString=function(){return this()},t.filter.invert=function(e){return null==e&&(e=1),t.format('',{amount:e,amount2:1-e})},t.filter.invert.toString=function(){return this()},t.filter.brightness=function(e){return null==e&&(e=1),t.format('',{amount:e})},t.filter.brightness.toString=function(){return this()},t.filter.contrast=function(e){return null==e&&(e=1),t.format('',{amount:e,amount2:.5-e/2})},t.filter.contrast.toString=function(){return this()}}),a.plugin(function(t,e,r,n,a){var o=t._.box,i=t.is,s=/^[^a-z]*([tbmlrc])/i,l=function(){return"T"+this.dx+","+this.dy};e.prototype.getAlign=function(t,e){null==e&&i(t,"string")&&(e=t,t=null);var r=(t=t||this.paper).getBBox?t.getBBox():o(t),n=this.getBBox(),a={};switch(e=(e=e&&e.match(s))?e[1].toLowerCase():"c"){case"t":a.dx=0,a.dy=r.y-n.y;break;case"b":a.dx=0,a.dy=r.y2-n.y2;break;case"m":a.dx=0,a.dy=r.cy-n.cy;break;case"l":a.dx=r.x-n.x,a.dy=0;break;case"r":a.dx=r.x2-n.x2,a.dy=0;break;default:a.dx=r.cx-n.cx,a.dy=0}return a.toString=l,a},e.prototype.align=function(t,e){return this.transform("..."+this.getAlign(t,e))}}),a.plugin(function(t,e,r,a,o){var i=e.prototype,s=t.is,l=String,u="hasOwnProperty";function c(t,e,r){return function(n){var a=n.slice(t,e);return 1==a.length&&(a=a[0]),r?r(a):a}}var f=function(t,e,r,a){"function"!=typeof r||r.length||(a=r,r=n.linear),this.attr=t,this.dur=e,r&&(this.easing=r),a&&(this.callback=a)};t._.Animation=f,t.animation=function(t,e,r,n){return new f(t,e,r,n)},i.inAnim=function(){var t=[];for(var e in this.anims)this.anims[u](e)&&function(e){t.push({anim:new f(e._attrs,e.dur,e.easing,e._callback),mina:e,curStatus:e.status(),status:function(t){return e.status(t)},stop:function(){e.stop()}})}(this.anims[e]);return t},t.animate=function(t,e,r,a,o,i){"function"!=typeof o||o.length||(i=o,o=n.linear);var s=n.time(),l=n(t,e,s,s+a,n.time,r,o);return i&&eve.once("mina.finish."+l.id,i),l},i.stop=function(){for(var t=this.inAnim(),e=0,r=t.length;e1)for(var n=0,a=r.length;nn-1||(t.animate({path:r[e]},0===e?400:500,0===e?a.easein:a.elastic,function(){o()}),e++)}()}},morphShape:function(t,e,r){return{position:"absolute",width:"100%",height:"100%",right:r?"inherit":0,left:r?0:"inherit",MozTransform:r?"rotateY(180deg)":"rotateY(0deg)",MsTransform:r?"rotateY(180deg)":"rotateY(0deg)",OTransform:r?"rotateY(180deg)":"rotateY(0deg)",WebkitTransform:r?"rotateY(180deg)":"rotateY(0deg)",transform:r?"rotateY(180deg)":"rotateY(0deg)"}},menuWrap:function(t,e,r){return{MozTransform:t?"translate3d(0, 0, 0)":r?"translate3d(100%, 0, 0)":"translate3d(-100%, 0, 0)",MsTransform:t?"translate3d(0, 0, 0)":r?"translate3d(100%, 0, 0)":"translate3d(-100%, 0, 0)",OTransform:t?"translate3d(0, 0, 0)":r?"translate3d(100%, 0, 0)":"translate3d(-100%, 0, 0)",WebkitTransform:t?"translate3d(0, 0, 0)":r?"translate3d(100%, 0, 0)":"translate3d(-100%, 0, 0)",transform:t?"translate3d(0, 0, 0)":r?"translate3d(100%, 0, 0)":"translate3d(-100%, 0, 0)",transition:t?"transform 0.4s 0s":"transform 0.4s"}},menu:function(t,e,r){return e-=140,{position:"fixed",MozTransform:t?"":r?"translate3d("+e+", 0, 0)":"translate3d(-"+e+", 0, 0)",MsTransform:t?"":r?"translate3d("+e+", 0, 0)":"translate3d(-"+e+", 0, 0)",OTransform:t?"":r?"translate3d("+e+", 0, 0)":"translate3d(-"+e+", 0, 0)",WebkitTransform:t?"":r?"translate3d("+e+", 0, 0)":"translate3d(-"+e+", 0, 0)",transform:t?"":r?"translate3d("+e+", 0, 0)":"translate3d(-"+e+", 0, 0)",transition:t?"opacity 0.1s 0.4s cubic-bezier(.17, .67, .1, 1.27), transform 0.1s 0.4s cubic-bezier(.17, .67, .1, 1.27)":"opacity 0s 0.3s cubic-bezier(.17, .67, .1, 1.27), transform 0s 0.3s cubic-bezier(.17, .67, .1, 1.27)",opacity:t?1:0}},item:function(t,e,r,n){return e-=140,{MozTransform:t?"translate3d(0, 0, 0)":r?"translate3d("+e+", 0, 0)":"translate3d(-"+e+", 0, 0)",MsTransform:t?"translate3d(0, 0, 0)":r?"translate3d("+e+", 0, 0)":"translate3d(-"+e+", 0, 0)",OTransform:t?"translate3d(0, 0, 0)":r?"translate3d("+e+", 0, 0)":"translate3d(-"+e+", 0, 0)",WebkitTransform:t?"translate3d(0, 0, 0)":r?"translate3d("+e+", 0, 0)":"translate3d(-"+e+", 0, 0)",transform:t?"translate3d(0, 0, 0)":r?"translate3d("+e+", 0, 0)":"translate3d(-"+e+", 0, 0)",transition:t?"opacity 0.3s 0.4s, transform 0.3s 0.4s":"opacity 0s 0.3s cubic-bezier(.17, .67, .1, 1.27), transform 0s 0.3s cubic-bezier(.17, .67, .1, 1.27)",opacity:t?1:0}},closeButton:function(t,e,r){return e-=140,{MozTransform:t?"translate3d(0, 0, 0)":r?"translate3d("+e+", 0, 0)":"translate3d(-"+e+", 0, 0)",MsTransform:t?"translate3d(0, 0, 0)":r?"translate3d("+e+", 0, 0)":"translate3d(-"+e+", 0, 0)",OTransform:t?"translate3d(0, 0, 0)":r?"translate3d("+e+", 0, 0)":"translate3d(-"+e+", 0, 0)",WebkitTransform:t?"translate3d(0, 0, 0)":r?"translate3d("+e+", 0, 0)":"translate3d(-"+e+", 0, 0)",transform:t?"translate3d(0, 0, 0)":r?"translate3d("+e+", 0, 0)":"translate3d(-"+e+", 0, 0)",transition:t?"opacity 0.3s 0.4s cubic-bezier(.17, .67, .1, 1.27), transform 0.3s 0.4s cubic-bezier(.17, .67, .1, 1.27)":"opacity 0s 0.3s cubic-bezier(.17, .67, .1, 1.27), transform 0s 0.3s cubic-bezier(.17, .67, .1, 1.27)",opacity:t?1:0}}};e.default=(0,o.default)(i),t.exports=e.default},256:function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n,a=r(163),o=(n=a)&&n.__esModule?n:{default:n};e.default=(0,o.default)({pageWrap:function(t,e,r){return{MozTransform:t?"":r?"translate3d(-"+e+", 0, 0)":"translate3d("+e+", 0, 0)",MsTransform:t?"":r?"translate3d(-"+e+", 0, 0)":"translate3d("+e+", 0, 0)",OTransform:t?"":r?"translate3d(-"+e+", 0, 0)":"translate3d("+e+", 0, 0)",WebkitTransform:t?"":r?"translate3d(-"+e+", 0, 0)":"translate3d("+e+", 0, 0)",transform:t?"":r?"translate3d(-"+e+", 0, 0)":"translate3d("+e+", 0, 0)",transition:"all 0.5s"}},outerContainer:function(t){return{overflow:t?"":"hidden"}}}),t.exports=e.default},257:function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n,a=r(163),o=(n=a)&&n.__esModule?n:{default:n};e.default=(0,o.default)({pageWrap:function(t,e,r){return{MozTransform:t?"":r?"translate3d(-"+e+", 0, 0) rotateY(15deg)":"translate3d("+e+", 0, 0) rotateY(-15deg)",MsTransform:t?"":r?"translate3d(-"+e+", 0, 0) rotateY(15deg)":"translate3d("+e+", 0, 0) rotateY(-15deg)",OTransform:t?"":r?"translate3d(-"+e+", 0, 0) rotateY(15deg)":"translate3d("+e+", 0, 0) rotateY(-15deg)",WebkitTransform:t?"":r?"translate3d(-"+e+", 0, 0) rotateY(15deg)":"translate3d("+e+", 0, 0) rotateY(-15deg)",transform:t?"":r?"translate3d(-"+e+", 0, 0) rotateY(15deg)":"translate3d("+e+", 0, 0) rotateY(-15deg)",transformOrigin:r?"100% 50%":"0% 50%",transformStyle:"preserve-3d",transition:"all 0.5s"}},outerContainer:function(t){return{perspective:"1500px",overflow:t?"":"hidden"}}}),t.exports=e.default},258:function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n,a=r(163),o=(n=a)&&n.__esModule?n:{default:n};e.default=(0,o.default)({pageWrap:function(t,e){return{MozTransform:t?"":"translate3d(0, 0, -"+e+")",MsTransform:t?"":"translate3d(0, 0, -"+e+")",OTransform:t?"":"translate3d(0, 0, -"+e+")",WebkitTransform:t?"":"translate3d(0, 0, -"+e+")",transform:t?"":"translate3d(0, 0, -"+e+")",transformOrigin:"100%",transformStyle:"preserve-3d",transition:"all 0.5s"}},outerContainer:function(){return{perspective:"1500px"}}}),t.exports=e.default},259:function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n,a=r(163),o=(n=a)&&n.__esModule?n:{default:n};e.default=(0,o.default)({pageWrap:function(t,e,r){return{MozTransform:t?"":r?"translate3d(-100px, 0, -600px) rotateY(20deg)":"translate3d(100px, 0, -600px) rotateY(-20deg)",MsTransform:t?"":r?"translate3d(-100px, 0, -600px) rotateY(20deg)":"translate3d(100px, 0, -600px) rotateY(-20deg)",OTransform:t?"":r?"translate3d(-100px, 0, -600px) rotateY(20deg)":"translate3d(100px, 0, -600px) rotateY(-20deg)",WebkitTransform:t?"":r?"translate3d(-100px, 0, -600px) rotateY(20deg)":"translate3d(100px, 0, -600px) rotateY(-20deg)",transform:t?"":r?"translate3d(-100px, 0, -600px) rotateY(20deg)":"translate3d(100px, 0, -600px) rotateY(-20deg)",transformStyle:"preserve-3d",transition:"all 0.5s",overflow:t?"":"hidden"}},outerContainer:function(t){return{perspective:"1500px",overflow:t?"":"hidden"}}}),t.exports=e.default},260:function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n,a=r(163),o=(n=a)&&n.__esModule?n:{default:n};e.default=(0,o.default)({menuWrap:function(t){return{MozTransform:t?"":"translate3d(0, -100%, 0)",MsTransform:t?"":"translate3d(0, -100%, 0)",OTransform:t?"":"translate3d(0, -100%, 0)",WebkitTransform:t?"":"translate3d(0, -100%, 0)",transform:t?"":"translate3d(0, -100%, 0)",transition:"all 0.5s ease-in-out"}},pageWrap:function(t,e,r){return{MozTransform:t?"":r?"translate3d(-"+e+", 0, 0)":"translate3d("+e+", 0, 0)",MsTransform:t?"":r?"translate3d(-"+e+", 0, 0)":"translate3d("+e+", 0, 0)",OTransform:t?"":r?"translate3d(-"+e+", 0, 0)":"translate3d("+e+", 0, 0)",WebkitTransform:t?"":r?"translate3d(-"+e+", 0, 0)":"translate3d("+e+", 0, 0)",transform:t?"":r?"translate3d(-"+e+", 0, 0)":"translate3d("+e+", 0, 0)",transition:"all 0.5s"}},outerContainer:function(t){return{perspective:"1500px",perspectiveOrigin:"0% 50%",overflow:t?"":"hidden"}}}),t.exports=e.default},261:function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n,a=r(163),o=(n=a)&&n.__esModule?n:{default:n};e.default=(0,o.default)({menuWrap:function(t,e,r){return{visibility:t?"visible":"hidden",MozTransform:"translate3d(0, 0, 0)",MsTransform:"translate3d(0, 0, 0)",OTransform:"translate3d(0, 0, 0)",WebkitTransform:"translate3d(0, 0, 0)",transform:"translate3d(0, 0, 0)",zIndex:1e3}},overlay:function(t,e,r){return{zIndex:1400,MozTransform:t?r?"translate3d(-"+e+", 0, 0)":"translate3d("+e+", 0, 0)":"translate3d(0, 0, 0)",MsTransform:t?r?"translate3d(-"+e+", 0, 0)":"translate3d("+e+", 0, 0)":"translate3d(0, 0, 0)",OTransform:t?r?"translate3d(-"+e+", 0, 0)":"translate3d("+e+", 0, 0)":"translate3d(0, 0, 0)",WebkitTransform:t?r?"translate3d(-"+e+", 0, 0)":"translate3d("+e+", 0, 0)":"translate3d(0, 0, 0)",transform:t?r?"translate3d(-"+e+", 0, 0)":"translate3d("+e+", 0, 0)":"translate3d(0, 0, 0)",transition:"all 0.5s",visibility:t?"visible":"hidden"}},pageWrap:function(t,e,r){return{MozTransform:t?"":r?"translate3d(-"+e+", 0, 0)":"translate3d("+e+", 0, 0)",MsTransform:t?"":r?"translate3d(-"+e+", 0, 0)":"translate3d("+e+", 0, 0)",OTransform:t?"":r?"translate3d(-"+e+", 0, 0)":"translate3d("+e+", 0, 0)",WebkitTransform:t?"":r?"translate3d(-"+e+", 0, 0)":"translate3d("+e+", 0, 0)",transform:t?"":r?"translate3d(-"+e+", 0, 0)":"translate3d("+e+", 0, 0)",transition:"all 0.5s",zIndex:1200,position:"relative"}},burgerIcon:function(t,e,r){return{MozTransform:t?r?"translate3d("+e+", 0, 0)":"translate3d(-"+e+", 0, 0)":"translate3d(0, 0, 0)",MsTransform:t?r?"translate3d("+e+", 0, 0)":"translate3d(-"+e+", 0, 0)":"translate3d(0, 0, 0)",OTransform:t?r?"translate3d("+e+", 0, 0)":"translate3d(-"+e+", 0, 0)":"translate3d(0, 0, 0)",WebkitTransform:t?r?"translate3d("+e+", 0, 0)":"translate3d(-"+e+", 0, 0)":"translate3d(0, 0, 0)",transform:t?r?"translate3d("+e+", 0, 0)":"translate3d(-"+e+", 0, 0)":"translate3d(0, 0, 0)",transition:"all 0.1s",position:"relative",zIndex:1300}},outerContainer:function(t){return{overflow:t?"":"hidden"}}}),t.exports=e.default},262:function(t,e){var r,n,a=t.exports={};function o(){throw new Error("setTimeout has not been defined")}function i(){throw new Error("clearTimeout has not been defined")}function s(t){if(r===setTimeout)return setTimeout(t,0);if((r===o||!r)&&setTimeout)return r=setTimeout,setTimeout(t,0);try{return r(t,0)}catch(e){try{return r.call(null,t,0)}catch(e){return r.call(this,t,0)}}}!function(){try{r="function"==typeof setTimeout?setTimeout:o}catch(t){r=o}try{n="function"==typeof clearTimeout?clearTimeout:i}catch(t){n=i}}();var l,u=[],c=!1,f=-1;function d(){c&&l&&(c=!1,l.length?u=l.concat(u):f=-1,u.length&&p())}function p(){if(!c){var t=s(d);c=!0;for(var e=u.length;e;){for(l=u,u=[];++f1)for(var r=1;r])/g,y=/([[}=:>])\s+/g,b=/(\{[^{]+?);(?=\})/g,x=/\s{2,}/g,T=/([^\(])(:+) */g,C=/[svh]\w+-[tblr]{2}/,w=/\(\s*(.*)\s*\)/g,A=/([\s\S]*?);/g,E=/-self|flex-/g,S=/[^]*?(:[rp][el]a[\w-]+)[^]*/,k=/stretch|:\s*\w+\-(?:conte|avail)/,O=/([^-])(image-set\()/,F="-webkit-",M="-moz-",_="-ms-",N=59,I=125,P=123,j=40,B=41,R=91,L=93,D=10,G=13,z=9,H=64,q=32,W=38,U=45,Y=95,$=42,V=44,X=58,K=39,Z=34,Q=47,J=62,tt=43,et=126,rt=0,nt=12,at=11,ot=107,it=109,st=115,lt=112,ut=111,ct=105,ft=99,dt=100,pt=112,ht=1,mt=1,gt=0,vt=1,yt=1,bt=1,xt=0,Tt=0,Ct=0,wt=[],At=[],Et=0,St=null,kt=-2,Ot=-1,Ft=0,Mt=1,_t=2,Nt=3,It=0,Pt=1,jt="",Bt="",Rt="";function Lt(t,e,a,o,i){for(var s,l,c=0,f=0,d=0,p=0,v=0,y=0,b=0,x=0,C=0,A=0,E=0,S=0,k=0,O=0,Y=0,xt=0,At=0,St=0,kt=0,Ot=a.length,Gt=Ot-1,Yt="",$t="",Vt="",Xt="",Kt="",Zt="";Y0&&($t=$t.replace(n,"")),$t.trim().length>0)){switch(b){case q:case z:case N:case G:case D:break;default:$t+=a.charAt(Y)}b=N}if(1===At)switch(b){case P:case I:case N:case Z:case K:case j:case B:case V:At=0;case z:case G:case D:case q:break;default:for(At=0,kt=Y,v=b,Y--,b=N;kt0&&(++Y,b=v);case P:kt=Ot}}switch(b){case P:for(v=($t=$t.trim()).charCodeAt(0),E=1,kt=++Y;Y0&&($t=$t.replace(n,"")),y=$t.charCodeAt(1)){case dt:case it:case st:case U:s=e;break;default:s=wt}if(kt=(Vt=Lt(e,s,Vt,y,i+1)).length,Ct>0&&0===kt&&(kt=$t.length),Et>0&&(s=Dt(wt,$t,St),l=Wt(Nt,Vt,s,e,mt,ht,kt,y,i,o),$t=s.join(""),void 0!==l&&0===(kt=(Vt=l.trim()).length)&&(y=0,Vt="")),kt>0)switch(y){case st:$t=$t.replace(w,qt);case dt:case it:case U:Vt=$t+"{"+Vt+"}";break;case ot:Vt=($t=$t.replace(h,"$1 $2"+(Pt>0?jt:"")))+"{"+Vt+"}",Vt=1===yt||2===yt&&Ht("@"+Vt,3)?"@"+F+Vt+"@"+Vt:"@"+Vt;break;default:Vt=$t+Vt,o===pt&&(Xt+=Vt,Vt="")}else Vt="";break;default:Vt=Lt(e,Dt(e,$t,St),Vt,o,i+1)}Kt+=Vt,S=0,At=0,O=0,xt=0,St=0,k=0,$t="",Vt="",b=a.charCodeAt(++Y);break;case I:case N:if((kt=($t=(xt>0?$t.replace(n,""):$t).trim()).length)>1)switch(0===O&&((v=$t.charCodeAt(0))===U||v>96&&v<123)&&(kt=($t=$t.replace(" ",":")).length),Et>0&&void 0!==(l=Wt(Mt,$t,e,t,mt,ht,Xt.length,o,i,o))&&0===(kt=($t=l.trim()).length)&&($t="\0\0"),v=$t.charCodeAt(0),y=$t.charCodeAt(1),v){case rt:break;case H:if(y===ct||y===ft){Zt+=$t+a.charAt(Y);break}default:if($t.charCodeAt(kt-1)===X)break;Xt+=zt($t,v,y,$t.charCodeAt(2))}S=0,At=0,O=0,xt=0,St=0,$t="",b=a.charCodeAt(++Y)}}switch(b){case G:case D:if(f+p+d+c+Tt===0)switch(A){case B:case K:case Z:case H:case et:case J:case $:case tt:case Q:case U:case X:case V:case N:case P:case I:break;default:O>0&&(At=1)}f===Q?f=0:vt+S===0&&o!==ot&&$t.length>0&&(xt=1,$t+="\0"),Et*It>0&&Wt(Ft,$t,e,t,mt,ht,Xt.length,o,i,o),ht=1,mt++;break;case N:case I:if(f+p+d+c===0){ht++;break}default:switch(ht++,Yt=a.charAt(Y),b){case z:case q:if(p+c+f===0)switch(x){case V:case X:case z:case q:Yt="";break;default:b!==q&&(Yt=" ")}break;case rt:Yt="\\0";break;case nt:Yt="\\f";break;case at:Yt="\\v";break;case W:p+f+c===0&&vt>0&&(St=1,xt=1,Yt="\f"+Yt);break;case 108:if(p+f+c+gt===0&&O>0)switch(Y-O){case 2:x===lt&&a.charCodeAt(Y-3)===X&&(gt=x);case 8:C===ut&&(gt=C)}break;case X:p+f+c===0&&(O=Y);break;case V:f+d+p+c===0&&(xt=1,Yt+="\r");break;case Z:case K:0===f&&(p=p===b?0:0===p?b:p);break;case R:p+f+d===0&&c++;break;case L:p+f+d===0&&c--;break;case B:p+f+c===0&&d--;break;case j:if(p+f+c===0){if(0===S)switch(2*x+3*C){case 533:break;default:E=0,S=1}d++}break;case H:f+d+p+c+O+k===0&&(k=1);break;case $:case Q:if(p+c+d>0)break;switch(f){case 0:switch(2*b+3*a.charCodeAt(Y+1)){case 235:f=Q;break;case 220:kt=Y,f=$}break;case $:b===Q&&x===$&&kt+2!==Y&&(33===a.charCodeAt(kt+2)&&(Xt+=a.substring(kt,Y+1)),Yt="",f=0)}}if(0===f){if(vt+p+c+k===0&&o!==ot&&b!==N)switch(b){case V:case et:case J:case tt:case B:case j:if(0===S){switch(x){case z:case q:case D:case G:Yt+="\0";break;default:Yt="\0"+Yt+(b===V?"":"\0")}xt=1}else switch(b){case j:O+7===Y&&108===x&&(O=0),S=++E;break;case B:0==(S=--E)&&(xt=1,Yt+="\0")}break;case z:case q:switch(x){case rt:case P:case I:case N:case V:case nt:case z:case q:case D:case G:break;default:0===S&&(xt=1,Yt+="\0")}}$t+=Yt,b!==q&&b!==z&&(A=b)}}C=x,x=b,Y++}if(kt=Xt.length,Ct>0&&0===kt&&0===Kt.length&&0===e[0].length==0&&(o!==it||1===e.length&&(vt>0?Bt:Rt)===e[0])&&(kt=e.join(",").length+2),kt>0){if(s=0===vt&&o!==ot?function(t){for(var e,r,a=0,o=t.length,i=Array(o);a1)){if(d=l.charCodeAt(l.length-1),p=r.charCodeAt(0),e="",0!==c)switch(d){case $:case et:case J:case tt:case q:case j:break;default:e=" "}switch(p){case W:r=e+Bt;case et:case J:case tt:case q:case B:case j:break;case R:r=e+r+Bt;break;case X:switch(2*r.charCodeAt(1)+3*r.charCodeAt(2)){case 530:if(bt>0){r=e+r.substring(8,f-1);break}default:(c<1||s[c-1].length<1)&&(r=e+Bt+r)}break;case V:e="";default:r=f>1&&r.indexOf(":")>0?e+r.replace(T,"$1"+Bt+"$2"):e+r+Bt}l+=r}i[a]=l.replace(n,"").trim()}return i}(e):e,Et>0&&void 0!==(l=Wt(_t,Xt,s,t,mt,ht,kt,o,i,o))&&0===(Xt=l).length)return Zt+Xt+Kt;if(Xt=s.join(",")+"{"+Xt+"}",yt*gt!=0){switch(2!==yt||Ht(Xt,2)||(gt=0),gt){case ut:Xt=Xt.replace(g,":"+M+"$1")+Xt;break;case lt:Xt=Xt.replace(m,"::"+F+"input-$1")+Xt.replace(m,"::"+M+"$1")+Xt.replace(m,":"+_+"input-$1")+Xt}gt=0}}return Zt+Xt+Kt}function Dt(t,e,r){var n=e.trim().split(c),a=n,o=n.length,i=t.length;switch(i){case 0:case 1:for(var s=0,l=0===i?"":t[0]+" ";s0&&vt>0)return a.replace(d,"$1").replace(f,"$1"+Rt);break;default:return t.trim()+a.replace(f,"$1"+t.trim())}default:if(r*vt>0&&a.indexOf("\f")>0)return a.replace(f,(t.charCodeAt(0)===X?"":"$1")+t.trim())}return t+a}function zt(t,e,r,n){var u,c=0,f=t+";",d=2*e+3*r+4*n;if(944===d)return function(t){var e=t.length,r=t.indexOf(":",9)+1,n=t.substring(0,r).trim(),a=t.substring(r,e-1).trim();switch(t.charCodeAt(9)*Pt){case 0:break;case U:if(110!==t.charCodeAt(10))break;default:for(var o=a.split((a="",s)),i=0,r=0,e=o.length;iH&&f<90||f>96&&f<123||f===Y||f===U&&u.charCodeAt(1)!==U))switch(isNaN(parseFloat(u))+(-1!==u.indexOf("("))){case 1:switch(u){case"infinite":case"alternate":case"backwards":case"running":case"normal":case"forwards":case"both":case"none":case"linear":case"ease":case"ease-in":case"ease-out":case"ease-in-out":case"paused":case"reverse":case"alternate-reverse":case"inherit":case"initial":case"unset":case"step-start":case"step-end":break;default:u+=jt}}c[r++]=u}a+=(0===i?"":",")+c.join(" ")}}return a=n+a+";",1===yt||2===yt&&Ht(a,1)?F+a+a:a}(f);if(0===yt||2===yt&&!Ht(f,1))return f;switch(d){case 1015:return 97===f.charCodeAt(10)?F+f+f:f;case 951:return 116===f.charCodeAt(3)?F+f+f:f;case 963:return 110===f.charCodeAt(5)?F+f+f:f;case 1009:if(100!==f.charCodeAt(4))break;case 969:case 942:return F+f+f;case 978:return F+f+M+f+f;case 1019:case 983:return F+f+M+f+_+f+f;case 883:return f.charCodeAt(8)===U?F+f+f:f.indexOf("image-set(",11)>0?f.replace(O,"$1"+F+"$2")+f:f;case 932:if(f.charCodeAt(4)===U)switch(f.charCodeAt(5)){case 103:return F+"box-"+f.replace("-grow","")+F+f+_+f.replace("grow","positive")+f;case 115:return F+f+_+f.replace("shrink","negative")+f;case 98:return F+f+_+f.replace("basis","preferred-size")+f}return F+f+_+f+f;case 964:return F+f+_+"flex-"+f+f;case 1023:if(99!==f.charCodeAt(8))break;return u=f.substring(f.indexOf(":",15)).replace("flex-","").replace("space-between","justify"),F+"box-pack"+u+F+f+_+"flex-pack"+u+f;case 1005:return o.test(f)?f.replace(a,":"+F)+f.replace(a,":"+M)+f:f;case 1e3:switch(c=(u=f.substring(13).trim()).indexOf("-")+1,u.charCodeAt(0)+u.charCodeAt(c)){case 226:u=f.replace(C,"tb");break;case 232:u=f.replace(C,"tb-rl");break;case 220:u=f.replace(C,"lr");break;default:return f}return F+f+_+u+f;case 1017:if(-1===f.indexOf("sticky",9))return f;case 975:switch(c=(f=t).length-10,d=(u=(33===f.charCodeAt(c)?f.substring(0,c):f).substring(t.indexOf(":",7)+1).trim()).charCodeAt(0)+(0|u.charCodeAt(7))){case 203:if(u.charCodeAt(8)<111)break;case 115:f=f.replace(u,F+u)+";"+f;break;case 207:case 102:f=f.replace(u,F+(d>102?"inline-":"")+"box")+";"+f.replace(u,F+u)+";"+f.replace(u,_+u+"box")+";"+f}return f+";";case 938:if(f.charCodeAt(5)===U)switch(f.charCodeAt(6)){case 105:return u=f.replace("-items",""),F+f+F+"box-"+u+_+"flex-"+u+f;case 115:return F+f+_+"flex-item-"+f.replace(E,"")+f;default:return F+f+_+"flex-line-pack"+f.replace("align-content","").replace(E,"")+f}break;case 973:case 989:if(f.charCodeAt(3)!==U||122===f.charCodeAt(4))break;case 931:case 953:if(!0===k.test(t))return 115===(u=t.substring(t.indexOf(":")+1)).charCodeAt(0)?zt(t.replace("stretch","fill-available"),e,r,n).replace(":fill-available",":stretch"):f.replace(u,F+u)+f.replace(u,M+u.replace("fill-",""))+f;break;case 962:if(f=F+f+(102===f.charCodeAt(5)?_+f:"")+f,r+n===211&&105===f.charCodeAt(13)&&f.indexOf("transform",10)>0)return f.substring(0,f.indexOf(";",27)+1).replace(i,"$1"+F+"$2")+f}return f}function Ht(t,e){var r=t.indexOf(1===e?":":"{"),n=t.substring(0,3!==e?r:10),a=t.substring(r+1,t.length-1);return St(2!==e?n:n.replace(S,"$1"),a,e)}function qt(t,e){var r=zt(e,e.charCodeAt(0),e.charCodeAt(1),e.charCodeAt(2));return r!==e+";"?r.replace(A," or ($1)").substring(4):"("+e+")"}function Wt(t,e,r,n,a,o,i,s,l,u){for(var c,f=0,d=e;f0&&(jt=a.replace(p,o===R?"":"-")),o=1,1===vt?Rt=a:Bt=a;var i,s=[Rt];Et>0&&void 0!==(i=Wt(Ot,r,s,s,mt,ht,0,0,0,0))&&"string"==typeof i&&(r=i);var l=Lt(wt,s,r,0,0);return Et>0&&void 0!==(i=Wt(kt,l,s,s,mt,ht,l.length,0,0,0))&&"string"!=typeof(l=i)&&(o=0),jt="",Rt="",Bt="",gt=0,mt=1,ht=1,xt*o==0?l:l.replace(n,"").replace(v,"").replace(y,"$1").replace(b,"$1").replace(x," ")}return $t.use=function t(e){switch(e){case void 0:case null:Et=At.length=0;break;default:if("function"==typeof e)At[Et++]=e;else if("object"==typeof e)for(var r=0,n=e.length;r1&&void 0!==arguments[1])||arguments[1])?String(t):String(t).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")},f=function(t){var e=g(t,s.TAG_NAMES.TITLE),r=g(t,s.HELMET_PROPS.TITLE_TEMPLATE);if(r&&e)return r.replace(/%s/g,function(){return e});var n=g(t,s.HELMET_PROPS.DEFAULT_TITLE);return e||n||void 0},d=function(t){return g(t,s.HELMET_PROPS.ON_CHANGE_CLIENT_STATE)||function(){}},p=function(t,e){return e.filter(function(e){return void 0!==e[t]}).map(function(e){return e[t]}).reduce(function(t,e){return a({},t,e)},{})},h=function(t,e){return e.filter(function(t){return void 0!==t[s.TAG_NAMES.BASE]}).map(function(t){return t[s.TAG_NAMES.BASE]}).reverse().reduce(function(e,r){if(!e.length)for(var n=Object.keys(r),a=0;a=0;r--){var n=t[r];if(n.hasOwnProperty(e))return n[e]}return null},v=(u=Date.now(),function(t){var e=Date.now();e-u>16?(u=e,t(e)):setTimeout(function(){v(t)},0)}),y=function(t){return clearTimeout(t)},b="undefined"!=typeof window?window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||v:t.requestAnimationFrame||v,x="undefined"!=typeof window?window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||y:t.cancelAnimationFrame||y,T=function(t){return console&&"function"==typeof console.warn&&console.warn(t)},C=null,w=function(t,e){var r=t.baseTag,n=t.bodyAttributes,a=t.htmlAttributes,o=t.linkTags,i=t.metaTags,l=t.noscriptTags,u=t.onChangeClientState,c=t.scriptTags,f=t.styleTags,d=t.title,p=t.titleAttributes;S(s.TAG_NAMES.BODY,n),S(s.TAG_NAMES.HTML,a),E(d,p);var h={baseTag:k(s.TAG_NAMES.BASE,r),linkTags:k(s.TAG_NAMES.LINK,o),metaTags:k(s.TAG_NAMES.META,i),noscriptTags:k(s.TAG_NAMES.NOSCRIPT,l),scriptTags:k(s.TAG_NAMES.SCRIPT,c),styleTags:k(s.TAG_NAMES.STYLE,f)},m={},g={};Object.keys(h).forEach(function(t){var e=h[t],r=e.newTags,n=e.oldTags;r.length&&(m[t]=r),n.length&&(g[t]=h[t].oldTags)}),e&&e(),u(t,m,g)},A=function(t){return Array.isArray(t)?t.join(""):t},E=function(t,e){void 0!==t&&document.title!==t&&(document.title=A(t)),S(s.TAG_NAMES.TITLE,e)},S=function(t,e){var r=document.getElementsByTagName(t)[0];if(r){for(var n=r.getAttribute(s.HELMET_ATTRIBUTE),a=n?n.split(","):[],o=[].concat(a),i=Object.keys(e),l=0;l=0;d--)r.removeAttribute(o[d]);a.length===o.length?r.removeAttribute(s.HELMET_ATTRIBUTE):r.getAttribute(s.HELMET_ATTRIBUTE)!==i.join(",")&&r.setAttribute(s.HELMET_ATTRIBUTE,i.join(","))}},k=function(t,e){var r=document.head||document.querySelector(s.TAG_NAMES.HEAD),n=r.querySelectorAll(t+"["+s.HELMET_ATTRIBUTE+"]"),a=Array.prototype.slice.call(n),o=[],i=void 0;return e&&e.length&&e.forEach(function(e){var r=document.createElement(t);for(var n in e)if(e.hasOwnProperty(n))if(n===s.TAG_PROPERTIES.INNER_HTML)r.innerHTML=e.innerHTML;else if(n===s.TAG_PROPERTIES.CSS_TEXT)r.styleSheet?r.styleSheet.cssText=e.cssText:r.appendChild(document.createTextNode(e.cssText));else{var l=void 0===e[n]?"":e[n];r.setAttribute(n,l)}r.setAttribute(s.HELMET_ATTRIBUTE,"true"),a.some(function(t,e){return i=e,r.isEqualNode(t)})?a.splice(i,1):o.push(r)}),a.forEach(function(t){return t.parentNode.removeChild(t)}),o.forEach(function(t){return r.appendChild(t)}),{oldTags:a,newTags:o}},O=function(t){return Object.keys(t).reduce(function(e,r){var n=void 0!==t[r]?r+'="'+t[r]+'"':""+r;return e?e+" "+n:n},"")},F=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Object.keys(t).reduce(function(e,r){return e[s.REACT_TAG_MAP[r]||r]=t[r],e},e)},M=function(t,e,r){switch(t){case s.TAG_NAMES.TITLE:return{toComponent:function(){return t=e.title,r=e.titleAttributes,(n={key:t})[s.HELMET_ATTRIBUTE]=!0,a=F(r,n),[o.default.createElement(s.TAG_NAMES.TITLE,a,t)];var t,r,n,a},toString:function(){return function(t,e,r,n){var a=O(r),o=A(e);return a?"<"+t+" "+s.HELMET_ATTRIBUTE+'="true" '+a+">"+c(o,n)+"":"<"+t+" "+s.HELMET_ATTRIBUTE+'="true">'+c(o,n)+""}(t,e.title,e.titleAttributes,r)}};case s.ATTRIBUTE_NAMES.BODY:case s.ATTRIBUTE_NAMES.HTML:return{toComponent:function(){return F(e)},toString:function(){return O(e)}};default:return{toComponent:function(){return function(t,e){return e.map(function(e,r){var n,a=((n={key:r})[s.HELMET_ATTRIBUTE]=!0,n);return Object.keys(e).forEach(function(t){var r=s.REACT_TAG_MAP[t]||t;if(r===s.TAG_PROPERTIES.INNER_HTML||r===s.TAG_PROPERTIES.CSS_TEXT){var n=e.innerHTML||e.cssText;a.dangerouslySetInnerHTML={__html:n}}else a[r]=e[t]}),o.default.createElement(t,a)})}(t,e)},toString:function(){return function(t,e,r){return e.reduce(function(e,n){var a=Object.keys(n).filter(function(t){return!(t===s.TAG_PROPERTIES.INNER_HTML||t===s.TAG_PROPERTIES.CSS_TEXT)}).reduce(function(t,e){var a=void 0===n[e]?e:e+'="'+c(n[e],r)+'"';return t?t+" "+a:a},""),o=n.innerHTML||n.cssText||"",i=-1===s.SELF_CLOSING_TAGS.indexOf(t);return e+"<"+t+" "+s.HELMET_ATTRIBUTE+'="true" '+a+(i?"/>":">"+o+"")},"")}(t,e,r)}}}};e.convertReactPropstoHtmlAttributes=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Object.keys(t).reduce(function(e,r){return e[s.HTML_TAG_MAP[r]||r]=t[r],e},e)},e.handleClientStateChange=function(t){C&&x(C),t.defer?C=b(function(){w(t,function(){C=null})}):(w(t),C=null)},e.mapStateOnServer=function(t){var e=t.baseTag,r=t.bodyAttributes,n=t.encode,a=t.htmlAttributes,o=t.linkTags,i=t.metaTags,l=t.noscriptTags,u=t.scriptTags,c=t.styleTags,f=t.title,d=void 0===f?"":f,p=t.titleAttributes;return{base:M(s.TAG_NAMES.BASE,e,n),bodyAttributes:M(s.ATTRIBUTE_NAMES.BODY,r,n),htmlAttributes:M(s.ATTRIBUTE_NAMES.HTML,a,n),link:M(s.TAG_NAMES.LINK,o,n),meta:M(s.TAG_NAMES.META,i,n),noscript:M(s.TAG_NAMES.NOSCRIPT,l,n),script:M(s.TAG_NAMES.SCRIPT,u,n),style:M(s.TAG_NAMES.STYLE,c,n),title:M(s.TAG_NAMES.TITLE,{title:d,titleAttributes:p},n)}},e.reducePropsToState=function(t){return{baseTag:h([s.TAG_PROPERTIES.HREF],t),bodyAttributes:p(s.ATTRIBUTE_NAMES.BODY,t),defer:g(t,s.HELMET_PROPS.DEFER),encode:g(t,s.HELMET_PROPS.ENCODE_SPECIAL_CHARACTERS),htmlAttributes:p(s.ATTRIBUTE_NAMES.HTML,t),linkTags:m(s.TAG_NAMES.LINK,[s.TAG_PROPERTIES.REL,s.TAG_PROPERTIES.HREF],t),metaTags:m(s.TAG_NAMES.META,[s.TAG_PROPERTIES.NAME,s.TAG_PROPERTIES.CHARSET,s.TAG_PROPERTIES.HTTPEQUIV,s.TAG_PROPERTIES.PROPERTY,s.TAG_PROPERTIES.ITEM_PROP],t),noscriptTags:m(s.TAG_NAMES.NOSCRIPT,[s.TAG_PROPERTIES.INNER_HTML],t),onChangeClientState:d(t),scriptTags:m(s.TAG_NAMES.SCRIPT,[s.TAG_PROPERTIES.SRC,s.TAG_PROPERTIES.INNER_HTML],t),styleTags:m(s.TAG_NAMES.STYLE,[s.TAG_PROPERTIES.CSS_TEXT],t),title:f(t),titleAttributes:p(s.ATTRIBUTE_NAMES.TITLE,t)}},e.requestAnimationFrame=b,e.warn=T}).call(this,r(74))},293:function(t,e,r){"use strict";var n=/^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|default|defer|dir|disabled|download|draggable|encType|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|itemProp|itemScope|itemType|itemID|itemRef|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/,a=function(t){var e={};return function(r){return void 0===e[r]&&(e[r]=t(r)),e[r]}}(function(t){return n.test(t)||111===t.charCodeAt(0)&&110===t.charCodeAt(1)&&t.charCodeAt(2)<91});e.a=a}}]); +//# sourceMappingURL=1-03cd128f0661328d250d.js.map \ No newline at end of file diff --git a/1-03cd128f0661328d250d.js.map b/1-03cd128f0661328d250d.js.map new file mode 100644 index 00000000..341f6f6b --- /dev/null +++ b/1-03cd128f0661328d250d.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./node_modules/styled-components/dist/styled-components.browser.esm.js","webpack:///./node_modules/react-burger-menu/lib/menuFactory.js","webpack:///./node_modules/react-helmet/lib/Helmet.js","webpack:///./node_modules/react-burger-menu/lib/BurgerMenu.js","webpack:///./node_modules/core-js/modules/es6.string.starts-with.js","webpack:///./node_modules/@babel/runtime/helpers/taggedTemplateLiteralLoose.js","webpack:///./node_modules/react-burger-menu/lib/snapsvgImporter.js","webpack:///./node_modules/react-is/index.js","webpack:///./node_modules/react-helmet/lib/HelmetConstants.js","webpack:///./node_modules/react-burger-menu/lib/menus/slide.js","webpack:///./node_modules/react-burger-menu/lib/baseStyles.js","webpack:///./node_modules/react-burger-menu/lib/BurgerIcon.js","webpack:///./node_modules/react-burger-menu/lib/CrossIcon.js","webpack:///./node_modules/react-burger-menu/lib/menus/stack.js","webpack:///./node_modules/react-burger-menu/lib/menus/elastic.js","webpack:///./node_modules/snapsvg-cjs/dist/snap.svg-cjs.js","webpack:///./node_modules/eve/eve.js","webpack:///./node_modules/react-burger-menu/lib/menus/bubble.js","webpack:///./node_modules/react-burger-menu/lib/menus/push.js","webpack:///./node_modules/react-burger-menu/lib/menus/pushRotate.js","webpack:///./node_modules/react-burger-menu/lib/menus/scaleDown.js","webpack:///./node_modules/react-burger-menu/lib/menus/scaleRotate.js","webpack:///./node_modules/react-burger-menu/lib/menus/fallDown.js","webpack:///./node_modules/react-burger-menu/lib/menus/reveal.js","webpack:///./node_modules/node-libs-browser/node_modules/process/browser.js","webpack:///./node_modules/stylis/stylis.min.js","webpack:///./node_modules/stylis-rule-sheet/index.js","webpack:///./node_modules/@emotion/unitless/dist/unitless.browser.esm.js","webpack:///./node_modules/react-is/cjs/react-is.production.min.js","webpack:///./node_modules/memoize-one/dist/memoize-one.esm.js","webpack:///./node_modules/react-side-effect/lib/index.js","webpack:///./node_modules/exenv/index.js","webpack:///./node_modules/shallowequal/index.js","webpack:///./node_modules/react-fast-compare/index.js","webpack:///./node_modules/react-helmet/lib/HelmetUtils.js","webpack:///./node_modules/@emotion/memoize/dist/memoize.browser.esm.js","webpack:///./node_modules/@emotion/is-prop-valid/dist/is-prop-valid.browser.esm.js"],"names":["process","__webpack_require__","d","__webpack_exports__","createGlobalStyle","stylis_stylis_min__WEBPACK_IMPORTED_MODULE_0__","stylis_stylis_min__WEBPACK_IMPORTED_MODULE_0___default","n","stylis_rule_sheet__WEBPACK_IMPORTED_MODULE_1__","stylis_rule_sheet__WEBPACK_IMPORTED_MODULE_1___default","react__WEBPACK_IMPORTED_MODULE_2__","react__WEBPACK_IMPORTED_MODULE_2___default","_emotion_unitless__WEBPACK_IMPORTED_MODULE_3__","react_is__WEBPACK_IMPORTED_MODULE_4__","memoize_one__WEBPACK_IMPORTED_MODULE_5__","_emotion_is_prop_valid__WEBPACK_IMPORTED_MODULE_8__","interleave","strings","interpolations","result","i","len","length","push","_typeof","Symbol","iterator","obj","constructor","prototype","classCallCheck","instance","Constructor","TypeError","createClass","defineProperties","target","props","descriptor","enumerable","configurable","writable","Object","defineProperty","key","protoProps","staticProps","_extends","assign","arguments","source","hasOwnProperty","call","inherits","subClass","superClass","create","value","setPrototypeOf","__proto__","objectWithoutProperties","keys","indexOf","possibleConstructorReturn","self","ReferenceError","isPlainObject","x","EMPTY_ARRAY","freeze","EMPTY_OBJECT","isFunction","test","getComponentName","displayName","name","isStyledComponent","styledComponentId","SC_ATTR","IS_BROWSER","window","DISABLE_SPEEDY","SC_DISABLE_SPEEDY","STATIC_EXECUTION_CONTEXT","StyledComponentsError","_Error","code","this","_len","Array","_key","_this","join","Error","SC_COMPONENT_ID","extractComps","maybeCSS","css","existingComponents","replace","match","componentId","matchIndex","map","_ref","nextComp","cssFromDOM","slice","COMMENT_REGEX","stylisSplitter","a","global","cascade","keyframe","prefix","compress","semicolon","stylis","parsingRules","returnRulesPlugin","context","parsedRules","parseRulesPlugin","rule","_componentId","_selector","_selectorRegexp","selfReferenceReplacer","offset","string","use","_","selectors","lastIndexOf","stringifyRules","rules","selector","undefined","flatCSS","cssStr","RegExp","getNonce","nc","addNameForId","names","id","resetIdNames","hasNameForId","stringifyNames","str","trim","sheetForTag","tag","sheet","size","document","styleSheets","ownerNode","safeInsertRule","cssRule","index","maxIndex","cssRules","insertRule","err","makeTextMarker","addUpUntilIndex","sizes","totalUpToIndex","wrapAsHtmlTag","additionalAttrs","nonce","SC_VERSION_ATTR","filter","Boolean","wrapAsElement","_props","createElement","dangerouslySetInnerHTML","__html","getIdsFromMarkersFactory","markers","makeTextNode","createTextNode","makeServerTag","namesArg","markersArg","insertMarker","prev","cssForId","clone","namesClone","cloneNames","markersClone","getIds","insertRules","removeRules","marker","sealed","styleTag","toElement","toHTML","makeTag","tagEl","forceServer","insertBefore","getImportRuleTag","el","setAttribute","appendChild","parentNode","nextSibling","makeStyleTag","extractImport","usedImportRuleTag","data","importRules","cssRulesSize","mayHaveImport","separator","appendData","newMarker","replaceChild","makeBrowserTag","end","cssText","insertIndex","injectedRules","removalIndex","lowerBound","deleteRule","deleteRules","makeSpeedyTag","SPLIT_REGEX","MAX_SIZE","sheetRunningId","master","StyleSheet","head","importRuleTag","firstTag","tags","tagMap","deferred","rehydratedNames","ignoreRehydratedNames","capacity","clones","rehydrate","els","extracted","isStreamed","nodes","querySelectorAll","nodesSize","getAttribute","elNames","split","elNamesSize","j","apply","textContent","extractedSize","_extracted$i","_i","removeChild","Math","max","_j","reset","ids","newTag","sealAllTags","forEach","lastEl","getTagForId","hasId","deferredInject","inject","concat","remove","toReactElements","get","Keyframes","styleSheet","toString","String","getName","uppercasePattern","msPattern","isFalsish","chunk","objToCss","prevKey","toLowerCase","flatten","executionContext","isArray","ruleSet","isReactComponent","styles","murmurhash","c","b","e","charCodeAt","charsLength","getAlphabeticChar","fromCharCode","generateAlphabeticName","floor","isStaticRules","attrs","some","hasFunctionObjectKey","_TYPE_STATICS","isHMREnabled","hasher","ComponentStyle","isStatic","generateAndInjectStyles","lastClassName","generateName","determineTheme","fallbackTheme","defaultProps","isDefaultTheme","theme","escapeRegex","dashesAtEnds","escape","isTag","REACT_STATICS","childContextTypes","contextTypes","getDerivedStateFromProps","propTypes","type","KNOWN_STATICS","caller","callee","arity","TYPE_STATICS","$$typeof","render","defineProperty$1","getOwnPropertyNames","_Object$getOwnPropert","getOwnPropertySymbols","getOwnPropertyDescriptor","getPrototypeOf","objectPrototype","arrayPrototype","hoistNonReactStatics","targetComponent","sourceComponent","blacklist","inheritedComponent","targetStatics","sourceStatics","ThemeContext","ThemeConsumer","Consumer","StyleSheetContext","_Component","ThemeProvider","getContext","bind","renderInner","children","outerTheme","Provider","Children","only","getTheme","ServerStyleSheet","masterSheet","seal","splice","collectStyles","StyleSheetManager","getStyleTags","getStyleElement","interleaveWithNodeStream","readableStream","StyleSheetConsumer","identifiers","Set","StyledComponent","renderOuter","forwardedComponent","componentStyle","_props$forwardedCompo","foldedComponentIds","generatedClassName","elementToBeCreated","as","isTargetTag","propsForElement","computedProps","ref","style","className","buildExecutionContext","_this2","attrDef","fn","resolvedAttrDef","attrDefWasFn","attr","_props$forwardedCompo2","warnTooManyClasses","createStyledComponent","options","isTargetStyledComp","isClass","_options$displayName","generateDisplayName","_options$componentId","_ComponentStyle","_displayName","parentComponentId","nr","generateId","_options$ParentCompon","ParentComponent","_options$attrs","finalAttrs","WrappedStyledComponent","forwardRef","forwardedRef","withComponent","previousComponentId","optionsToCopy","newComponentId","styled","constructWithOptions","componentConstructor","templateFunction","withConfig","config","domElement","GlobalStyle","createStyles","removeStyles","renderStyles","JSON","stringify","GlobalStyleComponent","_React$Component","_this$constructor","globalStyle","scCGSHMRCache","state","componentWillUnmount","Component","exports","_createClass","_get","_x3","_x4","_x5","_again","object","property","receiver","Function","desc","getter","parent","_interopRequireDefault","__esModule","default","_react","_react2","_reactDom2","_propTypes2","_baseStyles2","_BurgerIcon2","_CrossIcon2","Menu","_classCallCheck","isOpen","_inherits","noStateChange","newState","applyWrapperStyles","setState","onStateChange","disableAutoFocus","firstItem","querySelector","focus","activeElement","blur","body","timeoutId","clearTimeout","setTimeout","set","applyClass","classList","htmlClassName","bodyClassName","pageWrap","pageWrapId","handleExternalWrapper","outerContainer","outerContainerId","wrapperStyles","wrapper","getElementById","builtStyles","getStyle","prop","applyOverflow","console","error","inline","propName","charAt","toUpperCase","output","width","formattedWidth","right","event","disableCloseOnEsc","keyCode","toggleMenu","disableOverlayClick","customOnKeyDown","onkeydown","listenForClose","prevProps","morphShape","path","svg","findDOMNode","lib","select","animate","pathInitial","_this3","noOverlay","overlayClassName","onClick","shouldDisableOverlayClick","getStyles","morphShapeClassName","height","viewBox","preserveAspectRatio","menuClassName","itemListClassName","item","extraProps","itemClassName","tabIndex","cloneElement","customCrossIcon","customIcon","crossButtonClassName","crossClassName","customBurgerIcon","burgerButtonClassName","barClassName","burgerBarClassName","oneOfType","element","oneOf","func","bool","isRequired","number","module","Helmet","_reactSideEffect2","_reactFastCompare2","_HelmetUtils","_HelmetConstants","_objectWithoutProperties","_class","_temp","HelmetSideEffects","reducePropsToState","handleClientStateChange","mapStateOnServer","HelmetExport","HelmetWrapper","_possibleConstructorReturn","shouldComponentUpdate","nextProps","mapNestedChildrenToProps","child","nestedChildren","TAG_NAMES","SCRIPT","NOSCRIPT","innerHTML","STYLE","flattenArrayTypeChildren","_extends2","arrayTypeChildren","newChildProps","mapObjectTypeChildren","_ref2","_extends3","_extends4","newProps","TITLE","titleAttributes","BODY","bodyAttributes","HTML","htmlAttributes","mapArrayTypeChildrenToProps","newFlattenedProps","arrayChildName","_extends5","warnOnInvalidChildren","mapChildrenToProps","_child$props","childProps","convertReactPropstoHtmlAttributes","LINK","META","canUseDOM","base","arrayOf","node","defaultTitle","defer","encodeSpecialCharacters","link","meta","noscript","onChangeClientState","script","title","titleTemplate","peek","rewind","mappedState","baseTag","linkTags","metaTags","noscriptTags","scriptTags","styleTags","renderStatic","slide","stack","elastic","bubble","pushRotate","scaleDown","scaleRotate","fallDown","reveal","$export","toLength","$startsWith","P","F","startsWith","searchString","that","min","search","raw","Snap","ATTRIBUTE_NAMES","BASE","HEAD","REACT_TAG_MAP","VALID_TAG_NAMES","TAG_PROPERTIES","CHARSET","CSS_TEXT","HREF","HTTPEQUIV","INNER_HTML","ITEM_PROP","NAME","PROPERTY","REL","SRC","accesskey","charset","class","contenteditable","contextmenu","http-equiv","itemprop","tabindex","HELMET_PROPS","DEFAULT_TITLE","DEFER","ENCODE_SPECIAL_CHARACTERS","ON_CHANGE_CLIENT_STATE","TITLE_TEMPLATE","HTML_TAG_MAP","reduce","SELF_CLOSING_TAGS","HELMET_ATTRIBUTE","_menuFactory","_menuFactory2","overlay","position","zIndex","background","opacity","MozTransform","MsTransform","OTransform","WebkitTransform","transform","transition","menuWrap","menu","boxSizing","overflow","itemList","display","_x","_x2","BurgerIcon","hover","left","top","bmBurgerBarsHover","icon","bmIcon","bar","getLineStyle","bmBurgerBars","bmBurgerButton","onMouseOver","onMouseOut","margin","padding","border","fontSize","cursor","CrossIcon","bmCross","getCrossStyle","bmCrossButton","nthChild","_snapsvgImporter2","pathOpen","mina","easeinout","whiteSpace","eve","requestID","animations","requestAnimFrame","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","callback","Date","getTime","idgen","idprefix","timer","now","sta","val","s","ds","dur","B","speed","spd","duration","stopit","update","pause","pdif","resume","frame","res","start","jj","easing","timeStamp","A","anim","linear","status","stop","time","getById","easeout","pow","easein","q","Q","sqrt","y","t","abs","backin","backout","sin","PI","bounce","p","root","w","h","nodeType","wrap","is","Element","glob","doc","Paper","version","win","tokenRegex","objNotationRegex","has","Str","toFloat","parseFloat","toInt","parseInt","math","mmax","mmin","E","round","objectToString","colourRegExp","commaSpaces","hsrg","hs","rg","pathCommand","tCommand","pathValues","ID","xlink","xmlns","hub","url","$","text","createComment","substring","getAttributeNS","nodeValue","setAttributeNS","removeAttribute","createElementNS","o","isFinite","cacher","f","scope","postprocessor","newf","arg","args","cache","count","array","ii","repush","shift","rad","deg","format","all","quote","quotedName","isFunc","replacer","angle","tan","cos","asin","num","acos","atan","atan2","x1","y1","x2","y2","x3","y3","len2","closestPoint","distance2","dx","dy","best","bestLength","scan","scanDistance","pathNode","pathLength","getTotalLength","precision","pathSegList","numberOfItems","bestDistance","Infinity","scanLength","getPointAtLength","before","after","beforeLength","afterLength","beforeDistance","afterDistance","distance","snapTo","values","tolerance","rem","getRGB","colour","r","g","hex","rgbtoString","toHex","red","green","blue","rgb","hsb2rgb","hsl2rgb","hsb","hsl","l","toFixed","color","getElementsByTagName","out","defaultView","getComputedStyle","getPropertyValue","hsbtoString","hsltoString","prepareRGB","clr","packageRGB","rgb2hsl","rgb2hsb","v","R","G","X","C","V","L","M","m","parsePathString","pathString","pth","arr","paramCounts","u","z","params","parseTransformString","TString","svgTransform2string","tstr","rgTransform","transform2matrix","bbox","tdata","Matrix","bb","tlen","command","absolute","inver","invert","translate","rotate","scale","add","_unit2px","getSomeSVG","mgr","fill","getW","getBBox","getH","nam","contains","compareDocumentPosition","ownerSVGElement","add2group","list","childNodes","snap","paper","tagName","nodeName","anims","mask","pattern","symbol","method","Fragment","frag","make","defs","proto","ownerDocument","dom","contentDocument","getSomeDefs","pdefs","query","selectAll","nodelist","setInterval","attributes","firstDefined","json","att","parse","createDocumentFragment","full","div","firstChild","fragment","ch","toJSON","jsonFiller","on","nt","letter","cssAttr","alignment-baseline","baseline-shift","clip","clip-path","clip-rule","color-interpolation","color-interpolation-filters","color-profile","color-rendering","direction","dominant-baseline","enable-background","fill-opacity","fill-rule","flood-color","flood-opacity","font","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","glyph-orientation-horizontal","glyph-orientation-vertical","image-rendering","kerning","letter-spacing","lighting-color","marker-end","marker-mid","marker-start","pointer-events","shape-rendering","stop-color","stop-opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","text-anchor","text-decoration","text-rendering","unicode-bidi","visibility","word-spacing","writing-mode","ajax","postData","req","XMLHttpRequest","pd","encodeURIComponent","open","setRequestHeader","once","onreadystatechange","readyState","send","load","responseText","getElementByPoint","canvas","elem","box","docElem","clientTop","clientLeft","elementFromPoint","opera","so","getBoundingClientRect","documentElement","pageYOffset","scrollTop","pageXOffset","scrollLeft","sr","createSVGRect","hits","getIntersectionList","plugin","elproto","unit2px","isWithoutTransform","getClientRects","removed","localMatrix","original","href","pathfinder","deflt","bboxwt","realPath","matrix","propString","extractTransform","doReturn","papa","getCTM","local","ms","localString","toTransformString","globalMatrix","totalMatrix","diffMatrix","total","gradientTransform","patternTransform","append","it","appendTo","prepend","first","prependTo","insertAfter","asPX","xlink:href","cloneNode","uses","urltest","linktest","oldid","old","fs","fixids","toDefs","toPattern","patternUnits","refX","refY","cx","cy","markerWidth","markerHeight","orient","eldata","chld","removeData","outerSVG","innerSVG","toDataURL","btoa","contents","unescape","matrixproto","norm","normalize","mag","aNew","bNew","multLeft","cNew","eNew","me","skewX","skew","skewY","determinant","row","scalex","shear","scaley","isSimple","isSuperSimple","noRotation","shorter","clipIt","reURLValue","URL","fillStroke","grad","gradient","deurl","gradrg","setFontSize","getFontSize","tokens","stops","seed","step","k","toAbsolute","txt","baseVal","vb","rx","ry","tp","textPath","tuner","tuned","setter","textExtract","chi","internal","rgNotSpace","addClass","clazz","finalValue","classes","curClasses","removeClass","pos","hasClass","toggleClass","flag","operators","+","-","/","*","reUnit","reAddon","getNumber","getUnit","unit","plus","evnt","atr","aUnit","op","isNaN","bplus","from","to","rect","circle","preload","onerror","src","img","onload","image","offsetWidth","offsetHeight","ellipse","group","vbx","vby","vbw","vbh","ptrn","vx","vy","vw","vh","line","polyline","points","polygon","Gstops","GaddStop","inserted","GgetBBox","GsetStops","addStop","gradientLinear","setStops","gradientRadial","fx","fy","unshift","gradientUnits","clear","next","p2s","paths","ps","sleep","r1","r2","r0","rectPath","pathClone","pathArray","getPointAtSegmentLength","p1x","p1y","c1x","c1y","c2x","c2y","p2x","p2y","bezlen","findDotsAtSegment","x4","y4","ll","t2","getTotLen","getLengthFactory","istotal","subpath","O","onlystart","point","sp","subpaths","path2curve","getSubpathsAtLength","t1","t13","t12","t3","mx","my","nx","ny","alpha","bezierBBox","curveDim","isPointInsideBBox","isBBoxIntersect","bbox1","bbox2","base3","p1","p2","p3","p4","z2","Tvalues","Cvalues","sum","ct","xbase","ybase","comb","intersect","denominator","px","py","px2","py2","interHelper","bez1","bez2","justCount","n1","n2","dots1","dots2","xy","di","di1","dj","dj1","ci","cj","interPathHelper","path1","path2","x1m","y1m","x2m","y2m","pi","pj","intr","kk","segment1","segment2","pathBBox","Y","dim","xmin","ymin","ellipsePath","getPath","pathToAbsolute","pa0","pa","crz","dots","pop","catmullRom2bezier","l2c","q2c","ax","ay","x0","y0","b2ac","sqrtb2ac","tvalues","bounds","mt","jlen","curve","bx","by","qx","qy","attrs2","processPath","pcom","T","a2c","large_arc_flag","sweep_flag","recursive","_120","f1","f2","rx2","ry2","df","f2old","x2old","y2old","c1","s1","c2","s2","hx","hy","m1","m2","m3","m4","newres","fixArc","pp","pcoms1","pcoms2","fixM","a1","a2","pfirst","seg","seg2","seglen","seg2len","crp","iLen","getSubpath","closest","inside","found","intersection","intersectionNumber","isPointInside","toRelative","lowerCase","rel","toCubic","pathi","items","bindings","setproto","thisArg","Animation","each","begin","handler","cb","callbacker","aname","unbound","insertion","tail","todel","arglen","exclude","getEmpty","getViewBox","getColour","path2array","isNumeric","equal","Number","tt1","tt2","maxlength","equaliseTransform","arr1","arr2","bUnit","supportsTouch","events","touchMap","mousedown","mousemove","mouseup","getScroll","preventTouch","originalEvent","preventDefault","stopTouch","stopPropagation","addEvent","realName","scrollY","scrollX","targetTouches","olde","clientX","clientY","addEventListener","removeEventListener","drag","dragMove","dragi","touch","touches","identifier","_drag","move_scope","dragUp","unmousemove","unmouseup","end_scope","start_scope","off","eventName","unbind","f_in","f_out","scope_in","scope_out","mouseover","mouseout","unhover","unmouseover","unmouseout","draggable","onmove","onstart","onend","origTransform","init","undrag","unmousedown","pproto","rgurl","filstr","filterUnits","def","shadow","grayscale","amount","sepia","saturate","hueRotate","amount2","brightness","contrast","firstLetter","getAlign","way","align","animation","inAnim","_attrs","_callback","curStatus","eq","fkeys","tkeys","saveColor","colors","A100","A200","A400","A700","mui","flat","pink","purple","deeppurple","indigo","lightblue","cyan","teal","lightgreen","lime","yellow","amber","orange","deeporange","brown","grey","bluegrey","turquoise","greensea","sunflower","emerland","nephritis","carrot","pumpkin","peterriver","belizehole","alizarin","pomegranate","amethyst","wisteria","clouds","silver","wetasphalt","midnightblue","concrete","asbestos","importMUIColors","__WEBPACK_AMD_DEFINE_RESULT__","current_event","comaseparator","numsort","lastDefined","objtos","ar","oldstop","listeners","indexed","queue","ce","sort","_events","nes","es","sep","exist","subname","cur","nts","inodes","funcs","prune","steps","stepsTotal","nextStep","closeButton","transformOrigin","transformStyle","perspective","perspectiveOrigin","burgerIcon","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","defaultClearTimeout","runTimeout","fun","currentQueue","draining","queueIndex","cleanUpNextTick","drainQueue","timeout","run","runClearTimeout","Item","noop","nextTick","browser","env","argv","versions","addListener","removeListener","removeAllListeners","emit","prependListener","prependOnceListener","binding","cwd","chdir","dir","umask","N","S","W","D","H","I","J","K","U","Z","ee","ae","re","se","te","ie","fe","ne","le","oe","he","ue","de","be","pe","ke","ge","Ae","Ce","we","ve","xe","$e","ye","Oe","je","ze","Ne","Se","Fe","We","qe","Be","De","Ee","Ge","He","Je","Re","Te","Ue","Ve","Xe","Ye","Qe","Ie","Pe","Me","Le","Ke","toSheet","block","content","parents","column","ns","depth","at","delimiter","factory","animationIterationCount","borderImageOutset","borderImageSlice","borderImageWidth","boxFlex","boxFlexGroup","boxOrdinalGroup","columnCount","columns","flex","flexGrow","flexPositive","flexShrink","flexNegative","flexOrder","gridRow","gridRowEnd","gridRowSpan","gridRowStart","gridColumn","gridColumnEnd","gridColumnSpan","gridColumnStart","msGridRow","msGridRowSpan","msGridColumn","msGridColumnSpan","fontWeight","lineHeight","order","orphans","tabSize","widows","zoom","WebkitLineClamp","fillOpacity","floodOpacity","stopOpacity","strokeDasharray","strokeDashoffset","strokeMiterlimit","strokeOpacity","strokeWidth","for","typeOf","AsyncMode","ConcurrentMode","ContextConsumer","ContextProvider","ForwardRef","Lazy","Memo","Portal","Profiler","StrictMode","Suspense","isValidElementType","isAsyncMode","isConcurrentMode","isContextConsumer","isContextProvider","isElement","isForwardRef","isFragment","isLazy","isMemo","isPortal","isProfiler","isStrictMode","isSuspense","areInputsEqual","newInputs","lastInputs","resultFn","isEqual","lastThis","lastResult","lastArgs","calledOnce","newArgs","_interopDefault","ex","React","React__default","ExecutionEnvironment","shallowEqual","handleStateChangeOnClient","WrappedComponent","mountedInstances","emitChange","SideEffect","recordedState","componentWillMount","componentDidUpdate","getDisplayName","canUseWorkers","Worker","canUseEventListeners","attachEvent","canUseViewport","screen","objA","objB","compare","compareContext","ret","keysA","keysB","bHasOwnProperty","idx","valueA","valueB","keyList","hasProp","hasElementType","arrA","arrB","dateA","dateB","regexpA","regexpB","message","warn","_objectAssign2","clock","getTitleFromPropsList","propsList","innermostTitle","getInnermostProperty","innermostTemplate","innermostDefaultTitle","getOnChangeClientState","getAttributesFromPropsList","tagType","tagAttrs","current","getBaseTagFromPropsList","primaryAttributes","reverse","innermostBaseTag","lowerCaseAttributeKey","getTagsFromPropsList","approvedSeenTags","approvedTags","instanceTags","instanceSeenTags","primaryAttributeKey","attributeKey","tagUnion","rafPolyfill","currentTime","cafPolyfill","cancelAnimationFrame","webkitCancelAnimationFrame","mozCancelAnimationFrame","msg","_helmetCallback","commitTagChanges","updateAttributes","updateTitle","tagUpdates","updateTags","addedTags","removedTags","_tagUpdates$tagType","newTags","oldTags","flattenArray","possibleArray","elementTag","helmetAttributeString","helmetAttributes","attributesToRemove","attributeKeys","attribute","indexToSave","headElement","tagNodes","indexToDelete","newElement","existingTag","isEqualNode","generateElementAttributesAsString","convertElementAttributestoReactProps","initProps","getMethodsForTag","encode","toComponent","_initProps","attributeString","flattenedTitle","generateTitleAsString","_mappedTag","mappedTag","mappedAttribute","generateTagsAsReactComponent","attributeHtml","tagContent","isSelfClosing","generateTagsAsString","initAttributes","_ref$title","reactPropsRegex","memoize_browser_esm"],"mappings":"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","file":"1-03cd128f0661328d250d.js","sourcesContent":["import Stylis from 'stylis/stylis.min';\nimport _insertRulePlugin from 'stylis-rule-sheet';\nimport React, { cloneElement, createContext, Component, createElement } from 'react';\nimport unitless from '@emotion/unitless';\nimport { isElement, isValidElementType, ForwardRef } from 'react-is';\nimport memoize from 'memoize-one';\nimport PropTypes from 'prop-types';\nimport ReactDOM from 'react-dom';\nimport validAttr from '@emotion/is-prop-valid';\n\n// \n\nvar interleave = (function (strings, interpolations) {\n var result = [strings[0]];\n\n for (var i = 0, len = interpolations.length; i < len; i += 1) {\n result.push(interpolations[i], strings[i + 1]);\n }\n\n return result;\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n} : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\nvar classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\nvar inherits = function (subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\nvar objectWithoutProperties = function (obj, keys) {\n var target = {};\n\n for (var i in obj) {\n if (keys.indexOf(i) >= 0) continue;\n if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;\n target[i] = obj[i];\n }\n\n return target;\n};\n\nvar possibleConstructorReturn = function (self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n};\n\n// \nvar isPlainObject = (function (x) {\n return (typeof x === 'undefined' ? 'undefined' : _typeof(x)) === 'object' && x.constructor === Object;\n});\n\n// \nvar EMPTY_ARRAY = Object.freeze([]);\nvar EMPTY_OBJECT = Object.freeze({});\n\n// \nfunction isFunction(test) {\n return typeof test === 'function';\n}\n\n// \n\nfunction getComponentName(target) {\n return (process.env.NODE_ENV !== 'production' ? typeof target === 'string' && target : false) || target.displayName || target.name || 'Component';\n}\n\n// \nfunction isStatelessFunction(test) {\n return typeof test === 'function' && !(test.prototype && test.prototype.isReactComponent);\n}\n\n// \nfunction isStyledComponent(target) {\n return target && typeof target.styledComponentId === 'string';\n}\n\n// \n\nvar SC_ATTR = typeof process !== 'undefined' && process.env.SC_ATTR || 'data-styled';\n\nvar SC_VERSION_ATTR = 'data-styled-version';\n\nvar SC_STREAM_ATTR = 'data-styled-streamed';\n\nvar IS_BROWSER = typeof window !== 'undefined' && 'HTMLElement' in window;\n\nvar DISABLE_SPEEDY = typeof SC_DISABLE_SPEEDY === 'boolean' && SC_DISABLE_SPEEDY || process.env.NODE_ENV !== 'production';\n\n// Shared empty execution context when generating static styles\nvar STATIC_EXECUTION_CONTEXT = {};\n\n// \n\n\n/**\n * Parse errors.md and turn it into a simple hash of code: message\n */\nvar ERRORS = process.env.NODE_ENV !== 'production' ? {\n \"1\": \"Cannot create styled-component for component: %s.\\n\\n\",\n \"2\": \"Can't collect styles once you've consumed a `ServerStyleSheet`'s styles! `ServerStyleSheet` is a one off instance for each server-side render cycle.\\n\\n- Are you trying to reuse it across renders?\\n- Are you accidentally calling collectStyles twice?\\n\\n\",\n \"3\": \"Streaming SSR is only supported in a Node.js environment; Please do not try to call this method in the browser.\\n\\n\",\n \"4\": \"The `StyleSheetManager` expects a valid target or sheet prop!\\n\\n- Does this error occur on the client and is your target falsy?\\n- Does this error occur on the server and is the sheet falsy?\\n\\n\",\n \"5\": \"The clone method cannot be used on the client!\\n\\n- Are you running in a client-like environment on the server?\\n- Are you trying to run SSR on the client?\\n\\n\",\n \"6\": \"Trying to insert a new style tag, but the given Node is unmounted!\\n\\n- Are you using a custom target that isn't mounted?\\n- Does your document not have a valid head element?\\n- Have you accidentally removed a style tag manually?\\n\\n\",\n \"7\": \"ThemeProvider: Please return an object from your \\\"theme\\\" prop function, e.g.\\n\\n```js\\ntheme={() => ({})}\\n```\\n\\n\",\n \"8\": \"ThemeProvider: Please make your \\\"theme\\\" prop an object.\\n\\n\",\n \"9\": \"Missing document ``\\n\\n\",\n \"10\": \"Cannot find a StyleSheet instance. Usually this happens if there are multiple copies of styled-components loaded at once. Check out this issue for how to troubleshoot and fix the common cases where this situation can happen: https://github.com/styled-components/styled-components/issues/1941#issuecomment-417862021\\n\\n\",\n \"11\": \"_This error was replaced with a dev-time warning, it will be deleted for v4 final._ [createGlobalStyle] received children which will not be rendered. Please use the component without passing children elements.\\n\\n\",\n \"12\": \"It seems you are interpolating a keyframe declaration (%s) into an untagged string. This was supported in styled-components v3, but is not longer supported in v4 as keyframes are now injected on-demand. Please wrap your string in the css\\\\`\\\\` helper (see https://www.styled-components.com/docs/api#css), which ensures the styles are injected correctly.\\n\\n\",\n \"13\": \"%s is not a styled component and cannot be referred to via component selector. See https://www.styled-components.com/docs/advanced#referring-to-other-components for more details.\\n\"\n} : {};\n\n/**\n * super basic version of sprintf\n */\nfunction format() {\n var a = arguments.length <= 0 ? undefined : arguments[0];\n var b = [];\n\n for (var c = 1, len = arguments.length; c < len; c += 1) {\n b.push(arguments.length <= c ? undefined : arguments[c]);\n }\n\n b.forEach(function (d) {\n a = a.replace(/%[a-z]/, d);\n });\n\n return a;\n}\n\n/**\n * Create an error file out of errors.md for development and a simple web link to the full errors\n * in production mode.\n */\n\nvar StyledComponentsError = function (_Error) {\n inherits(StyledComponentsError, _Error);\n\n function StyledComponentsError(code) {\n classCallCheck(this, StyledComponentsError);\n\n for (var _len = arguments.length, interpolations = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n interpolations[_key - 1] = arguments[_key];\n }\n\n if (process.env.NODE_ENV === 'production') {\n var _this = possibleConstructorReturn(this, _Error.call(this, 'An error occurred. See https://github.com/styled-components/styled-components/blob/master/packages/styled-components/src/utils/errors.md#' + code + ' for more information. ' + (interpolations ? 'Additional arguments: ' + interpolations.join(', ') : '')));\n } else {\n var _this = possibleConstructorReturn(this, _Error.call(this, format.apply(undefined, [ERRORS[code]].concat(interpolations)).trim()));\n }\n return possibleConstructorReturn(_this);\n }\n\n return StyledComponentsError;\n}(Error);\n\n// \nvar SC_COMPONENT_ID = /^[^\\S\\n]*?\\/\\* sc-component-id:\\s*(\\S+)\\s+\\*\\//gm;\n\nvar extractComps = (function (maybeCSS) {\n var css = '' + (maybeCSS || ''); // Definitely a string, and a clone\n var existingComponents = [];\n css.replace(SC_COMPONENT_ID, function (match, componentId, matchIndex) {\n existingComponents.push({ componentId: componentId, matchIndex: matchIndex });\n return match;\n });\n return existingComponents.map(function (_ref, i) {\n var componentId = _ref.componentId,\n matchIndex = _ref.matchIndex;\n\n var nextComp = existingComponents[i + 1];\n var cssFromDOM = nextComp ? css.slice(matchIndex, nextComp.matchIndex) : css.slice(matchIndex);\n return { componentId: componentId, cssFromDOM: cssFromDOM };\n });\n});\n\n// \n\nvar COMMENT_REGEX = /^\\s*\\/\\/.*$/gm;\n\n// NOTE: This stylis instance is only used to split rules from SSR'd style tags\nvar stylisSplitter = new Stylis({\n global: false,\n cascade: true,\n keyframe: false,\n prefix: false,\n compress: false,\n semicolon: true\n});\n\nvar stylis = new Stylis({\n global: false,\n cascade: true,\n keyframe: false,\n prefix: true,\n compress: false,\n semicolon: false // NOTE: This means \"autocomplete missing semicolons\"\n});\n\n// Wrap `insertRulePlugin to build a list of rules,\n// and then make our own plugin to return the rules. This\n// makes it easier to hook into the existing SSR architecture\n\nvar parsingRules = [];\n\n// eslint-disable-next-line consistent-return\nvar returnRulesPlugin = function returnRulesPlugin(context) {\n if (context === -2) {\n var parsedRules = parsingRules;\n parsingRules = [];\n return parsedRules;\n }\n};\n\nvar parseRulesPlugin = _insertRulePlugin(function (rule) {\n parsingRules.push(rule);\n});\n\nvar _componentId = void 0;\nvar _selector = void 0;\nvar _selectorRegexp = void 0;\n\nvar selfReferenceReplacer = function selfReferenceReplacer(match, offset, string) {\n if (\n // the first self-ref is always untouched\n offset > 0 &&\n // there should be at least two self-refs to do a replacement (.b > .b)\n string.slice(0, offset).indexOf(_selector) !== -1 &&\n // no consecutive self refs (.b.b); that is a precedence boost and treated differently\n string.slice(offset - _selector.length, offset) !== _selector) {\n return '.' + _componentId;\n }\n\n return match;\n};\n\n/**\n * When writing a style like\n *\n * & + & {\n * color: red;\n * }\n *\n * The second ampersand should be a reference to the static component class. stylis\n * has no knowledge of static class so we have to intelligently replace the base selector.\n */\nvar selfReferenceReplacementPlugin = function selfReferenceReplacementPlugin(context, _, selectors) {\n if (context === 2 && selectors.length && selectors[0].lastIndexOf(_selector) > 0) {\n // eslint-disable-next-line no-param-reassign\n selectors[0] = selectors[0].replace(_selectorRegexp, selfReferenceReplacer);\n }\n};\n\nstylis.use([selfReferenceReplacementPlugin, parseRulesPlugin, returnRulesPlugin]);\nstylisSplitter.use([parseRulesPlugin, returnRulesPlugin]);\n\nvar splitByRules = function splitByRules(css) {\n return stylisSplitter('', css);\n};\n\nfunction stringifyRules(rules, selector, prefix) {\n var componentId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '&';\n\n var flatCSS = rules.join('').replace(COMMENT_REGEX, ''); // replace JS comments\n\n var cssStr = selector && prefix ? prefix + ' ' + selector + ' { ' + flatCSS + ' }' : flatCSS;\n\n // stylis has no concept of state to be passed to plugins\n // but since JS is single=threaded, we can rely on that to ensure\n // these properties stay in sync with the current stylis run\n _componentId = componentId;\n _selector = selector;\n _selectorRegexp = new RegExp('\\\\' + _selector + '\\\\b', 'g');\n\n return stylis(prefix || !selector ? '' : selector, cssStr);\n}\n\n// \n/* eslint-disable camelcase, no-undef */\n\nvar getNonce = (function () {\n return typeof __webpack_nonce__ !== 'undefined' ? __webpack_nonce__ : null;\n});\n\n// \n/* These are helpers for the StyleTags to keep track of the injected\n * rule names for each (component) ID that they're keeping track of.\n * They're crucial for detecting whether a name has already been\n * injected.\n * (This excludes rehydrated names) */\n\n/* adds a new ID:name pairing to a names dictionary */\nvar addNameForId = function addNameForId(names, id, name) {\n if (name) {\n // eslint-disable-next-line no-param-reassign\n var namesForId = names[id] || (names[id] = Object.create(null));\n namesForId[name] = true;\n }\n};\n\n/* resets an ID entirely by overwriting it in the dictionary */\nvar resetIdNames = function resetIdNames(names, id) {\n // eslint-disable-next-line no-param-reassign\n names[id] = Object.create(null);\n};\n\n/* factory for a names dictionary checking the existance of an ID:name pairing */\nvar hasNameForId = function hasNameForId(names) {\n return function (id, name) {\n return names[id] !== undefined && names[id][name];\n };\n};\n\n/* stringifies names for the html/element output */\nvar stringifyNames = function stringifyNames(names) {\n var str = '';\n // eslint-disable-next-line guard-for-in\n for (var id in names) {\n str += Object.keys(names[id]).join(' ') + ' ';\n }\n return str.trim();\n};\n\n/* clones the nested names dictionary */\nvar cloneNames = function cloneNames(names) {\n var clone = Object.create(null);\n // eslint-disable-next-line guard-for-in\n for (var id in names) {\n clone[id] = _extends({}, names[id]);\n }\n return clone;\n};\n\n// \n\n/* These are helpers that deal with the insertRule (aka speedy) API\n * They are used in the StyleTags and specifically the speedy tag\n */\n\n/* retrieve a sheet for a given style tag */\nvar sheetForTag = function sheetForTag(tag) {\n // $FlowFixMe\n if (tag.sheet) return tag.sheet;\n\n /* Firefox quirk requires us to step through all stylesheets to find one owned by the given tag */\n var size = document.styleSheets.length;\n for (var i = 0; i < size; i += 1) {\n var sheet = document.styleSheets[i];\n // $FlowFixMe\n if (sheet.ownerNode === tag) return sheet;\n }\n\n /* we should always be able to find a tag */\n throw new StyledComponentsError(10);\n};\n\n/* insert a rule safely and return whether it was actually injected */\nvar safeInsertRule = function safeInsertRule(sheet, cssRule, index) {\n /* abort early if cssRule string is falsy */\n if (!cssRule) return false;\n\n var maxIndex = sheet.cssRules.length;\n\n try {\n /* use insertRule and cap passed index with maxIndex (no of cssRules) */\n sheet.insertRule(cssRule, index <= maxIndex ? index : maxIndex);\n } catch (err) {\n /* any error indicates an invalid rule */\n return false;\n }\n\n return true;\n};\n\n/* deletes `size` rules starting from `removalIndex` */\nvar deleteRules = function deleteRules(sheet, removalIndex, size) {\n var lowerBound = removalIndex - size;\n for (var i = removalIndex; i > lowerBound; i -= 1) {\n sheet.deleteRule(i);\n }\n};\n\n// \n\n/* this marker separates component styles and is important for rehydration */\nvar makeTextMarker = function makeTextMarker(id) {\n return '\\n/* sc-component-id: ' + id + ' */\\n';\n};\n\n/* add up all numbers in array up until and including the index */\nvar addUpUntilIndex = function addUpUntilIndex(sizes, index) {\n var totalUpToIndex = 0;\n for (var i = 0; i <= index; i += 1) {\n totalUpToIndex += sizes[i];\n }\n\n return totalUpToIndex;\n};\n\n/* create a new style tag after lastEl */\nvar makeStyleTag = function makeStyleTag(target, tagEl, insertBefore) {\n var el = document.createElement('style');\n el.setAttribute(SC_ATTR, '');\n el.setAttribute(SC_VERSION_ATTR, \"4.2.0\");\n\n var nonce = getNonce();\n if (nonce) {\n el.setAttribute('nonce', nonce);\n }\n\n /* Work around insertRule quirk in EdgeHTML */\n el.appendChild(document.createTextNode(''));\n\n if (target && !tagEl) {\n /* Append to target when no previous element was passed */\n target.appendChild(el);\n } else {\n if (!tagEl || !target || !tagEl.parentNode) {\n throw new StyledComponentsError(6);\n }\n\n /* Insert new style tag after the previous one */\n tagEl.parentNode.insertBefore(el, insertBefore ? tagEl : tagEl.nextSibling);\n }\n\n return el;\n};\n\n/* takes a css factory function and outputs an html styled tag factory */\nvar wrapAsHtmlTag = function wrapAsHtmlTag(css, names) {\n return function (additionalAttrs) {\n var nonce = getNonce();\n var attrs = [nonce && 'nonce=\"' + nonce + '\"', SC_ATTR + '=\"' + stringifyNames(names) + '\"', SC_VERSION_ATTR + '=\"' + \"4.2.0\" + '\"', additionalAttrs];\n\n var htmlAttr = attrs.filter(Boolean).join(' ');\n return '';\n };\n};\n\n/* takes a css factory function and outputs an element factory */\nvar wrapAsElement = function wrapAsElement(css, names) {\n return function () {\n var _props;\n\n var props = (_props = {}, _props[SC_ATTR] = stringifyNames(names), _props[SC_VERSION_ATTR] = \"4.2.0\", _props);\n\n var nonce = getNonce();\n if (nonce) {\n // $FlowFixMe\n props.nonce = nonce;\n }\n\n // eslint-disable-next-line react/no-danger\n return React.createElement('style', _extends({}, props, { dangerouslySetInnerHTML: { __html: css() } }));\n };\n};\n\nvar getIdsFromMarkersFactory = function getIdsFromMarkersFactory(markers) {\n return function () {\n return Object.keys(markers);\n };\n};\n\n/* speedy tags utilise insertRule */\nvar makeSpeedyTag = function makeSpeedyTag(el, getImportRuleTag) {\n var names = Object.create(null);\n var markers = Object.create(null);\n var sizes = [];\n\n var extractImport = getImportRuleTag !== undefined;\n /* indicates whether getImportRuleTag was called */\n var usedImportRuleTag = false;\n\n var insertMarker = function insertMarker(id) {\n var prev = markers[id];\n if (prev !== undefined) {\n return prev;\n }\n\n markers[id] = sizes.length;\n sizes.push(0);\n resetIdNames(names, id);\n\n return markers[id];\n };\n\n var insertRules = function insertRules(id, cssRules, name) {\n var marker = insertMarker(id);\n var sheet = sheetForTag(el);\n var insertIndex = addUpUntilIndex(sizes, marker);\n\n var injectedRules = 0;\n var importRules = [];\n var cssRulesSize = cssRules.length;\n\n for (var i = 0; i < cssRulesSize; i += 1) {\n var cssRule = cssRules[i];\n var mayHaveImport = extractImport; /* @import rules are reordered to appear first */\n if (mayHaveImport && cssRule.indexOf('@import') !== -1) {\n importRules.push(cssRule);\n } else if (safeInsertRule(sheet, cssRule, insertIndex + injectedRules)) {\n mayHaveImport = false;\n injectedRules += 1;\n }\n }\n\n if (extractImport && importRules.length > 0) {\n usedImportRuleTag = true;\n // $FlowFixMe\n getImportRuleTag().insertRules(id + '-import', importRules);\n }\n\n sizes[marker] += injectedRules; /* add up no of injected rules */\n addNameForId(names, id, name);\n };\n\n var removeRules = function removeRules(id) {\n var marker = markers[id];\n if (marker === undefined) return;\n\n var size = sizes[marker];\n var sheet = sheetForTag(el);\n var removalIndex = addUpUntilIndex(sizes, marker) - 1;\n deleteRules(sheet, removalIndex, size);\n sizes[marker] = 0;\n resetIdNames(names, id);\n\n if (extractImport && usedImportRuleTag) {\n // $FlowFixMe\n getImportRuleTag().removeRules(id + '-import');\n }\n };\n\n var css = function css() {\n var _sheetForTag = sheetForTag(el),\n cssRules = _sheetForTag.cssRules;\n\n var str = '';\n\n // eslint-disable-next-line guard-for-in\n for (var id in markers) {\n str += makeTextMarker(id);\n var marker = markers[id];\n var end = addUpUntilIndex(sizes, marker);\n var size = sizes[marker];\n for (var i = end - size; i < end; i += 1) {\n var rule = cssRules[i];\n if (rule !== undefined) {\n str += rule.cssText;\n }\n }\n }\n\n return str;\n };\n\n return {\n clone: function clone() {\n throw new StyledComponentsError(5);\n },\n\n css: css,\n getIds: getIdsFromMarkersFactory(markers),\n hasNameForId: hasNameForId(names),\n insertMarker: insertMarker,\n insertRules: insertRules,\n removeRules: removeRules,\n sealed: false,\n styleTag: el,\n toElement: wrapAsElement(css, names),\n toHTML: wrapAsHtmlTag(css, names)\n };\n};\n\nvar makeTextNode = function makeTextNode(id) {\n return document.createTextNode(makeTextMarker(id));\n};\n\nvar makeBrowserTag = function makeBrowserTag(el, getImportRuleTag) {\n var names = Object.create(null);\n var markers = Object.create(null);\n\n var extractImport = getImportRuleTag !== undefined;\n\n /* indicates whether getImportRuleTag was called */\n var usedImportRuleTag = false;\n\n var insertMarker = function insertMarker(id) {\n var prev = markers[id];\n if (prev !== undefined) {\n return prev;\n }\n\n markers[id] = makeTextNode(id);\n el.appendChild(markers[id]);\n names[id] = Object.create(null);\n\n return markers[id];\n };\n\n var insertRules = function insertRules(id, cssRules, name) {\n var marker = insertMarker(id);\n var importRules = [];\n var cssRulesSize = cssRules.length;\n\n for (var i = 0; i < cssRulesSize; i += 1) {\n var rule = cssRules[i];\n var mayHaveImport = extractImport;\n if (mayHaveImport && rule.indexOf('@import') !== -1) {\n importRules.push(rule);\n } else {\n mayHaveImport = false;\n var separator = i === cssRulesSize - 1 ? '' : ' ';\n marker.appendData('' + rule + separator);\n }\n }\n\n addNameForId(names, id, name);\n\n if (extractImport && importRules.length > 0) {\n usedImportRuleTag = true;\n // $FlowFixMe\n getImportRuleTag().insertRules(id + '-import', importRules);\n }\n };\n\n var removeRules = function removeRules(id) {\n var marker = markers[id];\n if (marker === undefined) return;\n\n /* create new empty text node and replace the current one */\n var newMarker = makeTextNode(id);\n el.replaceChild(newMarker, marker);\n markers[id] = newMarker;\n resetIdNames(names, id);\n\n if (extractImport && usedImportRuleTag) {\n // $FlowFixMe\n getImportRuleTag().removeRules(id + '-import');\n }\n };\n\n var css = function css() {\n var str = '';\n\n // eslint-disable-next-line guard-for-in\n for (var id in markers) {\n str += markers[id].data;\n }\n\n return str;\n };\n\n return {\n clone: function clone() {\n throw new StyledComponentsError(5);\n },\n\n css: css,\n getIds: getIdsFromMarkersFactory(markers),\n hasNameForId: hasNameForId(names),\n insertMarker: insertMarker,\n insertRules: insertRules,\n removeRules: removeRules,\n sealed: false,\n styleTag: el,\n toElement: wrapAsElement(css, names),\n toHTML: wrapAsHtmlTag(css, names)\n };\n};\n\nvar makeServerTag = function makeServerTag(namesArg, markersArg) {\n var names = namesArg === undefined ? Object.create(null) : namesArg;\n var markers = markersArg === undefined ? Object.create(null) : markersArg;\n\n var insertMarker = function insertMarker(id) {\n var prev = markers[id];\n if (prev !== undefined) {\n return prev;\n }\n\n return markers[id] = [''];\n };\n\n var insertRules = function insertRules(id, cssRules, name) {\n var marker = insertMarker(id);\n marker[0] += cssRules.join(' ');\n addNameForId(names, id, name);\n };\n\n var removeRules = function removeRules(id) {\n var marker = markers[id];\n if (marker === undefined) return;\n marker[0] = '';\n resetIdNames(names, id);\n };\n\n var css = function css() {\n var str = '';\n // eslint-disable-next-line guard-for-in\n for (var id in markers) {\n var cssForId = markers[id][0];\n if (cssForId) {\n str += makeTextMarker(id) + cssForId;\n }\n }\n return str;\n };\n\n var clone = function clone() {\n var namesClone = cloneNames(names);\n var markersClone = Object.create(null);\n\n // eslint-disable-next-line guard-for-in\n for (var id in markers) {\n markersClone[id] = [markers[id][0]];\n }\n\n return makeServerTag(namesClone, markersClone);\n };\n\n var tag = {\n clone: clone,\n css: css,\n getIds: getIdsFromMarkersFactory(markers),\n hasNameForId: hasNameForId(names),\n insertMarker: insertMarker,\n insertRules: insertRules,\n removeRules: removeRules,\n sealed: false,\n styleTag: null,\n toElement: wrapAsElement(css, names),\n toHTML: wrapAsHtmlTag(css, names)\n };\n\n return tag;\n};\n\nvar makeTag = function makeTag(target, tagEl, forceServer, insertBefore, getImportRuleTag) {\n if (IS_BROWSER && !forceServer) {\n var el = makeStyleTag(target, tagEl, insertBefore);\n\n if (DISABLE_SPEEDY) {\n return makeBrowserTag(el, getImportRuleTag);\n } else {\n return makeSpeedyTag(el, getImportRuleTag);\n }\n }\n\n return makeServerTag();\n};\n\nvar rehydrate = function rehydrate(tag, els, extracted) {\n /* add all extracted components to the new tag */\n for (var i = 0, len = extracted.length; i < len; i += 1) {\n var _extracted$i = extracted[i],\n componentId = _extracted$i.componentId,\n cssFromDOM = _extracted$i.cssFromDOM;\n\n var cssRules = splitByRules(cssFromDOM);\n tag.insertRules(componentId, cssRules);\n }\n\n /* remove old HTMLStyleElements, since they have been rehydrated */\n for (var _i = 0, _len = els.length; _i < _len; _i += 1) {\n var el = els[_i];\n if (el.parentNode) {\n el.parentNode.removeChild(el);\n }\n }\n};\n\n// \n\nvar SPLIT_REGEX = /\\s+/;\n\n/* determine the maximum number of components before tags are sharded */\nvar MAX_SIZE = void 0;\nif (IS_BROWSER) {\n /* in speedy mode we can keep a lot more rules in a sheet before a slowdown can be expected */\n MAX_SIZE = DISABLE_SPEEDY ? 40 : 1000;\n} else {\n /* for servers we do not need to shard at all */\n MAX_SIZE = -1;\n}\n\nvar sheetRunningId = 0;\nvar master = void 0;\n\nvar StyleSheet = function () {\n\n /* a map from ids to tags */\n\n /* deferred rules for a given id */\n\n /* this is used for not reinjecting rules via hasNameForId() */\n\n /* when rules for an id are removed using remove() we have to ignore rehydratedNames for it */\n\n /* a list of tags belonging to this StyleSheet */\n\n /* a tag for import rules */\n\n /* current capacity until a new tag must be created */\n\n /* children (aka clones) of this StyleSheet inheriting all and future injections */\n\n function StyleSheet() {\n var _this = this;\n\n var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : IS_BROWSER ? document.head : null;\n var forceServer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n classCallCheck(this, StyleSheet);\n\n this.getImportRuleTag = function () {\n var importRuleTag = _this.importRuleTag;\n\n if (importRuleTag !== undefined) {\n return importRuleTag;\n }\n\n var firstTag = _this.tags[0];\n var insertBefore = true;\n\n return _this.importRuleTag = makeTag(_this.target, firstTag ? firstTag.styleTag : null, _this.forceServer, insertBefore);\n };\n\n sheetRunningId += 1;\n this.id = sheetRunningId;\n this.forceServer = forceServer;\n this.target = forceServer ? null : target;\n this.tagMap = {};\n this.deferred = {};\n this.rehydratedNames = {};\n this.ignoreRehydratedNames = {};\n this.tags = [];\n this.capacity = 1;\n this.clones = [];\n }\n\n /* rehydrate all SSR'd style tags */\n\n\n StyleSheet.prototype.rehydrate = function rehydrate$$1() {\n if (!IS_BROWSER || this.forceServer) return this;\n\n var els = [];\n var extracted = [];\n var isStreamed = false;\n\n /* retrieve all of our SSR style elements from the DOM */\n var nodes = document.querySelectorAll('style[' + SC_ATTR + '][' + SC_VERSION_ATTR + '=\"' + \"4.2.0\" + '\"]');\n\n var nodesSize = nodes.length;\n\n /* abort rehydration if no previous style tags were found */\n if (!nodesSize) return this;\n\n for (var i = 0; i < nodesSize; i += 1) {\n var el = nodes[i];\n\n /* check if style tag is a streamed tag */\n if (!isStreamed) isStreamed = !!el.getAttribute(SC_STREAM_ATTR);\n\n /* retrieve all component names */\n var elNames = (el.getAttribute(SC_ATTR) || '').trim().split(SPLIT_REGEX);\n var elNamesSize = elNames.length;\n for (var j = 0, name; j < elNamesSize; j += 1) {\n name = elNames[j];\n /* add rehydrated name to sheet to avoid re-adding styles */\n this.rehydratedNames[name] = true;\n }\n\n /* extract all components and their CSS */\n extracted.push.apply(extracted, extractComps(el.textContent));\n\n /* store original HTMLStyleElement */\n els.push(el);\n }\n\n /* abort rehydration if nothing was extracted */\n var extractedSize = extracted.length;\n if (!extractedSize) return this;\n\n /* create a tag to be used for rehydration */\n var tag = this.makeTag(null);\n\n rehydrate(tag, els, extracted);\n\n /* reset capacity and adjust MAX_SIZE by the initial size of the rehydration */\n this.capacity = Math.max(1, MAX_SIZE - extractedSize);\n this.tags.push(tag);\n\n /* retrieve all component ids */\n for (var _j = 0; _j < extractedSize; _j += 1) {\n this.tagMap[extracted[_j].componentId] = tag;\n }\n\n return this;\n };\n\n /* retrieve a \"master\" instance of StyleSheet which is typically used when no other is available\n * The master StyleSheet is targeted by createGlobalStyle, keyframes, and components outside of any\n * StyleSheetManager's context */\n\n\n /* reset the internal \"master\" instance */\n StyleSheet.reset = function reset() {\n var forceServer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n master = new StyleSheet(undefined, forceServer).rehydrate();\n };\n\n /* adds \"children\" to the StyleSheet that inherit all of the parents' rules\n * while their own rules do not affect the parent */\n\n\n StyleSheet.prototype.clone = function clone() {\n var sheet = new StyleSheet(this.target, this.forceServer);\n\n /* add to clone array */\n this.clones.push(sheet);\n\n /* clone all tags */\n sheet.tags = this.tags.map(function (tag) {\n var ids = tag.getIds();\n var newTag = tag.clone();\n\n /* reconstruct tagMap */\n for (var i = 0; i < ids.length; i += 1) {\n sheet.tagMap[ids[i]] = newTag;\n }\n\n return newTag;\n });\n\n /* clone other maps */\n sheet.rehydratedNames = _extends({}, this.rehydratedNames);\n sheet.deferred = _extends({}, this.deferred);\n\n return sheet;\n };\n\n /* force StyleSheet to create a new tag on the next injection */\n\n\n StyleSheet.prototype.sealAllTags = function sealAllTags() {\n this.capacity = 1;\n\n this.tags.forEach(function (tag) {\n // eslint-disable-next-line no-param-reassign\n tag.sealed = true;\n });\n };\n\n StyleSheet.prototype.makeTag = function makeTag$$1(tag) {\n var lastEl = tag ? tag.styleTag : null;\n var insertBefore = false;\n\n return makeTag(this.target, lastEl, this.forceServer, insertBefore, this.getImportRuleTag);\n };\n\n /* get a tag for a given componentId, assign the componentId to one, or shard */\n StyleSheet.prototype.getTagForId = function getTagForId(id) {\n /* simply return a tag, when the componentId was already assigned one */\n var prev = this.tagMap[id];\n if (prev !== undefined && !prev.sealed) {\n return prev;\n }\n\n var tag = this.tags[this.tags.length - 1];\n\n /* shard (create a new tag) if the tag is exhausted (See MAX_SIZE) */\n this.capacity -= 1;\n\n if (this.capacity === 0) {\n this.capacity = MAX_SIZE;\n tag = this.makeTag(tag);\n this.tags.push(tag);\n }\n\n return this.tagMap[id] = tag;\n };\n\n /* mainly for createGlobalStyle to check for its id */\n\n\n StyleSheet.prototype.hasId = function hasId(id) {\n return this.tagMap[id] !== undefined;\n };\n\n /* caching layer checking id+name to already have a corresponding tag and injected rules */\n\n\n StyleSheet.prototype.hasNameForId = function hasNameForId(id, name) {\n /* exception for rehydrated names which are checked separately */\n if (this.ignoreRehydratedNames[id] === undefined && this.rehydratedNames[name]) {\n return true;\n }\n\n var tag = this.tagMap[id];\n return tag !== undefined && tag.hasNameForId(id, name);\n };\n\n /* registers a componentId and registers it on its tag */\n\n\n StyleSheet.prototype.deferredInject = function deferredInject(id, cssRules) {\n /* don't inject when the id is already registered */\n if (this.tagMap[id] !== undefined) return;\n\n var clones = this.clones;\n\n for (var i = 0; i < clones.length; i += 1) {\n clones[i].deferredInject(id, cssRules);\n }\n\n this.getTagForId(id).insertMarker(id);\n this.deferred[id] = cssRules;\n };\n\n /* injects rules for a given id with a name that will need to be cached */\n\n\n StyleSheet.prototype.inject = function inject(id, cssRules, name) {\n var clones = this.clones;\n\n\n for (var i = 0; i < clones.length; i += 1) {\n clones[i].inject(id, cssRules, name);\n }\n\n var tag = this.getTagForId(id);\n\n /* add deferred rules for component */\n if (this.deferred[id] !== undefined) {\n // Combine passed cssRules with previously deferred CSS rules\n // NOTE: We cannot mutate the deferred array itself as all clones\n // do the same (see clones[i].inject)\n var rules = this.deferred[id].concat(cssRules);\n tag.insertRules(id, rules, name);\n\n this.deferred[id] = undefined;\n } else {\n tag.insertRules(id, cssRules, name);\n }\n };\n\n /* removes all rules for a given id, which doesn't remove its marker but resets it */\n\n\n StyleSheet.prototype.remove = function remove(id) {\n var tag = this.tagMap[id];\n if (tag === undefined) return;\n\n var clones = this.clones;\n\n for (var i = 0; i < clones.length; i += 1) {\n clones[i].remove(id);\n }\n\n /* remove all rules from the tag */\n tag.removeRules(id);\n\n /* ignore possible rehydrated names */\n this.ignoreRehydratedNames[id] = true;\n\n /* delete possible deferred rules */\n this.deferred[id] = undefined;\n };\n\n StyleSheet.prototype.toHTML = function toHTML() {\n return this.tags.map(function (tag) {\n return tag.toHTML();\n }).join('');\n };\n\n StyleSheet.prototype.toReactElements = function toReactElements() {\n var id = this.id;\n\n\n return this.tags.map(function (tag, i) {\n var key = 'sc-' + id + '-' + i;\n return cloneElement(tag.toElement(), { key: key });\n });\n };\n\n createClass(StyleSheet, null, [{\n key: 'master',\n get: function get$$1() {\n return master || (master = new StyleSheet().rehydrate());\n }\n\n /* NOTE: This is just for backwards-compatibility with jest-styled-components */\n\n }, {\n key: 'instance',\n get: function get$$1() {\n return StyleSheet.master;\n }\n }]);\n return StyleSheet;\n}();\n\n// \n\nvar Keyframes = function () {\n function Keyframes(name, rules) {\n var _this = this;\n\n classCallCheck(this, Keyframes);\n\n this.inject = function (styleSheet) {\n if (!styleSheet.hasNameForId(_this.id, _this.name)) {\n styleSheet.inject(_this.id, _this.rules, _this.name);\n }\n };\n\n this.toString = function () {\n throw new StyledComponentsError(12, String(_this.name));\n };\n\n this.name = name;\n this.rules = rules;\n\n this.id = 'sc-keyframes-' + name;\n }\n\n Keyframes.prototype.getName = function getName() {\n return this.name;\n };\n\n return Keyframes;\n}();\n\n// \n\n/**\n * inlined version of\n * https://github.com/facebook/fbjs/blob/master/packages/fbjs/src/core/hyphenateStyleName.js\n */\n\nvar uppercasePattern = /([A-Z])/g;\nvar msPattern = /^ms-/;\n\n/**\n * Hyphenates a camelcased CSS property name, for example:\n *\n * > hyphenateStyleName('backgroundColor')\n * < \"background-color\"\n * > hyphenateStyleName('MozTransition')\n * < \"-moz-transition\"\n * > hyphenateStyleName('msTransition')\n * < \"-ms-transition\"\n *\n * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix\n * is converted to `-ms-`.\n *\n * @param {string} string\n * @return {string}\n */\nfunction hyphenateStyleName(string) {\n return string.replace(uppercasePattern, '-$1').toLowerCase().replace(msPattern, '-ms-');\n}\n\n// \n\n// Taken from https://github.com/facebook/react/blob/b87aabdfe1b7461e7331abb3601d9e6bb27544bc/packages/react-dom/src/shared/dangerousStyleValue.js\nfunction addUnitIfNeeded(name, value) {\n // https://github.com/amilajack/eslint-plugin-flowtype-errors/issues/133\n // $FlowFixMe\n if (value == null || typeof value === 'boolean' || value === '') {\n return '';\n }\n\n if (typeof value === 'number' && value !== 0 && !(name in unitless)) {\n return value + 'px'; // Presumes implicit 'px' suffix for unitless numbers\n }\n\n return String(value).trim();\n}\n\n// \n\n/**\n * It's falsish not falsy because 0 is allowed.\n */\nvar isFalsish = function isFalsish(chunk) {\n return chunk === undefined || chunk === null || chunk === false || chunk === '';\n};\n\nvar objToCss = function objToCss(obj, prevKey) {\n var css = Object.keys(obj).filter(function (key) {\n return !isFalsish(obj[key]);\n }).map(function (key) {\n if (isPlainObject(obj[key])) return objToCss(obj[key], key);\n return hyphenateStyleName(key) + ': ' + addUnitIfNeeded(key, obj[key]) + ';';\n }).join(' ');\n return prevKey ? prevKey + ' {\\n ' + css + '\\n}' : css;\n};\n\nfunction flatten(chunk, executionContext, styleSheet) {\n if (Array.isArray(chunk)) {\n var ruleSet = [];\n\n for (var i = 0, len = chunk.length, result; i < len; i += 1) {\n result = flatten(chunk[i], executionContext, styleSheet);\n\n if (result === null) continue;else if (Array.isArray(result)) ruleSet.push.apply(ruleSet, result);else ruleSet.push(result);\n }\n\n return ruleSet;\n }\n\n if (isFalsish(chunk)) {\n return null;\n }\n\n /* Handle other components */\n if (isStyledComponent(chunk)) {\n return '.' + chunk.styledComponentId;\n }\n\n /* Either execute or defer the function */\n if (isFunction(chunk)) {\n if (isStatelessFunction(chunk) && executionContext) {\n var _result = chunk(executionContext);\n\n if (process.env.NODE_ENV !== 'production' && isElement(_result)) {\n // eslint-disable-next-line no-console\n console.warn(getComponentName(chunk) + ' is not a styled component and cannot be referred to via component selector. See https://www.styled-components.com/docs/advanced#referring-to-other-components for more details.');\n }\n\n return flatten(_result, executionContext, styleSheet);\n } else return chunk;\n }\n\n if (chunk instanceof Keyframes) {\n if (styleSheet) {\n chunk.inject(styleSheet);\n return chunk.getName();\n } else return chunk;\n }\n\n /* Handle objects */\n return isPlainObject(chunk) ? objToCss(chunk) : chunk.toString();\n}\n\n// \n\nfunction css(styles) {\n for (var _len = arguments.length, interpolations = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n interpolations[_key - 1] = arguments[_key];\n }\n\n if (isFunction(styles) || isPlainObject(styles)) {\n // $FlowFixMe\n return flatten(interleave(EMPTY_ARRAY, [styles].concat(interpolations)));\n }\n\n // $FlowFixMe\n return flatten(interleave(styles, interpolations));\n}\n\n// \n\nfunction constructWithOptions(componentConstructor, tag) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : EMPTY_OBJECT;\n\n if (!isValidElementType(tag)) {\n throw new StyledComponentsError(1, String(tag));\n }\n\n /* This is callable directly as a template function */\n // $FlowFixMe: Not typed to avoid destructuring arguments\n var templateFunction = function templateFunction() {\n return componentConstructor(tag, options, css.apply(undefined, arguments));\n };\n\n /* If config methods are called, wrap up a new template function and merge options */\n templateFunction.withConfig = function (config) {\n return constructWithOptions(componentConstructor, tag, _extends({}, options, config));\n };\n\n /* Modify/inject new props at runtime */\n templateFunction.attrs = function (attrs) {\n return constructWithOptions(componentConstructor, tag, _extends({}, options, {\n attrs: Array.prototype.concat(options.attrs, attrs).filter(Boolean)\n }));\n };\n\n return templateFunction;\n}\n\n// \n// Source: https://github.com/garycourt/murmurhash-js/blob/master/murmurhash2_gc.js\nfunction murmurhash(c) {\n for (var e = c.length | 0, a = e | 0, d = 0, b; e >= 4;) {\n b = c.charCodeAt(d) & 255 | (c.charCodeAt(++d) & 255) << 8 | (c.charCodeAt(++d) & 255) << 16 | (c.charCodeAt(++d) & 255) << 24, b = 1540483477 * (b & 65535) + ((1540483477 * (b >>> 16) & 65535) << 16), b ^= b >>> 24, b = 1540483477 * (b & 65535) + ((1540483477 * (b >>> 16) & 65535) << 16), a = 1540483477 * (a & 65535) + ((1540483477 * (a >>> 16) & 65535) << 16) ^ b, e -= 4, ++d;\n }\n switch (e) {\n case 3:\n a ^= (c.charCodeAt(d + 2) & 255) << 16;\n case 2:\n a ^= (c.charCodeAt(d + 1) & 255) << 8;\n case 1:\n a ^= c.charCodeAt(d) & 255, a = 1540483477 * (a & 65535) + ((1540483477 * (a >>> 16) & 65535) << 16);\n }\n a ^= a >>> 13;\n a = 1540483477 * (a & 65535) + ((1540483477 * (a >>> 16) & 65535) << 16);\n return (a ^ a >>> 15) >>> 0;\n}\n\n// \n/* eslint-disable no-bitwise */\n\n/* This is the \"capacity\" of our alphabet i.e. 2x26 for all letters plus their capitalised\n * counterparts */\nvar charsLength = 52;\n\n/* start at 75 for 'a' until 'z' (25) and then start at 65 for capitalised letters */\nvar getAlphabeticChar = function getAlphabeticChar(code) {\n return String.fromCharCode(code + (code > 25 ? 39 : 97));\n};\n\n/* input a number, usually a hash and convert it to base-52 */\nfunction generateAlphabeticName(code) {\n var name = '';\n var x = void 0;\n\n /* get a char and divide by alphabet-length */\n for (x = code; x > charsLength; x = Math.floor(x / charsLength)) {\n name = getAlphabeticChar(x % charsLength) + name;\n }\n\n return getAlphabeticChar(x % charsLength) + name;\n}\n\n// \n\nfunction hasFunctionObjectKey(obj) {\n // eslint-disable-next-line guard-for-in, no-restricted-syntax\n for (var key in obj) {\n if (isFunction(obj[key])) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction isStaticRules(rules, attrs) {\n for (var i = 0; i < rules.length; i += 1) {\n var rule = rules[i];\n\n // recursive case\n if (Array.isArray(rule) && !isStaticRules(rule, attrs)) {\n return false;\n } else if (isFunction(rule) && !isStyledComponent(rule)) {\n // functions are allowed to be static if they're just being\n // used to get the classname of a nested styled component\n return false;\n }\n }\n\n if (attrs.some(function (x) {\n return isFunction(x) || hasFunctionObjectKey(x);\n })) return false;\n\n return true;\n}\n\n// \n\nvar isHMREnabled = process.env.NODE_ENV !== 'production' && typeof module !== 'undefined' && module.hot;\n\n/* combines hashStr (murmurhash) and nameGenerator for convenience */\nvar hasher = function hasher(str) {\n return generateAlphabeticName(murmurhash(str));\n};\n\n/*\n ComponentStyle is all the CSS-specific stuff, not\n the React-specific stuff.\n */\n\nvar ComponentStyle = function () {\n function ComponentStyle(rules, attrs, componentId) {\n classCallCheck(this, ComponentStyle);\n\n this.rules = rules;\n this.isStatic = !isHMREnabled && isStaticRules(rules, attrs);\n this.componentId = componentId;\n\n if (!StyleSheet.master.hasId(componentId)) {\n StyleSheet.master.deferredInject(componentId, []);\n }\n }\n\n /*\n * Flattens a rule set into valid CSS\n * Hashes it, wraps the whole chunk in a .hash1234 {}\n * Returns the hash to be injected on render()\n * */\n\n\n ComponentStyle.prototype.generateAndInjectStyles = function generateAndInjectStyles(executionContext, styleSheet) {\n var isStatic = this.isStatic,\n componentId = this.componentId,\n lastClassName = this.lastClassName;\n\n if (IS_BROWSER && isStatic && typeof lastClassName === 'string' && styleSheet.hasNameForId(componentId, lastClassName)) {\n return lastClassName;\n }\n\n var flatCSS = flatten(this.rules, executionContext, styleSheet);\n var name = hasher(this.componentId + flatCSS.join(''));\n if (!styleSheet.hasNameForId(componentId, name)) {\n styleSheet.inject(this.componentId, stringifyRules(flatCSS, '.' + name, undefined, componentId), name);\n }\n\n this.lastClassName = name;\n return name;\n };\n\n ComponentStyle.generateName = function generateName(str) {\n return hasher(str);\n };\n\n return ComponentStyle;\n}();\n\n// \n\nvar LIMIT = 200;\n\nvar createWarnTooManyClasses = (function (displayName) {\n var generatedClasses = {};\n var warningSeen = false;\n\n return function (className) {\n if (!warningSeen) {\n generatedClasses[className] = true;\n if (Object.keys(generatedClasses).length >= LIMIT) {\n // Unable to find latestRule in test environment.\n /* eslint-disable no-console, prefer-template */\n console.warn('Over ' + LIMIT + ' classes were generated for component ' + displayName + '. \\n' + 'Consider using the attrs method, together with a style object for frequently changed styles.\\n' + 'Example:\\n' + ' const Component = styled.div.attrs({\\n' + ' style: ({ background }) => ({\\n' + ' background,\\n' + ' }),\\n' + ' })`width: 100%;`\\n\\n' + ' ');\n warningSeen = true;\n generatedClasses = {};\n }\n }\n };\n});\n\n// \n\nvar determineTheme = (function (props, fallbackTheme) {\n var defaultProps = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : EMPTY_OBJECT;\n\n // Props should take precedence over ThemeProvider, which should take precedence over\n // defaultProps, but React automatically puts defaultProps on props.\n\n /* eslint-disable react/prop-types, flowtype-errors/show-errors */\n var isDefaultTheme = defaultProps ? props.theme === defaultProps.theme : false;\n var theme = props.theme && !isDefaultTheme ? props.theme : fallbackTheme || defaultProps.theme;\n /* eslint-enable */\n\n return theme;\n});\n\n// \nvar escapeRegex = /[[\\].#*$><+~=|^:(),\"'`-]+/g;\nvar dashesAtEnds = /(^-|-$)/g;\n\n/**\n * TODO: Explore using CSS.escape when it becomes more available\n * in evergreen browsers.\n */\nfunction escape(str) {\n return str\n // Replace all possible CSS selectors\n .replace(escapeRegex, '-')\n\n // Remove extraneous hyphens at the start and end\n .replace(dashesAtEnds, '');\n}\n\n// \n\nfunction isTag(target) {\n return typeof target === 'string' && (process.env.NODE_ENV !== 'production' ? target.charAt(0) === target.charAt(0).toLowerCase() : true);\n}\n\n// \n\nfunction generateDisplayName(target) {\n // $FlowFixMe\n return isTag(target) ? 'styled.' + target : 'Styled(' + getComponentName(target) + ')';\n}\n\nvar _TYPE_STATICS;\n\nvar REACT_STATICS = {\n childContextTypes: true,\n contextTypes: true,\n defaultProps: true,\n displayName: true,\n getDerivedStateFromProps: true,\n propTypes: true,\n type: true\n};\n\nvar KNOWN_STATICS = {\n name: true,\n length: true,\n prototype: true,\n caller: true,\n callee: true,\n arguments: true,\n arity: true\n};\n\nvar TYPE_STATICS = (_TYPE_STATICS = {}, _TYPE_STATICS[ForwardRef] = {\n $$typeof: true,\n render: true\n}, _TYPE_STATICS);\n\nvar defineProperty$1 = Object.defineProperty,\n getOwnPropertyNames = Object.getOwnPropertyNames,\n _Object$getOwnPropert = Object.getOwnPropertySymbols,\n getOwnPropertySymbols = _Object$getOwnPropert === undefined ? function () {\n return [];\n} : _Object$getOwnPropert,\n getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor,\n getPrototypeOf = Object.getPrototypeOf,\n objectPrototype = Object.prototype;\nvar arrayPrototype = Array.prototype;\n\n\nfunction hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {\n if (typeof sourceComponent !== 'string') {\n // don't hoist over string (html) components\n\n var inheritedComponent = getPrototypeOf(sourceComponent);\n\n if (inheritedComponent && inheritedComponent !== objectPrototype) {\n hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);\n }\n\n var keys = arrayPrototype.concat(getOwnPropertyNames(sourceComponent),\n // $FlowFixMe\n getOwnPropertySymbols(sourceComponent));\n\n var targetStatics = TYPE_STATICS[targetComponent.$$typeof] || REACT_STATICS;\n\n var sourceStatics = TYPE_STATICS[sourceComponent.$$typeof] || REACT_STATICS;\n\n var i = keys.length;\n var descriptor = void 0;\n var key = void 0;\n\n // eslint-disable-next-line no-plusplus\n while (i--) {\n key = keys[i];\n\n if (\n // $FlowFixMe\n !KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) &&\n // $FlowFixMe\n !(targetStatics && targetStatics[key])) {\n descriptor = getOwnPropertyDescriptor(sourceComponent, key);\n\n if (descriptor) {\n try {\n // Avoid failures from read-only properties\n defineProperty$1(targetComponent, key, descriptor);\n } catch (e) {\n /* fail silently */\n }\n }\n }\n }\n\n return targetComponent;\n }\n\n return targetComponent;\n}\n\n// \nfunction isDerivedReactComponent(fn) {\n return !!(fn && fn.prototype && fn.prototype.isReactComponent);\n}\n\n// \n// Helper to call a given function, only once\nvar once = (function (cb) {\n var called = false;\n\n return function () {\n if (!called) {\n called = true;\n cb.apply(undefined, arguments);\n }\n };\n});\n\n// \n\nvar ThemeContext = createContext();\n\nvar ThemeConsumer = ThemeContext.Consumer;\n\n/**\n * Provide a theme to an entire react component tree via context\n */\n\nvar ThemeProvider = function (_Component) {\n inherits(ThemeProvider, _Component);\n\n function ThemeProvider(props) {\n classCallCheck(this, ThemeProvider);\n\n var _this = possibleConstructorReturn(this, _Component.call(this, props));\n\n _this.getContext = memoize(_this.getContext.bind(_this));\n _this.renderInner = _this.renderInner.bind(_this);\n return _this;\n }\n\n ThemeProvider.prototype.render = function render() {\n if (!this.props.children) return null;\n\n return React.createElement(\n ThemeContext.Consumer,\n null,\n this.renderInner\n );\n };\n\n ThemeProvider.prototype.renderInner = function renderInner(outerTheme) {\n var context = this.getContext(this.props.theme, outerTheme);\n\n return React.createElement(\n ThemeContext.Provider,\n { value: context },\n React.Children.only(this.props.children)\n );\n };\n\n /**\n * Get the theme from the props, supporting both (outerTheme) => {}\n * as well as object notation\n */\n\n\n ThemeProvider.prototype.getTheme = function getTheme(theme, outerTheme) {\n if (isFunction(theme)) {\n var mergedTheme = theme(outerTheme);\n\n if (process.env.NODE_ENV !== 'production' && (mergedTheme === null || Array.isArray(mergedTheme) || (typeof mergedTheme === 'undefined' ? 'undefined' : _typeof(mergedTheme)) !== 'object')) {\n throw new StyledComponentsError(7);\n }\n\n return mergedTheme;\n }\n\n if (theme === null || Array.isArray(theme) || (typeof theme === 'undefined' ? 'undefined' : _typeof(theme)) !== 'object') {\n throw new StyledComponentsError(8);\n }\n\n return _extends({}, outerTheme, theme);\n };\n\n ThemeProvider.prototype.getContext = function getContext(theme, outerTheme) {\n return this.getTheme(theme, outerTheme);\n };\n\n return ThemeProvider;\n}(Component);\n\n// \n\nvar CLOSING_TAG_R = /^\\s*<\\/[a-z]/i;\n\nvar ServerStyleSheet = function () {\n function ServerStyleSheet() {\n classCallCheck(this, ServerStyleSheet);\n\n /* The master sheet might be reset, so keep a reference here */\n this.masterSheet = StyleSheet.master;\n this.instance = this.masterSheet.clone();\n this.sealed = false;\n }\n\n /**\n * Mark the ServerStyleSheet as being fully emitted and manually GC it from the\n * StyleSheet singleton.\n */\n\n\n ServerStyleSheet.prototype.seal = function seal() {\n if (!this.sealed) {\n /* Remove sealed StyleSheets from the master sheet */\n var index = this.masterSheet.clones.indexOf(this.instance);\n this.masterSheet.clones.splice(index, 1);\n this.sealed = true;\n }\n };\n\n ServerStyleSheet.prototype.collectStyles = function collectStyles(children) {\n if (this.sealed) {\n throw new StyledComponentsError(2);\n }\n\n return React.createElement(\n StyleSheetManager,\n { sheet: this.instance },\n children\n );\n };\n\n ServerStyleSheet.prototype.getStyleTags = function getStyleTags() {\n this.seal();\n return this.instance.toHTML();\n };\n\n ServerStyleSheet.prototype.getStyleElement = function getStyleElement() {\n this.seal();\n return this.instance.toReactElements();\n };\n\n ServerStyleSheet.prototype.interleaveWithNodeStream = function interleaveWithNodeStream(readableStream) {\n var _this = this;\n\n {\n throw new StyledComponentsError(3);\n }\n\n /* the tag index keeps track of which tags have already been emitted */\n var instance = this.instance;\n\n var instanceTagIndex = 0;\n\n var streamAttr = SC_STREAM_ATTR + '=\"true\"';\n\n var transformer = new stream.Transform({\n transform: function appendStyleChunks(chunk, /* encoding */_, callback) {\n var tags = instance.tags;\n\n var html = '';\n\n /* retrieve html for each new style tag */\n for (; instanceTagIndex < tags.length; instanceTagIndex += 1) {\n var tag = tags[instanceTagIndex];\n html += tag.toHTML(streamAttr);\n }\n\n /* force our StyleSheets to emit entirely new tags */\n instance.sealAllTags();\n\n var renderedHtml = chunk.toString();\n\n /* prepend style html to chunk, unless the start of the chunk is a closing tag in which case append right after that */\n if (CLOSING_TAG_R.test(renderedHtml)) {\n var endOfClosingTag = renderedHtml.indexOf('>');\n\n this.push(renderedHtml.slice(0, endOfClosingTag + 1) + html + renderedHtml.slice(endOfClosingTag + 1));\n } else this.push(html + renderedHtml);\n\n callback();\n }\n });\n\n readableStream.on('end', function () {\n return _this.seal();\n });\n\n readableStream.on('error', function (err) {\n _this.seal();\n\n // forward the error to the transform stream\n transformer.emit('error', err);\n });\n\n return readableStream.pipe(transformer);\n };\n\n return ServerStyleSheet;\n}();\n\n// \n\nvar StyleSheetContext = createContext();\nvar StyleSheetConsumer = StyleSheetContext.Consumer;\n\nvar StyleSheetManager = function (_Component) {\n inherits(StyleSheetManager, _Component);\n\n function StyleSheetManager(props) {\n classCallCheck(this, StyleSheetManager);\n\n var _this = possibleConstructorReturn(this, _Component.call(this, props));\n\n _this.getContext = memoize(_this.getContext);\n return _this;\n }\n\n StyleSheetManager.prototype.getContext = function getContext(sheet, target) {\n if (sheet) {\n return sheet;\n } else if (target) {\n return new StyleSheet(target);\n } else {\n throw new StyledComponentsError(4);\n }\n };\n\n StyleSheetManager.prototype.render = function render() {\n var _props = this.props,\n children = _props.children,\n sheet = _props.sheet,\n target = _props.target;\n\n\n return React.createElement(\n StyleSheetContext.Provider,\n { value: this.getContext(sheet, target) },\n process.env.NODE_ENV !== 'production' ? React.Children.only(children) : children\n );\n };\n\n return StyleSheetManager;\n}(Component);\nprocess.env.NODE_ENV !== \"production\" ? StyleSheetManager.propTypes = {\n sheet: PropTypes.oneOfType([PropTypes.instanceOf(StyleSheet), PropTypes.instanceOf(ServerStyleSheet)]),\n\n target: PropTypes.shape({\n appendChild: PropTypes.func.isRequired\n })\n} : void 0;\n\n// \n\nvar didWarnAboutClassNameUsage = new Set();\n\nvar classNameUsageCheckInjector = (function (target) {\n var elementClassName = '';\n\n var targetCDM = target.componentDidMount;\n\n // eslint-disable-next-line no-param-reassign\n target.componentDidMount = function componentDidMount() {\n if (typeof targetCDM === 'function') {\n targetCDM.call(this);\n }\n\n var forwardTarget = this.props.forwardedComponent.target;\n\n if (target.props && target.props.suppressClassNameWarning || target.attrs && target.attrs.suppressClassNameWarning || didWarnAboutClassNameUsage.has(forwardTarget)) {\n return;\n }\n\n didWarnAboutClassNameUsage.add(forwardTarget);\n\n var classNames = elementClassName.replace(/\\s+/g, ' ').trim().split(' ');\n // eslint-disable-next-line react/no-find-dom-node\n var node = ReactDOM.findDOMNode(this);\n var selector = classNames.map(function (s) {\n return '.' + s;\n }).join('');\n\n if (node && node.nodeType === 1 && !classNames.every(function (className) {\n return node.classList && node.classList.contains(className);\n }) && !node.querySelector(selector)) {\n // eslint-disable-next-line no-console\n console.warn('It looks like you\\'ve wrapped styled() around your React component (' + getComponentName(forwardTarget) + '), but the className prop is not being passed down to a child. No styles will be rendered unless className is composed within your React component.');\n }\n };\n\n var prevRenderInner = target.renderInner;\n\n // eslint-disable-next-line no-param-reassign\n target.renderInner = function renderInner() {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n var element = prevRenderInner.apply(this, args);\n\n elementClassName = element.props.className;\n\n return element;\n };\n});\n\n// \n\nvar identifiers = {};\n\n/* We depend on components having unique IDs */\nfunction generateId(_ComponentStyle, _displayName, parentComponentId) {\n var displayName = typeof _displayName !== 'string' ? 'sc' : escape(_displayName);\n\n /**\n * This ensures uniqueness if two components happen to share\n * the same displayName.\n */\n var nr = (identifiers[displayName] || 0) + 1;\n identifiers[displayName] = nr;\n\n var componentId = displayName + '-' + _ComponentStyle.generateName(displayName + nr);\n\n return parentComponentId ? parentComponentId + '-' + componentId : componentId;\n}\n\n// $FlowFixMe\n\nvar StyledComponent = function (_Component) {\n inherits(StyledComponent, _Component);\n\n function StyledComponent() {\n classCallCheck(this, StyledComponent);\n\n var _this = possibleConstructorReturn(this, _Component.call(this));\n\n _this.attrs = {};\n\n _this.renderOuter = _this.renderOuter.bind(_this);\n _this.renderInner = _this.renderInner.bind(_this);\n\n if (process.env.NODE_ENV !== 'production') {\n _this.warnInnerRef = once(function (displayName) {\n return (\n // eslint-disable-next-line no-console\n console.warn('The \"innerRef\" API has been removed in styled-components v4 in favor of React 16 ref forwarding, use \"ref\" instead like a typical component. \"innerRef\" was detected on component \"' + displayName + '\".')\n );\n });\n\n _this.warnAttrsFnObjectKeyDeprecated = once(function (key, displayName) {\n return (\n // eslint-disable-next-line no-console\n console.warn('Functions as object-form attrs({}) keys are now deprecated and will be removed in a future version of styled-components. Switch to the new attrs(props => ({})) syntax instead for easier and more powerful composition. The attrs key in question is \"' + key + '\" on component \"' + displayName + '\".')\n );\n });\n\n _this.warnNonStyledComponentAttrsObjectKey = once(function (key, displayName) {\n return (\n // eslint-disable-next-line no-console\n console.warn('It looks like you\\'ve used a non styled-component as the value for the \"' + key + '\" prop in an object-form attrs constructor of \"' + displayName + '\".\\n' + 'You should use the new function-form attrs constructor which avoids this issue: attrs(props => ({ yourStuff }))\\n' + \"To continue using the deprecated object syntax, you'll need to wrap your component prop in a function to make it available inside the styled component (you'll still get the deprecation warning though.)\\n\" + ('For example, { ' + key + ': () => InnerComponent } instead of { ' + key + ': InnerComponent }'))\n );\n });\n }\n\n if (process.env.NODE_ENV !== 'production' && IS_BROWSER) {\n classNameUsageCheckInjector(_this);\n }\n return _this;\n }\n\n StyledComponent.prototype.render = function render() {\n return React.createElement(\n StyleSheetConsumer,\n null,\n this.renderOuter\n );\n };\n\n StyledComponent.prototype.renderOuter = function renderOuter() {\n var styleSheet = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : StyleSheet.master;\n\n this.styleSheet = styleSheet;\n\n // No need to subscribe a static component to theme changes, it won't change anything\n if (this.props.forwardedComponent.componentStyle.isStatic) return this.renderInner();\n\n return React.createElement(\n ThemeConsumer,\n null,\n this.renderInner\n );\n };\n\n StyledComponent.prototype.renderInner = function renderInner(theme) {\n var _props$forwardedCompo = this.props.forwardedComponent,\n componentStyle = _props$forwardedCompo.componentStyle,\n defaultProps = _props$forwardedCompo.defaultProps,\n displayName = _props$forwardedCompo.displayName,\n foldedComponentIds = _props$forwardedCompo.foldedComponentIds,\n styledComponentId = _props$forwardedCompo.styledComponentId,\n target = _props$forwardedCompo.target;\n\n\n var generatedClassName = void 0;\n if (componentStyle.isStatic) {\n generatedClassName = this.generateAndInjectStyles(EMPTY_OBJECT, this.props);\n } else if (theme !== undefined) {\n generatedClassName = this.generateAndInjectStyles(determineTheme(this.props, theme, defaultProps), this.props);\n } else {\n generatedClassName = this.generateAndInjectStyles(this.props.theme || EMPTY_OBJECT, this.props);\n }\n\n var elementToBeCreated = this.props.as || this.attrs.as || target;\n var isTargetTag = isTag(elementToBeCreated);\n\n var propsForElement = {};\n var computedProps = _extends({}, this.attrs, this.props);\n\n var key = void 0;\n // eslint-disable-next-line guard-for-in\n for (key in computedProps) {\n if (process.env.NODE_ENV !== 'production' && key === 'innerRef' && isTargetTag) {\n this.warnInnerRef(displayName);\n }\n\n if (key === 'forwardedComponent' || key === 'as' || key === 'suppressClassNameWarning') {\n continue;\n } else if (key === 'forwardedRef') propsForElement.ref = computedProps[key];else if (!isTargetTag || validAttr(key)) {\n // Don't pass through non HTML tags through to HTML elements\n propsForElement[key] = computedProps[key];\n }\n }\n\n if (this.props.style && this.attrs.style) {\n propsForElement.style = _extends({}, this.attrs.style, this.props.style);\n }\n\n propsForElement.className = Array.prototype.concat(foldedComponentIds, this.props.className, styledComponentId, this.attrs.className, generatedClassName).filter(Boolean).join(' ');\n\n return createElement(elementToBeCreated, propsForElement);\n };\n\n StyledComponent.prototype.buildExecutionContext = function buildExecutionContext(theme, props, attrs) {\n var _this2 = this;\n\n var context = _extends({}, props, { theme: theme });\n\n if (!attrs.length) return context;\n\n this.attrs = {};\n\n attrs.forEach(function (attrDef) {\n var resolvedAttrDef = attrDef;\n var attrDefWasFn = false;\n var attr = void 0;\n var key = void 0;\n\n if (isFunction(resolvedAttrDef)) {\n // $FlowFixMe\n resolvedAttrDef = resolvedAttrDef(context);\n attrDefWasFn = true;\n }\n\n /* eslint-disable guard-for-in */\n // $FlowFixMe\n for (key in resolvedAttrDef) {\n attr = resolvedAttrDef[key];\n\n if (!attrDefWasFn) {\n if (isFunction(attr) && !isDerivedReactComponent(attr) && !isStyledComponent(attr)) {\n if (process.env.NODE_ENV !== 'production') {\n _this2.warnAttrsFnObjectKeyDeprecated(key, props.forwardedComponent.displayName);\n }\n\n attr = attr(context);\n\n if (process.env.NODE_ENV !== 'production' && React.isValidElement(attr)) {\n _this2.warnNonStyledComponentAttrsObjectKey(key, props.forwardedComponent.displayName);\n }\n }\n }\n\n _this2.attrs[key] = attr;\n context[key] = attr;\n }\n /* eslint-enable */\n });\n\n return context;\n };\n\n StyledComponent.prototype.generateAndInjectStyles = function generateAndInjectStyles(theme, props) {\n var _props$forwardedCompo2 = props.forwardedComponent,\n attrs = _props$forwardedCompo2.attrs,\n componentStyle = _props$forwardedCompo2.componentStyle,\n warnTooManyClasses = _props$forwardedCompo2.warnTooManyClasses;\n\n // statically styled-components don't need to build an execution context object,\n // and shouldn't be increasing the number of class names\n\n if (componentStyle.isStatic && !attrs.length) {\n return componentStyle.generateAndInjectStyles(EMPTY_OBJECT, this.styleSheet);\n }\n\n var className = componentStyle.generateAndInjectStyles(this.buildExecutionContext(theme, props, attrs), this.styleSheet);\n\n if (process.env.NODE_ENV !== 'production' && warnTooManyClasses) warnTooManyClasses(className);\n\n return className;\n };\n\n return StyledComponent;\n}(Component);\n\nfunction createStyledComponent(target, options, rules) {\n var isTargetStyledComp = isStyledComponent(target);\n var isClass = !isTag(target);\n\n var _options$displayName = options.displayName,\n displayName = _options$displayName === undefined ? generateDisplayName(target) : _options$displayName,\n _options$componentId = options.componentId,\n componentId = _options$componentId === undefined ? generateId(ComponentStyle, options.displayName, options.parentComponentId) : _options$componentId,\n _options$ParentCompon = options.ParentComponent,\n ParentComponent = _options$ParentCompon === undefined ? StyledComponent : _options$ParentCompon,\n _options$attrs = options.attrs,\n attrs = _options$attrs === undefined ? EMPTY_ARRAY : _options$attrs;\n\n\n var styledComponentId = options.displayName && options.componentId ? escape(options.displayName) + '-' + options.componentId : options.componentId || componentId;\n\n // fold the underlying StyledComponent attrs up (implicit extend)\n var finalAttrs =\n // $FlowFixMe\n isTargetStyledComp && target.attrs ? Array.prototype.concat(target.attrs, attrs).filter(Boolean) : attrs;\n\n var componentStyle = new ComponentStyle(isTargetStyledComp ? // fold the underlying StyledComponent rules up (implicit extend)\n // $FlowFixMe\n target.componentStyle.rules.concat(rules) : rules, finalAttrs, styledComponentId);\n\n /**\n * forwardRef creates a new interim component, which we'll take advantage of\n * instead of extending ParentComponent to create _another_ interim class\n */\n var WrappedStyledComponent = React.forwardRef(function (props, ref) {\n return React.createElement(ParentComponent, _extends({}, props, { forwardedComponent: WrappedStyledComponent, forwardedRef: ref }));\n });\n\n // $FlowFixMe\n WrappedStyledComponent.attrs = finalAttrs;\n // $FlowFixMe\n WrappedStyledComponent.componentStyle = componentStyle;\n WrappedStyledComponent.displayName = displayName;\n\n // $FlowFixMe\n WrappedStyledComponent.foldedComponentIds = isTargetStyledComp ? // $FlowFixMe\n Array.prototype.concat(target.foldedComponentIds, target.styledComponentId) : EMPTY_ARRAY;\n\n // $FlowFixMe\n WrappedStyledComponent.styledComponentId = styledComponentId;\n\n // fold the underlying StyledComponent target up since we folded the styles\n // $FlowFixMe\n WrappedStyledComponent.target = isTargetStyledComp ? target.target : target;\n\n // $FlowFixMe\n WrappedStyledComponent.withComponent = function withComponent(tag) {\n var previousComponentId = options.componentId,\n optionsToCopy = objectWithoutProperties(options, ['componentId']);\n\n\n var newComponentId = previousComponentId && previousComponentId + '-' + (isTag(tag) ? tag : escape(getComponentName(tag)));\n\n var newOptions = _extends({}, optionsToCopy, {\n attrs: finalAttrs,\n componentId: newComponentId,\n ParentComponent: ParentComponent\n });\n\n return createStyledComponent(tag, newOptions, rules);\n };\n\n if (process.env.NODE_ENV !== 'production') {\n // $FlowFixMe\n WrappedStyledComponent.warnTooManyClasses = createWarnTooManyClasses(displayName);\n }\n\n // $FlowFixMe\n WrappedStyledComponent.toString = function () {\n return '.' + WrappedStyledComponent.styledComponentId;\n };\n\n if (isClass) {\n hoistNonReactStatics(WrappedStyledComponent, target, {\n // all SC-specific things should not be hoisted\n attrs: true,\n componentStyle: true,\n displayName: true,\n foldedComponentIds: true,\n styledComponentId: true,\n target: true,\n withComponent: true\n });\n }\n\n return WrappedStyledComponent;\n}\n\n// \n// Thanks to ReactDOMFactories for this handy list!\n\nvar domElements = ['a', 'abbr', 'address', 'area', 'article', 'aside', 'audio', 'b', 'base', 'bdi', 'bdo', 'big', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'cite', 'code', 'col', 'colgroup', 'data', 'datalist', 'dd', 'del', 'details', 'dfn', 'dialog', 'div', 'dl', 'dt', 'em', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'iframe', 'img', 'input', 'ins', 'kbd', 'keygen', 'label', 'legend', 'li', 'link', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meta', 'meter', 'nav', 'noscript', 'object', 'ol', 'optgroup', 'option', 'output', 'p', 'param', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'script', 'section', 'select', 'small', 'source', 'span', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'time', 'title', 'tr', 'track', 'u', 'ul', 'var', 'video', 'wbr',\n\n// SVG\n'circle', 'clipPath', 'defs', 'ellipse', 'foreignObject', 'g', 'image', 'line', 'linearGradient', 'marker', 'mask', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'stop', 'svg', 'text', 'tspan'];\n\n// \n\nvar styled = function styled(tag) {\n return constructWithOptions(createStyledComponent, tag);\n};\n\n// Shorthands for all valid HTML Elements\ndomElements.forEach(function (domElement) {\n styled[domElement] = styled(domElement);\n});\n\n// \n\nvar GlobalStyle = function () {\n function GlobalStyle(rules, componentId) {\n classCallCheck(this, GlobalStyle);\n\n this.rules = rules;\n this.componentId = componentId;\n this.isStatic = isStaticRules(rules, EMPTY_ARRAY);\n\n if (!StyleSheet.master.hasId(componentId)) {\n StyleSheet.master.deferredInject(componentId, []);\n }\n }\n\n GlobalStyle.prototype.createStyles = function createStyles(executionContext, styleSheet) {\n var flatCSS = flatten(this.rules, executionContext, styleSheet);\n var css = stringifyRules(flatCSS, '');\n\n styleSheet.inject(this.componentId, css);\n };\n\n GlobalStyle.prototype.removeStyles = function removeStyles(styleSheet) {\n var componentId = this.componentId;\n\n if (styleSheet.hasId(componentId)) {\n styleSheet.remove(componentId);\n }\n };\n\n // TODO: overwrite in-place instead of remove+create?\n\n\n GlobalStyle.prototype.renderStyles = function renderStyles(executionContext, styleSheet) {\n this.removeStyles(styleSheet);\n this.createStyles(executionContext, styleSheet);\n };\n\n return GlobalStyle;\n}();\n\n// \n\n// place our cache into shared context so it'll persist between HMRs\nif (IS_BROWSER) {\n window.scCGSHMRCache = {};\n}\n\nfunction createGlobalStyle(strings) {\n for (var _len = arguments.length, interpolations = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n interpolations[_key - 1] = arguments[_key];\n }\n\n var rules = css.apply(undefined, [strings].concat(interpolations));\n var id = 'sc-global-' + murmurhash(JSON.stringify(rules));\n var style = new GlobalStyle(rules, id);\n\n var GlobalStyleComponent = function (_React$Component) {\n inherits(GlobalStyleComponent, _React$Component);\n\n function GlobalStyleComponent(props) {\n classCallCheck(this, GlobalStyleComponent);\n\n var _this = possibleConstructorReturn(this, _React$Component.call(this, props));\n\n var _this$constructor = _this.constructor,\n globalStyle = _this$constructor.globalStyle,\n styledComponentId = _this$constructor.styledComponentId;\n\n\n if (IS_BROWSER) {\n window.scCGSHMRCache[styledComponentId] = (window.scCGSHMRCache[styledComponentId] || 0) + 1;\n }\n\n /**\n * This fixes HMR compatibility. Don't ask me why, but this combination of\n * caching the closure variables via statics and then persisting the statics in\n * state works across HMR where no other combination did. ¯\\_(ツ)_/¯\n */\n _this.state = {\n globalStyle: globalStyle,\n styledComponentId: styledComponentId\n };\n return _this;\n }\n\n GlobalStyleComponent.prototype.componentWillUnmount = function componentWillUnmount() {\n if (window.scCGSHMRCache[this.state.styledComponentId]) {\n window.scCGSHMRCache[this.state.styledComponentId] -= 1;\n }\n /**\n * Depending on the order \"render\" is called this can cause the styles to be lost\n * until the next render pass of the remaining instance, which may\n * not be immediate.\n */\n if (window.scCGSHMRCache[this.state.styledComponentId] === 0) {\n this.state.globalStyle.removeStyles(this.styleSheet);\n }\n };\n\n GlobalStyleComponent.prototype.render = function render() {\n var _this2 = this;\n\n if (process.env.NODE_ENV !== 'production' && React.Children.count(this.props.children)) {\n // eslint-disable-next-line no-console\n console.warn('The global style component ' + this.state.styledComponentId + ' was given child JSX. createGlobalStyle does not render children.');\n }\n\n return React.createElement(\n StyleSheetConsumer,\n null,\n function (styleSheet) {\n _this2.styleSheet = styleSheet || StyleSheet.master;\n\n var globalStyle = _this2.state.globalStyle;\n\n\n if (globalStyle.isStatic) {\n globalStyle.renderStyles(STATIC_EXECUTION_CONTEXT, _this2.styleSheet);\n\n return null;\n } else {\n return React.createElement(\n ThemeConsumer,\n null,\n function (theme) {\n // $FlowFixMe\n var defaultProps = _this2.constructor.defaultProps;\n\n\n var context = _extends({}, _this2.props);\n\n if (typeof theme !== 'undefined') {\n context.theme = determineTheme(_this2.props, theme, defaultProps);\n }\n\n globalStyle.renderStyles(context, _this2.styleSheet);\n\n return null;\n }\n );\n }\n }\n );\n };\n\n return GlobalStyleComponent;\n }(React.Component);\n\n GlobalStyleComponent.globalStyle = style;\n GlobalStyleComponent.styledComponentId = id;\n\n\n return GlobalStyleComponent;\n}\n\n// \n\nvar replaceWhitespace = function replaceWhitespace(str) {\n return str.replace(/\\s|\\\\n/g, '');\n};\n\nfunction keyframes(strings) {\n /* Warning if you've used keyframes on React Native */\n if (process.env.NODE_ENV !== 'production' && typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {\n // eslint-disable-next-line no-console\n console.warn('`keyframes` cannot be used on ReactNative, only on the web. To do animation in ReactNative please use Animated.');\n }\n\n for (var _len = arguments.length, interpolations = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n interpolations[_key - 1] = arguments[_key];\n }\n\n var rules = css.apply(undefined, [strings].concat(interpolations));\n\n var name = generateAlphabeticName(murmurhash(replaceWhitespace(JSON.stringify(rules))));\n\n return new Keyframes(name, stringifyRules(rules, name, '@keyframes'));\n}\n\n// \n\nvar withTheme = (function (Component$$1) {\n var WithTheme = React.forwardRef(function (props, ref) {\n return React.createElement(\n ThemeConsumer,\n null,\n function (theme) {\n // $FlowFixMe\n var defaultProps = Component$$1.defaultProps;\n\n var themeProp = determineTheme(props, theme, defaultProps);\n\n if (process.env.NODE_ENV !== 'production' && themeProp === undefined) {\n // eslint-disable-next-line no-console\n console.warn('[withTheme] You are not using a ThemeProvider nor passing a theme prop or a theme in defaultProps in component class \"' + getComponentName(Component$$1) + '\"');\n }\n\n return React.createElement(Component$$1, _extends({}, props, { theme: themeProp, ref: ref }));\n }\n );\n });\n\n hoistNonReactStatics(WithTheme, Component$$1);\n\n WithTheme.displayName = 'WithTheme(' + getComponentName(Component$$1) + ')';\n\n return WithTheme;\n});\n\n// \n\n/* eslint-disable */\nvar __DO_NOT_USE_OR_YOU_WILL_BE_HAUNTED_BY_SPOOKY_GHOSTS = {\n StyleSheet: StyleSheet\n};\n\n// \n\n/* Warning if you've imported this file on React Native */\nif (process.env.NODE_ENV !== 'production' && typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {\n // eslint-disable-next-line no-console\n console.warn(\"It looks like you've imported 'styled-components' on React Native.\\n\" + \"Perhaps you're looking to import 'styled-components/native'?\\n\" + 'Read more about this at https://www.styled-components.com/docs/basics#react-native');\n}\n\n/* Warning if there are several instances of styled-components */\nif (process.env.NODE_ENV !== 'production' && process.env.NODE_ENV !== 'test' && typeof window !== 'undefined' && typeof navigator !== 'undefined' && typeof navigator.userAgent === 'string' && navigator.userAgent.indexOf('Node.js') === -1 && navigator.userAgent.indexOf('jsdom') === -1) {\n window['__styled-components-init__'] = window['__styled-components-init__'] || 0;\n\n if (window['__styled-components-init__'] === 1) {\n // eslint-disable-next-line no-console\n console.warn(\"It looks like there are several instances of 'styled-components' initialized in this application. \" + 'This may cause dynamic styles not rendering properly, errors happening during rehydration process ' + 'and makes your application bigger without a good reason.\\n\\n' + 'See https://s-c.sh/2BAXzed for more info.');\n }\n\n window['__styled-components-init__'] += 1;\n}\n\n//\n\nexport default styled;\nexport { createGlobalStyle, css, isStyledComponent, keyframes, ServerStyleSheet, StyleSheetConsumer, StyleSheetContext, StyleSheetManager, ThemeConsumer, ThemeContext, ThemeProvider, withTheme, __DO_NOT_USE_OR_YOU_WILL_BE_HAUNTED_BY_SPOOKY_GHOSTS };\n//# sourceMappingURL=styled-components.browser.esm.js.map\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nvar _get = function get(_x3, _x4, _x5) { var _again = true; _function: while (_again) { var object = _x3, property = _x4, receiver = _x5; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x3 = parent; _x4 = property; _x5 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactDom = require('react-dom');\n\nvar _reactDom2 = _interopRequireDefault(_reactDom);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _baseStyles = require('./baseStyles');\n\nvar _baseStyles2 = _interopRequireDefault(_baseStyles);\n\nvar _BurgerIcon = require('./BurgerIcon');\n\nvar _BurgerIcon2 = _interopRequireDefault(_BurgerIcon);\n\nvar _CrossIcon = require('./CrossIcon');\n\nvar _CrossIcon2 = _interopRequireDefault(_CrossIcon);\n\nexports['default'] = function (styles) {\n var Menu = (function (_Component) {\n _inherits(Menu, _Component);\n\n function Menu(props) {\n _classCallCheck(this, Menu);\n\n _get(Object.getPrototypeOf(Menu.prototype), 'constructor', this).call(this, props);\n this.state = {\n isOpen: false\n };\n\n if (!styles) {\n throw new Error('No styles supplied');\n }\n }\n\n _createClass(Menu, [{\n key: 'toggleMenu',\n value: function toggleMenu() {\n var _this = this;\n\n var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n var isOpen = options.isOpen;\n var noStateChange = options.noStateChange;\n\n var newState = {\n isOpen: typeof isOpen !== 'undefined' ? isOpen : !this.state.isOpen\n };\n\n this.applyWrapperStyles();\n\n this.setState(newState, function () {\n !noStateChange && _this.props.onStateChange(newState);\n\n if (!_this.props.disableAutoFocus) {\n // For accessibility reasons, ensures that when we toggle open,\n // we focus the first menu item if one exists.\n if (newState.isOpen) {\n var firstItem = document.querySelector('.bm-item');\n if (firstItem) {\n firstItem.focus();\n }\n } else {\n if (document.activeElement) {\n document.activeElement.blur();\n } else {\n document.body.blur(); // Needed for IE\n }\n }\n }\n\n // Timeout ensures wrappers are cleared after animation finishes.\n _this.timeoutId && clearTimeout(_this.timeoutId);\n _this.timeoutId = setTimeout(function () {\n _this.timeoutId = null;\n if (!newState.isOpen) {\n _this.applyWrapperStyles(false);\n }\n }, 500);\n });\n }\n\n // Applies component-specific styles to external wrapper elements.\n }, {\n key: 'applyWrapperStyles',\n value: function applyWrapperStyles() {\n var set = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0];\n\n var applyClass = function applyClass(el, className) {\n return el.classList[set ? 'add' : 'remove'](className);\n };\n\n if (this.props.htmlClassName) {\n applyClass(document.querySelector('html'), this.props.htmlClassName);\n }\n if (this.props.bodyClassName) {\n applyClass(document.querySelector('body'), this.props.bodyClassName);\n }\n\n if (styles.pageWrap && this.props.pageWrapId) {\n this.handleExternalWrapper(this.props.pageWrapId, styles.pageWrap, set);\n }\n\n if (styles.outerContainer && this.props.outerContainerId) {\n this.handleExternalWrapper(this.props.outerContainerId, styles.outerContainer, set);\n }\n }\n\n // Sets or unsets styles on DOM elements outside the menu component.\n // This is necessary for correct page interaction with some of the menus.\n // Throws and returns if the required external elements don't exist,\n // which means any external page animations won't be applied.\n }, {\n key: 'handleExternalWrapper',\n value: function handleExternalWrapper(id, wrapperStyles, set) {\n var wrapper = document.getElementById(id);\n\n if (!wrapper) {\n console.error(\"Element with ID '\" + id + \"' not found\");\n return;\n }\n\n var builtStyles = this.getStyle(wrapperStyles);\n\n for (var prop in builtStyles) {\n if (builtStyles.hasOwnProperty(prop)) {\n wrapper.style[prop] = set ? builtStyles[prop] : '';\n }\n }\n\n // Prevent any horizontal scroll.\n // Only set overflow-x as an inline style if htmlClassName or\n // bodyClassName is not passed in. Otherwise, it is up to the caller to\n // decide if they want to set the overflow style in CSS using the custom\n // class names.\n var applyOverflow = function applyOverflow(el) {\n return el.style['overflow-x'] = set ? 'hidden' : '';\n };\n if (!this.props.htmlClassName) {\n applyOverflow(document.querySelector('html'));\n }\n if (!this.props.bodyClassName) {\n applyOverflow(document.querySelector('body'));\n }\n }\n\n // Builds styles incrementally for a given element.\n }, {\n key: 'getStyles',\n value: function getStyles(el, index, inline) {\n var propName = 'bm' + el.replace(el.charAt(0), el.charAt(0).toUpperCase());\n\n // Set base styles.\n var output = _baseStyles2['default'][el] ? this.getStyle(_baseStyles2['default'][el]) : {};\n\n // Add animation-specific styles.\n if (styles[el]) {\n output = _extends({}, output, this.getStyle(styles[el], index + 1));\n }\n\n // Add custom styles.\n if (this.props.styles[propName]) {\n output = _extends({}, output, this.props.styles[propName]);\n }\n\n // Add element inline styles.\n if (inline) {\n output = _extends({}, output, inline);\n }\n\n return output;\n }\n }, {\n key: 'getStyle',\n value: function getStyle(style, index) {\n var width = this.props.width;\n\n var formattedWidth = typeof width !== 'string' ? width + 'px' : width;\n return style(this.state.isOpen, formattedWidth, this.props.right, index);\n }\n }, {\n key: 'listenForClose',\n value: function listenForClose(e) {\n e = e || window.event;\n\n // Close on ESC, unless disabled\n if (!this.props.disableCloseOnEsc && this.state.isOpen && (e.key === 'Escape' || e.keyCode === 27)) {\n this.toggleMenu();\n }\n }\n }, {\n key: 'shouldDisableOverlayClick',\n value: function shouldDisableOverlayClick() {\n if (typeof this.props.disableOverlayClick === 'function') {\n return this.props.disableOverlayClick();\n } else {\n return this.props.disableOverlayClick;\n }\n }\n }, {\n key: 'componentDidMount',\n value: function componentDidMount() {\n // Bind ESC key handler (unless custom function supplied).\n if (this.props.customOnKeyDown) {\n window.onkeydown = this.props.customOnKeyDown;\n } else {\n window.onkeydown = this.listenForClose.bind(this);\n }\n\n // Allow initial open state to be set by props.\n if (this.props.isOpen) {\n this.toggleMenu({ isOpen: true, noStateChange: true });\n }\n }\n }, {\n key: 'componentWillUnmount',\n value: function componentWillUnmount() {\n window.onkeydown = null;\n\n this.applyWrapperStyles(false);\n }\n }, {\n key: 'componentDidUpdate',\n value: function componentDidUpdate(prevProps) {\n var _this2 = this;\n\n var wasToggled = typeof this.props.isOpen !== 'undefined' && this.props.isOpen !== this.state.isOpen && this.props.isOpen !== prevProps.isOpen;\n if (wasToggled) {\n this.toggleMenu();\n // Toggling changes SVG animation requirements, so we defer these until the next componentDidUpdate\n return;\n }\n\n if (styles.svg) {\n (function () {\n var morphShape = _reactDom2['default'].findDOMNode(_this2, 'bm-morph-shape');\n var path = styles.svg.lib(morphShape).select('path');\n\n if (_this2.state.isOpen) {\n // Animate SVG path.\n styles.svg.animate(path);\n } else {\n // Reset path (timeout ensures animation happens off screen).\n setTimeout(function () {\n path.attr('d', styles.svg.pathInitial);\n }, 300);\n }\n })();\n }\n }\n }, {\n key: 'render',\n value: function render() {\n var _this3 = this;\n\n return _react2['default'].createElement(\n 'div',\n null,\n !this.props.noOverlay && _react2['default'].createElement('div', {\n className: ('bm-overlay ' + this.props.overlayClassName).trim(),\n onClick: function () {\n return !_this3.shouldDisableOverlayClick() && _this3.toggleMenu();\n },\n style: this.getStyles('overlay')\n }),\n _react2['default'].createElement(\n 'div',\n {\n id: this.props.id,\n className: ('bm-menu-wrap ' + this.props.className).trim(),\n style: this.getStyles('menuWrap')\n },\n styles.svg && _react2['default'].createElement(\n 'div',\n {\n className: ('bm-morph-shape ' + this.props.morphShapeClassName).trim(),\n style: this.getStyles('morphShape')\n },\n _react2['default'].createElement(\n 'svg',\n {\n width: '100%',\n height: '100%',\n viewBox: '0 0 100 800',\n preserveAspectRatio: 'none'\n },\n _react2['default'].createElement('path', { d: styles.svg.pathInitial })\n )\n ),\n _react2['default'].createElement(\n 'div',\n {\n className: ('bm-menu ' + this.props.menuClassName).trim(),\n style: this.getStyles('menu')\n },\n _react2['default'].createElement(\n 'nav',\n {\n className: ('bm-item-list ' + this.props.itemListClassName).trim(),\n style: this.getStyles('itemList')\n },\n _react2['default'].Children.map(this.props.children, function (item, index) {\n if (item) {\n var classList = ['bm-item', _this3.props.itemClassName, item.props.className].filter(function (className) {\n return !!className;\n }).join(' ');\n var extraProps = {\n key: index,\n className: classList,\n style: _this3.getStyles('item', index, item.props.style),\n tabIndex: _this3.state.isOpen ? 0 : -1\n };\n return _react2['default'].cloneElement(item, extraProps);\n }\n })\n )\n ),\n this.props.customCrossIcon !== false && _react2['default'].createElement(\n 'div',\n { style: this.getStyles('closeButton') },\n _react2['default'].createElement(_CrossIcon2['default'], {\n onClick: function () {\n return _this3.toggleMenu();\n },\n styles: this.props.styles,\n customIcon: this.props.customCrossIcon,\n className: this.props.crossButtonClassName,\n crossClassName: this.props.crossClassName,\n tabIndex: this.state.isOpen ? 0 : -1\n })\n )\n ),\n this.props.customBurgerIcon !== false && _react2['default'].createElement(\n 'div',\n { style: this.getStyles('burgerIcon') },\n _react2['default'].createElement(_BurgerIcon2['default'], {\n onClick: function () {\n return _this3.toggleMenu();\n },\n styles: this.props.styles,\n customIcon: this.props.customBurgerIcon,\n className: this.props.burgerButtonClassName,\n barClassName: this.props.burgerBarClassName\n })\n )\n );\n }\n }]);\n\n return Menu;\n })(_react.Component);\n\n Menu.propTypes = {\n bodyClassName: _propTypes2['default'].string,\n burgerBarClassName: _propTypes2['default'].string,\n burgerButtonClassName: _propTypes2['default'].string,\n className: _propTypes2['default'].string,\n crossButtonClassName: _propTypes2['default'].string,\n crossClassName: _propTypes2['default'].string,\n customBurgerIcon: _propTypes2['default'].oneOfType([_propTypes2['default'].element, _propTypes2['default'].oneOf([false])]),\n customCrossIcon: _propTypes2['default'].oneOfType([_propTypes2['default'].element, _propTypes2['default'].oneOf([false])]),\n customOnKeyDown: _propTypes2['default'].func,\n disableAutoFocus: _propTypes2['default'].bool,\n disableCloseOnEsc: _propTypes2['default'].bool,\n disableOverlayClick: _propTypes2['default'].oneOfType([_propTypes2['default'].bool, _propTypes2['default'].func]),\n htmlClassName: _propTypes2['default'].string,\n id: _propTypes2['default'].string,\n isOpen: _propTypes2['default'].bool,\n itemClassName: _propTypes2['default'].string,\n itemListClassName: _propTypes2['default'].string,\n menuClassName: _propTypes2['default'].string,\n morphShapeClassName: _propTypes2['default'].string,\n noOverlay: _propTypes2['default'].bool,\n onStateChange: _propTypes2['default'].func,\n outerContainerId: styles && styles.outerContainer ? _propTypes2['default'].string.isRequired : _propTypes2['default'].string,\n overlayClassName: _propTypes2['default'].string,\n pageWrapId: styles && styles.pageWrap ? _propTypes2['default'].string.isRequired : _propTypes2['default'].string,\n right: _propTypes2['default'].bool,\n styles: _propTypes2['default'].object,\n width: _propTypes2['default'].oneOfType([_propTypes2['default'].number, _propTypes2['default'].string])\n };\n\n Menu.defaultProps = {\n bodyClassName: '',\n burgerBarClassName: '',\n burgerButtonClassName: '',\n className: '',\n crossButtonClassName: '',\n crossClassName: '',\n disableAutoFocus: false,\n disableCloseOnEsc: false,\n htmlClassName: '',\n id: '',\n itemClassName: '',\n itemListClassName: '',\n menuClassName: '',\n morphShapeClassName: '',\n noOverlay: false,\n onStateChange: function onStateChange() {},\n outerContainerId: '',\n overlayClassName: '',\n pageWrapId: '',\n styles: {},\n width: 300\n };\n\n return Menu;\n};\n\nmodule.exports = exports['default'];","exports.__esModule = true;\nexports.Helmet = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require(\"react\");\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = require(\"prop-types\");\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _reactSideEffect = require(\"react-side-effect\");\n\nvar _reactSideEffect2 = _interopRequireDefault(_reactSideEffect);\n\nvar _reactFastCompare = require(\"react-fast-compare\");\n\nvar _reactFastCompare2 = _interopRequireDefault(_reactFastCompare);\n\nvar _HelmetUtils = require(\"./HelmetUtils.js\");\n\nvar _HelmetConstants = require(\"./HelmetConstants.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Helmet = function Helmet(Component) {\n var _class, _temp;\n\n return _temp = _class = function (_React$Component) {\n _inherits(HelmetWrapper, _React$Component);\n\n function HelmetWrapper() {\n _classCallCheck(this, HelmetWrapper);\n\n return _possibleConstructorReturn(this, _React$Component.apply(this, arguments));\n }\n\n HelmetWrapper.prototype.shouldComponentUpdate = function shouldComponentUpdate(nextProps) {\n return !(0, _reactFastCompare2.default)(this.props, nextProps);\n };\n\n HelmetWrapper.prototype.mapNestedChildrenToProps = function mapNestedChildrenToProps(child, nestedChildren) {\n if (!nestedChildren) {\n return null;\n }\n\n switch (child.type) {\n case _HelmetConstants.TAG_NAMES.SCRIPT:\n case _HelmetConstants.TAG_NAMES.NOSCRIPT:\n return {\n innerHTML: nestedChildren\n };\n\n case _HelmetConstants.TAG_NAMES.STYLE:\n return {\n cssText: nestedChildren\n };\n }\n\n throw new Error(\"<\" + child.type + \" /> elements are self-closing and can not contain children. Refer to our API for more information.\");\n };\n\n HelmetWrapper.prototype.flattenArrayTypeChildren = function flattenArrayTypeChildren(_ref) {\n var _extends2;\n\n var child = _ref.child,\n arrayTypeChildren = _ref.arrayTypeChildren,\n newChildProps = _ref.newChildProps,\n nestedChildren = _ref.nestedChildren;\n\n return _extends({}, arrayTypeChildren, (_extends2 = {}, _extends2[child.type] = [].concat(arrayTypeChildren[child.type] || [], [_extends({}, newChildProps, this.mapNestedChildrenToProps(child, nestedChildren))]), _extends2));\n };\n\n HelmetWrapper.prototype.mapObjectTypeChildren = function mapObjectTypeChildren(_ref2) {\n var _extends3, _extends4;\n\n var child = _ref2.child,\n newProps = _ref2.newProps,\n newChildProps = _ref2.newChildProps,\n nestedChildren = _ref2.nestedChildren;\n\n switch (child.type) {\n case _HelmetConstants.TAG_NAMES.TITLE:\n return _extends({}, newProps, (_extends3 = {}, _extends3[child.type] = nestedChildren, _extends3.titleAttributes = _extends({}, newChildProps), _extends3));\n\n case _HelmetConstants.TAG_NAMES.BODY:\n return _extends({}, newProps, {\n bodyAttributes: _extends({}, newChildProps)\n });\n\n case _HelmetConstants.TAG_NAMES.HTML:\n return _extends({}, newProps, {\n htmlAttributes: _extends({}, newChildProps)\n });\n }\n\n return _extends({}, newProps, (_extends4 = {}, _extends4[child.type] = _extends({}, newChildProps), _extends4));\n };\n\n HelmetWrapper.prototype.mapArrayTypeChildrenToProps = function mapArrayTypeChildrenToProps(arrayTypeChildren, newProps) {\n var newFlattenedProps = _extends({}, newProps);\n\n Object.keys(arrayTypeChildren).forEach(function (arrayChildName) {\n var _extends5;\n\n newFlattenedProps = _extends({}, newFlattenedProps, (_extends5 = {}, _extends5[arrayChildName] = arrayTypeChildren[arrayChildName], _extends5));\n });\n\n return newFlattenedProps;\n };\n\n HelmetWrapper.prototype.warnOnInvalidChildren = function warnOnInvalidChildren(child, nestedChildren) {\n if (process.env.NODE_ENV !== \"production\") {\n if (!_HelmetConstants.VALID_TAG_NAMES.some(function (name) {\n return child.type === name;\n })) {\n if (typeof child.type === \"function\") {\n return (0, _HelmetUtils.warn)(\"You may be attempting to nest components within each other, which is not allowed. Refer to our API for more information.\");\n }\n\n return (0, _HelmetUtils.warn)(\"Only elements types \" + _HelmetConstants.VALID_TAG_NAMES.join(\", \") + \" are allowed. Helmet does not support rendering <\" + child.type + \"> elements. Refer to our API for more information.\");\n }\n\n if (nestedChildren && typeof nestedChildren !== \"string\" && (!Array.isArray(nestedChildren) || nestedChildren.some(function (nestedChild) {\n return typeof nestedChild !== \"string\";\n }))) {\n throw new Error(\"Helmet expects a string as a child of <\" + child.type + \">. Did you forget to wrap your children in braces? ( <\" + child.type + \">{``} ) Refer to our API for more information.\");\n }\n }\n\n return true;\n };\n\n HelmetWrapper.prototype.mapChildrenToProps = function mapChildrenToProps(children, newProps) {\n var _this2 = this;\n\n var arrayTypeChildren = {};\n\n _react2.default.Children.forEach(children, function (child) {\n if (!child || !child.props) {\n return;\n }\n\n var _child$props = child.props,\n nestedChildren = _child$props.children,\n childProps = _objectWithoutProperties(_child$props, [\"children\"]);\n\n var newChildProps = (0, _HelmetUtils.convertReactPropstoHtmlAttributes)(childProps);\n\n _this2.warnOnInvalidChildren(child, nestedChildren);\n\n switch (child.type) {\n case _HelmetConstants.TAG_NAMES.LINK:\n case _HelmetConstants.TAG_NAMES.META:\n case _HelmetConstants.TAG_NAMES.NOSCRIPT:\n case _HelmetConstants.TAG_NAMES.SCRIPT:\n case _HelmetConstants.TAG_NAMES.STYLE:\n arrayTypeChildren = _this2.flattenArrayTypeChildren({\n child: child,\n arrayTypeChildren: arrayTypeChildren,\n newChildProps: newChildProps,\n nestedChildren: nestedChildren\n });\n break;\n\n default:\n newProps = _this2.mapObjectTypeChildren({\n child: child,\n newProps: newProps,\n newChildProps: newChildProps,\n nestedChildren: nestedChildren\n });\n break;\n }\n });\n\n newProps = this.mapArrayTypeChildrenToProps(arrayTypeChildren, newProps);\n return newProps;\n };\n\n HelmetWrapper.prototype.render = function render() {\n var _props = this.props,\n children = _props.children,\n props = _objectWithoutProperties(_props, [\"children\"]);\n\n var newProps = _extends({}, props);\n\n if (children) {\n newProps = this.mapChildrenToProps(children, newProps);\n }\n\n return _react2.default.createElement(Component, newProps);\n };\n\n _createClass(HelmetWrapper, null, [{\n key: \"canUseDOM\",\n\n\n // Component.peek comes from react-side-effect:\n // For testing, you may use a static peek() method available on the returned component.\n // It lets you get the current state without resetting the mounted instance stack.\n // Don’t use it for anything other than testing.\n\n /**\n * @param {Object} base: {\"target\": \"_blank\", \"href\": \"http://mysite.com/\"}\n * @param {Object} bodyAttributes: {\"className\": \"root\"}\n * @param {String} defaultTitle: \"Default Title\"\n * @param {Boolean} defer: true\n * @param {Boolean} encodeSpecialCharacters: true\n * @param {Object} htmlAttributes: {\"lang\": \"en\", \"amp\": undefined}\n * @param {Array} link: [{\"rel\": \"canonical\", \"href\": \"http://mysite.com/example\"}]\n * @param {Array} meta: [{\"name\": \"description\", \"content\": \"Test description\"}]\n * @param {Array} noscript: [{\"innerHTML\": \" console.log(newState)\"\n * @param {Array} script: [{\"type\": \"text/javascript\", \"src\": \"http://mysite.com/js/test.js\"}]\n * @param {Array} style: [{\"type\": \"text/css\", \"cssText\": \"div { display: block; color: blue; }\"}]\n * @param {String} title: \"Title\"\n * @param {Object} titleAttributes: {\"itemprop\": \"name\"}\n * @param {String} titleTemplate: \"MySite.com - %s\"\n */\n set: function set(canUseDOM) {\n Component.canUseDOM = canUseDOM;\n }\n }]);\n\n return HelmetWrapper;\n }(_react2.default.Component), _class.propTypes = {\n base: _propTypes2.default.object,\n bodyAttributes: _propTypes2.default.object,\n children: _propTypes2.default.oneOfType([_propTypes2.default.arrayOf(_propTypes2.default.node), _propTypes2.default.node]),\n defaultTitle: _propTypes2.default.string,\n defer: _propTypes2.default.bool,\n encodeSpecialCharacters: _propTypes2.default.bool,\n htmlAttributes: _propTypes2.default.object,\n link: _propTypes2.default.arrayOf(_propTypes2.default.object),\n meta: _propTypes2.default.arrayOf(_propTypes2.default.object),\n noscript: _propTypes2.default.arrayOf(_propTypes2.default.object),\n onChangeClientState: _propTypes2.default.func,\n script: _propTypes2.default.arrayOf(_propTypes2.default.object),\n style: _propTypes2.default.arrayOf(_propTypes2.default.object),\n title: _propTypes2.default.string,\n titleAttributes: _propTypes2.default.object,\n titleTemplate: _propTypes2.default.string\n }, _class.defaultProps = {\n defer: true,\n encodeSpecialCharacters: true\n }, _class.peek = Component.peek, _class.rewind = function () {\n var mappedState = Component.rewind();\n if (!mappedState) {\n // provide fallback if mappedState is undefined\n mappedState = (0, _HelmetUtils.mapStateOnServer)({\n baseTag: [],\n bodyAttributes: {},\n encodeSpecialCharacters: true,\n htmlAttributes: {},\n linkTags: [],\n metaTags: [],\n noscriptTags: [],\n scriptTags: [],\n styleTags: [],\n title: \"\",\n titleAttributes: {}\n });\n }\n\n return mappedState;\n }, _temp;\n};\n\nvar NullComponent = function NullComponent() {\n return null;\n};\n\nvar HelmetSideEffects = (0, _reactSideEffect2.default)(_HelmetUtils.reducePropsToState, _HelmetUtils.handleClientStateChange, _HelmetUtils.mapStateOnServer)(NullComponent);\n\nvar HelmetExport = Helmet(HelmetSideEffects);\nHelmetExport.renderStatic = HelmetExport.rewind;\n\nexports.Helmet = HelmetExport;\nexports.default = HelmetExport;","'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\nexports['default'] = {\n slide: require('./menus/slide'),\n stack: require('./menus/stack'),\n elastic: require('./menus/elastic'),\n bubble: require('./menus/bubble'),\n push: require('./menus/push'),\n pushRotate: require('./menus/pushRotate'),\n scaleDown: require('./menus/scaleDown'),\n scaleRotate: require('./menus/scaleRotate'),\n fallDown: require('./menus/fallDown'),\n reveal: require('./menus/reveal')\n};\nmodule.exports = exports['default'];","// 21.1.3.18 String.prototype.startsWith(searchString [, position ])\n'use strict';\nvar $export = require('./_export');\nvar toLength = require('./_to-length');\nvar context = require('./_string-context');\nvar STARTS_WITH = 'startsWith';\nvar $startsWith = ''[STARTS_WITH];\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(STARTS_WITH), 'String', {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = context(this, searchString, STARTS_WITH);\n var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return $startsWith\n ? $startsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\n});\n","function _taggedTemplateLiteralLoose(strings, raw) {\n if (!raw) {\n raw = strings.slice(0);\n }\n\n strings.raw = raw;\n return strings;\n}\n\nmodule.exports = _taggedTemplateLiteralLoose;","'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nexports['default'] = function () {\n var Snap = undefined;\n try {\n Snap = require('snapsvg-cjs');\n } finally {\n return Snap;\n }\n};\n\nmodule.exports = exports['default'];","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-is.production.min.js');\n} else {\n module.exports = require('./cjs/react-is.development.js');\n}\n","exports.__esModule = true;\nvar ATTRIBUTE_NAMES = exports.ATTRIBUTE_NAMES = {\n BODY: \"bodyAttributes\",\n HTML: \"htmlAttributes\",\n TITLE: \"titleAttributes\"\n};\n\nvar TAG_NAMES = exports.TAG_NAMES = {\n BASE: \"base\",\n BODY: \"body\",\n HEAD: \"head\",\n HTML: \"html\",\n LINK: \"link\",\n META: \"meta\",\n NOSCRIPT: \"noscript\",\n SCRIPT: \"script\",\n STYLE: \"style\",\n TITLE: \"title\"\n};\n\nvar VALID_TAG_NAMES = exports.VALID_TAG_NAMES = Object.keys(TAG_NAMES).map(function (name) {\n return TAG_NAMES[name];\n});\n\nvar TAG_PROPERTIES = exports.TAG_PROPERTIES = {\n CHARSET: \"charset\",\n CSS_TEXT: \"cssText\",\n HREF: \"href\",\n HTTPEQUIV: \"http-equiv\",\n INNER_HTML: \"innerHTML\",\n ITEM_PROP: \"itemprop\",\n NAME: \"name\",\n PROPERTY: \"property\",\n REL: \"rel\",\n SRC: \"src\"\n};\n\nvar REACT_TAG_MAP = exports.REACT_TAG_MAP = {\n accesskey: \"accessKey\",\n charset: \"charSet\",\n class: \"className\",\n contenteditable: \"contentEditable\",\n contextmenu: \"contextMenu\",\n \"http-equiv\": \"httpEquiv\",\n itemprop: \"itemProp\",\n tabindex: \"tabIndex\"\n};\n\nvar HELMET_PROPS = exports.HELMET_PROPS = {\n DEFAULT_TITLE: \"defaultTitle\",\n DEFER: \"defer\",\n ENCODE_SPECIAL_CHARACTERS: \"encodeSpecialCharacters\",\n ON_CHANGE_CLIENT_STATE: \"onChangeClientState\",\n TITLE_TEMPLATE: \"titleTemplate\"\n};\n\nvar HTML_TAG_MAP = exports.HTML_TAG_MAP = Object.keys(REACT_TAG_MAP).reduce(function (obj, key) {\n obj[REACT_TAG_MAP[key]] = key;\n return obj;\n}, {});\n\nvar SELF_CLOSING_TAGS = exports.SELF_CLOSING_TAGS = [TAG_NAMES.NOSCRIPT, TAG_NAMES.SCRIPT, TAG_NAMES.STYLE];\n\nvar HELMET_ATTRIBUTE = exports.HELMET_ATTRIBUTE = \"data-react-helmet\";","'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _menuFactory = require('../menuFactory');\n\nvar _menuFactory2 = _interopRequireDefault(_menuFactory);\n\nvar styles = {};\n\nexports['default'] = (0, _menuFactory2['default'])(styles);\nmodule.exports = exports['default'];","'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\nvar styles = {\n overlay: function overlay(isOpen) {\n return {\n position: 'fixed',\n zIndex: 1000,\n width: '100%',\n height: '100%',\n background: 'rgba(0, 0, 0, 0.3)',\n opacity: isOpen ? 1 : 0,\n MozTransform: isOpen ? '' : 'translate3d(100%, 0, 0)',\n MsTransform: isOpen ? '' : 'translate3d(100%, 0, 0)',\n OTransform: isOpen ? '' : 'translate3d(100%, 0, 0)',\n WebkitTransform: isOpen ? '' : 'translate3d(100%, 0, 0)',\n transform: isOpen ? '' : 'translate3d(100%, 0, 0)',\n transition: isOpen ? 'opacity 0.3s' : 'opacity 0.3s, transform 0s 0.3s'\n };\n },\n\n menuWrap: function menuWrap(isOpen, width, right) {\n return {\n position: 'fixed',\n right: right ? 0 : 'inherit',\n zIndex: 1100,\n width: width,\n height: '100%',\n MozTransform: isOpen ? '' : right ? 'translate3d(100%, 0, 0)' : 'translate3d(-100%, 0, 0)',\n MsTransform: isOpen ? '' : right ? 'translate3d(100%, 0, 0)' : 'translate3d(-100%, 0, 0)',\n OTransform: isOpen ? '' : right ? 'translate3d(100%, 0, 0)' : 'translate3d(-100%, 0, 0)',\n WebkitTransform: isOpen ? '' : right ? 'translate3d(100%, 0, 0)' : 'translate3d(-100%, 0, 0)',\n transform: isOpen ? '' : right ? 'translate3d(100%, 0, 0)' : 'translate3d(-100%, 0, 0)',\n transition: 'all 0.5s'\n };\n },\n\n menu: function menu() {\n return {\n height: '100%',\n boxSizing: 'border-box',\n overflow: 'auto'\n };\n },\n\n itemList: function itemList() {\n return {\n height: '100%'\n };\n },\n\n item: function item() {\n return {\n display: 'block'\n };\n }\n};\n\nexports['default'] = styles;\nmodule.exports = exports['default'];","'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar BurgerIcon = (function (_Component) {\n _inherits(BurgerIcon, _Component);\n\n function BurgerIcon(props) {\n _classCallCheck(this, BurgerIcon);\n\n _get(Object.getPrototypeOf(BurgerIcon.prototype), 'constructor', this).call(this, props);\n this.state = {\n hover: false\n };\n }\n\n _createClass(BurgerIcon, [{\n key: 'getLineStyle',\n value: function getLineStyle(index) {\n return _extends({\n position: 'absolute',\n height: '20%',\n left: 0,\n right: 0,\n top: 20 * (index * 2) + '%',\n opacity: this.state.hover ? 0.6 : 1\n }, this.state.hover && this.props.styles.bmBurgerBarsHover);\n }\n }, {\n key: 'render',\n value: function render() {\n var _this = this;\n\n var icon = undefined;\n var buttonStyle = {\n position: 'absolute',\n left: 0,\n top: 0,\n width: '100%',\n height: '100%',\n margin: 0,\n padding: 0,\n border: 'none',\n fontSize: 0,\n background: 'transparent',\n cursor: 'pointer'\n };\n\n if (this.props.customIcon) {\n var extraProps = {\n className: ('bm-icon ' + (this.props.customIcon.props.className || '')).trim(),\n style: _extends({ width: '100%', height: '100%' }, this.props.styles.bmIcon)\n };\n icon = _react2['default'].cloneElement(this.props.customIcon, extraProps);\n } else {\n icon = _react2['default'].createElement(\n 'span',\n null,\n [0, 1, 2].map(function (bar) {\n return _react2['default'].createElement('span', {\n key: bar,\n className: ('bm-burger-bars ' + _this.props.barClassName + ' ' + (_this.state.hover ? 'bm-burger-bars-hover' : '')).trim(),\n style: _extends({}, _this.getLineStyle(bar), _this.props.styles.bmBurgerBars)\n });\n })\n );\n }\n\n return _react2['default'].createElement(\n 'div',\n {\n className: ('bm-burger-button ' + this.props.className).trim(),\n style: _extends({ zIndex: 1000 }, this.props.styles.bmBurgerButton)\n },\n icon,\n _react2['default'].createElement(\n 'button',\n {\n onClick: this.props.onClick,\n onMouseOver: function () {\n return _this.setState({ hover: true });\n },\n onMouseOut: function () {\n return _this.setState({ hover: false });\n },\n style: buttonStyle\n },\n 'Open Menu'\n )\n );\n }\n }]);\n\n return BurgerIcon;\n})(_react.Component);\n\nexports['default'] = BurgerIcon;\n\nBurgerIcon.propTypes = {\n barClassName: _propTypes2['default'].string,\n customIcon: _propTypes2['default'].element,\n styles: _propTypes2['default'].object\n};\n\nBurgerIcon.defaultProps = {\n barClassName: '',\n className: '',\n styles: {}\n};\nmodule.exports = exports['default'];","'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar CrossIcon = (function (_Component) {\n _inherits(CrossIcon, _Component);\n\n function CrossIcon() {\n _classCallCheck(this, CrossIcon);\n\n _get(Object.getPrototypeOf(CrossIcon.prototype), 'constructor', this).apply(this, arguments);\n }\n\n _createClass(CrossIcon, [{\n key: 'getCrossStyle',\n value: function getCrossStyle(type) {\n return {\n position: 'absolute',\n width: 3,\n height: 14,\n transform: type === 'before' ? 'rotate(45deg)' : 'rotate(-45deg)'\n };\n }\n }, {\n key: 'render',\n value: function render() {\n var _this = this;\n\n var icon;\n var buttonWrapperStyle = {\n position: 'absolute',\n width: 24,\n height: 24,\n right: 8,\n top: 8\n };\n var buttonStyle = {\n position: 'absolute',\n left: 0,\n top: 0,\n width: '100%',\n height: '100%',\n margin: 0,\n padding: 0,\n border: 'none',\n fontSize: 0,\n background: 'transparent',\n cursor: 'pointer'\n };\n\n if (this.props.customIcon) {\n var extraProps = {\n className: ('bm-cross ' + (this.props.customIcon.props.className || '')).trim(),\n style: _extends({ width: '100%', height: '100%' }, this.props.styles.bmCross)\n };\n icon = _react2['default'].cloneElement(this.props.customIcon, extraProps);\n } else {\n icon = _react2['default'].createElement(\n 'span',\n { style: { position: 'absolute', top: '6px', right: '14px' } },\n ['before', 'after'].map(function (type, i) {\n return _react2['default'].createElement('span', {\n key: i,\n className: ('bm-cross ' + _this.props.crossClassName).trim(),\n style: _extends({}, _this.getCrossStyle(type), _this.props.styles.bmCross)\n });\n })\n );\n }\n\n return _react2['default'].createElement(\n 'div',\n {\n className: ('bm-cross-button ' + this.props.className).trim(),\n style: _extends({}, buttonWrapperStyle, this.props.styles.bmCrossButton)\n },\n icon,\n _react2['default'].createElement(\n 'button',\n {\n onClick: this.props.onClick,\n style: buttonStyle,\n tabIndex: this.props.tabIndex\n },\n 'Close Menu'\n )\n );\n }\n }]);\n\n return CrossIcon;\n})(_react.Component);\n\nexports['default'] = CrossIcon;\n\nCrossIcon.propTypes = {\n crossClassName: _propTypes2['default'].string,\n customIcon: _propTypes2['default'].element,\n styles: _propTypes2['default'].object,\n tabIndex: _propTypes2['default'].number\n};\n\nCrossIcon.defaultProps = {\n crossClassName: '',\n className: '',\n styles: {},\n tabIndex: 0\n};\nmodule.exports = exports['default'];","'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _menuFactory = require('../menuFactory');\n\nvar _menuFactory2 = _interopRequireDefault(_menuFactory);\n\nvar styles = {\n menuWrap: function menuWrap(isOpen, width, right) {\n return {\n MozTransform: isOpen ? '' : right ? 'translate3d(' + width + ', 0, 0)' : 'translate3d(-' + width + ', 0, 0)',\n MsTransform: isOpen ? '' : right ? 'translate3d(' + width + ', 0, 0)' : 'translate3d(-' + width + ', 0, 0)',\n OTransform: isOpen ? '' : right ? 'translate3d(' + width + ', 0, 0)' : 'translate3d(-' + width + ', 0, 0)',\n WebkitTransform: isOpen ? '' : right ? 'translate3d(' + width + ', 0, 0)' : 'translate3d(-' + width + ', 0, 0)',\n transform: isOpen ? '' : right ? 'translate3d(' + width + ', 0, 0)' : 'translate3d(-' + width + ', 0, 0)',\n transition: isOpen ? 'transform 0.8s cubic-bezier(0.7, 0, 0.3, 1)' : 'transform 0.4s cubic-bezier(0.7, 0, 0.3, 1)'\n };\n },\n\n item: function item(isOpen, width, right, nthChild) {\n return {\n MozTransform: isOpen ? '' : 'translate3d(0, ' + nthChild * 500 + 'px, 0)',\n MsTransform: isOpen ? '' : 'translate3d(0, ' + nthChild * 500 + 'px, 0)',\n OTransform: isOpen ? '' : 'translate3d(0, ' + nthChild * 500 + 'px, 0)',\n WebkitTransform: isOpen ? '' : 'translate3d(0, ' + nthChild * 500 + 'px, 0)',\n transform: isOpen ? '' : 'translate3d(0, ' + nthChild * 500 + 'px, 0)',\n transition: isOpen ? 'transform 0.8s cubic-bezier(0.7, 0, 0.3, 1)' : 'transform 0s 0.2s cubic-bezier(0.7, 0, 0.3, 1)'\n };\n }\n};\n\nexports['default'] = (0, _menuFactory2['default'])(styles);\nmodule.exports = exports['default'];","'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _snapsvgImporter = require('../snapsvgImporter');\n\nvar _snapsvgImporter2 = _interopRequireDefault(_snapsvgImporter);\n\nvar _menuFactory = require('../menuFactory');\n\nvar _menuFactory2 = _interopRequireDefault(_menuFactory);\n\nvar styles = {\n svg: {\n lib: _snapsvgImporter2['default'],\n pathInitial: 'M-1,0h101c0,0-97.833,153.603-97.833,396.167C2.167,627.579,100,800,100,800H-1V0z',\n pathOpen: 'M-1,0h101c0,0,0-1,0,395c0,404,0,405,0,405H-1V0z',\n animate: function animate(path) {\n path.animate({ path: this.pathOpen }, 400, window.mina.easeinout);\n }\n },\n\n morphShape: function morphShape(isOpen, width, right) {\n return {\n position: 'absolute',\n width: 120,\n height: '100%',\n right: right ? 'inherit' : 0,\n left: right ? 0 : 'inherit',\n MozTransform: right ? 'rotateY(180deg)' : '',\n MsTransform: right ? 'rotateY(180deg)' : '',\n OTransform: right ? 'rotateY(180deg)' : '',\n WebkitTransform: right ? 'rotateY(180deg)' : '',\n transform: right ? 'rotateY(180deg)' : ''\n };\n },\n\n menuWrap: function menuWrap(isOpen, width, right) {\n return {\n MozTransform: isOpen ? 'translate3d(0, 0, 0)' : right ? 'translate3d(100%, 0, 0)' : 'translate3d(-100%, 0, 0)',\n MsTransform: isOpen ? 'translate3d(0, 0, 0)' : right ? 'translate3d(100%, 0, 0)' : 'translate3d(-100%, 0, 0)',\n OTransform: isOpen ? 'translate3d(0, 0, 0)' : right ? 'translate3d(100%, 0, 0)' : 'translate3d(-100%, 0, 0)',\n WebkitTransform: isOpen ? 'translate3d(0, 0, 0)' : right ? 'translate3d(100%, 0, 0)' : 'translate3d(-100%, 0, 0)',\n transform: isOpen ? 'translate3d(0, 0, 0)' : right ? 'translate3d(100%, 0, 0)' : 'translate3d(-100%, 0, 0)',\n transition: 'all 0.3s'\n };\n },\n\n menu: function menu(isOpen, width, right) {\n return {\n position: 'fixed',\n right: right ? 0 : 'inherit',\n width: 180,\n whiteSpace: 'nowrap',\n boxSizing: 'border-box',\n overflow: 'visible'\n };\n },\n\n itemList: function itemList(isOpen, width, right) {\n if (right) {\n return {\n position: 'relative',\n left: '-110px',\n width: '170%',\n overflow: 'auto'\n };\n }\n },\n\n pageWrap: function pageWrap(isOpen, width, right) {\n return {\n MozTransform: isOpen ? '' : right ? 'translate3d(-100px, 0, 0)' : 'translate3d(100px, 0, 0)',\n MsTransform: isOpen ? '' : right ? 'translate3d(-100px, 0, 0)' : 'translate3d(100px, 0, 0)',\n OTransform: isOpen ? '' : right ? 'translate3d(-100px, 0, 0)' : 'translate3d(100px, 0, 0)',\n WebkitTransform: isOpen ? '' : right ? 'translate3d(-100px, 0, 0)' : 'translate3d(100px, 0, 0)',\n transform: isOpen ? '' : right ? 'translate3d(-100px, 0, 0)' : 'translate3d(100px, 0, 0)',\n transition: isOpen ? 'all 0.3s' : 'all 0.3s 0.1s'\n };\n },\n\n outerContainer: function outerContainer(isOpen) {\n return {\n overflow: isOpen ? '' : 'hidden'\n };\n }\n};\n\nexports['default'] = (0, _menuFactory2['default'])(styles);\nmodule.exports = exports['default'];","window.eve = require('eve')\n\n// Copyright (c) 2017 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nvar mina = (function (eve) {\n var animations = {},\n requestAnimFrame = window.requestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n function (callback) {\n setTimeout(callback, 16, new Date().getTime());\n return true;\n },\n requestID,\n isArray = Array.isArray || function (a) {\n return a instanceof Array ||\n Object.prototype.toString.call(a) == \"[object Array]\";\n },\n idgen = 0,\n idprefix = \"M\" + (+new Date).toString(36),\n ID = function () {\n return idprefix + (idgen++).toString(36);\n },\n diff = function (a, b, A, B) {\n if (isArray(a)) {\n res = [];\n for (var i = 0, ii = a.length; i < ii; i++) {\n res[i] = diff(a[i], b, A[i], B);\n }\n return res;\n }\n var dif = (A - a) / (B - b);\n return function (bb) {\n return a + dif * (bb - b);\n };\n },\n timer = Date.now || function () {\n return +new Date;\n },\n sta = function (val) {\n var a = this;\n if (val == null) {\n return a.s;\n }\n var ds = a.s - val;\n a.b += a.dur * ds;\n a.B += a.dur * ds;\n a.s = val;\n },\n speed = function (val) {\n var a = this;\n if (val == null) {\n return a.spd;\n }\n a.spd = val;\n },\n duration = function (val) {\n var a = this;\n if (val == null) {\n return a.dur;\n }\n a.s = a.s * val / a.dur;\n a.dur = val;\n },\n stopit = function () {\n var a = this;\n delete animations[a.id];\n a.update();\n eve(\"mina.stop.\" + a.id, a);\n },\n pause = function () {\n var a = this;\n if (a.pdif) {\n return;\n }\n delete animations[a.id];\n a.update();\n a.pdif = a.get() - a.b;\n },\n resume = function () {\n var a = this;\n if (!a.pdif) {\n return;\n }\n a.b = a.get() - a.pdif;\n delete a.pdif;\n animations[a.id] = a;\n frame();\n },\n update = function () {\n var a = this,\n res;\n if (isArray(a.start)) {\n res = [];\n for (var j = 0, jj = a.start.length; j < jj; j++) {\n res[j] = +a.start[j] +\n (a.end[j] - a.start[j]) * a.easing(a.s);\n }\n } else {\n res = +a.start + (a.end - a.start) * a.easing(a.s);\n }\n a.set(res);\n },\n frame = function (timeStamp) {\n // Manual invokation?\n if (!timeStamp) {\n // Frame loop stopped?\n if (!requestID) {\n // Start frame loop...\n requestID = requestAnimFrame(frame);\n }\n return;\n }\n var len = 0;\n for (var i in animations) if (animations.hasOwnProperty(i)) {\n var a = animations[i],\n b = a.get(),\n res;\n len++;\n a.s = (b - a.b) / (a.dur / a.spd);\n if (a.s >= 1) {\n delete animations[i];\n a.s = 1;\n len--;\n (function (a) {\n setTimeout(function () {\n eve(\"mina.finish.\" + a.id, a);\n });\n }(a));\n }\n a.update();\n }\n requestID = len ? requestAnimFrame(frame) : false;\n },\n /*\\\n * mina\n [ method ]\n **\n * Generic animation of numbers\n **\n - a (number) start _slave_ number\n - A (number) end _slave_ number\n - b (number) start _master_ number (start time in general case)\n - B (number) end _master_ number (end time in general case)\n - get (function) getter of _master_ number (see @mina.time)\n - set (function) setter of _slave_ number\n - easing (function) #optional easing function, default is @mina.linear\n = (object) animation descriptor\n o {\n o id (string) animation id,\n o start (number) start _slave_ number,\n o end (number) end _slave_ number,\n o b (number) start _master_ number,\n o s (number) animation status (0..1),\n o dur (number) animation duration,\n o spd (number) animation speed,\n o get (function) getter of _master_ number (see @mina.time),\n o set (function) setter of _slave_ number,\n o easing (function) easing function, default is @mina.linear,\n o status (function) status getter/setter,\n o speed (function) speed getter/setter,\n o duration (function) duration getter/setter,\n o stop (function) animation stopper\n o pause (function) pauses the animation\n o resume (function) resumes the animation\n o update (function) calles setter with the right value of the animation\n o }\n \\*/\n mina = function (a, A, b, B, get, set, easing) {\n var anim = {\n id: ID(),\n start: a,\n end: A,\n b: b,\n s: 0,\n dur: B - b,\n spd: 1,\n get: get,\n set: set,\n easing: easing || mina.linear,\n status: sta,\n speed: speed,\n duration: duration,\n stop: stopit,\n pause: pause,\n resume: resume,\n update: update\n };\n animations[anim.id] = anim;\n var len = 0, i;\n for (i in animations) if (animations.hasOwnProperty(i)) {\n len++;\n if (len == 2) {\n break;\n }\n }\n len == 1 && frame();\n return anim;\n };\n /*\\\n * mina.time\n [ method ]\n **\n * Returns the current time. Equivalent to:\n | function () {\n | return (new Date).getTime();\n | }\n \\*/\n mina.time = timer;\n /*\\\n * mina.getById\n [ method ]\n **\n * Returns an animation by its id\n - id (string) animation's id\n = (object) See @mina\n \\*/\n mina.getById = function (id) {\n return animations[id] || null;\n };\n\n /*\\\n * mina.linear\n [ method ]\n **\n * Default linear easing\n - n (number) input 0..1\n = (number) output 0..1\n \\*/\n mina.linear = function (n) {\n return n;\n };\n /*\\\n * mina.easeout\n [ method ]\n **\n * Easeout easing\n - n (number) input 0..1\n = (number) output 0..1\n \\*/\n mina.easeout = function (n) {\n return Math.pow(n, 1.7);\n };\n /*\\\n * mina.easein\n [ method ]\n **\n * Easein easing\n - n (number) input 0..1\n = (number) output 0..1\n \\*/\n mina.easein = function (n) {\n return Math.pow(n, .48);\n };\n /*\\\n * mina.easeinout\n [ method ]\n **\n * Easeinout easing\n - n (number) input 0..1\n = (number) output 0..1\n \\*/\n mina.easeinout = function (n) {\n if (n == 1) {\n return 1;\n }\n if (n == 0) {\n return 0;\n }\n var q = .48 - n / 1.04,\n Q = Math.sqrt(.1734 + q * q),\n x = Q - q,\n X = Math.pow(Math.abs(x), 1 / 3) * (x < 0 ? -1 : 1),\n y = -Q - q,\n Y = Math.pow(Math.abs(y), 1 / 3) * (y < 0 ? -1 : 1),\n t = X + Y + .5;\n return (1 - t) * 3 * t * t + t * t * t;\n };\n /*\\\n * mina.backin\n [ method ]\n **\n * Backin easing\n - n (number) input 0..1\n = (number) output 0..1\n \\*/\n mina.backin = function (n) {\n if (n == 1) {\n return 1;\n }\n var s = 1.70158;\n return n * n * ((s + 1) * n - s);\n };\n /*\\\n * mina.backout\n [ method ]\n **\n * Backout easing\n - n (number) input 0..1\n = (number) output 0..1\n \\*/\n mina.backout = function (n) {\n if (n == 0) {\n return 0;\n }\n n = n - 1;\n var s = 1.70158;\n return n * n * ((s + 1) * n + s) + 1;\n };\n /*\\\n * mina.elastic\n [ method ]\n **\n * Elastic easing\n - n (number) input 0..1\n = (number) output 0..1\n \\*/\n mina.elastic = function (n) {\n if (n == !!n) {\n return n;\n }\n return Math.pow(2, -10 * n) * Math.sin((n - .075) *\n (2 * Math.PI) / .3) + 1;\n };\n /*\\\n * mina.bounce\n [ method ]\n **\n * Bounce easing\n - n (number) input 0..1\n = (number) output 0..1\n \\*/\n mina.bounce = function (n) {\n var s = 7.5625,\n p = 2.75,\n l;\n if (n < 1 / p) {\n l = s * n * n;\n } else {\n if (n < 2 / p) {\n n -= 1.5 / p;\n l = s * n * n + .75;\n } else {\n if (n < 2.5 / p) {\n n -= 2.25 / p;\n l = s * n * n + .9375;\n } else {\n n -= 2.625 / p;\n l = s * n * n + .984375;\n }\n }\n }\n return l;\n };\n window.mina = mina;\n return mina;\n})(typeof eve == \"undefined\" ? function () {} : eve);\n\n// Copyright (c) 2013 - 2017 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nvar Snap = (function(root) {\nSnap.version = \"0.5.1\";\n/*\\\n * Snap\n [ method ]\n **\n * Creates a drawing surface or wraps existing SVG element.\n **\n - width (number|string) width of surface\n - height (number|string) height of surface\n * or\n - DOM (SVGElement) element to be wrapped into Snap structure\n * or\n - array (array) array of elements (will return set of elements)\n * or\n - query (string) CSS query selector\n = (object) @Element\n\\*/\nfunction Snap(w, h) {\n if (w) {\n if (w.nodeType) {\n return wrap(w);\n }\n if (is(w, \"array\") && Snap.set) {\n return Snap.set.apply(Snap, w);\n }\n if (w instanceof Element) {\n return w;\n }\n if (h == null) {\n try {\n w = glob.doc.querySelector(String(w));\n return wrap(w);\n } catch (e) {\n return null;\n }\n }\n }\n w = w == null ? \"100%\" : w;\n h = h == null ? \"100%\" : h;\n return new Paper(w, h);\n}\nSnap.toString = function () {\n return \"Snap v\" + this.version;\n};\nSnap._ = {};\nvar glob = {\n win: root.window,\n doc: root.window.document\n};\nSnap._.glob = glob;\nvar has = \"hasOwnProperty\",\n Str = String,\n toFloat = parseFloat,\n toInt = parseInt,\n math = Math,\n mmax = math.max,\n mmin = math.min,\n abs = math.abs,\n pow = math.pow,\n PI = math.PI,\n round = math.round,\n E = \"\",\n S = \" \",\n objectToString = Object.prototype.toString,\n ISURL = /^url\\(['\"]?([^\\)]+?)['\"]?\\)$/i,\n colourRegExp = /^\\s*((#[a-f\\d]{6})|(#[a-f\\d]{3})|rgba?\\(\\s*([\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?(?:\\s*,\\s*[\\d\\.]+%?)?)\\s*\\)|hsba?\\(\\s*([\\d\\.]+(?:deg|\\xb0|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+(?:%?\\s*,\\s*[\\d\\.]+)?%?)\\s*\\)|hsla?\\(\\s*([\\d\\.]+(?:deg|\\xb0|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+(?:%?\\s*,\\s*[\\d\\.]+)?%?)\\s*\\))\\s*$/i,\n bezierrg = /^(?:cubic-)?bezier\\(([^,]+),([^,]+),([^,]+),([^\\)]+)\\)/,\n separator = Snap._.separator = /[,\\s]+/,\n whitespace = /[\\s]/g,\n commaSpaces = /[\\s]*,[\\s]*/,\n hsrg = {hs: 1, rg: 1},\n pathCommand = /([a-z])[\\s,]*((-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?[\\s]*,?[\\s]*)+)/ig,\n tCommand = /([rstm])[\\s,]*((-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?[\\s]*,?[\\s]*)+)/ig,\n pathValues = /(-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?)[\\s]*,?[\\s]*/ig,\n idgen = 0,\n idprefix = \"S\" + (+new Date).toString(36),\n ID = function (el) {\n return (el && el.type ? el.type : E) + idprefix + (idgen++).toString(36);\n },\n xlink = \"http://www.w3.org/1999/xlink\",\n xmlns = \"http://www.w3.org/2000/svg\",\n hub = {},\n /*\\\n * Snap.url\n [ method ]\n **\n * Wraps path into `\"url('')\"`.\n - value (string) path\n = (string) wrapped path\n \\*/\n URL = Snap.url = function (url) {\n return \"url('#\" + url + \"')\";\n };\n\nfunction $(el, attr) {\n if (attr) {\n if (el == \"#text\") {\n el = glob.doc.createTextNode(attr.text || attr[\"#text\"] || \"\");\n }\n if (el == \"#comment\") {\n el = glob.doc.createComment(attr.text || attr[\"#text\"] || \"\");\n }\n if (typeof el == \"string\") {\n el = $(el);\n }\n if (typeof attr == \"string\") {\n if (el.nodeType == 1) {\n if (attr.substring(0, 6) == \"xlink:\") {\n return el.getAttributeNS(xlink, attr.substring(6));\n }\n if (attr.substring(0, 4) == \"xml:\") {\n return el.getAttributeNS(xmlns, attr.substring(4));\n }\n return el.getAttribute(attr);\n } else if (attr == \"text\") {\n return el.nodeValue;\n } else {\n return null;\n }\n }\n if (el.nodeType == 1) {\n for (var key in attr) if (attr[has](key)) {\n var val = Str(attr[key]);\n if (val) {\n if (key.substring(0, 6) == \"xlink:\") {\n el.setAttributeNS(xlink, key.substring(6), val);\n } else if (key.substring(0, 4) == \"xml:\") {\n el.setAttributeNS(xmlns, key.substring(4), val);\n } else {\n el.setAttribute(key, val);\n }\n } else {\n el.removeAttribute(key);\n }\n }\n } else if (\"text\" in attr) {\n el.nodeValue = attr.text;\n }\n } else {\n el = glob.doc.createElementNS(xmlns, el);\n }\n return el;\n}\nSnap._.$ = $;\nSnap._.id = ID;\nfunction getAttrs(el) {\n var attrs = el.attributes,\n name,\n out = {};\n for (var i = 0; i < attrs.length; i++) {\n if (attrs[i].namespaceURI == xlink) {\n name = \"xlink:\";\n } else {\n name = \"\";\n }\n name += attrs[i].name;\n out[name] = attrs[i].textContent;\n }\n return out;\n}\nfunction is(o, type) {\n type = Str.prototype.toLowerCase.call(type);\n if (type == \"finite\") {\n return isFinite(o);\n }\n if (type == \"array\" &&\n (o instanceof Array || Array.isArray && Array.isArray(o))) {\n return true;\n }\n return type == \"null\" && o === null ||\n type == typeof o && o !== null ||\n type == \"object\" && o === Object(o) ||\n objectToString.call(o).slice(8, -1).toLowerCase() == type;\n}\n/*\\\n * Snap.format\n [ method ]\n **\n * Replaces construction of type `{}` to the corresponding argument\n **\n - token (string) string to format\n - json (object) object which properties are used as a replacement\n = (string) formatted string\n > Usage\n | // this draws a rectangular shape equivalent to \"M10,20h40v50h-40z\"\n | paper.path(Snap.format(\"M{x},{y}h{dim.width}v{dim.height}h{dim['negative width']}z\", {\n | x: 10,\n | y: 20,\n | dim: {\n | width: 40,\n | height: 50,\n | \"negative width\": -40\n | }\n | }));\n\\*/\nSnap.format = (function () {\n var tokenRegex = /\\{([^\\}]+)\\}/g,\n objNotationRegex = /(?:(?:^|\\.)(.+?)(?=\\[|\\.|$|\\()|\\[('|\")(.+?)\\2\\])(\\(\\))?/g, // matches .xxxxx or [\"xxxxx\"] to run over object properties\n replacer = function (all, key, obj) {\n var res = obj;\n key.replace(objNotationRegex, function (all, name, quote, quotedName, isFunc) {\n name = name || quotedName;\n if (res) {\n if (name in res) {\n res = res[name];\n }\n typeof res == \"function\" && isFunc && (res = res());\n }\n });\n res = (res == null || res == obj ? all : res) + \"\";\n return res;\n };\n return function (str, obj) {\n return Str(str).replace(tokenRegex, function (all, key) {\n return replacer(all, key, obj);\n });\n };\n})();\nfunction clone(obj) {\n if (typeof obj == \"function\" || Object(obj) !== obj) {\n return obj;\n }\n var res = new obj.constructor;\n for (var key in obj) if (obj[has](key)) {\n res[key] = clone(obj[key]);\n }\n return res;\n}\nSnap._.clone = clone;\nfunction repush(array, item) {\n for (var i = 0, ii = array.length; i < ii; i++) if (array[i] === item) {\n return array.push(array.splice(i, 1)[0]);\n }\n}\nfunction cacher(f, scope, postprocessor) {\n function newf() {\n var arg = Array.prototype.slice.call(arguments, 0),\n args = arg.join(\"\\u2400\"),\n cache = newf.cache = newf.cache || {},\n count = newf.count = newf.count || [];\n if (cache[has](args)) {\n repush(count, args);\n return postprocessor ? postprocessor(cache[args]) : cache[args];\n }\n count.length >= 1e3 && delete cache[count.shift()];\n count.push(args);\n cache[args] = f.apply(scope, arg);\n return postprocessor ? postprocessor(cache[args]) : cache[args];\n }\n return newf;\n}\nSnap._.cacher = cacher;\nfunction angle(x1, y1, x2, y2, x3, y3) {\n if (x3 == null) {\n var x = x1 - x2,\n y = y1 - y2;\n if (!x && !y) {\n return 0;\n }\n return (180 + math.atan2(-y, -x) * 180 / PI + 360) % 360;\n } else {\n return angle(x1, y1, x3, y3) - angle(x2, y2, x3, y3);\n }\n}\nfunction rad(deg) {\n return deg % 360 * PI / 180;\n}\nfunction deg(rad) {\n return rad * 180 / PI % 360;\n}\nfunction x_y() {\n return this.x + S + this.y;\n}\nfunction x_y_w_h() {\n return this.x + S + this.y + S + this.width + \" \\xd7 \" + this.height;\n}\n\n/*\\\n * Snap.rad\n [ method ]\n **\n * Transform angle to radians\n - deg (number) angle in degrees\n = (number) angle in radians\n\\*/\nSnap.rad = rad;\n/*\\\n * Snap.deg\n [ method ]\n **\n * Transform angle to degrees\n - rad (number) angle in radians\n = (number) angle in degrees\n\\*/\nSnap.deg = deg;\n/*\\\n * Snap.sin\n [ method ]\n **\n * Equivalent to `Math.sin()` only works with degrees, not radians.\n - angle (number) angle in degrees\n = (number) sin\n\\*/\nSnap.sin = function (angle) {\n return math.sin(Snap.rad(angle));\n};\n/*\\\n * Snap.tan\n [ method ]\n **\n * Equivalent to `Math.tan()` only works with degrees, not radians.\n - angle (number) angle in degrees\n = (number) tan\n\\*/\nSnap.tan = function (angle) {\n return math.tan(Snap.rad(angle));\n};\n/*\\\n * Snap.cos\n [ method ]\n **\n * Equivalent to `Math.cos()` only works with degrees, not radians.\n - angle (number) angle in degrees\n = (number) cos\n\\*/\nSnap.cos = function (angle) {\n return math.cos(Snap.rad(angle));\n};\n/*\\\n * Snap.asin\n [ method ]\n **\n * Equivalent to `Math.asin()` only works with degrees, not radians.\n - num (number) value\n = (number) asin in degrees\n\\*/\nSnap.asin = function (num) {\n return Snap.deg(math.asin(num));\n};\n/*\\\n * Snap.acos\n [ method ]\n **\n * Equivalent to `Math.acos()` only works with degrees, not radians.\n - num (number) value\n = (number) acos in degrees\n\\*/\nSnap.acos = function (num) {\n return Snap.deg(math.acos(num));\n};\n/*\\\n * Snap.atan\n [ method ]\n **\n * Equivalent to `Math.atan()` only works with degrees, not radians.\n - num (number) value\n = (number) atan in degrees\n\\*/\nSnap.atan = function (num) {\n return Snap.deg(math.atan(num));\n};\n/*\\\n * Snap.atan2\n [ method ]\n **\n * Equivalent to `Math.atan2()` only works with degrees, not radians.\n - num (number) value\n = (number) atan2 in degrees\n\\*/\nSnap.atan2 = function (num) {\n return Snap.deg(math.atan2(num));\n};\n/*\\\n * Snap.angle\n [ method ]\n **\n * Returns an angle between two or three points\n - x1 (number) x coord of first point\n - y1 (number) y coord of first point\n - x2 (number) x coord of second point\n - y2 (number) y coord of second point\n - x3 (number) #optional x coord of third point\n - y3 (number) #optional y coord of third point\n = (number) angle in degrees\n\\*/\nSnap.angle = angle;\n/*\\\n * Snap.len\n [ method ]\n **\n * Returns distance between two points\n - x1 (number) x coord of first point\n - y1 (number) y coord of first point\n - x2 (number) x coord of second point\n - y2 (number) y coord of second point\n = (number) distance\n\\*/\nSnap.len = function (x1, y1, x2, y2) {\n return Math.sqrt(Snap.len2(x1, y1, x2, y2));\n};\n/*\\\n * Snap.len2\n [ method ]\n **\n * Returns squared distance between two points\n - x1 (number) x coord of first point\n - y1 (number) y coord of first point\n - x2 (number) x coord of second point\n - y2 (number) y coord of second point\n = (number) distance\n\\*/\nSnap.len2 = function (x1, y1, x2, y2) {\n return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);\n};\n/*\\\n * Snap.closestPoint\n [ method ]\n **\n * Returns closest point to a given one on a given path.\n - path (Element) path element\n - x (number) x coord of a point\n - y (number) y coord of a point\n = (object) in format\n {\n x (number) x coord of the point on the path\n y (number) y coord of the point on the path\n length (number) length of the path to the point\n distance (number) distance from the given point to the path\n }\n\\*/\n// Copied from http://bl.ocks.org/mbostock/8027637\nSnap.closestPoint = function (path, x, y) {\n function distance2(p) {\n var dx = p.x - x,\n dy = p.y - y;\n return dx * dx + dy * dy;\n }\n var pathNode = path.node,\n pathLength = pathNode.getTotalLength(),\n precision = pathLength / pathNode.pathSegList.numberOfItems * .125,\n best,\n bestLength,\n bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (var scan, scanLength = 0, scanDistance; scanLength <= pathLength; scanLength += precision) {\n if ((scanDistance = distance2(scan = pathNode.getPointAtLength(scanLength))) < bestDistance) {\n best = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision *= .5;\n while (precision > .5) {\n var before,\n after,\n beforeLength,\n afterLength,\n beforeDistance,\n afterDistance;\n if ((beforeLength = bestLength - precision) >= 0 && (beforeDistance = distance2(before = pathNode.getPointAtLength(beforeLength))) < bestDistance) {\n best = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if ((afterLength = bestLength + precision) <= pathLength && (afterDistance = distance2(after = pathNode.getPointAtLength(afterLength))) < bestDistance) {\n best = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision *= .5;\n }\n }\n\n best = {\n x: best.x,\n y: best.y,\n length: bestLength,\n distance: Math.sqrt(bestDistance)\n };\n return best;\n}\n/*\\\n * Snap.is\n [ method ]\n **\n * Handy replacement for the `typeof` operator\n - o (…) any object or primitive\n - type (string) name of the type, e.g., `string`, `function`, `number`, etc.\n = (boolean) `true` if given value is of given type\n\\*/\nSnap.is = is;\n/*\\\n * Snap.snapTo\n [ method ]\n **\n * Snaps given value to given grid\n - values (array|number) given array of values or step of the grid\n - value (number) value to adjust\n - tolerance (number) #optional maximum distance to the target value that would trigger the snap. Default is `10`.\n = (number) adjusted value\n\\*/\nSnap.snapTo = function (values, value, tolerance) {\n tolerance = is(tolerance, \"finite\") ? tolerance : 10;\n if (is(values, \"array\")) {\n var i = values.length;\n while (i--) if (abs(values[i] - value) <= tolerance) {\n return values[i];\n }\n } else {\n values = +values;\n var rem = value % values;\n if (rem < tolerance) {\n return value - rem;\n }\n if (rem > values - tolerance) {\n return value - rem + values;\n }\n }\n return value;\n};\n// Colour\n/*\\\n * Snap.getRGB\n [ method ]\n **\n * Parses color string as RGB object\n - color (string) color string in one of the following formats:\n #
    \n #
  • Color name (red, green, cornflowerblue, etc)
  • \n #
  • #••• — shortened HTML color: (#000, #fc0, etc.)
  • \n #
  • #•••••• — full length HTML color: (#000000, #bd2300)
  • \n #
  • rgb(•••, •••, •••) — red, green and blue channels values: (rgb(200, 100, 0))
  • \n #
  • rgba(•••, •••, •••, •••) — also with opacity
  • \n #
  • rgb(•••%, •••%, •••%) — same as above, but in %: (rgb(100%, 175%, 0%))
  • \n #
  • rgba(•••%, •••%, •••%, •••%) — also with opacity
  • \n #
  • hsb(•••, •••, •••) — hue, saturation and brightness values: (hsb(0.5, 0.25, 1))
  • \n #
  • hsba(•••, •••, •••, •••) — also with opacity
  • \n #
  • hsb(•••%, •••%, •••%) — same as above, but in %
  • \n #
  • hsba(•••%, •••%, •••%, •••%) — also with opacity
  • \n #
  • hsl(•••, •••, •••) — hue, saturation and luminosity values: (hsb(0.5, 0.25, 0.5))
  • \n #
  • hsla(•••, •••, •••, •••) — also with opacity
  • \n #
  • hsl(•••%, •••%, •••%) — same as above, but in %
  • \n #
  • hsla(•••%, •••%, •••%, •••%) — also with opacity
  • \n #
\n * Note that `%` can be used any time: `rgb(20%, 255, 50%)`.\n = (object) RGB object in the following format:\n o {\n o r (number) red,\n o g (number) green,\n o b (number) blue,\n o hex (string) color in HTML/CSS format: #••••••,\n o error (boolean) true if string can't be parsed\n o }\n\\*/\nSnap.getRGB = cacher(function (colour) {\n if (!colour || !!((colour = Str(colour)).indexOf(\"-\") + 1)) {\n return {r: -1, g: -1, b: -1, hex: \"none\", error: 1, toString: rgbtoString};\n }\n if (colour == \"none\") {\n return {r: -1, g: -1, b: -1, hex: \"none\", toString: rgbtoString};\n }\n !(hsrg[has](colour.toLowerCase().substring(0, 2)) || colour.charAt() == \"#\") && (colour = toHex(colour));\n if (!colour) {\n return {r: -1, g: -1, b: -1, hex: \"none\", error: 1, toString: rgbtoString};\n }\n var res,\n red,\n green,\n blue,\n opacity,\n t,\n values,\n rgb = colour.match(colourRegExp);\n if (rgb) {\n if (rgb[2]) {\n blue = toInt(rgb[2].substring(5), 16);\n green = toInt(rgb[2].substring(3, 5), 16);\n red = toInt(rgb[2].substring(1, 3), 16);\n }\n if (rgb[3]) {\n blue = toInt((t = rgb[3].charAt(3)) + t, 16);\n green = toInt((t = rgb[3].charAt(2)) + t, 16);\n red = toInt((t = rgb[3].charAt(1)) + t, 16);\n }\n if (rgb[4]) {\n values = rgb[4].split(commaSpaces);\n red = toFloat(values[0]);\n values[0].slice(-1) == \"%\" && (red *= 2.55);\n green = toFloat(values[1]);\n values[1].slice(-1) == \"%\" && (green *= 2.55);\n blue = toFloat(values[2]);\n values[2].slice(-1) == \"%\" && (blue *= 2.55);\n rgb[1].toLowerCase().slice(0, 4) == \"rgba\" && (opacity = toFloat(values[3]));\n values[3] && values[3].slice(-1) == \"%\" && (opacity /= 100);\n }\n if (rgb[5]) {\n values = rgb[5].split(commaSpaces);\n red = toFloat(values[0]);\n values[0].slice(-1) == \"%\" && (red /= 100);\n green = toFloat(values[1]);\n values[1].slice(-1) == \"%\" && (green /= 100);\n blue = toFloat(values[2]);\n values[2].slice(-1) == \"%\" && (blue /= 100);\n (values[0].slice(-3) == \"deg\" || values[0].slice(-1) == \"\\xb0\") && (red /= 360);\n rgb[1].toLowerCase().slice(0, 4) == \"hsba\" && (opacity = toFloat(values[3]));\n values[3] && values[3].slice(-1) == \"%\" && (opacity /= 100);\n return Snap.hsb2rgb(red, green, blue, opacity);\n }\n if (rgb[6]) {\n values = rgb[6].split(commaSpaces);\n red = toFloat(values[0]);\n values[0].slice(-1) == \"%\" && (red /= 100);\n green = toFloat(values[1]);\n values[1].slice(-1) == \"%\" && (green /= 100);\n blue = toFloat(values[2]);\n values[2].slice(-1) == \"%\" && (blue /= 100);\n (values[0].slice(-3) == \"deg\" || values[0].slice(-1) == \"\\xb0\") && (red /= 360);\n rgb[1].toLowerCase().slice(0, 4) == \"hsla\" && (opacity = toFloat(values[3]));\n values[3] && values[3].slice(-1) == \"%\" && (opacity /= 100);\n return Snap.hsl2rgb(red, green, blue, opacity);\n }\n red = mmin(math.round(red), 255);\n green = mmin(math.round(green), 255);\n blue = mmin(math.round(blue), 255);\n opacity = mmin(mmax(opacity, 0), 1);\n rgb = {r: red, g: green, b: blue, toString: rgbtoString};\n rgb.hex = \"#\" + (16777216 | blue | green << 8 | red << 16).toString(16).slice(1);\n rgb.opacity = is(opacity, \"finite\") ? opacity : 1;\n return rgb;\n }\n return {r: -1, g: -1, b: -1, hex: \"none\", error: 1, toString: rgbtoString};\n}, Snap);\n/*\\\n * Snap.hsb\n [ method ]\n **\n * Converts HSB values to a hex representation of the color\n - h (number) hue\n - s (number) saturation\n - b (number) value or brightness\n = (string) hex representation of the color\n\\*/\nSnap.hsb = cacher(function (h, s, b) {\n return Snap.hsb2rgb(h, s, b).hex;\n});\n/*\\\n * Snap.hsl\n [ method ]\n **\n * Converts HSL values to a hex representation of the color\n - h (number) hue\n - s (number) saturation\n - l (number) luminosity\n = (string) hex representation of the color\n\\*/\nSnap.hsl = cacher(function (h, s, l) {\n return Snap.hsl2rgb(h, s, l).hex;\n});\n/*\\\n * Snap.rgb\n [ method ]\n **\n * Converts RGB values to a hex representation of the color\n - r (number) red\n - g (number) green\n - b (number) blue\n = (string) hex representation of the color\n\\*/\nSnap.rgb = cacher(function (r, g, b, o) {\n if (is(o, \"finite\")) {\n var round = math.round;\n return \"rgba(\" + [round(r), round(g), round(b), +o.toFixed(2)] + \")\";\n }\n return \"#\" + (16777216 | b | g << 8 | r << 16).toString(16).slice(1);\n});\nvar toHex = function (color) {\n var i = glob.doc.getElementsByTagName(\"head\")[0] || glob.doc.getElementsByTagName(\"svg\")[0],\n red = \"rgb(255, 0, 0)\";\n toHex = cacher(function (color) {\n if (color.toLowerCase() == \"red\") {\n return red;\n }\n i.style.color = red;\n i.style.color = color;\n var out = glob.doc.defaultView.getComputedStyle(i, E).getPropertyValue(\"color\");\n return out == red ? null : out;\n });\n return toHex(color);\n},\nhsbtoString = function () {\n return \"hsb(\" + [this.h, this.s, this.b] + \")\";\n},\nhsltoString = function () {\n return \"hsl(\" + [this.h, this.s, this.l] + \")\";\n},\nrgbtoString = function () {\n return this.opacity == 1 || this.opacity == null ?\n this.hex :\n \"rgba(\" + [this.r, this.g, this.b, this.opacity] + \")\";\n},\nprepareRGB = function (r, g, b) {\n if (g == null && is(r, \"object\") && \"r\" in r && \"g\" in r && \"b\" in r) {\n b = r.b;\n g = r.g;\n r = r.r;\n }\n if (g == null && is(r, string)) {\n var clr = Snap.getRGB(r);\n r = clr.r;\n g = clr.g;\n b = clr.b;\n }\n if (r > 1 || g > 1 || b > 1) {\n r /= 255;\n g /= 255;\n b /= 255;\n }\n\n return [r, g, b];\n},\npackageRGB = function (r, g, b, o) {\n r = math.round(r * 255);\n g = math.round(g * 255);\n b = math.round(b * 255);\n var rgb = {\n r: r,\n g: g,\n b: b,\n opacity: is(o, \"finite\") ? o : 1,\n hex: Snap.rgb(r, g, b),\n toString: rgbtoString\n };\n is(o, \"finite\") && (rgb.opacity = o);\n return rgb;\n};\n/*\\\n * Snap.color\n [ method ]\n **\n * Parses the color string and returns an object featuring the color's component values\n - clr (string) color string in one of the supported formats (see @Snap.getRGB)\n = (object) Combined RGB/HSB object in the following format:\n o {\n o r (number) red,\n o g (number) green,\n o b (number) blue,\n o hex (string) color in HTML/CSS format: #••••••,\n o error (boolean) `true` if string can't be parsed,\n o h (number) hue,\n o s (number) saturation,\n o v (number) value (brightness),\n o l (number) lightness\n o }\n\\*/\nSnap.color = function (clr) {\n var rgb;\n if (is(clr, \"object\") && \"h\" in clr && \"s\" in clr && \"b\" in clr) {\n rgb = Snap.hsb2rgb(clr);\n clr.r = rgb.r;\n clr.g = rgb.g;\n clr.b = rgb.b;\n clr.opacity = 1;\n clr.hex = rgb.hex;\n } else if (is(clr, \"object\") && \"h\" in clr && \"s\" in clr && \"l\" in clr) {\n rgb = Snap.hsl2rgb(clr);\n clr.r = rgb.r;\n clr.g = rgb.g;\n clr.b = rgb.b;\n clr.opacity = 1;\n clr.hex = rgb.hex;\n } else {\n if (is(clr, \"string\")) {\n clr = Snap.getRGB(clr);\n }\n if (is(clr, \"object\") && \"r\" in clr && \"g\" in clr && \"b\" in clr && !(\"error\" in clr)) {\n rgb = Snap.rgb2hsl(clr);\n clr.h = rgb.h;\n clr.s = rgb.s;\n clr.l = rgb.l;\n rgb = Snap.rgb2hsb(clr);\n clr.v = rgb.b;\n } else {\n clr = {hex: \"none\"};\n clr.r = clr.g = clr.b = clr.h = clr.s = clr.v = clr.l = -1;\n clr.error = 1;\n }\n }\n clr.toString = rgbtoString;\n return clr;\n};\n/*\\\n * Snap.hsb2rgb\n [ method ]\n **\n * Converts HSB values to an RGB object\n - h (number) hue\n - s (number) saturation\n - v (number) value or brightness\n = (object) RGB object in the following format:\n o {\n o r (number) red,\n o g (number) green,\n o b (number) blue,\n o hex (string) color in HTML/CSS format: #••••••\n o }\n\\*/\nSnap.hsb2rgb = function (h, s, v, o) {\n if (is(h, \"object\") && \"h\" in h && \"s\" in h && \"b\" in h) {\n v = h.b;\n s = h.s;\n o = h.o;\n h = h.h;\n }\n h *= 360;\n var R, G, B, X, C;\n h = h % 360 / 60;\n C = v * s;\n X = C * (1 - abs(h % 2 - 1));\n R = G = B = v - C;\n\n h = ~~h;\n R += [C, X, 0, 0, X, C][h];\n G += [X, C, C, X, 0, 0][h];\n B += [0, 0, X, C, C, X][h];\n return packageRGB(R, G, B, o);\n};\n/*\\\n * Snap.hsl2rgb\n [ method ]\n **\n * Converts HSL values to an RGB object\n - h (number) hue\n - s (number) saturation\n - l (number) luminosity\n = (object) RGB object in the following format:\n o {\n o r (number) red,\n o g (number) green,\n o b (number) blue,\n o hex (string) color in HTML/CSS format: #••••••\n o }\n\\*/\nSnap.hsl2rgb = function (h, s, l, o) {\n if (is(h, \"object\") && \"h\" in h && \"s\" in h && \"l\" in h) {\n l = h.l;\n s = h.s;\n h = h.h;\n }\n if (h > 1 || s > 1 || l > 1) {\n h /= 360;\n s /= 100;\n l /= 100;\n }\n h *= 360;\n var R, G, B, X, C;\n h = h % 360 / 60;\n C = 2 * s * (l < .5 ? l : 1 - l);\n X = C * (1 - abs(h % 2 - 1));\n R = G = B = l - C / 2;\n\n h = ~~h;\n R += [C, X, 0, 0, X, C][h];\n G += [X, C, C, X, 0, 0][h];\n B += [0, 0, X, C, C, X][h];\n return packageRGB(R, G, B, o);\n};\n/*\\\n * Snap.rgb2hsb\n [ method ]\n **\n * Converts RGB values to an HSB object\n - r (number) red\n - g (number) green\n - b (number) blue\n = (object) HSB object in the following format:\n o {\n o h (number) hue,\n o s (number) saturation,\n o b (number) brightness\n o }\n\\*/\nSnap.rgb2hsb = function (r, g, b) {\n b = prepareRGB(r, g, b);\n r = b[0];\n g = b[1];\n b = b[2];\n\n var H, S, V, C;\n V = mmax(r, g, b);\n C = V - mmin(r, g, b);\n H = C == 0 ? null :\n V == r ? (g - b) / C :\n V == g ? (b - r) / C + 2 :\n (r - g) / C + 4;\n H = (H + 360) % 6 * 60 / 360;\n S = C == 0 ? 0 : C / V;\n return {h: H, s: S, b: V, toString: hsbtoString};\n};\n/*\\\n * Snap.rgb2hsl\n [ method ]\n **\n * Converts RGB values to an HSL object\n - r (number) red\n - g (number) green\n - b (number) blue\n = (object) HSL object in the following format:\n o {\n o h (number) hue,\n o s (number) saturation,\n o l (number) luminosity\n o }\n\\*/\nSnap.rgb2hsl = function (r, g, b) {\n b = prepareRGB(r, g, b);\n r = b[0];\n g = b[1];\n b = b[2];\n\n var H, S, L, M, m, C;\n M = mmax(r, g, b);\n m = mmin(r, g, b);\n C = M - m;\n H = C == 0 ? null :\n M == r ? (g - b) / C :\n M == g ? (b - r) / C + 2 :\n (r - g) / C + 4;\n H = (H + 360) % 6 * 60 / 360;\n L = (M + m) / 2;\n S = C == 0 ? 0 :\n L < .5 ? C / (2 * L) :\n C / (2 - 2 * L);\n return {h: H, s: S, l: L, toString: hsltoString};\n};\n\n// Transformations\n/*\\\n * Snap.parsePathString\n [ method ]\n **\n * Utility method\n **\n * Parses given path string into an array of arrays of path segments\n - pathString (string|array) path string or array of segments (in the last case it is returned straight away)\n = (array) array of segments\n\\*/\nSnap.parsePathString = function (pathString) {\n if (!pathString) {\n return null;\n }\n var pth = Snap.path(pathString);\n if (pth.arr) {\n return Snap.path.clone(pth.arr);\n }\n\n var paramCounts = {a: 7, c: 6, o: 2, h: 1, l: 2, m: 2, r: 4, q: 4, s: 4, t: 2, v: 1, u: 3, z: 0},\n data = [];\n if (is(pathString, \"array\") && is(pathString[0], \"array\")) { // rough assumption\n data = Snap.path.clone(pathString);\n }\n if (!data.length) {\n Str(pathString).replace(pathCommand, function (a, b, c) {\n var params = [],\n name = b.toLowerCase();\n c.replace(pathValues, function (a, b) {\n b && params.push(+b);\n });\n if (name == \"m\" && params.length > 2) {\n data.push([b].concat(params.splice(0, 2)));\n name = \"l\";\n b = b == \"m\" ? \"l\" : \"L\";\n }\n if (name == \"o\" && params.length == 1) {\n data.push([b, params[0]]);\n }\n if (name == \"r\") {\n data.push([b].concat(params));\n } else while (params.length >= paramCounts[name]) {\n data.push([b].concat(params.splice(0, paramCounts[name])));\n if (!paramCounts[name]) {\n break;\n }\n }\n });\n }\n data.toString = Snap.path.toString;\n pth.arr = Snap.path.clone(data);\n return data;\n};\n/*\\\n * Snap.parseTransformString\n [ method ]\n **\n * Utility method\n **\n * Parses given transform string into an array of transformations\n - TString (string|array) transform string or array of transformations (in the last case it is returned straight away)\n = (array) array of transformations\n\\*/\nvar parseTransformString = Snap.parseTransformString = function (TString) {\n if (!TString) {\n return null;\n }\n var paramCounts = {r: 3, s: 4, t: 2, m: 6},\n data = [];\n if (is(TString, \"array\") && is(TString[0], \"array\")) { // rough assumption\n data = Snap.path.clone(TString);\n }\n if (!data.length) {\n Str(TString).replace(tCommand, function (a, b, c) {\n var params = [],\n name = b.toLowerCase();\n c.replace(pathValues, function (a, b) {\n b && params.push(+b);\n });\n data.push([b].concat(params));\n });\n }\n data.toString = Snap.path.toString;\n return data;\n};\nfunction svgTransform2string(tstr) {\n var res = [];\n tstr = tstr.replace(/(?:^|\\s)(\\w+)\\(([^)]+)\\)/g, function (all, name, params) {\n params = params.split(/\\s*,\\s*|\\s+/);\n if (name == \"rotate\" && params.length == 1) {\n params.push(0, 0);\n }\n if (name == \"scale\") {\n if (params.length > 2) {\n params = params.slice(0, 2);\n } else if (params.length == 2) {\n params.push(0, 0);\n }\n if (params.length == 1) {\n params.push(params[0], 0, 0);\n }\n }\n if (name == \"skewX\") {\n res.push([\"m\", 1, 0, math.tan(rad(params[0])), 1, 0, 0]);\n } else if (name == \"skewY\") {\n res.push([\"m\", 1, math.tan(rad(params[0])), 0, 1, 0, 0]);\n } else {\n res.push([name.charAt(0)].concat(params));\n }\n return all;\n });\n return res;\n}\nSnap._.svgTransform2string = svgTransform2string;\nSnap._.rgTransform = /^[a-z][\\s]*-?\\.?\\d/i;\nfunction transform2matrix(tstr, bbox) {\n var tdata = parseTransformString(tstr),\n m = new Snap.Matrix;\n if (tdata) {\n for (var i = 0, ii = tdata.length; i < ii; i++) {\n var t = tdata[i],\n tlen = t.length,\n command = Str(t[0]).toLowerCase(),\n absolute = t[0] != command,\n inver = absolute ? m.invert() : 0,\n x1,\n y1,\n x2,\n y2,\n bb;\n if (command == \"t\" && tlen == 2){\n m.translate(t[1], 0);\n } else if (command == \"t\" && tlen == 3) {\n if (absolute) {\n x1 = inver.x(0, 0);\n y1 = inver.y(0, 0);\n x2 = inver.x(t[1], t[2]);\n y2 = inver.y(t[1], t[2]);\n m.translate(x2 - x1, y2 - y1);\n } else {\n m.translate(t[1], t[2]);\n }\n } else if (command == \"r\") {\n if (tlen == 2) {\n bb = bb || bbox;\n m.rotate(t[1], bb.x + bb.width / 2, bb.y + bb.height / 2);\n } else if (tlen == 4) {\n if (absolute) {\n x2 = inver.x(t[2], t[3]);\n y2 = inver.y(t[2], t[3]);\n m.rotate(t[1], x2, y2);\n } else {\n m.rotate(t[1], t[2], t[3]);\n }\n }\n } else if (command == \"s\") {\n if (tlen == 2 || tlen == 3) {\n bb = bb || bbox;\n m.scale(t[1], t[tlen - 1], bb.x + bb.width / 2, bb.y + bb.height / 2);\n } else if (tlen == 4) {\n if (absolute) {\n x2 = inver.x(t[2], t[3]);\n y2 = inver.y(t[2], t[3]);\n m.scale(t[1], t[1], x2, y2);\n } else {\n m.scale(t[1], t[1], t[2], t[3]);\n }\n } else if (tlen == 5) {\n if (absolute) {\n x2 = inver.x(t[3], t[4]);\n y2 = inver.y(t[3], t[4]);\n m.scale(t[1], t[2], x2, y2);\n } else {\n m.scale(t[1], t[2], t[3], t[4]);\n }\n }\n } else if (command == \"m\" && tlen == 7) {\n m.add(t[1], t[2], t[3], t[4], t[5], t[6]);\n }\n }\n }\n return m;\n}\nSnap._.transform2matrix = transform2matrix;\nSnap._unit2px = unit2px;\nvar contains = glob.doc.contains || glob.doc.compareDocumentPosition ?\n function (a, b) {\n var adown = a.nodeType == 9 ? a.documentElement : a,\n bup = b && b.parentNode;\n return a == bup || !!(bup && bup.nodeType == 1 && (\n adown.contains ?\n adown.contains(bup) :\n a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16\n ));\n } :\n function (a, b) {\n if (b) {\n while (b) {\n b = b.parentNode;\n if (b == a) {\n return true;\n }\n }\n }\n return false;\n };\nfunction getSomeDefs(el) {\n var p = el.node.ownerSVGElement && wrap(el.node.ownerSVGElement) ||\n el.node.parentNode && wrap(el.node.parentNode) ||\n Snap.select(\"svg\") ||\n Snap(0, 0),\n pdefs = p.select(\"defs\"),\n defs = pdefs == null ? false : pdefs.node;\n if (!defs) {\n defs = make(\"defs\", p.node).node;\n }\n return defs;\n}\nfunction getSomeSVG(el) {\n return el.node.ownerSVGElement && wrap(el.node.ownerSVGElement) || Snap.select(\"svg\");\n}\nSnap._.getSomeDefs = getSomeDefs;\nSnap._.getSomeSVG = getSomeSVG;\nfunction unit2px(el, name, value) {\n var svg = getSomeSVG(el).node,\n out = {},\n mgr = svg.querySelector(\".svg---mgr\");\n if (!mgr) {\n mgr = $(\"rect\");\n $(mgr, {x: -9e9, y: -9e9, width: 10, height: 10, \"class\": \"svg---mgr\", fill: \"none\"});\n svg.appendChild(mgr);\n }\n function getW(val) {\n if (val == null) {\n return E;\n }\n if (val == +val) {\n return val;\n }\n $(mgr, {width: val});\n try {\n return mgr.getBBox().width;\n } catch (e) {\n return 0;\n }\n }\n function getH(val) {\n if (val == null) {\n return E;\n }\n if (val == +val) {\n return val;\n }\n $(mgr, {height: val});\n try {\n return mgr.getBBox().height;\n } catch (e) {\n return 0;\n }\n }\n function set(nam, f) {\n if (name == null) {\n out[nam] = f(el.attr(nam) || 0);\n } else if (nam == name) {\n out = f(value == null ? el.attr(nam) || 0 : value);\n }\n }\n switch (el.type) {\n case \"rect\":\n set(\"rx\", getW);\n set(\"ry\", getH);\n case \"image\":\n set(\"width\", getW);\n set(\"height\", getH);\n case \"text\":\n set(\"x\", getW);\n set(\"y\", getH);\n break;\n case \"circle\":\n set(\"cx\", getW);\n set(\"cy\", getH);\n set(\"r\", getW);\n break;\n case \"ellipse\":\n set(\"cx\", getW);\n set(\"cy\", getH);\n set(\"rx\", getW);\n set(\"ry\", getH);\n break;\n case \"line\":\n set(\"x1\", getW);\n set(\"x2\", getW);\n set(\"y1\", getH);\n set(\"y2\", getH);\n break;\n case \"marker\":\n set(\"refX\", getW);\n set(\"markerWidth\", getW);\n set(\"refY\", getH);\n set(\"markerHeight\", getH);\n break;\n case \"radialGradient\":\n set(\"fx\", getW);\n set(\"fy\", getH);\n break;\n case \"tspan\":\n set(\"dx\", getW);\n set(\"dy\", getH);\n break;\n default:\n set(name, getW);\n }\n svg.removeChild(mgr);\n return out;\n}\n/*\\\n * Snap.select\n [ method ]\n **\n * Wraps a DOM element specified by CSS selector as @Element\n - query (string) CSS selector of the element\n = (Element) the current element\n\\*/\nSnap.select = function (query) {\n query = Str(query).replace(/([^\\\\]):/g, \"$1\\\\:\");\n return wrap(glob.doc.querySelector(query));\n};\n/*\\\n * Snap.selectAll\n [ method ]\n **\n * Wraps DOM elements specified by CSS selector as set or array of @Element\n - query (string) CSS selector of the element\n = (Element) the current element\n\\*/\nSnap.selectAll = function (query) {\n var nodelist = glob.doc.querySelectorAll(query),\n set = (Snap.set || Array)();\n for (var i = 0; i < nodelist.length; i++) {\n set.push(wrap(nodelist[i]));\n }\n return set;\n};\n\nfunction add2group(list) {\n if (!is(list, \"array\")) {\n list = Array.prototype.slice.call(arguments, 0);\n }\n var i = 0,\n j = 0,\n node = this.node;\n while (this[i]) delete this[i++];\n for (i = 0; i < list.length; i++) {\n if (list[i].type == \"set\") {\n list[i].forEach(function (el) {\n node.appendChild(el.node);\n });\n } else {\n node.appendChild(list[i].node);\n }\n }\n var children = node.childNodes;\n for (i = 0; i < children.length; i++) {\n this[j++] = wrap(children[i]);\n }\n return this;\n}\n// Hub garbage collector every 10s\nsetInterval(function () {\n for (var key in hub) if (hub[has](key)) {\n var el = hub[key],\n node = el.node;\n if (el.type != \"svg\" && !node.ownerSVGElement || el.type == \"svg\" && (!node.parentNode || \"ownerSVGElement\" in node.parentNode && !node.ownerSVGElement)) {\n delete hub[key];\n }\n }\n}, 1e4);\nfunction Element(el) {\n if (el.snap in hub) {\n return hub[el.snap];\n }\n var svg;\n try {\n svg = el.ownerSVGElement;\n } catch(e) {}\n /*\\\n * Element.node\n [ property (object) ]\n **\n * Gives you a reference to the DOM object, so you can assign event handlers or just mess around.\n > Usage\n | // draw a circle at coordinate 10,10 with radius of 10\n | var c = paper.circle(10, 10, 10);\n | c.node.onclick = function () {\n | c.attr(\"fill\", \"red\");\n | };\n \\*/\n this.node = el;\n if (svg) {\n this.paper = new Paper(svg);\n }\n /*\\\n * Element.type\n [ property (string) ]\n **\n * SVG tag name of the given element.\n \\*/\n this.type = el.tagName || el.nodeName;\n var id = this.id = ID(this);\n this.anims = {};\n this._ = {\n transform: []\n };\n el.snap = id;\n hub[id] = this;\n if (this.type == \"g\") {\n this.add = add2group;\n }\n if (this.type in {g: 1, mask: 1, pattern: 1, symbol: 1}) {\n for (var method in Paper.prototype) if (Paper.prototype[has](method)) {\n this[method] = Paper.prototype[method];\n }\n }\n}\n /*\\\n * Element.attr\n [ method ]\n **\n * Gets or sets given attributes of the element.\n **\n - params (object) contains key-value pairs of attributes you want to set\n * or\n - param (string) name of the attribute\n = (Element) the current element\n * or\n = (string) value of attribute\n > Usage\n | el.attr({\n | fill: \"#fc0\",\n | stroke: \"#000\",\n | strokeWidth: 2, // CamelCase...\n | \"fill-opacity\": 0.5, // or dash-separated names\n | width: \"*=2\" // prefixed values\n | });\n | console.log(el.attr(\"fill\")); // #fc0\n * Prefixed values in format `\"+=10\"` supported. All four operations\n * (`+`, `-`, `*` and `/`) could be used. Optionally you can use units for `+`\n * and `-`: `\"+=2em\"`.\n \\*/\n Element.prototype.attr = function (params, value) {\n var el = this,\n node = el.node;\n if (!params) {\n if (node.nodeType != 1) {\n return {\n text: node.nodeValue\n };\n }\n var attr = node.attributes,\n out = {};\n for (var i = 0, ii = attr.length; i < ii; i++) {\n out[attr[i].nodeName] = attr[i].nodeValue;\n }\n return out;\n }\n if (is(params, \"string\")) {\n if (arguments.length > 1) {\n var json = {};\n json[params] = value;\n params = json;\n } else {\n return eve(\"snap.util.getattr.\" + params, el).firstDefined();\n }\n }\n for (var att in params) {\n if (params[has](att)) {\n eve(\"snap.util.attr.\" + att, el, params[att]);\n }\n }\n return el;\n };\n/*\\\n * Snap.parse\n [ method ]\n **\n * Parses SVG fragment and converts it into a @Fragment\n **\n - svg (string) SVG string\n = (Fragment) the @Fragment\n\\*/\nSnap.parse = function (svg) {\n var f = glob.doc.createDocumentFragment(),\n full = true,\n div = glob.doc.createElement(\"div\");\n svg = Str(svg);\n if (!svg.match(/^\\s*<\\s*svg(?:\\s|>)/)) {\n svg = \"\" + svg + \"\";\n full = false;\n }\n div.innerHTML = svg;\n svg = div.getElementsByTagName(\"svg\")[0];\n if (svg) {\n if (full) {\n f = svg;\n } else {\n while (svg.firstChild) {\n f.appendChild(svg.firstChild);\n }\n }\n }\n return new Fragment(f);\n};\nfunction Fragment(frag) {\n this.node = frag;\n}\n/*\\\n * Snap.fragment\n [ method ]\n **\n * Creates a DOM fragment from a given list of elements or strings\n **\n - varargs (…) SVG string\n = (Fragment) the @Fragment\n\\*/\nSnap.fragment = function () {\n var args = Array.prototype.slice.call(arguments, 0),\n f = glob.doc.createDocumentFragment();\n for (var i = 0, ii = args.length; i < ii; i++) {\n var item = args[i];\n if (item.node && item.node.nodeType) {\n f.appendChild(item.node);\n }\n if (item.nodeType) {\n f.appendChild(item);\n }\n if (typeof item == \"string\") {\n f.appendChild(Snap.parse(item).node);\n }\n }\n return new Fragment(f);\n};\n\nfunction make(name, parent) {\n var res = $(name);\n parent.appendChild(res);\n var el = wrap(res);\n return el;\n}\nfunction Paper(w, h) {\n var res,\n desc,\n defs,\n proto = Paper.prototype;\n if (w && w.tagName && w.tagName.toLowerCase() == \"svg\") {\n if (w.snap in hub) {\n return hub[w.snap];\n }\n var doc = w.ownerDocument;\n res = new Element(w);\n desc = w.getElementsByTagName(\"desc\")[0];\n defs = w.getElementsByTagName(\"defs\")[0];\n if (!desc) {\n desc = $(\"desc\");\n desc.appendChild(doc.createTextNode(\"Created with Snap\"));\n res.node.appendChild(desc);\n }\n if (!defs) {\n defs = $(\"defs\");\n res.node.appendChild(defs);\n }\n res.defs = defs;\n for (var key in proto) if (proto[has](key)) {\n res[key] = proto[key];\n }\n res.paper = res.root = res;\n } else {\n res = make(\"svg\", glob.doc.body);\n $(res.node, {\n height: h,\n version: 1.1,\n width: w,\n xmlns: xmlns\n });\n }\n return res;\n}\nfunction wrap(dom) {\n if (!dom) {\n return dom;\n }\n if (dom instanceof Element || dom instanceof Fragment) {\n return dom;\n }\n if (dom.tagName && dom.tagName.toLowerCase() == \"svg\") {\n return new Paper(dom);\n }\n if (dom.tagName && dom.tagName.toLowerCase() == \"object\" && dom.type == \"image/svg+xml\") {\n return new Paper(dom.contentDocument.getElementsByTagName(\"svg\")[0]);\n }\n return new Element(dom);\n}\n\nSnap._.make = make;\nSnap._.wrap = wrap;\n/*\\\n * Paper.el\n [ method ]\n **\n * Creates an element on paper with a given name and no attributes\n **\n - name (string) tag name\n - attr (object) attributes\n = (Element) the current element\n > Usage\n | var c = paper.circle(10, 10, 10); // is the same as...\n | var c = paper.el(\"circle\").attr({\n | cx: 10,\n | cy: 10,\n | r: 10\n | });\n | // and the same as\n | var c = paper.el(\"circle\", {\n | cx: 10,\n | cy: 10,\n | r: 10\n | });\n\\*/\nPaper.prototype.el = function (name, attr) {\n var el = make(name, this.node);\n attr && el.attr(attr);\n return el;\n};\n/*\\\n * Element.children\n [ method ]\n **\n * Returns array of all the children of the element.\n = (array) array of Elements\n\\*/\nElement.prototype.children = function () {\n var out = [],\n ch = this.node.childNodes;\n for (var i = 0, ii = ch.length; i < ii; i++) {\n out[i] = Snap(ch[i]);\n }\n return out;\n};\nfunction jsonFiller(root, o) {\n for (var i = 0, ii = root.length; i < ii; i++) {\n var item = {\n type: root[i].type,\n attr: root[i].attr()\n },\n children = root[i].children();\n o.push(item);\n if (children.length) {\n jsonFiller(children, item.childNodes = []);\n }\n }\n}\n/*\\\n * Element.toJSON\n [ method ]\n **\n * Returns object representation of the given element and all its children.\n = (object) in format\n o {\n o type (string) this.type,\n o attr (object) attributes map,\n o childNodes (array) optional array of children in the same format\n o }\n\\*/\nElement.prototype.toJSON = function () {\n var out = [];\n jsonFiller([this], out);\n return out[0];\n};\n// default\neve.on(\"snap.util.getattr\", function () {\n var att = eve.nt();\n att = att.substring(att.lastIndexOf(\".\") + 1);\n var css = att.replace(/[A-Z]/g, function (letter) {\n return \"-\" + letter.toLowerCase();\n });\n if (cssAttr[has](css)) {\n return this.node.ownerDocument.defaultView.getComputedStyle(this.node, null).getPropertyValue(css);\n } else {\n return $(this.node, att);\n }\n});\nvar cssAttr = {\n \"alignment-baseline\": 0,\n \"baseline-shift\": 0,\n \"clip\": 0,\n \"clip-path\": 0,\n \"clip-rule\": 0,\n \"color\": 0,\n \"color-interpolation\": 0,\n \"color-interpolation-filters\": 0,\n \"color-profile\": 0,\n \"color-rendering\": 0,\n \"cursor\": 0,\n \"direction\": 0,\n \"display\": 0,\n \"dominant-baseline\": 0,\n \"enable-background\": 0,\n \"fill\": 0,\n \"fill-opacity\": 0,\n \"fill-rule\": 0,\n \"filter\": 0,\n \"flood-color\": 0,\n \"flood-opacity\": 0,\n \"font\": 0,\n \"font-family\": 0,\n \"font-size\": 0,\n \"font-size-adjust\": 0,\n \"font-stretch\": 0,\n \"font-style\": 0,\n \"font-variant\": 0,\n \"font-weight\": 0,\n \"glyph-orientation-horizontal\": 0,\n \"glyph-orientation-vertical\": 0,\n \"image-rendering\": 0,\n \"kerning\": 0,\n \"letter-spacing\": 0,\n \"lighting-color\": 0,\n \"marker\": 0,\n \"marker-end\": 0,\n \"marker-mid\": 0,\n \"marker-start\": 0,\n \"mask\": 0,\n \"opacity\": 0,\n \"overflow\": 0,\n \"pointer-events\": 0,\n \"shape-rendering\": 0,\n \"stop-color\": 0,\n \"stop-opacity\": 0,\n \"stroke\": 0,\n \"stroke-dasharray\": 0,\n \"stroke-dashoffset\": 0,\n \"stroke-linecap\": 0,\n \"stroke-linejoin\": 0,\n \"stroke-miterlimit\": 0,\n \"stroke-opacity\": 0,\n \"stroke-width\": 0,\n \"text-anchor\": 0,\n \"text-decoration\": 0,\n \"text-rendering\": 0,\n \"unicode-bidi\": 0,\n \"visibility\": 0,\n \"word-spacing\": 0,\n \"writing-mode\": 0\n};\n\neve.on(\"snap.util.attr\", function (value) {\n var att = eve.nt(),\n attr = {};\n att = att.substring(att.lastIndexOf(\".\") + 1);\n attr[att] = value;\n var style = att.replace(/-(\\w)/gi, function (all, letter) {\n return letter.toUpperCase();\n }),\n css = att.replace(/[A-Z]/g, function (letter) {\n return \"-\" + letter.toLowerCase();\n });\n if (cssAttr[has](css)) {\n this.node.style[style] = value == null ? E : value;\n } else {\n $(this.node, attr);\n }\n});\n(function (proto) {}(Paper.prototype));\n\n// simple ajax\n/*\\\n * Snap.ajax\n [ method ]\n **\n * Simple implementation of Ajax\n **\n - url (string) URL\n - postData (object|string) data for post request\n - callback (function) callback\n - scope (object) #optional scope of callback\n * or\n - url (string) URL\n - callback (function) callback\n - scope (object) #optional scope of callback\n = (XMLHttpRequest) the XMLHttpRequest object, just in case\n\\*/\nSnap.ajax = function (url, postData, callback, scope){\n var req = new XMLHttpRequest,\n id = ID();\n if (req) {\n if (is(postData, \"function\")) {\n scope = callback;\n callback = postData;\n postData = null;\n } else if (is(postData, \"object\")) {\n var pd = [];\n for (var key in postData) if (postData.hasOwnProperty(key)) {\n pd.push(encodeURIComponent(key) + \"=\" + encodeURIComponent(postData[key]));\n }\n postData = pd.join(\"&\");\n }\n req.open(postData ? \"POST\" : \"GET\", url, true);\n if (postData) {\n req.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n req.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");\n }\n if (callback) {\n eve.once(\"snap.ajax.\" + id + \".0\", callback);\n eve.once(\"snap.ajax.\" + id + \".200\", callback);\n eve.once(\"snap.ajax.\" + id + \".304\", callback);\n }\n req.onreadystatechange = function() {\n if (req.readyState != 4) return;\n eve(\"snap.ajax.\" + id + \".\" + req.status, scope, req);\n };\n if (req.readyState == 4) {\n return req;\n }\n req.send(postData);\n return req;\n }\n};\n/*\\\n * Snap.load\n [ method ]\n **\n * Loads external SVG file as a @Fragment (see @Snap.ajax for more advanced AJAX)\n **\n - url (string) URL\n - callback (function) callback\n - scope (object) #optional scope of callback\n\\*/\nSnap.load = function (url, callback, scope) {\n Snap.ajax(url, function (req) {\n var f = Snap.parse(req.responseText);\n scope ? callback.call(scope, f) : callback(f);\n });\n};\nvar getOffset = function (elem) {\n var box = elem.getBoundingClientRect(),\n doc = elem.ownerDocument,\n body = doc.body,\n docElem = doc.documentElement,\n clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,\n top = box.top + (g.win.pageYOffset || docElem.scrollTop || body.scrollTop ) - clientTop,\n left = box.left + (g.win.pageXOffset || docElem.scrollLeft || body.scrollLeft) - clientLeft;\n return {\n y: top,\n x: left\n };\n};\n/*\\\n * Snap.getElementByPoint\n [ method ]\n **\n * Returns you topmost element under given point.\n **\n = (object) Snap element object\n - x (number) x coordinate from the top left corner of the window\n - y (number) y coordinate from the top left corner of the window\n > Usage\n | Snap.getElementByPoint(mouseX, mouseY).attr({stroke: \"#f00\"});\n\\*/\nSnap.getElementByPoint = function (x, y) {\n var paper = this,\n svg = paper.canvas,\n target = glob.doc.elementFromPoint(x, y);\n if (glob.win.opera && target.tagName == \"svg\") {\n var so = getOffset(target),\n sr = target.createSVGRect();\n sr.x = x - so.x;\n sr.y = y - so.y;\n sr.width = sr.height = 1;\n var hits = target.getIntersectionList(sr, null);\n if (hits.length) {\n target = hits[hits.length - 1];\n }\n }\n if (!target) {\n return null;\n }\n return wrap(target);\n};\n/*\\\n * Snap.plugin\n [ method ]\n **\n * Let you write plugins. You pass in a function with five arguments, like this:\n | Snap.plugin(function (Snap, Element, Paper, global, Fragment) {\n | Snap.newmethod = function () {};\n | Element.prototype.newmethod = function () {};\n | Paper.prototype.newmethod = function () {};\n | });\n * Inside the function you have access to all main objects (and their\n * prototypes). This allow you to extend anything you want.\n **\n - f (function) your plugin body\n\\*/\nSnap.plugin = function (f) {\n f(Snap, Element, Paper, glob, Fragment);\n};\nglob.win.Snap = Snap;\nreturn Snap;\n}(window || this));\n\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob, Fragment) {\n var elproto = Element.prototype,\n is = Snap.is,\n Str = String,\n unit2px = Snap._unit2px,\n $ = Snap._.$,\n make = Snap._.make,\n getSomeDefs = Snap._.getSomeDefs,\n has = \"hasOwnProperty\",\n wrap = Snap._.wrap;\n /*\\\n * Element.getBBox\n [ method ]\n **\n * Returns the bounding box descriptor for the given element\n **\n = (object) bounding box descriptor:\n o {\n o cx: (number) x of the center,\n o cy: (number) x of the center,\n o h: (number) height,\n o height: (number) height,\n o path: (string) path command for the box,\n o r0: (number) radius of a circle that fully encloses the box,\n o r1: (number) radius of the smallest circle that can be enclosed,\n o r2: (number) radius of the largest circle that can be enclosed,\n o vb: (string) box as a viewbox command,\n o w: (number) width,\n o width: (number) width,\n o x2: (number) x of the right side,\n o x: (number) x of the left side,\n o y2: (number) y of the bottom edge,\n o y: (number) y of the top edge\n o }\n \\*/\n elproto.getBBox = function (isWithoutTransform) {\n if (this.type == \"tspan\") {\n return Snap._.box(this.node.getClientRects().item(0));\n }\n if (!Snap.Matrix || !Snap.path) {\n return this.node.getBBox();\n }\n var el = this,\n m = new Snap.Matrix;\n if (el.removed) {\n return Snap._.box();\n }\n while (el.type == \"use\") {\n if (!isWithoutTransform) {\n m = m.add(el.transform().localMatrix.translate(el.attr(\"x\") || 0, el.attr(\"y\") || 0));\n }\n if (el.original) {\n el = el.original;\n } else {\n var href = el.attr(\"xlink:href\");\n el = el.original = el.node.ownerDocument.getElementById(href.substring(href.indexOf(\"#\") + 1));\n }\n }\n var _ = el._,\n pathfinder = Snap.path.get[el.type] || Snap.path.get.deflt;\n try {\n if (isWithoutTransform) {\n _.bboxwt = pathfinder ? Snap.path.getBBox(el.realPath = pathfinder(el)) : Snap._.box(el.node.getBBox());\n return Snap._.box(_.bboxwt);\n } else {\n el.realPath = pathfinder(el);\n el.matrix = el.transform().localMatrix;\n _.bbox = Snap.path.getBBox(Snap.path.map(el.realPath, m.add(el.matrix)));\n return Snap._.box(_.bbox);\n }\n } catch (e) {\n // Firefox doesn’t give you bbox of hidden element\n return Snap._.box();\n }\n };\n var propString = function () {\n return this.string;\n };\n function extractTransform(el, tstr) {\n if (tstr == null) {\n var doReturn = true;\n if (el.type == \"linearGradient\" || el.type == \"radialGradient\") {\n tstr = el.node.getAttribute(\"gradientTransform\");\n } else if (el.type == \"pattern\") {\n tstr = el.node.getAttribute(\"patternTransform\");\n } else {\n tstr = el.node.getAttribute(\"transform\");\n }\n if (!tstr) {\n return new Snap.Matrix;\n }\n tstr = Snap._.svgTransform2string(tstr);\n } else {\n if (!Snap._.rgTransform.test(tstr)) {\n tstr = Snap._.svgTransform2string(tstr);\n } else {\n tstr = Str(tstr).replace(/\\.{3}|\\u2026/g, el._.transform || \"\");\n }\n if (is(tstr, \"array\")) {\n tstr = Snap.path ? Snap.path.toString.call(tstr) : Str(tstr);\n }\n el._.transform = tstr;\n }\n var m = Snap._.transform2matrix(tstr, el.getBBox(1));\n if (doReturn) {\n return m;\n } else {\n el.matrix = m;\n }\n }\n /*\\\n * Element.transform\n [ method ]\n **\n * Gets or sets transformation of the element\n **\n - tstr (string) transform string in Snap or SVG format\n = (Element) the current element\n * or\n = (object) transformation descriptor:\n o {\n o string (string) transform string,\n o globalMatrix (Matrix) matrix of all transformations applied to element or its parents,\n o localMatrix (Matrix) matrix of transformations applied only to the element,\n o diffMatrix (Matrix) matrix of difference between global and local transformations,\n o global (string) global transformation as string,\n o local (string) local transformation as string,\n o toString (function) returns `string` property\n o }\n \\*/\n elproto.transform = function (tstr) {\n var _ = this._;\n if (tstr == null) {\n var papa = this,\n global = new Snap.Matrix(this.node.getCTM()),\n local = extractTransform(this),\n ms = [local],\n m = new Snap.Matrix,\n i,\n localString = local.toTransformString(),\n string = Str(local) == Str(this.matrix) ?\n Str(_.transform) : localString;\n while (papa.type != \"svg\" && (papa = papa.parent())) {\n ms.push(extractTransform(papa));\n }\n i = ms.length;\n while (i--) {\n m.add(ms[i]);\n }\n return {\n string: string,\n globalMatrix: global,\n totalMatrix: m,\n localMatrix: local,\n diffMatrix: global.clone().add(local.invert()),\n global: global.toTransformString(),\n total: m.toTransformString(),\n local: localString,\n toString: propString\n };\n }\n if (tstr instanceof Snap.Matrix) {\n this.matrix = tstr;\n this._.transform = tstr.toTransformString();\n } else {\n extractTransform(this, tstr);\n }\n\n if (this.node) {\n if (this.type == \"linearGradient\" || this.type == \"radialGradient\") {\n $(this.node, {gradientTransform: this.matrix});\n } else if (this.type == \"pattern\") {\n $(this.node, {patternTransform: this.matrix});\n } else {\n $(this.node, {transform: this.matrix});\n }\n }\n\n return this;\n };\n /*\\\n * Element.parent\n [ method ]\n **\n * Returns the element's parent\n **\n = (Element) the parent element\n \\*/\n elproto.parent = function () {\n return wrap(this.node.parentNode);\n };\n /*\\\n * Element.append\n [ method ]\n **\n * Appends the given element to current one\n **\n - el (Element|Set) element to append\n = (Element) the parent element\n \\*/\n /*\\\n * Element.add\n [ method ]\n **\n * See @Element.append\n \\*/\n elproto.append = elproto.add = function (el) {\n if (el) {\n if (el.type == \"set\") {\n var it = this;\n el.forEach(function (el) {\n it.add(el);\n });\n return this;\n }\n el = wrap(el);\n this.node.appendChild(el.node);\n el.paper = this.paper;\n }\n return this;\n };\n /*\\\n * Element.appendTo\n [ method ]\n **\n * Appends the current element to the given one\n **\n - el (Element) parent element to append to\n = (Element) the child element\n \\*/\n elproto.appendTo = function (el) {\n if (el) {\n el = wrap(el);\n el.append(this);\n }\n return this;\n };\n /*\\\n * Element.prepend\n [ method ]\n **\n * Prepends the given element to the current one\n **\n - el (Element) element to prepend\n = (Element) the parent element\n \\*/\n elproto.prepend = function (el) {\n if (el) {\n if (el.type == \"set\") {\n var it = this,\n first;\n el.forEach(function (el) {\n if (first) {\n first.after(el);\n } else {\n it.prepend(el);\n }\n first = el;\n });\n return this;\n }\n el = wrap(el);\n var parent = el.parent();\n this.node.insertBefore(el.node, this.node.firstChild);\n this.add && this.add();\n el.paper = this.paper;\n this.parent() && this.parent().add();\n parent && parent.add();\n }\n return this;\n };\n /*\\\n * Element.prependTo\n [ method ]\n **\n * Prepends the current element to the given one\n **\n - el (Element) parent element to prepend to\n = (Element) the child element\n \\*/\n elproto.prependTo = function (el) {\n el = wrap(el);\n el.prepend(this);\n return this;\n };\n /*\\\n * Element.before\n [ method ]\n **\n * Inserts given element before the current one\n **\n - el (Element) element to insert\n = (Element) the parent element\n \\*/\n elproto.before = function (el) {\n if (el.type == \"set\") {\n var it = this;\n el.forEach(function (el) {\n var parent = el.parent();\n it.node.parentNode.insertBefore(el.node, it.node);\n parent && parent.add();\n });\n this.parent().add();\n return this;\n }\n el = wrap(el);\n var parent = el.parent();\n this.node.parentNode.insertBefore(el.node, this.node);\n this.parent() && this.parent().add();\n parent && parent.add();\n el.paper = this.paper;\n return this;\n };\n /*\\\n * Element.after\n [ method ]\n **\n * Inserts given element after the current one\n **\n - el (Element) element to insert\n = (Element) the parent element\n \\*/\n elproto.after = function (el) {\n el = wrap(el);\n var parent = el.parent();\n if (this.node.nextSibling) {\n this.node.parentNode.insertBefore(el.node, this.node.nextSibling);\n } else {\n this.node.parentNode.appendChild(el.node);\n }\n this.parent() && this.parent().add();\n parent && parent.add();\n el.paper = this.paper;\n return this;\n };\n /*\\\n * Element.insertBefore\n [ method ]\n **\n * Inserts the element after the given one\n **\n - el (Element) element next to whom insert to\n = (Element) the parent element\n \\*/\n elproto.insertBefore = function (el) {\n el = wrap(el);\n var parent = this.parent();\n el.node.parentNode.insertBefore(this.node, el.node);\n this.paper = el.paper;\n parent && parent.add();\n el.parent() && el.parent().add();\n return this;\n };\n /*\\\n * Element.insertAfter\n [ method ]\n **\n * Inserts the element after the given one\n **\n - el (Element) element next to whom insert to\n = (Element) the parent element\n \\*/\n elproto.insertAfter = function (el) {\n el = wrap(el);\n var parent = this.parent();\n el.node.parentNode.insertBefore(this.node, el.node.nextSibling);\n this.paper = el.paper;\n parent && parent.add();\n el.parent() && el.parent().add();\n return this;\n };\n /*\\\n * Element.remove\n [ method ]\n **\n * Removes element from the DOM\n = (Element) the detached element\n \\*/\n elproto.remove = function () {\n var parent = this.parent();\n this.node.parentNode && this.node.parentNode.removeChild(this.node);\n delete this.paper;\n this.removed = true;\n parent && parent.add();\n return this;\n };\n /*\\\n * Element.select\n [ method ]\n **\n * Gathers the nested @Element matching the given set of CSS selectors\n **\n - query (string) CSS selector\n = (Element) result of query selection\n \\*/\n elproto.select = function (query) {\n return wrap(this.node.querySelector(query));\n };\n /*\\\n * Element.selectAll\n [ method ]\n **\n * Gathers nested @Element objects matching the given set of CSS selectors\n **\n - query (string) CSS selector\n = (Set|array) result of query selection\n \\*/\n elproto.selectAll = function (query) {\n var nodelist = this.node.querySelectorAll(query),\n set = (Snap.set || Array)();\n for (var i = 0; i < nodelist.length; i++) {\n set.push(wrap(nodelist[i]));\n }\n return set;\n };\n /*\\\n * Element.asPX\n [ method ]\n **\n * Returns given attribute of the element as a `px` value (not %, em, etc.)\n **\n - attr (string) attribute name\n - value (string) #optional attribute value\n = (Element) result of query selection\n \\*/\n elproto.asPX = function (attr, value) {\n if (value == null) {\n value = this.attr(attr);\n }\n return +unit2px(this, attr, value);\n };\n // SIERRA Element.use(): I suggest adding a note about how to access the original element the returned instantiates. It's a part of SVG with which ordinary web developers may be least familiar.\n /*\\\n * Element.use\n [ method ]\n **\n * Creates a `` element linked to the current element\n **\n = (Element) the `` element\n \\*/\n elproto.use = function () {\n var use,\n id = this.node.id;\n if (!id) {\n id = this.id;\n $(this.node, {\n id: id\n });\n }\n if (this.type == \"linearGradient\" || this.type == \"radialGradient\" ||\n this.type == \"pattern\") {\n use = make(this.type, this.node.parentNode);\n } else {\n use = make(\"use\", this.node.parentNode);\n }\n $(use.node, {\n \"xlink:href\": \"#\" + id\n });\n use.original = this;\n return use;\n };\n function fixids(el) {\n var els = el.selectAll(\"*\"),\n it,\n url = /^\\s*url\\((\"|'|)(.*)\\1\\)\\s*$/,\n ids = [],\n uses = {};\n function urltest(it, name) {\n var val = $(it.node, name);\n val = val && val.match(url);\n val = val && val[2];\n if (val && val.charAt() == \"#\") {\n val = val.substring(1);\n } else {\n return;\n }\n if (val) {\n uses[val] = (uses[val] || []).concat(function (id) {\n var attr = {};\n attr[name] = Snap.url(id);\n $(it.node, attr);\n });\n }\n }\n function linktest(it) {\n var val = $(it.node, \"xlink:href\");\n if (val && val.charAt() == \"#\") {\n val = val.substring(1);\n } else {\n return;\n }\n if (val) {\n uses[val] = (uses[val] || []).concat(function (id) {\n it.attr(\"xlink:href\", \"#\" + id);\n });\n }\n }\n for (var i = 0, ii = els.length; i < ii; i++) {\n it = els[i];\n urltest(it, \"fill\");\n urltest(it, \"stroke\");\n urltest(it, \"filter\");\n urltest(it, \"mask\");\n urltest(it, \"clip-path\");\n linktest(it);\n var oldid = $(it.node, \"id\");\n if (oldid) {\n $(it.node, {id: it.id});\n ids.push({\n old: oldid,\n id: it.id\n });\n }\n }\n for (i = 0, ii = ids.length; i < ii; i++) {\n var fs = uses[ids[i].old];\n if (fs) {\n for (var j = 0, jj = fs.length; j < jj; j++) {\n fs[j](ids[i].id);\n }\n }\n }\n }\n /*\\\n * Element.clone\n [ method ]\n **\n * Creates a clone of the element and inserts it after the element\n **\n = (Element) the clone\n \\*/\n elproto.clone = function () {\n var clone = wrap(this.node.cloneNode(true));\n if ($(clone.node, \"id\")) {\n $(clone.node, {id: clone.id});\n }\n fixids(clone);\n clone.insertAfter(this);\n return clone;\n };\n /*\\\n * Element.toDefs\n [ method ]\n **\n * Moves element to the shared `` area\n **\n = (Element) the element\n \\*/\n elproto.toDefs = function () {\n var defs = getSomeDefs(this);\n defs.appendChild(this.node);\n return this;\n };\n /*\\\n * Element.toPattern\n [ method ]\n **\n * Creates a `` element from the current element\n **\n * To create a pattern you have to specify the pattern rect:\n - x (string|number)\n - y (string|number)\n - width (string|number)\n - height (string|number)\n = (Element) the `` element\n * You can use pattern later on as an argument for `fill` attribute:\n | var p = paper.path(\"M10-5-10,15M15,0,0,15M0-5-20,15\").attr({\n | fill: \"none\",\n | stroke: \"#bada55\",\n | strokeWidth: 5\n | }).pattern(0, 0, 10, 10),\n | c = paper.circle(200, 200, 100);\n | c.attr({\n | fill: p\n | });\n \\*/\n elproto.pattern = elproto.toPattern = function (x, y, width, height) {\n var p = make(\"pattern\", getSomeDefs(this));\n if (x == null) {\n x = this.getBBox();\n }\n if (is(x, \"object\") && \"x\" in x) {\n y = x.y;\n width = x.width;\n height = x.height;\n x = x.x;\n }\n $(p.node, {\n x: x,\n y: y,\n width: width,\n height: height,\n patternUnits: \"userSpaceOnUse\",\n id: p.id,\n viewBox: [x, y, width, height].join(\" \")\n });\n p.node.appendChild(this.node);\n return p;\n };\n// SIERRA Element.marker(): clarify what a reference point is. E.g., helps you offset the object from its edge such as when centering it over a path.\n// SIERRA Element.marker(): I suggest the method should accept default reference point values. Perhaps centered with (refX = width/2) and (refY = height/2)? Also, couldn't it assume the element's current _width_ and _height_? And please specify what _x_ and _y_ mean: offsets? If so, from where? Couldn't they also be assigned default values?\n /*\\\n * Element.marker\n [ method ]\n **\n * Creates a `` element from the current element\n **\n * To create a marker you have to specify the bounding rect and reference point:\n - x (number)\n - y (number)\n - width (number)\n - height (number)\n - refX (number)\n - refY (number)\n = (Element) the `` element\n * You can specify the marker later as an argument for `marker-start`, `marker-end`, `marker-mid`, and `marker` attributes. The `marker` attribute places the marker at every point along the path, and `marker-mid` places them at every point except the start and end.\n \\*/\n // TODO add usage for markers\n elproto.marker = function (x, y, width, height, refX, refY) {\n var p = make(\"marker\", getSomeDefs(this));\n if (x == null) {\n x = this.getBBox();\n }\n if (is(x, \"object\") && \"x\" in x) {\n y = x.y;\n width = x.width;\n height = x.height;\n refX = x.refX || x.cx;\n refY = x.refY || x.cy;\n x = x.x;\n }\n $(p.node, {\n viewBox: [x, y, width, height].join(\" \"),\n markerWidth: width,\n markerHeight: height,\n orient: \"auto\",\n refX: refX || 0,\n refY: refY || 0,\n id: p.id\n });\n p.node.appendChild(this.node);\n return p;\n };\n var eldata = {};\n /*\\\n * Element.data\n [ method ]\n **\n * Adds or retrieves given value associated with given key. (Don’t confuse\n * with `data-` attributes)\n *\n * See also @Element.removeData\n - key (string) key to store data\n - value (any) #optional value to store\n = (object) @Element\n * or, if value is not specified:\n = (any) value\n > Usage\n | for (var i = 0, i < 5, i++) {\n | paper.circle(10 + 15 * i, 10, 10)\n | .attr({fill: \"#000\"})\n | .data(\"i\", i)\n | .click(function () {\n | alert(this.data(\"i\"));\n | });\n | }\n \\*/\n elproto.data = function (key, value) {\n var data = eldata[this.id] = eldata[this.id] || {};\n if (arguments.length == 0){\n eve(\"snap.data.get.\" + this.id, this, data, null);\n return data;\n }\n if (arguments.length == 1) {\n if (Snap.is(key, \"object\")) {\n for (var i in key) if (key[has](i)) {\n this.data(i, key[i]);\n }\n return this;\n }\n eve(\"snap.data.get.\" + this.id, this, data[key], key);\n return data[key];\n }\n data[key] = value;\n eve(\"snap.data.set.\" + this.id, this, value, key);\n return this;\n };\n /*\\\n * Element.removeData\n [ method ]\n **\n * Removes value associated with an element by given key.\n * If key is not provided, removes all the data of the element.\n - key (string) #optional key\n = (object) @Element\n \\*/\n elproto.removeData = function (key) {\n if (key == null) {\n eldata[this.id] = {};\n } else {\n eldata[this.id] && delete eldata[this.id][key];\n }\n return this;\n };\n /*\\\n * Element.outerSVG\n [ method ]\n **\n * Returns SVG code for the element, equivalent to HTML's `outerHTML`.\n *\n * See also @Element.innerSVG\n = (string) SVG code for the element\n \\*/\n /*\\\n * Element.toString\n [ method ]\n **\n * See @Element.outerSVG\n \\*/\n elproto.outerSVG = elproto.toString = toString(1);\n /*\\\n * Element.innerSVG\n [ method ]\n **\n * Returns SVG code for the element's contents, equivalent to HTML's `innerHTML`\n = (string) SVG code for the element\n \\*/\n elproto.innerSVG = toString();\n function toString(type) {\n return function () {\n var res = type ? \"<\" + this.type : \"\",\n attr = this.node.attributes,\n chld = this.node.childNodes;\n if (type) {\n for (var i = 0, ii = attr.length; i < ii; i++) {\n res += \" \" + attr[i].name + '=\"' +\n attr[i].value.replace(/\"/g, '\\\\\"') + '\"';\n }\n }\n if (chld.length) {\n type && (res += \">\");\n for (i = 0, ii = chld.length; i < ii; i++) {\n if (chld[i].nodeType == 3) {\n res += chld[i].nodeValue;\n } else if (chld[i].nodeType == 1) {\n res += wrap(chld[i]).toString();\n }\n }\n type && (res += \"\");\n } else {\n type && (res += \"/>\");\n }\n return res;\n };\n }\n elproto.toDataURL = function () {\n if (window && window.btoa) {\n var bb = this.getBBox(),\n svg = Snap.format('{contents}', {\n x: +bb.x.toFixed(3),\n y: +bb.y.toFixed(3),\n width: +bb.width.toFixed(3),\n height: +bb.height.toFixed(3),\n contents: this.outerSVG()\n });\n return \"data:image/svg+xml;base64,\" + btoa(unescape(encodeURIComponent(svg)));\n }\n };\n /*\\\n * Fragment.select\n [ method ]\n **\n * See @Element.select\n \\*/\n Fragment.prototype.select = elproto.select;\n /*\\\n * Fragment.selectAll\n [ method ]\n **\n * See @Element.selectAll\n \\*/\n Fragment.prototype.selectAll = elproto.selectAll;\n});\n\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob, Fragment) {\n var objectToString = Object.prototype.toString,\n Str = String,\n math = Math,\n E = \"\";\n function Matrix(a, b, c, d, e, f) {\n if (b == null && objectToString.call(a) == \"[object SVGMatrix]\") {\n this.a = a.a;\n this.b = a.b;\n this.c = a.c;\n this.d = a.d;\n this.e = a.e;\n this.f = a.f;\n return;\n }\n if (a != null) {\n this.a = +a;\n this.b = +b;\n this.c = +c;\n this.d = +d;\n this.e = +e;\n this.f = +f;\n } else {\n this.a = 1;\n this.b = 0;\n this.c = 0;\n this.d = 1;\n this.e = 0;\n this.f = 0;\n }\n }\n (function (matrixproto) {\n /*\\\n * Matrix.add\n [ method ]\n **\n * Adds the given matrix to existing one\n - a (number)\n - b (number)\n - c (number)\n - d (number)\n - e (number)\n - f (number)\n * or\n - matrix (object) @Matrix\n \\*/\n matrixproto.add = function (a, b, c, d, e, f) {\n if (a && a instanceof Matrix) {\n return this.add(a.a, a.b, a.c, a.d, a.e, a.f);\n }\n var aNew = a * this.a + b * this.c,\n bNew = a * this.b + b * this.d;\n this.e += e * this.a + f * this.c;\n this.f += e * this.b + f * this.d;\n this.c = c * this.a + d * this.c;\n this.d = c * this.b + d * this.d;\n\n this.a = aNew;\n this.b = bNew;\n return this;\n };\n /*\\\n * Matrix.multLeft\n [ method ]\n **\n * Multiplies a passed affine transform to the left: M * this.\n - a (number)\n - b (number)\n - c (number)\n - d (number)\n - e (number)\n - f (number)\n * or\n - matrix (object) @Matrix\n \\*/\n Matrix.prototype.multLeft = function (a, b, c, d, e, f) {\n if (a && a instanceof Matrix) {\n return this.multLeft(a.a, a.b, a.c, a.d, a.e, a.f);\n }\n var aNew = a * this.a + c * this.b,\n cNew = a * this.c + c * this.d,\n eNew = a * this.e + c * this.f + e;\n this.b = b * this.a + d * this.b;\n this.d = b * this.c + d * this.d;\n this.f = b * this.e + d * this.f + f;\n\n this.a = aNew;\n this.c = cNew;\n this.e = eNew;\n return this;\n };\n /*\\\n * Matrix.invert\n [ method ]\n **\n * Returns an inverted version of the matrix\n = (object) @Matrix\n \\*/\n matrixproto.invert = function () {\n var me = this,\n x = me.a * me.d - me.b * me.c;\n return new Matrix(me.d / x, -me.b / x, -me.c / x, me.a / x, (me.c * me.f - me.d * me.e) / x, (me.b * me.e - me.a * me.f) / x);\n };\n /*\\\n * Matrix.clone\n [ method ]\n **\n * Returns a copy of the matrix\n = (object) @Matrix\n \\*/\n matrixproto.clone = function () {\n return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f);\n };\n /*\\\n * Matrix.translate\n [ method ]\n **\n * Translate the matrix\n - x (number) horizontal offset distance\n - y (number) vertical offset distance\n \\*/\n matrixproto.translate = function (x, y) {\n this.e += x * this.a + y * this.c;\n this.f += x * this.b + y * this.d;\n return this;\n };\n /*\\\n * Matrix.scale\n [ method ]\n **\n * Scales the matrix\n - x (number) amount to be scaled, with `1` resulting in no change\n - y (number) #optional amount to scale along the vertical axis. (Otherwise `x` applies to both axes.)\n - cx (number) #optional horizontal origin point from which to scale\n - cy (number) #optional vertical origin point from which to scale\n * Default cx, cy is the middle point of the element.\n \\*/\n matrixproto.scale = function (x, y, cx, cy) {\n y == null && (y = x);\n (cx || cy) && this.translate(cx, cy);\n this.a *= x;\n this.b *= x;\n this.c *= y;\n this.d *= y;\n (cx || cy) && this.translate(-cx, -cy);\n return this;\n };\n /*\\\n * Matrix.rotate\n [ method ]\n **\n * Rotates the matrix\n - a (number) angle of rotation, in degrees\n - x (number) horizontal origin point from which to rotate\n - y (number) vertical origin point from which to rotate\n \\*/\n matrixproto.rotate = function (a, x, y) {\n a = Snap.rad(a);\n x = x || 0;\n y = y || 0;\n var cos = +math.cos(a).toFixed(9),\n sin = +math.sin(a).toFixed(9);\n this.add(cos, sin, -sin, cos, x, y);\n return this.add(1, 0, 0, 1, -x, -y);\n };\n /*\\\n * Matrix.skewX\n [ method ]\n **\n * Skews the matrix along the x-axis\n - x (number) Angle to skew along the x-axis (in degrees).\n \\*/\n matrixproto.skewX = function (x) {\n return this.skew(x, 0);\n };\n /*\\\n * Matrix.skewY\n [ method ]\n **\n * Skews the matrix along the y-axis\n - y (number) Angle to skew along the y-axis (in degrees).\n \\*/\n matrixproto.skewY = function (y) {\n return this.skew(0, y);\n };\n /*\\\n * Matrix.skew\n [ method ]\n **\n * Skews the matrix\n - y (number) Angle to skew along the y-axis (in degrees).\n - x (number) Angle to skew along the x-axis (in degrees).\n \\*/\n matrixproto.skew = function (x, y) {\n x = x || 0;\n y = y || 0;\n x = Snap.rad(x);\n y = Snap.rad(y);\n var c = math.tan(x).toFixed(9);\n var b = math.tan(y).toFixed(9);\n return this.add(1, b, c, 1, 0, 0);\n };\n /*\\\n * Matrix.x\n [ method ]\n **\n * Returns x coordinate for given point after transformation described by the matrix. See also @Matrix.y\n - x (number)\n - y (number)\n = (number) x\n \\*/\n matrixproto.x = function (x, y) {\n return x * this.a + y * this.c + this.e;\n };\n /*\\\n * Matrix.y\n [ method ]\n **\n * Returns y coordinate for given point after transformation described by the matrix. See also @Matrix.x\n - x (number)\n - y (number)\n = (number) y\n \\*/\n matrixproto.y = function (x, y) {\n return x * this.b + y * this.d + this.f;\n };\n matrixproto.get = function (i) {\n return +this[Str.fromCharCode(97 + i)].toFixed(4);\n };\n matrixproto.toString = function () {\n return \"matrix(\" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)].join() + \")\";\n };\n matrixproto.offset = function () {\n return [this.e.toFixed(4), this.f.toFixed(4)];\n };\n function norm(a) {\n return a[0] * a[0] + a[1] * a[1];\n }\n function normalize(a) {\n var mag = math.sqrt(norm(a));\n a[0] && (a[0] /= mag);\n a[1] && (a[1] /= mag);\n }\n /*\\\n * Matrix.determinant\n [ method ]\n **\n * Finds determinant of the given matrix.\n = (number) determinant\n \\*/\n matrixproto.determinant = function () {\n return this.a * this.d - this.b * this.c;\n };\n /*\\\n * Matrix.split\n [ method ]\n **\n * Splits matrix into primitive transformations\n = (object) in format:\n o dx (number) translation by x\n o dy (number) translation by y\n o scalex (number) scale by x\n o scaley (number) scale by y\n o shear (number) shear\n o rotate (number) rotation in deg\n o isSimple (boolean) could it be represented via simple transformations\n \\*/\n matrixproto.split = function () {\n var out = {};\n // translation\n out.dx = this.e;\n out.dy = this.f;\n\n // scale and shear\n var row = [[this.a, this.b], [this.c, this.d]];\n out.scalex = math.sqrt(norm(row[0]));\n normalize(row[0]);\n\n out.shear = row[0][0] * row[1][0] + row[0][1] * row[1][1];\n row[1] = [row[1][0] - row[0][0] * out.shear, row[1][1] - row[0][1] * out.shear];\n\n out.scaley = math.sqrt(norm(row[1]));\n normalize(row[1]);\n out.shear /= out.scaley;\n\n if (this.determinant() < 0) {\n out.scalex = -out.scalex;\n }\n\n // rotation\n var sin = row[0][1],\n cos = row[1][1];\n if (cos < 0) {\n out.rotate = Snap.deg(math.acos(cos));\n if (sin < 0) {\n out.rotate = 360 - out.rotate;\n }\n } else {\n out.rotate = Snap.deg(math.asin(sin));\n }\n\n out.isSimple = !+out.shear.toFixed(9) && (out.scalex.toFixed(9) == out.scaley.toFixed(9) || !out.rotate);\n out.isSuperSimple = !+out.shear.toFixed(9) && out.scalex.toFixed(9) == out.scaley.toFixed(9) && !out.rotate;\n out.noRotation = !+out.shear.toFixed(9) && !out.rotate;\n return out;\n };\n /*\\\n * Matrix.toTransformString\n [ method ]\n **\n * Returns transform string that represents given matrix\n = (string) transform string\n \\*/\n matrixproto.toTransformString = function (shorter) {\n var s = shorter || this.split();\n if (!+s.shear.toFixed(9)) {\n s.scalex = +s.scalex.toFixed(4);\n s.scaley = +s.scaley.toFixed(4);\n s.rotate = +s.rotate.toFixed(4);\n return (s.dx || s.dy ? \"t\" + [+s.dx.toFixed(4), +s.dy.toFixed(4)] : E) +\n (s.rotate ? \"r\" + [+s.rotate.toFixed(4), 0, 0] : E) +\n (s.scalex != 1 || s.scaley != 1 ? \"s\" + [s.scalex, s.scaley, 0, 0] : E);\n } else {\n return \"m\" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)];\n }\n };\n })(Matrix.prototype);\n /*\\\n * Snap.Matrix\n [ method ]\n **\n * Matrix constructor, extend on your own risk.\n * To create matrices use @Snap.matrix.\n \\*/\n Snap.Matrix = Matrix;\n /*\\\n * Snap.matrix\n [ method ]\n **\n * Utility method\n **\n * Returns a matrix based on the given parameters\n - a (number)\n - b (number)\n - c (number)\n - d (number)\n - e (number)\n - f (number)\n * or\n - svgMatrix (SVGMatrix)\n = (object) @Matrix\n \\*/\n Snap.matrix = function (a, b, c, d, e, f) {\n return new Matrix(a, b, c, d, e, f);\n };\n});\n\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob, Fragment) {\n var has = \"hasOwnProperty\",\n make = Snap._.make,\n wrap = Snap._.wrap,\n is = Snap.is,\n getSomeDefs = Snap._.getSomeDefs,\n reURLValue = /^url\\((['\"]?)([^)]+)\\1\\)$/,\n $ = Snap._.$,\n URL = Snap.url,\n Str = String,\n separator = Snap._.separator,\n E = \"\";\n /*\\\n * Snap.deurl\n [ method ]\n **\n * Unwraps path from `\"url()\"`.\n - value (string) url path\n = (string) unwrapped path\n \\*/\n Snap.deurl = function (value) {\n var res = String(value).match(reURLValue);\n return res ? res[2] : value;\n }\n // Attributes event handlers\n eve.on(\"snap.util.attr.mask\", function (value) {\n if (value instanceof Element || value instanceof Fragment) {\n eve.stop();\n if (value instanceof Fragment && value.node.childNodes.length == 1) {\n value = value.node.firstChild;\n getSomeDefs(this).appendChild(value);\n value = wrap(value);\n }\n if (value.type == \"mask\") {\n var mask = value;\n } else {\n mask = make(\"mask\", getSomeDefs(this));\n mask.node.appendChild(value.node);\n }\n !mask.node.id && $(mask.node, {\n id: mask.id\n });\n $(this.node, {\n mask: URL(mask.id)\n });\n }\n });\n (function (clipIt) {\n eve.on(\"snap.util.attr.clip\", clipIt);\n eve.on(\"snap.util.attr.clip-path\", clipIt);\n eve.on(\"snap.util.attr.clipPath\", clipIt);\n }(function (value) {\n if (value instanceof Element || value instanceof Fragment) {\n eve.stop();\n var clip,\n node = value.node;\n while (node) {\n if (node.nodeName === \"clipPath\") {\n clip = new Element(node);\n break;\n }\n if (node.nodeName === \"svg\") {\n clip = undefined;\n break;\n }\n node = node.parentNode;\n }\n if (!clip) {\n clip = make(\"clipPath\", getSomeDefs(this));\n clip.node.appendChild(value.node);\n !clip.node.id && $(clip.node, {\n id: clip.id\n });\n }\n $(this.node, {\n \"clip-path\": URL(clip.node.id || clip.id)\n });\n }\n }));\n function fillStroke(name) {\n return function (value) {\n eve.stop();\n if (value instanceof Fragment && value.node.childNodes.length == 1 &&\n (value.node.firstChild.tagName == \"radialGradient\" ||\n value.node.firstChild.tagName == \"linearGradient\" ||\n value.node.firstChild.tagName == \"pattern\")) {\n value = value.node.firstChild;\n getSomeDefs(this).appendChild(value);\n value = wrap(value);\n }\n if (value instanceof Element) {\n if (value.type == \"radialGradient\" || value.type == \"linearGradient\"\n || value.type == \"pattern\") {\n if (!value.node.id) {\n $(value.node, {\n id: value.id\n });\n }\n var fill = URL(value.node.id);\n } else {\n fill = value.attr(name);\n }\n } else {\n fill = Snap.color(value);\n if (fill.error) {\n var grad = Snap(getSomeDefs(this).ownerSVGElement).gradient(value);\n if (grad) {\n if (!grad.node.id) {\n $(grad.node, {\n id: grad.id\n });\n }\n fill = URL(grad.node.id);\n } else {\n fill = value;\n }\n } else {\n fill = Str(fill);\n }\n }\n var attrs = {};\n attrs[name] = fill;\n $(this.node, attrs);\n this.node.style[name] = E;\n };\n }\n eve.on(\"snap.util.attr.fill\", fillStroke(\"fill\"));\n eve.on(\"snap.util.attr.stroke\", fillStroke(\"stroke\"));\n var gradrg = /^([lr])(?:\\(([^)]*)\\))?(.*)$/i;\n eve.on(\"snap.util.grad.parse\", function parseGrad(string) {\n string = Str(string);\n var tokens = string.match(gradrg);\n if (!tokens) {\n return null;\n }\n var type = tokens[1],\n params = tokens[2],\n stops = tokens[3];\n params = params.split(/\\s*,\\s*/).map(function (el) {\n return +el == el ? +el : el;\n });\n if (params.length == 1 && params[0] == 0) {\n params = [];\n }\n stops = stops.split(\"-\");\n stops = stops.map(function (el) {\n el = el.split(\":\");\n var out = {\n color: el[0]\n };\n if (el[1]) {\n out.offset = parseFloat(el[1]);\n }\n return out;\n });\n var len = stops.length,\n start = 0,\n j = 0;\n function seed(i, end) {\n var step = (end - start) / (i - j);\n for (var k = j; k < i; k++) {\n stops[k].offset = +(+start + step * (k - j)).toFixed(2);\n }\n j = i;\n start = end;\n }\n len--;\n for (var i = 0; i < len; i++) if (\"offset\" in stops[i]) {\n seed(i, stops[i].offset);\n }\n stops[len].offset = stops[len].offset || 100;\n seed(len, stops[len].offset);\n return {\n type: type,\n params: params,\n stops: stops\n };\n });\n\n eve.on(\"snap.util.attr.d\", function (value) {\n eve.stop();\n if (is(value, \"array\") && is(value[0], \"array\")) {\n value = Snap.path.toString.call(value);\n }\n value = Str(value);\n if (value.match(/[ruo]/i)) {\n value = Snap.path.toAbsolute(value);\n }\n $(this.node, {d: value});\n })(-1);\n eve.on(\"snap.util.attr.#text\", function (value) {\n eve.stop();\n value = Str(value);\n var txt = glob.doc.createTextNode(value);\n while (this.node.firstChild) {\n this.node.removeChild(this.node.firstChild);\n }\n this.node.appendChild(txt);\n })(-1);\n eve.on(\"snap.util.attr.path\", function (value) {\n eve.stop();\n this.attr({d: value});\n })(-1);\n eve.on(\"snap.util.attr.class\", function (value) {\n eve.stop();\n this.node.className.baseVal = value;\n })(-1);\n eve.on(\"snap.util.attr.viewBox\", function (value) {\n var vb;\n if (is(value, \"object\") && \"x\" in value) {\n vb = [value.x, value.y, value.width, value.height].join(\" \");\n } else if (is(value, \"array\")) {\n vb = value.join(\" \");\n } else {\n vb = value;\n }\n $(this.node, {\n viewBox: vb\n });\n eve.stop();\n })(-1);\n eve.on(\"snap.util.attr.transform\", function (value) {\n this.transform(value);\n eve.stop();\n })(-1);\n eve.on(\"snap.util.attr.r\", function (value) {\n if (this.type == \"rect\") {\n eve.stop();\n $(this.node, {\n rx: value,\n ry: value\n });\n }\n })(-1);\n eve.on(\"snap.util.attr.textpath\", function (value) {\n eve.stop();\n if (this.type == \"text\") {\n var id, tp, node;\n if (!value && this.textPath) {\n tp = this.textPath;\n while (tp.node.firstChild) {\n this.node.appendChild(tp.node.firstChild);\n }\n tp.remove();\n delete this.textPath;\n return;\n }\n if (is(value, \"string\")) {\n var defs = getSomeDefs(this),\n path = wrap(defs.parentNode).path(value);\n defs.appendChild(path.node);\n id = path.id;\n path.attr({id: id});\n } else {\n value = wrap(value);\n if (value instanceof Element) {\n id = value.attr(\"id\");\n if (!id) {\n id = value.id;\n value.attr({id: id});\n }\n }\n }\n if (id) {\n tp = this.textPath;\n node = this.node;\n if (tp) {\n tp.attr({\"xlink:href\": \"#\" + id});\n } else {\n tp = $(\"textPath\", {\n \"xlink:href\": \"#\" + id\n });\n while (node.firstChild) {\n tp.appendChild(node.firstChild);\n }\n node.appendChild(tp);\n this.textPath = wrap(tp);\n }\n }\n }\n })(-1);\n eve.on(\"snap.util.attr.text\", function (value) {\n if (this.type == \"text\") {\n var i = 0,\n node = this.node,\n tuner = function (chunk) {\n var out = $(\"tspan\");\n if (is(chunk, \"array\")) {\n for (var i = 0; i < chunk.length; i++) {\n out.appendChild(tuner(chunk[i]));\n }\n } else {\n out.appendChild(glob.doc.createTextNode(chunk));\n }\n out.normalize && out.normalize();\n return out;\n };\n while (node.firstChild) {\n node.removeChild(node.firstChild);\n }\n var tuned = tuner(value);\n while (tuned.firstChild) {\n node.appendChild(tuned.firstChild);\n }\n }\n eve.stop();\n })(-1);\n function setFontSize(value) {\n eve.stop();\n if (value == +value) {\n value += \"px\";\n }\n this.node.style.fontSize = value;\n }\n eve.on(\"snap.util.attr.fontSize\", setFontSize)(-1);\n eve.on(\"snap.util.attr.font-size\", setFontSize)(-1);\n\n\n eve.on(\"snap.util.getattr.transform\", function () {\n eve.stop();\n return this.transform();\n })(-1);\n eve.on(\"snap.util.getattr.textpath\", function () {\n eve.stop();\n return this.textPath;\n })(-1);\n // Markers\n (function () {\n function getter(end) {\n return function () {\n eve.stop();\n var style = glob.doc.defaultView.getComputedStyle(this.node, null).getPropertyValue(\"marker-\" + end);\n if (style == \"none\") {\n return style;\n } else {\n return Snap(glob.doc.getElementById(style.match(reURLValue)[1]));\n }\n };\n }\n function setter(end) {\n return function (value) {\n eve.stop();\n var name = \"marker\" + end.charAt(0).toUpperCase() + end.substring(1);\n if (value == \"\" || !value) {\n this.node.style[name] = \"none\";\n return;\n }\n if (value.type == \"marker\") {\n var id = value.node.id;\n if (!id) {\n $(value.node, {id: value.id});\n }\n this.node.style[name] = URL(id);\n return;\n }\n };\n }\n eve.on(\"snap.util.getattr.marker-end\", getter(\"end\"))(-1);\n eve.on(\"snap.util.getattr.markerEnd\", getter(\"end\"))(-1);\n eve.on(\"snap.util.getattr.marker-start\", getter(\"start\"))(-1);\n eve.on(\"snap.util.getattr.markerStart\", getter(\"start\"))(-1);\n eve.on(\"snap.util.getattr.marker-mid\", getter(\"mid\"))(-1);\n eve.on(\"snap.util.getattr.markerMid\", getter(\"mid\"))(-1);\n eve.on(\"snap.util.attr.marker-end\", setter(\"end\"))(-1);\n eve.on(\"snap.util.attr.markerEnd\", setter(\"end\"))(-1);\n eve.on(\"snap.util.attr.marker-start\", setter(\"start\"))(-1);\n eve.on(\"snap.util.attr.markerStart\", setter(\"start\"))(-1);\n eve.on(\"snap.util.attr.marker-mid\", setter(\"mid\"))(-1);\n eve.on(\"snap.util.attr.markerMid\", setter(\"mid\"))(-1);\n }());\n eve.on(\"snap.util.getattr.r\", function () {\n if (this.type == \"rect\" && $(this.node, \"rx\") == $(this.node, \"ry\")) {\n eve.stop();\n return $(this.node, \"rx\");\n }\n })(-1);\n function textExtract(node) {\n var out = [];\n var children = node.childNodes;\n for (var i = 0, ii = children.length; i < ii; i++) {\n var chi = children[i];\n if (chi.nodeType == 3) {\n out.push(chi.nodeValue);\n }\n if (chi.tagName == \"tspan\") {\n if (chi.childNodes.length == 1 && chi.firstChild.nodeType == 3) {\n out.push(chi.firstChild.nodeValue);\n } else {\n out.push(textExtract(chi));\n }\n }\n }\n return out;\n }\n eve.on(\"snap.util.getattr.text\", function () {\n if (this.type == \"text\" || this.type == \"tspan\") {\n eve.stop();\n var out = textExtract(this.node);\n return out.length == 1 ? out[0] : out;\n }\n })(-1);\n eve.on(\"snap.util.getattr.#text\", function () {\n return this.node.textContent;\n })(-1);\n eve.on(\"snap.util.getattr.fill\", function (internal) {\n if (internal) {\n return;\n }\n eve.stop();\n var value = eve(\"snap.util.getattr.fill\", this, true).firstDefined();\n return Snap(Snap.deurl(value)) || value;\n })(-1);\n eve.on(\"snap.util.getattr.stroke\", function (internal) {\n if (internal) {\n return;\n }\n eve.stop();\n var value = eve(\"snap.util.getattr.stroke\", this, true).firstDefined();\n return Snap(Snap.deurl(value)) || value;\n })(-1);\n eve.on(\"snap.util.getattr.viewBox\", function () {\n eve.stop();\n var vb = $(this.node, \"viewBox\");\n if (vb) {\n vb = vb.split(separator);\n return Snap._.box(+vb[0], +vb[1], +vb[2], +vb[3]);\n } else {\n return;\n }\n })(-1);\n eve.on(\"snap.util.getattr.points\", function () {\n var p = $(this.node, \"points\");\n eve.stop();\n if (p) {\n return p.split(separator);\n } else {\n return;\n }\n })(-1);\n eve.on(\"snap.util.getattr.path\", function () {\n var p = $(this.node, \"d\");\n eve.stop();\n return p;\n })(-1);\n eve.on(\"snap.util.getattr.class\", function () {\n return this.node.className.baseVal;\n })(-1);\n function getFontSize() {\n eve.stop();\n return this.node.style.fontSize;\n }\n eve.on(\"snap.util.getattr.fontSize\", getFontSize)(-1);\n eve.on(\"snap.util.getattr.font-size\", getFontSize)(-1);\n});\n\n// Copyright (c) 2014 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob, Fragment) {\n var rgNotSpace = /\\S+/g,\n rgBadSpace = /[\\t\\r\\n\\f]/g,\n rgTrim = /(^\\s+|\\s+$)/g,\n Str = String,\n elproto = Element.prototype;\n /*\\\n * Element.addClass\n [ method ]\n **\n * Adds given class name or list of class names to the element.\n - value (string) class name or space separated list of class names\n **\n = (Element) original element.\n \\*/\n elproto.addClass = function (value) {\n var classes = Str(value || \"\").match(rgNotSpace) || [],\n elem = this.node,\n className = elem.className.baseVal,\n curClasses = className.match(rgNotSpace) || [],\n j,\n pos,\n clazz,\n finalValue;\n\n if (classes.length) {\n j = 0;\n while (clazz = classes[j++]) {\n pos = curClasses.indexOf(clazz);\n if (!~pos) {\n curClasses.push(clazz);\n }\n }\n\n finalValue = curClasses.join(\" \");\n if (className != finalValue) {\n elem.className.baseVal = finalValue;\n }\n }\n return this;\n };\n /*\\\n * Element.removeClass\n [ method ]\n **\n * Removes given class name or list of class names from the element.\n - value (string) class name or space separated list of class names\n **\n = (Element) original element.\n \\*/\n elproto.removeClass = function (value) {\n var classes = Str(value || \"\").match(rgNotSpace) || [],\n elem = this.node,\n className = elem.className.baseVal,\n curClasses = className.match(rgNotSpace) || [],\n j,\n pos,\n clazz,\n finalValue;\n if (curClasses.length) {\n j = 0;\n while (clazz = classes[j++]) {\n pos = curClasses.indexOf(clazz);\n if (~pos) {\n curClasses.splice(pos, 1);\n }\n }\n\n finalValue = curClasses.join(\" \");\n if (className != finalValue) {\n elem.className.baseVal = finalValue;\n }\n }\n return this;\n };\n /*\\\n * Element.hasClass\n [ method ]\n **\n * Checks if the element has a given class name in the list of class names applied to it.\n - value (string) class name\n **\n = (boolean) `true` if the element has given class\n \\*/\n elproto.hasClass = function (value) {\n var elem = this.node,\n className = elem.className.baseVal,\n curClasses = className.match(rgNotSpace) || [];\n return !!~curClasses.indexOf(value);\n };\n /*\\\n * Element.toggleClass\n [ method ]\n **\n * Add or remove one or more classes from the element, depending on either\n * the class’s presence or the value of the `flag` argument.\n - value (string) class name or space separated list of class names\n - flag (boolean) value to determine whether the class should be added or removed\n **\n = (Element) original element.\n \\*/\n elproto.toggleClass = function (value, flag) {\n if (flag != null) {\n if (flag) {\n return this.addClass(value);\n } else {\n return this.removeClass(value);\n }\n }\n var classes = (value || \"\").match(rgNotSpace) || [],\n elem = this.node,\n className = elem.className.baseVal,\n curClasses = className.match(rgNotSpace) || [],\n j,\n pos,\n clazz,\n finalValue;\n j = 0;\n while (clazz = classes[j++]) {\n pos = curClasses.indexOf(clazz);\n if (~pos) {\n curClasses.splice(pos, 1);\n } else {\n curClasses.push(clazz);\n }\n }\n\n finalValue = curClasses.join(\" \");\n if (className != finalValue) {\n elem.className.baseVal = finalValue;\n }\n return this;\n };\n});\n\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob, Fragment) {\n var operators = {\n \"+\": function (x, y) {\n return x + y;\n },\n \"-\": function (x, y) {\n return x - y;\n },\n \"/\": function (x, y) {\n return x / y;\n },\n \"*\": function (x, y) {\n return x * y;\n }\n },\n Str = String,\n reUnit = /[a-z]+$/i,\n reAddon = /^\\s*([+\\-\\/*])\\s*=\\s*([\\d.eE+\\-]+)\\s*([^\\d\\s]+)?\\s*$/;\n function getNumber(val) {\n return val;\n }\n function getUnit(unit) {\n return function (val) {\n return +val.toFixed(3) + unit;\n };\n }\n eve.on(\"snap.util.attr\", function (val) {\n var plus = Str(val).match(reAddon);\n if (plus) {\n var evnt = eve.nt(),\n name = evnt.substring(evnt.lastIndexOf(\".\") + 1),\n a = this.attr(name),\n atr = {};\n eve.stop();\n var unit = plus[3] || \"\",\n aUnit = a.match(reUnit),\n op = operators[plus[1]];\n if (aUnit && aUnit == unit) {\n val = op(parseFloat(a), +plus[2]);\n } else {\n a = this.asPX(name);\n val = op(this.asPX(name), this.asPX(name, plus[2] + unit));\n }\n if (isNaN(a) || isNaN(val)) {\n return;\n }\n atr[name] = val;\n this.attr(atr);\n }\n })(-10);\n eve.on(\"snap.util.equal\", function (name, b) {\n var A, B, a = Str(this.attr(name) || \"\"),\n el = this,\n bplus = Str(b).match(reAddon);\n if (bplus) {\n eve.stop();\n var unit = bplus[3] || \"\",\n aUnit = a.match(reUnit),\n op = operators[bplus[1]];\n if (aUnit && aUnit == unit) {\n return {\n from: parseFloat(a),\n to: op(parseFloat(a), +bplus[2]),\n f: getUnit(aUnit)\n };\n } else {\n a = this.asPX(name);\n return {\n from: a,\n to: op(a, this.asPX(name, bplus[2] + unit)),\n f: getNumber\n };\n }\n }\n })(-10);\n});\n\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob, Fragment) {\n var proto = Paper.prototype,\n is = Snap.is;\n /*\\\n * Paper.rect\n [ method ]\n *\n * Draws a rectangle\n **\n - x (number) x coordinate of the top left corner\n - y (number) y coordinate of the top left corner\n - width (number) width\n - height (number) height\n - rx (number) #optional horizontal radius for rounded corners, default is 0\n - ry (number) #optional vertical radius for rounded corners, default is rx or 0\n = (object) the `rect` element\n **\n > Usage\n | // regular rectangle\n | var c = paper.rect(10, 10, 50, 50);\n | // rectangle with rounded corners\n | var c = paper.rect(40, 40, 50, 50, 10);\n \\*/\n proto.rect = function (x, y, w, h, rx, ry) {\n var attr;\n if (ry == null) {\n ry = rx;\n }\n if (is(x, \"object\") && x == \"[object Object]\") {\n attr = x;\n } else if (x != null) {\n attr = {\n x: x,\n y: y,\n width: w,\n height: h\n };\n if (rx != null) {\n attr.rx = rx;\n attr.ry = ry;\n }\n }\n return this.el(\"rect\", attr);\n };\n /*\\\n * Paper.circle\n [ method ]\n **\n * Draws a circle\n **\n - x (number) x coordinate of the centre\n - y (number) y coordinate of the centre\n - r (number) radius\n = (object) the `circle` element\n **\n > Usage\n | var c = paper.circle(50, 50, 40);\n \\*/\n proto.circle = function (cx, cy, r) {\n var attr;\n if (is(cx, \"object\") && cx == \"[object Object]\") {\n attr = cx;\n } else if (cx != null) {\n attr = {\n cx: cx,\n cy: cy,\n r: r\n };\n }\n return this.el(\"circle\", attr);\n };\n\n var preload = (function () {\n function onerror() {\n this.parentNode.removeChild(this);\n }\n return function (src, f) {\n var img = glob.doc.createElement(\"img\"),\n body = glob.doc.body;\n img.style.cssText = \"position:absolute;left:-9999em;top:-9999em\";\n img.onload = function () {\n f.call(img);\n img.onload = img.onerror = null;\n body.removeChild(img);\n };\n img.onerror = onerror;\n body.appendChild(img);\n img.src = src;\n };\n }());\n\n /*\\\n * Paper.image\n [ method ]\n **\n * Places an image on the surface\n **\n - src (string) URI of the source image\n - x (number) x offset position\n - y (number) y offset position\n - width (number) width of the image\n - height (number) height of the image\n = (object) the `image` element\n * or\n = (object) Snap element object with type `image`\n **\n > Usage\n | var c = paper.image(\"apple.png\", 10, 10, 80, 80);\n \\*/\n proto.image = function (src, x, y, width, height) {\n var el = this.el(\"image\");\n if (is(src, \"object\") && \"src\" in src) {\n el.attr(src);\n } else if (src != null) {\n var set = {\n \"xlink:href\": src,\n preserveAspectRatio: \"none\"\n };\n if (x != null && y != null) {\n set.x = x;\n set.y = y;\n }\n if (width != null && height != null) {\n set.width = width;\n set.height = height;\n } else {\n preload(src, function () {\n Snap._.$(el.node, {\n width: this.offsetWidth,\n height: this.offsetHeight\n });\n });\n }\n Snap._.$(el.node, set);\n }\n return el;\n };\n /*\\\n * Paper.ellipse\n [ method ]\n **\n * Draws an ellipse\n **\n - x (number) x coordinate of the centre\n - y (number) y coordinate of the centre\n - rx (number) horizontal radius\n - ry (number) vertical radius\n = (object) the `ellipse` element\n **\n > Usage\n | var c = paper.ellipse(50, 50, 40, 20);\n \\*/\n proto.ellipse = function (cx, cy, rx, ry) {\n var attr;\n if (is(cx, \"object\") && cx == \"[object Object]\") {\n attr = cx;\n } else if (cx != null) {\n attr ={\n cx: cx,\n cy: cy,\n rx: rx,\n ry: ry\n };\n }\n return this.el(\"ellipse\", attr);\n };\n // SIERRA Paper.path(): Unclear from the link what a Catmull-Rom curveto is, and why it would make life any easier.\n /*\\\n * Paper.path\n [ method ]\n **\n * Creates a `` element using the given string as the path's definition\n - pathString (string) #optional path string in SVG format\n * Path string consists of one-letter commands, followed by comma seprarated arguments in numerical form. Example:\n | \"M10,20L30,40\"\n * This example features two commands: `M`, with arguments `(10, 20)` and `L` with arguments `(30, 40)`. Uppercase letter commands express coordinates in absolute terms, while lowercase commands express them in relative terms from the most recently declared coordinates.\n *\n #

Here is short list of commands available, for more details see SVG path string format or article about path strings at MDN.

\n # \n # \n # \n # \n # \n # \n # \n # \n # \n # \n # \n #
CommandNameParameters
Mmoveto(x y)+
Zclosepath(none)
Llineto(x y)+
Hhorizontal linetox+
Vvertical linetoy+
Ccurveto(x1 y1 x2 y2 x y)+
Ssmooth curveto(x2 y2 x y)+
Qquadratic Bézier curveto(x1 y1 x y)+
Tsmooth quadratic Bézier curveto(x y)+
Aelliptical arc(rx ry x-axis-rotation large-arc-flag sweep-flag x y)+
RCatmull-Rom curveto*x1 y1 (x y)+
\n * * _Catmull-Rom curveto_ is a not standard SVG command and added to make life easier.\n * Note: there is a special case when a path consists of only three commands: `M10,10R…z`. In this case the path connects back to its starting point.\n > Usage\n | var c = paper.path(\"M10 10L90 90\");\n | // draw a diagonal line:\n | // move to 10,10, line to 90,90\n \\*/\n proto.path = function (d) {\n var attr;\n if (is(d, \"object\") && !is(d, \"array\")) {\n attr = d;\n } else if (d) {\n attr = {d: d};\n }\n return this.el(\"path\", attr);\n };\n /*\\\n * Paper.g\n [ method ]\n **\n * Creates a group element\n **\n - varargs (…) #optional elements to nest within the group\n = (object) the `g` element\n **\n > Usage\n | var c1 = paper.circle(),\n | c2 = paper.rect(),\n | g = paper.g(c2, c1); // note that the order of elements is different\n * or\n | var c1 = paper.circle(),\n | c2 = paper.rect(),\n | g = paper.g();\n | g.add(c2, c1);\n \\*/\n /*\\\n * Paper.group\n [ method ]\n **\n * See @Paper.g\n \\*/\n proto.group = proto.g = function (first) {\n var attr,\n el = this.el(\"g\");\n if (arguments.length == 1 && first && !first.type) {\n el.attr(first);\n } else if (arguments.length) {\n el.add(Array.prototype.slice.call(arguments, 0));\n }\n return el;\n };\n /*\\\n * Paper.svg\n [ method ]\n **\n * Creates a nested SVG element.\n - x (number) @optional X of the element\n - y (number) @optional Y of the element\n - width (number) @optional width of the element\n - height (number) @optional height of the element\n - vbx (number) @optional viewbox X\n - vby (number) @optional viewbox Y\n - vbw (number) @optional viewbox width\n - vbh (number) @optional viewbox height\n **\n = (object) the `svg` element\n **\n \\*/\n proto.svg = function (x, y, width, height, vbx, vby, vbw, vbh) {\n var attrs = {};\n if (is(x, \"object\") && y == null) {\n attrs = x;\n } else {\n if (x != null) {\n attrs.x = x;\n }\n if (y != null) {\n attrs.y = y;\n }\n if (width != null) {\n attrs.width = width;\n }\n if (height != null) {\n attrs.height = height;\n }\n if (vbx != null && vby != null && vbw != null && vbh != null) {\n attrs.viewBox = [vbx, vby, vbw, vbh];\n }\n }\n return this.el(\"svg\", attrs);\n };\n /*\\\n * Paper.mask\n [ method ]\n **\n * Equivalent in behaviour to @Paper.g, except it’s a mask.\n **\n = (object) the `mask` element\n **\n \\*/\n proto.mask = function (first) {\n var attr,\n el = this.el(\"mask\");\n if (arguments.length == 1 && first && !first.type) {\n el.attr(first);\n } else if (arguments.length) {\n el.add(Array.prototype.slice.call(arguments, 0));\n }\n return el;\n };\n /*\\\n * Paper.ptrn\n [ method ]\n **\n * Equivalent in behaviour to @Paper.g, except it’s a pattern.\n - x (number) @optional X of the element\n - y (number) @optional Y of the element\n - width (number) @optional width of the element\n - height (number) @optional height of the element\n - vbx (number) @optional viewbox X\n - vby (number) @optional viewbox Y\n - vbw (number) @optional viewbox width\n - vbh (number) @optional viewbox height\n **\n = (object) the `pattern` element\n **\n \\*/\n proto.ptrn = function (x, y, width, height, vx, vy, vw, vh) {\n if (is(x, \"object\")) {\n var attr = x;\n } else {\n attr = {patternUnits: \"userSpaceOnUse\"};\n if (x) {\n attr.x = x;\n }\n if (y) {\n attr.y = y;\n }\n if (width != null) {\n attr.width = width;\n }\n if (height != null) {\n attr.height = height;\n }\n if (vx != null && vy != null && vw != null && vh != null) {\n attr.viewBox = [vx, vy, vw, vh];\n } else {\n attr.viewBox = [x || 0, y || 0, width || 0, height || 0];\n }\n }\n return this.el(\"pattern\", attr);\n };\n /*\\\n * Paper.use\n [ method ]\n **\n * Creates a element.\n - id (string) @optional id of element to link\n * or\n - id (Element) @optional element to link\n **\n = (object) the `use` element\n **\n \\*/\n proto.use = function (id) {\n if (id != null) {\n if (id instanceof Element) {\n if (!id.attr(\"id\")) {\n id.attr({id: Snap._.id(id)});\n }\n id = id.attr(\"id\");\n }\n if (String(id).charAt() == \"#\") {\n id = id.substring(1);\n }\n return this.el(\"use\", {\"xlink:href\": \"#\" + id});\n } else {\n return Element.prototype.use.call(this);\n }\n };\n /*\\\n * Paper.symbol\n [ method ]\n **\n * Creates a element.\n - vbx (number) @optional viewbox X\n - vby (number) @optional viewbox Y\n - vbw (number) @optional viewbox width\n - vbh (number) @optional viewbox height\n = (object) the `symbol` element\n **\n \\*/\n proto.symbol = function (vx, vy, vw, vh) {\n var attr = {};\n if (vx != null && vy != null && vw != null && vh != null) {\n attr.viewBox = [vx, vy, vw, vh];\n }\n\n return this.el(\"symbol\", attr);\n };\n /*\\\n * Paper.text\n [ method ]\n **\n * Draws a text string\n **\n - x (number) x coordinate position\n - y (number) y coordinate position\n - text (string|array) The text string to draw or array of strings to nest within separate `` elements\n = (object) the `text` element\n **\n > Usage\n | var t1 = paper.text(50, 50, \"Snap\");\n | var t2 = paper.text(50, 50, [\"S\",\"n\",\"a\",\"p\"]);\n | // Text path usage\n | t1.attr({textpath: \"M10,10L100,100\"});\n | // or\n | var pth = paper.path(\"M10,10L100,100\");\n | t1.attr({textpath: pth});\n \\*/\n proto.text = function (x, y, text) {\n var attr = {};\n if (is(x, \"object\")) {\n attr = x;\n } else if (x != null) {\n attr = {\n x: x,\n y: y,\n text: text || \"\"\n };\n }\n return this.el(\"text\", attr);\n };\n /*\\\n * Paper.line\n [ method ]\n **\n * Draws a line\n **\n - x1 (number) x coordinate position of the start\n - y1 (number) y coordinate position of the start\n - x2 (number) x coordinate position of the end\n - y2 (number) y coordinate position of the end\n = (object) the `line` element\n **\n > Usage\n | var t1 = paper.line(50, 50, 100, 100);\n \\*/\n proto.line = function (x1, y1, x2, y2) {\n var attr = {};\n if (is(x1, \"object\")) {\n attr = x1;\n } else if (x1 != null) {\n attr = {\n x1: x1,\n x2: x2,\n y1: y1,\n y2: y2\n };\n }\n return this.el(\"line\", attr);\n };\n /*\\\n * Paper.polyline\n [ method ]\n **\n * Draws a polyline\n **\n - points (array) array of points\n * or\n - varargs (…) points\n = (object) the `polyline` element\n **\n > Usage\n | var p1 = paper.polyline([10, 10, 100, 100]);\n | var p2 = paper.polyline(10, 10, 100, 100);\n \\*/\n proto.polyline = function (points) {\n if (arguments.length > 1) {\n points = Array.prototype.slice.call(arguments, 0);\n }\n var attr = {};\n if (is(points, \"object\") && !is(points, \"array\")) {\n attr = points;\n } else if (points != null) {\n attr = {points: points};\n }\n return this.el(\"polyline\", attr);\n };\n /*\\\n * Paper.polygon\n [ method ]\n **\n * Draws a polygon. See @Paper.polyline\n \\*/\n proto.polygon = function (points) {\n if (arguments.length > 1) {\n points = Array.prototype.slice.call(arguments, 0);\n }\n var attr = {};\n if (is(points, \"object\") && !is(points, \"array\")) {\n attr = points;\n } else if (points != null) {\n attr = {points: points};\n }\n return this.el(\"polygon\", attr);\n };\n // gradients\n (function () {\n var $ = Snap._.$;\n // gradients' helpers\n /*\\\n * Element.stops\n [ method ]\n **\n * Only for gradients!\n * Returns array of gradient stops elements.\n = (array) the stops array.\n \\*/\n function Gstops() {\n return this.selectAll(\"stop\");\n }\n /*\\\n * Element.addStop\n [ method ]\n **\n * Only for gradients!\n * Adds another stop to the gradient.\n - color (string) stops color\n - offset (number) stops offset 0..100\n = (object) gradient element\n \\*/\n function GaddStop(color, offset) {\n var stop = $(\"stop\"),\n attr = {\n offset: +offset + \"%\"\n };\n color = Snap.color(color);\n attr[\"stop-color\"] = color.hex;\n if (color.opacity < 1) {\n attr[\"stop-opacity\"] = color.opacity;\n }\n $(stop, attr);\n var stops = this.stops(),\n inserted;\n for (var i = 0; i < stops.length; i++) {\n var stopOffset = parseFloat(stops[i].attr(\"offset\"));\n if (stopOffset > offset) {\n this.node.insertBefore(stop, stops[i].node);\n inserted = true;\n break;\n }\n }\n if (!inserted) {\n this.node.appendChild(stop);\n }\n return this;\n }\n function GgetBBox() {\n if (this.type == \"linearGradient\") {\n var x1 = $(this.node, \"x1\") || 0,\n x2 = $(this.node, \"x2\") || 1,\n y1 = $(this.node, \"y1\") || 0,\n y2 = $(this.node, \"y2\") || 0;\n return Snap._.box(x1, y1, math.abs(x2 - x1), math.abs(y2 - y1));\n } else {\n var cx = this.node.cx || .5,\n cy = this.node.cy || .5,\n r = this.node.r || 0;\n return Snap._.box(cx - r, cy - r, r * 2, r * 2);\n }\n }\n /*\\\n * Element.setStops\n [ method ]\n **\n * Only for gradients!\n * Updates stops of the gradient based on passed gradient descriptor. See @Ppaer.gradient\n - str (string) gradient descriptor part after `()`.\n = (object) gradient element\n | var g = paper.gradient(\"l(0, 0, 1, 1)#000-#f00-#fff\");\n | g.setStops(\"#fff-#000-#f00-#fc0\");\n \\*/\n function GsetStops(str) {\n var grad = str,\n stops = this.stops();\n if (typeof str == \"string\") {\n grad = eve(\"snap.util.grad.parse\", null, \"l(0,0,0,1)\" + str).firstDefined().stops;\n }\n if (!Snap.is(grad, \"array\")) {\n return;\n }\n for (var i = 0; i < stops.length; i++) {\n if (grad[i]) {\n var color = Snap.color(grad[i].color),\n attr = {\"offset\": grad[i].offset + \"%\"};\n attr[\"stop-color\"] = color.hex;\n if (color.opacity < 1) {\n attr[\"stop-opacity\"] = color.opacity;\n }\n stops[i].attr(attr);\n } else {\n stops[i].remove();\n }\n }\n for (i = stops.length; i < grad.length; i++) {\n this.addStop(grad[i].color, grad[i].offset);\n }\n return this;\n }\n function gradient(defs, str) {\n var grad = eve(\"snap.util.grad.parse\", null, str).firstDefined(),\n el;\n if (!grad) {\n return null;\n }\n grad.params.unshift(defs);\n if (grad.type.toLowerCase() == \"l\") {\n el = gradientLinear.apply(0, grad.params);\n } else {\n el = gradientRadial.apply(0, grad.params);\n }\n if (grad.type != grad.type.toLowerCase()) {\n $(el.node, {\n gradientUnits: \"userSpaceOnUse\"\n });\n }\n var stops = grad.stops,\n len = stops.length;\n for (var i = 0; i < len; i++) {\n var stop = stops[i];\n el.addStop(stop.color, stop.offset);\n }\n return el;\n }\n function gradientLinear(defs, x1, y1, x2, y2) {\n var el = Snap._.make(\"linearGradient\", defs);\n el.stops = Gstops;\n el.addStop = GaddStop;\n el.getBBox = GgetBBox;\n el.setStops = GsetStops;\n if (x1 != null) {\n $(el.node, {\n x1: x1,\n y1: y1,\n x2: x2,\n y2: y2\n });\n }\n return el;\n }\n function gradientRadial(defs, cx, cy, r, fx, fy) {\n var el = Snap._.make(\"radialGradient\", defs);\n el.stops = Gstops;\n el.addStop = GaddStop;\n el.getBBox = GgetBBox;\n if (cx != null) {\n $(el.node, {\n cx: cx,\n cy: cy,\n r: r\n });\n }\n if (fx != null && fy != null) {\n $(el.node, {\n fx: fx,\n fy: fy\n });\n }\n return el;\n }\n /*\\\n * Paper.gradient\n [ method ]\n **\n * Creates a gradient element\n **\n - gradient (string) gradient descriptor\n > Gradient Descriptor\n * The gradient descriptor is an expression formatted as\n * follows: `()`. The `` can be\n * either linear or radial. The uppercase `L` or `R` letters\n * indicate absolute coordinates offset from the SVG surface.\n * Lowercase `l` or `r` letters indicate coordinates\n * calculated relative to the element to which the gradient is\n * applied. Coordinates specify a linear gradient vector as\n * `x1`, `y1`, `x2`, `y2`, or a radial gradient as `cx`, `cy`,\n * `r` and optional `fx`, `fy` specifying a focal point away\n * from the center of the circle. Specify `` as a list\n * of dash-separated CSS color values. Each color may be\n * followed by a custom offset value, separated with a colon\n * character.\n > Examples\n * Linear gradient, relative from top-left corner to bottom-right\n * corner, from black through red to white:\n | var g = paper.gradient(\"l(0, 0, 1, 1)#000-#f00-#fff\");\n * Linear gradient, absolute from (0, 0) to (100, 100), from black\n * through red at 25% to white:\n | var g = paper.gradient(\"L(0, 0, 100, 100)#000-#f00:25-#fff\");\n * Radial gradient, relative from the center of the element with radius\n * half the width, from black to white:\n | var g = paper.gradient(\"r(0.5, 0.5, 0.5)#000-#fff\");\n * To apply the gradient:\n | paper.circle(50, 50, 40).attr({\n | fill: g\n | });\n = (object) the `gradient` element\n \\*/\n proto.gradient = function (str) {\n return gradient(this.defs, str);\n };\n proto.gradientLinear = function (x1, y1, x2, y2) {\n return gradientLinear(this.defs, x1, y1, x2, y2);\n };\n proto.gradientRadial = function (cx, cy, r, fx, fy) {\n return gradientRadial(this.defs, cx, cy, r, fx, fy);\n };\n /*\\\n * Paper.toString\n [ method ]\n **\n * Returns SVG code for the @Paper\n = (string) SVG code for the @Paper\n \\*/\n proto.toString = function () {\n var doc = this.node.ownerDocument,\n f = doc.createDocumentFragment(),\n d = doc.createElement(\"div\"),\n svg = this.node.cloneNode(true),\n res;\n f.appendChild(d);\n d.appendChild(svg);\n Snap._.$(svg, {xmlns: \"http://www.w3.org/2000/svg\"});\n res = d.innerHTML;\n f.removeChild(f.firstChild);\n return res;\n };\n /*\\\n * Paper.toDataURL\n [ method ]\n **\n * Returns SVG code for the @Paper as Data URI string.\n = (string) Data URI string\n \\*/\n proto.toDataURL = function () {\n if (window && window.btoa) {\n return \"data:image/svg+xml;base64,\" + btoa(unescape(encodeURIComponent(this)));\n }\n };\n /*\\\n * Paper.clear\n [ method ]\n **\n * Removes all child nodes of the paper, except .\n \\*/\n proto.clear = function () {\n var node = this.node.firstChild,\n next;\n while (node) {\n next = node.nextSibling;\n if (node.tagName != \"defs\") {\n node.parentNode.removeChild(node);\n } else {\n proto.clear.call({node: node});\n }\n node = next;\n }\n };\n }());\n});\n\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n var elproto = Element.prototype,\n is = Snap.is,\n clone = Snap._.clone,\n has = \"hasOwnProperty\",\n p2s = /,?([a-z]),?/gi,\n toFloat = parseFloat,\n math = Math,\n PI = math.PI,\n mmin = math.min,\n mmax = math.max,\n pow = math.pow,\n abs = math.abs;\n function paths(ps) {\n var p = paths.ps = paths.ps || {};\n if (p[ps]) {\n p[ps].sleep = 100;\n } else {\n p[ps] = {\n sleep: 100\n };\n }\n setTimeout(function () {\n for (var key in p) if (p[has](key) && key != ps) {\n p[key].sleep--;\n !p[key].sleep && delete p[key];\n }\n });\n return p[ps];\n }\n function box(x, y, width, height) {\n if (x == null) {\n x = y = width = height = 0;\n }\n if (y == null) {\n y = x.y;\n width = x.width;\n height = x.height;\n x = x.x;\n }\n return {\n x: x,\n y: y,\n width: width,\n w: width,\n height: height,\n h: height,\n x2: x + width,\n y2: y + height,\n cx: x + width / 2,\n cy: y + height / 2,\n r1: math.min(width, height) / 2,\n r2: math.max(width, height) / 2,\n r0: math.sqrt(width * width + height * height) / 2,\n path: rectPath(x, y, width, height),\n vb: [x, y, width, height].join(\" \")\n };\n }\n function toString() {\n return this.join(\",\").replace(p2s, \"$1\");\n }\n function pathClone(pathArray) {\n var res = clone(pathArray);\n res.toString = toString;\n return res;\n }\n function getPointAtSegmentLength(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length) {\n if (length == null) {\n return bezlen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y);\n } else {\n return findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y,\n getTotLen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length));\n }\n }\n function getLengthFactory(istotal, subpath) {\n function O(val) {\n return +(+val).toFixed(3);\n }\n return Snap._.cacher(function (path, length, onlystart) {\n if (path instanceof Element) {\n path = path.attr(\"d\");\n }\n path = path2curve(path);\n var x, y, p, l, sp = \"\", subpaths = {}, point,\n len = 0;\n for (var i = 0, ii = path.length; i < ii; i++) {\n p = path[i];\n if (p[0] == \"M\") {\n x = +p[1];\n y = +p[2];\n } else {\n l = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);\n if (len + l > length) {\n if (subpath && !subpaths.start) {\n point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len);\n sp += [\n \"C\" + O(point.start.x),\n O(point.start.y),\n O(point.m.x),\n O(point.m.y),\n O(point.x),\n O(point.y)\n ];\n if (onlystart) {return sp;}\n subpaths.start = sp;\n sp = [\n \"M\" + O(point.x),\n O(point.y) + \"C\" + O(point.n.x),\n O(point.n.y),\n O(point.end.x),\n O(point.end.y),\n O(p[5]),\n O(p[6])\n ].join();\n len += l;\n x = +p[5];\n y = +p[6];\n continue;\n }\n if (!istotal && !subpath) {\n point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len);\n return point;\n }\n }\n len += l;\n x = +p[5];\n y = +p[6];\n }\n sp += p.shift() + p;\n }\n subpaths.end = sp;\n point = istotal ? len : subpath ? subpaths : findDotsAtSegment(x, y, p[0], p[1], p[2], p[3], p[4], p[5], 1);\n return point;\n }, null, Snap._.clone);\n }\n var getTotalLength = getLengthFactory(1),\n getPointAtLength = getLengthFactory(),\n getSubpathsAtLength = getLengthFactory(0, 1);\n function findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {\n var t1 = 1 - t,\n t13 = pow(t1, 3),\n t12 = pow(t1, 2),\n t2 = t * t,\n t3 = t2 * t,\n x = t13 * p1x + t12 * 3 * t * c1x + t1 * 3 * t * t * c2x + t3 * p2x,\n y = t13 * p1y + t12 * 3 * t * c1y + t1 * 3 * t * t * c2y + t3 * p2y,\n mx = p1x + 2 * t * (c1x - p1x) + t2 * (c2x - 2 * c1x + p1x),\n my = p1y + 2 * t * (c1y - p1y) + t2 * (c2y - 2 * c1y + p1y),\n nx = c1x + 2 * t * (c2x - c1x) + t2 * (p2x - 2 * c2x + c1x),\n ny = c1y + 2 * t * (c2y - c1y) + t2 * (p2y - 2 * c2y + c1y),\n ax = t1 * p1x + t * c1x,\n ay = t1 * p1y + t * c1y,\n cx = t1 * c2x + t * p2x,\n cy = t1 * c2y + t * p2y,\n alpha = 90 - math.atan2(mx - nx, my - ny) * 180 / PI;\n // (mx > nx || my < ny) && (alpha += 180);\n return {\n x: x,\n y: y,\n m: {x: mx, y: my},\n n: {x: nx, y: ny},\n start: {x: ax, y: ay},\n end: {x: cx, y: cy},\n alpha: alpha\n };\n }\n function bezierBBox(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) {\n if (!Snap.is(p1x, \"array\")) {\n p1x = [p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y];\n }\n var bbox = curveDim.apply(null, p1x);\n return box(\n bbox.min.x,\n bbox.min.y,\n bbox.max.x - bbox.min.x,\n bbox.max.y - bbox.min.y\n );\n }\n function isPointInsideBBox(bbox, x, y) {\n return x >= bbox.x &&\n x <= bbox.x + bbox.width &&\n y >= bbox.y &&\n y <= bbox.y + bbox.height;\n }\n function isBBoxIntersect(bbox1, bbox2) {\n bbox1 = box(bbox1);\n bbox2 = box(bbox2);\n return isPointInsideBBox(bbox2, bbox1.x, bbox1.y)\n || isPointInsideBBox(bbox2, bbox1.x2, bbox1.y)\n || isPointInsideBBox(bbox2, bbox1.x, bbox1.y2)\n || isPointInsideBBox(bbox2, bbox1.x2, bbox1.y2)\n || isPointInsideBBox(bbox1, bbox2.x, bbox2.y)\n || isPointInsideBBox(bbox1, bbox2.x2, bbox2.y)\n || isPointInsideBBox(bbox1, bbox2.x, bbox2.y2)\n || isPointInsideBBox(bbox1, bbox2.x2, bbox2.y2)\n || (bbox1.x < bbox2.x2 && bbox1.x > bbox2.x\n || bbox2.x < bbox1.x2 && bbox2.x > bbox1.x)\n && (bbox1.y < bbox2.y2 && bbox1.y > bbox2.y\n || bbox2.y < bbox1.y2 && bbox2.y > bbox1.y);\n }\n function base3(t, p1, p2, p3, p4) {\n var t1 = -3 * p1 + 9 * p2 - 9 * p3 + 3 * p4,\n t2 = t * t1 + 6 * p1 - 12 * p2 + 6 * p3;\n return t * t2 - 3 * p1 + 3 * p2;\n }\n function bezlen(x1, y1, x2, y2, x3, y3, x4, y4, z) {\n if (z == null) {\n z = 1;\n }\n z = z > 1 ? 1 : z < 0 ? 0 : z;\n var z2 = z / 2,\n n = 12,\n Tvalues = [-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],\n Cvalues = [0.2491,0.2491,0.2335,0.2335,0.2032,0.2032,0.1601,0.1601,0.1069,0.1069,0.0472,0.0472],\n sum = 0;\n for (var i = 0; i < n; i++) {\n var ct = z2 * Tvalues[i] + z2,\n xbase = base3(ct, x1, x2, x3, x4),\n ybase = base3(ct, y1, y2, y3, y4),\n comb = xbase * xbase + ybase * ybase;\n sum += Cvalues[i] * math.sqrt(comb);\n }\n return z2 * sum;\n }\n function getTotLen(x1, y1, x2, y2, x3, y3, x4, y4, ll) {\n if (ll < 0 || bezlen(x1, y1, x2, y2, x3, y3, x4, y4) < ll) {\n return;\n }\n var t = 1,\n step = t / 2,\n t2 = t - step,\n l,\n e = .01;\n l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2);\n while (abs(l - ll) > e) {\n step /= 2;\n t2 += (l < ll ? 1 : -1) * step;\n l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2);\n }\n return t2;\n }\n function intersect(x1, y1, x2, y2, x3, y3, x4, y4) {\n if (\n mmax(x1, x2) < mmin(x3, x4) ||\n mmin(x1, x2) > mmax(x3, x4) ||\n mmax(y1, y2) < mmin(y3, y4) ||\n mmin(y1, y2) > mmax(y3, y4)\n ) {\n return;\n }\n var nx = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4),\n ny = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4),\n denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);\n\n if (!denominator) {\n return;\n }\n var px = nx / denominator,\n py = ny / denominator,\n px2 = +px.toFixed(2),\n py2 = +py.toFixed(2);\n if (\n px2 < +mmin(x1, x2).toFixed(2) ||\n px2 > +mmax(x1, x2).toFixed(2) ||\n px2 < +mmin(x3, x4).toFixed(2) ||\n px2 > +mmax(x3, x4).toFixed(2) ||\n py2 < +mmin(y1, y2).toFixed(2) ||\n py2 > +mmax(y1, y2).toFixed(2) ||\n py2 < +mmin(y3, y4).toFixed(2) ||\n py2 > +mmax(y3, y4).toFixed(2)\n ) {\n return;\n }\n return {x: px, y: py};\n }\n function inter(bez1, bez2) {\n return interHelper(bez1, bez2);\n }\n function interCount(bez1, bez2) {\n return interHelper(bez1, bez2, 1);\n }\n function interHelper(bez1, bez2, justCount) {\n var bbox1 = bezierBBox(bez1),\n bbox2 = bezierBBox(bez2);\n if (!isBBoxIntersect(bbox1, bbox2)) {\n return justCount ? 0 : [];\n }\n var l1 = bezlen.apply(0, bez1),\n l2 = bezlen.apply(0, bez2),\n n1 = ~~(l1 / 8),\n n2 = ~~(l2 / 8),\n dots1 = [],\n dots2 = [],\n xy = {},\n res = justCount ? 0 : [];\n for (var i = 0; i < n1 + 1; i++) {\n var p = findDotsAtSegment.apply(0, bez1.concat(i / n1));\n dots1.push({x: p.x, y: p.y, t: i / n1});\n }\n for (i = 0; i < n2 + 1; i++) {\n p = findDotsAtSegment.apply(0, bez2.concat(i / n2));\n dots2.push({x: p.x, y: p.y, t: i / n2});\n }\n for (i = 0; i < n1; i++) {\n for (var j = 0; j < n2; j++) {\n var di = dots1[i],\n di1 = dots1[i + 1],\n dj = dots2[j],\n dj1 = dots2[j + 1],\n ci = abs(di1.x - di.x) < .001 ? \"y\" : \"x\",\n cj = abs(dj1.x - dj.x) < .001 ? \"y\" : \"x\",\n is = intersect(di.x, di.y, di1.x, di1.y, dj.x, dj.y, dj1.x, dj1.y);\n if (is) {\n if (xy[is.x.toFixed(4)] == is.y.toFixed(4)) {\n continue;\n }\n xy[is.x.toFixed(4)] = is.y.toFixed(4);\n var t1 = di.t + abs((is[ci] - di[ci]) / (di1[ci] - di[ci])) * (di1.t - di.t),\n t2 = dj.t + abs((is[cj] - dj[cj]) / (dj1[cj] - dj[cj])) * (dj1.t - dj.t);\n if (t1 >= 0 && t1 <= 1 && t2 >= 0 && t2 <= 1) {\n if (justCount) {\n res++;\n } else {\n res.push({\n x: is.x,\n y: is.y,\n t1: t1,\n t2: t2\n });\n }\n }\n }\n }\n }\n return res;\n }\n function pathIntersection(path1, path2) {\n return interPathHelper(path1, path2);\n }\n function pathIntersectionNumber(path1, path2) {\n return interPathHelper(path1, path2, 1);\n }\n function interPathHelper(path1, path2, justCount) {\n path1 = path2curve(path1);\n path2 = path2curve(path2);\n var x1, y1, x2, y2, x1m, y1m, x2m, y2m, bez1, bez2,\n res = justCount ? 0 : [];\n for (var i = 0, ii = path1.length; i < ii; i++) {\n var pi = path1[i];\n if (pi[0] == \"M\") {\n x1 = x1m = pi[1];\n y1 = y1m = pi[2];\n } else {\n if (pi[0] == \"C\") {\n bez1 = [x1, y1].concat(pi.slice(1));\n x1 = bez1[6];\n y1 = bez1[7];\n } else {\n bez1 = [x1, y1, x1, y1, x1m, y1m, x1m, y1m];\n x1 = x1m;\n y1 = y1m;\n }\n for (var j = 0, jj = path2.length; j < jj; j++) {\n var pj = path2[j];\n if (pj[0] == \"M\") {\n x2 = x2m = pj[1];\n y2 = y2m = pj[2];\n } else {\n if (pj[0] == \"C\") {\n bez2 = [x2, y2].concat(pj.slice(1));\n x2 = bez2[6];\n y2 = bez2[7];\n } else {\n bez2 = [x2, y2, x2, y2, x2m, y2m, x2m, y2m];\n x2 = x2m;\n y2 = y2m;\n }\n var intr = interHelper(bez1, bez2, justCount);\n if (justCount) {\n res += intr;\n } else {\n for (var k = 0, kk = intr.length; k < kk; k++) {\n intr[k].segment1 = i;\n intr[k].segment2 = j;\n intr[k].bez1 = bez1;\n intr[k].bez2 = bez2;\n }\n res = res.concat(intr);\n }\n }\n }\n }\n }\n return res;\n }\n function isPointInsidePath(path, x, y) {\n var bbox = pathBBox(path);\n return isPointInsideBBox(bbox, x, y) &&\n interPathHelper(path, [[\"M\", x, y], [\"H\", bbox.x2 + 10]], 1) % 2 == 1;\n }\n function pathBBox(path) {\n var pth = paths(path);\n if (pth.bbox) {\n return clone(pth.bbox);\n }\n if (!path) {\n return box();\n }\n path = path2curve(path);\n var x = 0,\n y = 0,\n X = [],\n Y = [],\n p;\n for (var i = 0, ii = path.length; i < ii; i++) {\n p = path[i];\n if (p[0] == \"M\") {\n x = p[1];\n y = p[2];\n X.push(x);\n Y.push(y);\n } else {\n var dim = curveDim(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);\n X = X.concat(dim.min.x, dim.max.x);\n Y = Y.concat(dim.min.y, dim.max.y);\n x = p[5];\n y = p[6];\n }\n }\n var xmin = mmin.apply(0, X),\n ymin = mmin.apply(0, Y),\n xmax = mmax.apply(0, X),\n ymax = mmax.apply(0, Y),\n bb = box(xmin, ymin, xmax - xmin, ymax - ymin);\n pth.bbox = clone(bb);\n return bb;\n }\n function rectPath(x, y, w, h, r) {\n if (r) {\n return [\n [\"M\", +x + +r, y],\n [\"l\", w - r * 2, 0],\n [\"a\", r, r, 0, 0, 1, r, r],\n [\"l\", 0, h - r * 2],\n [\"a\", r, r, 0, 0, 1, -r, r],\n [\"l\", r * 2 - w, 0],\n [\"a\", r, r, 0, 0, 1, -r, -r],\n [\"l\", 0, r * 2 - h],\n [\"a\", r, r, 0, 0, 1, r, -r],\n [\"z\"]\n ];\n }\n var res = [[\"M\", x, y], [\"l\", w, 0], [\"l\", 0, h], [\"l\", -w, 0], [\"z\"]];\n res.toString = toString;\n return res;\n }\n function ellipsePath(x, y, rx, ry, a) {\n if (a == null && ry == null) {\n ry = rx;\n }\n x = +x;\n y = +y;\n rx = +rx;\n ry = +ry;\n if (a != null) {\n var rad = Math.PI / 180,\n x1 = x + rx * Math.cos(-ry * rad),\n x2 = x + rx * Math.cos(-a * rad),\n y1 = y + rx * Math.sin(-ry * rad),\n y2 = y + rx * Math.sin(-a * rad),\n res = [[\"M\", x1, y1], [\"A\", rx, rx, 0, +(a - ry > 180), 0, x2, y2]];\n } else {\n res = [\n [\"M\", x, y],\n [\"m\", 0, -ry],\n [\"a\", rx, ry, 0, 1, 1, 0, 2 * ry],\n [\"a\", rx, ry, 0, 1, 1, 0, -2 * ry],\n [\"z\"]\n ];\n }\n res.toString = toString;\n return res;\n }\n var unit2px = Snap._unit2px,\n getPath = {\n path: function (el) {\n return el.attr(\"path\");\n },\n circle: function (el) {\n var attr = unit2px(el);\n return ellipsePath(attr.cx, attr.cy, attr.r);\n },\n ellipse: function (el) {\n var attr = unit2px(el);\n return ellipsePath(attr.cx || 0, attr.cy || 0, attr.rx, attr.ry);\n },\n rect: function (el) {\n var attr = unit2px(el);\n return rectPath(attr.x || 0, attr.y || 0, attr.width, attr.height, attr.rx, attr.ry);\n },\n image: function (el) {\n var attr = unit2px(el);\n return rectPath(attr.x || 0, attr.y || 0, attr.width, attr.height);\n },\n line: function (el) {\n return \"M\" + [el.attr(\"x1\") || 0, el.attr(\"y1\") || 0, el.attr(\"x2\"), el.attr(\"y2\")];\n },\n polyline: function (el) {\n return \"M\" + el.attr(\"points\");\n },\n polygon: function (el) {\n return \"M\" + el.attr(\"points\") + \"z\";\n },\n deflt: function (el) {\n var bbox = el.node.getBBox();\n return rectPath(bbox.x, bbox.y, bbox.width, bbox.height);\n }\n };\n function pathToRelative(pathArray) {\n var pth = paths(pathArray),\n lowerCase = String.prototype.toLowerCase;\n if (pth.rel) {\n return pathClone(pth.rel);\n }\n if (!Snap.is(pathArray, \"array\") || !Snap.is(pathArray && pathArray[0], \"array\")) {\n pathArray = Snap.parsePathString(pathArray);\n }\n var res = [],\n x = 0,\n y = 0,\n mx = 0,\n my = 0,\n start = 0;\n if (pathArray[0][0] == \"M\") {\n x = pathArray[0][1];\n y = pathArray[0][2];\n mx = x;\n my = y;\n start++;\n res.push([\"M\", x, y]);\n }\n for (var i = start, ii = pathArray.length; i < ii; i++) {\n var r = res[i] = [],\n pa = pathArray[i];\n if (pa[0] != lowerCase.call(pa[0])) {\n r[0] = lowerCase.call(pa[0]);\n switch (r[0]) {\n case \"a\":\n r[1] = pa[1];\n r[2] = pa[2];\n r[3] = pa[3];\n r[4] = pa[4];\n r[5] = pa[5];\n r[6] = +(pa[6] - x).toFixed(3);\n r[7] = +(pa[7] - y).toFixed(3);\n break;\n case \"v\":\n r[1] = +(pa[1] - y).toFixed(3);\n break;\n case \"m\":\n mx = pa[1];\n my = pa[2];\n default:\n for (var j = 1, jj = pa.length; j < jj; j++) {\n r[j] = +(pa[j] - (j % 2 ? x : y)).toFixed(3);\n }\n }\n } else {\n r = res[i] = [];\n if (pa[0] == \"m\") {\n mx = pa[1] + x;\n my = pa[2] + y;\n }\n for (var k = 0, kk = pa.length; k < kk; k++) {\n res[i][k] = pa[k];\n }\n }\n var len = res[i].length;\n switch (res[i][0]) {\n case \"z\":\n x = mx;\n y = my;\n break;\n case \"h\":\n x += +res[i][len - 1];\n break;\n case \"v\":\n y += +res[i][len - 1];\n break;\n default:\n x += +res[i][len - 2];\n y += +res[i][len - 1];\n }\n }\n res.toString = toString;\n pth.rel = pathClone(res);\n return res;\n }\n function pathToAbsolute(pathArray) {\n var pth = paths(pathArray);\n if (pth.abs) {\n return pathClone(pth.abs);\n }\n if (!is(pathArray, \"array\") || !is(pathArray && pathArray[0], \"array\")) { // rough assumption\n pathArray = Snap.parsePathString(pathArray);\n }\n if (!pathArray || !pathArray.length) {\n return [[\"M\", 0, 0]];\n }\n var res = [],\n x = 0,\n y = 0,\n mx = 0,\n my = 0,\n start = 0,\n pa0;\n if (pathArray[0][0] == \"M\") {\n x = +pathArray[0][1];\n y = +pathArray[0][2];\n mx = x;\n my = y;\n start++;\n res[0] = [\"M\", x, y];\n }\n var crz = pathArray.length == 3 &&\n pathArray[0][0] == \"M\" &&\n pathArray[1][0].toUpperCase() == \"R\" &&\n pathArray[2][0].toUpperCase() == \"Z\";\n for (var r, pa, i = start, ii = pathArray.length; i < ii; i++) {\n res.push(r = []);\n pa = pathArray[i];\n pa0 = pa[0];\n if (pa0 != pa0.toUpperCase()) {\n r[0] = pa0.toUpperCase();\n switch (r[0]) {\n case \"A\":\n r[1] = pa[1];\n r[2] = pa[2];\n r[3] = pa[3];\n r[4] = pa[4];\n r[5] = pa[5];\n r[6] = +pa[6] + x;\n r[7] = +pa[7] + y;\n break;\n case \"V\":\n r[1] = +pa[1] + y;\n break;\n case \"H\":\n r[1] = +pa[1] + x;\n break;\n case \"R\":\n var dots = [x, y].concat(pa.slice(1));\n for (var j = 2, jj = dots.length; j < jj; j++) {\n dots[j] = +dots[j] + x;\n dots[++j] = +dots[j] + y;\n }\n res.pop();\n res = res.concat(catmullRom2bezier(dots, crz));\n break;\n case \"O\":\n res.pop();\n dots = ellipsePath(x, y, pa[1], pa[2]);\n dots.push(dots[0]);\n res = res.concat(dots);\n break;\n case \"U\":\n res.pop();\n res = res.concat(ellipsePath(x, y, pa[1], pa[2], pa[3]));\n r = [\"U\"].concat(res[res.length - 1].slice(-2));\n break;\n case \"M\":\n mx = +pa[1] + x;\n my = +pa[2] + y;\n default:\n for (j = 1, jj = pa.length; j < jj; j++) {\n r[j] = +pa[j] + (j % 2 ? x : y);\n }\n }\n } else if (pa0 == \"R\") {\n dots = [x, y].concat(pa.slice(1));\n res.pop();\n res = res.concat(catmullRom2bezier(dots, crz));\n r = [\"R\"].concat(pa.slice(-2));\n } else if (pa0 == \"O\") {\n res.pop();\n dots = ellipsePath(x, y, pa[1], pa[2]);\n dots.push(dots[0]);\n res = res.concat(dots);\n } else if (pa0 == \"U\") {\n res.pop();\n res = res.concat(ellipsePath(x, y, pa[1], pa[2], pa[3]));\n r = [\"U\"].concat(res[res.length - 1].slice(-2));\n } else {\n for (var k = 0, kk = pa.length; k < kk; k++) {\n r[k] = pa[k];\n }\n }\n pa0 = pa0.toUpperCase();\n if (pa0 != \"O\") {\n switch (r[0]) {\n case \"Z\":\n x = +mx;\n y = +my;\n break;\n case \"H\":\n x = r[1];\n break;\n case \"V\":\n y = r[1];\n break;\n case \"M\":\n mx = r[r.length - 2];\n my = r[r.length - 1];\n default:\n x = r[r.length - 2];\n y = r[r.length - 1];\n }\n }\n }\n res.toString = toString;\n pth.abs = pathClone(res);\n return res;\n }\n function l2c(x1, y1, x2, y2) {\n return [x1, y1, x2, y2, x2, y2];\n }\n function q2c(x1, y1, ax, ay, x2, y2) {\n var _13 = 1 / 3,\n _23 = 2 / 3;\n return [\n _13 * x1 + _23 * ax,\n _13 * y1 + _23 * ay,\n _13 * x2 + _23 * ax,\n _13 * y2 + _23 * ay,\n x2,\n y2\n ];\n }\n function a2c(x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) {\n // for more information of where this math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n var _120 = PI * 120 / 180,\n rad = PI / 180 * (+angle || 0),\n res = [],\n xy,\n rotate = Snap._.cacher(function (x, y, rad) {\n var X = x * math.cos(rad) - y * math.sin(rad),\n Y = x * math.sin(rad) + y * math.cos(rad);\n return {x: X, y: Y};\n });\n if (!rx || !ry) {\n return [x1, y1, x2, y2, x2, y2];\n }\n if (!recursive) {\n xy = rotate(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotate(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n var cos = math.cos(PI / 180 * angle),\n sin = math.sin(PI / 180 * angle),\n x = (x1 - x2) / 2,\n y = (y1 - y2) / 2;\n var h = x * x / (rx * rx) + y * y / (ry * ry);\n if (h > 1) {\n h = math.sqrt(h);\n rx = h * rx;\n ry = h * ry;\n }\n var rx2 = rx * rx,\n ry2 = ry * ry,\n k = (large_arc_flag == sweep_flag ? -1 : 1) *\n math.sqrt(abs((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x))),\n cx = k * rx * y / ry + (x1 + x2) / 2,\n cy = k * -ry * x / rx + (y1 + y2) / 2,\n f1 = math.asin(((y1 - cy) / ry).toFixed(9)),\n f2 = math.asin(((y2 - cy) / ry).toFixed(9));\n\n f1 = x1 < cx ? PI - f1 : f1;\n f2 = x2 < cx ? PI - f2 : f2;\n f1 < 0 && (f1 = PI * 2 + f1);\n f2 < 0 && (f2 = PI * 2 + f2);\n if (sweep_flag && f1 > f2) {\n f1 = f1 - PI * 2;\n }\n if (!sweep_flag && f2 > f1) {\n f2 = f2 - PI * 2;\n }\n } else {\n f1 = recursive[0];\n f2 = recursive[1];\n cx = recursive[2];\n cy = recursive[3];\n }\n var df = f2 - f1;\n if (abs(df) > _120) {\n var f2old = f2,\n x2old = x2,\n y2old = y2;\n f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1);\n x2 = cx + rx * math.cos(f2);\n y2 = cy + ry * math.sin(f2);\n res = a2c(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [f2, f2old, cx, cy]);\n }\n df = f2 - f1;\n var c1 = math.cos(f1),\n s1 = math.sin(f1),\n c2 = math.cos(f2),\n s2 = math.sin(f2),\n t = math.tan(df / 4),\n hx = 4 / 3 * rx * t,\n hy = 4 / 3 * ry * t,\n m1 = [x1, y1],\n m2 = [x1 + hx * s1, y1 - hy * c1],\n m3 = [x2 + hx * s2, y2 - hy * c2],\n m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2, m3, m4].concat(res);\n } else {\n res = [m2, m3, m4].concat(res).join().split(\",\");\n var newres = [];\n for (var i = 0, ii = res.length; i < ii; i++) {\n newres[i] = i % 2 ? rotate(res[i - 1], res[i], rad).y : rotate(res[i], res[i + 1], rad).x;\n }\n return newres;\n }\n }\n function findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {\n var t1 = 1 - t;\n return {\n x: pow(t1, 3) * p1x + pow(t1, 2) * 3 * t * c1x + t1 * 3 * t * t * c2x + pow(t, 3) * p2x,\n y: pow(t1, 3) * p1y + pow(t1, 2) * 3 * t * c1y + t1 * 3 * t * t * c2y + pow(t, 3) * p2y\n };\n }\n\n // Returns bounding box of cubic bezier curve.\n // Source: http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html\n // Original version: NISHIO Hirokazu\n // Modifications: https://github.com/timo22345\n function curveDim(x0, y0, x1, y1, x2, y2, x3, y3) {\n var tvalues = [],\n bounds = [[], []],\n a, b, c, t, t1, t2, b2ac, sqrtb2ac;\n for (var i = 0; i < 2; ++i) {\n if (i == 0) {\n b = 6 * x0 - 12 * x1 + 6 * x2;\n a = -3 * x0 + 9 * x1 - 9 * x2 + 3 * x3;\n c = 3 * x1 - 3 * x0;\n } else {\n b = 6 * y0 - 12 * y1 + 6 * y2;\n a = -3 * y0 + 9 * y1 - 9 * y2 + 3 * y3;\n c = 3 * y1 - 3 * y0;\n }\n if (abs(a) < 1e-12) {\n if (abs(b) < 1e-12) {\n continue;\n }\n t = -c / b;\n if (0 < t && t < 1) {\n tvalues.push(t);\n }\n continue;\n }\n b2ac = b * b - 4 * c * a;\n sqrtb2ac = math.sqrt(b2ac);\n if (b2ac < 0) {\n continue;\n }\n t1 = (-b + sqrtb2ac) / (2 * a);\n if (0 < t1 && t1 < 1) {\n tvalues.push(t1);\n }\n t2 = (-b - sqrtb2ac) / (2 * a);\n if (0 < t2 && t2 < 1) {\n tvalues.push(t2);\n }\n }\n\n var x, y, j = tvalues.length,\n jlen = j,\n mt;\n while (j--) {\n t = tvalues[j];\n mt = 1 - t;\n bounds[0][j] = mt * mt * mt * x0 + 3 * mt * mt * t * x1 + 3 * mt * t * t * x2 + t * t * t * x3;\n bounds[1][j] = mt * mt * mt * y0 + 3 * mt * mt * t * y1 + 3 * mt * t * t * y2 + t * t * t * y3;\n }\n\n bounds[0][jlen] = x0;\n bounds[1][jlen] = y0;\n bounds[0][jlen + 1] = x3;\n bounds[1][jlen + 1] = y3;\n bounds[0].length = bounds[1].length = jlen + 2;\n\n\n return {\n min: {x: mmin.apply(0, bounds[0]), y: mmin.apply(0, bounds[1])},\n max: {x: mmax.apply(0, bounds[0]), y: mmax.apply(0, bounds[1])}\n };\n }\n\n function path2curve(path, path2) {\n var pth = !path2 && paths(path);\n if (!path2 && pth.curve) {\n return pathClone(pth.curve);\n }\n var p = pathToAbsolute(path),\n p2 = path2 && pathToAbsolute(path2),\n attrs = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},\n attrs2 = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},\n processPath = function (path, d, pcom) {\n var nx, ny;\n if (!path) {\n return [\"C\", d.x, d.y, d.x, d.y, d.x, d.y];\n }\n !(path[0] in {T: 1, Q: 1}) && (d.qx = d.qy = null);\n switch (path[0]) {\n case \"M\":\n d.X = path[1];\n d.Y = path[2];\n break;\n case \"A\":\n path = [\"C\"].concat(a2c.apply(0, [d.x, d.y].concat(path.slice(1))));\n break;\n case \"S\":\n if (pcom == \"C\" || pcom == \"S\") { // In \"S\" case we have to take into account, if the previous command is C/S.\n nx = d.x * 2 - d.bx; // And reflect the previous\n ny = d.y * 2 - d.by; // command's control point relative to the current point.\n }\n else { // or some else or nothing\n nx = d.x;\n ny = d.y;\n }\n path = [\"C\", nx, ny].concat(path.slice(1));\n break;\n case \"T\":\n if (pcom == \"Q\" || pcom == \"T\") { // In \"T\" case we have to take into account, if the previous command is Q/T.\n d.qx = d.x * 2 - d.qx; // And make a reflection similar\n d.qy = d.y * 2 - d.qy; // to case \"S\".\n }\n else { // or something else or nothing\n d.qx = d.x;\n d.qy = d.y;\n }\n path = [\"C\"].concat(q2c(d.x, d.y, d.qx, d.qy, path[1], path[2]));\n break;\n case \"Q\":\n d.qx = path[1];\n d.qy = path[2];\n path = [\"C\"].concat(q2c(d.x, d.y, path[1], path[2], path[3], path[4]));\n break;\n case \"L\":\n path = [\"C\"].concat(l2c(d.x, d.y, path[1], path[2]));\n break;\n case \"H\":\n path = [\"C\"].concat(l2c(d.x, d.y, path[1], d.y));\n break;\n case \"V\":\n path = [\"C\"].concat(l2c(d.x, d.y, d.x, path[1]));\n break;\n case \"Z\":\n path = [\"C\"].concat(l2c(d.x, d.y, d.X, d.Y));\n break;\n }\n return path;\n },\n fixArc = function (pp, i) {\n if (pp[i].length > 7) {\n pp[i].shift();\n var pi = pp[i];\n while (pi.length) {\n pcoms1[i] = \"A\"; // if created multiple C:s, their original seg is saved\n p2 && (pcoms2[i] = \"A\"); // the same as above\n pp.splice(i++, 0, [\"C\"].concat(pi.splice(0, 6)));\n }\n pp.splice(i, 1);\n ii = mmax(p.length, p2 && p2.length || 0);\n }\n },\n fixM = function (path1, path2, a1, a2, i) {\n if (path1 && path2 && path1[i][0] == \"M\" && path2[i][0] != \"M\") {\n path2.splice(i, 0, [\"M\", a2.x, a2.y]);\n a1.bx = 0;\n a1.by = 0;\n a1.x = path1[i][1];\n a1.y = path1[i][2];\n ii = mmax(p.length, p2 && p2.length || 0);\n }\n },\n pcoms1 = [], // path commands of original path p\n pcoms2 = [], // path commands of original path p2\n pfirst = \"\", // temporary holder for original path command\n pcom = \"\"; // holder for previous path command of original path\n for (var i = 0, ii = mmax(p.length, p2 && p2.length || 0); i < ii; i++) {\n p[i] && (pfirst = p[i][0]); // save current path command\n\n if (pfirst != \"C\") // C is not saved yet, because it may be result of conversion\n {\n pcoms1[i] = pfirst; // Save current path command\n i && ( pcom = pcoms1[i - 1]); // Get previous path command pcom\n }\n p[i] = processPath(p[i], attrs, pcom); // Previous path command is inputted to processPath\n\n if (pcoms1[i] != \"A\" && pfirst == \"C\") pcoms1[i] = \"C\"; // A is the only command\n // which may produce multiple C:s\n // so we have to make sure that C is also C in original path\n\n fixArc(p, i); // fixArc adds also the right amount of A:s to pcoms1\n\n if (p2) { // the same procedures is done to p2\n p2[i] && (pfirst = p2[i][0]);\n if (pfirst != \"C\") {\n pcoms2[i] = pfirst;\n i && (pcom = pcoms2[i - 1]);\n }\n p2[i] = processPath(p2[i], attrs2, pcom);\n\n if (pcoms2[i] != \"A\" && pfirst == \"C\") {\n pcoms2[i] = \"C\";\n }\n\n fixArc(p2, i);\n }\n fixM(p, p2, attrs, attrs2, i);\n fixM(p2, p, attrs2, attrs, i);\n var seg = p[i],\n seg2 = p2 && p2[i],\n seglen = seg.length,\n seg2len = p2 && seg2.length;\n attrs.x = seg[seglen - 2];\n attrs.y = seg[seglen - 1];\n attrs.bx = toFloat(seg[seglen - 4]) || attrs.x;\n attrs.by = toFloat(seg[seglen - 3]) || attrs.y;\n attrs2.bx = p2 && (toFloat(seg2[seg2len - 4]) || attrs2.x);\n attrs2.by = p2 && (toFloat(seg2[seg2len - 3]) || attrs2.y);\n attrs2.x = p2 && seg2[seg2len - 2];\n attrs2.y = p2 && seg2[seg2len - 1];\n }\n if (!p2) {\n pth.curve = pathClone(p);\n }\n return p2 ? [p, p2] : p;\n }\n function mapPath(path, matrix) {\n if (!matrix) {\n return path;\n }\n var x, y, i, j, ii, jj, pathi;\n path = path2curve(path);\n for (i = 0, ii = path.length; i < ii; i++) {\n pathi = path[i];\n for (j = 1, jj = pathi.length; j < jj; j += 2) {\n x = matrix.x(pathi[j], pathi[j + 1]);\n y = matrix.y(pathi[j], pathi[j + 1]);\n pathi[j] = x;\n pathi[j + 1] = y;\n }\n }\n return path;\n }\n\n // http://schepers.cc/getting-to-the-point\n function catmullRom2bezier(crp, z) {\n var d = [];\n for (var i = 0, iLen = crp.length; iLen - 2 * !z > i; i += 2) {\n var p = [\n {x: +crp[i - 2], y: +crp[i - 1]},\n {x: +crp[i], y: +crp[i + 1]},\n {x: +crp[i + 2], y: +crp[i + 3]},\n {x: +crp[i + 4], y: +crp[i + 5]}\n ];\n if (z) {\n if (!i) {\n p[0] = {x: +crp[iLen - 2], y: +crp[iLen - 1]};\n } else if (iLen - 4 == i) {\n p[3] = {x: +crp[0], y: +crp[1]};\n } else if (iLen - 2 == i) {\n p[2] = {x: +crp[0], y: +crp[1]};\n p[3] = {x: +crp[2], y: +crp[3]};\n }\n } else {\n if (iLen - 4 == i) {\n p[3] = p[2];\n } else if (!i) {\n p[0] = {x: +crp[i], y: +crp[i + 1]};\n }\n }\n d.push([\"C\",\n (-p[0].x + 6 * p[1].x + p[2].x) / 6,\n (-p[0].y + 6 * p[1].y + p[2].y) / 6,\n (p[1].x + 6 * p[2].x - p[3].x) / 6,\n (p[1].y + 6*p[2].y - p[3].y) / 6,\n p[2].x,\n p[2].y\n ]);\n }\n\n return d;\n }\n\n // export\n Snap.path = paths;\n\n /*\\\n * Snap.path.getTotalLength\n [ method ]\n **\n * Returns the length of the given path in pixels\n **\n - path (string) SVG path string\n **\n = (number) length\n \\*/\n Snap.path.getTotalLength = getTotalLength;\n /*\\\n * Snap.path.getPointAtLength\n [ method ]\n **\n * Returns the coordinates of the point located at the given length along the given path\n **\n - path (string) SVG path string\n - length (number) length, in pixels, from the start of the path, excluding non-rendering jumps\n **\n = (object) representation of the point:\n o {\n o x: (number) x coordinate,\n o y: (number) y coordinate,\n o alpha: (number) angle of derivative\n o }\n \\*/\n Snap.path.getPointAtLength = getPointAtLength;\n /*\\\n * Snap.path.getSubpath\n [ method ]\n **\n * Returns the subpath of a given path between given start and end lengths\n **\n - path (string) SVG path string\n - from (number) length, in pixels, from the start of the path to the start of the segment\n - to (number) length, in pixels, from the start of the path to the end of the segment\n **\n = (string) path string definition for the segment\n \\*/\n Snap.path.getSubpath = function (path, from, to) {\n if (this.getTotalLength(path) - to < 1e-6) {\n return getSubpathsAtLength(path, from).end;\n }\n var a = getSubpathsAtLength(path, to, 1);\n return from ? getSubpathsAtLength(a, from).end : a;\n };\n /*\\\n * Element.getTotalLength\n [ method ]\n **\n * Returns the length of the path in pixels (only works for `path` elements)\n = (number) length\n \\*/\n elproto.getTotalLength = function () {\n if (this.node.getTotalLength) {\n return this.node.getTotalLength();\n }\n };\n // SIERRA Element.getPointAtLength()/Element.getTotalLength(): If a is broken into different segments, is the jump distance to the new coordinates set by the _M_ or _m_ commands calculated as part of the path's total length?\n /*\\\n * Element.getPointAtLength\n [ method ]\n **\n * Returns coordinates of the point located at the given length on the given path (only works for `path` elements)\n **\n - length (number) length, in pixels, from the start of the path, excluding non-rendering jumps\n **\n = (object) representation of the point:\n o {\n o x: (number) x coordinate,\n o y: (number) y coordinate,\n o alpha: (number) angle of derivative\n o }\n \\*/\n elproto.getPointAtLength = function (length) {\n return getPointAtLength(this.attr(\"d\"), length);\n };\n // SIERRA Element.getSubpath(): Similar to the problem for Element.getPointAtLength(). Unclear how this would work for a segmented path. Overall, the concept of _subpath_ and what I'm calling a _segment_ (series of non-_M_ or _Z_ commands) is unclear.\n /*\\\n * Element.getSubpath\n [ method ]\n **\n * Returns subpath of a given element from given start and end lengths (only works for `path` elements)\n **\n - from (number) length, in pixels, from the start of the path to the start of the segment\n - to (number) length, in pixels, from the start of the path to the end of the segment\n **\n = (string) path string definition for the segment\n \\*/\n elproto.getSubpath = function (from, to) {\n return Snap.path.getSubpath(this.attr(\"d\"), from, to);\n };\n Snap._.box = box;\n /*\\\n * Snap.path.findDotsAtSegment\n [ method ]\n **\n * Utility method\n **\n * Finds dot coordinates on the given cubic beziér curve at the given t\n - p1x (number) x of the first point of the curve\n - p1y (number) y of the first point of the curve\n - c1x (number) x of the first anchor of the curve\n - c1y (number) y of the first anchor of the curve\n - c2x (number) x of the second anchor of the curve\n - c2y (number) y of the second anchor of the curve\n - p2x (number) x of the second point of the curve\n - p2y (number) y of the second point of the curve\n - t (number) position on the curve (0..1)\n = (object) point information in format:\n o {\n o x: (number) x coordinate of the point,\n o y: (number) y coordinate of the point,\n o m: {\n o x: (number) x coordinate of the left anchor,\n o y: (number) y coordinate of the left anchor\n o },\n o n: {\n o x: (number) x coordinate of the right anchor,\n o y: (number) y coordinate of the right anchor\n o },\n o start: {\n o x: (number) x coordinate of the start of the curve,\n o y: (number) y coordinate of the start of the curve\n o },\n o end: {\n o x: (number) x coordinate of the end of the curve,\n o y: (number) y coordinate of the end of the curve\n o },\n o alpha: (number) angle of the curve derivative at the point\n o }\n \\*/\n Snap.path.findDotsAtSegment = findDotsAtSegment;\n /*\\\n * Snap.path.bezierBBox\n [ method ]\n **\n * Utility method\n **\n * Returns the bounding box of a given cubic beziér curve\n - p1x (number) x of the first point of the curve\n - p1y (number) y of the first point of the curve\n - c1x (number) x of the first anchor of the curve\n - c1y (number) y of the first anchor of the curve\n - c2x (number) x of the second anchor of the curve\n - c2y (number) y of the second anchor of the curve\n - p2x (number) x of the second point of the curve\n - p2y (number) y of the second point of the curve\n * or\n - bez (array) array of six points for beziér curve\n = (object) bounding box\n o {\n o x: (number) x coordinate of the left top point of the box,\n o y: (number) y coordinate of the left top point of the box,\n o x2: (number) x coordinate of the right bottom point of the box,\n o y2: (number) y coordinate of the right bottom point of the box,\n o width: (number) width of the box,\n o height: (number) height of the box\n o }\n \\*/\n Snap.path.bezierBBox = bezierBBox;\n /*\\\n * Snap.path.isPointInsideBBox\n [ method ]\n **\n * Utility method\n **\n * Returns `true` if given point is inside bounding box\n - bbox (string) bounding box\n - x (string) x coordinate of the point\n - y (string) y coordinate of the point\n = (boolean) `true` if point is inside\n \\*/\n Snap.path.isPointInsideBBox = isPointInsideBBox;\n Snap.closest = function (x, y, X, Y) {\n var r = 100,\n b = box(x - r / 2, y - r / 2, r, r),\n inside = [],\n getter = X[0].hasOwnProperty(\"x\") ? function (i) {\n return {\n x: X[i].x,\n y: X[i].y\n };\n } : function (i) {\n return {\n x: X[i],\n y: Y[i]\n };\n },\n found = 0;\n while (r <= 1e6 && !found) {\n for (var i = 0, ii = X.length; i < ii; i++) {\n var xy = getter(i);\n if (isPointInsideBBox(b, xy.x, xy.y)) {\n found++;\n inside.push(xy);\n break;\n }\n }\n if (!found) {\n r *= 2;\n b = box(x - r / 2, y - r / 2, r, r)\n }\n }\n if (r == 1e6) {\n return;\n }\n var len = Infinity,\n res;\n for (i = 0, ii = inside.length; i < ii; i++) {\n var l = Snap.len(x, y, inside[i].x, inside[i].y);\n if (len > l) {\n len = l;\n inside[i].len = l;\n res = inside[i];\n }\n }\n return res;\n };\n /*\\\n * Snap.path.isBBoxIntersect\n [ method ]\n **\n * Utility method\n **\n * Returns `true` if two bounding boxes intersect\n - bbox1 (string) first bounding box\n - bbox2 (string) second bounding box\n = (boolean) `true` if bounding boxes intersect\n \\*/\n Snap.path.isBBoxIntersect = isBBoxIntersect;\n /*\\\n * Snap.path.intersection\n [ method ]\n **\n * Utility method\n **\n * Finds intersections of two paths\n - path1 (string) path string\n - path2 (string) path string\n = (array) dots of intersection\n o [\n o {\n o x: (number) x coordinate of the point,\n o y: (number) y coordinate of the point,\n o t1: (number) t value for segment of path1,\n o t2: (number) t value for segment of path2,\n o segment1: (number) order number for segment of path1,\n o segment2: (number) order number for segment of path2,\n o bez1: (array) eight coordinates representing beziér curve for the segment of path1,\n o bez2: (array) eight coordinates representing beziér curve for the segment of path2\n o }\n o ]\n \\*/\n Snap.path.intersection = pathIntersection;\n Snap.path.intersectionNumber = pathIntersectionNumber;\n /*\\\n * Snap.path.isPointInside\n [ method ]\n **\n * Utility method\n **\n * Returns `true` if given point is inside a given closed path.\n *\n * Note: fill mode doesn’t affect the result of this method.\n - path (string) path string\n - x (number) x of the point\n - y (number) y of the point\n = (boolean) `true` if point is inside the path\n \\*/\n Snap.path.isPointInside = isPointInsidePath;\n /*\\\n * Snap.path.getBBox\n [ method ]\n **\n * Utility method\n **\n * Returns the bounding box of a given path\n - path (string) path string\n = (object) bounding box\n o {\n o x: (number) x coordinate of the left top point of the box,\n o y: (number) y coordinate of the left top point of the box,\n o x2: (number) x coordinate of the right bottom point of the box,\n o y2: (number) y coordinate of the right bottom point of the box,\n o width: (number) width of the box,\n o height: (number) height of the box\n o }\n \\*/\n Snap.path.getBBox = pathBBox;\n Snap.path.get = getPath;\n /*\\\n * Snap.path.toRelative\n [ method ]\n **\n * Utility method\n **\n * Converts path coordinates into relative values\n - path (string) path string\n = (array) path string\n \\*/\n Snap.path.toRelative = pathToRelative;\n /*\\\n * Snap.path.toAbsolute\n [ method ]\n **\n * Utility method\n **\n * Converts path coordinates into absolute values\n - path (string) path string\n = (array) path string\n \\*/\n Snap.path.toAbsolute = pathToAbsolute;\n /*\\\n * Snap.path.toCubic\n [ method ]\n **\n * Utility method\n **\n * Converts path to a new path where all segments are cubic beziér curves\n - pathString (string|array) path string or array of segments\n = (array) array of segments\n \\*/\n Snap.path.toCubic = path2curve;\n /*\\\n * Snap.path.map\n [ method ]\n **\n * Transform the path string with the given matrix\n - path (string) path string\n - matrix (object) see @Matrix\n = (string) transformed path string\n \\*/\n Snap.path.map = mapPath;\n Snap.path.toString = toString;\n Snap.path.clone = pathClone;\n});\n\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n var mmax = Math.max,\n mmin = Math.min;\n\n // Set\n var Set = function (items) {\n this.items = [];\n\tthis.bindings = {};\n this.length = 0;\n this.type = \"set\";\n if (items) {\n for (var i = 0, ii = items.length; i < ii; i++) {\n if (items[i]) {\n this[this.items.length] = this.items[this.items.length] = items[i];\n this.length++;\n }\n }\n }\n },\n setproto = Set.prototype;\n /*\\\n * Set.push\n [ method ]\n **\n * Adds each argument to the current set\n = (object) original element\n \\*/\n setproto.push = function () {\n var item,\n len;\n for (var i = 0, ii = arguments.length; i < ii; i++) {\n item = arguments[i];\n if (item) {\n len = this.items.length;\n this[len] = this.items[len] = item;\n this.length++;\n }\n }\n return this;\n };\n /*\\\n * Set.pop\n [ method ]\n **\n * Removes last element and returns it\n = (object) element\n \\*/\n setproto.pop = function () {\n this.length && delete this[this.length--];\n return this.items.pop();\n };\n /*\\\n * Set.forEach\n [ method ]\n **\n * Executes given function for each element in the set\n *\n * If the function returns `false`, the loop stops running.\n **\n - callback (function) function to run\n - thisArg (object) context object for the callback\n = (object) Set object\n \\*/\n setproto.forEach = function (callback, thisArg) {\n for (var i = 0, ii = this.items.length; i < ii; i++) {\n if (callback.call(thisArg, this.items[i], i) === false) {\n return this;\n }\n }\n return this;\n };\n /*\\\n * Set.animate\n [ method ]\n **\n * Animates each element in set in sync.\n *\n **\n - attrs (object) key-value pairs of destination attributes\n - duration (number) duration of the animation in milliseconds\n - easing (function) #optional easing function from @mina or custom\n - callback (function) #optional callback function that executes when the animation ends\n * or\n - animation (array) array of animation parameter for each element in set in format `[attrs, duration, easing, callback]`\n > Usage\n | // animate all elements in set to radius 10\n | set.animate({r: 10}, 500, mina.easein);\n | // or\n | // animate first element to radius 10, but second to radius 20 and in different time\n | set.animate([{r: 10}, 500, mina.easein], [{r: 20}, 1500, mina.easein]);\n = (Element) the current element\n \\*/\n setproto.animate = function (attrs, ms, easing, callback) {\n if (typeof easing == \"function\" && !easing.length) {\n callback = easing;\n easing = mina.linear;\n }\n if (attrs instanceof Snap._.Animation) {\n callback = attrs.callback;\n easing = attrs.easing;\n ms = easing.dur;\n attrs = attrs.attr;\n }\n var args = arguments;\n if (Snap.is(attrs, \"array\") && Snap.is(args[args.length - 1], \"array\")) {\n var each = true;\n }\n var begin,\n handler = function () {\n if (begin) {\n this.b = begin;\n } else {\n begin = this.b;\n }\n },\n cb = 0,\n set = this,\n callbacker = callback && function () {\n if (++cb == set.length) {\n callback.call(this);\n }\n };\n return this.forEach(function (el, i) {\n eve.once(\"snap.animcreated.\" + el.id, handler);\n if (each) {\n args[i] && el.animate.apply(el, args[i]);\n } else {\n el.animate(attrs, ms, easing, callbacker);\n }\n });\n };\n /*\\\n * Set.remove\n [ method ]\n **\n * Removes all children of the set.\n *\n = (object) Set object\n \\*/\n setproto.remove = function () {\n while (this.length) {\n this.pop().remove();\n }\n return this;\n };\n /*\\\n * Set.bind\n [ method ]\n **\n * Specifies how to handle a specific attribute when applied\n * to a set.\n *\n **\n - attr (string) attribute name\n - callback (function) function to run\n * or\n - attr (string) attribute name\n - element (Element) specific element in the set to apply the attribute to\n * or\n - attr (string) attribute name\n - element (Element) specific element in the set to apply the attribute to\n - eattr (string) attribute on the element to bind the attribute to\n = (object) Set object\n \\*/\n setproto.bind = function (attr, a, b) {\n var data = {};\n if (typeof a == \"function\") {\n this.bindings[attr] = a;\n } else {\n var aname = b || attr;\n this.bindings[attr] = function (v) {\n data[aname] = v;\n a.attr(data);\n };\n }\n return this;\n };\n /*\\\n * Set.attr\n [ method ]\n **\n * Equivalent of @Element.attr.\n = (object) Set object\n \\*/\n setproto.attr = function (value) {\n var unbound = {};\n for (var k in value) {\n if (this.bindings[k]) {\n this.bindings[k](value[k]);\n } else {\n unbound[k] = value[k];\n }\n }\n for (var i = 0, ii = this.items.length; i < ii; i++) {\n this.items[i].attr(unbound);\n }\n return this;\n };\n /*\\\n * Set.clear\n [ method ]\n **\n * Removes all elements from the set\n \\*/\n setproto.clear = function () {\n while (this.length) {\n this.pop();\n }\n };\n /*\\\n * Set.splice\n [ method ]\n **\n * Removes range of elements from the set\n **\n - index (number) position of the deletion\n - count (number) number of element to remove\n - insertion… (object) #optional elements to insert\n = (object) set elements that were deleted\n \\*/\n setproto.splice = function (index, count, insertion) {\n index = index < 0 ? mmax(this.length + index, 0) : index;\n count = mmax(0, mmin(this.length - index, count));\n var tail = [],\n todel = [],\n args = [],\n i;\n for (i = 2; i < arguments.length; i++) {\n args.push(arguments[i]);\n }\n for (i = 0; i < count; i++) {\n todel.push(this[index + i]);\n }\n for (; i < this.length - index; i++) {\n tail.push(this[index + i]);\n }\n var arglen = args.length;\n for (i = 0; i < arglen + tail.length; i++) {\n this.items[index + i] = this[index + i] = i < arglen ? args[i] : tail[i - arglen];\n }\n i = this.items.length = this.length -= count - arglen;\n while (this[i]) {\n delete this[i++];\n }\n return new Set(todel);\n };\n /*\\\n * Set.exclude\n [ method ]\n **\n * Removes given element from the set\n **\n - element (object) element to remove\n = (boolean) `true` if object was found and removed from the set\n \\*/\n setproto.exclude = function (el) {\n for (var i = 0, ii = this.length; i < ii; i++) if (this[i] == el) {\n this.splice(i, 1);\n return true;\n }\n return false;\n };\n /*\\\n * Set.insertAfter\n [ method ]\n **\n * Inserts set elements after given element.\n **\n - element (object) set will be inserted after this element\n = (object) Set object\n \\*/\n setproto.insertAfter = function (el) {\n var i = this.items.length;\n while (i--) {\n this.items[i].insertAfter(el);\n }\n return this;\n };\n /*\\\n * Set.getBBox\n [ method ]\n **\n * Union of all bboxes of the set. See @Element.getBBox.\n = (object) bounding box descriptor. See @Element.getBBox.\n \\*/\n setproto.getBBox = function () {\n var x = [],\n y = [],\n x2 = [],\n y2 = [];\n for (var i = this.items.length; i--;) if (!this.items[i].removed) {\n var box = this.items[i].getBBox();\n x.push(box.x);\n y.push(box.y);\n x2.push(box.x + box.width);\n y2.push(box.y + box.height);\n }\n x = mmin.apply(0, x);\n y = mmin.apply(0, y);\n x2 = mmax.apply(0, x2);\n y2 = mmax.apply(0, y2);\n return {\n x: x,\n y: y,\n x2: x2,\n y2: y2,\n width: x2 - x,\n height: y2 - y,\n cx: x + (x2 - x) / 2,\n cy: y + (y2 - y) / 2\n };\n };\n /*\\\n * Set.insertAfter\n [ method ]\n **\n * Creates a clone of the set.\n **\n = (object) New Set object\n \\*/\n setproto.clone = function (s) {\n s = new Set;\n for (var i = 0, ii = this.items.length; i < ii; i++) {\n s.push(this.items[i].clone());\n }\n return s;\n };\n setproto.toString = function () {\n return \"Snap\\u2018s set\";\n };\n setproto.type = \"set\";\n // export\n /*\\\n * Snap.Set\n [ property ]\n **\n * Set constructor.\n \\*/\n Snap.Set = Set;\n /*\\\n * Snap.set\n [ method ]\n **\n * Creates a set and fills it with list of arguments.\n **\n = (object) New Set object\n | var r = paper.rect(0, 0, 10, 10),\n | s1 = Snap.set(), // empty set\n | s2 = Snap.set(r, paper.circle(100, 100, 20)); // prefilled set\n \\*/\n Snap.set = function () {\n var set = new Set;\n if (arguments.length) {\n set.push.apply(set, Array.prototype.slice.call(arguments, 0));\n }\n return set;\n };\n});\n\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n var names = {},\n reUnit = /[%a-z]+$/i,\n Str = String;\n names.stroke = names.fill = \"colour\";\n function getEmpty(item) {\n var l = item[0];\n switch (l.toLowerCase()) {\n case \"t\": return [l, 0, 0];\n case \"m\": return [l, 1, 0, 0, 1, 0, 0];\n case \"r\": if (item.length == 4) {\n return [l, 0, item[2], item[3]];\n } else {\n return [l, 0];\n }\n case \"s\": if (item.length == 5) {\n return [l, 1, 1, item[3], item[4]];\n } else if (item.length == 3) {\n return [l, 1, 1];\n } else {\n return [l, 1];\n }\n }\n }\n function equaliseTransform(t1, t2, getBBox) {\n t1 = t1 || new Snap.Matrix;\n t2 = t2 || new Snap.Matrix;\n t1 = Snap.parseTransformString(t1.toTransformString()) || [];\n t2 = Snap.parseTransformString(t2.toTransformString()) || [];\n var maxlength = Math.max(t1.length, t2.length),\n from = [],\n to = [],\n i = 0, j, jj,\n tt1, tt2;\n for (; i < maxlength; i++) {\n tt1 = t1[i] || getEmpty(t2[i]);\n tt2 = t2[i] || getEmpty(tt1);\n if (tt1[0] != tt2[0] ||\n tt1[0].toLowerCase() == \"r\" && (tt1[2] != tt2[2] || tt1[3] != tt2[3]) ||\n tt1[0].toLowerCase() == \"s\" && (tt1[3] != tt2[3] || tt1[4] != tt2[4])\n ) {\n t1 = Snap._.transform2matrix(t1, getBBox());\n t2 = Snap._.transform2matrix(t2, getBBox());\n from = [[\"m\", t1.a, t1.b, t1.c, t1.d, t1.e, t1.f]];\n to = [[\"m\", t2.a, t2.b, t2.c, t2.d, t2.e, t2.f]];\n break;\n }\n from[i] = [];\n to[i] = [];\n for (j = 0, jj = Math.max(tt1.length, tt2.length); j < jj; j++) {\n j in tt1 && (from[i][j] = tt1[j]);\n j in tt2 && (to[i][j] = tt2[j]);\n }\n }\n return {\n from: path2array(from),\n to: path2array(to),\n f: getPath(from)\n };\n }\n function getNumber(val) {\n return val;\n }\n function getUnit(unit) {\n return function (val) {\n return +val.toFixed(3) + unit;\n };\n }\n function getViewBox(val) {\n return val.join(\" \");\n }\n function getColour(clr) {\n return Snap.rgb(clr[0], clr[1], clr[2], clr[3]);\n }\n function getPath(path) {\n var k = 0, i, ii, j, jj, out, a, b = [];\n for (i = 0, ii = path.length; i < ii; i++) {\n out = \"[\";\n a = ['\"' + path[i][0] + '\"'];\n for (j = 1, jj = path[i].length; j < jj; j++) {\n a[j] = \"val[\" + k++ + \"]\";\n }\n out += a + \"]\";\n b[i] = out;\n }\n return Function(\"val\", \"return Snap.path.toString.call([\" + b + \"])\");\n }\n function path2array(path) {\n var out = [];\n for (var i = 0, ii = path.length; i < ii; i++) {\n for (var j = 1, jj = path[i].length; j < jj; j++) {\n out.push(path[i][j]);\n }\n }\n return out;\n }\n function isNumeric(obj) {\n return isFinite(obj);\n }\n function arrayEqual(arr1, arr2) {\n if (!Snap.is(arr1, \"array\") || !Snap.is(arr2, \"array\")) {\n return false;\n }\n return arr1.toString() == arr2.toString();\n }\n Element.prototype.equal = function (name, b) {\n return eve(\"snap.util.equal\", this, name, b).firstDefined();\n };\n eve.on(\"snap.util.equal\", function (name, b) {\n var A, B, a = Str(this.attr(name) || \"\"),\n el = this;\n if (names[name] == \"colour\") {\n A = Snap.color(a);\n B = Snap.color(b);\n return {\n from: [A.r, A.g, A.b, A.opacity],\n to: [B.r, B.g, B.b, B.opacity],\n f: getColour\n };\n }\n if (name == \"viewBox\") {\n A = this.attr(name).vb.split(\" \").map(Number);\n B = b.split(\" \").map(Number);\n return {\n from: A,\n to: B,\n f: getViewBox\n };\n }\n if (name == \"transform\" || name == \"gradientTransform\" || name == \"patternTransform\") {\n if (typeof b == \"string\") {\n b = Str(b).replace(/\\.{3}|\\u2026/g, a);\n }\n a = this.matrix;\n if (!Snap._.rgTransform.test(b)) {\n b = Snap._.transform2matrix(Snap._.svgTransform2string(b), this.getBBox());\n } else {\n b = Snap._.transform2matrix(b, this.getBBox());\n }\n return equaliseTransform(a, b, function () {\n return el.getBBox(1);\n });\n }\n if (name == \"d\" || name == \"path\") {\n A = Snap.path.toCubic(a, b);\n return {\n from: path2array(A[0]),\n to: path2array(A[1]),\n f: getPath(A[0])\n };\n }\n if (name == \"points\") {\n A = Str(a).split(Snap._.separator);\n B = Str(b).split(Snap._.separator);\n return {\n from: A,\n to: B,\n f: function (val) { return val; }\n };\n }\n if (isNumeric(a) && isNumeric(b)) {\n return {\n from: parseFloat(a),\n to: parseFloat(b),\n f: getNumber\n };\n }\n var aUnit = a.match(reUnit),\n bUnit = Str(b).match(reUnit);\n if (aUnit && arrayEqual(aUnit, bUnit)) {\n return {\n from: parseFloat(a),\n to: parseFloat(b),\n f: getUnit(aUnit)\n };\n } else {\n return {\n from: this.asPX(name),\n to: this.asPX(name, b),\n f: getNumber\n };\n }\n });\n});\n\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n var elproto = Element.prototype,\n has = \"hasOwnProperty\",\n supportsTouch = \"createTouch\" in glob.doc,\n events = [\n \"click\", \"dblclick\", \"mousedown\", \"mousemove\", \"mouseout\",\n \"mouseover\", \"mouseup\", \"touchstart\", \"touchmove\", \"touchend\",\n \"touchcancel\"\n ],\n touchMap = {\n mousedown: \"touchstart\",\n mousemove: \"touchmove\",\n mouseup: \"touchend\"\n },\n getScroll = function (xy, el) {\n var name = xy == \"y\" ? \"scrollTop\" : \"scrollLeft\",\n doc = el && el.node ? el.node.ownerDocument : glob.doc;\n return doc[name in doc.documentElement ? \"documentElement\" : \"body\"][name];\n },\n preventDefault = function () {\n this.returnValue = false;\n },\n preventTouch = function () {\n return this.originalEvent.preventDefault();\n },\n stopPropagation = function () {\n this.cancelBubble = true;\n },\n stopTouch = function () {\n return this.originalEvent.stopPropagation();\n },\n addEvent = function (obj, type, fn, element) {\n var realName = supportsTouch && touchMap[type] ? touchMap[type] : type,\n f = function (e) {\n var scrollY = getScroll(\"y\", element),\n scrollX = getScroll(\"x\", element);\n if (supportsTouch && touchMap[has](type)) {\n for (var i = 0, ii = e.targetTouches && e.targetTouches.length; i < ii; i++) {\n if (e.targetTouches[i].target == obj || obj.contains(e.targetTouches[i].target)) {\n var olde = e;\n e = e.targetTouches[i];\n e.originalEvent = olde;\n e.preventDefault = preventTouch;\n e.stopPropagation = stopTouch;\n break;\n }\n }\n }\n var x = e.clientX + scrollX,\n y = e.clientY + scrollY;\n return fn.call(element, e, x, y);\n };\n\n if (type !== realName) {\n obj.addEventListener(type, f, false);\n }\n\n obj.addEventListener(realName, f, false);\n\n return function () {\n if (type !== realName) {\n obj.removeEventListener(type, f, false);\n }\n\n obj.removeEventListener(realName, f, false);\n return true;\n };\n },\n drag = [],\n dragMove = function (e) {\n var x = e.clientX,\n y = e.clientY,\n scrollY = getScroll(\"y\"),\n scrollX = getScroll(\"x\"),\n dragi,\n j = drag.length;\n while (j--) {\n dragi = drag[j];\n if (supportsTouch) {\n var i = e.touches && e.touches.length,\n touch;\n while (i--) {\n touch = e.touches[i];\n if (touch.identifier == dragi.el._drag.id || dragi.el.node.contains(touch.target)) {\n x = touch.clientX;\n y = touch.clientY;\n (e.originalEvent ? e.originalEvent : e).preventDefault();\n break;\n }\n }\n } else {\n e.preventDefault();\n }\n var node = dragi.el.node,\n o,\n next = node.nextSibling,\n parent = node.parentNode,\n display = node.style.display;\n // glob.win.opera && parent.removeChild(node);\n // node.style.display = \"none\";\n // o = dragi.el.paper.getElementByPoint(x, y);\n // node.style.display = display;\n // glob.win.opera && (next ? parent.insertBefore(node, next) : parent.appendChild(node));\n // o && eve(\"snap.drag.over.\" + dragi.el.id, dragi.el, o);\n x += scrollX;\n y += scrollY;\n eve(\"snap.drag.move.\" + dragi.el.id, dragi.move_scope || dragi.el, x - dragi.el._drag.x, y - dragi.el._drag.y, x, y, e);\n }\n },\n dragUp = function (e) {\n Snap.unmousemove(dragMove).unmouseup(dragUp);\n var i = drag.length,\n dragi;\n while (i--) {\n dragi = drag[i];\n dragi.el._drag = {};\n eve(\"snap.drag.end.\" + dragi.el.id, dragi.end_scope || dragi.start_scope || dragi.move_scope || dragi.el, e);\n eve.off(\"snap.drag.*.\" + dragi.el.id);\n }\n drag = [];\n };\n /*\\\n * Element.click\n [ method ]\n **\n * Adds a click event handler to the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n /*\\\n * Element.unclick\n [ method ]\n **\n * Removes a click event handler from the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n \n /*\\\n * Element.dblclick\n [ method ]\n **\n * Adds a double click event handler to the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n /*\\\n * Element.undblclick\n [ method ]\n **\n * Removes a double click event handler from the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n \n /*\\\n * Element.mousedown\n [ method ]\n **\n * Adds a mousedown event handler to the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n /*\\\n * Element.unmousedown\n [ method ]\n **\n * Removes a mousedown event handler from the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n \n /*\\\n * Element.mousemove\n [ method ]\n **\n * Adds a mousemove event handler to the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n /*\\\n * Element.unmousemove\n [ method ]\n **\n * Removes a mousemove event handler from the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n \n /*\\\n * Element.mouseout\n [ method ]\n **\n * Adds a mouseout event handler to the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n /*\\\n * Element.unmouseout\n [ method ]\n **\n * Removes a mouseout event handler from the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n \n /*\\\n * Element.mouseover\n [ method ]\n **\n * Adds a mouseover event handler to the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n /*\\\n * Element.unmouseover\n [ method ]\n **\n * Removes a mouseover event handler from the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n \n /*\\\n * Element.mouseup\n [ method ]\n **\n * Adds a mouseup event handler to the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n /*\\\n * Element.unmouseup\n [ method ]\n **\n * Removes a mouseup event handler from the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n \n /*\\\n * Element.touchstart\n [ method ]\n **\n * Adds a touchstart event handler to the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n /*\\\n * Element.untouchstart\n [ method ]\n **\n * Removes a touchstart event handler from the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n \n /*\\\n * Element.touchmove\n [ method ]\n **\n * Adds a touchmove event handler to the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n /*\\\n * Element.untouchmove\n [ method ]\n **\n * Removes a touchmove event handler from the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n \n /*\\\n * Element.touchend\n [ method ]\n **\n * Adds a touchend event handler to the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n /*\\\n * Element.untouchend\n [ method ]\n **\n * Removes a touchend event handler from the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n \n /*\\\n * Element.touchcancel\n [ method ]\n **\n * Adds a touchcancel event handler to the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n /*\\\n * Element.untouchcancel\n [ method ]\n **\n * Removes a touchcancel event handler from the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n for (var i = events.length; i--;) {\n (function (eventName) {\n Snap[eventName] = elproto[eventName] = function (fn, scope) {\n if (Snap.is(fn, \"function\")) {\n this.events = this.events || [];\n this.events.push({\n name: eventName,\n f: fn,\n unbind: addEvent(this.node || document, eventName, fn, scope || this)\n });\n } else {\n for (var i = 0, ii = this.events.length; i < ii; i++) if (this.events[i].name == eventName) {\n try {\n this.events[i].f.call(this);\n } catch (e) {}\n }\n }\n return this;\n };\n Snap[\"un\" + eventName] =\n elproto[\"un\" + eventName] = function (fn) {\n var events = this.events || [],\n l = events.length;\n while (l--) if (events[l].name == eventName &&\n (events[l].f == fn || !fn)) {\n events[l].unbind();\n events.splice(l, 1);\n !events.length && delete this.events;\n return this;\n }\n return this;\n };\n })(events[i]);\n }\n /*\\\n * Element.hover\n [ method ]\n **\n * Adds hover event handlers to the element\n - f_in (function) handler for hover in\n - f_out (function) handler for hover out\n - icontext (object) #optional context for hover in handler\n - ocontext (object) #optional context for hover out handler\n = (object) @Element\n \\*/\n elproto.hover = function (f_in, f_out, scope_in, scope_out) {\n return this.mouseover(f_in, scope_in).mouseout(f_out, scope_out || scope_in);\n };\n /*\\\n * Element.unhover\n [ method ]\n **\n * Removes hover event handlers from the element\n - f_in (function) handler for hover in\n - f_out (function) handler for hover out\n = (object) @Element\n \\*/\n elproto.unhover = function (f_in, f_out) {\n return this.unmouseover(f_in).unmouseout(f_out);\n };\n var draggable = [];\n // SIERRA unclear what _context_ refers to for starting, ending, moving the drag gesture.\n // SIERRA Element.drag(): _x position of the mouse_: Where are the x/y values offset from?\n // SIERRA Element.drag(): much of this member's doc appears to be duplicated for some reason.\n // SIERRA Unclear about this sentence: _Additionally following drag events will be triggered: drag.start. on start, drag.end. on end and drag.move. on every move._ Is there a global _drag_ object to which you can assign handlers keyed by an element's ID?\n /*\\\n * Element.drag\n [ method ]\n **\n * Adds event handlers for an element's drag gesture\n **\n - onmove (function) handler for moving\n - onstart (function) handler for drag start\n - onend (function) handler for drag end\n - mcontext (object) #optional context for moving handler\n - scontext (object) #optional context for drag start handler\n - econtext (object) #optional context for drag end handler\n * Additionaly following `drag` events are triggered: `drag.start.` on start, \n * `drag.end.` on end and `drag.move.` on every move. When element is dragged over another element \n * `drag.over.` fires as well.\n *\n * Start event and start handler are called in specified context or in context of the element with following parameters:\n o x (number) x position of the mouse\n o y (number) y position of the mouse\n o event (object) DOM event object\n * Move event and move handler are called in specified context or in context of the element with following parameters:\n o dx (number) shift by x from the start point\n o dy (number) shift by y from the start point\n o x (number) x position of the mouse\n o y (number) y position of the mouse\n o event (object) DOM event object\n * End event and end handler are called in specified context or in context of the element with following parameters:\n o event (object) DOM event object\n = (object) @Element\n \\*/\n elproto.drag = function (onmove, onstart, onend, move_scope, start_scope, end_scope) {\n var el = this;\n if (!arguments.length) {\n var origTransform;\n return el.drag(function (dx, dy) {\n this.attr({\n transform: origTransform + (origTransform ? \"T\" : \"t\") + [dx, dy]\n });\n }, function () {\n origTransform = this.transform().local;\n });\n }\n function start(e, x, y) {\n (e.originalEvent || e).preventDefault();\n el._drag.x = x;\n el._drag.y = y;\n el._drag.id = e.identifier;\n !drag.length && Snap.mousemove(dragMove).mouseup(dragUp);\n drag.push({el: el, move_scope: move_scope, start_scope: start_scope, end_scope: end_scope});\n onstart && eve.on(\"snap.drag.start.\" + el.id, onstart);\n onmove && eve.on(\"snap.drag.move.\" + el.id, onmove);\n onend && eve.on(\"snap.drag.end.\" + el.id, onend);\n eve(\"snap.drag.start.\" + el.id, start_scope || move_scope || el, x, y, e);\n }\n function init(e, x, y) {\n eve(\"snap.draginit.\" + el.id, el, e, x, y);\n }\n eve.on(\"snap.draginit.\" + el.id, start);\n el._drag = {};\n draggable.push({el: el, start: start, init: init});\n el.mousedown(init);\n return el;\n };\n /*\n * Element.onDragOver\n [ method ]\n **\n * Shortcut to assign event handler for `drag.over.` event, where `id` is the element's `id` (see @Element.id)\n - f (function) handler for event, first argument would be the element you are dragging over\n \\*/\n // elproto.onDragOver = function (f) {\n // f ? eve.on(\"snap.drag.over.\" + this.id, f) : eve.unbind(\"snap.drag.over.\" + this.id);\n // };\n /*\\\n * Element.undrag\n [ method ]\n **\n * Removes all drag event handlers from the given element\n \\*/\n elproto.undrag = function () {\n var i = draggable.length;\n while (i--) if (draggable[i].el == this) {\n this.unmousedown(draggable[i].init);\n draggable.splice(i, 1);\n eve.unbind(\"snap.drag.*.\" + this.id);\n eve.unbind(\"snap.draginit.\" + this.id);\n }\n !draggable.length && Snap.unmousemove(dragMove).unmouseup(dragUp);\n return this;\n };\n});\n\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n var elproto = Element.prototype,\n pproto = Paper.prototype,\n rgurl = /^\\s*url\\((.+)\\)/,\n Str = String,\n $ = Snap._.$;\n Snap.filter = {};\n /*\\\n * Paper.filter\n [ method ]\n **\n * Creates a `` element\n **\n - filstr (string) SVG fragment of filter provided as a string\n = (object) @Element\n * Note: It is recommended to use filters embedded into the page inside an empty SVG element.\n > Usage\n | var f = paper.filter(''),\n | c = paper.circle(10, 10, 10).attr({\n | filter: f\n | });\n \\*/\n pproto.filter = function (filstr) {\n var paper = this;\n if (paper.type != \"svg\") {\n paper = paper.paper;\n }\n var f = Snap.parse(Str(filstr)),\n id = Snap._.id(),\n width = paper.node.offsetWidth,\n height = paper.node.offsetHeight,\n filter = $(\"filter\");\n $(filter, {\n id: id,\n filterUnits: \"userSpaceOnUse\"\n });\n filter.appendChild(f.node);\n paper.defs.appendChild(filter);\n return new Element(filter);\n };\n\n eve.on(\"snap.util.getattr.filter\", function () {\n eve.stop();\n var p = $(this.node, \"filter\");\n if (p) {\n var match = Str(p).match(rgurl);\n return match && Snap.select(match[1]);\n }\n });\n eve.on(\"snap.util.attr.filter\", function (value) {\n if (value instanceof Element && value.type == \"filter\") {\n eve.stop();\n var id = value.node.id;\n if (!id) {\n $(value.node, {id: value.id});\n id = value.id;\n }\n $(this.node, {\n filter: Snap.url(id)\n });\n }\n if (!value || value == \"none\") {\n eve.stop();\n this.node.removeAttribute(\"filter\");\n }\n });\n /*\\\n * Snap.filter.blur\n [ method ]\n **\n * Returns an SVG markup string for the blur filter\n **\n - x (number) amount of horizontal blur, in pixels\n - y (number) #optional amount of vertical blur, in pixels\n = (string) filter representation\n > Usage\n | var f = paper.filter(Snap.filter.blur(5, 10)),\n | c = paper.circle(10, 10, 10).attr({\n | filter: f\n | });\n \\*/\n Snap.filter.blur = function (x, y) {\n if (x == null) {\n x = 2;\n }\n var def = y == null ? x : [x, y];\n return Snap.format('\\', {\n def: def\n });\n };\n Snap.filter.blur.toString = function () {\n return this();\n };\n /*\\\n * Snap.filter.shadow\n [ method ]\n **\n * Returns an SVG markup string for the shadow filter\n **\n - dx (number) #optional horizontal shift of the shadow, in pixels\n - dy (number) #optional vertical shift of the shadow, in pixels\n - blur (number) #optional amount of blur\n - color (string) #optional color of the shadow\n - opacity (number) #optional `0..1` opacity of the shadow\n * or\n - dx (number) #optional horizontal shift of the shadow, in pixels\n - dy (number) #optional vertical shift of the shadow, in pixels\n - color (string) #optional color of the shadow\n - opacity (number) #optional `0..1` opacity of the shadow\n * which makes blur default to `4`. Or\n - dx (number) #optional horizontal shift of the shadow, in pixels\n - dy (number) #optional vertical shift of the shadow, in pixels\n - opacity (number) #optional `0..1` opacity of the shadow\n = (string) filter representation\n > Usage\n | var f = paper.filter(Snap.filter.shadow(0, 2, .3)),\n | c = paper.circle(10, 10, 10).attr({\n | filter: f\n | });\n \\*/\n Snap.filter.shadow = function (dx, dy, blur, color, opacity) {\n if (opacity == null) {\n if (color == null) {\n opacity = blur;\n blur = 4;\n color = \"#000\";\n } else {\n opacity = color;\n color = blur;\n blur = 4;\n }\n }\n if (blur == null) {\n blur = 4;\n }\n if (opacity == null) {\n opacity = 1;\n }\n if (dx == null) {\n dx = 0;\n dy = 2;\n }\n if (dy == null) {\n dy = dx;\n }\n color = Snap.color(color);\n return Snap.format('', {\n color: color,\n dx: dx,\n dy: dy,\n blur: blur,\n opacity: opacity\n });\n };\n Snap.filter.shadow.toString = function () {\n return this();\n };\n /*\\\n * Snap.filter.grayscale\n [ method ]\n **\n * Returns an SVG markup string for the grayscale filter\n **\n - amount (number) amount of filter (`0..1`)\n = (string) filter representation\n \\*/\n Snap.filter.grayscale = function (amount) {\n if (amount == null) {\n amount = 1;\n }\n return Snap.format('', {\n a: 0.2126 + 0.7874 * (1 - amount),\n b: 0.7152 - 0.7152 * (1 - amount),\n c: 0.0722 - 0.0722 * (1 - amount),\n d: 0.2126 - 0.2126 * (1 - amount),\n e: 0.7152 + 0.2848 * (1 - amount),\n f: 0.0722 - 0.0722 * (1 - amount),\n g: 0.2126 - 0.2126 * (1 - amount),\n h: 0.0722 + 0.9278 * (1 - amount)\n });\n };\n Snap.filter.grayscale.toString = function () {\n return this();\n };\n /*\\\n * Snap.filter.sepia\n [ method ]\n **\n * Returns an SVG markup string for the sepia filter\n **\n - amount (number) amount of filter (`0..1`)\n = (string) filter representation\n \\*/\n Snap.filter.sepia = function (amount) {\n if (amount == null) {\n amount = 1;\n }\n return Snap.format('', {\n a: 0.393 + 0.607 * (1 - amount),\n b: 0.769 - 0.769 * (1 - amount),\n c: 0.189 - 0.189 * (1 - amount),\n d: 0.349 - 0.349 * (1 - amount),\n e: 0.686 + 0.314 * (1 - amount),\n f: 0.168 - 0.168 * (1 - amount),\n g: 0.272 - 0.272 * (1 - amount),\n h: 0.534 - 0.534 * (1 - amount),\n i: 0.131 + 0.869 * (1 - amount)\n });\n };\n Snap.filter.sepia.toString = function () {\n return this();\n };\n /*\\\n * Snap.filter.saturate\n [ method ]\n **\n * Returns an SVG markup string for the saturate filter\n **\n - amount (number) amount of filter (`0..1`)\n = (string) filter representation\n \\*/\n Snap.filter.saturate = function (amount) {\n if (amount == null) {\n amount = 1;\n }\n return Snap.format('', {\n amount: 1 - amount\n });\n };\n Snap.filter.saturate.toString = function () {\n return this();\n };\n /*\\\n * Snap.filter.hueRotate\n [ method ]\n **\n * Returns an SVG markup string for the hue-rotate filter\n **\n - angle (number) angle of rotation\n = (string) filter representation\n \\*/\n Snap.filter.hueRotate = function (angle) {\n angle = angle || 0;\n return Snap.format('', {\n angle: angle\n });\n };\n Snap.filter.hueRotate.toString = function () {\n return this();\n };\n /*\\\n * Snap.filter.invert\n [ method ]\n **\n * Returns an SVG markup string for the invert filter\n **\n - amount (number) amount of filter (`0..1`)\n = (string) filter representation\n \\*/\n Snap.filter.invert = function (amount) {\n if (amount == null) {\n amount = 1;\n }\n// \n return Snap.format('', {\n amount: amount,\n amount2: 1 - amount\n });\n };\n Snap.filter.invert.toString = function () {\n return this();\n };\n /*\\\n * Snap.filter.brightness\n [ method ]\n **\n * Returns an SVG markup string for the brightness filter\n **\n - amount (number) amount of filter (`0..1`)\n = (string) filter representation\n \\*/\n Snap.filter.brightness = function (amount) {\n if (amount == null) {\n amount = 1;\n }\n return Snap.format('', {\n amount: amount\n });\n };\n Snap.filter.brightness.toString = function () {\n return this();\n };\n /*\\\n * Snap.filter.contrast\n [ method ]\n **\n * Returns an SVG markup string for the contrast filter\n **\n - amount (number) amount of filter (`0..1`)\n = (string) filter representation\n \\*/\n Snap.filter.contrast = function (amount) {\n if (amount == null) {\n amount = 1;\n }\n return Snap.format('', {\n amount: amount,\n amount2: .5 - amount / 2\n });\n };\n Snap.filter.contrast.toString = function () {\n return this();\n };\n});\n\n// Copyright (c) 2014 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob, Fragment) {\n var box = Snap._.box,\n is = Snap.is,\n firstLetter = /^[^a-z]*([tbmlrc])/i,\n toString = function () {\n return \"T\" + this.dx + \",\" + this.dy;\n };\n /*\\\n * Element.getAlign\n [ method ]\n **\n * Returns shift needed to align the element relatively to given element.\n * If no elements specified, parent `` container will be used.\n - el (object) @optional alignment element\n - way (string) one of six values: `\"top\"`, `\"middle\"`, `\"bottom\"`, `\"left\"`, `\"center\"`, `\"right\"`\n = (object|string) Object in format `{dx: , dy: }` also has a string representation as a transformation string\n > Usage\n | el.transform(el.getAlign(el2, \"top\"));\n * or\n | var dy = el.getAlign(el2, \"top\").dy;\n \\*/\n Element.prototype.getAlign = function (el, way) {\n if (way == null && is(el, \"string\")) {\n way = el;\n el = null;\n }\n el = el || this.paper;\n var bx = el.getBBox ? el.getBBox() : box(el),\n bb = this.getBBox(),\n out = {};\n way = way && way.match(firstLetter);\n way = way ? way[1].toLowerCase() : \"c\";\n switch (way) {\n case \"t\":\n out.dx = 0;\n out.dy = bx.y - bb.y;\n break;\n case \"b\":\n out.dx = 0;\n out.dy = bx.y2 - bb.y2;\n break;\n case \"m\":\n out.dx = 0;\n out.dy = bx.cy - bb.cy;\n break;\n case \"l\":\n out.dx = bx.x - bb.x;\n out.dy = 0;\n break;\n case \"r\":\n out.dx = bx.x2 - bb.x2;\n out.dy = 0;\n break;\n default:\n out.dx = bx.cx - bb.cx;\n out.dy = 0;\n break;\n }\n out.toString = toString;\n return out;\n };\n /*\\\n * Element.align\n [ method ]\n **\n * Aligns the element relatively to given one via transformation.\n * If no elements specified, parent `` container will be used.\n - el (object) @optional alignment element\n - way (string) one of six values: `\"top\"`, `\"middle\"`, `\"bottom\"`, `\"left\"`, `\"center\"`, `\"right\"`\n = (object) this element\n > Usage\n | el.align(el2, \"top\");\n * or\n | el.align(\"middle\");\n \\*/\n Element.prototype.align = function (el, way) {\n return this.transform(\"...\" + this.getAlign(el, way));\n };\n});\n\n// Copyright (c) 2016 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob, Fragment) {\n var elproto = Element.prototype,\n is = Snap.is,\n Str = String,\n has = \"hasOwnProperty\";\n function slice(from, to, f) {\n return function (arr) {\n var res = arr.slice(from, to);\n if (res.length == 1) {\n res = res[0];\n }\n return f ? f(res) : res;\n };\n }\n var Animation = function (attr, ms, easing, callback) {\n if (typeof easing == \"function\" && !easing.length) {\n callback = easing;\n easing = mina.linear;\n }\n this.attr = attr;\n this.dur = ms;\n easing && (this.easing = easing);\n callback && (this.callback = callback);\n };\n Snap._.Animation = Animation;\n /*\\\n * Snap.animation\n [ method ]\n **\n * Creates an animation object\n **\n - attr (object) attributes of final destination\n - duration (number) duration of the animation, in milliseconds\n - easing (function) #optional one of easing functions of @mina or custom one\n - callback (function) #optional callback function that fires when animation ends\n = (object) animation object\n \\*/\n Snap.animation = function (attr, ms, easing, callback) {\n return new Animation(attr, ms, easing, callback);\n };\n /*\\\n * Element.inAnim\n [ method ]\n **\n * Returns a set of animations that may be able to manipulate the current element\n **\n = (object) in format:\n o {\n o anim (object) animation object,\n o mina (object) @mina object,\n o curStatus (number) 0..1 — status of the animation: 0 — just started, 1 — just finished,\n o status (function) gets or sets the status of the animation,\n o stop (function) stops the animation\n o }\n \\*/\n elproto.inAnim = function () {\n var el = this,\n res = [];\n for (var id in el.anims) if (el.anims[has](id)) {\n (function (a) {\n res.push({\n anim: new Animation(a._attrs, a.dur, a.easing, a._callback),\n mina: a,\n curStatus: a.status(),\n status: function (val) {\n return a.status(val);\n },\n stop: function () {\n a.stop();\n }\n });\n }(el.anims[id]));\n }\n return res;\n };\n /*\\\n * Snap.animate\n [ method ]\n **\n * Runs generic animation of one number into another with a caring function\n **\n - from (number|array) number or array of numbers\n - to (number|array) number or array of numbers\n - setter (function) caring function that accepts one number argument\n - duration (number) duration, in milliseconds\n - easing (function) #optional easing function from @mina or custom\n - callback (function) #optional callback function to execute when animation ends\n = (object) animation object in @mina format\n o {\n o id (string) animation id, consider it read-only,\n o duration (function) gets or sets the duration of the animation,\n o easing (function) easing,\n o speed (function) gets or sets the speed of the animation,\n o status (function) gets or sets the status of the animation,\n o stop (function) stops the animation\n o }\n | var rect = Snap().rect(0, 0, 10, 10);\n | Snap.animate(0, 10, function (val) {\n | rect.attr({\n | x: val\n | });\n | }, 1000);\n | // in given context is equivalent to\n | rect.animate({x: 10}, 1000);\n \\*/\n Snap.animate = function (from, to, setter, ms, easing, callback) {\n if (typeof easing == \"function\" && !easing.length) {\n callback = easing;\n easing = mina.linear;\n }\n var now = mina.time(),\n anim = mina(from, to, now, now + ms, mina.time, setter, easing);\n callback && eve.once(\"mina.finish.\" + anim.id, callback);\n return anim;\n };\n /*\\\n * Element.stop\n [ method ]\n **\n * Stops all the animations for the current element\n **\n = (Element) the current element\n \\*/\n elproto.stop = function () {\n var anims = this.inAnim();\n for (var i = 0, ii = anims.length; i < ii; i++) {\n anims[i].stop();\n }\n return this;\n };\n /*\\\n * Element.animate\n [ method ]\n **\n * Animates the given attributes of the element\n **\n - attrs (object) key-value pairs of destination attributes\n - duration (number) duration of the animation in milliseconds\n - easing (function) #optional easing function from @mina or custom\n - callback (function) #optional callback function that executes when the animation ends\n = (Element) the current element\n \\*/\n elproto.animate = function (attrs, ms, easing, callback) {\n if (typeof easing == \"function\" && !easing.length) {\n callback = easing;\n easing = mina.linear;\n }\n if (attrs instanceof Animation) {\n callback = attrs.callback;\n easing = attrs.easing;\n ms = attrs.dur;\n attrs = attrs.attr;\n }\n var fkeys = [], tkeys = [], keys = {}, from, to, f, eq,\n el = this;\n for (var key in attrs) if (attrs[has](key)) {\n if (el.equal) {\n eq = el.equal(key, Str(attrs[key]));\n from = eq.from;\n to = eq.to;\n f = eq.f;\n } else {\n from = +el.attr(key);\n to = +attrs[key];\n }\n var len = is(from, \"array\") ? from.length : 1;\n keys[key] = slice(fkeys.length, fkeys.length + len, f);\n fkeys = fkeys.concat(from);\n tkeys = tkeys.concat(to);\n }\n var now = mina.time(),\n anim = mina(fkeys, tkeys, now, now + ms, mina.time, function (val) {\n var attr = {};\n for (var key in keys) if (keys[has](key)) {\n attr[key] = keys[key](val);\n }\n el.attr(attr);\n }, easing);\n el.anims[anim.id] = anim;\n anim._attrs = attrs;\n anim._callback = callback;\n eve(\"snap.animcreated.\" + el.id, anim);\n eve.once(\"mina.finish.\" + anim.id, function () {\n eve.off(\"mina.*.\" + anim.id);\n delete el.anims[anim.id];\n callback && callback.call(el);\n });\n eve.once(\"mina.stop.\" + anim.id, function () {\n eve.off(\"mina.*.\" + anim.id);\n delete el.anims[anim.id];\n });\n return el;\n };\n});\n\n// Copyright (c) 2017 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n // Colours are from https://www.materialui.co\n var red = \"#ffebee#ffcdd2#ef9a9a#e57373#ef5350#f44336#e53935#d32f2f#c62828#b71c1c#ff8a80#ff5252#ff1744#d50000\",\n pink = \"#FCE4EC#F8BBD0#F48FB1#F06292#EC407A#E91E63#D81B60#C2185B#AD1457#880E4F#FF80AB#FF4081#F50057#C51162\",\n purple = \"#F3E5F5#E1BEE7#CE93D8#BA68C8#AB47BC#9C27B0#8E24AA#7B1FA2#6A1B9A#4A148C#EA80FC#E040FB#D500F9#AA00FF\",\n deeppurple = \"#EDE7F6#D1C4E9#B39DDB#9575CD#7E57C2#673AB7#5E35B1#512DA8#4527A0#311B92#B388FF#7C4DFF#651FFF#6200EA\",\n indigo = \"#E8EAF6#C5CAE9#9FA8DA#7986CB#5C6BC0#3F51B5#3949AB#303F9F#283593#1A237E#8C9EFF#536DFE#3D5AFE#304FFE\",\n blue = \"#E3F2FD#BBDEFB#90CAF9#64B5F6#64B5F6#2196F3#1E88E5#1976D2#1565C0#0D47A1#82B1FF#448AFF#2979FF#2962FF\",\n lightblue = \"#E1F5FE#B3E5FC#81D4FA#4FC3F7#29B6F6#03A9F4#039BE5#0288D1#0277BD#01579B#80D8FF#40C4FF#00B0FF#0091EA\",\n cyan = \"#E0F7FA#B2EBF2#80DEEA#4DD0E1#26C6DA#00BCD4#00ACC1#0097A7#00838F#006064#84FFFF#18FFFF#00E5FF#00B8D4\",\n teal = \"#E0F2F1#B2DFDB#80CBC4#4DB6AC#26A69A#009688#00897B#00796B#00695C#004D40#A7FFEB#64FFDA#1DE9B6#00BFA5\",\n green = \"#E8F5E9#C8E6C9#A5D6A7#81C784#66BB6A#4CAF50#43A047#388E3C#2E7D32#1B5E20#B9F6CA#69F0AE#00E676#00C853\",\n lightgreen = \"#F1F8E9#DCEDC8#C5E1A5#AED581#9CCC65#8BC34A#7CB342#689F38#558B2F#33691E#CCFF90#B2FF59#76FF03#64DD17\",\n lime = \"#F9FBE7#F0F4C3#E6EE9C#DCE775#D4E157#CDDC39#C0CA33#AFB42B#9E9D24#827717#F4FF81#EEFF41#C6FF00#AEEA00\",\n yellow = \"#FFFDE7#FFF9C4#FFF59D#FFF176#FFEE58#FFEB3B#FDD835#FBC02D#F9A825#F57F17#FFFF8D#FFFF00#FFEA00#FFD600\",\n amber = \"#FFF8E1#FFECB3#FFE082#FFD54F#FFCA28#FFC107#FFB300#FFA000#FF8F00#FF6F00#FFE57F#FFD740#FFC400#FFAB00\",\n orange = \"#FFF3E0#FFE0B2#FFCC80#FFB74D#FFA726#FF9800#FB8C00#F57C00#EF6C00#E65100#FFD180#FFAB40#FF9100#FF6D00\",\n deeporange = \"#FBE9E7#FFCCBC#FFAB91#FF8A65#FF7043#FF5722#F4511E#E64A19#D84315#BF360C#FF9E80#FF6E40#FF3D00#DD2C00\",\n brown = \"#EFEBE9#D7CCC8#BCAAA4#A1887F#8D6E63#795548#6D4C41#5D4037#4E342E#3E2723\",\n grey = \"#FAFAFA#F5F5F5#EEEEEE#E0E0E0#BDBDBD#9E9E9E#757575#616161#424242#212121\",\n bluegrey = \"#ECEFF1#CFD8DC#B0BEC5#90A4AE#78909C#607D8B#546E7A#455A64#37474F#263238\";\n /*\\\n * Snap.mui\n [ property ]\n **\n * Contain Material UI colours.\n | Snap().rect(0, 0, 10, 10).attr({fill: Snap.mui.deeppurple, stroke: Snap.mui.amber[600]});\n # For colour reference: https://www.materialui.co.\n \\*/\n Snap.mui = {};\n /*\\\n * Snap.flat\n [ property ]\n **\n * Contain Flat UI colours.\n | Snap().rect(0, 0, 10, 10).attr({fill: Snap.flat.carrot, stroke: Snap.flat.wetasphalt});\n # For colour reference: https://www.materialui.co.\n \\*/\n Snap.flat = {};\n function saveColor(colors) {\n colors = colors.split(/(?=#)/);\n var color = new String(colors[5]);\n color[50] = colors[0];\n color[100] = colors[1];\n color[200] = colors[2];\n color[300] = colors[3];\n color[400] = colors[4];\n color[500] = colors[5];\n color[600] = colors[6];\n color[700] = colors[7];\n color[800] = colors[8];\n color[900] = colors[9];\n if (colors[10]) {\n color.A100 = colors[10];\n color.A200 = colors[11];\n color.A400 = colors[12];\n color.A700 = colors[13];\n }\n return color;\n }\n Snap.mui.red = saveColor(red);\n Snap.mui.pink = saveColor(pink);\n Snap.mui.purple = saveColor(purple);\n Snap.mui.deeppurple = saveColor(deeppurple);\n Snap.mui.indigo = saveColor(indigo);\n Snap.mui.blue = saveColor(blue);\n Snap.mui.lightblue = saveColor(lightblue);\n Snap.mui.cyan = saveColor(cyan);\n Snap.mui.teal = saveColor(teal);\n Snap.mui.green = saveColor(green);\n Snap.mui.lightgreen = saveColor(lightgreen);\n Snap.mui.lime = saveColor(lime);\n Snap.mui.yellow = saveColor(yellow);\n Snap.mui.amber = saveColor(amber);\n Snap.mui.orange = saveColor(orange);\n Snap.mui.deeporange = saveColor(deeporange);\n Snap.mui.brown = saveColor(brown);\n Snap.mui.grey = saveColor(grey);\n Snap.mui.bluegrey = saveColor(bluegrey);\n Snap.flat.turquoise = \"#1abc9c\";\n Snap.flat.greensea = \"#16a085\";\n Snap.flat.sunflower = \"#f1c40f\";\n Snap.flat.orange = \"#f39c12\";\n Snap.flat.emerland = \"#2ecc71\";\n Snap.flat.nephritis = \"#27ae60\";\n Snap.flat.carrot = \"#e67e22\";\n Snap.flat.pumpkin = \"#d35400\";\n Snap.flat.peterriver = \"#3498db\";\n Snap.flat.belizehole = \"#2980b9\";\n Snap.flat.alizarin = \"#e74c3c\";\n Snap.flat.pomegranate = \"#c0392b\";\n Snap.flat.amethyst = \"#9b59b6\";\n Snap.flat.wisteria = \"#8e44ad\";\n Snap.flat.clouds = \"#ecf0f1\";\n Snap.flat.silver = \"#bdc3c7\";\n Snap.flat.wetasphalt = \"#34495e\";\n Snap.flat.midnightblue = \"#2c3e50\";\n Snap.flat.concrete = \"#95a5a6\";\n Snap.flat.asbestos = \"#7f8c8d\";\n /*\\\n * Snap.importMUIColors\n [ method ]\n **\n * Imports Material UI colours into global object.\n | Snap.importMUIColors();\n | Snap().rect(0, 0, 10, 10).attr({fill: deeppurple, stroke: amber[600]});\n # For colour reference: https://www.materialui.co.\n \\*/\n Snap.importMUIColors = function () {\n for (var color in Snap.mui) {\n if (Snap.mui.hasOwnProperty(color)) {\n window[color] = Snap.mui[color];\n }\n }\n };\n});\n\nmodule.exports = Snap\n","// Copyright (c) 2017 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ┌────────────────────────────────────────────────────────────┐ \\\\\n// │ Eve 0.5.4 - JavaScript Events Library │ \\\\\n// ├────────────────────────────────────────────────────────────┤ \\\\\n// │ Author Dmitry Baranovskiy (http://dmitry.baranovskiy.com/) │ \\\\\n// └────────────────────────────────────────────────────────────┘ \\\\\n\n(function (glob) {\n var version = \"0.5.4\",\n has = \"hasOwnProperty\",\n separator = /[\\.\\/]/,\n comaseparator = /\\s*,\\s*/,\n wildcard = \"*\",\n numsort = function (a, b) {\n return a - b;\n },\n current_event,\n stop,\n events = {n: {}},\n firstDefined = function () {\n for (var i = 0, ii = this.length; i < ii; i++) {\n if (typeof this[i] != \"undefined\") {\n return this[i];\n }\n }\n },\n lastDefined = function () {\n var i = this.length;\n while (--i) {\n if (typeof this[i] != \"undefined\") {\n return this[i];\n }\n }\n },\n objtos = Object.prototype.toString,\n Str = String,\n isArray = Array.isArray || function (ar) {\n return ar instanceof Array || objtos.call(ar) == \"[object Array]\";\n },\n /*\\\n * eve\n [ method ]\n\n * Fires event with given `name`, given scope and other parameters.\n\n - name (string) name of the *event*, dot (`.`) or slash (`/`) separated\n - scope (object) context for the event handlers\n - varargs (...) the rest of arguments will be sent to event handlers\n\n = (object) array of returned values from the listeners. Array has two methods `.firstDefined()` and `.lastDefined()` to get first or last not `undefined` value.\n \\*/\n eve = function (name, scope) {\n var oldstop = stop,\n args = Array.prototype.slice.call(arguments, 2),\n listeners = eve.listeners(name),\n z = 0,\n l,\n indexed = [],\n queue = {},\n out = [],\n ce = current_event;\n out.firstDefined = firstDefined;\n out.lastDefined = lastDefined;\n current_event = name;\n stop = 0;\n for (var i = 0, ii = listeners.length; i < ii; i++) if (\"zIndex\" in listeners[i]) {\n indexed.push(listeners[i].zIndex);\n if (listeners[i].zIndex < 0) {\n queue[listeners[i].zIndex] = listeners[i];\n }\n }\n indexed.sort(numsort);\n while (indexed[z] < 0) {\n l = queue[indexed[z++]];\n out.push(l.apply(scope, args));\n if (stop) {\n stop = oldstop;\n return out;\n }\n }\n for (i = 0; i < ii; i++) {\n l = listeners[i];\n if (\"zIndex\" in l) {\n if (l.zIndex == indexed[z]) {\n out.push(l.apply(scope, args));\n if (stop) {\n break;\n }\n do {\n z++;\n l = queue[indexed[z]];\n l && out.push(l.apply(scope, args));\n if (stop) {\n break;\n }\n } while (l)\n } else {\n queue[l.zIndex] = l;\n }\n } else {\n out.push(l.apply(scope, args));\n if (stop) {\n break;\n }\n }\n }\n stop = oldstop;\n current_event = ce;\n return out;\n };\n // Undocumented. Debug only.\n eve._events = events;\n /*\\\n * eve.listeners\n [ method ]\n\n * Internal method which gives you array of all event handlers that will be triggered by the given `name`.\n\n - name (string) name of the event, dot (`.`) or slash (`/`) separated\n\n = (array) array of event handlers\n \\*/\n eve.listeners = function (name) {\n var names = isArray(name) ? name : name.split(separator),\n e = events,\n item,\n items,\n k,\n i,\n ii,\n j,\n jj,\n nes,\n es = [e],\n out = [];\n for (i = 0, ii = names.length; i < ii; i++) {\n nes = [];\n for (j = 0, jj = es.length; j < jj; j++) {\n e = es[j].n;\n items = [e[names[i]], e[wildcard]];\n k = 2;\n while (k--) {\n item = items[k];\n if (item) {\n nes.push(item);\n out = out.concat(item.f || []);\n }\n }\n }\n es = nes;\n }\n return out;\n };\n /*\\\n * eve.separator\n [ method ]\n\n * If for some reasons you don’t like default separators (`.` or `/`) you can specify yours\n * here. Be aware that if you pass a string longer than one character it will be treated as\n * a list of characters.\n\n - separator (string) new separator. Empty string resets to default: `.` or `/`.\n \\*/\n eve.separator = function (sep) {\n if (sep) {\n sep = Str(sep).replace(/(?=[\\.\\^\\]\\[\\-])/g, \"\\\\\");\n sep = \"[\" + sep + \"]\";\n separator = new RegExp(sep);\n } else {\n separator = /[\\.\\/]/;\n }\n };\n /*\\\n * eve.on\n [ method ]\n **\n * Binds given event handler with a given name. You can use wildcards “`*`” for the names:\n | eve.on(\"*.under.*\", f);\n | eve(\"mouse.under.floor\"); // triggers f\n * Use @eve to trigger the listener.\n **\n - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\n - f (function) event handler function\n **\n - name (array) if you don’t want to use separators, you can use array of strings\n - f (function) event handler function\n **\n = (function) returned function accepts a single numeric parameter that represents z-index of the handler. It is an optional feature and only used when you need to ensure that some subset of handlers will be invoked in a given order, despite of the order of assignment.\n > Example:\n | eve.on(\"mouse\", eatIt)(2);\n | eve.on(\"mouse\", scream);\n | eve.on(\"mouse\", catchIt)(1);\n * This will ensure that `catchIt` function will be called before `eatIt`.\n *\n * If you want to put your handler before non-indexed handlers, specify a negative value.\n * Note: I assume most of the time you don’t need to worry about z-index, but it’s nice to have this feature “just in case”.\n \\*/\n eve.on = function (name, f) {\n if (typeof f != \"function\") {\n return function () {};\n }\n var names = isArray(name) ? isArray(name[0]) ? name : [name] : Str(name).split(comaseparator);\n for (var i = 0, ii = names.length; i < ii; i++) {\n (function (name) {\n var names = isArray(name) ? name : Str(name).split(separator),\n e = events,\n exist;\n for (var i = 0, ii = names.length; i < ii; i++) {\n e = e.n;\n e = e.hasOwnProperty(names[i]) && e[names[i]] || (e[names[i]] = {n: {}});\n }\n e.f = e.f || [];\n for (i = 0, ii = e.f.length; i < ii; i++) if (e.f[i] == f) {\n exist = true;\n break;\n }\n !exist && e.f.push(f);\n }(names[i]));\n }\n return function (zIndex) {\n if (+zIndex == +zIndex) {\n f.zIndex = +zIndex;\n }\n };\n };\n /*\\\n * eve.f\n [ method ]\n **\n * Returns function that will fire given event with optional arguments.\n * Arguments that will be passed to the result function will be also\n * concated to the list of final arguments.\n | el.onclick = eve.f(\"click\", 1, 2);\n | eve.on(\"click\", function (a, b, c) {\n | console.log(a, b, c); // 1, 2, [event object]\n | });\n - event (string) event name\n - varargs (…) and any other arguments\n = (function) possible event handler function\n \\*/\n eve.f = function (event) {\n var attrs = [].slice.call(arguments, 1);\n return function () {\n eve.apply(null, [event, null].concat(attrs).concat([].slice.call(arguments, 0)));\n };\n };\n /*\\\n * eve.stop\n [ method ]\n **\n * Is used inside an event handler to stop the event, preventing any subsequent listeners from firing.\n \\*/\n eve.stop = function () {\n stop = 1;\n };\n /*\\\n * eve.nt\n [ method ]\n **\n * Could be used inside event handler to figure out actual name of the event.\n **\n - subname (string) #optional subname of the event\n **\n = (string) name of the event, if `subname` is not specified\n * or\n = (boolean) `true`, if current event’s name contains `subname`\n \\*/\n eve.nt = function (subname) {\n var cur = isArray(current_event) ? current_event.join(\".\") : current_event;\n if (subname) {\n return new RegExp(\"(?:\\\\.|\\\\/|^)\" + subname + \"(?:\\\\.|\\\\/|$)\").test(cur);\n }\n return cur;\n };\n /*\\\n * eve.nts\n [ method ]\n **\n * Could be used inside event handler to figure out actual name of the event.\n **\n **\n = (array) names of the event\n \\*/\n eve.nts = function () {\n return isArray(current_event) ? current_event : current_event.split(separator);\n };\n /*\\\n * eve.off\n [ method ]\n **\n * Removes given function from the list of event listeners assigned to given name.\n * If no arguments specified all the events will be cleared.\n **\n - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\n - f (function) event handler function\n \\*/\n /*\\\n * eve.unbind\n [ method ]\n **\n * See @eve.off\n \\*/\n eve.off = eve.unbind = function (name, f) {\n if (!name) {\n eve._events = events = {n: {}};\n return;\n }\n var names = isArray(name) ? isArray(name[0]) ? name : [name] : Str(name).split(comaseparator);\n if (names.length > 1) {\n for (var i = 0, ii = names.length; i < ii; i++) {\n eve.off(names[i], f);\n }\n return;\n }\n names = isArray(name) ? name : Str(name).split(separator);\n var e,\n key,\n splice,\n i, ii, j, jj,\n cur = [events],\n inodes = [];\n for (i = 0, ii = names.length; i < ii; i++) {\n for (j = 0; j < cur.length; j += splice.length - 2) {\n splice = [j, 1];\n e = cur[j].n;\n if (names[i] != wildcard) {\n if (e[names[i]]) {\n splice.push(e[names[i]]);\n inodes.unshift({\n n: e,\n name: names[i]\n });\n }\n } else {\n for (key in e) if (e[has](key)) {\n splice.push(e[key]);\n inodes.unshift({\n n: e,\n name: key\n });\n }\n }\n cur.splice.apply(cur, splice);\n }\n }\n for (i = 0, ii = cur.length; i < ii; i++) {\n e = cur[i];\n while (e.n) {\n if (f) {\n if (e.f) {\n for (j = 0, jj = e.f.length; j < jj; j++) if (e.f[j] == f) {\n e.f.splice(j, 1);\n break;\n }\n !e.f.length && delete e.f;\n }\n for (key in e.n) if (e.n[has](key) && e.n[key].f) {\n var funcs = e.n[key].f;\n for (j = 0, jj = funcs.length; j < jj; j++) if (funcs[j] == f) {\n funcs.splice(j, 1);\n break;\n }\n !funcs.length && delete e.n[key].f;\n }\n } else {\n delete e.f;\n for (key in e.n) if (e.n[has](key) && e.n[key].f) {\n delete e.n[key].f;\n }\n }\n e = e.n;\n }\n }\n // prune inner nodes in path\n prune: for (i = 0, ii = inodes.length; i < ii; i++) {\n e = inodes[i];\n for (key in e.n[e.name].f) {\n // not empty (has listeners)\n continue prune;\n }\n for (key in e.n[e.name].n) {\n // not empty (has children)\n continue prune;\n }\n // is empty\n delete e.n[e.name];\n }\n };\n /*\\\n * eve.once\n [ method ]\n **\n * Binds given event handler with a given name to only run once then unbind itself.\n | eve.once(\"login\", f);\n | eve(\"login\"); // triggers f\n | eve(\"login\"); // no listeners\n * Use @eve to trigger the listener.\n **\n - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\n - f (function) event handler function\n **\n = (function) same return function as @eve.on\n \\*/\n eve.once = function (name, f) {\n var f2 = function () {\n eve.off(name, f2);\n return f.apply(this, arguments);\n };\n return eve.on(name, f2);\n };\n /*\\\n * eve.version\n [ property (string) ]\n **\n * Current version of the library.\n \\*/\n eve.version = version;\n eve.toString = function () {\n return \"You are running Eve \" + version;\n };\n glob.eve = eve;\n typeof module != \"undefined\" && module.exports ? module.exports = eve : typeof define === \"function\" && define.amd ? define(\"eve\", [], function () { return eve; }) : glob.eve = eve;\n})(typeof window != \"undefined\" ? window : this);\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _snapsvgImporter = require('../snapsvgImporter');\n\nvar _snapsvgImporter2 = _interopRequireDefault(_snapsvgImporter);\n\nvar _menuFactory = require('../menuFactory');\n\nvar _menuFactory2 = _interopRequireDefault(_menuFactory);\n\nvar styles = {\n svg: {\n lib: _snapsvgImporter2['default'],\n pathInitial: 'M-7.312,0H0c0,0,0,113.839,0,400c0,264.506,0,400,0,400h-7.312V0z',\n pathOpen: 'M-7.312,0H15c0,0,66,113.339,66,399.5C81,664.006,15,800,15,800H-7.312V0z;M-7.312,0H100c0,0,0,113.839,0,400c0,264.506,0,400,0,400H-7.312V0z',\n animate: function animate(path) {\n var pos = 0;\n var steps = this.pathOpen.split(';');\n var stepsTotal = steps.length;\n var mina = window.mina;\n\n var nextStep = function nextStep() {\n if (pos > stepsTotal - 1) return;\n\n path.animate({ path: steps[pos] }, pos === 0 ? 400 : 500, pos === 0 ? mina.easein : mina.elastic, function () {\n nextStep();\n });\n\n pos++;\n };\n\n nextStep();\n }\n },\n\n morphShape: function morphShape(isOpen, width, right) {\n return {\n position: 'absolute',\n width: '100%',\n height: '100%',\n right: right ? 'inherit' : 0,\n left: right ? 0 : 'inherit',\n MozTransform: right ? 'rotateY(180deg)' : 'rotateY(0deg)',\n MsTransform: right ? 'rotateY(180deg)' : 'rotateY(0deg)',\n OTransform: right ? 'rotateY(180deg)' : 'rotateY(0deg)',\n WebkitTransform: right ? 'rotateY(180deg)' : 'rotateY(0deg)',\n transform: right ? 'rotateY(180deg)' : 'rotateY(0deg)'\n };\n },\n\n menuWrap: function menuWrap(isOpen, width, right) {\n return {\n MozTransform: isOpen ? 'translate3d(0, 0, 0)' : right ? 'translate3d(100%, 0, 0)' : 'translate3d(-100%, 0, 0)',\n MsTransform: isOpen ? 'translate3d(0, 0, 0)' : right ? 'translate3d(100%, 0, 0)' : 'translate3d(-100%, 0, 0)',\n OTransform: isOpen ? 'translate3d(0, 0, 0)' : right ? 'translate3d(100%, 0, 0)' : 'translate3d(-100%, 0, 0)',\n WebkitTransform: isOpen ? 'translate3d(0, 0, 0)' : right ? 'translate3d(100%, 0, 0)' : 'translate3d(-100%, 0, 0)',\n transform: isOpen ? 'translate3d(0, 0, 0)' : right ? 'translate3d(100%, 0, 0)' : 'translate3d(-100%, 0, 0)',\n transition: isOpen ? 'transform 0.4s 0s' : 'transform 0.4s'\n };\n },\n\n menu: function menu(isOpen, width, right) {\n width -= 140;\n return {\n position: 'fixed',\n MozTransform: isOpen ? '' : right ? 'translate3d(' + width + ', 0, 0)' : 'translate3d(-' + width + ', 0, 0)',\n MsTransform: isOpen ? '' : right ? 'translate3d(' + width + ', 0, 0)' : 'translate3d(-' + width + ', 0, 0)',\n OTransform: isOpen ? '' : right ? 'translate3d(' + width + ', 0, 0)' : 'translate3d(-' + width + ', 0, 0)',\n WebkitTransform: isOpen ? '' : right ? 'translate3d(' + width + ', 0, 0)' : 'translate3d(-' + width + ', 0, 0)',\n transform: isOpen ? '' : right ? 'translate3d(' + width + ', 0, 0)' : 'translate3d(-' + width + ', 0, 0)',\n transition: isOpen ? 'opacity 0.1s 0.4s cubic-bezier(.17, .67, .1, 1.27), transform 0.1s 0.4s cubic-bezier(.17, .67, .1, 1.27)' : 'opacity 0s 0.3s cubic-bezier(.17, .67, .1, 1.27), transform 0s 0.3s cubic-bezier(.17, .67, .1, 1.27)',\n opacity: isOpen ? 1 : 0\n };\n },\n\n item: function item(isOpen, width, right, nthChild) {\n width -= 140;\n return {\n MozTransform: isOpen ? 'translate3d(0, 0, 0)' : right ? 'translate3d(' + width + ', 0, 0)' : 'translate3d(-' + width + ', 0, 0)',\n MsTransform: isOpen ? 'translate3d(0, 0, 0)' : right ? 'translate3d(' + width + ', 0, 0)' : 'translate3d(-' + width + ', 0, 0)',\n OTransform: isOpen ? 'translate3d(0, 0, 0)' : right ? 'translate3d(' + width + ', 0, 0)' : 'translate3d(-' + width + ', 0, 0)',\n WebkitTransform: isOpen ? 'translate3d(0, 0, 0)' : right ? 'translate3d(' + width + ', 0, 0)' : 'translate3d(-' + width + ', 0, 0)',\n transform: isOpen ? 'translate3d(0, 0, 0)' : right ? 'translate3d(' + width + ', 0, 0)' : 'translate3d(-' + width + ', 0, 0)',\n transition: isOpen ? 'opacity 0.3s 0.4s, transform 0.3s 0.4s' : 'opacity 0s 0.3s cubic-bezier(.17, .67, .1, 1.27), transform 0s 0.3s cubic-bezier(.17, .67, .1, 1.27)',\n opacity: isOpen ? 1 : 0\n };\n },\n\n closeButton: function closeButton(isOpen, width, right) {\n width -= 140;\n return {\n MozTransform: isOpen ? 'translate3d(0, 0, 0)' : right ? 'translate3d(' + width + ', 0, 0)' : 'translate3d(-' + width + ', 0, 0)',\n MsTransform: isOpen ? 'translate3d(0, 0, 0)' : right ? 'translate3d(' + width + ', 0, 0)' : 'translate3d(-' + width + ', 0, 0)',\n OTransform: isOpen ? 'translate3d(0, 0, 0)' : right ? 'translate3d(' + width + ', 0, 0)' : 'translate3d(-' + width + ', 0, 0)',\n WebkitTransform: isOpen ? 'translate3d(0, 0, 0)' : right ? 'translate3d(' + width + ', 0, 0)' : 'translate3d(-' + width + ', 0, 0)',\n transform: isOpen ? 'translate3d(0, 0, 0)' : right ? 'translate3d(' + width + ', 0, 0)' : 'translate3d(-' + width + ', 0, 0)',\n transition: isOpen ? 'opacity 0.3s 0.4s cubic-bezier(.17, .67, .1, 1.27), transform 0.3s 0.4s cubic-bezier(.17, .67, .1, 1.27)' : 'opacity 0s 0.3s cubic-bezier(.17, .67, .1, 1.27), transform 0s 0.3s cubic-bezier(.17, .67, .1, 1.27)',\n opacity: isOpen ? 1 : 0\n };\n }\n};\n\nexports['default'] = (0, _menuFactory2['default'])(styles);\nmodule.exports = exports['default'];","'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _menuFactory = require('../menuFactory');\n\nvar _menuFactory2 = _interopRequireDefault(_menuFactory);\n\nvar styles = {\n pageWrap: function pageWrap(isOpen, width, right) {\n return {\n MozTransform: isOpen ? '' : right ? 'translate3d(-' + width + ', 0, 0)' : 'translate3d(' + width + ', 0, 0)',\n MsTransform: isOpen ? '' : right ? 'translate3d(-' + width + ', 0, 0)' : 'translate3d(' + width + ', 0, 0)',\n OTransform: isOpen ? '' : right ? 'translate3d(-' + width + ', 0, 0)' : 'translate3d(' + width + ', 0, 0)',\n WebkitTransform: isOpen ? '' : right ? 'translate3d(-' + width + ', 0, 0)' : 'translate3d(' + width + ', 0, 0)',\n transform: isOpen ? '' : right ? 'translate3d(-' + width + ', 0, 0)' : 'translate3d(' + width + ', 0, 0)',\n transition: 'all 0.5s'\n };\n },\n\n outerContainer: function outerContainer(isOpen) {\n return {\n overflow: isOpen ? '' : 'hidden'\n };\n }\n};\n\nexports['default'] = (0, _menuFactory2['default'])(styles);\nmodule.exports = exports['default'];","'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _menuFactory = require('../menuFactory');\n\nvar _menuFactory2 = _interopRequireDefault(_menuFactory);\n\nvar styles = {\n pageWrap: function pageWrap(isOpen, width, right) {\n return {\n MozTransform: isOpen ? '' : right ? 'translate3d(-' + width + ', 0, 0) rotateY(15deg)' : 'translate3d(' + width + ', 0, 0) rotateY(-15deg)',\n MsTransform: isOpen ? '' : right ? 'translate3d(-' + width + ', 0, 0) rotateY(15deg)' : 'translate3d(' + width + ', 0, 0) rotateY(-15deg)',\n OTransform: isOpen ? '' : right ? 'translate3d(-' + width + ', 0, 0) rotateY(15deg)' : 'translate3d(' + width + ', 0, 0) rotateY(-15deg)',\n WebkitTransform: isOpen ? '' : right ? 'translate3d(-' + width + ', 0, 0) rotateY(15deg)' : 'translate3d(' + width + ', 0, 0) rotateY(-15deg)',\n transform: isOpen ? '' : right ? 'translate3d(-' + width + ', 0, 0) rotateY(15deg)' : 'translate3d(' + width + ', 0, 0) rotateY(-15deg)',\n transformOrigin: right ? '100% 50%' : '0% 50%',\n transformStyle: 'preserve-3d',\n transition: 'all 0.5s'\n };\n },\n\n outerContainer: function outerContainer(isOpen) {\n return {\n perspective: '1500px',\n overflow: isOpen ? '' : 'hidden'\n };\n }\n};\n\nexports['default'] = (0, _menuFactory2['default'])(styles);\nmodule.exports = exports['default'];","'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _menuFactory = require('../menuFactory');\n\nvar _menuFactory2 = _interopRequireDefault(_menuFactory);\n\nvar styles = {\n pageWrap: function pageWrap(isOpen, width) {\n return {\n MozTransform: isOpen ? '' : 'translate3d(0, 0, -' + width + ')',\n MsTransform: isOpen ? '' : 'translate3d(0, 0, -' + width + ')',\n OTransform: isOpen ? '' : 'translate3d(0, 0, -' + width + ')',\n WebkitTransform: isOpen ? '' : 'translate3d(0, 0, -' + width + ')',\n transform: isOpen ? '' : 'translate3d(0, 0, -' + width + ')',\n transformOrigin: '100%',\n transformStyle: 'preserve-3d',\n transition: 'all 0.5s'\n };\n },\n\n outerContainer: function outerContainer() {\n return {\n perspective: '1500px'\n };\n }\n};\n\nexports['default'] = (0, _menuFactory2['default'])(styles);\nmodule.exports = exports['default'];","'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _menuFactory = require('../menuFactory');\n\nvar _menuFactory2 = _interopRequireDefault(_menuFactory);\n\nvar styles = {\n pageWrap: function pageWrap(isOpen, width, right) {\n return {\n MozTransform: isOpen ? '' : right ? 'translate3d(-100px, 0, -600px) rotateY(20deg)' : 'translate3d(100px, 0, -600px) rotateY(-20deg)',\n MsTransform: isOpen ? '' : right ? 'translate3d(-100px, 0, -600px) rotateY(20deg)' : 'translate3d(100px, 0, -600px) rotateY(-20deg)',\n OTransform: isOpen ? '' : right ? 'translate3d(-100px, 0, -600px) rotateY(20deg)' : 'translate3d(100px, 0, -600px) rotateY(-20deg)',\n WebkitTransform: isOpen ? '' : right ? 'translate3d(-100px, 0, -600px) rotateY(20deg)' : 'translate3d(100px, 0, -600px) rotateY(-20deg)',\n transform: isOpen ? '' : right ? 'translate3d(-100px, 0, -600px) rotateY(20deg)' : 'translate3d(100px, 0, -600px) rotateY(-20deg)',\n transformStyle: 'preserve-3d',\n transition: 'all 0.5s',\n overflow: isOpen ? '' : 'hidden'\n };\n },\n\n outerContainer: function outerContainer(isOpen) {\n return {\n perspective: '1500px',\n overflow: isOpen ? '' : 'hidden'\n };\n }\n};\n\nexports['default'] = (0, _menuFactory2['default'])(styles);\nmodule.exports = exports['default'];","'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _menuFactory = require('../menuFactory');\n\nvar _menuFactory2 = _interopRequireDefault(_menuFactory);\n\nvar styles = {\n menuWrap: function menuWrap(isOpen) {\n return {\n MozTransform: isOpen ? '' : 'translate3d(0, -100%, 0)',\n MsTransform: isOpen ? '' : 'translate3d(0, -100%, 0)',\n OTransform: isOpen ? '' : 'translate3d(0, -100%, 0)',\n WebkitTransform: isOpen ? '' : 'translate3d(0, -100%, 0)',\n transform: isOpen ? '' : 'translate3d(0, -100%, 0)',\n transition: 'all 0.5s ease-in-out'\n };\n },\n\n pageWrap: function pageWrap(isOpen, width, right) {\n return {\n MozTransform: isOpen ? '' : right ? 'translate3d(-' + width + ', 0, 0)' : 'translate3d(' + width + ', 0, 0)',\n MsTransform: isOpen ? '' : right ? 'translate3d(-' + width + ', 0, 0)' : 'translate3d(' + width + ', 0, 0)',\n OTransform: isOpen ? '' : right ? 'translate3d(-' + width + ', 0, 0)' : 'translate3d(' + width + ', 0, 0)',\n WebkitTransform: isOpen ? '' : right ? 'translate3d(-' + width + ', 0, 0)' : 'translate3d(' + width + ', 0, 0)',\n transform: isOpen ? '' : right ? 'translate3d(-' + width + ', 0, 0)' : 'translate3d(' + width + ', 0, 0)',\n transition: 'all 0.5s'\n };\n },\n\n outerContainer: function outerContainer(isOpen) {\n return {\n perspective: '1500px',\n perspectiveOrigin: '0% 50%',\n overflow: isOpen ? '' : 'hidden'\n };\n }\n};\n\nexports['default'] = (0, _menuFactory2['default'])(styles);\nmodule.exports = exports['default'];","'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _menuFactory = require('../menuFactory');\n\nvar _menuFactory2 = _interopRequireDefault(_menuFactory);\n\nvar styles = {\n menuWrap: function menuWrap(isOpen, width, right) {\n return {\n visibility: isOpen ? 'visible' : 'hidden',\n MozTransform: 'translate3d(0, 0, 0)',\n MsTransform: 'translate3d(0, 0, 0)',\n OTransform: 'translate3d(0, 0, 0)',\n WebkitTransform: 'translate3d(0, 0, 0)',\n transform: 'translate3d(0, 0, 0)',\n zIndex: 1000\n };\n },\n\n overlay: function overlay(isOpen, width, right) {\n return {\n zIndex: 1400,\n MozTransform: isOpen ? right ? 'translate3d(-' + width + ', 0, 0)' : 'translate3d(' + width + ', 0, 0)' : 'translate3d(0, 0, 0)',\n MsTransform: isOpen ? right ? 'translate3d(-' + width + ', 0, 0)' : 'translate3d(' + width + ', 0, 0)' : 'translate3d(0, 0, 0)',\n OTransform: isOpen ? right ? 'translate3d(-' + width + ', 0, 0)' : 'translate3d(' + width + ', 0, 0)' : 'translate3d(0, 0, 0)',\n WebkitTransform: isOpen ? right ? 'translate3d(-' + width + ', 0, 0)' : 'translate3d(' + width + ', 0, 0)' : 'translate3d(0, 0, 0)',\n transform: isOpen ? right ? 'translate3d(-' + width + ', 0, 0)' : 'translate3d(' + width + ', 0, 0)' : 'translate3d(0, 0, 0)',\n transition: 'all 0.5s',\n visibility: isOpen ? 'visible' : 'hidden'\n };\n },\n\n pageWrap: function pageWrap(isOpen, width, right) {\n return {\n MozTransform: isOpen ? '' : right ? 'translate3d(-' + width + ', 0, 0)' : 'translate3d(' + width + ', 0, 0)',\n MsTransform: isOpen ? '' : right ? 'translate3d(-' + width + ', 0, 0)' : 'translate3d(' + width + ', 0, 0)',\n OTransform: isOpen ? '' : right ? 'translate3d(-' + width + ', 0, 0)' : 'translate3d(' + width + ', 0, 0)',\n WebkitTransform: isOpen ? '' : right ? 'translate3d(-' + width + ', 0, 0)' : 'translate3d(' + width + ', 0, 0)',\n transform: isOpen ? '' : right ? 'translate3d(-' + width + ', 0, 0)' : 'translate3d(' + width + ', 0, 0)',\n transition: 'all 0.5s',\n zIndex: 1200,\n position: 'relative'\n };\n },\n\n burgerIcon: function burgerIcon(isOpen, width, right) {\n return {\n MozTransform: isOpen ? right ? 'translate3d(' + width + ', 0, 0)' : 'translate3d(-' + width + ', 0, 0)' : 'translate3d(0, 0, 0)',\n MsTransform: isOpen ? right ? 'translate3d(' + width + ', 0, 0)' : 'translate3d(-' + width + ', 0, 0)' : 'translate3d(0, 0, 0)',\n OTransform: isOpen ? right ? 'translate3d(' + width + ', 0, 0)' : 'translate3d(-' + width + ', 0, 0)' : 'translate3d(0, 0, 0)',\n WebkitTransform: isOpen ? right ? 'translate3d(' + width + ', 0, 0)' : 'translate3d(-' + width + ', 0, 0)' : 'translate3d(0, 0, 0)',\n transform: isOpen ? right ? 'translate3d(' + width + ', 0, 0)' : 'translate3d(-' + width + ', 0, 0)' : 'translate3d(0, 0, 0)',\n transition: 'all 0.1s',\n position: 'relative',\n zIndex: 1300\n };\n },\n\n outerContainer: function outerContainer(isOpen) {\n return {\n overflow: isOpen ? '' : 'hidden'\n };\n }\n};\n\nexports['default'] = (0, _menuFactory2['default'])(styles);\nmodule.exports = exports['default'];","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","!function(e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e(null):\"function\"==typeof define&&define.amd?define(e(null)):window.stylis=e(null)}(function e(a){\"use strict\";var r=/^\\0+/g,c=/[\\0\\r\\f]/g,s=/: */g,t=/zoo|gra/,i=/([,: ])(transform)/g,f=/,+\\s*(?![^(]*[)])/g,n=/ +\\s*(?![^(]*[)])/g,l=/ *[\\0] */g,o=/,\\r+?/g,h=/([\\t\\r\\n ])*\\f?&/g,u=/:global\\(((?:[^\\(\\)\\[\\]]*|\\[.*\\]|\\([^\\(\\)]*\\))*)\\)/g,d=/\\W+/g,b=/@(k\\w+)\\s*(\\S*)\\s*/,p=/::(place)/g,k=/:(read-only)/g,g=/\\s+(?=[{\\];=:>])/g,A=/([[}=:>])\\s+/g,C=/(\\{[^{]+?);(?=\\})/g,w=/\\s{2,}/g,v=/([^\\(])(:+) */g,m=/[svh]\\w+-[tblr]{2}/,x=/\\(\\s*(.*)\\s*\\)/g,$=/([\\s\\S]*?);/g,y=/-self|flex-/g,O=/[^]*?(:[rp][el]a[\\w-]+)[^]*/,j=/stretch|:\\s*\\w+\\-(?:conte|avail)/,z=/([^-])(image-set\\()/,N=\"-webkit-\",S=\"-moz-\",F=\"-ms-\",W=59,q=125,B=123,D=40,E=41,G=91,H=93,I=10,J=13,K=9,L=64,M=32,P=38,Q=45,R=95,T=42,U=44,V=58,X=39,Y=34,Z=47,_=62,ee=43,ae=126,re=0,ce=12,se=11,te=107,ie=109,fe=115,ne=112,le=111,oe=105,he=99,ue=100,de=112,be=1,pe=1,ke=0,ge=1,Ae=1,Ce=1,we=0,ve=0,me=0,xe=[],$e=[],ye=0,Oe=null,je=-2,ze=-1,Ne=0,Se=1,Fe=2,We=3,qe=0,Be=1,De=\"\",Ee=\"\",Ge=\"\";function He(e,a,s,t,i){for(var f,n,o=0,h=0,u=0,d=0,g=0,A=0,C=0,w=0,m=0,$=0,y=0,O=0,j=0,z=0,R=0,we=0,$e=0,Oe=0,je=0,ze=s.length,Je=ze-1,Re=\"\",Te=\"\",Ue=\"\",Ve=\"\",Xe=\"\",Ye=\"\";R0)Te=Te.replace(c,\"\");if(Te.trim().length>0){switch(C){case M:case K:case W:case J:case I:break;default:Te+=s.charAt(R)}C=W}}if(1===$e)switch(C){case B:case q:case W:case Y:case X:case D:case E:case U:$e=0;case K:case J:case I:case M:break;default:for($e=0,je=R,g=C,R--,C=W;je0)++R,C=g;case B:je=ze}}switch(C){case B:for(g=(Te=Te.trim()).charCodeAt(0),y=1,je=++R;R0)Te=Te.replace(c,\"\");switch(A=Te.charCodeAt(1)){case ue:case ie:case fe:case Q:f=a;break;default:f=xe}if(je=(Ue=He(a,f,Ue,A,i+1)).length,me>0&&0===je)je=Te.length;if(ye>0)if(f=Ie(xe,Te,Oe),n=Pe(We,Ue,f,a,pe,be,je,A,i,t),Te=f.join(\"\"),void 0!==n)if(0===(je=(Ue=n.trim()).length))A=0,Ue=\"\";if(je>0)switch(A){case fe:Te=Te.replace(x,Me);case ue:case ie:case Q:Ue=Te+\"{\"+Ue+\"}\";break;case te:if(Ue=(Te=Te.replace(b,\"$1 $2\"+(Be>0?De:\"\")))+\"{\"+Ue+\"}\",1===Ae||2===Ae&&Le(\"@\"+Ue,3))Ue=\"@\"+N+Ue+\"@\"+Ue;else Ue=\"@\"+Ue;break;default:if(Ue=Te+Ue,t===de)Ve+=Ue,Ue=\"\"}else Ue=\"\";break;default:Ue=He(a,Ie(a,Te,Oe),Ue,t,i+1)}Xe+=Ue,O=0,$e=0,z=0,we=0,Oe=0,j=0,Te=\"\",Ue=\"\",C=s.charCodeAt(++R);break;case q:case W:if((je=(Te=(we>0?Te.replace(c,\"\"):Te).trim()).length)>1){if(0===z)if((g=Te.charCodeAt(0))===Q||g>96&&g<123)je=(Te=Te.replace(\" \",\":\")).length;if(ye>0)if(void 0!==(n=Pe(Se,Te,a,e,pe,be,Ve.length,t,i,t)))if(0===(je=(Te=n.trim()).length))Te=\"\\0\\0\";switch(g=Te.charCodeAt(0),A=Te.charCodeAt(1),g){case re:break;case L:if(A===oe||A===he){Ye+=Te+s.charAt(R);break}default:if(Te.charCodeAt(je-1)===V)break;Ve+=Ke(Te,g,A,Te.charCodeAt(2))}}O=0,$e=0,z=0,we=0,Oe=0,Te=\"\",C=s.charCodeAt(++R)}}switch(C){case J:case I:if(h+d+u+o+ve===0)switch($){case E:case X:case Y:case L:case ae:case _:case T:case ee:case Z:case Q:case V:case U:case W:case B:case q:break;default:if(z>0)$e=1}if(h===Z)h=0;else if(ge+O===0&&t!==te&&Te.length>0)we=1,Te+=\"\\0\";if(ye*qe>0)Pe(Ne,Te,a,e,pe,be,Ve.length,t,i,t);be=1,pe++;break;case W:case q:if(h+d+u+o===0){be++;break}default:switch(be++,Re=s.charAt(R),C){case K:case M:if(d+o+h===0)switch(w){case U:case V:case K:case M:Re=\"\";break;default:if(C!==M)Re=\" \"}break;case re:Re=\"\\\\0\";break;case ce:Re=\"\\\\f\";break;case se:Re=\"\\\\v\";break;case P:if(d+h+o===0&&ge>0)Oe=1,we=1,Re=\"\\f\"+Re;break;case 108:if(d+h+o+ke===0&&z>0)switch(R-z){case 2:if(w===ne&&s.charCodeAt(R-3)===V)ke=w;case 8:if(m===le)ke=m}break;case V:if(d+h+o===0)z=R;break;case U:if(h+u+d+o===0)we=1,Re+=\"\\r\";break;case Y:case X:if(0===h)d=d===C?0:0===d?C:d;break;case G:if(d+h+u===0)o++;break;case H:if(d+h+u===0)o--;break;case E:if(d+h+o===0)u--;break;case D:if(d+h+o===0){if(0===O)switch(2*w+3*m){case 533:break;default:y=0,O=1}u++}break;case L:if(h+u+d+o+z+j===0)j=1;break;case T:case Z:if(d+o+u>0)break;switch(h){case 0:switch(2*C+3*s.charCodeAt(R+1)){case 235:h=Z;break;case 220:je=R,h=T}break;case T:if(C===Z&&w===T&&je+2!==R){if(33===s.charCodeAt(je+2))Ve+=s.substring(je,R+1);Re=\"\",h=0}}}if(0===h){if(ge+d+o+j===0&&t!==te&&C!==W)switch(C){case U:case ae:case _:case ee:case E:case D:if(0===O){switch(w){case K:case M:case I:case J:Re+=\"\\0\";break;default:Re=\"\\0\"+Re+(C===U?\"\":\"\\0\")}we=1}else switch(C){case D:if(z+7===R&&108===w)z=0;O=++y;break;case E:if(0==(O=--y))we=1,Re+=\"\\0\"}break;case K:case M:switch(w){case re:case B:case q:case W:case U:case ce:case K:case M:case I:case J:break;default:if(0===O)we=1,Re+=\"\\0\"}}if(Te+=Re,C!==M&&C!==K)$=C}}m=w,w=C,R++}if(je=Ve.length,me>0)if(0===je&&0===Xe.length&&0===a[0].length==false)if(t!==ie||1===a.length&&(ge>0?Ee:Ge)===a[0])je=a.join(\",\").length+2;if(je>0){if(f=0===ge&&t!==te?function(e){for(var a,r,s=0,t=e.length,i=Array(t);s1)continue;if(u=n.charCodeAt(n.length-1),d=r.charCodeAt(0),a=\"\",0!==o)switch(u){case T:case ae:case _:case ee:case M:case D:break;default:a=\" \"}switch(d){case P:r=a+Ee;case ae:case _:case ee:case M:case E:case D:break;case G:r=a+r+Ee;break;case V:switch(2*r.charCodeAt(1)+3*r.charCodeAt(2)){case 530:if(Ce>0){r=a+r.substring(8,h-1);break}default:if(o<1||f[o-1].length<1)r=a+Ee+r}break;case U:a=\"\";default:if(h>1&&r.indexOf(\":\")>0)r=a+r.replace(v,\"$1\"+Ee+\"$2\");else r=a+r+Ee}n+=r}i[s]=n.replace(c,\"\").trim()}return i}(a):a,ye>0)if(void 0!==(n=Pe(Fe,Ve,f,e,pe,be,je,t,i,t))&&0===(Ve=n).length)return Ye+Ve+Xe;if(Ve=f.join(\",\")+\"{\"+Ve+\"}\",Ae*ke!=0){if(2===Ae&&!Le(Ve,2))ke=0;switch(ke){case le:Ve=Ve.replace(k,\":\"+S+\"$1\")+Ve;break;case ne:Ve=Ve.replace(p,\"::\"+N+\"input-$1\")+Ve.replace(p,\"::\"+S+\"$1\")+Ve.replace(p,\":\"+F+\"input-$1\")+Ve}ke=0}}return Ye+Ve+Xe}function Ie(e,a,r){var c=a.trim().split(o),s=c,t=c.length,i=e.length;switch(i){case 0:case 1:for(var f=0,n=0===i?\"\":e[0]+\" \";f0&&ge>0)return s.replace(u,\"$1\").replace(h,\"$1\"+Ge);break;default:return e.trim()+s.replace(h,\"$1\"+e.trim())}default:if(r*ge>0&&s.indexOf(\"\\f\")>0)return s.replace(h,(e.charCodeAt(0)===V?\"\":\"$1\")+e.trim())}return e+s}function Ke(e,a,r,c){var l,o=0,h=e+\";\",u=2*a+3*r+4*c;if(944===u)return function(e){var a=e.length,r=e.indexOf(\":\",9)+1,c=e.substring(0,r).trim(),s=e.substring(r,a-1).trim();switch(e.charCodeAt(9)*Be){case 0:break;case Q:if(110!==e.charCodeAt(10))break;default:for(var t=s.split((s=\"\",f)),i=0,r=0,a=t.length;iL&&h<90||h>96&&h<123||h===R||h===Q&&l.charCodeAt(1)!==Q))switch(isNaN(parseFloat(l))+(-1!==l.indexOf(\"(\"))){case 1:switch(l){case\"infinite\":case\"alternate\":case\"backwards\":case\"running\":case\"normal\":case\"forwards\":case\"both\":case\"none\":case\"linear\":case\"ease\":case\"ease-in\":case\"ease-out\":case\"ease-in-out\":case\"paused\":case\"reverse\":case\"alternate-reverse\":case\"inherit\":case\"initial\":case\"unset\":case\"step-start\":case\"step-end\":break;default:l+=De}}o[r++]=l}s+=(0===i?\"\":\",\")+o.join(\" \")}}if(s=c+s+\";\",1===Ae||2===Ae&&Le(s,1))return N+s+s;return s}(h);else if(0===Ae||2===Ae&&!Le(h,1))return h;switch(u){case 1015:return 97===h.charCodeAt(10)?N+h+h:h;case 951:return 116===h.charCodeAt(3)?N+h+h:h;case 963:return 110===h.charCodeAt(5)?N+h+h:h;case 1009:if(100!==h.charCodeAt(4))break;case 969:case 942:return N+h+h;case 978:return N+h+S+h+h;case 1019:case 983:return N+h+S+h+F+h+h;case 883:if(h.charCodeAt(8)===Q)return N+h+h;if(h.indexOf(\"image-set(\",11)>0)return h.replace(z,\"$1\"+N+\"$2\")+h;return h;case 932:if(h.charCodeAt(4)===Q)switch(h.charCodeAt(5)){case 103:return N+\"box-\"+h.replace(\"-grow\",\"\")+N+h+F+h.replace(\"grow\",\"positive\")+h;case 115:return N+h+F+h.replace(\"shrink\",\"negative\")+h;case 98:return N+h+F+h.replace(\"basis\",\"preferred-size\")+h}return N+h+F+h+h;case 964:return N+h+F+\"flex-\"+h+h;case 1023:if(99!==h.charCodeAt(8))break;return l=h.substring(h.indexOf(\":\",15)).replace(\"flex-\",\"\").replace(\"space-between\",\"justify\"),N+\"box-pack\"+l+N+h+F+\"flex-pack\"+l+h;case 1005:return t.test(h)?h.replace(s,\":\"+N)+h.replace(s,\":\"+S)+h:h;case 1e3:switch(o=(l=h.substring(13).trim()).indexOf(\"-\")+1,l.charCodeAt(0)+l.charCodeAt(o)){case 226:l=h.replace(m,\"tb\");break;case 232:l=h.replace(m,\"tb-rl\");break;case 220:l=h.replace(m,\"lr\");break;default:return h}return N+h+F+l+h;case 1017:if(-1===h.indexOf(\"sticky\",9))return h;case 975:switch(o=(h=e).length-10,u=(l=(33===h.charCodeAt(o)?h.substring(0,o):h).substring(e.indexOf(\":\",7)+1).trim()).charCodeAt(0)+(0|l.charCodeAt(7))){case 203:if(l.charCodeAt(8)<111)break;case 115:h=h.replace(l,N+l)+\";\"+h;break;case 207:case 102:h=h.replace(l,N+(u>102?\"inline-\":\"\")+\"box\")+\";\"+h.replace(l,N+l)+\";\"+h.replace(l,F+l+\"box\")+\";\"+h}return h+\";\";case 938:if(h.charCodeAt(5)===Q)switch(h.charCodeAt(6)){case 105:return l=h.replace(\"-items\",\"\"),N+h+N+\"box-\"+l+F+\"flex-\"+l+h;case 115:return N+h+F+\"flex-item-\"+h.replace(y,\"\")+h;default:return N+h+F+\"flex-line-pack\"+h.replace(\"align-content\",\"\").replace(y,\"\")+h}break;case 973:case 989:if(h.charCodeAt(3)!==Q||122===h.charCodeAt(4))break;case 931:case 953:if(true===j.test(e))if(115===(l=e.substring(e.indexOf(\":\")+1)).charCodeAt(0))return Ke(e.replace(\"stretch\",\"fill-available\"),a,r,c).replace(\":fill-available\",\":stretch\");else return h.replace(l,N+l)+h.replace(l,S+l.replace(\"fill-\",\"\"))+h;break;case 962:if(h=N+h+(102===h.charCodeAt(5)?F+h:\"\")+h,r+c===211&&105===h.charCodeAt(13)&&h.indexOf(\"transform\",10)>0)return h.substring(0,h.indexOf(\";\",27)+1).replace(i,\"$1\"+N+\"$2\")+h}return h}function Le(e,a){var r=e.indexOf(1===a?\":\":\"{\"),c=e.substring(0,3!==a?r:10),s=e.substring(r+1,e.length-1);return Oe(2!==a?c:c.replace(O,\"$1\"),s,a)}function Me(e,a){var r=Ke(a,a.charCodeAt(0),a.charCodeAt(1),a.charCodeAt(2));return r!==a+\";\"?r.replace($,\" or ($1)\").substring(4):\"(\"+a+\")\"}function Pe(e,a,r,c,s,t,i,f,n,l){for(var o,h=0,u=a;h0)De=s.replace(d,t===G?\"\":\"-\");if(t=1,1===ge)Ge=s;else Ee=s;var i,f=[Ge];if(ye>0)if(void 0!==(i=Pe(ze,r,f,f,pe,be,0,0,0,0))&&\"string\"==typeof i)r=i;var n=He(xe,f,r,0,0);if(ye>0)if(void 0!==(i=Pe(je,n,f,f,pe,be,n.length,0,0,0))&&\"string\"!=typeof(n=i))t=0;return De=\"\",Ge=\"\",Ee=\"\",ke=0,pe=1,be=1,we*t==0?n:n.replace(c,\"\").replace(g,\"\").replace(A,\"$1\").replace(C,\"$1\").replace(w,\" \")}if(Te.use=function e(a){switch(a){case void 0:case null:ye=$e.length=0;break;default:if(\"function\"==typeof a)$e[ye++]=a;else if(\"object\"==typeof a)for(var r=0,c=a.length;r 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (encode === false) {\n return String(str);\n }\n\n return String(str).replace(/&/g, \"&\").replace(//g, \">\").replace(/\"/g, \""\").replace(/'/g, \"'\");\n};\n\nvar getTitleFromPropsList = function getTitleFromPropsList(propsList) {\n var innermostTitle = getInnermostProperty(propsList, _HelmetConstants.TAG_NAMES.TITLE);\n var innermostTemplate = getInnermostProperty(propsList, _HelmetConstants.HELMET_PROPS.TITLE_TEMPLATE);\n\n if (innermostTemplate && innermostTitle) {\n // use function arg to avoid need to escape $ characters\n return innermostTemplate.replace(/%s/g, function () {\n return innermostTitle;\n });\n }\n\n var innermostDefaultTitle = getInnermostProperty(propsList, _HelmetConstants.HELMET_PROPS.DEFAULT_TITLE);\n\n return innermostTitle || innermostDefaultTitle || undefined;\n};\n\nvar getOnChangeClientState = function getOnChangeClientState(propsList) {\n return getInnermostProperty(propsList, _HelmetConstants.HELMET_PROPS.ON_CHANGE_CLIENT_STATE) || function () {};\n};\n\nvar getAttributesFromPropsList = function getAttributesFromPropsList(tagType, propsList) {\n return propsList.filter(function (props) {\n return typeof props[tagType] !== \"undefined\";\n }).map(function (props) {\n return props[tagType];\n }).reduce(function (tagAttrs, current) {\n return _extends({}, tagAttrs, current);\n }, {});\n};\n\nvar getBaseTagFromPropsList = function getBaseTagFromPropsList(primaryAttributes, propsList) {\n return propsList.filter(function (props) {\n return typeof props[_HelmetConstants.TAG_NAMES.BASE] !== \"undefined\";\n }).map(function (props) {\n return props[_HelmetConstants.TAG_NAMES.BASE];\n }).reverse().reduce(function (innermostBaseTag, tag) {\n if (!innermostBaseTag.length) {\n var keys = Object.keys(tag);\n\n for (var i = 0; i < keys.length; i++) {\n var attributeKey = keys[i];\n var lowerCaseAttributeKey = attributeKey.toLowerCase();\n\n if (primaryAttributes.indexOf(lowerCaseAttributeKey) !== -1 && tag[lowerCaseAttributeKey]) {\n return innermostBaseTag.concat(tag);\n }\n }\n }\n\n return innermostBaseTag;\n }, []);\n};\n\nvar getTagsFromPropsList = function getTagsFromPropsList(tagName, primaryAttributes, propsList) {\n // Calculate list of tags, giving priority innermost component (end of the propslist)\n var approvedSeenTags = {};\n\n return propsList.filter(function (props) {\n if (Array.isArray(props[tagName])) {\n return true;\n }\n if (typeof props[tagName] !== \"undefined\") {\n warn(\"Helmet: \" + tagName + \" should be of type \\\"Array\\\". Instead found type \\\"\" + _typeof(props[tagName]) + \"\\\"\");\n }\n return false;\n }).map(function (props) {\n return props[tagName];\n }).reverse().reduce(function (approvedTags, instanceTags) {\n var instanceSeenTags = {};\n\n instanceTags.filter(function (tag) {\n var primaryAttributeKey = void 0;\n var keys = Object.keys(tag);\n for (var i = 0; i < keys.length; i++) {\n var attributeKey = keys[i];\n var lowerCaseAttributeKey = attributeKey.toLowerCase();\n\n // Special rule with link tags, since rel and href are both primary tags, rel takes priority\n if (primaryAttributes.indexOf(lowerCaseAttributeKey) !== -1 && !(primaryAttributeKey === _HelmetConstants.TAG_PROPERTIES.REL && tag[primaryAttributeKey].toLowerCase() === \"canonical\") && !(lowerCaseAttributeKey === _HelmetConstants.TAG_PROPERTIES.REL && tag[lowerCaseAttributeKey].toLowerCase() === \"stylesheet\")) {\n primaryAttributeKey = lowerCaseAttributeKey;\n }\n // Special case for innerHTML which doesn't work lowercased\n if (primaryAttributes.indexOf(attributeKey) !== -1 && (attributeKey === _HelmetConstants.TAG_PROPERTIES.INNER_HTML || attributeKey === _HelmetConstants.TAG_PROPERTIES.CSS_TEXT || attributeKey === _HelmetConstants.TAG_PROPERTIES.ITEM_PROP)) {\n primaryAttributeKey = attributeKey;\n }\n }\n\n if (!primaryAttributeKey || !tag[primaryAttributeKey]) {\n return false;\n }\n\n var value = tag[primaryAttributeKey].toLowerCase();\n\n if (!approvedSeenTags[primaryAttributeKey]) {\n approvedSeenTags[primaryAttributeKey] = {};\n }\n\n if (!instanceSeenTags[primaryAttributeKey]) {\n instanceSeenTags[primaryAttributeKey] = {};\n }\n\n if (!approvedSeenTags[primaryAttributeKey][value]) {\n instanceSeenTags[primaryAttributeKey][value] = true;\n return true;\n }\n\n return false;\n }).reverse().forEach(function (tag) {\n return approvedTags.push(tag);\n });\n\n // Update seen tags with tags from this instance\n var keys = Object.keys(instanceSeenTags);\n for (var i = 0; i < keys.length; i++) {\n var attributeKey = keys[i];\n var tagUnion = (0, _objectAssign2.default)({}, approvedSeenTags[attributeKey], instanceSeenTags[attributeKey]);\n\n approvedSeenTags[attributeKey] = tagUnion;\n }\n\n return approvedTags;\n }, []).reverse();\n};\n\nvar getInnermostProperty = function getInnermostProperty(propsList, property) {\n for (var i = propsList.length - 1; i >= 0; i--) {\n var props = propsList[i];\n\n if (props.hasOwnProperty(property)) {\n return props[property];\n }\n }\n\n return null;\n};\n\nvar reducePropsToState = function reducePropsToState(propsList) {\n return {\n baseTag: getBaseTagFromPropsList([_HelmetConstants.TAG_PROPERTIES.HREF], propsList),\n bodyAttributes: getAttributesFromPropsList(_HelmetConstants.ATTRIBUTE_NAMES.BODY, propsList),\n defer: getInnermostProperty(propsList, _HelmetConstants.HELMET_PROPS.DEFER),\n encode: getInnermostProperty(propsList, _HelmetConstants.HELMET_PROPS.ENCODE_SPECIAL_CHARACTERS),\n htmlAttributes: getAttributesFromPropsList(_HelmetConstants.ATTRIBUTE_NAMES.HTML, propsList),\n linkTags: getTagsFromPropsList(_HelmetConstants.TAG_NAMES.LINK, [_HelmetConstants.TAG_PROPERTIES.REL, _HelmetConstants.TAG_PROPERTIES.HREF], propsList),\n metaTags: getTagsFromPropsList(_HelmetConstants.TAG_NAMES.META, [_HelmetConstants.TAG_PROPERTIES.NAME, _HelmetConstants.TAG_PROPERTIES.CHARSET, _HelmetConstants.TAG_PROPERTIES.HTTPEQUIV, _HelmetConstants.TAG_PROPERTIES.PROPERTY, _HelmetConstants.TAG_PROPERTIES.ITEM_PROP], propsList),\n noscriptTags: getTagsFromPropsList(_HelmetConstants.TAG_NAMES.NOSCRIPT, [_HelmetConstants.TAG_PROPERTIES.INNER_HTML], propsList),\n onChangeClientState: getOnChangeClientState(propsList),\n scriptTags: getTagsFromPropsList(_HelmetConstants.TAG_NAMES.SCRIPT, [_HelmetConstants.TAG_PROPERTIES.SRC, _HelmetConstants.TAG_PROPERTIES.INNER_HTML], propsList),\n styleTags: getTagsFromPropsList(_HelmetConstants.TAG_NAMES.STYLE, [_HelmetConstants.TAG_PROPERTIES.CSS_TEXT], propsList),\n title: getTitleFromPropsList(propsList),\n titleAttributes: getAttributesFromPropsList(_HelmetConstants.ATTRIBUTE_NAMES.TITLE, propsList)\n };\n};\n\nvar rafPolyfill = function () {\n var clock = Date.now();\n\n return function (callback) {\n var currentTime = Date.now();\n\n if (currentTime - clock > 16) {\n clock = currentTime;\n callback(currentTime);\n } else {\n setTimeout(function () {\n rafPolyfill(callback);\n }, 0);\n }\n };\n}();\n\nvar cafPolyfill = function cafPolyfill(id) {\n return clearTimeout(id);\n};\n\nvar requestAnimationFrame = typeof window !== \"undefined\" ? window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || rafPolyfill : global.requestAnimationFrame || rafPolyfill;\n\nvar cancelAnimationFrame = typeof window !== \"undefined\" ? window.cancelAnimationFrame || window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || cafPolyfill : global.cancelAnimationFrame || cafPolyfill;\n\nvar warn = function warn(msg) {\n return console && typeof console.warn === \"function\" && console.warn(msg);\n};\n\nvar _helmetCallback = null;\n\nvar handleClientStateChange = function handleClientStateChange(newState) {\n if (_helmetCallback) {\n cancelAnimationFrame(_helmetCallback);\n }\n\n if (newState.defer) {\n _helmetCallback = requestAnimationFrame(function () {\n commitTagChanges(newState, function () {\n _helmetCallback = null;\n });\n });\n } else {\n commitTagChanges(newState);\n _helmetCallback = null;\n }\n};\n\nvar commitTagChanges = function commitTagChanges(newState, cb) {\n var baseTag = newState.baseTag,\n bodyAttributes = newState.bodyAttributes,\n htmlAttributes = newState.htmlAttributes,\n linkTags = newState.linkTags,\n metaTags = newState.metaTags,\n noscriptTags = newState.noscriptTags,\n onChangeClientState = newState.onChangeClientState,\n scriptTags = newState.scriptTags,\n styleTags = newState.styleTags,\n title = newState.title,\n titleAttributes = newState.titleAttributes;\n\n updateAttributes(_HelmetConstants.TAG_NAMES.BODY, bodyAttributes);\n updateAttributes(_HelmetConstants.TAG_NAMES.HTML, htmlAttributes);\n\n updateTitle(title, titleAttributes);\n\n var tagUpdates = {\n baseTag: updateTags(_HelmetConstants.TAG_NAMES.BASE, baseTag),\n linkTags: updateTags(_HelmetConstants.TAG_NAMES.LINK, linkTags),\n metaTags: updateTags(_HelmetConstants.TAG_NAMES.META, metaTags),\n noscriptTags: updateTags(_HelmetConstants.TAG_NAMES.NOSCRIPT, noscriptTags),\n scriptTags: updateTags(_HelmetConstants.TAG_NAMES.SCRIPT, scriptTags),\n styleTags: updateTags(_HelmetConstants.TAG_NAMES.STYLE, styleTags)\n };\n\n var addedTags = {};\n var removedTags = {};\n\n Object.keys(tagUpdates).forEach(function (tagType) {\n var _tagUpdates$tagType = tagUpdates[tagType],\n newTags = _tagUpdates$tagType.newTags,\n oldTags = _tagUpdates$tagType.oldTags;\n\n\n if (newTags.length) {\n addedTags[tagType] = newTags;\n }\n if (oldTags.length) {\n removedTags[tagType] = tagUpdates[tagType].oldTags;\n }\n });\n\n cb && cb();\n\n onChangeClientState(newState, addedTags, removedTags);\n};\n\nvar flattenArray = function flattenArray(possibleArray) {\n return Array.isArray(possibleArray) ? possibleArray.join(\"\") : possibleArray;\n};\n\nvar updateTitle = function updateTitle(title, attributes) {\n if (typeof title !== \"undefined\" && document.title !== title) {\n document.title = flattenArray(title);\n }\n\n updateAttributes(_HelmetConstants.TAG_NAMES.TITLE, attributes);\n};\n\nvar updateAttributes = function updateAttributes(tagName, attributes) {\n var elementTag = document.getElementsByTagName(tagName)[0];\n\n if (!elementTag) {\n return;\n }\n\n var helmetAttributeString = elementTag.getAttribute(_HelmetConstants.HELMET_ATTRIBUTE);\n var helmetAttributes = helmetAttributeString ? helmetAttributeString.split(\",\") : [];\n var attributesToRemove = [].concat(helmetAttributes);\n var attributeKeys = Object.keys(attributes);\n\n for (var i = 0; i < attributeKeys.length; i++) {\n var attribute = attributeKeys[i];\n var value = attributes[attribute] || \"\";\n\n if (elementTag.getAttribute(attribute) !== value) {\n elementTag.setAttribute(attribute, value);\n }\n\n if (helmetAttributes.indexOf(attribute) === -1) {\n helmetAttributes.push(attribute);\n }\n\n var indexToSave = attributesToRemove.indexOf(attribute);\n if (indexToSave !== -1) {\n attributesToRemove.splice(indexToSave, 1);\n }\n }\n\n for (var _i = attributesToRemove.length - 1; _i >= 0; _i--) {\n elementTag.removeAttribute(attributesToRemove[_i]);\n }\n\n if (helmetAttributes.length === attributesToRemove.length) {\n elementTag.removeAttribute(_HelmetConstants.HELMET_ATTRIBUTE);\n } else if (elementTag.getAttribute(_HelmetConstants.HELMET_ATTRIBUTE) !== attributeKeys.join(\",\")) {\n elementTag.setAttribute(_HelmetConstants.HELMET_ATTRIBUTE, attributeKeys.join(\",\"));\n }\n};\n\nvar updateTags = function updateTags(type, tags) {\n var headElement = document.head || document.querySelector(_HelmetConstants.TAG_NAMES.HEAD);\n var tagNodes = headElement.querySelectorAll(type + \"[\" + _HelmetConstants.HELMET_ATTRIBUTE + \"]\");\n var oldTags = Array.prototype.slice.call(tagNodes);\n var newTags = [];\n var indexToDelete = void 0;\n\n if (tags && tags.length) {\n tags.forEach(function (tag) {\n var newElement = document.createElement(type);\n\n for (var attribute in tag) {\n if (tag.hasOwnProperty(attribute)) {\n if (attribute === _HelmetConstants.TAG_PROPERTIES.INNER_HTML) {\n newElement.innerHTML = tag.innerHTML;\n } else if (attribute === _HelmetConstants.TAG_PROPERTIES.CSS_TEXT) {\n if (newElement.styleSheet) {\n newElement.styleSheet.cssText = tag.cssText;\n } else {\n newElement.appendChild(document.createTextNode(tag.cssText));\n }\n } else {\n var value = typeof tag[attribute] === \"undefined\" ? \"\" : tag[attribute];\n newElement.setAttribute(attribute, value);\n }\n }\n }\n\n newElement.setAttribute(_HelmetConstants.HELMET_ATTRIBUTE, \"true\");\n\n // Remove a duplicate tag from domTagstoRemove, so it isn't cleared.\n if (oldTags.some(function (existingTag, index) {\n indexToDelete = index;\n return newElement.isEqualNode(existingTag);\n })) {\n oldTags.splice(indexToDelete, 1);\n } else {\n newTags.push(newElement);\n }\n });\n }\n\n oldTags.forEach(function (tag) {\n return tag.parentNode.removeChild(tag);\n });\n newTags.forEach(function (tag) {\n return headElement.appendChild(tag);\n });\n\n return {\n oldTags: oldTags,\n newTags: newTags\n };\n};\n\nvar generateElementAttributesAsString = function generateElementAttributesAsString(attributes) {\n return Object.keys(attributes).reduce(function (str, key) {\n var attr = typeof attributes[key] !== \"undefined\" ? key + \"=\\\"\" + attributes[key] + \"\\\"\" : \"\" + key;\n return str ? str + \" \" + attr : attr;\n }, \"\");\n};\n\nvar generateTitleAsString = function generateTitleAsString(type, title, attributes, encode) {\n var attributeString = generateElementAttributesAsString(attributes);\n var flattenedTitle = flattenArray(title);\n return attributeString ? \"<\" + type + \" \" + _HelmetConstants.HELMET_ATTRIBUTE + \"=\\\"true\\\" \" + attributeString + \">\" + encodeSpecialCharacters(flattenedTitle, encode) + \"\" : \"<\" + type + \" \" + _HelmetConstants.HELMET_ATTRIBUTE + \"=\\\"true\\\">\" + encodeSpecialCharacters(flattenedTitle, encode) + \"\";\n};\n\nvar generateTagsAsString = function generateTagsAsString(type, tags, encode) {\n return tags.reduce(function (str, tag) {\n var attributeHtml = Object.keys(tag).filter(function (attribute) {\n return !(attribute === _HelmetConstants.TAG_PROPERTIES.INNER_HTML || attribute === _HelmetConstants.TAG_PROPERTIES.CSS_TEXT);\n }).reduce(function (string, attribute) {\n var attr = typeof tag[attribute] === \"undefined\" ? attribute : attribute + \"=\\\"\" + encodeSpecialCharacters(tag[attribute], encode) + \"\\\"\";\n return string ? string + \" \" + attr : attr;\n }, \"\");\n\n var tagContent = tag.innerHTML || tag.cssText || \"\";\n\n var isSelfClosing = _HelmetConstants.SELF_CLOSING_TAGS.indexOf(type) === -1;\n\n return str + \"<\" + type + \" \" + _HelmetConstants.HELMET_ATTRIBUTE + \"=\\\"true\\\" \" + attributeHtml + (isSelfClosing ? \"/>\" : \">\" + tagContent + \"\");\n }, \"\");\n};\n\nvar convertElementAttributestoReactProps = function convertElementAttributestoReactProps(attributes) {\n var initProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n return Object.keys(attributes).reduce(function (obj, key) {\n obj[_HelmetConstants.REACT_TAG_MAP[key] || key] = attributes[key];\n return obj;\n }, initProps);\n};\n\nvar convertReactPropstoHtmlAttributes = function convertReactPropstoHtmlAttributes(props) {\n var initAttributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n return Object.keys(props).reduce(function (obj, key) {\n obj[_HelmetConstants.HTML_TAG_MAP[key] || key] = props[key];\n return obj;\n }, initAttributes);\n};\n\nvar generateTitleAsReactComponent = function generateTitleAsReactComponent(type, title, attributes) {\n var _initProps;\n\n // assigning into an array to define toString function on it\n var initProps = (_initProps = {\n key: title\n }, _initProps[_HelmetConstants.HELMET_ATTRIBUTE] = true, _initProps);\n var props = convertElementAttributestoReactProps(attributes, initProps);\n\n return [_react2.default.createElement(_HelmetConstants.TAG_NAMES.TITLE, props, title)];\n};\n\nvar generateTagsAsReactComponent = function generateTagsAsReactComponent(type, tags) {\n return tags.map(function (tag, i) {\n var _mappedTag;\n\n var mappedTag = (_mappedTag = {\n key: i\n }, _mappedTag[_HelmetConstants.HELMET_ATTRIBUTE] = true, _mappedTag);\n\n Object.keys(tag).forEach(function (attribute) {\n var mappedAttribute = _HelmetConstants.REACT_TAG_MAP[attribute] || attribute;\n\n if (mappedAttribute === _HelmetConstants.TAG_PROPERTIES.INNER_HTML || mappedAttribute === _HelmetConstants.TAG_PROPERTIES.CSS_TEXT) {\n var content = tag.innerHTML || tag.cssText;\n mappedTag.dangerouslySetInnerHTML = { __html: content };\n } else {\n mappedTag[mappedAttribute] = tag[attribute];\n }\n });\n\n return _react2.default.createElement(type, mappedTag);\n });\n};\n\nvar getMethodsForTag = function getMethodsForTag(type, tags, encode) {\n switch (type) {\n case _HelmetConstants.TAG_NAMES.TITLE:\n return {\n toComponent: function toComponent() {\n return generateTitleAsReactComponent(type, tags.title, tags.titleAttributes, encode);\n },\n toString: function toString() {\n return generateTitleAsString(type, tags.title, tags.titleAttributes, encode);\n }\n };\n case _HelmetConstants.ATTRIBUTE_NAMES.BODY:\n case _HelmetConstants.ATTRIBUTE_NAMES.HTML:\n return {\n toComponent: function toComponent() {\n return convertElementAttributestoReactProps(tags);\n },\n toString: function toString() {\n return generateElementAttributesAsString(tags);\n }\n };\n default:\n return {\n toComponent: function toComponent() {\n return generateTagsAsReactComponent(type, tags);\n },\n toString: function toString() {\n return generateTagsAsString(type, tags, encode);\n }\n };\n }\n};\n\nvar mapStateOnServer = function mapStateOnServer(_ref) {\n var baseTag = _ref.baseTag,\n bodyAttributes = _ref.bodyAttributes,\n encode = _ref.encode,\n htmlAttributes = _ref.htmlAttributes,\n linkTags = _ref.linkTags,\n metaTags = _ref.metaTags,\n noscriptTags = _ref.noscriptTags,\n scriptTags = _ref.scriptTags,\n styleTags = _ref.styleTags,\n _ref$title = _ref.title,\n title = _ref$title === undefined ? \"\" : _ref$title,\n titleAttributes = _ref.titleAttributes;\n return {\n base: getMethodsForTag(_HelmetConstants.TAG_NAMES.BASE, baseTag, encode),\n bodyAttributes: getMethodsForTag(_HelmetConstants.ATTRIBUTE_NAMES.BODY, bodyAttributes, encode),\n htmlAttributes: getMethodsForTag(_HelmetConstants.ATTRIBUTE_NAMES.HTML, htmlAttributes, encode),\n link: getMethodsForTag(_HelmetConstants.TAG_NAMES.LINK, linkTags, encode),\n meta: getMethodsForTag(_HelmetConstants.TAG_NAMES.META, metaTags, encode),\n noscript: getMethodsForTag(_HelmetConstants.TAG_NAMES.NOSCRIPT, noscriptTags, encode),\n script: getMethodsForTag(_HelmetConstants.TAG_NAMES.SCRIPT, scriptTags, encode),\n style: getMethodsForTag(_HelmetConstants.TAG_NAMES.STYLE, styleTags, encode),\n title: getMethodsForTag(_HelmetConstants.TAG_NAMES.TITLE, { title: title, titleAttributes: titleAttributes }, encode)\n };\n};\n\nexports.convertReactPropstoHtmlAttributes = convertReactPropstoHtmlAttributes;\nexports.handleClientStateChange = handleClientStateChange;\nexports.mapStateOnServer = mapStateOnServer;\nexports.reducePropsToState = reducePropsToState;\nexports.requestAnimationFrame = requestAnimationFrame;\nexports.warn = warn;","function memoize(fn) {\n var cache = {};\n return function (arg) {\n if (cache[arg] === undefined) cache[arg] = fn(arg);\n return cache[arg];\n };\n}\n\nexport default memoize;\n","import memoize from '@emotion/memoize';\n\nvar reactPropsRegex = /^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|default|defer|dir|disabled|download|draggable|encType|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|itemProp|itemScope|itemType|itemID|itemRef|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/; // https://esbench.com/bench/5bfee68a4cd7e6009ef61d23\n\nvar index = memoize(function (prop) {\n return reactPropsRegex.test(prop) || prop.charCodeAt(0) === 111\n /* o */\n && prop.charCodeAt(1) === 110\n /* n */\n && prop.charCodeAt(2) < 91;\n}\n/* Z+1 */\n);\n\nexport default index;\n"],"sourceRoot":""} \ No newline at end of file diff --git a/14-aa326f36fe73015bd5f3.js b/14-aa326f36fe73015bd5f3.js new file mode 100644 index 00000000..cb66b864 --- /dev/null +++ b/14-aa326f36fe73015bd5f3.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{292:function(t,r,e){"use strict";var n=e(0),a={color:void 0,size:void 0,className:void 0,style:void 0,attr:void 0},c=n.createContext&&n.createContext(a),o=function(){return(o=Object.assign||function(t){for(var r,e=1,n=arguments.length;e-1}},236:function(t,n,r){var o=r(179);t.exports=function(t,n){var r=this.__data__,e=o(r,t);return e<0?(++this.size,r.push([t,n])):r[e][1]=n,this}},237:function(t,n,r){var o=r(192)(r(186),"Map");t.exports=o},238:function(t,n,r){var o=r(180);t.exports=function(t){var n=o(this,t).delete(t);return this.size-=n?1:0,n}},239:function(t,n){t.exports=function(t){var n=typeof t;return"string"==n||"number"==n||"symbol"==n||"boolean"==n?"__proto__"!==t:null===t}},240:function(t,n,r){var o=r(180);t.exports=function(t){return o(this,t).get(t)}},241:function(t,n,r){var o=r(180);t.exports=function(t){return o(this,t).has(t)}},242:function(t,n,r){var o=r(180);t.exports=function(t,n){var r=o(this,t),e=r.size;return r.set(t,n),this.size+=r.size==e?0:1,this}},243:function(t,n,r){var o=r(244);t.exports=function(t){return null==t?"":o(t)}},244:function(t,n,r){var o=r(185),e=r(245),i=r(183),u=r(184),c=1/0,a=o?o.prototype:void 0,s=a?a.toString:void 0;t.exports=function t(n){if("string"==typeof n)return n;if(i(n))return e(n,t)+"";if(u(n))return s?s.call(n):"";var r=n+"";return"0"==r&&1/n==-c?"-0":r}},245:function(t,n){t.exports=function(t,n){for(var r=-1,o=null==t?0:t.length,e=Array(o);++r 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","var castPath = require('./_castPath'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","var isArray = require('./isArray'),\n isKey = require('./_isKey'),\n stringToPath = require('./_stringToPath'),\n toString = require('./toString');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n","var isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nmodule.exports = stringToPath;\n","var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nmodule.exports = memoizeCapped;\n","var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n","var mapCacheClear = require('./_mapCacheClear'),\n mapCacheDelete = require('./_mapCacheDelete'),\n mapCacheGet = require('./_mapCacheGet'),\n mapCacheHas = require('./_mapCacheHas'),\n mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n","var Hash = require('./_Hash'),\n ListCache = require('./_ListCache'),\n Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nmodule.exports = mapCacheClear;\n","var hashClear = require('./_hashClear'),\n hashDelete = require('./_hashDelete'),\n hashGet = require('./_hashGet'),\n hashHas = require('./_hashHas'),\n hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n","var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nmodule.exports = hashClear;\n","var isFunction = require('./isFunction'),\n isMasked = require('./_isMasked'),\n isObject = require('./isObject'),\n toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n","var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = hashDelete;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nmodule.exports = hashSet;\n","var listCacheClear = require('./_listCacheClear'),\n listCacheDelete = require('./_listCacheDelete'),\n listCacheGet = require('./_listCacheGet'),\n listCacheHas = require('./_listCacheHas'),\n listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nmodule.exports = listCacheDelete;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nmodule.exports = listCacheSet;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nmodule.exports = isKeyable;\n","var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n","var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nmodule.exports = mapCacheSet;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n"],"sourceRoot":""} \ No newline at end of file diff --git a/2017/04/21/gitlab-perodic-build/index.html b/2017/04/21/gitlab-perodic-build/index.html new file mode 100644 index 00000000..ef816155 --- /dev/null +++ b/2017/04/21/gitlab-perodic-build/index.html @@ -0,0 +1,145 @@ +Periodic builds in GitLab | 040code

Periodic builds in GitLab

Trigger builds based on a crontab

by: niek  on 2017-04-21

I am using GitLab CI now for more than a year and I really love the features in GitLab. GitLab provides a complete and powerful tool for day to day development. And of course, there are always feature that you miss. Until now there is no support for periodic builds, in the coming release the feature will be shipped as experimental feature and in the next one is should be general available. But in case you must deal for some reason with an older version, a work around is described below as I used last year.

+

You could argue why you should need a feature as a periodic build. Ideally a build should be immutable and only trigger by a change in GIT, a commit. But the world is not always perfect, project build are sometime not of the quality that you are expect or tools are not that reliable as you hope. For example, dependencies resolving could break over the time, to avoid you find the problem once your boss is watching you when fixing a critical bug, a periodic build can alert you earlier. Another and much better reason to argue for the feature is that the GitLab build are so powerful that is handy to use them for a scenario based health check.

+

The build trigger

+

To setup a periodic build you first need to be able to trigger a build in some way. GitLab provides an API to trigger a build. Setting up the trigger is simple and complete guided in GitLab, just execute the steps below:

+
    +
  • Go to your GitLab projects
  • +
  • Navigate to Settings -> CI/CD Pipelines
  • +
  • Scroll down to the trigger section and create a trigger
  • +
  • Make a note of the TOKEN and trigger URL. An curl example for trigger is shown as well.
  • +
+ + + + + + + GitLab trigger + + + +

Next we test that we are able to trigger the build remotely be executing the curl command below.

+
curl -X POST \
+     -F token=<TOKEN> \
+     -F ref=<REF_NAME> \
+     <URL>
+

Verify in GitLab the build is triggered

+

Periodic trigger the build in a Docker container

+

The next step is to execute the trigger periodic. A standard way of running a job periodic is by defining crontab. We will use a docker container to execute the crontab so we can deploy it anywhere.

+

I have createe a base docker image containing a script to trigger GitLab by executing a curl command as shown above. The crontab will be copied to the image ONBUILD. In the crontab we point to the script that can be executed as follow:

+
trigger-gitlab.sh -t <token> -r <ref> -u <gitlab_trigger_url>
+

For the sources see npalm/gitlab-periodic-trigger on GitHub.

+

Now all peace’s are ready we only have to build our docker image and run it to trigger the build. First, we create a Dockerfile and only extend the base image npalm/gitlab-periodic-trigger. Create a new directory, and add a Dockerfile with only the line:

+
FROM npalm/gitlab-periodic-trigger:1.0.0
+

This image expects a file gitlabcrontab containing the crontab and will copy it to the image once build. Create a file named gitlabcrontab, and add one ore more triggers, an example is below.

+
# Example of job definition:
+# .---------------- minute (0 - 59)
+# |  .------------- hour (0 - 23)
+# |  |  .---------- day of month (1 - 31)
+# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
+# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7)
+# |  |  |  |  |
+22 11 * * * trigger-gitlab.sh -t <token> -r <ref> -u <gitlab_trigger_url>
+

Now we build the container docker build -t periodic-trigger . and finally start the container docker run -d periodic-trigger

+

To enable the feature for your teams you could set up a build to build the docker image as described below and push it automated to an environment.

\ No newline at end of file diff --git a/2017/05/07/docker-multi-stage-builds/index.html b/2017/05/07/docker-multi-stage-builds/index.html new file mode 100644 index 00000000..4a526396 --- /dev/null +++ b/2017/05/07/docker-multi-stage-builds/index.html @@ -0,0 +1,162 @@ +Docker Multi Stage Builds | 040code

Docker Multi Stage Builds

Building and shipping in one Docker build

by: niek  on 2017-05-07

The problem

+

Building an application requires typically multiple steps. First compiling the application, next testing it and finally shipping the artifact in a Docker image for execution. All these steps can be combined in one Dockerfile, but typically you end up with a Docker image that contains all kinds of tools that are not necessary for running the application.

+

We could try to get rid of all unneeded files in the image after build, but a more useful approach is to separate Docker images for building and running the application. However, this approach requires two separate Dockerfiles that needs to be maintained.

+

Let’s have a look on a example for a simple Java micro service. The micro services require the JDK and Gradle to build. The JDK needs to be installed before the build and Gradle will be download by the build itself. We can build the micro service in the following way.

+
git clone https://github.com/040code/blog_docker-mulit-stage-build.git
+cd notes-service
+docker run -it --rm -v $(pwd):/build -w /build openjdk:8u121-jdk-alpine ./gradlew build
+

Now the artifact is available, we can create a Docker runtime image. The application only needs the Java Runtime (JRE) to run. We create a Dockerfile based JRE alpine image and add our application.

+
# file: Dockerfile (git checkout step-00)
+FROM openjdk:8u121-jre-alpine
+COPY build/libs/notes-service.jar /app/notes-service.jar
+
+EXPOSE 8080
+CMD java -jar /app/notes-service.jar
+

Next, we build the production image as follows:

+
docker build -t notes-service:00 .
+

Now we have created a clean Docker images that only containes the needed libraries to run the application. But would it not be nice if we can do this more straightforward? For example, in one Docker build.

+

Moving on to a multi stage build

+

Docker 17.05.x brings a new feature; it is now possible to define a multi stage builds in one Dockerfile. The Dockerfile can contain multiple FROM lines and each stage starts with a new FROM line and a fresh context. You can copy artifacts from stage to stage.

+ + + + + + + docker-multi-stages-build + + + +

Now it is time to have a second look on the same example. Instead of passing the build arguments and mounting our sources, we will build our software using a single Dockerfile.

+
# file: Dockerfile (git checkout step-01)
+FROM openjdk:8u121-jdk-alpine AS build
+
+WORKDIR /build-env
+ADD . /build-env
+RUN ./gradlew build
+
+CMD java -jar /build-env/build/notes-service.jar
+

And build it:

+
docker build -t notes-service:01 .
+

Nothing new here, we are now able to build our software in a container and ship an image, but the image contains all kinds of build stuff that we do not want in a runtime image. So, the next step is to solve this problem by getting rid of all the unwanted build tools.

+

We update the Dockerfile and make a few modifications.

+
# file: Dockerfile (git checkout step-02)
+FROM openjdk:8u121-jdk-alpine AS build                                               # (1)
+
+WORKDIR /build-env
+ADD . /build-env
+RUN ./gradlew build
+
+FROM openjdk:8u121-jre-alpine                                                        # (2)
+COPY --from=build /build-env/build/libs/notes-service.jar /app/notes-service.jar     # (3)
+
+EXPOSE 8080
+CMD java -jar /app/notes-service.jar
+

In the Dockerfile above we marked the first stage (1) as build to refer later, if not specifying a name you can refer to the stage as 0. Next (2), we add the second stage which specifies the base image that we need to run our application. Finally (3), we copy the results from the build stage to the image for executing.

+
docker build -t notes-service:02 .
+

And now we can run via the following docker run command.

+
docker run -it --rm -p 8080 notes-service:2
+

Inspection of the tree images build will show that version 0 and 2 are equal in size, version 1 that contains all the build files and the JDK is almost three times bigger.

+

Conclusion

+

Docker’s new multi layer build feature can be quite useful when build pipeline without parallel builds will suite your needs. In that case, you can reduce your build to a single image. For projects that requires a more complex multi stage build, including parallel builds, this new Docker feature will not provide an added value.

\ No newline at end of file diff --git a/2017/05/20/graphql/index.html b/2017/05/20/graphql/index.html new file mode 100644 index 00000000..4a510118 --- /dev/null +++ b/2017/05/20/graphql/index.html @@ -0,0 +1,141 @@ +GraphQL | 040code

GraphQL

Nextbuild talk - The Next API Language

by: niek  on 2017-05-20

A short post to share the slides and examples I used in my talk at the Nextbuild conference on May the 20th in Eindhoven.

+

Slides

+

Below the slides that I for the talk, the slides are available as well on GitHub. You can easy navigate through the slides with the spacebar.

+
+ +
+

To get started with GraphQL the best starting points are:

+ +

Examples

+

During the talk, I demonstrated GraphQL via graphcool, which is cloud service for creating a flexible GraphGL backend. I modelled a basic model of a Talk and Person with relation speakers and visitors on graphcool. Furthermore, I modelled two basic sample implementations of a GraphQL backend in Java and JavaScript that are available via GitHub. Those implementation are more limited than the online one, but both serve the following minimal queries.

+

Query for the name and the title of the talks given by all persons:

+
{
+  persons {
+    name
+    talks {
+      title
+    }
+  }
+}
+

And secondly, a query for all titles of talks with their speaker’s names.

+
{
+  talks {
+    title
+    speakers {
+      name
+    }
+  }
+}
+

JavaScript sample

+

The JavaScript sample is based on Apollo GraphQL tutorial kit.

+
git clone https://github.com/npalm/graphql-js-demo.git
+cd graphql-js-demo
+yarn && yarn start
+

Instead of yarn, you can use npm install && npm start. Once started, browse to http://localhost:8080/graphiql and play around with the GraphQL web interface. Implementing the JavaScript version was straightforward due to the many examples and good tutorials around.

+

Spring Boot Java sample

+

The Spring Boot Java sample is based on the Spring Boot Starter available for GraphQL. This starter uses a basic GraphQL java library as well the Java annotation library for GraphQL.

+
git clone https://github.com/npalm/graphql-java-demo.git
+git checkout nextbuild
+cd graphql-java-demo
+docker build -t graphql-java-demo && docker run -it --rm -p 8080:8080 graphql-java-demo
+

Alternatively, you can build and run via gradle. Once started, browse to http://localhost:8080/ to play around with the GraphQL web interface. The Java version implementation was not as easy as expected. The GraphQL Spring Boot starter dependencies requires the GrahpQL java annotation library, which seems to be broken after an update in the Java GraphQL base library. I am not sure if the annotation library is still supported. To get the GraphQL Spring Boot library working I have to add a mandatory mutation to the scheme. And downgrade the Java GraphQL, see gradle/depedencies.gradle to get the annotation library to work.

+

Many languages already have support, so feel free to try out your favourite language. Currently the support on JavaScript looks like by far the best.

+

Updates

+

Refactored Java implementation (June 20, 2017)

+

I have updated the Spring Boot implmentation, upgrade all libraries and removed the annotations for graphql resolving. The annoation are replaced java-graphql-tools. Which looks a better way to ingrate graphql in a Java service. You will see the implementation will have a lot of similarities with the javascript one.

+

Developers.nl meetup Rotterdam (June 28, 2017)

+

On June, the 28th I have presented the GraphQL talk at the developers.nl Meetup in Rotterdom. I have used a slightly minimal version for the slides, which can be found here. Comparing the to the presentaton on the nextbuild I have also walked through the code examples mentioned above.

\ No newline at end of file diff --git a/2017/06/18/coding-a-vpc-in-terraform/index.html b/2017/06/18/coding-a-vpc-in-terraform/index.html new file mode 100644 index 00000000..29411095 --- /dev/null +++ b/2017/06/18/coding-a-vpc-in-terraform/index.html @@ -0,0 +1,264 @@ +Coding a VPC in Terraform | 040code

Coding a VPC in Terraform

A terraform module for a VPC with Private Subnets

by: niek  on 2017-06-18

One of the common uses network setups in AWS is called Scenario 2: VPC with Public and Private Subnets. This is a that defines a Virtual Private Cloud (VPC), public subnets and private subnets. Setting up this infrastructure can be done via the AWS console or via cloud formation scripting. However, I prefer the tool Terraform in which you can manage your infrastructure as code with a declarative language that supports building, changing and versioning your cloud in a modular way.

+

In this article I will describe how you can create a VPC with a public and private subnet on AWS using terraform. I will describe the setup step by step and I will show how to encapsulate all logic to one re-usable module.

+
+

Why we need subnets. When you create a VPC, it spans all the Availability Zones in the region. After creating a VPC, you can add one or more subnets in each Availability Zone. When you create a subnet, you specify the CIDR block for the subnet, which is a subset of the VPC CIDR block. Each subnet must reside entirely within one Availability Zone and cannot span zones. Availability Zones are distinct locations that are engineered to be isolated from failures in other Availability Zones. By launching instances in separate Availability Zones, you can protect your applications from the failure of a single location.

+
+

Before you can start, you need an AWS account with sufficient rights (admin), and you should create a AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY to be able to access your account programmatically.

+

Setting up your system.

+

The easiest way to use terraform is via docker. In that case you do not need any locally isntalled tools. We simply create a file called .aws where we put the AWS key and secret to athentication API calls, as shown below:

+
AWS_ACCESS_KEY_ID=<KEY>
+AWS_SECRET_ACCESS_KEY=<SECRET>
+

Creating a VPC part 1

+

All code for part 1 is available on github

+

By default, terraform expects the configuration in a file called main.tf. Create the file and add the terraform provide for Amazon:

+
# main.tf
+provider "aws" {
+  region = "eu-west-1"
+}
+

We are now ready to, step-by-step, add the terraform resources to create the VPC setup. First, have a look on the VPC setup as shown in the picture below. + + + + + + + nat-gateway-diagram + + +

+

We will start by creating the VPC itself: add the following snippet to your main.tf

+
resource "aws_vpc" "vpc" {
+  cidr_block           = "10.0.0.0/16"
+  enable_dns_support   = true
+  enable_dns_hostnames = true
+
+  tags {
+    label = "blog"
+  }
+}
+

Before we make the change effective we run a terraform plan to inspect the planned changes. You can install terraform locally or run the commands in a docker container. The docker command will export the AWS credentials to the container, mount the current directory to /data in the container, and set /data as working directory to ensure the container will execute the terraform plan command on the directory that contains the terraform files.

+
docker run -it --env-file ./.aws  -v $(pwd):/data -w /data \
+  hashicorp/terraform:0.9.8 plan
+

After executing the plan command, you should see output similar to:

+
+ aws_vpc.vpc
+    assign_generated_ipv6_cidr_block: "false"
+    cidr_block:                       "10.0.0.0/16"
+    default_network_acl_id:           "<computed>"
+    default_route_table_id:           "<computed>"
+    default_security_group_id:        "<computed>"
+    dhcp_options_id:                  "<computed>"
+    enable_classiclink:               "<computed>"
+    enable_dns_hostnames:             "true"
+    enable_dns_support:               "true"
+    instance_tenancy:                 "<computed>"
+    ipv6_association_id:              "<computed>"
+    ipv6_cidr_block:                  "<computed>"
+    main_route_table_id:              "<computed>"
+    tags.%:                           "1"
+    tags.label:                       "blog"
+
+
+Plan: 1 to add, 0 to change, 0 to destroy.
+

This looks correct, so we can apply the change to create the VPC by running terraform apply.

+
docker run -it --env-file ./.aws  -v $(pwd):/data -w /data \
+  hashicorp/terraform:0.9.8 apply
+

You can go VPC via the AWS console, where you should now see a VPC in the list named blog. Now we have the VPC, we create a public and private subnet by adding the following to the main.tf.

+
resource "aws_subnet" "public_subnet_a" {
+  vpc_id                  = "${aws_vpc.vpc.id}"
+  cidr_block              = "10.0.0.0/24"
+  availability_zone       = "eu-west-1a"
+  map_public_ip_on_launch = false
+
+  tags {
+    Name = "blog"
+  }
+}
+
+resource "aws_subnet" "private_subnet_a" {
+  vpc_id                  = "${aws_vpc.vpc.id}"
+  cidr_block              = "10.0.1.0/24"
+  availability_zone       = "eu-west-1a"
+
+  tags {
+    Name = "blog"
+  }
+}
+

Run now terraform plan again, it will show that the resources will be added, one for each subnet. Apply the change using terraform apply and inspect your changes again via the VPC section in the AWS console.

+

Next, we connect the public subnet via an internet gateway. Create a routing table and an internet gateway. And a awsroutetable_association to create an association between a subnet and routing table. Update your main.tf with the snippet below, and run a plan and apply.

+
resource "aws_internet_gateway" "internet_gateway" {
+  vpc_id = "${aws_vpc.vpc.id}"
+}
+
+resource "aws_route_table" "public_routetable" {
+  vpc_id = "${aws_vpc.vpc.id}"
+
+  route {
+    cidr_block = "0.0.0.0/0"
+    gateway_id = "${aws_internet_gateway.internet_gateway.id}"
+  }
+
+  tags {
+    label = "blog"
+  }
+}
+
+resource "aws_route_table_association" "public_subnet_a" {
+  subnet_id      = "${aws_subnet.public_subnet_a.id}"
+  route_table_id = "${aws_route_table.public_routetable.id}"
+}
+

We are now able to deploy an application to the public subnet and make it accessible via a security group. However, it is not yet possible to route traffic to the private subnet or let instances on the private subnet connect to internet. To do so, we add a NAT gateway and connect the gateway via a route table to the private subnet. The NAT gateway requires an elastic IP, which we will create first. Add the next terraform snippet to your main.tf and run a plan and apply to inspect and make the changes effective.

+
resource "aws_eip" "nat" {
+  vpc = true
+}
+
+resource "aws_nat_gateway" "nat" {
+  allocation_id = "${aws_eip.nat.id}"
+  subnet_id     = "${aws_subnet.public_subnet_a.id}"
+}
+
+resource "aws_route_table" "private_routetable" {
+  vpc_id = "${aws_vpc.vpc.id}"
+
+  route {
+    cidr_block     = "0.0.0.0/0"
+    nat_gateway_id = "${aws_nat_gateway.nat.id}"
+  }
+
+  tags {
+    label = "blog"
+  }
+}
+
+resource "aws_route_table_association" "private_subnet_a" {
+  subnet_id      = "${aws_subnet.private_subnet_a.id}"
+  route_table_id = "${aws_route_table.private_routetable.id}"
+}
+

Setting up the VPC with subnets is quite verbose, and imagine then when you must support more availability zones, the code will almost double per zone. So we refactor it to a generic module to support the multiple subnets that are available in a zone.

+

Creating a VPC part 2

+

I have rewritten the code showed above to a generic module. With this model, it is easy to create a VPC with all availability zones per zone, and private subnets can be enabled on demand.

+
+

Modules in terraform are self-contained packages of gerraform configurations that are managed as a group. Modules are used to create reusable components, improve organization, and to treat pieces of infrastructure as a black box.

+
+

I will not describe all code in the module again but only will pay attention to the significant changes I made. In the code above the zone, availability zone where hard coded. This will not work in a generic module. A common way to solve this in terraform is by creating a map where a zone is mapped to a list of availability zondes. By passing the zone to the moudle, the module can find out which availability zones there are. A default map is available in the module but can be ovewritten as follow:

+
availability_zones = {
+  eu-west-1 = ["eu-west-1a", "eu-west-1b", "eu-west-1c"]
+}
+

The cdir block in the code show above was hard coded, but terraform contains a function to calculate the cdir block. In the module I use the terraform function cidrsubnet() to calculate the cdir block.

+

Now only one problem needs to be solved in order to create a generic module: how can we create a AWS resource for each element in a list? Do we create subnet or route table association for each availability zone? Or how can we avoid creating a private subnet at all? The solution is to use the count variable in a module to iterate over the list of availability zones, which is available on my github. We can now create a VPC similar to the one above with just a few line of code. Add the following lines to your terraform script to create a VPC.

+
module "vpc" {
+  source = "git::https://github.com/npalm/tf-aws-vpc.git"
+
+  key        = "blog"
+  aws_region = "eu-west-1"
+}
+

It is possible to overwrite module variables with default to get more control, see the ezample below:

+
module "vpc" {
+  source = "git::https://github.com/npalm/tf-aws-vpc.git"
+
+  key        = "blog"
+  aws_region = "eu-west-1"
+
+  create_private_hosted_zone = "false"
+  create_private_subnets     = "false"
+  cidr_block = "10.0.0.0/16"
+
+  // example to override default availability_zones
+  availability_zones = {
+    eu-west-1 = ["eu-west-1a", "eu-west-1c"]
+  }
+}
\ No newline at end of file diff --git a/2017/07/01/visualising-bezier-curves/index.html b/2017/07/01/visualising-bezier-curves/index.html new file mode 100644 index 00000000..dcf596c0 --- /dev/null +++ b/2017/07/01/visualising-bezier-curves/index.html @@ -0,0 +1,293 @@ +Visualising Bézier Curves | 040code

Visualising Bézier Curves

Experimenting with Clojure

by: maarten  on 2017-07-01

For reasons I might explain in another post, I was reading about Bézier curves on wikipedia the other day. Especially the paragraph on “Constructing Bézier curves” made me understand intuitively how these curves are constructed. I wondered if clojure could help me easily visualise some of these curves so I fired up a REPL (Read-Eval-Print-Loop) to investigate.

+

Setup

+

I assume you have a working leiningen setup with the lein-try plugin installed.

+
    +
  • Leiningen will help you get started with clojure right away from your shell
  • +
  • Lein-try enables you to spin up a repl and try a library without any hassle.
  • +
+

Let’s first start a repl, and specify the library we want to try:

+
lein try incanter "1.5.7"
+

Incanter is a clojure-based, R-like platform for statistical computing and graphics. We’ll use it to visualise the Bézier curves.

+

Since the repl is already fired up, let’s immediately require the dependencies we’ll need:

+
(require '[incanter.core   :as incanter])
+(require '[incanter.charts :as charts])
+

Nothing fancy going on here. Simply ‘import’ statements the clojure way.

+

Helper function

+

I decided to hand-roll my own pow function, because we’ll need it later in the creation of bézier curves:

+
(defn pow [base exponent]
+  (reduce *' (repeat exponent base)))
+

This function basically says:

+
    +
  • define a function named pow
  • +
  • let base and exponent be its arguments
  • +
  • make it repeat the base exponent times
  • +
  • and reduce that result with the *' multiply function
  • +
+
;; so:
+(pow 2 3)
+;; will lead to
+(reduce *' [2 2 2])
+;; which results in
+8
+

I’m using the *' multiply function instead of the normal * multiply function, because according to the docs *' supports arbitrary precision. You can see for yourself by typing (doc *') in your repl, or study the code by typing (source *') in your repl.

+

Bézier

+

Bézier functions work with control points. The minimum number of control points is 2 and Bézier curves with 2 control points are straight lines (although you can also create straight lines with more than 2 control points).

+

For the moment I only need Bézier curves with 3 control points: a start point, an end point and one point controlling the curve of the line between start and end.

+

Quoting the Wikipedia page: “A quadratic Bézier curve is the path traced by the function B(t), given points P0, P1, and P2”:

+ + + + + + + bezier-formula + + + +

So given 3 points (P0, P1 and P2) I should be able to describe the curve with this math function. Conceptually a pen is drawing the curve by starting on P0 on moment t = 0 and following the curve described by this formula and the position of the 3 points until it hits the end point at t = 1. The only thing this resulting B(t) function needs is the moment t and it will calculate the X or Y coördinate at that particular moment.

+

Let’s convert the math function to clojure:

+
(defn bezier-3 [P0 P1 P2]
+  (fn [t]
+    (+
+      (* (pow (- 1 t) 2) P0)
+      (* 2 (- 1 t) t     P1)
+      (* (pow t 2)       P2))))
+

As you can see, you’ll have to translate the infix notation to clojure’s prefix notation. The advantage is there are no precedence rules to remember anymore. These are all just lists where the first element of the list is interpreted as a function to call and the brackets are used to put them into context. (If you can’t live with that: you can also use infix notation in clojure. For instance incanter can also be fed with infix notation. However, you’ll lose [the power of the 𝝺](https://en.wikipedia.org/wiki/Lambdacalculus))_

+

This function basically states:

+
    +
  • define a function named bezier-3
  • +
  • let it have 3 arguments: P0, P1 and P2
  • +
  • make it return an anonymous function
  • +
+

This anonymous function:

+
    +
  • takes t as an argument
  • +
  • has P0, P1 and P2 already ‘injected’
  • +
  • applies the Bézier math function
  • +
+

Excellent. Let’s try it:

+
(def test-b3 (bezier-3 1 1 0))
+
+(test-b3 0)
+=> 1
+

Here I’m defining a variable test-b3 which holds the anonymous function returned by the bezier-3 function call. The 3 points are either all x or all y coordinates of the points P0, P1 and P2.

+

With the (test-b3 0) function call I’m calling the anonymous function with a t value of 0. This nicely returns an answer representing the x coordinates at moment t if you provided the (P0, P1 and P2) x coordinates when calling the bezier-3 function or the y coordinate at moment t if you provided the (P0, P1 and P2) y coordinates.

+

Since this test didn’t blow the stack or throw a NullPointerException or anything, let’s map this function over a range of t’s [0 0.25 0.5 0.75 1]:

+
(map test-b3 [0 0.25 0.5 0.75 1])
+=> (1 0.9375 0.75 0.4375 0)
+

Instead of typing these t’s to map over, we could also use the range function:

+
(range 0 10)
+=> (0 1 2 3 4 5 6 7 8 9)
+
+(range 0 10 2)
+=> (0 2 4 6 8)
+

As you can see, range allows you to specify a start (inclusive), an end (exclusive) and a step size (optional).

+
(map test-b3 (range 0 1 0.1))
+=> (1 0.9900000000000001 0.9600000000000002 0.9099999999999999 0.84 0.75 0.64 0.51 0.3600000000000001 0.19000000000000014 2.220446049250313E-16)
+

Although a certain pattern is already visible in these numbers, now might be the right time to start visualising the curves.

+

Visualise

+

Let’s be brave and go right to the essence:

+
(defn view-bezier-plot [[x1 y1] [x2 y2] [x3 y3] plot-title]
+  (let [b3x         (bezier-3 x1 x2 x3)
+        xs          (map b3x (range 0 1.0 0.01))
+        b3y         (bezier-3 y1 y2 y3)
+        ys          (map b3y (range 0 1.0 0.01))
+        dataset     (incanter/conj-cols xs ys)
+        xy-plot     (charts/xy-plot "col-0" "col-1" :data dataset :points true :title plot-title)]
+    (incanter/view xy-plot)))
+

The let form is clojure’s way of defining local variables. So b3x, xs, b3y, etc. can be seen as local variables with their values specified in the functions directly after their declaration.

+

This function basically states:

+
    +
  • define a function named view-bezier-plot
  • +
  • let it have 3 arguments which are destructured into their 2D x & y coordinates
  • +
  • let the fourth argument be the title of the plot
  • +
  • +

    let it have some local variables:

    +
      +
    • b3x takes all x coordinates of the 3 points
    • +
    • b3y takes the y coordinates
    • +
    • xs are the all x values resulting from applying the b3x anonymous function with all the range values
    • +
    • ys are the all y values resulting from applying the b3y anonymous function with all the range values
    • +
    • incanter can work with columns similarly to spreadsheets. dataset is an incanter dataset where 2 columns are ‘brought together’, or in lisp terms conj[oined]. By default, these columns are called col-0, col-1, … , col-n
    • +
    • xy-plot contains an incanter chart where dataset provides the data, the x-axis - and y-axis values are found in columns col-0 and col-1 respectively and viewing the points is set to true
    • +
    +
  • +
  • and make it return an xy-plot
  • +
+

I love it when a plan comes together

+
(view-bezier-plot [0 0] [1 0] [1 1] "increasing ascending")
+
+(view-bezier-plot [0 0] [0 -1] [1 1] "swoosh")
+
+(view-bezier-plot [-2 4] [0 -4] [2 4] "y = x^2 ?")
+
+(view-bezier-plot [-1 0] [0 0] [1 0] "my pulse after a useless meeting")
+ + + + + + + incanter-plots + + + +

The generated charts will be opened in external java windows. Sometimes they stay hidden behind other windows on your screen, so you might have to bring your java windows to the foreground in order to see them.

+

Conclusion

+

In a relatively short repl session I was able to get a better understanding of (3 point) Bézier curves. Although the blogpost is long, not much code or time was needed to create the curves:

+
(require '[incanter.core   :as incanter])
+(require '[incanter.charts :as charts])
+
+
+(defn pow [base exponent]
+  (reduce *' (repeat exponent base)))
+
+
+(defn bezier-3 [P0 P1 P2]
+  (fn [t]
+    (+
+      (* (pow (- 1 t) 2) P0)
+      (* 2 (- 1 t) t     P1)
+      (* (pow t 2)       P2))))
+
+
+(defn view-bezier-plot [[x1 y1] [x2 y2] [x3 y3] plot-title]
+  (let [b3x         (bezier-3 x1 x2 x3)
+        xs          (map b3x (range 0 1.0 0.01))
+        b3y         (bezier-3 y1 y2 y3)
+        ys          (map b3y (range 0 1.0 0.01))
+        dataset     (incanter/conj-cols xs ys)
+        xy-plot     (charts/xy-plot "col-0" "col-1" :data dataset :points true :title plot-title)]
+    (incanter/view xy-plot)))
+

Actually, the hand-rolled pow function isn’t really needed. I could have used clojure’s java interop: (Math/pow 2 3). In that case I would have been calling the pow method directly on java’s Math class. I weighted the option of hand-rolling the pow function, showing some functional code and explaining how functions are defined in clojure versus explaining java interop.

+

Explaining in text what the code does took me 5 times as long as writing the code itself. That’s a great thing about lisps in general and clojure in particular: no fluff, just stuff!

+

Thanks Niek for posting my guest blog. Please share your comments, suggestions and thoughts about this blog with me on twitter.com/mmz_. Thanks for reading and Happy Coding!

+ +
\ No newline at end of file diff --git a/2017/07/12/visualizing-bezier-curves-part-2/index.html b/2017/07/12/visualizing-bezier-curves-part-2/index.html new file mode 100644 index 00000000..862a790e --- /dev/null +++ b/2017/07/12/visualizing-bezier-curves-part-2/index.html @@ -0,0 +1,259 @@ +Visualising Bézier Curves Part II | 040code

Visualising Bézier Curves Part II

Experimenting with ClojureScript

by: maarten  on 2017-07-12

In my previous post I described how to visualise simple Bézier curves. I chose Clojure as implementation language. Unfortunately I had to ask you to jump through a couple of hoops in order to code along: installing leiningen, installing and configuring the lein-try plugin and maybe even installing the JVM.

+

This post will be easier for you - at least in terms of setup. You won’t have to leave your browser and can experiment with Clojure(Script) right here on this page!

+

NO Setup

+

In this post we’re going to use the very useful klipse plugin. Klipse is a client-side code evaluator pluggable on any web page. It can evaluate Clojure, ClojureScript, ruby, javascript, python, scheme, es2017, jsx, brainfuck, c++, reagent and probably much more languages in the near future. It’s like jsfiddle on steroids, right here in the 040code blog.

+

Let’s start with a very simple Klipse demonstration. I’m going to map the inc(rement) function over the numbers 1, 2 and 3. The result will not surprise you:

+
(map inc [1 2 3])
+

What might surprise you though, is that you can change the code in the klipse evaluator and see the results immediately in your browser. So for instance change (map inc [1 2 3]) into (map inc [41 999 2]) and be amazed. Or change it into something completely different like (filter even? (range 10)).

+

Defining functions and calling them? No problem:

+
+  
+(defn factorial [n]
+  (if (= 1 n)
+    n
+    (* n (factorial (- n 1)))))
+
+(factorial 4)
+  
+
+

Now call the factorial function with some other natural number (whole number > 0) and see the results.

+

For those of you who don’t know Clojure(Script), this function basically says:

+
    +
  • define a function named factorial
  • +
  • let n be its argument
  • +
  • if n equals 1, return n
  • +
  • otherwise return the multiplication of n with the factorial of (n - 1)
  • +
+

Lisp in the browser. Embedded in this blog. No setup required. Excellent!

+

But hang on, better things will follow soon.

+

Clojure is designed to be a hosted language

+

Why reinvent your own platform, your own runtime, your own garbage collector, your own ecosystem, when all you need is a decent language? Clojure is designed to be a hosted language. It runs on:

+ +

Clojurescript - a compiler for Clojure that emits javascript - will be the tool we use in this blog to visualise Bézier curves. We are going to manipulate a html canvas right from a klipse plugin.

+

Bézier in ClojureScript

+

In my previous post I tried to explain how (simple) Bézier curves ‘work’. You might want to go there or scan the Wikipedia page on Bézier curves if you have no clue what I’m talking about. Otherwise, let’s dive right in and try to play with Bézier curves directly on this page.

+
+    
+;; Get a grip on the html canvas element I inserted on this page
+(def canvas (.getElementById js/document "canvas-2d"))
+(def ctx    (.getContext canvas "2d"))
+
+
+;; Draws a blue circle with radius `r` on the canvas on point [x y]
+(defn draw-point [x y]
+  (let [r 5] ;; radius
+    (set! (.-fillStyle ctx) "blue")
+    (.beginPath ctx)
+    (.arc ctx x y r 0 (* 2 Math/PI))
+    (.fill ctx)))
+
+
+;; Draws a red Bézier curve and its blue control points on the canvas
+(defn draw-bezier-curve [[x1 y1] [x2 y2] [x3 y3]]
+  ;; draw curve
+  (set! (.-strokeStyle ctx) "red")
+  (set! (.-lineWidth   ctx) 2)
+  (.beginPath ctx)
+  (.moveTo ctx x1 y1)
+  (.quadraticCurveTo ctx x2 y2 x3 y3)
+  (.stroke ctx)
+  (.closePath ctx)
+  ;; draw control points
+  (draw-point x1 y1)
+  (draw-point x2 y2)
+  (draw-point x3 y3))
+
+
+;; Center the *drawing* canvas within the *html* canvas and draw the curves
+;;
+;; Reason for centering: keep the coordinates simple AND
+;; see the complete shapes (not cropped at the edge of the html canvas)
+;; make the ratio 1 to see what I mean with 'cropped at the edge'
+;;
+(let [wc (.-width canvas)  ;; width of *html* canvas
+      hc (.-height canvas) ;; height of *html* canvas
+      ratio 0.9            ;; ratio of *html* canvas to use as *drawing* canvas
+      t  (/ (- 1 ratio) 2) ;; translation constant
+      w  (* ratio wc)      ;; width of *drawing* canvas
+      h  (* ratio hc)      ;; height of *drawing* canvas
+      x  (* 1/2 w)         ;; x val in the middle of 0 and w
+      y  (* 1/2 h)]        ;; y val in the middle of 0 and h
+
+  ;; clear *html* canvas
+  (.clearRect ctx 0 0 wc hc)
+
+  ;; Center the *drawing* canvas in the *html* canvas
+  (.save ctx)
+  (.translate ctx (* t wc) (* t hc))
+
+  ;; Draw a grey border around the *drawing* canvas
+  (set! (.-lineWidth ctx) 1)
+  (set! (.-strokeStyle ctx) "grey")
+  (.strokeRect ctx 0 0 w h)
+
+  ;; Draw main 'anchor' points
+  ;; This is what I meant with 'simple coordinates':
+  ;; (draw-point 0 0)
+  ;; (draw-point x y)
+  ;; (draw-point w h)
+
+  ;; Increasing ascending curve
+  (draw-bezier-curve [0 h] [w h] [w 0])
+
+  ;; Swoosh
+  ;; (draw-bezier-curve [0 y] [0 h] [w 0])
+
+  ;; normal curve
+  ;; (draw-bezier-curve [0 h] [x 0] [w h])
+
+  ;; my pulse after a useless meeting
+  ;; (draw-bezier-curve [0 y] [x y] [w y])
+
+  (.restore ctx))
+    
+  
+

+ +

Before reading further you might want to experiment a bit by (un)commenting code and seeing the results. (Un)comment the different Bézier curves and different control points in the Klipse evaluator and see what happens.

+

Explanation

+

Scanning the code quickly without going into detail, this is what happens:

+
    +
  • Get a grip on the html canvas element
  • +
  • +

    Define functions to:

    +
      +
    • Draw (control) points
    • +
    • Draw Bézier curves with 3 control points
    • +
    +
  • +
  • Draw the actual curves and points
  • +
+

Since Clojure is a hosted language, it must be able to access its host platform and libraries. Clojure and ClojureScript have good interop documentation so I won’t go into detail here, but we’re basically using these forms in this blog:

+
    +
  • js/document => the global document object
  • +
  • (.beginPath ctx) => ctx.beginPath()
  • +
  • Math/PI => 3.141592653589793
  • +
  • (.-lineWidth ctx) => ctx.lineWidth
  • +
+

The last form is used for instance in (set! (.-lineWidth ctx) 1) and translates to ctx.lineWidth = 1. The more general syntax is (set! var-symbol expr).

+

The second form (.beginPath ctx) can also have arguments. The general syntax is (.instanceMember instance args*) in that case.

+

Other than that it’s basic Clojure and HTML Canvas functionality

+

Conclusion

+

Thanks to the klipse plugin and a bit of preparation from my side, you can now play around with Bézier Curves in ClojureScript directly in this blog. I do realise this post is probably not a compelling case for using ClojureScript:

+
    +
  • Javascript “in the small” is not really the place where ClojureScript shines, especially when the largest part of that small program is javascript interop
  • +
  • ClojureScript fits large browser applications better, where you need sane state management, immutable datastructures, lazy sequences, and a fast, stable and robust language
  • +
+

I’m not interested in ‘religious’ discussions about technology A versus technology B. Clojure and ClojureScript are THE sane way forward for me, in my context. I hope to share the fun I’m experiencing with it. Goethe said it best:

+
+

It is always better to say right out what you think without trying to prove anything much: for all our proofs are only variations of our opinions, and the contrary-minded listen neither to one nor the other.

+
+

But with all this talk about language, we’re almost forgetting what it’s all about: building useful stuff and having a great time doing it.

+

I hope you enjoyed experimenting with Bézier curves. The Klipse Blog has several great examples of using Klipse for ‘interactive programming’, for instance to write data driven documents.

+

Thanks Niek for sharing the 040code repo with me. Please share your comments, suggestions and thoughts about this blog post on twitter.com/mmz_. Thanks for reading and Happy Coding!

+ +
\ No newline at end of file diff --git a/2017/09/05/full-stack-fest-2017/index.html b/2017/09/05/full-stack-fest-2017/index.html new file mode 100644 index 00000000..8625e82e --- /dev/null +++ b/2017/09/05/full-stack-fest-2017/index.html @@ -0,0 +1,156 @@ +Full Stack Fest 2017 | 040code

Full Stack Fest 2017

Backend days

by: jeroen niek  on 2017-09-05

Full Stack Fest 2017

+

This week we (Jeroen and Niek) enjoyining Full Stack Fest 2017 Barcelona, +a week-long full stack development conference with a focus on solving current problems with new & inspiring perspectives.

+

In this quite short blog we just summarizing briefly the talks and our opinion about the talks. We have rated all talks, the rating is subjective ass well.

+

The first two days are more backend focussed, the last two days have a frontend focus, read more here.

+

Day one

+

Keynotes - Science - Backup the internet

+

Rating: ⭐ ⭐ ⭐ ⭐

+

Karissa McKelvey (@okdistribute) discussed the topic to share fairly large data sets in the science community in a secure and distributed way. The dat project enables file sharing via peer to peer for example with the beaker browser.

+

Ehtereum, aeternity and the distributed wonders

+

Rating: ⭐ ⭐ ⭐ ⭐

+

Luca Marchesini (@kuzzleio) did a great job by explanining about blockchain and the differences between ethereum and bitcoin. Blockchain; the system where playing by the rules is more profitable than cheating.

+

Terraform in your delivery pipeline

+

Rating: ⭐ ⭐

+

We love the Terraform framework of HashiCorp but the talk not as good as we hoped, nothing new. The speaker Anton (@antonbabenko) is an expert on the topic and also maintains some great Terraform modules.

+

Migrating an existing service to serverless

+

Rating: ⭐ ⭐

+

For us a standard talk by Marcia (@mavi888uy) about migrating an existing monolitic applicaton to smaller components. We loved all the (angry) birds flying around.

+

Defending the human network

+

Rating: ⭐ ⭐ ⭐ ⭐

+

Good story about cyber security by Dr. Jessica Barker (@drjessicabarker). About how the mood of a user is one of the weakest link. How you can trick people into clicking a bad links. Socially engineering and use stress full situation let a user execute an (maybe) unwanted action.

+

Key take aways, learn to think as hacker and focus on the why not on how to enforce / restrict users to do something.

+

Rise and the fall of the full stack database

+

Rating: ⭐ ⭐ ⭐ ⭐

+

Comparison with the army knife. Don’t be afraid of new technologies. +One tool for everything is not going to work. +Example with analytics service, kafka stream, bus. Frank Lyaruu (@lyaruu) did a great job!

+

How booking.com serves deep learning model predictions

+

Rating: ⭐ ⭐ ⭐

+

Good explaination by Sahil (@sahildua2305) about how to train a model and how to deploy them.

+

What to do when complex systems fail

+

Rating:

+

Not relevant to our needs.

+

Day Two:

+

The internet of things: An army of devices ready for DDoS

+

Rating: ⭐ ⭐ ⭐ ⭐

+

Good talk by John Graham-Cummin (@jgrahamc) about how IoT device can be used to do a DDoS attack. About port 1900 showing all kinds of information which is sent to victims address. How to block DDoS attacks by putting the ip-address in a grid to search for patterns. Talked about Trump attacks and anonymous being stupid by setting the evil flag (We’re anonymous).

+

How to properly blame things for causing latency: An introduction to distributed tracing and Zipkin

+

Rating: ⭐ ⭐

+

Difference between logs, metric and trace. Good (known) story by Adrian Cole (@adrianfcole).

+

Ship more, sink less. Changing chaos engineering & Distributed tracing

+

Rating: ⭐ ⭐

+

The story about testing in real live situations is not new, good te remember the importance to be prepared for failure. For not much new things in this talk since we here the chaos monkeys stories new for a couple of years. But we will plan our Chaos GameDay soon. Thanks to Aish (@aishrajdahal)

+

Flying Spaghetti monster: Verifying protocols with types and finite-state machines

+

Rating: ⭐ ⭐ ⭐ ⭐

+

Complexity of systems cause a lot of problems. Idris has a nice feature that Types are also values, so state changes can easialy be checked in compile time. talk.applaud() should only run after talk.give() and Idris has a way to check this easily during compile time.

+

Inspiration for doing more with new languages. Chris Ford (@ctford), thanks!

+

Smart grid: How iot fights climate change

+

Rating: ⭐

+

Kelsey Breseman (@ifoundtheme) explains us how complex the eletrical grids works which makes it hard as well to safe for example solar eneregy. It was great to hear the complecity of this relevant topic but unfortunately there was not much relation betwoon the world of of software.

+

Beyond patterns: Technological systems and the nature of order

+

Rating: ⭐ ⭐ ⭐ ⭐

+

Good to see the that our hipster shit is the same as the problems the manufacturing has already solved. Learn from that! Talk by Jerome Scheuring

+

Lighting Talks

+

Rating: ⭐ ⭐ ⭐

+

There where quite a lot fo lighting talks. In our opinion: hight quality but too many.

+
    +
  • Docker talk about docker build was fun. Docker build takes long, and from now on I can’t ignore it anymore. THANKS!!! aka we should fix the layer thing.
  • +
  • Fullstack is a zoo. Complexity of our work environment.
  • +
  • http://exercism.io/: Nice code kata kind of thing. (not a talk, but worth to mention)
  • +
+

Gone in 60 milliseconds: Offensive security in the serverless age

+

Rating: ⭐ ⭐ ⭐ ⭐ ⭐

+

Awesome DDoS attack of slides by Rich Jones (@GUNdotIO). A lot of cool stuff. A very usefull and insight talk about how unsecure you serverless application can be. Serverless python with zappa and slides

\ No newline at end of file diff --git a/2017/09/08/full-stack-fest-2017-frontend/index.html b/2017/09/08/full-stack-fest-2017-frontend/index.html new file mode 100644 index 00000000..7c43596c --- /dev/null +++ b/2017/09/08/full-stack-fest-2017-frontend/index.html @@ -0,0 +1,161 @@ +Full Stack Fest 2017 | 040code

Full Stack Fest 2017

Frontend days

by: jeroen niek  on 2017-09-08

Full Stack Fest 2017

+

This week we (Jeroen and Niek) enjoyining Full Stack Fest 2017 Barcelona, +a week-long full stack development conference with a focus on solving current problems with new & inspiring perspectives.

+

In this quite short blog we just summarizing briefly the talks and our opinion about the talks. We have rated all talks, the rating is subjective ass well.

+

The last days are more frontend focussed read here more about the backend days.

+

Day four

+

Keynote

+

Rating: ⭐ ⭐ ⭐

+

Jenn Schiffer (@jennschiffer) showed how to make coding actually friendly with glitch. And remember once you got bored you will not trying new cool stuff which makes you even unhappier and so on… And some cool pixel art

+

Once you go PRPL…

+

Rating: ⭐ ⭐ ⭐ ⭐

+

Service Workers by Houssein Djireden (@hdjirdeh) are stable and most serious browsers support them. SWs are a big help in improving the experience for the user. Workbox-cli is a great for configuring your app to cache usefull stuff only. Don’t cache too much. FoamTree and webpack-bundle-analytics show a good overview what to cache. Split up your js, with http/2, we do not need one big js file. React has good SW support.

+

Magic tricks with css houdini

+

Rating: ⭐ ⭐ ⭐ ⭐

+

Absolutely awesome to see the future already working in this talk by Sam Richard (@Snugug). A lot of visual stuff is currently blocking the main JS thread. With Houdini CSS a lot of css stuff can be handle on Worklets. ‘Much like Service Workers are a low-level JavaScript API for the browser’s cache Houdini introduces low-level JavaScript APIs for the browser’s render engine’. Currently only available in Chrome Canary and the definition of unstable, but ooooh so beautiful, slides in canary

+

Master the art of the ast (and take control of your js)

+

Rating: ⭐ ⭐ ⭐

+

Talk by Sears israel (@cowchimp) to understand most JS libraries you only need to know two things. AST and the visitor pattern. With this knowledge you can easily add ESLint, create Babel plugins or add jscodeshift refactor modules. A great tool to help with AST is https://astexplorer.net

+

SVG can do that?!

+

Rating: ⭐ ⭐ ⭐ ⭐ ⭐

+

Awesome what you can do with SVG by Sarah Drasner (@sarah_edo). This girl really knows her stuff. SVG is supported by all browsers including Opera Mini! Good integration with VueJS, react and other modern frameworks is possible. Lots of examples of really beautiful animations all working for all types of devices. Size does matter for images and animations. Normally it will result in ugly things, but with SVG this is absolutely not the case, slides.

+

Using react native + clojurescript to launch ios/android apps to 1m users

+

Rating: ⭐ ⭐

+

A long intro to react native, which is most likely not necessary on this conference. A nice twist with clojureScript. The code looks very clean. It is possible to create apps for both iOS and Android with a 99% simular codebase. The crashlogs of apps created with clojurescript and reactnative are unfortunately almost not readible. This set of tools is also great to use in combination with codepush. Now we can update the app on the fly without bothering appstores. Talk by Emin Hasanov (@hasanove)

+

Blasting react into space: building fluid, beautiful interfaces with react and webgl (and other exotic explorations)

+

Rating: ⭐ ⭐ ⭐ ⭐

+

A good talk by Chad Ostrowski (@chadoh), on how all the new technologies can help us in the future when live is possible on Mars. Using: HTTP/2, ServiceWorkers, LocalStorage, Bittorent + git, IPFS, blockchain, bitcoin, ethereum. “Tomorrow’s problems === Today’s problems but bigger.” Last year a simular talk was told on FSF, but it’s good to see that the technologies mentioned then are now in a much further state. Great talk and good choice from the organiser of this beautiful conference.

+
+ +
+

Day five

+

Bringing back the 1990s: The revenge of javascript stylesheets

+

Rating: ⭐ ⭐ ⭐

+

Steve Kinney (@stevekinney) did a lot of work in getting the Javascript Stylesheets, a technology only working in 1996 in Netscape 4) to work in 2017. In the beginning of the internet, people were debating about the split of concern regarding content and layout. One of the proposals was Javascript Stylesheets. Netscape 4 was the only browser capable of this feature. Steve showed us how we can do some really neat stuff in 1996 technology. A lot of this, we now take for granted, but we have to keep in mind that this was 1996. A lot of simularities with SASS, LESS, but also REACT like structures with the ECMA E4X for XML proposal. Conclusion: We still can learn from the past. Although some good initiatives take 20 years to become meanstream.

+

Rendering performance from the ground up

+

Rating: ⭐ ⭐ ⭐

+

Good presentation about how we can improve the performance a lot by using the GPU instead of CPU. A good explaination what the differences are between a CPU and GPU. Try to use translate and shaders because they don’t require repaintings. Thanks Martin Splitt (@g33konaut)!, slides

+

Web based virtual reality

+

Rating: ⭐ ⭐ ⭐

+

Shagufta Gurmukhdas (@shaguftamethwan) give a good talk ok the Web based virtual reality. Starting WebVR with WebGL is very hard. She showed us A-Frame. A-Frame was already mentioned three times in FSF, so we were already very curious about it. You can easily start your own VR world with this framework. It uses GPU under the hood and you can use one of your favourite webframeworks (vueJS, React, and so on) to change properties of the 3D models. Very impressive. With this tool, even the most suburn backenders, (we) can start with VR.

+

Exploring the world of decentralized networks with webRTC

+

Rating: ⭐ ⭐

+

Nikita Baksalyar (@nbaksalyar) started his talk with some technical issues, but he recovered quickly from that. Nikita tought us about how the internet can truly be implemented the way it was supposed to be implemented. Decentralised! Now-a-days we’re using a lot of things which are ment to be decentralised in a centralised way. Git and the internet are a nice examples of that. Serving the web, securely and encrypted, with webRTC through all client devices will make it imposible to censor the internet by governments. During the Q&A a question come up on what to do with unwanted content. The response of Nikita was amazing. We should educate people that they don’t want to see unwanted content instead of putting the responsibility of this on technology, resources

+

Developing for the next billion

+

Rating: ⭐ ⭐ ⭐

+

Look to your target group. Keep in mind that your apps might not be used by the people you’ve targetted on. Natalie Pispistunovich (@nataliepis) showed some examples from Kenya. What apps are used and why. The delivery of apps can be very different from ours. The way payments are done also. +Nice reference to Fun with Flags

+

Progressive web apps and the internet of things

+

Rating: ⭐ ⭐

+

A story of with amongst other libraries, the johnny-five library. Today it’s easy to communicate with all kind of device with nodeJS. Well done, Luis Montes (@monteslu)

+

Lightning talks

+
    +
  1. PAKO a zlib for uploads in js. For uploading large files. :) NICE. @bombasarkadian
  2. +
  3. DevTools in Firefox: Alex Lakatos @lakatos88; BASIC
  4. +
  5. Internet for Everyone. Tom Enden en Liran Kurtz. Accessible. GOOD
  6. +
  7. Marek - ProRouter.js - Router.maniak.pro - No idea what this is all about.
  8. +
  9. Kirill Pimenov - Rust! Go write to Rust and go back to your own language and you will be beter. Awesome!
  10. +
  11. Raj - iOS Event Communication without internet, API and no loss of data. Way to fast. OMG… Peer to Peer connectivity with iPhone through Bonjour protocol
  12. +
  13. Paulo - Functional Programming: Elixir and Phoenix. I love Phoenix! See also git
  14. +
  15. FSF designer. Uses emoiji as classes. Awesome way of keeping the names short and compact. Really high quality frontend work. See Full Stack Fest web page and Inspect the code!
  16. +
+

Making a lot of things

+

Rating: ⭐ ⭐ ⭐

+

Ben Foxall (@benjaminbenben) gave us two talks for the price of one! +https://cojs.co is collaborate platform were people can co-create software. With blocks you can split the code. Adding a ! behind the url will fork the code. Other users can continue on the code in their own context, but with shared code. Awesome. The second part was about Microhacks. He explained how you should constrain your experiments to make them work. Plan your goal, not your work. Start it and finish it.

+

Awesome!!!

+

Many thanks to Codegram the company that organized once again the best conference!

\ No newline at end of file diff --git a/2017/09/19/immutable-infrastructure/index.html b/2017/09/19/immutable-infrastructure/index.html new file mode 100644 index 00000000..13932e00 --- /dev/null +++ b/2017/09/19/immutable-infrastructure/index.html @@ -0,0 +1,168 @@ +Immutable Infrastructure | 040code

Immutable Infrastructure

Devops Days Riga 2017

by: niek  on 2017-09-19

The Docker slogan ‘Build, Ship, and Run’ advertises easy set up of immutable software builds, but it is not always that easy. Setting up immutable builds with Docker is pretty straight forward and shipping is just a matter of pushing the image to a repository. The next step is building the cloud infrastructure to run the containers. In the talk at the DevOps Days in Riga I have shown how to create an immutable infrastructure on AWS with Terraform. The example belows shows how you can run your micro services in docker containers on AWS.

+

In this talk I briefly touch upon building immutable software. But the main focus of the talk will be on creating an immutable infrastructure. In this talk I will show you how to create an immutable infrastructure on AWS with Terraform. I will use a real world example to explain and show live how easy you can get micro services live on AWS and continuously apply changes to the same cloud environment..

+

Slides

+

Below the slides that I used for the talk, the slides are available as well on GitLab. You can easy navigate through the slides with the spacebar.

+
+ +
+

To get started with Terraform the best starting points are:

+ +

Examples

+

Hello World

+

During the talk, I demonstrated a hello world example, see the link above. This examples shows some basics of terraform by creating a ec2 instance and security group to server a simple web application. The example only works in the AWS region eu-west-1 since the AMI used is only available in this region.

+

ECS demo

+

The second example I have shown, is creating an immutable infrastructure to server docker containers. The picture below descibes briefly the enviroment that will be cretaed.

+ + + + + + + ecs-diagram + + + +

The example also creates log groups in cloudwatch to capture the logging of the ecs agent and the running containers (services).

+

Setup

+

Before you can start, you need an AWS account with sufficient rights (admin), and you should create a AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY to be able to access your account programmatically.

+

Clone the repository containing the ECS sample terraform code. To create the infrastructure step-by-step you can check out the tags vpc and ecs.

+
git clone https://github.com/npalm/tf-ecs-demo.git
+git checkout vpc
+

You should also have Terraform installed (home brew install terraform) or use a docker container to run the terraform commands, for example:

+
docker run -it --env-file <AWS_KEYS_FILE> -v $(pwd):/data -w /data \
+  hashicorp/terraform:0.10.4 <terraform command>
+
+

Create network layers (VPC)

+

In the next steps we will create the network layers.

+

First, we initialize and plan our changes.

+
terraform init
+terraform plan
+

Terraform should print on the console that 19 needs to be added and 0 to change or destroyed. Next we apply the change be executing terraform apply.

+

Add ECS cluster

+

Now we have the network layer created, we will add the ECS cluster. By default the bastion host is disabled, the bastion can be enabled by updating the variable enable_bastion in the terraform.tfvars file. Time to plan and apply the new resources for ECS.

+
git checkout ecs
+terraform plan
+terraform apply
+

Once terraform is ready it will print the url of two applications on the console. One application, is a simple micro service that just prints the AWS availabilty zone where it is running, the other is a graphql micro service. It will take a few minutes before the services are available.

+

Adding your own service.

+

Time to have some more fun. Edit the main.tf and start making changes. Remove all the services, add your own service. By default for each service an application load balancer (ALB) is created. Add for each services that you want to deploy a configuration as below and update the variables as required.

+
module "your-service" {
+  source = "ecs-service"
+
+  service_name   = "<service-name>"
+  image_url      = "<docker-image>"
+  container_port = <port in the container where the service is listening>
+  desired_count  = <number of instances>
+
+  aws_region  = "${var.aws_region}"
+  environment = "${var.environment}"
+
+  vpc_id  = "${module.vpc.vpc_id}"
+  subnets = "${module.vpc.public_subnets}"
+
+  cluster_id            = "${module.ecs-cluster.cluster_id}"
+  ecs_service_role_name = "${module.ecs-cluster.ecs_service_role_name}"
+}
+

Now plan and apply your changes, Terraform will inform you that a few resources will be destroyed (the removed services) and a few will be added.

+

Clean up

+

Once done you can easily clean-up all created resources in AWS, just run terraform destroy.

\ No newline at end of file diff --git a/2017/10/01/microhack-zappa-io/index.html b/2017/10/01/microhack-zappa-io/index.html new file mode 100644 index 00000000..f6734fef --- /dev/null +++ b/2017/10/01/microhack-zappa-io/index.html @@ -0,0 +1,182 @@ +MicroHack Zappa.io | 040code

MicroHack Zappa.io

A quick test for using the Zappa.io serverless framework to run a python service in the cloud

by: jeroen  on 2017-10-01

MicroHack - Python serverless with Zappa.io

+

The context

+

I’ve visited one of the best conferences last september, Full Stack Fest in Barcelona. Since then, two talks are constantly in the back of my mind.

+

The first one is the talk by Ben Foxall (@benjaminbenben). He talked about Microhacks and how to become better in your experiments by constraining them. Write small reports / blogs of your Microhacks to so you have a nice overview of some of the experiments you’ve done. Guess what this blog is about..

+

The second talk I’m frequently think of was the talk by Rich Jones (@GUNdotIO) titled “Gone in 60 milliseconds: Offensive security in the serverless age”. A DDoS attack of slides, 452 in total. The talk main focus was about security and how you can hack the AWS infrastructure if things are not setup correctly. He knows his ways in AWS. That’s comes very handy if you want to build a cli which helps other people to run serverless python apps in the cloud. And this is exactly what he’s been doing with https://www.zappa.io.

+

What’s the experiment

+

I wanted to test the cli zappa.io with a simple python Flask app. The specs are simple: A service which reverses an input string running in the cloud with zappa.io. Serverless services are very interesting, because it’s based on lambdas and they typically run for a few milliseconds. So the costs are very low, utilization is very high. +I’ve asked some colleagues to join me on a friday afternoon experiment and Jos Beijk wanted to help.

+

Let’s do it!

+

We need Python, a package manager (pip) and a tool to create isolated Python environments (Virtualenv). +Store your AWS secrets in your .aws directory.

+

If you do not have an AWS account, don’t worry. Just signup and the first 1.000.000 requests per month are for free. https://aws.amazon.com/lambda/pricing

+

The experiment

+ +

GitHub: https://github.com/JeroenKnoops/zappa-string-reverser

+

What just happened?

+

The service

+

Create a simple Flask service which reverses an input string.

+
from flask import Flask, request
+
+app = Flask(__name__)
+
+@app.route('/<string:str>', methods=["GET"])
+def reverse_str(str):
+    return str[::-1]
+
+if __name__ == '__main__':
+    app.run()
+

Required libraries

+

Add required libraries Flask and Zappa in requirements.txt so pip can install it.

+
Flask>=0.12
+zappa>=0.17.6
+

Install required libraries in virtual environment

+

Create a virtaul environment and activate it.

+
virtualenv venv
+source venv/bin/activate.fish
+

Note: If you use zsh or bash you can use: source venv/bin/activate

+
pip install -r requirements.txt
+

Setup Zappa and deploy the service

+

Setup Zappa:

+
zappa init
+

Once you finish initialization, you’ll have a file named zappa_settings.json in your project directory defining your basic deployment settings.

+

Edit this file to add more service specific configurations:

+
{
+    "dev": {
+        "app_function": "string_reverser.app",
+        "keep_warm": false,
+        "debug": true,
+        "log_level": "DEBUG",
+        "aws_region": "eu-west-1",
+        "profile_name": "default",
+        "http_methods": ["GET"],
+        "parameter_depth": 1,
+        "timeout_seconds": 300,
+        "memory_size": 128,
+        "use_precompiled_packages": true,
+        "s3_bucket": "zappa-<unique-thingy-goes-here>"
+    }
+}
+

Deploy the app:

+
zappa deploy dev
+

The output is the url to our service. You see it’s https out-of-the-box.. :)

+

Test our service

+

The previous step will output an url to our service. In my case: https://z9cxt9gky6.execute-api.eu-west-1.amazonaws.com/dev/

+

Append the test string behind it and check the result.

+
curl https://z9cxt9gky6.execute-api.eu-west-1.amazonaws.com/dev/thisisateststring
+

Wiehoe! We got: gnirtstsetasisiht

+

Update the service

+

When you want to apply some changes, you can deploy it by running:

+
zappa update dev
+

If you add other libraries, make sure you add it in requirements.txt and install it locally in your virtual environment. All the packages in this folder will be shipped.

+

Debugging

+

You can do various things with the zappa cli.

+

You can view logging for example:

+
zappa tail dev
+

See help for more info:

+
zappa --help
+

Feel free to check the created services in AWS console. You will see API gateway, CloudWatch and Lambdas.

+

Cleanup

+

Remove the infrastructure by simply undeploy the environment:

+
zappa undeploy dev
+

Conclusion

+

Ofcourse this example has no real value, but I wanted to see how it works. +I think zappa.io is very good in its default values, but is extremely flexible. +You don’t like the JSON format and prefer YAML or TOML? no problem. Want to run it in a VPC, no problem. Don’t like the Keeping The Server Warm settings, you can change it. +Look at https://github.com/Miserlou/Zappa for the complete list of options. There’s good community support with a slack channel, so I would encourage you to look at this project. Especially because you have a lot of good defaults in this setup and this guy knows a few things about AWS.

+ +
\ No newline at end of file diff --git a/2017/10/19/graphql-geecon/index.html b/2017/10/19/graphql-geecon/index.html new file mode 100644 index 00000000..a841b162 --- /dev/null +++ b/2017/10/19/graphql-geecon/index.html @@ -0,0 +1,136 @@ +GraphQL | 040code

GraphQL

GeeCON talk - The Next API Language

by: niek  on 2017-10-19

A short post to share the slides and examples I used in my talk at the GeeCON conference on October the 19th in Prague.

+

Slides

+

Below the slides that I for the talk, the slides are available as well on GitHub. You can easy navigate through the slides with the spacebar.

+
+ +
+

To get started with GraphQL the best starting points are:

+ +

Examples

+

During the talk, I demonstrated GraphQL via graphcool, which is cloud service for creating a flexible GraphGL backend. I modelled a basic model of a Talk and Person with relation speakers and visitors on graphcool. Furthermore, I modelled two basic sample implementations of a GraphQL backend in Java and JavaScript that are available via GitHub. Those implementation are more limited than the online one, but both serve the following minimal queries.

+

Query for the name and the title of the talks given by all persons:

+
{
+  persons {
+    name
+    talks {
+      title
+    }
+  }
+}
+

And secondly, a query for all titles of talks with their speaker’s names.

+
{
+  talks {
+    title
+    speakers {
+      name
+    }
+  }
+}
+

JavaScript sample

+

The JavaScript sample is based on Apollo GraphQL tutorial kit.

+
git clone https://github.com/npalm/graphql-js-demo.git
+cd graphql-js-demo
+yarn && yarn start
+

Instead of yarn, you can use npm install && npm start. Once started, browse to http://localhost:8080/graphiql and play around with the GraphQL web interface. Implementing the JavaScript version was straightforward due to the many examples and good tutorials around.

+

Spring Boot Java sample

+

The Spring Boot Java sample is based on the Spring Boot Starter available for GraphQL and GraphQL java tools lib with schema first support.

+
git clone https://github.com/npalm/graphql-java-demo.git
+git checkout nextbuild
+cd graphql-java-demo
+docker build -t graphql-java-demo && docker run -it --rm -p 8080:8080 graphql-java-demo
+

Alternatively, you can build and run via gradle. Once started, browse to http://localhost:8080/ to play around with the GraphQL web interface.

+

Many languages already have support, so feel free to try out your favourite language. Currently the support on JavaScript looks like by far the best.

\ No newline at end of file diff --git a/2017/12/09/runners-on-the-spot/index.html b/2017/12/09/runners-on-the-spot/index.html new file mode 100644 index 00000000..4d4876a1 --- /dev/null +++ b/2017/12/09/runners-on-the-spot/index.html @@ -0,0 +1,337 @@ +Runners on the Spot | 040code

Runners on the Spot

Auto scaling GitLab runners on AWS with Terraform

by: niek  on 2017-12-09

Introduction

+

GitLab CI is a first class citizen in GitLab to enable continuous integration and delivery to your project. Builds are orchestrated via GitLab Runners, which are agents registered to your GitLab account. An agent runs builds using a local shell or a container. Runnings these builds requires a well-defined infrastructure, both with respect to the type of server and the server capacity. Would it not be great if you can scale the infrastructure based on your needs? Indeed, GitLabs runner supports out of the box auto scaling using docker machine, which is discussed in the GitLab blog article: Autoscale GitLab CI runners and save 90% on EC2 costs.

+

The GitLab blog article nicely explains how to create your infrastructure in a manual way. However, we rather automate all things. Thus, we will automate the set up described in the blog article. In this post I will discuss how to create the infrastructure needed to run the build on AWS spot instances with Hashicorp Terraform. The GitLab Runner module discussed in the post is available in the Terraform Registery.

+ + + + + + + GitLab Runner + + + +

Prerequisites

+

Before we start, we need to briefly discuss the GitLab runners. To execute the builds, GitLab uses an agent to orchestrate the build with a docker machine. A docker machine creates instances with docker engine to run docker containers. The first step for setting up a runner is to register a new runner. Because GitLab currently does not provide a fully automated way for this, we will do this manually.

+

Open you GitLab project and lookup the token to register a runner. Be aware that there are project tokens and a GitLab global token. Next, we use a docker container to register a runner. The command will ask a few details.

+
docker run -it --rm gitlab/gitlab-runner register
+

+

+

Provide the requested details and consult the GitLab manual for more details. Once done, you should see a new runner registered at your project or globally. Open the runner settings in edit mode and record the token. This token is needed later for connecting the agent.

+

Creating infrastructure for the runners

+

Now the runner is configured in GitLab, we can start creating the infrastructure on AWS. For setting up the network layers, we use Amazon networking scenario 2 to build a VPC with a public and private subnets. For more details see this post about creating a VPC in terraform. You can also simply use the official terraform module.

+
module "vpc" {
+  source  = "terraform-aws-modules/vpc/aws"
+  version = "1.5.1"
+
+  name = "vpc-${var.environment}"
+  cidr = "10.0.0.0/16"
+
+  azs             = ["eu-west-1a", "eu-west-1b", "eu-west-1c"]
+  private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
+  public_subnets  = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]
+
+  enable_nat_gateway = true
+
+  tags = {
+    Environment = "${var.environment}"
+  }
+}
+

Next, we create a t2.micro instance using an autoscaling group in the private network. On this instance we install and configure the GitLab runner. Configuration of GitLab runners is done via the config.toml file. Below the parameterized version of this configuration file. In the Terraform module you will find that the configuration file is loaded via a data template.

+
concurrent = ${runner_concurrent}
+check_interval = 0
+
+[[runners]]
+  name = "${runners_name}"
+  url = "${gitlab_url}"
+  token = "${runners_token}"
+  executor = "docker+machine"
+  limit = ${runners_limit}
+  [runners.docker]
+    tls_verify = false
+    image = "docker:17.11.0-ce"
+    privileged = ${runners_privilled}
+    disable_cache = false
+    volumes = ["/cache"]
+    shm_size = 0
+  [runners.cache]
+    Type = "s3"
+    ServerAddress = "s3-${aws_region}.amazonaws.com"
+    AccessKey = "${bucket_user_access_key}"
+    SecretKey = "${bucket_user_secret_key}"
+    BucketName = "${bucket_name}"
+    Insecure = false
+  [runners.machine]
+    IdleCount = ${runners_idle_count}
+    IdleTime = ${runners_idle_time}
+    MachineDriver = "amazonec2"
+    MachineName = "runner-%s"
+    MachineOptions = [
+      "amazonec2-access-key=${access_key}",
+      "amazonec2-secret-key=${secret_key}",
+      "amazonec2-instance-type=${instance_type}",
+      "amazonec2-region=${aws_region}",
+      "amazonec2-vpc-id=${vpc_id}",
+      "amazonec2-subnet-id=${subnet_id}",
+      "amazonec2-private-address-only=true",
+      "amazonec2-request-spot-instance=true",
+      "amazonec2-spot-price=${spot_price_bid}",
+      "amazonec2-security-group=${security_group_name}"
+    ]
+

All variables can be configured and most of them have default values. Only the name of the runner, the token and the GitLab URL need to be configured. The configuration contains a shared cache in S3 which will expire at the end of the next day (after creation) by default. Files will be deleted via S3 lifecycle management once expired, but the number of expiration days can be changed to your needs. You can find all the available variables in the variables.tf file of the module. Next we add the module to our Terraform file and define a minimal set of variables.

+
module "gitlab-runner" {
+  source = "npalm/gitlab-runner/aws"
+
+  aws_region     = "<region-to-use>"
+  environment    = "ci-runners"
+  ssh_public_key = "<contains-public-key"
+
+  vpc_id                  = "${module.vpc.vpc_id}"
+  subnet_id_gitlab_runner = "${element(module.vpc.private_subnets, 0)}"
+  subnet_id_runners       = "${element(module.vpc.private_subnets, 0)}"
+
+  # Values below are created during the registration process of the runner.
+  runner_name       = "<name-of-the-runner"
+  runner_gitlab_url = "<gitlab-url>"
+  runner_token      = "<token-of-the-runner"
+}
+

The complete example is in GitHub. Now it is time to execute the scripts to create the actual infrastructure. Be aware that you need to configure AWS keys and have Terraform installed. The steps below should guide you through the setup.

+
git clone https://github.com/npalm/terraform-aws-gitlab-runner.git
+cd tf-aws-gitlab-runner/example
+

The example directory contains the example as described above, so the properties for your newly registered runner in GitLab need to be configured. Please register a runner in GitLab (see docker command above) and update the terraform.tfvars file. That is all, now execute the Terraform code.

+
# genere SSH key pair
+./init.sh
+
+# initialize terraform
+terraform init
+
+# apply, or plan first
+terraform apply
+

+

+

After a few minutes the runner should be running and you should see it in your AWS console. + + + + + + + Running EC2 instances + + + +
+The runner should be active as well in GitLab. Check the runner pages which should now indicate the latest moment of contact. + + + + + + + GitLab Runner details + + + +

+

The modules also enable CloudWatch logging, all systemd logging is streamed. Go to CloudWatch to inspect the logging and you will see that the installation process was logged as well.

+ + + + + + + CloudWatch logging + + + +

Verify

+

Finally we can verify that the runner is working properly by executing a build. The .gitlab-ci.yml below is an example to verify the runner is working properly. The build contains two stages. In the first stage an ascii art image is generated, stored in a file which is cached in S3. In the second stage the file is retrieved from the build cache.

+
stages:
+  - build
+  - verify
+
+cache:
+  key: "$CI_BUILD_REF"
+  untracked: true
+
+image: npalm/cowsay
+
+build:
+  stage: build
+
+  script:
+    - cowsay -f ghostbusters building "$CI_BUILD_NAME" @ stage "$CI_BUILD_STAGE" > ghosts.txt
+
+  tags:
+     - docker.m3
+
+verify:
+  stage: verify
+
+  script:
+    - cat ghosts.txt
+
+  tags:
+    - docker.m3
+

Add the file above to the GitLab repository that has the created runner attached. Once you commit the file a build should triggered. The logging of the verification step should contain the ascii art image.

+ + + + + + + Build log + + + +

Warning

+

Be aware that prices of a spot instance can change over the time and instances can be terminated without a warning. Last black Friday prices of spot instances went up to over 2 dollar occasionally.

\ No newline at end of file diff --git a/static/2018/01/30/microhack-fargate/fargate-ec2.json b/2018/01/30/microhack-fargate/fargate-ec2.json similarity index 100% rename from static/2018/01/30/microhack-fargate/fargate-ec2.json rename to 2018/01/30/microhack-fargate/fargate-ec2.json diff --git a/static/2018/01/30/microhack-fargate/fargate-terraform-1.json b/2018/01/30/microhack-fargate/fargate-terraform-1.json similarity index 100% rename from static/2018/01/30/microhack-fargate/fargate-terraform-1.json rename to 2018/01/30/microhack-fargate/fargate-terraform-1.json diff --git a/static/2018/01/30/microhack-fargate/fargate-terraform-2.json b/2018/01/30/microhack-fargate/fargate-terraform-2.json similarity index 100% rename from static/2018/01/30/microhack-fargate/fargate-terraform-2.json rename to 2018/01/30/microhack-fargate/fargate-terraform-2.json diff --git a/static/2018/01/30/microhack-fargate/fargate-terraform-3.json b/2018/01/30/microhack-fargate/fargate-terraform-3.json similarity index 100% rename from static/2018/01/30/microhack-fargate/fargate-terraform-3.json rename to 2018/01/30/microhack-fargate/fargate-terraform-3.json diff --git a/static/2018/01/30/microhack-fargate/fargate-terraform-4.json b/2018/01/30/microhack-fargate/fargate-terraform-4.json similarity index 100% rename from static/2018/01/30/microhack-fargate/fargate-terraform-4.json rename to 2018/01/30/microhack-fargate/fargate-terraform-4.json diff --git a/2018/01/30/microhack-fargate/index.html b/2018/01/30/microhack-fargate/index.html new file mode 100644 index 00000000..87e052b0 --- /dev/null +++ b/2018/01/30/microhack-fargate/index.html @@ -0,0 +1,471 @@ +MicroHack Fargate | 040code

MicroHack Fargate

Running serverless containers with Terraform

by: niek  on 2018-01-30

Last December at the AWS re:invent, AWS announced the new container service platform Fargate. Fargate is integrated to ECS. The key difference is that Fargate does not require you to have EC2 instances running to host your containers, which means we have serverless containers. A drawback is that Fargate is not globally available yet, today Fargate is only available in us-east-1, see also the list of supported regions. Later in December Fargate also become available in Terraform so time to see how it works.

+

In this post I will show how to deploy containers to Fargate using Terraform. As example docker image I will use the blog itself. The complete example in available on GitHub. First I show how you can deploy a container using Terraform to Fargate. In case you would like to experiment with AWS console instead of Terraform you should be able to execute the same steps direct in AWS. Only the VPC part could be a bit tricky, but even that part can be skipped and replaced with the default VPC. In that case you don’t have private subnets available.

+

Finally I will discuss how a deployment with Fargate in ECS compares to a deployment with EC2 in ECS. And show what steps have to be taken to move the deployment from Fargate to EC2 instances.

+

Prerequisites

+

Before you start you need to have programmatically access to an AWS account and Terraform (0.11+) installed. The tool tfenv let you manage multiple terraform version on your system.

+

Deploy serverless containers on Fargate

+

Before we can create our containers, we have to create a few infrastructural components. For this example we create an own VPC including public and private subnets. An ECS cluster for our containers, and a CloudWatch log group for centralized logging. The diagram below shows an abstract view of the deployment we are going to create, this view contains two in instead of the 3 availability zones we use.

+ + + + + + + Fargate + + + +

We start with defining the VPC, we choose us-east-1 since Fargate is only available in this region. In the blog post Coding a VPC in Terraform you find more details about how this VPC module is structured.

+
provider "aws" {
+  region  = "us-east-1"
+  version = "1.7.1"
+}
+
+provider "template" {
+  version = "1.0"
+}
+
+module "vpc" {
+  source  = "npalm/vpc/aws" // https://registry.terraform.io/modules/npalm/vpc/aws
+  version = "1.1.0"
+
+  environment = "blog"
+  aws_region  = "us-east-1"
+
+  create_private_hosted_zone = "false"
+
+  // us-east-1 is the only region that supports Fargate
+  availability_zones = {
+    us-east-1 = ["us-east-1a", "us-east-1b", "us-east-1c"]
+  }
+}
+

Next we define the ECS cluster, and CloudWatch log group. Since we will deploy to Fargate we don’t have to attache EC2 instances to our cluster.

+
resource "aws_ecs_cluster" "cluster" {
+  name = "blog-ecs-cluster"
+}
+
+resource "aws_cloudwatch_log_group" "log_group" {
+  name = "blog"
+}
+

Now the first part is defined we execute a terraform apply and inpect the results.

+

+

+

The next step is to deploy the docker image with the blog. In ECS you deploy a docker container with a task. And your task will be managed by a service. First we create the task definition which contains the container deployment definition as well. Fargate is using awsvpc as networking mode, in this mode each task definiton gets its own private ip address. This network mode requires a role for the task execution. In case you create your definition through the Amazon console a service linked role will be created for you. We will create this role also via code.

+
data "aws_iam_policy_document" "ecs_tasks_execution_role" {
+  statement {
+    actions = ["sts:AssumeRole"]
+
+    principals {
+      type        = "Service"
+      identifiers = ["ecs-tasks.amazonaws.com"]
+    }
+  }
+}
+
+resource "aws_iam_role" "ecs_tasks_execution_role" {
+  name               = "blog-ecs-task-execution-role"
+  assume_role_policy = "${data.aws_iam_policy_document.ecs_tasks_execution_role.json}"
+}
+
+resource "aws_iam_role_policy_attachment" "ecs_tasks_execution_role" {
+  role       = "${aws_iam_role.ecs_tasks_execution_role.name}"
+  policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy"
+}
+

We have defined the execution rol for the task, next we define the task definion. This task definition consist of two parts. First we define a container definition via a template_file. In this container definition you see container port 80 is mapped to host port 80, the task will get its own private IP. And after that we define the task definition self. The following settings are required for a task that will run in Fargate: requirescompatibilities, networkmode, cpu and memory.

+
data "template_file" "blog" {
+  template = <<EOF
+  [
+    {
+      "essential": true,
+      "image": "npalm/040code.github.io:latest",
+      "name": "blog",
+      "portMappings": [
+        {
+          "hostPort": 80,
+          "protocol": "tcp",
+          "containerPort": 80
+        }
+      ],
+      "logConfiguration": {
+        "logDriver": "awslogs",
+        "options": {
+          "awslogs-group": "blog",
+          "awslogs-region": "us-east-1",
+          "awslogs-stream-prefix": "040code"
+        }
+      }
+    }
+  ]
+
+  EOF
+}
+
+resource "aws_ecs_task_definition" "task" {
+  family                   = "blog-blog"
+  container_definitions    = "${data.template_file.blog.rendered}"
+  network_mode             = "awsvpc"
+  cpu                      = "256"
+  memory                   = "512"
+  requires_compatibilities = ["FARGATE"]
+  execution_role_arn       = "${aws_iam_role.ecs_tasks_execution_role.arn}"
+}
+

Time to verify the code is working by executing a terraform apply

+

+

+ + + + + + + Fargate + + + +

We have still nothing running but you can already see the different parts in de AWS console. We have now a VPC, CloudWatch log group, ECS cluster and task definition available. The next logical step in de AWS console would be to create the service, and find out at the latest step that you need to create a load balancer first. So in code we will define the load balancer first. The load balancer will route traffic via HTTP to the container.

+
resource "aws_security_group" "alb_sg" {
+  name   = "blog-blog-alb-sg"
+  vpc_id = "${module.vpc.vpc_id}"
+
+  ingress {
+    protocol    = "tcp"
+    from_port   = 80
+    to_port     = 80
+    cidr_blocks = ["0.0.0.0/0"]
+  }
+
+  egress {
+    from_port = 0
+    to_port   = 0
+    protocol  = "-1"
+
+    cidr_blocks = ["0.0.0.0/0"]
+  }
+}
+
+resource "aws_alb" "main" {
+  internal        = "false"
+  subnets         = ["${module.vpc.public_subnets}"]
+  security_groups = ["${aws_security_group.alb_sg.id}"]
+}
+
+resource "aws_alb_listener" "main" {
+  load_balancer_arn = "${aws_alb.main.id}"
+  port              = 80
+  protocol          = "HTTP"
+
+  default_action {
+    target_group_arn = "${aws_alb_target_group.main.id}"
+    type             = "forward"
+  }
+}
+

We connect a target group to the load balancer. The same target group will be used later in the service, the service can register itself to the target group with the actual IP address once up and running. For the target group we have to specify the target type ip and not instance since containers running in Fargate will get their own IP. Actually this not Fargate but awsvpc behavior.

+
resource "aws_alb_target_group" "main" {
+  port        = "80"
+  protocol    = "HTTP"
+  vpc_id      = "${module.vpc.vpc_id}"
+  target_type = "ip"
+}
+
+output "blog_url" {
+  value = "http://${aws_alb.main.dns_name}"
+}
+

Again we verify our new code by executing a terraform apply.

+

+

+

We are almost there, next we define the service. A task running in in network mode awsvpc, requires a service that defines a network configuration. In the networking configuration we define a security group to control access to our containers, and we define the subnets in which the containers are hosted.

+
resource "aws_security_group" "awsvpc_sg" {
+  name   = "blog-awsvpc-cluster-sg"
+  vpc_id = "${module.vpc.vpc_id}"
+
+  ingress {
+    protocol  = "tcp"
+    from_port = 0
+    to_port   = 65535
+
+    cidr_blocks = [
+      "${module.vpc.vpc_cidr}",
+    ]
+  }
+
+  egress {
+    from_port   = 0
+    to_port     = 65535
+    protocol    = "tcp"
+    cidr_blocks = ["0.0.0.0/0"]
+  }
+
+  tags {
+    Name        = "blog-ecs-cluster-sg"
+    Environment = "blog"
+  }
+}
+

The last resource to create is the service. In the service we connect the task, load balancer and security group together. By setting the launch type to FARGATE we tell Amazon to deploy the container to Fargate.

+
resource "aws_ecs_service" "service" {
+  name            = "blog"
+  cluster         = "${aws_ecs_cluster.cluster.id}"
+  task_definition = "${aws_ecs_task_definition.task.arn}"
+  desired_count   = 1
+
+  load_balancer = {
+    target_group_arn = "${aws_alb_target_group.main.arn}"
+    container_name   = "blog"
+    container_port   = 80
+  }
+
+  launch_type = "FARGATE"
+
+  network_configuration {
+    security_groups = ["${aws_security_group.awsvpc_sg.id}"]
+    subnets         = ["${module.vpc.private_subnets}"]
+  }
+
+  depends_on = ["aws_alb_listener.main"]
+}
+

That is the last part of coding, run terraform apply and inspect the result.

+

+

+

That is all, we have now our blog running as serverless container in AWS Fargate.

+ + + + + + + Fargate + + + +

Mixing EC2 and Fargate on ECS

+

Great we have now our container running in ECS with Fargate but what if we would like to move the container to a dedicated EC2 instances in ECS. Or what if we need that are not available in in Fargate, such as a volume mount? How difficult would it be to move our containers to an ECS cluster with dedicated EC2 instances? Time to do an experiment to see how difficult is is.

+

First we refactor the above code to some generic ecs service modules to be able to define our services with just a few lines of code. This module replaces all code of defining the load balancer, service and task. It still requires a VPC, ECS cluster, CloudWatch logging group, awsvpc security group and execution role. In the code you see a similar deployment of the blog but now with a generic ECS service module.

+
locals {
+  fg_container_name = "blog"
+  fg_container_port = "80"
+}
+
+data "template_file" "blog" {
+  template = "${file("${path.root}/task-definition/blog.json")}"
+
+  vars {
+    container_name   = "${local.fg_container_name}"
+    container_port   = "${local.fg_container_port}"
+    log_group_name   = "${aws_cloudwatch_log_group.log_group.name}"
+    log_group_region = "${var.aws_region}"
+    log_group_prefix = "blog"
+  }
+}
+
+module "blog-fg" {
+  source = "npalm/ecs-service/aws" // https://registry.terraform.io/modules/npalm/ecs-service/aws
+
+  service_launch_type  = "FARGATE"
+  service_name          = "${local.fg_container_name}"
+
+  vpc_id       = "${module.vpc.vpc_id}"
+  vpc_cidr     = "${module.vpc.vpc_cidr}"
+  lb_subnetids = "${module.vpc.public_subnets}"
+  ecs_cluster_id = "${aws_ecs_cluster.cluster.id}"
+  lb_internal = false
+
+  task_definition = "${data.template_file.blog.rendered}"
+  task_cpu        = "256"
+  task_memory     = "512"
+
+  awsvpc_task_execution_role_arn = "${aws_iam_role.ecs_tasks_execution_role.arn}"
+  awsvpc_service_security_groups = ["${aws_security_group.awsvpc_sg.id}"]
+  awsvpc_service_subnetids       = "${module.vpc.private_subnets}"
+
+  lb_target_group = {
+    container_name = "${local.fg_container_name}"
+    container_port = "${local.fg_container_port}"
+  }
+
+  lb_listener = {
+    port     = 80
+    protocol = "HTTP"
+  }
+}
+

We still have our container not running in ECS on EC2 instances. For that we first have to create EC2 instances that will be attached to the same ECS cluster. For more details about create the EC2 instances see the ecs instance repo on GitHub.

+
locals {
+  key_name = "blog"
+  environment = "dev"
+}
+
+resource "aws_key_pair" "key" {
+  key_name   = "${local.key_name}"
+  public_key = "${file("id_rsa")}"
+}
+
+module "ecs_instances" {
+  source  = "npalm/ecs-instances/aws" // https://registry.terraform.io/modules/npalm/ecs-instances/aws
+
+  ecs_cluster_name = "${aws_ecs_cluster.cluster.name}"
+  aws_region       = "${local.aws_region}"
+  environment      = "${local.environment}"
+  key_name         = "${local.key_name}"
+  vpc_id           = "${module.vpc.vpc_id}"
+  vpc_cidr         = "${module.vpc.vpc_cidr}"
+  subnets          = "${module.vpc.private_subnets}"
+}
+

Now we have our EC2 instances available we only have to copy the the blog module above and change the launch type to EC2, and our container will be deployed to a dedicated EC2 instance.

+
module "blog-ec" {
+  source = "npalm/ecs-service/aws" // https://registry.terraform.io/modules/npalm/ecs-service/aws
+
+  service_launch_type  = "FARGATE"
+  service_name          = "blog-ec2"
+
+  ... SAME AS ABOVE ...
+}
+

That is all, all sample code is available at GitHub see subdir fargate-ec2. Time to run a terraform apply to see if it works.

+

+

+

In the output you will find the two endpoint links to the blogs. After a few minutes both links will be active. You can also see the service running on the Amazon console, simply navigate to the ECS console and select the cluster. You should see now one service on Fargate and the second one on EC2.

+ + + + + + + Fargate + + +
\ No newline at end of file diff --git a/2018/02/14/service-discovery-on-aws/index.html b/2018/02/14/service-discovery-on-aws/index.html new file mode 100644 index 00000000..0a236736 --- /dev/null +++ b/2018/02/14/service-discovery-on-aws/index.html @@ -0,0 +1,163 @@ +Service Discovery on AWS | 040code

Service Discovery on AWS

Enabling discovery for Spring Cloud on AWS ECS

by: niek  on 2018-02-14

Last year I wrote a post how to implement service discovery for Spring Boot applications running in Docker containers on AWS ECS. At that time the Amazon ECS agent does not have support to discover the docker exposed ports inside the container. In November 2017 Amazon released a feature in the ECS agent 1.15 to retrieve container meta data in the container. This feature makes the discovery agent obsolete.

+

The problem

+

Looking back to the last years problem. A Spring service running in a container needs its external ip address and port to register to Eureka for service discovery. A service running in a container does not know the external exposed port and docker does not support a way to obtain the port mapping. We could inject the ip address but for the port that would not work. Since the port is unknown at start time. Of course, this in only valid when using random ports. But fixing the port can eventually cause port conflicts. Besides that, you are not able to scale the container on the same host. Therefore, it makes sense to use automatic port assignment.

+

At that time I have solved this problem by adding an agent that can be called via a REST interface to lookup the exposed port based on the container id and internal port. The agent returns the external port, and the service can use this information to register itself to Eureka. This approach worked well but since the ECS agent is now shipped with a feature to retrieve the meta data we do not need longer an extra agent anymore.

+ + ECS + +

Solution

+

The approach to register the container to the discovery service remains the same. During container startup, the start script obtains the external ip address, and docker exposed port. The discovered information will be passed to the Spring Boot application using environment variables. At application start the Spring service discovery client uses the environment variables to register the application to Eureka.

+ + + + + + + Sequence Diagram + + + +

Before we are able retrieve information about the container (in the container) we need to enable the feature on the ECS instance. For more details about this feature see the Amazon documentation. To enable the meta data in the container you need to set ECS_ENABLE_CONTAINER_METADATA to true. This can be easily done by adding the line below the user data script.

+
echo ECS_ENABLE_CONTAINER_METADATA=true >> /etc/ecs/ecs.config
+

Now each created container by ECS on the EC2 instances will have the meta data available in the file assigned to the environment variable ECS_CONTAINER_METADATA_FILE. An example of the meta data looks like:

+
{
+  "Cluster": "ecs-cluster",
+  "ContainerInstanceARN": "arn:aws:ecs:eu-west-1:1234445678:some-id",
+  "TaskARN": "arn:aws:ecs:eu-west-1:1234445678:some-other-id",
+  "ContainerID": "container-id",
+  "ContainerName": "my-service",
+  "DockerContainerName": "docker-container-name",
+  "ImageID": "image-id",
+  "ImageName": "docker-image",
+  "PortMappings": [
+    {
+      "ContainerPort": 8080,
+      "HostPort": 320001,
+      "BindIp": "0.0.0.0",
+      "Protocol": "tcp"
+    }
+  ],
+  "Networks": [
+    {
+      "NetworkMode": "default",
+      "IPv4Addresses": [
+        "172.17.0.2"
+      ]
+    }
+  ],
+  "MetadataFileStatus": "READY"
+}
+

Next we fetch the ip address and port during container start. The ip address we still get through the standard amazon info endpoint.

+
export EUREKA_INSTANCE_IP_ADDRESS=$(curl --retry 5 --connect-timeout 3 -s 169.254.169.254/latest/meta-data/local-ipv4)
+

We extract the port mapping from the metadata using jq. We assume the service will run in the container on port 8080. Otherwise you can make this configurable as well.

+
export EUREKE_INSTANCE_NON_SECURE_PORT=$(cat ${ECS_CONTAINER_METADATA_FILE} | jq -c -r ".PortMappings[] | select(.ContainerPort == 8080) | .HostPort")
+

By using the Spring properties as environment variables, we can inject the information to the Spring application. Alternatively, you can use other names and assign the values in the application.yml file, see the example below.

+
eureka:
+  instance:
+    preferIpAddress: true
+    ip-address: ${EXTERNAL_IP}
+    non-secure-port: ${EXTERNAL_PORT}
+

With this approach the discovery agent becomes obsolete and we can retrieve the information for discovery through standard Amazon features. The example I have described in this post is just one way to implement service discovery in ECS, many alternatives are available.

\ No newline at end of file diff --git a/2018/03/04/verlet-integration/index.html b/2018/03/04/verlet-integration/index.html new file mode 100644 index 00000000..9fa6055d --- /dev/null +++ b/2018/03/04/verlet-integration/index.html @@ -0,0 +1,434 @@ +Verlet Integration | 040code

Verlet Integration

Physics Simulation in Clojure

by: maarten  on 2018-03-04

Introduction

+

In this post we’re going to dive into physics simulation with Clojure. The +ideas in this post were mostly inspired by this paper by Thomas +Jakobsen.

+

My motivations for working on this toy project were:

+
    +
  • Experimenting with a very mutable domain in a language with immutability at +its core
  • +
  • Having some fun by making a lot happen on screen without writing lots of code
  • +
  • Coding using emacs & CIDER (The +Clojure Interactive Development Environment that Rocks)
  • +
+

The source code can be found here. +The result:

+ +
+ +
+ +

One main- to bind them all

+

This code uses the Quil library to render points +and lines. In the main- function, the sketch macro from the Quil library is +used to bind the physics domain to the UI.

+
(defn -main []
+  (quil/sketch
+    :host           -main
+    :title          "Verlet Integration"
+    :size           [width height]
+    :setup          setup
+    :update         update-state
+    :draw           draw
+    :key-pressed    key-pressed
+    :mouse-pressed  mouse-pressed
+    :mouse-dragged  mouse-dragged
+    :mouse-released mouse-released
+    :features       [:exit-on-close]
+    :middleware     [quil-mw/fun-mode]))
+

The sketch macro basically asks the developer to configure which ‘handler +functions’ it should call when certain events occur. For instance:

+
    +
  • a key is pressed -> call key-pressed
  • +
  • the mouse is pressed -> call mouse-pressed
  • +
  • the state of your program has to be updated -> call update-state
  • +
  • it’s time to draw the new state -> call draw
  • +
  • etc.
  • +
+

Because I configured Quil to run in functional mode (quil-mw/fun-mode), Quil:

+
    +
  • Uses the return value from the :setup function as the initial state
  • +
  • Passes the state to each handler function to update it
  • +
  • Additionally passes a keyboard- and mouse event argument to keyboard - and +mouse handler functions.
  • +
+

The handler function signatures therefore look like this:

+
(defn draw          [state]       ...)
+(defn update-state  [state]       ...)
+(defn key-pressed   [state event] ...)
+(defn mouse-pressed [state event] ...)
+

World state

+

What does a snapshot of this world state look like? key-pressed gives some +hints:

+
(defn key-pressed
+  [state event]
+  (let [raw-key   (:raw-key event)
+        new-state (cond
+                   (= \b raw-key) (load-world (load-a-file "blocks.edn"))
+                   (= \c raw-key) (load-world (load-a-file "cloth.edn"))
+                   (= \p raw-key) (load-world (load-a-file "points.edn"))
+                   (= \s raw-key) (load-world (load-a-file "sticks.edn"))
+                   (= \i raw-key) (show-info-message)
+                   (= \q raw-key) (quil/exit)
+                   :else state)]
+    new-state))
+

So on pressing a key, a certain world is loaded. Let’s look into the ‘sticks’ +world:

+
{:points {:p0 {:x  10 :y   1 :oldx   0 :oldy   0}
+          :p1 {:x 100 :y 100 :oldx 100 :oldy 100}
+          :p2 {:x   0 :y 500 :oldx   0 :oldy 525}
+          :p3 {:x  25 :y 475 :oldx   0 :oldy 525}
+          :p4 {:x 250 :y 200 :oldx 250 :oldy 200 :pinned true}
+          :p5 {:x 350 :y 100 :oldx 350 :oldy 100}}
+ :sticks [{:links  [:p0 :p1] :length 138}
+          {:links  [:p2 :p3] :length  40}
+          {:links  [:p4 :p5] :length 140}]}
+

Nothing special here. Just a map containing :points and :sticks. We’ll dive +into the particulars of points and sticks soon.

+

Physics Simulation

+

This physics simulation deals with Points, and Sticks connecting Points. The +Points are the things that seem to have direction and speed, are influenced by +gravity and lose speed because of friction or because of bouncing against world +borders. The Sticks try to keep their 2 Points apart according to the configured +Stick length. The simulation loop boils down to:

+
    +
  • Update Points
  • +
  • Apply Stick constraints
  • +
  • Apply world constraints
  • +
+

In code:

+
(defn update-state
+  [state]
+  (->> state
+       (update-points)
+       (apply-stick-constraints)
+       (apply-world-constraints)))
+

This code can be read like this: ‘with state, first update-points, then +apply-stick-constraints, and finally apply-world-constrains‘.

+

Points

+

Points are the main abstraction in this code. I decided to use a record to name +them:

+
(defrecord Point [x y oldx oldy pinned])
+

A Point stores its current coordinates and the coordinates it had in the +previous world state. On top of that it has a pinned property which indicates +if a Point is pinned in space and - as a result - stays on the same coordinate. +A pinned Point can be unpinned by clicking it with the mouse pointer.

+

The update-point function calculates the velocity of the Point and adds some +gravity in the mix:

+
(defn update-point
+  [{:keys [x y oldx oldy pinned] :as point}]
+  (if pinned
+    point
+    (let [vx (velocity x oldx)
+          vy (velocity y oldy)]
+      (->Point (+ x vx) (+ y vy gravity) x y pinned))))
+

Reading superficially, this code says: if the Point is pinned then return the +same Point. Otherwise, calculate it’s velocity (based on the current - and +previous x & y coordinates), add some gravity in the y direction and return the +newly calculated Point.

+

The function uses +destructuring to name all +the arguments of the incoming Point. With destructuring, you can bind the +values in a data structure without explicitly querying the data structure. So +instead of getting each and every value out of Point and binding it to a ‘new’ +name…

+
(let [x      (:x      point)
+      y      (:y      point)
+      oldx   (:oldx   point)
+      oldy   (:oldy   point)
+      pinned (:pinned point)]
+  ...)
+

… you can very effectively tell the function that it will receive a map {} +with keys x y oldx oldy pinned and that this function should have those +variables available under the same name:

+
[{:keys [x y oldx oldy pinned] :as point}]
+

The code in my repository has some additional type hints, because I wanted the +simulation to run smooth on my laptop and wanted to learn a bit more about type +hinting and compiler optimizations.

+

And that’s it with regard to Points. In a couple of lines of code Points are +already moving and reacting to gravity in the simulation.

+

World constraints

+

It’s time for Points to meet the harsh reality of life. Walls are harder than +Points and therefore Points should bounce off of them:

+
(defn hit-floor?       [y] (> y height))
+(defn hit-ceiling?     [y] (< y 0))
+(defn hit-left-wall?   [x] (< x 0))
+(defn hit-right-wall?  [x] (> x width))
+
+
+(defn apply-world-constraint
+  [{:keys [x y oldx oldy pinned] :as point}]
+  (let [vxb (* (velocity x oldx) bounce)
+        vyb (* (velocity y oldy) bounce)]
+    (cond
+      (hit-ceiling?    y) (let [miry (- oldy)]
+                             (->Point (+ oldx vxb) (+ miry (- vyb)) oldx miry pinned))
+      (hit-floor?      y) (let [miry (+ height height (- oldy))]
+                             (->Point  (+ oldx vxb) (- miry vyb) oldx miry pinned))
+      (hit-left-wall?  x) (let [mirx (- oldx)]
+                             (->Point (+ mirx (- vxb)) (+ oldy vyb) mirx oldy pinned))
+      (hit-right-wall? x) (let [mirx (+ width width (- oldx))]
+                             (->Point (- mirx vxb) (+ oldy vyb) mirx oldy pinned))
+      ;; else: free movement
+      :else point)))
+

To explain what happens here, a picture might help.

+ + + + + + + apply world constraints diagram + + + +

Imagine a Point moved from A to B in the last Point update. This means a Point +record is persisted with its x and y being the coordinates of B and oldx +and oldy being the coordinates of A. If a wall line crossed the imaginary line +A-B, the Point history should be rewritten. In essence, line A-B is mirrored in +the wall it hits, giving rise to another imaginary line C-D where C mirrors A +and D mirrors B. The miry (mirror-y) and mirx (mirror-x) variables in the +code contain C coordinates mirroring A coordinates.

+

The simulation will take a little velocity loss into account when bouncing at +walls. Therefore, D’ is calculated by using the x and y velocities (vx and vy) +multiplied by a bounce factor (leading to the vxb and vyb variables in the +code).

+

When the world state is drawn, the Point will fly off in exactly the right +direction. Additionally, because of the history rewrite, subsequent Point +updates will keep moving the Point in the right direction.

+

The picture shows the situation when hitting the ceiling. Hitting the floor and +the walls works similar. And that’s all the math and code you need to simulate +Points moving in a bounded space. Now let’s add Sticks to the simulation.

+

Stick constraints

+

Not only walls are restricting Points from free movement; Sticks also constrain +them. A Stick connects 2 Points and has a configured length. The goal of the +Stick constraint is to move the Points at the end of the Stick to the configured +length of the Stick.

+ + + + + + + apply stick constraints diagram + + + +

Instead of trying to calculate the solution that satisfies all Stick constraints +at once, this code simply looks at one Stick at a time and ‘solves’ the +constraint problem by repeatedly solving Stick constraints in isolation.

+
(defn apply-stick-constraint
+  [{length :length :as stick}
+   {p0x :x p0y :y oldp0x :oldx oldp0y :oldy pinp0 :pinned :as p0}
+   {p1x :x p1y :y oldp1x :oldx oldp1y :oldy pinp1 :pinned :as p1}]
+  (let [{:keys [dx dy distance]} (distance-map p0 p1)
+        difference (- length distance)
+        fraction   (/ (/ difference distance) 2)
+        offsetX    (* dx fraction)
+        offsetY    (* dy fraction)
+        p0-new     (->Point (- p0x offsetX) (- p0y offsetY) oldp0x oldp0y pinp0)
+        p1-new     (->Point (+ p1x offsetX) (+ p1y offsetY) oldp1x oldp1y pinp1)]
+    [(if pinp0 p0 p0-new) (if pinp1 p1 p1-new)]))
+

apply-stick-constraint takes a Stick and 2 Points (P0 and P1) as arguments. +These arguments are heavily destructured. To understand what happens precisely, +the next picture might be helpful:

+ + + + + + + stick math diagram + + + +

Let P0 and P1 be two Points with a Stick S between them. P0 and P1 have already +been updated by the update-point function and their new (x,y) coordinates are +(40,50) and (70,90) respectively. This means:

+
    +
  • dx = 30
  • +
  • dy = 40
  • +
  • distance = 50
  • +
+

Since the Stick between P0 and P1 was configured to have a length of 150, and +we want P0 and P1 to be adjusted by the same amount, P0 should be located at +Point S0 (10,10) and P1 should be located at Point S1 (100,130). This is +exactly what apply-stick-constraint achieves:

+
    +
  • The difference in the configured length of the Stick and the distance of P0 +and P1 is 100
  • +
  • The fraction of the distance between P0 and P1 that needs to be added to +P0 AND to P1 is 1. So by extending the distance P0 and P1 with exactly 50 +(distance times fraction) in both directions, we’ll solve the Stick +constraint.
  • +
  • This is done by using offsetX on P0x and P1x and using offsetY on P0y and +P1y
  • +
+

Conceptually a scaled helper triangle is used to move P0 and an identical scaled +helper triangle is used to move P1. The scale of this triangle is determined by +the fraction which in this case is 1. These triangles are depicted in red.

+

Each Stick in the world is updated before a new world frame is drawn. It is very +well possible that the neatly placed P0 and P1 are moved to different +coordinates by another Stick constraint before the complete update is over. This +sometimes results in wiggly behavior, although in most cases, the simulation +is perceived to behave naturally.

+

Drawing

+

Finally, the Points and Sticks have to be drawn on screen:

+
(defn draw
+  [state]
+  (quil/background 255)
+  (if (:info-message state)
+    (quil/text info-message 20 20)
+    (do
+      (doseq [point (vals (:points state))]
+        (quil/ellipse (:x point) (:y point) 7 7))
+      (doseq [stick (:sticks state)]
+        (let [points (:points state)
+              p0     ((first (:links stick)) points)
+              p1     ((last  (:links stick)) points)]
+          (quil/line (:x p0) (:y p0) (:x p1) (:y p1)))))))
+

Start by clearing the screen. If there is an :info-message entry in the +state, draw the info-message. Otherwise draw all Points in state as a +quil/ellipse and draw all Sticks as a quil/line. And that’s all folks!

+

Conclusion

+

As always, it was a pleasure working with Clojure. It turns out to be easy to +work in a very mutable domain with mostly pure functions, also thanks to the +excellent Quil library.

+

My current version of cloc tells me that +core.clj is 230 lines long, but it counts the function documentation as code. +Therefore, I ran a new cloc command without the doc strings. It then counts +159 lines of clojure, approximately half of which are dedicated to UI +interaction and the other half to physics simulation. Not bad at all!

+

I’m glad I decided to ‘bite the bullet’ and learn Emacs and CIDER. I now use +Emacs for all my Clojure(script) development. In addition, I use Emacs for most +of my text editing these days including writing and planning.

+

I’d like to thank Michiel Borkent a.k.a. +@borkdude for reviewing an earlier version of +the code and giving me very helpful feedback. Faults and not-so-idiomatic +Clojure code remaining are my own.

+

Please share your comments, suggestions and thoughts about this blog post on +twitter.com/mmz_. Thanks for reading and Happy +Coding!

+ +
\ No newline at end of file diff --git a/2018/05/26/immutable-infrastructure-taipei/index.html b/2018/05/26/immutable-infrastructure-taipei/index.html new file mode 100644 index 00000000..beabbaea --- /dev/null +++ b/2018/05/26/immutable-infrastructure-taipei/index.html @@ -0,0 +1,189 @@ +Immutable Infrastructure | 040code

Immutable Infrastructure

Cloud Native User Group Taipei

by: niek  on 2018-05-26

The Docker slogan ‘Build, Ship, and Run’ advertises easy set up of immutable software builds, but it is not always that easy. Setting up immutable builds with Docker is pretty straight forward and shipping is just a matter of pushing the image to a repository. The next step is building the cloud infrastructure to run the containers. In the talk at +the Cloud Native Meetup in Taipei I have shown how to create an immutable infrastructure on AWS with Terraform. The example belows shows how you can run your micro services in docker containers on AWS.

+

In this talk I briefly touch upon building immutable software. But the main focus of the talk will be on creating an immutable infrastructure. In this talk I will show you how to create an immutable infrastructure on AWS with Terraform. I will use a real world example to explain and show live how easy you can get micro services live on AWS and continuously apply changes to the same cloud environment..

+

Slides

+

Below the slides that I used for the talk, the slides are available as well on +GitLab. You can easy navigate through the slides with the spacebar.

+
+ +
+

To get started with Terraform the best starting points are:

+ +

Examples

+

Hello World

+

During the talk, I demonstrated a hello world example, see the link above. This examples shows some basics of terraform by creating a ec2 instance and security group to server a simple web application. The example only works in the AWS region eu-west-1 since the AMI used is only available in this region.

+

ECS demo

+

The second example I have shown, is creating an immutable infrastructure to server docker containers. The picture below descibes briefly the enviroment that will be cretaed.

+ + + + + + + ecs-diagram + + + +

The example also creates log groups in cloudwatch to capture the logging of the ecs agent and the running containers (services).

+

Setup

+

Before you can start, you need an AWS account with sufficient rights (admin), and you should create a AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY to be able to access your account programmatically.

+

Clone the repository containing the ECS sample terraform code. To create the infrastructure step-by-step you can check out the tags vpc and ecs.

+
git clone https://github.com/npalm/tf-ecs-demo.git
+git checkout taipei-vpc
+

You should also have Terraform installed (home brew install terraform) and +tfenv to manage your terraform installation. Alternatively use a docker container to run the terraform commands, for example:

+
docker run -it --env-file <AWS_KEYS_FILE> -v $(pwd):/data -w /data \
+  hashicorp/terraform:0.10.4 <terraform command>
+
+

In this example you can swithc the reqion by changing the region variable +aws_region to your own choice. Or set the following environment variable: export TF_VAR_aws_region=ap-northeast-1 +for Tokyo.

+

Create network layers (VPC)

+

In the next steps we will create the network layers.

+

First, we initialize and plan our changes.

+
terraform init
+terraform plan
+

Terraform should print on the console that 19 needs to be added and 0 to change or destroyed. Next we apply the change be executing terraform apply.

+

Add ECS cluster

+

Now we have the network layer created, we will add the ECS cluster. By default the bastion host is disabled, the bastion can be enabled by updating the variable enable_bastion in the terraform.tfvars file. Time to plan and apply the new resources for ECS.

+
git checkout taipei-ecs-1
+terraform plan
+terraform apply
+

Once terraform is ready it will print the url of two applications on the console. One application, is a simple micro service that just prints the AWS availabilty zone where it is running, the other is a graphql micro service. It will take a few minutes before the services are available.

+

Adding your own service.

+

Time to have some more fun. Edit the main.tf and start making changes. Remove all the services, add your own service. By default for each service an application load balancer (ALB) is created. Add for each services that you want to deploy a configuration as below and update the variables as required.

+
module "your-service" {
+  source = "ecs-service"
+
+  service_name   = "<service-name>"
+  image_url      = "<docker-image>"
+  container_port = <port in the container where the service is listening>
+  desired_count  = <number of instances>
+
+  aws_region  = "${var.aws_region}"
+  environment = "${var.environment}"
+
+  vpc_id  = "${module.vpc.vpc_id}"
+  subnets = "${module.vpc.public_subnets}"
+
+  cluster_id            = "${module.ecs-cluster.cluster_id}"
+  ecs_service_role_name = "${module.ecs-cluster.ecs_service_role_name}"
+}
+

Now plan and apply your changes, Terraform will inform you that a few resources will be destroyed (the removed services) and a few will be added.

+

Clean up

+

Once done you can easily clean-up all created resources in AWS, just run terraform destroy.

+

Serverless containers.

+

Since a few months Amazon support running containers without managing your +ec2 instances, aka Serverless Containers. This services is called Fargate. I +have written a blog +post about +how to run you containers serveless with terraform. Creating a mix of both +ways of running of containers is explained as well. Be aware that Fargate is +still only avaialable in us-east-1.

+

Have fun!

\ No newline at end of file diff --git a/2018/08/08/microhack-brew-your-code/index.html b/2018/08/08/microhack-brew-your-code/index.html new file mode 100644 index 00000000..b6a10270 --- /dev/null +++ b/2018/08/08/microhack-brew-your-code/index.html @@ -0,0 +1,172 @@ +Microhack Brew your code | 040code

Microhack Brew your code

How to create a brew package

by: jeroen  on 2018-08-08

Working on a Mac made my work a lot more fun. Especially when I was introduced to homebrew, the missing package manager for macOS.

+

MacPorts was fine, but it felt clumsy. Every tool seems to be switched to Homebrew and life was good.. Except when you encounter that one tool you need but is not available in brew…

+

Meet Gits

+

An example of this is the great shell script made by Roy Lines: gits. +A shell script to share contribution between two git accounts when pair programming.

+

Unfortunately you have to install it by getting a remote bash script and add it in your /usr/local/bin directory with root rights.

+
$ sudo wget https://raw.github.com/roylines/gits/master/gits.sh -O /usr/local/bin/gits
+$ sudo chmod ugo+x /usr/local/bin/gits
+$ gits
+

When I see something like this, it’s another hurdle for using great scripts. It’s a good practice to check these scripts, before putting them into your bash with execution rights. Sometimes, I’m to lazy to do that.. +Also I always tend to forget these scripts, so they are never updated and never removed. Your system becomes a mess.

+

More people did not like that. An issue was raised with a question whether it could be installed with homebrew..

+
+

How can it install it on mac? I would prefer to use homebrew.

+
+

Well, let’s help Adam!

+

Create our own tap

+

Correct format

+

First step is to change the structure of your script so it can be used for brew. +Scripts need to be in the bin/ directory so that is the first thing we need to do.

+

Simply moving the script to the bin directory..

+

https://github.com/JeroenKnoops/gits/commit/4de9197fe1e24b751af2a1fe214b4259bf256c49

+

Release the script

+

You have to create a release of your script. You can do that by drafting a new release

+

Once you have a release, we need the SHA-256 checksum of the release to ensure a proper version of the download. +Browse to the release and copy the name of the tar-file (in our case: https://github.com/JeroenKnoops/gits/archive/0.1.0.tar.gz)

+

Download the tar and generate the SHA-256.

+
$ wget https://github.com/JeroenKnoops/gits/archive/0.1.0.tar.gz
+$ shasum -a 256 0.1.0.tar.gz
+13b778bf5a7f92285f54179cd88bea4b39f661a3de47a7ff0a84b9aa5d865962  0.1.0.tar.gz
+

We will need this SHA-256 for our formula.

+

Define the Formula

+

We have to define the formula. This can be done by creating a repo called homebrew-tap in your own github repo. +It’s best practice to put some information in the README of this repo about the Formulas which are defined.

+

In our case:

+
## homebrew-tap
+Homebrew tap with formula for installing the following:
+
+- [gits](https://github.com/jeroenknoops/gits)
+
+
+#### Add this tap
+`brew tap jeroenknoops/tap`
+
+
+#### Install
+- gits: `brew install gits`
+

In the /Formula directory you must create a ruby file with the definition, in our case: gits.rb

+
class Gits < Formula
+  desc "A shell script to share contribution between two git accounts when pair programming."
+  homepage "https://github.com/jeroenknoops/gits"
+  url "https://github.com/JeroenKnoops/gits/archive/0.1.0.tar.gz"
+  version "0.1.0"
+  sha256 "13b778bf5a7f92285f54179cd88bea4b39f661a3de47a7ff0a84b9aa5d865962"
+
+  def install
+    bin.install "bin/gits"
+  end
+end
+

Push the repo to github and we’re ready to go.

+

Test it

+

Now people can use the script by installing it with homebrew. +It’s still in my private homebrew-tap, so people first have to tap into our private tap.

+
brew tap jeroenknoops/tap
+

After that they can install gits with brew install gits

+

I do not want to tap into someone’s tap

+

To even raise the level of trust of the script / tool and install convenience, you can also put the Formula directly into the homebrew-core. Now people don’t need to tap into someones private tap. +This will require some extra steps, like adding tests.

+

Brew has a way to test your formula by doing: brew audit --new-formula gits

+

This will show you what you still need to do, before you can submit it to homebrew. You can also find more information on that in the Formula-Cookbook

+

Improvements

+

There are more improvements I should make to release it to homebrew. F.e. add dependencies to git. +For now I’m not going to dive into that. Homebrew has good documentation on that: https://docs.brew.sh/Formula-Cookbook

+

Conclusion

+

I really liked the way homebrew is set up. I like the way they name things, like brew, tap and bottle. By adding my own bottle I’ve learned how homebrew is working and now I even feel more confident in using it. I like the fact that only bottles with tests and with the proper dependencies check can be added in the core homebrew formulas.

+

Homebrew cask

+

Homebrew has another great feature, called homebrew cask. No more: “To install, drag this icon..“. Now you can install tools like atom or 1password by simply calling: brew cask install atom

+

More info

+
\ No newline at end of file diff --git a/2018/08/22/maze-generation/index.html b/2018/08/22/maze-generation/index.html new file mode 100644 index 00000000..b2898792 --- /dev/null +++ b/2018/08/22/maze-generation/index.html @@ -0,0 +1,391 @@ +Maze Generation | 040code

Maze Generation

Generating Mazes from the REPL

by: maarten  on 2018-08-22

Introduction

+

During my summer holiday, in between long walks and nice food & drinks, I felt +like writing some code for fun. Unfortunately, I didn’t bring my laptop. +Luckily, Mike Fikes created a ClojureScript REPL +for mobile devices to +write some Clojure(script) without a laptop close at hand.

+

A REPL, or a Read Eval Print Loop, reads your input, evaluates it, prints the +result and waits for new inputs to read. In the meantime, the code you wrote +lives in REPL memory. So if I define a function in the REPL, it will be read and +evaluated and in my next input I can call this function, because it lives in +REPL space.

+

So, back to this REPL on my phone. Permanently saving work is not possible in +this REPL, there are no debugging capabilities, no code completion, no test +runners … just a REPL: 35 characters wide in portrait mode, 79 characters wide +in landscape mode. To give you an idea of my ‘Integrated Development +Environment’ and the resulting mazes, I recorded a 30 seconds screen cast:

+ +
+ +
+ +

At home, I created a gist containing all 70 lines of maze +code (56 +lines according to the command-line tool cloc). In this blog I’m going to explain +the concepts and code.

+

Grids, Cells and Neighbours

+

First of all, we’ll need a grid and a coordinate system to point to individual +cells in the grid. The reason is that most maze generators expect to be able to +traverse a grid and lookup information about cells and neighbours of cells.

+

A grid can be modeled as a vector of vectors, representing rows and columns:

+
(def grid
+  [[1 2 3]
+   [4 5 6]
+   [7 8 9]])
+

A cell can be pinpointed by its [row col] coordinate which matches perfectly +with the get-in function in clojure. This get-in function is used to find +items in nested data structures. For instance, (get-in grid [2 1]) will result +in the value 8.

+

To find the neighbours of a cell, I created a couple of helper functions:

+
(defn north-of [[row col]] [(dec row) col])
+(defn south-of [[row col]] [(inc row) col])
+(defn west-of  [[row col]] [row (dec col)])
+(defn east-of  [[row col]] [row (inc col)])
+

The function argument is destructured (taken apart and named) and the +north-of, south-of, west-of or east-of neighbour coordinate is +calculated by incrementing or decrementing the row or column number. For +instance, (north-of [1 1]) results in the value [0 1].

+

Using the juxt function we can now calculate all neighbours in one go. juxt +takes a variable number of functions as arguments and returns a new function. +This new function returns a vector containing the result of applying each +function to the arguments provided. So for instance ((juxt north-of south-of +west-of east-of) [1 1]) results in the value [[0 1] [2 1] [1 0] [1 2]].

+

Unfortunately, these functions don’t care about the grid. ((juxt north-of +south-of west-of east-of) [0 0]) will happily return [[-1 0] [1 0] [0 -1] [0 +1]] containing cell coordinates inside AND outside the grid. Therefore, in +order to calculate all neighbours in the grid, we need to filter out the +ones that are not part of the grid. This results in the following neighbours +function:

+
(defn neighbours [grid cell]
+  (filter #(get-in grid %) ((juxt north-of south-of west-of east-of) cell)))
+

Mazes and Cells

+

Now working with the grid is easy, let’s move on to the maze. A maze is +basically a grid, augmented with some information to determine if borders +between cells are open or closed. That information can be easily stored in the +cells themselves.

+

I liked the approach Mark +Bastian +took: in a cell, simply list the coordinates of neighbours the cell is connected +to. We can even list the coordinates in a set #{}, since duplicating neighbour +coordinates is useless. A 2x2 ‘maze’ with all borders closed looks like this:

+
[[#{} #{}]
+ [#{} #{}]]
+

A 2x2 ‘maze’ with an open border between the 2 cells on the left looks like this:

+
[[#{[1 0]} #{}]
+ [#{[0 0]} #{}]]
+

The two connected cells reference each other. It would be convenient to have a +function that updates the grid when a border needs to be removed between 2 +cells:

+
(defn remove-border [grid c1 c2]
+  (-> grid
+      (update-in c1 conj c2)
+      (update-in c2 conj c1)))
+

Maze Generation

+

Now it’s time for the maze generation. Luckily I had a copy of the ‘Mazes for +Programmers +book’ +on my phone. Because I like the texture of the mazes coming out of the recursive +backtracker algorithm, I decided to implement that one.

+

The algorithm can start on any cell on the grid and I decided to start on [0 +0] every single time. Every cell that is visited by the algorithm is pushed on +a stack which I have called the backtrackstack. The cell on top of the stack +is considered the current cell.

+

From the current cell, a path is created (remove-border) to a randomly +selected, previously unvisited neighbour. An unvisited neighbour can easily be +detected, since it’s simply an empty set #{}. That previously unvisited cell +(next in my code) is also pushed unto the stack. This process repeats +continuously until a cell is visited that has no unvisited neighbours. At that +point, that dead-end cell is popped of the stack, making the previous cell the +current cell. Again, the algorithm will check if this cell has unvisited +neighbours and will either create a path to that unvisited neighbour or pop +another cell from the backtrackstack. This will continue until every cell has +been visited and the backtrackstack is empty.

+
(defn find-unvisited-neighbours [grid cell]
+  (let [n (neighbours grid cell)]
+    (filter #(empty? (get-in grid %)) n)))
+
+(defn generate-maze [rows cols]
+  (loop [maze           (create-grid rows cols)
+         backtrackstack '([0 0])]
+    (if (empty? backtrackstack)
+      (print-maze maze)
+      (let [unvn (find-unvisited-neighbours maze (first backtrackstack))]
+        (if (empty? unvn)
+          (recur maze (rest backtrackstack))
+          (let [next (rand-nth unvn)]
+            (recur
+             (remove-border maze (first backtrackstack) next)
+             (conj backtrackstack next))))))))
+

Fingers crossed:

+
 (generate-maze 4 4)
+
+[[#{[1 0]} #{[0 2]} #{[0 3] [0 1]} #{[1 3] [0 2]}]
+ [#{[0 0] [2 0]} #{[2 1] [1 2]} #{[1 1] [1 3]} #{[2 3] [0 3] [1 2]}]
+ [#{[1 0] [3 0]} #{[2 2] [1 1]} #{[2 1] [3 2]} #{[3 3] [1 3]}]
+ [#{[2 0] [3 1]} #{[3 0] [3 2]} #{[2 2] [3 1]} #{[2 3]}]]
+
+ (generate-maze 4 4)
+
+[[#{[0 1]} #{[0 0] [0 2]} #{[1 2] [0 1]} #{[1 3]}]
+ [#{[1 1] [2 0]} #{[1 0] [1 2]} #{[1 1] [0 2]} #{[2 3] [0 3]}]
+ [#{[1 0] [2 1]} #{[2 0] [3 1]} #{[2 3]} #{[2 2] [3 3] [1 3]}]
+ [#{[3 1]} #{[3 0] [2 1] [3 2]} #{[3 3] [3 1]} #{[2 3] [3 2]}]]
+
+ (generate-maze 6 4)
+
+[[#{[1 0]} #{[0 2]} #{[0 3] [0 1]} #{[1 3] [0 2]}]
+ [#{[0 0] [2 0]} #{[2 1] [1 2]} #{[1 1] [1 3]} #{[2 3] [0 3] [1 2]}]
+ [#{[1 0] [3 0]} #{[1 1] [3 1]} #{[3 2]} #{[3 3] [1 3]}]
+ [#{[2 0] [3 1]} #{[3 0] [2 1]} #{[2 2] [4 2]} #{[4 3] [2 3]}]
+ [#{[4 1] [5 0]} #{[4 0]} #{[4 3] [5 2] [3 2]} #{[3 3] [4 2]}]
+ [#{[5 1] [4 0]} #{[5 2] [5 0]} #{[4 2] [5 3] [5 1]} #{[5 2]}]]
+

Nice! Now the only thing left is printing a more human friendly view of this +maze.

+

Maze Printing

+

First, the top of the maze is printed:

+
`+---+---+---+`
+

Then, for every row the left border is printed | and 2 passes over the cells +have to be made. The first pass determines if there should be a border between +the current cell and its east-of neighbour, resulting in something like this:

+
+---+---+---+---+
+|           |   |
+

The second pass over the row adds a + and then determines if there should be a +border between the current cell and its south-of neighbour, for instance +resulting in this:

+
+---+---+---+---+
+|           |   |
++---+---+   +   +
+

After repeating this for all rows, a maze like this is printed:

+
+---+---+---+---+
+|           |   |
++---+---+   +   +
+|       |       |
++   +   +---+   +
+|   |       |   |
++   +---+   +   +
+|       |       |
++---+---+---+---+
+

The code:

+
(defn east-open-border? [maze cell]
+  (contains? (get-in maze (east-of cell)) cell))
+
+(defn south-open-border? [maze cell]
+  (contains? (get-in maze (south-of cell)) cell))
+
+(defn print-cell-body [maze cell]
+  (if (east-open-border? maze cell)
+    "    "
+    "   |"))
+
+(defn print-cell-bottom [maze cell]
+  (if (south-open-border? maze cell)
+    "   +"
+    "---+"))
+
+(defn print-maze [maze]
+  (let [result (atom [])
+        rows   (range (count maze))
+        cols   (range (count (get-in maze [0])))]
+    (swap! result conj "+" (repeat (count cols) "---+") "\n")
+    (doseq [row rows]
+      (swap! result conj "|")
+      (doseq [col cols]
+        (swap! result conj (print-cell-body maze [row col])))
+      (swap! result conj "\n" "+")
+      (doseq [col cols]
+        (swap! result conj (print-cell-bottom maze [row col])))
+      (swap! result conj "\n"))
+    (println (s/join (flatten @result)))))
+

Finally, we can print all the mazes we want:

+
(generate-maze 4 4)
+
++---+---+---+---+
+|   |           |
++   +   +   +---+
+|   |   |       |
++   +---+---+   +
+|   |       |   |
++   +   +   +   +
+|       |       |
++---+---+---+---+
+
+(generate-maze 4 4)
+
++---+---+---+---+
+|       |       |
++---+   +   +   +
+|   |   |   |   |
++   +   +---+   +
+|   |       |   |
++   +---+   +   +
+|               |
++---+---+---+---+
+
+(generate-maze 8 18)
+
++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
+|   |               |   |       |                   |       |           |
++   +   +   +---+   +   +   +   +   +---+   +---+   +   +   +---+---+   +
+|   |   |   |   |   |   |   |       |   |   |           |           |   |
++   +---+   +   +   +   +   +---+---+   +   +---+---+---+---+---+   +   +
+|       |   |       |   |   |           |           |   |           |   |
++---+   +   +   +---+   +   +   +---+---+   +---+   +   +   +---+---+   +
+|   |       |   |       |   |   |       |   |       |       |           |
++   +---+---+   +   +   +   +   +   +   +---+   +---+   +---+   +   +   +
+|           |   |   |   |       |   |           |   |   |   |   |   |   |
++   +---+---+   +   +   +   +---+   +---+---+---+   +   +   +   +   +   +
+|   |           |   |       |       |   |           |   |       |   |   |
++   +   +---+---+---+---+   +   +---+   +   +---+   +   +---+   +   +   +
+|   |   |               |   |       |   |       |   |       |   |   |   |
++   +   +---+   +---+   +---+---+   +   +---+   +   +---+   +---+   +   +
+|               |                   |           |                   |   |
++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
+

Conclusion

+

So there you have it: a maze generator in ~ 30 lines of code with a 30 lines of +code ascii view on top of it, build with nothing but a REPL on a phone. I really +enjoyed the puzzle and the small (and large) successes while working in the +REPL. I hope you enjoyed this recap.

+

I’d like to thanks Mike Fikes for his excellent +ClojureScript REPL, Mark Bastian for the +inspiration for the maze data structure, Jamis Buck +for his lovely ‘Mazes for programmers’ book and Gert +Goet for reviewing an earlier version of this +blog. Faults and not-so-idiomatic Clojure code remaining are my own.

+

Back home, I’m happy to be working in Emacs with the excellent Clojure CIDER +plugin again. Which reminds me that during my holiday I visited a picturesque +CIDER factory in France. Cheers!

+ + + + + + + CIDER factory + + + +

Please share your comments, suggestions and thoughts about this blog post on +twitter.com/mmz_. Thanks for reading and Happy +Coding!

+ +
\ No newline at end of file diff --git a/2018/09/05/full-stack-fest-2018/index.html b/2018/09/05/full-stack-fest-2018/index.html new file mode 100644 index 00000000..a1d28e6c --- /dev/null +++ b/2018/09/05/full-stack-fest-2018/index.html @@ -0,0 +1,236 @@ +Full Stack Fest 2018 | 040code

Full Stack Fest 2018

Backend days

by: jeroen niek  on 2018-09-05

Full Stack Fest 2018

+

This week we (Jeroen, Niek, Gertjan, Eric and Kike) are enjoying Full Stack Fest 2018 Barcelona, +a week-long full stack development conference with a focus on solving current problems with new & inspiring perspectives.

+

In this quite short blog we just summarizing briefly the talks and our opinion about the talks. We have rated all talks, the rating is subjective as well.

+

This conference is split up in two parts. The first two days were focussed on Frontend development. You can read our post about it here

+

First of all we would like to thank Luca Marchesini for hosting the sessions.

+

Day one

+

Reinvent the social web

+

Rating: ⭐ ⭐ ⭐ ⭐

+

André Staltz (@andrestaltz) explained the problems we have with the current generation of social networks. Are the realy open, free, innovative? Can we trust and respect people in the network. He explained passionated how we can change the future with decentralized networks such as scuttlebutt.

+

Open Gateway - Decentralized IoT

+

Rating:

+

Kalyan Dikshit (@decode_dev) presents about the open gateway initiative from Mozilla. Not our topic.

+

Build and deploy a Blockchain web-app with Hyperledger Fabric and Hyperledger Composer

+

Rating: ⭐ ⭐ ⭐

+

Hyperledger is something we’re looking into right now, so this talk was very relevant. Horea Porutiu (@horeaporutiu) showed the basic things about hyperledger and that’s great for this audience. Great balance between technical information, examples and real applications of the chain. Their work with Brooklyn Roasting Company was a good example how to use the blockchain. It shows an audit trail on your coffee.

+

A Game of Theories: Why languages do what they do

+

Rating: ⭐ ⭐ ⭐ ⭐ ⭐

+

Rae Krantz (@rustbeltrae) quickly compared the ugly and beauty of Ruby, Python, Go, Clojure, JavaScript, Erlang, Rust and Elixir. Yeah we never will do Clojure and from tomorrow we only do Rust and Elixir. Awesome session. Best quote of the day: “JavaScript was written in the time of Netscape when Java was popular.” :)

+

The Future of ChatBots in the Travel Industry

+

Rating: ⭐ ⭐ ⭐

+

Prabh Simran Singh Baweja

+

Designing a chatbot is not that easy as it sounds. “Book me a hotel for this weekend.” What kind of hotel? Where? Weekend, is it friday and saturnday or is it saturday and sunday? How to combine data in a good way so people are not annoyed. Nice insights on how bookings.com is building these bots. +Look at his slides

+

Avoiding Digital Bias

+

Rating: ⭐ ⭐ ⭐ ⭐

+

Adam L Smith (@adamleonsmith)

+

In modern worlds we use large datasets to tune our models. This is not without danger. Our datasets are often biased. Good tips on how to test if the models are digitally bias, by changing some of the fields like gender. Never use stock images. Nice example was shown if you google on CTO. This is not a good representation of the world. Enough food for thoughts!

+

Everything I always wanted to know about crypto, but never thought I’d understand

+

Rating: ⭐ ⭐ ⭐

+

Sasha Romijn (@mxsash) gave a fast introduction to cryptographic basic concepts that every developer should know. Quote: “Export in cypher builder should ring an alarm bell” +A good overview of the magical world of Crypto. If you want to learn more about this, I would certainly recommend a free coursera course on this topic given by Dan Boneh.

+

Onion adventures: how to use onion services and the Tor network in your web endeavors

+

Rating: ⭐ ⭐ ⭐

+

Respect for Silvia Puglisi (@nopressure) for giving this talk when she has the flu. Very good to see all the activity around Tor. Important to keep on bringing the message it’s not that obvious to have freedom of speech and expression. /me installing TOR.

+

Everything in sketchnotes..

+

A big shoutout to Christin Westermann (@c16n) for creating these sketchnotes!

+ + + + + + fullstackfest-2018-01 + + + + + + + + fullstackfest-2018-02 + + +

Day 2

+

Observability for Emerging Infra: What Got You Here Won’t Get You There

+

Rating: ⭐ ⭐ ⭐ ⭐

+

Charity Majors (@mipsytipsy) gave a very good talk on how to look at current systems. In the current era, you cannot simply say: “Our application is up..” What does that mean? What’s up? Move away from the known-unknowns which can be monitored with dashboards, but look at the real problems users experience. Focus on the unknown-unknowns and make sure you can react and analyse your applications fast. Don’t aggregate data, because you will lose important details about problems. Come up with good sampling strategies. Build observability in from day one! Cool shirt, “I test in prod”. Quote: “What is unknown, we must leave uncoded.”

+

Do you need a Service Mesh?

+

Rating: ⭐ ⭐ ⭐ ⭐

+

A great presentation given by Matt Turner (@mt165pro) about Service Mesh. He demo-ed the principles of Service Mash by using istio.io. He used kubernetes to demo some of the configuration you can setup with only proxy-ing between different services. Very powerful concept. I’m wondering how this can be used in an infrastructure-as-code architecture.

+

HTTP and JSON for your gRPC Services

+

Rating: ⭐ ⭐ ⭐ ⭐

+

Michael Hamrah (@mhamrah) gRPCed all the things. First feeling was Oh no we go to do again CORBA, and there are similairities between gRPC and CORBA. In this talk Michael explained how you can build high performance application and left the all the plumbing code to the gRPC framweork. Just simply define an interface via IDL and only take care of the real business code. It was also nice to see how you can combine gRPC via rejoiner with GraphQL. Slides are available here

+

Software Engineering - A philosophical activity

+

Rating: ⭐ ⭐ ⭐ ⭐

+

Tom Enden (@tom_enden): Did you know that Plato invented OOP and the Prototype pattern is inspired by Nominalism which also dates back to Plato. Tom showed the parallels between philosophy and software engineering. According the pragmatic programmer we should learn at least one language every year. Since different languages solved things in different ways. And Tractatus says the limits of my language means the limit of the world. So looking on philosophy we can inspire our selves for new ideas. The slides

+

Take a (Client) Hint!

+

Rating: ⭐ ⭐ ⭐ ⭐

+

Jeremy Wagner (@malchata) explained nicely the power of client hints. Having a fast internet and reliable internet connection is still not common. For example a survey by Pew Research shows that one-third of American adults do not subscribe to any internet access faster than dial-up at their home. So building responsive clients on slow or unreliable networks still counts. Client hints comes in different types. By opting in (header ACCEPT-CH) a client can inform that it understands client hints, Device hints enables for example responsive images and netwrok hints can inform the server about the speed of the network of the client. The slides are here available.

+

Lost in transaction? Strategies to deal with (in-)consistency in distributed systems

+

Rating: ⭐ ⭐ ⭐ ⭐

+

Bernd Rücker (@berndruecker) is a (work-)flow automation enthusiast. He explained the strategies to deal with the temporary inconsistency and how you can convert it to consistency again using the starbucks as example. One can use different approaches to it. Chorography vs orchestration. +These kind of problems can be solved by using a BPMN product like Camunda. System become complexer every day and this will become a bigger problem everyday. And what should we never forget: Zucchini and idempotency.

+

This talk triggered a lot of thoughts for me personally. This is one of the areas where blockchain might actually solve things. Use smartcontracts to atomically commit transactions all at the same time. Fortunately he already wrote a blog post about the topic. Great speaker! +Bernd Ruecker’s blog

+

Lightning talks

+

Antiona Librada (@antoniolibrada) showed us how he improved a complex ci build pipeline which took > 45 minutes to run by using 2 lambdas and Amazon Code Build. The outcome was a more stable, cheaper and faster build pipeline. They increased the number of daily deployments drastically.

+

Peter van der Meulen (@HendrikPetertje) showed us his terminal. This shows again how important improving your daily workflow is. Some highights: Spotify in Vim, thefuck, circleci-cli, wee-slack. For more info: snippets and projects

+

Aaron Bassett (@aaronbassett) showed us some amazing (and probably illegal) things about SMS. Here you can find his slides. Really scary.

+

Two nice talks on our power as developers to shape the world. Let’s do this right this time.

+

Cats, The Musical! Algorithmic Song Meow-ification

+

Rating: ⭐ ⭐ ⭐ ⭐

+

Awesome to see how Beth Haubert (@haubertdashery) passionated hacked her way around to generated a cat meow song from songs using ruby. It was really fun to see, how the program evolved! Especially because at the end, the result was really terrible..

+

Everything in sketchnotes..

+

A big shoutout to Christin Westermann @c16n for creating these sketchnotes!

+ + + + + + fullstackfest-2018-03 + + + + + + + + fullstackfest-2018-04 + + +fullstackfest-2018-05

Read next:

\ No newline at end of file diff --git a/2018/09/18/full-stack-fest-2018-frontend/index.html b/2018/09/18/full-stack-fest-2018-frontend/index.html new file mode 100644 index 00000000..c0ec89f1 --- /dev/null +++ b/2018/09/18/full-stack-fest-2018-frontend/index.html @@ -0,0 +1,220 @@ +Full Stack Fest 2018 | 040code

Full Stack Fest 2018

Frontend days

by: jeroen niek  on 2018-09-18

Full Stack Fest 2018

+

This week we (Jeroen, Niek, Gertjan, Eric and Kike) are enjoying Full Stack Fest 2018 Barcelona, +a week-long full stack development conference with a focus on solving current problems with new & inspiring perspectives.

+

This conference is split up in two parts. The first two days were focussed on Backend development. You can read our post about it here

+

In this quite short blog we just summarizing briefly the talks for the second part, the front-end part. It’s our opinion about the talks. We have rated all talks, the rating is subjective as well.

+

First of all we would like to thank Reginald Braithwaite for hosting the sessions.

+

Day one

+

Building peer-to-peer apps with the Beaker Browser

+

rating: ⭐ ⭐ ⭐ ⭐

+

Tara Vancil, during the backend days we already are informed about the lack of freedom is our social networks, and how this could be solved with decentralized social networks. Tara showed that the web has the same problem. Do you remember Geocities? Yepz these sites are gone. And deploying or customizing web apps is still hard. Would it not be great we can fix it just in the browser the app we loved the most. Tara showed how easy you can run, customize and deploy a decentralized web app.

+

To push, or not to push?! - The future of HTTP/2 server push

+

rating: ⭐ ⭐ ⭐ ⭐

+

Patrick Hamann @patrickhamann, resource loading is still hard, performance in the browser is tightly coupled to latency, connection costs are high, and scipt execution is expensive. Patrick explained how to use resources wisely, make a difference between critical resources. resources in the users viewport, and non critical resources. By using preload, push and async push together with a strategy of critical resource a hugh step can be made for a high performing web app. See the slides here

+

The Future of Front-End Performance

+

rating: ⭐ ⭐ ⭐ ⭐

+

Sia Karamalegos, a great talk on performance of the front-end. How much impact does it has on your business. Staggering numbers were shown about AliExpress load time reducing and how that correlates to an increase conversion for new customers. +Apps become bigger and bigger. Make sure you check your apps on size / speed by using tools like webpagetest.org. Optimize your images. Most of the web are images, but the most expensive bytes are javascript. Prioritize the code your shipping. +Slides and more info are available.

+

Native JavaScript modules- import {Browsers, NodeJs}; export {production};

+

rating: ⭐ ⭐ ⭐ ⭐

+

Serg Hospodarets, great news for modern JavaScript development. Most browsers now support Native JavaScript modules ESM. This will change our way we are bundling our JavaScript using Webpack, Rollup and other bundlers. It’s also available in node and the extensions is called Micheal Jackson Solution aka .mjs +Dynamically loading javascript modules in combination with HTTP/2 can save a lot of load time. +Simular slides

+

Unity + HTML5 = Isomorphic Game Engine?

+

rating: ⭐ ⭐ ⭐ ⭐

+

Lerenzo Malcom @lerenzom, showed how to combine the world of Unity and the browser. Last year A-Frame was a big topic that address the same solution space but Lerenzo showed how to combine Unity in the browser instead of A-Frame. After discussing why unity and not A-Fram he spend attention how to setup bi-directional messaging, and finally gives some WebGL examples. Sorry we are not that AR/VR boys but with this talk Lerenzo did an awesome job, please see the slides (including animations) here

+

State of the Art Web User Interfaces with State Machines

+

rating: ⭐ ⭐ ⭐ ⭐ ⭐

+

David Khourshid (@davidkpiano), the front end is complex, it is difficult to understand, difficult to read, contain bugs, hard to enhance and new features make it even worse. What if we model our front end as an finite state machine (FSM). Nothing new in Computer Science, states machines are already introduces in “automata theory”, Specifying a the front end action (flow) in a state machine increase the predictability and even make it possible to automate testing. Just calculate you the shortest path via Dijkstra algorithm. David showed his open source framework xstate which is available on GitHub and npm. Slides are are here available

+

A Front-end dev’s hobbyist approach into Machine Learning

+

Susanna Wong, machine Learning is hard. It’s almost impossible to explain this in just one talk. Especially when you combine it with all kind of background information. We were very impressed by the architecture of the buildings, but unfortunately the talk was too much out of our reach.

+

Building a Modern Memex

+

rating: ⭐ ⭐ ⭐ ⭐ ⭐

+

Andrew Louis @hyfen, Imagine you can manage all your data with a single device… An idea that goes back to the 1945 when Vanneva Bush discribed the Memex. Andrew build his own Memex and demo the awesome combination fo all the data he collected over the years. Absolutely crazy to see that he is able to search back in time which podcast he was listing when driving from A to B. To be able to combine all your data from Google, Spotifiy, Maps, Whatsapp and so on, probably you need a complex system. But Andrew handles it all just with Rails, Ember, Electron, Node and Postgres. And how cool it is all open source. Slides are here.

+

Everything in sketchnotes..

+

A big shoutout to Christin Westermann (@c16n) for creating these sketchnotes!

+ + + + + + fullstackfest-2018-05 + + + + + + + + fullstackfest-2018-06 + + +

Day 2

+

Accessibility vs latest Web APIs. Can’t we just get along?

+

rating: ⭐ ⭐

+

Mauricio Palma (@palmaswell) showed pasionated how important it is to make the web accessible for everyone, also for the ones with a disability. For example, he show cased how to use the Google speech API. A quote to remember from Maricio: “If we use our own abilities as a baseline, we make things that are easy for some people to use, but difficult for everyone.”

+

The Web Authentication API - Imagine a World Without Passwords

+

rating: ⭐ ⭐ ⭐

+

By Suby Raman (@subyraman)

+

Passwords were invented for a good reason. The world has changed and unfortunately, passwords are not sufficiently secure enough anymore. There are a lot of problems attached to the concept of passwords. The Web Authentication API allows us to authenticate our users using public key cryptography. This prevents malicious users to gain access to your data even if they have the public key. Modern computers have dedicated hardware to perform authentication, like touchID, faceID, camera’s, usb-tokens. This can now be used in our webapplications. This is very much in line with what we are want to achieve in our own project. Slides

+

Killing the checkout or: How I learned to stop worrying and love Payment Request

+

rating: ⭐ ⭐ ⭐

+

As member of the W3C Web Payments Working Group, Krystian Czesak (@krystostrerone), is heavily involved in setting a web standard on Payment Requests. The Response code 402 Payment Required is already there for a long time, but is never implemented. Lots of attempts are made, but none of them succeeded till now.. Currently the checkout procedure on most applications is not so user friendly. The Web Payments is initiated to improve this user experience. All modern browsers support it. All information about you is stored in your browser and not on each page. There’s an API available to use that information, so the user only has to add the information once and it can be used in every application. Chrome even supports Interledger. The presentation has a lot of information how to implement a client for this. See the slides for more info. Slides

+

A Real World PWA

+

Rating: ⭐ ⭐ ⭐ ⭐

+

Zack Argyle, @ZackArgyle stared with the story of Pinterest and what will happen with your uses once you decide to make a blocking page and only support a app. Smoothly continuing with the story how important it is to have a reactive app and what that means. A progressive web app is according to Zack: “A site that utilizes progressive enhancements, meaning that modern browsers will get a better experience than older browsers”. He explained how he used the principle of the 3R’s to build a progressive app. By Reduce, make it light. Use for example the webpack analyzer. Reuse, caching, server workers. Cache via a worker is faster then the browser cache. And Review, measure performance! Slides are available here

+

Purifying Typescript

+

rating: ⭐ ⭐ ⭐ ⭐

+

Timothy Clifford, @timothyclifford. Cool to see that we can do functional programming with JavaScript a language written in 10 days back in 1995 an nowadays the most populair language. We really liked the talk and clear examples how to program functional with TypeScript in JavaScript. Maybe the talk was little to much basic introduction to functional programming, but Timothy succeeds in his mission statement: “Understand how to apply functional programming techniques with TypeScript”. Slides and code are shared via GitHub.

+

Dynamic CSS: Layouts & Beyond

+

rating: ⭐ ⭐ ⭐ ⭐

+

This talk by -Tara Vancil-, I mean Miriam Suzanne (@mirisuzanne), was really fantastic. She integrated lots of photos from previous talks on the same day. But not only that was remarkable. The knowledge on CSS is outstanding. She showed us the history of how we used to do CSS, from tables to SASS, to flexbox and Houdini. But all of these methods needed some wicked tricks to work in some cases. Now there is something new and this is promising. CSS Grid. This is the future of layouts, so take a look at this. In the slides you will see several examples of how to use it. F.e. https://gridbyexample.com/ and the the Slides.

+

Lightning talks

+

1 +first one: @EleanorClarinet +Nice corrolation between learning music and learning to code. +Don’t be a “Mozart pianist”, be a musician +Don’t be a “React developer”, be an engineer

+

Slides

+

2 +Isac. Rocket fuel for Ember.js and javascript teams. +Splanky about jazz shows in Smalls NYC.

+

3 +2013 it was already possible to do a lot of reactive stuff with imba.io

+

4 +Robert Nickel about Mob Programming. +We love Mob Programming, but it’s hard. See slides

+

5 +Andreaverlicchie.eu +Better navigation in markup

+

6 +Berkay —> Sharing +How to share components between multiple react projects

+

WebXR, if X = how?

+

rating: ⭐ ⭐

+

Diego González and Indira Knight introduced Extended reality, XR or should we say AR + VR in the browser. Physical and virtual worlds are merging, XR is coming to the browser, and the browser is coming to XR devices. The frameworks ((A-Frame && ThreeJS) || BabylonJS) && WebGl where demoed in the browser, both in a 2d and 3d view. For more details see the slides for more references.

+

Thanks to Codegram

+

We would like to conclude our post with a big applause for codegram, the Full Stack Fest was awesome again. Please never change the single track philosophy. And did we already mentioned the food is the best we ever had on a conference.

+
+ +

Read next:

\ No newline at end of file diff --git a/static/2019/03/13/git-bisect/git-bisect-1.json b/2019/03/13/git-bisect/git-bisect-1.json similarity index 100% rename from static/2019/03/13/git-bisect/git-bisect-1.json rename to 2019/03/13/git-bisect/git-bisect-1.json diff --git a/static/2019/03/13/git-bisect/git-bisect-2.json b/2019/03/13/git-bisect/git-bisect-2.json similarity index 100% rename from static/2019/03/13/git-bisect/git-bisect-2.json rename to 2019/03/13/git-bisect/git-bisect-2.json diff --git a/static/2019/03/13/git-bisect/git-bisect-3.json b/2019/03/13/git-bisect/git-bisect-3.json similarity index 100% rename from static/2019/03/13/git-bisect/git-bisect-3.json rename to 2019/03/13/git-bisect/git-bisect-3.json diff --git a/2019/03/13/git-bisect/index.html b/2019/03/13/git-bisect/index.html new file mode 100644 index 00000000..4882b2db --- /dev/null +++ b/2019/03/13/git-bisect/index.html @@ -0,0 +1,291 @@ +Git Bisect | 040code

Git Bisect

Find the bug-introducing commit with Git Bisect

by: jeroen  on 2019-03-13

I want to tell you a little story about what happened to me a few days ago. +I went to the office and a colleague of mine was not very happy. This is strange because I work for a very nice company.. What happened? I asked him what was wrong. It turned out that he updated a lot of dependencies and some code for a certain service. And now the SonarQube reporting was not working anymore with a very strange message: HTTP Error 502 Bad gateway..

+

I decided to help him, because we don’t work alone and especially when you’re stuck (and frustrated) at something it’s best to include other human beings.

+

Since there we’re already several commits done I’ve decided to use git bisect to find the bug-introducing commit.

+

I’ve noticed that it was new to my colleague so let’s write a blog post about it.

+

Prerequisites

+

In order to follow the instructions, you need the following things:

+ +

Rust example

+

The rust-example is very simple. It’s a rust library with four functions namely: add, substract, multiply and division. By no means this should ever be used in real systems, this repo only exists as example for this blog post. It has 9 commits.

+
$ git log --pretty=format:"%h - %an, %ad : %s"
+4d7f719 - Jeroen Knoops, Sun Aug 12 17:10:07 2018 +0200 : Adds link to blog post on git bisect
+380d12e - Jeroen Knoops, Sun Aug 12 17:09:04 2018 +0200 : Refactors tests in seperate directory
+1ae37e1 - Jeroen Knoops, Sun Aug 12 17:07:32 2018 +0200 : Adds edge cases for division
+0580aec - Jeroen Knoops, Sun Aug 12 17:06:41 2018 +0200 : Adds information on how to run tests and create the documentation
+d619b4d - Jeroen Knoops, Sun Aug 12 17:04:50 2018 +0200 : Adds function 'division'
+abc4c40 - Jeroen Knoops, Sun Aug 12 17:03:29 2018 +0200 : Adds function 'multiply' with a runnable example in the documentation
+2a5a057 - Jeroen Knoops, Sun Aug 12 17:01:27 2018 +0200 : Adds readme.md
+3d75d3d - Jeroen Knoops, Sun Aug 12 16:59:58 2018 +0200 : Adds travis-ci pipeline
+030b725 - Jeroen Knoops, Sun Aug 12 16:58:49 2018 +0200 : Adds functions 'add' and 'substract'
+

It starts with adding two functions, adding travis-ci, add some documentation, more functions, some refactoring… everything you expect from a ‘real’ project.

+

Of course it has some tests and I’ve tested everything manually before I commit… But for some reason at the end, the substract function is not working anymore.. +Whoops.. I’ve tested it manually, but for some reason I’ve forgot to add a test for it..

+

Let’s create a test

+

We’re creating a test in /tests/bug.rs to show the bug. +We will use this test to check in which commit the bug was introduced.

+
extern crate example;
+use example::*;
+
+#[test]
+fn test_substract() {
+      assert_eq!(substract(8, 2), 6);
+}
+

Now try to run this test in isolation with the following command:

+
cargo test --test bug
+

Test on master should fail: + +

+

Test on first commit (030b725) should not fail: + +

+

Somewhere in between it start not working anymore.. Let’s use git bisect to find that.

+

Git bisect

+

We go back to the master with the added test.

+

We start the bisect procedure:

+
git bisect start
+

We tell bisect that the current version is bad:

+
git bisect bad
+

Now we tell bisect the commit of a known working version:

+
git bisect good 030b72500f08774b685c59c3e5ddd64afce432f1
+

We tell bisect to look when the bug appears:

+
git bisect run cargo test --test bug
+

After the test, reset the HEAD to the first place.

+
git bisect reset
+

Let’s see this in action: + +

+

What did just happen?

+
 git bisect run cargo test --test bug
+running cargo test --test bug
+   Compiling example v0.1.0 (file:///Users/software-concepts/workspace/jeroen.knoops/rust-example)
+    Finished dev [unoptimized + debuginfo] target(s) in 0.58 secs
+     Running target/debug/deps/bug-6262d8198d8b39aa
+
+running 1 test
+test test_substract ... FAILED
+
+failures:
+
+---- test_substract stdout ----
+	thread 'test_substract' panicked at 'assertion failed: `(left == right)`
+  left: `16`,
+ right: `6`', tests/bug.rs:6:5
+note: Run with `RUST_BACKTRACE=1` for a backtrace.
+
+
+failures:
+    test_substract
+
+test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out
+
+error: test failed, to rerun pass '--test bug'
+Bisecting: 1 revision left to test after this (roughly 1 step)
+[2a5a0578f44883d360287fc771c9d1dd7cff4cd6] Adds readme.md
+running cargo test --test bug
+   Compiling example v0.1.0 (file:///Users/software-concepts/workspace/jeroen.knoops/rust-example)
+    Finished dev [unoptimized + debuginfo] target(s) in 0.59 secs
+     Running target/debug/deps/bug-6262d8198d8b39aa
+
+running 1 test
+test test_substract ... ok
+
+test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
+
+Bisecting: 0 revisions left to test after this (roughly 0 steps)
+[abc4c40d4a06711bab5039a2896db3f67d8ddd0e] Adds function 'multiply' with a runnable example in the documentation
+running cargo test --test bug
+   Compiling example v0.1.0 (file:///Users/software-concepts/workspace/jeroen.knoops/rust-example)
+    Finished dev [unoptimized + debuginfo] target(s) in 0.58 secs
+     Running target/debug/deps/bug-6262d8198d8b39aa
+
+running 1 test
+test test_substract ... FAILED
+
+failures:
+
+---- test_substract stdout ----
+	thread 'test_substract' panicked at 'assertion failed: `(left == right)`
+  left: `16`,
+ right: `6`', tests/bug.rs:6:5
+note: Run with `RUST_BACKTRACE=1` for a backtrace.
+
+
+failures:
+    test_substract
+
+test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out
+
+error: test failed, to rerun pass '--test bug'
+abc4c40d4a06711bab5039a2896db3f67d8ddd0e is the first bad commit
+commit abc4c40d4a06711bab5039a2896db3f67d8ddd0e
+Author: Jeroen Knoops <jeroen.knoops@gmail.com>
+Date:   Sun Aug 12 17:03:29 2018 +0200
+
+    Adds function 'multiply' with a runnable example in the documentation
+
+:040000 040000 27cde4ec60027b8faffb1e97f3cb42022e80187b 34e8c57493a1b137f34fe45bf5ec555888ad8c3b M	src
+bisect run success
+[I]  ~  workspace  jeroen.knoops  rust-example  ⚓ abc4c40  ❓  $  git log
+commit abc4c40d4a06711bab5039a2896db3f67d8ddd0e (HEAD, refs/bisect/bad)
+Author: Jeroen Knoops <jeroen.knoops@gmail.com>
+Date:   Sun Aug 12 17:03:29 2018 +0200
+
+    Adds function 'multiply' with a runnable example in the documentation
+
+commit 2a5a0578f44883d360287fc771c9d1dd7cff4cd6 (refs/bisect/good-2a5a0578f44883d360287fc771c9d1dd7cff4cd6)
+Author: Jeroen Knoops <jeroen.knoops@gmail.com>
+Date:   Sun Aug 12 17:01:27 2018 +0200
+
+    Adds readme.md
+
+commit 3d75d3da596b4fced7c4e91b17c20b2b61d2c8c5
+Author: Jeroen Knoops <jeroen.knoops@gmail.com>
+Date:   Sun Aug 12 16:59:58 2018 +0200
+
+    Adds travis-ci pipeline
+
+commit 030b72500f08774b685c59c3e5ddd64afce432f1 (refs/bisect/good-030b72500f08774b685c59c3e5ddd64afce432f1)
+Author: Jeroen Knoops <jeroen.knoops@gmail.com>
+Date:   Sun Aug 12 16:58:49 2018 +0200
+
+    Adds functions 'add' and 'substract'
+

Commit which introduced the bug:

+

https://github.com/JeroenKnoops/rust-example/commit/abc4c40d4a06711bab5039a2896db3f67d8ddd0e

+

Created Refs: + + + + + + + gitx + + +

+

Results

+

When implementing multiply, I’ve accidentally broken the substract function. +Git bisect will also add refs so you can which commits have been tested.

+

The correct implementation would be:

+
pub fn substract(a: i32, b: i32) -> i32 {
+    a - b
+}
+

The test we’ve written to find the bug can be renamed and also added to prevent this from happening again.

+

Conclusion

+

This was a very simple test / bug to find. By doing a git blame on the line, we would found the same +error, but this is not always the case. +Imagine a website which overtime became very slow. Try to create a test which measures the performance of a certain +page. This test should fail when the performance is below a certain threshold. This can be a complete end-to-end test. +Now you will find the exact place where the introduction of a small stupid javascript library caused a big performance +problem.

\ No newline at end of file diff --git a/2019/03/15/mob-programming/index.html b/2019/03/15/mob-programming/index.html new file mode 100644 index 00000000..f706521f --- /dev/null +++ b/2019/03/15/mob-programming/index.html @@ -0,0 +1,121 @@ +Mob Programming | 040code

Mob Programming

Learnings of a workshop

by: stefan  on 2019-03-15

This blog was originally posted on Feb 25, 2019.

+
+

Last week I was lucky to be able to attend a workshop about “mob programming”, given by Woody Zuill. As somebody who considers himself “agile” (in the original sense of the word) and who is a proponent of extreme programming, I liked it a lot. In this article I’m sharing some of my findings and learnings.

+
+

Mob Programming

+

Simply put, it means that the entire team is working on a single computer, all together at the same time. As an outsider, you might see a few big screens next to each other, and team members sitting next to each other facing those screens. One person is behind the keyboard, and the others are looking at the screens. One of them seems to have a special role, because he is telling the person behind the keyboard what to do.

+

Looking a bit closer, you notice that one person is not really looking at the screens very much, but paying close attention to what the rest are doing. He notices you and quietly comes over to you. He introduces himself as the team’s coach.

+

You: This looks interesting, can you explain what is going on here?

+

Coach: Sure! This team is learning mob programming. They have been at it for a while now and are approaching the point where they don’t need me anymore. They understand how to do it and why they are doing it. They are learning how to improve on this by themselves.

+

You: So why are they doing it?

+

Coach: There are two important reasons. The first is that the team wanted to learn to work together more effectively. They want to have a common understanding of things like architecture, coding standards, and code quality. Before they started working this way, they were in trouble. They were working on a project that was already a year late, and they didn’t know how to make the drastic improvements that were needed. When I was hired, I noticed that cycle times for bug fixes where sky-high: it took forever for a bug that was reported to be fixed. When I looked into the code base and I was not very enthusiastic about the quality. When asking about this to the individual team members, they reacted very differently. Some didn’t feel there was a problem. Others did, but they found they couldn’t address it because the rest of the team “just doesn’t get it”. There clearly was an issue with the team’s ability to operate as a team instead of just a bunch of individuals.

+

You: I have seen situations like that myself occasionally. Has it improved?

+

Coach: Oh yes, it can be difficult still sometimes, but they have learned to discuss such issues with each other. They have learned to raise such issues, and they have learned to do that in a respectful manner.

+

You: How did that happen?

+

Coach: I let them play.

+

You: Come again?

+

Coach: Let me ask you a question: what is the most important prerequisite for learning?

+

You: That’s easy. We have known forever; that’s why we don’t allow bullying at schools, for example. It is security, the knowing that it’s ok to be wrong, to make mistakes.

+

Coach: Indeed! So that’s what we did. Every Friday afternoon, we’d have a coding dojo together, where we practiced coding kata’s. The word “dojo” comes from martial arts: a place where you practice. A “kata” is a series of made-up exercises designed to help you learn something in a safe situation. And we found that it was so much easier to discuss code quality with each other when we didn’t have the pressure of “work” attached to it! Nowadays, instead of using Friday afternoons for this, we start every day with a coding dojo of an hour. Through this, we have learned to treat each other with kindness, consideration, and respect.

+

You: That sounds like it might not only be effective, but also fun! So you mentioned that there are two reasons for doing mob programming. What’s the other one?

+

Coach: The second reason is even more important than the first one. What harms project progress more than anything else?

+

You: Ehh…

+

Coach: (gives encouraging look)

+

You: Well…

+

Coach: Exactly, delays! Waiting time, queues, inventory! This is all very well known from lean manufacturing. It is common sense that keeping people busy while waiting for important answers is counter-productive. It’s not about being busy, it is about getting the most important thing done as fast as possible. A waiting time of an hour probably costs at least two hours because of context switching. It’s all about flow. Mob programming is a multi-discipline approach. Everybody who is needed should be present, including designers, testers, product owner. And if key people cannot be present, they have to make sure that they are otherwise available and get back to questions within minutes. Unless the project is not important of course, but then you should probably find something else to do.

+

You: Right. It’s surprising how much lean is common sense in one discipline, and how novel it appears to be in software engineering.

+

Coach: And it gets better. Because “flow” has another meaning, from the field of psychology. When you’re “in flow”, you are highly concentrated, you forget distractions, every ounce of your mental powers is used to solve the problem at hand. One of the original goals of pair programming was to improve flow: when one of the pair needs to step away for a moment, the other continues. When the first returns, she can get right back into flow again. Mob programming reinforces this even more.

+

The Workshop

+

So that was what the workshop was about: why do it, and how to do it. There was a hands-on coding dojo of a few hours that was designed to get a flavour of what you need to learn as a team to be more effective. I won’t spoil it for you, but to me it struck a good balance between fun and “suffering” (being confronted with things that you didn’t know you were doing ineffectively).

+

Focussing on flow feels like a good idea. When you do that as a team, you can come up with strategies to deal with problems like managers trying to interrupt too often, for example. But also things that need studying can interrupt your flow; you might create a list of study topics to park these things on, and have a dedicated hour of learning every day for those topics (coding dojo!).

+

There is so much more to talk about. For example, the roles of mob programming and the underlying principle: all ideas must go from somebody’s head into the computer through somebody else’s hands.

+

Want to learn more? Hire Woody Zuill and/or buy his book “Mob Programming – A Whole Team Approach”. Like what you read? Contact me and let’s see how we can leverage this!

\ No newline at end of file diff --git a/2019/03/21/spring-boot-graphql/index.html b/2019/03/21/spring-boot-graphql/index.html new file mode 100644 index 00000000..71a30812 --- /dev/null +++ b/2019/03/21/spring-boot-graphql/index.html @@ -0,0 +1,371 @@ +GraphQL + Spring Boot | 040code

GraphQL + Spring Boot

Queries, mutations and subscription in Java

by: niek  on 2019-03-21

Introduction

+

Now GraphQL is not anymore that new kid on a block it would be nice if we can implement a service with a GraphQL interface. Spring Boot is one of the well known frameworks to build your micro services in Java. Time to assess how easy, or hard it will be to implement a GraphQL service. In this post we will not explain how GraphQL works. We focus on a simple Java Spring Boot micro services with a JPA layer. In the GraphQL language we cover the tree major concepts, a query, a mutation and a subscription.

+

GraphQL is API is based on three main concepts. Query the backend for data using a graph based query. The query is in a JSON like style and the response is valid JSON. A major difference with REST is that wit a query you can specify excatly what you expect or want from the backend. Mutation are the way to change data in the system based on flat input object. In this example we use mutation to add new information. Finally we have subscription to subscribe for changes and get notified once something is changed via a web socket.

+

Java, Spring and GraphQL.

+

For implementing a GraphQL service you have two choices. Either schema first, or code first. So similar concepts as we used with SOA XML services. When starting with code you have to write more plumbing code, but you have more freedom. And on the other side starting of the schema reduce all the plumbing code and gives a faster start.

+

In this blog we first create a simple JPA enabled Spring Boot service. Then we add step-by-step GraphQL features to the service. We start from the schema and show which small additions you have to do to our application. Starting from a schema will not result in generated coded, you still have to write the matching code yourself. For the Java implementation we will use the libraries from graphql-java-kickstart.

+

Sample Model and API

+

For simplicity we use in this blog a simple domain model. Consisting of two classes. A person and notes, a person can have multiple notes. And a note always has one author, a person.

+ + + + + + + Model + + + +

Create a simple Note Service

+

First we create a simple Spring JPA services, to store the Notes and the Authors of type Person. The implementation will be straightforward. We create an entity class for Person and Note. Fore readability the imports and other plumbing is omitted. See GitHub for a complete implementation.

+
@Entity
+public class Person {
+    @Id @GeneratedValue
+    private final Long id = null;
+
+    @Column(unique = true)
+    private String name;
+
+    private String email;
+}
+
@Entity
+public class Note {
+    @Id @GeneratedValue
+    private final Long id = null;
+
+    private String note;
+
+    private ZonedDateTime createdOn;
+
+    @ManyToOne(fetch = FetchType.EAGER)
+    private Person author;
+}
+

Next we define two spring JPA repositories to store the entities above in our database.

+
@Repository
+public interface PersonRepository extends CrudRepository<Person, Long> {
+
+    List<Person> findAll();
+}
+
@Repository
+public interface NoteRepository extends CrudRepository<Note, Long> {
+
+    List<Note> findAll();
+}
+

Finally, we define the services interface which we will use to implement the GraphQL queries,

+
@Service
+public interface NotesService {
+
+    public Note save(Note note);
+
+    public Optional<Note> findById(Long id);
+
+    public List<Note> findAll();
+}
+

So that is all to create a simple service with basic JPA (persistence) capacity. Time to focus on adding GraphQL to our service.

+

Implement a query

+

As base library we use graphql-java-tools this library requires a GraphQL schema to implement GrahpQL. The first step is to define a schema for our queries. The schema defines our GraphQL root, for now only the query. Next the queries we will implement and the types we use. We define two queries. The first one to look op a note and the second one to find all notes based on a filter. Next, we define the types. As you can see a Note has a relation to a Person object. By querying for a note we can get immediately the authors name for example.

+
schema {
+    query: Query,
+}
+
+type Query {
+    note(id: Long!): Note
+    notes: [Note]
+}
+
+# Object to represent a note
+type Note {
+    id: ID!
+    note: String
+    createdOn : String
+    author: Person
+}
+
+# Object to represent a note
+type Person {
+    id: ID!
+    name: String
+    email: String
+}
+

Implement Mutation

+

We have now defined a first version of a GraphQL schema. The second step is to connect the schema to the Note Service. GraphQL java tools expects for each query, a resolver function. Therefore, we need to implement GraphQLQueryResolver from graphql-tools.

+
@Component
+public class Query implements GraphQLQueryResolver {
+
+    private NotesService notesService;
+
+    public Query(NotesService notesService) {
+        this.notesService = notesService;
+    }
+
+    public Optional<Note> note(final Long id) {
+        return notesService.findById(id);
+    }
+
+    public List<Note> notes() {
+        return notesService.findAll();
+    }
+}
+

This is all, we have to do to be able to handle the queries as specified in the schema. We can now start the spring boot application and open http://locahost:8080/graphiql and query form some. Graphiql is a simple IDE to execute GraphQL queries. A much richer tool to play with your queries is GraphQL Playground. Actually no fun yet, we can only execute queries without getting any result. We simply have an empty system. We need a way to add notes to the system. In GraphQL you mutate data via a mutation. In the next step we add a mutation to the schema and update the code for executing the mutation.

+

In the schema we add the mutation to the root and add a mutation to add a note to the Mutation type. Quite similar to defining the query above. For the input we define an input object for both Note and Person.

+
schema {
+    ...
+    mutation: Mutation
+}
+
+type Mutation {
+    addNote(note: InputNote!, author: InputPerson!): Note
+}
+
+# Input type for the author of the note
+input InputPerson {
+    name: String!
+    email: String
+}
+
+# Input type for a new Note
+input InputNote {
+    note: String!
+}
+

Similar to implementing the query we have to implement an interface and declare methods for the mutation. Mutations have to be implemented in a class implementing the interface GraphQLMutationResolver. In this implementation we defined for the input objects converters to convert the GraphQL input object to domain objects that can be consumed by the service.

+
@Component
+public class Mutation implements GraphQLMutationResolver {
+
+    public Note addNote(final InputNote note, final InputPerson author) {
+        return notesService.save(InputNote.convert(note, author));
+    }
+}
+

Let’s test the service. Build and start the service /gradlew clean bootRun and open http://localhost:8080/graphiql.

+
mutation {
+  addNote(note: {note: "Hello World"},
+    author: {name: "John Doe", email: "no-reply@jonn.doe"}) {
+    id
+  }
+}
+

And query for all available notes. This should result only in the note above.

+
query {
+  notes {
+    id
+    createdOn
+    note
+    author {
+      name
+    }
+  }
+}
+ + + + + + + Query example + + + +

Add some more notes and experiment with the query. All standard features will work such as aliases, fragement and variables.

+

Implement Subscriptions.

+

Another cool feature is the subscriptions. With a subscription you can subscribe to updates via a websocket. The same philosophy is followed for the subscription. You will gat your data in same structure as specified in the subscription call.

+

To add subscription to our Java implements, we update the schema and add code to handle updates. To add a subscription for new notes we update the GraphQL schema first. Again update schema root and add the subscription, define the available subscriptions and add the required types.

+
schema {
+    ...
+    subscription : Subscription
+}
+
+type Subscription {
+    # Subscribe to all new comments
+    notes: NoteUpdate!
+}
+
+type NoteUpdate {
+    # The note text
+    note : String
+    # The name of the author
+    authorName : String
+    # Time when the note was received
+    createdOn : String
+}
+

And once again we have to implement a resolver, this time we implement the GraphQLSubscriptionResolver.

+
@Component
+class Subscription implements GraphQLSubscriptionResolver {
+
+    private CommentPublisher commentPublisher;
+
+    Subscription(CommentPublisher commentPublisher) {
+        this.commentPublisher = commentPublisher;
+    }
+
+    Publisher<NoteUpdate> notes() {
+        return commentPublisher.getPublisher();
+    }
+}
+
public Note save(Note note) {
+    ...
+    notePublisher.publish(savedNoed);
+    ...
+}
+

The notePublisher is responsible to update messages via a WebScoket so the subscribers get the update. For the implementation check out the GitHub repo. Time to test the subscription. An easy way to test is topen the GraphiQL editor on two screens. Invoke in the first one the subscription and in the second one add a note. You will see you get an update of the new note on the first screen.

+
subscription {
+  notes {
+    note
+    authorName
+  }
+}
+ + + + + + + Query example + + + +

Testing

+

Another nice feature provided by graphql-spring-boot is the test utils. Testing your GraphQL queries becomes really simple. The library provide a GraphQLTestTemplate which makes it easy to invoke the GraphQL endpoint by with a query. The result is the JSON object. Let’s have a quick look on some code. First define the query in queries/find-notes.graphql.

+
query FindNotes {
+  notes {
+    id
+    note
+    createdOn
+    author {
+      name
+    }
+  }
+}
+

Now create a test.

+
@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class GraphQLNoteTest extends GraphQLBaseTest {
+
+    @Autowired
+    private GraphQLTestTemplate graphQLTestTemplate;
+
+    @Test
+    public void findNotes() throws IOException {
+
+        GraphQLResponse findResponse = graphQLTestTemplate.perform("queries/find-notes.graphql", null);
+        assertTrue(findResponse.isOk());
+
+        // asserts to check the content
+    }
+}
+

That is all, of course you should add some assert to check the content as well. For more details check out the GitHub repo of this blog.

+

Some thoughts

+

The example above shows how you can enable your Spring Boot service with a GraphQL API. Adding a GraphQL layer to your existing (simple) service is fairly easy with the tools. But GraphQL will become really powerful when you combine multiple (REST) API in one GraphQL endpoint to create a fluent and understandable API.

+

If a java based approach is in that case the best way to go, I don’t know yet. In that case it could be interesting to dive into Rejoiner.

\ No newline at end of file diff --git a/2019/04/02/react-native-navigation-and-clojurescript/index.html b/2019/04/02/react-native-navigation-and-clojurescript/index.html new file mode 100644 index 00000000..f3a01a2c --- /dev/null +++ b/2019/04/02/react-native-navigation-and-clojurescript/index.html @@ -0,0 +1,531 @@ +React Native Navigation and ClojureScript | 040code

React Native Navigation and ClojureScript

A beginner's guide to realizing proper navigation in a React Native application using ClojureScript and shadow-cljs

by: stefan  on 2019-04-02

React Native Navigation and ClojureScript

+

A beginner’s guide to realizing proper navigation in a React Native application +using ClojureScript and shadow-cljs

+

+ + + + + + GitHub + + Source code for this post

+

That’s a big bunch of words. Let me briefly introduce them to you, so that I can +then dive deeper into some of them. “Beginner” in this case means that, a week +before I started doing this, I had practically zero experience with +Clojure(Script) and React Native. I do have quite a bit of experience using +React, and also writing native iOS applications (Swift/Objective-C).

+

“Guide” means that I’m going to explain to you how I accomplished my goal. +You’ll have to interpret it and follow along if you want to do the same. Future +versions of any of the tools may break this guide.

+

React Native Navigation is a framework for React Native. Which is a +framework for building cross-platform apps for iOS and Android using JavaScript, +but you probably already knew that part. ClojureScript is a functional +programming language. It’s a variant of Clojure that compiles to JavaScript. +“Proper navigation” is, admittedly, a bit subjective; I’ll explain this part in +more detail below. Finally, shadow-cljs is the toolchain I used +as an easy way to integrate a bunch of ClojureScript code into an originally +Javascript-based project.

+

A summary of this guide is:

+
    +
  1. Setup a new React Native project (using react-native cli).
  2. +
  3. Add shadow-cljs to be able to use ClojureScript in that project.
  4. +
  5. Add and setup react-native-navigation dependency.
  6. +
  7. Create a bit of infrastructure on the ClojureScript side to be able to use +the React Native Navigation APIs while using shadow-cljs’ hot reloading.
  8. +
+

So let’s get started. I executed all these steps exactly as I’m describing here, +the result of which you can find in my GitHub repo. Commit messages +include all details about the commands I used. If you want to read my +rant about wanting to use native navigation, keep reading till the very end of +this post :)

+
+

Please note that this post does not include all the code that you need +to make it work, that would be too much for a web page. Please refer to +the final solution in my GitHub repo if you want to reproduce all of it.

+
+

1. Create React Native Project

+

This step is very easy. First, if you haven’t got it yet, install +react-native-cli:

+
npm install -g react-native-cli
+

Then create a new project:

+
react-native init CLJSReactNativeNavigation
+

So far so good, nothing new here, let’s move on.

+

2. Add shadow-cljs

+

We’re going to use the standalone version of shadow-cljs, +as recommended. So we add the npm dependency for shadow-cljs:

+
yarn add --dev shadow-cljs
+

Now we need to configure shadow-cljs a bit. We create a file called +shadow-cljs.edn and give it the following content:

+
{:source-paths
+ ["src/main"                     ;; production code
+  "src/test"]                    ;; yes we're going to add tests as well!
+
+ :dependencies
+ [[reagent "0.8.1"]]
+
+ :builds
+ {:myapp                         ;; the target definition
+  {:target :react-native         ;; the target type
+   :init-fn myapp/init           ;; react native's entry point
+   :output-dir "build"}}}        ;; where to put the built JS
+

This is telling shadow-cljs that there is a target called “myapp”, that +it’s a React Native target, that the entry point of our app is the function +init in the myapp namespace, and that the output should be written to the +folder build.

+

Now let’s create that myapp namespace. In src/main create a file called +myapp.cljs with the following contents:

+
(ns myapp
+  (:require [reagent.core :as r :refer [atom]]
+            ["react-native" :as rn :refer [AppRegistry]]))
+
+(defn app-root []
+  [:> rn/View {:style {:flex-direction "column"
+                       :margin 40
+                       :align-items "center"
+                       :background-color "white"}}
+
+   [:> rn/Text {:style {:font-size 30
+                        :font-weight "100"
+                        :margin-bottom 20
+                        :text-align "center"}}
+
+    "Hi Shadow!"]])
+
+(defn init []
+  (.registerComponent AppRegistry
+                      "CLJSReactNativeNavigation"
+                      #(r/reactify-component app-root)))
+

Time to check this out! Run the following commands in your terminal:

+
yarn shadow-cljs compile myapp
+yarn react-native run-ios
+

Tada!

+ + + + + + Tada! + + +

Hot Reloading

+

When using shadow-cljs, you also get its variant of hot reloading. You don’t +need to use the developer menu to enable it, but you do need to add a bit of +code to make it work: (a) you need to had a function that performs the reload, +and (b) you need to enable hot reloading in the config.

+

Add reload function

+

Let me just give you the code of myapp.cljs and then explain what’s going on.

+
(ns myapp
+  (:require [reagent.core :as r :refer [atom]]
+            ["react-native" :as rn :refer [AppRegistry]]))
+
+(defonce component-to-update (atom nil))
+
+(defn content []
+  [:> rn/Text {:style {:font-size 30
+                       :font-weight "100"
+                       :margin-bottom 20
+                       :text-align "center"}}
+   "Hi Shadow!"])
+
+(defn app-root []
+  [:> rn/View {:style {:flex-direction "column"
+                       :margin 40
+                       :align-items "center"
+                       :background-color "white"}}
+   [content]])
+
+(def updatable-app-root
+  (with-meta app-root
+    {:component-did-mount
+     (fn [] (this-as ^js this
+                     (reset! component-to-update this)))}))
+
+(defn reload {:dev/after-load true} []
+  (.forceUpdate ^js @component-to-update))
+
+(defn init []
+  (.registerComponent AppRegistry
+                      "CLJSReactNativeNavigation"
+                      #(r/reactify-component updatable-app-root)))
+

This is what it does:

+
    +
  • The text content (“Hi Shadow!”) is extracted into a separate component +(content), because the call forceUpdate that we’ll use +updates everything below the application root component, not the root +component itself.
  • +
  • The app-root component is annotated with a component-did-mount handler +(updatable-app-root). This handler stores the actual JavaScript object +that represents the root component into the atom component-to-update.
  • +
  • A function reload is added, which takes the value of that atom and calls +the method forceUpdate on it.
  • +
+

One final step remains: enabling hot reloading in shadow-cljs.edn. It’s new +content is:

+
{:source-paths
+ ["src/main"                     ;; production code
+  "src/test"]                    ;; yes we're going to add tests as well!
+
+ :dependencies
+ [[reagent "0.8.1"]]
+
+ :builds
+ {:myapp                         ;; the target definition
+  {:target :react-native         ;; the target type
+   :init-fn myapp/init           ;; react native's entry point
+   :output-dir "build"           ;; where to put the built JS
+   :devtools {:autoload true}}}} ;; enables hot-reloading
+

If you reload the app, changing the text in the content component should +cause the app to automatically update!

+

3. Add React Native Navigation

+

This bit is a somewhat tedious I’m afraid. You’ll have to go through the +instructions to setup React Native Navigation. Add the npm +dependency, update your Xcode project, update iOS source code, update Android +build files, and update Android source code. Tip for Android part: Please don’t +blindly copy-paste. Some of the instructions refer are not up to date, some +parts are not really needed, etc. If you want you can have a look at +how I did it.

+

Obviously you’ll skip the last step of the instructions, namely the part where +the JavaScript code is updated to use React Native Navigation. We’ll address +that in ClojureScript next.

+

4. Integrate and Wrap

+

Ok, roll up your sleeves, because here comes the interesting part.

+

Wrapper functionality

+

In JavaScript we would need to do something like this:

+
import { Navigation } from 'react-native-navigation'
+Navigation.registerComponent('navigation.playground.WelcomeScreen', () => App)
+Navigation.events().registerAppLaunchedListener(() => {
+  Navigation.setRoot({
+    root: {
+      component: {
+        name: 'navigation.playground.WelcomeScreen'
+      }
+    }
+  })
+})
+

Obviously in ClojureScript we need to do something similar. There’s a problem +though: we need a handle to the actual JavaScript component in order to call +forceUpdate on it (for hot reloading). React Native Navigation has made the +design choice that it creates new root components for screens that you push +on the navigation stack. So also for those components we need a handle and +call forceUpdate. We accomplish this by not registering the component itself +with Navigation, but a wrapper of that component.

+

This causes another problem though. React Native Navigation gives components +that you register a componentId. It uses this for its internal registration +so that it can make navigation work. For example, when you push a new screen +onto the navigation stack, it uses the componentId to find the screen from +which you are pushing. The problem is that we registered the wrapper, but +we’re navigating from the wrapped component. Which does not have a +componentId, because we never registered it with Navigation. Solution: +make the wrapper in such a way that it passes its componentId on to the +wrapped component.

+

But there is more! React Native Navigation defines some additional life cycle +methods, such as navigationButtonPressed. And for that to work, you need +to call Navigation.bindComponent. So our wrapper also calls +bindComponent and forwards navigationButtonPressed. Forwarding other +life cycle methods is left as an exercise for the reader.

+

Here’s the main code for the wrapper (full version):

+
;; current namespace is `env`
+
+(defonce id-seq-ref (atom 0))
+(defonce mounted-ref (atom {}))
+(defonce screens-ref (atom {}))
+
+(defn register [key]
+  (let [get-props
+        (fn [this]
+          {::key key
+           ::id (-> this .-state .-id)
+           :component-id (-> this .-props .-componentId)})
+
+        wrapper
+        (crc #js                    ;; crc is create-react-class
+              {:displayName
+               (str key "Wrapper")
+
+               :getInitialState
+               (let [id (swap! id-seq-ref inc)]
+                 (fn [] #js {:key key
+                             :id id}))
+
+               :componentDidMount
+               (fn []
+                 (this-as
+                  ^js this
+
+                  (bind-component this)
+                  (swap! mounted-ref
+                         assoc-in [key (-> this .-state .-id)] this)))
+
+               :componentWillUnmount
+               (fn []
+                 (this-as
+                  ^js this
+
+                  (swap! mounted-ref update key dissoc (-> this .-state .-id))))
+
+
+               ;; FIXME: forward other lifecycles the same way
+               :navigationButtonPressed
+               (fn []
+                 (this-as
+                  ^js this
+
+                  (let [{:keys [navigation-button-pressed]}
+                        (get @screens-ref key)
+
+                        props
+                        (get-props this)]
+
+                    (js/console.log "navigationButtonPressed"
+                                    key
+                                    (boolean navigation-button-pressed)
+                                    (pr-str props))
+                    (when navigation-button-pressed
+                      (navigation-button-pressed props)))))
+
+               :componentDidAppear
+               (fn []
+                 (this-as
+                  ^js this
+
+                  (js/console.log "componentDidAppear" key)))
+
+               :componentDidDisappear
+               (fn []
+                 (this-as
+                  ^js this
+
+                  (js/console.log "componentDidDisappear" key)))
+
+               :render
+               (fn []
+                 (this-as
+                  ^js this
+
+                  (let [{:keys [render]}
+                        (get @screens-ref key)
+
+                        props
+                        (get-props this)]
+
+                    (js/console.log "render" key (pr-str props))
+                    (-> (render props)
+                        (r/as-element)))))})]
+
+    (register-component key (fn [] wrapper))))
+

This stores the mounted components in mounted-ref, which we can then use +for the hot reloading:

+
(defn reload {:dev/after-load true} []
+  (doseq [[key instances] @mounted-ref
+          [id inst] instances]
+    (js/console.log "forceUpdate" key id)
+    (.forceUpdate ^js inst)))
+

The register method uses an atom screens-ref to forward life cycle methods, +so we need to provide a function for screens to add themselves:

+
(defn add-screen [key screen-def]
+  (swap! screens-ref assoc key screen-def))
+

Using it

+

Initially, in myapp/init we called React Native’s registerComponent. Now +we call our env/register instead. We could just call (env/register "App"), +but we want to pass some options for the navigation bar.

+

Furthermore we need to call the Navigation.events().registerAppLaunchedListener +JavaScript function to set the navigation root for our app.

+

The init function is now:

+
(defn init []
+  (env/register "App"
+                {:topBar {:visible "true"
+                          :title {:text "My App"}
+                          :rightButtons [{:id "add" :systemItem "add"}]}})
+
+  (-> (rnn/Navigation.events)
+      (.registerAppLaunchedListener
+       (fn []
+         (->> {:root
+               {:stack
+                {:children [{:component {:name "App"}}]}}}
+              (clj->js)
+              (rnn/Navigation.setRoot))))))
+

Credits

+

That’s it! Done! Just four simple, easy, almost trivial steps! Well maybe not +so trivial. I guess a ClojureScript beginner couldn’t have come up with this. +Well, in fact I am a ClojureScript beginner and I did not come up with this +solution myself. All the credits go to Thomas Heller, the author of +shadow-cljs. He has been amazing in his support by answering +all of my beginner-level questions, and then he ended up conjuring this +solution and committing it to my repository. He actually spent hours on this +I believe, and that level of support from a community is truly awesome +(and rare). He doesn’t seem to be advertising it very much, but you can become +his patreon.

+

Why React Native Navigation

+

What’s special about React Native Navigation is that it is implemented using the +real platform native components, specifically +UINavigationController on +iOS. I seem to be at odds with most of the rest of the world on this, but I +happen to think that it is very important to present the user with an +experience that is (as much as possible) identical to that of native apps. You +shouldn’t be able to tell from the user experience whether the app was written +using native technology or cross platform technology. Not even when you update +your OS to a new major version. So if my app uses a navigation stack, it has to +be the native one. Maybe I’m more sensitive to this then others, but I get +really upset by apps that don’t support the normal gesture for going back up the +navigation stack. I also get annoyed when the animation that is used while going +back is slightly non-standard. Using the native components is the only way to +accomplish that. Other components can come close, but not close enough for me.

+

Versions

+

Like I said in the beginning, future versions of any of the tools may break +this guide. So it is only fair to mention which versions I was using for this:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ToolVersion
node11.10.1
npm6.5.0-next.0
react16.8.3
react-native0.59.3
react-native-cli2.0.1
react-native-navigation2.16.0
shadow-cljs2.8.26
Xcode10.2
iOS SDK12.2
Android SDKAPI levels 26, 27, 28
Build tools 27.0.3, 28.0.3
System images: android-28
\ No newline at end of file diff --git a/static/2019/04/18/cloudrun/build.json b/2019/04/18/cloudrun/build.json similarity index 100% rename from static/2019/04/18/cloudrun/build.json rename to 2019/04/18/cloudrun/build.json diff --git a/static/2019/04/18/cloudrun/deploy.json b/2019/04/18/cloudrun/deploy.json similarity index 100% rename from static/2019/04/18/cloudrun/deploy.json rename to 2019/04/18/cloudrun/deploy.json diff --git a/2019/04/18/cloudrun/index.html b/2019/04/18/cloudrun/index.html new file mode 100644 index 00000000..ccb3a78e --- /dev/null +++ b/2019/04/18/cloudrun/index.html @@ -0,0 +1,195 @@ +Cloud Run | 040code

Cloud Run

Bringing serverless to containers

by: niek  on 2019-04-18

Introduction

+

Last week at the Google Next in San Francisco, Google announced Cloud Run. A new platform to enable developers without any infrastructure to run Docker containers on Google Cloud.

+
+

Cloud Run is a managed compute platform that enables you to run stateless containers that are invocable via HTTP requests. Cloud Run is serverless: it abstracts away all infrastructure management, so you can focus on what matters most — building great applications. It is built from Knative, letting you choose to run your containers either fully managed with Cloud Run, or in your Google Kubernetes Engine cluster with Cloud Run on GKE.

+
+ + + + + + + Next + + + +

Time the see how this new feature on the Google Platform really works. There are two ways to use Cloud Run. You can choose to run the container serverless, which means you do not have to create any infrastructure. The other option is deploy the container via the Cloud Run to a GKE cluster. From developers perspective there is no difference, the developer can still use the same Cloud Run API.

+

Lets quickly compare Cloud Run to some other option to run an application sereverless in the cloud. For example you can use Now from Zeit to quickly run a serverless application build in many languages, some major are Node, Rust, Static, Python, Go and NextJS. The free tier get you started quickly. In the paid tier you pay for traffic and invocations. Fargate the the AWS approach to enable serverless Docker containers. But in Fargate you container is always running and you pay per second for CPU and memory. Read here more about deploying to Fargate.

+

Deploy the 040 blog to Cloud Run

+

Why not see if we can publish this blog to Cloud Run. Starting is quit simple, just follow the Google documentation. Go to the Google Cloud console and navigate to Cloud Run. You will see here that deploying a container requires two steps. First publish the Docker image to the Docker registry in your Google project. Next deploy the docker image to Cloud Run.

+

Prepare your image

+

On the Cloud Run create service page is clearly mentioned that the containers needs support injection of a port that listen for HTTP traffic via the environment variable PORT. This is for example easy to support via the Spring Boot framework. But for the blog we allready have an NGINX container which not support injection of the port.

+

The first step will be to enable port injection to our blog runtime container. Which can be done by starting the container via a wrapper script which update the NGNIX configuration. We define a simple server configuration in which we can replace the NGNIX_PORT environment variable via envsubst.

+
server {
+    listen       ${NGNIX_PORT};
+    server_name  localhost;
+...
+}
+

Next we create a simple bash script to update the PORT at container start. If no port is set, we apply use the default port 80.

+
#!/bin/bash
+
+export NGNIX_PORT=${PORT:=80}
+envsubst < /etc/nginx/conf.d/mysite.template > /etc/nginx/conf.d/default.conf \
+  && exec nginx -g 'daemon off;'
+

Finally we update the Dockerfile to add the new assets and ensure the start.sh script is invoked at container start.

+
FROM jekyll/jekyll:3.8.3 AS build
+
+... OMITTED ...
+
+FROM nginx:1.15.3
+COPY --from=build /build/_site /usr/share/nginx/html
+
+### copy wrappers and configuration template
+COPY nginx/default.conf /etc/nginx/conf.d/mysite.template
+COPY nginx/start.sh /usr/bin
+
+CMD ["start.sh"]
+

This was the hard part, our image is ready. You can test your image locally. For example on port 8081

+
Docker build -t blog .
+Docker run -e PORT=8080 -p 8081:8080 blog
+

Publish the image to Google Cloud

+

You can publish the Docker image to the gcr.io registry by building locally and push the Docker image. Or by using Google Cloud Build to build the container. We use the power of the cloud and let Goolge build the image.

+

gcloud builds submit --tag gcr.io/<project-id>/blog

+

+

+

This will build the Docker image in Google’s cloud build and push it to the registry.

+

Deploy the blog

+

Finally we have to deploy the service via cloud run. You can do this via the web interface, or via the cli.

+ + + + + + + Model + + + +

In the web interface it is straightforward to deploy to Cloud Run. In the cli it is not hard bu you need te be aware that cloud run is beta which requires to install the beta components.

+
gcloud components install beta
+

Next you specify the same properties as you should do via the web interface. Currently Cloud Run is only available in the region us-central1. Since we run a public site we allow unauthenticated traffic.

+
gcloud beta run deploy blog \
+  --image gcr.io/<project-id>/blog:latest \
+  --region us-central1 --allow-unauthenticated
+

+

+

Some final thoughts

+

The first impression is that Cloud Run is quit easy to set up. Good to mention is that is based on the Open Source project Knative. At the moment the feature is in beta and there is no support in other regions.

+

In this post we show just the basics of CLoud Run. It is really super easy to deploy you docker containers to the cloud for low costs. Could be handy for example to review branches. But there is a lot more, containers can be protected and only accept authenticated traffic. Furthermore with integration to Cloud Build it is easy to setup a CI/CD pipeline for GitHub, Bitbucket and Cloud Source Repository. With GitLab CI setting up a pipeline for Cloud Run is almost a no brainer. And for deployment GitLab already supports Knative to deploy to a Kubernetes cluster.

\ No newline at end of file diff --git a/2019/04/20/discovery-agent/index.html b/2019/04/20/discovery-agent/index.html new file mode 100644 index 00000000..28d4546a --- /dev/null +++ b/2019/04/20/discovery-agent/index.html @@ -0,0 +1,174 @@ +Discover the exposed port | 040code

Discover the exposed port

Enabling discovery for Spring Cloud on AWS ECS

by: niek  on 2017-04-20

Update 2018-02-14, since Amazon has introduced a feature to extract meta data at runtime in a container the discovery agent described in this post becomes obsolete for the ECS case, see more this post for more details.

+

This post describes a solution for implementing the discovery of the unknown exposed port by a Docker container. A specific situation where the problem occurs is when you deploy Spring Cloud micro services as Amazon ECS services to the cloud.

+

The problem

+

Setting up a micro services architecture requires that there is a way services can find each other. Spring Cloud provides a services discovery service out of the box: Eureka. Services running in the micro services landscape are responsible to register themselves to the discovery service. Then, any service running in the micro services landscape can locate them based on their name. Deploying those services to a docker based cloud, such as AWS, does however create some difficulties.

+

A service running in a container does not know the external exposed port. The port map can be fixed, for example by mapping the external port on the same port as the internal one but this will eventually cause port conflicts. Besides that, you are not able to scale the container on the same host. Therefore, it make sense to use automatic port assignment. But in that case, services must be able to discover the port, assigned by docker, for registration.

+

Running micro services in docker containers on AWS ECS looks as follows.

+ + + + + + + ECS + + + +

Each micro service is defined as task which will run as service (a docker container). The docker container runs on a Amazon EC2 instance that also runs docker agent to manage the cluster. Unfortunately, the agent has no API to lookup the exposed port.

+

Solution

+

To lookup the exposed port an extra agent is added to the EC2 instance. The discovery agent uses an API to discover the port for a given container id, internal port and protocol. The only drawback is that the discovery agent needs access to the docker socket which is a potential security risk.

+ + + + + + + ECS + + + +

Let’s explain the working of the discovery agent by example: First we have to start the agent as a docker container.

+
docker run -d -v /var/run/docker.sock:/var/run/docker.sock \
+  --name docker-discovery-agent -p 5555:8080 npalm/docker-discovery-agent:1.0.0
+

Now the agent is running, it can be tested. For testing we start another container, remember the problem is that we need to find the exposed port from within a container. The local ip address will be added as extra host to the container. The test container is just a linux (CentOS) container containing the tool curl and for which port 80 is exposed to a random port.

+
export DOCKERHOST=$(ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | \
+  grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1)
+docker run -it -p 80 --add-host="dockerhost:$(DOCKERHOST)" --rm centos /bin/bash
+

We are now in the shell of the CentOS container, the host file contains a DNS entry that points to the host. First, we have to search for the id of the current container.

+
CONTAINER_ID=$(cat /proc/self/cgroup | grep "cpu:/" | sed 's/\([0-9]\):cpu:\/docker\///g')
+

Then, we ask the discovery agent for our external mapped port by sending the container id and the internal port.

+
curl "http://dockerhost:5555/container/${CONTAINER_ID}/portbinding?port=80&protocol=tcp"
+

The result is a JSON string container with the hostIp and hostPort, for example:

+
{
+	"HostIp": "0.0.0.0",
+	"HostPort": "32779"
+}
+

Alternative to passing the host ip address, it is possible to register a static ip address and use this to find the dicovery agent.

+
sudo ifconfig lo0 alias 172.16.123.1
+

Now we can discover the exposed port, let’s give some direction on how this can be combined with Spring Cloud on ECS. First deploy Eureka (service discover) as container. Register an ALB (internal) to the service. Now we have an endpoint that we can use to inject the service that needs to register itself. Next create a spring service that is aware of discovery. Before the services can be started, the exposed port needs to be found. Add the snippet below to the start script to start the services in the container.

+
#!/bin/bash
+export DOCKER_HOST=$(curl -s 169.254.169.254/latest/meta-data/local-ipv4)
+export CONTAINER_ID=$(cat /proc/self/cgroup | grep "cpu:/" | \
+  sed 's/\([0-9]\):cpu:\/docker\///g')
+export NETWORK_BINDING=\
+  $(curl "http://${DOCKER_HOST}:5555/container/${CONTAINER_ID}/portbinding?port=8080&protocol=tcp")
+export EXPOSED_PORT=$(echo ${NETWORK_BINDING} | jq -c '.[0].HostPort' | \
+  sed -e 's/^"//'  -e 's/"$//')
+
+exec java -jar /service.jar
+

The last step is to update the application.yml and add a few lines to force the ip address and port during service registration.

+
eureka:
+  client:
+    serviceUrl:
+      defaultZone: ${EUREKA_URL} // Needs to be injected as environment variable
+  instance:
+    preferIpAddress: true
+    ip-address: ${DOCKER_HOST}
+    non-secure-port: ${EXPOSED_PORT}
+

Alternatives

+

Discovery of the unknown exposed port is a highly discussed topic and there are many alternative solutions, Please see docker issue, which is a good starting point for alternatives. The following alternatives came to my mind:

+
    +
  • Same approach, but run the discovery service directly on the host.
  • +
  • Implement the discovery capability in each servie as a library, but the drawback is that all the services need the docker socket.
  • +
  • Choose another discovery mechanism for example based on ALB.
  • +
  • Switch to Consul in combination with a registrator
  • +
\ No newline at end of file diff --git a/3-4d73c1baf9953aba24ed.js b/3-4d73c1baf9953aba24ed.js new file mode 100644 index 00000000..1c7861d2 --- /dev/null +++ b/3-4d73c1baf9953aba24ed.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[3],{174:function(e,t,n){"use strict";var r=n(55),o=n(203),i=(n(190),n(201),Object.prototype.hasOwnProperty),u=n(204),a={key:!0,ref:!0,__self:!0,__source:!0};function s(e){return void 0!==e.ref}function c(e){return void 0!==e.key}var l=function(e,t,n,r,o,i,a){return{$$typeof:u,type:e,key:t,ref:n,props:a,_owner:i}};l.createElement=function(e,t,n){var r,u={},p=null,f=null;if(null!=t)for(r in s(t)&&(f=t.ref),c(t)&&(p=""+t.key),void 0===t.__self?null:t.__self,void 0===t.__source?null:t.__source,t)i.call(t,r)&&!a.hasOwnProperty(r)&&(u[r]=t[r]);var d=arguments.length-2;if(1===d)u.children=n;else if(d>1){for(var h=Array(d),m=0;m1){for(var v=Array(y),b=0;b 1) {\n var childArray = Array(childrenLength);\n for (var i = 0; i < childrenLength; i++) {\n childArray[i] = arguments[i + 2];\n }\n if (process.env.NODE_ENV !== 'production') {\n if (Object.freeze) {\n Object.freeze(childArray);\n }\n }\n props.children = childArray;\n }\n\n // Resolve default props\n if (type && type.defaultProps) {\n var defaultProps = type.defaultProps;\n for (propName in defaultProps) {\n if (props[propName] === undefined) {\n props[propName] = defaultProps[propName];\n }\n }\n }\n if (process.env.NODE_ENV !== 'production') {\n if (key || ref) {\n if (typeof props.$$typeof === 'undefined' || props.$$typeof !== REACT_ELEMENT_TYPE) {\n var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;\n if (key) {\n defineKeyPropWarningGetter(props, displayName);\n }\n if (ref) {\n defineRefPropWarningGetter(props, displayName);\n }\n }\n }\n }\n return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);\n};\n\n/**\n * Return a function that produces ReactElements of a given type.\n * See https://facebook.github.io/react/docs/top-level-api.html#react.createfactory\n */\nReactElement.createFactory = function (type) {\n var factory = ReactElement.createElement.bind(null, type);\n // Expose the type on the factory and the prototype so that it can be\n // easily accessed on elements. E.g. `.type === Foo`.\n // This should not be named `constructor` since this may not be the function\n // that created the element, and it may not even be a constructor.\n // Legacy hook TODO: Warn if this is accessed\n factory.type = type;\n return factory;\n};\n\nReactElement.cloneAndReplaceKey = function (oldElement, newKey) {\n var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props);\n\n return newElement;\n};\n\n/**\n * Clone and return a new ReactElement using element as the starting point.\n * See https://facebook.github.io/react/docs/top-level-api.html#react.cloneelement\n */\nReactElement.cloneElement = function (element, config, children) {\n var propName;\n\n // Original props are copied\n var props = _assign({}, element.props);\n\n // Reserved names are extracted\n var key = element.key;\n var ref = element.ref;\n // Self is preserved since the owner is preserved.\n var self = element._self;\n // Source is preserved since cloneElement is unlikely to be targeted by a\n // transpiler, and the original source is probably a better indicator of the\n // true owner.\n var source = element._source;\n\n // Owner will be preserved, unless ref is overridden\n var owner = element._owner;\n\n if (config != null) {\n if (hasValidRef(config)) {\n // Silently steal the ref from the parent.\n ref = config.ref;\n owner = ReactCurrentOwner.current;\n }\n if (hasValidKey(config)) {\n key = '' + config.key;\n }\n\n // Remaining properties override existing props\n var defaultProps;\n if (element.type && element.type.defaultProps) {\n defaultProps = element.type.defaultProps;\n }\n for (propName in config) {\n if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n if (config[propName] === undefined && defaultProps !== undefined) {\n // Resolve default props\n props[propName] = defaultProps[propName];\n } else {\n props[propName] = config[propName];\n }\n }\n }\n }\n\n // Children can be more than one argument, and those are transferred onto\n // the newly allocated props object.\n var childrenLength = arguments.length - 2;\n if (childrenLength === 1) {\n props.children = children;\n } else if (childrenLength > 1) {\n var childArray = Array(childrenLength);\n for (var i = 0; i < childrenLength; i++) {\n childArray[i] = arguments[i + 2];\n }\n props.children = childArray;\n }\n\n return ReactElement(element.type, key, ref, self, source, owner, props);\n};\n\n/**\n * Verifies the object is a ReactElement.\n * See https://facebook.github.io/react/docs/top-level-api.html#react.isvalidelement\n * @param {?object} object\n * @return {boolean} True if `object` is a valid component.\n * @final\n */\nReactElement.isValidElement = function (object) {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n};\n\nmodule.exports = ReactElement;","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n'use strict';\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar validateFormat = function validateFormat(format) {};\n\nif (process.env.NODE_ENV !== 'production') {\n validateFormat = function validateFormat(format) {\n if (format === undefined) {\n throw new Error('invariant requires an error message argument');\n }\n };\n}\n\nfunction invariant(condition, format, a, b, c, d, e, f) {\n validateFormat(format);\n\n if (!condition) {\n var error;\n if (format === undefined) {\n error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.');\n } else {\n var args = [a, b, c, d, e, f];\n var argIndex = 0;\n error = new Error(format.replace(/%s/g, function () {\n return args[argIndex++];\n }));\n error.name = 'Invariant Violation';\n }\n\n error.framesToPop = 1; // we don't care about invariant's own frame\n throw error;\n }\n}\n\nmodule.exports = invariant;","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * \n */\n'use strict';\n\n/**\n * WARNING: DO NOT manually require this module.\n * This is a replacement for `invariant(...)` used by the error code system\n * and will _only_ be required by the corresponding babel pass.\n * It always throws.\n */\n\nfunction reactProdInvariant(code) {\n var argCount = arguments.length - 1;\n\n var message = 'Minified React error #' + code + '; visit ' + 'http://facebook.github.io/react/docs/error-decoder.html?invariant=' + code;\n\n for (var argIdx = 0; argIdx < argCount; argIdx++) {\n message += '&args[]=' + encodeURIComponent(arguments[argIdx + 1]);\n }\n\n message += ' for the full message or use the non-minified dev environment' + ' for full errors and additional helpful warnings.';\n\n var error = new Error(message);\n error.name = 'Invariant Violation';\n error.framesToPop = 1; // we don't care about reactProdInvariant's own frame\n\n throw error;\n}\n\nmodule.exports = reactProdInvariant;","'use strict';\n\nmodule.exports = require('./lib/React');\n","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n'use strict';\n\nvar emptyFunction = require('./emptyFunction');\n\n/**\n * Similar to invariant but only logs a warning if the condition is not met.\n * This can be used to log issues in development environments in critical\n * paths. Removing the logging code for production environments will keep the\n * same logic and follow the same code paths.\n */\n\nvar warning = emptyFunction;\n\nif (process.env.NODE_ENV !== 'production') {\n var printWarning = function printWarning(format) {\n for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var argIndex = 0;\n var message = 'Warning: ' + format.replace(/%s/g, function () {\n return args[argIndex++];\n });\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) {}\n };\n\n warning = function warning(condition, format) {\n if (format === undefined) {\n throw new Error('`warning(condition, format, ...args)` requires a warning ' + 'message argument');\n }\n\n if (format.indexOf('Failed Composite propType: ') === 0) {\n return; // Ignore CompositeComponent proptype check.\n }\n\n if (!condition) {\n for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {\n args[_key2 - 2] = arguments[_key2];\n }\n\n printWarning.apply(undefined, [format].concat(args));\n }\n };\n}\n\nmodule.exports = warning;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.DiscussionEmbed = exports.CommentEmbed = exports.CommentCount = undefined;\n\nvar _CommentCount = require('./CommentCount');\n\nvar _CommentEmbed = require('./CommentEmbed');\n\nvar _DiscussionEmbed = require('./DiscussionEmbed');\n\nexports.CommentCount = _CommentCount.CommentCount;\nexports.CommentEmbed = _CommentEmbed.CommentEmbed;\nexports.DiscussionEmbed = _DiscussionEmbed.DiscussionEmbed;\n\n\nvar Disqus = {\n CommentCount: _CommentCount.CommentCount,\n CommentEmbed: _CommentEmbed.CommentEmbed,\n DiscussionEmbed: _DiscussionEmbed.DiscussionEmbed\n};\n\nexports.default = Disqus;","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n'use strict';\n\nvar _prodInvariant = require('./reactProdInvariant'),\n _assign = require('object-assign');\n\nvar ReactNoopUpdateQueue = require('./ReactNoopUpdateQueue');\n\nvar canDefineProperty = require('./canDefineProperty');\nvar emptyObject = require('fbjs/lib/emptyObject');\nvar invariant = require('fbjs/lib/invariant');\nvar lowPriorityWarning = require('./lowPriorityWarning');\n\n/**\n * Base class helpers for the updating state of a component.\n */\nfunction ReactComponent(props, context, updater) {\n this.props = props;\n this.context = context;\n this.refs = emptyObject;\n // We initialize the default updater but the real one gets injected by the\n // renderer.\n this.updater = updater || ReactNoopUpdateQueue;\n}\n\nReactComponent.prototype.isReactComponent = {};\n\n/**\n * Sets a subset of the state. Always use this to mutate\n * state. You should treat `this.state` as immutable.\n *\n * There is no guarantee that `this.state` will be immediately updated, so\n * accessing `this.state` after calling this method may return the old value.\n *\n * There is no guarantee that calls to `setState` will run synchronously,\n * as they may eventually be batched together. You can provide an optional\n * callback that will be executed when the call to setState is actually\n * completed.\n *\n * When a function is provided to setState, it will be called at some point in\n * the future (not synchronously). It will be called with the up to date\n * component arguments (state, props, context). These values can be different\n * from this.* because your function may be called after receiveProps but before\n * shouldComponentUpdate, and this new state, props, and context will not yet be\n * assigned to this.\n *\n * @param {object|function} partialState Next partial state or function to\n * produce next partial state to be merged with current state.\n * @param {?function} callback Called after state is updated.\n * @final\n * @protected\n */\nReactComponent.prototype.setState = function (partialState, callback) {\n !(typeof partialState === 'object' || typeof partialState === 'function' || partialState == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'setState(...): takes an object of state variables to update or a function which returns an object of state variables.') : _prodInvariant('85') : void 0;\n this.updater.enqueueSetState(this, partialState);\n if (callback) {\n this.updater.enqueueCallback(this, callback, 'setState');\n }\n};\n\n/**\n * Forces an update. This should only be invoked when it is known with\n * certainty that we are **not** in a DOM transaction.\n *\n * You may want to call this when you know that some deeper aspect of the\n * component's state has changed but `setState` was not called.\n *\n * This will not invoke `shouldComponentUpdate`, but it will invoke\n * `componentWillUpdate` and `componentDidUpdate`.\n *\n * @param {?function} callback Called after update is complete.\n * @final\n * @protected\n */\nReactComponent.prototype.forceUpdate = function (callback) {\n this.updater.enqueueForceUpdate(this);\n if (callback) {\n this.updater.enqueueCallback(this, callback, 'forceUpdate');\n }\n};\n\n/**\n * Deprecated APIs. These APIs used to exist on classic React classes but since\n * we would like to deprecate them, we're not going to move them over to this\n * modern base class. Instead, we define a getter that warns if it's accessed.\n */\nif (process.env.NODE_ENV !== 'production') {\n var deprecatedAPIs = {\n isMounted: ['isMounted', 'Instead, make sure to clean up subscriptions and pending requests in ' + 'componentWillUnmount to prevent memory leaks.'],\n replaceState: ['replaceState', 'Refactor your code to use setState instead (see ' + 'https://github.com/facebook/react/issues/3236).']\n };\n var defineDeprecationWarning = function (methodName, info) {\n if (canDefineProperty) {\n Object.defineProperty(ReactComponent.prototype, methodName, {\n get: function () {\n lowPriorityWarning(false, '%s(...) is deprecated in plain JavaScript React classes. %s', info[0], info[1]);\n return undefined;\n }\n });\n }\n };\n for (var fnName in deprecatedAPIs) {\n if (deprecatedAPIs.hasOwnProperty(fnName)) {\n defineDeprecationWarning(fnName, deprecatedAPIs[fnName]);\n }\n }\n}\n\n/**\n * Base class helpers for the updating state of a component.\n */\nfunction ReactPureComponent(props, context, updater) {\n // Duplicated from ReactComponent.\n this.props = props;\n this.context = context;\n this.refs = emptyObject;\n // We initialize the default updater but the real one gets injected by the\n // renderer.\n this.updater = updater || ReactNoopUpdateQueue;\n}\n\nfunction ComponentDummy() {}\nComponentDummy.prototype = ReactComponent.prototype;\nReactPureComponent.prototype = new ComponentDummy();\nReactPureComponent.prototype.constructor = ReactPureComponent;\n// Avoid an extra prototype jump for these methods.\n_assign(ReactPureComponent.prototype, ReactComponent.prototype);\nReactPureComponent.prototype.isPureReactComponent = true;\n\nmodule.exports = {\n Component: ReactComponent,\n PureComponent: ReactPureComponent\n};","/**\n * Copyright (c) 2015-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n'use strict';\n\nvar warning = require('fbjs/lib/warning');\n\nfunction warnNoop(publicInstance, callerName) {\n if (process.env.NODE_ENV !== 'production') {\n var constructor = publicInstance.constructor;\n process.env.NODE_ENV !== 'production' ? warning(false, '%s(...): Can only update a mounted or mounting component. ' + 'This usually means you called %s() on an unmounted component. ' + 'This is a no-op. Please check the code for the %s component.', callerName, callerName, constructor && (constructor.displayName || constructor.name) || 'ReactClass') : void 0;\n }\n}\n\n/**\n * This is the abstract API for an update queue.\n */\nvar ReactNoopUpdateQueue = {\n /**\n * Checks whether or not this composite component is mounted.\n * @param {ReactClass} publicInstance The instance we want to test.\n * @return {boolean} True if mounted, false otherwise.\n * @protected\n * @final\n */\n isMounted: function (publicInstance) {\n return false;\n },\n\n /**\n * Enqueue a callback that will be executed after all the pending updates\n * have processed.\n *\n * @param {ReactClass} publicInstance The instance to use as `this` context.\n * @param {?function} callback Called after state is updated.\n * @internal\n */\n enqueueCallback: function (publicInstance, callback) {},\n\n /**\n * Forces an update. This should only be invoked when it is known with\n * certainty that we are **not** in a DOM transaction.\n *\n * You may want to call this when you know that some deeper aspect of the\n * component's state has changed but `setState` was not called.\n *\n * This will not invoke `shouldComponentUpdate`, but it will invoke\n * `componentWillUpdate` and `componentDidUpdate`.\n *\n * @param {ReactClass} publicInstance The instance that should rerender.\n * @internal\n */\n enqueueForceUpdate: function (publicInstance) {\n warnNoop(publicInstance, 'forceUpdate');\n },\n\n /**\n * Replaces all of the state. Always use this or `setState` to mutate state.\n * You should treat `this.state` as immutable.\n *\n * There is no guarantee that `this.state` will be immediately updated, so\n * accessing `this.state` after calling this method may return the old value.\n *\n * @param {ReactClass} publicInstance The instance that should rerender.\n * @param {object} completeState Next state.\n * @internal\n */\n enqueueReplaceState: function (publicInstance, completeState) {\n warnNoop(publicInstance, 'replaceState');\n },\n\n /**\n * Sets a subset of the state. This only exists because _pendingState is\n * internal. This provides a merging strategy that is not available to deep\n * properties which is confusing. TODO: Expose pendingState or don't use it\n * during the merge.\n *\n * @param {ReactClass} publicInstance The instance that should rerender.\n * @param {object} partialState Next partial state to be merged with state.\n * @internal\n */\n enqueueSetState: function (publicInstance, partialState) {\n warnNoop(publicInstance, 'setState');\n }\n};\n\nmodule.exports = ReactNoopUpdateQueue;","\"use strict\";\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * \n */\n\nfunction makeEmptyFunction(arg) {\n return function () {\n return arg;\n };\n}\n\n/**\n * This function accepts and discards inputs; it has no side effects. This is\n * primarily useful idiomatically for overridable function endpoints which\n * always need to be callable, since JS lacks a null-call idiom ala Cocoa.\n */\nvar emptyFunction = function emptyFunction() {};\n\nemptyFunction.thatReturns = makeEmptyFunction;\nemptyFunction.thatReturnsFalse = makeEmptyFunction(false);\nemptyFunction.thatReturnsTrue = makeEmptyFunction(true);\nemptyFunction.thatReturnsNull = makeEmptyFunction(null);\nemptyFunction.thatReturnsThis = function () {\n return this;\n};\nemptyFunction.thatReturnsArgument = function (arg) {\n return arg;\n};\n\nmodule.exports = emptyFunction;","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * \n */\n\n'use strict';\n\nvar canDefineProperty = false;\nif (process.env.NODE_ENV !== 'production') {\n try {\n // $FlowFixMe https://github.com/facebook/flow/issues/285\n Object.defineProperty({}, 'x', { get: function () {} });\n canDefineProperty = true;\n } catch (x) {\n // IE will fail on defineProperty\n }\n}\n\nmodule.exports = canDefineProperty;","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n'use strict';\n\nvar emptyObject = {};\n\nif (process.env.NODE_ENV !== 'production') {\n Object.freeze(emptyObject);\n}\n\nmodule.exports = emptyObject;","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * \n */\n\n'use strict';\n\n/**\n * Keeps track of the current owner.\n *\n * The current owner is the component who should own any components that are\n * currently being constructed.\n */\nvar ReactCurrentOwner = {\n /**\n * @internal\n * @type {ReactComponent}\n */\n current: null\n};\n\nmodule.exports = ReactCurrentOwner;","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * \n */\n\n'use strict';\n\n// The Symbol used to tag the ReactElement type. If there is no native Symbol\n// nor polyfill, then a plain number is used for performance.\n\nvar REACT_ELEMENT_TYPE = typeof Symbol === 'function' && Symbol['for'] && Symbol['for']('react.element') || 0xeac7;\n\nmodule.exports = REACT_ELEMENT_TYPE;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.insertScript = insertScript;\nexports.removeScript = removeScript;\nexports.debounce = debounce;\nfunction insertScript(src, id, parentElement) {\n var script = window.document.createElement('script');\n script.async = true;\n script.src = src;\n script.id = id;\n parentElement.appendChild(script);\n\n return script;\n}\n\nfunction removeScript(id, parentElement) {\n var script = window.document.getElementById(id);\n if (script) parentElement.removeChild(script);\n}\n\nfunction debounce(func, wait, runOnFirstCall) {\n var timeout = void 0;\n return function () {\n var context = this; // eslint-disable-line consistent-this\n var args = arguments;\n\n var deferredExecution = function deferredExecution() {\n timeout = null;\n if (!runOnFirstCall) func.apply(context, args);\n };\n\n var callNow = runOnFirstCall && !timeout;\n\n window.clearTimeout(timeout);\n timeout = setTimeout(deferredExecution, wait);\n\n if (callNow) func.apply(context, args);\n };\n}","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.CommentCount = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _utils = require('./utils');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar queueResetCount = (0, _utils.debounce)(function () {\n if (window.DISQUSWIDGETS) window.DISQUSWIDGETS.getCount({ reset: true });\n}, 300, false); // eslint-disable-line no-magic-numbers\n\nvar CommentCount = exports.CommentCount = function (_React$Component) {\n _inherits(CommentCount, _React$Component);\n\n function CommentCount() {\n _classCallCheck(this, CommentCount);\n\n return _possibleConstructorReturn(this, (CommentCount.__proto__ || Object.getPrototypeOf(CommentCount)).apply(this, arguments));\n }\n\n _createClass(CommentCount, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n this.loadInstance();\n }\n }, {\n key: 'shouldComponentUpdate',\n value: function shouldComponentUpdate(nextProps) {\n if (this.props.shortname !== nextProps.shortname) return true;\n\n var nextConfig = nextProps.config;\n var config = this.props.config;\n if (nextConfig.url === config.url || nextConfig.identifier === config.identifier) return false;\n return true;\n }\n }, {\n key: 'componentWillUpdate',\n value: function componentWillUpdate(nextProps) {\n if (this.props.shortname !== nextProps.shortname) this.cleanInstance();\n }\n }, {\n key: 'componentDidUpdate',\n value: function componentDidUpdate() {\n this.loadInstance();\n }\n }, {\n key: 'loadInstance',\n value: function loadInstance() {\n var doc = window.document;\n if (doc.getElementById('dsq-count-scr')) queueResetCount();else (0, _utils.insertScript)('https://' + this.props.shortname + '.disqus.com/count.js', 'dsq-count-scr', doc.body);\n }\n }, {\n key: 'cleanInstance',\n value: function cleanInstance() {\n var body = window.document.body;\n (0, _utils.removeScript)('dsq-count-scr', body);\n\n // count.js only reassigns this window object if it's undefined.\n window.DISQUSWIDGETS = undefined;\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'span',\n {\n className: 'disqus-comment-count',\n 'data-disqus-identifier': this.props.config.identifier,\n 'data-disqus-url': this.props.config.url\n },\n this.props.children\n );\n }\n }]);\n\n return CommentCount;\n}(_react2.default.Component);","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n'use strict';\n\nvar _assign = require('object-assign');\n\nvar ReactBaseClasses = require('./ReactBaseClasses');\nvar ReactChildren = require('./ReactChildren');\nvar ReactDOMFactories = require('./ReactDOMFactories');\nvar ReactElement = require('./ReactElement');\nvar ReactPropTypes = require('./ReactPropTypes');\nvar ReactVersion = require('./ReactVersion');\n\nvar createReactClass = require('./createClass');\nvar onlyChild = require('./onlyChild');\n\nvar createElement = ReactElement.createElement;\nvar createFactory = ReactElement.createFactory;\nvar cloneElement = ReactElement.cloneElement;\n\nif (process.env.NODE_ENV !== 'production') {\n var lowPriorityWarning = require('./lowPriorityWarning');\n var canDefineProperty = require('./canDefineProperty');\n var ReactElementValidator = require('./ReactElementValidator');\n var didWarnPropTypesDeprecated = false;\n createElement = ReactElementValidator.createElement;\n createFactory = ReactElementValidator.createFactory;\n cloneElement = ReactElementValidator.cloneElement;\n}\n\nvar __spread = _assign;\nvar createMixin = function (mixin) {\n return mixin;\n};\n\nif (process.env.NODE_ENV !== 'production') {\n var warnedForSpread = false;\n var warnedForCreateMixin = false;\n __spread = function () {\n lowPriorityWarning(warnedForSpread, 'React.__spread is deprecated and should not be used. Use ' + 'Object.assign directly or another helper function with similar ' + 'semantics. You may be seeing this warning due to your compiler. ' + 'See https://fb.me/react-spread-deprecation for more details.');\n warnedForSpread = true;\n return _assign.apply(null, arguments);\n };\n\n createMixin = function (mixin) {\n lowPriorityWarning(warnedForCreateMixin, 'React.createMixin is deprecated and should not be used. ' + 'In React v16.0, it will be removed. ' + 'You can use this mixin directly instead. ' + 'See https://fb.me/createmixin-was-never-implemented for more info.');\n warnedForCreateMixin = true;\n return mixin;\n };\n}\n\nvar React = {\n // Modern\n\n Children: {\n map: ReactChildren.map,\n forEach: ReactChildren.forEach,\n count: ReactChildren.count,\n toArray: ReactChildren.toArray,\n only: onlyChild\n },\n\n Component: ReactBaseClasses.Component,\n PureComponent: ReactBaseClasses.PureComponent,\n\n createElement: createElement,\n cloneElement: cloneElement,\n isValidElement: ReactElement.isValidElement,\n\n // Classic\n\n PropTypes: ReactPropTypes,\n createClass: createReactClass,\n createFactory: createFactory,\n createMixin: createMixin,\n\n // This looks DOM specific but these are actually isomorphic helpers\n // since they are just generating DOM strings.\n DOM: ReactDOMFactories,\n\n version: ReactVersion,\n\n // Deprecated hook for JSX spread, don't use this for anything.\n __spread: __spread\n};\n\nif (process.env.NODE_ENV !== 'production') {\n var warnedForCreateClass = false;\n if (canDefineProperty) {\n Object.defineProperty(React, 'PropTypes', {\n get: function () {\n lowPriorityWarning(didWarnPropTypesDeprecated, 'Accessing PropTypes via the main React package is deprecated,' + ' and will be removed in React v16.0.' + ' Use the latest available v15.* prop-types package from npm instead.' + ' For info on usage, compatibility, migration and more, see ' + 'https://fb.me/prop-types-docs');\n didWarnPropTypesDeprecated = true;\n return ReactPropTypes;\n }\n });\n\n Object.defineProperty(React, 'createClass', {\n get: function () {\n lowPriorityWarning(warnedForCreateClass, 'Accessing createClass via the main React package is deprecated,' + ' and will be removed in React v16.0.' + \" Use a plain JavaScript class instead. If you're not yet \" + 'ready to migrate, create-react-class v15.* is available ' + 'on npm as a temporary, drop-in replacement. ' + 'For more info see https://fb.me/react-create-class');\n warnedForCreateClass = true;\n return createReactClass;\n }\n });\n }\n\n // React.DOM factories are deprecated. Wrap these methods so that\n // invocations of the React.DOM namespace and alert users to switch\n // to the `react-dom-factories` package.\n React.DOM = {};\n var warnedForFactories = false;\n Object.keys(ReactDOMFactories).forEach(function (factory) {\n React.DOM[factory] = function () {\n if (!warnedForFactories) {\n lowPriorityWarning(false, 'Accessing factories like React.DOM.%s has been deprecated ' + 'and will be removed in v16.0+. Use the ' + 'react-dom-factories package instead. ' + ' Version 1.0 provides a drop-in replacement.' + ' For more info, see https://fb.me/react-dom-factories', factory);\n warnedForFactories = true;\n }\n return ReactDOMFactories[factory].apply(ReactDOMFactories, arguments);\n };\n });\n}\n\nmodule.exports = React;","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n'use strict';\n\n/**\n * Forked from fbjs/warning:\n * https://github.com/facebook/fbjs/blob/e66ba20ad5be433eb54423f2b097d829324d9de6/packages/fbjs/src/__forks__/warning.js\n *\n * Only change is we use console.warn instead of console.error,\n * and do nothing when 'console' is not supported.\n * This really simplifies the code.\n * ---\n * Similar to invariant but only logs a warning if the condition is not met.\n * This can be used to log issues in development environments in critical\n * paths. Removing the logging code for production environments will keep the\n * same logic and follow the same code paths.\n */\n\nvar lowPriorityWarning = function () {};\n\nif (process.env.NODE_ENV !== 'production') {\n var printWarning = function (format) {\n for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var argIndex = 0;\n var message = 'Warning: ' + format.replace(/%s/g, function () {\n return args[argIndex++];\n });\n if (typeof console !== 'undefined') {\n console.warn(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) {}\n };\n\n lowPriorityWarning = function (condition, format) {\n if (format === undefined) {\n throw new Error('`warning(condition, format, ...args)` requires a warning ' + 'message argument');\n }\n if (!condition) {\n for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {\n args[_key2 - 2] = arguments[_key2];\n }\n\n printWarning.apply(undefined, [format].concat(args));\n }\n };\n}\n\nmodule.exports = lowPriorityWarning;","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n'use strict';\n\nvar PooledClass = require('./PooledClass');\nvar ReactElement = require('./ReactElement');\n\nvar emptyFunction = require('fbjs/lib/emptyFunction');\nvar traverseAllChildren = require('./traverseAllChildren');\n\nvar twoArgumentPooler = PooledClass.twoArgumentPooler;\nvar fourArgumentPooler = PooledClass.fourArgumentPooler;\n\nvar userProvidedKeyEscapeRegex = /\\/+/g;\nfunction escapeUserProvidedKey(text) {\n return ('' + text).replace(userProvidedKeyEscapeRegex, '$&/');\n}\n\n/**\n * PooledClass representing the bookkeeping associated with performing a child\n * traversal. Allows avoiding binding callbacks.\n *\n * @constructor ForEachBookKeeping\n * @param {!function} forEachFunction Function to perform traversal with.\n * @param {?*} forEachContext Context to perform context with.\n */\nfunction ForEachBookKeeping(forEachFunction, forEachContext) {\n this.func = forEachFunction;\n this.context = forEachContext;\n this.count = 0;\n}\nForEachBookKeeping.prototype.destructor = function () {\n this.func = null;\n this.context = null;\n this.count = 0;\n};\nPooledClass.addPoolingTo(ForEachBookKeeping, twoArgumentPooler);\n\nfunction forEachSingleChild(bookKeeping, child, name) {\n var func = bookKeeping.func,\n context = bookKeeping.context;\n\n func.call(context, child, bookKeeping.count++);\n}\n\n/**\n * Iterates through children that are typically specified as `props.children`.\n *\n * See https://facebook.github.io/react/docs/top-level-api.html#react.children.foreach\n *\n * The provided forEachFunc(child, index) will be called for each\n * leaf child.\n *\n * @param {?*} children Children tree container.\n * @param {function(*, int)} forEachFunc\n * @param {*} forEachContext Context for forEachContext.\n */\nfunction forEachChildren(children, forEachFunc, forEachContext) {\n if (children == null) {\n return children;\n }\n var traverseContext = ForEachBookKeeping.getPooled(forEachFunc, forEachContext);\n traverseAllChildren(children, forEachSingleChild, traverseContext);\n ForEachBookKeeping.release(traverseContext);\n}\n\n/**\n * PooledClass representing the bookkeeping associated with performing a child\n * mapping. Allows avoiding binding callbacks.\n *\n * @constructor MapBookKeeping\n * @param {!*} mapResult Object containing the ordered map of results.\n * @param {!function} mapFunction Function to perform mapping with.\n * @param {?*} mapContext Context to perform mapping with.\n */\nfunction MapBookKeeping(mapResult, keyPrefix, mapFunction, mapContext) {\n this.result = mapResult;\n this.keyPrefix = keyPrefix;\n this.func = mapFunction;\n this.context = mapContext;\n this.count = 0;\n}\nMapBookKeeping.prototype.destructor = function () {\n this.result = null;\n this.keyPrefix = null;\n this.func = null;\n this.context = null;\n this.count = 0;\n};\nPooledClass.addPoolingTo(MapBookKeeping, fourArgumentPooler);\n\nfunction mapSingleChildIntoContext(bookKeeping, child, childKey) {\n var result = bookKeeping.result,\n keyPrefix = bookKeeping.keyPrefix,\n func = bookKeeping.func,\n context = bookKeeping.context;\n\n\n var mappedChild = func.call(context, child, bookKeeping.count++);\n if (Array.isArray(mappedChild)) {\n mapIntoWithKeyPrefixInternal(mappedChild, result, childKey, emptyFunction.thatReturnsArgument);\n } else if (mappedChild != null) {\n if (ReactElement.isValidElement(mappedChild)) {\n mappedChild = ReactElement.cloneAndReplaceKey(mappedChild,\n // Keep both the (mapped) and old keys if they differ, just as\n // traverseAllChildren used to do for objects as children\n keyPrefix + (mappedChild.key && (!child || child.key !== mappedChild.key) ? escapeUserProvidedKey(mappedChild.key) + '/' : '') + childKey);\n }\n result.push(mappedChild);\n }\n}\n\nfunction mapIntoWithKeyPrefixInternal(children, array, prefix, func, context) {\n var escapedPrefix = '';\n if (prefix != null) {\n escapedPrefix = escapeUserProvidedKey(prefix) + '/';\n }\n var traverseContext = MapBookKeeping.getPooled(array, escapedPrefix, func, context);\n traverseAllChildren(children, mapSingleChildIntoContext, traverseContext);\n MapBookKeeping.release(traverseContext);\n}\n\n/**\n * Maps children that are typically specified as `props.children`.\n *\n * See https://facebook.github.io/react/docs/top-level-api.html#react.children.map\n *\n * The provided mapFunction(child, key, index) will be called for each\n * leaf child.\n *\n * @param {?*} children Children tree container.\n * @param {function(*, int)} func The map function.\n * @param {*} context Context for mapFunction.\n * @return {object} Object containing the ordered map of results.\n */\nfunction mapChildren(children, func, context) {\n if (children == null) {\n return children;\n }\n var result = [];\n mapIntoWithKeyPrefixInternal(children, result, null, func, context);\n return result;\n}\n\nfunction forEachSingleChildDummy(traverseContext, child, name) {\n return null;\n}\n\n/**\n * Count the number of children that are typically specified as\n * `props.children`.\n *\n * See https://facebook.github.io/react/docs/top-level-api.html#react.children.count\n *\n * @param {?*} children Children tree container.\n * @return {number} The number of children.\n */\nfunction countChildren(children, context) {\n return traverseAllChildren(children, forEachSingleChildDummy, null);\n}\n\n/**\n * Flatten a children object (typically specified as `props.children`) and\n * return an array with appropriately re-keyed children.\n *\n * See https://facebook.github.io/react/docs/top-level-api.html#react.children.toarray\n */\nfunction toArray(children) {\n var result = [];\n mapIntoWithKeyPrefixInternal(children, result, null, emptyFunction.thatReturnsArgument);\n return result;\n}\n\nvar ReactChildren = {\n forEach: forEachChildren,\n map: mapChildren,\n mapIntoWithKeyPrefixInternal: mapIntoWithKeyPrefixInternal,\n count: countChildren,\n toArray: toArray\n};\n\nmodule.exports = ReactChildren;","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * \n */\n\n'use strict';\n\nvar _prodInvariant = require('./reactProdInvariant');\n\nvar invariant = require('fbjs/lib/invariant');\n\n/**\n * Static poolers. Several custom versions for each potential number of\n * arguments. A completely generic pooler is easy to implement, but would\n * require accessing the `arguments` object. In each of these, `this` refers to\n * the Class itself, not an instance. If any others are needed, simply add them\n * here, or in their own files.\n */\nvar oneArgumentPooler = function (copyFieldsFrom) {\n var Klass = this;\n if (Klass.instancePool.length) {\n var instance = Klass.instancePool.pop();\n Klass.call(instance, copyFieldsFrom);\n return instance;\n } else {\n return new Klass(copyFieldsFrom);\n }\n};\n\nvar twoArgumentPooler = function (a1, a2) {\n var Klass = this;\n if (Klass.instancePool.length) {\n var instance = Klass.instancePool.pop();\n Klass.call(instance, a1, a2);\n return instance;\n } else {\n return new Klass(a1, a2);\n }\n};\n\nvar threeArgumentPooler = function (a1, a2, a3) {\n var Klass = this;\n if (Klass.instancePool.length) {\n var instance = Klass.instancePool.pop();\n Klass.call(instance, a1, a2, a3);\n return instance;\n } else {\n return new Klass(a1, a2, a3);\n }\n};\n\nvar fourArgumentPooler = function (a1, a2, a3, a4) {\n var Klass = this;\n if (Klass.instancePool.length) {\n var instance = Klass.instancePool.pop();\n Klass.call(instance, a1, a2, a3, a4);\n return instance;\n } else {\n return new Klass(a1, a2, a3, a4);\n }\n};\n\nvar standardReleaser = function (instance) {\n var Klass = this;\n !(instance instanceof Klass) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Trying to release an instance into a pool of a different type.') : _prodInvariant('25') : void 0;\n instance.destructor();\n if (Klass.instancePool.length < Klass.poolSize) {\n Klass.instancePool.push(instance);\n }\n};\n\nvar DEFAULT_POOL_SIZE = 10;\nvar DEFAULT_POOLER = oneArgumentPooler;\n\n/**\n * Augments `CopyConstructor` to be a poolable class, augmenting only the class\n * itself (statically) not adding any prototypical fields. Any CopyConstructor\n * you give this may have a `poolSize` property, and will look for a\n * prototypical `destructor` on instances.\n *\n * @param {Function} CopyConstructor Constructor that can be used to reset.\n * @param {Function} pooler Customizable pooler.\n */\nvar addPoolingTo = function (CopyConstructor, pooler) {\n // Casting as any so that flow ignores the actual implementation and trusts\n // it to match the type we declared\n var NewKlass = CopyConstructor;\n NewKlass.instancePool = [];\n NewKlass.getPooled = pooler || DEFAULT_POOLER;\n if (!NewKlass.poolSize) {\n NewKlass.poolSize = DEFAULT_POOL_SIZE;\n }\n NewKlass.release = standardReleaser;\n return NewKlass;\n};\n\nvar PooledClass = {\n addPoolingTo: addPoolingTo,\n oneArgumentPooler: oneArgumentPooler,\n twoArgumentPooler: twoArgumentPooler,\n threeArgumentPooler: threeArgumentPooler,\n fourArgumentPooler: fourArgumentPooler\n};\n\nmodule.exports = PooledClass;","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n'use strict';\n\nvar _prodInvariant = require('./reactProdInvariant');\n\nvar ReactCurrentOwner = require('./ReactCurrentOwner');\nvar REACT_ELEMENT_TYPE = require('./ReactElementSymbol');\n\nvar getIteratorFn = require('./getIteratorFn');\nvar invariant = require('fbjs/lib/invariant');\nvar KeyEscapeUtils = require('./KeyEscapeUtils');\nvar warning = require('fbjs/lib/warning');\n\nvar SEPARATOR = '.';\nvar SUBSEPARATOR = ':';\n\n/**\n * This is inlined from ReactElement since this file is shared between\n * isomorphic and renderers. We could extract this to a\n *\n */\n\n/**\n * TODO: Test that a single child and an array with one item have the same key\n * pattern.\n */\n\nvar didWarnAboutMaps = false;\n\n/**\n * Generate a key string that identifies a component within a set.\n *\n * @param {*} component A component that could contain a manual key.\n * @param {number} index Index that is used if a manual key is not provided.\n * @return {string}\n */\nfunction getComponentKey(component, index) {\n // Do some typechecking here since we call this blindly. We want to ensure\n // that we don't block potential future ES APIs.\n if (component && typeof component === 'object' && component.key != null) {\n // Explicit key\n return KeyEscapeUtils.escape(component.key);\n }\n // Implicit key determined by the index in the set\n return index.toString(36);\n}\n\n/**\n * @param {?*} children Children tree container.\n * @param {!string} nameSoFar Name of the key path so far.\n * @param {!function} callback Callback to invoke with each child found.\n * @param {?*} traverseContext Used to pass information throughout the traversal\n * process.\n * @return {!number} The number of children in this subtree.\n */\nfunction traverseAllChildrenImpl(children, nameSoFar, callback, traverseContext) {\n var type = typeof children;\n\n if (type === 'undefined' || type === 'boolean') {\n // All of the above are perceived as null.\n children = null;\n }\n\n if (children === null || type === 'string' || type === 'number' ||\n // The following is inlined from ReactElement. This means we can optimize\n // some checks. React Fiber also inlines this logic for similar purposes.\n type === 'object' && children.$$typeof === REACT_ELEMENT_TYPE) {\n callback(traverseContext, children,\n // If it's the only child, treat the name as if it was wrapped in an array\n // so that it's consistent if the number of children grows.\n nameSoFar === '' ? SEPARATOR + getComponentKey(children, 0) : nameSoFar);\n return 1;\n }\n\n var child;\n var nextName;\n var subtreeCount = 0; // Count of children found in the current subtree.\n var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR;\n\n if (Array.isArray(children)) {\n for (var i = 0; i < children.length; i++) {\n child = children[i];\n nextName = nextNamePrefix + getComponentKey(child, i);\n subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);\n }\n } else {\n var iteratorFn = getIteratorFn(children);\n if (iteratorFn) {\n var iterator = iteratorFn.call(children);\n var step;\n if (iteratorFn !== children.entries) {\n var ii = 0;\n while (!(step = iterator.next()).done) {\n child = step.value;\n nextName = nextNamePrefix + getComponentKey(child, ii++);\n subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);\n }\n } else {\n if (process.env.NODE_ENV !== 'production') {\n var mapsAsChildrenAddendum = '';\n if (ReactCurrentOwner.current) {\n var mapsAsChildrenOwnerName = ReactCurrentOwner.current.getName();\n if (mapsAsChildrenOwnerName) {\n mapsAsChildrenAddendum = ' Check the render method of `' + mapsAsChildrenOwnerName + '`.';\n }\n }\n process.env.NODE_ENV !== 'production' ? warning(didWarnAboutMaps, 'Using Maps as children is not yet fully supported. It is an ' + 'experimental feature that might be removed. Convert it to a ' + 'sequence / iterable of keyed ReactElements instead.%s', mapsAsChildrenAddendum) : void 0;\n didWarnAboutMaps = true;\n }\n // Iterator will provide entry [k,v] tuples rather than values.\n while (!(step = iterator.next()).done) {\n var entry = step.value;\n if (entry) {\n child = entry[1];\n nextName = nextNamePrefix + KeyEscapeUtils.escape(entry[0]) + SUBSEPARATOR + getComponentKey(child, 0);\n subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);\n }\n }\n }\n } else if (type === 'object') {\n var addendum = '';\n if (process.env.NODE_ENV !== 'production') {\n addendum = ' If you meant to render a collection of children, use an array ' + 'instead or wrap the object using createFragment(object) from the ' + 'React add-ons.';\n if (children._isReactElement) {\n addendum = \" It looks like you're using an element created by a different \" + 'version of React. Make sure to use only one copy of React.';\n }\n if (ReactCurrentOwner.current) {\n var name = ReactCurrentOwner.current.getName();\n if (name) {\n addendum += ' Check the render method of `' + name + '`.';\n }\n }\n }\n var childrenString = String(children);\n !false ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Objects are not valid as a React child (found: %s).%s', childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString, addendum) : _prodInvariant('31', childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString, addendum) : void 0;\n }\n }\n\n return subtreeCount;\n}\n\n/**\n * Traverses children that are typically specified as `props.children`, but\n * might also be specified through attributes:\n *\n * - `traverseAllChildren(this.props.children, ...)`\n * - `traverseAllChildren(this.props.leftPanelChildren, ...)`\n *\n * The `traverseContext` is an optional argument that is passed through the\n * entire traversal. It can be used to store accumulations or anything else that\n * the callback might find relevant.\n *\n * @param {?*} children Children tree object.\n * @param {!function} callback To invoke upon traversing each child.\n * @param {?*} traverseContext Context for traversal.\n * @return {!number} The number of children in this subtree.\n */\nfunction traverseAllChildren(children, callback, traverseContext) {\n if (children == null) {\n return 0;\n }\n\n return traverseAllChildrenImpl(children, '', callback, traverseContext);\n}\n\nmodule.exports = traverseAllChildren;","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * \n */\n\n'use strict';\n\n/* global Symbol */\n\nvar ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.\n\n/**\n * Returns the iterator method function contained on the iterable object.\n *\n * Be sure to invoke the function with the iterable as context:\n *\n * var iteratorFn = getIteratorFn(myIterable);\n * if (iteratorFn) {\n * var iterator = iteratorFn.call(myIterable);\n * ...\n * }\n *\n * @param {?object} maybeIterable\n * @return {?function}\n */\nfunction getIteratorFn(maybeIterable) {\n var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);\n if (typeof iteratorFn === 'function') {\n return iteratorFn;\n }\n}\n\nmodule.exports = getIteratorFn;","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * \n */\n\n'use strict';\n\n/**\n * Escape and wrap key so it is safe to use as a reactid\n *\n * @param {string} key to be escaped.\n * @return {string} the escaped key.\n */\n\nfunction escape(key) {\n var escapeRegex = /[=:]/g;\n var escaperLookup = {\n '=': '=0',\n ':': '=2'\n };\n var escapedString = ('' + key).replace(escapeRegex, function (match) {\n return escaperLookup[match];\n });\n\n return '$' + escapedString;\n}\n\n/**\n * Unescape and unwrap key for human-readable display\n *\n * @param {string} key to unescape.\n * @return {string} the unescaped key.\n */\nfunction unescape(key) {\n var unescapeRegex = /(=0|=2)/g;\n var unescaperLookup = {\n '=0': '=',\n '=2': ':'\n };\n var keySubstring = key[0] === '.' && key[1] === '$' ? key.substring(2) : key.substring(1);\n\n return ('' + keySubstring).replace(unescapeRegex, function (match) {\n return unescaperLookup[match];\n });\n}\n\nvar KeyEscapeUtils = {\n escape: escape,\n unescape: unescape\n};\n\nmodule.exports = KeyEscapeUtils;","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n'use strict';\n\nvar ReactElement = require('./ReactElement');\n\n/**\n * Create a factory that creates HTML tag elements.\n *\n * @private\n */\nvar createDOMFactory = ReactElement.createFactory;\nif (process.env.NODE_ENV !== 'production') {\n var ReactElementValidator = require('./ReactElementValidator');\n createDOMFactory = ReactElementValidator.createFactory;\n}\n\n/**\n * Creates a mapping from supported HTML tags to `ReactDOMComponent` classes.\n *\n * @public\n */\nvar ReactDOMFactories = {\n a: createDOMFactory('a'),\n abbr: createDOMFactory('abbr'),\n address: createDOMFactory('address'),\n area: createDOMFactory('area'),\n article: createDOMFactory('article'),\n aside: createDOMFactory('aside'),\n audio: createDOMFactory('audio'),\n b: createDOMFactory('b'),\n base: createDOMFactory('base'),\n bdi: createDOMFactory('bdi'),\n bdo: createDOMFactory('bdo'),\n big: createDOMFactory('big'),\n blockquote: createDOMFactory('blockquote'),\n body: createDOMFactory('body'),\n br: createDOMFactory('br'),\n button: createDOMFactory('button'),\n canvas: createDOMFactory('canvas'),\n caption: createDOMFactory('caption'),\n cite: createDOMFactory('cite'),\n code: createDOMFactory('code'),\n col: createDOMFactory('col'),\n colgroup: createDOMFactory('colgroup'),\n data: createDOMFactory('data'),\n datalist: createDOMFactory('datalist'),\n dd: createDOMFactory('dd'),\n del: createDOMFactory('del'),\n details: createDOMFactory('details'),\n dfn: createDOMFactory('dfn'),\n dialog: createDOMFactory('dialog'),\n div: createDOMFactory('div'),\n dl: createDOMFactory('dl'),\n dt: createDOMFactory('dt'),\n em: createDOMFactory('em'),\n embed: createDOMFactory('embed'),\n fieldset: createDOMFactory('fieldset'),\n figcaption: createDOMFactory('figcaption'),\n figure: createDOMFactory('figure'),\n footer: createDOMFactory('footer'),\n form: createDOMFactory('form'),\n h1: createDOMFactory('h1'),\n h2: createDOMFactory('h2'),\n h3: createDOMFactory('h3'),\n h4: createDOMFactory('h4'),\n h5: createDOMFactory('h5'),\n h6: createDOMFactory('h6'),\n head: createDOMFactory('head'),\n header: createDOMFactory('header'),\n hgroup: createDOMFactory('hgroup'),\n hr: createDOMFactory('hr'),\n html: createDOMFactory('html'),\n i: createDOMFactory('i'),\n iframe: createDOMFactory('iframe'),\n img: createDOMFactory('img'),\n input: createDOMFactory('input'),\n ins: createDOMFactory('ins'),\n kbd: createDOMFactory('kbd'),\n keygen: createDOMFactory('keygen'),\n label: createDOMFactory('label'),\n legend: createDOMFactory('legend'),\n li: createDOMFactory('li'),\n link: createDOMFactory('link'),\n main: createDOMFactory('main'),\n map: createDOMFactory('map'),\n mark: createDOMFactory('mark'),\n menu: createDOMFactory('menu'),\n menuitem: createDOMFactory('menuitem'),\n meta: createDOMFactory('meta'),\n meter: createDOMFactory('meter'),\n nav: createDOMFactory('nav'),\n noscript: createDOMFactory('noscript'),\n object: createDOMFactory('object'),\n ol: createDOMFactory('ol'),\n optgroup: createDOMFactory('optgroup'),\n option: createDOMFactory('option'),\n output: createDOMFactory('output'),\n p: createDOMFactory('p'),\n param: createDOMFactory('param'),\n picture: createDOMFactory('picture'),\n pre: createDOMFactory('pre'),\n progress: createDOMFactory('progress'),\n q: createDOMFactory('q'),\n rp: createDOMFactory('rp'),\n rt: createDOMFactory('rt'),\n ruby: createDOMFactory('ruby'),\n s: createDOMFactory('s'),\n samp: createDOMFactory('samp'),\n script: createDOMFactory('script'),\n section: createDOMFactory('section'),\n select: createDOMFactory('select'),\n small: createDOMFactory('small'),\n source: createDOMFactory('source'),\n span: createDOMFactory('span'),\n strong: createDOMFactory('strong'),\n style: createDOMFactory('style'),\n sub: createDOMFactory('sub'),\n summary: createDOMFactory('summary'),\n sup: createDOMFactory('sup'),\n table: createDOMFactory('table'),\n tbody: createDOMFactory('tbody'),\n td: createDOMFactory('td'),\n textarea: createDOMFactory('textarea'),\n tfoot: createDOMFactory('tfoot'),\n th: createDOMFactory('th'),\n thead: createDOMFactory('thead'),\n time: createDOMFactory('time'),\n title: createDOMFactory('title'),\n tr: createDOMFactory('tr'),\n track: createDOMFactory('track'),\n u: createDOMFactory('u'),\n ul: createDOMFactory('ul'),\n 'var': createDOMFactory('var'),\n video: createDOMFactory('video'),\n wbr: createDOMFactory('wbr'),\n\n // SVG\n circle: createDOMFactory('circle'),\n clipPath: createDOMFactory('clipPath'),\n defs: createDOMFactory('defs'),\n ellipse: createDOMFactory('ellipse'),\n g: createDOMFactory('g'),\n image: createDOMFactory('image'),\n line: createDOMFactory('line'),\n linearGradient: createDOMFactory('linearGradient'),\n mask: createDOMFactory('mask'),\n path: createDOMFactory('path'),\n pattern: createDOMFactory('pattern'),\n polygon: createDOMFactory('polygon'),\n polyline: createDOMFactory('polyline'),\n radialGradient: createDOMFactory('radialGradient'),\n rect: createDOMFactory('rect'),\n stop: createDOMFactory('stop'),\n svg: createDOMFactory('svg'),\n text: createDOMFactory('text'),\n tspan: createDOMFactory('tspan')\n};\n\nmodule.exports = ReactDOMFactories;","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n'use strict';\n\nvar _require = require('./ReactElement'),\n isValidElement = _require.isValidElement;\n\nvar factory = require('prop-types/factory');\n\nmodule.exports = factory(isValidElement);","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n// React 15.5 references this module, and assumes PropTypes are still callable in production.\n// Therefore we re-export development-only version with all the PropTypes checks here.\n// However if one is migrating to the `prop-types` npm library, they will go through the\n// `index.js` entry point, and it will branch depending on the environment.\nvar factory = require('./factoryWithTypeCheckers');\nmodule.exports = function(isValidElement) {\n // It is still allowed in 15.5.\n var throwOnDirectAccess = false;\n return factory(isValidElement, throwOnDirectAccess);\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactIs = require('react-is');\nvar assign = require('object-assign');\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\nvar checkPropTypes = require('./checkPropTypes');\n\nvar has = Function.call.bind(Object.prototype.hasOwnProperty);\nvar printWarning = function() {};\n\nif (process.env.NODE_ENV !== 'production') {\n printWarning = function(text) {\n var message = 'Warning: ' + text;\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) {}\n };\n}\n\nfunction emptyFunctionThatReturnsNull() {\n return null;\n}\n\nmodule.exports = function(isValidElement, throwOnDirectAccess) {\n /* global Symbol */\n var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\n var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.\n\n /**\n * Returns the iterator method function contained on the iterable object.\n *\n * Be sure to invoke the function with the iterable as context:\n *\n * var iteratorFn = getIteratorFn(myIterable);\n * if (iteratorFn) {\n * var iterator = iteratorFn.call(myIterable);\n * ...\n * }\n *\n * @param {?object} maybeIterable\n * @return {?function}\n */\n function getIteratorFn(maybeIterable) {\n var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);\n if (typeof iteratorFn === 'function') {\n return iteratorFn;\n }\n }\n\n /**\n * Collection of methods that allow declaration and validation of props that are\n * supplied to React components. Example usage:\n *\n * var Props = require('ReactPropTypes');\n * var MyArticle = React.createClass({\n * propTypes: {\n * // An optional string prop named \"description\".\n * description: Props.string,\n *\n * // A required enum prop named \"category\".\n * category: Props.oneOf(['News','Photos']).isRequired,\n *\n * // A prop named \"dialog\" that requires an instance of Dialog.\n * dialog: Props.instanceOf(Dialog).isRequired\n * },\n * render: function() { ... }\n * });\n *\n * A more formal specification of how these methods are used:\n *\n * type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...)\n * decl := ReactPropTypes.{type}(.isRequired)?\n *\n * Each and every declaration produces a function with the same signature. This\n * allows the creation of custom validation functions. For example:\n *\n * var MyLink = React.createClass({\n * propTypes: {\n * // An optional string or URI prop named \"href\".\n * href: function(props, propName, componentName) {\n * var propValue = props[propName];\n * if (propValue != null && typeof propValue !== 'string' &&\n * !(propValue instanceof URI)) {\n * return new Error(\n * 'Expected a string or an URI for ' + propName + ' in ' +\n * componentName\n * );\n * }\n * }\n * },\n * render: function() {...}\n * });\n *\n * @internal\n */\n\n var ANONYMOUS = '<>';\n\n // Important!\n // Keep this list in sync with production version in `./factoryWithThrowingShims.js`.\n var ReactPropTypes = {\n array: createPrimitiveTypeChecker('array'),\n bool: createPrimitiveTypeChecker('boolean'),\n func: createPrimitiveTypeChecker('function'),\n number: createPrimitiveTypeChecker('number'),\n object: createPrimitiveTypeChecker('object'),\n string: createPrimitiveTypeChecker('string'),\n symbol: createPrimitiveTypeChecker('symbol'),\n\n any: createAnyTypeChecker(),\n arrayOf: createArrayOfTypeChecker,\n element: createElementTypeChecker(),\n elementType: createElementTypeTypeChecker(),\n instanceOf: createInstanceTypeChecker,\n node: createNodeChecker(),\n objectOf: createObjectOfTypeChecker,\n oneOf: createEnumTypeChecker,\n oneOfType: createUnionTypeChecker,\n shape: createShapeTypeChecker,\n exact: createStrictShapeTypeChecker,\n };\n\n /**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\n /*eslint-disable no-self-compare*/\n function is(x, y) {\n // SameValue algorithm\n if (x === y) {\n // Steps 1-5, 7-10\n // Steps 6.b-6.e: +0 != -0\n return x !== 0 || 1 / x === 1 / y;\n } else {\n // Step 6.a: NaN == NaN\n return x !== x && y !== y;\n }\n }\n /*eslint-enable no-self-compare*/\n\n /**\n * We use an Error-like object for backward compatibility as people may call\n * PropTypes directly and inspect their output. However, we don't use real\n * Errors anymore. We don't inspect their stack anyway, and creating them\n * is prohibitively expensive if they are created too often, such as what\n * happens in oneOfType() for any type before the one that matched.\n */\n function PropTypeError(message) {\n this.message = message;\n this.stack = '';\n }\n // Make `instanceof Error` still work for returned errors.\n PropTypeError.prototype = Error.prototype;\n\n function createChainableTypeChecker(validate) {\n if (process.env.NODE_ENV !== 'production') {\n var manualPropTypeCallCache = {};\n var manualPropTypeWarningCount = 0;\n }\n function checkType(isRequired, props, propName, componentName, location, propFullName, secret) {\n componentName = componentName || ANONYMOUS;\n propFullName = propFullName || propName;\n\n if (secret !== ReactPropTypesSecret) {\n if (throwOnDirectAccess) {\n // New behavior only for users of `prop-types` package\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use `PropTypes.checkPropTypes()` to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n } else if (process.env.NODE_ENV !== 'production' && typeof console !== 'undefined') {\n // Old behavior for people using React.PropTypes\n var cacheKey = componentName + ':' + propName;\n if (\n !manualPropTypeCallCache[cacheKey] &&\n // Avoid spamming the console because they are often not actionable except for lib authors\n manualPropTypeWarningCount < 3\n ) {\n printWarning(\n 'You are manually calling a React.PropTypes validation ' +\n 'function for the `' + propFullName + '` prop on `' + componentName + '`. This is deprecated ' +\n 'and will throw in the standalone `prop-types` package. ' +\n 'You may be seeing this warning due to a third-party PropTypes ' +\n 'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.'\n );\n manualPropTypeCallCache[cacheKey] = true;\n manualPropTypeWarningCount++;\n }\n }\n }\n if (props[propName] == null) {\n if (isRequired) {\n if (props[propName] === null) {\n return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.'));\n }\n return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.'));\n }\n return null;\n } else {\n return validate(props, propName, componentName, location, propFullName);\n }\n }\n\n var chainedCheckType = checkType.bind(null, false);\n chainedCheckType.isRequired = checkType.bind(null, true);\n\n return chainedCheckType;\n }\n\n function createPrimitiveTypeChecker(expectedType) {\n function validate(props, propName, componentName, location, propFullName, secret) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== expectedType) {\n // `propValue` being instance of, say, date/regexp, pass the 'object'\n // check, but we can offer a more precise error message here rather than\n // 'of type `object`'.\n var preciseType = getPreciseType(propValue);\n\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createAnyTypeChecker() {\n return createChainableTypeChecker(emptyFunctionThatReturnsNull);\n }\n\n function createArrayOfTypeChecker(typeChecker) {\n function validate(props, propName, componentName, location, propFullName) {\n if (typeof typeChecker !== 'function') {\n return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.');\n }\n var propValue = props[propName];\n if (!Array.isArray(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.'));\n }\n for (var i = 0; i < propValue.length; i++) {\n var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret);\n if (error instanceof Error) {\n return error;\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createElementTypeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n if (!isValidElement(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createElementTypeTypeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n if (!ReactIs.isValidElementType(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement type.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createInstanceTypeChecker(expectedClass) {\n function validate(props, propName, componentName, location, propFullName) {\n if (!(props[propName] instanceof expectedClass)) {\n var expectedClassName = expectedClass.name || ANONYMOUS;\n var actualClassName = getClassName(props[propName]);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createEnumTypeChecker(expectedValues) {\n if (!Array.isArray(expectedValues)) {\n if (process.env.NODE_ENV !== 'production') {\n if (arguments.length > 1) {\n printWarning(\n 'Invalid arguments supplied to oneOf, expected an array, got ' + arguments.length + ' arguments. ' +\n 'A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z]).'\n );\n } else {\n printWarning('Invalid argument supplied to oneOf, expected an array.');\n }\n }\n return emptyFunctionThatReturnsNull;\n }\n\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n for (var i = 0; i < expectedValues.length; i++) {\n if (is(propValue, expectedValues[i])) {\n return null;\n }\n }\n\n var valuesString = JSON.stringify(expectedValues, function replacer(key, value) {\n var type = getPreciseType(value);\n if (type === 'symbol') {\n return String(value);\n }\n return value;\n });\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + String(propValue) + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.'));\n }\n return createChainableTypeChecker(validate);\n }\n\n function createObjectOfTypeChecker(typeChecker) {\n function validate(props, propName, componentName, location, propFullName) {\n if (typeof typeChecker !== 'function') {\n return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.');\n }\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.'));\n }\n for (var key in propValue) {\n if (has(propValue, key)) {\n var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n if (error instanceof Error) {\n return error;\n }\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createUnionTypeChecker(arrayOfTypeCheckers) {\n if (!Array.isArray(arrayOfTypeCheckers)) {\n process.env.NODE_ENV !== 'production' ? printWarning('Invalid argument supplied to oneOfType, expected an instance of array.') : void 0;\n return emptyFunctionThatReturnsNull;\n }\n\n for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n var checker = arrayOfTypeCheckers[i];\n if (typeof checker !== 'function') {\n printWarning(\n 'Invalid argument supplied to oneOfType. Expected an array of check functions, but ' +\n 'received ' + getPostfixForTypeWarning(checker) + ' at index ' + i + '.'\n );\n return emptyFunctionThatReturnsNull;\n }\n }\n\n function validate(props, propName, componentName, location, propFullName) {\n for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n var checker = arrayOfTypeCheckers[i];\n if (checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret) == null) {\n return null;\n }\n }\n\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`.'));\n }\n return createChainableTypeChecker(validate);\n }\n\n function createNodeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n if (!isNode(props[propName])) {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createShapeTypeChecker(shapeTypes) {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n }\n for (var key in shapeTypes) {\n var checker = shapeTypes[key];\n if (!checker) {\n continue;\n }\n var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n if (error) {\n return error;\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createStrictShapeTypeChecker(shapeTypes) {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n }\n // We need to check all keys in case some are required but missing from\n // props.\n var allKeys = assign({}, props[propName], shapeTypes);\n for (var key in allKeys) {\n var checker = shapeTypes[key];\n if (!checker) {\n return new PropTypeError(\n 'Invalid ' + location + ' `' + propFullName + '` key `' + key + '` supplied to `' + componentName + '`.' +\n '\\nBad object: ' + JSON.stringify(props[propName], null, ' ') +\n '\\nValid keys: ' + JSON.stringify(Object.keys(shapeTypes), null, ' ')\n );\n }\n var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n if (error) {\n return error;\n }\n }\n return null;\n }\n\n return createChainableTypeChecker(validate);\n }\n\n function isNode(propValue) {\n switch (typeof propValue) {\n case 'number':\n case 'string':\n case 'undefined':\n return true;\n case 'boolean':\n return !propValue;\n case 'object':\n if (Array.isArray(propValue)) {\n return propValue.every(isNode);\n }\n if (propValue === null || isValidElement(propValue)) {\n return true;\n }\n\n var iteratorFn = getIteratorFn(propValue);\n if (iteratorFn) {\n var iterator = iteratorFn.call(propValue);\n var step;\n if (iteratorFn !== propValue.entries) {\n while (!(step = iterator.next()).done) {\n if (!isNode(step.value)) {\n return false;\n }\n }\n } else {\n // Iterator will provide entry [k,v] tuples rather than values.\n while (!(step = iterator.next()).done) {\n var entry = step.value;\n if (entry) {\n if (!isNode(entry[1])) {\n return false;\n }\n }\n }\n }\n } else {\n return false;\n }\n\n return true;\n default:\n return false;\n }\n }\n\n function isSymbol(propType, propValue) {\n // Native Symbol.\n if (propType === 'symbol') {\n return true;\n }\n\n // falsy value can't be a Symbol\n if (!propValue) {\n return false;\n }\n\n // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol'\n if (propValue['@@toStringTag'] === 'Symbol') {\n return true;\n }\n\n // Fallback for non-spec compliant Symbols which are polyfilled.\n if (typeof Symbol === 'function' && propValue instanceof Symbol) {\n return true;\n }\n\n return false;\n }\n\n // Equivalent of `typeof` but with special handling for array and regexp.\n function getPropType(propValue) {\n var propType = typeof propValue;\n if (Array.isArray(propValue)) {\n return 'array';\n }\n if (propValue instanceof RegExp) {\n // Old webkits (at least until Android 4.0) return 'function' rather than\n // 'object' for typeof a RegExp. We'll normalize this here so that /bla/\n // passes PropTypes.object.\n return 'object';\n }\n if (isSymbol(propType, propValue)) {\n return 'symbol';\n }\n return propType;\n }\n\n // This handles more types than `getPropType`. Only used for error messages.\n // See `createPrimitiveTypeChecker`.\n function getPreciseType(propValue) {\n if (typeof propValue === 'undefined' || propValue === null) {\n return '' + propValue;\n }\n var propType = getPropType(propValue);\n if (propType === 'object') {\n if (propValue instanceof Date) {\n return 'date';\n } else if (propValue instanceof RegExp) {\n return 'regexp';\n }\n }\n return propType;\n }\n\n // Returns a string that is postfixed to a warning about an invalid type.\n // For example, \"undefined\" or \"of type array\"\n function getPostfixForTypeWarning(value) {\n var type = getPreciseType(value);\n switch (type) {\n case 'array':\n case 'object':\n return 'an ' + type;\n case 'boolean':\n case 'date':\n case 'regexp':\n return 'a ' + type;\n default:\n return type;\n }\n }\n\n // Returns class name of the object, if any.\n function getClassName(propValue) {\n if (!propValue.constructor || !propValue.constructor.name) {\n return ANONYMOUS;\n }\n return propValue.constructor.name;\n }\n\n ReactPropTypes.checkPropTypes = checkPropTypes;\n ReactPropTypes.resetWarningCache = checkPropTypes.resetWarningCache;\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar printWarning = function() {};\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n var loggedTypeFailures = {};\n var has = Function.call.bind(Object.prototype.hasOwnProperty);\n\n printWarning = function(text) {\n var message = 'Warning: ' + text;\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) {}\n };\n}\n\n/**\n * Assert that the values match with the type specs.\n * Error messages are memorized and will only be shown once.\n *\n * @param {object} typeSpecs Map of name to a ReactPropType\n * @param {object} values Runtime values that need to be type-checked\n * @param {string} location e.g. \"prop\", \"context\", \"child context\"\n * @param {string} componentName Name of the component for error messages.\n * @param {?Function} getStack Returns the component stack.\n * @private\n */\nfunction checkPropTypes(typeSpecs, values, location, componentName, getStack) {\n if (process.env.NODE_ENV !== 'production') {\n for (var typeSpecName in typeSpecs) {\n if (has(typeSpecs, typeSpecName)) {\n var error;\n // Prop type validation may throw. In case they do, we don't want to\n // fail the render phase where it didn't fail before. So we log it.\n // After these have been cleaned up, we'll let them throw.\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n if (typeof typeSpecs[typeSpecName] !== 'function') {\n var err = Error(\n (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' +\n 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.'\n );\n err.name = 'Invariant Violation';\n throw err;\n }\n error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret);\n } catch (ex) {\n error = ex;\n }\n if (error && !(error instanceof Error)) {\n printWarning(\n (componentName || 'React class') + ': type specification of ' +\n location + ' `' + typeSpecName + '` is invalid; the type checker ' +\n 'function must return `null` or an `Error` but returned a ' + typeof error + '. ' +\n 'You may have forgotten to pass an argument to the type checker ' +\n 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' +\n 'shape all require an argument).'\n );\n }\n if (error instanceof Error && !(error.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error.message] = true;\n\n var stack = getStack ? getStack() : '';\n\n printWarning(\n 'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '')\n );\n }\n }\n }\n }\n}\n\n/**\n * Resets warning cache when testing.\n *\n * @private\n */\ncheckPropTypes.resetWarningCache = function() {\n if (process.env.NODE_ENV !== 'production') {\n loggedTypeFailures = {};\n }\n}\n\nmodule.exports = checkPropTypes;\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n'use strict';\n\nmodule.exports = '15.6.2';","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n'use strict';\n\nvar _require = require('./ReactBaseClasses'),\n Component = _require.Component;\n\nvar _require2 = require('./ReactElement'),\n isValidElement = _require2.isValidElement;\n\nvar ReactNoopUpdateQueue = require('./ReactNoopUpdateQueue');\nvar factory = require('create-react-class/factory');\n\nmodule.exports = factory(Component, isValidElement, ReactNoopUpdateQueue);","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n'use strict';\n\nvar _assign = require('object-assign');\n\nvar emptyObject = require('fbjs/lib/emptyObject');\nvar _invariant = require('fbjs/lib/invariant');\n\nif (process.env.NODE_ENV !== 'production') {\n var warning = require('fbjs/lib/warning');\n}\n\nvar MIXINS_KEY = 'mixins';\n\n// Helper function to allow the creation of anonymous functions which do not\n// have .name set to the name of the variable being assigned to.\nfunction identity(fn) {\n return fn;\n}\n\nvar ReactPropTypeLocationNames;\nif (process.env.NODE_ENV !== 'production') {\n ReactPropTypeLocationNames = {\n prop: 'prop',\n context: 'context',\n childContext: 'child context'\n };\n} else {\n ReactPropTypeLocationNames = {};\n}\n\nfunction factory(ReactComponent, isValidElement, ReactNoopUpdateQueue) {\n /**\n * Policies that describe methods in `ReactClassInterface`.\n */\n\n var injectedMixins = [];\n\n /**\n * Composite components are higher-level components that compose other composite\n * or host components.\n *\n * To create a new type of `ReactClass`, pass a specification of\n * your new class to `React.createClass`. The only requirement of your class\n * specification is that you implement a `render` method.\n *\n * var MyComponent = React.createClass({\n * render: function() {\n * return
Hello World
;\n * }\n * });\n *\n * The class specification supports a specific protocol of methods that have\n * special meaning (e.g. `render`). See `ReactClassInterface` for\n * more the comprehensive protocol. Any other properties and methods in the\n * class specification will be available on the prototype.\n *\n * @interface ReactClassInterface\n * @internal\n */\n var ReactClassInterface = {\n /**\n * An array of Mixin objects to include when defining your component.\n *\n * @type {array}\n * @optional\n */\n mixins: 'DEFINE_MANY',\n\n /**\n * An object containing properties and methods that should be defined on\n * the component's constructor instead of its prototype (static methods).\n *\n * @type {object}\n * @optional\n */\n statics: 'DEFINE_MANY',\n\n /**\n * Definition of prop types for this component.\n *\n * @type {object}\n * @optional\n */\n propTypes: 'DEFINE_MANY',\n\n /**\n * Definition of context types for this component.\n *\n * @type {object}\n * @optional\n */\n contextTypes: 'DEFINE_MANY',\n\n /**\n * Definition of context types this component sets for its children.\n *\n * @type {object}\n * @optional\n */\n childContextTypes: 'DEFINE_MANY',\n\n // ==== Definition methods ====\n\n /**\n * Invoked when the component is mounted. Values in the mapping will be set on\n * `this.props` if that prop is not specified (i.e. using an `in` check).\n *\n * This method is invoked before `getInitialState` and therefore cannot rely\n * on `this.state` or use `this.setState`.\n *\n * @return {object}\n * @optional\n */\n getDefaultProps: 'DEFINE_MANY_MERGED',\n\n /**\n * Invoked once before the component is mounted. The return value will be used\n * as the initial value of `this.state`.\n *\n * getInitialState: function() {\n * return {\n * isOn: false,\n * fooBaz: new BazFoo()\n * }\n * }\n *\n * @return {object}\n * @optional\n */\n getInitialState: 'DEFINE_MANY_MERGED',\n\n /**\n * @return {object}\n * @optional\n */\n getChildContext: 'DEFINE_MANY_MERGED',\n\n /**\n * Uses props from `this.props` and state from `this.state` to render the\n * structure of the component.\n *\n * No guarantees are made about when or how often this method is invoked, so\n * it must not have side effects.\n *\n * render: function() {\n * var name = this.props.name;\n * return
Hello, {name}!
;\n * }\n *\n * @return {ReactComponent}\n * @required\n */\n render: 'DEFINE_ONCE',\n\n // ==== Delegate methods ====\n\n /**\n * Invoked when the component is initially created and about to be mounted.\n * This may have side effects, but any external subscriptions or data created\n * by this method must be cleaned up in `componentWillUnmount`.\n *\n * @optional\n */\n componentWillMount: 'DEFINE_MANY',\n\n /**\n * Invoked when the component has been mounted and has a DOM representation.\n * However, there is no guarantee that the DOM node is in the document.\n *\n * Use this as an opportunity to operate on the DOM when the component has\n * been mounted (initialized and rendered) for the first time.\n *\n * @param {DOMElement} rootNode DOM element representing the component.\n * @optional\n */\n componentDidMount: 'DEFINE_MANY',\n\n /**\n * Invoked before the component receives new props.\n *\n * Use this as an opportunity to react to a prop transition by updating the\n * state using `this.setState`. Current props are accessed via `this.props`.\n *\n * componentWillReceiveProps: function(nextProps, nextContext) {\n * this.setState({\n * likesIncreasing: nextProps.likeCount > this.props.likeCount\n * });\n * }\n *\n * NOTE: There is no equivalent `componentWillReceiveState`. An incoming prop\n * transition may cause a state change, but the opposite is not true. If you\n * need it, you are probably looking for `componentWillUpdate`.\n *\n * @param {object} nextProps\n * @optional\n */\n componentWillReceiveProps: 'DEFINE_MANY',\n\n /**\n * Invoked while deciding if the component should be updated as a result of\n * receiving new props, state and/or context.\n *\n * Use this as an opportunity to `return false` when you're certain that the\n * transition to the new props/state/context will not require a component\n * update.\n *\n * shouldComponentUpdate: function(nextProps, nextState, nextContext) {\n * return !equal(nextProps, this.props) ||\n * !equal(nextState, this.state) ||\n * !equal(nextContext, this.context);\n * }\n *\n * @param {object} nextProps\n * @param {?object} nextState\n * @param {?object} nextContext\n * @return {boolean} True if the component should update.\n * @optional\n */\n shouldComponentUpdate: 'DEFINE_ONCE',\n\n /**\n * Invoked when the component is about to update due to a transition from\n * `this.props`, `this.state` and `this.context` to `nextProps`, `nextState`\n * and `nextContext`.\n *\n * Use this as an opportunity to perform preparation before an update occurs.\n *\n * NOTE: You **cannot** use `this.setState()` in this method.\n *\n * @param {object} nextProps\n * @param {?object} nextState\n * @param {?object} nextContext\n * @param {ReactReconcileTransaction} transaction\n * @optional\n */\n componentWillUpdate: 'DEFINE_MANY',\n\n /**\n * Invoked when the component's DOM representation has been updated.\n *\n * Use this as an opportunity to operate on the DOM when the component has\n * been updated.\n *\n * @param {object} prevProps\n * @param {?object} prevState\n * @param {?object} prevContext\n * @param {DOMElement} rootNode DOM element representing the component.\n * @optional\n */\n componentDidUpdate: 'DEFINE_MANY',\n\n /**\n * Invoked when the component is about to be removed from its parent and have\n * its DOM representation destroyed.\n *\n * Use this as an opportunity to deallocate any external resources.\n *\n * NOTE: There is no `componentDidUnmount` since your component will have been\n * destroyed by that point.\n *\n * @optional\n */\n componentWillUnmount: 'DEFINE_MANY',\n\n /**\n * Replacement for (deprecated) `componentWillMount`.\n *\n * @optional\n */\n UNSAFE_componentWillMount: 'DEFINE_MANY',\n\n /**\n * Replacement for (deprecated) `componentWillReceiveProps`.\n *\n * @optional\n */\n UNSAFE_componentWillReceiveProps: 'DEFINE_MANY',\n\n /**\n * Replacement for (deprecated) `componentWillUpdate`.\n *\n * @optional\n */\n UNSAFE_componentWillUpdate: 'DEFINE_MANY',\n\n // ==== Advanced methods ====\n\n /**\n * Updates the component's currently mounted DOM representation.\n *\n * By default, this implements React's rendering and reconciliation algorithm.\n * Sophisticated clients may wish to override this.\n *\n * @param {ReactReconcileTransaction} transaction\n * @internal\n * @overridable\n */\n updateComponent: 'OVERRIDE_BASE'\n };\n\n /**\n * Similar to ReactClassInterface but for static methods.\n */\n var ReactClassStaticInterface = {\n /**\n * This method is invoked after a component is instantiated and when it\n * receives new props. Return an object to update state in response to\n * prop changes. Return null to indicate no change to state.\n *\n * If an object is returned, its keys will be merged into the existing state.\n *\n * @return {object || null}\n * @optional\n */\n getDerivedStateFromProps: 'DEFINE_MANY_MERGED'\n };\n\n /**\n * Mapping from class specification keys to special processing functions.\n *\n * Although these are declared like instance properties in the specification\n * when defining classes using `React.createClass`, they are actually static\n * and are accessible on the constructor instead of the prototype. Despite\n * being static, they must be defined outside of the \"statics\" key under\n * which all other static methods are defined.\n */\n var RESERVED_SPEC_KEYS = {\n displayName: function(Constructor, displayName) {\n Constructor.displayName = displayName;\n },\n mixins: function(Constructor, mixins) {\n if (mixins) {\n for (var i = 0; i < mixins.length; i++) {\n mixSpecIntoComponent(Constructor, mixins[i]);\n }\n }\n },\n childContextTypes: function(Constructor, childContextTypes) {\n if (process.env.NODE_ENV !== 'production') {\n validateTypeDef(Constructor, childContextTypes, 'childContext');\n }\n Constructor.childContextTypes = _assign(\n {},\n Constructor.childContextTypes,\n childContextTypes\n );\n },\n contextTypes: function(Constructor, contextTypes) {\n if (process.env.NODE_ENV !== 'production') {\n validateTypeDef(Constructor, contextTypes, 'context');\n }\n Constructor.contextTypes = _assign(\n {},\n Constructor.contextTypes,\n contextTypes\n );\n },\n /**\n * Special case getDefaultProps which should move into statics but requires\n * automatic merging.\n */\n getDefaultProps: function(Constructor, getDefaultProps) {\n if (Constructor.getDefaultProps) {\n Constructor.getDefaultProps = createMergedResultFunction(\n Constructor.getDefaultProps,\n getDefaultProps\n );\n } else {\n Constructor.getDefaultProps = getDefaultProps;\n }\n },\n propTypes: function(Constructor, propTypes) {\n if (process.env.NODE_ENV !== 'production') {\n validateTypeDef(Constructor, propTypes, 'prop');\n }\n Constructor.propTypes = _assign({}, Constructor.propTypes, propTypes);\n },\n statics: function(Constructor, statics) {\n mixStaticSpecIntoComponent(Constructor, statics);\n },\n autobind: function() {}\n };\n\n function validateTypeDef(Constructor, typeDef, location) {\n for (var propName in typeDef) {\n if (typeDef.hasOwnProperty(propName)) {\n // use a warning instead of an _invariant so components\n // don't show up in prod but only in __DEV__\n if (process.env.NODE_ENV !== 'production') {\n warning(\n typeof typeDef[propName] === 'function',\n '%s: %s type `%s` is invalid; it must be a function, usually from ' +\n 'React.PropTypes.',\n Constructor.displayName || 'ReactClass',\n ReactPropTypeLocationNames[location],\n propName\n );\n }\n }\n }\n }\n\n function validateMethodOverride(isAlreadyDefined, name) {\n var specPolicy = ReactClassInterface.hasOwnProperty(name)\n ? ReactClassInterface[name]\n : null;\n\n // Disallow overriding of base class methods unless explicitly allowed.\n if (ReactClassMixin.hasOwnProperty(name)) {\n _invariant(\n specPolicy === 'OVERRIDE_BASE',\n 'ReactClassInterface: You are attempting to override ' +\n '`%s` from your class specification. Ensure that your method names ' +\n 'do not overlap with React methods.',\n name\n );\n }\n\n // Disallow defining methods more than once unless explicitly allowed.\n if (isAlreadyDefined) {\n _invariant(\n specPolicy === 'DEFINE_MANY' || specPolicy === 'DEFINE_MANY_MERGED',\n 'ReactClassInterface: You are attempting to define ' +\n '`%s` on your component more than once. This conflict may be due ' +\n 'to a mixin.',\n name\n );\n }\n }\n\n /**\n * Mixin helper which handles policy validation and reserved\n * specification keys when building React classes.\n */\n function mixSpecIntoComponent(Constructor, spec) {\n if (!spec) {\n if (process.env.NODE_ENV !== 'production') {\n var typeofSpec = typeof spec;\n var isMixinValid = typeofSpec === 'object' && spec !== null;\n\n if (process.env.NODE_ENV !== 'production') {\n warning(\n isMixinValid,\n \"%s: You're attempting to include a mixin that is either null \" +\n 'or not an object. Check the mixins included by the component, ' +\n 'as well as any mixins they include themselves. ' +\n 'Expected object but got %s.',\n Constructor.displayName || 'ReactClass',\n spec === null ? null : typeofSpec\n );\n }\n }\n\n return;\n }\n\n _invariant(\n typeof spec !== 'function',\n \"ReactClass: You're attempting to \" +\n 'use a component class or function as a mixin. Instead, just use a ' +\n 'regular object.'\n );\n _invariant(\n !isValidElement(spec),\n \"ReactClass: You're attempting to \" +\n 'use a component as a mixin. Instead, just use a regular object.'\n );\n\n var proto = Constructor.prototype;\n var autoBindPairs = proto.__reactAutoBindPairs;\n\n // By handling mixins before any other properties, we ensure the same\n // chaining order is applied to methods with DEFINE_MANY policy, whether\n // mixins are listed before or after these methods in the spec.\n if (spec.hasOwnProperty(MIXINS_KEY)) {\n RESERVED_SPEC_KEYS.mixins(Constructor, spec.mixins);\n }\n\n for (var name in spec) {\n if (!spec.hasOwnProperty(name)) {\n continue;\n }\n\n if (name === MIXINS_KEY) {\n // We have already handled mixins in a special case above.\n continue;\n }\n\n var property = spec[name];\n var isAlreadyDefined = proto.hasOwnProperty(name);\n validateMethodOverride(isAlreadyDefined, name);\n\n if (RESERVED_SPEC_KEYS.hasOwnProperty(name)) {\n RESERVED_SPEC_KEYS[name](Constructor, property);\n } else {\n // Setup methods on prototype:\n // The following member methods should not be automatically bound:\n // 1. Expected ReactClass methods (in the \"interface\").\n // 2. Overridden methods (that were mixed in).\n var isReactClassMethod = ReactClassInterface.hasOwnProperty(name);\n var isFunction = typeof property === 'function';\n var shouldAutoBind =\n isFunction &&\n !isReactClassMethod &&\n !isAlreadyDefined &&\n spec.autobind !== false;\n\n if (shouldAutoBind) {\n autoBindPairs.push(name, property);\n proto[name] = property;\n } else {\n if (isAlreadyDefined) {\n var specPolicy = ReactClassInterface[name];\n\n // These cases should already be caught by validateMethodOverride.\n _invariant(\n isReactClassMethod &&\n (specPolicy === 'DEFINE_MANY_MERGED' ||\n specPolicy === 'DEFINE_MANY'),\n 'ReactClass: Unexpected spec policy %s for key %s ' +\n 'when mixing in component specs.',\n specPolicy,\n name\n );\n\n // For methods which are defined more than once, call the existing\n // methods before calling the new property, merging if appropriate.\n if (specPolicy === 'DEFINE_MANY_MERGED') {\n proto[name] = createMergedResultFunction(proto[name], property);\n } else if (specPolicy === 'DEFINE_MANY') {\n proto[name] = createChainedFunction(proto[name], property);\n }\n } else {\n proto[name] = property;\n if (process.env.NODE_ENV !== 'production') {\n // Add verbose displayName to the function, which helps when looking\n // at profiling tools.\n if (typeof property === 'function' && spec.displayName) {\n proto[name].displayName = spec.displayName + '_' + name;\n }\n }\n }\n }\n }\n }\n }\n\n function mixStaticSpecIntoComponent(Constructor, statics) {\n if (!statics) {\n return;\n }\n\n for (var name in statics) {\n var property = statics[name];\n if (!statics.hasOwnProperty(name)) {\n continue;\n }\n\n var isReserved = name in RESERVED_SPEC_KEYS;\n _invariant(\n !isReserved,\n 'ReactClass: You are attempting to define a reserved ' +\n 'property, `%s`, that shouldn\\'t be on the \"statics\" key. Define it ' +\n 'as an instance property instead; it will still be accessible on the ' +\n 'constructor.',\n name\n );\n\n var isAlreadyDefined = name in Constructor;\n if (isAlreadyDefined) {\n var specPolicy = ReactClassStaticInterface.hasOwnProperty(name)\n ? ReactClassStaticInterface[name]\n : null;\n\n _invariant(\n specPolicy === 'DEFINE_MANY_MERGED',\n 'ReactClass: You are attempting to define ' +\n '`%s` on your component more than once. This conflict may be ' +\n 'due to a mixin.',\n name\n );\n\n Constructor[name] = createMergedResultFunction(Constructor[name], property);\n\n return;\n }\n\n Constructor[name] = property;\n }\n }\n\n /**\n * Merge two objects, but throw if both contain the same key.\n *\n * @param {object} one The first object, which is mutated.\n * @param {object} two The second object\n * @return {object} one after it has been mutated to contain everything in two.\n */\n function mergeIntoWithNoDuplicateKeys(one, two) {\n _invariant(\n one && two && typeof one === 'object' && typeof two === 'object',\n 'mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects.'\n );\n\n for (var key in two) {\n if (two.hasOwnProperty(key)) {\n _invariant(\n one[key] === undefined,\n 'mergeIntoWithNoDuplicateKeys(): ' +\n 'Tried to merge two objects with the same key: `%s`. This conflict ' +\n 'may be due to a mixin; in particular, this may be caused by two ' +\n 'getInitialState() or getDefaultProps() methods returning objects ' +\n 'with clashing keys.',\n key\n );\n one[key] = two[key];\n }\n }\n return one;\n }\n\n /**\n * Creates a function that invokes two functions and merges their return values.\n *\n * @param {function} one Function to invoke first.\n * @param {function} two Function to invoke second.\n * @return {function} Function that invokes the two argument functions.\n * @private\n */\n function createMergedResultFunction(one, two) {\n return function mergedResult() {\n var a = one.apply(this, arguments);\n var b = two.apply(this, arguments);\n if (a == null) {\n return b;\n } else if (b == null) {\n return a;\n }\n var c = {};\n mergeIntoWithNoDuplicateKeys(c, a);\n mergeIntoWithNoDuplicateKeys(c, b);\n return c;\n };\n }\n\n /**\n * Creates a function that invokes two functions and ignores their return vales.\n *\n * @param {function} one Function to invoke first.\n * @param {function} two Function to invoke second.\n * @return {function} Function that invokes the two argument functions.\n * @private\n */\n function createChainedFunction(one, two) {\n return function chainedFunction() {\n one.apply(this, arguments);\n two.apply(this, arguments);\n };\n }\n\n /**\n * Binds a method to the component.\n *\n * @param {object} component Component whose method is going to be bound.\n * @param {function} method Method to be bound.\n * @return {function} The bound method.\n */\n function bindAutoBindMethod(component, method) {\n var boundMethod = method.bind(component);\n if (process.env.NODE_ENV !== 'production') {\n boundMethod.__reactBoundContext = component;\n boundMethod.__reactBoundMethod = method;\n boundMethod.__reactBoundArguments = null;\n var componentName = component.constructor.displayName;\n var _bind = boundMethod.bind;\n boundMethod.bind = function(newThis) {\n for (\n var _len = arguments.length,\n args = Array(_len > 1 ? _len - 1 : 0),\n _key = 1;\n _key < _len;\n _key++\n ) {\n args[_key - 1] = arguments[_key];\n }\n\n // User is trying to bind() an autobound method; we effectively will\n // ignore the value of \"this\" that the user is trying to use, so\n // let's warn.\n if (newThis !== component && newThis !== null) {\n if (process.env.NODE_ENV !== 'production') {\n warning(\n false,\n 'bind(): React component methods may only be bound to the ' +\n 'component instance. See %s',\n componentName\n );\n }\n } else if (!args.length) {\n if (process.env.NODE_ENV !== 'production') {\n warning(\n false,\n 'bind(): You are binding a component method to the component. ' +\n 'React does this for you automatically in a high-performance ' +\n 'way, so you can safely remove this call. See %s',\n componentName\n );\n }\n return boundMethod;\n }\n var reboundMethod = _bind.apply(boundMethod, arguments);\n reboundMethod.__reactBoundContext = component;\n reboundMethod.__reactBoundMethod = method;\n reboundMethod.__reactBoundArguments = args;\n return reboundMethod;\n };\n }\n return boundMethod;\n }\n\n /**\n * Binds all auto-bound methods in a component.\n *\n * @param {object} component Component whose method is going to be bound.\n */\n function bindAutoBindMethods(component) {\n var pairs = component.__reactAutoBindPairs;\n for (var i = 0; i < pairs.length; i += 2) {\n var autoBindKey = pairs[i];\n var method = pairs[i + 1];\n component[autoBindKey] = bindAutoBindMethod(component, method);\n }\n }\n\n var IsMountedPreMixin = {\n componentDidMount: function() {\n this.__isMounted = true;\n }\n };\n\n var IsMountedPostMixin = {\n componentWillUnmount: function() {\n this.__isMounted = false;\n }\n };\n\n /**\n * Add more to the ReactClass base class. These are all legacy features and\n * therefore not already part of the modern ReactComponent.\n */\n var ReactClassMixin = {\n /**\n * TODO: This will be deprecated because state should always keep a consistent\n * type signature and the only use case for this, is to avoid that.\n */\n replaceState: function(newState, callback) {\n this.updater.enqueueReplaceState(this, newState, callback);\n },\n\n /**\n * Checks whether or not this composite component is mounted.\n * @return {boolean} True if mounted, false otherwise.\n * @protected\n * @final\n */\n isMounted: function() {\n if (process.env.NODE_ENV !== 'production') {\n warning(\n this.__didWarnIsMounted,\n '%s: isMounted is deprecated. Instead, make sure to clean up ' +\n 'subscriptions and pending requests in componentWillUnmount to ' +\n 'prevent memory leaks.',\n (this.constructor && this.constructor.displayName) ||\n this.name ||\n 'Component'\n );\n this.__didWarnIsMounted = true;\n }\n return !!this.__isMounted;\n }\n };\n\n var ReactClassComponent = function() {};\n _assign(\n ReactClassComponent.prototype,\n ReactComponent.prototype,\n ReactClassMixin\n );\n\n /**\n * Creates a composite component class given a class specification.\n * See https://facebook.github.io/react/docs/top-level-api.html#react.createclass\n *\n * @param {object} spec Class specification (which must define `render`).\n * @return {function} Component constructor function.\n * @public\n */\n function createClass(spec) {\n // To keep our warnings more understandable, we'll use a little hack here to\n // ensure that Constructor.name !== 'Constructor'. This makes sure we don't\n // unnecessarily identify a class without displayName as 'Constructor'.\n var Constructor = identity(function(props, context, updater) {\n // This constructor gets overridden by mocks. The argument is used\n // by mocks to assert on what gets mounted.\n\n if (process.env.NODE_ENV !== 'production') {\n warning(\n this instanceof Constructor,\n 'Something is calling a React component directly. Use a factory or ' +\n 'JSX instead. See: https://fb.me/react-legacyfactory'\n );\n }\n\n // Wire up auto-binding\n if (this.__reactAutoBindPairs.length) {\n bindAutoBindMethods(this);\n }\n\n this.props = props;\n this.context = context;\n this.refs = emptyObject;\n this.updater = updater || ReactNoopUpdateQueue;\n\n this.state = null;\n\n // ReactClasses doesn't have constructors. Instead, they use the\n // getInitialState and componentWillMount methods for initialization.\n\n var initialState = this.getInitialState ? this.getInitialState() : null;\n if (process.env.NODE_ENV !== 'production') {\n // We allow auto-mocks to proceed as if they're returning null.\n if (\n initialState === undefined &&\n this.getInitialState._isMockFunction\n ) {\n // This is probably bad practice. Consider warning here and\n // deprecating this convenience.\n initialState = null;\n }\n }\n _invariant(\n typeof initialState === 'object' && !Array.isArray(initialState),\n '%s.getInitialState(): must return an object or null',\n Constructor.displayName || 'ReactCompositeComponent'\n );\n\n this.state = initialState;\n });\n Constructor.prototype = new ReactClassComponent();\n Constructor.prototype.constructor = Constructor;\n Constructor.prototype.__reactAutoBindPairs = [];\n\n injectedMixins.forEach(mixSpecIntoComponent.bind(null, Constructor));\n\n mixSpecIntoComponent(Constructor, IsMountedPreMixin);\n mixSpecIntoComponent(Constructor, spec);\n mixSpecIntoComponent(Constructor, IsMountedPostMixin);\n\n // Initialize the defaultProps property after all mixins have been merged.\n if (Constructor.getDefaultProps) {\n Constructor.defaultProps = Constructor.getDefaultProps();\n }\n\n if (process.env.NODE_ENV !== 'production') {\n // This is a tag to indicate that the use of these method names is ok,\n // since it's used with createClass. If it's not, then it's likely a\n // mistake so we'll warn you to use the static property, property\n // initializer or constructor respectively.\n if (Constructor.getDefaultProps) {\n Constructor.getDefaultProps.isReactClassApproved = {};\n }\n if (Constructor.prototype.getInitialState) {\n Constructor.prototype.getInitialState.isReactClassApproved = {};\n }\n }\n\n _invariant(\n Constructor.prototype.render,\n 'createClass(...): Class specification must implement a `render` method.'\n );\n\n if (process.env.NODE_ENV !== 'production') {\n warning(\n !Constructor.prototype.componentShouldUpdate,\n '%s has a method called ' +\n 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' +\n 'The name is phrased as a question because the function is ' +\n 'expected to return a value.',\n spec.displayName || 'A component'\n );\n warning(\n !Constructor.prototype.componentWillRecieveProps,\n '%s has a method called ' +\n 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?',\n spec.displayName || 'A component'\n );\n warning(\n !Constructor.prototype.UNSAFE_componentWillRecieveProps,\n '%s has a method called UNSAFE_componentWillRecieveProps(). ' +\n 'Did you mean UNSAFE_componentWillReceiveProps()?',\n spec.displayName || 'A component'\n );\n }\n\n // Reduce time spent doing lookups by setting these on the prototype.\n for (var methodName in ReactClassInterface) {\n if (!Constructor.prototype[methodName]) {\n Constructor.prototype[methodName] = null;\n }\n }\n\n return Constructor;\n }\n\n return createClass;\n}\n\nmodule.exports = factory;\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n'use strict';\n\nvar _prodInvariant = require('./reactProdInvariant');\n\nvar ReactElement = require('./ReactElement');\n\nvar invariant = require('fbjs/lib/invariant');\n\n/**\n * Returns the first child in a collection of children and verifies that there\n * is only one child in the collection.\n *\n * See https://facebook.github.io/react/docs/top-level-api.html#react.children.only\n *\n * The current implementation of this function assumes that a single child gets\n * passed without a wrapper, but the purpose of this helper function is to\n * abstract away the particular structure of children.\n *\n * @param {?object} children Child collection structure.\n * @return {ReactElement} The first and only `ReactElement` contained in the\n * structure.\n */\nfunction onlyChild(children) {\n !ReactElement.isValidElement(children) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'React.Children.only expected to receive a single React element child.') : _prodInvariant('143') : void 0;\n return children;\n}\n\nmodule.exports = onlyChild;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.CommentEmbed = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar RADIX_BASE = 36;\n\nvar CommentEmbed = exports.CommentEmbed = function (_React$Component) {\n _inherits(CommentEmbed, _React$Component);\n\n function CommentEmbed() {\n _classCallCheck(this, CommentEmbed);\n\n return _possibleConstructorReturn(this, (CommentEmbed.__proto__ || Object.getPrototypeOf(CommentEmbed)).apply(this, arguments));\n }\n\n _createClass(CommentEmbed, [{\n key: 'getSrc',\n value: function getSrc() {\n var post = Number(this.props.commentId).toString(RADIX_BASE);\n var parentParam = this.props.showParentComment ? '1' : '0';\n var mediaParam = this.props.showMedia ? '1' : '0';\n\n return 'https://embed.disqus.com/p/' + post + '?p=' + parentParam + '&m=' + mediaParam;\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement('iframe', {\n src: this.getSrc(),\n width: this.props.width,\n height: this.props.height,\n seamless: 'seamless',\n scrolling: 'no',\n frameBorder: '0'\n });\n }\n }]);\n\n return CommentEmbed;\n}(_react2.default.Component);\n\nCommentEmbed.defaultProps = {\n showMedia: true,\n showParentComment: true,\n width: 420,\n height: 320\n};","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.DiscussionEmbed = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _utils = require('./utils');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar DiscussionEmbed = exports.DiscussionEmbed = function (_React$Component) {\n _inherits(DiscussionEmbed, _React$Component);\n\n function DiscussionEmbed() {\n _classCallCheck(this, DiscussionEmbed);\n\n return _possibleConstructorReturn(this, (DiscussionEmbed.__proto__ || Object.getPrototypeOf(DiscussionEmbed)).apply(this, arguments));\n }\n\n _createClass(DiscussionEmbed, [{\n key: 'componentWillMount',\n value: function componentWillMount() {\n if (typeof window !== 'undefined' && window.disqus_shortname && window.disqus_shortname !== this.props.shortname) this.cleanInstance();\n }\n }, {\n key: 'componentDidMount',\n value: function componentDidMount() {\n this.loadInstance();\n }\n }, {\n key: 'shouldComponentUpdate',\n value: function shouldComponentUpdate(nextProps) {\n if (this.props.shortname !== nextProps.shortname) return true;\n\n var nextConfig = nextProps.config;\n var config = this.props.config;\n if (nextConfig.url === config.url || nextConfig.identifier === config.identifier) return false;\n return true;\n }\n }, {\n key: 'componentWillUpdate',\n value: function componentWillUpdate(nextProps) {\n if (this.props.shortname !== nextProps.shortname) this.cleanInstance();\n }\n }, {\n key: 'componentDidUpdate',\n value: function componentDidUpdate() {\n this.loadInstance();\n }\n }, {\n key: 'loadInstance',\n value: function loadInstance() {\n var doc = window.document;\n if (window && window.DISQUS && doc.getElementById('dsq-embed-scr')) {\n window.DISQUS.reset({\n reload: true,\n config: this.getDisqusConfig(this.props.config)\n });\n } else {\n window.disqus_config = this.getDisqusConfig(this.props.config);\n window.disqus_shortname = this.props.shortname;\n (0, _utils.insertScript)('https://' + this.props.shortname + '.disqus.com/embed.js', 'dsq-embed-scr', doc.body);\n }\n }\n }, {\n key: 'cleanInstance',\n value: function cleanInstance() {\n var doc = window.document;\n (0, _utils.removeScript)('dsq-embed-scr', doc.body);\n if (window && window.DISQUS) window.DISQUS.reset({});\n\n try {\n delete window.DISQUS;\n } catch (error) {\n window.DISQUS = undefined;\n }\n var disqusThread = doc.getElementById('disqus_thread');\n if (disqusThread) {\n while (disqusThread.hasChildNodes()) {\n disqusThread.removeChild(disqusThread.firstChild);\n }\n }\n }\n }, {\n key: 'getDisqusConfig',\n value: function getDisqusConfig(config) {\n return function () {\n this.page.identifier = config.identifier;\n this.page.url = config.url;\n this.page.title = config.title;\n this.callbacks.onNewComment = [config.onNewComment];\n };\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement('div', { id: 'disqus_thread' });\n }\n }]);\n\n return DiscussionEmbed;\n}(_react2.default.Component);"],"sourceRoot":""} \ No newline at end of file diff --git a/404.html b/404.html new file mode 100644 index 00000000..58e75e06 --- /dev/null +++ b/404.html @@ -0,0 +1,78 @@ +Page Not Found | 040code

404 Page Not Found

👻

Looks like you've followed a broken link or entered a URL that doesn't exist on this site.

Recent Posts

\ No newline at end of file diff --git a/404/index.html b/404/index.html new file mode 100644 index 00000000..5a647b7f --- /dev/null +++ b/404/index.html @@ -0,0 +1,78 @@ +Page Not Found | 040code

404 Page Not Found

👻

Looks like you've followed a broken link or entered a URL that doesn't exist on this site.

Recent Posts

\ No newline at end of file diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index cabb7759..00000000 --- a/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -FROM node:10 AS build -MAINTAINER Niek Palm - -WORKDIR /app -ADD . /app -RUN rm -rf node_modules -RUN npm install -g yarn@1.15.2 -RUN yarn && yarn build - - -FROM nginx:1.15.3 -RUN rm -rf /usr/share/nginx/html -COPY --from=build /app/public /usr/share/nginx/html - -COPY nginx/default.conf /etc/nginx/conf.d/mysite.template -COPY nginx/start.sh /usr/bin - -CMD ["start.sh"] \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 99122968..00000000 --- a/README.md +++ /dev/null @@ -1,112 +0,0 @@ -# 040 code blog - -## Purpose - -This repo contains the source of the [040 code blog](https://040code.github.io). - -## The blog - -The 040 code blog is an initiative from Developers that have a relation with the city [Eindhoven](https://www.thisiseindhoven.com/en), in the [Netherlands](https://www.youtube.com/watch?v=eE_IUPInEuc). The name `040` points to area code used at the time we used the old landline for calling our friends and family. - -Articles on this blog are our ideas, experiments and opinion. For each blog post we make a nice picture from a place in Eindhoven that we like for some reason. - -## Credits - -This blog is created with the [Gatsby](https://www.gatsbyjs.org/), an awesome framework to create a static blog using [React](https://reactjs.org/) and [GraphQL](https://graphql.org/). And to get even faster started we have based the blog on the React Starter [gatsby-starter-morning-dew](https://github.com/maxpou/gatsby-starter-morning-dew) - -## How to contribute - -Fork the repo, do your changes and create a pull request. Everybody is welcome to write an article. -The main branch to work from is: `source` - -The `master` contains the static page created by travis-ci and gatsby. - -## How to run - -``` -yarn -yarn dev -``` - -Visit: [http://localhost:8000](http://localhost:8000) -Gatsby also delivers a graphiql interface in development mode: [http://localhost:8000/___graphql](http://localhost:8000/___graphql) - -## Writing a post - -### Directory -Create a directory with the following format: `YYYY-MM-DD-` in the `/content/posts/` directory. Simply copy an existing posts directory f.e. [this post](https://github.com/040code/gatsby/tree/master/content/posts/2017-04-20-discovery-agent). - -### Post -Change the `index.md` file. This is basically where you write your post. - -### Images -Images needed for the post can be stored in the same directory and referred to in the post with: - -``` - - alttext - -``` - -### Frontmatter - -A frontmatter is needed for Gatsby to know how to display the post. - -Example of a frontmatter: - -``` ---- -title: "Git Bisect" -slug: "2019/03/13/git-bisect" -subtitle: "Find the bug-introducing commit with Git Bisect" -date: 2019-03-13 -cover: "./background.png" -coverLink: "https://goo.gl/maps/jSKonnGYR1u" -coverDescription: "Frits Philipslaan" -imageFb: "./2019-03-13-git-bisect-fb.png" -imageTw: "./2019-03-13-git-bisect-tw.png" -asciinema: true -type: post -tags: - - 'git' - - 'rust' -authors: - - jeroen ---- -``` - -Most fields are self-explaining. We formatted the `slug` with backslashes so the urls are nice. -`cover` is the header image. -`coverLink` and `coverDescription` are optional. When given, a link to google maps is shown in the right bottom corner. -`imageFb` and `imageTw` are thumbnails for socialmedia. They can be automatically created by running: `yarn generatePostPreviewImages`. -`asciinema` can be set to true to use the awesome asciinema player. -`type` must be set to `post`. -`authors` must be set to an existing author in the `content/authors` directory. If you're new, feel free to add yourself as an author. - -#### More info on asciinema player -To add terminal recordings we use [asciinema](https://asciinema.org/docs/usage). - -Once you have captured the `json` of you recording add the file to a folder in `static/`. This folder will be served as static content. - -In the post you have to enable `asciinema` by setting the frontmatter property. In the post you can now embed the asciinema player. The `src` attribute is not post processed. It should match with the folder that you have created as static content. - -``` ---- -slug: "" -... -asciinema: true ---- - -... - - - - -``` - -## License -MIT - -## Authors -[Contributors](https://github.com/040code/040code.github.io/graphs/contributors) diff --git a/about/index.html b/about/index.html new file mode 100644 index 00000000..3dc1361b --- /dev/null +++ b/about/index.html @@ -0,0 +1,83 @@ +About the blog | 040code

About the blog

The blog

+

The 040 code blog is an initiative from Developers that have a relation with the city Eindhoven, in the Netherlands. The name 040 points to area code used at the time we used the old landline for calling our friends and family.

+

Articles on this blog are our ideas, experiments and opinion. For each blog post we make a nice picture from a place in Eindhoven that we like for some reason.

+


+

Credits

+

This blog is created with the Gatsby, an awesome framework to create a static blog using React and GraphQL. And to get even faster started we have based the blog on the React Starter gatsby-starter-morning-dew

\ No newline at end of file diff --git a/app-7e8827f4466601400032.js b/app-7e8827f4466601400032.js new file mode 100644 index 00000000..fb9156fa --- /dev/null +++ b/app-7e8827f4466601400032.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[4],[function(e,t,n){"use strict";e.exports=n(125)},function(e,t,n){n(46),n(48);var r=n(104),o=n(2).publicLoader,i=o.getResourcesForPathname,a=o.getResourcesForPathnameSync,l=o.getResourceURLsForPathname;t.apiRunner=function(e,t,n,o){void 0===t&&(t={});var u=r.map(function(n){if(n.plugin[e]){t.getResourcesForPathnameSync=a,t.getResourcesForPathname=i,t.getResourceURLsForPathname=l;var r=n.plugin[e](t,n.options);return r&&o&&(t=o({args:t,result:r,plugin:n})),r}});return(u=u.filter(function(e){return void 0!==e})).length>0?u:n?[n]:[]},t.apiRunnerAsync=function(e,t,n){return r.reduce(function(n,r){return r.plugin[e]?n.then(function(){return r.plugin[e](t,r.options)}):n},Promise.resolve())}},function(e,t,n){"use strict";n.r(t);n(110),n(111),n(50),n(112),n(117),n(66),n(123),n(46),n(48),n(124);var r=n(24),o={},i=n(10),a=function(e){if("undefined"==typeof document)return!1;var t=document.createElement("link");try{if(t.relList&&"function"==typeof t.relList.supports)return t.relList.supports(e)}catch(n){return!1}return!1}("prefetch")?function(e){return new Promise(function(t,n){if("undefined"!=typeof document){var r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=t,r.onerror=n,(document.getElementsByTagName("head")[0]||document.getElementsByName("script")[0].parentNode).appendChild(r)}else n()})}:function(e){return new Promise(function(t,n){var r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=function(){200===r.status?t():n()},r.send(null)})},l={},u=function(e){return new Promise(function(t){l[e]?t():a(e).then(function(){t(),l[e]=!0}).catch(function(){})})};n.d(t,"postInitialRenderWork",function(){return U}),n.d(t,"setApiRunnerForLoader",function(){return I}),n.d(t,"publicLoader",function(){return F});var c,s=function(e){return e&&e.default||e},f=!0,d=Object.create(null),p={},h={},v=[],m=null,g=!1,y=!1,b={},w={};var _,x=function(){return m||(m=new Promise(function(e){p.data().then(function(t){var n=t.pages,r=t.dataPaths;window.___dataPaths=r,M.addPagesArray(n),M.addDataPaths(r),y=!0,e(g=!0)}).catch(function(t){console.warn("Failed to fetch pages manifest. Gatsby will reload on next navigation."),e(g=!0)})})),m},k=function(e){return"/static/d/"+e+".json"},S=function(e){return window.___chunkMapping[e].map(function(e){return""+e})},T=function(e){if("component---"===e.slice(0,12))return Promise.all(S(e).map(function(e){return u(e)}));var t=k(h[e]);return u(t)},E=function(e){return function(e){var t;return t="component---"===e.slice(0,12)?p.components[e]:e in w?function(){return w[e]}:function(){var t=new Promise(function(t,n){var r=k(h[e]),o=new XMLHttpRequest;o.open("GET",r,!0),o.withCredentials=!0,o.onreadystatechange=function(){4==o.readyState&&(200===o.status?t(JSON.parse(o.responseText)):(delete w[e],n()))},o.send(null)});return w[e]=t,t},d[e]=!0,new Promise(function(n){var r=t(),o=!1;return r.catch(function(){o=!0}).then(function(t){v.push({resource:e,succeeded:!o}),v=v.slice(-5),n(t)})})}(e).then(s)},P=function(e,t){var n;b[e]||(b[e]=t),("boolean"==typeof(n=navigator.onLine)?n:v.find(function(e){return e.succeeded}))&&window.location.pathname.replace(/\/$/g,"")!==e.replace(/\/$/g,"")&&(window.location.pathname=e)},C=function(e){j[e]||(c("onPostPrefetchPathname",{pathname:e}),j[e]=!0)},R=function(e){return(y||f)&&"/404.html"!==e},O={},N={},j={},L=!1,M={addPagesArray:function(e){var t,n;t=e,void 0===(n="")&&(n=""),_=function(e){var i,a,l,u=decodeURIComponent(e),c=(void 0===(a=n)&&(a=""),(i=u).substr(0,a.length)===a?i.slice(a.length):i);return c.split("#").length>1&&(c=c.split("#").slice(0,-1).join("")),c.split("?").length>1&&(c=c.split("?").slice(0,-1).join("")),o[c]?o[c]:(t.some(function(e){var t=e.matchPath?e.matchPath:e.path;return Object(r.match)(t,c)?(l=e,o[c]=e,!0):!!Object(r.match)(e.path+"index.html",c)&&(l=e,o[c]=e,!0)}),l)}},addDevRequires:function(e){e},addProdRequires:function(e){p=e},addDataPaths:function(e){h=e},hovering:function(e){M.getResourcesForPathname(e)},enqueue:function(e){if(c||console.error("Run setApiRunnerForLoader() before enqueing paths"),"connection"in navigator){if((navigator.connection.effectiveType||"").includes("2g"))return!1;if(navigator.connection.saveData)return!1}var t;if(N[t=e]||(c("onPrefetchPathname",{pathname:t}),N[t]=!0),L.some(function(e){return e}))return!1;var n=_(e);return n||g?!!n&&(Promise.all([T(n.jsonName),T(n.componentChunkName)]).then(function(){C(e)}),!0):x().then(function(){return M.enqueue(e)})},getPage:function(e){return _(e)},getResourceURLsForPathname:function(e){var t=_(e);return t?[].concat(S(t.componentChunkName),[k(h[t.jsonName])]):null},getResourcesForPathnameSync:function(e){var t=_(e);return t?O[t.path]:R(e)?M.getResourcesForPathnameSync("/404.html"):null},getResourcesForPathname:function(e){return new Promise(function(t,n){if(b[e])return P(e,'Previously detected load failure for "'+e+'"'),void n();var r=_(e);if(r||g){if(!r)return R(e)?(console.log("A page wasn't found for \""+e+'"'),void t(M.getResourcesForPathname("/404.html"))):void t();if(e=r.path,O[e])return i.a.emit("onPostLoadPageResources",{page:r,pageResources:O[e]}),void t(O[e]);i.a.emit("onPreLoadPageResources",{path:e}),Promise.all([E(r.componentChunkName),E(r.jsonName)]).then(function(n){var o=n[0],a=n[1];if(o&&a){var l={component:o,json:a,page:r};l.page.jsonURL=k(h[r.jsonName]),O[e]=l,t(l),i.a.emit("onPostLoadPageResources",{page:r,pageResources:l}),C(e)}else t(null)})}else x().then(function(){return t(M.getResourcesForPathname(e))})})}},U=function(){f=!1,x()},I=function(e){L=(c=e)("disableCorePrefetching")},F={getResourcesForPathname:M.getResourcesForPathname,getResourceURLsForPathname:M.getResourceURLsForPathname,getResourcesForPathnameSync:M.getResourcesForPathnameSync};t.default=M},function(e,t,n){var r=n(36)("wks"),o=n(38),i=n(6).Symbol,a="function"==typeof i;(e.exports=function(e){return r[e]||(r[e]=a&&i[e]||(a?i:o)("Symbol."+e))}).store=r},function(e,t,n){e.exports=n(129)()},function(e,t,n){var r=n(12);e.exports=function(e){if(!r(e))throw TypeError(e+" is not an object!");return e}},function(e,t){var n=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(e,t){e.exports=function(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}},function(e,t){e.exports=function(e){return e&&e.__esModule?e:{default:e}}},function(e,t,n){"use strict";e.exports=function(e,t,n,r,o,i,a,l){if(!e){var u;if(void 0===t)u=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,o,i,a,l],s=0;(u=new Error(t.replace(/%s/g,function(){return c[s++]}))).name="Invariant Violation"}throw u.framesToPop=1,u}}},function(e,t,n){"use strict";var r=function(e){return e=e||Object.create(null),{on:function(t,n){(e[t]||(e[t]=[])).push(n)},off:function(t,n){e[t]&&e[t].splice(e[t].indexOf(n)>>>0,1)},emit:function(t,n){(e[t]||[]).slice().map(function(e){e(n)}),(e["*"]||[]).slice().map(function(e){e(t,n)})}}}();t.a=r},function(e,t,n){var r=n(6),o=n(18),i=n(13),a=n(16),l=n(21),u=function(e,t,n){var c,s,f,d,p=e&u.F,h=e&u.G,v=e&u.S,m=e&u.P,g=e&u.B,y=h?r:v?r[t]||(r[t]={}):(r[t]||{}).prototype,b=h?o:o[t]||(o[t]={}),w=b.prototype||(b.prototype={});for(c in h&&(n=t),n)f=((s=!p&&y&&void 0!==y[c])?y:n)[c],d=g&&s?l(f,r):m&&"function"==typeof f?l(Function.call,f):f,y&&a(y,c,f,e&u.U),b[c]!=f&&i(b,c,d),m&&w[c]!=f&&(w[c]=f)};r.core=o,u.F=1,u.G=2,u.S=4,u.P=8,u.B=16,u.W=32,u.U=64,u.R=128,e.exports=u},function(e,t){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},function(e,t,n){var r=n(28),o=n(57);e.exports=n(19)?function(e,t,n){return r.f(e,t,o(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){var r=n(31),o=Math.min;e.exports=function(e){return e>0?o(r(e),9007199254740991):0}},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t,n){var r=n(6),o=n(13),i=n(29),a=n(38)("src"),l=n(84),u=(""+l).split("toString");n(18).inspectSource=function(e){return l.call(e)},(e.exports=function(e,t,n,l){var c="function"==typeof n;c&&(i(n,"name")||o(n,"name",t)),e[t]!==n&&(c&&(i(n,a)||o(n,a,e[t]?""+e[t]:u.join(String(t)))),e===r?e[t]=n:l?e[t]?e[t]=n:o(e,t,n):(delete e[t],o(e,t,n)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[a]||l.call(this)})},function(e,t,n){"use strict";n.r(t);var r=n(0),o=n.n(r),i=(n(68),n(4),n(9)),a=n.n(i),l=o.a.createContext,u=n(70),c=function(e,t){return e.substr(0,t.length)===t},s=function(e,t){for(var n=void 0,r=void 0,o=t.split("?")[0],i=g(o),l=""===i[0],u=m(e),c=0,s=u.length;ct.score?-1:e.index-t.index})},g=function(e){return e.replace(/(^\/+|\/+$)/g,"").split("/")},y=function(e,t){return e+(t?"?"+t:"")},b=["uri","path"],w=Object.assign||function(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:{},l=a.state,u=a.replace,c=void 0!==u&&u;l=w({},l,{key:Date.now()+""});try{o||c?e.history.replaceState(l,null,t):e.history.pushState(l,null,t)}catch(f){e.location[c?"replace":"assign"](t)}r=_(e),o=!0;var s=new Promise(function(e){return i=e});return n.forEach(function(e){return e({location:r,action:"PUSH"})}),s}}},k=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"/",t=0,n=[{pathname:e,search:""}],r=[];return{get location(){return n[t]},addEventListener:function(e,t){},removeEventListener:function(e,t){},history:{get entries(){return n},get index(){return t},get state(){return r[t]},pushState:function(e,o,i){var a=i.split("?"),l=a[0],u=a[1],c=void 0===u?"":u;t++,n.push({pathname:l,search:c}),r.push(e)},replaceState:function(e,o,i){var a=i.split("?"),l=a[0],u=a[1],c=void 0===u?"":u;n[t]={pathname:l,search:c},r[t]=e}}}},S=!("undefined"==typeof window||!window.document||!window.document.createElement),T=x(S?window:k()),E=T.navigate;n.d(t,"Link",function(){return K}),n.d(t,"Location",function(){return M}),n.d(t,"LocationProvider",function(){return U}),n.d(t,"Match",function(){return Z}),n.d(t,"Redirect",function(){return J}),n.d(t,"Router",function(){return A}),n.d(t,"ServerLocation",function(){return I}),n.d(t,"isRedirect",function(){return G}),n.d(t,"redirectTo",function(){return Y}),n.d(t,"createHistory",function(){return x}),n.d(t,"createMemorySource",function(){return k}),n.d(t,"navigate",function(){return E}),n.d(t,"globalHistory",function(){return T});var P=Object.assign||function(e){for(var t=1;t=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function R(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function O(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}function N(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)}var j=function(e,t){var n=l(t);return n.Consumer.displayName=e+".Consumer",n.Provider.displayName=e+".Provider",n},L=j("Location"),M=function(e){var t=e.children;return o.a.createElement(L.Consumer,null,function(e){return e?t(e):o.a.createElement(U,null,t)})},U=function(e){function t(){var n,r;R(this,t);for(var o=arguments.length,i=Array(o),a=0;at.score?-1:e.index-t.index})},d=function(e){return e.replace(/(^\/+|\/+$)/g,"").split("/")},p=function(e,t){return e+(t?"?"+t:"")},h=["uri","path"];t.startsWith=a,t.pick=l,t.match=function(e,t){return l([{path:e}],t)},t.resolve=function(e,t){if(a(e,"/"))return e;var n=e.split("?"),r=n[0],o=n[1],i=t.split("?")[0],l=d(r),u=d(i);if(""===l[0])return p(i,o);if(!a(l[0],".")){var c=u.concat(l).join("/");return p(("/"===i?"":"/")+c,o)}for(var s=u.concat(l),f=[],h=0,v=s.length;h")}),f=function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2===n.length&&"a"===n[0]&&"b"===n[1]}();e.exports=function(e,t,n){var d=l(e),p=!i(function(){var t={};return t[d]=function(){return 7},7!=""[e](t)}),h=p?!i(function(){var t=!1,n=/a/;return n.exec=function(){return t=!0,null},"split"===e&&(n.constructor={},n.constructor[c]=function(){return n}),n[d](""),!t}):void 0;if(!p||!h||"replace"===e&&!s||"split"===e&&!f){var v=/./[d],m=n(a,d,""[e],function(e,t,n,r,o){return t.exec===u?p&&!o?{done:!0,value:v.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}}),g=m[0],y=m[1];r(String.prototype,e,g),o(RegExp.prototype,d,2==t?function(e,t){return y.call(e,this,t)}:function(e){return y.call(e,this)})}}},function(e,t,n){var r=n(5),o=n(82),i=n(83),a=Object.defineProperty;t.f=n(19)?Object.defineProperty:function(e,t,n){if(r(e),t=i(t,!0),r(n),o)try{return a(e,t,n)}catch(l){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},function(e,t){var n=Math.ceil,r=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?r:n)(e)}},function(e,t,n){var r=n(22);e.exports=function(e){return Object(r(e))}},function(e,t,n){"use strict";var r=n(8);t.__esModule=!0,t.withPrefix=p,t.navigateTo=t.replace=t.push=t.navigate=t.default=void 0;var o=r(n(141)),i=r(n(142)),a=r(n(7)),l=r(n(51)),u=r(n(52)),c=r(n(4)),s=r(n(0)),f=n(17),d=n(143);function p(e){return function(e){return e.replace(/\/+/g,"/")}("/"+e)}t.parsePath=d.parsePath;var h={activeClassName:c.default.string,activeStyle:c.default.object,partiallyActive:c.default.bool},v=function(e){function t(t){var n;n=e.call(this,t)||this,(0,u.default)((0,l.default)((0,l.default)(n)),"defaultGetProps",function(e){var t=e.isPartiallyCurrent,r=e.isCurrent;return(n.props.partiallyActive?t:r)?{className:[n.props.className,n.props.activeClassName].filter(Boolean).join(" "),style:(0,i.default)({},n.props.style,n.props.activeStyle)}:null});var r=!1;return"undefined"!=typeof window&&window.IntersectionObserver&&(r=!0),n.state={IOSupported:r},n.handleRef=n.handleRef.bind((0,l.default)((0,l.default)(n))),n}(0,a.default)(t,e);var n=t.prototype;return n.componentDidUpdate=function(e,t){this.props.to===e.to||this.state.IOSupported||___loader.enqueue((0,d.parsePath)(this.props.to).pathname)},n.componentDidMount=function(){this.state.IOSupported||___loader.enqueue((0,d.parsePath)(this.props.to).pathname)},n.handleRef=function(e){var t,n,r,o=this;this.props.innerRef&&this.props.innerRef.hasOwnProperty("current")?this.props.innerRef.current=e:this.props.innerRef&&this.props.innerRef(e),this.state.IOSupported&&e&&(t=e,n=function(){___loader.enqueue((0,d.parsePath)(o.props.to).pathname)},(r=new window.IntersectionObserver(function(e){e.forEach(function(e){t===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(r.unobserve(t),r.disconnect(),n())})})).observe(t))},n.render=function(){var e=this,t=this.props,n=t.to,r=t.getProps,a=void 0===r?this.defaultGetProps:r,l=t.onClick,u=t.onMouseEnter,c=(t.activeClassName,t.activeStyle,t.innerRef,t.partiallyActive,t.state),h=t.replace,v=(0,o.default)(t,["to","getProps","onClick","onMouseEnter","activeClassName","activeStyle","innerRef","partiallyActive","state","replace"]);var m=p(n);return s.default.createElement(f.Link,(0,i.default)({to:m,state:c,getProps:a,innerRef:this.handleRef,onMouseEnter:function(e){u&&u(e),___loader.hovering((0,d.parsePath)(n).pathname)},onClick:function(t){return l&&l(t),0!==t.button||e.props.target||t.defaultPrevented||t.metaKey||t.altKey||t.ctrlKey||t.shiftKey||(t.preventDefault(),g(n,{state:c,replace:h})),!0}},v))},t}(s.default.Component);v.propTypes=(0,i.default)({},h,{onClick:c.default.func,to:c.default.string.isRequired,replace:c.default.bool});var m=s.default.forwardRef(function(e,t){return s.default.createElement(v,(0,i.default)({innerRef:t},e))});t.default=m;var g=function(e,t){window.___navigate(p(e),t)};t.navigate=g;var y=function(e){console.warn('The "push" method is now deprecated and will be removed in Gatsby v3. Please use "navigate" instead.'),window.___push(p(e))};t.push=y;t.replace=function(e){console.warn('The "replace" method is now deprecated and will be removed in Gatsby v3. Please use "navigate" instead.'),window.___replace(p(e))};t.navigateTo=function(e){return console.warn('The "navigateTo" method is now deprecated and will be removed in Gatsby v3. Please use "navigate" instead.'),y(e)}},function(e,t,n){var r=n(11);r(r.S+r.F,"Object",{assign:n(86)})},function(e,t,n){"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}(),e.exports=n(126)},function(e,t,n){var r=n(18),o=n(6),i=o["__core-js_shared__"]||(o["__core-js_shared__"]={});(e.exports=function(e,t){return i[e]||(i[e]=void 0!==t?t:{})})("versions",[]).push({version:r.version,mode:n(37)?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},function(e,t){e.exports=!1},function(e,t){var n=0,r=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++n+r).toString(36))}},function(e,t,n){"use strict";var r,o,i=n(81),a=RegExp.prototype.exec,l=String.prototype.replace,u=a,c=(r=/a/,o=/b*/g,a.call(r,"a"),a.call(o,"a"),0!==r.lastIndex||0!==o.lastIndex),s=void 0!==/()??/.exec("")[1];(c||s)&&(u=function(e){var t,n,r,o,u=this;return s&&(n=new RegExp("^"+u.source+"$(?!\\s)",i.call(u))),c&&(t=u.lastIndex),r=a.call(u,e),c&&r&&(u.lastIndex=u.global?r.index+r[0].length:t),s&&r&&r.length>1&&l.call(r[0],n,function(){for(o=1;oi;)a(n[i++]);e._c=[],e._n=!1,t&&!e._h&&M(e)})}},M=function(e){g.call(u,function(){var t,n,r,o=e._v,i=U(e);if(i&&(t=w(function(){C?S.emit("unhandledRejection",o,e):(n=u.onunhandledrejection)?n({promise:e,reason:o}):(r=u.console)&&r.error&&r.error("Unhandled promise rejection",o)}),e._h=C||U(e)?2:1),e._a=void 0,i&&t.e)throw t.v})},U=function(e){return 1!==e._h&&0===(e._a||e._c).length},I=function(e){g.call(u,function(){var t;C?S.emit("rejectionHandled",e):(t=u.onrejectionhandled)&&t({promise:e,reason:e._v})})},F=function(e){var t=this;t._d||(t._d=!0,(t=t._w||t)._v=e,t._s=2,t._a||(t._a=t._c.slice()),L(t,!0))},A=function(e){var t,n=this;if(!n._d){n._d=!0,n=n._w||n;try{if(n===e)throw k("Promise can't be resolved itself");(t=j(e))?y(function(){var r={_w:n,_d:!1};try{t.call(e,c(A,r,1),c(F,r,1))}catch(o){F.call(r,o)}}):(n._v=e,n._s=1,L(n,!1))}catch(r){F.call({_w:n,_d:!1},r)}}};N||(P=function(e){h(this,P,"Promise","_h"),p(e),r.call(this);try{e(c(A,this,1),c(F,this,1))}catch(t){F.call(this,t)}},(r=function(e){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1}).prototype=n(101)(P.prototype,{then:function(e,t){var n=O(m(this,P));return n.ok="function"!=typeof e||e,n.fail="function"==typeof t&&t,n.domain=C?S.domain:void 0,this._c.push(n),this._a&&this._a.push(n),this._s&&L(this,!1),n.promise},catch:function(e){return this.then(void 0,e)}}),i=function(){var e=new r;this.promise=e,this.resolve=c(A,e,1),this.reject=c(F,e,1)},b.f=O=function(e){return e===P||e===a?new i(e):o(e)}),f(f.G+f.W+f.F*!N,{Promise:P}),n(47)(P,"Promise"),n(102)("Promise"),a=n(18).Promise,f(f.S+f.F*!N,"Promise",{reject:function(e){var t=O(this);return(0,t.reject)(e),t.promise}}),f(f.S+f.F*(l||!N),"Promise",{resolve:function(e){return x(l&&this===a?P:this,e)}}),f(f.S+f.F*!(N&&n(103)(function(e){P.all(e).catch(R)})),"Promise",{all:function(e){var t=this,n=O(t),r=n.resolve,o=n.reject,i=w(function(){var n=[],i=0,a=1;v(e,!1,function(e){var l=i++,u=!1;n.push(void 0),a++,t.resolve(e).then(function(e){u||(u=!0,n[l]=e,--a||r(n))},o)}),--a||r(n)});return i.e&&o(i.v),n.promise},race:function(e){var t=this,n=O(t),r=n.reject,o=w(function(){v(e,!1,function(e){t.resolve(e).then(n.resolve,r)})});return o.e&&r(o.v),n.promise}})},function(e,t,n){var r=n(28).f,o=n(29),i=n(3)("toStringTag");e.exports=function(e,t,n){e&&!o(e=n?e:e.prototype,i)&&r(e,i,{configurable:!0,value:t})}},function(e,t,n){"use strict";var r=n(26),o={};o[n(3)("toStringTag")]="z",o+""!="[object z]"&&n(16)(Object.prototype,"toString",function(){return"[object "+r(this)+"]"},!0)},function(e,t,n){var r=n(3)("unscopables"),o=Array.prototype;null==o[r]&&n(13)(o,r,{}),e.exports=function(e){o[r][e]=!0}},function(e,t,n){"use strict";var r=n(5),o=n(32),i=n(14),a=n(31),l=n(41),u=n(25),c=Math.max,s=Math.min,f=Math.floor,d=/\$([$&`']|\d\d?|<[^>]*>)/g,p=/\$([$&`']|\d\d?)/g;n(27)("replace",2,function(e,t,n,h){return[function(r,o){var i=e(this),a=null==r?void 0:r[t];return void 0!==a?a.call(r,i,o):n.call(String(i),r,o)},function(e,t){var o=h(n,e,this,t);if(o.done)return o.value;var f=r(e),d=String(this),p="function"==typeof t;p||(t=String(t));var m=f.global;if(m){var g=f.unicode;f.lastIndex=0}for(var y=[];;){var b=u(f,d);if(null===b)break;if(y.push(b),!m)break;""===String(b[0])&&(f.lastIndex=l(d,i(f.lastIndex),g))}for(var w,_="",x=0,k=0;k=x&&(_+=d.slice(x,T)+O,x=T+S.length)}return _+d.slice(x)}];function v(e,t,r,i,a,l){var u=r+e.length,c=i.length,s=p;return void 0!==a&&(a=o(a),s=d),n.call(l,s,function(n,o){var l;switch(o.charAt(0)){case"$":return"$";case"&":return e;case"`":return t.slice(0,r);case"'":return t.slice(u);case"<":l=a[o.slice(1,-1)];break;default:var s=+o;if(0===s)return n;if(s>c){var d=f(s/10);return 0===d?n:d<=c?void 0===i[d-1]?o.charAt(1):i[d-1]+o.charAt(1):n}l=i[s-1]}return void 0===l?"":l})}})},function(e,t){e.exports=function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}},function(e,t){e.exports=function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var r=!("undefined"==typeof window||!window.document||!window.document.createElement);t.default=r,e.exports=t.default},function(e,t,n){t.components={"component---node-modules-gatsby-plugin-offline-app-shell-js":function(){return n.e(5).then(n.t.bind(null,146,7))},"component---src-templates-blog-list-template-js":function(){return Promise.all([n.e(0),n.e(1),n.e(2),n.e(8)]).then(n.bind(null,153))},"component---src-templates-blog-post-js":function(){return Promise.all([n.e(0),n.e(1),n.e(3),n.e(9)]).then(n.bind(null,152))},"component---src-templates-page-js":function(){return Promise.all([n.e(0),n.e(1),n.e(3),n.e(10)]).then(n.bind(null,147))},"component---src-templates-tags-js":function(){return Promise.all([n.e(0),n.e(1),n.e(2),n.e(11)]).then(n.bind(null,148))},"component---src-templates-authors-js":function(){return Promise.all([n.e(0),n.e(1),n.e(2),n.e(14),n.e(7)]).then(n.bind(null,151))},"component---src-pages-404-js":function(){return Promise.all([n.e(0),n.e(1),n.e(6)]).then(n.bind(null,149))}},t.data=function(){return n.e(12).then(n.t.bind(null,150,3))}},function(e,t,n){"use strict";var r=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,i=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach(function(e){r[e]=e}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(o){return!1}}()?Object.assign:function(e,t){for(var n,a,l=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),u=1;u=c?e?"":void 0:(i=l.charCodeAt(u))<55296||i>56319||u+1===c||(a=l.charCodeAt(u+1))<56320||a>57343?e?l.charAt(u):i:e?l.slice(u,u+2):a-56320+(i-55296<<10)+65536}}},function(e,t,n){var r=n(43),o=n(14),i=n(88);e.exports=function(e){return function(t,n,a){var l,u=r(t),c=o(u.length),s=i(a,c);if(e&&n!=n){for(;c>s;)if((l=u[s++])!=l)return!0}else for(;c>s;s++)if((e||s in u)&&u[s]===n)return e||s||0;return!e&&-1}}},function(e,t){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(e,t,n){var r=n(5),o=n(30),i=n(3)("species");e.exports=function(e,t){var n,a=r(e).constructor;return void 0===a||null==(n=r(a)[i])?t:o(n)}},function(e,t,n){var r,o,i,a=n(21),l=n(96),u=n(63),c=n(40),s=n(6),f=s.process,d=s.setImmediate,p=s.clearImmediate,h=s.MessageChannel,v=s.Dispatch,m=0,g={},y=function(){var e=+this;if(g.hasOwnProperty(e)){var t=g[e];delete g[e],t()}},b=function(e){y.call(e.data)};d&&p||(d=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return g[++m]=function(){l("function"==typeof e?e:Function(e),t)},r(m),m},p=function(e){delete g[e]},"process"==n(15)(f)?r=function(e){f.nextTick(a(y,e,1))}:v&&v.now?r=function(e){v.now(a(y,e,1))}:h?(i=(o=new h).port2,o.port1.onmessage=b,r=a(i.postMessage,i,1)):s.addEventListener&&"function"==typeof postMessage&&!s.importScripts?(r=function(e){s.postMessage(e+"","*")},s.addEventListener("message",b,!1)):r="onreadystatechange"in c("script")?function(e){u.appendChild(c("script")).onreadystatechange=function(){u.removeChild(this),y.call(e)}}:function(e){setTimeout(a(y,e,1),0)}),e.exports={set:d,clear:p}},function(e,t,n){var r=n(6).document;e.exports=r&&r.documentElement},function(e,t,n){"use strict";var r=n(30);function o(e){var t,n;this.promise=new e(function(e,r){if(void 0!==t||void 0!==n)throw TypeError("Bad Promise constructor");t=e,n=r}),this.resolve=r(t),this.reject=r(n)}e.exports.f=function(e){return new o(e)}},function(e,t,n){var r=n(12),o=n(15),i=n(3)("match");e.exports=function(e){var t;return r(e)&&(void 0!==(t=e[i])?!!t:"RegExp"==o(e))}},function(e,t,n){"use strict";var r=n(49),o=n(118),i=n(23),a=n(43);e.exports=n(67)(Array,"Array",function(e,t){this._t=a(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,o(1)):o(0,"keys"==t?n:"values"==t?e[n]:[n,e[n]])},"values"),i.Arguments=i.Array,r("keys"),r("values"),r("entries")},function(e,t,n){"use strict";var r=n(37),o=n(11),i=n(16),a=n(13),l=n(23),u=n(119),c=n(47),s=n(122),f=n(3)("iterator"),d=!([].keys&&"next"in[].keys()),p=function(){return this};e.exports=function(e,t,n,h,v,m,g){u(n,t,h);var y,b,w,_=function(e){if(!d&&e in T)return T[e];switch(e){case"keys":case"values":return function(){return new n(this,e)}}return function(){return new n(this,e)}},x=t+" Iterator",k="values"==v,S=!1,T=e.prototype,E=T[f]||T["@@iterator"]||v&&T[v],P=E||_(v),C=v?k?_("entries"):P:void 0,R="Array"==t&&T.entries||E;if(R&&(w=s(R.call(new e)))!==Object.prototype&&w.next&&(c(w,x,!0),r||"function"==typeof w[f]||a(w,f,p)),k&&E&&"values"!==E.name&&(S=!0,P=function(){return E.call(this)}),r&&!g||!d&&!S&&T[f]||a(T,f,P),l[t]=P,l[x]=p,v)if(y={values:k?P:_("values"),keys:m?P:_("keys"),entries:C},g)for(b in y)b in T||i(T,b,y[b]);else o(o.P+o.F*(d||S),t,y);return y}},function(e,t,n){"use strict";e.exports=function(){}},function(e,t,n){"use strict";t.__esModule=!0,t.default=function(e){return e===e.window?e:9===e.nodeType&&(e.defaultView||e.parentWindow)},e.exports=t.default},function(e,t){t.polyfill=function(e){return e}},function(e,t,n){"use strict";var r=n(8),o=r(n(130)),i=r(n(140));t.ScrollContainer=i.default,t.ScrollContext=o.default},function(e,t,n){e.exports=function(){var e=!1;-1!==navigator.appVersion.indexOf("MSIE 10")&&(e=!0);var t,n=[],r="object"==typeof document&&document,o=e?r.documentElement.doScroll():r.documentElement.doScroll,i=r&&(o?/^loaded|^c/:/^loaded|^i|^c/).test(r.readyState);return!i&&r&&r.addEventListener("DOMContentLoaded",t=function(){for(r.removeEventListener("DOMContentLoaded",t),i=1;t=n.shift();)t()}),function(e){i?setTimeout(e,0):n.push(e)}}()},function(e){e.exports=[]},function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(r){"object"==typeof window&&(n=window)}e.exports=n},function(e,t,n){var r=n(65),o=n(22);e.exports=function(e,t,n){if(r(t))throw TypeError("String#"+n+" doesn't accept regex!");return String(o(e))}},function(e,t,n){var r=n(3)("match");e.exports=function(e){var t=/./;try{"/./"[e](t)}catch(n){try{return t[r]=!1,!"/./"[e](t)}catch(o){}}return!0}},function(e,t,n){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},function(e,t,n){"use strict";var r=n(5),o=n(79),i=n(25);n(27)("search",1,function(e,t,n,a){return[function(n){var r=e(this),o=null==n?void 0:n[t];return void 0!==o?o.call(n,r):new RegExp(n)[t](String(r))},function(e){var t=a(n,e,this);if(t.done)return t.value;var l=r(e),u=String(this),c=l.lastIndex;o(c,0)||(l.lastIndex=0);var s=i(l,u);return o(l.lastIndex,c)||(l.lastIndex=c),null===s?-1:s.index}]})},function(e,t){e.exports=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t}},function(e,t,n){"use strict";var r=n(39);n(11)({target:"RegExp",proto:!0,forced:r!==/./.exec},{exec:r})},function(e,t,n){"use strict";var r=n(5);e.exports=function(){var e=r(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t}},function(e,t,n){e.exports=!n(19)&&!n(20)(function(){return 7!=Object.defineProperty(n(40)("div"),"a",{get:function(){return 7}}).a})},function(e,t,n){var r=n(12);e.exports=function(e,t){if(!r(e))return e;var n,o;if(t&&"function"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;if("function"==typeof(n=e.valueOf)&&!r(o=n.call(e)))return o;if(!t&&"function"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;throw TypeError("Can't convert object to primitive value")}},function(e,t,n){e.exports=n(36)("native-function-to-string",Function.toString)},function(e,t,n){"use strict";var r=n(5),o=n(14),i=n(41),a=n(25);n(27)("match",1,function(e,t,n,l){return[function(n){var r=e(this),o=null==n?void 0:n[t];return void 0!==o?o.call(n,r):new RegExp(n)[t](String(r))},function(e){var t=l(n,e,this);if(t.done)return t.value;var u=r(e),c=String(this);if(!u.global)return a(u,c);var s=u.unicode;u.lastIndex=0;for(var f,d=[],p=0;null!==(f=a(u,c));){var h=String(f[0]);d[p]=h,""===h&&(u.lastIndex=i(c,o(u.lastIndex),s)),p++}return 0===p?null:d}]})},function(e,t,n){"use strict";var r=n(42),o=n(89),i=n(90),a=n(32),l=n(44),u=Object.assign;e.exports=!u||n(20)(function(){var e={},t={},n=Symbol(),r="abcdefghijklmnopqrst";return e[n]=7,r.split("").forEach(function(e){t[e]=e}),7!=u({},e)[n]||Object.keys(u({},t)).join("")!=r})?function(e,t){for(var n=a(e),u=arguments.length,c=1,s=o.f,f=i.f;u>c;)for(var d,p=l(arguments[c++]),h=s?r(p).concat(s(p)):r(p),v=h.length,m=0;v>m;)f.call(p,d=h[m++])&&(n[d]=p[d]);return n}:u},function(e,t,n){var r=n(29),o=n(43),i=n(59)(!1),a=n(45)("IE_PROTO");e.exports=function(e,t){var n,l=o(e),u=0,c=[];for(n in l)n!=a&&r(l,n)&&c.push(n);for(;t.length>u;)r(l,n=t[u++])&&(~i(c,n)||c.push(n));return c}},function(e,t,n){var r=n(31),o=Math.max,i=Math.min;e.exports=function(e,t){return(e=r(e))<0?o(e+t,0):i(e,t)}},function(e,t){t.f=Object.getOwnPropertySymbols},function(e,t){t.f={}.propertyIsEnumerable},function(e,t){e.exports=function(e,t,n,r){if(!(e instanceof t)||void 0!==r&&r in e)throw TypeError(n+": incorrect invocation!");return e}},function(e,t,n){var r=n(21),o=n(93),i=n(94),a=n(5),l=n(14),u=n(95),c={},s={};(t=e.exports=function(e,t,n,f,d){var p,h,v,m,g=d?function(){return e}:u(e),y=r(n,f,t?2:1),b=0;if("function"!=typeof g)throw TypeError(e+" is not iterable!");if(i(g)){for(p=l(e.length);p>b;b++)if((m=t?y(a(h=e[b])[0],h[1]):y(e[b]))===c||m===s)return m}else for(v=g.call(e);!(h=v.next()).done;)if((m=o(v,y,h.value,t))===c||m===s)return m}).BREAK=c,t.RETURN=s},function(e,t,n){var r=n(5);e.exports=function(e,t,n,o){try{return o?t(r(n)[0],n[1]):t(n)}catch(a){var i=e.return;throw void 0!==i&&r(i.call(e)),a}}},function(e,t,n){var r=n(23),o=n(3)("iterator"),i=Array.prototype;e.exports=function(e){return void 0!==e&&(r.Array===e||i[o]===e)}},function(e,t,n){var r=n(26),o=n(3)("iterator"),i=n(23);e.exports=n(18).getIteratorMethod=function(e){if(null!=e)return e[o]||e["@@iterator"]||i[r(e)]}},function(e,t){e.exports=function(e,t,n){var r=void 0===n;switch(t.length){case 0:return r?e():e.call(n);case 1:return r?e(t[0]):e.call(n,t[0]);case 2:return r?e(t[0],t[1]):e.call(n,t[0],t[1]);case 3:return r?e(t[0],t[1],t[2]):e.call(n,t[0],t[1],t[2]);case 4:return r?e(t[0],t[1],t[2],t[3]):e.call(n,t[0],t[1],t[2],t[3])}return e.apply(n,t)}},function(e,t,n){var r=n(6),o=n(62).set,i=r.MutationObserver||r.WebKitMutationObserver,a=r.process,l=r.Promise,u="process"==n(15)(a);e.exports=function(){var e,t,n,c=function(){var r,o;for(u&&(r=a.domain)&&r.exit();e;){o=e.fn,e=e.next;try{o()}catch(i){throw e?n():t=void 0,i}}t=void 0,r&&r.enter()};if(u)n=function(){a.nextTick(c)};else if(!i||r.navigator&&r.navigator.standalone)if(l&&l.resolve){var s=l.resolve(void 0);n=function(){s.then(c)}}else n=function(){o.call(r,c)};else{var f=!0,d=document.createTextNode("");new i(c).observe(d,{characterData:!0}),n=function(){d.data=f=!f}}return function(r){var o={fn:r,next:void 0};t&&(t.next=o),e||(e=o,n()),t=o}}},function(e,t){e.exports=function(e){try{return{e:!1,v:e()}}catch(t){return{e:!0,v:t}}}},function(e,t,n){var r=n(6).navigator;e.exports=r&&r.userAgent||""},function(e,t,n){var r=n(5),o=n(12),i=n(64);e.exports=function(e,t){if(r(e),o(t)&&t.constructor===e)return t;var n=i.f(e);return(0,n.resolve)(t),n.promise}},function(e,t,n){var r=n(16);e.exports=function(e,t,n){for(var o in t)r(e,o,t[o],n);return e}},function(e,t,n){"use strict";var r=n(6),o=n(28),i=n(19),a=n(3)("species");e.exports=function(e){var t=r[e];i&&t&&!t[a]&&o.f(t,a,{configurable:!0,get:function(){return this}})}},function(e,t,n){var r=n(3)("iterator"),o=!1;try{var i=[7][r]();i.return=function(){o=!0},Array.from(i,function(){throw 2})}catch(a){}e.exports=function(e,t){if(!t&&!o)return!1;var n=!1;try{var i=[7],l=i[r]();l.next=function(){return{done:n=!0}},i[r]=function(){return l},e(i)}catch(a){}return n}},function(e,t,n){e.exports=[{plugin:n(105),options:{plugins:[],maxWidth:590,linkImagesToOriginal:!1,withWebp:!0}},{plugin:n(107),options:{plugins:[]}},{plugin:n(108),options:{plugins:[],trackingId:"UA-137787150-1"}},{plugin:n(109),options:{plugins:[]}}]},function(e,t,n){"use strict";var r=n(106),o=r.imageClass,i=r.imageBackgroundClass,a=r.imageWrapperClass;t.onRouteUpdate=function(){for(var e=document.querySelectorAll("."+a),t=function(t){var n=e[t],r=n.querySelector("."+i),a=n.querySelector("."+o);a.complete?r.style.opacity=0:(a.style.opacity=0,a.addEventListener("load",function e(){r.style.transition="opacity 0.5s 0.5s",r.style.opacity=0,a.style.transition="opacity 0.5s",a.style.opacity=1,a.removeEventListener("load",e)}))},n=0;n script[src],\n head > link[href],\n head > style[data-href]\n "),a=[].slice.call(i).map(function(e){return e.src||e.href||e.getAttribute("data-href")}),l=[];r.forEach(function(e){return t(e).forEach(function(e){return l.push(e)})}),a.concat(l).forEach(function(e){var t=document.createElement("link");t.rel="prefetch",t.href=e,t.onload=t.remove,t.onerror=t.remove,document.head.appendChild(t)}),n.active.postMessage({gatsbyApi:"whitelistPathnames",pathnames:o})}},t.onPostPrefetchPathname=function(e){var t=e.pathname;window.___swUpdated||(!function(e,t){if("serviceWorker"in navigator){var n=navigator.serviceWorker;null!==n.controller?n.controller.postMessage({gatsbyApi:"whitelistPathnames",pathnames:[{pathname:e,includesPrefix:t}]}):o.push({pathname:e,includesPrefix:t})}}(t,!1),"serviceWorker"in navigator&&(null===navigator.serviceWorker.controller||"activated"!==navigator.serviceWorker.controller.state)&&r.push(t))}},function(e,t,n){"use strict";var r=n(11),o=n(59)(!0);r(r.P,"Array",{includes:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}}),n(49)("includes")},function(e,t,n){"use strict";var r=n(11),o=n(75);r(r.P+r.F*n(76)("includes"),"String",{includes:function(e){return!!~o(this,e,"includes").indexOf(e,arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){"use strict";var r=n(11),o=n(113)(5),i=!0;"find"in[]&&Array(1).find(function(){i=!1}),r(r.P+r.F*i,"Array",{find:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}}),n(49)("find")},function(e,t,n){var r=n(21),o=n(44),i=n(32),a=n(14),l=n(114);e.exports=function(e,t){var n=1==e,u=2==e,c=3==e,s=4==e,f=6==e,d=5==e||f,p=t||l;return function(t,l,h){for(var v,m,g=i(t),y=o(g),b=r(l,h,3),w=a(y.length),_=0,x=n?p(t,w):u?p(t,0):void 0;w>_;_++)if((d||_ in y)&&(m=b(v=y[_],_,g),e))if(n)x[_]=m;else if(m)switch(e){case 3:return!0;case 5:return v;case 6:return _;case 2:x.push(v)}else if(s)return!1;return f?-1:c||s?s:x}}},function(e,t,n){var r=n(115);e.exports=function(e,t){return new(r(e))(t)}},function(e,t,n){var r=n(12),o=n(116),i=n(3)("species");e.exports=function(e){var t;return o(e)&&("function"!=typeof(t=e.constructor)||t!==Array&&!o(t.prototype)||(t=void 0),r(t)&&null===(t=t[i])&&(t=void 0)),void 0===t?Array:t}},function(e,t,n){var r=n(15);e.exports=Array.isArray||function(e){return"Array"==r(e)}},function(e,t,n){for(var r=n(66),o=n(42),i=n(16),a=n(6),l=n(13),u=n(23),c=n(3),s=c("iterator"),f=c("toStringTag"),d=u.Array,p={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},h=o(p),v=0;vdocument.F=Object<\/script>"),e.close(),u=e.F;r--;)delete u.prototype[i[r]];return u()};e.exports=Object.create||function(e,t){var n;return null!==e?(l.prototype=r(e),n=new l,l.prototype=null,n[a]=e):n=u(),void 0===t?n:o(n,t)}},function(e,t,n){var r=n(28),o=n(5),i=n(42);e.exports=n(19)?Object.defineProperties:function(e,t){o(e);for(var n,a=i(t),l=a.length,u=0;l>u;)r.f(e,n=a[u++],t[n]);return e}},function(e,t,n){var r=n(29),o=n(32),i=n(45)("IE_PROTO"),a=Object.prototype;e.exports=Object.getPrototypeOf||function(e){return e=o(e),r(e,i)?e[i]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?a:null}},function(e,t,n){"use strict";var r=n(58)(!0);n(67)(String,"String",function(e){this._t=String(e),this._i=0},function(){var e,t=this._t,n=this._i;return n>=t.length?{value:void 0,done:!0}:(e=r(t,n),this._i+=e.length,{value:e,done:!1})})},function(e,t,n){"use strict";var r=n(65),o=n(5),i=n(61),a=n(41),l=n(14),u=n(25),c=n(39),s=n(20),f=Math.min,d=[].push,p=!s(function(){RegExp(4294967295,"y")});n(27)("split",2,function(e,t,n,s){var h;return h="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,t){var o=String(this);if(void 0===e&&0===t)return[];if(!r(e))return n.call(o,e,t);for(var i,a,l,u=[],s=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),f=0,p=void 0===t?4294967295:t>>>0,h=new RegExp(e.source,s+"g");(i=c.call(h,o))&&!((a=h.lastIndex)>f&&(u.push(o.slice(f,i.index)),i.length>1&&i.index=p));)h.lastIndex===i.index&&h.lastIndex++;return f===o.length?!l&&h.test("")||u.push(""):u.push(o.slice(f)),u.length>p?u.slice(0,p):u}:"0".split(void 0,0).length?function(e,t){return void 0===e&&0===t?[]:n.call(this,e,t)}:n,[function(n,r){var o=e(this),i=null==n?void 0:n[t];return void 0!==i?i.call(n,o,r):h.call(String(o),n,r)},function(e,t){var r=s(h,e,this,t,h!==n);if(r.done)return r.value;var c=o(e),d=String(this),v=i(c,RegExp),m=c.unicode,g=(c.ignoreCase?"i":"")+(c.multiline?"m":"")+(c.unicode?"u":"")+(p?"y":"g"),y=new v(p?c:"^(?:"+c.source+")",g),b=void 0===t?4294967295:t>>>0;if(0===b)return[];if(0===d.length)return null===u(y,d)?[d]:[];for(var w=0,_=0,x=[];_j.length&&j.push(e)}function U(e,t,n){return null==e?0:function e(t,n,r,o){var l=typeof t;"undefined"!==l&&"boolean"!==l||(t=null);var u=!1;if(null===t)u=!0;else switch(l){case"string":case"number":u=!0;break;case"object":switch(t.$$typeof){case i:case a:u=!0}}if(u)return r(o,t,""===n?"."+I(t,0):n),1;if(u=0,n=""===n?".":n+":",Array.isArray(t))for(var c=0;cthis.eventPool.length&&this.eventPool.push(e)}function fe(e){e.eventPool=[],e.getPooled=ce,e.release=se}o(ue.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=ae)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=ae)},persist:function(){this.isPersistent=ae},isPersistent:le,destructor:function(){var e,t=this.constructor.Interface;for(e in t)this[e]=null;this.nativeEvent=this._targetInst=this.dispatchConfig=null,this.isPropagationStopped=this.isDefaultPrevented=le,this._dispatchInstances=this._dispatchListeners=null}}),ue.Interface={type:null,target:null,currentTarget:function(){return null},eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null},ue.extend=function(e){function t(){}function n(){return r.apply(this,arguments)}var r=this;t.prototype=r.prototype;var i=new t;return o(i,n.prototype),n.prototype=i,n.prototype.constructor=n,n.Interface=o({},r.Interface,e),n.extend=r.extend,fe(n),n},fe(ue);var de=ue.extend({data:null}),pe=ue.extend({data:null}),he=[9,13,27,32],ve=q&&"CompositionEvent"in window,me=null;q&&"documentMode"in document&&(me=document.documentMode);var ge=q&&"TextEvent"in window&&!me,ye=q&&(!ve||me&&8=me),be=String.fromCharCode(32),we={beforeInput:{phasedRegistrationNames:{bubbled:"onBeforeInput",captured:"onBeforeInputCapture"},dependencies:["compositionend","keypress","textInput","paste"]},compositionEnd:{phasedRegistrationNames:{bubbled:"onCompositionEnd",captured:"onCompositionEndCapture"},dependencies:"blur compositionend keydown keypress keyup mousedown".split(" ")},compositionStart:{phasedRegistrationNames:{bubbled:"onCompositionStart",captured:"onCompositionStartCapture"},dependencies:"blur compositionstart keydown keypress keyup mousedown".split(" ")},compositionUpdate:{phasedRegistrationNames:{bubbled:"onCompositionUpdate",captured:"onCompositionUpdateCapture"},dependencies:"blur compositionupdate keydown keypress keyup mousedown".split(" ")}},_e=!1;function xe(e,t){switch(e){case"keyup":return-1!==he.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"blur":return!0;default:return!1}}function ke(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var Se=!1;var Te={eventTypes:we,extractEvents:function(e,t,n,r){var o=void 0,i=void 0;if(ve)e:{switch(e){case"compositionstart":o=we.compositionStart;break e;case"compositionend":o=we.compositionEnd;break e;case"compositionupdate":o=we.compositionUpdate;break e}o=void 0}else Se?xe(e,n)&&(o=we.compositionEnd):"keydown"===e&&229===n.keyCode&&(o=we.compositionStart);return o?(ye&&"ko"!==n.locale&&(Se||o!==we.compositionStart?o===we.compositionEnd&&Se&&(i=ie()):(re="value"in(ne=r)?ne.value:ne.textContent,Se=!0)),o=de.getPooled(o,t,n,r),i?o.data=i:null!==(i=ke(n))&&(o.data=i),V(o),i=o):i=null,(e=ge?function(e,t){switch(e){case"compositionend":return ke(t);case"keypress":return 32!==t.which?null:(_e=!0,be);case"textInput":return(e=t.data)===be&&_e?null:e;default:return null}}(e,n):function(e,t){if(Se)return"compositionend"===e||!ve&&xe(e,t)?(e=ie(),oe=re=ne=null,Se=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1