Browse Source

gulp build cleanup

windhamdavid 4 years ago
parent
commit
b1022b59e9

+ 3 - 1
.gitignore

@@ -3,4 +3,6 @@
 npm-debug.log*
 node_modules
 *.rdb
-dump.rdb
+dump.rdb
+
+app/*

File diff suppressed because it is too large
+ 1 - 7236
app/css/style.min.css


BIN
app/img/glyphicons-halflings-white.png


BIN
app/img/glyphicons-halflings.png


BIN
app/img/small-gray-pause.png


BIN
app/img/small-gray-play.png


File diff suppressed because it is too large
+ 1 - 408
app/index.html


File diff suppressed because it is too large
+ 28 - 75
app/js/radio.min.js


+ 0 - 3
app/js/templates/message-robot.handlebars

@@ -1,3 +0,0 @@
-<!-- Message -->
-<span class="label label-default" id="user-label">{{username}}</span>&nbsp;&nbsp;{{msg}}<br/>
-<!-- End Message -->

+ 0 - 3
app/js/templates/message.handlebars copy

@@ -1,3 +0,0 @@
-<!-- Message -->
-<span class="label label-default" id="user-label">{{username}}</span>&nbsp;&nbsp;{{msg}}<br/>
-<!-- End Message -->

File diff suppressed because it is too large
+ 7 - 4294
app/js/vendor.min.js


File diff suppressed because it is too large
+ 0 - 1575
app/js/webrtc-adapter.js


+ 0 - 280
app/js/webrtc-audio.js

@@ -1,280 +0,0 @@
-/*
- *  Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree.
- */
-/* global TimelineDataSeries, TimelineGraphView */
-
-'use strict';
-
-var audio2 = document.querySelector('audio#audio2');
-var callButton = document.querySelector('button#callButton');
-var hangupButton = document.querySelector('button#hangupButton');
-var codecSelector = document.querySelector('select#codec');
-hangupButton.disabled = true;
-callButton.onclick = call;
-hangupButton.onclick = hangup;
-
-var pc1;
-var pc2;
-var localStream;
-
-var bitrateGraph;
-var bitrateSeries;
-
-var packetGraph;
-var packetSeries;
-
-var lastResult;
-
-var offerOptions = {
-  offerToReceiveAudio: 1,
-  offerToReceiveVideo: 0,
-  voiceActivityDetection: false
-};
-
-function gotStream(stream) {
-  trace('Received local stream');
-  localStream = stream;
-  var audioTracks = localStream.getAudioTracks();
-  if (audioTracks.length > 0) {
-    trace('Using Audio device: ' + audioTracks[0].label);
-  }
-  pc1.addStream(localStream);
-  trace('Adding Local Stream to peer connection');
-
-  pc1.createOffer(gotDescription1, onCreateSessionDescriptionError,
-      offerOptions);
-
-  bitrateSeries = new TimelineDataSeries();
-  bitrateGraph = new TimelineGraphView('bitrateGraph', 'bitrateCanvas');
-  bitrateGraph.updateEndDate();
-
-  packetSeries = new TimelineDataSeries();
-  packetGraph = new TimelineGraphView('packetGraph', 'packetCanvas');
-  packetGraph.updateEndDate();
-}
-
-function onCreateSessionDescriptionError(error) {
-  trace('Failed to create session description: ' + error.toString());
-}
-
-function call() {
-  callButton.disabled = true;
-  hangupButton.disabled = false;
-  codecSelector.disabled = true;
-  trace('Starting call');
-  var servers = null;
-  var pcConstraints = {
-    'optional': []
-  };
-  pc1 = new RTCPeerConnection(servers, pcConstraints);
-  trace('Created local peer connection object pc1');
-  pc1.onicecandidate = iceCallback1;
-  pc2 = new RTCPeerConnection(servers, pcConstraints);
-  trace('Created remote peer connection object pc2');
-  pc2.onicecandidate = iceCallback2;
-  pc2.onaddstream = gotRemoteStream;
-  trace('Requesting local stream');
-  navigator.mediaDevices.getUserMedia({
-    audio: true,
-    video: false
-  })
-  .then(gotStream)
-  .catch(function(e) {
-    alert('getUserMedia() error: ' + e.name);
-  });
-}
-
-function gotDescription1(desc) {
-  desc.sdp = forceChosenAudioCodec(desc.sdp);
-  trace('Offer from pc1 \n' + desc.sdp);
-  pc1.setLocalDescription(desc, function() {
-    pc2.setRemoteDescription(desc, function() {
-      // Since the 'remote' side has no media stream we need
-      // to pass in the right constraints in order for it to
-      // accept the incoming offer of audio.
-      pc2.createAnswer(gotDescription2, onCreateSessionDescriptionError);
-    }, onSetSessionDescriptionError);
-  }, onSetSessionDescriptionError);
-}
-
-function gotDescription2(desc) {
-  desc.sdp = forceChosenAudioCodec(desc.sdp);
-  pc2.setLocalDescription(desc, function() {
-    trace('Answer from pc2 \n' + desc.sdp);
-    pc1.setRemoteDescription(desc, function() {
-    }, onSetSessionDescriptionError);
-  }, onSetSessionDescriptionError);
-}
-
-function hangup() {
-  trace('Ending call');
-  localStream.getTracks().forEach(function(track) {
-    track.stop();
-  });
-  pc1.close();
-  pc2.close();
-  pc1 = null;
-  pc2 = null;
-  hangupButton.disabled = true;
-  callButton.disabled = false;
-  codecSelector.disabled = false;
-}
-
-function gotRemoteStream(e) {
-  audio2.srcObject = e.stream;
-  trace('Received remote stream');
-}
-
-function iceCallback1(event) {
-  if (event.candidate) {
-    pc2.addIceCandidate(new RTCIceCandidate(event.candidate),
-        onAddIceCandidateSuccess, onAddIceCandidateError);
-    trace('Local ICE candidate: \n' + event.candidate.candidate);
-  }
-}
-
-function iceCallback2(event) {
-  if (event.candidate) {
-    pc1.addIceCandidate(new RTCIceCandidate(event.candidate),
-        onAddIceCandidateSuccess, onAddIceCandidateError);
-    trace('Remote ICE candidate: \n ' + event.candidate.candidate);
-  }
-}
-
-function onAddIceCandidateSuccess() {
-  trace('AddIceCandidate success.');
-}
-
-function onAddIceCandidateError(error) {
-  trace('Failed to add ICE Candidate: ' + error.toString());
-}
-
-function onSetSessionDescriptionError(error) {
-  trace('Failed to set session description: ' + error.toString());
-}
-
-function forceChosenAudioCodec(sdp) {
-  return maybePreferCodec(sdp, 'audio', 'send', codecSelector.value);
-}
-
-// Copied from AppRTC's sdputils.js:
-
-// Sets |codec| as the default |type| codec if it's present.
-// The format of |codec| is 'NAME/RATE', e.g. 'opus/48000'.
-function maybePreferCodec(sdp, type, dir, codec) {
-  var str = type + ' ' + dir + ' codec';
-  if (codec === '') {
-    trace('No preference on ' + str + '.');
-    return sdp;
-  }
-
-  trace('Prefer ' + str + ': ' + codec);
-
-  var sdpLines = sdp.split('\r\n');
-
-  // Search for m line.
-  var mLineIndex = findLine(sdpLines, 'm=', type);
-  if (mLineIndex === null) {
-    return sdp;
-  }
-
-  // If the codec is available, set it as the default in m line.
-  var codecIndex = findLine(sdpLines, 'a=rtpmap', codec);
-  console.log('codecIndex', codecIndex);
-  if (codecIndex) {
-    var payload = getCodecPayloadType(sdpLines[codecIndex]);
-    if (payload) {
-      sdpLines[mLineIndex] = setDefaultCodec(sdpLines[mLineIndex], payload);
-    }
-  }
-
-  sdp = sdpLines.join('\r\n');
-  return sdp;
-}
-
-// Find the line in sdpLines that starts with |prefix|, and, if specified,
-// contains |substr| (case-insensitive search).
-function findLine(sdpLines, prefix, substr) {
-  return findLineInRange(sdpLines, 0, -1, prefix, substr);
-}
-
-// Find the line in sdpLines[startLine...endLine - 1] that starts with |prefix|
-// and, if specified, contains |substr| (case-insensitive search).
-function findLineInRange(sdpLines, startLine, endLine, prefix, substr) {
-  var realEndLine = endLine !== -1 ? endLine : sdpLines.length;
-  for (var i = startLine; i < realEndLine; ++i) {
-    if (sdpLines[i].indexOf(prefix) === 0) {
-      if (!substr ||
-          sdpLines[i].toLowerCase().indexOf(substr.toLowerCase()) !== -1) {
-        return i;
-      }
-    }
-  }
-  return null;
-}
-
-// Gets the codec payload type from an a=rtpmap:X line.
-function getCodecPayloadType(sdpLine) {
-  var pattern = new RegExp('a=rtpmap:(\\d+) \\w+\\/\\d+');
-  var result = sdpLine.match(pattern);
-  return (result && result.length === 2) ? result[1] : null;
-}
-
-// Returns a new m= line with the specified codec as the first one.
-function setDefaultCodec(mLine, payload) {
-  var elements = mLine.split(' ');
-
-  // Just copy the first three parameters; codec order starts on fourth.
-  var newLine = elements.slice(0, 3);
-
-  // Put target payload first and copy in the rest.
-  newLine.push(payload);
-  for (var i = 3; i < elements.length; i++) {
-    if (elements[i] !== payload) {
-      newLine.push(elements[i]);
-    }
-  }
-  return newLine.join(' ');
-}
-
-// query getStats every second
-window.setInterval(function() {
-  if (!window.pc1) {
-    return;
-  }
-  window.pc1.getStats(null).then(function(res) {
-    Object.keys(res).forEach(function(key) {
-      var report = res[key];
-      var bytes;
-      var packets;
-      var now = report.timestamp;
-      if ((report.type === 'outboundrtp') ||
-          (report.type === 'outbound-rtp') ||
-          (report.type === 'ssrc' && report.bytesSent)) {
-        bytes = report.bytesSent;
-        packets = report.packetsSent;
-        if (lastResult && lastResult[report.id]) {
-          // calculate bitrate
-          var bitrate = 8 * (bytes - lastResult[report.id].bytesSent) /
-              (now - lastResult[report.id].timestamp);
-
-          // append to chart
-          bitrateSeries.addPoint(now, bitrate);
-          bitrateGraph.setDataSeries([bitrateSeries]);
-          bitrateGraph.updateEndDate();
-
-          // calculate number of packets and append to chart
-          packetSeries.addPoint(now, packets -
-              lastResult[report.id].packetsSent);
-          packetGraph.setDataSeries([packetSeries]);
-          packetGraph.updateEndDate();
-        }
-      }
-    });
-    lastResult = res;
-  });
-}, 1000);

