diff --git a/helpers/authHelpers.js b/helpers/authHelpers.js
index a003ac7f..109c03c6 100644
--- a/helpers/authHelpers.js
+++ b/helpers/authHelpers.js
@@ -1,19 +1,6 @@
 const logger = require('winston');
 
 module.exports = {
-  populateLocalsDotUser (req, res, next) {
-    if (req.user) {
-      logger.debug('populating res.locals.user');
-      res.locals.user = {
-        id            : req.user.id,
-        userName      : req.user.userName,
-        channelName   : req.user.channelName,
-        channelClaimId: req.user.channelClaimId,
-        shortChannelId: req.user.shortChannelId,
-      };
-    }
-    next();
-  },
   serializeSpeechUser (user, done) {  // returns user data to be serialized into session
     logger.debug('serializing user');
     done(null, user);
diff --git a/index.js b/index.js
index efdd7aac..9c88cbab 100644
--- a/index.js
+++ b/index.js
@@ -1,2 +1,9 @@
-module.exports=function(e){function t(r){if(n[r])return n[r].exports;var a=n[r]={i:r,l:!1,exports:{}};return e[r].call(a.exports,a,a.exports,t),a.l=!0,a.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="/",t(t.s=47)}([function(e,t){e.exports=require("react")},function(e,t){e.exports=require("react-redux")},function(e,t){e.exports=require("winston")},function(e,t){e.exports=require("react-router-dom")},function(e,t,n){"use strict";function r(e){return{type:h.FILE_SELECTED,data:e}}function a(){return{type:h.FILE_CLEAR}}function l(e,t){return{type:h.METADATA_UPDATE,data:{name:e,value:t}}}function o(e){return{type:h.CLAIM_UPDATE,data:e}}function i(e){return{type:h.SET_PUBLISH_IN_CHANNEL,channel:e}}function u(e,t){return{type:h.PUBLISH_STATUS_UPDATE,data:{status:e,message:t}}}function s(e,t){return{type:h.ERROR_UPDATE,data:{name:e,value:t}}}function c(e){return{type:h.SELECTED_CHANNEL_UPDATE,data:e}}function f(e){return{type:h.TOGGLE_METADATA_INPUTS,data:e}}function d(e){return{type:h.THUMBNAIL_NEW,data:e}}function p(e){return{type:h.PUBLISH_START,data:{history:e}}}Object.defineProperty(t,"__esModule",{value:!0}),t.selectFile=r,t.clearFile=a,t.updateMetadata=l,t.updateClaim=o,t.setPublishInChannel=i,t.updatePublishStatus=u,t.updateError=s,t.updateSelectedChannel=c,t.toggleMetadataInputs=f,t.onNewThumbnail=d,t.startPublish=p;var m=n(34),h=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(m)},function(e,t,n){"use strict";function r(){var e=this;this.analytics={googleId:"default"},this.assetDefaults={description:"An asset published on Spee.ch",thumbnail:"https://spee.ch/assets/img/video_thumb_default.png",title:"Spee.ch"},this.auth={sessionKey:"default"},this.details={description:"Open-source, decentralized image and video sharing.",host:"default",port:3e3,title:"Spee.ch",twitter:"@spee_ch"},this.publishing={additionalClaimAddresses:[],disabled:!1,disabledMessage:"Please check back soon.",primaryClaimAddress:"default",thumbnailChannel:"default",thumbnailChannelId:"default",uploadDirectory:"/home/lbry/Uploads"},this.configure=function(t){if(!t)return console.log("No site config received.");var n=t.analytics,r=t.assetDefaults,a=t.auth,l=t.details,o=t.publishing;e.analytics=n,e.assetDefaults=r,e.auth=a,e.details=l,e.publishing=o}}e.exports=new r},function(e,t,n){"use strict";var r=n(26),a=n(2);console.log("exporting sequelize models");var l=n(23),o=l.database,i=l.username,u=l.password,s={},c=new r(o,i,u,{host:"localhost",dialect:"mysql",dialectOptions:{decimalNumbers:!0},logging:!1,pool:{max:5,min:0,idle:1e4,acquire:1e4}});c.authenticate().then(function(){a.info("Sequelize has established mysql connection successfully.")}).catch(function(e){a.error("Sequelize was unable to connect to the database:",e)});var f=n(67),d=n(68),p=n(69),m=n(70),h=n(71),b=n(72);s.Certificate=c.import("Certificate",f),s.Channel=c.import("Channel",d),s.Claim=c.import("Claim",p),s.File=c.import("File",m),s.Request=c.import("Request",h),s.User=c.import("User",b),Object.keys(s).forEach(function(e){s[e].associate&&(a.info("Associating model:",e),s[e].associate(s))}),s.sequelize=c,s.Sequelize=r,s.upsert=function(e,t,n,r){return e.findOne({where:n}).then(function(n){return n?(a.debug("updating record in db."+r),n.update(t)):(a.debug("creating record in db."+r),e.create(t))}).catch(function(e){throw a.error(r+".upsert error",e),e})},e.exports=s},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),a=n(19),l=n(4),o=n(93),i=function(e){return e&&e.__esModule?e:{default:e}}(o),u=function(e){var t=e.channel,n=e.site;return{channelName:t.loggedInChannel.name,channelShortId:t.loggedInChannel.shortId,channelLongId:t.loggedInChannel.longId,siteDescription:n.description}},s=function(e){return{onChannelLogin:function(t,n,r){e((0,a.updateLoggedInChannel)(t,n,r)),e((0,l.updateSelectedChannel)(t))},onChannelLogout:function(){e((0,a.updateLoggedInChannel)(null,null,null))}}};t.default=(0,r.connect)(u,s)(i.default)},function(e,t,n){"use strict";function r(e){return{type:g.HANDLE_SHOW_URI,data:e}}function a(e){return{type:g.REQUEST_ERROR,data:e}}function l(e,t){var n=v.CHANNEL,r="cr#"+e+"#"+t;return{type:g.CHANNEL_REQUEST_NEW,data:{requestType:n,requestId:r,channelName:e,channelId:t}}}function o(e,t,n,r,a){var l=a?v.ASSET_LITE:v.ASSET_DETAILS,o="ar#"+e+"#"+t+"#"+n+"#"+r;return{type:g.ASSET_REQUEST_NEW,data:{requestType:l,requestId:o,name:e,modifier:{id:t,channel:{name:n,id:r}}}}}function i(e,t){return{type:g.REQUEST_UPDATE,data:{requestType:e,requestId:t}}}function u(e,t,n){return{type:g.REQUEST_LIST_ADD,data:{id:e,error:t,key:n}}}function s(e,t,n,r,a,l){return{type:g.ASSET_ADD,data:{id:e,error:t,name:n,claimId:r,shortId:a,claimData:l}}}function c(e,t,n,r,a){return{type:g.CHANNEL_ADD,data:{id:e,name:t,shortId:n,longId:r,claimsData:a}}}function f(e,t,n,r){return{type:g.CHANNEL_CLAIMS_UPDATE_ASYNC,data:{channelKey:e,name:t,longId:n,page:r}}}function d(e,t){return{type:g.CHANNEL_CLAIMS_UPDATE_SUCCESS,data:{channelListId:e,claimsData:t}}}function p(e,t){return{type:g.FILE_REQUESTED,data:{name:e,claimId:t}}}function m(e){return{type:g.FILE_AVAILABILITY_UPDATE,data:e}}function h(e){return{type:g.DISPLAY_ASSET_ERROR,data:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.onHandleShowPageUri=r,t.onRequestError=a,t.onNewChannelRequest=l,t.onNewAssetRequest=o,t.onRequestUpdate=i,t.addRequestToRequestList=u,t.addAssetToAssetList=s,t.addNewChannelToChannelList=c,t.onUpdateChannelClaims=f,t.updateChannelClaims=d,t.fileRequested=p,t.updateFileAvailability=m,t.updateDisplayAssetError=h;var b=n(12),g=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(b),v=n(43)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),a=n(89),l=function(e){return e&&e.__esModule?e:{default:e}}(a),o=function(e){var t=e.site;return{defaultDescription:t.defaultDescription,defaultThumbnail:t.defaultThumbnail,siteDescription:t.description,siteHost:t.host,siteTitle:t.title,siteTwitter:t.twitter}};t.default=(0,r.connect)(o,null)(l.default)},function(e,t){e.exports=require("prop-types")},function(e,t,n){"use strict";function r(e){return 204===e.status||205===e.status?null:e.json()}function a(e,t){if(e.status>=200&&e.status<300)return t;var n=new Error(t.message);throw n.response=e,n}function l(e,t){return fetch(e,t).then(function(e){return Promise.all([e,r(e)])}).then(function(e){var t=o(e,2);return a(t[0],t[1])})}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){var n=[],r=!0,a=!1,l=void 0;try{for(var o,i=e[Symbol.iterator]();!(r=(o=i.next()).done)&&(n.push(o.value),!t||n.length!==t);r=!0);}catch(e){a=!0,l=e}finally{try{!r&&i.return&&i.return()}finally{if(a)throw l}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();t.default=l,n(96)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.HANDLE_SHOW_URI="HANDLE_SHOW_URI",t.REQUEST_ERROR="REQUEST_ERROR",t.REQUEST_UPDATE="REQUEST_UPDATE",t.ASSET_REQUEST_NEW="ASSET_REQUEST_NEW",t.CHANNEL_REQUEST_NEW="CHANNEL_REQUEST_NEW",t.REQUEST_LIST_ADD="REQUEST_LIST_ADD",t.ASSET_ADD="ASSET_ADD",t.CHANNEL_ADD="CHANNEL_ADD",t.CHANNEL_CLAIMS_UPDATE_ASYNC="CHANNEL_CLAIMS_UPDATE_ASYNC",t.CHANNEL_CLAIMS_UPDATE_SUCCESS="CHANNEL_CLAIMS_UPDATE_SUCCESS",t.FILE_REQUESTED="FILE_REQUESTED",t.FILE_AVAILABILITY_UPDATE="FILE_AVAILABILITY_UPDATE",t.DISPLAY_ASSET_ERROR="DISPLAY_ASSET_ERROR"},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.selectAsset=function(e){var t=e.requestList[e.request.id],n=t.key;return e.assetList[n]},t.selectShowState=function(e){return e.show}},function(e,t){e.exports=require("react-helmet")},function(e,t){e.exports=require("redux-saga/effects")},function(e,t,n){"use strict";var r=n(64),a=n(2),l=n(65),o=l.api,i=o.apiHost,u=o.apiPort,s="http://"+i+":"+u,c=n(17),f=c.chooseGaLbrynetPublishLabel,d=c.sendGATimingEvent,p=function(e,t,n){var r=e.data;if(a.debug("lbry api data:",r),r.result)return r.result.error?(a.debug("Lbrynet api error:",r.result.error),void n(new Error(r.result.error))):void t(r.result);n(JSON.stringify(r))};e.exports={publishClaim:function(e){a.debug('lbryApi >> Publishing claim to "'+e.name+'"');var t=Date.now();return new Promise(function(n,a){r.post(s,{method:"publish",params:e}).then(function(r){d("lbrynet","publish",f(e),t,Date.now()),p(r,n,a)}).catch(function(e){a(e)})})},getClaim:function(e){a.debug('lbryApi >> Getting Claim for "'+e+'"');var t=Date.now();return new Promise(function(n,a){r.post(s,{method:"get",params:{uri:e,timeout:20}}).then(function(e){d("lbrynet","getClaim","GET",t,Date.now()),p(e,n,a)}).catch(function(e){a(e)})})},getClaimList:function(e){a.debug('lbryApi >> Getting claim_list for "'+e+'"');var t=Date.now();return new Promise(function(n,a){r.post(s,{method:"claim_list",params:{name:e}}).then(function(e){d("lbrynet","getClaimList","CLAIM_LIST",t,Date.now()),p(e,n,a)}).catch(function(e){a(e)})})},resolveUri:function(e){a.debug('lbryApi >> Resolving URI for "'+e+'"');var t=Date.now();return new Promise(function(n,a){r.post(s,{method:"resolve",params:{uri:e}}).then(function(r){var l=r.data;d("lbrynet","resolveUri","RESOLVE",t,Date.now()),l.result[e].error?a(l.result[e].error):n(l.result[e])}).catch(function(e){a(e)})})},getDownloadDirectory:function(){a.debug("lbryApi >> Retrieving the download directory path from lbry daemon...");var e=Date.now();return new Promise(function(t,n){r.post(s,{method:"settings_get"}).then(function(n){var r=n.data;if(d("lbrynet","getDownloadDirectory","SETTINGS_GET",e,Date.now()),!r.result)return new Error("Successfully connected to lbry daemon, but unable to retrieve the download directory.");t(r.result.download_directory)}).catch(function(e){a.error("Lbrynet Error:",e),t("/home/lbry/Downloads/")})})},createChannel:function(e){a.debug("lbryApi >> Creating channel for "+e+"...");var t=Date.now();return new Promise(function(n,a){r.post(s,{method:"channel_new",params:{channel_name:e,amount:.1}}).then(function(e){d("lbrynet","createChannel","CHANNEL_NEW",t,Date.now()),p(e,n,a)}).catch(function(e){a(e)})})}}},function(e,t,n){"use strict";function r(e,t,n){return{eventCategory:"client requests",eventAction:"serve request",eventLabel:n,ipOverride:t,userAgentOverride:e["user-agent"]}}function a(e,t,n,r,a){return{userTimingCategory:e,userTimingVariableName:t,userTimingTime:a-r,userTimingLabel:n}}function l(e,t){var n=e.replace(/\./g,"-");u(c,n,{strictCidFormat:!1,https:!0}).event(t,function(e){e&&i.error("Google Analytics Event Error >>",e)})}function o(e,t){u(c,e,{strictCidFormat:!1,https:!0}).timing(t,function(e){e&&i.error("Google Analytics Event Error >>",e),i.debug("Timing event successfully sent to google analytics")})}var i=n(2),u=n(66),s=n(5),c=s.analytics.googleId,f=s.details.title;e.exports={sendGAServeEvent:function(e,t,n){l(t,r(e,t,n))},sendGATimingEvent:function(e,t,n,r,l){var i=a(e,t,n,r,l);o(f,i)},chooseGaLbrynetPublishLabel:function(e){var t=e.channel_name,n=e.channel_id;return t||n?"PUBLISH_IN_CHANNEL_CLAIM":"PUBLISH_ANONYMOUS_CLAIM"}}},function(e,t){e.exports=require("redux")},function(e,t,n){"use strict";function r(e,t,n){return{type:l.CHANNEL_UPDATE,data:{name:e,shortId:t,longId:n}}}Object.defineProperty(t,"__esModule",{value:!0}),t.updateLoggedInChannel=r;var a=n(36),l=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(a)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(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)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(0),s=r(u),c=n(10),f=r(c),d=n(118),p=r(d),m=n(119),h=r(m),b=function(e){function t(e){a(this,t);var n=l(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.state={bars:[],index:0,incrementer:1},n.createBars=n.createBars.bind(n),n.startProgressBar=n.startProgressBar.bind(n),n.updateProgressBar=n.updateProgressBar.bind(n),n.stopProgressBar=n.stopProgressBar.bind(n),n}return o(t,e),i(t,[{key:"componentDidMount",value:function(){this.createBars(),this.startProgressBar()}},{key:"componentWillUnmount",value:function(){this.stopProgressBar()}},{key:"createBars",value:function(){for(var e=[],t=0;t<=this.props.size;t++)e.push({isActive:!1});this.setState({bars:e})}},{key:"startProgressBar",value:function(){this.updateInterval=setInterval(this.updateProgressBar.bind(this),300)}},{key:"updateProgressBar",value:function(){var e=this.state.index,t=this.state.incrementer,n=this.state.bars;(e<0||e>this.props.size)&&(t*=-1,e+=t),n[e].isActive=t>0,e+=t,this.setState({bars:n,incrementer:t,index:e})}},{key:"stopProgressBar",value:function(){clearInterval(this.updateInterval)}},{key:"render",value:function(){return s.default.createElement("div",null,this.state.bars.map(function(e,t){return e.isActive?s.default.createElement(p.default,{key:t}):s.default.createElement(h.default,{key:t})}))}}]),t}(s.default.Component);b.propTypes={size:f.default.number.isRequired},t.default=b},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(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)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(0),s=r(u),c=n(10),f=r(c),d=n(7),p=r(d),m=function(e){function t(){return a(this,t),l(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return o(t,e),i(t,[{key:"render",value:function(){var e=this.props.error;return s.default.createElement("div",null,s.default.createElement(p.default,null),s.default.createElement("div",{className:"row row--padded"},s.default.createElement("p",null,e)))}}]),t}(s.default.Component);m.propTypes={error:f.default.string.isRequired},t.default=m},function(e,t){e.exports=require("passport")},function(e,t,n){"use strict";function r(){var e=this;this.database="default",this.username="default",this.password="default",this.configure=function(t){if(!t)return console.log("No MySQL config received.");var n=t.database,r=t.username,a=t.password;e.database=n,e.username=r,e.password=a}}e.exports=new r},function(e,t,n){"use strict";function r(){var e=this;this.slackWebHook="default",this.slackErrorChannel="default",this.slackInfoChannel="default",this.configure=function(t){if(!t)return console.log("No slack config received.");var n=t.slackWebHook,r=t.slackErrorChannel,a=t.slackInfoChannel;e.slackWebHook=n,e.slackErrorChannel=r,e.slackInfoChannel=a}}e.exports=new r},function(e,t){e.exports=require("passport-local")},function(e,t){e.exports=require("sequelize")},function(e,t,n){"use strict";e.exports={returnShortId:function(e,t){var n=void 0,r=t.substring(0,1),a=0;if((n=e.findIndex(function(e){return e.claimId===t}))<0)throw new Error("claim id not found in claims list");for(var l=e.slice(0,n);l.length>0;)a+=1,r=t.substring(0,a),l=l.filter(function(e){return e.claimId&&e.claimId.substring(0,a)===r});return r}}},function(e,t,n){"use strict";var r=n(2),a=n(79),l=n(5),o=l.details,i=l.publishing;e.exports={parsePublishApiRequestBody:function(e){var t=e.name,n=e.nsfw,r=e.license,a=e.title,l=e.description,o=e.thumbnail;if(!t)throw new Error("no name field found in request");if(/[^A-Za-z0-9,-]/.exec(t))throw new Error('The claim name you provided is not allowed.  Only the following characters are allowed: A-Z, a-z, 0-9, and "-"');return n="true"===n,r=r||null,a=a||null,l=l||null,o=o||null,{name:t,nsfw:n,license:r,title:a,description:l,thumbnail:o}},parsePublishApiRequestFiles:function(t){var n=t.file,r=t.thumbnail;if(!n)throw new Error("no file with key of [file] found in request");if(!n.path)throw new Error("no file path found");if(!n.type)throw new Error("no file type found");if(!n.size)throw new Error("no file type found");if(/'/.test(n.name))throw new Error("apostrophes are not allowed in the file name");return e.exports.validateFileTypeAndSize(n),{fileName:n.name,filePath:n.path,fileType:n.type,thumbnailFileName:r?r.name:null,thumbnailFilePath:r?r.path:null,thumbnailFileType:r?r.type:null}},validateFileTypeAndSize:function(e){switch(e.type){case"image/jpeg":case"image/jpg":case"image/png":if(e.size>1e7)throw r.debug("publish > file validation > .jpeg/.jpg/.png was too big"),new Error("Sorry, images are limited to 10 megabytes.");break;case"image/gif":if(e.size>5e7)throw r.debug("publish > file validation > .gif was too big"),new Error("Sorry, .gifs are limited to 50 megabytes.");break;case"video/mp4":if(e.size>5e7)throw r.debug("publish > file validation > .mp4 was too big"),new Error("Sorry, videos are limited to 50 megabytes.");break;default:throw r.debug("publish > file validation > unrecognized file type"),new Error("The "+e.type+" content type is not supported.  Only, .jpeg, .png, .gif, and .mp4 files are currently supported.")}return e},createBasicPublishParams:function(e,t,n,a,l,u,s){r.debug("Creating Publish Parameters"),null!==n&&""!==n.trim()||(n=t),null!==a&&""!==a.trim()||(a=""),null!==l&&""!==l.trim()||(l=" ");var c={name:t,file_path:e,bid:.01,metadata:{description:a,title:n,author:o.title,language:"en",license:l,nsfw:u},claim_address:i.primaryClaimAddress};return s&&(c.metadata.thumbnail=s),c},createThumbnailPublishParams:function(e,t,n,a){if(e)return r.debug("Creating Thumbnail Publish Parameters"),{name:t+"-thumb",file_path:e,bid:.01,metadata:{title:t+" thumbnail",description:"a thumbnail for "+t,author:o.title,language:"en",license:n,nsfw:a},claim_address:i.primaryClaimAddress,channel_name:i.thumbnailChannel,channel_id:i.thumbnailChannelId}},deleteTemporaryFile:function(e){a.unlink(e,function(t){if(t)throw r.error("error deleting temporary file "+e),t;r.debug("successfully deleted "+e)})},addGetResultsToFileData:function(e,t){return e.fileName=t.file_name,e.filePath=t.download_path,e},createFileData:function(e){var t=e.name,n=e.claimId,r=e.outpoint,a=e.height,l=e.address,o=e.nsfw;return{name:t,claimId:n,outpoint:r,height:a,address:l,fileName:"",filePath:"",fileType:e.contentType,nsfw:o}}}},function(e,t,n){"use strict";var r=function(){function e(e,t){var n=[],r=!0,a=!1,l=void 0;try{for(var o,i=e[Symbol.iterator]();!(r=(o=i.next()).done)&&(n.push(o.value),!t||n.length!==t);r=!0);}catch(e){a=!0,l=e}finally{try{!r&&i.return&&i.return()}finally{if(a)throw l}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),a=n(2);e.exports={handleErrorResponse:function(t,n,l,o){a.error("Error on "+t,e.exports.useObjectPropertiesIfNoKeys(l));var i=e.exports.returnErrorMessageAndStatus(l),u=r(i,2),s=u[0],c=u[1];o.status(s).json(e.exports.createErrorResponsePayload(s,c))},returnErrorMessageAndStatus:function(e){var t=void 0,n=void 0;return"ECONNREFUSED"===e.code?(t=503,n="Connection refused.  The daemon may not be running."):(t=400,n=e.message?e.message:e),[t,n]},useObjectPropertiesIfNoKeys:function(e){if(0===Object.keys(e).length){var t={};return Object.getOwnPropertyNames(e).forEach(function(n){t[n]=e[n]}),t}return e},createErrorResponsePayload:function(e,t){return{status:e,success:!1,message:t}}}},function(e,t,n){"use strict";var r=function(){function e(e,t){var n=[],r=!0,a=!1,l=void 0;try{for(var o,i=e[Symbol.iterator]();!(r=(o=i.next()).done)&&(n.push(o.value),!t||n.length!==t);r=!0);}catch(e){a=!0,l=e}finally{try{!r&&i.return&&i.return()}finally{if(a)throw l}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),a=n(6),l=n(2),o=n(81),i=o.returnPaginatedChannelClaims;e.exports={getClaimId:function(t,n,r,a){return t?e.exports.getClaimIdByChannel(t,n,r):e.exports.getClaimIdByClaim(r,a)},getClaimIdByClaim:function(e,t){return l.debug("getClaimIdByClaim("+e+", "+t+")"),new Promise(function(n,r){a.Claim.getLongClaimId(e,t).then(function(e){e||n("NO_CLAIM"),n(e)}).catch(function(e){r(e)})})},getClaimIdByChannel:function(e,t,n){return l.debug("getClaimIdByChannel("+e+", "+t+", "+n+")"),new Promise(function(l,o){a.Certificate.getLongChannelId(e,t).then(function(e){return e?Promise.all([e,a.Claim.getClaimIdByLongChannelId(e,n)]):[null,null]}).then(function(e){var t=r(e,2),n=t[0],a=t[1];return n?a?void l(a):l("NO_CLAIM"):l("NO_CHANNEL")}).catch(function(e){o(e)})})},getChannelData:function(e,t,n){return new Promise(function(n,l){a.Certificate.getLongChannelId(e,t).then(function(t){return t?Promise.all([t,a.Certificate.getShortChannelIdFromLongChannelId(t,e)]):[null,null,null]}).then(function(t){var a=r(t,2),l=a[0],o=a[1];if(!l)return n("NO_CHANNEL");n({channelName:e,longChannelClaimId:l,shortChannelClaimId:o})}).catch(function(e){l(e)})})},getChannelClaims:function(e,t,n){return new Promise(function(l,o){a.Certificate.getLongChannelId(e,t).then(function(e){return e?Promise.all([e,a.Claim.getAllChannelClaims(e)]):[null,null,null]}).then(function(t){var a=r(t,2),o=a[0],u=a[1];if(!o)return l("NO_CHANNEL");var s=i(e,o,u,n);l(s)}).catch(function(e){o(e)})})},getLocalFileRecord:function(e,t){return a.File.findOne({where:{claimId:e,name:t}}).then(function(e){return e?e.dataValues:"NO_FILE"})}}},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}var a=n(0),l=r(a),o=n(32),i=n(18),u=n(33),s=r(u),c=n(1),f=n(3),d=n(38),p=r(d),m=n(39),h=r(m),b=n(45),g=r(b),v=n(14),y=r(v);e.exports=function(e,t){var n={},r=(0,i.createStore)(s.default),a=(0,o.renderToString)(l.default.createElement(c.Provider,{store:r},l.default.createElement(f.StaticRouter,{location:e.url,context:n},l.default.createElement(p.default,null,l.default.createElement(h.default,null))))),u=y.default.renderStatic();if(n.url)return t.redirect(301,n.url);var d=r.getState();t.send((0,g.default)(u,a,d))}},function(e,t){e.exports=require("react-dom/server")},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var a=n(18),l=n(83),o=r(l),i=n(84),u=r(i),s=n(85),c=r(s),f=n(86),d=r(f);t.default=(0,a.combineReducers)({channel:u.default,publish:o.default,show:c.default,site:d.default})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.FILE_SELECTED="FILE_SELECTED",t.FILE_CLEAR="FILE_CLEAR",t.METADATA_UPDATE="METADATA_UPDATE",t.CLAIM_UPDATE="CLAIM_UPDATE",t.SET_PUBLISH_IN_CHANNEL="SET_PUBLISH_IN_CHANNEL",t.PUBLISH_STATUS_UPDATE="PUBLISH_STATUS_UPDATE",t.ERROR_UPDATE="ERROR_UPDATE",t.SELECTED_CHANNEL_UPDATE="SELECTED_CHANNEL_UPDATE",t.TOGGLE_METADATA_INPUTS="TOGGLE_METADATA_INPUTS",t.THUMBNAIL_NEW="THUMBNAIL_NEW",t.PUBLISH_START="PUBLISH_START"},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.LOGIN="Existing",t.CREATE="New"},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.CHANNEL_UPDATE="CHANNEL_UPDATE"},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.LOCAL_CHECK="LOCAL_CHECK",t.UNAVAILABLE="UNAVAILABLE",t.ERROR="ERROR",t.AVAILABLE="AVAILABLE"},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(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)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(0),s=r(u),c=n(87),f=r(c),d=n(3),p=n(5),m=p.analytics.googleId;f.default.initialize(m);var h=function(e){function t(){return a(this,t),l(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return o(t,e),i(t,[{key:"componentDidMount",value:function(){this.sendPageView(this.props.history.location),this.props.history.listen(this.sendPageView)}},{key:"sendPageView",value:function(e){f.default.set({page:e.pathname}),f.default.pageview(e.pathname)}},{key:"render",value:function(){return this.props.children}}]),t}(s.default.Component);t.default=(0,d.withRouter)(h)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var a=n(0),l=r(a),o=n(3),i=n(88),u=r(i),s=n(125),c=r(s),f=n(126),d=r(f),p=n(128),m=r(p),h=n(145),b=r(h),g=function(){return l.default.createElement(o.Switch,null,l.default.createElement(o.Route,{exact:!0,path:"/",component:u.default}),l.default.createElement(o.Route,{exact:!0,path:"/about",component:c.default}),l.default.createElement(o.Route,{exact:!0,path:"/login",component:d.default}),l.default.createElement(o.Route,{exact:!0,path:"/:identifier/:claim",component:m.default}),l.default.createElement(o.Route,{exact:!0,path:"/:claim",component:m.default}),l.default.createElement(o.Route,{component:b.default}))};t.default=g},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),a=n(4),l=n(99),o=function(e){return e&&e.__esModule?e:{default:e}}(l),i=function(e){var t=e.publish;return{file:t.file,thumbnail:t.thumbnail,fileError:t.error.file}},u=function(e){return{selectFile:function(t){e((0,a.selectFile)(t))},setFileError:function(t){e((0,a.clearFile)()),e((0,a.updateError)("file",t))}}};t.default=(0,r.connect)(i,u)(o.default)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),a=n(19),l=n(116),o=function(e){return e&&e.__esModule?e:{default:e}}(l),i=n(4),u=function(e){return{onChannelLogin:function(t,n,r){e((0,a.updateLoggedInChannel)(t,n,r)),e((0,i.updateSelectedChannel)(t))}}};t.default=(0,r.connect)(null,u)(o.default)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),a=n(19),l=n(117),o=function(e){return e&&e.__esModule?e:{default:e}}(l),i=n(4),u=function(e){return{onChannelLogin:function(t,n,r){e((0,a.updateLoggedInChannel)(t,n,r)),e((0,i.updateSelectedChannel)(t))}}};t.default=(0,r.connect)(null,u)(o.default)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.CHANNEL="CHANNEL",t.ASSET_LITE="ASSET_LITE",t.ASSET_DETAILS="ASSET_DETAILS"},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),a=n(132),l=function(e){return e&&e.__esModule?e:{default:e}}(a),o=n(8),i=n(13),u=function(e){var t=e.show;return{error:t.displayAsset.error,status:t.displayAsset.status,asset:(0,i.selectAsset)(t)}},s=function(e){return{onFileRequest:function(t,n){e((0,o.fileRequested)(t,n))}}};t.default=(0,r.connect)(u,s)(l.default)},function(e,t,n){"use strict";e.exports=function(e,t,n){return'\n    <!DOCTYPE html>\n    <html lang="en" prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb#">\n        <head>\n            <meta charset="UTF-8">\n            <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, user-scalable=no">\n            <meta http-equiv="X-UA-Compatible" content="ie=edge">\n            \x3c!--helmet--\x3e\n            '+e.title.toString()+"\n            "+e.meta.toString()+"\n            "+e.link.toString()+'\n            \x3c!--style sheets--\x3e\n            <link rel="stylesheet" href="/assets/css/reset.css" type="text/css">\n            <link rel="stylesheet" href="/assets/css/general.css" type="text/css">\n            <link rel="stylesheet" href="/assets/css/mediaQueries.css" type="text/css">\n            \x3c!--google font--\x3e\n            <link href="https://fonts.googleapis.com/css?family=Roboto:300" rel="stylesheet">\n        </head>\n        <body id="main-body">\n            <div class="row row--tall flex-container--column">\n                <div id="react-app" class="row row--tall flex-container--column">'+t+"</div>\n            </div>\n            <script>\n                window.__PRELOADED_STATE__ = "+JSON.stringify(n).replace(/</g,"\\<")+'\n            <\/script>\n            <script src="/bundle/bundle.js"><\/script>\n        </body>\n    </html>\n  '}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.selectSiteState=function(e){return e.site},t.selectSiteHost=function(e){return e.site.host}},function(e,t,n){n(48),n(49),e.exports=n(50)},function(e,t){e.exports=require("babel-polyfill")},function(e,t){e.exports=require("whatwg-fetch")},function(e,t,n){"use strict";function r(e){var t=this,r=e.mysqlConfig,c=e.siteConfig,g=e.slackConfig;this.start=function(){t.configureConfigFiles(),t.configureLogging(),t.configureApp(),t.configureServer(),t.startServer()},this.configureConfigFiles=function(){n(23).configure(r);var e=n(5);e.configure(c),t.PORT=e.details.port,n(24).configure(g)},this.configureLogging=function(){n(59)(b),n(61)(b)},this.configureApp=function(){var e=a();e.enable("trust proxy"),e.use(u()),e.use(a.static(__dirname+"/public")),e.use(l.json()),e.use(l.urlencoded({extended:!0})),e.use(function(e,t,n){b.verbose("Request on "+e.originalUrl+" from "+e.ip),n()}),s.serializeUser(d),s.deserializeUser(p);var r=n(63),h=n(74);s.use("local-signup",r),s.use("local-login",h),e.use(m({name:"session",keys:[c.auth.sessionKey],maxAge:864e5})),e.use(s.initialize()),e.use(s.session());var g=o.create({defaultLayout:"embed",handlebars:i});e.engine("handlebars",g.engine),e.set("view engine","handlebars"),e.use(f),n(75)(e),n(76)(e),n(82)(e),n(147)(e),n(158)(e),t.app=e},this.configureServer=function(){t.server=h.Server(t.app)},this.startServer=function(){n(6).sequelize.sync().then(function(){t.server.listen(t.PORT,function(){b.info("Server is listening on PORT "+t.PORT)})}).catch(function(e){b.error("Startup Error:",e)})}}var a=n(51),l=n(52),o=n(53),i=n(54),u=n(55),s=n(22),c=n(56),f=c.populateLocalsDotUser,d=c.serializeSpeechUser,p=c.deserializeSpeechUser,m=n(57),h=n(58),b=n(2);e.exports=r},function(e,t){e.exports=require("express")},function(e,t){e.exports=require("body-parser")},function(e,t){e.exports=require("express-handlebars")},function(e,t){e.exports=require("handlebars")},function(e,t){e.exports=require("helmet")},function(e,t,n){"use strict";var r=n(2);e.exports={populateLocalsDotUser:function(e,t,n){e.user&&(r.debug("populating res.locals.user"),t.locals.user={id:e.user.id,userName:e.user.userName,channelName:e.user.channelName,channelClaimId:e.user.channelClaimId,shortChannelId:e.user.shortChannelId}),n()},serializeSpeechUser:function(e,t){r.debug("serializing user"),t(null,e)},deserializeSpeechUser:function(e,t){r.debug("deserializing user"),t(null,e)}}},function(e,t){e.exports=require("cookie-session")},function(e,t){e.exports=require("http")},function(e,t,n){"use strict";var r=n(60),a=r.logLevel;e.exports=function(e){e.configure({transports:[new e.transports.Console({level:a,timestamp:!1,colorize:!0,prettyPrint:!0,handleExceptions:!0,humanReadableUnhandledException:!0})]}),e.error("Level 0"),e.warn("Level 1"),e.info("Level 2"),e.verbose("Level 3"),e.debug("Level 4"),e.silly("Level 5")}},function(e,t,n){"use strict";var r={logLevel:"debug"};e.exports=r},function(e,t,n){"use strict";var r=n(62).SlackWebHook,a=n(24);e.exports=function(e){var t=a.slackWebHook,n=a.slackErrorChannel,l=a.slackInfoChannel;t?(n&&e.add(r,{name:"slack-errors-transport",level:"warn",webhookUrl:t,channel:n,username:"spee.ch",iconEmoji:":face_with_head_bandage:"}),l&&e.add(r,{name:"slack-info-transport",level:"info",webhookUrl:t,channel:l,username:"spee.ch",iconEmoji:":nerd_face:"}),e.error('Slack "error" logging is online.'),e.info('Slack "info" logging is online.')):e.warn("Slack logging is not enabled because no slackWebHook config var provided.")}},function(e,t){e.exports=require("winston-slack-webhook")},function(e,t,n){"use strict";var r=function(){function e(e,t){var n=[],r=!0,a=!1,l=void 0;try{for(var o,i=e[Symbol.iterator]();!(r=(o=i.next()).done)&&(n.push(o.value),!t||n.length!==t);r=!0);}catch(e){a=!0,l=e}finally{try{!r&&i.return&&i.return()}finally{if(a)throw l}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),a=n(25).Strategy,l=n(16),o=n(2),i=n(6);e.exports=new a({usernameField:"username",passwordField:"password"},function(e,t,n){o.verbose("new channel signup request. user: "+e+" pass: "+t+" .");var a={};return l.createChannel("@"+e).then(function(n){var r={userName:e,password:t};o.verbose("userData >",r);var a={channelName:"@"+e,channelClaimId:n.claim_id};o.verbose("channelData >",a);var l={claimId:n.claim_id,name:"@"+e};return o.verbose("certificateData >",l),Promise.all([i.User.create(r),i.Channel.create(a),i.Certificate.create(l)])}).then(function(e){var t=r(e,3),n=t[0],l=t[1],i=t[2];return o.verbose("user and certificate successfully created"),a.id=n.id,a.userName=n.userName,a.channelName=l.channelName,a.channelClaimId=l.channelClaimId,Promise.all([i.setChannel(l),l.setUser(n)])}).then(function(){return o.verbose("user and certificate successfully associated"),i.Certificate.getShortChannelIdFromLongChannelId(a.channelClaimId,a.channelName)}).then(function(e){return a.shortChannelId=e,n(null,a)}).catch(function(e){return o.error("signup error",e),n(e)})})},function(e,t){e.exports=require("axios")},function(e,t,n){"use strict";var r={api:{apiHost:"localhost",apiPort:"5279"}};e.exports=r},function(e,t){e.exports=require("universal-analytics")},function(e,t,n){"use strict";var r=n(2),a=n(27),l=a.returnShortId;e.exports=function(e,t){var n=t.STRING,a=t.BOOLEAN,o=t.INTEGER,i=t.TEXT,u=t.DECIMAL,s=e.define("Certificate",{address:{type:n,default:null},amount:{type:u(19,8),default:null},claimId:{type:n,default:null},claimSequence:{type:o,default:null},decodedClaim:{type:a,default:null},depth:{type:o,default:null},effectiveAmount:{type:u(19,8),default:null},hasSignature:{type:a,default:null},height:{type:o,default:null},hex:{type:i("long"),default:null},name:{type:n,default:null},nout:{type:o,default:null},txid:{type:n,default:null},validAtHeight:{type:o,default:null},outpoint:{type:n,default:null},valueVersion:{type:n,default:null},claimType:{type:n,default:null},certificateVersion:{type:n,default:null},keyType:{type:n,default:null},publicKey:{type:i("long"),default:null}},{freezeTableName:!0});return s.associate=function(e){s.belongsTo(e.Channel,{foreignKey:{allowNull:!0}})},s.getShortChannelIdFromLongChannelId=function(e,t){var n=this;return r.debug("getShortChannelIdFromLongChannelId "+t+":"+e),new Promise(function(r,a){n.findAll({where:{name:t},order:[["height","ASC"]]}).then(function(t){switch(t.length){case 0:throw new Error("No channel(s) found with that channel name");default:return r(l(t,e))}}).catch(function(e){a(e)})})},s.getLongChannelIdFromShortChannelId=function(e,t){var n=this;return r.debug("getLongChannelIdFromShortChannelId("+e+", "+t+")"),new Promise(function(r,a){n.findAll({where:{name:e,claimId:{$like:t+"%"}},order:[["height","ASC"]]}).then(function(e){switch(e.length){case 0:return r(null);default:return r(e[0].claimId)}}).catch(function(e){a(e)})})},s.getLongChannelIdFromChannelName=function(e){var t=this;return r.debug("getLongChannelIdFromChannelName("+e+")"),new Promise(function(n,r){t.findAll({where:{name:e},order:[["effectiveAmount","DESC"],["height","ASC"]]}).then(function(e){switch(e.length){case 0:return n(null);default:return n(e[0].claimId)}}).catch(function(e){r(e)})})},s.validateLongChannelId=function(e,t){var n=this;return r.debug("validateLongChannelId("+e+", "+t+")"),new Promise(function(r,a){n.findOne({where:{name:e,claimId:t}}).then(function(e){if(!e)return r(null);r(t)}).catch(function(e){a(e)})})},s.getLongChannelId=function(e,t){return r.debug("getLongChannelId("+e+", "+t+")"),t&&40===t.length?this.validateLongChannelId(e,t):t&&t.length<40?this.getLongChannelIdFromShortChannelId(e,t):this.getLongChannelIdFromChannelName(e)},s}},function(e,t,n){"use strict";e.exports=function(e,t){var n=t.STRING,r=e.define("Channel",{channelName:{type:n,allowNull:!1},channelClaimId:{type:n,allowNull:!1}},{freezeTableName:!0});return r.associate=function(e){r.belongsTo(e.User),r.hasOne(e.Certificate)},r}},function(e,t,n){"use strict";function r(e){switch(e){case"image/jpeg":case"image/jpg":return"jpeg";case"image/png":return"png";case"image/gif":return"gif";case"video/mp4":return"mp4";default:return o.debug("setting unknown file type as file extension jpeg"),"jpeg"}}function a(e,t){return""===e?t:e}function l(e){return e.thumbnail=a(e.thumbnail,c),e.fileExt=r(e.contentType),e.host=f,e}var o=n(2),i=n(27),u=i.returnShortId,s=n(5),c=s.assetDefaults.thumbnail,f=s.details.host;e.exports=function(e,t){var n=t.STRING,i=t.BOOLEAN,s=t.INTEGER,f=t.TEXT,d=t.DECIMAL,p=e.define("Claim",{address:{type:n,default:null},amount:{type:d(19,8),default:null},claimId:{type:n,default:null},claimSequence:{type:s,default:null},decodedClaim:{type:i,default:null},depth:{type:s,default:null},effectiveAmount:{type:d(19,8),default:null},hasSignature:{type:i,default:null},height:{type:s,default:null},hex:{type:f("long"),default:null},name:{type:n,default:null},nout:{type:s,default:null},txid:{type:n,default:null},validAtHeight:{type:s,default:null},outpoint:{type:n,default:null},claimType:{type:n,default:null},certificateId:{type:n,default:null},author:{type:n,default:null},description:{type:f("long"),default:null},language:{type:n,default:null},license:{type:n,default:null},licenseUrl:{type:n,default:null},nsfw:{type:i,default:null},preview:{type:n,default:null},thumbnail:{type:n,default:null},title:{type:n,default:null},metadataVersion:{type:n,default:null},contentType:{type:n,default:null},source:{type:n,default:null},sourceType:{type:n,default:null},sourceVersion:{type:n,default:null},streamVersion:{type:n,default:null},valueVersion:{type:n,default:null},channelName:{type:n,allowNull:!0,default:null}},{freezeTableName:!0});return p.associate=function(e){p.belongsTo(e.File,{foreignKey:{allowNull:!0}})},p.getShortClaimIdFromLongClaimId=function(e,t){var n=this;return o.debug("Claim.getShortClaimIdFromLongClaimId for "+t+"#"+e),new Promise(function(r,a){n.findAll({where:{name:t},order:[["height","ASC"]]}).then(function(t){switch(t.length){case 0:throw new Error("No claim(s) found with that claim name");default:r(u(t,e))}}).catch(function(e){a(e)})})},p.getAllChannelClaims=function(e){var t=this;return o.debug("Claim.getAllChannelClaims for "+e),new Promise(function(n,l){t.findAll({where:{certificateId:e},order:[["height","ASC"]],raw:!0}).then(function(e){switch(e.length){case 0:return n(null);default:return e.forEach(function(e){return e.fileExt=r(e.contentType),e.thumbnail=a(e.thumbnail,c),e}),n(e)}}).catch(function(e){l(e)})})},p.getClaimIdByLongChannelId=function(e,t){var n=this;return o.debug("finding claim id for claim "+t+" from channel "+e),new Promise(function(r,a){n.findAll({where:{name:t,certificateId:e},order:[["id","ASC"]]}).then(function(n){switch(n.length){case 0:return r(null);case 1:return r(n[0].claimId);default:return o.error(n.length+' records found for "'+t+'" in channel "'+e+'"'),r(n[0].claimId)}}).catch(function(e){a(e)})})},p.getLongClaimIdFromShortClaimId=function(e,t){var n=this;return new Promise(function(r,a){n.findAll({where:{name:e,claimId:{$like:t+"%"}},order:[["height","ASC"]]}).then(function(e){switch(e.length){case 0:return r(null);default:return r(e[0].claimId)}}).catch(function(e){a(e)})})},p.getTopFreeClaimIdByClaimName=function(e){var t=this;return new Promise(function(n,r){t.findAll({where:{name:e},order:[["effectiveAmount","DESC"],["height","ASC"]]}).then(function(e){switch(o.debug("length of result",e.length),e.length){case 0:return n(null);default:return n(e[0].dataValues.claimId)}}).catch(function(e){r(e)})})},p.validateLongClaimId=function(e,t){var n=this;return new Promise(function(r,a){n.findOne({where:{name:e,claimId:t}}).then(function(e){if(!e)return r(null);r(t)}).catch(function(e){a(e)})})},p.getLongClaimId=function(e,t){return o.debug("getLongClaimId("+e+", "+t+")"),t&&40===t.length?this.validateLongClaimId(e,t):t&&t.length<40?this.getLongClaimIdFromShortClaimId(e,t):this.getTopFreeClaimIdByClaimName(e)},p.resolveClaim=function(e,t){var n=this;return o.debug("Claim.resolveClaim: "+e+" "+t),new Promise(function(r,a){n.findAll({where:{name:e,claimId:t}}).then(function(n){switch(n.length){case 0:return r(null);case 1:return r(l(n[0].dataValues));default:return o.error("more than one record matches "+e+"#"+t+" in db.Claim"),r(l(n[0].dataValues))}}).catch(function(e){a(e)})})},p}},function(e,t,n){"use strict";e.exports=function(e,t){var n=t.STRING,r=t.BOOLEAN,a=t.INTEGER,l=e.define("File",{name:{type:n,allowNull:!1},claimId:{type:n,allowNull:!1},address:{type:n,allowNull:!1},outpoint:{type:n,allowNull:!1},height:{type:a,allowNull:!1,default:0},fileName:{type:n,allowNull:!1},filePath:{type:n,allowNull:!1},fileType:{type:n},nsfw:{type:r,allowNull:!1,defaultValue:!1},trendingEligible:{type:r,allowNull:!1,defaultValue:!0}},{freezeTableName:!0});return l.associate=function(e){l.hasMany(e.Request),l.hasOne(e.Claim)},l.getRecentClaims=function(){return this.findAll({where:{nsfw:!1,trendingEligible:!0},order:[["createdAt","DESC"]],limit:25})},l}},function(e,t,n){"use strict";e.exports=function(e,t){var n=t.STRING,r=(t.BOOLEAN,t.TEXT),a=e.define("Request",{action:{type:n,allowNull:!1},url:{type:n,allowNull:!1},ipAddress:{type:n,allowNull:!0},result:{type:r("long"),allowNull:!0,default:null}},{freezeTableName:!0});return a.associate=function(e){a.belongsTo(e.File,{foreignKey:{allowNull:!0}})},a}},function(e,t,n){"use strict";var r=n(73),a=n(2);e.exports=function(e,t){var n=t.STRING,l=e.define("User",{userName:{type:n,allowNull:!1},password:{type:n,allowNull:!1}},{freezeTableName:!0});return l.associate=function(e){l.hasOne(e.Channel)},l.prototype.comparePassword=function(e){return r.compare(e,this.password)},l.prototype.changePassword=function(e){var t=this;return new Promise(function(n,l){r.genSalt(function(o,i){if(o)return a.error("salt error",o),void l(o);r.hash(e,i,function(e,r){if(e)return a.error("hash error",e),void l(e);t.update({password:r}).then(function(){n()}).catch(function(e){l(e)})})})})},l.hook("beforeCreate",function(e,t){return a.debug("User.beforeCreate hook..."),new Promise(function(t,n){r.genSalt(function(l,o){if(l)return a.error("salt error",l),void n(l);r.hash(e.password,o,function(r,l){if(r)return a.error("hash error",r),void n(r);e.password=l,t()})})})}),l}},function(e,t){e.exports=require("bcrypt")},function(e,t,n){"use strict";var r=n(25).Strategy,a=n(2),l=n(6),o=function(e){return new Promise(function(t,n){var r={};r.id=e.id,r.userName=e.userName,e.getChannel().then(function(e){var t=e.channelName,n=e.channelClaimId;return r.channelName=t,r.channelClaimId=n,l.Certificate.getShortChannelIdFromLongChannelId(n,t)}).then(function(e){r.shortChannelId=e,t(r)}).catch(function(e){n(e)})})};e.exports=new r({usernameField:"username",passwordField:"password"},function(e,t,n){return l.User.findOne({where:{userName:e}}).then(function(e){return e?e.comparePassword(t).then(function(t){return t?(a.debug("Password was a match, returning User"),o(e).then(function(e){return n(null,e)}).catch(function(e){return e})):(a.debug("incorrect password"),n(null,!1,{message:"Incorrect username or password"}))}).catch(function(e){return e}):(a.debug("no user found"),n(null,!1,{message:"Incorrect username or password"}))}).catch(function(e){return n(e)})})},function(e,t,n){"use strict";var r=n(2),a=n(22);e.exports=function(e){e.post("/signup",a.authenticate("local-signup"),function(e,t){r.verbose("successful signup for "+e.user.channelName),t.status(200).json({success:!0,channelName:e.user.channelName,channelClaimId:e.user.channelClaimId,shortChannelId:e.user.shortChannelId})}),e.post("/login",function(e,t,n){a.authenticate("local-login",function(a,l,o){return a?n(a):l?(r.debug("successful login"),void e.logIn(l,function(r){return r?n(r):t.status(200).json({success:!0,channelName:e.user.channelName,channelClaimId:e.user.channelClaimId,shortChannelId:e.user.shortChannelId})})):t.status(400).json({success:!1,message:o.message})})(e,t,n)}),e.get("/logout",function(e,t){e.logout(),t.status(200).json({success:!0,message:"you successfully logged out"})}),e.get("/user",function(e,t){e.user?t.status(200).json({success:!0,data:e.user}):t.status(401).json({success:!1,message:"user is not logged in"})})}},function(e,t,n){"use strict";var r=function(){function e(e,t){var n=[],r=!0,a=!1,l=void 0;try{for(var o,i=e[Symbol.iterator]();!(r=(o=i.next()).done)&&(n.push(o.value),!t||n.length!==t);r=!0);}catch(e){a=!0,l=e}finally{try{!r&&i.return&&i.return()}finally{if(a)throw l}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),a=n(2),l=n(77),o=n(5),i=o.publishing.uploadDirectory,u=o.details.host,s=l({uploadDir:i}),c=n(6),f=n(78),d=f.claimNameIsAvailable,p=f.checkChannelAvailability,m=f.publish,h=n(16),b=h.getClaimList,g=h.resolveUri,v=h.getClaim,y=n(28),E=y.addGetResultsToFileData,w=y.createBasicPublishParams,_=y.createThumbnailPublishParams,C=y.parsePublishApiRequestBody,N=y.parsePublishApiRequestFiles,I=y.createFileData,O=n(29),P=n(17),S=P.sendGATimingEvent,A=n(80),T=A.authenticateUser,j=n(30),x=j.getChannelData,L=j.getChannelClaims,k=j.getClaimId;e.exports=function(e){e.get("/api/channel/availability/:name",function(e,t){var n=e.ip,r=e.originalUrl,a=e.params.name,l=Date.now();p(a).then(function(e){t.status(200).json(e),S("end-to-end","claim name availability",a,l,Date.now())}).catch(function(e){O.handleErrorResponse(r,n,e,t)})}),e.get("/api/channel/short-id/:longId/:name",function(e,t){var n=e.ip,r=e.originalUrl,a=e.params;c.Certificate.getShortChannelIdFromLongChannelId(a.longId,a.name).then(function(e){t.status(200).json(e)}).catch(function(e){O.handleErrorResponse(r,n,e,t)})}),e.get("/api/channel/data/:channelName/:channelClaimId",function(e,t){var n=e.ip,r=e.originalUrl,a=(e.body,e.params),l=a.channelName,o=a.channelClaimId;"none"===o&&(o=null),x(l,o,0).then(function(e){if("NO_CHANNEL"===e)return t.status(404).json({success:!1,message:"No matching channel was found"});t.status(200).json({success:!0,data:e})}).catch(function(e){O.handleErrorResponse(r,n,e,t)})}),e.get("/api/channel/claims/:channelName/:channelClaimId/:page",function(e,t){var n=e.ip,r=e.originalUrl,a=(e.body,e.params),l=a.channelName,o=a.channelClaimId;"none"===o&&(o=null);var i=a.page;L(l,o,i).then(function(e){if("NO_CHANNEL"===e)return t.status(404).json({success:!1,message:"No matching channel was found"});t.status(200).json({success:!0,data:e})}).catch(function(e){O.handleErrorResponse(r,n,e,t)})}),e.get("/api/claim/list/:name",function(e,t){var n=e.ip,r=e.originalUrl,a=e.params;b(a.name).then(function(e){t.status(200).json(e)}).catch(function(e){O.handleErrorResponse(r,n,e,t)})}),e.get("/api/claim/get/:name/:claimId",function(e,t){var n=e.ip,a=e.originalUrl,l=e.params,o=l.name,i=l.claimId;c.Claim.resolveClaim(o,i).then(function(e){if(!e)throw new Error("No matching uri found in Claim table");var t=I(e);return Promise.all([t,v(o+"#"+i)])}).then(function(e){var t=r(e,2),n=t[0],a=t[1];return n=E(n,a),Promise.all([c.upsert(c.File,n,{name:o,claimId:i},"File"),a])}).then(function(e){var n=r(e,2),a=(n[0],n[1]),l=a.message,o=a.completed;t.status(200).json({success:!0,message:l,completed:o})}).catch(function(e){O.handleErrorResponse(a,n,e,t)})}),e.get("/api/claim/availability/:name",function(e,t){var n=e.ip,r=e.originalUrl,a=e.params.name,l=Date.now();d(a).then(function(e){t.status(200).json(e),S("end-to-end","claim name availability",a,l,Date.now())}).catch(function(e){O.handleErrorResponse(r,n,e,t)})}),e.get("/api/claim/resolve/:name/:claimId",function(e,t){var n=(e.headers,e.ip),r=e.originalUrl,a=e.params;g(a.name+"#"+a.claimId).then(function(e){t.status(200).json(e)}).catch(function(e){O.handleErrorResponse(r,n,e,t)})}),e.post("/api/claim/publish",s,function(e,t){var n=e.body,a=e.files,l=(e.headers,e.ip),o=e.originalUrl,i=e.user,s=void 0,c=void 0,f=void 0,p=void 0,h=void 0,b=void 0,g=void 0,v=void 0,y=void 0,E=void 0,I=void 0,P=void 0,A=void 0,j=void 0,x=void 0,L=void 0;v=Date.now();try{var k=C(n);E=k.name,I=k.nsfw,y=k.license,L=k.title,p=k.description,P=k.thumbnail;var R=N(a);h=R.fileName,b=R.filePath,g=R.fileType,A=R.thumbnailFileName,j=R.thumbnailFilePath,x=R.thumbnailFileType,s=n.channelName,c=n.channelId,f=n.channelPassword}catch(e){return t.status(400).json({success:!1,message:e.message})}Promise.all([T(s,c,f,i),d(E),w(b,E,L,p,y,I,P),_(j,E,y,I)]).then(function(e){var t=r(e,4),n=t[0],a=n.channelName,l=n.channelClaimId,o=(t[1],t[2]),i=t[3];return a&&l&&(o.channel_name=a,o.channel_id=l),i&&m(i,A,x),m(o,h,g)}).then(function(e){t.status(200).json({success:!0,message:"publish completed successfully",data:{name:E,claimId:e.claim_id,url:u+"/"+e.claim_id+"/"+E,lbryTx:e}}),S("end-to-end","publish",g,v,Date.now())}).catch(function(e){O.handleErrorResponse(o,l,e,t)})}),e.get("/api/claim/short-id/:longId/:name",function(e,t){var n=e.ip,r=e.originalUrl,a=(e.body,e.params);c.Claim.getShortClaimIdFromLongClaimId(a.longId,a.name).then(function(e){t.status(200).json({success:!0,data:e})}).catch(function(e){O.handleErrorResponse(r,n,e,t)})}),e.post("/api/claim/long-id",function(e,t){var n=e.ip,r=e.originalUrl,l=e.body;e.params;a.debug("body:",l);var o=l.channelName,i=l.channelClaimId,u=l.claimName,s=l.claimId;k(o,i,u,s).then(function(e){return"NO_CHANNEL"===e?t.status(404).json({success:!1,message:"No matching channel could be found"}):"NO_CLAIM"===e?t.status(404).json({success:!1,message:"No matching claim id could be found"}):void t.status(200).json({success:!0,data:e})}).catch(function(e){O.handleErrorResponse(r,n,e,t)})}),e.get("/api/claim/data/:claimName/:claimId",function(e,t){var n=e.ip,r=e.originalUrl,a=(e.body,e.params),l=a.claimName,o=a.claimId;"none"===o&&(o=null),c.Claim.resolveClaim(l,o).then(function(e){if(!e)return t.status(404).json({success:!1,message:"No claim could be found"});t.status(200).json({success:!0,data:e})}).catch(function(e){O.handleErrorResponse(r,n,e,t)})}),e.get("/api/file/availability/:name/:claimId",function(e,t){var n=e.ip,r=e.originalUrl,a=e.params,l=a.name,o=a.claimId;c.File.findOne({where:{name:l,claimId:o}}).then(function(e){if(e)return t.status(200).json({success:!0,data:!0});t.status(200).json({success:!0,data:!1})}).catch(function(e){O.handleErrorResponse(r,n,e,t)})})}},function(e,t){e.exports=require("connect-multiparty")},function(e,t,n){"use strict";function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var a=function(){function e(e,t){var n=[],r=!0,a=!1,l=void 0;try{for(var o,i=e[Symbol.iterator]();!(r=(o=i.next()).done)&&(n.push(o.value),!t||n.length!==t);r=!0);}catch(e){a=!0,l=e}finally{try{!r&&i.return&&i.return()}finally{if(a)throw l}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),l=n(2),o=n(6),i=n(16),u=n(28),s=n(5),c=s.publishing,f=c.primaryClaimAddress,d=c.additionalClaimAddresses,p=n(26),m=p.Op;e.exports={publish:function(e,t,n){return new Promise(function(r,s){var c=void 0,f=void 0,d=void 0;return i.publishClaim(e).then(function(n){return l.info("Successfully published "+e.name+" "+t,n),c=n,e.channel_name?(l.debug("this claim was published in channel: "+e.channel_name),o.Channel.findOne({where:{channelName:e.channel_name}})):(l.debug("this claim was not published in a channel"),null)}).then(function(e){f=null,d=null,e&&(f=e.channelClaimId,d=e.channelName),l.debug("certificateId: "+f)}).then(function(){var r={name:e.name,claimId:c.claim_id,title:e.metadata.title,description:e.metadata.description,address:e.claim_address,outpoint:c.txid+":"+c.nout,height:0,fileName:t,filePath:e.file_path,fileType:n,nsfw:e.metadata.nsfw},a={name:e.name,claimId:c.claim_id,title:e.metadata.title,description:e.metadata.description,address:e.claim_address,thumbnail:e.metadata.thumbnail,outpoint:c.txid+":"+c.nout,height:0,contentType:n,nsfw:e.metadata.nsfw,amount:e.bid,certificateId:f,channelName:d},l={name:e.name,claimId:c.claim_id};return Promise.all([o.upsert(o.File,r,l,"File"),o.upsert(o.Claim,a,l,"Claim")])}).then(function(e){var t=a(e,2),n=t[0],r=t[1];return l.debug("File and Claim records successfully created"),Promise.all([n.setClaim(r),r.setFile(n)])}).then(function(){l.debug("File and Claim records successfully associated"),r(c)}).catch(function(t){l.error("PUBLISH ERROR",t),u.deleteTemporaryFile(e.file_path),s(t)})})},claimNameIsAvailable:function(e){var t=d||[];return t.push(f),o.Claim.findAll({attributes:["address"],where:{name:e,address:r({},m.or,t)}}).then(function(t){if(t.length>=1)throw new Error("That claim is already in use");return e}).catch(function(e){throw e})},checkChannelAvailability:function(e){return o.Channel.findAll({where:{channelName:e}}).then(function(t){if(t.length>=1)throw new Error("That channel has already been claimed");return e}).catch(function(e){throw e})}}},function(e,t){e.exports=require("fs")},function(e,t,n){"use strict";var r=n(6),a=n(2);e.exports={authenticateUser:function(t,n,r,a){if(!t&&!n)return{channelName:null,channelClaimId:null};if(a){if(t&&t!==a.channelName)throw new Error("the provided channel name does not match user credentials");if(n&&n!==a.channelClaimId)throw new Error("the provided channel id does not match user credentials");return{channelName:a.channelName,channelClaimId:a.channelClaimId}}if(!r)throw new Error("no channel password provided");return e.exports.authenticateChannelCredentials(t,n,r)},authenticateChannelCredentials:function(e,t,n){return new Promise(function(l,o){var i=void 0,u={};e&&(u.channelName=e),t&&(u.channelClaimId=t),r.Channel.findOne({where:u}).then(function(e){if(!e)throw a.debug("no channel found"),new Error("Authentication failed, you do not have access to that channel");return i=e.get(),a.debug("channel data:",i),r.User.findOne({where:{userName:i.channelName.substring(1)}})}).then(function(e){if(!e)throw a.debug("no user found"),new Error("Authentication failed, you do not have access to that channel");return e.comparePassword(n)}).then(function(e){if(!e)throw a.debug("incorrect password"),new Error("Authentication failed, you do not have access to that channel");a.debug("...password was a match..."),l(i)}).catch(function(e){o(e)})})}}},function(e,t,n){"use strict";e.exports={returnPaginatedChannelClaims:function(t,n,r,a){var l=e.exports.determineTotalPages(r),o=e.exports.getPageFromQuery(a);return{channelName:t,longChannelClaimId:n,claims:e.exports.extractPageFromClaims(r,o),previousPage:e.exports.determinePreviousPage(o),currentPage:o,nextPage:e.exports.determineNextPage(l,o),totalPages:l,totalResults:e.exports.determineTotalClaims(r)}},getPageFromQuery:function(e){return e?parseInt(e):1},extractPageFromClaims:function(e,t){if(!e)return[];var n=12*(t-1),r=n+12;return e.slice(n,r)},determineTotalPages:function(e){if(e){var t=e.length;if(t<12)return 1;var n=Math.floor(t/12);return 0===t%12?n:n+1}return 0},determinePreviousPage:function(e){return 1===e?null:e-1},determineNextPage:function(e,t){return t===e?null:t+1},determineTotalClaims:function(e){return e?e.length:0}}},function(e,t,n){"use strict";var r=n(5),a=r.details,l=n(31);e.exports=function(e){e.get("/",function(e,t){l(e,t)}),e.get("/login",function(e,t){l(e,t)}),e.get("/about",function(e,t){l(e,t)}),e.get("/trending",function(e,t){t.status(301).redirect("/popular")}),e.get("/popular",function(e,t){l(e,t)}),e.get("/new",function(e,t){l(e,t)}),e.get("/embed/:claimId/:name",function(e,t){var n=e.params,r=n.claimId,l=n.name;t.status(200).render("embed",{layout:"embed",host:a,claimId:r,name:l})})}},function(e,t,n){"use strict";function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:s,t=arguments[1];switch(t.type){case l.FILE_SELECTED:return Object.assign({},s,{file:t.data});case l.FILE_CLEAR:return s;case l.METADATA_UPDATE:return Object.assign({},e,{metadata:Object.assign({},e.metadata,r({},t.data.name,t.data.value))});case l.CLAIM_UPDATE:return Object.assign({},e,{claim:t.data});case l.SET_PUBLISH_IN_CHANNEL:return Object.assign({},e,{publishInChannel:t.channel});case l.PUBLISH_STATUS_UPDATE:return Object.assign({},e,{status:t.data});case l.ERROR_UPDATE:return Object.assign({},e,{error:Object.assign({},e.error,r({},t.data.name,t.data.value))});case l.SELECTED_CHANNEL_UPDATE:return Object.assign({},e,{selectedChannel:t.data});case l.TOGGLE_METADATA_INPUTS:return Object.assign({},e,{showMetadataInputs:t.data});case l.THUMBNAIL_NEW:return Object.assign({},e,{thumbnail:t.data});default:return e}};var a=n(34),l=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(a),o=n(35),i=n(5),u=i.publishing,s={disabled:u.disabled,disabledMessage:u.disabledMessage,publishInChannel:!1,selectedChannel:o.LOGIN,showMetadataInputs:!1,status:{status:null,message:null},error:{file:null,url:null,channel:null,publishSubmit:null},file:null,claim:"",metadata:{title:"",description:"",license:"",nsfw:!1},thumbnail:null}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:l,t=arguments[1];switch(t.type){case a.CHANNEL_UPDATE:return Object.assign({},e,{loggedInChannel:t.data});default:return e}};var r=n(36),a=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(r),l={loggedInChannel:{name:null,shortId:null,longId:null}}},function(e,t,n){"use strict";function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:i,t=arguments[1];switch(t.type){case l.REQUEST_ERROR:return Object.assign({},e,{request:Object.assign({},e.request,{error:t.data})});case l.REQUEST_UPDATE:return Object.assign({},e,{request:Object.assign({},e.request,{type:t.data.requestType,id:t.data.requestId})});case l.REQUEST_LIST_ADD:return Object.assign({},e,{requestList:Object.assign({},e.requestList,r({},t.data.id,{error:t.data.error,key:t.data.key}))});case l.ASSET_ADD:return Object.assign({},e,{assetList:Object.assign({},e.assetList,r({},t.data.id,{error:t.data.error,name:t.data.name,claimId:t.data.claimId,shortId:t.data.shortId,claimData:t.data.claimData}))});case l.CHANNEL_ADD:return Object.assign({},e,{channelList:Object.assign({},e.channelList,r({},t.data.id,{name:t.data.name,longId:t.data.longId,shortId:t.data.shortId,claimsData:t.data.claimsData}))});case l.CHANNEL_CLAIMS_UPDATE_SUCCESS:return Object.assign({},e,{channelList:Object.assign({},e.channelList,r({},t.data.channelListId,Object.assign({},e.channelList[t.data.channelListId],{claimsData:t.data.claimsData})))});case l.FILE_AVAILABILITY_UPDATE:return Object.assign({},e,{displayAsset:Object.assign({},e.displayAsset,{status:t.data})});case l.DISPLAY_ASSET_ERROR:return Object.assign({},e,{displayAsset:Object.assign({},e.displayAsset,{error:t.data,status:o.ERROR})});default:return e}};var a=n(12),l=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(a),o=n(37),i={request:{error:null,type:null,id:null},requestList:{},channelList:{},assetList:{},displayAsset:{error:null,status:o.LOCAL_CHECK}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:p;return arguments[1].type,e};var r=n(5),a=r.analytics.googleId,l=r.assetDefaults,o=l.thumbnail,i=l.description,u=r.details,s=u.description,c=u.host,f=u.title,d=u.twitter,p={description:s,googleAnalyticsId:a,host:c,title:f,twitter:d,defaultDescription:i,defaultThumbnail:o}},function(e,t){e.exports=require("react-ga")},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(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)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(0),s=r(u),c=n(9),f=r(c),d=n(7),p=r(d),m=n(97),h=r(m),b=function(e){function t(){return a(this,t),l(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return o(t,e),i(t,[{key:"render",value:function(){return s.default.createElement("div",{className:"row row--tall flex-container--column"},s.default.createElement(f.default,null),s.default.createElement(p.default,null),s.default.createElement("div",{className:"row row--tall row--padded flex-container--column"},s.default.createElement(h.default,null)))}}]),t}(s.default.Component);t.default=b},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(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)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(0),s=r(u),c=n(14),f=r(c),d=n(10),p=r(d),m=n(90),h=n(91),b=n(92),g=function(e){function t(){return a(this,t),l(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return o(t,e),i(t,[{key:"render",value:function(){var e=this.props,t=e.defaultDescription,n=e.defaultThumbnail,r=e.siteDescription,a=e.siteHost,l=e.siteTitle,o=e.siteTwitter,i=this.props,u=i.asset,c=i.channel,d=i.pageUri,p=this.props.pageTitle;p=(0,m.createPageTitle)(l,p);var g=(0,h.createMetaTags)(r,a,l,o,u,c,t,n),v=(0,b.createCanonicalLink)(u,c,d,a);return s.default.createElement(f.default,{title:p,meta:g,link:[{rel:"canonical",href:v}]})}}]),t}(s.default.Component);g.propTypes={pageTitle:p.default.string,pageUri:p.default.string,channel:p.default.object,asset:p.default.object},t.default=g},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.createPageTitle=function(e,t){return t?e+" - "+t:""+e}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e){switch(e.substring(e.lastIndexOf("."))){case"jpeg":case"jpg":return"image/jpeg";case"png":return"image/png";case"gif":return"image/gif";case"mp4":return"video/mp4";default:return"image/jpeg"}}return""},a=function(e,t,n,r){return[{property:"og:title",content:n},{property:"og:url",content:e},{property:"og:site_name",content:n},{property:"og:description",content:t},{property:"twitter:site",content:r},{property:"twitter:card",content:"summary"}]},l=function(e,t,n,r){var a=r.name;return[{property:"og:title",content:a+" on "+e},{property:"og:url",content:t+"/"+a+":"+r.longId},{property:"og:site_name",content:e},{property:"og:description",content:a+", a channel on "+e},{property:"twitter:site",content:n},{property:"twitter:card",content:"summary"}]},o=function(e,t,n,a,l,o){var i=a.claimData,u=i.contentType,s=e+"/"+i.claimId+"/"+i.name,c=e+"/"+i.claimId+"/"+i.name,f=e+"/"+i.claimId+"/"+i.name+"."+i.fileExt,d=i.title||i.name,p=i.description||l,m=r(i.thumbnail),h=i.thumbnail||o,b=[{property:"og:title",content:d},{property:"og:url",content:c},{property:"og:site_name",content:t},{property:"og:description",content:p},{property:"og:image:width",content:600},{property:"og:image:height",content:315},{property:"twitter:site",content:n}];return"video/mp4"===u||"video/webm"===u?(b.push({property:"og:video",content:f}),b.push({property:"og:video:secure_url",content:f}),b.push({property:"og:video:type",content:u}),b.push({property:"og:image",content:h}),b.push({property:"og:image:type",content:m}),b.push({property:"og:type",content:"video"}),b.push({property:"twitter:card",content:"player"}),b.push({property:"twitter:player",content:s}),b.push({property:"twitter:player:width",content:600}),b.push({property:"twitter:text:player_width",content:600}),b.push({property:"twitter:player:height",content:337}),b.push({property:"twitter:player:stream",content:f}),b.push({property:"twitter:player:stream:content_type",content:u})):(b.push({property:"og:image",content:f}),b.push({property:"og:image:type",content:u}),b.push({property:"og:type",content:"article"}),b.push({property:"twitter:card",content:"summary_large_image"})),b};t.createMetaTags=function(e,t,n,r,i,u,s,c){return i?o(t,n,r,i,s,c):u?l(t,n,r,u):a(e,t,n,r)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e,t){return t+"/"+e},a=function(e,t){var n=void 0,r=void 0,a=void 0,l=void 0;if(e.claimData){var o=e.claimData;n=o.channelName,r=o.certificateId,a=o.name,l=o.claimId}return n?t+"/"+n+":"+r+"/"+a:t+"/"+l+"/"+a},l=function(e,t){return t+"/"+e.name+":"+e.longId};t.createCanonicalLink=function(e,t,n,o){return e?a(e,o):t?l(t,o):r(n,o)}},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(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)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(0),s=r(u),c=n(3),f=n(94),d=r(f),p=n(95),m=r(p),h=n(11),b=r(h),g=function(e){function t(e){a(this,t);var n=l(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.checkForLoggedInUser=n.checkForLoggedInUser.bind(n),n.logoutUser=n.logoutUser.bind(n),n.handleSelection=n.handleSelection.bind(n),n}return o(t,e),i(t,[{key:"componentDidMount",value:function(){this.checkForLoggedInUser()}},{key:"checkForLoggedInUser",value:function(){var e=this,t={credentials:"include"};(0,b.default)("/user",t).then(function(t){var n=t.data;e.props.onChannelLogin(n.channelName,n.shortChannelId,n.channelClaimId)}).catch(function(e){console.log("/user error:",e.message)})}},{key:"logoutUser",value:function(){var e=this,t={credentials:"include"};(0,b.default)("/logout",t).then(function(){e.props.onChannelLogout()}).catch(function(e){console.log("/logout error",e.message)})}},{key:"handleSelection",value:function(e){switch(e.target.selectedOptions[0].value){case"LOGOUT":this.logoutUser();break;case"VIEW":this.props.history.push("/"+this.props.channelName+":"+this.props.channelLongId)}}},{key:"render",value:function(){var e=this.props.siteDescription;return s.default.createElement("div",{className:"row row--wide nav-bar"},s.default.createElement("div",{className:"row row--padded row--short flex-container--row flex-container--space-between-center"},s.default.createElement(d.default,null),s.default.createElement("div",{className:"nav-bar--center"},s.default.createElement("span",{className:"nav-bar-tagline"},e)),s.default.createElement("div",{className:"nav-bar--right"},s.default.createElement(c.NavLink,{className:"nav-bar-link link--nav",activeClassName:"link--nav-active",to:"/",exact:!0},"Publish"),s.default.createElement(c.NavLink,{className:"nav-bar-link link--nav",activeClassName:"link--nav-active",to:"/about"},"About"),this.props.channelName?s.default.createElement(m.default,{channelName:this.props.channelName,handleSelection:this.handleSelection,defaultSelection:this.props.channelName,VIEW:"VIEW",LOGOUT:"LOGOUT"}):s.default.createElement(c.NavLink,{id:"nav-bar-login-link",className:"nav-bar-link link--nav",activeClassName:"link--nav-active",to:"/login"},"Channel"))))}}]),t}(s.default.Component);t.default=(0,c.withRouter)(g)},function(e,t,n){"use strict";function r(){return l.default.createElement("svg",{version:"1.1",id:"Layer_1",x:"0px",y:"0px",height:"24px",viewBox:"0 0 80 31",enableBackground:"new 0 0 80 31",className:"nav-bar-logo"},l.default.createElement(o.Link,{to:"/"},l.default.createElement("title",null,"Logo"),l.default.createElement("desc",null,"Spee.ch logo"),l.default.createElement("g",{id:"About"},l.default.createElement("g",{id:"Publish-Form-V2-_x28_filled_x29_",transform:"translate(-42.000000, -23.000000)"},l.default.createElement("g",{id:"Group-17",transform:"translate(42.000000, 22.000000)"},l.default.createElement("text",{transform:"matrix(1 0 0 1 0 20)",fontSize:"25",fontFamily:"Roboto"},"Spee<h"),l.default.createElement("g",{id:"Group-16",transform:"translate(0.000000, 30.000000)"},l.default.createElement("path",{id:"Line-8",fill:"none",stroke:"#09F911",strokeWidth:"1",strokeLinecap:"square",d:"M0.5,1.5h15"}),l.default.createElement("path",{id:"Line-8-Copy",fill:"none",stroke:"#029D74",strokeWidth:"1",strokeLinecap:"square",d:"M16.5,1.5h15"}),l.default.createElement("path",{id:"Line-8-Copy-2",fill:"none",stroke:"#E35BD8",strokeWidth:"1",strokeLinecap:"square",d:"M32.5,1.5h15"}),l.default.createElement("path",{id:"Line-8-Copy-3",fill:"none",stroke:"#4156C5",strokeWidth:"1",strokeLinecap:"square",d:"M48.5,1.5h15"}),l.default.createElement("path",{id:"Line-8-Copy-4",fill:"none",stroke:"#635688",strokeWidth:"1",strokeLinecap:"square",d:"M64.5,1.5h15"})))))))}Object.defineProperty(t,"__esModule",{value:!0});var a=n(0),l=function(e){return e&&e.__esModule?e:{default:e}}(a),o=n(3);t.default=r},function(e,t,n){"use strict";function r(e){var t=e.channelName,n=e.handleSelection,r=e.defaultSelection,a=e.VIEW,o=e.LOGOUT;return l.default.createElement("select",{type:"text",id:"nav-bar-channel-select",className:"select select--arrow link--nav",onChange:n,value:r},l.default.createElement("option",{id:"nav-bar-channel-select-channel-option"},t),l.default.createElement("option",{value:a},"View"),l.default.createElement("option",{value:o},"Logout"))}Object.defineProperty(t,"__esModule",{value:!0});var a=n(0),l=function(e){return e&&e.__esModule?e:{default:e}}(a);t.default=r},function(e,t){e.exports=require("cross-fetch/polyfill")},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),a=n(98),l=function(e){return e&&e.__esModule?e:{default:e}}(a),o=function(e){var t=e.publish;return{disabled:t.disabled,file:t.file,status:t.status.status}};t.default=(0,r.connect)(o,null)(l.default)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(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)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(0),s=r(u),c=n(40),f=r(c),d=n(102),p=r(d),m=n(120),h=r(m),b=n(123),g=r(b),v=function(e){function t(){return a(this,t),l(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return o(t,e),i(t,[{key:"render",value:function(){return this.props.disabled?(console.log("publish is disabled"),s.default.createElement(g.default,null)):(console.log("publish is not disabled"),this.props.file?this.props.status?s.default.createElement(h.default,null):s.default.createElement(p.default,null):s.default.createElement(f.default,null))}}]),t}(s.default.Component);t.default=v},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(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)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(0),s=r(u),c=n(100),f=n(101),d=r(f),p=function(e){function t(e){a(this,t);var n=l(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.state={dragOver:!1,mouseOver:!1,dimPreview:!1},n.handleDrop=n.handleDrop.bind(n),n.handleDragOver=n.handleDragOver.bind(n),n.handleDragEnd=n.handleDragEnd.bind(n),n.handleDragEnter=n.handleDragEnter.bind(n),n.handleDragLeave=n.handleDragLeave.bind(n),n.handleMouseEnter=n.handleMouseEnter.bind(n),n.handleMouseLeave=n.handleMouseLeave.bind(n),n.handleClick=n.handleClick.bind(n),n.handleFileInput=n.handleFileInput.bind(n),n.chooseFile=n.chooseFile.bind(n),n}return o(t,e),i(t,[{key:"handleDrop",value:function(e){e.preventDefault(),this.setState({dragOver:!1});var t=e.dataTransfer;if(t.items&&"file"===t.items[0].kind){var n=t.items[0].getAsFile();this.chooseFile(n)}}},{key:"handleDragOver",value:function(e){e.preventDefault()}},{key:"handleDragEnd",value:function(e){var t=e.dataTransfer;if(t.items)for(var n=0;n<t.items.length;n++)t.items.remove(n);else e.dataTransfer.clearData()}},{key:"handleDragEnter",value:function(){this.setState({dragOver:!0,dimPreview:!0})}},{key:"handleDragLeave",value:function(){this.setState({dragOver:!1,dimPreview:!1})}},{key:"handleMouseEnter",value:function(){this.setState({mouseOver:!0,dimPreview:!0})}},{key:"handleMouseLeave",value:function(){this.setState({mouseOver:!1,dimPreview:!1})}},{key:"handleClick",value:function(e){e.preventDefault(),document.getElementById("file_input").click()}},{key:"handleFileInput",value:function(e){e.preventDefault();var t=e.target.files;this.chooseFile(t[0])}},{key:"chooseFile",value:function(e){if(e){try{(0,c.validateFile)(e)}catch(e){return this.props.setFileError(e.message)}this.props.selectFile(e)}}},{key:"render",value:function(){return s.default.createElement("div",{className:"row row--tall flex-container--column"},s.default.createElement("form",null,s.default.createElement("input",{className:"input-file",type:"file",id:"file_input",name:"file_input",accept:"video/*,image/*",onChange:this.handleFileInput,encType:"multipart/form-data"})),s.default.createElement("div",{id:"preview-dropzone",className:"row row--padded row--tall dropzone"+(this.state.dragOver?" dropzone--drag-over":""),onDrop:this.handleDrop,onDragOver:this.handleDragOver,onDragEnd:this.handleDragEnd,onDragEnter:this.handleDragEnter,onDragLeave:this.handleDragLeave,onMouseEnter:this.handleMouseEnter,onMouseLeave:this.handleMouseLeave,onClick:this.handleClick},this.props.file?s.default.createElement("div",null,s.default.createElement(d.default,{dimPreview:this.state.dimPreview,file:this.props.file,thumbnail:this.props.thumbnail}),s.default.createElement("div",{id:"dropzone-text-holder",className:"flex-container--column flex-container--center-center"},this.state.dragOver?s.default.createElement("div",{id:"dropzone-dragover"},s.default.createElement("p",{className:"blue"},"Drop it.")):null,this.state.mouseOver?s.default.createElement("div",{id:"dropzone-instructions"},s.default.createElement("p",{className:"info-message-placeholder info-message--failure",id:"input-error-file-selection"},this.props.fileError),s.default.createElement("p",null,"Drag & drop image or video here to publish"),s.default.createElement("p",{className:"fine-print"},"OR"),s.default.createElement("p",{className:"blue--underlined"},"CHOOSE FILE")):null)):s.default.createElement("div",{id:"dropzone-text-holder",className:"flex-container--column flex-container--center-center"},this.state.dragOver?s.default.createElement("div",{id:"dropzone-dragover"},s.default.createElement("p",{className:"blue"},"Drop it.")):s.default.createElement("div",{id:"dropzone-instructions"},s.default.createElement("p",{className:"info-message-placeholder info-message--failure",id:"input-error-file-selection"},this.props.fileError),s.default.createElement("p",null,"Drag & drop image or video here to publish"),s.default.createElement("p",{className:"fine-print"},"OR"),s.default.createElement("p",{className:"blue--underlined"},"CHOOSE FILE")))))}}]),t}(s.default.Component);t.default=p},function(e,t,n){"use strict";e.exports={validateFile:function(e){if(!e)throw new Error("no file provided");if(/'/.test(e.name))throw new Error("apostrophes are not allowed in the file name");switch(e.type){case"image/jpeg":case"image/jpg":case"image/png":if(e.size>1e7)throw new Error("Sorry, images are limited to 10 megabytes.");break;case"image/gif":if(e.size>5e7)throw new Error("Sorry, GIFs are limited to 50 megabytes.");break;case"video/mp4":if(e.size>5e7)throw new Error("Sorry, videos are limited to 50 megabytes.");break;default:throw new Error(e.type+" is not a supported file type. Only, .jpeg, .png, .gif, and .mp4 files are currently supported.")}}}},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(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)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(0),s=r(u),c=n(10),f=r(c),d=function(e){function t(e){a(this,t);var n=l(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.state={imgSource:"",defaultThumbnail:"/assets/img/video_thumb_default.png"},n}return o(t,e),i(t,[{key:"componentDidMount",value:function(){this.setPreviewImageSource(this.props.file)}},{key:"componentWillReceiveProps",value:function(e){e.file!==this.props.file&&this.setPreviewImageSource(e.file),e.thumbnail!==this.props.thumbnail&&(e.thumbnail?this.setPreviewImageSourceFromFile(e.thumbnail):this.setState({imgSource:this.state.defaultThumbnail}))}},{key:"setPreviewImageSourceFromFile",value:function(e){var t=this,n=new FileReader;n.readAsDataURL(e),n.onloadend=function(){t.setState({imgSource:n.result})}}},{key:"setPreviewImageSource",value:function(e){"video/mp4"!==e.type?this.setPreviewImageSourceFromFile(e):(this.props.thumbnail&&this.setPreviewImageSourceFromFile(this.props.thumbnail),this.setState({imgSource:this.state.defaultThumbnail}))}},{key:"render",value:function(){return s.default.createElement("img",{id:"dropzone-preview",src:this.state.imgSource,className:this.props.dimPreview?"dim":"",alt:"publish preview"})}}]),t}(s.default.Component);d.propTypes={dimPreview:f.default.bool.isRequired,file:f.default.object.isRequired,thumbnail:f.default.object},t.default=d},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),a=n(4),l=n(103),o=function(e){return e&&e.__esModule?e:{default:e}}(l),i=function(e){e.channel;return{file:e.publish.file}},u={clearFile:a.clearFile,startPublish:a.startPublish};t.default=(0,r.connect)(i,u)(o.default)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(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)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(0),s=r(u),c=n(3),f=n(40),d=r(f),p=n(104),m=r(p),h=n(106),b=r(h),g=n(109),v=r(g),y=n(111),E=r(y),w=n(114),_=r(w),C=function(e){function t(e){a(this,t);var n=l(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.onPublishSubmit=n.onPublishSubmit.bind(n),n}return o(t,e),i(t,[{key:"onPublishSubmit",value:function(){this.props.startPublish(this.props.history)}},{key:"render",value:function(){return s.default.createElement("div",{className:"row row--no-bottom"},s.default.createElement("div",{className:"column column--10"},s.default.createElement(m.default,null)),s.default.createElement("div",{className:"column column--5 column--sml-10"},s.default.createElement("div",{className:"row row--padded"},s.default.createElement(d.default,null))),s.default.createElement("div",{className:"column column--5 column--sml-10 align-content-top"},s.default.createElement("div",{id:"publish-active-area",className:"row row--padded"},s.default.createElement("div",{className:"row row--padded row--no-top row--wide"},s.default.createElement(b.default,null)),s.default.createElement("div",{className:"row row--padded row--no-top row--wide"},s.default.createElement(_.default,null)),"video/mp4"===this.props.file.type&&s.default.createElement("div",{className:"row row--padded row--no-top row--wide "},s.default.createElement(v.default,null)),s.default.createElement("div",{className:"row row--padded row--no-top row--no-bottom row--wide"},s.default.createElement(E.default,null)),s.default.createElement("div",{className:"row row--wide align-content-center"},s.default.createElement("button",{id:"publish-submit",className:"button--primary button--large",onClick:this.onPublishSubmit},"Publish")),s.default.createElement("div",{className:"row row--padded row--no-bottom align-content-center"},s.default.createElement("button",{className:"button--cancel",onClick:this.props.clearFile},"Cancel")),s.default.createElement("div",{className:"row row--short align-content-center"},s.default.createElement("p",{className:"fine-print"},"By clicking 'Publish', you affirm that you have the rights to publish this content to the LBRY network, and that you understand the properties of publishing it to a decentralized, user-controlled network. ",s.default.createElement("a",{className:"link--primary",target:"_blank",href:"https://lbry.io/learn"},"Read more."))))))}}]),t}(s.default.Component);t.default=(0,c.withRouter)(C)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),a=n(4),l=n(105),o=function(e){return e&&e.__esModule?e:{default:e}}(l),i=function(e){return{title:e.publish.metadata.title}},u=function(e){return{onMetadataChange:function(t,n){e((0,a.updateMetadata)(t,n))}}};t.default=(0,r.connect)(i,u)(o.default)},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(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 l(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)}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=n(0),u=function(e){return e&&e.__esModule?e:{default:e}}(i),s=function(e){function t(e){r(this,t);var n=a(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.handleInput=n.handleInput.bind(n),n}return l(t,e),o(t,[{key:"handleInput",value:function(e){var t=e.target.name,n=e.target.value;this.props.onMetadataChange(t,n)}},{key:"render",value:function(){return u.default.createElement("input",{type:"text",id:"publish-title",className:"input-text text--large input-text--full-width",name:"title",placeholder:"Give your post a title...",onChange:this.handleInput,value:this.props.title})}}]),t}(u.default.Component);t.default=s},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(4),a=n(1),l=n(107),o=function(e){return e&&e.__esModule?e:{default:e}}(l),i=function(e){var t=e.channel,n=e.publish;return{loggedInChannelName:t.loggedInChannel.name,loggedInChannelShortId:t.loggedInChannel.shortId,fileName:n.file.name,publishInChannel:n.publishInChannel,selectedChannel:n.selectedChannel,claim:n.claim,urlError:n.error.url}},u=function(e){return{onClaimChange:function(t){e((0,r.updateClaim)(t)),e((0,r.updateError)("publishSubmit",null))},onUrlError:function(t){e((0,r.updateError)("url",t))}}};t.default=(0,a.connect)(i,u)(o.default)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(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)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(0),s=r(u),c=n(11),f=r(c),d=n(108),p=r(d),m=function(e){function t(e){a(this,t);var n=l(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.handleInput=n.handleInput.bind(n),n}return o(t,e),i(t,[{key:"componentDidMount",value:function(){var e=this.props,t=e.claim,n=e.fileName;t||this.setClaimName(n)}},{key:"componentWillReceiveProps",value:function(e){var t=e.claim,n=e.fileName;if(n!==this.props.fileName)return this.setClaimName(n);t!==this.props.claim&&this.validateClaim(t)}},{key:"handleInput",value:function(e){var t=e.target.value;t=this.cleanseInput(t),this.props.onClaimChange(t)}},{key:"cleanseInput",value:function(e){return e=e.replace(/\s+/g,"-"),e=e.replace(/[^A-Za-z0-9-]/g,"")}},{key:"setClaimName",value:function(e){var t=e.substring(0,e.lastIndexOf(".")),n=this.cleanseInput(t);this.props.onClaimChange(n)}},{key:"validateClaim",value:function(e){var t=this;if(!e)return this.props.onUrlError("Enter a url above");(0,f.default)("/api/claim/availability/"+e).then(function(){t.props.onUrlError(null)}).catch(function(e){t.props.onUrlError(e.message)})}},{key:"render",value:function(){var e=this.props,t=e.claim,n=e.loggedInChannelName,r=e.loggedInChannelShortId,a=e.publishInChannel,l=e.selectedChannel,o=e.urlError;return s.default.createElement("div",{className:"column column--10 column--sml-10"},s.default.createElement("div",{className:"input-text--primary span--relative"},s.default.createElement("span",{className:"url-text--secondary"},"spee.ch / "),s.default.createElement(p.default,{publishInChannel:a,selectedChannel:l,loggedInChannelName:n,loggedInChannelShortId:r}),s.default.createElement("input",{type:"text",id:"claim-name-input",className:"input-text",name:"claim",placeholder:"your-url-here",onChange:this.handleInput,value:t}),t&&!o&&s.default.createElement("span",{id:"input-success-claim-name",className:"info-message--success span--absolute"},"✓"),o&&s.default.createElement("span",{id:"input-success-channel-name",className:"info-message--failure span--absolute"},"✖")),s.default.createElement("div",null,o?s.default.createElement("p",{id:"input-error-claim-name",className:"info-message--failure"},o):s.default.createElement("p",{className:"info-message"},"Choose a custom url")))}}]),t}(s.default.Component);t.default=m},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=e.publishInChannel,n=e.selectedChannel,r=e.loggedInChannelName,a=e.loggedInChannelShortId;return t?n===r?o.default.createElement("span",{id:"url-channel",className:"url-text--secondary"},r,":",a," /"):o.default.createElement("span",{id:"url-channel-placeholder",className:"url-text--secondary tooltip"},"@channel",o.default.createElement("span",{className:"tooltip-text"},"Select a channel below")," /"):o.default.createElement("span",{id:"url-no-channel-placeholder",className:"url-text--secondary tooltip"},"xyz",o.default.createElement("span",{className:"tooltip-text"},"This will be a random id")," /")}Object.defineProperty(t,"__esModule",{value:!0});var l=n(0),o=r(l),i=n(10),u=r(i);a.propTypes={publishInChannel:u.default.bool.isRequired,loggedInChannelName:u.default.string,loggedInChannelShortId:u.default.string},t.default=a},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),a=n(4),l=n(110),o=function(e){return e&&e.__esModule?e:{default:e}}(l),i=function(e){return{file:e.publish.file}},u={onNewThumbnail:a.onNewThumbnail};t.default=(0,r.connect)(i,u)(o.default)},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(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 l(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)}function o(e){for(var t=atob(e.split(",")[1]),n=e.split(",")[0].split(":")[1].split(";")[0],r=new Uint8Array(t.length),a=0;a<t.length;a++)r[a]=t.charCodeAt(a);return new Blob([r],{type:n})}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(0),s=function(e){return e&&e.__esModule?e:{default:e}}(u),c=function(e){function t(e){r(this,t);var n=a(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.state={videoSource:null,error:null,sliderMinRange:1,sliderMaxRange:null,sliderValue:null},n.handleVideoLoadedData=n.handleVideoLoadedData.bind(n),n.handleSliderChange=n.handleSliderChange.bind(n),n.createThumbnail=n.createThumbnail.bind(n),n}return l(t,e),i(t,[{key:"componentDidMount",value:function(){var e=this.props.file;this.setVideoSource(e)}},{key:"componentWillReceiveProps",value:function(e){if(e.file&&e.file!==this.props.file){var t=e.file;this.setVideoSource(t)}}},{key:"setVideoSource",value:function(e){var t=this,n=new FileReader;n.readAsDataURL(e),n.onloadend=function(){var e=n.result,r=o(e),a=URL.createObjectURL(r);t.setState({videoSource:a})}}},{key:"handleVideoLoadedData",value:function(e){var t=e.target.duration,n=Math.floor(t/60),r=Math.floor(t%60);this.setState({sliderMaxRange:100*t,sliderValue:100*t/2,totalMinutes:n,totalSeconds:r}),document.getElementById("video-thumb-player").currentTime=t/2}},{key:"handleSliderChange",value:function(e){var t=parseInt(e.target.value);this.setState({sliderValue:t}),document.getElementById("video-thumb-player").currentTime=t/100}},{key:"createThumbnail",value:function(){var e=document.getElementById("video-thumb-player"),t=document.createElement("canvas");t.width=e.videoWidth,t.height=e.videoHeight,t.getContext("2d").drawImage(e,0,0,t.width,t.height);var n=t.toDataURL(),r=o(n),a=new File([r],"thumbnail.png",{type:"image/png"});a&&this.props.onNewThumbnail(a)}},{key:"render",value:function(){var e=this.state,t=e.error,n=e.videoSource,r=e.sliderMinRange,a=e.sliderMaxRange,l=e.sliderValue,o=e.totalMinutes,i=e.totalSeconds;return s.default.createElement("div",null,s.default.createElement("label",{className:"label"},"Thumbnail:"),s.default.createElement("video",{id:"video-thumb-player",preload:"metadata",muted:!0,style:{display:"none"},playsInline:!0,onLoadedData:this.handleVideoLoadedData,src:n,onSeeked:this.createThumbnail}),l?s.default.createElement("div",null,s.default.createElement("div",{className:"flex-container--row flex-container--space-between-center",style:{width:"100%"}},s.default.createElement("span",{className:"info-message"},"0'00\""),s.default.createElement("span",{className:"info-message"},o,"'",i,'"')),s.default.createElement("div",null,s.default.createElement("input",{type:"range",min:r,max:a,value:l,className:"slider",onChange:this.handleSliderChange}))):s.default.createElement("p",{className:"info-message"},"loading... "),t?s.default.createElement("p",{className:"info-message--failure"},t):s.default.createElement("p",{className:"info-message"},"Use slider to set thumbnail"))}}]),t}(s.default.Component);t.default=c},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),a=n(4),l=n(112),o=function(e){return e&&e.__esModule?e:{default:e}}(l),i=function(e){var t=e.publish;return{showMetadataInputs:t.showMetadataInputs,description:t.metadata.description,license:t.metadata.license,nsfw:t.metadata.nsfw}},u=function(e){return{onMetadataChange:function(t,n){e((0,a.updateMetadata)(t,n))},onToggleMetadataInputs:function(t){e((0,a.toggleMetadataInputs)(t))}}};t.default=(0,r.connect)(i,u)(o.default)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(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)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(0),s=r(u),c=n(113),f=r(c),d=function(e){function t(e){a(this,t);var n=l(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.toggleShowInputs=n.toggleShowInputs.bind(n),n.handleInput=n.handleInput.bind(n),n.handleSelect=n.handleSelect.bind(n),n}return o(t,e),i(t,[{key:"toggleShowInputs",value:function(){this.props.onToggleMetadataInputs(!this.props.showMetadataInputs)}},{key:"handleInput",value:function(e){var t=e.target,n="checkbox"===t.type?t.checked:t.value,r=t.name;this.props.onMetadataChange(r,n)}},{key:"handleSelect",value:function(e){var t=e.target.name,n=e.target.selectedOptions[0].value;this.props.onMetadataChange(t,n)}},{key:"render",value:function(){return s.default.createElement("div",{id:"publish-details",className:"row row--padded row--no-top row--wide"},this.props.showMetadataInputs&&s.default.createElement("div",null,s.default.createElement("div",{className:"row row--no-top"},s.default.createElement("div",{className:"column column--3 column--med-10 align-content-top"},s.default.createElement("label",{htmlFor:"publish-license",className:"label"},"Description:")),s.default.createElement("div",{className:"column column--7 column--sml-10"},s.default.createElement(f.default,{id:"publish-description",className:"textarea textarea--primary textarea--full-width",rows:1,maxLength:2e3,style:{maxHeight:200},name:"description",placeholder:"Optional description",value:this.props.description,onChange:this.handleInput}))),s.default.createElement("div",{className:"row row--no-top"},s.default.createElement("div",{className:"column column--3 column--med-10"},s.default.createElement("label",{htmlFor:"publish-license",className:"label"},"License:")),s.default.createElement("div",{className:"column column--7 column--sml-10"},s.default.createElement("select",{type:"text",name:"license",id:"publish-license",className:"select select--primary",onChange:this.handleSelect},s.default.createElement("option",{value:" "},"Unspecified"),s.default.createElement("option",{value:"Public Domain"},"Public Domain"),s.default.createElement("option",{value:"Creative Commons"},"Creative Commons")))),s.default.createElement("div",{className:"row row--no-top"},s.default.createElement("div",{className:"column column--3"},s.default.createElement("label",{htmlFor:"publish-nsfw",className:"label"},"Mature:")),s.default.createElement("div",{className:"column column--7"},s.default.createElement("input",{className:"input-checkbox",type:"checkbox",id:"publish-nsfw",name:"nsfw",value:this.props.nsfw,onChange:this.handleInput})))),s.default.createElement("button",{className:"button--secondary",onClick:this.toggleShowInputs},this.props.showMetadataInputs?"less":"more"))}}]),t}(s.default.Component);t.default=d},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function a(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function l(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 i(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)}Object.defineProperty(t,"__esModule",{value:!0});var u=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),c=n(0),f=r(c),d=n(10),p=r(d),m=function(e){function t(e){l(this,t);var n=o(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n._handleChange=n._handleChange.bind(n),n}return i(t,e),s(t,[{key:"componentDidMount",value:function(){this.adjustTextarea({})}},{key:"_handleChange",value:function(e){var t=this.props.onChange;t&&t(e),this.adjustTextarea(e)}},{key:"adjustTextarea",value:function(e){var t=e.target,n=void 0===t?this.el:t;n.style.height=0,n.style.height=n.scrollHeight+"px"}},{key:"render",value:function(){var e=this,t=a(this.props,[]);return f.default.createElement("textarea",u({},t,{ref:function(t){return e.el=t},onChange:this._handleChange}))}}]),t}(c.Component);m.propTypes={onChange:p.default.func},t.default=m},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),a=n(4),l=n(115),o=function(e){return e&&e.__esModule?e:{default:e}}(l),i=function(e){var t=e.channel,n=e.publish;return{loggedInChannelName:t.loggedInChannel.name,publishInChannel:n.publishInChannel,selectedChannel:n.selectedChannel,channelError:n.error.channel}},u=function(e){return{onPublishInChannelChange:function(t){e((0,a.updateError)("channel",null)),e((0,a.setPublishInChannel)(t))},onChannelSelect:function(t){e((0,a.updateError)("channel",null)),e((0,a.updateSelectedChannel)(t))}}};t.default=(0,r.connect)(i,u)(o.default)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(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)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(0),s=r(u),c=n(41),f=r(c),d=n(42),p=r(d),m=n(35),h=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(m),b=function(e){function t(e){a(this,t);var n=l(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.toggleAnonymousPublish=n.toggleAnonymousPublish.bind(n),n.handleSelection=n.handleSelection.bind(n),n}return o(t,e),i(t,[{key:"toggleAnonymousPublish",value:function(e){"anonymous"===e.target.value?this.props.onPublishInChannelChange(!1):this.props.onPublishInChannelChange(!0)}},{key:"handleSelection",value:function(e){var t=e.target.selectedOptions[0].value;this.props.onChannelSelect(t)}},{key:"render",value:function(){return s.default.createElement("div",null,s.default.createElement("form",null,s.default.createElement("div",{className:"column column--3 column--med-10"},s.default.createElement("input",{type:"radio",name:"anonymous-or-channel",id:"anonymous-radio",className:"input-radio",value:"anonymous",checked:!this.props.publishInChannel,onChange:this.toggleAnonymousPublish}),s.default.createElement("label",{className:"label label--pointer",htmlFor:"anonymous-radio"},"Anonymous")),s.default.createElement("div",{className:"column column--7 column--med-10"},s.default.createElement("input",{type:"radio",name:"anonymous-or-channel",id:"channel-radio",className:"input-radio",value:"in a channel",checked:this.props.publishInChannel,onChange:this.toggleAnonymousPublish}),s.default.createElement("label",{className:"label label--pointer",htmlFor:"channel-radio"},"In a channel")),this.props.channelError?s.default.createElement("p",{className:"info-message--failure"},this.props.channelError):s.default.createElement("p",{className:"info-message"},"Publish anonymously or in a channel")),this.props.publishInChannel&&s.default.createElement("div",null,s.default.createElement("div",{className:"column column--3"},s.default.createElement("label",{className:"label",htmlFor:"channel-name-select"},"Channel:")),s.default.createElement("div",{className:"column column--7"},s.default.createElement("select",{type:"text",id:"channel-name-select",className:"select select--arrow",value:this.props.selectedChannel,onChange:this.handleSelection},this.props.loggedInChannelName&&s.default.createElement("option",{value:this.props.loggedInChannelName,id:"publish-channel-select-channel-option"},this.props.loggedInChannelName),s.default.createElement("option",{value:h.LOGIN},"Existing"),s.default.createElement("option",{value:h.CREATE},"New"))),this.props.selectedChannel===h.LOGIN&&s.default.createElement(f.default,null),this.props.selectedChannel===h.CREATE&&s.default.createElement(p.default,null)))}}]),t}(s.default.Component);t.default=b},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(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 i(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)}Object.defineProperty(t,"__esModule",{value:!0});var u=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),s=n(0),c=r(s),f=n(11),d=r(f),p=function(e){function t(e){l(this,t);var n=o(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.state={error:null,name:"",password:""},n.handleInput=n.handleInput.bind(n),n.loginToChannel=n.loginToChannel.bind(n),n}return i(t,e),u(t,[{key:"handleInput",value:function(e){var t=e.target.name,n=e.target.value;this.setState(a({},t,n))}},{key:"loginToChannel",value:function(e){var t=this;e.preventDefault();var n={method:"POST",body:JSON.stringify({username:this.state.name,password:this.state.password}),headers:new Headers({"Content-Type":"application/json"}),credentials:"include"};(0,d.default)("login",n).then(function(e){var n=e.success,r=e.channelName,a=e.shortChannelId,l=e.channelClaimId,o=e.message;n?t.props.onChannelLogin(r,a,l):t.setState({error:o})}).catch(function(e){e.message?t.setState({error:e.message}):t.setState({error:e})})}},{key:"render",value:function(){return c.default.createElement("form",{id:"channel-login-form"},c.default.createElement("div",{className:"row row--wide row--short"},c.default.createElement("div",{className:"column column--3 column--sml-10"},c.default.createElement("label",{className:"label",htmlFor:"channel-login-name-input"},"Name:")),c.default.createElement("div",{className:"column column--6 column--sml-10"},c.default.createElement("div",{className:"input-text--primary flex-container--row flex-container--left-bottom"},c.default.createElement("span",null,"@"),c.default.createElement("input",{type:"text",id:"channel-login-name-input",className:"input-text",name:"name",placeholder:"Your Channel Name",value:this.state.channelName,onChange:this.handleInput})))),c.default.createElement("div",{className:"row row--wide row--short"},c.default.createElement("div",{className:"column column--3 column--sml-10"},c.default.createElement("label",{className:"label",htmlFor:"channel-login-password-input"},"Password:")),c.default.createElement("div",{className:"column column--6 column--sml-10"},c.default.createElement("div",{className:"input-text--primary"},c.default.createElement("input",{type:"password",id:"channel-login-password-input",name:"password",className:"input-text",placeholder:"",value:this.state.channelPassword,onChange:this.handleInput})))),this.state.error?c.default.createElement("p",{className:"info-message--failure"},this.state.error):c.default.createElement("p",{className:"info-message"},"Enter the name and password for your channel"),c.default.createElement("div",{className:"row row--wide"},c.default.createElement("button",{className:"button--primary",onClick:this.loginToChannel},"Authenticate")))}}]),t}(c.default.Component);t.default=p},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(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 i(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)}Object.defineProperty(t,"__esModule",{value:!0});var u=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),s=n(0),c=r(s),f=n(20),d=r(f),p=n(11),m=r(p),h=function(e){function t(e){l(this,t);var n=o(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.state={error:null,channel:"",password:"",status:null},n.handleChannelInput=n.handleChannelInput.bind(n),n.handleInput=n.handleInput.bind(n),n.createChannel=n.createChannel.bind(n),n}return i(t,e),u(t,[{key:"cleanseChannelInput",value:function(e){return e=e.replace(/\s+/g,"-"),e=e.replace(/[^A-Za-z0-9-]/g,"")}},{key:"handleChannelInput",value:function(e){var t=e.target.value;t=this.cleanseChannelInput(t),this.setState({channel:t}),t?this.updateIsChannelAvailable(t):this.setState({error:"Please enter a channel name"})}},{key:"handleInput",value:function(e){var t=e.target.name,n=e.target.value;this.setState(a({},t,n))}},{key:"updateIsChannelAvailable",value:function(e){var t=this,n="@"+e;(0,m.default)("/api/channel/availability/"+n).then(function(){t.setState({error:null})}).catch(function(e){t.setState({error:e.message})})}},{key:"checkIsChannelAvailable",value:function(e){var t="@"+e;return(0,m.default)("/api/channel/availability/"+t)}},{key:"checkIsPasswordProvided",value:function(e){return new Promise(function(t,n){if(!e||e.length<1)return n(new Error("Please provide a password"));t()})}},{key:"makePublishChannelRequest",value:function(e,t){var n={method:"POST",body:JSON.stringify({username:e,password:t}),headers:new Headers({"Content-Type":"application/json"}),credentials:"include"};return new Promise(function(e,t){(0,m.default)("/signup",n).then(function(t){return e(t)}).catch(function(e){t(new Error("Unfortunately, we encountered an error while creating your channel. Please let us know in Discord! "+e.message))})})}},{key:"createChannel",value:function(e){var t=this;e.preventDefault(),this.checkIsPasswordProvided(this.state.password).then(function(){return t.checkIsChannelAvailable(t.state.channel)}).then(function(){return t.setState({status:"We are publishing your new channel.  Sit tight..."}),t.makePublishChannelRequest(t.state.channel,t.state.password)}).then(function(e){t.setState({status:null}),t.props.onChannelLogin(e.channelName,e.shortChannelId,e.channelClaimId)}).catch(function(e){e.message?t.setState({error:e.message,status:null}):t.setState({error:e,status:null})})}},{key:"render",value:function(){return c.default.createElement("div",null,this.state.status?c.default.createElement("div",null,c.default.createElement("p",{className:"fine-print"},this.state.status),c.default.createElement(d.default,{size:12})):c.default.createElement("form",{id:"publish-channel-form"},c.default.createElement("div",{className:"row row--wide row--short"},c.default.createElement("div",{className:"column column--3 column--sml-10"},c.default.createElement("label",{className:"label",htmlFor:"new-channel-name"},"Name:")),c.default.createElement("div",{className:"column column--6 column--sml-10"},c.default.createElement("div",{className:"input-text--primary flex-container--row flex-container--left-bottom span--relative"},c.default.createElement("span",null,"@"),c.default.createElement("input",{type:"text",name:"channel",id:"new-channel-name",className:"input-text",placeholder:"exampleChannelName",value:this.state.channel,onChange:this.handleChannelInput}),this.state.channel&&!this.state.error&&c.default.createElement("span",{id:"input-success-channel-name",className:"info-message--success span--absolute"},"✓"),this.state.error&&c.default.createElement("span",{id:"input-success-channel-name",className:"info-message--failure span--absolute"},"✖")))),c.default.createElement("div",{className:"row row--wide row--short"},c.default.createElement("div",{className:"column column--3 column--sml-10"},c.default.createElement("label",{className:"label",htmlFor:"new-channel-password"},"Password:")),c.default.createElement("div",{className:"column column--6 column--sml-10"},c.default.createElement("div",{className:"input-text--primary"},c.default.createElement("input",{type:"password",name:"password",id:"new-channel-password",className:"input-text",placeholder:"",value:this.state.password,onChange:this.handleInput})))),this.state.error?c.default.createElement("p",{className:"info-message--failure"},this.state.error):c.default.createElement("p",{className:"info-message"},"Choose a name and password for your channel"),c.default.createElement("div",{className:"row row--wide"},c.default.createElement("button",{className:"button--primary",onClick:this.createChannel},"Create Channel"))))}}]),t}(c.default.Component);t.default=h},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(0),a=function(e){return e&&e.__esModule?e:{default:e}}(r),l=function(){return a.default.createElement("span",{className:"progress-bar progress-bar--active"},"| ")};t.default=l},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(0),a=function(e){return e&&e.__esModule?e:{default:e}}(r),l=function(){return a.default.createElement("span",{className:"progress-bar progress-bar--inactive"},"| ")};t.default=l},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),a=n(4),l=n(121),o=function(e){return e&&e.__esModule?e:{default:e}}(l),i=function(e){var t=e.publish;return{status:t.status.status,message:t.status.message}},u={clearFile:a.clearFile};t.default=(0,r.connect)(i,u)(o.default)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(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)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(0),s=r(u),c=n(20),f=r(c),d=n(122),p=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(d),m=function(e){function t(){return a(this,t),l(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return o(t,e),i(t,[{key:"render",value:function(){var e=this.props,t=e.status,n=e.message,r=e.clearFile;return s.default.createElement("div",{className:"row row--tall flex-container--column flex-container--center-center"},t===p.LOAD_START&&s.default.createElement("div",{className:"row align-content-center"},s.default.createElement("p",null,"File is loading to server"),s.default.createElement("p",{className:"blue"},"0%")),t===p.LOADING&&s.default.createElement("div",null,s.default.createElement("div",{className:"row align-content-center"},s.default.createElement("p",null,"File is loading to server"),s.default.createElement("p",{className:"blue"},n))),t===p.PUBLISHING&&s.default.createElement("div",{className:"row align-content-center"},s.default.createElement("p",null,"Upload complete.  Your file is now being published on the blockchain..."),s.default.createElement(f.default,{size:12}),s.default.createElement("p",null,"Curious what magic is happening here? ",s.default.createElement("a",{className:"link--primary",target:"blank",href:"https://lbry.io/faq/what-is-lbry"},"Learn more."))),t===p.SUCCESS&&s.default.createElement("div",{className:"row align-content-center"},s.default.createElement("p",null,"Your publish is complete! You are being redirected to it now."),s.default.createElement("p",null,"If you are not automatically redirected, ",s.default.createElement("a",{className:"link--primary",target:"_blank",href:n},"click here."))),t===p.FAILED&&s.default.createElement("div",{className:"row align-content-center"},s.default.createElement("p",null,"Something went wrong..."),s.default.createElement("p",null,s.default.createElement("strong",null,n)),s.default.createElement("p",null,"For help, post the above error text in the #speech channel on the ",s.default.createElement("a",{className:"link--primary",href:"https://discord.gg/YjYbwhS",target:"_blank"},"lbry discord")),s.default.createElement("button",{className:"button--secondary",onClick:r},"Reset")))}}]),t}(s.default.Component);t.default=m},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.LOAD_START="LOAD_START",t.LOADING="LOADING",t.PUBLISHING="PUBLISHING",t.SUCCESS="SUCCESS",t.FAILED="FAILED"},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),a=n(124),l=function(e){return e&&e.__esModule?e:{default:e}}(a),o=function(e){return{message:e.publish.disabledMessage}};t.default=(0,r.connect)(o,null)(l.default)},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(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 l(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)}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=n(0),u=function(e){return e&&e.__esModule?e:{default:e}}(i),s=function(e){function t(){return r(this,t),a(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return l(t,e),o(t,[{key:"render",value:function(){var e=this.props.message;return console.log("this.props.message:",e),u.default.createElement("div",{className:"row dropzone--disabled row--tall flex-container--column flex-container--center-center"},u.default.createElement("p",{className:"text--disabled"},"Publishing is currently disabled."),u.default.createElement("p",{className:"text--disabled"},e))}}]),t}(u.default.Component);t.default=s},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(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)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(0),s=r(u),c=n(7),f=r(c),d=n(9),p=r(d),m=function(e){function t(){return a(this,t),l(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return o(t,e),i(t,[{key:"render",value:function(){return s.default.createElement("div",null,s.default.createElement(p.default,{pageTitle:"About",pageUri:"about"}),s.default.createElement(f.default,null),s.default.createElement("div",{className:"row row--padded"},s.default.createElement("div",{className:"column column--5 column--med-10 align-content-top"},s.default.createElement("div",{className:"column column--8 column--med-10"},s.default.createElement("p",{className:"pull-quote"},"Spee.ch is an open-source project.  Please contribute to the existing site, or fork it and make your own."),s.default.createElement("p",null,s.default.createElement("a",{className:"link--primary",target:"_blank",href:"https://twitter.com/spee_ch"},"TWITTER")),s.default.createElement("p",null,s.default.createElement("a",{className:"link--primary",target:"_blank",href:"https://github.com/lbryio/spee.ch"},"GITHUB")),s.default.createElement("p",null,s.default.createElement("a",{className:"link--primary",target:"_blank",href:"https://discord.gg/YjYbwhS"},"DISCORD CHANNEL")),s.default.createElement("p",null,s.default.createElement("a",{className:"link--primary",target:"_blank",href:"https://github.com/lbryio/spee.ch/blob/master/README.md"},"DOCUMENTATION")))),s.default.createElement("div",{className:"column column--5 column--med-10 align-content-top"},s.default.createElement("div",{className:"column column--8 column--med-10"},s.default.createElement("p",null,"Spee.ch is a media-hosting site that reads from and publishes content to the ",s.default.createElement("a",{className:"link--primary",href:"https://lbry.io"},"LBRY")," blockchain."),s.default.createElement("p",null,"Spee.ch is a hosting service, but with the added benefit that it stores your content on a decentralized network of computers -- the ",s.default.createElement("a",{className:"link--primary",href:"https://lbry.io/get"},"LBRY")," network.  This means that your images are stored in multiple locations without a single point of failure."),s.default.createElement("h3",null,"Contribute"),s.default.createElement("p",null,"If you have an idea for your own spee.ch-like site on top of LBRY, fork our ",s.default.createElement("a",{className:"link--primary",href:"https://github.com/lbryio/spee.ch"},"github repo")," and go to town!"),s.default.createElement("p",null,"If you want to improve spee.ch, join our ",s.default.createElement("a",{className:"link--primary",href:"https://discord.gg/YjYbwhS"},"discord channel")," or solve one of our ",s.default.createElement("a",{className:"link--primary",href:"https://github.com/lbryio/spee.ch/issues"},"github issues"),".")))))}}]),t}(s.default.Component);t.default=m},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),a=n(127),l=function(e){return e&&e.__esModule?e:{default:e}}(a),o=function(e){return{loggedInChannelName:e.channel.loggedInChannel.name}};t.default=(0,r.connect)(o,null)(l.default)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(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)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(0),s=r(u),c=n(3),f=n(9),d=r(f),p=n(7),m=r(p),h=n(41),b=r(h),g=n(42),v=r(g),y=function(e){function t(){return a(this,t),l(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return o(t,e),i(t,[{key:"componentWillReceiveProps",value:function(e){e.loggedInChannelName!==this.props.loggedInChannelName&&this.props.history.push("/")}},{key:"render",value:function(){return s.default.createElement("div",null,s.default.createElement(d.default,{pageTitle:"Login",pageUri:"login"}),s.default.createElement(m.default,null),s.default.createElement("div",{className:"row row--padded"},s.default.createElement("div",{className:"column column--5 column--med-10 align-content-top"},s.default.createElement("div",{className:"column column--8 column--med-10"},s.default.createElement("p",null,"Channels allow you to publish and group content under an identity. You can create a channel for yourself, or share one with like-minded friends.  You can create 1 channel, or 100, so whether you're ",s.default.createElement("a",{className:"link--primary",target:"_blank",href:"/@catalonia2017:43dcf47163caa21d8404d9fe9b30f78ef3e146a8"},"documenting important events"),", or making a public repository for ",s.default.createElement("a",{className:"link--primary",target:"_blank",href:"/@catGifs"},"cat gifs")," (password: '1234'), try creating a channel for it!"))),s.default.createElement("div",{className:"column column--5 column--med-10 align-content-top"},s.default.createElement("div",{className:"column column--8 column--med-10"},s.default.createElement("h3",{className:"h3--no-bottom"},"Log in to an existing channel:"),s.default.createElement(b.default,null),s.default.createElement("h3",{className:"h3--no-bottom"},"Create a brand new channel:"),s.default.createElement(v.default,null)))))}}]),t}(s.default.Component);t.default=(0,c.withRouter)(y)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),a=n(8),l=n(129),o=function(e){return e&&e.__esModule?e:{default:e}}(l),i=function(e){var t=e.show;return{error:t.request.error,requestType:t.request.type}},u={onHandleShowPageUri:a.onHandleShowPageUri};t.default=(0,r.connect)(i,u)(o.default)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(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)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(0),s=r(u),c=n(21),f=r(c),d=n(130),p=r(d),m=n(133),h=r(m),b=n(139),g=r(b),v=n(43),y=function(e){function t(){return a(this,t),l(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return o(t,e),i(t,[{key:"componentDidMount",value:function(){this.props.onHandleShowPageUri(this.props.match.params)}},{key:"componentWillReceiveProps",value:function(e){e.match.params!==this.props.match.params&&this.props.onHandleShowPageUri(e.match.params)}},{key:"render",value:function(){var e=this.props,t=e.error,n=e.requestType;if(t)return s.default.createElement(f.default,{error:t});switch(n){case v.CHANNEL:return s.default.createElement(g.default,null);case v.ASSET_LITE:return s.default.createElement(p.default,null);case v.ASSET_DETAILS:return s.default.createElement(h.default,null);default:return s.default.createElement("p",null,"loading...")}}}]),t}(s.default.Component);t.default=y},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),a=n(131),l=function(e){return e&&e.__esModule?e:{default:e}}(a),o=function(e){var t=e.show,n=t.request.id,r=void 0,a=t.requestList[n]||null,l=t.assetList;if(a&&l){r=l[a.key]||null}return{asset:r}};t.default=(0,r.connect)(o,null)(l.default)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(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)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(0),s=r(u),c=n(9),f=r(c),d=n(3),p=n(44),m=r(p),h=function(e){function t(){return a(this,t),l(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return o(t,e),i(t,[{key:"render",value:function(){var e=this.props.asset;if(e){var t=e.claimData,n=t.name,r=t.claimId;return s.default.createElement("div",{className:"row row--tall flex-container--column flex-container--center-center show-lite-container"},s.default.createElement(f.default,{pageTitle:n,asset:e}),s.default.createElement(m.default,null),s.default.createElement(d.Link,{id:"asset-boilerpate",className:"link--primary fine-print",to:"/"+r+"/"+n},"hosted via Spee.ch"))}return s.default.createElement("div",{className:"row row--tall row--padded flex-container--column flex-container--center-center"},s.default.createElement("p",null,"loading asset data..."))}}]),t}(s.default.Component);t.default=h},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(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)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(0),s=r(u),c=n(20),f=r(c),d=n(37),p=function(e){function t(){return a(this,t),l(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return o(t,e),i(t,[{key:"componentDidMount",value:function(){var e=this.props.asset.claimData,t=e.name,n=e.claimId;this.props.onFileRequest(t,n)}},{key:"render",value:function(){var e=this.props,t=e.status,n=e.error,r=e.asset.claimData,a=r.name,l=r.claimId,o=r.contentType,i=r.fileExt,u=r.thumbnail;return s.default.createElement("div",{id:"asset-display-component"},t===d.LOCAL_CHECK&&s.default.createElement("div",null,s.default.createElement("p",null,"Checking to see if Spee.ch has your asset locally...")),t===d.UNAVAILABLE&&s.default.createElement("div",null,s.default.createElement("p",null,"Sit tight, we're searching the LBRY blockchain for your asset!"),s.default.createElement(f.default,{size:12}),s.default.createElement("p",null,"Curious what magic is happening here? ",s.default.createElement("a",{className:"link--primary",target:"blank",href:"https://lbry.io/faq/what-is-lbry"},"Learn more."))),t===d.ERROR&&s.default.createElement("div",null,s.default.createElement("p",null,"Unfortunately, we couldn't download your asset from LBRY.  You can help us out by sharing the below error message in the ",s.default.createElement("a",{className:"link--primary",href:"https://discord.gg/YjYbwhS",target:"_blank"},"LBRY discord"),"."),s.default.createElement("i",null,s.default.createElement("p",{id:"error-message"},n))),t===d.AVAILABLE&&function(){switch(o){case"image/jpeg":case"image/jpg":case"image/png":case"image/gif":return s.default.createElement("img",{className:"asset",src:"/"+l+"/"+a+"."+i,alt:a});case"video/mp4":return s.default.createElement("video",{className:"asset video",controls:!0,poster:u},s.default.createElement("source",{src:"/"+l+"/"+a+"."+i}),s.default.createElement("p",null,"Your browser does not support the ",s.default.createElement("code",null,"video")," element."));default:return s.default.createElement("p",null,"Unsupported file type")}}())}}]),t}(s.default.Component);t.default=p},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),a=n(134),l=function(e){return e&&e.__esModule?e:{default:e}}(a),o=function(e){var t=e.show,n=t.request.id,r=void 0,a=t.requestList[n]||null,l=t.assetList;if(a&&l){r=l[a.key]||null}return{asset:r}};t.default=(0,r.connect)(o,null)(l.default)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(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)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(0),s=r(u),c=n(9),f=r(c),d=n(7),p=r(d),m=n(21),h=r(m),b=n(135),g=r(b),v=n(44),y=r(v),E=n(137),w=r(E),_=function(e){function t(){return a(this,t),l(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return o(t,e),i(t,[{key:"render",value:function(){var e=this.props.asset;if(e){var t=e.claimData.name;return s.default.createElement("div",null,s.default.createElement(f.default,{pageTitle:t+" - details",asset:e}),s.default.createElement(p.default,null),s.default.createElement("div",{className:"row row--tall row--padded"},s.default.createElement("div",{className:"column column--10"},s.default.createElement(g.default,null)),s.default.createElement("div",{className:"column column--5 column--sml-10 align-content-top"},s.default.createElement("div",{className:"row row--padded show-details-container"},s.default.createElement(y.default,null))),s.default.createElement("div",{className:"column column--5 column--sml-10 align-content-top"},s.default.createElement("div",{className:"row row--padded"},s.default.createElement(w.default,null)))))}return s.default.createElement(h.default,{error:"loading asset data..."})}}]),t}(s.default.Component);t.default=_},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),a=n(136),l=function(e){return e&&e.__esModule?e:{default:e}}(a),o=n(13),i=function(e){var t=e.show;return{title:(0,o.selectAsset)(t).claimData.title}};t.default=(0,r.connect)(i,null)(l.default)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(0),a=function(e){return e&&e.__esModule?e:{default:e}}(r),l=function(e){var t=e.title;return a.default.createElement("div",null,a.default.createElement("span",{className:"text--large"},t))};t.default=l},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),a=n(138),l=function(e){return e&&e.__esModule?e:{default:e}}(a),o=n(13),i=function(e){var t=e.show;return{asset:(0,o.selectAsset)(t)}};t.default=(0,r.connect)(i,null)(l.default)},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(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 l(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)}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=n(0),u=function(e){return e&&e.__esModule?e:{default:e}}(i),s=n(3),c=function(e){function t(e){r(this,t);var n=a(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.copyToClipboard=n.copyToClipboard.bind(n),n}return l(t,e),o(t,[{key:"copyToClipboard",value:function(e){var t=e.target.dataset.elementtocopy;document.getElementById(t).select();try{document.execCommand("copy")}catch(e){this.setState({error:"Oops, unable to copy"})}}},{key:"render",value:function(){var e=this.props.asset,t=e.shortId,n=e.claimData,r=n.channelName,a=n.certificateId,l=n.description,o=n.name,i=n.claimId,c=n.fileExt,f=n.contentType,d=n.thumbnail,p=n.host;return u.default.createElement("div",null,r&&u.default.createElement("div",{className:"row row--padded row--wide row--no-top"},u.default.createElement("div",{className:"column column--2 column--med-10"},u.default.createElement("span",{className:"text"},"Channel:")),u.default.createElement("div",{className:"column column--8 column--med-10"},u.default.createElement("span",{className:"text"},u.default.createElement(s.Link,{to:"/"+r+":"+a},r)))),l&&u.default.createElement("div",{className:"row row--padded row--wide row--no-top"},u.default.createElement("span",{className:"text"},l)),u.default.createElement("div",{id:"show-share-buttons"},u.default.createElement("div",{className:"row row--padded row--wide row--no-top"},u.default.createElement("div",{className:"column column--2 column--med-10"},u.default.createElement("span",{className:"text"},"Share:")),u.default.createElement("div",{className:"column column--8 column--med-10"},u.default.createElement("div",{className:"row row--short row--wide flex-container--row flex-container--space-between-bottom flex-container--wrap"},u.default.createElement("a",{className:"link--primary",target:"_blank",href:"https://twitter.com/intent/tweet?text="+p+"/"+t+"/"+o},"twitter"),u.default.createElement("a",{className:"link--primary",target:"_blank",href:"https://www.facebook.com/sharer/sharer.php?u="+p+"/"+t+"/"+o},"facebook"),u.default.createElement("a",{className:"link--primary",target:"_blank",href:"http://tumblr.com/widgets/share/tool?canonicalUrl="+p+"/"+t+"/"+o},"tumblr"),u.default.createElement("a",{className:"link--primary",target:"_blank",href:"https://www.reddit.com/submit?url="+p+"/"+t+"/"+o+"&title="+o},"reddit"))))),u.default.createElement("div",{className:"row row--padded row--wide row--no-top"},u.default.createElement("div",{id:"show-short-link"},u.default.createElement("div",{className:"column column--2 column--med-10"},u.default.createElement("span",{className:"text"},"Link:")),u.default.createElement("div",{className:"column column--8 column--med-10"},u.default.createElement("div",{className:"row row--short row--wide"},u.default.createElement("div",{className:"column column--7"},u.default.createElement("div",{className:"input-error",id:"input-error-copy-short-link",hidden:"true"},"error here"),u.default.createElement("input",{type:"text",id:"short-link",className:"input-disabled input-text--full-width",readOnly:!0,spellCheck:"false",value:p+"/"+t+"/"+o+"."+c,onClick:this.select})),u.default.createElement("div",{className:"column column--1"}),u.default.createElement("div",{className:"column column--2"},u.default.createElement("button",{className:"button--primary button--wide","data-elementtocopy":"short-link",onClick:this.copyToClipboard},"copy"))))),u.default.createElement("div",{id:"show-embed-code"},u.default.createElement("div",{className:"column column--2 column--med-10"},u.default.createElement("span",{className:"text"},"Embed:")),u.default.createElement("div",{className:"column column--8 column--med-10"},u.default.createElement("div",{className:"row row--short row--wide"},u.default.createElement("div",{className:"column column--7"},u.default.createElement("div",{className:"input-error",id:"input-error-copy-embed-text",hidden:"true"},"error here"),"video/mp4"===f?u.default.createElement("input",{type:"text",id:"embed-text",className:"input-disabled input-text--full-width",readOnly:!0,onClick:this.select,spellCheck:"false",value:'<video width="100%" controls poster="'+d+'" src="'+p+"/"+i+"/"+o+"."+c+'"/></video>'}):u.default.createElement("input",{type:"text",id:"embed-text",className:"input-disabled input-text--full-width",readOnly:!0,onClick:this.select,spellCheck:"false",value:'<img src="'+p+"/"+i+"/"+o+"."+c+'"/>'})),u.default.createElement("div",{className:"column column--1"}),u.default.createElement("div",{className:"column column--2"},u.default.createElement("button",{className:"button--primary button--wide","data-elementtocopy":"embed-text",onClick:this.copyToClipboard},"copy")))))),u.default.createElement("div",{className:"flex-container--row flex-container--space-between-bottom"},u.default.createElement(s.Link,{className:"link--primary",to:"/"+t+"/"+o+"."+c},u.default.createElement("span",{className:"text"},"Direct Link")),u.default.createElement("a",{className:"link--primary",href:p+"/"+i+"/"+o+"."+c,download:o},"Download"),u.default.createElement("a",{className:"link--primary",target:"_blank",href:"https://lbry.io/dmca"},"Report")))}}]),t}(u.default.Component);t.default=c},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),a=n(140),l=function(e){return e&&e.__esModule?e:{default:e}}(a),o=function(e){var t=e.show,n=t.request.id,r=t.requestList[n]||null,a=void 0;if(r){var l=r.key;a=t.channelList[l]||null}return{channel:a}};t.default=(0,r.connect)(o,null)(l.default)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(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)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(0),s=r(u),c=n(9),f=r(c),d=n(21),p=r(d),m=n(7),h=r(m),b=n(141),g=r(b),v=function(e){function t(){return a(this,t),l(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return o(t,e),i(t,[{key:"render",value:function(){var e=this.props.channel;if(e){var t=e.name,n=e.longId,r=e.shortId;return s.default.createElement("div",null,s.default.createElement(f.default,{pageTitle:t,channel:e}),s.default.createElement(h.default,null),s.default.createElement("div",{className:"row row--tall row--padded"},s.default.createElement("div",{className:"column column--10"},s.default.createElement("h2",null,"channel name: ",t),s.default.createElement("p",{className:"fine-print"},"full channel id: ",n),s.default.createElement("p",{className:"fine-print"},"short channel id: ",r)),s.default.createElement("div",{className:"column column--10"},s.default.createElement(g.default,null))))}return s.default.createElement(p.default,{error:"loading channel data..."})}}]),t}(s.default.Component);t.default=v},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),a=n(8),l=n(142),o=function(e){return e&&e.__esModule?e:{default:e}}(l),i=function(e){var t=e.show,n=t.requestList[t.request.id],r=n.key;return{channelKey:r,channel:t.channelList[r]||null}},u={onUpdateChannelClaims:a.onUpdateChannelClaims};t.default=(0,r.connect)(i,u)(o.default)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(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)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(0),s=r(u),c=n(143),f=r(c),d=function(e){function t(e){a(this,t);var n=l(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.showNextResultsPage=n.showNextResultsPage.bind(n),n.showPreviousResultsPage=n.showPreviousResultsPage.bind(n),n}return o(t,e),i(t,[{key:"showPreviousResultsPage",value:function(){var e=this.props.channel.claimsData.currentPage,t=parseInt(e)-1;this.showNewPage(t)}},{key:"showNextResultsPage",value:function(){var e=this.props.channel.claimsData.currentPage,t=parseInt(e)+1;this.showNewPage(t)}},{key:"showNewPage",value:function(e){var t=this.props,n=t.channelKey,r=t.channel,a=r.name,l=r.longId;this.props.onUpdateChannelClaims(n,a,l,e)}},{key:"render",value:function(){var e=this.props.channel.claimsData,t=e.claims,n=e.currentPage,r=e.totalPages;return s.default.createElement("div",{className:"row row--tall"},t.length>0?s.default.createElement("div",null,t.map(function(e,t){return s.default.createElement(f.default,{claimData:e,key:e.name+"-"+t})}),s.default.createElement("div",null,n>1&&s.default.createElement("button",{className:"button--secondary",onClick:this.showPreviousResultsPage},"Previous Page"),n<r&&s.default.createElement("button",{className:"button--secondary",onClick:this.showNextResultsPage},"Next Page"))):s.default.createElement("p",null,"There are no claims in this channel"))}}]),t}(s.default.Component);t.default=d},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),a=n(144),l=function(e){return e&&e.__esModule?e:{default:e}}(a),o=function(e){return{defaultThumbnail:e.site.defaults.defaultThumbnail}};t.default=(0,r.connect)(o,null)(l.default)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(0),a=function(e){return e&&e.__esModule?e:{default:e}}(r),l=n(3),o=function(e){var t=e.defaultThumbnail,n=e.claimData,r=n.name,o=n.claimId,i=n.fileExt,u=n.contentType,s=n.thumbnail,c=o+"/"+r+"."+i,f="/"+o+"/"+r;return a.default.createElement("div",{className:"asset-holder"},a.default.createElement(l.Link,{to:f},function(){switch(u){case"image/jpeg":case"image/jpg":case"image/png":case"image/gif":return a.default.createElement("img",{className:"asset-preview",src:c,alt:r});case"video/mp4":return a.default.createElement("img",{className:"asset-preview video",src:s||t,alt:r});default:return a.default.createElement("p",null,"unsupported file type")}}()))};t.default=o},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),a=n(146),l=function(e){return e&&e.__esModule?e:{default:e}}(a),o=function(e){var t=e.site;return{host:t.host,title:t.title}};t.default=(0,r.connect)(o,null)(l.default)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(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)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(0),s=r(u),c=n(7),f=r(c),d=n(14),p=r(d),m=function(e){function t(){return a(this,t),l(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return o(t,e),i(t,[{key:"render",value:function(){var e=this.props,t=e.title,n=e.host;return s.default.createElement("div",null,s.default.createElement(p.default,null,s.default.createElement("title",null,t," - 404"),s.default.createElement("link",{rel:"canonical",href:n+"/404"})),s.default.createElement(f.default,null),s.default.createElement("div",{className:"row row--padded"},s.default.createElement("h2",null,"404"),s.default.createElement("p",null,"That page does not exist")))}}]),t}(s.default.Component);t.default=m},function(e,t,n){"use strict";var r=function(){function e(e,t){var n=[],r=!0,a=!1,l=void 0;try{for(var o,i=e[Symbol.iterator]();!(r=(o=i.next()).done)&&(n.push(o.value),!t||n.length!==t);r=!0);}catch(e){a=!0,l=e}finally{try{!r&&i.return&&i.return()}finally{if(a)throw l}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),a=n(17),l=a.sendGAServeEvent,o=n(148),i=o.determineResponseType,u=o.flipClaimNameAndIdForBackwardsCompatibility,s=o.logRequestData,c=o.getClaimIdAndServeAsset,f=n(149),d=n(150);e.exports=function(e){e.get("/:identifier/:claim",function(e,t){var n=e.headers,a=e.ip,o=e.originalUrl,p=e.params,m=void 0;try{m=f.parseModifier(p.claim).hasFileExtension}catch(e){return t.status(400).json({success:!1,message:e.message})}var h=i(m,n);if("SERVE"!==h)return d(e,t);l(n,a,o);var b=void 0;try{b=f.parseClaim(p.claim).claimName}catch(e){return t.status(400).json({success:!1,message:e.message})}var g=void 0,v=void 0,y=void 0,E=void 0;try{var w=f.parseIdentifier(p.identifier);g=w.isChannel,v=w.channelName,y=w.channelClaimId,E=w.claimId}catch(e){return t.status(400).json({success:!1,message:e.message})}if(!g){var _=u(E,b),C=r(_,2);E=C[0],b=C[1]}s(h,b,v,E),c(v,y,b,E,o,a,t)}),e.get("/:claim",function(e,t){var n=e.headers,r=e.ip,a=e.originalUrl,o=e.params,u=void 0;try{u=f.parseModifier(o.claim).hasFileExtension}catch(e){return t.status(400).json({success:!1,message:e.message})}var p=i(u,n);if("SERVE"!==p)return d(e,t);l(n,r,a);var m=void 0;try{m=f.parseClaim(o.claim).claimName}catch(e){return t.status(400).json({success:!1,message:e.message})}s(p,m,null,null),c(null,null,m,null,a,r,t)})}},function(e,t,n){"use strict";function r(e){var t=e.accept;return t&&t.match(/text\/html/)}function a(e){return e["user-agent"]&&e["user-agent"].match(/Mozilla/)}function l(e){var t=e.accept,n=e.range,r=t&&t.match(/image\/.*/)&&!t.match(/text\/html/)&&!t.match(/text\/\*/),a=t&&n;return r||a}function o(e){return 40===e.length&&!/[^A-Za-z0-9]/g.test(e)}function i(e){return 1===e.length}function u(e){return o(e)||i(e)}function s(e,t,n){return p(e,t).then(function(r){if(r===b)return n.status(307).redirect("/api/claim/get/"+t+"/"+e);var a=r.filePath,l=r.fileType;c.verbose("serving file: "+a);var o={headers:{"X-Content-Type-Options":"nosniff","Content-Type":l||"image/jpeg"}};n.status(200).sendFile(a,o)}).catch(function(e){throw e})}var c=n(2),f=n(30),d=f.getClaimId,p=f.getLocalFileRecord,m=n(29),h=m.handleErrorResponse,b="NO_FILE";e.exports={getClaimIdAndServeAsset:function(e,t,n,r,a,l,o){d(e,t,n,r).then(function(e){return"NO_CLAIM"===e?o.status(404).json({success:!1,message:"no claim id could be found"}):"NO_CHANNEL"===e?o.status(404).json({success:!1,message:"no channel id could be found"}):void s(e,n,o)}).catch(function(e){h(a,l,e,o)})},determineResponseType:function(e,t){var n=void 0;return e?(n="SERVE",r(t)&&(n="SHOW")):(n="SHOW",l(t)&&a(t)&&(c.debug("Show request came from browser but wants an image/video. Changing response to serve..."),n="SERVE")),n},flipClaimNameAndIdForBackwardsCompatibility:function(e,t){if(u(t)&&!u(e)){var n=t;t=e,e=n}return[e,t]},logRequestData:function(e,t,n,r){c.debug("responseType ===",e),c.debug("claim name === ",t),c.debug("channel name ===",n),c.debug("claim id ===",r)}}},function(e,t,n){"use strict";var r=function(){function e(e,t){var n=[],r=!0,a=!1,l=void 0;try{for(var o,i=e[Symbol.iterator]();!(r=(o=i.next()).done)&&(n.push(o.value),!t||n.length!==t);r=!0);}catch(e){a=!0,l=e}finally{try{!r&&i.return&&i.return()}finally{if(a)throw l}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),a=n(2);e.exports={REGEXP_INVALID_CLAIM:/[^A-Za-z0-9-]/g,REGEXP_INVALID_CHANNEL:/[^A-Za-z0-9-@]/g,REGEXP_ADDRESS:/^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/,CHANNEL_CHAR:"@",parseIdentifier:function(t){a.debug("parsing identifier:",t);var n=new RegExp("([^:$#/]*)([:$#]?)([^/]*)"),l=n.exec(t).map(function(e){return e||null}),o=r(l,4),i=o[0],u=o[1],s=o[2],c=o[3];if(a.debug(i+", "+u+", "+s+", "+c),!u)throw new Error('Check your url.  No channel name provided before "'+s+'"');var f=u.startsWith(e.exports.CHANNEL_CHAR),d=f?u:null,p=void 0;if(f){if(!d)throw new Error("No channel name after @.");var m=d.match(e.exports.REGEXP_INVALID_CHANNEL);if(m)throw new Error("Invalid characters in channel name: "+m.join(", ")+".")}else p=u;var h=void 0;if(s){if(!c)throw new Error('No modifier provided after separator "'+s+'"');if(":"!==s)throw new Error('The "'+s+'" modifier is not currently supported');h=c}return{isChannel:f,channelName:d,channelClaimId:h,claimId:p}},parseClaim:function(t){a.debug("parsing name:",t);var n=new RegExp("([^:$#/.]*)([:$#.]?)([^/]*)"),l=n.exec(t).map(function(e){return e||null}),o=r(l,4),i=o[0],u=o[1],s=o[2],c=o[3];if(a.debug(i+", "+u+", "+s+", "+c),!u)throw new Error("No claim name provided before .");var f=u.match(e.exports.REGEXP_INVALID_CLAIM);if(f)throw new Error("Invalid characters in claim name: "+f.join(", ")+".");if(s){if(!c)throw new Error("No file extension provided after separator "+s+".");if("."!==s)throw new Error("The "+s+" modifier is not supported in the claim name")}return{claimName:u}},parseModifier:function(e){a.debug("parsing modifier:",e);var t=new RegExp("([^:$#/.]*)([:$#.]?)([^/]*)"),n=t.exec(e).map(function(e){return e||null}),l=r(n,4),o=l[0],i=l[1],u=l[2],s=l[3];a.debug(o+", "+i+", "+u+", "+s);var c=!1;return u&&(c=!0),{hasFileExtension:c}}}},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}var a=n(0),l=r(a),o=n(32),i=n(18),u=n(33),s=r(u),c=n(1),f=n(3),d=n(38),p=r(d),m=n(39),h=r(m),b=n(45),g=r(b),v=n(151),y=r(v),E=n(15),w=n(152),_=n(8),C=n(14),N=r(C),I=function(e,t){return regeneratorRuntime.mark(function n(){return regeneratorRuntime.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,(0,E.call)(e,t);case 2:case"end":return n.stop()}},n,this)})};e.exports=function(e,t){var n={},r=(0,y.default)(),a=(0,i.applyMiddleware)(r),u=(0,i.createStore)(s.default,a),d=(0,_.onHandleShowPageUri)(e.params),m=I(w.handleShowPageUri,d);r.run(m).done.then(function(){var r=(0,o.renderToString)(l.default.createElement(c.Provider,{store:u},l.default.createElement(f.StaticRouter,{location:e.url,context:n},l.default.createElement(p.default,null,l.default.createElement(h.default,null))))),a=N.default.renderStatic();if(n.url)return t.redirect(301,n.url);var i=u.getState();t.send((0,g.default)(a,r,i))})}},function(e,t){e.exports=require("redux-saga")},function(e,t,n){"use strict";function r(e,t){var n,r,a,l,o,u,s,d;return regeneratorRuntime.wrap(function(p){for(;;)switch(p.prev=p.next){case 0:n=void 0,r=void 0,a=void 0,l=void 0,o=void 0,u=void 0,p.prev=1,s=m.default.parseIdentifier(e),n=s.isChannel,r=s.channelName,a=s.channelClaimId,l=s.claimId,d=m.default.parseClaim(t),o=d.claimName,u=d.extension,p.next=17;break;case 12:return p.prev=12,p.t0=p.catch(1),p.next=16,(0,i.put)((0,c.onRequestError)(p.t0.message));case 16:return p.abrupt("return",p.sent);case 17:if(!n){p.next=21;break}return p.next=20,(0,i.call)(f.newAssetRequest,(0,c.onNewAssetRequest)(o,null,r,a,u));case 20:return p.abrupt("return",p.sent);case 21:return p.next=24,(0,i.call)(f.newAssetRequest,(0,c.onNewAssetRequest)(o,l,null,null,u));case 24:case"end":return p.stop()}},h,this,[[1,12]])}function a(e){var t,n,r,a,l,o,u;return regeneratorRuntime.wrap(function(s){for(;;)switch(s.prev=s.next){case 0:t=void 0,n=void 0,r=void 0,s.prev=1,a=m.default.parseIdentifier(e),t=a.isChannel,n=a.channelName,r=a.channelClaimId,s.next=13;break;case 8:return s.prev=8,s.t0=s.catch(1),s.next=12,(0,i.put)((0,c.onRequestError)(s.t0.message));case 12:return s.abrupt("return",s.sent);case 13:if(!t){s.next=17;break}return s.next=16,(0,i.call)(d.newChannelRequest,(0,c.onNewChannelRequest)(n,r));case 16:return s.abrupt("return",s.sent);case 17:l=void 0,o=void 0,s.prev=18,u=m.default.parseClaim(e),l=u.claimName,o=u.extension,s.next=29;break;case 24:return s.prev=24,s.t1=s.catch(18),s.next=28,(0,i.put)((0,c.onRequestError)(s.t1.message));case 28:return s.abrupt("return",s.sent);case 29:return s.next=31,(0,i.call)(f.newAssetRequest,(0,c.onNewAssetRequest)(l,null,null,null,o));case 31:case"end":return s.stop()}},b,this,[[1,8],[18,24]])}function l(e){var t,n,l;return regeneratorRuntime.wrap(function(o){for(;;)switch(o.prev=o.next){case 0:if(t=e.data,n=t.identifier,l=t.claim,!n){o.next=5;break}return o.next=4,(0,i.call)(r,n,l);case 4:return o.abrupt("return",o.sent);case 5:return o.next=7,(0,i.call)(a,l);case 7:case"end":return o.stop()}},g,this)}function o(){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,(0,i.takeLatest)(s.HANDLE_SHOW_URI,l);case 2:case"end":return e.stop()}},v,this)}Object.defineProperty(t,"__esModule",{value:!0}),t.handleShowPageUri=l,t.watchHandleShowPageUri=o;var i=n(15),u=n(12),s=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(u),c=n(8),f=n(153),d=n(155),p=n(157),m=function(e){return e&&e.__esModule?e:{default:e}}(p),h=regeneratorRuntime.mark(r),b=regeneratorRuntime.mark(a),g=regeneratorRuntime.mark(l),v=regeneratorRuntime.mark(o)},function(e,t,n){"use strict";function r(e){var t,n,r,a,o,i,p,m,h,b,g,v,y,E;return regeneratorRuntime.wrap(function(d){for(;;)switch(d.prev=d.next){case 0:return t=e.data,n=t.requestType,r=t.requestId,a=t.name,o=t.modifier,d.next=3,(0,l.put)((0,u.onRequestUpdate)(n,r));case 3:return d.next=5,(0,l.select)(c.selectShowState);case 5:return i=d.sent,d.next=8,(0,l.select)(f.selectSiteHost);case 8:if(p=d.sent,!i.requestList[r]){d.next=11;break}return d.abrupt("return",null);case 11:return m=void 0,d.prev=12,d.next=15,(0,l.call)(s.getLongClaimId,p,a,o);case 15:h=d.sent,m=h.data,d.next=24;break;case 19:return d.prev=19,d.t0=d.catch(12),d.next=23,(0,l.put)((0,u.onRequestError)(d.t0.message));case 23:return d.abrupt("return",d.sent);case 24:return b="a#"+a+"#"+m,d.next=27,(0,l.put)((0,u.addRequestToRequestList)(r,null,b));case 27:if(!i.assetList[b]){d.next=29;break}return d.abrupt("return",null);case 29:return g=void 0,d.prev=30,d.next=33,(0,l.call)(s.getShortId,p,a,m);case 33:v=d.sent,g=v.data,d.next=42;break;case 37:return d.prev=37,d.t1=d.catch(30),d.next=41,(0,l.put)((0,u.onRequestError)(d.t1.message));case 41:return d.abrupt("return",d.sent);case 42:return y=void 0,d.prev=43,d.next=46,(0,l.call)(s.getClaimData,p,a,m);case 46:E=d.sent,y=E.data,d.next=55;break;case 50:return d.prev=50,d.t2=d.catch(43),d.next=54,(0,l.put)((0,u.onRequestError)(d.t2.message));case 54:return d.abrupt("return",d.sent);case 55:return d.next=57,(0,l.put)((0,u.addAssetToAssetList)(b,null,a,m,g,y));case 57:return d.next=59,(0,l.put)((0,u.onRequestError)(null));case 59:case"end":return d.stop()}},d,this,[[12,19],[30,37],[43,50]])}function a(){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,(0,l.takeLatest)(i.ASSET_REQUEST_NEW,r);case 2:case"end":return e.stop()}},p,this)}Object.defineProperty(t,"__esModule",{value:!0}),t.newAssetRequest=r,t.watchNewAssetRequest=a;var l=n(15),o=n(12),i=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(o),u=n(8),s=n(154),c=n(13),f=n(46),d=regeneratorRuntime.mark(r),p=regeneratorRuntime.mark(a)},function(e,t,n){"use strict";function r(e,t,n){var r={};n&&(n.id?r.claimId=n.id:(r.channelName=n.channel.name,r.channelClaimId=n.channel.id)),r.claimName=t;var a={method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},l=e+"/api/claim/long-id";return(0,i.default)(l,a)}function a(e,t,n){var r=e+"/api/claim/short-id/"+n+"/"+t;return(0,i.default)(r)}function l(e,t,n){var r=e+"/api/claim/data/"+t+"/"+n;return(0,i.default)(r)}Object.defineProperty(t,"__esModule",{value:!0}),t.getLongClaimId=r,t.getShortId=a,t.getClaimData=l;var o=n(11),i=function(e){return e&&e.__esModule?e:{default:e}}(o)},function(e,t,n){"use strict";function r(e){var t,n,r,a,l,o,u,s,h,b,g,v,y,E;return regeneratorRuntime.wrap(function(m){for(;;)switch(m.prev=m.next){case 0:return t=e.data,n=t.requestType,r=t.requestId,a=t.channelName,l=t.channelId,m.next=3,(0,i.put)((0,c.onRequestUpdate)(n,r));case 3:return m.next=5,(0,i.select)(d.selectShowState);case 5:return o=m.sent,m.next=8,(0,i.select)(p.selectSiteHost);case 8:if(u=m.sent,!o.requestList[r]){m.next=11;break}return m.abrupt("return",null);case 11:return s=void 0,h=void 0,m.prev=12,m.next=15,(0,i.call)(f.getChannelData,u,a,l);case 15:b=m.sent,g=b.data,s=g.longChannelClaimId,h=g.shortChannelClaimId,m.next=26;break;case 21:return m.prev=21,m.t0=m.catch(12),m.next=25,(0,i.put)((0,c.onRequestError)(m.t0.message));case 25:return m.abrupt("return",m.sent);case 26:return v="c#"+a+"#"+s,m.next=29,(0,i.put)((0,c.addRequestToRequestList)(r,null,v));case 29:if(!o.channelList[v]){m.next=31;break}return m.abrupt("return",null);case 31:return y=void 0,m.prev=32,m.next=35,(0,i.call)(f.getChannelClaims,u,s,a,1);case 35:E=m.sent,y=E.data,m.next=44;break;case 39:return m.prev=39,m.t1=m.catch(32),m.next=43,(0,i.put)((0,c.onRequestError)(m.t1.message));case 43:return m.abrupt("return",m.sent);case 44:return m.next=46,(0,i.put)((0,c.addNewChannelToChannelList)(v,a,h,s,y));case 46:return m.next=48,(0,i.put)((0,c.onRequestError)(null));case 48:case"end":return m.stop()}},m,this,[[12,21],[32,39]])}function a(){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,(0,i.takeLatest)(s.CHANNEL_REQUEST_NEW,r);case 2:case"end":return e.stop()}},h,this)}function l(e){var t,n,r,a,l,o,u,s;return regeneratorRuntime.wrap(function(d){for(;;)switch(d.prev=d.next){case 0:return t=e.data,n=t.channelKey,r=t.name,a=t.longId,l=t.page,d.next=3,(0,i.select)(p.selectSiteHost);case 3:return o=d.sent,u=void 0,d.prev=5,d.next=8,(0,i.call)(f.getChannelClaims,o,a,r,l);case 8:s=d.sent,u=s.data,d.next=17;break;case 12:return d.prev=12,d.t0=d.catch(5),d.next=16,(0,i.put)((0,c.onRequestError)(d.t0.message));case 16:return d.abrupt("return",d.sent);case 17:return d.next=19,(0,i.put)((0,c.updateChannelClaims)(n,u));case 19:case"end":return d.stop()}},b,this,[[5,12]])}function o(){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,(0,i.takeLatest)(s.CHANNEL_CLAIMS_UPDATE_ASYNC,l);case 2:case"end":return e.stop()}},g,this)}Object.defineProperty(t,"__esModule",{value:!0}),t.newChannelRequest=r,t.watchNewChannelRequest=a,t.watchUpdateChannelClaims=o;var i=n(15),u=n(12),s=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(u),c=n(8),f=n(156),d=n(13),p=n(46),m=regeneratorRuntime.mark(r),h=regeneratorRuntime.mark(a),b=regeneratorRuntime.mark(l),g=regeneratorRuntime.mark(o)},function(e,t,n){"use strict";function r(e,t,n){t||(t="none");var r=e+"/api/channel/data/"+n+"/"+t;return(0,o.default)(r)}function a(e,t,n,r){r||(r=1);var a=e+"/api/channel/claims/"+n+"/"+t+"/"+r;return(0,o.default)(a)}Object.defineProperty(t,"__esModule",{value:!0}),t.getChannelData=r,t.getChannelClaims=a;var l=n(11),o=function(e){return e&&e.__esModule?e:{default:e}}(l)},function(e,t,n){"use strict";var r=function(){function e(e,t){var n=[],r=!0,a=!1,l=void 0;try{for(var o,i=e[Symbol.iterator]();!(r=(o=i.next()).done)&&(n.push(o.value),!t||n.length!==t);r=!0);}catch(e){a=!0,l=e}finally{try{!r&&i.return&&i.return()}finally{if(a)throw l}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();e.exports={REGEXP_INVALID_CLAIM:/[^A-Za-z0-9-]/g,REGEXP_INVALID_CHANNEL:/[^A-Za-z0-9-@]/g,REGEXP_ADDRESS:/^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/,CHANNEL_CHAR:"@",parseIdentifier:function(t){var n=new RegExp("([^:$#/]*)([:$#]?)([^/]*)"),a=n.exec(t).map(function(e){return e||null}),l=r(a,4),o=(l[0],l[1]),i=l[2],u=l[3];if(!o)throw new Error('Check your URL.  No channel name provided before "'+i+'"');var s=o.startsWith(e.exports.CHANNEL_CHAR),c=s?o:null,f=void 0;if(s){if(!c)throw new Error('Check your URL.  No channel name after "@".');var d=c.match(e.exports.REGEXP_INVALID_CHANNEL);if(d)throw new Error('Check your URL.  Invalid characters in channel name: "'+d.join(", ")+'".')}else f=o;var p=void 0;if(i){if(!u)throw new Error('Check your URL.  No modifier provided after separator "'+i+'"');if(":"!==i)throw new Error('Check your URL.  The "'+i+'" modifier is not currently supported');p=u}return{isChannel:s,channelName:c,channelClaimId:p||null,claimId:f||null}},parseClaim:function(t){var n=new RegExp("([^:$#/.]*)([:$#.]?)([^/]*)"),a=n.exec(t).map(function(e){return e||null}),l=r(a,4),o=(l[0],l[1]),i=l[2],u=l[3];if(!o)throw new Error('Check your URL.  No claim name provided before "."');var s=o.match(e.exports.REGEXP_INVALID_CLAIM);if(s)throw new Error('Check your URL.  Invalid characters in claim name: "'+s.join(", ")+'".');if(i){if(!u)throw new Error('Check your URL.  No file extension provided after separator "'+i+'".');if("."!==i)throw new Error('Check your URL.  The "'+i+'" separator is not supported in the claim name.')}return{claimName:o,extension:u||null}}}},function(e,t,n){"use strict";var r=n(31);e.exports=function(e){e.use("*",function(e,t){r(e,t)})}}]);
-//# sourceMappingURL=index.js.map
\ No newline at end of file
+const server = require('./server.js');
+const client = require('./client.js');
+
+const exports = {
+  server,
+  client,
+}
+
+module.exports = exports;
diff --git a/index.js.map b/index.js.map
deleted file mode 100644
index 87ecee2d..00000000
--- a/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["webpack:///index.js","webpack:///webpack/bootstrap bb7e1fd587dbeb66cd6a","webpack:///external \"react\"","webpack:///external \"react-redux\"","webpack:///external \"winston\"","webpack:///external \"react-router-dom\"","webpack:///./react/actions/publish.js","webpack:///./config/siteConfig.js","webpack:///./models/index.js","webpack:///./react/containers/NavBar/index.js","webpack:///./react/actions/show.js","webpack:///./react/components/SEO/index.js","webpack:///external \"prop-types\"","webpack:///./react/utils/request.js","webpack:///./react/constants/show_action_types.js","webpack:///./react/selectors/show.js","webpack:///external \"react-helmet\"","webpack:///external \"redux-saga/effects\"","webpack:///./helpers/lbryApi.js","webpack:///./helpers/googleAnalytics.js","webpack:///external \"redux\"","webpack:///./react/actions/channel.js","webpack:///./react/components/ProgressBar/index.jsx","webpack:///./react/components/ErrorPage/index.jsx","webpack:///external \"passport\"","webpack:///./config/mysqlConfig.js","webpack:///./config/slackConfig.js","webpack:///external \"passport-local\"","webpack:///external \"sequelize\"","webpack:///./helpers/sequelizeHelpers.js","webpack:///./helpers/publishHelpers.js","webpack:///./helpers/errorHandlers.js","webpack:///./controllers/serveController.js","webpack:///./helpers/handlePageRender.jsx","webpack:///external \"react-dom/server\"","webpack:///./react/reducers/index.js","webpack:///./react/constants/publish_action_types.js","webpack:///./react/constants/publish_channel_select_states.js","webpack:///./react/constants/channel_action_types.js","webpack:///./react/constants/asset_display_states.js","webpack:///./react/components/GAListener/index.jsx","webpack:///./react/app.js","webpack:///./react/containers/Dropzone/index.js","webpack:///./react/containers/ChannelLoginForm/index.js","webpack:///./react/containers/ChannelCreateForm/index.js","webpack:///./react/constants/show_request_types.js","webpack:///./react/containers/AssetDisplay/index.js","webpack:///./helpers/renderFullPage.js","webpack:///./react/selectors/site.js","webpack:///external \"babel-polyfill\"","webpack:///external \"whatwg-fetch\"","webpack:///./server.js","webpack:///external \"express\"","webpack:///external \"body-parser\"","webpack:///external \"express-handlebars\"","webpack:///external \"handlebars\"","webpack:///external \"helmet\"","webpack:///./helpers/authHelpers.js","webpack:///external \"cookie-session\"","webpack:///external \"http\"","webpack:///./helpers/configureLogger.js","webpack:///./config/loggerConfig.js","webpack:///./helpers/configureSlack.js","webpack:///external \"winston-slack-webhook\"","webpack:///./passport/local-signup.js","webpack:///external \"axios\"","webpack:///./config/lbryConfig.js","webpack:///external \"universal-analytics\"","webpack:///./models/certificate.js","webpack:///./models/channel.js","webpack:///./models/claim.js","webpack:///./models/file.js","webpack:///./models/request.js","webpack:///./models/user.js","webpack:///external \"bcrypt\"","webpack:///./passport/local-login.js","webpack:///./routes/auth-routes.js","webpack:///./routes/api-routes.js","webpack:///external \"connect-multiparty\"","webpack:///./controllers/publishController.js","webpack:///external \"fs\"","webpack:///./auth/authentication.js","webpack:///./helpers/channelPagination.js","webpack:///./routes/page-routes.js","webpack:///./react/reducers/publish.js","webpack:///./react/reducers/channel.js","webpack:///./react/reducers/show.js","webpack:///./react/reducers/site.js","webpack:///external \"react-ga\"","webpack:///./react/components/HomePage/index.jsx","webpack:///./react/components/SEO/view.jsx","webpack:///./react/utils/pageTitle.js","webpack:///./react/utils/metaTags.js","webpack:///./react/utils/canonicalLink.js","webpack:///./react/containers/NavBar/view.jsx","webpack:///./react/components/Logo/index.jsx","webpack:///./react/components/NavBarChannelOptionsDropdown/index.jsx","webpack:///external \"cross-fetch/polyfill\"","webpack:///./react/containers/PublishTool/index.js","webpack:///./react/containers/PublishTool/view.jsx","webpack:///./react/containers/Dropzone/view.jsx","webpack:///./react/utils/file.js","webpack:///./react/components/PublishPreview/index.jsx","webpack:///./react/containers/PublishDetails/index.js","webpack:///./react/containers/PublishDetails/view.jsx","webpack:///./react/containers/PublishTitleInput/index.js","webpack:///./react/containers/PublishTitleInput/view.jsx","webpack:///./react/containers/PublishUrlInput/index.js","webpack:///./react/containers/PublishUrlInput/view.jsx","webpack:///./react/components/PublishUrlMiddleDisplay/index.jsx","webpack:///./react/containers/PublishThumbnailInput/index.js","webpack:///./react/containers/PublishThumbnailInput/view.jsx","webpack:///./react/containers/PublishMetadataInputs/index.js","webpack:///./react/containers/PublishMetadataInputs/view.jsx","webpack:///./react/components/ExpandingTextArea/index.jsx","webpack:///./react/containers/ChannelSelect/index.js","webpack:///./react/containers/ChannelSelect/view.jsx","webpack:///./react/containers/ChannelLoginForm/view.jsx","webpack:///./react/containers/ChannelCreateForm/view.jsx","webpack:///./react/components/ActiveStatusBar/index.jsx","webpack:///./react/components/InactiveStatusBar/index.jsx","webpack:///./react/containers/PublishStatus/index.js","webpack:///./react/containers/PublishStatus/view.jsx","webpack:///./react/constants/publish_claim_states.js","webpack:///./react/containers/PublishDisabledMessage/index.js","webpack:///./react/containers/PublishDisabledMessage/view.jsx","webpack:///./react/components/AboutPage/index.jsx","webpack:///./react/containers/LoginPage/index.js","webpack:///./react/containers/LoginPage/view.jsx","webpack:///./react/containers/ShowPage/index.js","webpack:///./react/containers/ShowPage/view.jsx","webpack:///./react/containers/ShowAssetLite/index.js","webpack:///./react/containers/ShowAssetLite/view.jsx","webpack:///./react/containers/AssetDisplay/view.jsx","webpack:///./react/containers/ShowAssetDetails/index.js","webpack:///./react/containers/ShowAssetDetails/view.jsx","webpack:///./react/containers/AssetTitle/index.js","webpack:///./react/containers/AssetTitle/view.jsx","webpack:///./react/containers/AssetInfo/index.js","webpack:///./react/containers/AssetInfo/view.jsx","webpack:///./react/containers/ShowChannel/index.js","webpack:///./react/containers/ShowChannel/view.jsx","webpack:///./react/containers/ChannelClaimsDisplay/index.js","webpack:///./react/containers/ChannelClaimsDisplay/view.jsx","webpack:///./react/components/AssetPreview/index.js","webpack:///./react/components/AssetPreview/view.jsx","webpack:///./react/containers/FourOhFourPage/index.jsx","webpack:///./react/containers/FourOhFourPage/view.jsx","webpack:///./routes/serve-routes.js","webpack:///./helpers/serveHelpers.js","webpack:///./helpers/lbryUri.js","webpack:///./helpers/handleShowRender.jsx","webpack:///external \"redux-saga\"","webpack:///./react/sagas/show_uri.js","webpack:///./react/sagas/show_asset.js","webpack:///./react/api/assetApi.js","webpack:///./react/sagas/show_channel.js","webpack:///./react/api/channelApi.js","webpack:///./react/utils/lbryUri.js","webpack:///./routes/fallback-routes.js"],"names":["module","exports","modules","__webpack_require__","moduleId","installedModules","i","l","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","require","selectFile","file","type","actions","FILE_SELECTED","data","clearFile","FILE_CLEAR","updateMetadata","value","METADATA_UPDATE","updateClaim","CLAIM_UPDATE","setPublishInChannel","channel","SET_PUBLISH_IN_CHANNEL","updatePublishStatus","status","message","PUBLISH_STATUS_UPDATE","updateError","ERROR_UPDATE","updateSelectedChannel","channelName","SELECTED_CHANNEL_UPDATE","toggleMetadataInputs","showMetadataInputs","TOGGLE_METADATA_INPUTS","onNewThumbnail","THUMBNAIL_NEW","startPublish","history","PUBLISH_START","_publish_action_types","obj","newObj","key","default","SiteConfig","_this","this","analytics","googleId","assetDefaults","description","thumbnail","title","auth","sessionKey","details","host","port","twitter","publishing","additionalClaimAddresses","disabled","disabledMessage","primaryClaimAddress","thumbnailChannel","thumbnailChannelId","uploadDirectory","configure","config","console","log","Sequelize","logger","_require","database","username","password","db","sequelize","dialect","dialectOptions","decimalNumbers","logging","pool","max","min","idle","acquire","authenticate","then","info","catch","err","error","Certificate","Channel","Claim","File","Request","User","import","keys","forEach","modelName","associate","upsert","Model","values","condition","tableName","findOne","where","debug","update","create","_reactRedux","_channel","_publish","_view","_view2","mapStateToProps","_ref","site","loggedInChannel","channelShortId","shortId","channelLongId","longId","siteDescription","mapDispatchToProps","dispatch","onChannelLogin","updateLoggedInChannel","onChannelLogout","connect","onHandleShowPageUri","params","HANDLE_SHOW_URI","onRequestError","REQUEST_ERROR","onNewChannelRequest","channelId","requestType","requestId","CHANNEL_REQUEST_NEW","onNewAssetRequest","id","extension","ASSET_REQUEST_NEW","modifier","onRequestUpdate","REQUEST_UPDATE","addRequestToRequestList","REQUEST_LIST_ADD","addAssetToAssetList","claimId","claimData","ASSET_ADD","addNewChannelToChannelList","claimsData","CHANNEL_ADD","onUpdateChannelClaims","channelKey","page","CHANNEL_CLAIMS_UPDATE_ASYNC","updateChannelClaims","channelListId","CHANNEL_CLAIMS_UPDATE_SUCCESS","fileRequested","FILE_REQUESTED","updateFileAvailability","FILE_AVAILABILITY_UPDATE","updateDisplayAssetError","DISPLAY_ASSET_ERROR","_show_action_types","_show_request_types","defaultDescription","defaultThumbnail","siteHost","siteTitle","siteTwitter","parseJSON","response","json","checkStatus","jsonResponse","Error","request","url","options","fetch","Promise","all","_ref2","_slicedToArray","sliceIterator","arr","_arr","_n","_d","_e","undefined","_s","_i","Symbol","iterator","next","done","push","length","Array","isArray","TypeError","selectAsset","show","requestList","assetKey","assetList","selectShowState","state","axios","_require$api","api","apiHost","apiPort","lbryApiUri","_require2","chooseGaLbrynetPublishLabel","sendGATimingEvent","handleLbrynetResponse","resolve","reject","result","JSON","stringify","publishClaim","publishParams","gaStartTime","Date","now","post","method","getClaim","uri","timeout","getClaimList","claimName","resolveUri","getDownloadDirectory","_ref3","download_directory","createChannel","channel_name","amount","createServeEventParams","headers","ip","originalUrl","eventCategory","eventAction","eventLabel","ipOverride","userAgentOverride","createPublishTimingEventParams","category","variable","label","startTime","endTime","userTimingCategory","userTimingVariableName","userTimingTime","userTimingLabel","sendGoogleAnalyticsEvent","visitorId","replace","ua","strictCidFormat","https","event","sendGoogleAnalyticsTiming","timing","sendGAServeEvent","channel_id","CHANNEL_UPDATE","_channel_action_types","_interopRequireDefault","_classCallCheck","instance","Constructor","_possibleConstructorReturn","self","ReferenceError","_inherits","subClass","superClass","constructor","writable","setPrototypeOf","__proto__","_createClass","defineProperties","target","props","descriptor","protoProps","staticProps","_react","_react2","_propTypes","_propTypes2","_ActiveStatusBar","_ActiveStatusBar2","_InactiveStatusBar","_InactiveStatusBar2","ProgressBar","_React$Component","getPrototypeOf","bars","index","incrementer","createBars","bind","startProgressBar","updateProgressBar","stopProgressBar","size","isActive","setState","updateInterval","setInterval","clearInterval","createElement","map","bar","Component","propTypes","number","isRequired","_NavBar","_NavBar2","ErrorPage","apply","arguments","className","string","MysqlConfig","SlackConfig","slackWebHook","slackErrorChannel","slackInfoChannel","returnShortId","claimsArray","claimIndex","substring","shortIdLength","findIndex","element","possibleMatches","slice","filter","fs","parsePublishApiRequestBody","nsfw","license","exec","parsePublishApiRequestFiles","path","test","validateFileTypeAndSize","fileName","filePath","fileType","thumbnailFileName","thumbnailFilePath","thumbnailFileType","createBasicPublishParams","trim","file_path","bid","metadata","author","language","claim_address","createThumbnailPublishParams","deleteTemporaryFile","unlink","addGetResultsToFileData","fileInfo","getResult","file_name","download_path","createFileData","outpoint","height","address","contentType","handleErrorResponse","res","useObjectPropertiesIfNoKeys","_module$exports$retur","returnErrorMessageAndStatus","_module$exports$retur2","createErrorResponsePayload","code","newErrorObject","getOwnPropertyNames","success","returnPaginatedChannelClaims","getClaimId","channelClaimId","getClaimIdByChannel","getClaimIdByClaim","getLongClaimId","longClaimId","getLongChannelId","longChannelId","getClaimIdByLongChannelId","getChannelData","longChannelClaimId","getShortChannelIdFromLongChannelId","_ref4","shortChannelClaimId","getChannelClaims","getAllChannelClaims","_ref5","_ref6","channelClaimsArray","paginatedChannelViewData","getLocalFileRecord","dataValues","_server","_redux","_reducers","_reducers2","_reactRouterDom","_GAListener","_GAListener2","_app","_app2","_renderFullPage","_renderFullPage2","_reactHelmet","_reactHelmet2","req","context","store","createStore","html","renderToString","Provider","StaticRouter","location","helmet","renderStatic","redirect","preloadedState","getState","send","_publish2","_channel2","_show","_show2","_site","_site2","combineReducers","publish","LOGIN","CREATE","LOCAL_CHECK","UNAVAILABLE","ERROR","AVAILABLE","_reactGa","_reactGa2","initialize","GAListener","sendPageView","listen","set","pathname","pageview","children","withRouter","_HomePage","_HomePage2","_AboutPage","_AboutPage2","_LoginPage","_LoginPage2","_ShowPage","_ShowPage2","_FourOhFourPage","_FourOhFourPage2","App","Switch","Route","exact","component","fileError","setFileError","CHANNEL","ASSET_LITE","ASSET_DETAILS","displayAsset","asset","onFileRequest","toString","meta","link","selectSiteState","selectSiteHost","SpeechServer","mysqlConfig","siteConfig","slackConfig","start","configureConfigFiles","configureLogging","configureApp","configureServer","startServer","siteAppConfig","PORT","app","express","enable","use","static","__dirname","bodyParser","urlencoded","extended","verbose","passport","serializeUser","serializeSpeechUser","deserializeUser","deserializeSpeechUser","localSignupStrategy","localLoginStrategy","cookieSession","maxAge","session","hbs","expressHandlebars","defaultLayout","handlebars","Handlebars","engine","populateLocalsDotUser","server","http","Server","sync","user","locals","userName","shortChannelId","logLevel","winston","transports","Console","level","timestamp","colorize","prettyPrint","handleExceptions","humanReadableUnhandledException","warn","silly","loggerConfig","winstonSlackWebHook","SlackWebHook","add","webhookUrl","iconEmoji","PassportLocalStrategy","Strategy","lbryApi","usernameField","passwordField","userInfo","tx","userData","channelData","claim_id","certificateData","newUser","newChannel","newCertificate","setChannel","setUser","lbryConfig","STRING","BOOLEAN","INTEGER","TEXT","DECIMAL","define","claimSequence","decodedClaim","depth","effectiveAmount","hasSignature","hex","nout","txid","validAtHeight","valueVersion","claimType","certificateVersion","keyType","publicKey","freezeTableName","belongsTo","foreignKey","allowNull","findAll","order","getLongChannelIdFromShortChannelId","_this2","$like","getLongChannelIdFromChannelName","_this3","validateLongChannelId","_this4","hasOne","determineFileExtensionFromContentType","determineThumbnail","storedThumbnail","prepareClaimData","claim","certificateId","licenseUrl","preview","metadataVersion","source","sourceType","sourceVersion","streamVersion","getShortClaimIdFromLongClaimId","raw","getLongClaimIdFromShortClaimId","getTopFreeClaimIdByClaimName","_this5","validateLongClaimId","_this6","resolveClaim","_this7","claimArray","defaultValue","trendingEligible","hasMany","getRecentClaims","limit","action","ipAddress","bcrypt","comparePassword","compare","changePassword","newPassword","genSalt","saltError","salt","hash","hashError","hook","returnUserAndChannelInfo","userInstance","getChannel","isMatch","logIn","logout","multipart","multipartMiddleware","uploadDir","claimNameIsAvailable","checkChannelAvailability","_require3","_require4","errorHandlers","_require5","_require6","authenticateUser","_require7","availableName","body","claimsList","resolveResult","fileData","_ref7","_ref8","_ref9","_ref10","_ref10$","completed","_ref11","_ref12","resolvedUri","_ref13","files","channelPassword","_parsePublishApiReque","_parsePublishApiReque2","_ref14","_ref15","_ref15$","thumbnailPublishParams","lbryTx","_ref16","_ref17","_ref18","claimInfo","_ref19","_defineProperty","publishHelpers","_require$publishing","Op","publishResults","fileRecord","claimRecord","upsertCriteria","setClaim","setFile","claimAddresses","attributes","or","authenticateChannelCredentials","userPassword","channelFindParams","claims","totalPages","determineTotalPages","paginationPage","getPageFromQuery","extractPageFromClaims","previousPage","determinePreviousPage","currentPage","nextPage","determineNextPage","totalResults","determineTotalClaims","parseInt","pageNumber","claimStartIndex","claimEndIndex","totalClaims","fullPages","Math","floor","handlePageRender","render","layout","initialState","assign","publishInChannel","selectedChannel","_publish_channel_select_states","publishSubmit","channelList","_asset_display_states","googleAnalyticsId","_siteConfig$assetDefa","_siteConfig$details","_SEO","_SEO2","_PublishTool","_PublishTool2","HomePage","_pageTitle","_metaTags","_canonicalLink","SEO","_props","_props2","pageUri","pageTitle","createPageTitle","metaTags","createMetaTags","canonicalLink","createCanonicalLink","rel","href","determineOgThumbnailContentType","lastIndexOf","createBasicMetaTags","content","createChannelMetaTags","createAssetMetaTags","embedUrl","showUrl","fileExt","ogTitle","ogDescription","ogThumbnailContentType","ogThumbnail","createBasicCanonicalLink","createAssetCanonicalLink","_asset$claimData","createChannelCanonicalLink","_Logo","_Logo2","_NavBarChannelOptionsDropdown","_NavBarChannelOptionsDropdown2","_request","_request2","NavBar","checkForLoggedInUser","logoutUser","handleSelection","credentials","selectedOptions","NavLink","activeClassName","to","defaultSelection","VIEW","LOGOUT","Logo","version","x","y","viewBox","enableBackground","Link","transform","fontSize","fontFamily","fill","stroke","strokeWidth","strokeLinecap","NavBarChannelDropdown","onChange","_Dropzone","_Dropzone2","_PublishDetails","_PublishDetails2","_PublishStatus","_PublishStatus2","_PublishDisabledMessage","_PublishDisabledMessage2","PublishTool","_file","_PublishPreview","_PublishPreview2","Dropzone","dragOver","mouseOver","dimPreview","handleDrop","handleDragOver","handleDragEnd","handleDragEnter","handleDragLeave","handleMouseEnter","handleMouseLeave","handleClick","handleFileInput","chooseFile","preventDefault","dt","dataTransfer","items","kind","droppedFile","getAsFile","remove","clearData","document","getElementById","click","fileList","validateFile","accept","encType","onDrop","onDragOver","onDragEnd","onDragEnter","onDragLeave","onMouseEnter","onMouseLeave","onClick","PublishPreview","imgSource","setPreviewImageSource","newProps","setPreviewImageSourceFromFile","previewReader","FileReader","readAsDataURL","onloadend","src","alt","bool","_PublishTitleInput","_PublishTitleInput2","_PublishUrlInput","_PublishUrlInput2","_PublishThumbnailInput","_PublishThumbnailInput2","_PublishMetadataInputs","_PublishMetadataInputs2","_ChannelSelect","_ChannelSelect2","PublishDetails","onPublishSubmit","onMetadataChange","PublishTitleInput","handleInput","e","placeholder","loggedInChannelName","loggedInChannelShortId","urlError","onClaimChange","onUrlError","_PublishUrlMiddleDisplay","_PublishUrlMiddleDisplay2","PublishUrlInput","setClaimName","validateClaim","cleanseInput","input","fileNameWithoutEnding","cleanClaimName","UrlMiddle","dataURItoBlob","dataURI","byteString","atob","split","mimeString","ia","Uint8Array","charCodeAt","Blob","PublishThumbnailInput","videoSource","sliderMinRange","sliderMaxRange","sliderValue","handleVideoLoadedData","handleSliderChange","createThumbnail","setVideoSource","nextProps","dataUri","blob","URL","createObjectURL","duration","totalMinutes","totalSeconds","currentTime","video","canvas","width","videoWidth","videoHeight","getContext","drawImage","dataUrl","toDataURL","snapshot","_state","preload","muted","style","display","playsInline","onLoadedData","onSeeked","onToggleMetadataInputs","_ExpandingTextArea","_ExpandingTextArea2","PublishMetadataInputs","toggleShowInputs","handleSelect","checked","selectedOption","htmlFor","rows","maxLength","maxHeight","_objectWithoutProperties","indexOf","_extends","ExpandingTextarea","_Component","_handleChange","adjustTextarea","_ref$target","el","scrollHeight","rest","ref","func","channelError","onPublishInChannelChange","onChannelSelect","_ChannelLoginForm","_ChannelLoginForm2","_ChannelCreateForm","_ChannelCreateForm2","states","ChannelSelect","toggleAnonymousPublish","ChannelLoginForm","loginToChannel","Headers","Content-Type","_ProgressBar","_ProgressBar2","ChannelCreateForm","handleChannelInput","cleanseChannelInput","updateIsChannelAvailable","channelWithAtSymbol","checkIsPasswordProvided","checkIsChannelAvailable","makePublishChannelRequest","ActiveStatusBar","InactiveStatusBar","_publish_claim_states","publishStates","PublishStatus","LOAD_START","LOADING","PUBLISHING","SUCCESS","FAILED","PublishDisabledMessage","AboutPage","LoginPage","_ErrorPage","_ErrorPage2","_ShowAssetLite","_ShowAssetLite2","_ShowAssetDetails","_ShowAssetDetails2","_ShowChannel","_ShowChannel2","ShowPage","match","_AssetDisplay","_AssetDisplay2","ShowLite","AssetDisplay","_props$asset$claimDat","_props$asset$claimDat2","controls","poster","_AssetTitle","_AssetTitle2","_AssetInfo","_AssetInfo2","ShowAssetDetails","AssetTitle","AssetInfo","copyToClipboard","elementToCopy","dataset","elementtocopy","select","execCommand","_props$asset","hidden","readOnly","spellCheck","data-elementtocopy","download","previousRequest","_ChannelClaimsDisplay","_ChannelClaimsDisplay2","ShowChannel","_AssetPreview","_AssetPreview2","ChannelClaimsDisplay","showNextResultsPage","showPreviousResultsPage","showNewPage","_props$channel","_props$channel$claims","defaults","AssetPreview","_ref$claimData","directSourceLink","showUrlLink","_ref$site","FourOhForPage","determineResponseType","flipClaimNameAndIdForBackwardsCompatibility","logRequestData","getClaimIdAndServeAsset","lbryUri","handleShowRender","hasFileExtension","parseModifier","responseType","parseClaim","isChannel","_lbryUri$parseIdentif","parseIdentifier","identifier","_flipClaimNameAndIdFo","_flipClaimNameAndIdFo2","clientAcceptsHtml","requestIsFromBrowser","clientWantsAsset","range","imageIsWanted","videoIsWanted","isValidClaimId","isValidShortId","isValidShortIdOrClaimId","serveAssetToClient","NO_FILE","sendFileOptions","X-Content-Type-Options","sendFile","fullClaimId","tempName","REGEXP_INVALID_CLAIM","REGEXP_INVALID_CHANNEL","REGEXP_ADDRESS","CHANNEL_CHAR","componentsRegex","RegExp","_componentsRegex$exec","_componentsRegex$exec2","proto","modifierSeperator","startsWith","nameBadChars","join","_componentsRegex$exec3","_componentsRegex$exec4","_componentsRegex$exec5","_componentsRegex$exec6","_reduxSaga","_reduxSaga2","_effects","_show_uri","returnSagaWithParams","saga","regeneratorRuntime","mark","_callee","wrap","_context","prev","stop","sagaMiddleware","middleware","applyMiddleware","run","parseAndUpdateIdentifierAndClaim","_lbryUri$parseClaim","_lbryUri2","t0","put","abrupt","sent","_show_asset","newAssetRequest","_marked","parseAndUpdateClaimOnly","_lbryUri$parseIdentif2","_lbryUri$parseClaim2","_context2","_show_channel","newChannelRequest","t1","_marked2","handleShowPageUri","_action$data","_context3","_marked3","watchHandleShowPageUri","_context4","takeLatest","_marked4","_lbryUri","_assetApi","getShortId","getClaimData","t2","watchNewAssetRequest","_ref$data","_channelApi","watchNewChannelRequest","getNewClaimsAndUpdateChannel","_action$data2","watchUpdateChannelClaims","extensionSeperator"],"mappings":"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","file":"index.js","sourcesContent":["module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"/\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 47);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"react\");\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"react-redux\");\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"winston\");\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"react-router-dom\");\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.selectFile = selectFile;\nexports.clearFile = clearFile;\nexports.updateMetadata = updateMetadata;\nexports.updateClaim = updateClaim;\nexports.setPublishInChannel = setPublishInChannel;\nexports.updatePublishStatus = updatePublishStatus;\nexports.updateError = updateError;\nexports.updateSelectedChannel = updateSelectedChannel;\nexports.toggleMetadataInputs = toggleMetadataInputs;\nexports.onNewThumbnail = onNewThumbnail;\nexports.startPublish = startPublish;\n\nvar _publish_action_types = __webpack_require__(34);\n\nvar actions = _interopRequireWildcard(_publish_action_types);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\n// export action creators\nfunction selectFile(file) {\n  return {\n    type: actions.FILE_SELECTED,\n    data: file\n  };\n};\n\nfunction clearFile() {\n  return {\n    type: actions.FILE_CLEAR\n  };\n};\n\nfunction updateMetadata(name, value) {\n  return {\n    type: actions.METADATA_UPDATE,\n    data: {\n      name: name,\n      value: value\n    }\n  };\n};\n\nfunction updateClaim(value) {\n  return {\n    type: actions.CLAIM_UPDATE,\n    data: value\n  };\n};\n\nfunction setPublishInChannel(channel) {\n  return {\n    type: actions.SET_PUBLISH_IN_CHANNEL,\n    channel: channel\n  };\n};\n\nfunction updatePublishStatus(status, message) {\n  return {\n    type: actions.PUBLISH_STATUS_UPDATE,\n    data: {\n      status: status,\n      message: message\n    }\n  };\n};\n\nfunction updateError(name, value) {\n  return {\n    type: actions.ERROR_UPDATE,\n    data: {\n      name: name,\n      value: value\n    }\n  };\n};\n\nfunction updateSelectedChannel(channelName) {\n  return {\n    type: actions.SELECTED_CHANNEL_UPDATE,\n    data: channelName\n  };\n};\n\nfunction toggleMetadataInputs(showMetadataInputs) {\n  return {\n    type: actions.TOGGLE_METADATA_INPUTS,\n    data: showMetadataInputs\n  };\n};\n\nfunction onNewThumbnail(file) {\n  return {\n    type: actions.THUMBNAIL_NEW,\n    data: file\n  };\n};\n\nfunction startPublish(history) {\n  return {\n    type: actions.PUBLISH_START,\n    data: { history: history }\n  };\n}\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nfunction SiteConfig() {\n  var _this = this;\n\n  this.analytics = {\n    googleId: 'default'\n  };\n  this.assetDefaults = {\n    description: 'An asset published on Spee.ch',\n    thumbnail: 'https://spee.ch/assets/img/video_thumb_default.png',\n    title: 'Spee.ch'\n  };\n  this.auth = {\n    sessionKey: 'default'\n  };\n  this.details = {\n    description: 'Open-source, decentralized image and video sharing.',\n    host: 'default',\n    port: 3000,\n    title: 'Spee.ch',\n    twitter: '@spee_ch'\n  };\n  this.publishing = {\n    additionalClaimAddresses: [],\n    disabled: false,\n    disabledMessage: 'Please check back soon.',\n    primaryClaimAddress: 'default',\n    thumbnailChannel: 'default',\n    thumbnailChannelId: 'default',\n    uploadDirectory: '/home/lbry/Uploads'\n  };\n  this.configure = function (config) {\n    if (!config) {\n      return console.log('No site config received.');\n    }\n    var analytics = config.analytics,\n        assetDefaults = config.assetDefaults,\n        auth = config.auth,\n        details = config.details,\n        publishing = config.publishing;\n\n    _this.analytics = analytics;\n    _this.assetDefaults = assetDefaults;\n    _this.auth = auth;\n    _this.details = details;\n    _this.publishing = publishing;\n  };\n};\n\nmodule.exports = new SiteConfig();\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Sequelize = __webpack_require__(26);\nvar logger = __webpack_require__(2);\n\nconsole.log('exporting sequelize models');\n\nvar _require = __webpack_require__(23),\n    database = _require.database,\n    username = _require.username,\n    password = _require.password;\n\nvar db = {};\n// set sequelize options\nvar sequelize = new Sequelize(database, username, password, {\n  host: 'localhost',\n  dialect: 'mysql',\n  dialectOptions: { decimalNumbers: true }, // fix to ensure DECIMAL will not be stored as a string\n  logging: false,\n  pool: {\n    max: 5,\n    min: 0,\n    idle: 10000,\n    acquire: 10000\n  }\n});\n\n// establish mysql connection\nsequelize.authenticate().then(function () {\n  logger.info('Sequelize has established mysql connection successfully.');\n}).catch(function (err) {\n  logger.error('Sequelize was unable to connect to the database:', err);\n});\n\n// manually add each model to the db object\nvar Certificate = __webpack_require__(67);\nvar Channel = __webpack_require__(68);\nvar Claim = __webpack_require__(69);\nvar File = __webpack_require__(70);\nvar Request = __webpack_require__(71);\nvar User = __webpack_require__(72);\ndb['Certificate'] = sequelize.import('Certificate', Certificate);\ndb['Channel'] = sequelize.import('Channel', Channel);\ndb['Claim'] = sequelize.import('Claim', Claim);\ndb['File'] = sequelize.import('File', File);\ndb['Request'] = sequelize.import('Request', Request);\ndb['User'] = sequelize.import('User', User);\n\n// run model.association for each model in the db object that has an association\nObject.keys(db).forEach(function (modelName) {\n  if (db[modelName].associate) {\n    logger.info('Associating model:', modelName);\n    db[modelName].associate(db);\n  }\n});\n\ndb.sequelize = sequelize;\ndb.Sequelize = Sequelize;\n\n// add an 'upsert' method to the db object\ndb.upsert = function (Model, values, condition, tableName) {\n  return Model.findOne({\n    where: condition\n  }).then(function (obj) {\n    if (obj) {\n      // update\n      logger.debug('updating record in db.' + tableName);\n      return obj.update(values);\n    } else {\n      // insert\n      logger.debug('creating record in db.' + tableName);\n      return Model.create(values);\n    }\n  }).catch(function (error) {\n    logger.error(tableName + '.upsert error', error);\n    throw error;\n  });\n};\n\nmodule.exports = db;\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _channel = __webpack_require__(19);\n\nvar _publish = __webpack_require__(4);\n\nvar _view = __webpack_require__(93);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n  var channel = _ref.channel,\n      site = _ref.site;\n\n  return {\n    channelName: channel.loggedInChannel.name,\n    channelShortId: channel.loggedInChannel.shortId,\n    channelLongId: channel.loggedInChannel.longId,\n    siteDescription: site.description\n  };\n};\n\nvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n  return {\n    onChannelLogin: function onChannelLogin(name, shortId, longId) {\n      dispatch((0, _channel.updateLoggedInChannel)(name, shortId, longId));\n      dispatch((0, _publish.updateSelectedChannel)(name));\n    },\n    onChannelLogout: function onChannelLogout() {\n      dispatch((0, _channel.updateLoggedInChannel)(null, null, null));\n    }\n  };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.onHandleShowPageUri = onHandleShowPageUri;\nexports.onRequestError = onRequestError;\nexports.onNewChannelRequest = onNewChannelRequest;\nexports.onNewAssetRequest = onNewAssetRequest;\nexports.onRequestUpdate = onRequestUpdate;\nexports.addRequestToRequestList = addRequestToRequestList;\nexports.addAssetToAssetList = addAssetToAssetList;\nexports.addNewChannelToChannelList = addNewChannelToChannelList;\nexports.onUpdateChannelClaims = onUpdateChannelClaims;\nexports.updateChannelClaims = updateChannelClaims;\nexports.fileRequested = fileRequested;\nexports.updateFileAvailability = updateFileAvailability;\nexports.updateDisplayAssetError = updateDisplayAssetError;\n\nvar _show_action_types = __webpack_require__(12);\n\nvar actions = _interopRequireWildcard(_show_action_types);\n\nvar _show_request_types = __webpack_require__(43);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\n// basic request parsing\nfunction onHandleShowPageUri(params) {\n  return {\n    type: actions.HANDLE_SHOW_URI,\n    data: params\n  };\n};\n\nfunction onRequestError(error) {\n  return {\n    type: actions.REQUEST_ERROR,\n    data: error\n  };\n};\n\nfunction onNewChannelRequest(channelName, channelId) {\n  var requestType = _show_request_types.CHANNEL;\n  var requestId = 'cr#' + channelName + '#' + channelId;\n  return {\n    type: actions.CHANNEL_REQUEST_NEW,\n    data: { requestType: requestType, requestId: requestId, channelName: channelName, channelId: channelId }\n  };\n};\n\nfunction onNewAssetRequest(name, id, channelName, channelId, extension) {\n  var requestType = extension ? _show_request_types.ASSET_LITE : _show_request_types.ASSET_DETAILS;\n  var requestId = 'ar#' + name + '#' + id + '#' + channelName + '#' + channelId;\n  return {\n    type: actions.ASSET_REQUEST_NEW,\n    data: {\n      requestType: requestType,\n      requestId: requestId,\n      name: name,\n      modifier: {\n        id: id,\n        channel: {\n          name: channelName,\n          id: channelId\n        }\n      }\n    }\n  };\n};\n\nfunction onRequestUpdate(requestType, requestId) {\n  return {\n    type: actions.REQUEST_UPDATE,\n    data: {\n      requestType: requestType,\n      requestId: requestId\n    }\n  };\n};\n\nfunction addRequestToRequestList(id, error, key) {\n  return {\n    type: actions.REQUEST_LIST_ADD,\n    data: { id: id, error: error, key: key }\n  };\n};\n\n// asset actions\n\nfunction addAssetToAssetList(id, error, name, claimId, shortId, claimData) {\n  return {\n    type: actions.ASSET_ADD,\n    data: { id: id, error: error, name: name, claimId: claimId, shortId: shortId, claimData: claimData }\n  };\n}\n\n// channel actions\n\nfunction addNewChannelToChannelList(id, name, shortId, longId, claimsData) {\n  return {\n    type: actions.CHANNEL_ADD,\n    data: { id: id, name: name, shortId: shortId, longId: longId, claimsData: claimsData }\n  };\n};\n\nfunction onUpdateChannelClaims(channelKey, name, longId, page) {\n  return {\n    type: actions.CHANNEL_CLAIMS_UPDATE_ASYNC,\n    data: { channelKey: channelKey, name: name, longId: longId, page: page }\n  };\n};\n\nfunction updateChannelClaims(channelListId, claimsData) {\n  return {\n    type: actions.CHANNEL_CLAIMS_UPDATE_SUCCESS,\n    data: { channelListId: channelListId, claimsData: claimsData }\n  };\n};\n\n// display a file\n\nfunction fileRequested(name, claimId) {\n  return {\n    type: actions.FILE_REQUESTED,\n    data: { name: name, claimId: claimId }\n  };\n};\n\nfunction updateFileAvailability(status) {\n  return {\n    type: actions.FILE_AVAILABILITY_UPDATE,\n    data: status\n  };\n};\n\nfunction updateDisplayAssetError(error) {\n  return {\n    type: actions.DISPLAY_ASSET_ERROR,\n    data: error\n  };\n};\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _view = __webpack_require__(89);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n  var site = _ref.site;\n  var defaultDescription = site.defaultDescription,\n      defaultThumbnail = site.defaultThumbnail,\n      siteDescription = site.description,\n      siteHost = site.host,\n      siteTitle = site.title,\n      siteTwitter = site.twitter;\n\n  return {\n    defaultDescription: defaultDescription,\n    defaultThumbnail: defaultThumbnail,\n    siteDescription: siteDescription,\n    siteHost: siteHost,\n    siteTitle: siteTitle,\n    siteTwitter: siteTwitter\n  };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default);\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"prop-types\");\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.default = request;\n\n__webpack_require__(96);\n\n/**\n * Parses the JSON returned by a network request\n *\n * @param  {object} response A response from a network request\n *\n * @return {object}          The parsed JSON from the request\n */\nfunction parseJSON(response) {\n  if (response.status === 204 || response.status === 205) {\n    return null;\n  }\n  return response.json();\n}\n\n/**\n * Parses the status returned by a network request\n *\n * @param  {object} response   A response from a network request\n * @param  {object} response   The parsed JSON from the network request\n *\n * @return {object | undefined} Returns object with status and statusText, or undefined\n */\nfunction checkStatus(response, jsonResponse) {\n  if (response.status >= 200 && response.status < 300) {\n    return jsonResponse;\n  }\n  var error = new Error(jsonResponse.message);\n  error.response = response;\n  throw error;\n}\n\n/**\n * Requests a URL, returning a promise\n *\n * @param  {string} url       The URL we want to request\n * @param  {object} [options] The options we want to pass to \"fetch\"\n *\n * @return {object}           The response data\n */\n\nfunction request(url, options) {\n  return fetch(url, options).then(function (response) {\n    return Promise.all([response, parseJSON(response)]);\n  }).then(function (_ref) {\n    var _ref2 = _slicedToArray(_ref, 2),\n        response = _ref2[0],\n        jsonResponse = _ref2[1];\n\n    return checkStatus(response, jsonResponse);\n  });\n}\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n// request actions\nvar HANDLE_SHOW_URI = exports.HANDLE_SHOW_URI = 'HANDLE_SHOW_URI';\nvar REQUEST_ERROR = exports.REQUEST_ERROR = 'REQUEST_ERROR';\nvar REQUEST_UPDATE = exports.REQUEST_UPDATE = 'REQUEST_UPDATE';\nvar ASSET_REQUEST_NEW = exports.ASSET_REQUEST_NEW = 'ASSET_REQUEST_NEW';\nvar CHANNEL_REQUEST_NEW = exports.CHANNEL_REQUEST_NEW = 'CHANNEL_REQUEST_NEW';\nvar REQUEST_LIST_ADD = exports.REQUEST_LIST_ADD = 'REQUEST_LIST_ADD';\n\n// asset actions\nvar ASSET_ADD = exports.ASSET_ADD = 'ASSET_ADD';\n\n// channel actions\nvar CHANNEL_ADD = exports.CHANNEL_ADD = 'CHANNEL_ADD';\n\nvar CHANNEL_CLAIMS_UPDATE_ASYNC = exports.CHANNEL_CLAIMS_UPDATE_ASYNC = 'CHANNEL_CLAIMS_UPDATE_ASYNC';\nvar CHANNEL_CLAIMS_UPDATE_SUCCESS = exports.CHANNEL_CLAIMS_UPDATE_SUCCESS = 'CHANNEL_CLAIMS_UPDATE_SUCCESS';\n\n// asset/file display actions\nvar FILE_REQUESTED = exports.FILE_REQUESTED = 'FILE_REQUESTED';\nvar FILE_AVAILABILITY_UPDATE = exports.FILE_AVAILABILITY_UPDATE = 'FILE_AVAILABILITY_UPDATE';\nvar DISPLAY_ASSET_ERROR = exports.DISPLAY_ASSET_ERROR = 'DISPLAY_ASSET_ERROR';\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar selectAsset = exports.selectAsset = function selectAsset(show) {\n  var request = show.requestList[show.request.id];\n  var assetKey = request.key;\n  return show.assetList[assetKey];\n};\n\nvar selectShowState = exports.selectShowState = function selectShowState(state) {\n  return state.show;\n};\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"react-helmet\");\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"redux-saga/effects\");\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar axios = __webpack_require__(64);\nvar logger = __webpack_require__(2);\n\nvar _require = __webpack_require__(65),\n    _require$api = _require.api,\n    apiHost = _require$api.apiHost,\n    apiPort = _require$api.apiPort;\n\nvar lbryApiUri = 'http://' + apiHost + ':' + apiPort;\n\nvar _require2 = __webpack_require__(17),\n    chooseGaLbrynetPublishLabel = _require2.chooseGaLbrynetPublishLabel,\n    sendGATimingEvent = _require2.sendGATimingEvent;\n\nvar handleLbrynetResponse = function handleLbrynetResponse(_ref, resolve, reject) {\n  var data = _ref.data;\n\n  logger.debug('lbry api data:', data);\n  if (data.result) {\n    // check for an error\n    if (data.result.error) {\n      logger.debug('Lbrynet api error:', data.result.error);\n      reject(new Error(data.result.error));\n      return;\n    };\n    resolve(data.result);\n    return;\n  }\n  // fallback in case it just timed out\n  reject(JSON.stringify(data));\n};\n\nmodule.exports = {\n  publishClaim: function publishClaim(publishParams) {\n    logger.debug('lbryApi >> Publishing claim to \"' + publishParams.name + '\"');\n    var gaStartTime = Date.now();\n    return new Promise(function (resolve, reject) {\n      axios.post(lbryApiUri, {\n        method: 'publish',\n        params: publishParams\n      }).then(function (response) {\n        sendGATimingEvent('lbrynet', 'publish', chooseGaLbrynetPublishLabel(publishParams), gaStartTime, Date.now());\n        handleLbrynetResponse(response, resolve, reject);\n      }).catch(function (error) {\n        reject(error);\n      });\n    });\n  },\n  getClaim: function getClaim(uri) {\n    logger.debug('lbryApi >> Getting Claim for \"' + uri + '\"');\n    var gaStartTime = Date.now();\n    return new Promise(function (resolve, reject) {\n      axios.post(lbryApiUri, {\n        method: 'get',\n        params: { uri: uri, timeout: 20 }\n      }).then(function (response) {\n        sendGATimingEvent('lbrynet', 'getClaim', 'GET', gaStartTime, Date.now());\n        handleLbrynetResponse(response, resolve, reject);\n      }).catch(function (error) {\n        reject(error);\n      });\n    });\n  },\n  getClaimList: function getClaimList(claimName) {\n    logger.debug('lbryApi >> Getting claim_list for \"' + claimName + '\"');\n    var gaStartTime = Date.now();\n    return new Promise(function (resolve, reject) {\n      axios.post(lbryApiUri, {\n        method: 'claim_list',\n        params: { name: claimName }\n      }).then(function (response) {\n        sendGATimingEvent('lbrynet', 'getClaimList', 'CLAIM_LIST', gaStartTime, Date.now());\n        handleLbrynetResponse(response, resolve, reject);\n      }).catch(function (error) {\n        reject(error);\n      });\n    });\n  },\n  resolveUri: function resolveUri(uri) {\n    logger.debug('lbryApi >> Resolving URI for \"' + uri + '\"');\n    var gaStartTime = Date.now();\n    return new Promise(function (resolve, reject) {\n      axios.post(lbryApiUri, {\n        method: 'resolve',\n        params: { uri: uri }\n      }).then(function (_ref2) {\n        var data = _ref2.data;\n\n        sendGATimingEvent('lbrynet', 'resolveUri', 'RESOLVE', gaStartTime, Date.now());\n        if (data.result[uri].error) {\n          // check for errors\n          reject(data.result[uri].error);\n        } else {\n          // if no errors, resolve\n          resolve(data.result[uri]);\n        }\n      }).catch(function (error) {\n        reject(error);\n      });\n    });\n  },\n  getDownloadDirectory: function getDownloadDirectory() {\n    logger.debug('lbryApi >> Retrieving the download directory path from lbry daemon...');\n    var gaStartTime = Date.now();\n    return new Promise(function (resolve, reject) {\n      axios.post(lbryApiUri, {\n        method: 'settings_get'\n      }).then(function (_ref3) {\n        var data = _ref3.data;\n\n        sendGATimingEvent('lbrynet', 'getDownloadDirectory', 'SETTINGS_GET', gaStartTime, Date.now());\n        if (data.result) {\n          resolve(data.result.download_directory);\n        } else {\n          return new Error('Successfully connected to lbry daemon, but unable to retrieve the download directory.');\n        }\n      }).catch(function (error) {\n        logger.error('Lbrynet Error:', error);\n        resolve('/home/lbry/Downloads/');\n      });\n    });\n  },\n  createChannel: function createChannel(name) {\n    logger.debug('lbryApi >> Creating channel for ' + name + '...');\n    var gaStartTime = Date.now();\n    return new Promise(function (resolve, reject) {\n      axios.post(lbryApiUri, {\n        method: 'channel_new',\n        params: {\n          channel_name: name,\n          amount: 0.1\n        }\n      }).then(function (response) {\n        sendGATimingEvent('lbrynet', 'createChannel', 'CHANNEL_NEW', gaStartTime, Date.now());\n        handleLbrynetResponse(response, resolve, reject);\n      }).catch(function (error) {\n        reject(error);\n      });\n    });\n  }\n};\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar logger = __webpack_require__(2);\nvar ua = __webpack_require__(66);\n\nvar _require = __webpack_require__(5),\n    googleId = _require.analytics.googleId,\n    title = _require.details.title;\n\nfunction createServeEventParams(headers, ip, originalUrl) {\n  return {\n    eventCategory: 'client requests',\n    eventAction: 'serve request',\n    eventLabel: originalUrl,\n    ipOverride: ip,\n    userAgentOverride: headers['user-agent']\n  };\n};\n\nfunction createPublishTimingEventParams(category, variable, label, startTime, endTime) {\n  var duration = endTime - startTime;\n  return {\n    userTimingCategory: category,\n    userTimingVariableName: variable,\n    userTimingTime: duration,\n    userTimingLabel: label\n  };\n};\n\nfunction sendGoogleAnalyticsEvent(ip, params) {\n  var visitorId = ip.replace(/\\./g, '-');\n  var visitor = ua(googleId, visitorId, { strictCidFormat: false, https: true });\n  visitor.event(params, function (err) {\n    if (err) {\n      logger.error('Google Analytics Event Error >>', err);\n    }\n  });\n};\n\nfunction sendGoogleAnalyticsTiming(visitorId, params) {\n  var visitor = ua(googleId, visitorId, { strictCidFormat: false, https: true });\n  visitor.timing(params, function (err) {\n    if (err) {\n      logger.error('Google Analytics Event Error >>', err);\n    }\n    logger.debug('Timing event successfully sent to google analytics');\n  });\n};\n\nmodule.exports = {\n  sendGAServeEvent: function sendGAServeEvent(headers, ip, originalUrl) {\n    var params = createServeEventParams(headers, ip, originalUrl);\n    sendGoogleAnalyticsEvent(ip, params);\n  },\n  sendGATimingEvent: function sendGATimingEvent(category, variable, label, startTime, endTime) {\n    var params = createPublishTimingEventParams(category, variable, label, startTime, endTime);\n    sendGoogleAnalyticsTiming(title, params);\n  },\n  chooseGaLbrynetPublishLabel: function chooseGaLbrynetPublishLabel(_ref) {\n    var channelName = _ref.channel_name,\n        channelId = _ref.channel_id;\n\n    return channelName || channelId ? 'PUBLISH_IN_CHANNEL_CLAIM' : 'PUBLISH_ANONYMOUS_CLAIM';\n  }\n};\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"redux\");\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.updateLoggedInChannel = updateLoggedInChannel;\n\nvar _channel_action_types = __webpack_require__(36);\n\nvar actions = _interopRequireWildcard(_channel_action_types);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\n// export action creators\n\nfunction updateLoggedInChannel(name, shortId, longId) {\n  return {\n    type: actions.CHANNEL_UPDATE,\n    data: {\n      name: name,\n      shortId: shortId,\n      longId: longId\n    }\n  };\n};\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\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 = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(10);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _ActiveStatusBar = __webpack_require__(118);\n\nvar _ActiveStatusBar2 = _interopRequireDefault(_ActiveStatusBar);\n\nvar _InactiveStatusBar = __webpack_require__(119);\n\nvar _InactiveStatusBar2 = _interopRequireDefault(_InactiveStatusBar);\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 ProgressBar = function (_React$Component) {\n  _inherits(ProgressBar, _React$Component);\n\n  function ProgressBar(props) {\n    _classCallCheck(this, ProgressBar);\n\n    var _this = _possibleConstructorReturn(this, (ProgressBar.__proto__ || Object.getPrototypeOf(ProgressBar)).call(this, props));\n\n    _this.state = {\n      bars: [],\n      index: 0,\n      incrementer: 1\n    };\n    _this.createBars = _this.createBars.bind(_this);\n    _this.startProgressBar = _this.startProgressBar.bind(_this);\n    _this.updateProgressBar = _this.updateProgressBar.bind(_this);\n    _this.stopProgressBar = _this.stopProgressBar.bind(_this);\n    return _this;\n  }\n\n  _createClass(ProgressBar, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      this.createBars();\n      this.startProgressBar();\n    }\n  }, {\n    key: 'componentWillUnmount',\n    value: function componentWillUnmount() {\n      this.stopProgressBar();\n    }\n  }, {\n    key: 'createBars',\n    value: function createBars() {\n      var bars = [];\n      for (var i = 0; i <= this.props.size; i++) {\n        bars.push({ isActive: false });\n      }\n      this.setState({ bars: bars });\n    }\n  }, {\n    key: 'startProgressBar',\n    value: function startProgressBar() {\n      this.updateInterval = setInterval(this.updateProgressBar.bind(this), 300);\n    }\n  }, {\n    key: 'updateProgressBar',\n    value: function updateProgressBar() {\n      var index = this.state.index;\n      var incrementer = this.state.incrementer;\n      var bars = this.state.bars;\n      // flip incrementer if necessary, to stay in bounds\n      if (index < 0 || index > this.props.size) {\n        incrementer = incrementer * -1;\n        index += incrementer;\n      }\n      // update the indexed bar\n      if (incrementer > 0) {\n        bars[index].isActive = true;\n      } else {\n        bars[index].isActive = false;\n      };\n      // increment index\n      index += incrementer;\n      // update state\n      this.setState({\n        bars: bars,\n        incrementer: incrementer,\n        index: index\n      });\n    }\n  }, {\n    key: 'stopProgressBar',\n    value: function stopProgressBar() {\n      clearInterval(this.updateInterval);\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      return _react2.default.createElement(\n        'div',\n        null,\n        this.state.bars.map(function (bar, index) {\n          return bar.isActive ? _react2.default.createElement(_ActiveStatusBar2.default, { key: index }) : _react2.default.createElement(_InactiveStatusBar2.default, { key: index });\n        })\n      );\n    }\n  }]);\n\n  return ProgressBar;\n}(_react2.default.Component);\n\n;\n\nProgressBar.propTypes = {\n  size: _propTypes2.default.number.isRequired\n};\n\nexports.default = ProgressBar;\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\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 = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(10);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _NavBar = __webpack_require__(7);\n\nvar _NavBar2 = _interopRequireDefault(_NavBar);\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 ErrorPage = function (_React$Component) {\n  _inherits(ErrorPage, _React$Component);\n\n  function ErrorPage() {\n    _classCallCheck(this, ErrorPage);\n\n    return _possibleConstructorReturn(this, (ErrorPage.__proto__ || Object.getPrototypeOf(ErrorPage)).apply(this, arguments));\n  }\n\n  _createClass(ErrorPage, [{\n    key: 'render',\n    value: function render() {\n      var error = this.props.error;\n\n      return _react2.default.createElement(\n        'div',\n        null,\n        _react2.default.createElement(_NavBar2.default, null),\n        _react2.default.createElement(\n          'div',\n          { className: 'row row--padded' },\n          _react2.default.createElement(\n            'p',\n            null,\n            error\n          )\n        )\n      );\n    }\n  }]);\n\n  return ErrorPage;\n}(_react2.default.Component);\n\n;\n\nErrorPage.propTypes = {\n  error: _propTypes2.default.string.isRequired\n};\n\nexports.default = ErrorPage;\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"passport\");\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nfunction MysqlConfig() {\n  var _this = this;\n\n  this.database = 'default';\n  this.username = 'default';\n  this.password = 'default';\n  this.configure = function (config) {\n    if (!config) {\n      return console.log('No MySQL config received.');\n    }\n    var database = config.database,\n        username = config.username,\n        password = config.password;\n\n    _this.database = database;\n    _this.username = username;\n    _this.password = password;\n  };\n};\n\nmodule.exports = new MysqlConfig();\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nfunction SlackConfig() {\n  var _this = this;\n\n  this.slackWebHook = 'default';\n  this.slackErrorChannel = 'default';\n  this.slackInfoChannel = 'default';\n  this.configure = function (config) {\n    if (!config) {\n      return console.log('No slack config received.');\n    }\n    var slackWebHook = config.slackWebHook,\n        slackErrorChannel = config.slackErrorChannel,\n        slackInfoChannel = config.slackInfoChannel;\n\n    _this.slackWebHook = slackWebHook;\n    _this.slackErrorChannel = slackErrorChannel;\n    _this.slackInfoChannel = slackInfoChannel;\n  };\n};\n\nmodule.exports = new SlackConfig();\n\n/***/ }),\n/* 25 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"passport-local\");\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"sequelize\");\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = {\n  returnShortId: function returnShortId(claimsArray, longId) {\n    var claimIndex = void 0;\n    var shortId = longId.substring(0, 1); // default short id is the first letter\n    var shortIdLength = 0;\n    // find the index of this claim id\n    claimIndex = claimsArray.findIndex(function (element) {\n      return element.claimId === longId;\n    });\n    if (claimIndex < 0) {\n      throw new Error('claim id not found in claims list');\n    }\n    // get an array of all claims with lower height\n    var possibleMatches = claimsArray.slice(0, claimIndex);\n    // remove certificates with the same prefixes until none are left.\n    while (possibleMatches.length > 0) {\n      shortIdLength += 1;\n      shortId = longId.substring(0, shortIdLength);\n      possibleMatches = possibleMatches.filter(function (element) {\n        return element.claimId && element.claimId.substring(0, shortIdLength) === shortId;\n      });\n    }\n    return shortId;\n  }\n};\n\n/***/ }),\n/* 28 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar logger = __webpack_require__(2);\nvar fs = __webpack_require__(79);\n\nvar _require = __webpack_require__(5),\n    details = _require.details,\n    publishing = _require.publishing;\n\nmodule.exports = {\n  parsePublishApiRequestBody: function parsePublishApiRequestBody(_ref) {\n    var name = _ref.name,\n        nsfw = _ref.nsfw,\n        license = _ref.license,\n        title = _ref.title,\n        description = _ref.description,\n        thumbnail = _ref.thumbnail;\n\n    // validate name\n    if (!name) {\n      throw new Error('no name field found in request');\n    }\n    var invalidNameCharacters = /[^A-Za-z0-9,-]/.exec(name);\n    if (invalidNameCharacters) {\n      throw new Error('The claim name you provided is not allowed.  Only the following characters are allowed: A-Z, a-z, 0-9, and \"-\"');\n    }\n    // optional parameters\n    nsfw = nsfw === 'true';\n    license = license || null;\n    title = title || null;\n    description = description || null;\n    thumbnail = thumbnail || null;\n    // return results\n    return {\n      name: name,\n      nsfw: nsfw,\n      license: license,\n      title: title,\n      description: description,\n      thumbnail: thumbnail\n    };\n  },\n  parsePublishApiRequestFiles: function parsePublishApiRequestFiles(_ref2) {\n    var file = _ref2.file,\n        thumbnail = _ref2.thumbnail;\n\n    // make sure a file was provided\n    if (!file) {\n      throw new Error('no file with key of [file] found in request');\n    }\n    if (!file.path) {\n      throw new Error('no file path found');\n    }\n    if (!file.type) {\n      throw new Error('no file type found');\n    }\n    if (!file.size) {\n      throw new Error('no file type found');\n    }\n    // validate the file name\n    if (/'/.test(file.name)) {\n      throw new Error('apostrophes are not allowed in the file name');\n    }\n    // validate the file\n    module.exports.validateFileTypeAndSize(file);\n    // return results\n    return {\n      fileName: file.name,\n      filePath: file.path,\n      fileType: file.type,\n      thumbnailFileName: thumbnail ? thumbnail.name : null,\n      thumbnailFilePath: thumbnail ? thumbnail.path : null,\n      thumbnailFileType: thumbnail ? thumbnail.type : null\n    };\n  },\n  validateFileTypeAndSize: function validateFileTypeAndSize(file) {\n    // check file type and size\n    switch (file.type) {\n      case 'image/jpeg':\n      case 'image/jpg':\n      case 'image/png':\n        if (file.size > 10000000) {\n          logger.debug('publish > file validation > .jpeg/.jpg/.png was too big');\n          throw new Error('Sorry, images are limited to 10 megabytes.');\n        }\n        break;\n      case 'image/gif':\n        if (file.size > 50000000) {\n          logger.debug('publish > file validation > .gif was too big');\n          throw new Error('Sorry, .gifs are limited to 50 megabytes.');\n        }\n        break;\n      case 'video/mp4':\n        if (file.size > 50000000) {\n          logger.debug('publish > file validation > .mp4 was too big');\n          throw new Error('Sorry, videos are limited to 50 megabytes.');\n        }\n        break;\n      default:\n        logger.debug('publish > file validation > unrecognized file type');\n        throw new Error('The ' + file.type + ' content type is not supported.  Only, .jpeg, .png, .gif, and .mp4 files are currently supported.');\n    }\n    return file;\n  },\n  createBasicPublishParams: function createBasicPublishParams(filePath, name, title, description, license, nsfw, thumbnail) {\n    logger.debug('Creating Publish Parameters');\n    // provide defaults for title\n    if (title === null || title.trim() === '') {\n      title = name;\n    }\n    // provide default for description\n    if (description === null || description.trim() === '') {\n      description = '';\n    }\n    // provide default for license\n    if (license === null || license.trim() === '') {\n      license = ' '; // default to empty string\n    }\n    // create the publish params\n    var publishParams = {\n      name: name,\n      file_path: filePath,\n      bid: 0.01,\n      metadata: {\n        description: description,\n        title: title,\n        author: details.title,\n        language: 'en',\n        license: license,\n        nsfw: nsfw\n      },\n      claim_address: publishing.primaryClaimAddress\n    };\n    // add thumbnail to channel if video\n    if (thumbnail) {\n      publishParams['metadata']['thumbnail'] = thumbnail;\n    }\n    return publishParams;\n  },\n  createThumbnailPublishParams: function createThumbnailPublishParams(thumbnailFilePath, claimName, license, nsfw) {\n    if (!thumbnailFilePath) {\n      return;\n    }\n    logger.debug('Creating Thumbnail Publish Parameters');\n    // create the publish params\n    return {\n      name: claimName + '-thumb',\n      file_path: thumbnailFilePath,\n      bid: 0.01,\n      metadata: {\n        title: claimName + ' thumbnail',\n        description: 'a thumbnail for ' + claimName,\n        author: details.title,\n        language: 'en',\n        license: license,\n        nsfw: nsfw\n      },\n      claim_address: publishing.primaryClaimAddress,\n      channel_name: publishing.thumbnailChannel,\n      channel_id: publishing.thumbnailChannelId\n    };\n  },\n  deleteTemporaryFile: function deleteTemporaryFile(filePath) {\n    fs.unlink(filePath, function (err) {\n      if (err) {\n        logger.error('error deleting temporary file ' + filePath);\n        throw err;\n      }\n      logger.debug('successfully deleted ' + filePath);\n    });\n  },\n  addGetResultsToFileData: function addGetResultsToFileData(fileInfo, getResult) {\n    fileInfo.fileName = getResult.file_name;\n    fileInfo.filePath = getResult.download_path;\n    return fileInfo;\n  },\n  createFileData: function createFileData(_ref3) {\n    var name = _ref3.name,\n        claimId = _ref3.claimId,\n        outpoint = _ref3.outpoint,\n        height = _ref3.height,\n        address = _ref3.address,\n        nsfw = _ref3.nsfw,\n        contentType = _ref3.contentType;\n\n    return {\n      name: name,\n      claimId: claimId,\n      outpoint: outpoint,\n      height: height,\n      address: address,\n      fileName: '',\n      filePath: '',\n      fileType: contentType,\n      nsfw: nsfw\n    };\n  }\n};\n\n/***/ }),\n/* 29 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar logger = __webpack_require__(2);\n\nmodule.exports = {\n  handleErrorResponse: function handleErrorResponse(originalUrl, ip, error, res) {\n    logger.error('Error on ' + originalUrl, module.exports.useObjectPropertiesIfNoKeys(error));\n\n    var _module$exports$retur = module.exports.returnErrorMessageAndStatus(error),\n        _module$exports$retur2 = _slicedToArray(_module$exports$retur, 2),\n        status = _module$exports$retur2[0],\n        message = _module$exports$retur2[1];\n\n    res.status(status).json(module.exports.createErrorResponsePayload(status, message));\n  },\n  returnErrorMessageAndStatus: function returnErrorMessageAndStatus(error) {\n    var status = void 0,\n        message = void 0;\n    // check for daemon being turned off\n    if (error.code === 'ECONNREFUSED') {\n      status = 503;\n      message = 'Connection refused.  The daemon may not be running.';\n      // fallback for everything else\n    } else {\n      status = 400;\n      if (error.message) {\n        message = error.message;\n      } else {\n        message = error;\n      };\n    };\n    return [status, message];\n  },\n  useObjectPropertiesIfNoKeys: function useObjectPropertiesIfNoKeys(err) {\n    if (Object.keys(err).length === 0) {\n      var newErrorObject = {};\n      Object.getOwnPropertyNames(err).forEach(function (key) {\n        newErrorObject[key] = err[key];\n      });\n      return newErrorObject;\n    }\n    return err;\n  },\n  createErrorResponsePayload: function createErrorResponsePayload(status, message) {\n    return {\n      status: status,\n      success: false,\n      message: message\n    };\n  }\n};\n\n/***/ }),\n/* 30 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar db = __webpack_require__(6);\nvar logger = __webpack_require__(2);\n\nvar _require = __webpack_require__(81),\n    returnPaginatedChannelClaims = _require.returnPaginatedChannelClaims;\n\nvar NO_CHANNEL = 'NO_CHANNEL';\nvar NO_CLAIM = 'NO_CLAIM';\nvar NO_FILE = 'NO_FILE';\n\nmodule.exports = {\n  getClaimId: function getClaimId(channelName, channelClaimId, name, claimId) {\n    if (channelName) {\n      return module.exports.getClaimIdByChannel(channelName, channelClaimId, name);\n    } else {\n      return module.exports.getClaimIdByClaim(name, claimId);\n    }\n  },\n  getClaimIdByClaim: function getClaimIdByClaim(claimName, claimId) {\n    logger.debug('getClaimIdByClaim(' + claimName + ', ' + claimId + ')');\n    return new Promise(function (resolve, reject) {\n      db.Claim.getLongClaimId(claimName, claimId).then(function (longClaimId) {\n        if (!longClaimId) {\n          resolve(NO_CLAIM);\n        }\n        resolve(longClaimId);\n      }).catch(function (error) {\n        reject(error);\n      });\n    });\n  },\n  getClaimIdByChannel: function getClaimIdByChannel(channelName, channelClaimId, claimName) {\n    logger.debug('getClaimIdByChannel(' + channelName + ', ' + channelClaimId + ', ' + claimName + ')');\n    return new Promise(function (resolve, reject) {\n      db.Certificate.getLongChannelId(channelName, channelClaimId) // 1. get the long channel id\n      .then(function (longChannelId) {\n        if (!longChannelId) {\n          return [null, null];\n        }\n        return Promise.all([longChannelId, db.Claim.getClaimIdByLongChannelId(longChannelId, claimName)]); // 2. get the long claim id\n      }).then(function (_ref) {\n        var _ref2 = _slicedToArray(_ref, 2),\n            longChannelId = _ref2[0],\n            longClaimId = _ref2[1];\n\n        if (!longChannelId) {\n          return resolve(NO_CHANNEL);\n        }\n        if (!longClaimId) {\n          return resolve(NO_CLAIM);\n        }\n        resolve(longClaimId);\n      }).catch(function (error) {\n        reject(error);\n      });\n    });\n  },\n  getChannelData: function getChannelData(channelName, channelClaimId, page) {\n    return new Promise(function (resolve, reject) {\n      // 1. get the long channel Id (make sure channel exists)\n      db.Certificate.getLongChannelId(channelName, channelClaimId).then(function (longChannelClaimId) {\n        if (!longChannelClaimId) {\n          return [null, null, null];\n        }\n        // 2. get the short ID and all claims for that channel\n        return Promise.all([longChannelClaimId, db.Certificate.getShortChannelIdFromLongChannelId(longChannelClaimId, channelName)]);\n      }).then(function (_ref3) {\n        var _ref4 = _slicedToArray(_ref3, 2),\n            longChannelClaimId = _ref4[0],\n            shortChannelClaimId = _ref4[1];\n\n        if (!longChannelClaimId) {\n          return resolve(NO_CHANNEL);\n        }\n        // 3. return all the channel information\n        resolve({\n          channelName: channelName,\n          longChannelClaimId: longChannelClaimId,\n          shortChannelClaimId: shortChannelClaimId\n        });\n      }).catch(function (error) {\n        reject(error);\n      });\n    });\n  },\n  getChannelClaims: function getChannelClaims(channelName, channelClaimId, page) {\n    return new Promise(function (resolve, reject) {\n      // 1. get the long channel Id (make sure channel exists)\n      db.Certificate.getLongChannelId(channelName, channelClaimId).then(function (longChannelClaimId) {\n        if (!longChannelClaimId) {\n          return [null, null, null];\n        }\n        // 2. get the short ID and all claims for that channel\n        return Promise.all([longChannelClaimId, db.Claim.getAllChannelClaims(longChannelClaimId)]);\n      }).then(function (_ref5) {\n        var _ref6 = _slicedToArray(_ref5, 2),\n            longChannelClaimId = _ref6[0],\n            channelClaimsArray = _ref6[1];\n\n        if (!longChannelClaimId) {\n          return resolve(NO_CHANNEL);\n        }\n        // 3. format the data for the view, including pagination\n        var paginatedChannelViewData = returnPaginatedChannelClaims(channelName, longChannelClaimId, channelClaimsArray, page);\n        // 4. return all the channel information and contents\n        resolve(paginatedChannelViewData);\n      }).catch(function (error) {\n        reject(error);\n      });\n    });\n  },\n  getLocalFileRecord: function getLocalFileRecord(claimId, name) {\n    return db.File.findOne({ where: { claimId: claimId, name: name } }).then(function (file) {\n      if (!file) {\n        return NO_FILE;\n      }\n      return file.dataValues;\n    });\n  }\n};\n\n/***/ }),\n/* 31 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _server = __webpack_require__(32);\n\nvar _redux = __webpack_require__(18);\n\nvar _reducers = __webpack_require__(33);\n\nvar _reducers2 = _interopRequireDefault(_reducers);\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _reactRouterDom = __webpack_require__(3);\n\nvar _GAListener = __webpack_require__(38);\n\nvar _GAListener2 = _interopRequireDefault(_GAListener);\n\nvar _app = __webpack_require__(39);\n\nvar _app2 = _interopRequireDefault(_app);\n\nvar _renderFullPage = __webpack_require__(45);\n\nvar _renderFullPage2 = _interopRequireDefault(_renderFullPage);\n\nvar _reactHelmet = __webpack_require__(14);\n\nvar _reactHelmet2 = _interopRequireDefault(_reactHelmet);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nmodule.exports = function (req, res) {\n  var context = {};\n\n  // create a new Redux store instance\n  var store = (0, _redux.createStore)(_reducers2.default);\n\n  // render component to a string\n  var html = (0, _server.renderToString)(_react2.default.createElement(\n    _reactRedux.Provider,\n    { store: store },\n    _react2.default.createElement(\n      _reactRouterDom.StaticRouter,\n      { location: req.url, context: context },\n      _react2.default.createElement(\n        _GAListener2.default,\n        null,\n        _react2.default.createElement(_app2.default, null)\n      )\n    )\n  ));\n\n  // get head tags from helmet\n  var helmet = _reactHelmet2.default.renderStatic();\n\n  // check for a redirect\n  if (context.url) {\n    // Somewhere a `<Redirect>` was rendered\n    return res.redirect(301, context.url);\n  } else {}\n  // we're good, send the response\n\n\n  // get the initial state from our Redux store\n  var preloadedState = store.getState();\n\n  // send the rendered page back to the client\n  res.send((0, _renderFullPage2.default)(helmet, html, preloadedState));\n};\n\n/***/ }),\n/* 32 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"react-dom/server\");\n\n/***/ }),\n/* 33 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _redux = __webpack_require__(18);\n\nvar _publish = __webpack_require__(83);\n\nvar _publish2 = _interopRequireDefault(_publish);\n\nvar _channel = __webpack_require__(84);\n\nvar _channel2 = _interopRequireDefault(_channel);\n\nvar _show = __webpack_require__(85);\n\nvar _show2 = _interopRequireDefault(_show);\n\nvar _site = __webpack_require__(86);\n\nvar _site2 = _interopRequireDefault(_site);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = (0, _redux.combineReducers)({\n  channel: _channel2.default,\n  publish: _publish2.default,\n  show: _show2.default,\n  site: _site2.default\n});\n\n/***/ }),\n/* 34 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar FILE_SELECTED = exports.FILE_SELECTED = 'FILE_SELECTED';\nvar FILE_CLEAR = exports.FILE_CLEAR = 'FILE_CLEAR';\nvar METADATA_UPDATE = exports.METADATA_UPDATE = 'METADATA_UPDATE';\nvar CLAIM_UPDATE = exports.CLAIM_UPDATE = 'CLAIM_UPDATE';\nvar SET_PUBLISH_IN_CHANNEL = exports.SET_PUBLISH_IN_CHANNEL = 'SET_PUBLISH_IN_CHANNEL';\nvar PUBLISH_STATUS_UPDATE = exports.PUBLISH_STATUS_UPDATE = 'PUBLISH_STATUS_UPDATE';\nvar ERROR_UPDATE = exports.ERROR_UPDATE = 'ERROR_UPDATE';\nvar SELECTED_CHANNEL_UPDATE = exports.SELECTED_CHANNEL_UPDATE = 'SELECTED_CHANNEL_UPDATE';\nvar TOGGLE_METADATA_INPUTS = exports.TOGGLE_METADATA_INPUTS = 'TOGGLE_METADATA_INPUTS';\nvar THUMBNAIL_NEW = exports.THUMBNAIL_NEW = 'THUMBNAIL_NEW';\nvar PUBLISH_START = exports.PUBLISH_START = 'PUBLISH_START';\n\n/***/ }),\n/* 35 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar LOGIN = exports.LOGIN = 'Existing';\nvar CREATE = exports.CREATE = 'New';\n\n/***/ }),\n/* 36 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar CHANNEL_UPDATE = exports.CHANNEL_UPDATE = 'CHANNEL_UPDATE';\n\n/***/ }),\n/* 37 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar LOCAL_CHECK = exports.LOCAL_CHECK = 'LOCAL_CHECK';\nvar UNAVAILABLE = exports.UNAVAILABLE = 'UNAVAILABLE';\nvar ERROR = exports.ERROR = 'ERROR';\nvar AVAILABLE = exports.AVAILABLE = 'AVAILABLE';\n\n/***/ }),\n/* 38 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\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 = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactGa = __webpack_require__(87);\n\nvar _reactGa2 = _interopRequireDefault(_reactGa);\n\nvar _reactRouterDom = __webpack_require__(3);\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 _require = __webpack_require__(5),\n    googleId = _require.analytics.googleId;\n\n_reactGa2.default.initialize(googleId);\n\nvar GAListener = function (_React$Component) {\n  _inherits(GAListener, _React$Component);\n\n  function GAListener() {\n    _classCallCheck(this, GAListener);\n\n    return _possibleConstructorReturn(this, (GAListener.__proto__ || Object.getPrototypeOf(GAListener)).apply(this, arguments));\n  }\n\n  _createClass(GAListener, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      this.sendPageView(this.props.history.location);\n      this.props.history.listen(this.sendPageView);\n    }\n  }, {\n    key: 'sendPageView',\n    value: function sendPageView(location) {\n      _reactGa2.default.set({ page: location.pathname });\n      _reactGa2.default.pageview(location.pathname);\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      return this.props.children;\n    }\n  }]);\n\n  return GAListener;\n}(_react2.default.Component);\n\nexports.default = (0, _reactRouterDom.withRouter)(GAListener);\n\n/***/ }),\n/* 39 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouterDom = __webpack_require__(3);\n\nvar _HomePage = __webpack_require__(88);\n\nvar _HomePage2 = _interopRequireDefault(_HomePage);\n\nvar _AboutPage = __webpack_require__(125);\n\nvar _AboutPage2 = _interopRequireDefault(_AboutPage);\n\nvar _LoginPage = __webpack_require__(126);\n\nvar _LoginPage2 = _interopRequireDefault(_LoginPage);\n\nvar _ShowPage = __webpack_require__(128);\n\nvar _ShowPage2 = _interopRequireDefault(_ShowPage);\n\nvar _FourOhFourPage = __webpack_require__(145);\n\nvar _FourOhFourPage2 = _interopRequireDefault(_FourOhFourPage);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar App = function App() {\n  return _react2.default.createElement(\n    _reactRouterDom.Switch,\n    null,\n    _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/', component: _HomePage2.default }),\n    _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/about', component: _AboutPage2.default }),\n    _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/login', component: _LoginPage2.default }),\n    _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/:identifier/:claim', component: _ShowPage2.default }),\n    _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/:claim', component: _ShowPage2.default }),\n    _react2.default.createElement(_reactRouterDom.Route, { component: _FourOhFourPage2.default })\n  );\n};\n\nexports.default = App;\n\n/***/ }),\n/* 40 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _publish = __webpack_require__(4);\n\nvar _view = __webpack_require__(99);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n  var publish = _ref.publish;\n\n  return {\n    file: publish.file,\n    thumbnail: publish.thumbnail,\n    fileError: publish.error.file\n  };\n};\n\nvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n  return {\n    selectFile: function selectFile(file) {\n      dispatch((0, _publish.selectFile)(file));\n    },\n    setFileError: function setFileError(value) {\n      dispatch((0, _publish.clearFile)());\n      dispatch((0, _publish.updateError)('file', value));\n    }\n  };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 41 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _channel = __webpack_require__(19);\n\nvar _view = __webpack_require__(116);\n\nvar _view2 = _interopRequireDefault(_view);\n\nvar _publish = __webpack_require__(4);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n  return {\n    onChannelLogin: function onChannelLogin(name, shortId, longId) {\n      dispatch((0, _channel.updateLoggedInChannel)(name, shortId, longId));\n      dispatch((0, _publish.updateSelectedChannel)(name));\n    }\n  };\n};\n\nexports.default = (0, _reactRedux.connect)(null, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 42 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _channel = __webpack_require__(19);\n\nvar _view = __webpack_require__(117);\n\nvar _view2 = _interopRequireDefault(_view);\n\nvar _publish = __webpack_require__(4);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n  return {\n    onChannelLogin: function onChannelLogin(name, shortId, longId) {\n      dispatch((0, _channel.updateLoggedInChannel)(name, shortId, longId));\n      dispatch((0, _publish.updateSelectedChannel)(name));\n    }\n  };\n};\n\nexports.default = (0, _reactRedux.connect)(null, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 43 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar CHANNEL = exports.CHANNEL = 'CHANNEL';\nvar ASSET_LITE = exports.ASSET_LITE = 'ASSET_LITE';\nvar ASSET_DETAILS = exports.ASSET_DETAILS = 'ASSET_DETAILS';\n\n/***/ }),\n/* 44 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _view = __webpack_require__(132);\n\nvar _view2 = _interopRequireDefault(_view);\n\nvar _show = __webpack_require__(8);\n\nvar _show2 = __webpack_require__(13);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n  var show = _ref.show;\n\n  // select error and status\n  var error = show.displayAsset.error;\n  var status = show.displayAsset.status;\n  // select asset\n  var asset = (0, _show2.selectAsset)(show);\n  //  return props\n  return {\n    error: error,\n    status: status,\n    asset: asset\n  };\n};\n\nvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n  return {\n    onFileRequest: function onFileRequest(name, claimId) {\n      dispatch((0, _show.fileRequested)(name, claimId));\n    }\n  };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 45 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function (helmet, html, preloadedState) {\n    // take the html and preloadedState and return the full page\n    return '\\n    <!DOCTYPE html>\\n    <html lang=\"en\" prefix=\"og: http://ogp.me/ns# fb: http://ogp.me/ns/fb#\">\\n        <head>\\n            <meta charset=\"UTF-8\">\\n            <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1, user-scalable=no\">\\n            <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\\n            <!--helmet-->\\n            ' + helmet.title.toString() + '\\n            ' + helmet.meta.toString() + '\\n            ' + helmet.link.toString() + '\\n            <!--style sheets-->\\n            <link rel=\"stylesheet\" href=\"/assets/css/reset.css\" type=\"text/css\">\\n            <link rel=\"stylesheet\" href=\"/assets/css/general.css\" type=\"text/css\">\\n            <link rel=\"stylesheet\" href=\"/assets/css/mediaQueries.css\" type=\"text/css\">\\n            <!--google font-->\\n            <link href=\"https://fonts.googleapis.com/css?family=Roboto:300\" rel=\"stylesheet\">\\n        </head>\\n        <body id=\"main-body\">\\n            <div class=\"row row--tall flex-container--column\">\\n                <div id=\"react-app\" class=\"row row--tall flex-container--column\">' + html + '</div>\\n            </div>\\n            <script>\\n                window.__PRELOADED_STATE__ = ' + JSON.stringify(preloadedState).replace(/</g, '\\\\<') + '\\n            </script>\\n            <script src=\"/bundle/bundle.js\"></script>\\n        </body>\\n    </html>\\n  ';\n};\n\n/***/ }),\n/* 46 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar selectSiteState = exports.selectSiteState = function selectSiteState(state) {\n  return state.site;\n};\n\nvar selectSiteHost = exports.selectSiteHost = function selectSiteHost(state) {\n  return state.site.host;\n};\n\n/***/ }),\n/* 47 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(48);\n__webpack_require__(49);\nmodule.exports = __webpack_require__(50);\n\n\n/***/ }),\n/* 48 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"babel-polyfill\");\n\n/***/ }),\n/* 49 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"whatwg-fetch\");\n\n/***/ }),\n/* 50 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// app dependencies\nvar express = __webpack_require__(51);\nvar bodyParser = __webpack_require__(52);\nvar expressHandlebars = __webpack_require__(53);\nvar Handlebars = __webpack_require__(54);\nvar helmet = __webpack_require__(55);\nvar passport = __webpack_require__(22);\n\nvar _require = __webpack_require__(56),\n    populateLocalsDotUser = _require.populateLocalsDotUser,\n    serializeSpeechUser = _require.serializeSpeechUser,\n    deserializeSpeechUser = _require.deserializeSpeechUser;\n\nvar cookieSession = __webpack_require__(57);\nvar http = __webpack_require__(58);\n// logging dependencies\nvar logger = __webpack_require__(2);\n\nfunction SpeechServer(_ref) {\n  var _this = this;\n\n  var mysqlConfig = _ref.mysqlConfig,\n      siteConfig = _ref.siteConfig,\n      slackConfig = _ref.slackConfig;\n\n  this.start = function () {\n    _this.configureConfigFiles();\n    _this.configureLogging();\n    _this.configureApp();\n    _this.configureServer();\n    _this.startServer();\n  };\n  this.configureConfigFiles = function () {\n    var mysqlAppConfig = __webpack_require__(23);\n    mysqlAppConfig.configure(mysqlConfig);\n    var siteAppConfig = __webpack_require__(5);\n    siteAppConfig.configure(siteConfig);\n    _this.PORT = siteAppConfig.details.port;\n    var slackAppConfig = __webpack_require__(24);\n    slackAppConfig.configure(slackConfig);\n  };\n  this.configureLogging = function () {\n    __webpack_require__(59)(logger);\n    __webpack_require__(61)(logger);\n  };\n  this.configureApp = function () {\n    var app = express(); // create an Express application\n\n    // trust the proxy to get ip address for us\n    app.enable('trust proxy');\n\n    // add middleware\n    app.use(helmet()); // set HTTP headers to protect against well-known web vulnerabilties\n    app.use(express.static(__dirname + '/public')); // 'express.static' to serve static files from public directory\n    app.use(bodyParser.json()); // 'body parser' for parsing application/json\n    app.use(bodyParser.urlencoded({ extended: true })); // 'body parser' for parsing application/x-www-form-urlencoded\n    app.use(function (req, res, next) {\n      // custom logging middleware to log all incoming http requests\n      logger.verbose('Request on ' + req.originalUrl + ' from ' + req.ip);\n      next();\n    });\n\n    // configure passport\n    passport.serializeUser(serializeSpeechUser);\n    passport.deserializeUser(deserializeSpeechUser);\n    var localSignupStrategy = __webpack_require__(63);\n    var localLoginStrategy = __webpack_require__(74);\n    passport.use('local-signup', localSignupStrategy);\n    passport.use('local-login', localLoginStrategy);\n    // initialize passport\n    app.use(cookieSession({\n      name: 'session',\n      keys: [siteConfig.auth.sessionKey],\n      maxAge: 24 * 60 * 60 * 1000 // i.e. 24 hours\n    }));\n    app.use(passport.initialize());\n    app.use(passport.session());\n\n    // configure handlebars & register it with express app\n    var hbs = expressHandlebars.create({\n      defaultLayout: 'embed',\n      handlebars: Handlebars\n    });\n    app.engine('handlebars', hbs.engine);\n    app.set('view engine', 'handlebars');\n\n    // middleware to pass user info back to client (for handlebars access), if user is logged in\n    app.use(populateLocalsDotUser); // note: I don't think I need this any more?\n\n    // set the routes on the app\n    __webpack_require__(75)(app);\n    __webpack_require__(76)(app);\n    __webpack_require__(82)(app);\n    __webpack_require__(147)(app);\n    __webpack_require__(158)(app);\n\n    _this.app = app;\n  };\n  this.configureServer = function () {\n    _this.server = http.Server(_this.app);\n  };\n  this.startServer = function () {\n    var db = __webpack_require__(6);\n    // sync sequelize\n    db.sequelize.sync()\n    // start the server\n    .then(function () {\n      _this.server.listen(_this.PORT, function () {\n        logger.info('Server is listening on PORT ' + _this.PORT);\n      });\n    }).catch(function (error) {\n      logger.error('Startup Error:', error);\n    });\n  };\n};\n\nmodule.exports = SpeechServer;\n\n/***/ }),\n/* 51 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"express\");\n\n/***/ }),\n/* 52 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"body-parser\");\n\n/***/ }),\n/* 53 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"express-handlebars\");\n\n/***/ }),\n/* 54 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"handlebars\");\n\n/***/ }),\n/* 55 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"helmet\");\n\n/***/ }),\n/* 56 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar logger = __webpack_require__(2);\n\nmodule.exports = {\n  populateLocalsDotUser: function populateLocalsDotUser(req, res, next) {\n    if (req.user) {\n      logger.debug('populating res.locals.user');\n      res.locals.user = {\n        id: req.user.id,\n        userName: req.user.userName,\n        channelName: req.user.channelName,\n        channelClaimId: req.user.channelClaimId,\n        shortChannelId: req.user.shortChannelId\n      };\n    }\n    next();\n  },\n  serializeSpeechUser: function serializeSpeechUser(user, done) {\n    // returns user data to be serialized into session\n    logger.debug('serializing user');\n    done(null, user);\n  },\n  deserializeSpeechUser: function deserializeSpeechUser(user, done) {\n    // deserializes session and populates additional info to req.user\n    logger.debug('deserializing user');\n    done(null, user);\n  }\n};\n\n/***/ }),\n/* 57 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"cookie-session\");\n\n/***/ }),\n/* 58 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"http\");\n\n/***/ }),\n/* 59 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _require = __webpack_require__(60),\n    logLevel = _require.logLevel;\n\nmodule.exports = function (winston) {\n  // configure\n  winston.configure({\n    transports: [new winston.transports.Console({\n      level: logLevel,\n      timestamp: false,\n      colorize: true,\n      prettyPrint: true,\n      handleExceptions: true,\n      humanReadableUnhandledException: true\n    })]\n  });\n  // test all the log levels\n  winston.error('Level 0');\n  winston.warn('Level 1');\n  winston.info('Level 2');\n  winston.verbose('Level 3');\n  winston.debug('Level 4');\n  winston.silly('Level 5');\n};\n\n/***/ }),\n/* 60 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar loggerConfig = {\n  logLevel: 'debug' // options: silly, debug, verbose, info\n};\n\nmodule.exports = loggerConfig;\n\n/***/ }),\n/* 61 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar winstonSlackWebHook = __webpack_require__(62).SlackWebHook;\nvar slackConfig = __webpack_require__(24);\n\nmodule.exports = function (winston) {\n  var slackWebHook = slackConfig.slackWebHook,\n      slackErrorChannel = slackConfig.slackErrorChannel,\n      slackInfoChannel = slackConfig.slackInfoChannel;\n\n  if (slackWebHook) {\n    // add a transport for errors to slack\n    if (slackErrorChannel) {\n      winston.add(winstonSlackWebHook, {\n        name: 'slack-errors-transport',\n        level: 'warn',\n        webhookUrl: slackWebHook,\n        channel: slackErrorChannel,\n        username: 'spee.ch',\n        iconEmoji: ':face_with_head_bandage:'\n      });\n    };\n    if (slackInfoChannel) {\n      winston.add(winstonSlackWebHook, {\n        name: 'slack-info-transport',\n        level: 'info',\n        webhookUrl: slackWebHook,\n        channel: slackInfoChannel,\n        username: 'spee.ch',\n        iconEmoji: ':nerd_face:'\n      });\n    };\n    // send test message\n    winston.error('Slack \"error\" logging is online.');\n    winston.info('Slack \"info\" logging is online.');\n  } else {\n    winston.warn('Slack logging is not enabled because no slackWebHook config var provided.');\n  }\n};\n\n/***/ }),\n/* 62 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"winston-slack-webhook\");\n\n/***/ }),\n/* 63 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar PassportLocalStrategy = __webpack_require__(25).Strategy;\nvar lbryApi = __webpack_require__(16);\nvar logger = __webpack_require__(2);\nvar db = __webpack_require__(6);\n\nmodule.exports = new PassportLocalStrategy({\n  usernameField: 'username',\n  passwordField: 'password'\n}, function (username, password, done) {\n  logger.verbose('new channel signup request. user: ' + username + ' pass: ' + password + ' .');\n  var userInfo = {};\n  // server-side validaton of inputs (username, password)\n\n  // create the channel and retrieve the metadata\n  return lbryApi.createChannel('@' + username).then(function (tx) {\n    // create user record\n    var userData = {\n      userName: username,\n      password: password\n    };\n    logger.verbose('userData >', userData);\n    // create user record\n    var channelData = {\n      channelName: '@' + username,\n      channelClaimId: tx.claim_id\n    };\n    logger.verbose('channelData >', channelData);\n    // create certificate record\n    var certificateData = {\n      claimId: tx.claim_id,\n      name: '@' + username\n      // address,\n    };\n    logger.verbose('certificateData >', certificateData);\n    // save user and certificate to db\n    return Promise.all([db.User.create(userData), db.Channel.create(channelData), db.Certificate.create(certificateData)]);\n  }).then(function (_ref) {\n    var _ref2 = _slicedToArray(_ref, 3),\n        newUser = _ref2[0],\n        newChannel = _ref2[1],\n        newCertificate = _ref2[2];\n\n    logger.verbose('user and certificate successfully created');\n    // store the relevant newUser info to be passed back for req.User\n    userInfo['id'] = newUser.id;\n    userInfo['userName'] = newUser.userName;\n    userInfo['channelName'] = newChannel.channelName;\n    userInfo['channelClaimId'] = newChannel.channelClaimId;\n    // associate the instances\n    return Promise.all([newCertificate.setChannel(newChannel), newChannel.setUser(newUser)]);\n  }).then(function () {\n    logger.verbose('user and certificate successfully associated');\n    return db.Certificate.getShortChannelIdFromLongChannelId(userInfo.channelClaimId, userInfo.channelName);\n  }).then(function (shortChannelId) {\n    userInfo['shortChannelId'] = shortChannelId;\n    return done(null, userInfo);\n  }).catch(function (error) {\n    logger.error('signup error', error);\n    return done(error);\n  });\n});\n\n/***/ }),\n/* 64 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"axios\");\n\n/***/ }),\n/* 65 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar lbryConfig = {\n  api: {\n    apiHost: 'localhost',\n    apiPort: '5279'\n  }\n};\n\nmodule.exports = lbryConfig;\n\n/***/ }),\n/* 66 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"universal-analytics\");\n\n/***/ }),\n/* 67 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar logger = __webpack_require__(2);\n\nvar _require = __webpack_require__(27),\n    returnShortId = _require.returnShortId;\n\nmodule.exports = function (sequelize, _ref) {\n  var STRING = _ref.STRING,\n      BOOLEAN = _ref.BOOLEAN,\n      INTEGER = _ref.INTEGER,\n      TEXT = _ref.TEXT,\n      DECIMAL = _ref.DECIMAL;\n\n  var Certificate = sequelize.define('Certificate', {\n    address: {\n      type: STRING,\n      default: null\n    },\n    amount: {\n      type: DECIMAL(19, 8),\n      default: null\n    },\n    claimId: {\n      type: STRING,\n      default: null\n    },\n    claimSequence: {\n      type: INTEGER,\n      default: null\n    },\n    decodedClaim: {\n      type: BOOLEAN,\n      default: null\n    },\n    depth: {\n      type: INTEGER,\n      default: null\n    },\n    effectiveAmount: {\n      type: DECIMAL(19, 8),\n      default: null\n    },\n    hasSignature: {\n      type: BOOLEAN,\n      default: null\n    },\n    height: {\n      type: INTEGER,\n      default: null\n    },\n    hex: {\n      type: TEXT('long'),\n      default: null\n    },\n    name: {\n      type: STRING,\n      default: null\n    },\n    nout: {\n      type: INTEGER,\n      default: null\n    },\n    txid: {\n      type: STRING,\n      default: null\n    },\n    validAtHeight: {\n      type: INTEGER,\n      default: null\n    },\n    outpoint: {\n      type: STRING,\n      default: null\n    },\n    valueVersion: {\n      type: STRING,\n      default: null\n    },\n    claimType: {\n      type: STRING,\n      default: null\n    },\n    certificateVersion: {\n      type: STRING,\n      default: null\n    },\n    keyType: {\n      type: STRING,\n      default: null\n    },\n    publicKey: {\n      type: TEXT('long'),\n      default: null\n    }\n  }, {\n    freezeTableName: true\n  });\n\n  Certificate.associate = function (db) {\n    Certificate.belongsTo(db.Channel, {\n      foreignKey: {\n        allowNull: true\n      }\n    });\n  };\n\n  Certificate.getShortChannelIdFromLongChannelId = function (longChannelId, channelName) {\n    var _this = this;\n\n    logger.debug('getShortChannelIdFromLongChannelId ' + channelName + ':' + longChannelId);\n    return new Promise(function (resolve, reject) {\n      _this.findAll({\n        where: { name: channelName },\n        order: [['height', 'ASC']]\n      }).then(function (result) {\n        switch (result.length) {\n          case 0:\n            throw new Error('No channel(s) found with that channel name');\n          default:\n            return resolve(returnShortId(result, longChannelId));\n        }\n      }).catch(function (error) {\n        reject(error);\n      });\n    });\n  };\n\n  Certificate.getLongChannelIdFromShortChannelId = function (channelName, channelClaimId) {\n    var _this2 = this;\n\n    logger.debug('getLongChannelIdFromShortChannelId(' + channelName + ', ' + channelClaimId + ')');\n    return new Promise(function (resolve, reject) {\n      _this2.findAll({\n        where: {\n          name: channelName,\n          claimId: {\n            $like: channelClaimId + '%'\n          }\n        },\n        order: [['height', 'ASC']]\n      }).then(function (result) {\n        switch (result.length) {\n          case 0:\n            return resolve(null);\n          default:\n            // note results must be sorted\n            return resolve(result[0].claimId);\n        }\n      }).catch(function (error) {\n        reject(error);\n      });\n    });\n  };\n\n  Certificate.getLongChannelIdFromChannelName = function (channelName) {\n    var _this3 = this;\n\n    logger.debug('getLongChannelIdFromChannelName(' + channelName + ')');\n    return new Promise(function (resolve, reject) {\n      _this3.findAll({\n        where: { name: channelName },\n        order: [['effectiveAmount', 'DESC'], ['height', 'ASC']]\n      }).then(function (result) {\n        switch (result.length) {\n          case 0:\n            return resolve(null);\n          default:\n            return resolve(result[0].claimId);\n        }\n      }).catch(function (error) {\n        reject(error);\n      });\n    });\n  };\n\n  Certificate.validateLongChannelId = function (name, claimId) {\n    var _this4 = this;\n\n    logger.debug('validateLongChannelId(' + name + ', ' + claimId + ')');\n    return new Promise(function (resolve, reject) {\n      _this4.findOne({\n        where: { name: name, claimId: claimId }\n      }).then(function (result) {\n        if (!result) {\n          return resolve(null);\n        };\n        resolve(claimId);\n      }).catch(function (error) {\n        reject(error);\n      });\n    });\n  };\n\n  Certificate.getLongChannelId = function (channelName, channelClaimId) {\n    logger.debug('getLongChannelId(' + channelName + ', ' + channelClaimId + ')');\n    if (channelClaimId && channelClaimId.length === 40) {\n      // if a full channel id is provided\n      return this.validateLongChannelId(channelName, channelClaimId);\n    } else if (channelClaimId && channelClaimId.length < 40) {\n      // if a short channel id is provided\n      return this.getLongChannelIdFromShortChannelId(channelName, channelClaimId);\n    } else {\n      return this.getLongChannelIdFromChannelName(channelName); // if no channel id provided\n    }\n  };\n\n  return Certificate;\n};\n\n/***/ }),\n/* 68 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function (sequelize, _ref) {\n  var STRING = _ref.STRING;\n\n  var Channel = sequelize.define('Channel', {\n    channelName: {\n      type: STRING,\n      allowNull: false\n    },\n    channelClaimId: {\n      type: STRING,\n      allowNull: false\n    }\n  }, {\n    freezeTableName: true\n  });\n\n  Channel.associate = function (db) {\n    Channel.belongsTo(db.User);\n    Channel.hasOne(db.Certificate);\n  };\n\n  return Channel;\n};\n\n/***/ }),\n/* 69 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar logger = __webpack_require__(2);\n\nvar _require = __webpack_require__(27),\n    returnShortId = _require.returnShortId;\n\nvar _require2 = __webpack_require__(5),\n    defaultThumbnail = _require2.assetDefaults.thumbnail,\n    host = _require2.details.host;\n\nfunction determineFileExtensionFromContentType(contentType) {\n  switch (contentType) {\n    case 'image/jpeg':\n    case 'image/jpg':\n      return 'jpeg';\n    case 'image/png':\n      return 'png';\n    case 'image/gif':\n      return 'gif';\n    case 'video/mp4':\n      return 'mp4';\n    default:\n      logger.debug('setting unknown file type as file extension jpeg');\n      return 'jpeg';\n  }\n};\n\nfunction determineThumbnail(storedThumbnail, defaultThumbnail) {\n  if (storedThumbnail === '') {\n    return defaultThumbnail;\n  }\n  return storedThumbnail;\n};\n\nfunction prepareClaimData(claim) {\n  // logger.debug('preparing claim data based on resolved data:', claim);\n  claim['thumbnail'] = determineThumbnail(claim.thumbnail, defaultThumbnail);\n  claim['fileExt'] = determineFileExtensionFromContentType(claim.contentType);\n  claim['host'] = host;\n  return claim;\n};\n\nmodule.exports = function (sequelize, _ref) {\n  var STRING = _ref.STRING,\n      BOOLEAN = _ref.BOOLEAN,\n      INTEGER = _ref.INTEGER,\n      TEXT = _ref.TEXT,\n      DECIMAL = _ref.DECIMAL;\n\n  var Claim = sequelize.define('Claim', {\n    address: {\n      type: STRING,\n      default: null\n    },\n    amount: {\n      type: DECIMAL(19, 8),\n      default: null\n    },\n    claimId: {\n      type: STRING,\n      default: null\n    },\n    claimSequence: {\n      type: INTEGER,\n      default: null\n    },\n    decodedClaim: {\n      type: BOOLEAN,\n      default: null\n    },\n    depth: {\n      type: INTEGER,\n      default: null\n    },\n    effectiveAmount: {\n      type: DECIMAL(19, 8),\n      default: null\n    },\n    hasSignature: {\n      type: BOOLEAN,\n      default: null\n    },\n    height: {\n      type: INTEGER,\n      default: null\n    },\n    hex: {\n      type: TEXT('long'),\n      default: null\n    },\n    name: {\n      type: STRING,\n      default: null\n    },\n    nout: {\n      type: INTEGER,\n      default: null\n    },\n    txid: {\n      type: STRING,\n      default: null\n    },\n    validAtHeight: {\n      type: INTEGER,\n      default: null\n    },\n    outpoint: {\n      type: STRING,\n      default: null\n    },\n    claimType: {\n      type: STRING,\n      default: null\n    },\n    certificateId: {\n      type: STRING,\n      default: null\n    },\n    author: {\n      type: STRING,\n      default: null\n    },\n    description: {\n      type: TEXT('long'),\n      default: null\n    },\n    language: {\n      type: STRING,\n      default: null\n    },\n    license: {\n      type: STRING,\n      default: null\n    },\n    licenseUrl: {\n      type: STRING,\n      default: null\n    },\n    nsfw: {\n      type: BOOLEAN,\n      default: null\n    },\n    preview: {\n      type: STRING,\n      default: null\n    },\n    thumbnail: {\n      type: STRING,\n      default: null\n    },\n    title: {\n      type: STRING,\n      default: null\n    },\n    metadataVersion: {\n      type: STRING,\n      default: null\n    },\n    contentType: {\n      type: STRING,\n      default: null\n    },\n    source: {\n      type: STRING,\n      default: null\n    },\n    sourceType: {\n      type: STRING,\n      default: null\n    },\n    sourceVersion: {\n      type: STRING,\n      default: null\n    },\n    streamVersion: {\n      type: STRING,\n      default: null\n    },\n    valueVersion: {\n      type: STRING,\n      default: null\n    },\n    channelName: {\n      type: STRING,\n      allowNull: true,\n      default: null\n    }\n  }, {\n    freezeTableName: true\n  });\n\n  Claim.associate = function (db) {\n    Claim.belongsTo(db.File, {\n      foreignKey: {\n        allowNull: true\n      }\n    });\n  };\n\n  Claim.getShortClaimIdFromLongClaimId = function (claimId, claimName) {\n    var _this = this;\n\n    logger.debug('Claim.getShortClaimIdFromLongClaimId for ' + claimName + '#' + claimId);\n    return new Promise(function (resolve, reject) {\n      _this.findAll({\n        where: { name: claimName },\n        order: [['height', 'ASC']]\n      }).then(function (result) {\n        switch (result.length) {\n          case 0:\n            throw new Error('No claim(s) found with that claim name');\n          default:\n            resolve(returnShortId(result, claimId));\n        }\n      }).catch(function (error) {\n        reject(error);\n      });\n    });\n  };\n\n  Claim.getAllChannelClaims = function (channelClaimId) {\n    var _this2 = this;\n\n    logger.debug('Claim.getAllChannelClaims for ' + channelClaimId);\n    return new Promise(function (resolve, reject) {\n      _this2.findAll({\n        where: { certificateId: channelClaimId },\n        order: [['height', 'ASC']],\n        raw: true // returns an array of only data, not an array of instances\n      }).then(function (channelClaimsArray) {\n        // logger.debug('channelclaimsarray length:', channelClaimsArray.length);\n        switch (channelClaimsArray.length) {\n          case 0:\n            return resolve(null);\n          default:\n            channelClaimsArray.forEach(function (claim) {\n              claim['fileExt'] = determineFileExtensionFromContentType(claim.contentType);\n              claim['thumbnail'] = determineThumbnail(claim.thumbnail, defaultThumbnail);\n              return claim;\n            });\n            return resolve(channelClaimsArray);\n        }\n      }).catch(function (error) {\n        reject(error);\n      });\n    });\n  };\n\n  Claim.getClaimIdByLongChannelId = function (channelClaimId, claimName) {\n    var _this3 = this;\n\n    logger.debug('finding claim id for claim ' + claimName + ' from channel ' + channelClaimId);\n    return new Promise(function (resolve, reject) {\n      _this3.findAll({\n        where: { name: claimName, certificateId: channelClaimId },\n        order: [['id', 'ASC']]\n      }).then(function (result) {\n        switch (result.length) {\n          case 0:\n            return resolve(null);\n          case 1:\n            return resolve(result[0].claimId);\n          default:\n            logger.error(result.length + ' records found for \"' + claimName + '\" in channel \"' + channelClaimId + '\"');\n            return resolve(result[0].claimId);\n        }\n      }).catch(function (error) {\n        reject(error);\n      });\n    });\n  };\n\n  Claim.getLongClaimIdFromShortClaimId = function (name, shortId) {\n    var _this4 = this;\n\n    return new Promise(function (resolve, reject) {\n      _this4.findAll({\n        where: {\n          name: name,\n          claimId: {\n            $like: shortId + '%'\n          } },\n        order: [['height', 'ASC']]\n      }).then(function (result) {\n        switch (result.length) {\n          case 0:\n            return resolve(null);\n          default:\n            // note results must be sorted\n            return resolve(result[0].claimId);\n        }\n      }).catch(function (error) {\n        reject(error);\n      });\n    });\n  };\n\n  Claim.getTopFreeClaimIdByClaimName = function (name) {\n    var _this5 = this;\n\n    return new Promise(function (resolve, reject) {\n      _this5.findAll({\n        where: { name: name },\n        order: [['effectiveAmount', 'DESC'], ['height', 'ASC']] // note: maybe height and effective amount need to switch?\n      }).then(function (result) {\n        logger.debug('length of result', result.length);\n        switch (result.length) {\n          case 0:\n            return resolve(null);\n          default:\n            return resolve(result[0].dataValues.claimId);\n        }\n      }).catch(function (error) {\n        reject(error);\n      });\n    });\n  };\n\n  Claim.validateLongClaimId = function (name, claimId) {\n    var _this6 = this;\n\n    return new Promise(function (resolve, reject) {\n      _this6.findOne({\n        where: { name: name, claimId: claimId }\n      }).then(function (result) {\n        if (!result) {\n          return resolve(null);\n        };\n        resolve(claimId);\n      }).catch(function (error) {\n        reject(error);\n      });\n    });\n  };\n\n  Claim.getLongClaimId = function (claimName, claimId) {\n    logger.debug('getLongClaimId(' + claimName + ', ' + claimId + ')');\n    if (claimId && claimId.length === 40) {\n      // if a full claim id is provided\n      return this.validateLongClaimId(claimName, claimId);\n    } else if (claimId && claimId.length < 40) {\n      return this.getLongClaimIdFromShortClaimId(claimName, claimId); // if a short claim id is provided\n    } else {\n      return this.getTopFreeClaimIdByClaimName(claimName); // if no claim id is provided\n    }\n  };\n\n  Claim.resolveClaim = function (name, claimId) {\n    var _this7 = this;\n\n    logger.debug('Claim.resolveClaim: ' + name + ' ' + claimId);\n    return new Promise(function (resolve, reject) {\n      _this7.findAll({\n        where: { name: name, claimId: claimId }\n      }).then(function (claimArray) {\n        switch (claimArray.length) {\n          case 0:\n            return resolve(null);\n          case 1:\n            return resolve(prepareClaimData(claimArray[0].dataValues));\n          default:\n            logger.error('more than one record matches ' + name + '#' + claimId + ' in db.Claim');\n            return resolve(prepareClaimData(claimArray[0].dataValues));\n        }\n      }).catch(function (error) {\n        reject(error);\n      });\n    });\n  };\n\n  return Claim;\n};\n\n/***/ }),\n/* 70 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function (sequelize, _ref) {\n  var STRING = _ref.STRING,\n      BOOLEAN = _ref.BOOLEAN,\n      INTEGER = _ref.INTEGER;\n\n  var File = sequelize.define('File', {\n    name: {\n      type: STRING,\n      allowNull: false\n    },\n    claimId: {\n      type: STRING,\n      allowNull: false\n    },\n    address: {\n      type: STRING,\n      allowNull: false\n    },\n    outpoint: {\n      type: STRING,\n      allowNull: false\n    },\n    height: {\n      type: INTEGER,\n      allowNull: false,\n      default: 0\n    },\n    fileName: {\n      type: STRING,\n      allowNull: false\n    },\n    filePath: {\n      type: STRING,\n      allowNull: false\n    },\n    fileType: {\n      type: STRING\n    },\n    nsfw: {\n      type: BOOLEAN,\n      allowNull: false,\n      defaultValue: false\n    },\n    trendingEligible: {\n      type: BOOLEAN,\n      allowNull: false,\n      defaultValue: true\n    }\n  }, {\n    freezeTableName: true\n  });\n\n  File.associate = function (db) {\n    File.hasMany(db.Request);\n    File.hasOne(db.Claim);\n  };\n\n  File.getRecentClaims = function () {\n    return this.findAll({\n      where: { nsfw: false, trendingEligible: true },\n      order: [['createdAt', 'DESC']],\n      limit: 25\n    });\n  };\n\n  return File;\n};\n\n/***/ }),\n/* 71 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function (sequelize, _ref) {\n  var STRING = _ref.STRING,\n      BOOLEAN = _ref.BOOLEAN,\n      TEXT = _ref.TEXT;\n\n  var Request = sequelize.define('Request', {\n    action: {\n      type: STRING,\n      allowNull: false\n    },\n    url: {\n      type: STRING,\n      allowNull: false\n    },\n    ipAddress: {\n      type: STRING,\n      allowNull: true\n    },\n    result: {\n      type: TEXT('long'),\n      allowNull: true,\n      default: null\n    }\n  }, {\n    freezeTableName: true\n  });\n\n  Request.associate = function (db) {\n    Request.belongsTo(db.File, {\n      foreignKey: {\n        allowNull: true\n      }\n    });\n  };\n\n  return Request;\n};\n\n/***/ }),\n/* 72 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar bcrypt = __webpack_require__(73);\nvar logger = __webpack_require__(2);\n\nmodule.exports = function (sequelize, _ref) {\n  var STRING = _ref.STRING;\n\n  var User = sequelize.define('User', {\n    userName: {\n      type: STRING,\n      allowNull: false\n    },\n    password: {\n      type: STRING,\n      allowNull: false\n    }\n  }, {\n    freezeTableName: true\n  });\n\n  User.associate = function (db) {\n    User.hasOne(db.Channel);\n  };\n\n  User.prototype.comparePassword = function (password) {\n    return bcrypt.compare(password, this.password);\n  };\n\n  User.prototype.changePassword = function (newPassword) {\n    var _this = this;\n\n    return new Promise(function (resolve, reject) {\n      // generate a salt string to use for hashing\n      bcrypt.genSalt(function (saltError, salt) {\n        if (saltError) {\n          logger.error('salt error', saltError);\n          reject(saltError);\n          return;\n        }\n        // generate a hashed version of the user's password\n        bcrypt.hash(newPassword, salt, function (hashError, hash) {\n          // if there is an error with the hash generation return the error\n          if (hashError) {\n            logger.error('hash error', hashError);\n            reject(hashError);\n            return;\n          }\n          // replace the current password with the new hash\n          _this.update({ password: hash }).then(function () {\n            resolve();\n          }).catch(function (error) {\n            reject(error);\n          });\n        });\n      });\n    });\n  };\n\n  // pre-save hook method to hash the user's password before the user's info is saved to the db.\n  User.hook('beforeCreate', function (user, options) {\n    logger.debug('User.beforeCreate hook...');\n    return new Promise(function (resolve, reject) {\n      // generate a salt string to use for hashing\n      bcrypt.genSalt(function (saltError, salt) {\n        if (saltError) {\n          logger.error('salt error', saltError);\n          reject(saltError);\n          return;\n        }\n        // generate a hashed version of the user's password\n        bcrypt.hash(user.password, salt, function (hashError, hash) {\n          // if there is an error with the hash generation return the error\n          if (hashError) {\n            logger.error('hash error', hashError);\n            reject(hashError);\n            return;\n          }\n          // replace the password string with the hash password value\n          user.password = hash;\n          resolve();\n        });\n      });\n    });\n  });\n\n  return User;\n};\n\n/***/ }),\n/* 73 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"bcrypt\");\n\n/***/ }),\n/* 74 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar PassportLocalStrategy = __webpack_require__(25).Strategy;\nvar logger = __webpack_require__(2);\nvar db = __webpack_require__(6);\n\nvar returnUserAndChannelInfo = function returnUserAndChannelInfo(userInstance) {\n  return new Promise(function (resolve, reject) {\n    var userInfo = {};\n    userInfo['id'] = userInstance.id;\n    userInfo['userName'] = userInstance.userName;\n    userInstance.getChannel().then(function (_ref) {\n      var channelName = _ref.channelName,\n          channelClaimId = _ref.channelClaimId;\n\n      userInfo['channelName'] = channelName;\n      userInfo['channelClaimId'] = channelClaimId;\n      return db.Certificate.getShortChannelIdFromLongChannelId(channelClaimId, channelName);\n    }).then(function (shortChannelId) {\n      userInfo['shortChannelId'] = shortChannelId;\n      resolve(userInfo);\n    }).catch(function (error) {\n      reject(error);\n    });\n  });\n};\n\nmodule.exports = new PassportLocalStrategy({\n  usernameField: 'username',\n  passwordField: 'password'\n}, function (username, password, done) {\n  return db.User.findOne({\n    where: { userName: username }\n  }).then(function (user) {\n    if (!user) {\n      logger.debug('no user found');\n      return done(null, false, { message: 'Incorrect username or password' });\n    }\n    return user.comparePassword(password).then(function (isMatch) {\n      if (!isMatch) {\n        logger.debug('incorrect password');\n        return done(null, false, { message: 'Incorrect username or password' });\n      }\n      logger.debug('Password was a match, returning User');\n      return returnUserAndChannelInfo(user).then(function (userInfo) {\n        return done(null, userInfo);\n      }).catch(function (error) {\n        return error;\n      });\n    }).catch(function (error) {\n      return error;\n    });\n  }).catch(function (error) {\n    return done(error);\n  });\n});\n\n/***/ }),\n/* 75 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar logger = __webpack_require__(2);\nvar passport = __webpack_require__(22);\n\nmodule.exports = function (app) {\n  // route for sign up\n  app.post('/signup', passport.authenticate('local-signup'), function (req, res) {\n    logger.verbose('successful signup for ' + req.user.channelName);\n    res.status(200).json({\n      success: true,\n      channelName: req.user.channelName,\n      channelClaimId: req.user.channelClaimId,\n      shortChannelId: req.user.shortChannelId\n    });\n  });\n  // route for log in\n  app.post('/login', function (req, res, next) {\n    passport.authenticate('local-login', function (err, user, info) {\n      if (err) {\n        return next(err);\n      }\n      if (!user) {\n        return res.status(400).json({\n          success: false,\n          message: info.message\n        });\n      }\n      logger.debug('successful login');\n      req.logIn(user, function (err) {\n        if (err) {\n          return next(err);\n        }\n        return res.status(200).json({\n          success: true,\n          channelName: req.user.channelName,\n          channelClaimId: req.user.channelClaimId,\n          shortChannelId: req.user.shortChannelId\n        });\n      });\n    })(req, res, next);\n  });\n  // route to log out\n  app.get('/logout', function (req, res) {\n    req.logout();\n    res.status(200).json({ success: true, message: 'you successfully logged out' });\n  });\n  // see if user is authenticated, and return credentials if so\n  app.get('/user', function (req, res) {\n    if (req.user) {\n      res.status(200).json({ success: true, data: req.user });\n    } else {\n      res.status(401).json({ success: false, message: 'user is not logged in' });\n    }\n  });\n};\n\n/***/ }),\n/* 76 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar logger = __webpack_require__(2);\nvar multipart = __webpack_require__(77);\n\nvar _require = __webpack_require__(5),\n    uploadDirectory = _require.publishing.uploadDirectory,\n    host = _require.details.host;\n\nvar multipartMiddleware = multipart({ uploadDir: uploadDirectory });\nvar db = __webpack_require__(6);\n\nvar _require2 = __webpack_require__(78),\n    claimNameIsAvailable = _require2.claimNameIsAvailable,\n    checkChannelAvailability = _require2.checkChannelAvailability,\n    publish = _require2.publish;\n\nvar _require3 = __webpack_require__(16),\n    getClaimList = _require3.getClaimList,\n    resolveUri = _require3.resolveUri,\n    getClaim = _require3.getClaim;\n\nvar _require4 = __webpack_require__(28),\n    addGetResultsToFileData = _require4.addGetResultsToFileData,\n    createBasicPublishParams = _require4.createBasicPublishParams,\n    createThumbnailPublishParams = _require4.createThumbnailPublishParams,\n    parsePublishApiRequestBody = _require4.parsePublishApiRequestBody,\n    parsePublishApiRequestFiles = _require4.parsePublishApiRequestFiles,\n    createFileData = _require4.createFileData;\n\nvar errorHandlers = __webpack_require__(29);\n\nvar _require5 = __webpack_require__(17),\n    sendGATimingEvent = _require5.sendGATimingEvent;\n\nvar _require6 = __webpack_require__(80),\n    authenticateUser = _require6.authenticateUser;\n\nvar _require7 = __webpack_require__(30),\n    getChannelData = _require7.getChannelData,\n    getChannelClaims = _require7.getChannelClaims,\n    getClaimId = _require7.getClaimId;\n\nvar NO_CHANNEL = 'NO_CHANNEL';\nvar NO_CLAIM = 'NO_CLAIM';\n\nmodule.exports = function (app) {\n  // route to check whether site has published to a channel\n  app.get('/api/channel/availability/:name', function (_ref, res) {\n    var ip = _ref.ip,\n        originalUrl = _ref.originalUrl,\n        name = _ref.params.name;\n\n    var gaStartTime = Date.now();\n    checkChannelAvailability(name).then(function (availableName) {\n      res.status(200).json(availableName);\n      sendGATimingEvent('end-to-end', 'claim name availability', name, gaStartTime, Date.now());\n    }).catch(function (error) {\n      errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n    });\n  });\n  // route to get a short channel id from long channel Id\n  app.get('/api/channel/short-id/:longId/:name', function (_ref2, res) {\n    var ip = _ref2.ip,\n        originalUrl = _ref2.originalUrl,\n        params = _ref2.params;\n\n    db.Certificate.getShortChannelIdFromLongChannelId(params.longId, params.name).then(function (shortId) {\n      res.status(200).json(shortId);\n    }).catch(function (error) {\n      errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n    });\n  });\n  app.get('/api/channel/data/:channelName/:channelClaimId', function (_ref3, res) {\n    var ip = _ref3.ip,\n        originalUrl = _ref3.originalUrl,\n        body = _ref3.body,\n        params = _ref3.params;\n\n    var channelName = params.channelName;\n    var channelClaimId = params.channelClaimId;\n    if (channelClaimId === 'none') channelClaimId = null;\n    getChannelData(channelName, channelClaimId, 0).then(function (data) {\n      if (data === NO_CHANNEL) {\n        return res.status(404).json({ success: false, message: 'No matching channel was found' });\n      }\n      res.status(200).json({ success: true, data: data });\n    }).catch(function (error) {\n      errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n    });\n  });\n  app.get('/api/channel/claims/:channelName/:channelClaimId/:page', function (_ref4, res) {\n    var ip = _ref4.ip,\n        originalUrl = _ref4.originalUrl,\n        body = _ref4.body,\n        params = _ref4.params;\n\n    var channelName = params.channelName;\n    var channelClaimId = params.channelClaimId;\n    if (channelClaimId === 'none') channelClaimId = null;\n    var page = params.page;\n    getChannelClaims(channelName, channelClaimId, page).then(function (data) {\n      if (data === NO_CHANNEL) {\n        return res.status(404).json({ success: false, message: 'No matching channel was found' });\n      }\n      res.status(200).json({ success: true, data: data });\n    }).catch(function (error) {\n      errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n    });\n  });\n  // route to run a claim_list request on the daemon\n  app.get('/api/claim/list/:name', function (_ref5, res) {\n    var ip = _ref5.ip,\n        originalUrl = _ref5.originalUrl,\n        params = _ref5.params;\n\n    getClaimList(params.name).then(function (claimsList) {\n      res.status(200).json(claimsList);\n    }).catch(function (error) {\n      errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n    });\n  });\n  // route to get an asset\n  app.get('/api/claim/get/:name/:claimId', function (_ref6, res) {\n    var ip = _ref6.ip,\n        originalUrl = _ref6.originalUrl,\n        params = _ref6.params;\n\n    var name = params.name;\n    var claimId = params.claimId;\n    // resolve the claim\n    db.Claim.resolveClaim(name, claimId).then(function (resolveResult) {\n      // make sure a claim actually exists at that uri\n      if (!resolveResult) {\n        throw new Error('No matching uri found in Claim table');\n      }\n      var fileData = createFileData(resolveResult);\n      // get the claim\n      return Promise.all([fileData, getClaim(name + '#' + claimId)]);\n    }).then(function (_ref7) {\n      var _ref8 = _slicedToArray(_ref7, 2),\n          fileData = _ref8[0],\n          getResult = _ref8[1];\n\n      fileData = addGetResultsToFileData(fileData, getResult);\n      return Promise.all([db.upsert(db.File, fileData, { name: name, claimId: claimId }, 'File'), getResult]);\n    }).then(function (_ref9) {\n      var _ref10 = _slicedToArray(_ref9, 2),\n          fileRecord = _ref10[0],\n          _ref10$ = _ref10[1],\n          message = _ref10$.message,\n          completed = _ref10$.completed;\n\n      res.status(200).json({ success: true, message: message, completed: completed });\n    }).catch(function (error) {\n      errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n    });\n  });\n  // route to check whether this site published to a claim\n  app.get('/api/claim/availability/:name', function (_ref11, res) {\n    var ip = _ref11.ip,\n        originalUrl = _ref11.originalUrl,\n        name = _ref11.params.name;\n\n    var gaStartTime = Date.now();\n    claimNameIsAvailable(name).then(function (result) {\n      res.status(200).json(result);\n      sendGATimingEvent('end-to-end', 'claim name availability', name, gaStartTime, Date.now());\n    }).catch(function (error) {\n      errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n    });\n  });\n  // route to run a resolve request on the daemon\n  app.get('/api/claim/resolve/:name/:claimId', function (_ref12, res) {\n    var headers = _ref12.headers,\n        ip = _ref12.ip,\n        originalUrl = _ref12.originalUrl,\n        params = _ref12.params;\n\n    resolveUri(params.name + '#' + params.claimId).then(function (resolvedUri) {\n      res.status(200).json(resolvedUri);\n    }).catch(function (error) {\n      errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n    });\n  });\n  // route to run a publish request on the daemon\n  app.post('/api/claim/publish', multipartMiddleware, function (_ref13, res) {\n    var body = _ref13.body,\n        files = _ref13.files,\n        headers = _ref13.headers,\n        ip = _ref13.ip,\n        originalUrl = _ref13.originalUrl,\n        user = _ref13.user;\n\n    // define variables\n    var channelName = void 0,\n        channelId = void 0,\n        channelPassword = void 0,\n        description = void 0,\n        fileName = void 0,\n        filePath = void 0,\n        fileType = void 0,\n        gaStartTime = void 0,\n        license = void 0,\n        name = void 0,\n        nsfw = void 0,\n        thumbnail = void 0,\n        thumbnailFileName = void 0,\n        thumbnailFilePath = void 0,\n        thumbnailFileType = void 0,\n        title = void 0;\n    // record the start time of the request\n    gaStartTime = Date.now();\n    // validate the body and files of the request\n    try {\n      var _parsePublishApiReque = parsePublishApiRequestBody(body);\n      // validateApiPublishRequest(body, files);\n\n\n      name = _parsePublishApiReque.name;\n      nsfw = _parsePublishApiReque.nsfw;\n      license = _parsePublishApiReque.license;\n      title = _parsePublishApiReque.title;\n      description = _parsePublishApiReque.description;\n      thumbnail = _parsePublishApiReque.thumbnail;\n\n      var _parsePublishApiReque2 = parsePublishApiRequestFiles(files);\n\n      fileName = _parsePublishApiReque2.fileName;\n      filePath = _parsePublishApiReque2.filePath;\n      fileType = _parsePublishApiReque2.fileType;\n      thumbnailFileName = _parsePublishApiReque2.thumbnailFileName;\n      thumbnailFilePath = _parsePublishApiReque2.thumbnailFilePath;\n      thumbnailFileType = _parsePublishApiReque2.thumbnailFileType;\n      channelName = body.channelName;\n      channelId = body.channelId;\n      channelPassword = body.channelPassword;\n    } catch (error) {\n      return res.status(400).json({ success: false, message: error.message });\n    }\n    // check channel authorization\n    Promise.all([authenticateUser(channelName, channelId, channelPassword, user), claimNameIsAvailable(name), createBasicPublishParams(filePath, name, title, description, license, nsfw, thumbnail), createThumbnailPublishParams(thumbnailFilePath, name, license, nsfw)]).then(function (_ref14) {\n      var _ref15 = _slicedToArray(_ref14, 4),\n          _ref15$ = _ref15[0],\n          channelName = _ref15$.channelName,\n          channelClaimId = _ref15$.channelClaimId,\n          validatedClaimName = _ref15[1],\n          publishParams = _ref15[2],\n          thumbnailPublishParams = _ref15[3];\n\n      // add channel details to the publish params\n      if (channelName && channelClaimId) {\n        publishParams['channel_name'] = channelName;\n        publishParams['channel_id'] = channelClaimId;\n      }\n      // publish the thumbnail\n      if (thumbnailPublishParams) {\n        publish(thumbnailPublishParams, thumbnailFileName, thumbnailFileType);\n      }\n      // publish the asset\n      return publish(publishParams, fileName, fileType);\n    }).then(function (result) {\n      res.status(200).json({\n        success: true,\n        message: 'publish completed successfully',\n        data: {\n          name: name,\n          claimId: result.claim_id,\n          url: host + '/' + result.claim_id + '/' + name,\n          lbryTx: result\n        }\n      });\n      // record the publish end time and send to google analytics\n      sendGATimingEvent('end-to-end', 'publish', fileType, gaStartTime, Date.now());\n    }).catch(function (error) {\n      errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n    });\n  });\n  // route to get a short claim id from long claim Id\n  app.get('/api/claim/short-id/:longId/:name', function (_ref16, res) {\n    var ip = _ref16.ip,\n        originalUrl = _ref16.originalUrl,\n        body = _ref16.body,\n        params = _ref16.params;\n\n    db.Claim.getShortClaimIdFromLongClaimId(params.longId, params.name).then(function (shortId) {\n      res.status(200).json({ success: true, data: shortId });\n    }).catch(function (error) {\n      errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n    });\n  });\n  app.post('/api/claim/long-id', function (_ref17, res) {\n    var ip = _ref17.ip,\n        originalUrl = _ref17.originalUrl,\n        body = _ref17.body,\n        params = _ref17.params;\n\n    logger.debug('body:', body);\n    var channelName = body.channelName;\n    var channelClaimId = body.channelClaimId;\n    var claimName = body.claimName;\n    var claimId = body.claimId;\n    getClaimId(channelName, channelClaimId, claimName, claimId).then(function (result) {\n      if (result === NO_CHANNEL) {\n        return res.status(404).json({ success: false, message: 'No matching channel could be found' });\n      }\n      if (result === NO_CLAIM) {\n        return res.status(404).json({ success: false, message: 'No matching claim id could be found' });\n      }\n      res.status(200).json({ success: true, data: result });\n    }).catch(function (error) {\n      errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n    });\n  });\n  app.get('/api/claim/data/:claimName/:claimId', function (_ref18, res) {\n    var ip = _ref18.ip,\n        originalUrl = _ref18.originalUrl,\n        body = _ref18.body,\n        params = _ref18.params;\n\n    var claimName = params.claimName;\n    var claimId = params.claimId;\n    if (claimId === 'none') claimId = null;\n    db.Claim.resolveClaim(claimName, claimId).then(function (claimInfo) {\n      if (!claimInfo) {\n        return res.status(404).json({ success: false, message: 'No claim could be found' });\n      }\n      res.status(200).json({ success: true, data: claimInfo });\n    }).catch(function (error) {\n      errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n    });\n  });\n  // route to see if asset is available locally\n  app.get('/api/file/availability/:name/:claimId', function (_ref19, res) {\n    var ip = _ref19.ip,\n        originalUrl = _ref19.originalUrl,\n        params = _ref19.params;\n\n    var name = params.name;\n    var claimId = params.claimId;\n    db.File.findOne({ where: { name: name, claimId: claimId } }).then(function (result) {\n      if (result) {\n        return res.status(200).json({ success: true, data: true });\n      }\n      res.status(200).json({ success: true, data: false });\n    }).catch(function (error) {\n      errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n    });\n  });\n};\n\n/***/ }),\n/* 77 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"connect-multiparty\");\n\n/***/ }),\n/* 78 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar logger = __webpack_require__(2);\nvar db = __webpack_require__(6);\nvar lbryApi = __webpack_require__(16);\nvar publishHelpers = __webpack_require__(28);\n\nvar _require = __webpack_require__(5),\n    _require$publishing = _require.publishing,\n    primaryClaimAddress = _require$publishing.primaryClaimAddress,\n    additionalClaimAddresses = _require$publishing.additionalClaimAddresses;\n\nvar Sequelize = __webpack_require__(26);\nvar Op = Sequelize.Op;\n\nmodule.exports = {\n  publish: function publish(publishParams, fileName, fileType) {\n    return new Promise(function (resolve, reject) {\n      var publishResults = void 0,\n          certificateId = void 0,\n          channelName = void 0;\n      // publish the file\n      return lbryApi.publishClaim(publishParams).then(function (tx) {\n        logger.info('Successfully published ' + publishParams.name + ' ' + fileName, tx);\n        publishResults = tx;\n        // get the channel information\n        if (publishParams.channel_name) {\n          logger.debug('this claim was published in channel: ' + publishParams.channel_name);\n          return db.Channel.findOne({ where: { channelName: publishParams.channel_name } });\n        } else {\n          logger.debug('this claim was not published in a channel');\n          return null;\n        }\n      }).then(function (channel) {\n        // set channel information\n        certificateId = null;\n        channelName = null;\n        if (channel) {\n          certificateId = channel.channelClaimId;\n          channelName = channel.channelName;\n        }\n        logger.debug('certificateId: ' + certificateId);\n      }).then(function () {\n        // create the File record\n        var fileRecord = {\n          name: publishParams.name,\n          claimId: publishResults.claim_id,\n          title: publishParams.metadata.title,\n          description: publishParams.metadata.description,\n          address: publishParams.claim_address,\n          outpoint: publishResults.txid + ':' + publishResults.nout,\n          height: 0,\n          fileName: fileName,\n          filePath: publishParams.file_path,\n          fileType: fileType,\n          nsfw: publishParams.metadata.nsfw\n        };\n        // create the Claim record\n        var claimRecord = {\n          name: publishParams.name,\n          claimId: publishResults.claim_id,\n          title: publishParams.metadata.title,\n          description: publishParams.metadata.description,\n          address: publishParams.claim_address,\n          thumbnail: publishParams.metadata.thumbnail,\n          outpoint: publishResults.txid + ':' + publishResults.nout,\n          height: 0,\n          contentType: fileType,\n          nsfw: publishParams.metadata.nsfw,\n          amount: publishParams.bid,\n          certificateId: certificateId,\n          channelName: channelName\n        };\n        // upsert criteria\n        var upsertCriteria = {\n          name: publishParams.name,\n          claimId: publishResults.claim_id\n        };\n        // upsert the records\n        return Promise.all([db.upsert(db.File, fileRecord, upsertCriteria, 'File'), db.upsert(db.Claim, claimRecord, upsertCriteria, 'Claim')]);\n      }).then(function (_ref) {\n        var _ref2 = _slicedToArray(_ref, 2),\n            file = _ref2[0],\n            claim = _ref2[1];\n\n        logger.debug('File and Claim records successfully created');\n        return Promise.all([file.setClaim(claim), claim.setFile(file)]);\n      }).then(function () {\n        logger.debug('File and Claim records successfully associated');\n        resolve(publishResults); // resolve the promise with the result from lbryApi.publishClaim;\n      }).catch(function (error) {\n        logger.error('PUBLISH ERROR', error);\n        publishHelpers.deleteTemporaryFile(publishParams.file_path); // delete the local file\n        reject(error);\n      });\n    });\n  },\n  claimNameIsAvailable: function claimNameIsAvailable(name) {\n    var claimAddresses = additionalClaimAddresses || [];\n    claimAddresses.push(primaryClaimAddress);\n    // find any records where the name is used\n    return db.Claim.findAll({\n      attributes: ['address'],\n      where: {\n        name: name,\n        address: _defineProperty({}, Op.or, claimAddresses)\n      }\n    }).then(function (result) {\n      if (result.length >= 1) {\n        throw new Error('That claim is already in use');\n      };\n      return name;\n    }).catch(function (error) {\n      throw error;\n    });\n  },\n  checkChannelAvailability: function checkChannelAvailability(name) {\n    return db.Channel.findAll({\n      where: { channelName: name }\n    }).then(function (result) {\n      if (result.length >= 1) {\n        throw new Error('That channel has already been claimed');\n      }\n      return name;\n    }).catch(function (error) {\n      throw error;\n    });\n  }\n};\n\n/***/ }),\n/* 79 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"fs\");\n\n/***/ }),\n/* 80 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar db = __webpack_require__(6);\nvar logger = __webpack_require__(2);\n\nmodule.exports = {\n  authenticateUser: function authenticateUser(channelName, channelId, channelPassword, user) {\n    // case: no channelName or channel Id are provided (anonymous), regardless of whether user token is provided\n    if (!channelName && !channelId) {\n      return {\n        channelName: null,\n        channelClaimId: null\n      };\n    }\n    // case: channelName or channel Id are provided with user token\n    if (user) {\n      if (channelName && channelName !== user.channelName) {\n        throw new Error('the provided channel name does not match user credentials');\n      }\n      if (channelId && channelId !== user.channelClaimId) {\n        throw new Error('the provided channel id does not match user credentials');\n      }\n      return {\n        channelName: user.channelName,\n        channelClaimId: user.channelClaimId\n      };\n    }\n    // case: channelName or channel Id are provided with password instead of user token\n    if (!channelPassword) throw new Error('no channel password provided');\n    return module.exports.authenticateChannelCredentials(channelName, channelId, channelPassword);\n  },\n  authenticateChannelCredentials: function authenticateChannelCredentials(channelName, channelId, userPassword) {\n    return new Promise(function (resolve, reject) {\n      // hoisted variables\n      var channelData = void 0;\n      // build the params for finding the channel\n      var channelFindParams = {};\n      if (channelName) channelFindParams['channelName'] = channelName;\n      if (channelId) channelFindParams['channelClaimId'] = channelId;\n      // find the channel\n      db.Channel.findOne({\n        where: channelFindParams\n      }).then(function (channel) {\n        if (!channel) {\n          logger.debug('no channel found');\n          throw new Error('Authentication failed, you do not have access to that channel');\n        }\n        channelData = channel.get();\n        logger.debug('channel data:', channelData);\n        return db.User.findOne({\n          where: { userName: channelData.channelName.substring(1) }\n        });\n      }).then(function (user) {\n        if (!user) {\n          logger.debug('no user found');\n          throw new Error('Authentication failed, you do not have access to that channel');\n        }\n        return user.comparePassword(userPassword);\n      }).then(function (isMatch) {\n        if (!isMatch) {\n          logger.debug('incorrect password');\n          throw new Error('Authentication failed, you do not have access to that channel');\n        }\n        logger.debug('...password was a match...');\n        resolve(channelData);\n      }).catch(function (error) {\n        reject(error);\n      });\n    });\n  }\n};\n\n/***/ }),\n/* 81 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar CLAIMS_PER_PAGE = 12;\n\nmodule.exports = {\n  returnPaginatedChannelClaims: function returnPaginatedChannelClaims(channelName, longChannelClaimId, claims, page) {\n    var totalPages = module.exports.determineTotalPages(claims);\n    var paginationPage = module.exports.getPageFromQuery(page);\n    var viewData = {\n      channelName: channelName,\n      longChannelClaimId: longChannelClaimId,\n      claims: module.exports.extractPageFromClaims(claims, paginationPage),\n      previousPage: module.exports.determinePreviousPage(paginationPage),\n      currentPage: paginationPage,\n      nextPage: module.exports.determineNextPage(totalPages, paginationPage),\n      totalPages: totalPages,\n      totalResults: module.exports.determineTotalClaims(claims)\n    };\n    return viewData;\n  },\n  getPageFromQuery: function getPageFromQuery(page) {\n    if (page) {\n      return parseInt(page);\n    }\n    return 1;\n  },\n  extractPageFromClaims: function extractPageFromClaims(claims, pageNumber) {\n    if (!claims) {\n      return []; // if no claims, return this default\n    }\n    // logger.debug('claims is array?', Array.isArray(claims));\n    // logger.debug(`pageNumber ${pageNumber} is number?`, Number.isInteger(pageNumber));\n    var claimStartIndex = (pageNumber - 1) * CLAIMS_PER_PAGE;\n    var claimEndIndex = claimStartIndex + CLAIMS_PER_PAGE;\n    var pageOfClaims = claims.slice(claimStartIndex, claimEndIndex);\n    return pageOfClaims;\n  },\n  determineTotalPages: function determineTotalPages(claims) {\n    if (!claims) {\n      return 0;\n    } else {\n      var totalClaims = claims.length;\n      if (totalClaims < CLAIMS_PER_PAGE) {\n        return 1;\n      }\n      var fullPages = Math.floor(totalClaims / CLAIMS_PER_PAGE);\n      var remainder = totalClaims % CLAIMS_PER_PAGE;\n      if (remainder === 0) {\n        return fullPages;\n      }\n      return fullPages + 1;\n    }\n  },\n  determinePreviousPage: function determinePreviousPage(currentPage) {\n    if (currentPage === 1) {\n      return null;\n    }\n    return currentPage - 1;\n  },\n  determineNextPage: function determineNextPage(totalPages, currentPage) {\n    if (currentPage === totalPages) {\n      return null;\n    }\n    return currentPage + 1;\n  },\n  determineTotalClaims: function determineTotalClaims(claims) {\n    if (!claims) {\n      return 0;\n    }\n    return claims.length;\n  }\n};\n\n/***/ }),\n/* 82 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _require = __webpack_require__(5),\n    host = _require.details;\n\nvar handlePageRender = __webpack_require__(31);\n\nmodule.exports = function (app) {\n  // route for the home page\n  app.get('/', function (req, res) {\n    handlePageRender(req, res);\n  });\n  // route to display login page\n  app.get('/login', function (req, res) {\n    handlePageRender(req, res);\n  });\n  // route to show 'about' page\n  app.get('/about', function (req, res) {\n    handlePageRender(req, res);\n  });\n  // route to display a list of the trending images\n  app.get('/trending', function (req, res) {\n    res.status(301).redirect('/popular');\n  });\n  app.get('/popular', function (req, res) {\n    handlePageRender(req, res);\n  });\n  // route to display a list of the trending images\n  app.get('/new', function (req, res) {\n    handlePageRender(req, res);\n  });\n  // route to send embedable video player (for twitter)\n  app.get('/embed/:claimId/:name', function (_ref, res) {\n    var params = _ref.params;\n\n    var claimId = params.claimId;\n    var name = params.name;\n    // get and render the content\n    res.status(200).render('embed', { layout: 'embed', host: host, claimId: claimId, name: name });\n  });\n};\n\n/***/ }),\n/* 83 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nexports.default = function () {\n  var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;\n  var action = arguments[1];\n\n  switch (action.type) {\n    case actions.FILE_SELECTED:\n      return Object.assign({}, initialState, { // note: clears to initial state\n        file: action.data\n      });\n    case actions.FILE_CLEAR:\n      return initialState;\n    case actions.METADATA_UPDATE:\n      return Object.assign({}, state, {\n        metadata: Object.assign({}, state.metadata, _defineProperty({}, action.data.name, action.data.value))\n      });\n    case actions.CLAIM_UPDATE:\n      return Object.assign({}, state, {\n        claim: action.data\n      });\n    case actions.SET_PUBLISH_IN_CHANNEL:\n      return Object.assign({}, state, {\n        publishInChannel: action.channel\n      });\n    case actions.PUBLISH_STATUS_UPDATE:\n      return Object.assign({}, state, {\n        status: action.data\n      });\n    case actions.ERROR_UPDATE:\n      return Object.assign({}, state, {\n        error: Object.assign({}, state.error, _defineProperty({}, action.data.name, action.data.value))\n      });\n    case actions.SELECTED_CHANNEL_UPDATE:\n      return Object.assign({}, state, {\n        selectedChannel: action.data\n      });\n    case actions.TOGGLE_METADATA_INPUTS:\n      return Object.assign({}, state, {\n        showMetadataInputs: action.data\n      });\n    case actions.THUMBNAIL_NEW:\n      return Object.assign({}, state, {\n        thumbnail: action.data\n      });\n    default:\n      return state;\n  }\n};\n\nvar _publish_action_types = __webpack_require__(34);\n\nvar actions = _interopRequireWildcard(_publish_action_types);\n\nvar _publish_channel_select_states = __webpack_require__(35);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar _require = __webpack_require__(5),\n    publishing = _require.publishing;\n\nvar initialState = {\n  disabled: publishing.disabled,\n  disabledMessage: publishing.disabledMessage,\n  publishInChannel: false,\n  selectedChannel: _publish_channel_select_states.LOGIN,\n  showMetadataInputs: false,\n  status: {\n    status: null,\n    message: null\n  },\n  error: {\n    file: null,\n    url: null,\n    channel: null,\n    publishSubmit: null\n  },\n  file: null,\n  claim: '',\n  metadata: {\n    title: '',\n    description: '',\n    license: '',\n    nsfw: false\n  },\n  thumbnail: null\n};\n\n/***/ }),\n/* 84 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nexports.default = function () {\n  var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;\n  var action = arguments[1];\n\n  switch (action.type) {\n    case actions.CHANNEL_UPDATE:\n      return Object.assign({}, state, {\n        loggedInChannel: action.data\n      });\n    default:\n      return state;\n  }\n};\n\nvar _channel_action_types = __webpack_require__(36);\n\nvar actions = _interopRequireWildcard(_channel_action_types);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar initialState = {\n  loggedInChannel: {\n    name: null,\n    shortId: null,\n    longId: null\n  }\n};\n\n/***/ }),\n/* 85 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nexports.default = function () {\n  var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;\n  var action = arguments[1];\n\n  switch (action.type) {\n    // handle request\n    case actions.REQUEST_ERROR:\n      return Object.assign({}, state, {\n        request: Object.assign({}, state.request, {\n          error: action.data\n        })\n      });\n    case actions.REQUEST_UPDATE:\n      return Object.assign({}, state, {\n        request: Object.assign({}, state.request, {\n          type: action.data.requestType,\n          id: action.data.requestId\n        })\n      });\n    // store requests\n    case actions.REQUEST_LIST_ADD:\n      return Object.assign({}, state, {\n        requestList: Object.assign({}, state.requestList, _defineProperty({}, action.data.id, {\n          error: action.data.error,\n          key: action.data.key\n        }))\n      });\n    // asset data\n    case actions.ASSET_ADD:\n      return Object.assign({}, state, {\n        assetList: Object.assign({}, state.assetList, _defineProperty({}, action.data.id, {\n          error: action.data.error,\n          name: action.data.name,\n          claimId: action.data.claimId,\n          shortId: action.data.shortId,\n          claimData: action.data.claimData\n        }))\n      });\n    // channel data\n    case actions.CHANNEL_ADD:\n      return Object.assign({}, state, {\n        channelList: Object.assign({}, state.channelList, _defineProperty({}, action.data.id, {\n          name: action.data.name,\n          longId: action.data.longId,\n          shortId: action.data.shortId,\n          claimsData: action.data.claimsData\n        }))\n      });\n    case actions.CHANNEL_CLAIMS_UPDATE_SUCCESS:\n      return Object.assign({}, state, {\n        channelList: Object.assign({}, state.channelList, _defineProperty({}, action.data.channelListId, Object.assign({}, state.channelList[action.data.channelListId], {\n          claimsData: action.data.claimsData\n        })))\n      });\n    // display an asset\n    case actions.FILE_AVAILABILITY_UPDATE:\n      return Object.assign({}, state, {\n        displayAsset: Object.assign({}, state.displayAsset, {\n          status: action.data\n        })\n      });\n    case actions.DISPLAY_ASSET_ERROR:\n      return Object.assign({}, state, {\n        displayAsset: Object.assign({}, state.displayAsset, {\n          error: action.data,\n          status: _asset_display_states.ERROR\n        })\n      });\n    default:\n      return state;\n  }\n};\n\nvar _show_action_types = __webpack_require__(12);\n\nvar actions = _interopRequireWildcard(_show_action_types);\n\nvar _asset_display_states = __webpack_require__(37);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar initialState = {\n  request: {\n    error: null,\n    type: null,\n    id: null\n  },\n  requestList: {},\n  channelList: {},\n  assetList: {},\n  displayAsset: {\n    error: null,\n    status: _asset_display_states.LOCAL_CHECK\n  }\n};\n\n/***/ }),\n/* 86 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nexports.default = function () {\n  var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;\n  var action = arguments[1];\n\n  switch (action.type) {\n    default:\n      return state;\n  }\n};\n\nvar siteConfig = __webpack_require__(5);\n\nvar googleAnalyticsId = siteConfig.analytics.googleId,\n    _siteConfig$assetDefa = siteConfig.assetDefaults,\n    defaultThumbnail = _siteConfig$assetDefa.thumbnail,\n    defaultDescription = _siteConfig$assetDefa.description,\n    _siteConfig$details = siteConfig.details,\n    description = _siteConfig$details.description,\n    host = _siteConfig$details.host,\n    title = _siteConfig$details.title,\n    twitter = _siteConfig$details.twitter;\n\n\nvar initialState = {\n  description: description,\n  googleAnalyticsId: googleAnalyticsId,\n  host: host,\n  title: title,\n  twitter: twitter,\n  defaultDescription: defaultDescription,\n  defaultThumbnail: defaultThumbnail\n};\n\n/***/ }),\n/* 87 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"react-ga\");\n\n/***/ }),\n/* 88 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\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 = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _SEO = __webpack_require__(9);\n\nvar _SEO2 = _interopRequireDefault(_SEO);\n\nvar _NavBar = __webpack_require__(7);\n\nvar _NavBar2 = _interopRequireDefault(_NavBar);\n\nvar _PublishTool = __webpack_require__(97);\n\nvar _PublishTool2 = _interopRequireDefault(_PublishTool);\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 HomePage = function (_React$Component) {\n  _inherits(HomePage, _React$Component);\n\n  function HomePage() {\n    _classCallCheck(this, HomePage);\n\n    return _possibleConstructorReturn(this, (HomePage.__proto__ || Object.getPrototypeOf(HomePage)).apply(this, arguments));\n  }\n\n  _createClass(HomePage, [{\n    key: 'render',\n    value: function render() {\n      return _react2.default.createElement(\n        'div',\n        { className: 'row row--tall flex-container--column' },\n        _react2.default.createElement(_SEO2.default, null),\n        _react2.default.createElement(_NavBar2.default, null),\n        _react2.default.createElement(\n          'div',\n          { className: 'row row--tall row--padded flex-container--column' },\n          _react2.default.createElement(_PublishTool2.default, null)\n        )\n      );\n    }\n  }]);\n\n  return HomePage;\n}(_react2.default.Component);\n\n;\n\nexports.default = HomePage;\n\n/***/ }),\n/* 89 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\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 = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactHelmet = __webpack_require__(14);\n\nvar _reactHelmet2 = _interopRequireDefault(_reactHelmet);\n\nvar _propTypes = __webpack_require__(10);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _pageTitle = __webpack_require__(90);\n\nvar _metaTags = __webpack_require__(91);\n\nvar _canonicalLink = __webpack_require__(92);\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 SEO = function (_React$Component) {\n  _inherits(SEO, _React$Component);\n\n  function SEO() {\n    _classCallCheck(this, SEO);\n\n    return _possibleConstructorReturn(this, (SEO.__proto__ || Object.getPrototypeOf(SEO)).apply(this, arguments));\n  }\n\n  _createClass(SEO, [{\n    key: 'render',\n    value: function render() {\n      // props from state\n      var _props = this.props,\n          defaultDescription = _props.defaultDescription,\n          defaultThumbnail = _props.defaultThumbnail,\n          siteDescription = _props.siteDescription,\n          siteHost = _props.siteHost,\n          siteTitle = _props.siteTitle,\n          siteTwitter = _props.siteTwitter;\n      // props from parent\n\n      var _props2 = this.props,\n          asset = _props2.asset,\n          channel = _props2.channel,\n          pageUri = _props2.pageUri;\n      var pageTitle = this.props.pageTitle;\n      // create page title, tags, and canonical link\n\n      pageTitle = (0, _pageTitle.createPageTitle)(siteTitle, pageTitle);\n      var metaTags = (0, _metaTags.createMetaTags)(siteDescription, siteHost, siteTitle, siteTwitter, asset, channel, defaultDescription, defaultThumbnail);\n      var canonicalLink = (0, _canonicalLink.createCanonicalLink)(asset, channel, pageUri, siteHost);\n      // render results\n      return _react2.default.createElement(_reactHelmet2.default, {\n        title: pageTitle,\n        meta: metaTags,\n        link: [{ rel: 'canonical', href: canonicalLink }]\n      });\n    }\n  }]);\n\n  return SEO;\n}(_react2.default.Component);\n\n;\n\nSEO.propTypes = {\n  pageTitle: _propTypes2.default.string,\n  pageUri: _propTypes2.default.string,\n  channel: _propTypes2.default.object,\n  asset: _propTypes2.default.object\n};\n\nexports.default = SEO;\n\n/***/ }),\n/* 90 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar createPageTitle = exports.createPageTitle = function createPageTitle(siteTitle, pageTitle) {\n  if (!pageTitle) {\n    return \"\" + siteTitle;\n  }\n  return siteTitle + \" - \" + pageTitle;\n};\n\n/***/ }),\n/* 91 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar determineOgThumbnailContentType = function determineOgThumbnailContentType(thumbnail) {\n  if (thumbnail) {\n    var fileExt = thumbnail.substring(thumbnail.lastIndexOf('.'));\n    switch (fileExt) {\n      case 'jpeg':\n      case 'jpg':\n        return 'image/jpeg';\n      case 'png':\n        return 'image/png';\n      case 'gif':\n        return 'image/gif';\n      case 'mp4':\n        return 'video/mp4';\n      default:\n        return 'image/jpeg';\n    }\n  }\n  return '';\n};\n\nvar createBasicMetaTags = function createBasicMetaTags(siteHost, siteDescription, siteTitle, siteTwitter) {\n  return [{ property: 'og:title', content: siteTitle }, { property: 'og:url', content: siteHost }, { property: 'og:site_name', content: siteTitle }, { property: 'og:description', content: siteDescription }, { property: 'twitter:site', content: siteTwitter }, { property: 'twitter:card', content: 'summary' }];\n};\n\nvar createChannelMetaTags = function createChannelMetaTags(siteTitle, siteHost, siteTwitter, channel) {\n  var name = channel.name,\n      longId = channel.longId;\n\n  return [{ property: 'og:title', content: name + ' on ' + siteTitle }, { property: 'og:url', content: siteHost + '/' + name + ':' + longId }, { property: 'og:site_name', content: siteTitle }, { property: 'og:description', content: name + ', a channel on ' + siteTitle }, { property: 'twitter:site', content: siteTwitter }, { property: 'twitter:card', content: 'summary' }];\n};\n\nvar createAssetMetaTags = function createAssetMetaTags(siteHost, siteTitle, siteTwitter, asset, defaultDescription, defaultThumbnail) {\n  var claimData = asset.claimData;\n  var contentType = claimData.contentType;\n\n  var embedUrl = siteHost + '/' + claimData.claimId + '/' + claimData.name;\n  var showUrl = siteHost + '/' + claimData.claimId + '/' + claimData.name;\n  var source = siteHost + '/' + claimData.claimId + '/' + claimData.name + '.' + claimData.fileExt;\n  var ogTitle = claimData.title || claimData.name;\n  var ogDescription = claimData.description || defaultDescription;\n  var ogThumbnailContentType = determineOgThumbnailContentType(claimData.thumbnail);\n  var ogThumbnail = claimData.thumbnail || defaultThumbnail;\n  var metaTags = [{ property: 'og:title', content: ogTitle }, { property: 'og:url', content: showUrl }, { property: 'og:site_name', content: siteTitle }, { property: 'og:description', content: ogDescription }, { property: 'og:image:width', content: 600 }, { property: 'og:image:height', content: 315 }, { property: 'twitter:site', content: siteTwitter }];\n  if (contentType === 'video/mp4' || contentType === 'video/webm') {\n    metaTags.push({ property: 'og:video', content: source });\n    metaTags.push({ property: 'og:video:secure_url', content: source });\n    metaTags.push({ property: 'og:video:type', content: contentType });\n    metaTags.push({ property: 'og:image', content: ogThumbnail });\n    metaTags.push({ property: 'og:image:type', content: ogThumbnailContentType });\n    metaTags.push({ property: 'og:type', content: 'video' });\n    metaTags.push({ property: 'twitter:card', content: 'player' });\n    metaTags.push({ property: 'twitter:player', content: embedUrl });\n    metaTags.push({ property: 'twitter:player:width', content: 600 });\n    metaTags.push({ property: 'twitter:text:player_width', content: 600 });\n    metaTags.push({ property: 'twitter:player:height', content: 337 });\n    metaTags.push({ property: 'twitter:player:stream', content: source });\n    metaTags.push({ property: 'twitter:player:stream:content_type', content: contentType });\n  } else {\n    metaTags.push({ property: 'og:image', content: source });\n    metaTags.push({ property: 'og:image:type', content: contentType });\n    metaTags.push({ property: 'og:type', content: 'article' });\n    metaTags.push({ property: 'twitter:card', content: 'summary_large_image' });\n  }\n  return metaTags;\n};\n\nvar createMetaTags = exports.createMetaTags = function createMetaTags(siteDescription, siteHost, siteTitle, siteTwitter, asset, channel, defaultDescription, defaultThumbnail) {\n  if (asset) {\n    return createAssetMetaTags(siteHost, siteTitle, siteTwitter, asset, defaultDescription, defaultThumbnail);\n  };\n  if (channel) {\n    return createChannelMetaTags(siteHost, siteTitle, siteTwitter, channel);\n  };\n  return createBasicMetaTags(siteDescription, siteHost, siteTitle, siteTwitter);\n};\n\n/***/ }),\n/* 92 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar createBasicCanonicalLink = function createBasicCanonicalLink(page, siteHost) {\n  return siteHost + \"/\" + page;\n};\n\nvar createAssetCanonicalLink = function createAssetCanonicalLink(asset, siteHost) {\n  var channelName = void 0,\n      certificateId = void 0,\n      name = void 0,\n      claimId = void 0;\n  if (asset.claimData) {\n    var _asset$claimData = asset.claimData;\n    channelName = _asset$claimData.channelName;\n    certificateId = _asset$claimData.certificateId;\n    name = _asset$claimData.name;\n    claimId = _asset$claimData.claimId;\n  };\n  if (channelName) {\n    return siteHost + \"/\" + channelName + \":\" + certificateId + \"/\" + name;\n  };\n  return siteHost + \"/\" + claimId + \"/\" + name;\n};\n\nvar createChannelCanonicalLink = function createChannelCanonicalLink(channel, siteHost) {\n  var name = channel.name,\n      longId = channel.longId;\n\n  return siteHost + \"/\" + name + \":\" + longId;\n};\n\nvar createCanonicalLink = exports.createCanonicalLink = function createCanonicalLink(asset, channel, page, siteHost) {\n  if (asset) {\n    return createAssetCanonicalLink(asset, siteHost);\n  }\n  if (channel) {\n    return createChannelCanonicalLink(channel, siteHost);\n  }\n  return createBasicCanonicalLink(page, siteHost);\n};\n\n/***/ }),\n/* 93 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\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 = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouterDom = __webpack_require__(3);\n\nvar _Logo = __webpack_require__(94);\n\nvar _Logo2 = _interopRequireDefault(_Logo);\n\nvar _NavBarChannelOptionsDropdown = __webpack_require__(95);\n\nvar _NavBarChannelOptionsDropdown2 = _interopRequireDefault(_NavBarChannelOptionsDropdown);\n\nvar _request = __webpack_require__(11);\n\nvar _request2 = _interopRequireDefault(_request);\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 VIEW = 'VIEW';\nvar LOGOUT = 'LOGOUT';\n\nvar NavBar = function (_React$Component) {\n  _inherits(NavBar, _React$Component);\n\n  function NavBar(props) {\n    _classCallCheck(this, NavBar);\n\n    var _this = _possibleConstructorReturn(this, (NavBar.__proto__ || Object.getPrototypeOf(NavBar)).call(this, props));\n\n    _this.checkForLoggedInUser = _this.checkForLoggedInUser.bind(_this);\n    _this.logoutUser = _this.logoutUser.bind(_this);\n    _this.handleSelection = _this.handleSelection.bind(_this);\n    return _this;\n  }\n\n  _createClass(NavBar, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      // check to see if the user is already logged in\n      this.checkForLoggedInUser();\n    }\n  }, {\n    key: 'checkForLoggedInUser',\n    value: function checkForLoggedInUser() {\n      var _this2 = this;\n\n      var params = { credentials: 'include' };\n      (0, _request2.default)('/user', params).then(function (_ref) {\n        var data = _ref.data;\n\n        _this2.props.onChannelLogin(data.channelName, data.shortChannelId, data.channelClaimId);\n      }).catch(function (error) {\n        console.log('/user error:', error.message);\n      });\n    }\n  }, {\n    key: 'logoutUser',\n    value: function logoutUser() {\n      var _this3 = this;\n\n      var params = { credentials: 'include' };\n      (0, _request2.default)('/logout', params).then(function () {\n        _this3.props.onChannelLogout();\n      }).catch(function (error) {\n        console.log('/logout error', error.message);\n      });\n    }\n  }, {\n    key: 'handleSelection',\n    value: function handleSelection(event) {\n      var value = event.target.selectedOptions[0].value;\n      switch (value) {\n        case LOGOUT:\n          this.logoutUser();\n          break;\n        case VIEW:\n          // redirect to channel page\n          this.props.history.push('/' + this.props.channelName + ':' + this.props.channelLongId);\n          break;\n        default:\n          break;\n      }\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var siteDescription = this.props.siteDescription;\n\n      return _react2.default.createElement(\n        'div',\n        { className: 'row row--wide nav-bar' },\n        _react2.default.createElement(\n          'div',\n          { className: 'row row--padded row--short flex-container--row flex-container--space-between-center' },\n          _react2.default.createElement(_Logo2.default, null),\n          _react2.default.createElement(\n            'div',\n            { className: 'nav-bar--center' },\n            _react2.default.createElement(\n              'span',\n              { className: 'nav-bar-tagline' },\n              siteDescription\n            )\n          ),\n          _react2.default.createElement(\n            'div',\n            { className: 'nav-bar--right' },\n            _react2.default.createElement(\n              _reactRouterDom.NavLink,\n              { className: 'nav-bar-link link--nav', activeClassName: 'link--nav-active', to: '/', exact: true },\n              'Publish'\n            ),\n            _react2.default.createElement(\n              _reactRouterDom.NavLink,\n              { className: 'nav-bar-link link--nav', activeClassName: 'link--nav-active', to: '/about' },\n              'About'\n            ),\n            this.props.channelName ? _react2.default.createElement(_NavBarChannelOptionsDropdown2.default, {\n              channelName: this.props.channelName,\n              handleSelection: this.handleSelection,\n              defaultSelection: this.props.channelName,\n              VIEW: VIEW,\n              LOGOUT: LOGOUT\n            }) : _react2.default.createElement(\n              _reactRouterDom.NavLink,\n              { id: 'nav-bar-login-link', className: 'nav-bar-link link--nav', activeClassName: 'link--nav-active', to: '/login' },\n              'Channel'\n            )\n          )\n        )\n      );\n    }\n  }]);\n\n  return NavBar;\n}(_react2.default.Component);\n\nexports.default = (0, _reactRouterDom.withRouter)(NavBar);\n\n/***/ }),\n/* 94 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouterDom = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction Logo() {\n  return _react2.default.createElement(\n    'svg',\n    { version: '1.1', id: 'Layer_1', x: '0px', y: '0px', height: '24px', viewBox: '0 0 80 31', enableBackground: 'new 0 0 80 31', className: 'nav-bar-logo' },\n    _react2.default.createElement(\n      _reactRouterDom.Link,\n      { to: '/' },\n      _react2.default.createElement(\n        'title',\n        null,\n        'Logo'\n      ),\n      _react2.default.createElement(\n        'desc',\n        null,\n        'Spee.ch logo'\n      ),\n      _react2.default.createElement(\n        'g',\n        { id: 'About' },\n        _react2.default.createElement(\n          'g',\n          { id: 'Publish-Form-V2-_x28_filled_x29_', transform: 'translate(-42.000000, -23.000000)' },\n          _react2.default.createElement(\n            'g',\n            { id: 'Group-17', transform: 'translate(42.000000, 22.000000)' },\n            _react2.default.createElement(\n              'text',\n              { transform: 'matrix(1 0 0 1 0 20)', fontSize: '25', fontFamily: 'Roboto' },\n              'Spee<h'\n            ),\n            _react2.default.createElement(\n              'g',\n              { id: 'Group-16', transform: 'translate(0.000000, 30.000000)' },\n              _react2.default.createElement('path', { id: 'Line-8', fill: 'none', stroke: '#09F911', strokeWidth: '1', strokeLinecap: 'square', d: 'M0.5,1.5h15' }),\n              _react2.default.createElement('path', { id: 'Line-8-Copy', fill: 'none', stroke: '#029D74', strokeWidth: '1', strokeLinecap: 'square', d: 'M16.5,1.5h15' }),\n              _react2.default.createElement('path', { id: 'Line-8-Copy-2', fill: 'none', stroke: '#E35BD8', strokeWidth: '1', strokeLinecap: 'square', d: 'M32.5,1.5h15' }),\n              _react2.default.createElement('path', { id: 'Line-8-Copy-3', fill: 'none', stroke: '#4156C5', strokeWidth: '1', strokeLinecap: 'square', d: 'M48.5,1.5h15' }),\n              _react2.default.createElement('path', { id: 'Line-8-Copy-4', fill: 'none', stroke: '#635688', strokeWidth: '1', strokeLinecap: 'square', d: 'M64.5,1.5h15' })\n            )\n          )\n        )\n      )\n    )\n  );\n};\n\nexports.default = Logo;\n\n/***/ }),\n/* 95 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction NavBarChannelDropdown(_ref) {\n  var channelName = _ref.channelName,\n      handleSelection = _ref.handleSelection,\n      defaultSelection = _ref.defaultSelection,\n      VIEW = _ref.VIEW,\n      LOGOUT = _ref.LOGOUT;\n\n  return _react2.default.createElement(\n    'select',\n    { type: 'text', id: 'nav-bar-channel-select', className: 'select select--arrow link--nav', onChange: handleSelection, value: defaultSelection },\n    _react2.default.createElement(\n      'option',\n      { id: 'nav-bar-channel-select-channel-option' },\n      channelName\n    ),\n    _react2.default.createElement(\n      'option',\n      { value: VIEW },\n      'View'\n    ),\n    _react2.default.createElement(\n      'option',\n      { value: LOGOUT },\n      'Logout'\n    )\n  );\n};\n\nexports.default = NavBarChannelDropdown;\n\n/***/ }),\n/* 96 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"cross-fetch/polyfill\");\n\n/***/ }),\n/* 97 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _view = __webpack_require__(98);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n  var publish = _ref.publish;\n\n  return {\n    disabled: publish.disabled,\n    file: publish.file,\n    status: publish.status.status\n  };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default);\n\n/***/ }),\n/* 98 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\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 = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _Dropzone = __webpack_require__(40);\n\nvar _Dropzone2 = _interopRequireDefault(_Dropzone);\n\nvar _PublishDetails = __webpack_require__(102);\n\nvar _PublishDetails2 = _interopRequireDefault(_PublishDetails);\n\nvar _PublishStatus = __webpack_require__(120);\n\nvar _PublishStatus2 = _interopRequireDefault(_PublishStatus);\n\nvar _PublishDisabledMessage = __webpack_require__(123);\n\nvar _PublishDisabledMessage2 = _interopRequireDefault(_PublishDisabledMessage);\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 PublishTool = function (_React$Component) {\n  _inherits(PublishTool, _React$Component);\n\n  function PublishTool() {\n    _classCallCheck(this, PublishTool);\n\n    return _possibleConstructorReturn(this, (PublishTool.__proto__ || Object.getPrototypeOf(PublishTool)).apply(this, arguments));\n  }\n\n  _createClass(PublishTool, [{\n    key: 'render',\n    value: function render() {\n      if (this.props.disabled) {\n        console.log('publish is disabled');\n        return _react2.default.createElement(_PublishDisabledMessage2.default, null);\n      } else {\n        console.log('publish is not disabled');\n        if (this.props.file) {\n          if (this.props.status) {\n            return _react2.default.createElement(_PublishStatus2.default, null);\n          } else {\n            return _react2.default.createElement(_PublishDetails2.default, null);\n          }\n        }\n        return _react2.default.createElement(_Dropzone2.default, null);\n      }\n    }\n  }]);\n\n  return PublishTool;\n}(_react2.default.Component);\n\n;\n\nexports.default = PublishTool;\n\n/***/ }),\n/* 99 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\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 = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _file = __webpack_require__(100);\n\nvar _PublishPreview = __webpack_require__(101);\n\nvar _PublishPreview2 = _interopRequireDefault(_PublishPreview);\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 Dropzone = function (_React$Component) {\n  _inherits(Dropzone, _React$Component);\n\n  function Dropzone(props) {\n    _classCallCheck(this, Dropzone);\n\n    var _this = _possibleConstructorReturn(this, (Dropzone.__proto__ || Object.getPrototypeOf(Dropzone)).call(this, props));\n\n    _this.state = {\n      dragOver: false,\n      mouseOver: false,\n      dimPreview: false\n    };\n    _this.handleDrop = _this.handleDrop.bind(_this);\n    _this.handleDragOver = _this.handleDragOver.bind(_this);\n    _this.handleDragEnd = _this.handleDragEnd.bind(_this);\n    _this.handleDragEnter = _this.handleDragEnter.bind(_this);\n    _this.handleDragLeave = _this.handleDragLeave.bind(_this);\n    _this.handleMouseEnter = _this.handleMouseEnter.bind(_this);\n    _this.handleMouseLeave = _this.handleMouseLeave.bind(_this);\n    _this.handleClick = _this.handleClick.bind(_this);\n    _this.handleFileInput = _this.handleFileInput.bind(_this);\n    _this.chooseFile = _this.chooseFile.bind(_this);\n    return _this;\n  }\n\n  _createClass(Dropzone, [{\n    key: 'handleDrop',\n    value: function handleDrop(event) {\n      event.preventDefault();\n      this.setState({ dragOver: false });\n      // if dropped items aren't files, reject them\n      var dt = event.dataTransfer;\n      if (dt.items) {\n        if (dt.items[0].kind === 'file') {\n          var droppedFile = dt.items[0].getAsFile();\n          this.chooseFile(droppedFile);\n        }\n      }\n    }\n  }, {\n    key: 'handleDragOver',\n    value: function handleDragOver(event) {\n      event.preventDefault();\n    }\n  }, {\n    key: 'handleDragEnd',\n    value: function handleDragEnd(event) {\n      var dt = event.dataTransfer;\n      if (dt.items) {\n        for (var i = 0; i < dt.items.length; i++) {\n          dt.items.remove(i);\n        }\n      } else {\n        event.dataTransfer.clearData();\n      }\n    }\n  }, {\n    key: 'handleDragEnter',\n    value: function handleDragEnter() {\n      this.setState({ dragOver: true, dimPreview: true });\n    }\n  }, {\n    key: 'handleDragLeave',\n    value: function handleDragLeave() {\n      this.setState({ dragOver: false, dimPreview: false });\n    }\n  }, {\n    key: 'handleMouseEnter',\n    value: function handleMouseEnter() {\n      this.setState({ mouseOver: true, dimPreview: true });\n    }\n  }, {\n    key: 'handleMouseLeave',\n    value: function handleMouseLeave() {\n      this.setState({ mouseOver: false, dimPreview: false });\n    }\n  }, {\n    key: 'handleClick',\n    value: function handleClick(event) {\n      event.preventDefault();\n      document.getElementById('file_input').click();\n    }\n  }, {\n    key: 'handleFileInput',\n    value: function handleFileInput(event) {\n      event.preventDefault();\n      var fileList = event.target.files;\n      this.chooseFile(fileList[0]);\n    }\n  }, {\n    key: 'chooseFile',\n    value: function chooseFile(file) {\n      if (file) {\n        try {\n          (0, _file.validateFile)(file); // validate the file's name, type, and size\n        } catch (error) {\n          return this.props.setFileError(error.message);\n        }\n        // stage it so it will be ready when the publish button is clicked\n        this.props.selectFile(file);\n      }\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      return _react2.default.createElement(\n        'div',\n        { className: 'row row--tall flex-container--column' },\n        _react2.default.createElement(\n          'form',\n          null,\n          _react2.default.createElement('input', { className: 'input-file', type: 'file', id: 'file_input', name: 'file_input', accept: 'video/*,image/*', onChange: this.handleFileInput, encType: 'multipart/form-data' })\n        ),\n        _react2.default.createElement(\n          'div',\n          { id: 'preview-dropzone', className: 'row row--padded row--tall dropzone' + (this.state.dragOver ? ' dropzone--drag-over' : ''), onDrop: this.handleDrop, onDragOver: this.handleDragOver, onDragEnd: this.handleDragEnd, onDragEnter: this.handleDragEnter, onDragLeave: this.handleDragLeave, onMouseEnter: this.handleMouseEnter, onMouseLeave: this.handleMouseLeave, onClick: this.handleClick },\n          this.props.file ? _react2.default.createElement(\n            'div',\n            null,\n            _react2.default.createElement(_PublishPreview2.default, {\n              dimPreview: this.state.dimPreview,\n              file: this.props.file,\n              thumbnail: this.props.thumbnail\n            }),\n            _react2.default.createElement(\n              'div',\n              { id: 'dropzone-text-holder', className: 'flex-container--column flex-container--center-center' },\n              this.state.dragOver ? _react2.default.createElement(\n                'div',\n                { id: 'dropzone-dragover' },\n                _react2.default.createElement(\n                  'p',\n                  { className: 'blue' },\n                  'Drop it.'\n                )\n              ) : null,\n              this.state.mouseOver ? _react2.default.createElement(\n                'div',\n                { id: 'dropzone-instructions' },\n                _react2.default.createElement(\n                  'p',\n                  { className: 'info-message-placeholder info-message--failure', id: 'input-error-file-selection' },\n                  this.props.fileError\n                ),\n                _react2.default.createElement(\n                  'p',\n                  null,\n                  'Drag & drop image or video here to publish'\n                ),\n                _react2.default.createElement(\n                  'p',\n                  { className: 'fine-print' },\n                  'OR'\n                ),\n                _react2.default.createElement(\n                  'p',\n                  { className: 'blue--underlined' },\n                  'CHOOSE FILE'\n                )\n              ) : null\n            )\n          ) : _react2.default.createElement(\n            'div',\n            { id: 'dropzone-text-holder', className: 'flex-container--column flex-container--center-center' },\n            this.state.dragOver ? _react2.default.createElement(\n              'div',\n              { id: 'dropzone-dragover' },\n              _react2.default.createElement(\n                'p',\n                { className: 'blue' },\n                'Drop it.'\n              )\n            ) : _react2.default.createElement(\n              'div',\n              { id: 'dropzone-instructions' },\n              _react2.default.createElement(\n                'p',\n                { className: 'info-message-placeholder info-message--failure', id: 'input-error-file-selection' },\n                this.props.fileError\n              ),\n              _react2.default.createElement(\n                'p',\n                null,\n                'Drag & drop image or video here to publish'\n              ),\n              _react2.default.createElement(\n                'p',\n                { className: 'fine-print' },\n                'OR'\n              ),\n              _react2.default.createElement(\n                'p',\n                { className: 'blue--underlined' },\n                'CHOOSE FILE'\n              )\n            )\n          )\n        )\n      );\n    }\n  }]);\n\n  return Dropzone;\n}(_react2.default.Component);\n\n;\n\nexports.default = Dropzone;\n\n/***/ }),\n/* 100 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = {\n  validateFile: function validateFile(file) {\n    if (!file) {\n      throw new Error('no file provided');\n    }\n    if (/'/.test(file.name)) {\n      throw new Error('apostrophes are not allowed in the file name');\n    }\n    // validate size and type\n    switch (file.type) {\n      case 'image/jpeg':\n      case 'image/jpg':\n      case 'image/png':\n        if (file.size > 10000000) {\n          throw new Error('Sorry, images are limited to 10 megabytes.');\n        }\n        break;\n      case 'image/gif':\n        if (file.size > 50000000) {\n          throw new Error('Sorry, GIFs are limited to 50 megabytes.');\n        }\n        break;\n      case 'video/mp4':\n        if (file.size > 50000000) {\n          throw new Error('Sorry, videos are limited to 50 megabytes.');\n        }\n        break;\n      default:\n        throw new Error(file.type + ' is not a supported file type. Only, .jpeg, .png, .gif, and .mp4 files are currently supported.');\n    }\n  }\n};\n\n/***/ }),\n/* 101 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\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 = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(10);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\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 PublishPreview = function (_React$Component) {\n  _inherits(PublishPreview, _React$Component);\n\n  function PublishPreview(props) {\n    _classCallCheck(this, PublishPreview);\n\n    var _this = _possibleConstructorReturn(this, (PublishPreview.__proto__ || Object.getPrototypeOf(PublishPreview)).call(this, props));\n\n    _this.state = {\n      imgSource: '',\n      defaultThumbnail: '/assets/img/video_thumb_default.png'\n    };\n    return _this;\n  }\n\n  _createClass(PublishPreview, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      this.setPreviewImageSource(this.props.file);\n    }\n  }, {\n    key: 'componentWillReceiveProps',\n    value: function componentWillReceiveProps(newProps) {\n      if (newProps.file !== this.props.file) {\n        this.setPreviewImageSource(newProps.file);\n      }\n      if (newProps.thumbnail !== this.props.thumbnail) {\n        if (newProps.thumbnail) {\n          this.setPreviewImageSourceFromFile(newProps.thumbnail);\n        } else {\n          this.setState({ imgSource: this.state.defaultThumbnail });\n        }\n      }\n    }\n  }, {\n    key: 'setPreviewImageSourceFromFile',\n    value: function setPreviewImageSourceFromFile(file) {\n      var _this2 = this;\n\n      var previewReader = new FileReader();\n      previewReader.readAsDataURL(file);\n      previewReader.onloadend = function () {\n        _this2.setState({ imgSource: previewReader.result });\n      };\n    }\n  }, {\n    key: 'setPreviewImageSource',\n    value: function setPreviewImageSource(file) {\n      if (file.type !== 'video/mp4') {\n        this.setPreviewImageSourceFromFile(file);\n      } else {\n        if (this.props.thumbnail) {\n          this.setPreviewImageSourceFromFile(this.props.thumbnail);\n        }\n        this.setState({ imgSource: this.state.defaultThumbnail });\n      }\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      return _react2.default.createElement('img', {\n        id: 'dropzone-preview',\n        src: this.state.imgSource,\n        className: this.props.dimPreview ? 'dim' : '',\n        alt: 'publish preview'\n      });\n    }\n  }]);\n\n  return PublishPreview;\n}(_react2.default.Component);\n\n;\n\nPublishPreview.propTypes = {\n  dimPreview: _propTypes2.default.bool.isRequired,\n  file: _propTypes2.default.object.isRequired,\n  thumbnail: _propTypes2.default.object\n};\n\nexports.default = PublishPreview;\n\n/***/ }),\n/* 102 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _publish = __webpack_require__(4);\n\nvar _view = __webpack_require__(103);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n  var channel = _ref.channel,\n      publish = _ref.publish;\n\n  return {\n    file: publish.file\n  };\n};\n\nvar mapDispatchToProps = {\n  clearFile: _publish.clearFile,\n  startPublish: _publish.startPublish\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 103 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\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 = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouterDom = __webpack_require__(3);\n\nvar _Dropzone = __webpack_require__(40);\n\nvar _Dropzone2 = _interopRequireDefault(_Dropzone);\n\nvar _PublishTitleInput = __webpack_require__(104);\n\nvar _PublishTitleInput2 = _interopRequireDefault(_PublishTitleInput);\n\nvar _PublishUrlInput = __webpack_require__(106);\n\nvar _PublishUrlInput2 = _interopRequireDefault(_PublishUrlInput);\n\nvar _PublishThumbnailInput = __webpack_require__(109);\n\nvar _PublishThumbnailInput2 = _interopRequireDefault(_PublishThumbnailInput);\n\nvar _PublishMetadataInputs = __webpack_require__(111);\n\nvar _PublishMetadataInputs2 = _interopRequireDefault(_PublishMetadataInputs);\n\nvar _ChannelSelect = __webpack_require__(114);\n\nvar _ChannelSelect2 = _interopRequireDefault(_ChannelSelect);\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 PublishDetails = function (_React$Component) {\n  _inherits(PublishDetails, _React$Component);\n\n  function PublishDetails(props) {\n    _classCallCheck(this, PublishDetails);\n\n    var _this = _possibleConstructorReturn(this, (PublishDetails.__proto__ || Object.getPrototypeOf(PublishDetails)).call(this, props));\n\n    _this.onPublishSubmit = _this.onPublishSubmit.bind(_this);\n    return _this;\n  }\n\n  _createClass(PublishDetails, [{\n    key: 'onPublishSubmit',\n    value: function onPublishSubmit() {\n      this.props.startPublish(this.props.history);\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      return _react2.default.createElement(\n        'div',\n        { className: 'row row--no-bottom' },\n        _react2.default.createElement(\n          'div',\n          { className: 'column column--10' },\n          _react2.default.createElement(_PublishTitleInput2.default, null)\n        ),\n        _react2.default.createElement(\n          'div',\n          { className: 'column column--5 column--sml-10' },\n          _react2.default.createElement(\n            'div',\n            { className: 'row row--padded' },\n            _react2.default.createElement(_Dropzone2.default, null)\n          )\n        ),\n        _react2.default.createElement(\n          'div',\n          { className: 'column column--5 column--sml-10 align-content-top' },\n          _react2.default.createElement(\n            'div',\n            { id: 'publish-active-area', className: 'row row--padded' },\n            _react2.default.createElement(\n              'div',\n              { className: 'row row--padded row--no-top row--wide' },\n              _react2.default.createElement(_PublishUrlInput2.default, null)\n            ),\n            _react2.default.createElement(\n              'div',\n              { className: 'row row--padded row--no-top row--wide' },\n              _react2.default.createElement(_ChannelSelect2.default, null)\n            ),\n            this.props.file.type === 'video/mp4' && _react2.default.createElement(\n              'div',\n              { className: 'row row--padded row--no-top row--wide ' },\n              _react2.default.createElement(_PublishThumbnailInput2.default, null)\n            ),\n            _react2.default.createElement(\n              'div',\n              { className: 'row row--padded row--no-top row--no-bottom row--wide' },\n              _react2.default.createElement(_PublishMetadataInputs2.default, null)\n            ),\n            _react2.default.createElement(\n              'div',\n              { className: 'row row--wide align-content-center' },\n              _react2.default.createElement(\n                'button',\n                { id: 'publish-submit', className: 'button--primary button--large', onClick: this.onPublishSubmit },\n                'Publish'\n              )\n            ),\n            _react2.default.createElement(\n              'div',\n              { className: 'row row--padded row--no-bottom align-content-center' },\n              _react2.default.createElement(\n                'button',\n                { className: 'button--cancel', onClick: this.props.clearFile },\n                'Cancel'\n              )\n            ),\n            _react2.default.createElement(\n              'div',\n              { className: 'row row--short align-content-center' },\n              _react2.default.createElement(\n                'p',\n                { className: 'fine-print' },\n                'By clicking \\'Publish\\', you affirm that you have the rights to publish this content to the LBRY network, and that you understand the properties of publishing it to a decentralized, user-controlled network. ',\n                _react2.default.createElement(\n                  'a',\n                  { className: 'link--primary', target: '_blank', href: 'https://lbry.io/learn' },\n                  'Read more.'\n                )\n              )\n            )\n          )\n        )\n      );\n    }\n  }]);\n\n  return PublishDetails;\n}(_react2.default.Component);\n\n;\n\nexports.default = (0, _reactRouterDom.withRouter)(PublishDetails);\n\n/***/ }),\n/* 104 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _publish = __webpack_require__(4);\n\nvar _view = __webpack_require__(105);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n  var publish = _ref.publish;\n\n  return {\n    title: publish.metadata.title\n  };\n};\n\nvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n  return {\n    onMetadataChange: function onMetadataChange(name, value) {\n      dispatch((0, _publish.updateMetadata)(name, value));\n    }\n  };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 105 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\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 = __webpack_require__(0);\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 PublishTitleInput = function (_React$Component) {\n  _inherits(PublishTitleInput, _React$Component);\n\n  function PublishTitleInput(props) {\n    _classCallCheck(this, PublishTitleInput);\n\n    var _this = _possibleConstructorReturn(this, (PublishTitleInput.__proto__ || Object.getPrototypeOf(PublishTitleInput)).call(this, props));\n\n    _this.handleInput = _this.handleInput.bind(_this);\n    return _this;\n  }\n\n  _createClass(PublishTitleInput, [{\n    key: 'handleInput',\n    value: function handleInput(e) {\n      var name = e.target.name;\n      var value = e.target.value;\n      this.props.onMetadataChange(name, value);\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      return _react2.default.createElement('input', { type: 'text', id: 'publish-title', className: 'input-text text--large input-text--full-width', name: 'title', placeholder: 'Give your post a title...', onChange: this.handleInput, value: this.props.title });\n    }\n  }]);\n\n  return PublishTitleInput;\n}(_react2.default.Component);\n\nexports.default = PublishTitleInput;\n\n/***/ }),\n/* 106 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _publish = __webpack_require__(4);\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _view = __webpack_require__(107);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n  var channel = _ref.channel,\n      publish = _ref.publish;\n\n  return {\n    loggedInChannelName: channel.loggedInChannel.name,\n    loggedInChannelShortId: channel.loggedInChannel.shortId,\n    fileName: publish.file.name,\n    publishInChannel: publish.publishInChannel,\n    selectedChannel: publish.selectedChannel,\n    claim: publish.claim,\n    urlError: publish.error.url\n  };\n};\n\nvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n  return {\n    onClaimChange: function onClaimChange(value) {\n      dispatch((0, _publish.updateClaim)(value));\n      dispatch((0, _publish.updateError)('publishSubmit', null));\n    },\n    onUrlError: function onUrlError(value) {\n      dispatch((0, _publish.updateError)('url', value));\n    }\n  };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 107 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\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 = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _request = __webpack_require__(11);\n\nvar _request2 = _interopRequireDefault(_request);\n\nvar _PublishUrlMiddleDisplay = __webpack_require__(108);\n\nvar _PublishUrlMiddleDisplay2 = _interopRequireDefault(_PublishUrlMiddleDisplay);\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 PublishUrlInput = function (_React$Component) {\n  _inherits(PublishUrlInput, _React$Component);\n\n  function PublishUrlInput(props) {\n    _classCallCheck(this, PublishUrlInput);\n\n    var _this = _possibleConstructorReturn(this, (PublishUrlInput.__proto__ || Object.getPrototypeOf(PublishUrlInput)).call(this, props));\n\n    _this.handleInput = _this.handleInput.bind(_this);\n    return _this;\n  }\n\n  _createClass(PublishUrlInput, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      var _props = this.props,\n          claim = _props.claim,\n          fileName = _props.fileName;\n\n      if (!claim) {\n        this.setClaimName(fileName);\n      }\n    }\n  }, {\n    key: 'componentWillReceiveProps',\n    value: function componentWillReceiveProps(_ref) {\n      var claim = _ref.claim,\n          fileName = _ref.fileName;\n\n      // if a new file was chosen, update the claim name\n      if (fileName !== this.props.fileName) {\n        return this.setClaimName(fileName);\n      }\n      // if the claim has updated, check its availability\n      if (claim !== this.props.claim) {\n        this.validateClaim(claim);\n      }\n    }\n  }, {\n    key: 'handleInput',\n    value: function handleInput(event) {\n      var value = event.target.value;\n      value = this.cleanseInput(value);\n      // update the state\n      this.props.onClaimChange(value);\n    }\n  }, {\n    key: 'cleanseInput',\n    value: function cleanseInput(input) {\n      input = input.replace(/\\s+/g, '-'); // replace spaces with dashes\n      input = input.replace(/[^A-Za-z0-9-]/g, ''); // remove all characters that are not A-Z, a-z, 0-9, or '-'\n      return input;\n    }\n  }, {\n    key: 'setClaimName',\n    value: function setClaimName(fileName) {\n      var fileNameWithoutEnding = fileName.substring(0, fileName.lastIndexOf('.'));\n      var cleanClaimName = this.cleanseInput(fileNameWithoutEnding);\n      this.props.onClaimChange(cleanClaimName);\n    }\n  }, {\n    key: 'validateClaim',\n    value: function validateClaim(claim) {\n      var _this2 = this;\n\n      if (!claim) {\n        return this.props.onUrlError('Enter a url above');\n      }\n      (0, _request2.default)('/api/claim/availability/' + claim).then(function () {\n        _this2.props.onUrlError(null);\n      }).catch(function (error) {\n        _this2.props.onUrlError(error.message);\n      });\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _props2 = this.props,\n          claim = _props2.claim,\n          loggedInChannelName = _props2.loggedInChannelName,\n          loggedInChannelShortId = _props2.loggedInChannelShortId,\n          publishInChannel = _props2.publishInChannel,\n          selectedChannel = _props2.selectedChannel,\n          urlError = _props2.urlError;\n\n      return _react2.default.createElement(\n        'div',\n        { className: 'column column--10 column--sml-10' },\n        _react2.default.createElement(\n          'div',\n          { className: 'input-text--primary span--relative' },\n          _react2.default.createElement(\n            'span',\n            { className: 'url-text--secondary' },\n            'spee.ch / '\n          ),\n          _react2.default.createElement(_PublishUrlMiddleDisplay2.default, {\n            publishInChannel: publishInChannel,\n            selectedChannel: selectedChannel,\n            loggedInChannelName: loggedInChannelName,\n            loggedInChannelShortId: loggedInChannelShortId\n          }),\n          _react2.default.createElement('input', { type: 'text', id: 'claim-name-input', className: 'input-text', name: 'claim', placeholder: 'your-url-here', onChange: this.handleInput, value: claim }),\n          claim && !urlError && _react2.default.createElement(\n            'span',\n            { id: 'input-success-claim-name', className: 'info-message--success span--absolute' },\n            '\\u2713'\n          ),\n          urlError && _react2.default.createElement(\n            'span',\n            { id: 'input-success-channel-name', className: 'info-message--failure span--absolute' },\n            '\\u2716'\n          )\n        ),\n        _react2.default.createElement(\n          'div',\n          null,\n          urlError ? _react2.default.createElement(\n            'p',\n            { id: 'input-error-claim-name', className: 'info-message--failure' },\n            urlError\n          ) : _react2.default.createElement(\n            'p',\n            { className: 'info-message' },\n            'Choose a custom url'\n          )\n        )\n      );\n    }\n  }]);\n\n  return PublishUrlInput;\n}(_react2.default.Component);\n\nexports.default = PublishUrlInput;\n\n/***/ }),\n/* 108 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(10);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction UrlMiddle(_ref) {\n  var publishInChannel = _ref.publishInChannel,\n      selectedChannel = _ref.selectedChannel,\n      loggedInChannelName = _ref.loggedInChannelName,\n      loggedInChannelShortId = _ref.loggedInChannelShortId;\n\n  if (publishInChannel) {\n    if (selectedChannel === loggedInChannelName) {\n      return _react2.default.createElement(\n        'span',\n        { id: 'url-channel', className: 'url-text--secondary' },\n        loggedInChannelName,\n        ':',\n        loggedInChannelShortId,\n        ' /'\n      );\n    }\n    return _react2.default.createElement(\n      'span',\n      { id: 'url-channel-placeholder', className: 'url-text--secondary tooltip' },\n      '@channel',\n      _react2.default.createElement(\n        'span',\n        {\n          className: 'tooltip-text' },\n        'Select a channel below'\n      ),\n      ' /'\n    );\n  }\n  return _react2.default.createElement(\n    'span',\n    { id: 'url-no-channel-placeholder', className: 'url-text--secondary tooltip' },\n    'xyz',\n    _react2.default.createElement(\n      'span',\n      { className: 'tooltip-text' },\n      'This will be a random id'\n    ),\n    ' /'\n  );\n}\n\nUrlMiddle.propTypes = {\n  publishInChannel: _propTypes2.default.bool.isRequired,\n  loggedInChannelName: _propTypes2.default.string,\n  loggedInChannelShortId: _propTypes2.default.string\n};\n\nexports.default = UrlMiddle;\n\n/***/ }),\n/* 109 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _publish = __webpack_require__(4);\n\nvar _view = __webpack_require__(110);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n  var file = _ref.publish.file;\n\n  return {\n    file: file\n  };\n};\n\nvar mapDispatchToProps = {\n  onNewThumbnail: _publish.onNewThumbnail\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 110 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\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 = __webpack_require__(0);\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\nfunction dataURItoBlob(dataURI) {\n  // convert base64/URLEncoded data component to raw binary data held in a string\n  var byteString = atob(dataURI.split(',')[1]);\n  // separate out the mime component\n  var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];\n  // write the bytes of the string to a typed array\n  var ia = new Uint8Array(byteString.length);\n  for (var i = 0; i < byteString.length; i++) {\n    ia[i] = byteString.charCodeAt(i);\n  }\n  return new Blob([ia], { type: mimeString });\n}\n\nvar PublishThumbnailInput = function (_React$Component) {\n  _inherits(PublishThumbnailInput, _React$Component);\n\n  function PublishThumbnailInput(props) {\n    _classCallCheck(this, PublishThumbnailInput);\n\n    var _this = _possibleConstructorReturn(this, (PublishThumbnailInput.__proto__ || Object.getPrototypeOf(PublishThumbnailInput)).call(this, props));\n\n    _this.state = {\n      videoSource: null,\n      error: null,\n      sliderMinRange: 1,\n      sliderMaxRange: null,\n      sliderValue: null\n    };\n    _this.handleVideoLoadedData = _this.handleVideoLoadedData.bind(_this);\n    _this.handleSliderChange = _this.handleSliderChange.bind(_this);\n    _this.createThumbnail = _this.createThumbnail.bind(_this);\n    return _this;\n  }\n\n  _createClass(PublishThumbnailInput, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      var file = this.props.file;\n\n      this.setVideoSource(file);\n    }\n  }, {\n    key: 'componentWillReceiveProps',\n    value: function componentWillReceiveProps(nextProps) {\n      // if file changes\n      if (nextProps.file && nextProps.file !== this.props.file) {\n        var file = nextProps.file;\n\n        this.setVideoSource(file);\n      };\n    }\n  }, {\n    key: 'setVideoSource',\n    value: function setVideoSource(file) {\n      var _this2 = this;\n\n      var previewReader = new FileReader();\n      previewReader.readAsDataURL(file);\n      previewReader.onloadend = function () {\n        var dataUri = previewReader.result;\n        var blob = dataURItoBlob(dataUri);\n        var videoSource = URL.createObjectURL(blob);\n        _this2.setState({ videoSource: videoSource });\n      };\n    }\n  }, {\n    key: 'handleVideoLoadedData',\n    value: function handleVideoLoadedData(event) {\n      var duration = event.target.duration;\n      var totalMinutes = Math.floor(duration / 60);\n      var totalSeconds = Math.floor(duration % 60);\n      // set the slider\n      this.setState({\n        sliderMaxRange: duration * 100,\n        sliderValue: duration * 100 / 2,\n        totalMinutes: totalMinutes,\n        totalSeconds: totalSeconds\n      });\n      // update the current time of the video\n      var video = document.getElementById('video-thumb-player');\n      video.currentTime = duration / 2;\n    }\n  }, {\n    key: 'handleSliderChange',\n    value: function handleSliderChange(event) {\n      var value = parseInt(event.target.value);\n      // update the slider value\n      this.setState({\n        sliderValue: value\n      });\n      // update the current time of the video\n      var video = document.getElementById('video-thumb-player');\n      video.currentTime = value / 100;\n    }\n  }, {\n    key: 'createThumbnail',\n    value: function createThumbnail() {\n      // take a snapshot\n      var video = document.getElementById('video-thumb-player');\n      var canvas = document.createElement('canvas');\n      canvas.width = video.videoWidth;\n      canvas.height = video.videoHeight;\n      canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);\n      var dataUrl = canvas.toDataURL();\n      var blob = dataURItoBlob(dataUrl);\n      var snapshot = new File([blob], 'thumbnail.png', {\n        type: 'image/png'\n      });\n      // set the thumbnail in redux store\n      if (snapshot) {\n        this.props.onNewThumbnail(snapshot);\n      }\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _state = this.state,\n          error = _state.error,\n          videoSource = _state.videoSource,\n          sliderMinRange = _state.sliderMinRange,\n          sliderMaxRange = _state.sliderMaxRange,\n          sliderValue = _state.sliderValue,\n          totalMinutes = _state.totalMinutes,\n          totalSeconds = _state.totalSeconds;\n\n      return _react2.default.createElement(\n        'div',\n        null,\n        _react2.default.createElement(\n          'label',\n          { className: 'label' },\n          'Thumbnail:'\n        ),\n        _react2.default.createElement('video', {\n          id: 'video-thumb-player',\n          preload: 'metadata',\n          muted: true,\n          style: { display: 'none' },\n          playsInline: true,\n          onLoadedData: this.handleVideoLoadedData,\n          src: videoSource,\n          onSeeked: this.createThumbnail\n        }),\n        sliderValue ? _react2.default.createElement(\n          'div',\n          null,\n          _react2.default.createElement(\n            'div',\n            { className: 'flex-container--row flex-container--space-between-center', style: { width: '100%' } },\n            _react2.default.createElement(\n              'span',\n              { className: 'info-message' },\n              '0\\'00\"'\n            ),\n            _react2.default.createElement(\n              'span',\n              { className: 'info-message' },\n              totalMinutes,\n              '\\'',\n              totalSeconds,\n              '\"'\n            )\n          ),\n          _react2.default.createElement(\n            'div',\n            null,\n            _react2.default.createElement('input', {\n              type: 'range',\n              min: sliderMinRange,\n              max: sliderMaxRange,\n              value: sliderValue,\n              className: 'slider',\n              onChange: this.handleSliderChange\n            })\n          )\n        ) : _react2.default.createElement(\n          'p',\n          { className: 'info-message' },\n          'loading... '\n        ),\n        error ? _react2.default.createElement(\n          'p',\n          { className: 'info-message--failure' },\n          error\n        ) : _react2.default.createElement(\n          'p',\n          { className: 'info-message' },\n          'Use slider to set thumbnail'\n        )\n      );\n    }\n  }]);\n\n  return PublishThumbnailInput;\n}(_react2.default.Component);\n\nexports.default = PublishThumbnailInput;\n\n/***/ }),\n/* 111 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _publish = __webpack_require__(4);\n\nvar _view = __webpack_require__(112);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n  var publish = _ref.publish;\n\n  return {\n    showMetadataInputs: publish.showMetadataInputs,\n    description: publish.metadata.description,\n    license: publish.metadata.license,\n    nsfw: publish.metadata.nsfw\n  };\n};\n\nvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n  return {\n    onMetadataChange: function onMetadataChange(name, value) {\n      dispatch((0, _publish.updateMetadata)(name, value));\n    },\n    onToggleMetadataInputs: function onToggleMetadataInputs(value) {\n      dispatch((0, _publish.toggleMetadataInputs)(value));\n    }\n  };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 112 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\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 = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ExpandingTextArea = __webpack_require__(113);\n\nvar _ExpandingTextArea2 = _interopRequireDefault(_ExpandingTextArea);\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 PublishMetadataInputs = function (_React$Component) {\n  _inherits(PublishMetadataInputs, _React$Component);\n\n  function PublishMetadataInputs(props) {\n    _classCallCheck(this, PublishMetadataInputs);\n\n    var _this = _possibleConstructorReturn(this, (PublishMetadataInputs.__proto__ || Object.getPrototypeOf(PublishMetadataInputs)).call(this, props));\n\n    _this.toggleShowInputs = _this.toggleShowInputs.bind(_this);\n    _this.handleInput = _this.handleInput.bind(_this);\n    _this.handleSelect = _this.handleSelect.bind(_this);\n    return _this;\n  }\n\n  _createClass(PublishMetadataInputs, [{\n    key: 'toggleShowInputs',\n    value: function toggleShowInputs() {\n      this.props.onToggleMetadataInputs(!this.props.showMetadataInputs);\n    }\n  }, {\n    key: 'handleInput',\n    value: function handleInput(event) {\n      var target = event.target;\n      var value = target.type === 'checkbox' ? target.checked : target.value;\n      var name = target.name;\n      this.props.onMetadataChange(name, value);\n    }\n  }, {\n    key: 'handleSelect',\n    value: function handleSelect(event) {\n      var name = event.target.name;\n      var selectedOption = event.target.selectedOptions[0].value;\n      this.props.onMetadataChange(name, selectedOption);\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      return _react2.default.createElement(\n        'div',\n        { id: 'publish-details', className: 'row row--padded row--no-top row--wide' },\n        this.props.showMetadataInputs && _react2.default.createElement(\n          'div',\n          null,\n          _react2.default.createElement(\n            'div',\n            { className: 'row row--no-top' },\n            _react2.default.createElement(\n              'div',\n              { className: 'column column--3 column--med-10 align-content-top' },\n              _react2.default.createElement(\n                'label',\n                { htmlFor: 'publish-license', className: 'label' },\n                'Description:'\n              )\n            ),\n            _react2.default.createElement(\n              'div',\n              { className: 'column column--7 column--sml-10' },\n              _react2.default.createElement(_ExpandingTextArea2.default, {\n                id: 'publish-description',\n                className: 'textarea textarea--primary textarea--full-width',\n                rows: 1,\n                maxLength: 2000,\n                style: { maxHeight: 200 },\n                name: 'description',\n                placeholder: 'Optional description',\n                value: this.props.description,\n                onChange: this.handleInput })\n            )\n          ),\n          _react2.default.createElement(\n            'div',\n            { className: 'row row--no-top' },\n            _react2.default.createElement(\n              'div',\n              { className: 'column column--3 column--med-10' },\n              _react2.default.createElement(\n                'label',\n                { htmlFor: 'publish-license', className: 'label' },\n                'License:'\n              )\n            ),\n            _react2.default.createElement(\n              'div',\n              { className: 'column column--7 column--sml-10' },\n              _react2.default.createElement(\n                'select',\n                { type: 'text', name: 'license', id: 'publish-license', className: 'select select--primary', onChange: this.handleSelect },\n                _react2.default.createElement(\n                  'option',\n                  { value: ' ' },\n                  'Unspecified'\n                ),\n                _react2.default.createElement(\n                  'option',\n                  { value: 'Public Domain' },\n                  'Public Domain'\n                ),\n                _react2.default.createElement(\n                  'option',\n                  { value: 'Creative Commons' },\n                  'Creative Commons'\n                )\n              )\n            )\n          ),\n          _react2.default.createElement(\n            'div',\n            { className: 'row row--no-top' },\n            _react2.default.createElement(\n              'div',\n              { className: 'column column--3' },\n              _react2.default.createElement(\n                'label',\n                { htmlFor: 'publish-nsfw', className: 'label' },\n                'Mature:'\n              )\n            ),\n            _react2.default.createElement(\n              'div',\n              { className: 'column column--7' },\n              _react2.default.createElement('input', { className: 'input-checkbox', type: 'checkbox', id: 'publish-nsfw', name: 'nsfw', value: this.props.nsfw, onChange: this.handleInput })\n            )\n          )\n        ),\n        _react2.default.createElement(\n          'button',\n          { className: 'button--secondary', onClick: this.toggleShowInputs },\n          this.props.showMetadataInputs ? 'less' : 'more'\n        )\n      );\n    }\n  }]);\n\n  return PublishMetadataInputs;\n}(_react2.default.Component);\n\nexports.default = PublishMetadataInputs;\n\n/***/ }),\n/* 113 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\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 _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(10);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\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 ExpandingTextarea = function (_Component) {\n  _inherits(ExpandingTextarea, _Component);\n\n  function ExpandingTextarea(props) {\n    _classCallCheck(this, ExpandingTextarea);\n\n    var _this = _possibleConstructorReturn(this, (ExpandingTextarea.__proto__ || Object.getPrototypeOf(ExpandingTextarea)).call(this, props));\n\n    _this._handleChange = _this._handleChange.bind(_this);\n    return _this;\n  }\n\n  _createClass(ExpandingTextarea, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      this.adjustTextarea({});\n    }\n  }, {\n    key: '_handleChange',\n    value: function _handleChange(event) {\n      var onChange = this.props.onChange;\n\n      if (onChange) onChange(event);\n      this.adjustTextarea(event);\n    }\n  }, {\n    key: 'adjustTextarea',\n    value: function adjustTextarea(_ref) {\n      var _ref$target = _ref.target,\n          target = _ref$target === undefined ? this.el : _ref$target;\n\n      target.style.height = 0;\n      target.style.height = target.scrollHeight + 'px';\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _this2 = this;\n\n      var rest = _objectWithoutProperties(this.props, []);\n\n      return _react2.default.createElement('textarea', _extends({}, rest, {\n        ref: function ref(x) {\n          return _this2.el = x;\n        },\n        onChange: this._handleChange\n      }));\n    }\n  }]);\n\n  return ExpandingTextarea;\n}(_react.Component);\n\nExpandingTextarea.propTypes = {\n  onChange: _propTypes2.default.func\n};\n\nexports.default = ExpandingTextarea;\n\n/***/ }),\n/* 114 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _publish = __webpack_require__(4);\n\nvar _view = __webpack_require__(115);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n  var channel = _ref.channel,\n      publish = _ref.publish;\n\n  return {\n    loggedInChannelName: channel.loggedInChannel.name,\n    publishInChannel: publish.publishInChannel,\n    selectedChannel: publish.selectedChannel,\n    channelError: publish.error.channel\n  };\n};\n\nvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n  return {\n    onPublishInChannelChange: function onPublishInChannelChange(value) {\n      dispatch((0, _publish.updateError)('channel', null));\n      dispatch((0, _publish.setPublishInChannel)(value));\n    },\n    onChannelSelect: function onChannelSelect(value) {\n      dispatch((0, _publish.updateError)('channel', null));\n      dispatch((0, _publish.updateSelectedChannel)(value));\n    }\n  };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 115 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\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 = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ChannelLoginForm = __webpack_require__(41);\n\nvar _ChannelLoginForm2 = _interopRequireDefault(_ChannelLoginForm);\n\nvar _ChannelCreateForm = __webpack_require__(42);\n\nvar _ChannelCreateForm2 = _interopRequireDefault(_ChannelCreateForm);\n\nvar _publish_channel_select_states = __webpack_require__(35);\n\nvar states = _interopRequireWildcard(_publish_channel_select_states);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\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 ChannelSelect = function (_React$Component) {\n  _inherits(ChannelSelect, _React$Component);\n\n  function ChannelSelect(props) {\n    _classCallCheck(this, ChannelSelect);\n\n    var _this = _possibleConstructorReturn(this, (ChannelSelect.__proto__ || Object.getPrototypeOf(ChannelSelect)).call(this, props));\n\n    _this.toggleAnonymousPublish = _this.toggleAnonymousPublish.bind(_this);\n    _this.handleSelection = _this.handleSelection.bind(_this);\n    return _this;\n  }\n\n  _createClass(ChannelSelect, [{\n    key: 'toggleAnonymousPublish',\n    value: function toggleAnonymousPublish(event) {\n      var value = event.target.value;\n      if (value === 'anonymous') {\n        this.props.onPublishInChannelChange(false);\n      } else {\n        this.props.onPublishInChannelChange(true);\n      }\n    }\n  }, {\n    key: 'handleSelection',\n    value: function handleSelection(event) {\n      var selectedOption = event.target.selectedOptions[0].value;\n      this.props.onChannelSelect(selectedOption);\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      return _react2.default.createElement(\n        'div',\n        null,\n        _react2.default.createElement(\n          'form',\n          null,\n          _react2.default.createElement(\n            'div',\n            { className: 'column column--3 column--med-10' },\n            _react2.default.createElement('input', { type: 'radio', name: 'anonymous-or-channel', id: 'anonymous-radio', className: 'input-radio', value: 'anonymous', checked: !this.props.publishInChannel, onChange: this.toggleAnonymousPublish }),\n            _react2.default.createElement(\n              'label',\n              { className: 'label label--pointer', htmlFor: 'anonymous-radio' },\n              'Anonymous'\n            )\n          ),\n          _react2.default.createElement(\n            'div',\n            { className: 'column column--7 column--med-10' },\n            _react2.default.createElement('input', { type: 'radio', name: 'anonymous-or-channel', id: 'channel-radio', className: 'input-radio', value: 'in a channel', checked: this.props.publishInChannel, onChange: this.toggleAnonymousPublish }),\n            _react2.default.createElement(\n              'label',\n              { className: 'label label--pointer', htmlFor: 'channel-radio' },\n              'In a channel'\n            )\n          ),\n          this.props.channelError ? _react2.default.createElement(\n            'p',\n            { className: 'info-message--failure' },\n            this.props.channelError\n          ) : _react2.default.createElement(\n            'p',\n            { className: 'info-message' },\n            'Publish anonymously or in a channel'\n          )\n        ),\n        this.props.publishInChannel && _react2.default.createElement(\n          'div',\n          null,\n          _react2.default.createElement(\n            'div',\n            { className: 'column column--3' },\n            _react2.default.createElement(\n              'label',\n              { className: 'label', htmlFor: 'channel-name-select' },\n              'Channel:'\n            )\n          ),\n          _react2.default.createElement(\n            'div',\n            { className: 'column column--7' },\n            _react2.default.createElement(\n              'select',\n              { type: 'text', id: 'channel-name-select', className: 'select select--arrow', value: this.props.selectedChannel, onChange: this.handleSelection },\n              this.props.loggedInChannelName && _react2.default.createElement(\n                'option',\n                { value: this.props.loggedInChannelName, id: 'publish-channel-select-channel-option' },\n                this.props.loggedInChannelName\n              ),\n              _react2.default.createElement(\n                'option',\n                { value: states.LOGIN },\n                'Existing'\n              ),\n              _react2.default.createElement(\n                'option',\n                { value: states.CREATE },\n                'New'\n              )\n            )\n          ),\n          this.props.selectedChannel === states.LOGIN && _react2.default.createElement(_ChannelLoginForm2.default, null),\n          this.props.selectedChannel === states.CREATE && _react2.default.createElement(_ChannelCreateForm2.default, null)\n        )\n      );\n    }\n  }]);\n\n  return ChannelSelect;\n}(_react2.default.Component);\n\nexports.default = ChannelSelect;\n\n/***/ }),\n/* 116 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\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 = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _request = __webpack_require__(11);\n\nvar _request2 = _interopRequireDefault(_request);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return 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 ChannelLoginForm = function (_React$Component) {\n  _inherits(ChannelLoginForm, _React$Component);\n\n  function ChannelLoginForm(props) {\n    _classCallCheck(this, ChannelLoginForm);\n\n    var _this = _possibleConstructorReturn(this, (ChannelLoginForm.__proto__ || Object.getPrototypeOf(ChannelLoginForm)).call(this, props));\n\n    _this.state = {\n      error: null,\n      name: '',\n      password: ''\n    };\n    _this.handleInput = _this.handleInput.bind(_this);\n    _this.loginToChannel = _this.loginToChannel.bind(_this);\n    return _this;\n  }\n\n  _createClass(ChannelLoginForm, [{\n    key: 'handleInput',\n    value: function handleInput(event) {\n      var name = event.target.name;\n      var value = event.target.value;\n      this.setState(_defineProperty({}, name, value));\n    }\n  }, {\n    key: 'loginToChannel',\n    value: function loginToChannel(event) {\n      var _this2 = this;\n\n      event.preventDefault();\n      var params = {\n        method: 'POST',\n        body: JSON.stringify({ username: this.state.name, password: this.state.password }),\n        headers: new Headers({\n          'Content-Type': 'application/json'\n        }),\n        credentials: 'include'\n      };\n      (0, _request2.default)('login', params).then(function (_ref) {\n        var success = _ref.success,\n            channelName = _ref.channelName,\n            shortChannelId = _ref.shortChannelId,\n            channelClaimId = _ref.channelClaimId,\n            message = _ref.message;\n\n        if (success) {\n          _this2.props.onChannelLogin(channelName, shortChannelId, channelClaimId);\n        } else {\n          _this2.setState({ 'error': message });\n        };\n      }).catch(function (error) {\n        if (error.message) {\n          _this2.setState({ 'error': error.message });\n        } else {\n          _this2.setState({ 'error': error });\n        }\n      });\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      return _react2.default.createElement(\n        'form',\n        { id: 'channel-login-form' },\n        _react2.default.createElement(\n          'div',\n          { className: 'row row--wide row--short' },\n          _react2.default.createElement(\n            'div',\n            { className: 'column column--3 column--sml-10' },\n            _react2.default.createElement(\n              'label',\n              { className: 'label', htmlFor: 'channel-login-name-input' },\n              'Name:'\n            )\n          ),\n          _react2.default.createElement(\n            'div',\n            { className: 'column column--6 column--sml-10' },\n            _react2.default.createElement(\n              'div',\n              { className: 'input-text--primary flex-container--row flex-container--left-bottom' },\n              _react2.default.createElement(\n                'span',\n                null,\n                '@'\n              ),\n              _react2.default.createElement('input', { type: 'text', id: 'channel-login-name-input', className: 'input-text', name: 'name', placeholder: 'Your Channel Name', value: this.state.channelName, onChange: this.handleInput })\n            )\n          )\n        ),\n        _react2.default.createElement(\n          'div',\n          { className: 'row row--wide row--short' },\n          _react2.default.createElement(\n            'div',\n            { className: 'column column--3 column--sml-10' },\n            _react2.default.createElement(\n              'label',\n              { className: 'label', htmlFor: 'channel-login-password-input' },\n              'Password:'\n            )\n          ),\n          _react2.default.createElement(\n            'div',\n            { className: 'column column--6 column--sml-10' },\n            _react2.default.createElement(\n              'div',\n              { className: 'input-text--primary' },\n              _react2.default.createElement('input', { type: 'password', id: 'channel-login-password-input', name: 'password', className: 'input-text', placeholder: '', value: this.state.channelPassword, onChange: this.handleInput })\n            )\n          )\n        ),\n        this.state.error ? _react2.default.createElement(\n          'p',\n          { className: 'info-message--failure' },\n          this.state.error\n        ) : _react2.default.createElement(\n          'p',\n          { className: 'info-message' },\n          'Enter the name and password for your channel'\n        ),\n        _react2.default.createElement(\n          'div',\n          { className: 'row row--wide' },\n          _react2.default.createElement(\n            'button',\n            { className: 'button--primary', onClick: this.loginToChannel },\n            'Authenticate'\n          )\n        )\n      );\n    }\n  }]);\n\n  return ChannelLoginForm;\n}(_react2.default.Component);\n\nexports.default = ChannelLoginForm;\n\n/***/ }),\n/* 117 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\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 = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ProgressBar = __webpack_require__(20);\n\nvar _ProgressBar2 = _interopRequireDefault(_ProgressBar);\n\nvar _request = __webpack_require__(11);\n\nvar _request2 = _interopRequireDefault(_request);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return 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 ChannelCreateForm = function (_React$Component) {\n  _inherits(ChannelCreateForm, _React$Component);\n\n  function ChannelCreateForm(props) {\n    _classCallCheck(this, ChannelCreateForm);\n\n    var _this = _possibleConstructorReturn(this, (ChannelCreateForm.__proto__ || Object.getPrototypeOf(ChannelCreateForm)).call(this, props));\n\n    _this.state = {\n      error: null,\n      channel: '',\n      password: '',\n      status: null\n    };\n    _this.handleChannelInput = _this.handleChannelInput.bind(_this);\n    _this.handleInput = _this.handleInput.bind(_this);\n    _this.createChannel = _this.createChannel.bind(_this);\n    return _this;\n  }\n\n  _createClass(ChannelCreateForm, [{\n    key: 'cleanseChannelInput',\n    value: function cleanseChannelInput(input) {\n      input = input.replace(/\\s+/g, '-'); // replace spaces with dashes\n      input = input.replace(/[^A-Za-z0-9-]/g, ''); // remove all characters that are not A-Z, a-z, 0-9, or '-'\n      return input;\n    }\n  }, {\n    key: 'handleChannelInput',\n    value: function handleChannelInput(event) {\n      var value = event.target.value;\n      value = this.cleanseChannelInput(value);\n      this.setState({ channel: value });\n      if (value) {\n        this.updateIsChannelAvailable(value);\n      } else {\n        this.setState({ error: 'Please enter a channel name' });\n      }\n    }\n  }, {\n    key: 'handleInput',\n    value: function handleInput(event) {\n      var name = event.target.name;\n      var value = event.target.value;\n      this.setState(_defineProperty({}, name, value));\n    }\n  }, {\n    key: 'updateIsChannelAvailable',\n    value: function updateIsChannelAvailable(channel) {\n      var _this2 = this;\n\n      var channelWithAtSymbol = '@' + channel;\n      (0, _request2.default)('/api/channel/availability/' + channelWithAtSymbol).then(function () {\n        _this2.setState({ 'error': null });\n      }).catch(function (error) {\n        _this2.setState({ 'error': error.message });\n      });\n    }\n  }, {\n    key: 'checkIsChannelAvailable',\n    value: function checkIsChannelAvailable(channel) {\n      var channelWithAtSymbol = '@' + channel;\n      return (0, _request2.default)('/api/channel/availability/' + channelWithAtSymbol);\n    }\n  }, {\n    key: 'checkIsPasswordProvided',\n    value: function checkIsPasswordProvided(password) {\n      return new Promise(function (resolve, reject) {\n        if (!password || password.length < 1) {\n          return reject(new Error('Please provide a password'));\n        }\n        resolve();\n      });\n    }\n  }, {\n    key: 'makePublishChannelRequest',\n    value: function makePublishChannelRequest(username, password) {\n      var params = {\n        method: 'POST',\n        body: JSON.stringify({ username: username, password: password }),\n        headers: new Headers({\n          'Content-Type': 'application/json'\n        }),\n        credentials: 'include'\n      };\n      return new Promise(function (resolve, reject) {\n        (0, _request2.default)('/signup', params).then(function (result) {\n          return resolve(result);\n        }).catch(function (error) {\n          reject(new Error('Unfortunately, we encountered an error while creating your channel. Please let us know in Discord! ' + error.message));\n        });\n      });\n    }\n  }, {\n    key: 'createChannel',\n    value: function createChannel(event) {\n      var _this3 = this;\n\n      event.preventDefault();\n      this.checkIsPasswordProvided(this.state.password).then(function () {\n        return _this3.checkIsChannelAvailable(_this3.state.channel);\n      }).then(function () {\n        _this3.setState({ status: 'We are publishing your new channel.  Sit tight...' });\n        return _this3.makePublishChannelRequest(_this3.state.channel, _this3.state.password);\n      }).then(function (result) {\n        _this3.setState({ status: null });\n        _this3.props.onChannelLogin(result.channelName, result.shortChannelId, result.channelClaimId);\n      }).catch(function (error) {\n        if (error.message) {\n          _this3.setState({ 'error': error.message, status: null });\n        } else {\n          _this3.setState({ 'error': error, status: null });\n        };\n      });\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      return _react2.default.createElement(\n        'div',\n        null,\n        !this.state.status ? _react2.default.createElement(\n          'form',\n          { id: 'publish-channel-form' },\n          _react2.default.createElement(\n            'div',\n            { className: 'row row--wide row--short' },\n            _react2.default.createElement(\n              'div',\n              { className: 'column column--3 column--sml-10' },\n              _react2.default.createElement(\n                'label',\n                { className: 'label', htmlFor: 'new-channel-name' },\n                'Name:'\n              )\n            ),\n            _react2.default.createElement(\n              'div',\n              { className: 'column column--6 column--sml-10' },\n              _react2.default.createElement(\n                'div',\n                { className: 'input-text--primary flex-container--row flex-container--left-bottom span--relative' },\n                _react2.default.createElement(\n                  'span',\n                  null,\n                  '@'\n                ),\n                _react2.default.createElement('input', { type: 'text', name: 'channel', id: 'new-channel-name', className: 'input-text', placeholder: 'exampleChannelName', value: this.state.channel, onChange: this.handleChannelInput }),\n                this.state.channel && !this.state.error && _react2.default.createElement(\n                  'span',\n                  { id: 'input-success-channel-name', className: 'info-message--success span--absolute' },\n                  '\\u2713'\n                ),\n                this.state.error && _react2.default.createElement(\n                  'span',\n                  { id: 'input-success-channel-name', className: 'info-message--failure span--absolute' },\n                  '\\u2716'\n                )\n              )\n            )\n          ),\n          _react2.default.createElement(\n            'div',\n            { className: 'row row--wide row--short' },\n            _react2.default.createElement(\n              'div',\n              { className: 'column column--3 column--sml-10' },\n              _react2.default.createElement(\n                'label',\n                { className: 'label', htmlFor: 'new-channel-password' },\n                'Password:'\n              )\n            ),\n            _react2.default.createElement(\n              'div',\n              { className: 'column column--6 column--sml-10' },\n              _react2.default.createElement(\n                'div',\n                { className: 'input-text--primary' },\n                _react2.default.createElement('input', { type: 'password', name: 'password', id: 'new-channel-password', className: 'input-text', placeholder: '', value: this.state.password, onChange: this.handleInput })\n              )\n            )\n          ),\n          this.state.error ? _react2.default.createElement(\n            'p',\n            { className: 'info-message--failure' },\n            this.state.error\n          ) : _react2.default.createElement(\n            'p',\n            { className: 'info-message' },\n            'Choose a name and password for your channel'\n          ),\n          _react2.default.createElement(\n            'div',\n            { className: 'row row--wide' },\n            _react2.default.createElement(\n              'button',\n              { className: 'button--primary', onClick: this.createChannel },\n              'Create Channel'\n            )\n          )\n        ) : _react2.default.createElement(\n          'div',\n          null,\n          _react2.default.createElement(\n            'p',\n            { className: 'fine-print' },\n            this.state.status\n          ),\n          _react2.default.createElement(_ProgressBar2.default, { size: 12 })\n        )\n      );\n    }\n  }]);\n\n  return ChannelCreateForm;\n}(_react2.default.Component);\n\nexports.default = ChannelCreateForm;\n\n/***/ }),\n/* 118 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ActiveStatusBar = function ActiveStatusBar() {\n  return _react2.default.createElement(\n    'span',\n    { className: 'progress-bar progress-bar--active' },\n    '| '\n  );\n};\n\nexports.default = ActiveStatusBar;\n\n/***/ }),\n/* 119 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar InactiveStatusBar = function InactiveStatusBar() {\n  return _react2.default.createElement(\n    'span',\n    { className: 'progress-bar progress-bar--inactive' },\n    '| '\n  );\n};\n\nexports.default = InactiveStatusBar;\n\n/***/ }),\n/* 120 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _publish = __webpack_require__(4);\n\nvar _view = __webpack_require__(121);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n  var publish = _ref.publish;\n\n  return {\n    status: publish.status.status,\n    message: publish.status.message\n  };\n};\n\nvar mapDispatchToProps = {\n  clearFile: _publish.clearFile\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 121 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\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 = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ProgressBar = __webpack_require__(20);\n\nvar _ProgressBar2 = _interopRequireDefault(_ProgressBar);\n\nvar _publish_claim_states = __webpack_require__(122);\n\nvar publishStates = _interopRequireWildcard(_publish_claim_states);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\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 PublishStatus = function (_React$Component) {\n  _inherits(PublishStatus, _React$Component);\n\n  function PublishStatus() {\n    _classCallCheck(this, PublishStatus);\n\n    return _possibleConstructorReturn(this, (PublishStatus.__proto__ || Object.getPrototypeOf(PublishStatus)).apply(this, arguments));\n  }\n\n  _createClass(PublishStatus, [{\n    key: 'render',\n    value: function render() {\n      var _props = this.props,\n          status = _props.status,\n          message = _props.message,\n          clearFile = _props.clearFile;\n\n      return _react2.default.createElement(\n        'div',\n        { className: 'row row--tall flex-container--column flex-container--center-center' },\n        status === publishStates.LOAD_START && _react2.default.createElement(\n          'div',\n          { className: 'row align-content-center' },\n          _react2.default.createElement(\n            'p',\n            null,\n            'File is loading to server'\n          ),\n          _react2.default.createElement(\n            'p',\n            { className: 'blue' },\n            '0%'\n          )\n        ),\n        status === publishStates.LOADING && _react2.default.createElement(\n          'div',\n          null,\n          _react2.default.createElement(\n            'div',\n            { className: 'row align-content-center' },\n            _react2.default.createElement(\n              'p',\n              null,\n              'File is loading to server'\n            ),\n            _react2.default.createElement(\n              'p',\n              { className: 'blue' },\n              message\n            )\n          )\n        ),\n        status === publishStates.PUBLISHING && _react2.default.createElement(\n          'div',\n          { className: 'row align-content-center' },\n          _react2.default.createElement(\n            'p',\n            null,\n            'Upload complete.  Your file is now being published on the blockchain...'\n          ),\n          _react2.default.createElement(_ProgressBar2.default, { size: 12 }),\n          _react2.default.createElement(\n            'p',\n            null,\n            'Curious what magic is happening here? ',\n            _react2.default.createElement(\n              'a',\n              { className: 'link--primary', target: 'blank', href: 'https://lbry.io/faq/what-is-lbry' },\n              'Learn more.'\n            )\n          )\n        ),\n        status === publishStates.SUCCESS && _react2.default.createElement(\n          'div',\n          { className: 'row align-content-center' },\n          _react2.default.createElement(\n            'p',\n            null,\n            'Your publish is complete! You are being redirected to it now.'\n          ),\n          _react2.default.createElement(\n            'p',\n            null,\n            'If you are not automatically redirected, ',\n            _react2.default.createElement(\n              'a',\n              { className: 'link--primary', target: '_blank', href: message },\n              'click here.'\n            )\n          )\n        ),\n        status === publishStates.FAILED && _react2.default.createElement(\n          'div',\n          { className: 'row align-content-center' },\n          _react2.default.createElement(\n            'p',\n            null,\n            'Something went wrong...'\n          ),\n          _react2.default.createElement(\n            'p',\n            null,\n            _react2.default.createElement(\n              'strong',\n              null,\n              message\n            )\n          ),\n          _react2.default.createElement(\n            'p',\n            null,\n            'For help, post the above error text in the #speech channel on the ',\n            _react2.default.createElement(\n              'a',\n              { className: 'link--primary', href: 'https://discord.gg/YjYbwhS', target: '_blank' },\n              'lbry discord'\n            )\n          ),\n          _react2.default.createElement(\n            'button',\n            { className: 'button--secondary', onClick: clearFile },\n            'Reset'\n          )\n        )\n      );\n    }\n  }]);\n\n  return PublishStatus;\n}(_react2.default.Component);\n\n;\n\nexports.default = PublishStatus;\n\n/***/ }),\n/* 122 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar LOAD_START = exports.LOAD_START = 'LOAD_START';\nvar LOADING = exports.LOADING = 'LOADING';\nvar PUBLISHING = exports.PUBLISHING = 'PUBLISHING';\nvar SUCCESS = exports.SUCCESS = 'SUCCESS';\nvar FAILED = exports.FAILED = 'FAILED';\n\n/***/ }),\n/* 123 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _view = __webpack_require__(124);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n  var publish = _ref.publish;\n\n  return {\n    message: publish.disabledMessage\n  };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default);\n\n/***/ }),\n/* 124 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\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 = __webpack_require__(0);\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 PublishDisabledMessage = function (_React$Component) {\n  _inherits(PublishDisabledMessage, _React$Component);\n\n  function PublishDisabledMessage() {\n    _classCallCheck(this, PublishDisabledMessage);\n\n    return _possibleConstructorReturn(this, (PublishDisabledMessage.__proto__ || Object.getPrototypeOf(PublishDisabledMessage)).apply(this, arguments));\n  }\n\n  _createClass(PublishDisabledMessage, [{\n    key: 'render',\n    value: function render() {\n      var message = this.props.message;\n      console.log('this.props.message:', message);\n      return _react2.default.createElement(\n        'div',\n        { className: 'row dropzone--disabled row--tall flex-container--column flex-container--center-center' },\n        _react2.default.createElement(\n          'p',\n          { className: 'text--disabled' },\n          'Publishing is currently disabled.'\n        ),\n        _react2.default.createElement(\n          'p',\n          { className: 'text--disabled' },\n          message\n        )\n      );\n    }\n  }]);\n\n  return PublishDisabledMessage;\n}(_react2.default.Component);\n\nexports.default = PublishDisabledMessage;\n\n/***/ }),\n/* 125 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\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 = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _NavBar = __webpack_require__(7);\n\nvar _NavBar2 = _interopRequireDefault(_NavBar);\n\nvar _SEO = __webpack_require__(9);\n\nvar _SEO2 = _interopRequireDefault(_SEO);\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 AboutPage = function (_React$Component) {\n  _inherits(AboutPage, _React$Component);\n\n  function AboutPage() {\n    _classCallCheck(this, AboutPage);\n\n    return _possibleConstructorReturn(this, (AboutPage.__proto__ || Object.getPrototypeOf(AboutPage)).apply(this, arguments));\n  }\n\n  _createClass(AboutPage, [{\n    key: 'render',\n    value: function render() {\n      return _react2.default.createElement(\n        'div',\n        null,\n        _react2.default.createElement(_SEO2.default, { pageTitle: 'About', pageUri: 'about' }),\n        _react2.default.createElement(_NavBar2.default, null),\n        _react2.default.createElement(\n          'div',\n          { className: 'row row--padded' },\n          _react2.default.createElement(\n            'div',\n            { className: 'column column--5 column--med-10 align-content-top' },\n            _react2.default.createElement(\n              'div',\n              { className: 'column column--8 column--med-10' },\n              _react2.default.createElement(\n                'p',\n                { className: 'pull-quote' },\n                'Spee.ch is an open-source project.  Please contribute to the existing site, or fork it and make your own.'\n              ),\n              _react2.default.createElement(\n                'p',\n                null,\n                _react2.default.createElement(\n                  'a',\n                  { className: 'link--primary', target: '_blank', href: 'https://twitter.com/spee_ch' },\n                  'TWITTER'\n                )\n              ),\n              _react2.default.createElement(\n                'p',\n                null,\n                _react2.default.createElement(\n                  'a',\n                  { className: 'link--primary', target: '_blank', href: 'https://github.com/lbryio/spee.ch' },\n                  'GITHUB'\n                )\n              ),\n              _react2.default.createElement(\n                'p',\n                null,\n                _react2.default.createElement(\n                  'a',\n                  { className: 'link--primary', target: '_blank', href: 'https://discord.gg/YjYbwhS' },\n                  'DISCORD CHANNEL'\n                )\n              ),\n              _react2.default.createElement(\n                'p',\n                null,\n                _react2.default.createElement(\n                  'a',\n                  { className: 'link--primary', target: '_blank', href: 'https://github.com/lbryio/spee.ch/blob/master/README.md' },\n                  'DOCUMENTATION'\n                )\n              )\n            )\n          ),\n          _react2.default.createElement(\n            'div',\n            { className: 'column column--5 column--med-10 align-content-top' },\n            _react2.default.createElement(\n              'div',\n              { className: 'column column--8 column--med-10' },\n              _react2.default.createElement(\n                'p',\n                null,\n                'Spee.ch is a media-hosting site that reads from and publishes content to the ',\n                _react2.default.createElement(\n                  'a',\n                  { className: 'link--primary', href: 'https://lbry.io' },\n                  'LBRY'\n                ),\n                ' blockchain.'\n              ),\n              _react2.default.createElement(\n                'p',\n                null,\n                'Spee.ch is a hosting service, but with the added benefit that it stores your content on a decentralized network of computers -- the ',\n                _react2.default.createElement(\n                  'a',\n                  { className: 'link--primary', href: 'https://lbry.io/get' },\n                  'LBRY'\n                ),\n                ' network.  This means that your images are stored in multiple locations without a single point of failure.'\n              ),\n              _react2.default.createElement(\n                'h3',\n                null,\n                'Contribute'\n              ),\n              _react2.default.createElement(\n                'p',\n                null,\n                'If you have an idea for your own spee.ch-like site on top of LBRY, fork our ',\n                _react2.default.createElement(\n                  'a',\n                  { className: 'link--primary', href: 'https://github.com/lbryio/spee.ch' },\n                  'github repo'\n                ),\n                ' and go to town!'\n              ),\n              _react2.default.createElement(\n                'p',\n                null,\n                'If you want to improve spee.ch, join our ',\n                _react2.default.createElement(\n                  'a',\n                  { className: 'link--primary', href: 'https://discord.gg/YjYbwhS' },\n                  'discord channel'\n                ),\n                ' or solve one of our ',\n                _react2.default.createElement(\n                  'a',\n                  { className: 'link--primary', href: 'https://github.com/lbryio/spee.ch/issues' },\n                  'github issues'\n                ),\n                '.'\n              )\n            )\n          )\n        )\n      );\n    }\n  }]);\n\n  return AboutPage;\n}(_react2.default.Component);\n\n;\n\nexports.default = AboutPage;\n\n/***/ }),\n/* 126 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _view = __webpack_require__(127);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n  var channel = _ref.channel;\n\n  return {\n    loggedInChannelName: channel.loggedInChannel.name\n  };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default);\n\n/***/ }),\n/* 127 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\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 = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouterDom = __webpack_require__(3);\n\nvar _SEO = __webpack_require__(9);\n\nvar _SEO2 = _interopRequireDefault(_SEO);\n\nvar _NavBar = __webpack_require__(7);\n\nvar _NavBar2 = _interopRequireDefault(_NavBar);\n\nvar _ChannelLoginForm = __webpack_require__(41);\n\nvar _ChannelLoginForm2 = _interopRequireDefault(_ChannelLoginForm);\n\nvar _ChannelCreateForm = __webpack_require__(42);\n\nvar _ChannelCreateForm2 = _interopRequireDefault(_ChannelCreateForm);\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 LoginPage = function (_React$Component) {\n  _inherits(LoginPage, _React$Component);\n\n  function LoginPage() {\n    _classCallCheck(this, LoginPage);\n\n    return _possibleConstructorReturn(this, (LoginPage.__proto__ || Object.getPrototypeOf(LoginPage)).apply(this, arguments));\n  }\n\n  _createClass(LoginPage, [{\n    key: 'componentWillReceiveProps',\n    value: function componentWillReceiveProps(newProps) {\n      // re-route the user to the homepage if the user is logged in\n      if (newProps.loggedInChannelName !== this.props.loggedInChannelName) {\n        this.props.history.push('/');\n      }\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      return _react2.default.createElement(\n        'div',\n        null,\n        _react2.default.createElement(_SEO2.default, { pageTitle: 'Login', pageUri: 'login' }),\n        _react2.default.createElement(_NavBar2.default, null),\n        _react2.default.createElement(\n          'div',\n          { className: 'row row--padded' },\n          _react2.default.createElement(\n            'div',\n            { className: 'column column--5 column--med-10 align-content-top' },\n            _react2.default.createElement(\n              'div',\n              { className: 'column column--8 column--med-10' },\n              _react2.default.createElement(\n                'p',\n                null,\n                'Channels allow you to publish and group content under an identity. You can create a channel for yourself, or share one with like-minded friends.  You can create 1 channel, or 100, so whether you\\'re ',\n                _react2.default.createElement(\n                  'a',\n                  { className: 'link--primary', target: '_blank', href: '/@catalonia2017:43dcf47163caa21d8404d9fe9b30f78ef3e146a8' },\n                  'documenting important events'\n                ),\n                ', or making a public repository for ',\n                _react2.default.createElement(\n                  'a',\n                  { className: 'link--primary', target: '_blank', href: '/@catGifs' },\n                  'cat gifs'\n                ),\n                ' (password: \\'1234\\'), try creating a channel for it!'\n              )\n            )\n          ),\n          _react2.default.createElement(\n            'div',\n            { className: 'column column--5 column--med-10 align-content-top' },\n            _react2.default.createElement(\n              'div',\n              { className: 'column column--8 column--med-10' },\n              _react2.default.createElement(\n                'h3',\n                { className: 'h3--no-bottom' },\n                'Log in to an existing channel:'\n              ),\n              _react2.default.createElement(_ChannelLoginForm2.default, null),\n              _react2.default.createElement(\n                'h3',\n                { className: 'h3--no-bottom' },\n                'Create a brand new channel:'\n              ),\n              _react2.default.createElement(_ChannelCreateForm2.default, null)\n            )\n          )\n        )\n      );\n    }\n  }]);\n\n  return LoginPage;\n}(_react2.default.Component);\n\n;\n\nexports.default = (0, _reactRouterDom.withRouter)(LoginPage);\n\n/***/ }),\n/* 128 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _show = __webpack_require__(8);\n\nvar _view = __webpack_require__(129);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n  var show = _ref.show;\n\n  return {\n    error: show.request.error,\n    requestType: show.request.type\n  };\n};\n\nvar mapDispatchToProps = {\n  onHandleShowPageUri: _show.onHandleShowPageUri\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 129 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\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 = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ErrorPage = __webpack_require__(21);\n\nvar _ErrorPage2 = _interopRequireDefault(_ErrorPage);\n\nvar _ShowAssetLite = __webpack_require__(130);\n\nvar _ShowAssetLite2 = _interopRequireDefault(_ShowAssetLite);\n\nvar _ShowAssetDetails = __webpack_require__(133);\n\nvar _ShowAssetDetails2 = _interopRequireDefault(_ShowAssetDetails);\n\nvar _ShowChannel = __webpack_require__(139);\n\nvar _ShowChannel2 = _interopRequireDefault(_ShowChannel);\n\nvar _show_request_types = __webpack_require__(43);\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 ShowPage = function (_React$Component) {\n  _inherits(ShowPage, _React$Component);\n\n  function ShowPage() {\n    _classCallCheck(this, ShowPage);\n\n    return _possibleConstructorReturn(this, (ShowPage.__proto__ || Object.getPrototypeOf(ShowPage)).apply(this, arguments));\n  }\n\n  _createClass(ShowPage, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      this.props.onHandleShowPageUri(this.props.match.params);\n    }\n  }, {\n    key: 'componentWillReceiveProps',\n    value: function componentWillReceiveProps(nextProps) {\n      if (nextProps.match.params !== this.props.match.params) {\n        this.props.onHandleShowPageUri(nextProps.match.params);\n      }\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _props = this.props,\n          error = _props.error,\n          requestType = _props.requestType;\n\n      if (error) {\n        return _react2.default.createElement(_ErrorPage2.default, { error: error });\n      }\n      switch (requestType) {\n        case _show_request_types.CHANNEL:\n          return _react2.default.createElement(_ShowChannel2.default, null);\n        case _show_request_types.ASSET_LITE:\n          return _react2.default.createElement(_ShowAssetLite2.default, null);\n        case _show_request_types.ASSET_DETAILS:\n          return _react2.default.createElement(_ShowAssetDetails2.default, null);\n        default:\n          return _react2.default.createElement(\n            'p',\n            null,\n            'loading...'\n          );\n      }\n    }\n  }]);\n\n  return ShowPage;\n}(_react2.default.Component);\n\n;\n\nexports.default = ShowPage;\n\n/***/ }),\n/* 130 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _view = __webpack_require__(131);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n  var show = _ref.show;\n\n  // select request info\n  var requestId = show.request.id;\n  // select asset info\n  var asset = void 0;\n  var request = show.requestList[requestId] || null;\n  var assetList = show.assetList;\n  if (request && assetList) {\n    var assetKey = request.key; // note: just store this in the request\n    asset = assetList[assetKey] || null;\n  };\n  // return props\n  return {\n    asset: asset\n  };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default);\n\n/***/ }),\n/* 131 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\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 = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _SEO = __webpack_require__(9);\n\nvar _SEO2 = _interopRequireDefault(_SEO);\n\nvar _reactRouterDom = __webpack_require__(3);\n\nvar _AssetDisplay = __webpack_require__(44);\n\nvar _AssetDisplay2 = _interopRequireDefault(_AssetDisplay);\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 ShowLite = function (_React$Component) {\n  _inherits(ShowLite, _React$Component);\n\n  function ShowLite() {\n    _classCallCheck(this, ShowLite);\n\n    return _possibleConstructorReturn(this, (ShowLite.__proto__ || Object.getPrototypeOf(ShowLite)).apply(this, arguments));\n  }\n\n  _createClass(ShowLite, [{\n    key: 'render',\n    value: function render() {\n      var asset = this.props.asset;\n\n      if (asset) {\n        var _asset$claimData = asset.claimData,\n            name = _asset$claimData.name,\n            claimId = _asset$claimData.claimId;\n\n        return _react2.default.createElement(\n          'div',\n          { className: 'row row--tall flex-container--column flex-container--center-center show-lite-container' },\n          _react2.default.createElement(_SEO2.default, { pageTitle: name, asset: asset }),\n          _react2.default.createElement(_AssetDisplay2.default, null),\n          _react2.default.createElement(\n            _reactRouterDom.Link,\n            { id: 'asset-boilerpate', className: 'link--primary fine-print', to: '/' + claimId + '/' + name },\n            'hosted via Spee.ch'\n          )\n        );\n      }\n      return _react2.default.createElement(\n        'div',\n        { className: 'row row--tall row--padded flex-container--column flex-container--center-center' },\n        _react2.default.createElement(\n          'p',\n          null,\n          'loading asset data...'\n        )\n      );\n    }\n  }]);\n\n  return ShowLite;\n}(_react2.default.Component);\n\n;\n\nexports.default = ShowLite;\n\n/***/ }),\n/* 132 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\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 = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ProgressBar = __webpack_require__(20);\n\nvar _ProgressBar2 = _interopRequireDefault(_ProgressBar);\n\nvar _asset_display_states = __webpack_require__(37);\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 AssetDisplay = function (_React$Component) {\n  _inherits(AssetDisplay, _React$Component);\n\n  function AssetDisplay() {\n    _classCallCheck(this, AssetDisplay);\n\n    return _possibleConstructorReturn(this, (AssetDisplay.__proto__ || Object.getPrototypeOf(AssetDisplay)).apply(this, arguments));\n  }\n\n  _createClass(AssetDisplay, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      var _props$asset$claimDat = this.props.asset.claimData,\n          name = _props$asset$claimDat.name,\n          claimId = _props$asset$claimDat.claimId;\n\n      this.props.onFileRequest(name, claimId);\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _props = this.props,\n          status = _props.status,\n          error = _props.error,\n          _props$asset$claimDat2 = _props.asset.claimData,\n          name = _props$asset$claimDat2.name,\n          claimId = _props$asset$claimDat2.claimId,\n          contentType = _props$asset$claimDat2.contentType,\n          fileExt = _props$asset$claimDat2.fileExt,\n          thumbnail = _props$asset$claimDat2.thumbnail;\n\n      return _react2.default.createElement(\n        'div',\n        { id: 'asset-display-component' },\n        status === _asset_display_states.LOCAL_CHECK && _react2.default.createElement(\n          'div',\n          null,\n          _react2.default.createElement(\n            'p',\n            null,\n            'Checking to see if Spee.ch has your asset locally...'\n          )\n        ),\n        status === _asset_display_states.UNAVAILABLE && _react2.default.createElement(\n          'div',\n          null,\n          _react2.default.createElement(\n            'p',\n            null,\n            'Sit tight, we\\'re searching the LBRY blockchain for your asset!'\n          ),\n          _react2.default.createElement(_ProgressBar2.default, { size: 12 }),\n          _react2.default.createElement(\n            'p',\n            null,\n            'Curious what magic is happening here? ',\n            _react2.default.createElement(\n              'a',\n              { className: 'link--primary', target: 'blank', href: 'https://lbry.io/faq/what-is-lbry' },\n              'Learn more.'\n            )\n          )\n        ),\n        status === _asset_display_states.ERROR && _react2.default.createElement(\n          'div',\n          null,\n          _react2.default.createElement(\n            'p',\n            null,\n            'Unfortunately, we couldn\\'t download your asset from LBRY.  You can help us out by sharing the below error message in the ',\n            _react2.default.createElement(\n              'a',\n              { className: 'link--primary', href: 'https://discord.gg/YjYbwhS', target: '_blank' },\n              'LBRY discord'\n            ),\n            '.'\n          ),\n          _react2.default.createElement(\n            'i',\n            null,\n            _react2.default.createElement(\n              'p',\n              { id: 'error-message' },\n              error\n            )\n          )\n        ),\n        status === _asset_display_states.AVAILABLE && function () {\n          switch (contentType) {\n            case 'image/jpeg':\n            case 'image/jpg':\n            case 'image/png':\n              return _react2.default.createElement('img', {\n                className: 'asset',\n                src: '/' + claimId + '/' + name + '.' + fileExt,\n                alt: name });\n            case 'image/gif':\n              return _react2.default.createElement('img', {\n                className: 'asset',\n                src: '/' + claimId + '/' + name + '.' + fileExt,\n                alt: name\n              });\n            case 'video/mp4':\n              return _react2.default.createElement(\n                'video',\n                { className: 'asset video', controls: true, poster: thumbnail },\n                _react2.default.createElement('source', {\n                  src: '/' + claimId + '/' + name + '.' + fileExt\n                }),\n                _react2.default.createElement(\n                  'p',\n                  null,\n                  'Your browser does not support the ',\n                  _react2.default.createElement(\n                    'code',\n                    null,\n                    'video'\n                  ),\n                  ' element.'\n                )\n              );\n            default:\n              return _react2.default.createElement(\n                'p',\n                null,\n                'Unsupported file type'\n              );\n          }\n        }()\n      );\n    }\n  }]);\n\n  return AssetDisplay;\n}(_react2.default.Component);\n\n;\n\nexports.default = AssetDisplay;\n\n/***/ }),\n/* 133 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _view = __webpack_require__(134);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n  var show = _ref.show;\n\n  // select request info\n  var requestId = show.request.id;\n  // select asset info\n  var asset = void 0;\n  var request = show.requestList[requestId] || null;\n  var assetList = show.assetList;\n  if (request && assetList) {\n    var assetKey = request.key; // note: just store this in the request\n    asset = assetList[assetKey] || null;\n  };\n  // return props\n  return {\n    asset: asset\n  };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default);\n\n/***/ }),\n/* 134 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\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 = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _SEO = __webpack_require__(9);\n\nvar _SEO2 = _interopRequireDefault(_SEO);\n\nvar _NavBar = __webpack_require__(7);\n\nvar _NavBar2 = _interopRequireDefault(_NavBar);\n\nvar _ErrorPage = __webpack_require__(21);\n\nvar _ErrorPage2 = _interopRequireDefault(_ErrorPage);\n\nvar _AssetTitle = __webpack_require__(135);\n\nvar _AssetTitle2 = _interopRequireDefault(_AssetTitle);\n\nvar _AssetDisplay = __webpack_require__(44);\n\nvar _AssetDisplay2 = _interopRequireDefault(_AssetDisplay);\n\nvar _AssetInfo = __webpack_require__(137);\n\nvar _AssetInfo2 = _interopRequireDefault(_AssetInfo);\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 ShowAssetDetails = function (_React$Component) {\n  _inherits(ShowAssetDetails, _React$Component);\n\n  function ShowAssetDetails() {\n    _classCallCheck(this, ShowAssetDetails);\n\n    return _possibleConstructorReturn(this, (ShowAssetDetails.__proto__ || Object.getPrototypeOf(ShowAssetDetails)).apply(this, arguments));\n  }\n\n  _createClass(ShowAssetDetails, [{\n    key: 'render',\n    value: function render() {\n      var asset = this.props.asset;\n\n      if (asset) {\n        var name = asset.claimData.name;\n\n        return _react2.default.createElement(\n          'div',\n          null,\n          _react2.default.createElement(_SEO2.default, { pageTitle: name + ' - details', asset: asset }),\n          _react2.default.createElement(_NavBar2.default, null),\n          _react2.default.createElement(\n            'div',\n            { className: 'row row--tall row--padded' },\n            _react2.default.createElement(\n              'div',\n              { className: 'column column--10' },\n              _react2.default.createElement(_AssetTitle2.default, null)\n            ),\n            _react2.default.createElement(\n              'div',\n              { className: 'column column--5 column--sml-10 align-content-top' },\n              _react2.default.createElement(\n                'div',\n                { className: 'row row--padded show-details-container' },\n                _react2.default.createElement(_AssetDisplay2.default, null)\n              )\n            ),\n            _react2.default.createElement(\n              'div',\n              { className: 'column column--5 column--sml-10 align-content-top' },\n              _react2.default.createElement(\n                'div',\n                { className: 'row row--padded' },\n                _react2.default.createElement(_AssetInfo2.default, null)\n              )\n            )\n          )\n        );\n      };\n      return _react2.default.createElement(_ErrorPage2.default, { error: 'loading asset data...' });\n    }\n  }]);\n\n  return ShowAssetDetails;\n}(_react2.default.Component);\n\n;\n\nexports.default = ShowAssetDetails;\n\n/***/ }),\n/* 135 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _view = __webpack_require__(136);\n\nvar _view2 = _interopRequireDefault(_view);\n\nvar _show = __webpack_require__(13);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n  var show = _ref.show;\n\n  var _selectAsset = (0, _show.selectAsset)(show),\n      title = _selectAsset.claimData.title;\n\n  return {\n    title: title\n  };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default);\n\n/***/ }),\n/* 136 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar AssetTitle = function AssetTitle(_ref) {\n  var title = _ref.title;\n\n  return _react2.default.createElement(\n    'div',\n    null,\n    _react2.default.createElement(\n      'span',\n      { className: 'text--large' },\n      title\n    )\n  );\n};\n\nexports.default = AssetTitle;\n\n/***/ }),\n/* 137 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _view = __webpack_require__(138);\n\nvar _view2 = _interopRequireDefault(_view);\n\nvar _show = __webpack_require__(13);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n  var show = _ref.show;\n\n  // select asset\n  var asset = (0, _show.selectAsset)(show);\n  //  return props\n  return {\n    asset: asset\n  };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default);\n\n/***/ }),\n/* 138 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\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 = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouterDom = __webpack_require__(3);\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 AssetInfo = function (_React$Component) {\n  _inherits(AssetInfo, _React$Component);\n\n  function AssetInfo(props) {\n    _classCallCheck(this, AssetInfo);\n\n    var _this = _possibleConstructorReturn(this, (AssetInfo.__proto__ || Object.getPrototypeOf(AssetInfo)).call(this, props));\n\n    _this.copyToClipboard = _this.copyToClipboard.bind(_this);\n    return _this;\n  }\n\n  _createClass(AssetInfo, [{\n    key: 'copyToClipboard',\n    value: function copyToClipboard(event) {\n      var elementToCopy = event.target.dataset.elementtocopy;\n      var element = document.getElementById(elementToCopy);\n      element.select();\n      try {\n        document.execCommand('copy');\n      } catch (err) {\n        this.setState({ error: 'Oops, unable to copy' });\n      }\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _props$asset = this.props.asset,\n          shortId = _props$asset.shortId,\n          _props$asset$claimDat = _props$asset.claimData,\n          channelName = _props$asset$claimDat.channelName,\n          certificateId = _props$asset$claimDat.certificateId,\n          description = _props$asset$claimDat.description,\n          name = _props$asset$claimDat.name,\n          claimId = _props$asset$claimDat.claimId,\n          fileExt = _props$asset$claimDat.fileExt,\n          contentType = _props$asset$claimDat.contentType,\n          thumbnail = _props$asset$claimDat.thumbnail,\n          host = _props$asset$claimDat.host;\n\n      return _react2.default.createElement(\n        'div',\n        null,\n        channelName && _react2.default.createElement(\n          'div',\n          { className: 'row row--padded row--wide row--no-top' },\n          _react2.default.createElement(\n            'div',\n            { className: 'column column--2 column--med-10' },\n            _react2.default.createElement(\n              'span',\n              { className: 'text' },\n              'Channel:'\n            )\n          ),\n          _react2.default.createElement(\n            'div',\n            { className: 'column column--8 column--med-10' },\n            _react2.default.createElement(\n              'span',\n              { className: 'text' },\n              _react2.default.createElement(\n                _reactRouterDom.Link,\n                { to: '/' + channelName + ':' + certificateId },\n                channelName\n              )\n            )\n          )\n        ),\n        description && _react2.default.createElement(\n          'div',\n          { className: 'row row--padded row--wide row--no-top' },\n          _react2.default.createElement(\n            'span',\n            { className: 'text' },\n            description\n          )\n        ),\n        _react2.default.createElement(\n          'div',\n          { id: 'show-share-buttons' },\n          _react2.default.createElement(\n            'div',\n            { className: 'row row--padded row--wide row--no-top' },\n            _react2.default.createElement(\n              'div',\n              { className: 'column column--2 column--med-10' },\n              _react2.default.createElement(\n                'span',\n                { className: 'text' },\n                'Share:'\n              )\n            ),\n            _react2.default.createElement(\n              'div',\n              { className: 'column column--8 column--med-10' },\n              _react2.default.createElement(\n                'div',\n                {\n                  className: 'row row--short row--wide flex-container--row flex-container--space-between-bottom flex-container--wrap' },\n                _react2.default.createElement(\n                  'a',\n                  { className: 'link--primary', target: '_blank', href: 'https://twitter.com/intent/tweet?text=' + host + '/' + shortId + '/' + name },\n                  'twitter'\n                ),\n                _react2.default.createElement(\n                  'a',\n                  { className: 'link--primary', target: '_blank', href: 'https://www.facebook.com/sharer/sharer.php?u=' + host + '/' + shortId + '/' + name },\n                  'facebook'\n                ),\n                _react2.default.createElement(\n                  'a',\n                  { className: 'link--primary', target: '_blank', href: 'http://tumblr.com/widgets/share/tool?canonicalUrl=' + host + '/' + shortId + '/' + name },\n                  'tumblr'\n                ),\n                _react2.default.createElement(\n                  'a',\n                  { className: 'link--primary', target: '_blank', href: 'https://www.reddit.com/submit?url=' + host + '/' + shortId + '/' + name + '&title=' + name },\n                  'reddit'\n                )\n              )\n            )\n          )\n        ),\n        _react2.default.createElement(\n          'div',\n          { className: 'row row--padded row--wide row--no-top' },\n          _react2.default.createElement(\n            'div',\n            { id: 'show-short-link' },\n            _react2.default.createElement(\n              'div',\n              { className: 'column column--2 column--med-10' },\n              _react2.default.createElement(\n                'span',\n                { className: 'text' },\n                'Link:'\n              )\n            ),\n            _react2.default.createElement(\n              'div',\n              { className: 'column column--8 column--med-10' },\n              _react2.default.createElement(\n                'div',\n                { className: 'row row--short row--wide' },\n                _react2.default.createElement(\n                  'div',\n                  { className: 'column column--7' },\n                  _react2.default.createElement(\n                    'div',\n                    { className: 'input-error', id: 'input-error-copy-short-link', hidden: 'true' },\n                    'error here'\n                  ),\n                  _react2.default.createElement('input', { type: 'text', id: 'short-link', className: 'input-disabled input-text--full-width', readOnly: true,\n                    spellCheck: 'false',\n                    value: host + '/' + shortId + '/' + name + '.' + fileExt,\n                    onClick: this.select })\n                ),\n                _react2.default.createElement('div', { className: 'column column--1' }),\n                _react2.default.createElement(\n                  'div',\n                  { className: 'column column--2' },\n                  _react2.default.createElement(\n                    'button',\n                    { className: 'button--primary button--wide', 'data-elementtocopy': 'short-link',\n                      onClick: this.copyToClipboard },\n                    'copy'\n                  )\n                )\n              )\n            )\n          ),\n          _react2.default.createElement(\n            'div',\n            { id: 'show-embed-code' },\n            _react2.default.createElement(\n              'div',\n              { className: 'column column--2 column--med-10' },\n              _react2.default.createElement(\n                'span',\n                { className: 'text' },\n                'Embed:'\n              )\n            ),\n            _react2.default.createElement(\n              'div',\n              { className: 'column column--8 column--med-10' },\n              _react2.default.createElement(\n                'div',\n                { className: 'row row--short row--wide' },\n                _react2.default.createElement(\n                  'div',\n                  { className: 'column column--7' },\n                  _react2.default.createElement(\n                    'div',\n                    { className: 'input-error', id: 'input-error-copy-embed-text', hidden: 'true' },\n                    'error here'\n                  ),\n                  contentType === 'video/mp4' ? _react2.default.createElement('input', { type: 'text', id: 'embed-text', className: 'input-disabled input-text--full-width', readOnly: true,\n                    onClick: this.select, spellCheck: 'false',\n                    value: '<video width=\"100%\" controls poster=\"' + thumbnail + '\" src=\"' + host + '/' + claimId + '/' + name + '.' + fileExt + '\"/></video>' }) : _react2.default.createElement('input', { type: 'text', id: 'embed-text', className: 'input-disabled input-text--full-width', readOnly: true,\n                    onClick: this.select, spellCheck: 'false',\n                    value: '<img src=\"' + host + '/' + claimId + '/' + name + '.' + fileExt + '\"/>'\n                  })\n                ),\n                _react2.default.createElement('div', { className: 'column column--1' }),\n                _react2.default.createElement(\n                  'div',\n                  { className: 'column column--2' },\n                  _react2.default.createElement(\n                    'button',\n                    { className: 'button--primary button--wide', 'data-elementtocopy': 'embed-text',\n                      onClick: this.copyToClipboard },\n                    'copy'\n                  )\n                )\n              )\n            )\n          )\n        ),\n        _react2.default.createElement(\n          'div',\n          { className: 'flex-container--row flex-container--space-between-bottom' },\n          _react2.default.createElement(\n            _reactRouterDom.Link,\n            { className: 'link--primary', to: '/' + shortId + '/' + name + '.' + fileExt },\n            _react2.default.createElement(\n              'span',\n              {\n                className: 'text' },\n              'Direct Link'\n            )\n          ),\n          _react2.default.createElement(\n            'a',\n            { className: 'link--primary', href: host + '/' + claimId + '/' + name + '.' + fileExt, download: name },\n            'Download'\n          ),\n          _react2.default.createElement(\n            'a',\n            { className: 'link--primary', target: '_blank', href: 'https://lbry.io/dmca' },\n            'Report'\n          )\n        )\n      );\n    }\n  }]);\n\n  return AssetInfo;\n}(_react2.default.Component);\n\n;\n\nexports.default = AssetInfo;\n\n/***/ }),\n/* 139 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _view = __webpack_require__(140);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n  var show = _ref.show;\n\n  // select request info\n  var requestId = show.request.id;\n  // select request\n  var previousRequest = show.requestList[requestId] || null;\n  // select channel\n  var channel = void 0;\n  if (previousRequest) {\n    var channelKey = previousRequest.key;\n    channel = show.channelList[channelKey] || null;\n  }\n  return {\n    channel: channel\n  };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default);\n\n/***/ }),\n/* 140 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\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 = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _SEO = __webpack_require__(9);\n\nvar _SEO2 = _interopRequireDefault(_SEO);\n\nvar _ErrorPage = __webpack_require__(21);\n\nvar _ErrorPage2 = _interopRequireDefault(_ErrorPage);\n\nvar _NavBar = __webpack_require__(7);\n\nvar _NavBar2 = _interopRequireDefault(_NavBar);\n\nvar _ChannelClaimsDisplay = __webpack_require__(141);\n\nvar _ChannelClaimsDisplay2 = _interopRequireDefault(_ChannelClaimsDisplay);\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 ShowChannel = function (_React$Component) {\n  _inherits(ShowChannel, _React$Component);\n\n  function ShowChannel() {\n    _classCallCheck(this, ShowChannel);\n\n    return _possibleConstructorReturn(this, (ShowChannel.__proto__ || Object.getPrototypeOf(ShowChannel)).apply(this, arguments));\n  }\n\n  _createClass(ShowChannel, [{\n    key: 'render',\n    value: function render() {\n      var channel = this.props.channel;\n\n      if (channel) {\n        var name = channel.name,\n            longId = channel.longId,\n            shortId = channel.shortId;\n\n        return _react2.default.createElement(\n          'div',\n          null,\n          _react2.default.createElement(_SEO2.default, { pageTitle: name, channel: channel }),\n          _react2.default.createElement(_NavBar2.default, null),\n          _react2.default.createElement(\n            'div',\n            { className: 'row row--tall row--padded' },\n            _react2.default.createElement(\n              'div',\n              { className: 'column column--10' },\n              _react2.default.createElement(\n                'h2',\n                null,\n                'channel name: ',\n                name\n              ),\n              _react2.default.createElement(\n                'p',\n                { className: 'fine-print' },\n                'full channel id: ',\n                longId\n              ),\n              _react2.default.createElement(\n                'p',\n                { className: 'fine-print' },\n                'short channel id: ',\n                shortId\n              )\n            ),\n            _react2.default.createElement(\n              'div',\n              { className: 'column column--10' },\n              _react2.default.createElement(_ChannelClaimsDisplay2.default, null)\n            )\n          )\n        );\n      };\n      return _react2.default.createElement(_ErrorPage2.default, { error: 'loading channel data...' });\n    }\n  }]);\n\n  return ShowChannel;\n}(_react2.default.Component);\n\n;\n\nexports.default = ShowChannel;\n\n/***/ }),\n/* 141 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _show = __webpack_require__(8);\n\nvar _view = __webpack_require__(142);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n  var show = _ref.show;\n\n  // select channel key\n  var request = show.requestList[show.request.id];\n  var channelKey = request.key;\n  // select channel claims\n  var channel = show.channelList[channelKey] || null;\n  // return props\n  return {\n    channelKey: channelKey,\n    channel: channel\n  };\n};\n\nvar mapDispatchToProps = {\n  onUpdateChannelClaims: _show.onUpdateChannelClaims\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 142 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\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 = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _AssetPreview = __webpack_require__(143);\n\nvar _AssetPreview2 = _interopRequireDefault(_AssetPreview);\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 ChannelClaimsDisplay = function (_React$Component) {\n  _inherits(ChannelClaimsDisplay, _React$Component);\n\n  function ChannelClaimsDisplay(props) {\n    _classCallCheck(this, ChannelClaimsDisplay);\n\n    var _this = _possibleConstructorReturn(this, (ChannelClaimsDisplay.__proto__ || Object.getPrototypeOf(ChannelClaimsDisplay)).call(this, props));\n\n    _this.showNextResultsPage = _this.showNextResultsPage.bind(_this);\n    _this.showPreviousResultsPage = _this.showPreviousResultsPage.bind(_this);\n    return _this;\n  }\n\n  _createClass(ChannelClaimsDisplay, [{\n    key: 'showPreviousResultsPage',\n    value: function showPreviousResultsPage() {\n      var currentPage = this.props.channel.claimsData.currentPage;\n\n      var previousPage = parseInt(currentPage) - 1;\n      this.showNewPage(previousPage);\n    }\n  }, {\n    key: 'showNextResultsPage',\n    value: function showNextResultsPage() {\n      var currentPage = this.props.channel.claimsData.currentPage;\n\n      var nextPage = parseInt(currentPage) + 1;\n      this.showNewPage(nextPage);\n    }\n  }, {\n    key: 'showNewPage',\n    value: function showNewPage(page) {\n      var _props = this.props,\n          channelKey = _props.channelKey,\n          _props$channel = _props.channel,\n          name = _props$channel.name,\n          longId = _props$channel.longId;\n\n      this.props.onUpdateChannelClaims(channelKey, name, longId, page);\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _props$channel$claims = this.props.channel.claimsData,\n          claims = _props$channel$claims.claims,\n          currentPage = _props$channel$claims.currentPage,\n          totalPages = _props$channel$claims.totalPages;\n\n      return _react2.default.createElement(\n        'div',\n        { className: 'row row--tall' },\n        claims.length > 0 ? _react2.default.createElement(\n          'div',\n          null,\n          claims.map(function (claim, index) {\n            return _react2.default.createElement(_AssetPreview2.default, {\n              claimData: claim,\n              key: claim.name + '-' + index\n            });\n          }),\n          _react2.default.createElement(\n            'div',\n            null,\n            currentPage > 1 && _react2.default.createElement(\n              'button',\n              { className: 'button--secondary', onClick: this.showPreviousResultsPage },\n              'Previous Page'\n            ),\n            currentPage < totalPages && _react2.default.createElement(\n              'button',\n              { className: 'button--secondary', onClick: this.showNextResultsPage },\n              'Next Page'\n            )\n          )\n        ) : _react2.default.createElement(\n          'p',\n          null,\n          'There are no claims in this channel'\n        )\n      );\n    }\n  }]);\n\n  return ChannelClaimsDisplay;\n}(_react2.default.Component);\n\n;\n\nexports.default = ChannelClaimsDisplay;\n\n/***/ }),\n/* 143 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _view = __webpack_require__(144);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n  var defaultThumbnail = _ref.site.defaults.defaultThumbnail;\n\n  return {\n    defaultThumbnail: defaultThumbnail\n  };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default);\n\n/***/ }),\n/* 144 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouterDom = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar AssetPreview = function AssetPreview(_ref) {\n  var defaultThumbnail = _ref.defaultThumbnail,\n      _ref$claimData = _ref.claimData,\n      name = _ref$claimData.name,\n      claimId = _ref$claimData.claimId,\n      fileExt = _ref$claimData.fileExt,\n      contentType = _ref$claimData.contentType,\n      thumbnail = _ref$claimData.thumbnail;\n\n  var directSourceLink = claimId + '/' + name + '.' + fileExt;\n  var showUrlLink = '/' + claimId + '/' + name;\n  return _react2.default.createElement(\n    'div',\n    { className: 'asset-holder' },\n    _react2.default.createElement(\n      _reactRouterDom.Link,\n      { to: showUrlLink },\n      function () {\n        switch (contentType) {\n          case 'image/jpeg':\n          case 'image/jpg':\n          case 'image/png':\n          case 'image/gif':\n            return _react2.default.createElement('img', {\n              className: 'asset-preview',\n              src: directSourceLink,\n              alt: name\n            });\n          case 'video/mp4':\n            return _react2.default.createElement('img', {\n              className: 'asset-preview video',\n              src: thumbnail || defaultThumbnail,\n              alt: name\n            });\n          default:\n            return _react2.default.createElement(\n              'p',\n              null,\n              'unsupported file type'\n            );\n        }\n      }()\n    )\n  );\n};\n\nexports.default = AssetPreview;\n\n/***/ }),\n/* 145 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _view = __webpack_require__(146);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n  var _ref$site = _ref.site,\n      host = _ref$site.host,\n      title = _ref$site.title;\n\n  return {\n    host: host,\n    title: title\n  };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default);\n\n/***/ }),\n/* 146 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\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 = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _NavBar = __webpack_require__(7);\n\nvar _NavBar2 = _interopRequireDefault(_NavBar);\n\nvar _reactHelmet = __webpack_require__(14);\n\nvar _reactHelmet2 = _interopRequireDefault(_reactHelmet);\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 FourOhForPage = function (_React$Component) {\n  _inherits(FourOhForPage, _React$Component);\n\n  function FourOhForPage() {\n    _classCallCheck(this, FourOhForPage);\n\n    return _possibleConstructorReturn(this, (FourOhForPage.__proto__ || Object.getPrototypeOf(FourOhForPage)).apply(this, arguments));\n  }\n\n  _createClass(FourOhForPage, [{\n    key: 'render',\n    value: function render() {\n      var _props = this.props,\n          title = _props.title,\n          host = _props.host;\n\n      return _react2.default.createElement(\n        'div',\n        null,\n        _react2.default.createElement(\n          _reactHelmet2.default,\n          null,\n          _react2.default.createElement(\n            'title',\n            null,\n            title,\n            ' - 404'\n          ),\n          _react2.default.createElement('link', { rel: 'canonical', href: host + '/404' })\n        ),\n        _react2.default.createElement(_NavBar2.default, null),\n        _react2.default.createElement(\n          'div',\n          { className: 'row row--padded' },\n          _react2.default.createElement(\n            'h2',\n            null,\n            '404'\n          ),\n          _react2.default.createElement(\n            'p',\n            null,\n            'That page does not exist'\n          )\n        )\n      );\n    }\n  }]);\n\n  return FourOhForPage;\n}(_react2.default.Component);\n\n;\n\nexports.default = FourOhForPage;\n\n/***/ }),\n/* 147 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _require = __webpack_require__(17),\n    sendGAServeEvent = _require.sendGAServeEvent;\n\nvar _require2 = __webpack_require__(148),\n    determineResponseType = _require2.determineResponseType,\n    flipClaimNameAndIdForBackwardsCompatibility = _require2.flipClaimNameAndIdForBackwardsCompatibility,\n    logRequestData = _require2.logRequestData,\n    getClaimIdAndServeAsset = _require2.getClaimIdAndServeAsset;\n\nvar lbryUri = __webpack_require__(149);\nvar handleShowRender = __webpack_require__(150);\nvar SERVE = 'SERVE';\n\nmodule.exports = function (app) {\n  // route to serve a specific asset using the channel or claim id\n  app.get('/:identifier/:claim', function (req, res) {\n    var headers = req.headers,\n        ip = req.ip,\n        originalUrl = req.originalUrl,\n        params = req.params;\n    // decide if this is a show request\n\n    var hasFileExtension = void 0;\n    try {\n      var _lbryUri$parseModifie = lbryUri.parseModifier(params.claim);\n\n      hasFileExtension = _lbryUri$parseModifie.hasFileExtension;\n    } catch (error) {\n      return res.status(400).json({ success: false, message: error.message });\n    }\n    var responseType = determineResponseType(hasFileExtension, headers);\n    if (responseType !== SERVE) {\n      return handleShowRender(req, res);\n    }\n    // handle serve request\n    // send google analytics\n    sendGAServeEvent(headers, ip, originalUrl);\n    // parse the claim\n    var claimName = void 0;\n    try {\n      var _lbryUri$parseClaim = lbryUri.parseClaim(params.claim);\n\n      claimName = _lbryUri$parseClaim.claimName;\n    } catch (error) {\n      return res.status(400).json({ success: false, message: error.message });\n    }\n    // parse the identifier\n    var isChannel = void 0,\n        channelName = void 0,\n        channelClaimId = void 0,\n        claimId = void 0;\n    try {\n      var _lbryUri$parseIdentif = lbryUri.parseIdentifier(params.identifier);\n\n      isChannel = _lbryUri$parseIdentif.isChannel;\n      channelName = _lbryUri$parseIdentif.channelName;\n      channelClaimId = _lbryUri$parseIdentif.channelClaimId;\n      claimId = _lbryUri$parseIdentif.claimId;\n    } catch (error) {\n      return res.status(400).json({ success: false, message: error.message });\n    }\n    if (!isChannel) {\n      var _flipClaimNameAndIdFo = flipClaimNameAndIdForBackwardsCompatibility(claimId, claimName);\n\n      var _flipClaimNameAndIdFo2 = _slicedToArray(_flipClaimNameAndIdFo, 2);\n\n      claimId = _flipClaimNameAndIdFo2[0];\n      claimName = _flipClaimNameAndIdFo2[1];\n    }\n    // log the request data for debugging\n    logRequestData(responseType, claimName, channelName, claimId);\n    // get the claim Id and then serve the asset\n    getClaimIdAndServeAsset(channelName, channelClaimId, claimName, claimId, originalUrl, ip, res);\n  });\n  // route to serve the winning asset at a claim or a channel page\n  app.get('/:claim', function (req, res) {\n    var headers = req.headers,\n        ip = req.ip,\n        originalUrl = req.originalUrl,\n        params = req.params;\n    // decide if this is a show request\n\n    var hasFileExtension = void 0;\n    try {\n      var _lbryUri$parseModifie2 = lbryUri.parseModifier(params.claim);\n\n      hasFileExtension = _lbryUri$parseModifie2.hasFileExtension;\n    } catch (error) {\n      return res.status(400).json({ success: false, message: error.message });\n    }\n    var responseType = determineResponseType(hasFileExtension, headers);\n    if (responseType !== SERVE) {\n      return handleShowRender(req, res);\n    }\n    // handle serve request\n    // send google analytics\n    sendGAServeEvent(headers, ip, originalUrl);\n    // parse the claim\n    var claimName = void 0;\n    try {\n      var _lbryUri$parseClaim2 = lbryUri.parseClaim(params.claim);\n\n      claimName = _lbryUri$parseClaim2.claimName;\n    } catch (error) {\n      return res.status(400).json({ success: false, message: error.message });\n    }\n    // log the request data for debugging\n    logRequestData(responseType, claimName, null, null);\n    // get the claim Id and then serve the asset\n    getClaimIdAndServeAsset(null, null, claimName, null, originalUrl, ip, res);\n  });\n};\n\n/***/ }),\n/* 148 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar logger = __webpack_require__(2);\n\nvar _require = __webpack_require__(30),\n    getClaimId = _require.getClaimId,\n    getLocalFileRecord = _require.getLocalFileRecord;\n\nvar _require2 = __webpack_require__(29),\n    handleErrorResponse = _require2.handleErrorResponse;\n\nvar SERVE = 'SERVE';\nvar SHOW = 'SHOW';\nvar NO_FILE = 'NO_FILE';\nvar NO_CHANNEL = 'NO_CHANNEL';\nvar NO_CLAIM = 'NO_CLAIM';\n\nfunction clientAcceptsHtml(_ref) {\n  var accept = _ref.accept;\n\n  return accept && accept.match(/text\\/html/);\n};\n\nfunction requestIsFromBrowser(headers) {\n  return headers['user-agent'] && headers['user-agent'].match(/Mozilla/);\n};\n\nfunction clientWantsAsset(_ref2) {\n  var accept = _ref2.accept,\n      range = _ref2.range;\n\n  var imageIsWanted = accept && accept.match(/image\\/.*/) && !accept.match(/text\\/html/) && !accept.match(/text\\/\\*/);\n  var videoIsWanted = accept && range;\n  return imageIsWanted || videoIsWanted;\n};\n\nfunction isValidClaimId(claimId) {\n  return claimId.length === 40 && !/[^A-Za-z0-9]/g.test(claimId);\n};\n\nfunction isValidShortId(claimId) {\n  return claimId.length === 1; // it should really evaluate the short url itself\n};\n\nfunction isValidShortIdOrClaimId(input) {\n  return isValidClaimId(input) || isValidShortId(input);\n};\n\nfunction serveAssetToClient(claimId, name, res) {\n  return getLocalFileRecord(claimId, name).then(function (fileRecord) {\n    // check that a local record was found\n    if (fileRecord === NO_FILE) {\n      return res.status(307).redirect('/api/claim/get/' + name + '/' + claimId);\n    }\n    // serve the file\n    var filePath = fileRecord.filePath,\n        fileType = fileRecord.fileType;\n\n    logger.verbose('serving file: ' + filePath);\n    var sendFileOptions = {\n      headers: {\n        'X-Content-Type-Options': 'nosniff',\n        'Content-Type': fileType || 'image/jpeg'\n      }\n    };\n    res.status(200).sendFile(filePath, sendFileOptions);\n  }).catch(function (error) {\n    throw error;\n  });\n};\n\nmodule.exports = {\n  getClaimIdAndServeAsset: function getClaimIdAndServeAsset(channelName, channelClaimId, claimName, claimId, originalUrl, ip, res) {\n    // get the claim Id and then serve the asset\n    getClaimId(channelName, channelClaimId, claimName, claimId).then(function (fullClaimId) {\n      if (fullClaimId === NO_CLAIM) {\n        return res.status(404).json({ success: false, message: 'no claim id could be found' });\n      } else if (fullClaimId === NO_CHANNEL) {\n        return res.status(404).json({ success: false, message: 'no channel id could be found' });\n      }\n      serveAssetToClient(fullClaimId, claimName, res);\n      // postToStats(responseType, originalUrl, ip, claimName, fullClaimId, 'success');\n    }).catch(function (error) {\n      handleErrorResponse(originalUrl, ip, error, res);\n      // postToStats(responseType, originalUrl, ip, claimName, fullClaimId, 'fail');\n    });\n  },\n  determineResponseType: function determineResponseType(hasFileExtension, headers) {\n    var responseType = void 0;\n    if (hasFileExtension) {\n      responseType = SERVE; // assume a serve request if file extension is present\n      if (clientAcceptsHtml(headers)) {\n        // if the request comes from a browser, change it to a show request\n        responseType = SHOW;\n      }\n    } else {\n      responseType = SHOW;\n      if (clientWantsAsset(headers) && requestIsFromBrowser(headers)) {\n        // this is in case someone embeds a show url\n        logger.debug('Show request came from browser but wants an image/video. Changing response to serve...');\n        responseType = SERVE;\n      }\n    }\n    return responseType;\n  },\n  flipClaimNameAndIdForBackwardsCompatibility: function flipClaimNameAndIdForBackwardsCompatibility(identifier, name) {\n    // this is a patch for backwards compatability with '/name/claim_id' url format\n    if (isValidShortIdOrClaimId(name) && !isValidShortIdOrClaimId(identifier)) {\n      var tempName = name;\n      name = identifier;\n      identifier = tempName;\n    }\n    return [identifier, name];\n  },\n  logRequestData: function logRequestData(responseType, claimName, channelName, claimId) {\n    logger.debug('responseType ===', responseType);\n    logger.debug('claim name === ', claimName);\n    logger.debug('channel name ===', channelName);\n    logger.debug('claim id ===', claimId);\n  }\n};\n\n/***/ }),\n/* 149 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar logger = __webpack_require__(2);\n\nmodule.exports = {\n  REGEXP_INVALID_CLAIM: /[^A-Za-z0-9-]/g,\n  REGEXP_INVALID_CHANNEL: /[^A-Za-z0-9-@]/g,\n  REGEXP_ADDRESS: /^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/,\n  CHANNEL_CHAR: '@',\n  parseIdentifier: function parseIdentifier(identifier) {\n    logger.debug('parsing identifier:', identifier);\n    var componentsRegex = new RegExp('([^:$#/]*)' + // value (stops at the first separator or end)\n    '([:$#]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end)\n    );\n\n    var _componentsRegex$exec = componentsRegex.exec(identifier).map(function (match) {\n      return match || null;\n    }),\n        _componentsRegex$exec2 = _slicedToArray(_componentsRegex$exec, 4),\n        proto = _componentsRegex$exec2[0],\n        value = _componentsRegex$exec2[1],\n        modifierSeperator = _componentsRegex$exec2[2],\n        modifier = _componentsRegex$exec2[3];\n\n    logger.debug(proto + ', ' + value + ', ' + modifierSeperator + ', ' + modifier);\n\n    // Validate and process name\n    if (!value) {\n      throw new Error('Check your url.  No channel name provided before \"' + modifierSeperator + '\"');\n    }\n    var isChannel = value.startsWith(module.exports.CHANNEL_CHAR);\n    var channelName = isChannel ? value : null;\n    var claimId = void 0;\n    if (isChannel) {\n      if (!channelName) {\n        throw new Error('No channel name after @.');\n      }\n      var nameBadChars = channelName.match(module.exports.REGEXP_INVALID_CHANNEL);\n      if (nameBadChars) {\n        throw new Error('Invalid characters in channel name: ' + nameBadChars.join(', ') + '.');\n      }\n    } else {\n      claimId = value;\n    }\n\n    // Validate and process modifier\n    var channelClaimId = void 0;\n    if (modifierSeperator) {\n      if (!modifier) {\n        throw new Error('No modifier provided after separator \"' + modifierSeperator + '\"');\n      }\n\n      if (modifierSeperator === ':') {\n        channelClaimId = modifier;\n      } else {\n        throw new Error('The \"' + modifierSeperator + '\" modifier is not currently supported');\n      }\n    }\n    return {\n      isChannel: isChannel,\n      channelName: channelName,\n      channelClaimId: channelClaimId,\n      claimId: claimId\n    };\n  },\n  parseClaim: function parseClaim(claim) {\n    logger.debug('parsing name:', claim);\n    var componentsRegex = new RegExp('([^:$#/.]*)' + // name (stops at the first modifier)\n    '([:$#.]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end)\n    );\n\n    var _componentsRegex$exec3 = componentsRegex.exec(claim).map(function (match) {\n      return match || null;\n    }),\n        _componentsRegex$exec4 = _slicedToArray(_componentsRegex$exec3, 4),\n        proto = _componentsRegex$exec4[0],\n        claimName = _componentsRegex$exec4[1],\n        modifierSeperator = _componentsRegex$exec4[2],\n        modifier = _componentsRegex$exec4[3];\n\n    logger.debug(proto + ', ' + claimName + ', ' + modifierSeperator + ', ' + modifier);\n\n    // Validate and process name\n    if (!claimName) {\n      throw new Error('No claim name provided before .');\n    }\n    var nameBadChars = claimName.match(module.exports.REGEXP_INVALID_CLAIM);\n    if (nameBadChars) {\n      throw new Error('Invalid characters in claim name: ' + nameBadChars.join(', ') + '.');\n    }\n    // Validate and process modifier\n    if (modifierSeperator) {\n      if (!modifier) {\n        throw new Error('No file extension provided after separator ' + modifierSeperator + '.');\n      }\n      if (modifierSeperator !== '.') {\n        throw new Error('The ' + modifierSeperator + ' modifier is not supported in the claim name');\n      }\n    }\n    // return results\n    return {\n      claimName: claimName\n    };\n  },\n  parseModifier: function parseModifier(claim) {\n    logger.debug('parsing modifier:', claim);\n    var componentsRegex = new RegExp('([^:$#/.]*)' + // name (stops at the first modifier)\n    '([:$#.]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end)\n    );\n\n    var _componentsRegex$exec5 = componentsRegex.exec(claim).map(function (match) {\n      return match || null;\n    }),\n        _componentsRegex$exec6 = _slicedToArray(_componentsRegex$exec5, 4),\n        proto = _componentsRegex$exec6[0],\n        claimName = _componentsRegex$exec6[1],\n        modifierSeperator = _componentsRegex$exec6[2],\n        modifier = _componentsRegex$exec6[3];\n\n    logger.debug(proto + ', ' + claimName + ', ' + modifierSeperator + ', ' + modifier);\n    // Validate and process modifier\n    var hasFileExtension = false;\n    if (modifierSeperator) {\n      hasFileExtension = true;\n    }\n    return {\n      hasFileExtension: hasFileExtension\n    };\n  }\n};\n\n/***/ }),\n/* 150 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _server = __webpack_require__(32);\n\nvar _redux = __webpack_require__(18);\n\nvar _reducers = __webpack_require__(33);\n\nvar _reducers2 = _interopRequireDefault(_reducers);\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _reactRouterDom = __webpack_require__(3);\n\nvar _GAListener = __webpack_require__(38);\n\nvar _GAListener2 = _interopRequireDefault(_GAListener);\n\nvar _app = __webpack_require__(39);\n\nvar _app2 = _interopRequireDefault(_app);\n\nvar _renderFullPage = __webpack_require__(45);\n\nvar _renderFullPage2 = _interopRequireDefault(_renderFullPage);\n\nvar _reduxSaga = __webpack_require__(151);\n\nvar _reduxSaga2 = _interopRequireDefault(_reduxSaga);\n\nvar _effects = __webpack_require__(15);\n\nvar _show_uri = __webpack_require__(152);\n\nvar _show = __webpack_require__(8);\n\nvar _reactHelmet = __webpack_require__(14);\n\nvar _reactHelmet2 = _interopRequireDefault(_reactHelmet);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar returnSagaWithParams = function returnSagaWithParams(saga, params) {\n  return (/*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n      return regeneratorRuntime.wrap(function _callee$(_context) {\n        while (1) {\n          switch (_context.prev = _context.next) {\n            case 0:\n              _context.next = 2;\n              return (0, _effects.call)(saga, params);\n\n            case 2:\n            case 'end':\n              return _context.stop();\n          }\n        }\n      }, _callee, this);\n    })\n  );\n};\n\nmodule.exports = function (req, res) {\n  var context = {};\n\n  // create and apply middleware\n  var sagaMiddleware = (0, _reduxSaga2.default)();\n  var middleware = (0, _redux.applyMiddleware)(sagaMiddleware);\n\n  // create a new Redux store instance\n  var store = (0, _redux.createStore)(_reducers2.default, middleware);\n\n  // create saga\n  var action = (0, _show.onHandleShowPageUri)(req.params);\n  var saga = returnSagaWithParams(_show_uri.handleShowPageUri, action);\n\n  // run the saga middleware\n  sagaMiddleware.run(saga).done.then(function () {\n    // render component to a string\n    var html = (0, _server.renderToString)(_react2.default.createElement(\n      _reactRedux.Provider,\n      { store: store },\n      _react2.default.createElement(\n        _reactRouterDom.StaticRouter,\n        { location: req.url, context: context },\n        _react2.default.createElement(\n          _GAListener2.default,\n          null,\n          _react2.default.createElement(_app2.default, null)\n        )\n      )\n    ));\n\n    // get head tags from helmet\n    var helmet = _reactHelmet2.default.renderStatic();\n\n    // check for a redirect\n    if (context.url) {\n      return res.redirect(301, context.url);\n    }\n\n    // get the initial state from our Redux store\n    var preloadedState = store.getState();\n\n    // send the rendered page back to the client\n    res.send((0, _renderFullPage2.default)(helmet, html, preloadedState));\n  });\n};\n\n/***/ }),\n/* 151 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"redux-saga\");\n\n/***/ }),\n/* 152 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.handleShowPageUri = handleShowPageUri;\nexports.watchHandleShowPageUri = watchHandleShowPageUri;\n\nvar _effects = __webpack_require__(15);\n\nvar _show_action_types = __webpack_require__(12);\n\nvar actions = _interopRequireWildcard(_show_action_types);\n\nvar _show = __webpack_require__(8);\n\nvar _show_asset = __webpack_require__(153);\n\nvar _show_channel = __webpack_require__(155);\n\nvar _lbryUri = __webpack_require__(157);\n\nvar _lbryUri2 = _interopRequireDefault(_lbryUri);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar _marked = /*#__PURE__*/regeneratorRuntime.mark(parseAndUpdateIdentifierAndClaim),\n    _marked2 = /*#__PURE__*/regeneratorRuntime.mark(parseAndUpdateClaimOnly),\n    _marked3 = /*#__PURE__*/regeneratorRuntime.mark(handleShowPageUri),\n    _marked4 = /*#__PURE__*/regeneratorRuntime.mark(watchHandleShowPageUri);\n\nfunction parseAndUpdateIdentifierAndClaim(modifier, claim) {\n  var isChannel, channelName, channelClaimId, claimId, claimName, extension, _lbryUri$parseIdentif, _lbryUri$parseClaim;\n\n  return regeneratorRuntime.wrap(function parseAndUpdateIdentifierAndClaim$(_context) {\n    while (1) {\n      switch (_context.prev = _context.next) {\n        case 0:\n          // this is a request for an asset\n          // claim will be an asset claim\n          // the identifier could be a channel or a claim id\n          isChannel = void 0, channelName = void 0, channelClaimId = void 0, claimId = void 0, claimName = void 0, extension = void 0;\n          _context.prev = 1;\n          _lbryUri$parseIdentif = _lbryUri2.default.parseIdentifier(modifier);\n          isChannel = _lbryUri$parseIdentif.isChannel;\n          channelName = _lbryUri$parseIdentif.channelName;\n          channelClaimId = _lbryUri$parseIdentif.channelClaimId;\n          claimId = _lbryUri$parseIdentif.claimId;\n          _lbryUri$parseClaim = _lbryUri2.default.parseClaim(claim);\n          claimName = _lbryUri$parseClaim.claimName;\n          extension = _lbryUri$parseClaim.extension;\n          _context.next = 17;\n          break;\n\n        case 12:\n          _context.prev = 12;\n          _context.t0 = _context['catch'](1);\n          _context.next = 16;\n          return (0, _effects.put)((0, _show.onRequestError)(_context.t0.message));\n\n        case 16:\n          return _context.abrupt('return', _context.sent);\n\n        case 17:\n          if (!isChannel) {\n            _context.next = 21;\n            break;\n          }\n\n          _context.next = 20;\n          return (0, _effects.call)(_show_asset.newAssetRequest, (0, _show.onNewAssetRequest)(claimName, null, channelName, channelClaimId, extension));\n\n        case 20:\n          return _context.abrupt('return', _context.sent);\n\n        case 21:\n          ;\n          _context.next = 24;\n          return (0, _effects.call)(_show_asset.newAssetRequest, (0, _show.onNewAssetRequest)(claimName, claimId, null, null, extension));\n\n        case 24:\n        case 'end':\n          return _context.stop();\n      }\n    }\n  }, _marked, this, [[1, 12]]);\n}\nfunction parseAndUpdateClaimOnly(claim) {\n  var isChannel, channelName, channelClaimId, _lbryUri$parseIdentif2, claimName, extension, _lbryUri$parseClaim2;\n\n  return regeneratorRuntime.wrap(function parseAndUpdateClaimOnly$(_context2) {\n    while (1) {\n      switch (_context2.prev = _context2.next) {\n        case 0:\n          // this could be a request for an asset or a channel page\n          // claim could be an asset claim or a channel claim\n          isChannel = void 0, channelName = void 0, channelClaimId = void 0;\n          _context2.prev = 1;\n          _lbryUri$parseIdentif2 = _lbryUri2.default.parseIdentifier(claim);\n          isChannel = _lbryUri$parseIdentif2.isChannel;\n          channelName = _lbryUri$parseIdentif2.channelName;\n          channelClaimId = _lbryUri$parseIdentif2.channelClaimId;\n          _context2.next = 13;\n          break;\n\n        case 8:\n          _context2.prev = 8;\n          _context2.t0 = _context2['catch'](1);\n          _context2.next = 12;\n          return (0, _effects.put)((0, _show.onRequestError)(_context2.t0.message));\n\n        case 12:\n          return _context2.abrupt('return', _context2.sent);\n\n        case 13:\n          if (!isChannel) {\n            _context2.next = 17;\n            break;\n          }\n\n          _context2.next = 16;\n          return (0, _effects.call)(_show_channel.newChannelRequest, (0, _show.onNewChannelRequest)(channelName, channelClaimId));\n\n        case 16:\n          return _context2.abrupt('return', _context2.sent);\n\n        case 17:\n          // if not for a channel, parse the claim request\n          claimName = void 0, extension = void 0;\n          _context2.prev = 18;\n          _lbryUri$parseClaim2 = _lbryUri2.default.parseClaim(claim);\n          claimName = _lbryUri$parseClaim2.claimName;\n          extension = _lbryUri$parseClaim2.extension;\n          _context2.next = 29;\n          break;\n\n        case 24:\n          _context2.prev = 24;\n          _context2.t1 = _context2['catch'](18);\n          _context2.next = 28;\n          return (0, _effects.put)((0, _show.onRequestError)(_context2.t1.message));\n\n        case 28:\n          return _context2.abrupt('return', _context2.sent);\n\n        case 29:\n          _context2.next = 31;\n          return (0, _effects.call)(_show_asset.newAssetRequest, (0, _show.onNewAssetRequest)(claimName, null, null, null, extension));\n\n        case 31:\n        case 'end':\n          return _context2.stop();\n      }\n    }\n  }, _marked2, this, [[1, 8], [18, 24]]);\n}\n\nfunction handleShowPageUri(action) {\n  var _action$data, identifier, claim;\n\n  return regeneratorRuntime.wrap(function handleShowPageUri$(_context3) {\n    while (1) {\n      switch (_context3.prev = _context3.next) {\n        case 0:\n          _action$data = action.data, identifier = _action$data.identifier, claim = _action$data.claim;\n\n          if (!identifier) {\n            _context3.next = 5;\n            break;\n          }\n\n          _context3.next = 4;\n          return (0, _effects.call)(parseAndUpdateIdentifierAndClaim, identifier, claim);\n\n        case 4:\n          return _context3.abrupt('return', _context3.sent);\n\n        case 5:\n          _context3.next = 7;\n          return (0, _effects.call)(parseAndUpdateClaimOnly, claim);\n\n        case 7:\n        case 'end':\n          return _context3.stop();\n      }\n    }\n  }, _marked3, this);\n};\n\nfunction watchHandleShowPageUri() {\n  return regeneratorRuntime.wrap(function watchHandleShowPageUri$(_context4) {\n    while (1) {\n      switch (_context4.prev = _context4.next) {\n        case 0:\n          _context4.next = 2;\n          return (0, _effects.takeLatest)(actions.HANDLE_SHOW_URI, handleShowPageUri);\n\n        case 2:\n        case 'end':\n          return _context4.stop();\n      }\n    }\n  }, _marked4, this);\n};\n\n/***/ }),\n/* 153 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.newAssetRequest = newAssetRequest;\nexports.watchNewAssetRequest = watchNewAssetRequest;\n\nvar _effects = __webpack_require__(15);\n\nvar _show_action_types = __webpack_require__(12);\n\nvar actions = _interopRequireWildcard(_show_action_types);\n\nvar _show = __webpack_require__(8);\n\nvar _assetApi = __webpack_require__(154);\n\nvar _show2 = __webpack_require__(13);\n\nvar _site = __webpack_require__(46);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar _marked = /*#__PURE__*/regeneratorRuntime.mark(newAssetRequest),\n    _marked2 = /*#__PURE__*/regeneratorRuntime.mark(watchNewAssetRequest);\n\nfunction newAssetRequest(action) {\n  var _action$data, requestType, requestId, name, modifier, state, host, longId, _ref, assetKey, shortId, _ref2, claimData, _ref3;\n\n  return regeneratorRuntime.wrap(function newAssetRequest$(_context) {\n    while (1) {\n      switch (_context.prev = _context.next) {\n        case 0:\n          _action$data = action.data, requestType = _action$data.requestType, requestId = _action$data.requestId, name = _action$data.name, modifier = _action$data.modifier;\n          // put an action to update the request in redux\n\n          _context.next = 3;\n          return (0, _effects.put)((0, _show.onRequestUpdate)(requestType, requestId));\n\n        case 3:\n          _context.next = 5;\n          return (0, _effects.select)(_show2.selectShowState);\n\n        case 5:\n          state = _context.sent;\n          _context.next = 8;\n          return (0, _effects.select)(_site.selectSiteHost);\n\n        case 8:\n          host = _context.sent;\n\n          if (!state.requestList[requestId]) {\n            _context.next = 11;\n            break;\n          }\n\n          return _context.abrupt('return', null);\n\n        case 11:\n          // get long id && add request to request list\n          longId = void 0;\n          _context.prev = 12;\n          _context.next = 15;\n          return (0, _effects.call)(_assetApi.getLongClaimId, host, name, modifier);\n\n        case 15:\n          _ref = _context.sent;\n          longId = _ref.data;\n          _context.next = 24;\n          break;\n\n        case 19:\n          _context.prev = 19;\n          _context.t0 = _context['catch'](12);\n          _context.next = 23;\n          return (0, _effects.put)((0, _show.onRequestError)(_context.t0.message));\n\n        case 23:\n          return _context.abrupt('return', _context.sent);\n\n        case 24:\n          assetKey = 'a#' + name + '#' + longId;\n          _context.next = 27;\n          return (0, _effects.put)((0, _show.addRequestToRequestList)(requestId, null, assetKey));\n\n        case 27:\n          if (!state.assetList[assetKey]) {\n            _context.next = 29;\n            break;\n          }\n\n          return _context.abrupt('return', null);\n\n        case 29:\n          // get short Id\n          shortId = void 0;\n          _context.prev = 30;\n          _context.next = 33;\n          return (0, _effects.call)(_assetApi.getShortId, host, name, longId);\n\n        case 33:\n          _ref2 = _context.sent;\n          shortId = _ref2.data;\n          _context.next = 42;\n          break;\n\n        case 37:\n          _context.prev = 37;\n          _context.t1 = _context['catch'](30);\n          _context.next = 41;\n          return (0, _effects.put)((0, _show.onRequestError)(_context.t1.message));\n\n        case 41:\n          return _context.abrupt('return', _context.sent);\n\n        case 42:\n          // get asset claim data\n          claimData = void 0;\n          _context.prev = 43;\n          _context.next = 46;\n          return (0, _effects.call)(_assetApi.getClaimData, host, name, longId);\n\n        case 46:\n          _ref3 = _context.sent;\n          claimData = _ref3.data;\n          _context.next = 55;\n          break;\n\n        case 50:\n          _context.prev = 50;\n          _context.t2 = _context['catch'](43);\n          _context.next = 54;\n          return (0, _effects.put)((0, _show.onRequestError)(_context.t2.message));\n\n        case 54:\n          return _context.abrupt('return', _context.sent);\n\n        case 55:\n          _context.next = 57;\n          return (0, _effects.put)((0, _show.addAssetToAssetList)(assetKey, null, name, longId, shortId, claimData));\n\n        case 57:\n          _context.next = 59;\n          return (0, _effects.put)((0, _show.onRequestError)(null));\n\n        case 59:\n        case 'end':\n          return _context.stop();\n      }\n    }\n  }, _marked, this, [[12, 19], [30, 37], [43, 50]]);\n};\n\nfunction watchNewAssetRequest() {\n  return regeneratorRuntime.wrap(function watchNewAssetRequest$(_context2) {\n    while (1) {\n      switch (_context2.prev = _context2.next) {\n        case 0:\n          _context2.next = 2;\n          return (0, _effects.takeLatest)(actions.ASSET_REQUEST_NEW, newAssetRequest);\n\n        case 2:\n        case 'end':\n          return _context2.stop();\n      }\n    }\n  }, _marked2, this);\n};\n\n/***/ }),\n/* 154 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getLongClaimId = getLongClaimId;\nexports.getShortId = getShortId;\nexports.getClaimData = getClaimData;\n\nvar _request = __webpack_require__(11);\n\nvar _request2 = _interopRequireDefault(_request);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction getLongClaimId(host, name, modifier) {\n  var body = {};\n  // create request params\n  if (modifier) {\n    if (modifier.id) {\n      body['claimId'] = modifier.id;\n    } else {\n      body['channelName'] = modifier.channel.name;\n      body['channelClaimId'] = modifier.channel.id;\n    }\n  }\n  body['claimName'] = name;\n  var params = {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json' },\n    body: JSON.stringify(body)\n  };\n  // create url\n  var url = host + '/api/claim/long-id';\n  // return the request promise\n  return (0, _request2.default)(url, params);\n};\n\nfunction getShortId(host, name, claimId) {\n  var url = host + '/api/claim/short-id/' + claimId + '/' + name;\n  return (0, _request2.default)(url);\n};\n\nfunction getClaimData(host, name, claimId) {\n  var url = host + '/api/claim/data/' + name + '/' + claimId;\n  return (0, _request2.default)(url);\n};\n\n/***/ }),\n/* 155 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.newChannelRequest = newChannelRequest;\nexports.watchNewChannelRequest = watchNewChannelRequest;\nexports.watchUpdateChannelClaims = watchUpdateChannelClaims;\n\nvar _effects = __webpack_require__(15);\n\nvar _show_action_types = __webpack_require__(12);\n\nvar actions = _interopRequireWildcard(_show_action_types);\n\nvar _show = __webpack_require__(8);\n\nvar _channelApi = __webpack_require__(156);\n\nvar _show2 = __webpack_require__(13);\n\nvar _site = __webpack_require__(46);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar _marked = /*#__PURE__*/regeneratorRuntime.mark(newChannelRequest),\n    _marked2 = /*#__PURE__*/regeneratorRuntime.mark(watchNewChannelRequest),\n    _marked3 = /*#__PURE__*/regeneratorRuntime.mark(getNewClaimsAndUpdateChannel),\n    _marked4 = /*#__PURE__*/regeneratorRuntime.mark(watchUpdateChannelClaims);\n\nfunction newChannelRequest(action) {\n  var _action$data, requestType, requestId, channelName, channelId, state, host, longId, shortId, _ref, _ref$data, channelKey, claimsData, _ref2;\n\n  return regeneratorRuntime.wrap(function newChannelRequest$(_context) {\n    while (1) {\n      switch (_context.prev = _context.next) {\n        case 0:\n          _action$data = action.data, requestType = _action$data.requestType, requestId = _action$data.requestId, channelName = _action$data.channelName, channelId = _action$data.channelId;\n          // put an action to update the request in redux\n\n          _context.next = 3;\n          return (0, _effects.put)((0, _show.onRequestUpdate)(requestType, requestId));\n\n        case 3:\n          _context.next = 5;\n          return (0, _effects.select)(_show2.selectShowState);\n\n        case 5:\n          state = _context.sent;\n          _context.next = 8;\n          return (0, _effects.select)(_site.selectSiteHost);\n\n        case 8:\n          host = _context.sent;\n\n          if (!state.requestList[requestId]) {\n            _context.next = 11;\n            break;\n          }\n\n          return _context.abrupt('return', null);\n\n        case 11:\n          // get channel long id\n          longId = void 0, shortId = void 0;\n          _context.prev = 12;\n          _context.next = 15;\n          return (0, _effects.call)(_channelApi.getChannelData, host, channelName, channelId);\n\n        case 15:\n          _ref = _context.sent;\n          _ref$data = _ref.data;\n          longId = _ref$data.longChannelClaimId;\n          shortId = _ref$data.shortChannelClaimId;\n          _context.next = 26;\n          break;\n\n        case 21:\n          _context.prev = 21;\n          _context.t0 = _context['catch'](12);\n          _context.next = 25;\n          return (0, _effects.put)((0, _show.onRequestError)(_context.t0.message));\n\n        case 25:\n          return _context.abrupt('return', _context.sent);\n\n        case 26:\n          // store the request in the channel requests list\n          channelKey = 'c#' + channelName + '#' + longId;\n          _context.next = 29;\n          return (0, _effects.put)((0, _show.addRequestToRequestList)(requestId, null, channelKey));\n\n        case 29:\n          if (!state.channelList[channelKey]) {\n            _context.next = 31;\n            break;\n          }\n\n          return _context.abrupt('return', null);\n\n        case 31:\n          // get channel claims data\n          claimsData = void 0;\n          _context.prev = 32;\n          _context.next = 35;\n          return (0, _effects.call)(_channelApi.getChannelClaims, host, longId, channelName, 1);\n\n        case 35:\n          _ref2 = _context.sent;\n          claimsData = _ref2.data;\n          _context.next = 44;\n          break;\n\n        case 39:\n          _context.prev = 39;\n          _context.t1 = _context['catch'](32);\n          _context.next = 43;\n          return (0, _effects.put)((0, _show.onRequestError)(_context.t1.message));\n\n        case 43:\n          return _context.abrupt('return', _context.sent);\n\n        case 44:\n          _context.next = 46;\n          return (0, _effects.put)((0, _show.addNewChannelToChannelList)(channelKey, channelName, shortId, longId, claimsData));\n\n        case 46:\n          _context.next = 48;\n          return (0, _effects.put)((0, _show.onRequestError)(null));\n\n        case 48:\n        case 'end':\n          return _context.stop();\n      }\n    }\n  }, _marked, this, [[12, 21], [32, 39]]);\n}\n\nfunction watchNewChannelRequest() {\n  return regeneratorRuntime.wrap(function watchNewChannelRequest$(_context2) {\n    while (1) {\n      switch (_context2.prev = _context2.next) {\n        case 0:\n          _context2.next = 2;\n          return (0, _effects.takeLatest)(actions.CHANNEL_REQUEST_NEW, newChannelRequest);\n\n        case 2:\n        case 'end':\n          return _context2.stop();\n      }\n    }\n  }, _marked2, this);\n};\n\nfunction getNewClaimsAndUpdateChannel(action) {\n  var _action$data2, channelKey, name, longId, page, host, claimsData, _ref3;\n\n  return regeneratorRuntime.wrap(function getNewClaimsAndUpdateChannel$(_context3) {\n    while (1) {\n      switch (_context3.prev = _context3.next) {\n        case 0:\n          _action$data2 = action.data, channelKey = _action$data2.channelKey, name = _action$data2.name, longId = _action$data2.longId, page = _action$data2.page;\n          _context3.next = 3;\n          return (0, _effects.select)(_site.selectSiteHost);\n\n        case 3:\n          host = _context3.sent;\n          claimsData = void 0;\n          _context3.prev = 5;\n          _context3.next = 8;\n          return (0, _effects.call)(_channelApi.getChannelClaims, host, longId, name, page);\n\n        case 8:\n          _ref3 = _context3.sent;\n          claimsData = _ref3.data;\n          _context3.next = 17;\n          break;\n\n        case 12:\n          _context3.prev = 12;\n          _context3.t0 = _context3['catch'](5);\n          _context3.next = 16;\n          return (0, _effects.put)((0, _show.onRequestError)(_context3.t0.message));\n\n        case 16:\n          return _context3.abrupt('return', _context3.sent);\n\n        case 17:\n          _context3.next = 19;\n          return (0, _effects.put)((0, _show.updateChannelClaims)(channelKey, claimsData));\n\n        case 19:\n        case 'end':\n          return _context3.stop();\n      }\n    }\n  }, _marked3, this, [[5, 12]]);\n}\n\nfunction watchUpdateChannelClaims() {\n  return regeneratorRuntime.wrap(function watchUpdateChannelClaims$(_context4) {\n    while (1) {\n      switch (_context4.prev = _context4.next) {\n        case 0:\n          _context4.next = 2;\n          return (0, _effects.takeLatest)(actions.CHANNEL_CLAIMS_UPDATE_ASYNC, getNewClaimsAndUpdateChannel);\n\n        case 2:\n        case 'end':\n          return _context4.stop();\n      }\n    }\n  }, _marked4, this);\n}\n\n/***/ }),\n/* 156 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getChannelData = getChannelData;\nexports.getChannelClaims = getChannelClaims;\n\nvar _request = __webpack_require__(11);\n\nvar _request2 = _interopRequireDefault(_request);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction getChannelData(host, id, name) {\n  if (!id) id = 'none';\n  var url = host + '/api/channel/data/' + name + '/' + id;\n  return (0, _request2.default)(url);\n};\n\nfunction getChannelClaims(host, longId, name, page) {\n  if (!page) page = 1;\n  var url = host + '/api/channel/claims/' + name + '/' + longId + '/' + page;\n  return (0, _request2.default)(url);\n};\n\n/***/ }),\n/* 157 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nmodule.exports = {\n  REGEXP_INVALID_CLAIM: /[^A-Za-z0-9-]/g,\n  REGEXP_INVALID_CHANNEL: /[^A-Za-z0-9-@]/g,\n  REGEXP_ADDRESS: /^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/,\n  CHANNEL_CHAR: '@',\n  parseIdentifier: function parseIdentifier(identifier) {\n    var componentsRegex = new RegExp('([^:$#/]*)' + // value (stops at the first separator or end)\n    '([:$#]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end)\n    );\n\n    var _componentsRegex$exec = componentsRegex // eslint-disable-line no-unused-vars\n    .exec(identifier).map(function (match) {\n      return match || null;\n    }),\n        _componentsRegex$exec2 = _slicedToArray(_componentsRegex$exec, 4),\n        proto = _componentsRegex$exec2[0],\n        value = _componentsRegex$exec2[1],\n        modifierSeperator = _componentsRegex$exec2[2],\n        modifier = _componentsRegex$exec2[3];\n\n    // Validate and process name\n\n\n    if (!value) {\n      throw new Error('Check your URL.  No channel name provided before \"' + modifierSeperator + '\"');\n    }\n    var isChannel = value.startsWith(module.exports.CHANNEL_CHAR);\n    var channelName = isChannel ? value : null;\n    var claimId = void 0;\n    if (isChannel) {\n      if (!channelName) {\n        throw new Error('Check your URL.  No channel name after \"@\".');\n      }\n      var nameBadChars = channelName.match(module.exports.REGEXP_INVALID_CHANNEL);\n      if (nameBadChars) {\n        throw new Error('Check your URL.  Invalid characters in channel name: \"' + nameBadChars.join(', ') + '\".');\n      }\n    } else {\n      claimId = value;\n    }\n\n    // Validate and process modifier\n    var channelClaimId = void 0;\n    if (modifierSeperator) {\n      if (!modifier) {\n        throw new Error('Check your URL.  No modifier provided after separator \"' + modifierSeperator + '\"');\n      }\n\n      if (modifierSeperator === ':') {\n        channelClaimId = modifier;\n      } else {\n        throw new Error('Check your URL.  The \"' + modifierSeperator + '\" modifier is not currently supported');\n      }\n    }\n    return {\n      isChannel: isChannel,\n      channelName: channelName,\n      channelClaimId: channelClaimId || null,\n      claimId: claimId || null\n    };\n  },\n  parseClaim: function parseClaim(name) {\n    var componentsRegex = new RegExp('([^:$#/.]*)' + // name (stops at the first extension)\n    '([:$#.]?)([^/]*)' // extension separator, extension (stops at the first path separator or end)\n    );\n\n    var _componentsRegex$exec3 = componentsRegex // eslint-disable-line no-unused-vars\n    .exec(name).map(function (match) {\n      return match || null;\n    }),\n        _componentsRegex$exec4 = _slicedToArray(_componentsRegex$exec3, 4),\n        proto = _componentsRegex$exec4[0],\n        claimName = _componentsRegex$exec4[1],\n        extensionSeperator = _componentsRegex$exec4[2],\n        extension = _componentsRegex$exec4[3];\n\n    // Validate and process name\n\n\n    if (!claimName) {\n      throw new Error('Check your URL.  No claim name provided before \".\"');\n    }\n    var nameBadChars = claimName.match(module.exports.REGEXP_INVALID_CLAIM);\n    if (nameBadChars) {\n      throw new Error('Check your URL.  Invalid characters in claim name: \"' + nameBadChars.join(', ') + '\".');\n    }\n    // Validate and process extension\n    if (extensionSeperator) {\n      if (!extension) {\n        throw new Error('Check your URL.  No file extension provided after separator \"' + extensionSeperator + '\".');\n      }\n      if (extensionSeperator !== '.') {\n        throw new Error('Check your URL.  The \"' + extensionSeperator + '\" separator is not supported in the claim name.');\n      }\n    }\n    return {\n      claimName: claimName,\n      extension: extension || null\n    };\n  }\n};\n\n/***/ }),\n/* 158 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar handlePageRender = __webpack_require__(31);\n\nmodule.exports = function (app) {\n  // a catch-all route if someone visits a page that does not exist\n  app.use('*', function (req, res) {\n    // send response\n    handlePageRender(req, res);\n  });\n};\n\n/***/ })\n/******/ ]);\n\n\n// WEBPACK FOOTER //\n// index.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 47);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap bb7e1fd587dbeb66cd6a","module.exports = require(\"react\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"react\"\n// module id = 0\n// module chunks = 0","module.exports = require(\"react-redux\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"react-redux\"\n// module id = 1\n// module chunks = 0","module.exports = require(\"winston\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"winston\"\n// module id = 2\n// module chunks = 0","module.exports = require(\"react-router-dom\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"react-router-dom\"\n// module id = 3\n// module chunks = 0","import * as actions from 'constants/publish_action_types';\n\n// export action creators\nexport function selectFile (file) {\n  return {\n    type: actions.FILE_SELECTED,\n    data: file,\n  };\n};\n\nexport function clearFile () {\n  return {\n    type: actions.FILE_CLEAR,\n  };\n};\n\nexport function updateMetadata (name, value) {\n  return {\n    type: actions.METADATA_UPDATE,\n    data: {\n      name,\n      value,\n    },\n  };\n};\n\nexport function updateClaim (value) {\n  return {\n    type: actions.CLAIM_UPDATE,\n    data: value,\n  };\n};\n\nexport function setPublishInChannel (channel) {\n  return {\n    type: actions.SET_PUBLISH_IN_CHANNEL,\n    channel,\n  };\n};\n\nexport function updatePublishStatus (status, message) {\n  return {\n    type: actions.PUBLISH_STATUS_UPDATE,\n    data: {\n      status,\n      message,\n    },\n  };\n};\n\nexport function updateError (name, value) {\n  return {\n    type: actions.ERROR_UPDATE,\n    data: {\n      name,\n      value,\n    },\n  };\n};\n\nexport function updateSelectedChannel (channelName) {\n  return {\n    type: actions.SELECTED_CHANNEL_UPDATE,\n    data: channelName,\n  };\n};\n\nexport function toggleMetadataInputs (showMetadataInputs) {\n  return {\n    type: actions.TOGGLE_METADATA_INPUTS,\n    data: showMetadataInputs,\n  };\n};\n\nexport function onNewThumbnail (file) {\n  return {\n    type: actions.THUMBNAIL_NEW,\n    data: file,\n  };\n};\n\nexport function startPublish (history) {\n  return {\n    type: actions.PUBLISH_START,\n    data: { history },\n  };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./react/actions/publish.js","function SiteConfig () {\n  this.analytics = {\n    googleId: 'default',\n  };\n  this.assetDefaults = {\n    description: 'An asset published on Spee.ch',\n    thumbnail  : 'https://spee.ch/assets/img/video_thumb_default.png',\n    title      : 'Spee.ch',\n  };\n  this.auth = {\n    sessionKey: 'default',\n  };\n  this.details = {\n    description: 'Open-source, decentralized image and video sharing.',\n    host       : 'default',\n    port       : 3000,\n    title      : 'Spee.ch',\n    twitter    : '@spee_ch',\n  };\n  this.publishing = {\n    additionalClaimAddresses: [],\n    disabled                : false,\n    disabledMessage         : 'Please check back soon.',\n    primaryClaimAddress     : 'default',\n    thumbnailChannel        : 'default',\n    thumbnailChannelId      : 'default',\n    uploadDirectory         : '/home/lbry/Uploads',\n  };\n  this.configure = (config) => {\n    if (!config) {\n      return console.log('No site config received.');\n    }\n    const { analytics, assetDefaults, auth, details, publishing } = config;\n    this.analytics = analytics;\n    this.assetDefaults = assetDefaults;\n    this.auth = auth;\n    this.details = details;\n    this.publishing = publishing;\n  };\n};\n\nmodule.exports = new SiteConfig();\n\n\n\n// WEBPACK FOOTER //\n// ./config/siteConfig.js","const Sequelize = require('sequelize');\nconst logger = require('winston');\n\nconsole.log('exporting sequelize models');\nconst { database, username, password } = require('../config/mysqlConfig');\nconst db = {};\n// set sequelize options\nconst sequelize = new Sequelize(database, username, password, {\n  host          : 'localhost',\n  dialect       : 'mysql',\n  dialectOptions: {decimalNumbers: true}, // fix to ensure DECIMAL will not be stored as a string\n  logging       : false,\n  pool          : {\n    max    : 5,\n    min    : 0,\n    idle   : 10000,\n    acquire: 10000,\n  },\n});\n\n// establish mysql connection\nsequelize\n  .authenticate()\n  .then(() => {\n    logger.info('Sequelize has established mysql connection successfully.');\n  })\n  .catch(err => {\n    logger.error('Sequelize was unable to connect to the database:', err);\n  });\n\n// manually add each model to the db object\nconst Certificate = require('./certificate.js');\nconst Channel = require('./channel.js');\nconst Claim = require('./claim.js');\nconst File = require('./file.js');\nconst Request = require('./request.js');\nconst User = require('./user.js');\ndb['Certificate'] = sequelize.import('Certificate', Certificate);\ndb['Channel'] = sequelize.import('Channel', Channel);\ndb['Claim'] = sequelize.import('Claim', Claim);\ndb['File'] = sequelize.import('File', File);\ndb['Request'] = sequelize.import('Request', Request);\ndb['User'] = sequelize.import('User', User);\n\n// run model.association for each model in the db object that has an association\nObject.keys(db).forEach(modelName => {\n  if (db[modelName].associate) {\n    logger.info('Associating model:', modelName);\n    db[modelName].associate(db);\n  }\n});\n\ndb.sequelize = sequelize;\ndb.Sequelize = Sequelize;\n\n// add an 'upsert' method to the db object\ndb.upsert = (Model, values, condition, tableName) => {\n  return Model\n    .findOne({\n      where: condition,\n    })\n    .then(obj => {\n      if (obj) {  // update\n        logger.debug(`updating record in db.${tableName}`);\n        return obj.update(values);\n      } else {  // insert\n        logger.debug(`creating record in db.${tableName}`);\n        return Model.create(values);\n      }\n    })\n    .catch(function (error) {\n      logger.error(`${tableName}.upsert error`, error);\n      throw error;\n    });\n};\n\nmodule.exports = db;\n\n\n\n// WEBPACK FOOTER //\n// ./models/index.js","import { connect } from 'react-redux';\nimport { updateLoggedInChannel } from 'actions/channel';\nimport {updateSelectedChannel} from 'actions/publish';\nimport View from './view';\n\nconst mapStateToProps = ({ channel, site }) => {\n  return {\n    channelName   : channel.loggedInChannel.name,\n    channelShortId: channel.loggedInChannel.shortId,\n    channelLongId : channel.loggedInChannel.longId,\n    siteDescription: site.description,\n  };\n};\n\nconst mapDispatchToProps = dispatch => {\n  return {\n    onChannelLogin: (name, shortId, longId) => {\n      dispatch(updateLoggedInChannel(name, shortId, longId));\n      dispatch(updateSelectedChannel(name));\n    },\n    onChannelLogout: () => {\n      dispatch(updateLoggedInChannel(null, null, null));\n    },\n  };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/NavBar/index.js","import * as actions from 'constants/show_action_types';\n\nimport { CHANNEL, ASSET_LITE, ASSET_DETAILS } from 'constants/show_request_types';\n\n// basic request parsing\nexport function onHandleShowPageUri (params) {\n  return {\n    type: actions.HANDLE_SHOW_URI,\n    data: params,\n  };\n};\n\nexport function onRequestError (error) {\n  return {\n    type: actions.REQUEST_ERROR,\n    data: error,\n  };\n};\n\nexport function onNewChannelRequest (channelName, channelId) {\n  const requestType = CHANNEL;\n  const requestId = `cr#${channelName}#${channelId}`;\n  return {\n    type: actions.CHANNEL_REQUEST_NEW,\n    data: { requestType, requestId, channelName, channelId },\n  };\n};\n\nexport function onNewAssetRequest (name, id, channelName, channelId, extension) {\n  const requestType = extension ? ASSET_LITE : ASSET_DETAILS;\n  const requestId = `ar#${name}#${id}#${channelName}#${channelId}`;\n  return {\n    type: actions.ASSET_REQUEST_NEW,\n    data: {\n      requestType,\n      requestId,\n      name,\n      modifier: {\n        id,\n        channel: {\n          name: channelName,\n          id  : channelId,\n        },\n      },\n    },\n  };\n};\n\nexport function onRequestUpdate (requestType, requestId) {\n  return {\n    type: actions.REQUEST_UPDATE,\n    data: {\n      requestType,\n      requestId,\n    },\n  };\n};\n\nexport function addRequestToRequestList (id, error, key) {\n  return {\n    type: actions.REQUEST_LIST_ADD,\n    data: { id, error, key },\n  };\n};\n\n// asset actions\n\nexport function addAssetToAssetList (id, error, name, claimId, shortId, claimData) {\n  return {\n    type: actions.ASSET_ADD,\n    data: { id, error, name, claimId, shortId, claimData },\n  };\n}\n\n// channel actions\n\nexport function addNewChannelToChannelList (id, name, shortId, longId, claimsData) {\n  return {\n    type: actions.CHANNEL_ADD,\n    data: { id, name, shortId, longId, claimsData },\n  };\n};\n\nexport function onUpdateChannelClaims (channelKey, name, longId, page) {\n  return {\n    type: actions.CHANNEL_CLAIMS_UPDATE_ASYNC,\n    data: {channelKey, name, longId, page},\n  };\n};\n\nexport function updateChannelClaims (channelListId, claimsData) {\n  return {\n    type: actions.CHANNEL_CLAIMS_UPDATE_SUCCESS,\n    data: {channelListId, claimsData},\n  };\n};\n\n// display a file\n\nexport function fileRequested (name, claimId) {\n  return {\n    type: actions.FILE_REQUESTED,\n    data: { name, claimId },\n  };\n};\n\nexport function updateFileAvailability (status) {\n  return {\n    type: actions.FILE_AVAILABILITY_UPDATE,\n    data: status,\n  };\n};\n\nexport function updateDisplayAssetError (error) {\n  return {\n    type: actions.DISPLAY_ASSET_ERROR,\n    data: error,\n  };\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/actions/show.js","import { connect } from 'react-redux';\nimport View from './view';\n\nconst mapStateToProps = ({ site }) => {\n  const { defaultDescription, defaultThumbnail, description: siteDescription, host: siteHost, title: siteTitle, twitter: siteTwitter } = site;\n  return {\n    defaultDescription,\n    defaultThumbnail,\n    siteDescription,\n    siteHost,\n    siteTitle,\n    siteTwitter,\n  };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/SEO/index.js","module.exports = require(\"prop-types\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"prop-types\"\n// module id = 10\n// module chunks = 0","import 'cross-fetch/polyfill';\n\n/**\n * Parses the JSON returned by a network request\n *\n * @param  {object} response A response from a network request\n *\n * @return {object}          The parsed JSON from the request\n */\nfunction parseJSON (response) {\n  if (response.status === 204 || response.status === 205) {\n    return null;\n  }\n  return response.json();\n}\n\n/**\n * Parses the status returned by a network request\n *\n * @param  {object} response   A response from a network request\n * @param  {object} response   The parsed JSON from the network request\n *\n * @return {object | undefined} Returns object with status and statusText, or undefined\n */\nfunction checkStatus (response, jsonResponse) {\n  if (response.status >= 200 && response.status < 300) {\n    return jsonResponse;\n  }\n  const error = new Error(jsonResponse.message);\n  error.response = response;\n  throw error;\n}\n\n/**\n * Requests a URL, returning a promise\n *\n * @param  {string} url       The URL we want to request\n * @param  {object} [options] The options we want to pass to \"fetch\"\n *\n * @return {object}           The response data\n */\n\nexport default function request (url, options) {\n  return fetch(url, options)\n    .then(response => {\n      return Promise.all([response, parseJSON(response)]);\n    })\n    .then(([response, jsonResponse]) => {\n      return checkStatus(response, jsonResponse);\n    });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./react/utils/request.js","// request actions\nexport const HANDLE_SHOW_URI = 'HANDLE_SHOW_URI';\nexport const REQUEST_ERROR = 'REQUEST_ERROR';\nexport const REQUEST_UPDATE = 'REQUEST_UPDATE';\nexport const ASSET_REQUEST_NEW = 'ASSET_REQUEST_NEW';\nexport const CHANNEL_REQUEST_NEW = 'CHANNEL_REQUEST_NEW';\nexport const REQUEST_LIST_ADD = 'REQUEST_LIST_ADD';\n\n// asset actions\nexport const ASSET_ADD = `ASSET_ADD`;\n\n// channel actions\nexport const CHANNEL_ADD = 'CHANNEL_ADD';\n\nexport const CHANNEL_CLAIMS_UPDATE_ASYNC = 'CHANNEL_CLAIMS_UPDATE_ASYNC';\nexport const CHANNEL_CLAIMS_UPDATE_SUCCESS = 'CHANNEL_CLAIMS_UPDATE_SUCCESS';\n\n// asset/file display actions\nexport const FILE_REQUESTED = 'FILE_REQUESTED';\nexport const FILE_AVAILABILITY_UPDATE = 'FILE_AVAILABILITY_UPDATE';\nexport const DISPLAY_ASSET_ERROR = 'DISPLAY_ASSET_ERROR';\n\n\n\n// WEBPACK FOOTER //\n// ./react/constants/show_action_types.js","export const selectAsset = (show) => {\n  const request = show.requestList[show.request.id];\n  const assetKey = request.key;\n  return show.assetList[assetKey];\n};\n\nexport const selectShowState = (state) => {\n  return state.show;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/selectors/show.js","module.exports = require(\"react-helmet\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"react-helmet\"\n// module id = 14\n// module chunks = 0","module.exports = require(\"redux-saga/effects\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"redux-saga/effects\"\n// module id = 15\n// module chunks = 0","const axios = require('axios');\nconst logger = require('winston');\nconst { api: { apiHost, apiPort } } = require('../config/lbryConfig.js');\nconst lbryApiUri = 'http://' + apiHost + ':' + apiPort;\nconst { chooseGaLbrynetPublishLabel, sendGATimingEvent } = require('./googleAnalytics.js');\n\nconst handleLbrynetResponse = ({ data }, resolve, reject) => {\n  logger.debug('lbry api data:', data);\n  if (data.result) {\n    // check for an error\n    if (data.result.error) {\n      logger.debug('Lbrynet api error:', data.result.error);\n      reject(new Error(data.result.error));\n      return;\n    };\n    resolve(data.result);\n    return;\n  }\n  // fallback in case it just timed out\n  reject(JSON.stringify(data));\n};\n\nmodule.exports = {\n  publishClaim (publishParams) {\n    logger.debug(`lbryApi >> Publishing claim to \"${publishParams.name}\"`);\n    const gaStartTime = Date.now();\n    return new Promise((resolve, reject) => {\n      axios\n        .post(lbryApiUri, {\n          method: 'publish',\n          params: publishParams,\n        })\n        .then(response => {\n          sendGATimingEvent('lbrynet', 'publish', chooseGaLbrynetPublishLabel(publishParams), gaStartTime, Date.now());\n          handleLbrynetResponse(response, resolve, reject);\n        })\n        .catch(error => {\n          reject(error);\n        });\n    });\n  },\n  getClaim (uri) {\n    logger.debug(`lbryApi >> Getting Claim for \"${uri}\"`);\n    const gaStartTime = Date.now();\n    return new Promise((resolve, reject) => {\n      axios\n        .post(lbryApiUri, {\n          method: 'get',\n          params: { uri, timeout: 20 },\n        })\n        .then(response => {\n          sendGATimingEvent('lbrynet', 'getClaim', 'GET', gaStartTime, Date.now());\n          handleLbrynetResponse(response, resolve, reject);\n        })\n        .catch(error => {\n          reject(error);\n        });\n    });\n  },\n  getClaimList (claimName) {\n    logger.debug(`lbryApi >> Getting claim_list for \"${claimName}\"`);\n    const gaStartTime = Date.now();\n    return new Promise((resolve, reject) => {\n      axios\n        .post(lbryApiUri, {\n          method: 'claim_list',\n          params: { name: claimName },\n        })\n        .then(response => {\n          sendGATimingEvent('lbrynet', 'getClaimList', 'CLAIM_LIST', gaStartTime, Date.now());\n          handleLbrynetResponse(response, resolve, reject);\n        })\n        .catch(error => {\n          reject(error);\n        });\n    });\n  },\n  resolveUri (uri) {\n    logger.debug(`lbryApi >> Resolving URI for \"${uri}\"`);\n    const gaStartTime = Date.now();\n    return new Promise((resolve, reject) => {\n      axios\n        .post(lbryApiUri, {\n          method: 'resolve',\n          params: { uri },\n        })\n        .then(({ data }) => {\n          sendGATimingEvent('lbrynet', 'resolveUri', 'RESOLVE', gaStartTime, Date.now());\n          if (data.result[uri].error) {  // check for errors\n            reject(data.result[uri].error);\n          } else {  // if no errors, resolve\n            resolve(data.result[uri]);\n          }\n        })\n        .catch(error => {\n          reject(error);\n        });\n    });\n  },\n  getDownloadDirectory () {\n    logger.debug('lbryApi >> Retrieving the download directory path from lbry daemon...');\n    const gaStartTime = Date.now();\n    return new Promise((resolve, reject) => {\n      axios\n        .post(lbryApiUri, {\n          method: 'settings_get',\n        })\n        .then(({ data }) => {\n          sendGATimingEvent('lbrynet', 'getDownloadDirectory', 'SETTINGS_GET', gaStartTime, Date.now());\n          if (data.result) {\n            resolve(data.result.download_directory);\n          } else {\n            return new Error('Successfully connected to lbry daemon, but unable to retrieve the download directory.');\n          }\n        })\n        .catch(error => {\n          logger.error('Lbrynet Error:', error);\n          resolve('/home/lbry/Downloads/');\n        });\n    });\n  },\n  createChannel (name) {\n    logger.debug(`lbryApi >> Creating channel for ${name}...`);\n    const gaStartTime = Date.now();\n    return new Promise((resolve, reject) => {\n      axios\n        .post(lbryApiUri, {\n          method: 'channel_new',\n          params: {\n            channel_name: name,\n            amount      : 0.1,\n          },\n        })\n        .then(response => {\n          sendGATimingEvent('lbrynet', 'createChannel', 'CHANNEL_NEW', gaStartTime, Date.now());\n          handleLbrynetResponse(response, resolve, reject);\n        })\n        .catch(error => {\n          reject(error);\n        });\n    });\n  },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/lbryApi.js","const logger = require('winston');\nconst ua = require('universal-analytics');\nconst { analytics : { googleId }, details: { title } } = require('../config/siteConfig.js');\n\nfunction createServeEventParams (headers, ip, originalUrl) {\n  return {\n    eventCategory    : 'client requests',\n    eventAction      : 'serve request',\n    eventLabel       : originalUrl,\n    ipOverride       : ip,\n    userAgentOverride: headers['user-agent'],\n  };\n};\n\nfunction createPublishTimingEventParams (category, variable, label, startTime, endTime) {\n  const duration = endTime - startTime;\n  return {\n    userTimingCategory    : category,\n    userTimingVariableName: variable,\n    userTimingTime        : duration,\n    userTimingLabel       : label,\n  };\n};\n\nfunction sendGoogleAnalyticsEvent (ip, params) {\n  const visitorId = ip.replace(/\\./g, '-');\n  const visitor = ua(googleId, visitorId, { strictCidFormat: false, https: true });\n  visitor.event(params, (err) => {\n    if (err) {\n      logger.error('Google Analytics Event Error >>', err);\n    }\n  });\n};\n\nfunction sendGoogleAnalyticsTiming (visitorId, params) {\n  const visitor = ua(googleId, visitorId, { strictCidFormat: false, https: true });\n  visitor.timing(params, (err) => {\n    if (err) {\n      logger.error('Google Analytics Event Error >>', err);\n    }\n    logger.debug(`Timing event successfully sent to google analytics`);\n  });\n};\n\nmodule.exports = {\n  sendGAServeEvent (headers, ip, originalUrl) {\n    const params = createServeEventParams(headers, ip, originalUrl);\n    sendGoogleAnalyticsEvent(ip, params);\n  },\n  sendGATimingEvent (category, variable, label, startTime, endTime) {\n    const params = createPublishTimingEventParams(category, variable, label, startTime, endTime);\n    sendGoogleAnalyticsTiming(title, params);\n  },\n  chooseGaLbrynetPublishLabel ({ channel_name: channelName, channel_id: channelId }) {\n    return (channelName || channelId ? 'PUBLISH_IN_CHANNEL_CLAIM' : 'PUBLISH_ANONYMOUS_CLAIM');\n  },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/googleAnalytics.js","module.exports = require(\"redux\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"redux\"\n// module id = 18\n// module chunks = 0","import * as actions from 'constants/channel_action_types';\n\n// export action creators\n\nexport function updateLoggedInChannel (name, shortId, longId) {\n  return {\n    type: actions.CHANNEL_UPDATE,\n    data: {\n      name,\n      shortId,\n      longId,\n    },\n  };\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/actions/channel.js","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ActiveStatusBar from 'components/ActiveStatusBar';\nimport InactiveStatusBar from 'components/InactiveStatusBar';\n\nclass ProgressBar extends React.Component {\n  constructor (props) {\n    super(props);\n    this.state = {\n      bars       : [],\n      index      : 0,\n      incrementer: 1,\n    };\n    this.createBars = this.createBars.bind(this);\n    this.startProgressBar = this.startProgressBar.bind(this);\n    this.updateProgressBar = this.updateProgressBar.bind(this);\n    this.stopProgressBar = this.stopProgressBar.bind(this);\n  }\n  componentDidMount () {\n    this.createBars();\n    this.startProgressBar();\n  }\n  componentWillUnmount () {\n    this.stopProgressBar();\n  }\n  createBars () {\n    const bars = [];\n    for (let i = 0; i <= this.props.size; i++) {\n      bars.push({isActive: false});\n    }\n    this.setState({ bars });\n  }\n  startProgressBar () {\n    this.updateInterval = setInterval(this.updateProgressBar.bind(this), 300);\n  };\n  updateProgressBar () {\n    let index = this.state.index;\n    let incrementer = this.state.incrementer;\n    let bars = this.state.bars;\n    // flip incrementer if necessary, to stay in bounds\n    if ((index < 0) || (index > this.props.size)) {\n      incrementer = incrementer * -1;\n      index += incrementer;\n    }\n    // update the indexed bar\n    if (incrementer > 0) {\n      bars[index].isActive = true;\n    } else {\n      bars[index].isActive = false;\n    };\n    // increment index\n    index += incrementer;\n    // update state\n    this.setState({\n      bars,\n      incrementer,\n      index,\n    });\n  };\n  stopProgressBar () {\n    clearInterval(this.updateInterval);\n  };\n  render () {\n    return (\n      <div>\n        {this.state.bars.map((bar, index) => bar.isActive ? <ActiveStatusBar key={index} /> : <InactiveStatusBar key={index}/>)}\n      </div>\n    );\n  }\n};\n\nProgressBar.propTypes = {\n  size: PropTypes.number.isRequired,\n};\n\nexport default ProgressBar;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/ProgressBar/index.jsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport NavBar from 'containers/NavBar';\n\nclass ErrorPage extends React.Component {\n  render () {\n    const { error } = this.props;\n    return (\n      <div>\n        <NavBar />\n        <div className='row row--padded'>\n          <p>{error}</p>\n        </div>\n      </div>\n    );\n  }\n};\n\nErrorPage.propTypes = {\n  error: PropTypes.string.isRequired,\n};\n\nexport default ErrorPage;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/ErrorPage/index.jsx","module.exports = require(\"passport\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"passport\"\n// module id = 22\n// module chunks = 0","function MysqlConfig () {\n  this.database = 'default';\n  this.username = 'default';\n  this.password = 'default';\n  this.configure = (config) => {\n    if (!config) {\n      return console.log('No MySQL config received.');\n    }\n    const {database, username, password} = config;\n    this.database = database;\n    this.username = username;\n    this.password = password;\n  };\n};\n\nmodule.exports = new MysqlConfig();\n\n\n\n// WEBPACK FOOTER //\n// ./config/mysqlConfig.js","function SlackConfig () {\n  this.slackWebHook      = 'default';\n  this.slackErrorChannel = 'default';\n  this.slackInfoChannel  = 'default';\n  this.configure = (config) => {\n    if (!config) {\n      return console.log('No slack config received.');\n    }\n    const {slackWebHook, slackErrorChannel, slackInfoChannel} = config;\n    this.slackWebHook = slackWebHook;\n    this.slackErrorChannel = slackErrorChannel;\n    this.slackInfoChannel = slackInfoChannel;\n  };\n};\n\nmodule.exports = new SlackConfig();\n\n\n\n// WEBPACK FOOTER //\n// ./config/slackConfig.js","module.exports = require(\"passport-local\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"passport-local\"\n// module id = 25\n// module chunks = 0","module.exports = require(\"sequelize\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"sequelize\"\n// module id = 26\n// module chunks = 0","module.exports = {\n  returnShortId: function (claimsArray, longId) {\n    let claimIndex;\n    let shortId = longId.substring(0, 1); // default short id is the first letter\n    let shortIdLength = 0;\n    // find the index of this claim id\n    claimIndex = claimsArray.findIndex(element => {\n      return element.claimId === longId;\n    });\n    if (claimIndex < 0) {\n      throw new Error('claim id not found in claims list');\n    }\n    // get an array of all claims with lower height\n    let possibleMatches = claimsArray.slice(0, claimIndex);\n    // remove certificates with the same prefixes until none are left.\n    while (possibleMatches.length > 0) {\n      shortIdLength += 1;\n      shortId = longId.substring(0, shortIdLength);\n      possibleMatches = possibleMatches.filter(element => {\n        return (element.claimId && (element.claimId.substring(0, shortIdLength) === shortId));\n      });\n    }\n    return shortId;\n  },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/sequelizeHelpers.js","const logger = require('winston');\nconst fs = require('fs');\n\nconst { details, publishing } = require('../config/siteConfig.js');\n\nmodule.exports = {\n  parsePublishApiRequestBody ({name, nsfw, license, title, description, thumbnail}) {\n    // validate name\n    if (!name) {\n      throw new Error('no name field found in request');\n    }\n    const invalidNameCharacters = /[^A-Za-z0-9,-]/.exec(name);\n    if (invalidNameCharacters) {\n      throw new Error('The claim name you provided is not allowed.  Only the following characters are allowed: A-Z, a-z, 0-9, and \"-\"');\n    }\n    // optional parameters\n    nsfw = (nsfw === 'true');\n    license = license || null;\n    title = title || null;\n    description = description || null;\n    thumbnail = thumbnail || null;\n    // return results\n    return {\n      name,\n      nsfw,\n      license,\n      title,\n      description,\n      thumbnail,\n    };\n  },\n  parsePublishApiRequestFiles ({file, thumbnail}) {\n    // make sure a file was provided\n    if (!file) {\n      throw new Error('no file with key of [file] found in request');\n    }\n    if (!file.path) {\n      throw new Error('no file path found');\n    }\n    if (!file.type) {\n      throw new Error('no file type found');\n    }\n    if (!file.size) {\n      throw new Error('no file type found');\n    }\n    // validate the file name\n    if (/'/.test(file.name)) {\n      throw new Error('apostrophes are not allowed in the file name');\n    }\n    // validate the file\n    module.exports.validateFileTypeAndSize(file);\n    // return results\n    return {\n      fileName         : file.name,\n      filePath         : file.path,\n      fileType         : file.type,\n      thumbnailFileName: (thumbnail ? thumbnail.name : null),\n      thumbnailFilePath: (thumbnail ? thumbnail.path : null),\n      thumbnailFileType: (thumbnail ? thumbnail.type : null),\n    };\n  },\n  validateFileTypeAndSize (file) {\n    // check file type and size\n    switch (file.type) {\n      case 'image/jpeg':\n      case 'image/jpg':\n      case 'image/png':\n        if (file.size > 10000000) {\n          logger.debug('publish > file validation > .jpeg/.jpg/.png was too big');\n          throw new Error('Sorry, images are limited to 10 megabytes.');\n        }\n        break;\n      case 'image/gif':\n        if (file.size > 50000000) {\n          logger.debug('publish > file validation > .gif was too big');\n          throw new Error('Sorry, .gifs are limited to 50 megabytes.');\n        }\n        break;\n      case 'video/mp4':\n        if (file.size > 50000000) {\n          logger.debug('publish > file validation > .mp4 was too big');\n          throw new Error('Sorry, videos are limited to 50 megabytes.');\n        }\n        break;\n      default:\n        logger.debug('publish > file validation > unrecognized file type');\n        throw new Error('The ' + file.type + ' content type is not supported.  Only, .jpeg, .png, .gif, and .mp4 files are currently supported.');\n    }\n    return file;\n  },\n  createBasicPublishParams (filePath, name, title, description, license, nsfw, thumbnail) {\n    logger.debug(`Creating Publish Parameters`);\n    // provide defaults for title\n    if (title === null || title.trim() === '') {\n      title = name;\n    }\n    // provide default for description\n    if (description === null || description.trim() === '') {\n      description = '';\n    }\n    // provide default for license\n    if (license === null || license.trim() === '') {\n      license = ' ';  // default to empty string\n    }\n    // create the publish params\n    const publishParams = {\n      name,\n      file_path: filePath,\n      bid      : 0.01,\n      metadata : {\n        description,\n        title,\n        author  : details.title,\n        language: 'en',\n        license,\n        nsfw,\n      },\n      claim_address: publishing.primaryClaimAddress,\n    };\n    // add thumbnail to channel if video\n    if (thumbnail) {\n      publishParams['metadata']['thumbnail'] = thumbnail;\n    }\n    return publishParams;\n  },\n  createThumbnailPublishParams (thumbnailFilePath, claimName, license, nsfw) {\n    if (!thumbnailFilePath) {\n      return;\n    }\n    logger.debug(`Creating Thumbnail Publish Parameters`);\n    // create the publish params\n    return {\n      name     : `${claimName}-thumb`,\n      file_path: thumbnailFilePath,\n      bid      : 0.01,\n      metadata : {\n        title      : `${claimName} thumbnail`,\n        description: `a thumbnail for ${claimName}`,\n        author     : details.title,\n        language   : 'en',\n        license,\n        nsfw,\n      },\n      claim_address: publishing.primaryClaimAddress,\n      channel_name : publishing.thumbnailChannel,\n      channel_id   : publishing.thumbnailChannelId,\n    };\n  },\n  deleteTemporaryFile (filePath) {\n    fs.unlink(filePath, err => {\n      if (err) {\n        logger.error(`error deleting temporary file ${filePath}`);\n        throw err;\n      }\n      logger.debug(`successfully deleted ${filePath}`);\n    });\n  },\n  addGetResultsToFileData (fileInfo, getResult) {\n    fileInfo.fileName = getResult.file_name;\n    fileInfo.filePath = getResult.download_path;\n    return fileInfo;\n  },\n  createFileData ({ name, claimId, outpoint, height, address, nsfw, contentType }) {\n    return {\n      name,\n      claimId,\n      outpoint,\n      height,\n      address,\n      fileName: '',\n      filePath: '',\n      fileType: contentType,\n      nsfw,\n    };\n  },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/publishHelpers.js","const logger = require('winston');\n\nmodule.exports = {\n  handleErrorResponse: function (originalUrl, ip, error, res) {\n    logger.error(`Error on ${originalUrl}`, module.exports.useObjectPropertiesIfNoKeys(error));\n    const [status, message] = module.exports.returnErrorMessageAndStatus(error);\n    res\n      .status(status)\n      .json(module.exports.createErrorResponsePayload(status, message));\n  },\n  returnErrorMessageAndStatus: function (error) {\n    let status, message;\n    // check for daemon being turned off\n    if (error.code === 'ECONNREFUSED') {\n      status = 503;\n      message = 'Connection refused.  The daemon may not be running.';\n      // fallback for everything else\n    } else {\n      status = 400;\n      if (error.message) {\n        message = error.message;\n      } else {\n        message = error;\n      };\n    };\n    return [status, message];\n  },\n  useObjectPropertiesIfNoKeys: function (err) {\n    if (Object.keys(err).length === 0) {\n      let newErrorObject = {};\n      Object.getOwnPropertyNames(err).forEach((key) => {\n        newErrorObject[key] = err[key];\n      });\n      return newErrorObject;\n    }\n    return err;\n  },\n  createErrorResponsePayload (status, message) {\n    return {\n      status,\n      success: false,\n      message,\n    };\n  },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/errorHandlers.js","const db = require('../models');\nconst logger = require('winston');\nconst { returnPaginatedChannelClaims } = require('../helpers/channelPagination.js');\n\nconst NO_CHANNEL = 'NO_CHANNEL';\nconst NO_CLAIM = 'NO_CLAIM';\nconst NO_FILE = 'NO_FILE';\n\nmodule.exports = {\n  getClaimId (channelName, channelClaimId, name, claimId) {\n    if (channelName) {\n      return module.exports.getClaimIdByChannel(channelName, channelClaimId, name);\n    } else {\n      return module.exports.getClaimIdByClaim(name, claimId);\n    }\n  },\n  getClaimIdByClaim (claimName, claimId) {\n    logger.debug(`getClaimIdByClaim(${claimName}, ${claimId})`);\n    return new Promise((resolve, reject) => {\n      db.Claim.getLongClaimId(claimName, claimId)\n        .then(longClaimId => {\n          if (!longClaimId) {\n            resolve(NO_CLAIM);\n          }\n          resolve(longClaimId);\n        })\n        .catch(error => {\n          reject(error);\n        });\n    });\n  },\n  getClaimIdByChannel (channelName, channelClaimId, claimName) {\n    logger.debug(`getClaimIdByChannel(${channelName}, ${channelClaimId}, ${claimName})`);\n    return new Promise((resolve, reject) => {\n      db.Certificate.getLongChannelId(channelName, channelClaimId) // 1. get the long channel id\n        .then(longChannelId => {\n          if (!longChannelId) {\n            return [null, null];\n          }\n          return Promise.all([longChannelId, db.Claim.getClaimIdByLongChannelId(longChannelId, claimName)]);  // 2. get the long claim id\n        })\n        .then(([longChannelId, longClaimId]) => {\n          if (!longChannelId) {\n            return resolve(NO_CHANNEL);\n          }\n          if (!longClaimId) {\n            return resolve(NO_CLAIM);\n          }\n          resolve(longClaimId);\n        })\n        .catch(error => {\n          reject(error);\n        });\n    });\n  },\n  getChannelData (channelName, channelClaimId, page) {\n    return new Promise((resolve, reject) => {\n      // 1. get the long channel Id (make sure channel exists)\n      db.Certificate.getLongChannelId(channelName, channelClaimId)\n        .then(longChannelClaimId => {\n          if (!longChannelClaimId) {\n            return [null, null, null];\n          }\n          // 2. get the short ID and all claims for that channel\n          return Promise.all([longChannelClaimId, db.Certificate.getShortChannelIdFromLongChannelId(longChannelClaimId, channelName)]);\n        })\n        .then(([longChannelClaimId, shortChannelClaimId]) => {\n          if (!longChannelClaimId) {\n            return resolve(NO_CHANNEL);\n          }\n          // 3. return all the channel information\n          resolve({\n            channelName,\n            longChannelClaimId,\n            shortChannelClaimId,\n          });\n        })\n        .catch(error => {\n          reject(error);\n        });\n    });\n  },\n  getChannelClaims (channelName, channelClaimId, page) {\n    return new Promise((resolve, reject) => {\n      // 1. get the long channel Id (make sure channel exists)\n      db.Certificate.getLongChannelId(channelName, channelClaimId)\n        .then(longChannelClaimId => {\n          if (!longChannelClaimId) {\n            return [null, null, null];\n          }\n          // 2. get the short ID and all claims for that channel\n          return Promise.all([longChannelClaimId, db.Claim.getAllChannelClaims(longChannelClaimId)]);\n        })\n        .then(([longChannelClaimId, channelClaimsArray]) => {\n          if (!longChannelClaimId) {\n            return resolve(NO_CHANNEL);\n          }\n          // 3. format the data for the view, including pagination\n          let paginatedChannelViewData = returnPaginatedChannelClaims(channelName, longChannelClaimId, channelClaimsArray, page);\n          // 4. return all the channel information and contents\n          resolve(paginatedChannelViewData);\n        })\n        .catch(error => {\n          reject(error);\n        });\n    });\n  },\n  getLocalFileRecord (claimId, name) {\n    return db.File.findOne({where: {claimId, name}})\n      .then(file => {\n        if (!file) {\n          return NO_FILE;\n        }\n        return file.dataValues;\n      });\n  },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./controllers/serveController.js","import React from 'react';\nimport { renderToString } from 'react-dom/server';\nimport { createStore } from 'redux';\nimport Reducer from '../react/reducers';\nimport { Provider } from 'react-redux';\nimport { StaticRouter } from 'react-router-dom';\nimport GAListener from '../react/components/GAListener';\nimport App from '../react/app';\nimport renderFullPage from './renderFullPage.js';\nimport Helmet from 'react-helmet';\n\nmodule.exports = (req, res) => {\n  let context = {};\n\n  // create a new Redux store instance\n  const store = createStore(Reducer);\n\n  // render component to a string\n  const html = renderToString(\n    <Provider store={store}>\n      <StaticRouter location={req.url} context={context}>\n        <GAListener>\n          <App />\n        </GAListener>\n      </StaticRouter>\n    </Provider>\n  );\n\n  // get head tags from helmet\n  const helmet = Helmet.renderStatic();\n\n  // check for a redirect\n  if (context.url) {\n    // Somewhere a `<Redirect>` was rendered\n    return res.redirect(301, context.url);\n  } else {\n    // we're good, send the response\n  }\n\n  // get the initial state from our Redux store\n  const preloadedState = store.getState();\n\n  // send the rendered page back to the client\n  res.send(renderFullPage(helmet, html, preloadedState));\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/handlePageRender.jsx","module.exports = require(\"react-dom/server\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"react-dom/server\"\n// module id = 32\n// module chunks = 0","import { combineReducers } from 'redux';\nimport PublishReducer from 'reducers/publish';\nimport ChannelReducer from 'reducers/channel';\nimport ShowReducer from 'reducers/show';\nimport SiteReducer from 'reducers/site';\n\nexport default combineReducers({\n  channel: ChannelReducer,\n  publish: PublishReducer,\n  show   : ShowReducer,\n  site   : SiteReducer,\n});\n\n\n\n// WEBPACK FOOTER //\n// ./react/reducers/index.js","export const FILE_SELECTED = 'FILE_SELECTED';\nexport const FILE_CLEAR = 'FILE_CLEAR';\nexport const METADATA_UPDATE = 'METADATA_UPDATE';\nexport const CLAIM_UPDATE = 'CLAIM_UPDATE';\nexport const SET_PUBLISH_IN_CHANNEL = 'SET_PUBLISH_IN_CHANNEL';\nexport const PUBLISH_STATUS_UPDATE = 'PUBLISH_STATUS_UPDATE';\nexport const ERROR_UPDATE = 'ERROR_UPDATE';\nexport const SELECTED_CHANNEL_UPDATE = 'SELECTED_CHANNEL_UPDATE';\nexport const TOGGLE_METADATA_INPUTS = 'TOGGLE_METADATA_INPUTS';\nexport const THUMBNAIL_NEW = 'THUMBNAIL_NEW';\nexport const PUBLISH_START = 'PUBLISH_START';\n\n\n\n// WEBPACK FOOTER //\n// ./react/constants/publish_action_types.js","export const LOGIN = 'Existing';\nexport const CREATE = 'New';\n\n\n\n// WEBPACK FOOTER //\n// ./react/constants/publish_channel_select_states.js","export const CHANNEL_UPDATE = 'CHANNEL_UPDATE';\n\n\n\n// WEBPACK FOOTER //\n// ./react/constants/channel_action_types.js","export const LOCAL_CHECK = 'LOCAL_CHECK';\nexport const UNAVAILABLE = 'UNAVAILABLE';\nexport const ERROR = 'ERROR';\nexport const AVAILABLE = 'AVAILABLE';\n\n\n\n// WEBPACK FOOTER //\n// ./react/constants/asset_display_states.js","import React from 'react';\nimport GoogleAnalytics from 'react-ga';\nimport { withRouter } from 'react-router-dom';\nconst { analytics: { googleId } } = require('../../../config/siteConfig.js');\n\nGoogleAnalytics.initialize(googleId);\n\nclass GAListener extends React.Component {\n  componentDidMount () {\n    this.sendPageView(this.props.history.location);\n    this.props.history.listen(this.sendPageView);\n  }\n\n  sendPageView (location) {\n    GoogleAnalytics.set({ page: location.pathname });\n    GoogleAnalytics.pageview(location.pathname);\n  }\n\n  render () {\n    return this.props.children;\n  }\n}\n\nexport default withRouter(GAListener);\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/GAListener/index.jsx","import React from 'react';\nimport { Route, Switch } from 'react-router-dom';\nimport HomePage from 'components/HomePage';\nimport AboutPage from 'components/AboutPage';\nimport LoginPage from 'containers/LoginPage';\nimport ShowPage from 'containers/ShowPage';\nimport FourOhFourPage from 'containers/FourOhFourPage';\n\nconst App = () => {\n  return (\n    <Switch>\n      <Route exact path='/' component={HomePage} />\n      <Route exact path='/about' component={AboutPage} />\n      <Route exact path='/login' component={LoginPage} />\n      <Route exact path='/:identifier/:claim' component={ShowPage} />\n      <Route exact path='/:claim' component={ShowPage} />\n      <Route component={FourOhFourPage} />\n    </Switch>\n  );\n};\n\nexport default App;\n\n\n\n// WEBPACK FOOTER //\n// ./react/app.js","import { connect } from 'react-redux';\nimport { selectFile, updateError, clearFile } from 'actions/publish';\nimport View from './view';\n\nconst mapStateToProps = ({ publish }) => {\n  return {\n    file     : publish.file,\n    thumbnail: publish.thumbnail,\n    fileError: publish.error.file,\n  };\n};\n\nconst mapDispatchToProps = dispatch => {\n  return {\n    selectFile: (file) => {\n      dispatch(selectFile(file));\n    },\n    setFileError: (value) => {\n      dispatch(clearFile());\n      dispatch(updateError('file', value));\n    },\n  };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/Dropzone/index.js","import { connect } from 'react-redux';\nimport { updateLoggedInChannel } from 'actions/channel';\nimport View from './view';\nimport {updateSelectedChannel} from '../../actions/publish';\n\nconst mapDispatchToProps = dispatch => {\n  return {\n    onChannelLogin: (name, shortId, longId) => {\n      dispatch(updateLoggedInChannel(name, shortId, longId));\n      dispatch(updateSelectedChannel(name));\n    },\n  };\n};\n\nexport default connect(null, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ChannelLoginForm/index.js","import { connect } from 'react-redux';\nimport { updateLoggedInChannel } from 'actions/channel';\nimport View from './view';\nimport {updateSelectedChannel} from 'actions/publish';\n\nconst mapDispatchToProps = dispatch => {\n  return {\n    onChannelLogin: (name, shortId, longId) => {\n      dispatch(updateLoggedInChannel(name, shortId, longId));\n      dispatch(updateSelectedChannel(name));\n    },\n  };\n};\n\nexport default connect(null, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ChannelCreateForm/index.js","export const CHANNEL = 'CHANNEL';\nexport const ASSET_LITE = 'ASSET_LITE';\nexport const ASSET_DETAILS = 'ASSET_DETAILS';\n\n\n\n// WEBPACK FOOTER //\n// ./react/constants/show_request_types.js","import { connect } from 'react-redux';\nimport View from './view';\nimport { fileRequested } from 'actions/show';\nimport { selectAsset } from 'selectors/show';\n\nconst mapStateToProps = ({ show }) => {\n  // select error and status\n  const error  = show.displayAsset.error;\n  const status = show.displayAsset.status;\n  // select asset\n  const asset = selectAsset(show);\n  //  return props\n  return {\n    error,\n    status,\n    asset,\n  };\n};\n\nconst mapDispatchToProps = dispatch => {\n  return {\n    onFileRequest: (name, claimId) => {\n      dispatch(fileRequested(name, claimId));\n    },\n  };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/AssetDisplay/index.js","module.exports = (helmet, html, preloadedState) => {\n  // take the html and preloadedState and return the full page\n  return `\n    <!DOCTYPE html>\n    <html lang=\"en\" prefix=\"og: http://ogp.me/ns# fb: http://ogp.me/ns/fb#\">\n        <head>\n            <meta charset=\"UTF-8\">\n            <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1, user-scalable=no\">\n            <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n            <!--helmet-->\n            ${helmet.title.toString()}\n            ${helmet.meta.toString()}\n            ${helmet.link.toString()}\n            <!--style sheets-->\n            <link rel=\"stylesheet\" href=\"/assets/css/reset.css\" type=\"text/css\">\n            <link rel=\"stylesheet\" href=\"/assets/css/general.css\" type=\"text/css\">\n            <link rel=\"stylesheet\" href=\"/assets/css/mediaQueries.css\" type=\"text/css\">\n            <!--google font-->\n            <link href=\"https://fonts.googleapis.com/css?family=Roboto:300\" rel=\"stylesheet\">\n        </head>\n        <body id=\"main-body\">\n            <div class=\"row row--tall flex-container--column\">\n                <div id=\"react-app\" class=\"row row--tall flex-container--column\">${html}</div>\n            </div>\n            <script>\n                window.__PRELOADED_STATE__ = ${JSON.stringify(preloadedState).replace(/</g, '\\\\\\u003c')}\n            </script>\n            <script src=\"/bundle/bundle.js\"></script>\n        </body>\n    </html>\n  `;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/renderFullPage.js","export const selectSiteState = (state) => {\n  return state.site;\n};\n\nexport const selectSiteHost = (state) => {\n  return state.site.host;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/selectors/site.js","module.exports = require(\"babel-polyfill\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"babel-polyfill\"\n// module id = 48\n// module chunks = 0","module.exports = require(\"whatwg-fetch\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"whatwg-fetch\"\n// module id = 49\n// module chunks = 0","// app dependencies\nconst express = require('express');\nconst bodyParser = require('body-parser');\nconst expressHandlebars = require('express-handlebars');\nconst Handlebars = require('handlebars');\nconst helmet = require('helmet');\nconst passport = require('passport');\nconst { populateLocalsDotUser, serializeSpeechUser, deserializeSpeechUser } = require('./helpers/authHelpers.js');\nconst cookieSession = require('cookie-session');\nconst http = require('http');\n// logging dependencies\nconst logger = require('winston');\n\nfunction SpeechServer ({ mysqlConfig, siteConfig, slackConfig }) {\n  this.start = () => {\n    this.configureConfigFiles();\n    this.configureLogging();\n    this.configureApp();\n    this.configureServer();\n    this.startServer();\n  };\n  this.configureConfigFiles = () => {\n    const mysqlAppConfig = require('./config/mysqlConfig.js');\n    mysqlAppConfig.configure(mysqlConfig);\n    const siteAppConfig = require('./config/siteConfig.js');\n    siteAppConfig.configure(siteConfig);\n    this.PORT = siteAppConfig.details.port;\n    const slackAppConfig = require('./config/slackConfig.js');\n    slackAppConfig.configure(slackConfig);\n  };\n  this.configureLogging = () => {\n    require('./helpers/configureLogger.js')(logger);\n    require('./helpers/configureSlack.js')(logger);\n  };\n  this.configureApp = () => {\n    const app = express(); // create an Express application\n\n    // trust the proxy to get ip address for us\n    app.enable('trust proxy');\n\n    // add middleware\n    app.use(helmet()); // set HTTP headers to protect against well-known web vulnerabilties\n    app.use(express.static(`${__dirname}/public`)); // 'express.static' to serve static files from public directory\n    app.use(bodyParser.json()); // 'body parser' for parsing application/json\n    app.use(bodyParser.urlencoded({ extended: true })); // 'body parser' for parsing application/x-www-form-urlencoded\n    app.use((req, res, next) => {  // custom logging middleware to log all incoming http requests\n      logger.verbose(`Request on ${req.originalUrl} from ${req.ip}`);\n      next();\n    });\n\n    // configure passport\n    passport.serializeUser(serializeSpeechUser);\n    passport.deserializeUser(deserializeSpeechUser);\n    const localSignupStrategy = require('./passport/local-signup.js');\n    const localLoginStrategy = require('./passport/local-login.js');\n    passport.use('local-signup', localSignupStrategy);\n    passport.use('local-login', localLoginStrategy);\n    // initialize passport\n    app.use(cookieSession({\n      name  : 'session',\n      keys  : [siteConfig.auth.sessionKey],\n      maxAge: 24 * 60 * 60 * 1000, // i.e. 24 hours\n    }));\n    app.use(passport.initialize());\n    app.use(passport.session());\n\n    // configure handlebars & register it with express app\n    const hbs = expressHandlebars.create({\n      defaultLayout: 'embed',\n      handlebars   : Handlebars,\n    });\n    app.engine('handlebars', hbs.engine);\n    app.set('view engine', 'handlebars');\n\n    // middleware to pass user info back to client (for handlebars access), if user is logged in\n    app.use(populateLocalsDotUser);  // note: I don't think I need this any more?\n\n    // set the routes on the app\n    require('./routes/auth-routes.js')(app);\n    require('./routes/api-routes.js')(app);\n    require('./routes/page-routes.js')(app);\n    require('./routes/serve-routes.js')(app);\n    require('./routes/fallback-routes.js')(app);\n\n    this.app = app;\n  };\n  this.configureServer = () => {\n    this.server = http.Server(this.app);\n  };\n  this.startServer = () => {\n    const db = require('./models');\n    // sync sequelize\n    db.sequelize.sync()\n      // start the server\n      .then(() => {\n        this.server.listen(this.PORT, () => {\n          logger.info(`Server is listening on PORT ${this.PORT}`);\n        });\n      })\n      .catch((error) => {\n        logger.error(`Startup Error:`, error);\n      });\n  };\n};\n\nmodule.exports = SpeechServer;\n\n\n\n// WEBPACK FOOTER //\n// ./server.js","module.exports = require(\"express\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"express\"\n// module id = 51\n// module chunks = 0","module.exports = require(\"body-parser\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"body-parser\"\n// module id = 52\n// module chunks = 0","module.exports = require(\"express-handlebars\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"express-handlebars\"\n// module id = 53\n// module chunks = 0","module.exports = require(\"handlebars\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"handlebars\"\n// module id = 54\n// module chunks = 0","module.exports = require(\"helmet\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"helmet\"\n// module id = 55\n// module chunks = 0","const logger = require('winston');\n\nmodule.exports = {\n  populateLocalsDotUser (req, res, next) {\n    if (req.user) {\n      logger.debug('populating res.locals.user');\n      res.locals.user = {\n        id            : req.user.id,\n        userName      : req.user.userName,\n        channelName   : req.user.channelName,\n        channelClaimId: req.user.channelClaimId,\n        shortChannelId: req.user.shortChannelId,\n      };\n    }\n    next();\n  },\n  serializeSpeechUser (user, done) {  // returns user data to be serialized into session\n    logger.debug('serializing user');\n    done(null, user);\n  },\n  deserializeSpeechUser (user, done) {  // deserializes session and populates additional info to req.user\n    logger.debug('deserializing user');\n    done(null, user);\n  },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/authHelpers.js","module.exports = require(\"cookie-session\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"cookie-session\"\n// module id = 57\n// module chunks = 0","module.exports = require(\"http\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"http\"\n// module id = 58\n// module chunks = 0","const { logLevel } = require('../config/loggerConfig');\n\nmodule.exports = (winston) => {\n  // configure\n  winston.configure({\n    transports: [\n      new (winston.transports.Console)({\n        level                          : logLevel,\n        timestamp                      : false,\n        colorize                       : true,\n        prettyPrint                    : true,\n        handleExceptions               : true,\n        humanReadableUnhandledException: true,\n      }),\n    ],\n  });\n  // test all the log levels\n  winston.error('Level 0');\n  winston.warn('Level 1');\n  winston.info('Level 2');\n  winston.verbose('Level 3');\n  winston.debug('Level 4');\n  winston.silly('Level 5');\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/configureLogger.js","const loggerConfig = {\n  logLevel: 'debug',  // options: silly, debug, verbose, info\n};\n\nmodule.exports = loggerConfig;\n\n\n\n// WEBPACK FOOTER //\n// ./config/loggerConfig.js","const winstonSlackWebHook = require('winston-slack-webhook').SlackWebHook;\nconst slackConfig = require('../config/slackConfig.js');\n\nmodule.exports = (winston) => {\n  const {slackWebHook, slackErrorChannel, slackInfoChannel} = slackConfig;\n  if (slackWebHook) {\n    // add a transport for errors to slack\n    if (slackErrorChannel) {\n      winston.add(winstonSlackWebHook, {\n        name      : 'slack-errors-transport',\n        level     : 'warn',\n        webhookUrl: slackWebHook,\n        channel   : slackErrorChannel,\n        username  : 'spee.ch',\n        iconEmoji : ':face_with_head_bandage:',\n      });\n    };\n    if (slackInfoChannel) {\n      winston.add(winstonSlackWebHook, {\n        name      : 'slack-info-transport',\n        level     : 'info',\n        webhookUrl: slackWebHook,\n        channel   : slackInfoChannel,\n        username  : 'spee.ch',\n        iconEmoji : ':nerd_face:',\n      });\n    };\n    // send test message\n    winston.error('Slack \"error\" logging is online.');\n    winston.info('Slack \"info\" logging is online.');\n  } else {\n    winston.warn('Slack logging is not enabled because no slackWebHook config var provided.');\n  }\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/configureSlack.js","module.exports = require(\"winston-slack-webhook\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"winston-slack-webhook\"\n// module id = 62\n// module chunks = 0","const PassportLocalStrategy = require('passport-local').Strategy;\nconst lbryApi = require('../helpers/lbryApi.js');\nconst logger = require('winston');\nconst db = require('../models');\n\nmodule.exports = new PassportLocalStrategy(\n  {\n    usernameField: 'username',\n    passwordField: 'password',\n  },\n  (username, password, done) => {\n    logger.verbose(`new channel signup request. user: ${username} pass: ${password} .`);\n    let userInfo = {};\n    // server-side validaton of inputs (username, password)\n\n    // create the channel and retrieve the metadata\n    return lbryApi.createChannel(`@${username}`)\n      .then(tx => {\n        // create user record\n        const userData = {\n          userName: username,\n          password: password,\n        };\n        logger.verbose('userData >', userData);\n        // create user record\n        const channelData = {\n          channelName   : `@${username}`,\n          channelClaimId: tx.claim_id,\n        };\n        logger.verbose('channelData >', channelData);\n        // create certificate record\n        const certificateData = {\n          claimId: tx.claim_id,\n          name   : `@${username}`,\n          // address,\n        };\n        logger.verbose('certificateData >', certificateData);\n        // save user and certificate to db\n        return Promise.all([db.User.create(userData), db.Channel.create(channelData), db.Certificate.create(certificateData)]);\n      })\n      .then(([newUser, newChannel, newCertificate]) => {\n        logger.verbose('user and certificate successfully created');\n        // store the relevant newUser info to be passed back for req.User\n        userInfo['id'] = newUser.id;\n        userInfo['userName'] = newUser.userName;\n        userInfo['channelName'] = newChannel.channelName;\n        userInfo['channelClaimId'] = newChannel.channelClaimId;\n        // associate the instances\n        return Promise.all([newCertificate.setChannel(newChannel), newChannel.setUser(newUser)]);\n      })\n      .then(() => {\n        logger.verbose('user and certificate successfully associated');\n        return db.Certificate.getShortChannelIdFromLongChannelId(userInfo.channelClaimId, userInfo.channelName);\n      })\n      .then(shortChannelId => {\n        userInfo['shortChannelId'] = shortChannelId;\n        return done(null, userInfo);\n      })\n      .catch(error => {\n        logger.error('signup error', error);\n        return done(error);\n      });\n  }\n);\n\n\n\n// WEBPACK FOOTER //\n// ./passport/local-signup.js","module.exports = require(\"axios\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"axios\"\n// module id = 64\n// module chunks = 0","const lbryConfig = {\n  api: {\n    apiHost: 'localhost',\n    apiPort: '5279',\n  },\n};\n\nmodule.exports = lbryConfig;\n\n\n\n// WEBPACK FOOTER //\n// ./config/lbryConfig.js","module.exports = require(\"universal-analytics\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"universal-analytics\"\n// module id = 66\n// module chunks = 0","const logger = require('winston');\nconst { returnShortId } = require('../helpers/sequelizeHelpers.js');\n\nmodule.exports = (sequelize, { STRING, BOOLEAN, INTEGER, TEXT, DECIMAL }) => {\n  const Certificate = sequelize.define(\n    'Certificate',\n    {\n      address: {\n        type   : STRING,\n        default: null,\n      },\n      amount: {\n        type   : DECIMAL(19, 8),\n        default: null,\n      },\n      claimId: {\n        type   : STRING,\n        default: null,\n      },\n      claimSequence: {\n        type   : INTEGER,\n        default: null,\n      },\n      decodedClaim: {\n        type   : BOOLEAN,\n        default: null,\n      },\n      depth: {\n        type   : INTEGER,\n        default: null,\n      },\n      effectiveAmount: {\n        type   : DECIMAL(19, 8),\n        default: null,\n      },\n      hasSignature: {\n        type   : BOOLEAN,\n        default: null,\n      },\n      height: {\n        type   : INTEGER,\n        default: null,\n      },\n      hex: {\n        type   : TEXT('long'),\n        default: null,\n      },\n      name: {\n        type   : STRING,\n        default: null,\n      },\n      nout: {\n        type   : INTEGER,\n        default: null,\n      },\n      txid: {\n        type   : STRING,\n        default: null,\n      },\n      validAtHeight: {\n        type   : INTEGER,\n        default: null,\n      },\n      outpoint: {\n        type   : STRING,\n        default: null,\n      },\n      valueVersion: {\n        type   : STRING,\n        default: null,\n      },\n      claimType: {\n        type   : STRING,\n        default: null,\n      },\n      certificateVersion: {\n        type   : STRING,\n        default: null,\n      },\n      keyType: {\n        type   : STRING,\n        default: null,\n      },\n      publicKey: {\n        type   : TEXT('long'),\n        default: null,\n      },\n    },\n    {\n      freezeTableName: true,\n    }\n  );\n\n  Certificate.associate = db => {\n    Certificate.belongsTo(db.Channel, {\n      foreignKey: {\n        allowNull: true,\n      },\n    });\n  };\n\n  Certificate.getShortChannelIdFromLongChannelId = function (longChannelId, channelName) {\n    logger.debug(`getShortChannelIdFromLongChannelId ${channelName}:${longChannelId}`);\n    return new Promise((resolve, reject) => {\n      this\n        .findAll({\n          where: {name: channelName},\n          order: [['height', 'ASC']],\n        })\n        .then(result => {\n          switch (result.length) {\n            case 0:\n              throw new Error('No channel(s) found with that channel name');\n            default:\n              return resolve(returnShortId(result, longChannelId));\n          }\n        })\n        .catch(error => {\n          reject(error);\n        });\n    });\n  };\n\n  Certificate.getLongChannelIdFromShortChannelId = function (channelName, channelClaimId) {\n    logger.debug(`getLongChannelIdFromShortChannelId(${channelName}, ${channelClaimId})`);\n    return new Promise((resolve, reject) => {\n      this\n        .findAll({\n          where: {\n            name   : channelName,\n            claimId: {\n              $like: `${channelClaimId}%`,\n            },\n          },\n          order: [['height', 'ASC']],\n        })\n        .then(result => {\n          switch (result.length) {\n            case 0:\n              return resolve(null);\n            default: // note results must be sorted\n              return resolve(result[0].claimId);\n          }\n        })\n        .catch(error => {\n          reject(error);\n        });\n    });\n  };\n\n  Certificate.getLongChannelIdFromChannelName = function (channelName) {\n    logger.debug(`getLongChannelIdFromChannelName(${channelName})`);\n    return new Promise((resolve, reject) => {\n      this\n        .findAll({\n          where: { name: channelName },\n          order: [['effectiveAmount', 'DESC'], ['height', 'ASC']],\n        })\n        .then(result => {\n          switch (result.length) {\n            case 0:\n              return resolve(null);\n            default:\n              return resolve(result[0].claimId);\n          }\n        })\n        .catch(error => {\n          reject(error);\n        });\n    });\n  };\n\n  Certificate.validateLongChannelId = function (name, claimId) {\n    logger.debug(`validateLongChannelId(${name}, ${claimId})`);\n    return new Promise((resolve, reject) => {\n      this.findOne({\n        where: {name, claimId},\n      })\n        .then(result => {\n          if (!result) {\n            return resolve(null);\n          };\n          resolve(claimId);\n        })\n        .catch(error => {\n          reject(error);\n        });\n    });\n  };\n\n  Certificate.getLongChannelId = function (channelName, channelClaimId) {\n    logger.debug(`getLongChannelId(${channelName}, ${channelClaimId})`);\n    if (channelClaimId && (channelClaimId.length === 40)) {  // if a full channel id is provided\n      return this.validateLongChannelId(channelName, channelClaimId);\n    } else if (channelClaimId && channelClaimId.length < 40) {  // if a short channel id is provided\n      return this.getLongChannelIdFromShortChannelId(channelName, channelClaimId);\n    } else {\n      return this.getLongChannelIdFromChannelName(channelName);  // if no channel id provided\n    }\n  };\n\n  return Certificate;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./models/certificate.js","module.exports = (sequelize, { STRING }) => {\n  const Channel = sequelize.define(\n    'Channel',\n    {\n      channelName: {\n        type     : STRING,\n        allowNull: false,\n      },\n      channelClaimId: {\n        type     : STRING,\n        allowNull: false,\n      },\n    },\n    {\n      freezeTableName: true,\n    }\n  );\n\n  Channel.associate = db => {\n    Channel.belongsTo(db.User);\n    Channel.hasOne(db.Certificate);\n  };\n\n  return Channel;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./models/channel.js","const logger = require('winston');\nconst { returnShortId } = require('../helpers/sequelizeHelpers.js');\nconst { assetDefaults: { thumbnail: defaultThumbnail }, details: { host } } = require('../config/siteConfig.js');\n\nfunction determineFileExtensionFromContentType (contentType) {\n  switch (contentType) {\n    case 'image/jpeg':\n    case 'image/jpg':\n      return 'jpeg';\n    case 'image/png':\n      return 'png';\n    case 'image/gif':\n      return 'gif';\n    case 'video/mp4':\n      return 'mp4';\n    default:\n      logger.debug('setting unknown file type as file extension jpeg');\n      return 'jpeg';\n  }\n};\n\nfunction determineThumbnail (storedThumbnail, defaultThumbnail) {\n  if (storedThumbnail === '') {\n    return defaultThumbnail;\n  }\n  return storedThumbnail;\n};\n\nfunction prepareClaimData (claim) {\n  // logger.debug('preparing claim data based on resolved data:', claim);\n  claim['thumbnail'] = determineThumbnail(claim.thumbnail, defaultThumbnail);\n  claim['fileExt'] = determineFileExtensionFromContentType(claim.contentType);\n  claim['host'] = host;\n  return claim;\n};\n\nmodule.exports = (sequelize, { STRING, BOOLEAN, INTEGER, TEXT, DECIMAL }) => {\n  const Claim = sequelize.define(\n    'Claim',\n    {\n      address: {\n        type   : STRING,\n        default: null,\n      },\n      amount: {\n        type   : DECIMAL(19, 8),\n        default: null,\n      },\n      claimId: {\n        type   : STRING,\n        default: null,\n      },\n      claimSequence: {\n        type   : INTEGER,\n        default: null,\n      },\n      decodedClaim: {\n        type   : BOOLEAN,\n        default: null,\n      },\n      depth: {\n        type   : INTEGER,\n        default: null,\n      },\n      effectiveAmount: {\n        type   : DECIMAL(19, 8),\n        default: null,\n      },\n      hasSignature: {\n        type   : BOOLEAN,\n        default: null,\n      },\n      height: {\n        type   : INTEGER,\n        default: null,\n      },\n      hex: {\n        type   : TEXT('long'),\n        default: null,\n      },\n      name: {\n        type   : STRING,\n        default: null,\n      },\n      nout: {\n        type   : INTEGER,\n        default: null,\n      },\n      txid: {\n        type   : STRING,\n        default: null,\n      },\n      validAtHeight: {\n        type   : INTEGER,\n        default: null,\n      },\n      outpoint: {\n        type   : STRING,\n        default: null,\n      },\n      claimType: {\n        type   : STRING,\n        default: null,\n      },\n      certificateId: {\n        type   : STRING,\n        default: null,\n      },\n      author: {\n        type   : STRING,\n        default: null,\n      },\n      description: {\n        type   : TEXT('long'),\n        default: null,\n      },\n      language: {\n        type   : STRING,\n        default: null,\n      },\n      license: {\n        type   : STRING,\n        default: null,\n      },\n      licenseUrl: {\n        type   : STRING,\n        default: null,\n      },\n      nsfw: {\n        type   : BOOLEAN,\n        default: null,\n      },\n      preview: {\n        type   : STRING,\n        default: null,\n      },\n      thumbnail: {\n        type   : STRING,\n        default: null,\n      },\n      title: {\n        type   : STRING,\n        default: null,\n      },\n      metadataVersion: {\n        type   : STRING,\n        default: null,\n      },\n      contentType: {\n        type   : STRING,\n        default: null,\n      },\n      source: {\n        type   : STRING,\n        default: null,\n      },\n      sourceType: {\n        type   : STRING,\n        default: null,\n      },\n      sourceVersion: {\n        type   : STRING,\n        default: null,\n      },\n      streamVersion: {\n        type   : STRING,\n        default: null,\n      },\n      valueVersion: {\n        type   : STRING,\n        default: null,\n      },\n      channelName: {\n        type     : STRING,\n        allowNull: true,\n        default  : null,\n      },\n    },\n    {\n      freezeTableName: true,\n    }\n  );\n\n  Claim.associate = db => {\n    Claim.belongsTo(db.File, {\n      foreignKey: {\n        allowNull: true,\n      },\n    });\n  };\n\n  Claim.getShortClaimIdFromLongClaimId = function (claimId, claimName) {\n    logger.debug(`Claim.getShortClaimIdFromLongClaimId for ${claimName}#${claimId}`);\n    return new Promise((resolve, reject) => {\n      this\n        .findAll({\n          where: { name: claimName },\n          order: [['height', 'ASC']],\n        })\n        .then(result => {\n          switch (result.length) {\n            case 0:\n              throw new Error('No claim(s) found with that claim name');\n            default:\n              resolve(returnShortId(result, claimId));\n          }\n        })\n        .catch(error => {\n          reject(error);\n        });\n    });\n  };\n\n  Claim.getAllChannelClaims = function (channelClaimId) {\n    logger.debug(`Claim.getAllChannelClaims for ${channelClaimId}`);\n    return new Promise((resolve, reject) => {\n      this\n        .findAll({\n          where: { certificateId: channelClaimId },\n          order: [['height', 'ASC']],\n          raw  : true,  // returns an array of only data, not an array of instances\n        })\n        .then(channelClaimsArray => {\n          // logger.debug('channelclaimsarray length:', channelClaimsArray.length);\n          switch (channelClaimsArray.length) {\n            case 0:\n              return resolve(null);\n            default:\n              channelClaimsArray.forEach(claim => {\n                claim['fileExt'] = determineFileExtensionFromContentType(claim.contentType);\n                claim['thumbnail'] = determineThumbnail(claim.thumbnail, defaultThumbnail);\n                return claim;\n              });\n              return resolve(channelClaimsArray);\n          }\n        })\n        .catch(error => {\n          reject(error);\n        });\n    });\n  };\n\n  Claim.getClaimIdByLongChannelId = function (channelClaimId, claimName) {\n    logger.debug(`finding claim id for claim ${claimName} from channel ${channelClaimId}`);\n    return new Promise((resolve, reject) => {\n      this\n        .findAll({\n          where: { name: claimName, certificateId: channelClaimId },\n          order: [['id', 'ASC']],\n        })\n        .then(result => {\n          switch (result.length) {\n            case 0:\n              return resolve(null);\n            case 1:\n              return resolve(result[0].claimId);\n            default:\n              logger.error(`${result.length} records found for \"${claimName}\" in channel \"${channelClaimId}\"`);\n              return resolve(result[0].claimId);\n          }\n        })\n        .catch(error => {\n          reject(error);\n        });\n    });\n  };\n\n  Claim.getLongClaimIdFromShortClaimId = function (name, shortId) {\n    return new Promise((resolve, reject) => {\n      this\n        .findAll({\n          where: {\n            name,\n            claimId: {\n              $like: `${shortId}%`,\n            }},\n          order: [['height', 'ASC']],\n        })\n        .then(result => {\n          switch (result.length) {\n            case 0:\n              return resolve(null);\n            default: // note results must be sorted\n              return resolve(result[0].claimId);\n          }\n        })\n        .catch(error => {\n          reject(error);\n        });\n    });\n  };\n\n  Claim.getTopFreeClaimIdByClaimName = function (name) {\n    return new Promise((resolve, reject) => {\n      this\n        .findAll({\n          where: { name },\n          order: [['effectiveAmount', 'DESC'], ['height', 'ASC']],  // note: maybe height and effective amount need to switch?\n        })\n        .then(result => {\n          logger.debug('length of result', result.length);\n          switch (result.length) {\n            case 0:\n              return resolve(null);\n            default:\n              return resolve(result[0].dataValues.claimId);\n          }\n        })\n        .catch(error => {\n          reject(error);\n        });\n    });\n  };\n\n  Claim.validateLongClaimId = function (name, claimId) {\n    return new Promise((resolve, reject) => {\n      this.findOne({\n        where: {name, claimId},\n      })\n        .then(result => {\n          if (!result) {\n            return resolve(null);\n          };\n          resolve(claimId);\n        })\n        .catch(error => {\n          reject(error);\n        });\n    });\n  };\n\n  Claim.getLongClaimId = function (claimName, claimId) {\n    logger.debug(`getLongClaimId(${claimName}, ${claimId})`);\n    if (claimId && (claimId.length === 40)) {  // if a full claim id is provided\n      return this.validateLongClaimId(claimName, claimId);\n    } else if (claimId && claimId.length < 40) {\n      return this.getLongClaimIdFromShortClaimId(claimName, claimId);  // if a short claim id is provided\n    } else {\n      return this.getTopFreeClaimIdByClaimName(claimName);  // if no claim id is provided\n    }\n  };\n\n  Claim.resolveClaim = function (name, claimId) {\n    logger.debug(`Claim.resolveClaim: ${name} ${claimId}`);\n    return new Promise((resolve, reject) => {\n      this\n        .findAll({\n          where: { name, claimId },\n        })\n        .then(claimArray => {\n          switch (claimArray.length) {\n            case 0:\n              return resolve(null);\n            case 1:\n              return resolve(prepareClaimData(claimArray[0].dataValues));\n            default:\n              logger.error(`more than one record matches ${name}#${claimId} in db.Claim`);\n              return resolve(prepareClaimData(claimArray[0].dataValues));\n          }\n        })\n        .catch(error => {\n          reject(error);\n        });\n    });\n  };\n\n  return Claim;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./models/claim.js","module.exports = (sequelize, { STRING, BOOLEAN, INTEGER }) => {\n  const File = sequelize.define(\n    'File',\n    {\n      name: {\n        type     : STRING,\n        allowNull: false,\n      },\n      claimId: {\n        type     : STRING,\n        allowNull: false,\n      },\n      address: {\n        type     : STRING,\n        allowNull: false,\n      },\n      outpoint: {\n        type     : STRING,\n        allowNull: false,\n      },\n      height: {\n        type     : INTEGER,\n        allowNull: false,\n        default  : 0,\n      },\n      fileName: {\n        type     : STRING,\n        allowNull: false,\n      },\n      filePath: {\n        type     : STRING,\n        allowNull: false,\n      },\n      fileType: {\n        type: STRING,\n      },\n      nsfw: {\n        type        : BOOLEAN,\n        allowNull   : false,\n        defaultValue: false,\n      },\n      trendingEligible: {\n        type        : BOOLEAN,\n        allowNull   : false,\n        defaultValue: true,\n      },\n    },\n    {\n      freezeTableName: true,\n    }\n  );\n\n  File.associate = db => {\n    File.hasMany(db.Request);\n    File.hasOne(db.Claim);\n  };\n\n  File.getRecentClaims = function () {\n    return this.findAll({\n      where: { nsfw: false, trendingEligible: true },\n      order: [['createdAt', 'DESC']],\n      limit: 25,\n    });\n  };\n\n  return File;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./models/file.js","module.exports = (sequelize, { STRING, BOOLEAN, TEXT }) => {\n  const Request = sequelize.define(\n    'Request',\n    {\n      action: {\n        type     : STRING,\n        allowNull: false,\n      },\n      url: {\n        type     : STRING,\n        allowNull: false,\n      },\n      ipAddress: {\n        type     : STRING,\n        allowNull: true,\n      },\n      result: {\n        type     : TEXT('long'),\n        allowNull: true,\n        default  : null,\n      },\n    },\n    {\n      freezeTableName: true,\n    }\n  );\n\n  Request.associate = db => {\n    Request.belongsTo(db.File, {\n      foreignKey: {\n        allowNull: true,\n      },\n    });\n  };\n\n  return Request;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./models/request.js","'use strict';\nconst bcrypt = require('bcrypt');\nconst logger = require('winston');\n\nmodule.exports = (sequelize, { STRING }) => {\n  const User = sequelize.define(\n    'User',\n    {\n      userName: {\n        type     : STRING,\n        allowNull: false,\n      },\n      password: {\n        type     : STRING,\n        allowNull: false,\n      },\n    },\n    {\n      freezeTableName: true,\n    }\n  );\n\n  User.associate = db => {\n    User.hasOne(db.Channel);\n  };\n\n  User.prototype.comparePassword = function (password) {\n    return bcrypt.compare(password, this.password);\n  };\n\n  User.prototype.changePassword = function (newPassword) {\n    return new Promise((resolve, reject) => {\n      // generate a salt string to use for hashing\n      bcrypt.genSalt((saltError, salt) => {\n        if (saltError) {\n          logger.error('salt error', saltError);\n          reject(saltError);\n          return;\n        }\n        // generate a hashed version of the user's password\n        bcrypt.hash(newPassword, salt, (hashError, hash) => {\n          // if there is an error with the hash generation return the error\n          if (hashError) {\n            logger.error('hash error', hashError);\n            reject(hashError);\n            return;\n          }\n          // replace the current password with the new hash\n          this\n            .update({password: hash})\n            .then(() => {\n              resolve();\n            })\n            .catch(error => {\n              reject(error);\n            });\n        });\n      });\n    });\n  };\n\n  // pre-save hook method to hash the user's password before the user's info is saved to the db.\n  User.hook('beforeCreate', (user, options) => {\n    logger.debug('User.beforeCreate hook...');\n    return new Promise((resolve, reject) => {\n      // generate a salt string to use for hashing\n      bcrypt.genSalt((saltError, salt) => {\n        if (saltError) {\n          logger.error('salt error', saltError);\n          reject(saltError);\n          return;\n        }\n        // generate a hashed version of the user's password\n        bcrypt.hash(user.password, salt, (hashError, hash) => {\n          // if there is an error with the hash generation return the error\n          if (hashError) {\n            logger.error('hash error', hashError);\n            reject(hashError);\n            return;\n          }\n          // replace the password string with the hash password value\n          user.password = hash;\n          resolve();\n        });\n      });\n    });\n  });\n\n  return User;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./models/user.js","module.exports = require(\"bcrypt\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"bcrypt\"\n// module id = 73\n// module chunks = 0","const PassportLocalStrategy = require('passport-local').Strategy;\nconst logger = require('winston');\nconst db = require('../models');\n\nconst returnUserAndChannelInfo = (userInstance) => {\n  return new Promise((resolve, reject) => {\n    let userInfo = {};\n    userInfo['id'] = userInstance.id;\n    userInfo['userName'] = userInstance.userName;\n    userInstance\n      .getChannel()\n      .then(({channelName, channelClaimId}) => {\n        userInfo['channelName'] = channelName;\n        userInfo['channelClaimId'] = channelClaimId;\n        return db.Certificate.getShortChannelIdFromLongChannelId(channelClaimId, channelName);\n      })\n      .then(shortChannelId => {\n        userInfo['shortChannelId'] = shortChannelId;\n        resolve(userInfo);\n      })\n      .catch(error => {\n        reject(error);\n      });\n  });\n};\n\nmodule.exports = new PassportLocalStrategy(\n  {\n    usernameField: 'username',\n    passwordField: 'password',\n  },\n  (username, password, done) => {\n    return db.User\n      .findOne({\n        where: {userName: username},\n      })\n      .then(user => {\n        if (!user) {\n          logger.debug('no user found');\n          return done(null, false, {message: 'Incorrect username or password'});\n        }\n        return user.comparePassword(password)\n          .then(isMatch => {\n            if (!isMatch) {\n              logger.debug('incorrect password');\n              return done(null, false, {message: 'Incorrect username or password'});\n            }\n            logger.debug('Password was a match, returning User');\n            return returnUserAndChannelInfo(user)\n              .then(userInfo => {\n                return done(null, userInfo);\n              })\n              .catch(error => {\n                return error;\n              });\n          })\n          .catch(error => {\n            return error;\n          });\n      })\n      .catch(error => {\n        return done(error);\n      });\n  },\n);\n\n\n\n// WEBPACK FOOTER //\n// ./passport/local-login.js","const logger = require('winston');\nconst passport = require('passport');\n\nmodule.exports = (app) => {\n  // route for sign up\n  app.post('/signup', passport.authenticate('local-signup'), (req, res) => {\n    logger.verbose(`successful signup for ${req.user.channelName}`);\n    res.status(200).json({\n      success       : true,\n      channelName   : req.user.channelName,\n      channelClaimId: req.user.channelClaimId,\n      shortChannelId: req.user.shortChannelId,\n    });\n  });\n  // route for log in\n  app.post('/login', (req, res, next) => {\n    passport.authenticate('local-login', (err, user, info) => {\n      if (err) {\n        return next(err);\n      }\n      if (!user) {\n        return res.status(400).json({\n          success: false,\n          message: info.message,\n        });\n      }\n      logger.debug('successful login');\n      req.logIn(user, (err) => {\n        if (err) {\n          return next(err);\n        }\n        return res.status(200).json({\n          success       : true,\n          channelName   : req.user.channelName,\n          channelClaimId: req.user.channelClaimId,\n          shortChannelId: req.user.shortChannelId,\n        });\n      });\n    })(req, res, next);\n  });\n  // route to log out\n  app.get('/logout', (req, res) => {\n    req.logout();\n    res.status(200).json({success: true, message: 'you successfully logged out'});\n  });\n  // see if user is authenticated, and return credentials if so\n  app.get('/user', (req, res) => {\n    if (req.user) {\n      res.status(200).json({success: true, data: req.user});\n    } else {\n      res.status(401).json({success: false, message: 'user is not logged in'});\n    }\n  });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./routes/auth-routes.js","const logger = require('winston');\nconst multipart = require('connect-multiparty');\nconst { publishing: { uploadDirectory }, details: { host } } = require('../config/siteConfig.js');\nconst multipartMiddleware = multipart({uploadDir: uploadDirectory});\nconst db = require('../models');\nconst { claimNameIsAvailable, checkChannelAvailability, publish } = require('../controllers/publishController.js');\nconst { getClaimList, resolveUri, getClaim } = require('../helpers/lbryApi.js');\nconst { addGetResultsToFileData, createBasicPublishParams, createThumbnailPublishParams, parsePublishApiRequestBody, parsePublishApiRequestFiles, createFileData } = require('../helpers/publishHelpers.js');\nconst errorHandlers = require('../helpers/errorHandlers.js');\nconst { sendGATimingEvent } = require('../helpers/googleAnalytics.js');\nconst { authenticateUser } = require('../auth/authentication.js');\nconst { getChannelData, getChannelClaims, getClaimId } = require('../controllers/serveController.js');\n\nconst NO_CHANNEL = 'NO_CHANNEL';\nconst NO_CLAIM = 'NO_CLAIM';\n\nmodule.exports = (app) => {\n  // route to check whether site has published to a channel\n  app.get('/api/channel/availability/:name', ({ ip, originalUrl, params: { name } }, res) => {\n    const gaStartTime = Date.now();\n    checkChannelAvailability(name)\n      .then(availableName => {\n        res.status(200).json(availableName);\n        sendGATimingEvent('end-to-end', 'claim name availability', name, gaStartTime, Date.now());\n      })\n      .catch(error => {\n        errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n      });\n  });\n  // route to get a short channel id from long channel Id\n  app.get('/api/channel/short-id/:longId/:name', ({ ip, originalUrl, params }, res) => {\n    db.Certificate.getShortChannelIdFromLongChannelId(params.longId, params.name)\n      .then(shortId => {\n        res.status(200).json(shortId);\n      })\n      .catch(error => {\n        errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n      });\n  });\n  app.get('/api/channel/data/:channelName/:channelClaimId', ({ ip, originalUrl, body, params }, res) => {\n    const channelName = params.channelName;\n    let channelClaimId = params.channelClaimId;\n    if (channelClaimId === 'none') channelClaimId = null;\n    getChannelData(channelName, channelClaimId, 0)\n      .then(data => {\n        if (data === NO_CHANNEL) {\n          return res.status(404).json({success: false, message: 'No matching channel was found'});\n        }\n        res.status(200).json({success: true, data});\n      })\n      .catch(error => {\n        errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n      });\n  });\n  app.get('/api/channel/claims/:channelName/:channelClaimId/:page', ({ ip, originalUrl, body, params }, res) => {\n    const channelName = params.channelName;\n    let channelClaimId = params.channelClaimId;\n    if (channelClaimId === 'none') channelClaimId = null;\n    const page = params.page;\n    getChannelClaims(channelName, channelClaimId, page)\n      .then(data => {\n        if (data === NO_CHANNEL) {\n          return res.status(404).json({success: false, message: 'No matching channel was found'});\n        }\n        res.status(200).json({success: true, data});\n      })\n      .catch(error => {\n        errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n      });\n  });\n  // route to run a claim_list request on the daemon\n  app.get('/api/claim/list/:name', ({ ip, originalUrl, params }, res) => {\n    getClaimList(params.name)\n      .then(claimsList => {\n        res.status(200).json(claimsList);\n      })\n      .catch(error => {\n        errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n      });\n  });\n  // route to get an asset\n  app.get('/api/claim/get/:name/:claimId', ({ ip, originalUrl, params }, res) => {\n    const name = params.name;\n    const claimId = params.claimId;\n    // resolve the claim\n    db.Claim.resolveClaim(name, claimId)\n      .then(resolveResult => {\n        // make sure a claim actually exists at that uri\n        if (!resolveResult) {\n          throw new Error('No matching uri found in Claim table');\n        }\n        let fileData = createFileData(resolveResult);\n        // get the claim\n        return Promise.all([fileData, getClaim(`${name}#${claimId}`)]);\n      })\n      .then(([ fileData, getResult ]) => {\n        fileData = addGetResultsToFileData(fileData, getResult);\n        return Promise.all([db.upsert(db.File, fileData, {name, claimId}, 'File'), getResult]);\n      })\n      .then(([ fileRecord, {message, completed} ]) => {\n        res.status(200).json({ success: true, message, completed });\n      })\n      .catch(error => {\n        errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n      });\n  });\n  // route to check whether this site published to a claim\n  app.get('/api/claim/availability/:name', ({ ip, originalUrl, params: { name } }, res) => {\n    const gaStartTime = Date.now();\n    claimNameIsAvailable(name)\n      .then(result => {\n        res.status(200).json(result);\n        sendGATimingEvent('end-to-end', 'claim name availability', name, gaStartTime, Date.now());\n      })\n      .catch(error => {\n        errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n      });\n  });\n  // route to run a resolve request on the daemon\n  app.get('/api/claim/resolve/:name/:claimId', ({ headers, ip, originalUrl, params }, res) => {\n    resolveUri(`${params.name}#${params.claimId}`)\n      .then(resolvedUri => {\n        res.status(200).json(resolvedUri);\n      })\n      .catch(error => {\n        errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n      });\n  });\n  // route to run a publish request on the daemon\n  app.post('/api/claim/publish', multipartMiddleware, ({ body, files, headers, ip, originalUrl, user }, res) => {\n    // define variables\n    let  channelName, channelId, channelPassword, description, fileName, filePath, fileType, gaStartTime, license, name, nsfw, thumbnail, thumbnailFileName, thumbnailFilePath, thumbnailFileType, title;\n    // record the start time of the request\n    gaStartTime = Date.now();\n    // validate the body and files of the request\n    try {\n      // validateApiPublishRequest(body, files);\n      ({name, nsfw, license, title, description, thumbnail} = parsePublishApiRequestBody(body));\n      ({fileName, filePath, fileType, thumbnailFileName, thumbnailFilePath, thumbnailFileType} = parsePublishApiRequestFiles(files));\n      ({channelName, channelId, channelPassword} = body);\n    } catch (error) {\n      return res.status(400).json({success: false, message: error.message});\n    }\n    // check channel authorization\n    Promise.all([\n      authenticateUser(channelName, channelId, channelPassword, user),\n      claimNameIsAvailable(name),\n      createBasicPublishParams(filePath, name, title, description, license, nsfw, thumbnail),\n      createThumbnailPublishParams(thumbnailFilePath, name, license, nsfw),\n    ])\n      .then(([{channelName, channelClaimId}, validatedClaimName, publishParams, thumbnailPublishParams]) => {\n        // add channel details to the publish params\n        if (channelName && channelClaimId) {\n          publishParams['channel_name'] = channelName;\n          publishParams['channel_id'] = channelClaimId;\n        }\n        // publish the thumbnail\n        if (thumbnailPublishParams) {\n          publish(thumbnailPublishParams, thumbnailFileName, thumbnailFileType);\n        }\n        // publish the asset\n        return publish(publishParams, fileName, fileType);\n      })\n      .then(result => {\n        res.status(200).json({\n          success: true,\n          message: 'publish completed successfully',\n          data   : {\n            name,\n            claimId: result.claim_id,\n            url    : `${host}/${result.claim_id}/${name}`,\n            lbryTx : result,\n          },\n        });\n        // record the publish end time and send to google analytics\n        sendGATimingEvent('end-to-end', 'publish', fileType, gaStartTime, Date.now());\n      })\n      .catch(error => {\n        errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n      });\n  });\n  // route to get a short claim id from long claim Id\n  app.get('/api/claim/short-id/:longId/:name', ({ ip, originalUrl, body, params }, res) => {\n    db.Claim.getShortClaimIdFromLongClaimId(params.longId, params.name)\n      .then(shortId => {\n        res.status(200).json({success: true, data: shortId});\n      })\n      .catch(error => {\n        errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n      });\n  });\n  app.post('/api/claim/long-id', ({ ip, originalUrl, body, params }, res) => {\n    logger.debug('body:', body);\n    const channelName = body.channelName;\n    const channelClaimId = body.channelClaimId;\n    const claimName = body.claimName;\n    const claimId = body.claimId;\n    getClaimId(channelName, channelClaimId, claimName, claimId)\n      .then(result => {\n        if (result === NO_CHANNEL) {\n          return res.status(404).json({success: false, message: 'No matching channel could be found'});\n        }\n        if (result === NO_CLAIM) {\n          return res.status(404).json({success: false, message: 'No matching claim id could be found'});\n        }\n        res.status(200).json({success: true, data: result});\n      })\n      .catch(error => {\n        errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n      });\n  });\n  app.get('/api/claim/data/:claimName/:claimId', ({ ip, originalUrl, body, params }, res) => {\n    const claimName = params.claimName;\n    let claimId = params.claimId;\n    if (claimId === 'none') claimId = null;\n    db.Claim.resolveClaim(claimName, claimId)\n      .then(claimInfo => {\n        if (!claimInfo) {\n          return res.status(404).json({success: false, message: 'No claim could be found'});\n        }\n        res.status(200).json({success: true, data: claimInfo});\n      })\n      .catch(error => {\n        errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n      });\n  });\n  // route to see if asset is available locally\n  app.get('/api/file/availability/:name/:claimId', ({ ip, originalUrl, params }, res) => {\n    const name = params.name;\n    const claimId = params.claimId;\n    db.File.findOne({where: {name, claimId}})\n      .then(result => {\n        if (result) {\n          return res.status(200).json({success: true, data: true});\n        }\n        res.status(200).json({success: true, data: false});\n      })\n      .catch(error => {\n        errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n      });\n  });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./routes/api-routes.js","module.exports = require(\"connect-multiparty\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"connect-multiparty\"\n// module id = 77\n// module chunks = 0","const logger = require('winston');\nconst db = require('../models');\nconst lbryApi = require('../helpers/lbryApi.js');\nconst publishHelpers = require('../helpers/publishHelpers.js');\nconst { publishing: { primaryClaimAddress, additionalClaimAddresses } } = require('../config/siteConfig.js');\nconst Sequelize = require('sequelize');\nconst Op = Sequelize.Op;\n\nmodule.exports = {\n  publish (publishParams, fileName, fileType) {\n    return new Promise((resolve, reject) => {\n      let publishResults, certificateId, channelName;\n      // publish the file\n      return lbryApi.publishClaim(publishParams)\n        .then(tx => {\n          logger.info(`Successfully published ${publishParams.name} ${fileName}`, tx);\n          publishResults = tx;\n          // get the channel information\n          if (publishParams.channel_name) {\n            logger.debug(`this claim was published in channel: ${publishParams.channel_name}`);\n            return db.Channel.findOne({where: {channelName: publishParams.channel_name}});\n          } else {\n            logger.debug('this claim was not published in a channel');\n            return null;\n          }\n        })\n        .then(channel => {\n        // set channel information\n          certificateId = null;\n          channelName = null;\n          if (channel) {\n            certificateId = channel.channelClaimId;\n            channelName = channel.channelName;\n          }\n          logger.debug(`certificateId: ${certificateId}`);\n        })\n        .then(() => {\n        // create the File record\n          const fileRecord = {\n            name       : publishParams.name,\n            claimId    : publishResults.claim_id,\n            title      : publishParams.metadata.title,\n            description: publishParams.metadata.description,\n            address    : publishParams.claim_address,\n            outpoint   : `${publishResults.txid}:${publishResults.nout}`,\n            height     : 0,\n            fileName,\n            filePath   : publishParams.file_path,\n            fileType,\n            nsfw       : publishParams.metadata.nsfw,\n          };\n          // create the Claim record\n          const claimRecord = {\n            name       : publishParams.name,\n            claimId    : publishResults.claim_id,\n            title      : publishParams.metadata.title,\n            description: publishParams.metadata.description,\n            address    : publishParams.claim_address,\n            thumbnail  : publishParams.metadata.thumbnail,\n            outpoint   : `${publishResults.txid}:${publishResults.nout}`,\n            height     : 0,\n            contentType: fileType,\n            nsfw       : publishParams.metadata.nsfw,\n            amount     : publishParams.bid,\n            certificateId,\n            channelName,\n          };\n          // upsert criteria\n          const upsertCriteria = {\n            name   : publishParams.name,\n            claimId: publishResults.claim_id,\n          };\n          // upsert the records\n          return Promise.all([db.upsert(db.File, fileRecord, upsertCriteria, 'File'), db.upsert(db.Claim, claimRecord, upsertCriteria, 'Claim')]);\n        })\n        .then(([file, claim]) => {\n          logger.debug('File and Claim records successfully created');\n          return Promise.all([file.setClaim(claim), claim.setFile(file)]);\n        })\n        .then(() => {\n          logger.debug('File and Claim records successfully associated');\n          resolve(publishResults); // resolve the promise with the result from lbryApi.publishClaim;\n        })\n        .catch(error => {\n          logger.error('PUBLISH ERROR', error);\n          publishHelpers.deleteTemporaryFile(publishParams.file_path); // delete the local file\n          reject(error);\n        });\n    });\n  },\n  claimNameIsAvailable (name) {\n    const claimAddresses = additionalClaimAddresses || [];\n    claimAddresses.push(primaryClaimAddress);\n    // find any records where the name is used\n    return db.Claim\n      .findAll({\n        attributes: ['address'],\n        where     : {\n          name,\n          address: {\n            [Op.or]: claimAddresses,\n          },\n        },\n      })\n      .then(result => {\n        if (result.length >= 1) {\n          throw new Error('That claim is already in use');\n        };\n        return name;\n      })\n      .catch(error => {\n        throw error;\n      });\n  },\n  checkChannelAvailability (name) {\n    return db.Channel\n      .findAll({\n        where: { channelName: name },\n      })\n      .then(result => {\n        if (result.length >= 1) {\n          throw new Error('That channel has already been claimed');\n        }\n        return name;\n      })\n      .catch(error => {\n        throw error;\n      });\n  },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./controllers/publishController.js","module.exports = require(\"fs\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"fs\"\n// module id = 79\n// module chunks = 0","const db = require('../models');\nconst logger = require('winston');\n\nmodule.exports = {\n  authenticateUser (channelName, channelId, channelPassword, user) {\n    // case: no channelName or channel Id are provided (anonymous), regardless of whether user token is provided\n    if (!channelName && !channelId) {\n      return {\n        channelName   : null,\n        channelClaimId: null,\n      };\n    }\n    // case: channelName or channel Id are provided with user token\n    if (user) {\n      if (channelName && channelName !== user.channelName) {\n        throw new Error('the provided channel name does not match user credentials');\n      }\n      if (channelId && channelId !== user.channelClaimId) {\n        throw new Error('the provided channel id does not match user credentials');\n      }\n      return {\n        channelName   : user.channelName,\n        channelClaimId: user.channelClaimId,\n      };\n    }\n    // case: channelName or channel Id are provided with password instead of user token\n    if (!channelPassword) throw new Error('no channel password provided');\n    return module.exports.authenticateChannelCredentials(channelName, channelId, channelPassword);\n  },\n  authenticateChannelCredentials (channelName, channelId, userPassword) {\n    return new Promise((resolve, reject) => {\n      // hoisted variables\n      let channelData;\n      // build the params for finding the channel\n      let channelFindParams = {};\n      if (channelName) channelFindParams['channelName'] = channelName;\n      if (channelId) channelFindParams['channelClaimId'] = channelId;\n      // find the channel\n      db.Channel\n        .findOne({\n          where: channelFindParams,\n        })\n        .then(channel => {\n          if (!channel) {\n            logger.debug('no channel found');\n            throw new Error('Authentication failed, you do not have access to that channel');\n          }\n          channelData = channel.get();\n          logger.debug('channel data:', channelData);\n          return db.User.findOne({\n            where: { userName: channelData.channelName.substring(1) },\n          });\n        })\n        .then(user => {\n          if (!user) {\n            logger.debug('no user found');\n            throw new Error('Authentication failed, you do not have access to that channel');\n          }\n          return user.comparePassword(userPassword);\n        })\n        .then(isMatch => {\n          if (!isMatch) {\n            logger.debug('incorrect password');\n            throw new Error('Authentication failed, you do not have access to that channel');\n          }\n          logger.debug('...password was a match...');\n          resolve(channelData);\n        })\n        .catch(error => {\n          reject(error);\n        });\n    });\n  },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./auth/authentication.js","const CLAIMS_PER_PAGE = 12;\n\nmodule.exports = {\n  returnPaginatedChannelClaims (channelName, longChannelClaimId, claims, page) {\n    const totalPages = module.exports.determineTotalPages(claims);\n    const paginationPage = module.exports.getPageFromQuery(page);\n    const viewData = {\n      channelName       : channelName,\n      longChannelClaimId: longChannelClaimId,\n      claims            : module.exports.extractPageFromClaims(claims, paginationPage),\n      previousPage      : module.exports.determinePreviousPage(paginationPage),\n      currentPage       : paginationPage,\n      nextPage          : module.exports.determineNextPage(totalPages, paginationPage),\n      totalPages        : totalPages,\n      totalResults      : module.exports.determineTotalClaims(claims),\n    };\n    return viewData;\n  },\n  getPageFromQuery (page) {\n    if (page) {\n      return parseInt(page);\n    }\n    return 1;\n  },\n  extractPageFromClaims (claims, pageNumber) {\n    if (!claims) {\n      return [];  // if no claims, return this default\n    }\n    // logger.debug('claims is array?', Array.isArray(claims));\n    // logger.debug(`pageNumber ${pageNumber} is number?`, Number.isInteger(pageNumber));\n    const claimStartIndex = (pageNumber - 1) * CLAIMS_PER_PAGE;\n    const claimEndIndex = claimStartIndex + CLAIMS_PER_PAGE;\n    const pageOfClaims = claims.slice(claimStartIndex, claimEndIndex);\n    return pageOfClaims;\n  },\n  determineTotalPages (claims) {\n    if (!claims) {\n      return 0;\n    } else {\n      const totalClaims = claims.length;\n      if (totalClaims < CLAIMS_PER_PAGE) {\n        return 1;\n      }\n      const fullPages = Math.floor(totalClaims / CLAIMS_PER_PAGE);\n      const remainder = totalClaims % CLAIMS_PER_PAGE;\n      if (remainder === 0) {\n        return fullPages;\n      }\n      return fullPages + 1;\n    }\n  },\n  determinePreviousPage (currentPage) {\n    if (currentPage === 1) {\n      return null;\n    }\n    return currentPage - 1;\n  },\n  determineNextPage (totalPages, currentPage) {\n    if (currentPage === totalPages) {\n      return null;\n    }\n    return currentPage + 1;\n  },\n  determineTotalClaims (claims) {\n    if (!claims) {\n      return 0;\n    }\n    return claims.length;\n  },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/channelPagination.js","const { details: host } = require('../config/siteConfig.js');\nconst handlePageRender = require('../helpers/handlePageRender.jsx');\n\nmodule.exports = (app) => {\n  // route for the home page\n  app.get('/', (req, res) => {\n    handlePageRender(req, res);\n  });\n  // route to display login page\n  app.get('/login', (req, res) => {\n    handlePageRender(req, res);\n  });\n  // route to show 'about' page\n  app.get('/about', (req, res) => {\n    handlePageRender(req, res);\n  });\n  // route to display a list of the trending images\n  app.get('/trending', (req, res) => {\n    res.status(301).redirect('/popular');\n  });\n  app.get('/popular', (req, res) => {\n    handlePageRender(req, res);\n  });\n  // route to display a list of the trending images\n  app.get('/new', (req, res) => {\n    handlePageRender(req, res);\n  });\n  // route to send embedable video player (for twitter)\n  app.get('/embed/:claimId/:name', ({ params }, res) => {\n    const claimId = params.claimId;\n    const name = params.name;\n    // get and render the content\n    res.status(200).render('embed', { layout: 'embed', host, claimId, name });\n  });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./routes/page-routes.js","import * as actions from 'constants/publish_action_types';\nimport { LOGIN } from 'constants/publish_channel_select_states';\nconst { publishing } = require('../../config/siteConfig.js');\n\nconst initialState = {\n  disabled          : publishing.disabled,\n  disabledMessage   : publishing.disabledMessage,\n  publishInChannel  : false,\n  selectedChannel   : LOGIN,\n  showMetadataInputs: false,\n  status            : {\n    status : null,\n    message: null,\n  },\n  error: {\n    file         : null,\n    url          : null,\n    channel      : null,\n    publishSubmit: null,\n  },\n  file    : null,\n  claim   : '',\n  metadata: {\n    title      : '',\n    description: '',\n    license    : '',\n    nsfw       : false,\n  },\n  thumbnail: null,\n};\n\nexport default function (state = initialState, action) {\n  switch (action.type) {\n    case actions.FILE_SELECTED:\n      return Object.assign({}, initialState, {  // note: clears to initial state\n        file: action.data,\n      });\n    case actions.FILE_CLEAR:\n      return initialState;\n    case actions.METADATA_UPDATE:\n      return Object.assign({}, state, {\n        metadata: Object.assign({}, state.metadata, {\n          [action.data.name]: action.data.value,\n        }),\n      });\n    case actions.CLAIM_UPDATE:\n      return Object.assign({}, state, {\n        claim: action.data,\n      });\n    case actions.SET_PUBLISH_IN_CHANNEL:\n      return Object.assign({}, state, {\n        publishInChannel: action.channel,\n      });\n    case actions.PUBLISH_STATUS_UPDATE:\n      return Object.assign({}, state, {\n        status: action.data,\n      });\n    case actions.ERROR_UPDATE:\n      return Object.assign({}, state, {\n        error: Object.assign({}, state.error, {\n          [action.data.name]: action.data.value,\n        }),\n      });\n    case actions.SELECTED_CHANNEL_UPDATE:\n      return Object.assign({}, state, {\n        selectedChannel: action.data,\n      });\n    case actions.TOGGLE_METADATA_INPUTS:\n      return Object.assign({}, state, {\n        showMetadataInputs: action.data,\n      });\n    case actions.THUMBNAIL_NEW:\n      return Object.assign({}, state, {\n        thumbnail: action.data,\n      });\n    default:\n      return state;\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./react/reducers/publish.js","import * as actions from 'constants/channel_action_types';\n\nconst initialState = {\n  loggedInChannel: {\n    name   : null,\n    shortId: null,\n    longId : null,\n  },\n};\n\nexport default function (state = initialState, action) {\n  switch (action.type) {\n    case actions.CHANNEL_UPDATE:\n      return Object.assign({}, state, {\n        loggedInChannel: action.data,\n      });\n    default:\n      return state;\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./react/reducers/channel.js","import * as actions from 'constants/show_action_types';\nimport { LOCAL_CHECK, ERROR } from 'constants/asset_display_states';\n\nconst initialState = {\n  request: {\n    error: null,\n    type : null,\n    id   : null,\n  },\n  requestList : {},\n  channelList : {},\n  assetList   : {},\n  displayAsset: {\n    error : null,\n    status: LOCAL_CHECK,\n  },\n};\n\nexport default function (state = initialState, action) {\n  switch (action.type) {\n    // handle request\n    case actions.REQUEST_ERROR:\n      return Object.assign({}, state, {\n        request: Object.assign({}, state.request, {\n          error: action.data,\n        }),\n      });\n    case actions.REQUEST_UPDATE:\n      return Object.assign({}, state, {\n        request: Object.assign({}, state.request, {\n          type: action.data.requestType,\n          id  : action.data.requestId,\n        }),\n      });\n    // store requests\n    case actions.REQUEST_LIST_ADD:\n      return Object.assign({}, state, {\n        requestList: Object.assign({}, state.requestList, {\n          [action.data.id]: {\n            error: action.data.error,\n            key  : action.data.key,\n          },\n        }),\n      });\n    // asset data\n    case actions.ASSET_ADD:\n      return Object.assign({}, state, {\n        assetList: Object.assign({}, state.assetList, {\n          [action.data.id]: {\n            error    : action.data.error,\n            name     : action.data.name,\n            claimId  : action.data.claimId,\n            shortId  : action.data.shortId,\n            claimData: action.data.claimData,\n          },\n        }),\n      });\n    // channel data\n    case actions.CHANNEL_ADD:\n      return Object.assign({}, state, {\n        channelList: Object.assign({}, state.channelList, {\n          [action.data.id]: {\n            name      : action.data.name,\n            longId    : action.data.longId,\n            shortId   : action.data.shortId,\n            claimsData: action.data.claimsData,\n          },\n        }),\n      });\n    case actions.CHANNEL_CLAIMS_UPDATE_SUCCESS:\n      return Object.assign({}, state, {\n        channelList: Object.assign({}, state.channelList, {\n          [action.data.channelListId]: Object.assign({}, state.channelList[action.data.channelListId], {\n            claimsData: action.data.claimsData,\n          }),\n        }),\n      });\n    // display an asset\n    case actions.FILE_AVAILABILITY_UPDATE:\n      return Object.assign({}, state, {\n        displayAsset: Object.assign({}, state.displayAsset, {\n          status: action.data,\n        }),\n      });\n    case actions.DISPLAY_ASSET_ERROR:\n      return Object.assign({}, state, {\n        displayAsset: Object.assign({}, state.displayAsset, {\n          error : action.data,\n          status: ERROR,\n        }),\n      });\n    default:\n      return state;\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./react/reducers/show.js","const siteConfig = require('../../config/siteConfig.js');\n\nconst {\n  analytics: {\n    googleId: googleAnalyticsId,\n  },\n  assetDefaults: {\n    thumbnail: defaultThumbnail,\n    description: defaultDescription,\n  },\n  details: {\n    description,\n    host,\n    title,\n    twitter,\n  },\n} = siteConfig;\n\nconst initialState = {\n  description,\n  googleAnalyticsId,\n  host,\n  title,\n  twitter,\n  defaultDescription,\n  defaultThumbnail,\n};\n\nexport default function (state = initialState, action) {\n  switch (action.type) {\n    default:\n      return state;\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./react/reducers/site.js","module.exports = require(\"react-ga\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"react-ga\"\n// module id = 87\n// module chunks = 0","import React from 'react';\nimport SEO from 'components/SEO';\nimport NavBar from 'containers/NavBar';\nimport PublishTool from 'containers/PublishTool';\n\nclass HomePage extends React.Component {\n  render () {\n    return (\n      <div className={'row row--tall flex-container--column'}>\n        <SEO />\n        <NavBar />\n        <div className={'row row--tall row--padded flex-container--column'}>\n          <PublishTool />\n        </div>\n      </div>\n    );\n  }\n};\n\nexport default HomePage;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/HomePage/index.jsx","import React from 'react';\nimport Helmet from 'react-helmet';\nimport PropTypes from 'prop-types';\n\nimport { createPageTitle } from 'utils/pageTitle';\nimport { createMetaTags } from 'utils/metaTags';\nimport { createCanonicalLink } from 'utils/canonicalLink';\n\nclass SEO extends React.Component {\n  render () {\n    // props from state\n    const { defaultDescription, defaultThumbnail, siteDescription, siteHost, siteTitle, siteTwitter } = this.props;\n    // props from parent\n    const { asset, channel, pageUri } = this.props;\n    let { pageTitle } = this.props;\n    // create page title, tags, and canonical link\n    pageTitle = createPageTitle(siteTitle, pageTitle);\n    const metaTags = createMetaTags(siteDescription, siteHost, siteTitle, siteTwitter, asset, channel, defaultDescription, defaultThumbnail);\n    const canonicalLink = createCanonicalLink(asset, channel, pageUri, siteHost);\n    // render results\n    return (\n      <Helmet\n        title={pageTitle}\n        meta={metaTags}\n        link={[{rel: 'canonical', href: canonicalLink}]}\n      />\n    );\n  }\n};\n\nSEO.propTypes = {\n  pageTitle: PropTypes.string,\n  pageUri  : PropTypes.string,\n  channel  : PropTypes.object,\n  asset    : PropTypes.object,\n};\n\nexport default SEO;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/SEO/view.jsx","export const createPageTitle = (siteTitle, pageTitle) => {\n  if (!pageTitle) {\n    return `${siteTitle}`;\n  }\n  return `${siteTitle} - ${pageTitle}`;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/utils/pageTitle.js","const determineOgThumbnailContentType = (thumbnail) => {\n  if (thumbnail) {\n    const fileExt = thumbnail.substring(thumbnail.lastIndexOf('.'));\n    switch (fileExt) {\n      case 'jpeg':\n      case 'jpg':\n        return 'image/jpeg';\n      case 'png':\n        return 'image/png';\n      case 'gif':\n        return 'image/gif';\n      case 'mp4':\n        return 'video/mp4';\n      default:\n        return 'image/jpeg';\n    }\n  }\n  return '';\n};\n\nconst createBasicMetaTags = (siteHost, siteDescription, siteTitle, siteTwitter) => {\n  return [\n    {property: 'og:title', content: siteTitle},\n    {property: 'og:url', content: siteHost},\n    {property: 'og:site_name', content: siteTitle},\n    {property: 'og:description', content: siteDescription},\n    {property: 'twitter:site', content: siteTwitter},\n    {property: 'twitter:card', content: 'summary'},\n  ];\n};\n\nconst createChannelMetaTags = (siteTitle, siteHost, siteTwitter, channel) => {\n  const { name, longId } = channel;\n  return [\n    {property: 'og:title', content: `${name} on ${siteTitle}`},\n    {property: 'og:url', content: `${siteHost}/${name}:${longId}`},\n    {property: 'og:site_name', content: siteTitle},\n    {property: 'og:description', content: `${name}, a channel on ${siteTitle}`},\n    {property: 'twitter:site', content: siteTwitter},\n    {property: 'twitter:card', content: 'summary'},\n  ];\n};\n\nconst createAssetMetaTags = (siteHost, siteTitle, siteTwitter, asset, defaultDescription, defaultThumbnail) => {\n  const { claimData } = asset;\n  const { contentType } = claimData;\n  const embedUrl = `${siteHost}/${claimData.claimId}/${claimData.name}`;\n  const showUrl = `${siteHost}/${claimData.claimId}/${claimData.name}`;\n  const source = `${siteHost}/${claimData.claimId}/${claimData.name}.${claimData.fileExt}`;\n  const ogTitle = claimData.title || claimData.name;\n  const ogDescription = claimData.description || defaultDescription;\n  const ogThumbnailContentType = determineOgThumbnailContentType(claimData.thumbnail);\n  const ogThumbnail = claimData.thumbnail || defaultThumbnail;\n  const metaTags = [\n    {property: 'og:title', content: ogTitle},\n    {property: 'og:url', content: showUrl},\n    {property: 'og:site_name', content: siteTitle},\n    {property: 'og:description', content: ogDescription},\n    {property: 'og:image:width', content: 600},\n    {property: 'og:image:height', content: 315},\n    {property: 'twitter:site', content: siteTwitter},\n  ];\n  if (contentType === 'video/mp4' || contentType === 'video/webm') {\n    metaTags.push({property: 'og:video', content: source});\n    metaTags.push({property: 'og:video:secure_url', content: source});\n    metaTags.push({property: 'og:video:type', content: contentType});\n    metaTags.push({property: 'og:image', content: ogThumbnail});\n    metaTags.push({property: 'og:image:type', content: ogThumbnailContentType});\n    metaTags.push({property: 'og:type', content: 'video'});\n    metaTags.push({property: 'twitter:card', content: 'player'});\n    metaTags.push({property: 'twitter:player', content: embedUrl});\n    metaTags.push({property: 'twitter:player:width', content: 600});\n    metaTags.push({property: 'twitter:text:player_width', content: 600});\n    metaTags.push({property: 'twitter:player:height', content: 337});\n    metaTags.push({property: 'twitter:player:stream', content: source});\n    metaTags.push({property: 'twitter:player:stream:content_type', content: contentType});\n  } else {\n    metaTags.push({property: 'og:image', content: source});\n    metaTags.push({property: 'og:image:type', content: contentType});\n    metaTags.push({property: 'og:type', content: 'article'});\n    metaTags.push({property: 'twitter:card', content: 'summary_large_image'});\n  }\n  return metaTags;\n};\n\nexport const createMetaTags = (siteDescription, siteHost, siteTitle, siteTwitter, asset, channel, defaultDescription, defaultThumbnail) => {\n  if (asset) {\n    return createAssetMetaTags(siteHost, siteTitle, siteTwitter, asset, defaultDescription, defaultThumbnail);\n  };\n  if (channel) {\n    return createChannelMetaTags(siteHost, siteTitle, siteTwitter, channel);\n  };\n  return createBasicMetaTags(siteDescription, siteHost, siteTitle, siteTwitter);\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/utils/metaTags.js","const createBasicCanonicalLink = (page, siteHost) => {\n  return `${siteHost}/${page}`;\n};\n\nconst createAssetCanonicalLink = (asset, siteHost) => {\n  let channelName, certificateId, name, claimId;\n  if (asset.claimData) {\n    ({ channelName, certificateId, name, claimId } = asset.claimData);\n  };\n  if (channelName) {\n    return `${siteHost}/${channelName}:${certificateId}/${name}`;\n  };\n  return `${siteHost}/${claimId}/${name}`;\n};\n\nconst createChannelCanonicalLink = (channel, siteHost) => {\n  const { name, longId } = channel;\n  return `${siteHost}/${name}:${longId}`;\n};\n\nexport const createCanonicalLink = (asset, channel, page, siteHost) => {\n  if (asset) {\n    return createAssetCanonicalLink(asset, siteHost);\n  }\n  if (channel) {\n    return createChannelCanonicalLink(channel, siteHost);\n  }\n  return createBasicCanonicalLink(page, siteHost);\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/utils/canonicalLink.js","import React from 'react';\nimport { NavLink, withRouter } from 'react-router-dom';\nimport Logo from 'components/Logo';\nimport NavBarChannelDropdown from 'components/NavBarChannelOptionsDropdown';\nimport request from 'utils/request';\n\nconst VIEW = 'VIEW';\nconst LOGOUT = 'LOGOUT';\n\nclass NavBar extends React.Component {\n  constructor (props) {\n    super(props);\n    this.checkForLoggedInUser = this.checkForLoggedInUser.bind(this);\n    this.logoutUser = this.logoutUser.bind(this);\n    this.handleSelection = this.handleSelection.bind(this);\n  }\n  componentDidMount () {\n    // check to see if the user is already logged in\n    this.checkForLoggedInUser();\n  }\n  checkForLoggedInUser () {\n    const params = {credentials: 'include'};\n    request('/user', params)\n      .then(({ data }) => {\n        this.props.onChannelLogin(data.channelName, data.shortChannelId, data.channelClaimId);\n      })\n      .catch(error => {\n        console.log('/user error:', error.message);\n      });\n  }\n  logoutUser () {\n    const params = {credentials: 'include'};\n    request('/logout', params)\n      .then(() => {\n        this.props.onChannelLogout();\n      })\n      .catch(error => {\n        console.log('/logout error', error.message);\n      });\n  }\n  handleSelection (event) {\n    const value = event.target.selectedOptions[0].value;\n    switch (value) {\n      case LOGOUT:\n        this.logoutUser();\n        break;\n      case VIEW:\n        // redirect to channel page\n        this.props.history.push(`/${this.props.channelName}:${this.props.channelLongId}`);\n        break;\n      default:\n        break;\n    }\n  }\n  render () {\n    const { siteDescription } =  this.props;\n    return (\n      <div className='row row--wide nav-bar'>\n        <div className='row row--padded row--short flex-container--row flex-container--space-between-center'>\n          <Logo />\n          <div className='nav-bar--center'>\n            <span className='nav-bar-tagline'>{siteDescription}</span>\n          </div>\n          <div className='nav-bar--right'>\n            <NavLink className='nav-bar-link link--nav' activeClassName='link--nav-active' to='/' exact>Publish</NavLink>\n            <NavLink className='nav-bar-link link--nav'  activeClassName='link--nav-active' to='/about'>About</NavLink>\n            { this.props.channelName ? (\n              <NavBarChannelDropdown\n                channelName={this.props.channelName}\n                handleSelection={this.handleSelection}\n                defaultSelection={this.props.channelName}\n                VIEW={VIEW}\n                LOGOUT={LOGOUT}\n              />\n            ) : (\n              <NavLink id='nav-bar-login-link' className='nav-bar-link link--nav' activeClassName='link--nav-active' to='/login'>Channel</NavLink>\n            )}\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n\nexport default withRouter(NavBar);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/NavBar/view.jsx","import React from 'react';\nimport { Link } from 'react-router-dom';\n\nfunction Logo () {\n  return (\n    <svg version='1.1' id='Layer_1' x='0px' y='0px' height='24px' viewBox='0 0 80 31' enableBackground='new 0 0 80 31' className='nav-bar-logo'>\n      <Link to='/'>\n        <title>Logo</title>\n        <desc>Spee.ch logo</desc>\n        <g id='About'>\n          <g id='Publish-Form-V2-_x28_filled_x29_' transform='translate(-42.000000, -23.000000)'>\n            <g id='Group-17' transform='translate(42.000000, 22.000000)'>\n              <text transform='matrix(1 0 0 1 0 20)' fontSize='25' fontFamily='Roboto'>Spee&lt;h</text>\n              <g id='Group-16' transform='translate(0.000000, 30.000000)'>\n                <path id='Line-8' fill='none' stroke='#09F911' strokeWidth='1' strokeLinecap='square' d='M0.5,1.5h15' />\n                <path id='Line-8-Copy' fill='none' stroke='#029D74' strokeWidth='1' strokeLinecap='square' d='M16.5,1.5h15' />\n                <path id='Line-8-Copy-2' fill='none' stroke='#E35BD8' strokeWidth='1' strokeLinecap='square' d='M32.5,1.5h15' />\n                <path id='Line-8-Copy-3' fill='none' stroke='#4156C5' strokeWidth='1' strokeLinecap='square' d='M48.5,1.5h15' />\n                <path id='Line-8-Copy-4' fill='none' stroke='#635688' strokeWidth='1' strokeLinecap='square' d='M64.5,1.5h15' />\n              </g>\n            </g>\n          </g>\n        </g>\n      </Link>\n    </svg>\n  );\n};\n\nexport default Logo;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/Logo/index.jsx","import React from 'react';\n\nfunction NavBarChannelDropdown ({ channelName, handleSelection, defaultSelection, VIEW, LOGOUT }) {\n  return (\n    <select type='text' id='nav-bar-channel-select' className='select select--arrow link--nav' onChange={handleSelection} value={defaultSelection}>\n      <option id='nav-bar-channel-select-channel-option'>{channelName}</option>\n      <option value={VIEW}>View</option>\n      <option value={LOGOUT}>Logout</option>\n    </select>\n  );\n};\n\nexport default NavBarChannelDropdown;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/NavBarChannelOptionsDropdown/index.jsx","module.exports = require(\"cross-fetch/polyfill\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"cross-fetch/polyfill\"\n// module id = 96\n// module chunks = 0","import {connect} from 'react-redux';\nimport View from './view';\n\nconst mapStateToProps = ({ publish }) => {\n  return {\n    disabled: publish.disabled,\n    file    : publish.file,\n    status  : publish.status.status,\n  };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishTool/index.js","import React from 'react';\nimport Dropzone from 'containers/Dropzone';\nimport PublishDetails from 'containers/PublishDetails';\nimport PublishStatus from 'containers/PublishStatus';\nimport PublishDisabledMessage from 'containers/PublishDisabledMessage';\n\nclass PublishTool extends React.Component {\n  render () {\n    if (this.props.disabled) {\n      console.log('publish is disabled');\n      return (\n        <PublishDisabledMessage />\n      );\n    } else {\n      console.log('publish is not disabled');\n      if (this.props.file) {\n        if (this.props.status) {\n          return (\n            <PublishStatus />\n          );\n        } else {\n          return <PublishDetails />;\n        }\n      }\n      return <Dropzone />;\n    }\n  }\n};\n\nexport default PublishTool;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishTool/view.jsx","import React from 'react';\nimport { validateFile } from 'utils/file';\nimport PublishPreview from 'components/PublishPreview';\n\nclass Dropzone extends React.Component {\n  constructor (props) {\n    super(props);\n    this.state = {\n      dragOver  : false,\n      mouseOver : false,\n      dimPreview: false,\n    };\n    this.handleDrop = this.handleDrop.bind(this);\n    this.handleDragOver = this.handleDragOver.bind(this);\n    this.handleDragEnd = this.handleDragEnd.bind(this);\n    this.handleDragEnter = this.handleDragEnter.bind(this);\n    this.handleDragLeave = this.handleDragLeave.bind(this);\n    this.handleMouseEnter = this.handleMouseEnter.bind(this);\n    this.handleMouseLeave = this.handleMouseLeave.bind(this);\n    this.handleClick = this.handleClick.bind(this);\n    this.handleFileInput = this.handleFileInput.bind(this);\n    this.chooseFile = this.chooseFile.bind(this);\n  }\n  handleDrop (event) {\n    event.preventDefault();\n    this.setState({dragOver: false});\n    // if dropped items aren't files, reject them\n    const dt = event.dataTransfer;\n    if (dt.items) {\n      if (dt.items[0].kind === 'file') {\n        const droppedFile = dt.items[0].getAsFile();\n        this.chooseFile(droppedFile);\n      }\n    }\n  }\n  handleDragOver (event) {\n    event.preventDefault();\n  }\n  handleDragEnd (event) {\n    var dt = event.dataTransfer;\n    if (dt.items) {\n      for (var i = 0; i < dt.items.length; i++) {\n        dt.items.remove(i);\n      }\n    } else {\n      event.dataTransfer.clearData();\n    }\n  }\n  handleDragEnter () {\n    this.setState({dragOver: true, dimPreview: true});\n  }\n  handleDragLeave () {\n    this.setState({dragOver: false, dimPreview: false});\n  }\n  handleMouseEnter () {\n    this.setState({mouseOver: true, dimPreview: true});\n  }\n  handleMouseLeave () {\n    this.setState({mouseOver: false, dimPreview: false});\n  }\n  handleClick (event) {\n    event.preventDefault();\n    document.getElementById('file_input').click();\n  }\n  handleFileInput (event) {\n    event.preventDefault();\n    const fileList = event.target.files;\n    this.chooseFile(fileList[0]);\n  }\n  chooseFile (file) {\n    if (file) {\n      try {\n        validateFile(file); // validate the file's name, type, and size\n      } catch (error) {\n        return this.props.setFileError(error.message);\n      }\n      // stage it so it will be ready when the publish button is clicked\n      this.props.selectFile(file);\n    }\n  }\n  render () {\n    return (\n      <div className='row row--tall flex-container--column'>\n        <form>\n          <input className='input-file' type='file' id='file_input' name='file_input' accept='video/*,image/*' onChange={this.handleFileInput} encType='multipart/form-data' />\n        </form>\n        <div id='preview-dropzone' className={'row row--padded row--tall dropzone' + (this.state.dragOver ? ' dropzone--drag-over' : '')} onDrop={this.handleDrop} onDragOver={this.handleDragOver} onDragEnd={this.handleDragEnd} onDragEnter={this.handleDragEnter} onDragLeave={this.handleDragLeave} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave} onClick={this.handleClick}>\n          {this.props.file ? (\n            <div>\n              <PublishPreview\n                dimPreview={this.state.dimPreview}\n                file={this.props.file}\n                thumbnail={this.props.thumbnail}\n              />\n              <div id='dropzone-text-holder' className={'flex-container--column flex-container--center-center'}>\n                { this.state.dragOver ? (\n                  <div id='dropzone-dragover'>\n                    <p className='blue'>Drop it.</p>\n                  </div>\n                ) : (\n                  null\n                )}\n                { this.state.mouseOver ? (\n                  <div id='dropzone-instructions'>\n                    <p className='info-message-placeholder info-message--failure' id='input-error-file-selection'>{this.props.fileError}</p>\n                    <p>Drag & drop image or video here to publish</p>\n                    <p className='fine-print'>OR</p>\n                    <p className='blue--underlined'>CHOOSE FILE</p>\n                  </div>\n                ) : (\n                  null\n                )}\n              </div>\n            </div>\n          ) : (\n            <div id='dropzone-text-holder' className={'flex-container--column flex-container--center-center'}>\n              { this.state.dragOver ? (\n                <div id='dropzone-dragover'>\n                  <p className='blue'>Drop it.</p>\n                </div>\n              ) : (\n                <div id='dropzone-instructions'>\n                  <p className='info-message-placeholder info-message--failure' id='input-error-file-selection'>{this.props.fileError}</p>\n                  <p>Drag & drop image or video here to publish</p>\n                  <p className='fine-print'>OR</p>\n                  <p className='blue--underlined'>CHOOSE FILE</p>\n                </div>\n              )}\n            </div>\n          )}\n        </div>\n      </div>\n    );\n  }\n};\n\nexport default Dropzone;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/Dropzone/view.jsx","module.exports = {\n  validateFile (file) {\n    if (!file) {\n      throw new Error('no file provided');\n    }\n    if (/'/.test(file.name)) {\n      throw new Error('apostrophes are not allowed in the file name');\n    }\n    // validate size and type\n    switch (file.type) {\n      case 'image/jpeg':\n      case 'image/jpg':\n      case 'image/png':\n        if (file.size > 10000000) {\n          throw new Error('Sorry, images are limited to 10 megabytes.');\n        }\n        break;\n      case 'image/gif':\n        if (file.size > 50000000) {\n          throw new Error('Sorry, GIFs are limited to 50 megabytes.');\n        }\n        break;\n      case 'video/mp4':\n        if (file.size > 50000000) {\n          throw new Error('Sorry, videos are limited to 50 megabytes.');\n        }\n        break;\n      default:\n        throw new Error(file.type + ' is not a supported file type. Only, .jpeg, .png, .gif, and .mp4 files are currently supported.');\n    }\n  },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/utils/file.js","import React from 'react';\nimport PropTypes from 'prop-types';\n\nclass PublishPreview extends React.Component {\n  constructor (props) {\n    super(props);\n    this.state = {\n      imgSource       : '',\n      defaultThumbnail: '/assets/img/video_thumb_default.png',\n    };\n  }\n  componentDidMount () {\n    this.setPreviewImageSource(this.props.file);\n  }\n  componentWillReceiveProps (newProps) {\n    if (newProps.file !== this.props.file) {\n      this.setPreviewImageSource(newProps.file);\n    }\n    if (newProps.thumbnail !== this.props.thumbnail) {\n      if (newProps.thumbnail) {\n        this.setPreviewImageSourceFromFile(newProps.thumbnail);\n      } else {\n        this.setState({imgSource: this.state.defaultThumbnail});\n      }\n    }\n  }\n  setPreviewImageSourceFromFile (file) {\n    const previewReader = new FileReader();\n    previewReader.readAsDataURL(file);\n    previewReader.onloadend = () => {\n      this.setState({imgSource: previewReader.result});\n    };\n  }\n  setPreviewImageSource (file) {\n    if (file.type !== 'video/mp4') {\n      this.setPreviewImageSourceFromFile(file);\n    } else {\n      if (this.props.thumbnail) {\n        this.setPreviewImageSourceFromFile(this.props.thumbnail);\n      }\n      this.setState({imgSource: this.state.defaultThumbnail});\n    }\n  }\n  render () {\n    return (\n      <img\n        id='dropzone-preview'\n        src={this.state.imgSource}\n        className={this.props.dimPreview ? 'dim' : ''}\n        alt='publish preview'\n      />\n    );\n  }\n};\n\nPublishPreview.propTypes = {\n  dimPreview: PropTypes.bool.isRequired,\n  file      : PropTypes.object.isRequired,\n  thumbnail : PropTypes.object,\n};\n\nexport default PublishPreview;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/PublishPreview/index.jsx","import {connect} from 'react-redux';\nimport {clearFile, startPublish} from 'actions/publish';\nimport View from './view';\n\nconst mapStateToProps = ({ channel, publish }) => {\n  return {\n    file: publish.file,\n  };\n};\n\nconst mapDispatchToProps = {\n  clearFile,\n  startPublish,\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishDetails/index.js","import React from 'react';\nimport { withRouter } from 'react-router-dom';\nimport Dropzone from 'containers/Dropzone';\nimport PublishTitleInput from 'containers/PublishTitleInput';\nimport PublishUrlInput from 'containers/PublishUrlInput';\nimport PublishThumbnailInput from 'containers/PublishThumbnailInput';\nimport PublishMetadataInputs from 'containers/PublishMetadataInputs';\nimport ChannelSelect from 'containers/ChannelSelect';\n\nclass PublishDetails extends React.Component {\n  constructor (props) {\n    super(props)\n    this.onPublishSubmit = this.onPublishSubmit.bind(this);\n  }\n  onPublishSubmit () {\n    this.props.startPublish(this.props.history);\n  }\n  render () {\n    return (\n      <div className='row row--no-bottom'>\n        <div className='column column--10'>\n          <PublishTitleInput />\n        </div>\n        {/* left column */}\n        <div className='column column--5 column--sml-10' >\n          <div className='row row--padded'>\n            <Dropzone />\n          </div>\n        </div>\n        {/* right column */}\n        <div className='column column--5 column--sml-10 align-content-top'>\n          <div id='publish-active-area' className='row row--padded'>\n            <div className='row row--padded row--no-top row--wide'>\n              <PublishUrlInput />\n            </div>\n            <div className='row row--padded row--no-top row--wide'>\n              <ChannelSelect />\n            </div>\n            { (this.props.file.type === 'video/mp4') && (\n              <div className='row row--padded row--no-top row--wide '>\n                <PublishThumbnailInput />\n              </div>\n            )}\n            <div className='row row--padded row--no-top row--no-bottom row--wide'>\n              <PublishMetadataInputs />\n            </div>\n            <div className='row row--wide align-content-center'>\n              <button id='publish-submit' className='button--primary button--large' onClick={this.onPublishSubmit}>Publish</button>\n            </div>\n            <div className='row row--padded row--no-bottom align-content-center'>\n              <button className='button--cancel' onClick={this.props.clearFile}>Cancel</button>\n            </div>\n            <div className='row row--short align-content-center'>\n              <p className='fine-print'>By clicking 'Publish', you affirm that you have the rights to publish this content to the LBRY network, and that you understand the properties of publishing it to a decentralized, user-controlled network. <a className='link--primary' target='_blank' href='https://lbry.io/learn'>Read more.</a></p>\n            </div>\n          </div>\n        </div>\n      </div>\n    );\n  }\n};\n\nexport default withRouter(PublishDetails);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishDetails/view.jsx","import {connect} from 'react-redux';\nimport {updateMetadata} from 'actions/publish';\nimport View from './view';\n\nconst mapStateToProps = ({ publish }) => {\n  return {\n    title: publish.metadata.title,\n  };\n};\n\nconst mapDispatchToProps = dispatch => {\n  return {\n    onMetadataChange: (name, value) => {\n      dispatch(updateMetadata(name, value));\n    },\n  };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishTitleInput/index.js","import React from 'react';\n\nclass PublishTitleInput extends React.Component {\n  constructor (props) {\n    super(props);\n    this.handleInput = this.handleInput.bind(this);\n  }\n  handleInput (e) {\n    const name = e.target.name;\n    const value = e.target.value;\n    this.props.onMetadataChange(name, value);\n  }\n  render () {\n    return (\n      <input type='text' id='publish-title' className='input-text text--large input-text--full-width' name='title' placeholder='Give your post a title...' onChange={this.handleInput} value={this.props.title} />\n    );\n  }\n}\n\nexport default PublishTitleInput;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishTitleInput/view.jsx","import {updateClaim, updateError} from 'actions/publish';\nimport {connect} from 'react-redux';\nimport View from './view';\n\nconst mapStateToProps = ({ channel, publish }) => {\n  return {\n    loggedInChannelName   : channel.loggedInChannel.name,\n    loggedInChannelShortId: channel.loggedInChannel.shortId,\n    fileName              : publish.file.name,\n    publishInChannel      : publish.publishInChannel,\n    selectedChannel       : publish.selectedChannel,\n    claim                 : publish.claim,\n    urlError              : publish.error.url,\n  };\n};\n\nconst mapDispatchToProps = dispatch => {\n  return {\n    onClaimChange: (value) => {\n      dispatch(updateClaim(value));\n      dispatch(updateError('publishSubmit', null));\n    },\n    onUrlError: (value) => {\n      dispatch(updateError('url', value));\n    },\n  };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishUrlInput/index.js","import React from 'react';\nimport request from 'utils/request';\nimport UrlMiddle from 'components/PublishUrlMiddleDisplay';\n\nclass PublishUrlInput extends React.Component {\n  constructor (props) {\n    super(props);\n    this.handleInput = this.handleInput.bind(this);\n  }\n  componentDidMount () {\n    const { claim, fileName } = this.props;\n    if (!claim) {\n      this.setClaimName(fileName);\n    }\n  }\n  componentWillReceiveProps ({ claim, fileName }) {\n    // if a new file was chosen, update the claim name\n    if (fileName !== this.props.fileName) {\n      return this.setClaimName(fileName);\n    }\n    // if the claim has updated, check its availability\n    if (claim !== this.props.claim) {\n      this.validateClaim(claim);\n    }\n  }\n  handleInput (event) {\n    let value = event.target.value;\n    value = this.cleanseInput(value);\n    // update the state\n    this.props.onClaimChange(value);\n  }\n  cleanseInput (input) {\n    input = input.replace(/\\s+/g, '-'); // replace spaces with dashes\n    input = input.replace(/[^A-Za-z0-9-]/g, '');  // remove all characters that are not A-Z, a-z, 0-9, or '-'\n    return input;\n  }\n  setClaimName (fileName) {\n    const fileNameWithoutEnding = fileName.substring(0, fileName.lastIndexOf('.'));\n    const cleanClaimName = this.cleanseInput(fileNameWithoutEnding);\n    this.props.onClaimChange(cleanClaimName);\n  }\n  validateClaim (claim) {\n    if (!claim) {\n      return this.props.onUrlError('Enter a url above');\n    }\n    request(`/api/claim/availability/${claim}`)\n      .then(() => {\n        this.props.onUrlError(null);\n      })\n      .catch((error) => {\n        this.props.onUrlError(error.message);\n      });\n  }\n  render () {\n    const { claim, loggedInChannelName, loggedInChannelShortId, publishInChannel, selectedChannel, urlError } = this.props;\n    return (\n      <div className='column column--10 column--sml-10'>\n        <div className='input-text--primary span--relative'>\n          <span className='url-text--secondary'>spee.ch / </span>\n          <UrlMiddle\n            publishInChannel={publishInChannel}\n            selectedChannel={selectedChannel}\n            loggedInChannelName={loggedInChannelName}\n            loggedInChannelShortId={loggedInChannelShortId}\n          />\n          <input type='text' id='claim-name-input' className='input-text' name='claim' placeholder='your-url-here' onChange={this.handleInput} value={claim} />\n          { (claim && !urlError) && <span id='input-success-claim-name' className='info-message--success span--absolute'>{'\\u2713'}</span> }\n          { urlError && <span id='input-success-channel-name' className='info-message--failure span--absolute'>{'\\u2716'}</span> }\n        </div>\n        <div>\n          { urlError ? (\n            <p id='input-error-claim-name' className='info-message--failure'>{urlError}</p>\n          ) : (\n            <p className='info-message'>Choose a custom url</p>\n          )}\n        </div>\n      </div>\n    );\n  }\n}\n\nexport default PublishUrlInput;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishUrlInput/view.jsx","import React from 'react';\nimport PropTypes from 'prop-types';\n\nfunction UrlMiddle ({publishInChannel, selectedChannel, loggedInChannelName, loggedInChannelShortId}) {\n  if (publishInChannel) {\n    if (selectedChannel === loggedInChannelName) {\n      return <span id='url-channel' className='url-text--secondary'>{loggedInChannelName}:{loggedInChannelShortId} /</span>;\n    }\n    return <span id='url-channel-placeholder' className='url-text--secondary tooltip'>@channel<span\n      className='tooltip-text'>Select a channel below</span> /</span>;\n  }\n  return (\n    <span id='url-no-channel-placeholder' className='url-text--secondary tooltip'>xyz<span className='tooltip-text'>This will be a random id</span> /</span>\n  );\n}\n\nUrlMiddle.propTypes = {\n  publishInChannel      : PropTypes.bool.isRequired,\n  loggedInChannelName   : PropTypes.string,\n  loggedInChannelShortId: PropTypes.string,\n};\n\nexport default UrlMiddle;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/PublishUrlMiddleDisplay/index.jsx","import { connect } from 'react-redux';\nimport { onNewThumbnail } from 'actions/publish';\nimport View from './view';\n\nconst mapStateToProps = ({ publish: { file } }) => {\n  return {\n    file,\n  };\n};\n\nconst mapDispatchToProps = {\n  onNewThumbnail,\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishThumbnailInput/index.js","import React from 'react';\n\nfunction dataURItoBlob(dataURI) {\n  // convert base64/URLEncoded data component to raw binary data held in a string\n  let byteString = atob(dataURI.split(',')[1]);\n  // separate out the mime component\n  let mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];\n  // write the bytes of the string to a typed array\n  let ia = new Uint8Array(byteString.length);\n  for (let i = 0; i < byteString.length; i++) {\n    ia[i] = byteString.charCodeAt(i);\n  }\n  return new Blob([ia], {type: mimeString});\n}\n\nclass PublishThumbnailInput extends React.Component {\n  constructor (props) {\n    super(props);\n    this.state = {\n      videoSource   : null,\n      error         : null,\n      sliderMinRange: 1,\n      sliderMaxRange: null,\n      sliderValue   : null,\n    };\n    this.handleVideoLoadedData = this.handleVideoLoadedData.bind(this);\n    this.handleSliderChange = this.handleSliderChange.bind(this);\n    this.createThumbnail = this.createThumbnail.bind(this);\n  }\n  componentDidMount () {\n    const { file } = this.props;\n    this.setVideoSource(file);\n  }\n  componentWillReceiveProps (nextProps) {\n    // if file changes\n    if (nextProps.file && nextProps.file !== this.props.file) {\n      const { file } = nextProps;\n      this.setVideoSource(file);\n    };\n  }\n  setVideoSource (file) {\n    const previewReader = new FileReader();\n    previewReader.readAsDataURL(file);\n    previewReader.onloadend = () => {\n      const dataUri = previewReader.result;\n      const blob = dataURItoBlob(dataUri);\n      const videoSource = URL.createObjectURL(blob);\n      this.setState({ videoSource });\n    };\n  }\n  handleVideoLoadedData (event) {\n    const duration = event.target.duration;\n    const totalMinutes = Math.floor(duration / 60);\n    const totalSeconds = Math.floor(duration % 60);\n    // set the slider\n    this.setState({\n      sliderMaxRange: duration * 100,\n      sliderValue   : duration * 100 / 2,\n      totalMinutes,\n      totalSeconds,\n    });\n    // update the current time of the video\n    let video = document.getElementById('video-thumb-player');\n    video.currentTime = duration / 2;\n  }\n  handleSliderChange (event) {\n    const value = parseInt(event.target.value);\n    // update the slider value\n    this.setState({\n      sliderValue: value,\n    });\n    // update the current time of the video\n    let video = document.getElementById('video-thumb-player');\n    video.currentTime = value / 100;\n  }\n  createThumbnail () {\n    // take a snapshot\n    let video = document.getElementById('video-thumb-player');\n    let canvas = document.createElement('canvas');\n    canvas.width = video.videoWidth;\n    canvas.height = video.videoHeight;\n    canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);\n    const dataUrl = canvas.toDataURL();\n    const blob = dataURItoBlob(dataUrl);\n    const snapshot = new File([blob], `thumbnail.png`, {\n      type: 'image/png',\n    });\n    // set the thumbnail in redux store\n    if (snapshot) {\n      this.props.onNewThumbnail(snapshot);\n    }\n  }\n  render () {\n    const { error, videoSource, sliderMinRange, sliderMaxRange, sliderValue, totalMinutes, totalSeconds } = this.state;\n    return (\n      <div>\n        <label className='label'>Thumbnail:</label>\n        <video\n          id='video-thumb-player'\n          preload='metadata'\n          muted\n          style={{display: 'none'}}\n          playsInline\n          onLoadedData={this.handleVideoLoadedData}\n          src={videoSource}\n          onSeeked={this.createThumbnail}\n        />\n        {\n          sliderValue ? (\n            <div>\n              <div className='flex-container--row flex-container--space-between-center' style={{width: '100%'}}>\n                <span className='info-message'>0'00\"</span>\n                <span className='info-message'>{totalMinutes}'{totalSeconds}\"</span>\n              </div>\n              <div>\n                <input\n                  type='range'\n                  min={sliderMinRange}\n                  max={sliderMaxRange}\n                  value={sliderValue}\n                  className='slider'\n                  onChange={this.handleSliderChange}\n                />\n              </div>\n            </div>\n          ) : (\n            <p className='info-message' >loading... </p>\n          )\n        }\n        { error ? (\n          <p className='info-message--failure'>{error}</p>\n        ) : (\n          <p className='info-message'>Use slider to set thumbnail</p>\n        )}\n      </div>\n    );\n  }\n}\n\nexport default PublishThumbnailInput;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishThumbnailInput/view.jsx","import {connect} from 'react-redux';\nimport {updateMetadata, toggleMetadataInputs} from 'actions/publish';\nimport View from './view';\n\nconst mapStateToProps = ({ publish }) => {\n  return {\n    showMetadataInputs: publish.showMetadataInputs,\n    description       : publish.metadata.description,\n    license           : publish.metadata.license,\n    nsfw              : publish.metadata.nsfw,\n  };\n};\n\nconst mapDispatchToProps = dispatch => {\n  return {\n    onMetadataChange: (name, value) => {\n      dispatch(updateMetadata(name, value));\n    },\n    onToggleMetadataInputs: (value) => {\n      dispatch(toggleMetadataInputs(value));\n    },\n  };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishMetadataInputs/index.js","import React from 'react';\nimport ExpandingTextArea from 'components/ExpandingTextArea';\n\nclass PublishMetadataInputs extends React.Component {\n  constructor (props) {\n    super(props);\n    this.toggleShowInputs = this.toggleShowInputs.bind(this);\n    this.handleInput = this.handleInput.bind(this);\n    this.handleSelect = this.handleSelect.bind(this);\n  }\n  toggleShowInputs () {\n    this.props.onToggleMetadataInputs(!this.props.showMetadataInputs);\n  }\n  handleInput (event) {\n    const target = event.target;\n    const value = target.type === 'checkbox' ? target.checked : target.value;\n    const name = target.name;\n    this.props.onMetadataChange(name, value);\n  }\n  handleSelect (event) {\n    const name = event.target.name;\n    const selectedOption = event.target.selectedOptions[0].value;\n    this.props.onMetadataChange(name, selectedOption);\n  }\n  render () {\n    return (\n      <div id='publish-details' className='row row--padded row--no-top row--wide'>\n        {this.props.showMetadataInputs && (\n          <div>\n            <div className='row row--no-top'>\n              <div className='column column--3 column--med-10 align-content-top'>\n                <label htmlFor='publish-license' className='label'>Description:</label>\n              </div><div className='column column--7 column--sml-10'>\n                <ExpandingTextArea\n                  id='publish-description'\n                  className='textarea textarea--primary textarea--full-width'\n                  rows={1}\n                  maxLength={2000}\n                  style={{ maxHeight: 200 }}\n                  name='description'\n                  placeholder='Optional description'\n                  value={this.props.description}\n                  onChange={this.handleInput} />\n              </div>\n            </div>\n\n            <div className='row row--no-top'>\n              <div className='column column--3 column--med-10'>\n                <label htmlFor='publish-license' className='label'>License:</label>\n              </div><div className='column column--7 column--sml-10'>\n                <select type='text' name='license' id='publish-license' className='select select--primary' onChange={this.handleSelect}>\n                  <option value=' '>Unspecified</option>\n                  <option value='Public Domain'>Public Domain</option>\n                  <option value='Creative Commons'>Creative Commons</option>\n                </select>\n              </div>\n            </div>\n\n            <div className='row row--no-top'>\n              <div className='column column--3'>\n                <label htmlFor='publish-nsfw' className='label'>Mature:</label>\n              </div><div className='column column--7'>\n                <input className='input-checkbox' type='checkbox' id='publish-nsfw' name='nsfw' value={this.props.nsfw} onChange={this.handleInput} />\n              </div>\n            </div>\n          </div>\n        )}\n        <button className='button--secondary' onClick={this.toggleShowInputs}>{this.props.showMetadataInputs ? 'less' : 'more'}</button>\n      </div>\n    );\n  }\n}\n\nexport default PublishMetadataInputs;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishMetadataInputs/view.jsx","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\n\nclass ExpandingTextarea extends Component {\n  constructor (props) {\n    super(props);\n    this._handleChange = this._handleChange.bind(this);\n  }\n  componentDidMount () {\n    this.adjustTextarea({});\n  }\n  _handleChange (event) {\n    const { onChange } = this.props;\n    if (onChange) onChange(event);\n    this.adjustTextarea(event);\n  }\n  adjustTextarea ({ target = this.el }) {\n    target.style.height = 0;\n    target.style.height = `${target.scrollHeight}px`;\n  }\n  render () {\n    const { ...rest } = this.props;\n    return (\n      <textarea\n        {...rest}\n        ref={x => this.el = x}\n        onChange={this._handleChange}\n      />\n    );\n  }\n}\n\nExpandingTextarea.propTypes = {\n  onChange: PropTypes.func,\n};\n\nexport default ExpandingTextarea;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/ExpandingTextArea/index.jsx","import {connect} from 'react-redux';\nimport {setPublishInChannel, updateSelectedChannel, updateError} from 'actions/publish';\nimport View from './view';\n\nconst mapStateToProps = ({ channel, publish }) => {\n  return {\n    loggedInChannelName: channel.loggedInChannel.name,\n    publishInChannel   : publish.publishInChannel,\n    selectedChannel    : publish.selectedChannel,\n    channelError       : publish.error.channel,\n  };\n};\n\nconst mapDispatchToProps = dispatch => {\n  return {\n    onPublishInChannelChange: (value) => {\n      dispatch(updateError('channel', null));\n      dispatch(setPublishInChannel(value));\n    },\n    onChannelSelect: (value) => {\n      dispatch(updateError('channel', null));\n      dispatch(updateSelectedChannel(value));\n    },\n  };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ChannelSelect/index.js","import React from 'react';\nimport ChannelLoginForm from 'containers/ChannelLoginForm';\nimport ChannelCreateForm from 'containers/ChannelCreateForm';\nimport * as states from 'constants/publish_channel_select_states';\n\nclass ChannelSelect extends React.Component {\n  constructor (props) {\n    super(props);\n    this.toggleAnonymousPublish = this.toggleAnonymousPublish.bind(this);\n    this.handleSelection = this.handleSelection.bind(this);\n  }\n  toggleAnonymousPublish (event) {\n    const value = event.target.value;\n    if (value === 'anonymous') {\n      this.props.onPublishInChannelChange(false);\n    } else {\n      this.props.onPublishInChannelChange(true);\n    }\n  }\n  handleSelection (event) {\n    const selectedOption = event.target.selectedOptions[0].value;\n    this.props.onChannelSelect(selectedOption);\n  }\n  render () {\n    return (\n      <div>\n        <form>\n          <div className='column column--3 column--med-10'>\n            <input type='radio' name='anonymous-or-channel' id='anonymous-radio' className='input-radio' value='anonymous' checked={!this.props.publishInChannel} onChange={this.toggleAnonymousPublish} />\n            <label className='label label--pointer' htmlFor='anonymous-radio'>Anonymous</label>\n          </div>\n          <div className='column column--7 column--med-10'>\n            <input type='radio' name='anonymous-or-channel' id='channel-radio' className='input-radio' value='in a channel' checked={this.props.publishInChannel} onChange={this.toggleAnonymousPublish} />\n            <label className='label label--pointer' htmlFor='channel-radio'>In a channel</label>\n          </div>\n          { this.props.channelError ? (\n            <p className='info-message--failure'>{this.props.channelError}</p>\n          ) : (\n            <p className='info-message'>Publish anonymously or in a channel</p>\n          )}\n        </form>\n        { this.props.publishInChannel && (\n          <div>\n            <div className='column column--3'>\n              <label className='label' htmlFor='channel-name-select'>Channel:</label>\n            </div><div className='column column--7'>\n              <select type='text' id='channel-name-select' className='select select--arrow' value={this.props.selectedChannel} onChange={this.handleSelection}>\n                { this.props.loggedInChannelName && <option value={this.props.loggedInChannelName} id='publish-channel-select-channel-option'>{this.props.loggedInChannelName}</option> }\n                <option value={states.LOGIN}>Existing</option>\n                <option value={states.CREATE}>New</option>\n              </select>\n            </div>\n            { (this.props.selectedChannel === states.LOGIN) && <ChannelLoginForm /> }\n            { (this.props.selectedChannel === states.CREATE) && <ChannelCreateForm /> }\n          </div>\n        )}\n      </div>\n    );\n  }\n}\n\nexport default ChannelSelect;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ChannelSelect/view.jsx","import React from 'react';\nimport request from 'utils/request';\n\nclass ChannelLoginForm extends React.Component {\n  constructor (props) {\n    super(props);\n    this.state = {\n      error   : null,\n      name    : '',\n      password: '',\n    };\n    this.handleInput = this.handleInput.bind(this);\n    this.loginToChannel = this.loginToChannel.bind(this);\n  }\n  handleInput (event) {\n    const name = event.target.name;\n    const value = event.target.value;\n    this.setState({[name]: value});\n  }\n  loginToChannel (event) {\n    event.preventDefault();\n    const params = {\n      method : 'POST',\n      body   : JSON.stringify({username: this.state.name, password: this.state.password}),\n      headers: new Headers({\n        'Content-Type': 'application/json',\n      }),\n      credentials: 'include',\n    };\n    request('login', params)\n      .then(({success, channelName, shortChannelId, channelClaimId, message}) => {\n        if (success) {\n          this.props.onChannelLogin(channelName, shortChannelId, channelClaimId);\n        } else {\n          this.setState({'error': message});\n        };\n      })\n      .catch(error => {\n        if (error.message) {\n          this.setState({'error': error.message});\n        } else {\n          this.setState({'error': error});\n        }\n      });\n  }\n  render () {\n    return (\n      <form id='channel-login-form'>\n        <div className='row row--wide row--short'>\n          <div className='column column--3 column--sml-10'>\n            <label className='label' htmlFor='channel-login-name-input'>Name:</label>\n          </div><div className='column column--6 column--sml-10'>\n            <div className='input-text--primary flex-container--row flex-container--left-bottom'>\n              <span>@</span>\n              <input type='text' id='channel-login-name-input' className='input-text' name='name' placeholder='Your Channel Name' value={this.state.channelName} onChange={this.handleInput} />\n            </div>\n          </div>\n        </div>\n        <div className='row row--wide row--short'>\n          <div className='column column--3 column--sml-10'>\n            <label className='label' htmlFor='channel-login-password-input' >Password:</label>\n          </div><div className='column column--6 column--sml-10'>\n            <div className='input-text--primary'>\n              <input type='password' id='channel-login-password-input' name='password' className='input-text' placeholder='' value={this.state.channelPassword} onChange={this.handleInput} />\n            </div>\n          </div>\n        </div>\n        { this.state.error ? (\n          <p className='info-message--failure'>{this.state.error}</p>\n        ) : (\n          <p className='info-message'>Enter the name and password for your channel</p>\n        )}\n        <div className='row row--wide'>\n          <button className='button--primary' onClick={this.loginToChannel}>Authenticate</button>\n        </div>\n      </form>\n    );\n  }\n}\n\nexport default ChannelLoginForm;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ChannelLoginForm/view.jsx","import React from 'react';\nimport ProgressBar from 'components/ProgressBar';\nimport request from 'utils/request';\n\nclass ChannelCreateForm extends React.Component {\n  constructor (props) {\n    super(props);\n    this.state = {\n      error   : null,\n      channel : '',\n      password: '',\n      status  : null,\n    };\n    this.handleChannelInput = this.handleChannelInput.bind(this);\n    this.handleInput = this.handleInput.bind(this);\n    this.createChannel = this.createChannel.bind(this);\n  }\n  cleanseChannelInput (input) {\n    input = input.replace(/\\s+/g, '-'); // replace spaces with dashes\n    input = input.replace(/[^A-Za-z0-9-]/g, '');  // remove all characters that are not A-Z, a-z, 0-9, or '-'\n    return input;\n  }\n  handleChannelInput (event) {\n    let value = event.target.value;\n    value = this.cleanseChannelInput(value);\n    this.setState({channel: value});\n    if (value) {\n      this.updateIsChannelAvailable(value);\n    } else {\n      this.setState({error: 'Please enter a channel name'});\n    }\n  }\n  handleInput (event) {\n    const name = event.target.name;\n    const value = event.target.value;\n    this.setState({[name]: value});\n  }\n  updateIsChannelAvailable (channel) {\n    const channelWithAtSymbol = `@${channel}`;\n    request(`/api/channel/availability/${channelWithAtSymbol}`)\n      .then(() => {\n        this.setState({'error': null});\n      })\n      .catch((error) => {\n        this.setState({'error': error.message});\n      });\n  }\n  checkIsChannelAvailable (channel) {\n    const channelWithAtSymbol = `@${channel}`;\n    return request(`/api/channel/availability/${channelWithAtSymbol}`);\n  }\n  checkIsPasswordProvided (password) {\n    return new Promise((resolve, reject) => {\n      if (!password || password.length < 1) {\n        return reject(new Error('Please provide a password'));\n      }\n      resolve();\n    });\n  }\n  makePublishChannelRequest (username, password) {\n    const params = {\n      method : 'POST',\n      body   : JSON.stringify({username, password}),\n      headers: new Headers({\n        'Content-Type': 'application/json',\n      }),\n      credentials: 'include',\n    };\n    return new Promise((resolve, reject) => {\n      request('/signup', params)\n        .then(result => {\n          return resolve(result);\n        })\n        .catch(error => {\n          reject(new Error(`Unfortunately, we encountered an error while creating your channel. Please let us know in Discord! ${error.message}`));\n        });\n    });\n  }\n  createChannel (event) {\n    event.preventDefault();\n    this.checkIsPasswordProvided(this.state.password)\n      .then(() => {\n        return this.checkIsChannelAvailable(this.state.channel);\n      })\n      .then(() => {\n        this.setState({status: 'We are publishing your new channel.  Sit tight...'});\n        return this.makePublishChannelRequest(this.state.channel, this.state.password);\n      })\n      .then(result => {\n        this.setState({status: null});\n        this.props.onChannelLogin(result.channelName, result.shortChannelId, result.channelClaimId);\n      })\n      .catch((error) => {\n        if (error.message) {\n          this.setState({'error': error.message, status: null});\n        } else {\n          this.setState({'error': error, status: null});\n        };\n      });\n  }\n  render () {\n    return (\n      <div>\n        { !this.state.status ? (\n          <form id='publish-channel-form'>\n            <div className='row row--wide row--short'>\n              <div className='column column--3 column--sml-10'>\n                <label className='label' htmlFor='new-channel-name'>Name:</label>\n              </div><div className='column column--6 column--sml-10'>\n                <div className='input-text--primary flex-container--row flex-container--left-bottom span--relative'>\n                  <span>@</span>\n                  <input type='text' name='channel' id='new-channel-name' className='input-text' placeholder='exampleChannelName' value={this.state.channel} onChange={this.handleChannelInput} />\n                  { (this.state.channel && !this.state.error) && <span id='input-success-channel-name' className='info-message--success span--absolute'>{'\\u2713'}</span> }\n                  { this.state.error && <span id='input-success-channel-name' className='info-message--failure span--absolute'>{'\\u2716'}</span> }\n                </div>\n              </div>\n            </div>\n            <div className='row row--wide row--short'>\n              <div className='column column--3 column--sml-10'>\n                <label className='label' htmlFor='new-channel-password'>Password:</label>\n              </div><div className='column column--6 column--sml-10'>\n                <div className='input-text--primary'>\n                  <input type='password' name='password' id='new-channel-password' className='input-text'  placeholder='' value={this.state.password} onChange={this.handleInput} />\n                </div>\n              </div>\n            </div>\n            {this.state.error ? (\n              <p className='info-message--failure'>{this.state.error}</p>\n            ) : (\n              <p className='info-message'>Choose a name and password for your channel</p>\n            )}\n            <div className='row row--wide'>\n              <button className='button--primary' onClick={this.createChannel}>Create Channel</button>\n            </div>\n          </form>\n        ) : (\n          <div>\n            <p className='fine-print'>{this.state.status}</p>\n            <ProgressBar size={12} />\n          </div>\n        )}\n      </div>\n    );\n  }\n}\n\nexport default ChannelCreateForm;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ChannelCreateForm/view.jsx","import React from 'react';\n\nconst ActiveStatusBar = () => {\n  return <span className='progress-bar progress-bar--active'>| </span>;\n};\n\nexport default ActiveStatusBar;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/ActiveStatusBar/index.jsx","import React from 'react';\n\nconst InactiveStatusBar = () => {\n  return <span className='progress-bar progress-bar--inactive'>| </span>;\n};\n\nexport default InactiveStatusBar;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/InactiveStatusBar/index.jsx","import {connect} from 'react-redux';\nimport {clearFile} from 'actions/publish';\nimport View from './view';\n\nconst mapStateToProps = ({ publish }) => {\n  return {\n    status : publish.status.status,\n    message: publish.status.message,\n  };\n};\n\nconst mapDispatchToProps = {\n  clearFile,\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishStatus/index.js","import React from 'react';\nimport ProgressBar from 'components/ProgressBar';\nimport * as publishStates from 'constants/publish_claim_states';\n\nclass PublishStatus extends React.Component {\n  render () {\n    const { status, message, clearFile } = this.props;\n    return (\n      <div className='row row--tall flex-container--column flex-container--center-center'>\n        {status === publishStates.LOAD_START &&\n        <div className='row align-content-center'>\n          <p>File is loading to server</p>\n          <p className='blue'>0%</p>\n        </div>\n        }\n        {status === publishStates.LOADING &&\n        <div>\n          <div className='row align-content-center'>\n            <p>File is loading to server</p>\n            <p className='blue'>{message}</p>\n          </div>\n        </div>\n        }\n        {status === publishStates.PUBLISHING &&\n        <div className='row align-content-center'>\n          <p>Upload complete.  Your file is now being published on the blockchain...</p>\n          <ProgressBar size={12} />\n          <p>Curious what magic is happening here? <a className='link--primary' target='blank' href='https://lbry.io/faq/what-is-lbry'>Learn more.</a></p>\n        </div>\n        }\n        {status === publishStates.SUCCESS &&\n        <div className='row align-content-center'>\n          <p>Your publish is complete! You are being redirected to it now.</p>\n          <p>If you are not automatically redirected, <a className='link--primary' target='_blank' href={message}>click here.</a></p>\n        </div>\n        }\n        {status === publishStates.FAILED &&\n        <div className='row align-content-center'>\n          <p>Something went wrong...</p>\n          <p><strong>{message}</strong></p>\n          <p>For help, post the above error text in the #speech channel on the <a className='link--primary' href='https://discord.gg/YjYbwhS' target='_blank'>lbry discord</a></p>\n          <button className='button--secondary' onClick={clearFile}>Reset</button>\n        </div>\n        }\n      </div>\n    );\n  }\n};\n\nexport default PublishStatus;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishStatus/view.jsx","export const LOAD_START = 'LOAD_START';\nexport const LOADING = 'LOADING';\nexport const PUBLISHING = 'PUBLISHING';\nexport const SUCCESS = 'SUCCESS';\nexport const FAILED = 'FAILED';\n\n\n\n// WEBPACK FOOTER //\n// ./react/constants/publish_claim_states.js","import {connect} from 'react-redux';\nimport View from './view';\n\nconst mapStateToProps = ({ publish }) => {\n  return {\n    message: publish.disabledMessage,\n  };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishDisabledMessage/index.js","import React from 'react';\n\nclass PublishDisabledMessage extends React.Component {\n  render () {\n    const message = this.props.message;\n    console.log('this.props.message:', message);\n    return (\n      <div className='row dropzone--disabled row--tall flex-container--column flex-container--center-center'>\n        <p className='text--disabled'>Publishing is currently disabled.</p>\n        <p className='text--disabled'>{message}</p>\n      </div>\n    );\n  }\n}\n\nexport default PublishDisabledMessage;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/PublishDisabledMessage/view.jsx","import React from 'react';\nimport NavBar from 'containers/NavBar';\nimport SEO from 'components/SEO';\n\nclass AboutPage extends React.Component {\n  render () {\n    return (\n      <div>\n        <SEO pageTitle={'About'} pageUri={'about'} />\n        <NavBar />\n        <div className='row row--padded'>\n          <div className='column column--5 column--med-10 align-content-top'>\n            <div className='column column--8 column--med-10'>\n              <p className='pull-quote'>Spee.ch is an open-source project.  Please contribute to the existing site, or fork it and make your own.</p>\n              <p><a className='link--primary' target='_blank' href='https://twitter.com/spee_ch'>TWITTER</a></p>\n              <p><a className='link--primary' target='_blank' href='https://github.com/lbryio/spee.ch'>GITHUB</a></p>\n              <p><a className='link--primary' target='_blank' href='https://discord.gg/YjYbwhS'>DISCORD CHANNEL</a></p>\n              <p><a className='link--primary' target='_blank' href='https://github.com/lbryio/spee.ch/blob/master/README.md'>DOCUMENTATION</a></p>\n            </div>\n          </div><div className='column column--5 column--med-10 align-content-top'>\n            <div className='column column--8 column--med-10'>\n              <p>Spee.ch is a media-hosting site that reads from and publishes content to the <a className='link--primary' href='https://lbry.io'>LBRY</a> blockchain.</p>\n              <p>Spee.ch is a hosting service, but with the added benefit that it stores your content on a decentralized network of computers -- the <a className='link--primary' href='https://lbry.io/get'>LBRY</a> network.  This means that your images are stored in multiple locations without a single point of failure.</p>\n              <h3>Contribute</h3>\n              <p>If you have an idea for your own spee.ch-like site on top of LBRY, fork our <a className='link--primary' href='https://github.com/lbryio/spee.ch'>github repo</a> and go to town!</p>\n              <p>If you want to improve spee.ch, join our <a className='link--primary' href='https://discord.gg/YjYbwhS'>discord channel</a> or solve one of our <a className='link--primary' href='https://github.com/lbryio/spee.ch/issues'>github issues</a>.</p>\n            </div>\n          </div>\n        </div>\n      </div>\n    );\n  }\n};\n\nexport default AboutPage;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/AboutPage/index.jsx","import {connect} from 'react-redux';\nimport View from './view';\n\nconst mapStateToProps = ({ channel }) => {\n  return {\n    loggedInChannelName: channel.loggedInChannel.name,\n  };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/LoginPage/index.js","import React from 'react';\nimport { withRouter } from 'react-router-dom';\nimport SEO from 'components/SEO';\nimport NavBar from 'containers/NavBar';\nimport ChannelLoginForm from 'containers/ChannelLoginForm';\nimport ChannelCreateForm from 'containers/ChannelCreateForm';\n\nclass LoginPage extends React.Component {\n  componentWillReceiveProps (newProps) {\n    // re-route the user to the homepage if the user is logged in\n    if (newProps.loggedInChannelName !== this.props.loggedInChannelName) {\n      this.props.history.push(`/`);\n    }\n  }\n  render () {\n    return (\n      <div>\n        <SEO pageTitle={'Login'} pageUri={'login'} />\n        <NavBar />\n        <div className='row row--padded'>\n          <div className='column column--5 column--med-10 align-content-top'>\n            <div className='column column--8 column--med-10'>\n              <p>Channels allow you to publish and group content under an identity. You can create a channel for yourself, or share one with like-minded friends.  You can create 1 channel, or 100, so whether you're <a className='link--primary' target='_blank' href='/@catalonia2017:43dcf47163caa21d8404d9fe9b30f78ef3e146a8'>documenting important events</a>, or making a public repository for <a className='link--primary' target='_blank' href='/@catGifs'>cat gifs</a> (password: '1234'), try creating a channel for it!</p>\n            </div>\n          </div><div className='column column--5 column--med-10 align-content-top'>\n            <div className='column column--8 column--med-10'>\n              <h3 className='h3--no-bottom'>Log in to an existing channel:</h3>\n              <ChannelLoginForm />\n              <h3 className='h3--no-bottom'>Create a brand new channel:</h3>\n              <ChannelCreateForm />\n            </div>\n          </div>\n        </div>\n      </div>\n    );\n  }\n};\n\nexport default withRouter(LoginPage);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/LoginPage/view.jsx","import { connect } from 'react-redux';\nimport { onHandleShowPageUri } from 'actions/show';\nimport View from './view';\n\nconst mapStateToProps = ({ show }) => {\n  return {\n    error      : show.request.error,\n    requestType: show.request.type,\n  };\n};\n\nconst mapDispatchToProps = {\n  onHandleShowPageUri,\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ShowPage/index.js","import React from 'react';\nimport ErrorPage from 'components/ErrorPage';\nimport ShowAssetLite from 'containers/ShowAssetLite';\nimport ShowAssetDetails from 'containers/ShowAssetDetails';\nimport ShowChannel from 'containers/ShowChannel';\n\nimport { CHANNEL, ASSET_LITE, ASSET_DETAILS } from 'constants/show_request_types';\n\nclass ShowPage extends React.Component {\n  componentDidMount () {\n    this.props.onHandleShowPageUri(this.props.match.params);\n  }\n  componentWillReceiveProps (nextProps) {\n    if (nextProps.match.params !== this.props.match.params) {\n      this.props.onHandleShowPageUri(nextProps.match.params);\n    }\n  }\n  render () {\n    const { error, requestType } = this.props;\n    if (error) {\n      return (\n        <ErrorPage error={error} />\n      );\n    }\n    switch (requestType) {\n      case CHANNEL:\n        return <ShowChannel />;\n      case ASSET_LITE:\n        return <ShowAssetLite />;\n      case ASSET_DETAILS:\n        return <ShowAssetDetails />;\n      default:\n        return <p>loading...</p>;\n    }\n  }\n};\n\nexport default ShowPage;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ShowPage/view.jsx","import { connect } from 'react-redux';\nimport View from './view';\n\nconst mapStateToProps = ({ show }) => {\n  // select request info\n  const requestId = show.request.id;\n  // select asset info\n  let asset;\n  const request = show.requestList[requestId] || null;\n  const assetList = show.assetList;\n  if (request && assetList) {\n    const assetKey = request.key;  // note: just store this in the request\n    asset = assetList[assetKey] || null;\n  };\n  // return props\n  return {\n    asset,\n  };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ShowAssetLite/index.js","import React from 'react';\nimport SEO from 'components/SEO';\nimport { Link } from 'react-router-dom';\nimport AssetDisplay from 'containers/AssetDisplay';\n\nclass ShowLite extends React.Component {\n  render () {\n    const { asset } = this.props;\n    if (asset) {\n      const { name, claimId } = asset.claimData;\n      return (\n        <div className='row row--tall flex-container--column flex-container--center-center show-lite-container'>\n          <SEO pageTitle={name} asset={asset} />\n          <AssetDisplay />\n          <Link id='asset-boilerpate' className='link--primary fine-print' to={`/${claimId}/${name}`}>hosted\n            via Spee.ch</Link>\n        </div>\n      );\n    }\n    return (\n      <div className='row row--tall row--padded flex-container--column flex-container--center-center'>\n        <p>loading asset data...</p>\n      </div>\n    );\n  }\n};\n\nexport default ShowLite;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ShowAssetLite/view.jsx","import React from 'react';\nimport ProgressBar from 'components/ProgressBar';\nimport { LOCAL_CHECK, UNAVAILABLE, ERROR, AVAILABLE } from 'constants/asset_display_states';\n\nclass AssetDisplay extends React.Component {\n  componentDidMount () {\n    const { asset: { claimData: { name, claimId } } } = this.props;\n    this.props.onFileRequest(name, claimId);\n  }\n  render () {\n    const { status, error, asset: { claimData: { name, claimId, contentType, fileExt, thumbnail } } } = this.props;\n    return (\n      <div id='asset-display-component'>\n        {(status === LOCAL_CHECK) &&\n        <div>\n          <p>Checking to see if Spee.ch has your asset locally...</p>\n        </div>\n        }\n        {(status === UNAVAILABLE) &&\n        <div>\n          <p>Sit tight, we're searching the LBRY blockchain for your asset!</p>\n          <ProgressBar size={12} />\n          <p>Curious what magic is happening here? <a className='link--primary' target='blank' href='https://lbry.io/faq/what-is-lbry'>Learn more.</a></p>\n        </div>\n        }\n        {(status === ERROR) &&\n        <div>\n          <p>Unfortunately, we couldn't download your asset from LBRY.  You can help us out by sharing the below error message in the <a className='link--primary' href='https://discord.gg/YjYbwhS' target='_blank'>LBRY discord</a>.</p>\n          <i><p id='error-message'>{error}</p></i>\n        </div>\n        }\n        {(status === AVAILABLE) &&\n        (() => {\n          switch (contentType) {\n            case 'image/jpeg':\n            case 'image/jpg':\n            case 'image/png':\n              return (\n                <img\n                  className='asset'\n                  src={`/${claimId}/${name}.${fileExt}`}\n                  alt={name} />\n              );\n            case 'image/gif':\n              return (\n                <img\n                  className='asset'\n                  src={`/${claimId}/${name}.${fileExt}`}\n                  alt={name}\n                />\n              );\n            case 'video/mp4':\n              return (\n                <video className='asset video' controls poster={thumbnail}>\n                  <source\n                    src={`/${claimId}/${name}.${fileExt}`}\n                  />\n                  <p>Your browser does not support the <code>video</code> element.</p>\n                </video>\n              );\n            default:\n              return (\n                <p>Unsupported file type</p>\n              );\n          }\n        })()\n        }\n      </div>\n    );\n  }\n};\n\nexport default AssetDisplay;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/AssetDisplay/view.jsx","import { connect } from 'react-redux';\nimport View from './view';\n\nconst mapStateToProps = ({ show }) => {\n  // select request info\n  const requestId = show.request.id;\n  // select asset info\n  let asset;\n  const request = show.requestList[requestId] || null;\n  const assetList = show.assetList;\n  if (request && assetList) {\n    const assetKey = request.key;  // note: just store this in the request\n    asset = assetList[assetKey] || null;\n  };\n  // return props\n  return {\n    asset,\n  };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ShowAssetDetails/index.js","import React from 'react';\nimport SEO from 'components/SEO';\nimport NavBar from 'containers/NavBar';\nimport ErrorPage from 'components/ErrorPage';\nimport AssetTitle from 'containers/AssetTitle';\nimport AssetDisplay from 'containers/AssetDisplay';\nimport AssetInfo from 'containers/AssetInfo';\n\nclass ShowAssetDetails extends React.Component {\n  render () {\n    const { asset } = this.props;\n    if (asset) {\n      const { claimData: { name } } = asset;\n      return (\n        <div>\n          <SEO pageTitle={`${name} - details`} asset={asset} />\n          <NavBar />\n          <div className='row row--tall row--padded'>\n            <div className='column column--10'>\n              <AssetTitle />\n            </div>\n            <div className='column column--5 column--sml-10 align-content-top'>\n              <div className='row row--padded show-details-container'>\n                <AssetDisplay />\n              </div>\n            </div><div className='column column--5 column--sml-10 align-content-top'>\n              <div className='row row--padded'>\n                <AssetInfo />\n              </div>\n            </div>\n          </div>\n        </div>\n      );\n    };\n    return (\n      <ErrorPage error={'loading asset data...'} />\n    );\n  }\n};\n\nexport default ShowAssetDetails;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ShowAssetDetails/view.jsx","import { connect } from 'react-redux';\nimport View from './view';\nimport { selectAsset } from 'selectors/show';\n\nconst mapStateToProps = ({ show }) => {\n  const { claimData: { title } } = selectAsset(show);\n  return {\n    title,\n  };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/AssetTitle/index.js","import React from 'react';\n\nconst AssetTitle = ({ title }) => {\n  return (\n    <div>\n      <span className='text--large'>{title}</span>\n    </div>\n  );\n};\n\nexport default AssetTitle;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/AssetTitle/view.jsx","import { connect } from 'react-redux';\nimport View from './view';\nimport { selectAsset } from 'selectors/show';\n\nconst mapStateToProps = ({ show }) => {\n  // select asset\n  const asset = selectAsset(show);\n  //  return props\n  return {\n    asset,\n  };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/AssetInfo/index.js","import React from 'react';\nimport { Link } from 'react-router-dom';\n\nclass AssetInfo extends React.Component {\n  constructor (props) {\n    super(props);\n    this.copyToClipboard = this.copyToClipboard.bind(this);\n  }\n  copyToClipboard (event) {\n    var elementToCopy = event.target.dataset.elementtocopy;\n    var element = document.getElementById(elementToCopy);\n    element.select();\n    try {\n      document.execCommand('copy');\n    } catch (err) {\n      this.setState({error: 'Oops, unable to copy'});\n    }\n  }\n  render () {\n    const { asset: { shortId, claimData : { channelName, certificateId, description, name, claimId, fileExt, contentType, thumbnail, host } } } = this.props;\n    return (\n      <div>\n        {channelName &&\n        <div className='row row--padded row--wide row--no-top'>\n          <div className='column column--2 column--med-10'>\n            <span className='text'>Channel:</span>\n          </div>\n          <div className='column column--8 column--med-10'>\n            <span className='text'><Link to={`/${channelName}:${certificateId}`}>{channelName}</Link></span>\n          </div>\n        </div>\n        }\n\n        {description &&\n        <div className='row row--padded row--wide row--no-top'>\n          <span className='text'>{description}</span>\n        </div>\n        }\n\n        <div id='show-share-buttons'>\n          <div className='row row--padded row--wide row--no-top'>\n            <div className='column column--2 column--med-10'>\n              <span className='text'>Share:</span>\n            </div>\n            <div className='column column--8 column--med-10'>\n              <div\n                className='row row--short row--wide flex-container--row flex-container--space-between-bottom flex-container--wrap'>\n                <a className='link--primary' target='_blank' href={`https://twitter.com/intent/tweet?text=${host}/${shortId}/${name}`}>twitter</a>\n                <a className='link--primary' target='_blank' href={`https://www.facebook.com/sharer/sharer.php?u=${host}/${shortId}/${name}`}>facebook</a>\n                <a className='link--primary' target='_blank' href={`http://tumblr.com/widgets/share/tool?canonicalUrl=${host}/${shortId}/${name}`}>tumblr</a>\n                <a className='link--primary' target='_blank' href={`https://www.reddit.com/submit?url=${host}/${shortId}/${name}&title=${name}`}>reddit</a>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <div className='row row--padded row--wide row--no-top'>\n          <div id='show-short-link'>\n            <div className='column column--2 column--med-10'>\n              <span className='text'>Link:</span>\n            </div>\n            <div className='column column--8 column--med-10'>\n              <div className='row row--short row--wide'>\n                <div className='column column--7'>\n                  <div className='input-error' id='input-error-copy-short-link' hidden='true'>error here</div>\n                  <input type='text' id='short-link' className='input-disabled input-text--full-width' readOnly\n                    spellCheck='false'\n                    value={`${host}/${shortId}/${name}.${fileExt}`}\n                    onClick={this.select} />\n                </div>\n                <div className='column column--1' />\n                <div className='column column--2'>\n                  <button className='button--primary button--wide' data-elementtocopy='short-link'\n                    onClick={this.copyToClipboard}>copy\n                  </button>\n                </div>\n              </div>\n            </div>\n          </div>\n\n          <div id='show-embed-code'>\n            <div className='column column--2 column--med-10'>\n              <span className='text'>Embed:</span>\n            </div>\n            <div className='column column--8 column--med-10'>\n              <div className='row row--short row--wide'>\n                <div className='column column--7'>\n                  <div className='input-error' id='input-error-copy-embed-text' hidden='true'>error here</div>\n                  {(contentType === 'video/mp4') ? (\n                    <input type='text' id='embed-text' className='input-disabled input-text--full-width' readOnly\n                      onClick={this.select} spellCheck='false'\n                      value={`<video width=\"100%\" controls poster=\"${thumbnail}\" src=\"${host}/${claimId}/${name}.${fileExt}\"/></video>`} />\n                  ) : (\n                    <input type='text' id='embed-text' className='input-disabled input-text--full-width' readOnly\n                      onClick={this.select} spellCheck='false'\n                      value={`<img src=\"${host}/${claimId}/${name}.${fileExt}\"/>`}\n                    />\n                  )}\n                </div>\n                <div className='column column--1' />\n                <div className='column column--2'>\n                  <button className='button--primary button--wide' data-elementtocopy='embed-text'\n                    onClick={this.copyToClipboard}>copy\n                  </button>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <div className='flex-container--row flex-container--space-between-bottom'>\n          <Link className='link--primary' to={`/${shortId}/${name}.${fileExt}`}><span\n            className='text'>Direct Link</span></Link>\n          <a className='link--primary' href={`${host}/${claimId}/${name}.${fileExt}`} download={name}>Download</a>\n          <a className='link--primary' target='_blank' href='https://lbry.io/dmca'>Report</a>\n        </div>\n\n      </div>\n    );\n  }\n};\n\nexport default AssetInfo;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/AssetInfo/view.jsx","import { connect } from 'react-redux';\nimport View from './view';\n\nconst mapStateToProps = ({ show }) => {\n  // select request info\n  const requestId = show.request.id;\n  // select request\n  const previousRequest = show.requestList[requestId] || null;\n  // select channel\n  let channel;\n  if (previousRequest) {\n    const channelKey = previousRequest.key;\n    channel = show.channelList[channelKey] || null;\n  }\n  return {\n    channel,\n  };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ShowChannel/index.js","import React from 'react';\nimport SEO from 'components/SEO';\nimport ErrorPage from 'components/ErrorPage';\nimport NavBar from 'containers/NavBar';\nimport ChannelClaimsDisplay from 'containers/ChannelClaimsDisplay';\n\nclass ShowChannel extends React.Component {\n  render () {\n    const { channel } = this.props;\n    if (channel) {\n      const { name, longId, shortId } = channel;\n      return (\n        <div>\n          <SEO pageTitle={name} channel={channel} />\n          <NavBar />\n          <div className='row row--tall row--padded'>\n            <div className='column column--10'>\n              <h2>channel name: {name}</h2>\n              <p className={'fine-print'}>full channel id: {longId}</p>\n              <p className={'fine-print'}>short channel id: {shortId}</p>\n            </div>\n            <div className='column column--10'>\n              <ChannelClaimsDisplay />\n            </div>\n          </div>\n        </div>\n      );\n    };\n    return (\n      <ErrorPage error={'loading channel data...'} />\n    );\n  }\n};\n\nexport default ShowChannel;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ShowChannel/view.jsx","import { connect } from 'react-redux';\nimport { onUpdateChannelClaims } from 'actions/show';\nimport View from './view';\n\nconst mapStateToProps = ({ show }) => {\n  // select channel key\n  const request = show.requestList[show.request.id];\n  const channelKey = request.key;\n  // select channel claims\n  const channel = show.channelList[channelKey] || null;\n  // return props\n  return {\n    channelKey,\n    channel,\n  };\n};\n\nconst mapDispatchToProps = {\n  onUpdateChannelClaims,\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ChannelClaimsDisplay/index.js","import React from 'react';\nimport AssetPreview from 'components/AssetPreview';\n\nclass ChannelClaimsDisplay extends React.Component {\n  constructor (props) {\n    super(props);\n    this.showNextResultsPage = this.showNextResultsPage.bind(this);\n    this.showPreviousResultsPage = this.showPreviousResultsPage.bind(this);\n  }\n  showPreviousResultsPage () {\n    const { channel: { claimsData: { currentPage } } } = this.props;\n    const previousPage = parseInt(currentPage) - 1;\n    this.showNewPage(previousPage);\n  }\n  showNextResultsPage () {\n    const { channel: { claimsData: { currentPage } } } = this.props;\n    const nextPage = parseInt(currentPage) + 1;\n    this.showNewPage(nextPage);\n  }\n  showNewPage (page) {\n    const { channelKey, channel: { name, longId } } = this.props;\n    this.props.onUpdateChannelClaims(channelKey, name, longId, page);\n  }\n  render () {\n    const { channel: { claimsData: { claims, currentPage, totalPages } } } = this.props;\n    return (\n      <div className='row row--tall'>\n        {(claims.length > 0) ? (\n          <div>\n            {claims.map((claim, index) => <AssetPreview\n              claimData={claim}\n              key={`${claim.name}-${index}`}\n            />)}\n            <div>\n              {(currentPage > 1) &&\n              <button className={'button--secondary'} onClick={this.showPreviousResultsPage}>Previous Page</button>\n              }\n              {(currentPage < totalPages) &&\n              <button className={'button--secondary'} onClick={this.showNextResultsPage}>Next Page</button>\n              }\n            </div>\n          </div>\n        ) : (\n          <p>There are no claims in this channel</p>\n        )}\n      </div>\n    );\n  }\n};\n\nexport default ChannelClaimsDisplay;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/ChannelClaimsDisplay/view.jsx","import { connect } from 'react-redux';\nimport View from './view';\n\nconst mapStateToProps = ({site: {defaults: { defaultThumbnail }}}) => {\n  return {\n    defaultThumbnail,\n  };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/AssetPreview/index.js","import React from 'react';\nimport { Link } from 'react-router-dom';\n\nconst AssetPreview = ({ defaultThumbnail, claimData: { name, claimId, fileExt, contentType, thumbnail } }) => {\n  const directSourceLink = `${claimId}/${name}.${fileExt}`;\n  const showUrlLink = `/${claimId}/${name}`;\n  return (\n    <div className='asset-holder'>\n      <Link to={showUrlLink} >\n        {(() => {\n          switch (contentType) {\n            case 'image/jpeg':\n            case 'image/jpg':\n            case 'image/png':\n            case 'image/gif':\n              return (\n                <img\n                  className={'asset-preview'}\n                  src={directSourceLink}\n                  alt={name}\n                />\n              );\n            case 'video/mp4':\n              return (\n                <img\n                  className={'asset-preview video'}\n                  src={thumbnail || defaultThumbnail}\n                  alt={name}\n                />\n              );\n            default:\n              return (\n                <p>unsupported file type</p>\n              );\n          }\n        })()}\n      </Link>\n    </div>\n  );\n};\n\nexport default AssetPreview;\n\n\n\n// WEBPACK FOOTER //\n// ./react/components/AssetPreview/view.jsx","import { connect } from 'react-redux';\nimport View from './view';\n\nconst mapStateToProps = ({ site: { host, title } }) => {\n  return {\n    host,\n    title,\n  };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/FourOhFourPage/index.jsx","import React from 'react';\nimport NavBar from 'containers/NavBar';\nimport Helmet from 'react-helmet';\n\nclass FourOhForPage extends React.Component {\n  render () {\n    const {title, host} = this.props;\n    return (\n      <div>\n        <Helmet>\n          <title>{title} - 404</title>\n          <link rel='canonical' href={`${host}/404`} />\n        </Helmet>\n        <NavBar />\n        <div className='row row--padded'>\n          <h2>404</h2>\n          <p>That page does not exist</p>\n        </div>\n      </div>\n    );\n  }\n};\n\nexport default FourOhForPage;\n\n\n\n// WEBPACK FOOTER //\n// ./react/containers/FourOhFourPage/view.jsx","const { sendGAServeEvent } = require('../helpers/googleAnalytics');\nconst { determineResponseType, flipClaimNameAndIdForBackwardsCompatibility, logRequestData, getClaimIdAndServeAsset } = require('../helpers/serveHelpers.js');\nconst lbryUri = require('../helpers/lbryUri.js');\nconst handleShowRender = require('../helpers/handleShowRender.jsx');\nconst SERVE = 'SERVE';\n\nmodule.exports = (app) => {\n  // route to serve a specific asset using the channel or claim id\n  app.get('/:identifier/:claim', (req, res) => {\n    const { headers, ip, originalUrl, params } = req;\n    // decide if this is a show request\n    let hasFileExtension;\n    try {\n      ({ hasFileExtension } = lbryUri.parseModifier(params.claim));\n    } catch (error) {\n      return res.status(400).json({success: false, message: error.message});\n    }\n    let responseType = determineResponseType(hasFileExtension, headers);\n    if (responseType !== SERVE) {\n      return handleShowRender(req, res);\n    }\n    // handle serve request\n    // send google analytics\n    sendGAServeEvent(headers, ip, originalUrl);\n    // parse the claim\n    let claimName;\n    try {\n      ({ claimName } = lbryUri.parseClaim(params.claim));\n    } catch (error) {\n      return res.status(400).json({success: false, message: error.message});\n    }\n    // parse the identifier\n    let isChannel, channelName, channelClaimId, claimId;\n    try {\n      ({ isChannel, channelName, channelClaimId, claimId } = lbryUri.parseIdentifier(params.identifier));\n    } catch (error) {\n      return res.status(400).json({success: false, message: error.message});\n    }\n    if (!isChannel) {\n      [claimId, claimName] = flipClaimNameAndIdForBackwardsCompatibility(claimId, claimName);\n    }\n    // log the request data for debugging\n    logRequestData(responseType, claimName, channelName, claimId);\n    // get the claim Id and then serve the asset\n    getClaimIdAndServeAsset(channelName, channelClaimId, claimName, claimId, originalUrl, ip, res);\n  });\n  // route to serve the winning asset at a claim or a channel page\n  app.get('/:claim', (req, res) => {\n    const { headers, ip, originalUrl, params } = req;\n    // decide if this is a show request\n    let hasFileExtension;\n    try {\n      ({ hasFileExtension } = lbryUri.parseModifier(params.claim));\n    } catch (error) {\n      return res.status(400).json({success: false, message: error.message});\n    }\n    let responseType = determineResponseType(hasFileExtension, headers);\n    if (responseType !== SERVE) {\n      return handleShowRender(req, res);\n    }\n    // handle serve request\n    // send google analytics\n    sendGAServeEvent(headers, ip, originalUrl);\n    // parse the claim\n    let claimName;\n    try {\n      ({claimName} = lbryUri.parseClaim(params.claim));\n    } catch (error) {\n      return res.status(400).json({success: false, message: error.message});\n    }\n    // log the request data for debugging\n    logRequestData(responseType, claimName, null, null);\n    // get the claim Id and then serve the asset\n    getClaimIdAndServeAsset(null, null, claimName, null, originalUrl, ip, res);\n  });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./routes/serve-routes.js","const logger = require('winston');\nconst { getClaimId, getLocalFileRecord } = require('../controllers/serveController.js');\nconst { handleErrorResponse } = require('../helpers/errorHandlers.js');\n\nconst SERVE = 'SERVE';\nconst SHOW = 'SHOW';\nconst NO_FILE = 'NO_FILE';\nconst NO_CHANNEL = 'NO_CHANNEL';\nconst NO_CLAIM = 'NO_CLAIM';\n\nfunction clientAcceptsHtml ({accept}) {\n  return accept && accept.match(/text\\/html/);\n};\n\nfunction requestIsFromBrowser (headers) {\n  return headers['user-agent'] && headers['user-agent'].match(/Mozilla/);\n};\n\nfunction clientWantsAsset ({accept, range}) {\n  const imageIsWanted = accept && accept.match(/image\\/.*/) && !accept.match(/text\\/html/) && !accept.match(/text\\/\\*/);\n  const videoIsWanted = accept && range;\n  return imageIsWanted || videoIsWanted;\n};\n\nfunction isValidClaimId (claimId) {\n  return ((claimId.length === 40) && !/[^A-Za-z0-9]/g.test(claimId));\n};\n\nfunction isValidShortId (claimId) {\n  return claimId.length === 1;  // it should really evaluate the short url itself\n};\n\nfunction isValidShortIdOrClaimId (input) {\n  return (isValidClaimId(input) || isValidShortId(input));\n};\n\nfunction serveAssetToClient (claimId, name, res) {\n  return getLocalFileRecord(claimId, name)\n    .then(fileRecord => {\n      // check that a local record was found\n      if (fileRecord === NO_FILE) {\n        return res.status(307).redirect(`/api/claim/get/${name}/${claimId}`);\n      }\n      // serve the file\n      const {filePath, fileType} = fileRecord;\n      logger.verbose(`serving file: ${filePath}`);\n      const sendFileOptions = {\n        headers: {\n          'X-Content-Type-Options': 'nosniff',\n          'Content-Type'          : fileType || 'image/jpeg',\n        },\n      };\n      res.status(200).sendFile(filePath, sendFileOptions);\n    })\n    .catch(error => {\n      throw error;\n    });\n};\n\nmodule.exports = {\n  getClaimIdAndServeAsset (channelName, channelClaimId, claimName, claimId, originalUrl, ip, res) {\n    // get the claim Id and then serve the asset\n    getClaimId(channelName, channelClaimId, claimName, claimId)\n      .then(fullClaimId => {\n        if (fullClaimId === NO_CLAIM) {\n          return res.status(404).json({success: false, message: 'no claim id could be found'});\n        } else if (fullClaimId === NO_CHANNEL) {\n          return res.status(404).json({success: false, message: 'no channel id could be found'});\n        }\n        serveAssetToClient(fullClaimId, claimName, res);\n        // postToStats(responseType, originalUrl, ip, claimName, fullClaimId, 'success');\n      })\n      .catch(error => {\n        handleErrorResponse(originalUrl, ip, error, res);\n        // postToStats(responseType, originalUrl, ip, claimName, fullClaimId, 'fail');\n      });\n  },\n  determineResponseType (hasFileExtension, headers) {\n    let responseType;\n    if (hasFileExtension) {\n      responseType = SERVE;  // assume a serve request if file extension is present\n      if (clientAcceptsHtml(headers)) {  // if the request comes from a browser, change it to a show request\n        responseType = SHOW;\n      }\n    } else {\n      responseType = SHOW;\n      if (clientWantsAsset(headers) && requestIsFromBrowser(headers)) {  // this is in case someone embeds a show url\n        logger.debug('Show request came from browser but wants an image/video. Changing response to serve...');\n        responseType = SERVE;\n      }\n    }\n    return responseType;\n  },\n  flipClaimNameAndIdForBackwardsCompatibility (identifier, name) {\n    // this is a patch for backwards compatability with '/name/claim_id' url format\n    if (isValidShortIdOrClaimId(name) && !isValidShortIdOrClaimId(identifier)) {\n      const tempName = name;\n      name = identifier;\n      identifier = tempName;\n    }\n    return [identifier, name];\n  },\n  logRequestData (responseType, claimName, channelName, claimId) {\n    logger.debug('responseType ===', responseType);\n    logger.debug('claim name === ', claimName);\n    logger.debug('channel name ===', channelName);\n    logger.debug('claim id ===', claimId);\n  },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/serveHelpers.js","const logger = require('winston');\n\nmodule.exports = {\n  REGEXP_INVALID_CLAIM  : /[^A-Za-z0-9-]/g,\n  REGEXP_INVALID_CHANNEL: /[^A-Za-z0-9-@]/g,\n  REGEXP_ADDRESS        : /^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/,\n  CHANNEL_CHAR          : '@',\n  parseIdentifier       : function (identifier) {\n    logger.debug('parsing identifier:', identifier);\n    const componentsRegex = new RegExp(\n      '([^:$#/]*)' + // value (stops at the first separator or end)\n      '([:$#]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end)\n    );\n    const [proto, value, modifierSeperator, modifier] = componentsRegex\n      .exec(identifier)\n      .map(match => match || null);\n    logger.debug(`${proto}, ${value}, ${modifierSeperator}, ${modifier}`);\n\n    // Validate and process name\n    if (!value) {\n      throw new Error(`Check your url.  No channel name provided before \"${modifierSeperator}\"`);\n    }\n    const isChannel = value.startsWith(module.exports.CHANNEL_CHAR);\n    const channelName = isChannel ? value : null;\n    let claimId;\n    if (isChannel) {\n      if (!channelName) {\n        throw new Error('No channel name after @.');\n      }\n      const nameBadChars = (channelName).match(module.exports.REGEXP_INVALID_CHANNEL);\n      if (nameBadChars) {\n        throw new Error(`Invalid characters in channel name: ${nameBadChars.join(', ')}.`);\n      }\n    } else {\n      claimId = value;\n    }\n\n    // Validate and process modifier\n    let channelClaimId;\n    if (modifierSeperator) {\n      if (!modifier) {\n        throw new Error(`No modifier provided after separator \"${modifierSeperator}\"`);\n      }\n\n      if (modifierSeperator === ':') {\n        channelClaimId = modifier;\n      } else {\n        throw new Error(`The \"${modifierSeperator}\" modifier is not currently supported`);\n      }\n    }\n    return {\n      isChannel,\n      channelName,\n      channelClaimId,\n      claimId,\n    };\n  },\n  parseClaim: function (claim) {\n    logger.debug('parsing name:', claim);\n    const componentsRegex = new RegExp(\n      '([^:$#/.]*)' + // name (stops at the first modifier)\n      '([:$#.]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end)\n    );\n    const [proto, claimName, modifierSeperator, modifier] = componentsRegex\n      .exec(claim)\n      .map(match => match || null);\n    logger.debug(`${proto}, ${claimName}, ${modifierSeperator}, ${modifier}`);\n\n    // Validate and process name\n    if (!claimName) {\n      throw new Error('No claim name provided before .');\n    }\n    const nameBadChars = (claimName).match(module.exports.REGEXP_INVALID_CLAIM);\n    if (nameBadChars) {\n      throw new Error(`Invalid characters in claim name: ${nameBadChars.join(', ')}.`);\n    }\n    // Validate and process modifier\n    if (modifierSeperator) {\n      if (!modifier) {\n        throw new Error(`No file extension provided after separator ${modifierSeperator}.`);\n      }\n      if (modifierSeperator !== '.') {\n        throw new Error(`The ${modifierSeperator} modifier is not supported in the claim name`);\n      }\n    }\n    // return results\n    return {\n      claimName,\n    };\n  },\n  parseModifier: function (claim) {\n    logger.debug('parsing modifier:', claim);\n    const componentsRegex = new RegExp(\n      '([^:$#/.]*)' + // name (stops at the first modifier)\n      '([:$#.]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end)\n    );\n    const [proto, claimName, modifierSeperator, modifier] = componentsRegex\n      .exec(claim)\n      .map(match => match || null);\n    logger.debug(`${proto}, ${claimName}, ${modifierSeperator}, ${modifier}`);\n    // Validate and process modifier\n    let hasFileExtension = false;\n    if (modifierSeperator) {\n      hasFileExtension = true;\n    }\n    return {\n      hasFileExtension,\n    };\n  },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/lbryUri.js","import React from 'react';\nimport { renderToString } from 'react-dom/server';\nimport { createStore, applyMiddleware } from 'redux';\nimport Reducer from '../react/reducers';\nimport { Provider } from 'react-redux';\nimport { StaticRouter } from 'react-router-dom';\nimport GAListener from '../react/components/GAListener';\nimport App from '../react/app';\nimport renderFullPage from './renderFullPage';\nimport createSagaMiddleware from 'redux-saga';\nimport { call } from 'redux-saga/effects';\nimport { handleShowPageUri } from '../react/sagas/show_uri';\nimport { onHandleShowPageUri } from '../react/actions/show';\n\nimport Helmet from 'react-helmet';\n\nconst returnSagaWithParams = (saga, params) => {\n  return function * () {\n    yield call(saga, params);\n  };\n};\n\nmodule.exports = (req, res) => {\n  let context = {};\n\n  // create and apply middleware\n  const sagaMiddleware = createSagaMiddleware();\n  const middleware = applyMiddleware(sagaMiddleware);\n\n  // create a new Redux store instance\n  const store = createStore(Reducer, middleware);\n\n  // create saga\n  const action = onHandleShowPageUri(req.params);\n  const saga = returnSagaWithParams(handleShowPageUri, action);\n\n  // run the saga middleware\n  sagaMiddleware\n    .run(saga)\n    .done\n    .then(() => {\n      // render component to a string\n      const html = renderToString(\n        <Provider store={store}>\n          <StaticRouter location={req.url} context={context}>\n            <GAListener>\n              <App />\n            </GAListener>\n          </StaticRouter>\n        </Provider>\n      );\n\n      // get head tags from helmet\n      const helmet = Helmet.renderStatic();\n\n      // check for a redirect\n      if (context.url) {\n        return res.redirect(301, context.url);\n      }\n\n      // get the initial state from our Redux store\n      const preloadedState = store.getState();\n\n      // send the rendered page back to the client\n      res.send(renderFullPage(helmet, html, preloadedState));\n    });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./helpers/handleShowRender.jsx","module.exports = require(\"redux-saga\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"redux-saga\"\n// module id = 151\n// module chunks = 0","import { call, put, takeLatest } from 'redux-saga/effects';\nimport * as actions from 'constants/show_action_types';\nimport { onRequestError, onNewChannelRequest, onNewAssetRequest } from 'actions/show';\nimport { newAssetRequest } from 'sagas/show_asset';\nimport { newChannelRequest } from 'sagas/show_channel';\nimport lbryUri from 'utils/lbryUri';\n\nfunction * parseAndUpdateIdentifierAndClaim (modifier, claim) {\n  // this is a request for an asset\n  // claim will be an asset claim\n  // the identifier could be a channel or a claim id\n  let isChannel, channelName, channelClaimId, claimId, claimName, extension;\n  try {\n    ({ isChannel, channelName, channelClaimId, claimId } = lbryUri.parseIdentifier(modifier));\n    ({ claimName, extension } = lbryUri.parseClaim(claim));\n  } catch (error) {\n    return yield put(onRequestError(error.message));\n  }\n  // trigger an new action to update the store\n  if (isChannel) {\n    return yield call(newAssetRequest, onNewAssetRequest(claimName, null, channelName, channelClaimId, extension));\n  };\n  yield call(newAssetRequest, onNewAssetRequest(claimName, claimId, null, null, extension));\n}\nfunction * parseAndUpdateClaimOnly (claim) {\n  // this could be a request for an asset or a channel page\n  // claim could be an asset claim or a channel claim\n  let isChannel, channelName, channelClaimId;\n  try {\n    ({ isChannel, channelName, channelClaimId } = lbryUri.parseIdentifier(claim));\n  } catch (error) {\n    return yield put(onRequestError(error.message));\n  }\n  // trigger an new action to update the store\n  // return early if this request is for a channel\n  if (isChannel) {\n    return yield call(newChannelRequest, onNewChannelRequest(channelName, channelClaimId));\n  }\n  // if not for a channel, parse the claim request\n  let claimName, extension;\n  try {\n    ({claimName, extension} = lbryUri.parseClaim(claim));\n  } catch (error) {\n    return yield put(onRequestError(error.message));\n  }\n  yield call(newAssetRequest, onNewAssetRequest(claimName, null, null, null, extension));\n}\n\nexport function * handleShowPageUri (action) {\n  const { identifier, claim } = action.data;\n  if (identifier) {\n    return yield call(parseAndUpdateIdentifierAndClaim, identifier, claim);\n  }\n  yield call(parseAndUpdateClaimOnly, claim);\n};\n\nexport function * watchHandleShowPageUri () {\n  yield takeLatest(actions.HANDLE_SHOW_URI, handleShowPageUri);\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/sagas/show_uri.js","import { call, put, select, takeLatest } from 'redux-saga/effects';\nimport * as actions from 'constants/show_action_types';\nimport { addRequestToRequestList, onRequestError, onRequestUpdate, addAssetToAssetList } from 'actions/show';\nimport { getLongClaimId, getShortId, getClaimData } from 'api/assetApi';\nimport { selectShowState } from 'selectors/show';\nimport { selectSiteHost } from 'selectors/site';\n\nexport function * newAssetRequest (action) {\n  const { requestType, requestId, name, modifier } = action.data;\n  // put an action to update the request in redux\n  yield put(onRequestUpdate(requestType, requestId));\n  // is this an existing request?\n  // If this uri is in the request list, it's already been fetched\n  const state = yield select(selectShowState);\n  const host = yield select(selectSiteHost);\n  if (state.requestList[requestId]) {\n    return null;\n  }\n  // get long id && add request to request list\n  let longId;\n  try {\n    ({data: longId} = yield call(getLongClaimId, host, name, modifier));\n  } catch (error) {\n    return yield put(onRequestError(error.message));\n  }\n  const assetKey = `a#${name}#${longId}`;\n  yield put(addRequestToRequestList(requestId, null, assetKey));\n  // is this an existing asset?\n  // If this asset is in the asset list, it's already been fetched\n  if (state.assetList[assetKey]) {\n    return null;\n  }\n  // get short Id\n  let shortId;\n  try {\n    ({data: shortId} = yield call(getShortId, host, name, longId));\n  } catch (error) {\n    return yield put(onRequestError(error.message));\n  }\n  // get asset claim data\n  let claimData;\n  try {\n    ({data: claimData} = yield call(getClaimData, host, name, longId));\n  } catch (error) {\n    return yield put(onRequestError(error.message));\n  }\n  // add asset to asset list\n  yield put(addAssetToAssetList(assetKey, null, name, longId, shortId, claimData));\n  // clear any errors in request error\n  yield put(onRequestError(null));\n};\n\nexport function * watchNewAssetRequest () {\n  yield takeLatest(actions.ASSET_REQUEST_NEW, newAssetRequest);\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/sagas/show_asset.js","import Request from 'utils/request';\n\nexport function getLongClaimId (host, name, modifier) {\n  let body = {};\n  // create request params\n  if (modifier) {\n    if (modifier.id) {\n      body['claimId'] = modifier.id;\n    } else {\n      body['channelName'] = modifier.channel.name;\n      body['channelClaimId'] = modifier.channel.id;\n    }\n  }\n  body['claimName'] = name;\n  const params = {\n    method : 'POST',\n    headers: { 'Content-Type': 'application/json' },\n    body   : JSON.stringify(body),\n  };\n  // create url\n  const url = `${host}/api/claim/long-id`;\n  // return the request promise\n  return Request(url, params);\n};\n\nexport function getShortId (host, name, claimId) {\n  const url = `${host}/api/claim/short-id/${claimId}/${name}`;\n  return Request(url);\n};\n\nexport function getClaimData (host, name, claimId) {\n  const url = `${host}/api/claim/data/${name}/${claimId}`;\n  return Request(url);\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/api/assetApi.js","import {call, put, select, takeLatest} from 'redux-saga/effects';\nimport * as actions from 'constants/show_action_types';\nimport { addNewChannelToChannelList, addRequestToRequestList, onRequestError, onRequestUpdate, updateChannelClaims } from 'actions/show';\nimport { getChannelClaims, getChannelData } from 'api/channelApi';\nimport { selectShowState } from 'selectors/show';\nimport { selectSiteHost } from 'selectors/site';\n\nexport function * newChannelRequest (action) {\n  const { requestType, requestId, channelName, channelId } = action.data;\n  // put an action to update the request in redux\n  yield put(onRequestUpdate(requestType, requestId));\n  // is this an existing request?\n  // If this uri is in the request list, it's already been fetched\n  const state = yield select(selectShowState);\n  const host = yield select(selectSiteHost);\n  if (state.requestList[requestId]) {\n    return null;\n  }\n  // get channel long id\n  let longId, shortId;\n  try {\n    ({ data: {longChannelClaimId: longId, shortChannelClaimId: shortId} } = yield call(getChannelData, host, channelName, channelId));\n  } catch (error) {\n    return yield put(onRequestError(error.message));\n  }\n  // store the request in the channel requests list\n  const channelKey = `c#${channelName}#${longId}`;\n  yield put(addRequestToRequestList(requestId, null, channelKey));\n  // is this an existing channel?\n  // If this channel is in the channel list, it's already been fetched\n  if (state.channelList[channelKey]) {\n    return null;\n  }\n  // get channel claims data\n  let claimsData;\n  try {\n    ({ data: claimsData } = yield call(getChannelClaims, host, longId, channelName, 1));\n  } catch (error) {\n    return yield put(onRequestError(error.message));\n  }\n  // store the channel data in the channel list\n  yield put(addNewChannelToChannelList(channelKey, channelName, shortId, longId, claimsData));\n  // clear any request errors\n  yield put(onRequestError(null));\n}\n\nexport function * watchNewChannelRequest () {\n  yield takeLatest(actions.CHANNEL_REQUEST_NEW, newChannelRequest);\n};\n\nfunction * getNewClaimsAndUpdateChannel (action) {\n  const { channelKey, name, longId, page } = action.data;\n  const host = yield select(selectSiteHost);\n  let claimsData;\n  try {\n    ({ data: claimsData } = yield call(getChannelClaims, host, longId, name, page));\n  } catch (error) {\n    return yield put(onRequestError(error.message));\n  }\n  yield put(updateChannelClaims(channelKey, claimsData));\n}\n\nexport function * watchUpdateChannelClaims () {\n  yield takeLatest(actions.CHANNEL_CLAIMS_UPDATE_ASYNC, getNewClaimsAndUpdateChannel);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./react/sagas/show_channel.js","import Request from 'utils/request';\n\nexport function getChannelData (host, id, name) {\n  if (!id) id = 'none';\n  const url = `${host}/api/channel/data/${name}/${id}`;\n  return Request(url);\n};\n\nexport function getChannelClaims (host, longId, name, page) {\n  if (!page) page = 1;\n  const url = `${host}/api/channel/claims/${name}/${longId}/${page}`;\n  return Request(url);\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/api/channelApi.js","module.exports = {\n  REGEXP_INVALID_CLAIM  : /[^A-Za-z0-9-]/g,\n  REGEXP_INVALID_CHANNEL: /[^A-Za-z0-9-@]/g,\n  REGEXP_ADDRESS        : /^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/,\n  CHANNEL_CHAR          : '@',\n  parseIdentifier       : function (identifier) {\n    const componentsRegex = new RegExp(\n      '([^:$#/]*)' + // value (stops at the first separator or end)\n      '([:$#]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end)\n    );\n    const [proto, value, modifierSeperator, modifier] = componentsRegex  // eslint-disable-line no-unused-vars\n      .exec(identifier)\n      .map(match => match || null);\n\n    // Validate and process name\n    if (!value) {\n      throw new Error(`Check your URL.  No channel name provided before \"${modifierSeperator}\"`);\n    }\n    const isChannel = value.startsWith(module.exports.CHANNEL_CHAR);\n    const channelName = isChannel ? value : null;\n    let claimId;\n    if (isChannel) {\n      if (!channelName) {\n        throw new Error('Check your URL.  No channel name after \"@\".');\n      }\n      const nameBadChars = (channelName).match(module.exports.REGEXP_INVALID_CHANNEL);\n      if (nameBadChars) {\n        throw new Error(`Check your URL.  Invalid characters in channel name: \"${nameBadChars.join(', ')}\".`);\n      }\n    } else {\n      claimId = value;\n    }\n\n    // Validate and process modifier\n    let channelClaimId;\n    if (modifierSeperator) {\n      if (!modifier) {\n        throw new Error(`Check your URL.  No modifier provided after separator \"${modifierSeperator}\"`);\n      }\n\n      if (modifierSeperator === ':') {\n        channelClaimId = modifier;\n      } else {\n        throw new Error(`Check your URL.  The \"${modifierSeperator}\" modifier is not currently supported`);\n      }\n    }\n    return {\n      isChannel,\n      channelName,\n      channelClaimId: channelClaimId || null,\n      claimId       : claimId || null,\n    };\n  },\n  parseClaim: function (name) {\n    const componentsRegex = new RegExp(\n      '([^:$#/.]*)' + // name (stops at the first extension)\n      '([:$#.]?)([^/]*)' // extension separator, extension (stops at the first path separator or end)\n    );\n    const [proto, claimName, extensionSeperator, extension] = componentsRegex // eslint-disable-line no-unused-vars\n      .exec(name)\n      .map(match => match || null);\n\n    // Validate and process name\n    if (!claimName) {\n      throw new Error('Check your URL.  No claim name provided before \".\"');\n    }\n    const nameBadChars = (claimName).match(module.exports.REGEXP_INVALID_CLAIM);\n    if (nameBadChars) {\n      throw new Error(`Check your URL.  Invalid characters in claim name: \"${nameBadChars.join(', ')}\".`);\n    }\n    // Validate and process extension\n    if (extensionSeperator) {\n      if (!extension) {\n        throw new Error(`Check your URL.  No file extension provided after separator \"${extensionSeperator}\".`);\n      }\n      if (extensionSeperator !== '.') {\n        throw new Error(`Check your URL.  The \"${extensionSeperator}\" separator is not supported in the claim name.`);\n      }\n    }\n    return {\n      claimName,\n      extension: extension || null,\n    };\n  },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./react/utils/lbryUri.js","const handlePageRender = require('../helpers/handlePageRender.jsx');\n\nmodule.exports = app => {\n  // a catch-all route if someone visits a page that does not exist\n  app.use('*', (req, res) => {\n    // send response\n    handlePageRender(req, res);\n  });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./routes/fallback-routes.js"],"sourceRoot":""}
\ No newline at end of file
diff --git a/react/app.js b/react/app.js
index 137a743a..8096af78 100644
--- a/react/app.js
+++ b/react/app.js
@@ -1,9 +1,9 @@
 import React from 'react';
 import { Route, Switch } from 'react-router-dom';
-import HomePage from 'components/HomePage';
-import AboutPage from 'components/AboutPage';
+import HomePage from 'pages/HomePage';
+import AboutPage from 'pages/AboutPage';
 import LoginPage from 'containers/LoginPage';
-import ShowPage from 'containers/ShowPage';
+import ShowPage from 'pages/ShowPage';
 import FourOhFourPage from 'containers/FourOhFourPage';
 
 const App = () => {
diff --git a/react/components/AboutPage/index.jsx b/react/pages/AboutPage/index.jsx
similarity index 100%
rename from react/components/AboutPage/index.jsx
rename to react/pages/AboutPage/index.jsx
diff --git a/react/components/ErrorPage/index.jsx b/react/pages/ErrorPage/index.jsx
similarity index 100%
rename from react/components/ErrorPage/index.jsx
rename to react/pages/ErrorPage/index.jsx
diff --git a/react/components/HomePage/index.jsx b/react/pages/HomePage/index.jsx
similarity index 100%
rename from react/components/HomePage/index.jsx
rename to react/pages/HomePage/index.jsx
diff --git a/react/containers/ShowPage/index.js b/react/pages/ShowPage/index.js
similarity index 100%
rename from react/containers/ShowPage/index.js
rename to react/pages/ShowPage/index.js
diff --git a/react/containers/ShowPage/view.jsx b/react/pages/ShowPage/view.jsx
similarity index 100%
rename from react/containers/ShowPage/view.jsx
rename to react/pages/ShowPage/view.jsx
diff --git a/routes/serve-routes.js b/routes/asset-routes.js
similarity index 100%
rename from routes/serve-routes.js
rename to routes/asset-routes.js
diff --git a/server.js b/server.js
index f3fcc4b4..557d3b18 100644
--- a/server.js
+++ b/server.js
@@ -5,35 +5,31 @@ const expressHandlebars = require('express-handlebars');
 const Handlebars = require('handlebars');
 const helmet = require('helmet');
 const passport = require('passport');
-const { populateLocalsDotUser, serializeSpeechUser, deserializeSpeechUser } = require('./helpers/authHelpers.js');
+const { serializeSpeechUser, deserializeSpeechUser } = require('./helpers/authHelpers.js');
 const cookieSession = require('cookie-session');
 const http = require('http');
 // logging dependencies
 const logger = require('winston');
 
-function SpeechServer ({ mysqlConfig, siteConfig, slackConfig }) {
-  this.start = () => {
-    this.configureConfigFiles();
-    this.configureLogging();
-    this.configureApp();
-    this.configureServer();
-    this.startServer();
+function SpeechServer () {
+  this.configureMysql = (mysqlConfig) => {
+    require('./config/mysqlConfig.js').configure(mysqlConfig);
   };
-  this.configureConfigFiles = () => {
-    const mysqlAppConfig = require('./config/mysqlConfig.js');
-    mysqlAppConfig.configure(mysqlConfig);
-    const siteAppConfig = require('./config/siteConfig.js');
-    siteAppConfig.configure(siteConfig);
-    this.PORT = siteAppConfig.details.port;
-    const slackAppConfig = require('./config/slackConfig.js');
-    slackAppConfig.configure(slackConfig);
+  this.configureSite = (siteConfig) => {
+    require('./config/siteConfig.js').configure(siteConfig);
+    this.sessionKey = siteConfig.auth.sessionKey;
+    this.PORT = siteConfig.details.port;
+  };
+  this.configureSlack = (slackConfig) => {
+    require('./config/slackConfig.js').configure(slackConfig);
   };
   this.configureLogging = () => {
     require('./helpers/configureLogger.js')(logger);
     require('./helpers/configureSlack.js')(logger);
   };
   this.configureApp = () => {
-    const app = express(); // create an Express application
+    // create an Express application
+    const app = express();
 
     // trust the proxy to get ip address for us
     app.enable('trust proxy');
@@ -58,7 +54,7 @@ function SpeechServer ({ mysqlConfig, siteConfig, slackConfig }) {
     // initialize passport
     app.use(cookieSession({
       name  : 'session',
-      keys  : [siteConfig.auth.sessionKey],
+      keys  : [this.sessionKey],
       maxAge: 24 * 60 * 60 * 1000, // i.e. 24 hours
     }));
     app.use(passport.initialize());
@@ -72,22 +68,24 @@ function SpeechServer ({ mysqlConfig, siteConfig, slackConfig }) {
     app.engine('handlebars', hbs.engine);
     app.set('view engine', 'handlebars');
 
-    // middleware to pass user info back to client (for handlebars access), if user is logged in
-    app.use(populateLocalsDotUser);  // note: I don't think I need this any more?
-
     // set the routes on the app
     require('./routes/auth-routes.js')(app);
     require('./routes/api-routes.js')(app);
     require('./routes/page-routes.js')(app);
-    require('./routes/serve-routes.js')(app);
+    require('./routes/asset-routes.js')(app);
     require('./routes/fallback-routes.js')(app);
 
     this.app = app;
   };
-  this.configureServer = () => {
+  this.initialize = (pages, models, routes) => {
+    this.configureLogging();
+    this.configureApp();
+    this.updatePages(pages);
+    this.updateModels(models);
+    this.updateRoutes(routes);
     this.server = http.Server(this.app);
   };
-  this.startServer = () => {
+  this.blastoff = () => {
     const db = require('./models');
     // sync sequelize
     db.sequelize.sync()
diff --git a/webpack.client.common.js b/webpack.client.common.js
deleted file mode 100644
index 27ab2730..00000000
--- a/webpack.client.common.js
+++ /dev/null
@@ -1,32 +0,0 @@
-const Path = require('path');
-const REACT_ROOT = Path.resolve(__dirname, 'react/');
-
-module.exports = {
-  target: 'web',
-  entry : ['babel-polyfill', 'whatwg-fetch', './react/client.js'],
-  output: {
-    path      : Path.join(__dirname, 'public/bundle/'),
-    publicPath: 'public/bundle/',
-    filename  : 'bundle.js',
-  },
-  module: {
-    loaders: [
-      {
-        test   : /.jsx?$/,
-        loader : 'babel-loader',
-        exclude: /node_modules/,
-        query  : {
-          presets: ['es2015', 'react', 'stage-2'],
-        },
-      },
-    ],
-  },
-  resolve: {
-    modules: [
-      REACT_ROOT,
-      'node_modules',
-      __dirname,
-    ],
-    extensions: ['.js', '.jsx', '.scss'],
-  },
-};
diff --git a/webpack.config.js b/webpack.config.js
deleted file mode 100644
index efcdc0b7..00000000
--- a/webpack.config.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const serverBaseConfig = require('./webpack.server.common.js');
-const clientBaseConfig = require('./webpack.client.common.js');
-
-module.exports = [
-  serverBaseConfig,
-  clientBaseConfig,
-];
diff --git a/webpack.dev.js b/webpack.dev.js
deleted file mode 100644
index 21421592..00000000
--- a/webpack.dev.js
+++ /dev/null
@@ -1,13 +0,0 @@
-const serverBaseConfig = require('./webpack.server.common.js');
-const clientBaseConfig = require('./webpack.client.common.js');
-const merge = require('webpack-merge');
-
-const devBuildConfig = {
-  watch  : true,
-  devtool: 'inline-source-map',
-};
-
-module.exports = [
-  merge(serverBaseConfig, devBuildConfig),
-  merge(clientBaseConfig, devBuildConfig),
-];
diff --git a/webpack.prod.js b/webpack.prod.js
deleted file mode 100644
index b828880e..00000000
--- a/webpack.prod.js
+++ /dev/null
@@ -1,22 +0,0 @@
-const webpack = require('webpack');
-const merge = require('webpack-merge');
-const UglifyJSPlugin = require('uglifyjs-webpack-plugin');
-const serverBaseConfig = require('./webpack.server.common.js');
-const clientBaseConfig = require('./webpack.client.common.js');
-
-const productionBuildConfig = {
-  devtool: 'source-map',
-  plugins: [
-    new UglifyJSPlugin({
-      sourceMap: true,
-    }),
-    new webpack.DefinePlugin({
-      'process.env.NODE_ENV': JSON.stringify('production'),
-    }),
-  ],
-};
-
-module.exports = [
-  merge(serverBaseConfig, productionBuildConfig),
-  merge(clientBaseConfig, productionBuildConfig),
-];
diff --git a/webpack.server.common.js b/webpack.server.common.js
deleted file mode 100644
index 0e987713..00000000
--- a/webpack.server.common.js
+++ /dev/null
@@ -1,43 +0,0 @@
-const Path = require('path');
-const nodeExternals = require('webpack-node-externals');
-const REACT_ROOT = Path.resolve(__dirname, 'react/');
-
-module.exports = {
-  target: 'node',
-  node  : {
-    __dirname: false,
-  },
-  externals: [nodeExternals()],
-  entry    : ['babel-polyfill', 'whatwg-fetch', './server.js'],
-  output   : {
-    path         : Path.join(__dirname, '/'),
-    publicPath   : '/',
-    filename     : 'index.js',
-    library      : '',
-    libraryTarget: 'commonjs-module',
-  },
-  module: {
-    rules: [
-      {
-        test   : /.jsx?$/,
-        exclude: /node_modules/,
-        loader : 'babel-loader',
-        options: {
-          presets: ['es2015',  'react', 'stage-2'],
-        },
-      },
-      {
-        test  : /.css$/,
-        loader: 'css-loader',
-      },
-    ],
-  },
-  resolve: {
-    modules: [
-      REACT_ROOT,
-      'node_modules',
-      __dirname,
-    ],
-    extensions: ['.js', '.json', '.jsx', '.css'],
-  },
-};