try {

  process.on('uncaughtException', function(e) {
    console.log("**** UNCAUGHT EXCEPTION ****");
    console.log(e);
    console.log(e.stack);
    process.exit(1);
  });
  
  /**
   * Module dependencies.
   */

  var express = require('express')
    , routes = require(__dirname+'/routes');

  var app = module.exports = express.createServer();
  var io  = require('socket.io').listen(app);
  var package = require(__dirname+'/package.json');
  var config = require(package.path.config);
  var docker = require(__dirname+'/docker')(app);
  var authentication = require(__dirname+'/authentication')(config.restrict);
  var sockets = require(__dirname+'/sockets')(io, authentication);

  // Configuration
  process.argv.forEach(function(val, index) {
    if (index<2) {return}
    if (index!=2 || isNaN(val)) {
      console.log("**** ERROR: Unexpected Argument - allowed is only a port number");
      process.exit(1);
    }
    config.port = parseInt(val);
  });
  if (typeof config.port != 'number') {
    console.log("**** WARNING: no valid port given, defaults to 8888");
    config.port = 8888;
  }

  app.configure(function(){
    app.set('views', __dirname + '/views');
    app.set('view engine', 'ejs');
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(require('stylus').middleware({ src: __dirname + '/public' }));
    app.use(app.router);
    app.use(express.static(__dirname + '/public'));
  });

  app.configure('development', function(){
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
  });

  app.configure('production', function(){
    app.use(express.errorHandler());
  });

  // Routes
  app.get('/', routes.index);

  app.listen(config.port, function() {
    console.log("Express server listening on port %d in %s mode",
                app.address().port, app.settings.env);
  });
} catch (e) {
  console.log("**** EXCEPTION ****");
  console.log(e);
  console.log(e.stack);
  process.exit(1);
}