+ 0 - 209
app/js/webrtc-video.js

@@ -1,209 +0,0 @@
-/*
- *  Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree.
- */
-
-'use strict';
-
-var startButton = document.getElementById('startButton');
-var callButton = document.getElementById('callButton');
-var hangupButton = document.getElementById('hangupButton');
-callButton.disabled = true;
-hangupButton.disabled = true;
-startButton.onclick = start;
-callButton.onclick = call;
-hangupButton.onclick = hangup;
-
-var startTime;
-var localVideo = document.getElementById('localVideo');
-var remoteVideo = document.getElementById('remoteVideo');
-
-localVideo.addEventListener('loadedmetadata', function() {
-  trace('Local video videoWidth: ' + this.videoWidth +
-    'px,  videoHeight: ' + this.videoHeight + 'px');
-});
-
-remoteVideo.addEventListener('loadedmetadata', function() {
-  trace('Remote video videoWidth: ' + this.videoWidth +
-    'px,  videoHeight: ' + this.videoHeight + 'px');
-});
-
-remoteVideo.onresize = function() {
-  trace('Remote video size changed to ' +
-    remoteVideo.videoWidth + 'x' + remoteVideo.videoHeight);
-  // We'll use the first onsize callback as an indication that video has started
-  // playing out.
-  if (startTime) {
-    var elapsedTime = window.performance.now() - startTime;
-    trace('Setup time: ' + elapsedTime.toFixed(3) + 'ms');
-    startTime = null;
-  }
-};
-
-var localStream;
-var pc1;
-var pc2;
-var offerOptions = {
-  offerToReceiveAudio: 1,
-  offerToReceiveVideo: 1
-};
-
-function getName(pc) {
-  return (pc === pc1) ? 'pc1' : 'pc2';
-}
-
-function getOtherPc(pc) {
-  return (pc === pc1) ? pc2 : pc1;
-}
-
-function gotStream(stream) {
-  trace('Received local stream');
-  localVideo.srcObject = stream;
-  localStream = stream;
-  callButton.disabled = false;
-}
-
-function start() {
-  trace('Requesting local stream');
-  startButton.disabled = true;
-  navigator.mediaDevices.getUserMedia({
-    audio: true,
-    video: true
-  })
-  .then(gotStream)
-  .catch(function(e) {
-    alert('getUserMedia() error: ' + e.name);
-  });
-}
-
-function call() {
-  callButton.disabled = true;
-  hangupButton.disabled = false;
-  trace('Starting call');
-  startTime = window.performance.now();
-  var videoTracks = localStream.getVideoTracks();
-  var audioTracks = localStream.getAudioTracks();
-  if (videoTracks.length > 0) {
-    trace('Using video device: ' + videoTracks[0].label);
-  }
-  if (audioTracks.length > 0) {
-    trace('Using audio device: ' + audioTracks[0].label);
-  }
-  var servers = null;
-  pc1 = new RTCPeerConnection(servers);
-  trace('Created local peer connection object pc1');
-  pc1.onicecandidate = function(e) {
-    onIceCandidate(pc1, e);
-  };
-  pc2 = new RTCPeerConnection(servers);
-  trace('Created remote peer connection object pc2');
-  pc2.onicecandidate = function(e) {
-    onIceCandidate(pc2, e);
-  };
-  pc1.oniceconnectionstatechange = function(e) {
-    onIceStateChange(pc1, e);
-  };
-  pc2.oniceconnectionstatechange = function(e) {
-    onIceStateChange(pc2, e);
-  };
-  pc2.onaddstream = gotRemoteStream;
-
-  pc1.addStream(localStream);
-  trace('Added local stream to pc1');
-
-  trace('pc1 createOffer start');
-  pc1.createOffer(onCreateOfferSuccess, onCreateSessionDescriptionError,
-      offerOptions);
-}
-
-function onCreateSessionDescriptionError(error) {
-  trace('Failed to create session description: ' + error.toString());
-}
-
-function onCreateOfferSuccess(desc) {
-  trace('Offer from pc1\n' + desc.sdp);
-  trace('pc1 setLocalDescription start');
-  pc1.setLocalDescription(desc, function() {
-    onSetLocalSuccess(pc1);
-  }, onSetSessionDescriptionError);
-  trace('pc2 setRemoteDescription start');
-  pc2.setRemoteDescription(desc, function() {
-    onSetRemoteSuccess(pc2);
-  }, onSetSessionDescriptionError);
-  trace('pc2 createAnswer start');
-  // Since the 'remote' side has no media stream we need
-  // to pass in the right constraints in order for it to
-  // accept the incoming offer of audio and video.
-  pc2.createAnswer(onCreateAnswerSuccess, onCreateSessionDescriptionError);
-}
-
-function onSetLocalSuccess(pc) {
-  trace(getName(pc) + ' setLocalDescription complete');
-}
-
-function onSetRemoteSuccess(pc) {
-  trace(getName(pc) + ' setRemoteDescription complete');
-}
-
-function onSetSessionDescriptionError(error) {
-  trace('Failed to set session description: ' + error.toString());
-}
-
-function gotRemoteStream(e) {
-  remoteVideo.srcObject = e.stream;
-  trace('pc2 received remote stream');
-}
-
-function onCreateAnswerSuccess(desc) {
-  trace('Answer from pc2:\n' + desc.sdp);
-  trace('pc2 setLocalDescription start');
-  pc2.setLocalDescription(desc, function() {
-    onSetLocalSuccess(pc2);
-  }, onSetSessionDescriptionError);
-  trace('pc1 setRemoteDescription start');
-  pc1.setRemoteDescription(desc, function() {
-    onSetRemoteSuccess(pc1);
-  }, onSetSessionDescriptionError);
-}
-
-function onIceCandidate(pc, event) {
-  if (event.candidate) {
-    getOtherPc(pc).addIceCandidate(new RTCIceCandidate(event.candidate),
-        function() {
-          onAddIceCandidateSuccess(pc);
-        },
-        function(err) {
-          onAddIceCandidateError(pc, err);
-        }
-    );
-    trace(getName(pc) + ' ICE candidate: \n' + event.candidate.candidate);
-  }
-}
-
-function onAddIceCandidateSuccess(pc) {
-  trace(getName(pc) + ' addIceCandidate success');
-}
-
-function onAddIceCandidateError(pc, error) {
-  trace(getName(pc) + ' failed to add ICE Candidate: ' + error.toString());
-}
-
-function onIceStateChange(pc, event) {
-  if (pc) {
-    trace(getName(pc) + ' ICE state: ' + pc.iceConnectionState);
-    console.log('ICE state change event: ', event);
-  }
-}
-
-function hangup() {
-  trace('Ending call');
-  pc1.close();
-  pc2.close();
-  pc1 = null;
-  pc2 = null;
-  hangupButton.disabled = true;
-  callButton.disabled = false;
-}

+ 48 - 14
gulpfile.js

@@ -2,38 +2,72 @@
 
 var gulp = require('gulp');
 var nodemon = require('gulp-nodemon');
-var minify = require('gulp-minify');
+var uglify = require('gulp-uglify');
+var minifyHTML = require('gulp-minify-html');
 var minifycss = require('gulp-minify-css');
 var concat = require('gulp-concat');
+var del = require('del');
 
-var copyTask = function() {
-  gulp.src('./src/index.html')
-    .pipe(gulp.dest('./app'));
+
+gulp.task('test', function(){
   gulp.src(['./src/css/bootstrap-v3.3.6.css', './src/css/main.css'])
     .pipe(concat('style.min.css'))
+    .pipe(minifycss())
     .pipe(gulp.dest('./app/css'));
+});
+
+var cleanTask = function () {
+  return del([
+    'app/**/*',
+    '!app/img/',
+    '!app/css/',
+    '!app/fonts/',
+    '!app/js/',
+  ]);
+};
+
+var buildTask = function() {
   gulp.src('./src/app.js')
     .pipe(gulp.dest('./app'));
-  gulp.src(['./src/js/main.js', './src/js/radio.js'])
-    .pipe(concat('radio.min.js'))
+  gulp.src('./src/index.html')
+    .pipe(minifyHTML())
+    .pipe(gulp.dest('./app'));
+  gulp.src('./src/img/*')
+    .pipe(gulp.dest('./app/img'));
+  gulp.src('./src/fonts/*')
+    .pipe(gulp.dest('./app/fonts'));
+  gulp.src(['./src/css/bootstrap-v3.3.6.css', './src/css/main.css'])
+    .pipe(concat('style.min.css'))
+    .pipe(minifycss())
+    .pipe(gulp.dest('./app/css'));
+  gulp.src(['./src/js/jquery-v2.1.4.js', './src/js/bootstrap-v3.3.6.js', './src/js/underscore-v1.8.3.js', './src/js/handlebars-v4.0.5.js'])
+    .pipe(concat('vendor.min.js'))
+    .pipe(uglify())
+    .pipe(gulp.dest('./app/js'));
+  gulp.src(['./src/js/webrtc-adapter.js', './src/js/webrtc-audio.js', './src/js/webrtc-video.js'])
+    .pipe(concat('webrtc.min.js'))
+    .pipe(uglify())
     .pipe(gulp.dest('./app/js'));
   gulp.src('./src/js/templates/*')
     .pipe(gulp.dest('./app/js/templates'));
-  //gulp.src(['./src/js/jquery.min.js', './src/js/bootstrap.js', './src/js/underscore.min.js', './src/js/handlebars.js'])
-  gulp.src(['./src/js/jquery.min.js', './src/js/bootstrap-v3.3.6.js', './src/js/underscore.min.js', './src/js/handlebars.js'])
-    .pipe(concat('vendor.min.js'))
+  gulp.src(['.src/js/amplitude-v2.2.0.js', './src/js/chat.js', './src/js/radio.js'])
+    .pipe(concat('radio.min.js'))
+    //.pipe(uglify())
     .pipe(gulp.dest('./app/js'));
-
-  console.log('Minify/Concat/Copy /src to /public');
+  console.log('Minify/Concat/Copy /src to /app');
 };
 
-gulp.task('copy', function() {
-  copyTask();
+gulp.task('clean', function() {
+  cleanTask();
+});
+
+gulp.task('build', function() {
+  buildTask();
 });
 
 var nodemonTask = function() {
   nodemon({
-    tasks: ['copy'],
+    tasks: ['build'],
     script: 'app.js',
     verbose: true,
     env: { 'NODE_ENV': 'development' },

+ 3 - 1
package.json

@@ -14,11 +14,13 @@
     "validator": "^4.3.0"
   },
   "devDependencies": {
+    "del": "^2.1.0",
     "gulp": "^3.9.0",
     "gulp-concat": "^2.6.0",
     "gulp-jshint": "^2.0.0",
-    "gulp-minify": "0.0.5",
     "gulp-minify-css": "^1.2.1",
+    "gulp-minify-html": "^1.0.4",
+    "gulp-uglify": "^1.5.1",
     "gulp-nodemon": "^2.0.4",
     "nodemon": "^1.8.1"
   },

+ 52 - 0
src/img/daveo-background.svg

@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 1280 800" enable-background="new 0 0 1280 800" xml:space="preserve">
+<g>
+	<g>
+		<path d="M29,25.9c45.6,1.5,91,6.7,135.8,15.8c37.8,7.7,77.8,16.4,111.4,36.2c33.2,19.5,54.3,51.5,54.8,90.5
+			c0.4,37.7-16.1,73.5-41.7,100.6c-30.4,32.2-70.7,52.7-111.1,69.2c-1.2,0.5-1.5,1.9-0.4,2.7c110,79.2,224.4,156.1,352.1,204
+			c31.6,11.8,63.9,21.8,96.8,29.3c16.3,3.7,32.7,6.8,49.2,9.3c7.2,1.1,14.5,2,21.8,2.9c4,0.5,8,0.9,12,1.2c4.1,0.3,4-0.8,7.1-3.8
+			c52.1-51.2,106.9-99.8,164-145.4c28.8-23,58.2-45.3,88.1-66.8c7-5,14-10,21-14.9c4.7-3.3,6.4-4.7,3.8-10.5
+			c-3.8-8.7-15-11.5-23.5-12.4c-16-1.6-33.2,1.2-49.2,2.9c-17.4,1.9-34.8,4.4-52,7.5c-35.4,6.5-70.4,15.7-104.4,27.4
+			c-31.4,10.9-62.7,23.5-91.9,39.5c-24.2,13.3-47.7,29.9-64,52.5c-15.9,21.9-22.4,49.2-15.3,75.6c7.4,27.4,26.8,50.5,50.2,65.9
+			c27.8,18.3,60.5,27.1,92.8,33.5c37.1,7.4,74.8,12.3,112.6,14.6c37.8,2.4,75.7,2.3,113.4-0.3c31.6-2.2,64-7,95.5-1.1
+			c15.7,3,30.4,9,42.9,19.1c1.3,1,3.3-0.2,2.4-1.8c-3.5-6.2,4.1-9,8.9-10c5.6-1.1,10.7-0.2,16.1,1.6c13,4.5,25.8,9.2,38.7,13.8
+			c26.6,9.6,53.2,19.4,79.7,29.5c53,20,105.6,40.9,157.9,62.6c0.3-1,0.5-1.9,0.8-2.9c-48.3-13-89.3-42.2-131.5-67.6
+			c-43.2-26-88.5-45.3-139.5-47.8c-29.7-1.5-59.4,2.4-87.8,11.3c0.5,0.8,1,1.7,1.5,2.5c63.9-55.9,117.7-122.9,159-197
+			c41.3-74.1,70.1-155.2,84.1-238.8c3.6-21.2,7.7-43.4,7-64.9c-0.6-19.9-8.7-37-23.3-50.4c-15.1-13.8-34-23-52.3-31.8
+			c-21.7-10.5-44-19.9-66.6-28.3c-23.3-8.6-47.1-16.1-71.1-22.4c-23.4-6.1-47.9-12.5-72.3-9.7c-36,4.1-63.2,28.9-84.1,56.8
+			c-23.9,32-42.1,67.8-65.9,100c-26.1,35.2-56,67.5-87.7,97.7C711.1,333.7,640.3,385.6,571.7,440c-68.2,54.2-131.6,113.5-196.1,172
+			c-64,58-130.2,114.7-205.4,157.9c-18.2,10.5-36.9,20.1-56.1,28.8c-19.4,8.7-40,18-60.9,22.5c-10.5,2.3-22.5,3.2-32.3-1.8
+			c-10.3-5.2-15.3-15.7-15.5-26.9c-0.4-22.7,14.3-41.1,21.4-61.7c3.2-9.4,5-19.6,2.6-29.4c-2.4-10-9.2-17.7-14.8-26
+			c-6-8.9-12.2-23.6-2.9-32.6c8.9-8.7,23.7-2.8,32.8,2.4c33.3,18.8,54.9,55.2,58.8,92.9c1.9,18-0.3,36.1-6.8,53.1
+			c0.7-0.3,1.5-0.6,2.2-0.9c-11.3-8.1-12.2-24.3-6.1-36c6.7-12.9,20.6-20.3,33.5-25.4c27.9-11.1,58-17.2,87.9-20.1
+			c60.9-5.8,122.1,2,182.2,11.6c61.8,9.8,123.4,20.3,185.4,28.5c64.1,8.5,128.4,15.5,192.9,20.9c15.7,1.3,31.5,2.9,47.2,3.6
+			c12,0.6,24.6,0.4,36-3.9c21.3-8,30.2-29,31.2-50.4c2.4-48-21.8-95.7-47.2-134.8c-27.9-43-61.7-82-89.1-125.3
+			c-28.1-44.4-47.7-93.2-69.4-140.9c-21.1-46.4-44.6-92.7-79.4-130.6c-8.9-9.7-18.9-18.3-27.6-28.1c-10.3-11.6-15.9-24.3-20-39.1
+			c-6.7-24.2-16.5-45.4-36.3-61.6c-8.6-7-18.1-12.5-28.4-16.4c0,1,0,1.9,0,2.9C603,28.7,716.6,28.9,828,45.7
+			c1.9,0.3,2.7-2.6,0.8-2.9c-112-16.8-226.1-17.1-338.1-0.7c-1.6,0.2-1.2,2.4,0,2.9c24.9,9.6,45.5,29.2,55.7,53.9
+			c5.4,13,7.3,27.2,12.9,40.1c5,11.5,13,21,21.8,29.8c18.7,18.8,36.2,37.6,51,59.8c14.2,21.2,26.2,43.8,37.2,66.8
+			c22.7,47.3,41.5,96.5,67.2,142.3c25,44.7,57.9,83.9,87.3,125.6c29.4,41.6,56.5,87.7,61.5,139.4c2.5,25.8-3.4,56.2-31.6,64.8
+			c-13.2,4.1-27.4,3.2-41,2.2c-16-1.2-32-2.5-48-3.9c-65.2-5.7-130.3-12.9-195.2-21.7c-62.4-8.5-124.4-19.4-186.7-29
+			c-58.2-8.9-117.7-15.5-176.5-8.7c-28,3.2-56.1,9.2-82.2,19.8c-19.3,7.8-39.7,22-38.3,45.4c0.5,8.6,4.2,16.1,11.2,21.1
+			c0.9,0.6,1.9-0.1,2.2-0.9c12.7-33.2,8.7-70.9-8-102c-8.3-15.4-19.7-29.1-33.6-39.6c-11.3-8.5-30.6-20.7-45-12.1
+			c-15.9,9.5-6.8,30.3,1.2,41.6c7.6,10.7,14.5,20.8,13.5,34.6c-1,13-7.1,25.1-12.8,36.6c-7.9,15.9-16.4,35.2-10.4,53.2
+			c5.5,16.6,22.1,22.8,38.4,21.6c19.8-1.5,39.3-10.2,57.5-17.8c19.6-8.1,38.7-17.3,57.3-27.4c38.1-20.7,74-45.1,108.4-71.5
+			c69.5-53.4,132.6-114.4,197.6-173.1c66.1-59.7,136.5-113.6,206.2-168.9c68.3-54.2,135.4-111.5,188.8-181
+			c25.1-32.7,44.2-69,68-102.5c23.9-33.7,55.6-62.9,99.4-62.4c26.4,0.3,52.9,8.4,78.1,15.7c23.9,7,47.4,15.1,70.5,24.4
+			c23.5,9.4,46.7,19.8,69,31.9c18.7,10.2,37.9,23.2,46.7,43.4c9.9,22.6,4.1,50.2,0.7,73.7c-3.1,21.3-7.2,42.5-12.1,63.4
+			c-10.2,42.9-24.3,84.8-41.9,125.2c-35.1,80.2-84.1,154.3-144.8,217.5c-14.7,15.3-30,29.9-45.9,43.8c-1.1,1,0.1,2.9,1.5,2.5
+			c51.5-16.1,107.7-15.3,158.5,3.1c45.6,16.5,84.8,45.9,126.5,69.7c22.9,13.1,46.7,24.5,72.2,31.3c1.9,0.5,2.5-2.2,0.8-2.9
+			c-46.8-19.4-93.9-38.1-141.3-56.2c-23.5-9-47-17.8-70.6-26.4c-12-4.4-24-8.8-36.1-13.1c-10.8-3.9-22-9-33.2-11.6
+			c-8.1-1.9-31.2,1-23.6,14.3c0.8-0.6,1.6-1.2,2.4-1.8c-21.9-17.6-49.5-22.5-76.9-22.7c-32-0.2-64,4.4-96,5.4
+			c-71.8,2.2-145.4-3.6-215.3-20.8c-31.8-7.8-64-19.8-88.1-42.9c-21.4-20.6-36.2-49.7-32.8-80c6.8-60.3,72.9-92.9,122.1-114.2
+			c63.5-27.5,131.2-45.6,200-53.5c16.1-1.9,32.7-4,49-3.8c6.5,0.1,13.5,1.1,19.3,4.2c2.8,1.5,6.4,4.2,7.1,7.6c1.1,5-4.6,6.9-8.2,9.5
+			c-27.9,19.6-55.3,39.9-82.2,60.9c-54.6,42.5-107.2,87.7-157.5,135.3c-5.9,5.6-11.8,11.3-17.7,16.9c-3.1,3-6.2,6-9.2,9
+			c-4.3,4.2-6.8,4.8-12.8,4.2c-16.9-1.8-33.8-4.2-50.5-7.4c-31.2-5.8-62-14-92.1-23.9c-124.1-41-236.1-111.6-342.3-186.3
+			c-13.2-9.3-26.3-18.6-39.4-28.1c-0.1,0.9-0.2,1.8-0.4,2.7c69.6-28.5,144.4-74.4,154.1-156.2c4.4-37-8.1-73-37.1-97
+			c-30.1-24.8-69.7-35.2-106.9-44C136.5,31.6,82.8,24.6,29,22.9C27,22.8,27,25.8,29,25.9L29,25.9z"/>
+	</g>
+</g>
+</svg>

+ 6 - 0
src/img/daveo-footer.svg

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 1280 100" enable-background="new 0 0 1280 100" xml:space="preserve">
+</svg>

+ 63 - 0
src/img/daveo-header.svg

@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 1280 150" enable-background="new 0 0 1280 150" xml:space="preserve">
+<g id="draw">
+</g>
+<g id="title">
+	<g>
+		<path d="M423.9,95.1v-48h13.3c4.5,0,8.5,0.5,12.1,1.5c3.5,1,6.5,2.5,8.9,4.5c2.4,2,4.3,4.5,5.5,7.5c1.3,3,1.9,6.5,1.9,10.4
+			c0,3.9-0.6,7.4-1.9,10.4c-1.3,3-3.1,5.5-5.5,7.5c-2.4,2-5.4,3.5-8.9,4.6c-3.5,1-7.5,1.5-12.1,1.5H423.9z M431.1,89.4h6.1
+			c7,0,12.3-1.6,15.9-4.8c3.6-3.2,5.4-7.7,5.4-13.5c0-5.8-1.8-10.3-5.4-13.5c-3.6-3.2-8.9-4.8-15.9-4.8h-6.1V89.4z M432.9,87.7v-33
+			h4.2c6.1,0,10.8,1.4,14.2,4.1c3.4,2.8,5.1,6.9,5.1,12.3c0,5.5-1.7,9.6-5.1,12.4c-3.4,2.8-8.1,4.2-14.2,4.2H432.9z M439.2,81.5
+			c3.6,0,6.4-0.9,8.4-2.6c2-1.7,3-4.3,3-7.8c0-3.5-1-6.1-3-7.8c-2-1.7-4.8-2.5-8.4-2.5V81.5z"/>
+		<path d="M483.8,47.1h11.5l18.2,48h-15.1l-1.6-4.3h-14.5l-1.6,4.3h-15.1L483.8,47.1z M476.3,89.4l1.4-3.6h23.8l1.4,3.6h2L491,52.9
+			h-2.7l-13.9,36.5H476.3z M489.6,54.6l11.2,29.4h-22.5L489.6,54.6z M492.8,80.2l-3.2-8.4l-3.2,8.4H492.8z"/>
+		<path d="M518.8,47.1L527,68l8.2-20.9h16.8l-18.7,48h-12.5l-18.7-48H518.8z M527.8,89.4L542,52.9h-2l-13,33.2l-13-33.2h-2
+			l14.3,36.5H527.8z"/>
+		<path d="M553,47.1h28.3v12.6h-13V65h12.7v12h-12.7v5.5h13.5v12.6H553V47.1z M576.5,89.4v-1.7h-14.4V71.9h13.7v-1.7h-13.7V54.6
+			h14.4v-1.7h-16.3v36.5H576.5z"/>
+		<path d="M585.1,71.2c0-3.5,0.7-6.7,2-9.8c1.3-3.1,3.1-5.7,5.4-8c2.3-2.3,5-4.1,8-5.4c3.1-1.3,6.3-2,9.8-2s6.7,0.7,9.8,2
+			c3.1,1.3,5.7,3.1,8,5.4c2.3,2.3,4.1,5,5.4,8c1.3,3.1,2,6.3,2,9.8s-0.7,6.7-2,9.8c-1.3,3.1-3.1,5.7-5.4,8c-2.3,2.3-5,4.1-8,5.4
+			c-3.1,1.3-6.3,2-9.8,2s-6.7-0.7-9.8-2c-3.1-1.3-5.7-3.1-8-5.4c-2.3-2.3-4.1-5-5.4-8C585.7,77.9,585.1,74.6,585.1,71.2z
+			 M591.8,71.2c0,2.5,0.5,4.9,1.4,7.2c1,2.2,2.3,4.2,4,5.9c1.7,1.7,3.6,3,5.9,4c2.2,1,4.6,1.4,7.2,1.4c2.5,0,4.9-0.5,7.2-1.4
+			c2.2-1,4.2-2.3,5.9-4c1.7-1.7,3-3.6,4-5.9s1.4-4.6,1.4-7.2c0-2.5-0.5-4.9-1.4-7.2c-1-2.2-2.3-4.2-4-5.9c-1.7-1.7-3.6-3-5.9-4
+			c-2.2-1-4.6-1.4-7.2-1.4c-2.5,0-4.9,0.5-7.2,1.4c-2.2,1-4.2,2.3-5.9,4c-1.7,1.7-3,3.6-4,5.9C592.3,66.2,591.8,68.6,591.8,71.2z
+			 M610.3,87.7c-2.3,0-4.5-0.4-6.4-1.3c-2-0.9-3.7-2.1-5.3-3.6c-1.5-1.5-2.7-3.3-3.6-5.3c-0.9-2-1.3-4.1-1.3-6.4
+			c0-2.3,0.4-4.5,1.3-6.4c0.9-2,2.1-3.7,3.6-5.3c1.5-1.5,3.3-2.7,5.3-3.6c2-0.9,4.1-1.3,6.4-1.3c2.3,0,4.5,0.4,6.4,1.3
+			c2,0.9,3.7,2.1,5.3,3.6c1.5,1.5,2.7,3.3,3.6,5.3c0.9,2,1.3,4.1,1.3,6.4c0,2.3-0.4,4.5-1.3,6.4c-0.9,2-2.1,3.7-3.6,5.3
+			c-1.5,1.5-3.3,2.7-5.3,3.6C614.7,87.3,612.6,87.7,610.3,87.7z M600.2,71.2c0,1.4,0.3,2.7,0.8,3.9c0.5,1.2,1.2,2.3,2.2,3.2
+			c0.9,0.9,2,1.6,3.2,2.2c1.2,0.5,2.5,0.8,3.9,0.8c1.4,0,2.7-0.3,3.9-0.8c1.2-0.5,2.3-1.2,3.2-2.2c0.9-0.9,1.6-2,2.2-3.2
+			c0.5-1.2,0.8-2.5,0.8-3.9c0-1.4-0.3-2.7-0.8-3.9c-0.5-1.2-1.2-2.3-2.2-3.2c-0.9-0.9-2-1.6-3.2-2.2c-1.2-0.5-2.5-0.8-3.9-0.8
+			c-1.4,0-2.7,0.3-3.9,0.8c-1.2,0.5-2.3,1.2-3.2,2.2c-0.9,0.9-1.6,2-2.2,3.2C600.4,68.5,600.2,69.8,600.2,71.2z"/>
+		<path d="M653.8,47.1h16.6c3.1,0,5.9,0.4,8.5,1.2c2.6,0.8,4.9,2,6.8,3.6c1.9,1.6,3.4,3.5,4.5,5.9c1.1,2.3,1.6,5,1.6,8
+			c0,2.4-0.3,4.4-1,6.1c-0.7,1.7-1.4,3.1-2.2,4.2c-1,1.2-2,2.3-3.2,3.2l9,15.8h-18L669.2,83v12.2h-15.3V47.1z M668.8,78.4
+			c1.9,0,3.7-0.2,5.5-0.6l6.8,11.5h2.2l-7.2-12.1c2.6-0.9,4.7-2.3,6.2-4.2c1.5-1.9,2.3-4.4,2.3-7.4c0-2.1-0.4-4-1.2-5.5
+			s-1.9-2.9-3.3-4c-1.4-1.1-3.1-1.9-5-2.4c-1.9-0.6-4-0.8-6.3-0.8H661v36.5h1.9V78.4H668.8z M662.9,76.7V54.6h5.9
+			c4.4,0,7.8,1,10.3,2.9c2.5,1.9,3.7,4.7,3.7,8.2c0,3.6-1.2,6.3-3.7,8.2c-2.5,1.9-5.9,2.8-10.3,2.8H662.9z M669.2,70.7h0.8
+			c1.8,0,3.4-0.4,4.6-1.2c1.3-0.8,1.9-2.2,1.9-4.1c0-1.9-0.6-3.3-1.9-4.1c-1.3-0.8-2.8-1.2-4.6-1.2h-0.8V70.7z"/>
+		<path d="M710.1,47.1h11.5l18.2,48h-15.1l-1.6-4.3h-14.5l-1.6,4.3h-15.1L710.1,47.1z M702.6,89.4l1.4-3.6h23.8l1.4,3.6h2
+			l-13.9-36.5h-2.7l-13.9,36.5H702.6z M715.8,54.6L727,84.1h-22.5L715.8,54.6z M719.1,80.2l-3.2-8.4l-3.2,8.4H719.1z"/>
+		<path d="M740.9,95.1v-48h13.3c4.5,0,8.5,0.5,12.1,1.5c3.5,1,6.5,2.5,8.9,4.5c2.4,2,4.3,4.5,5.5,7.5c1.3,3,1.9,6.5,1.9,10.4
+			c0,3.9-0.6,7.4-1.9,10.4c-1.3,3-3.1,5.5-5.5,7.5c-2.4,2-5.4,3.5-8.9,4.6c-3.5,1-7.5,1.5-12.1,1.5H740.9z M748.1,89.4h6.1
+			c7,0,12.3-1.6,15.9-4.8c3.6-3.2,5.4-7.7,5.4-13.5c0-5.8-1.8-10.3-5.4-13.5c-3.6-3.2-8.9-4.8-15.9-4.8h-6.1V89.4z M749.9,87.7v-33
+			h4.2c6.1,0,10.8,1.4,14.2,4.1c3.4,2.8,5.1,6.9,5.1,12.3c0,5.5-1.7,9.6-5.1,12.4c-3.4,2.8-8.1,4.2-14.2,4.2H749.9z M756.2,81.5
+			c3.6,0,6.4-0.9,8.4-2.6c2-1.7,3-4.3,3-7.8c0-3.5-1-6.1-3-7.8c-2-1.7-4.8-2.5-8.4-2.5V81.5z"/>
+		<path d="M786.6,47.1h16.3v48h-16.3V47.1z M795.7,89.4V52.9h-1.9v36.5H795.7z"/>
+		<path d="M806.8,71.2c0-3.5,0.7-6.7,2-9.8c1.3-3.1,3.1-5.7,5.4-8c2.3-2.3,5-4.1,8-5.4c3.1-1.3,6.3-2,9.8-2s6.7,0.7,9.8,2
+			c3.1,1.3,5.7,3.1,8,5.4c2.3,2.3,4.1,5,5.4,8c1.3,3.1,2,6.3,2,9.8s-0.7,6.7-2,9.8c-1.3,3.1-3.1,5.7-5.4,8c-2.3,2.3-5,4.1-8,5.4
+			c-3.1,1.3-6.3,2-9.8,2s-6.7-0.7-9.8-2c-3.1-1.3-5.7-3.1-8-5.4c-2.3-2.3-4.1-5-5.4-8C807.5,77.9,806.8,74.6,806.8,71.2z
+			 M813.6,71.2c0,2.5,0.5,4.9,1.4,7.2c1,2.2,2.3,4.2,4,5.9c1.7,1.7,3.6,3,5.9,4c2.2,1,4.6,1.4,7.2,1.4s4.9-0.5,7.2-1.4
+			c2.2-1,4.2-2.3,5.9-4c1.7-1.7,3-3.6,4-5.9c1-2.2,1.4-4.6,1.4-7.2c0-2.5-0.5-4.9-1.4-7.2c-1-2.2-2.3-4.2-4-5.9
+			c-1.7-1.7-3.6-3-5.9-4c-2.2-1-4.6-1.4-7.2-1.4s-4.9,0.5-7.2,1.4c-2.2,1-4.2,2.3-5.9,4c-1.7,1.7-3,3.6-4,5.9
+			C814.1,66.2,813.6,68.6,813.6,71.2z M832,87.7c-2.3,0-4.5-0.4-6.4-1.3c-2-0.9-3.7-2.1-5.3-3.6c-1.5-1.5-2.7-3.3-3.6-5.3
+			c-0.9-2-1.3-4.1-1.3-6.4c0-2.3,0.4-4.5,1.3-6.4c0.9-2,2.1-3.7,3.6-5.3c1.5-1.5,3.3-2.7,5.3-3.6c2-0.9,4.1-1.3,6.4-1.3
+			c2.3,0,4.5,0.4,6.4,1.3c2,0.9,3.7,2.1,5.3,3.6c1.5,1.5,2.7,3.3,3.6,5.3c0.9,2,1.3,4.1,1.3,6.4c0,2.3-0.4,4.5-1.3,6.4
+			c-0.9,2-2.1,3.7-3.6,5.3c-1.5,1.5-3.3,2.7-5.3,3.6C836.5,87.3,834.3,87.7,832,87.7z M821.9,71.2c0,1.4,0.3,2.7,0.8,3.9
+			c0.5,1.2,1.2,2.3,2.2,3.2c0.9,0.9,2,1.6,3.2,2.2c1.2,0.5,2.5,0.8,3.9,0.8c1.4,0,2.7-0.3,3.9-0.8c1.2-0.5,2.3-1.2,3.2-2.2
+			c0.9-0.9,1.6-2,2.2-3.2c0.5-1.2,0.8-2.5,0.8-3.9c0-1.4-0.3-2.7-0.8-3.9s-1.2-2.3-2.2-3.2c-0.9-0.9-2-1.6-3.2-2.2
+			c-1.2-0.5-2.5-0.8-3.9-0.8c-1.4,0-2.7,0.3-3.9,0.8c-1.2,0.5-2.3,1.2-3.2,2.2c-0.9,0.9-1.6,2-2.2,3.2S821.9,69.8,821.9,71.2z"/>
+	</g>
+</g>
+</svg>

File diff suppressed because it is too large
+ 21 - 15
src/index.html


File diff suppressed because it is too large
+ 3143 - 0
src/js/amplitude-v2.2.0.js


File diff suppressed because it is too large
+ 0 - 2027
src/js/bootstrap.js


src/js/main.js → src/js/chat.js


File diff suppressed because it is too large
+ 0 - 1920
src/js/handlebars.js


src/js/jquery.min.js → src/js/jquery-v2.1.4.js


File diff suppressed because it is too large
+ 28 - 75
src/js/radio.js


src/js/underscore-1.8.3.js → src/js/underscore-v1.8.3.js


File diff suppressed because it is too large
+ 0 - 5
src/js/underscore.min.js