Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse code

Fixed statistics and missing files

  • Loading branch information...
commit 95caf28b287054773be482834ec3c5ad46094116 1 parent f883d73
hjsch authored

Showing 39 changed files with 977 additions and 785 deletions. Show diff stats Hide diff stats

  1. +1 0  .gitignore
  2. +23 3 app.js
  3. +0 34 bin/app_start.sh
  4. +0 25 bin/app_stop.sh
  5. +0 15 bin/forever-app
  6. +0 15 bin/forever-proxy
  7. +0 39 bin/proxy_start.sh
  8. +0 25 bin/proxy_stop.sh
  9. +24 6 bin/proxyd
  10. +2 1  bin/start_hosted_apps.sh
  11. +1 1  bin/stop_hosted_apps.sh
  12. +1 1  bin/top
  13. +3 3 deps/cloudnode-proxy/proxy-stats.js
  14. +50 29 lib/app.js
  15. +2 2 lib/lib.js
  16. +57 1 lib/middle.js
  17. +0 109 old/bootstrap.sh
  18. +0 27 old/installmodules.rb
  19. +0 64 old/launchnodester.rb
  20. +0 78 old/readme.txt
  21. +8 0 proxy/proxy.js
  22. +1 1  public/static/css/cloudnode-min.css
  23. +50 66 public/static/css/greycurve.css
  24. +1 0  public/static/css/jquery.jqplot.min.css
  25. BIN  public/static/img/cloudnode-logo-small-light.png
  26. BIN  public/static/img/cloudnode-logo2-light.png
  27. BIN  public/static/img/page-bg1.jpg
  28. BIN  public/static/img/page-bg2.jpg
  29. +14 6 public/static/js/cloudnode-min.js
  30. +57 0 public/static/js/jquery.jqplot.min.js
  31. +57 0 public/static/js/plugins/jqplot.canvasAxisLabelRenderer.min.js
  32. +57 0 public/static/js/plugins/jqplot.canvasAxisTickRenderer.min.js
  33. +57 0 public/static/js/plugins/jqplot.canvasTextRenderer.min.js
  34. +57 0 public/static/js/plugins/jqplot.dateAxisRenderer.min.js
  35. +57 0 public/static/js/plugins/jqplot.highlighter.min.js
  36. +351 0 public/static/js/soy-min.js
  37. +43 0 public/static/js/soyutils-min.js
  38. +0 234 scripts/launch_chrooted_app.js
  39. +3 0  scripts/start_hosted_apps.js
1  .gitignore
@@ -7,6 +7,7 @@ ssl/*
7 7 bin/.nodester.config
8 8 *.log
9 9 *.log.*
  10 +*.log*.gz
10 11 node_modules
11 12 logs
12 13 public/static/node-*
26 app.js
@@ -11,7 +11,6 @@ http://nodester.com
11 11
12 12 var express = require('express'),
13 13 url = require('url'),
14   - sys = require('sys'),
15 14 config = require('./config'),
16 15 middle = require('./lib/middle');
17 16
@@ -19,8 +18,6 @@ process.on('uncaughtException', function(err) {
19 18 console.log(err.stack);
20 19 });
21 20
22   -var daemon = require('daemon');
23   -// daemon.setreuid(config.opt.userid);
24 21 var myapp = express.createServer();
25 22 var gzippo = require('gzippo');
26 23
@@ -150,6 +147,29 @@ myapp.post('/appdomains', middle.authenticate, middle.authenticate_app, domains.
150 147 myapp.delete('/appdomains', middle.authenticate, middle.authenticate_app, domains.delete);
151 148 myapp.get('/appdomains', middle.authenticate, domains.get);
152 149
  150 +// Redis DB support
  151 +var redisdb = require('./lib/redisdb');
  152 +// GET will retrieve details of a redis db, read the log/config files or start/stop/restart the database
  153 +// POST will create a named redis db instance
  154 +// DELETE will remove a named redis db instance
  155 +// curl -X GET -u "testuser:123" http://localhost:4001/redis/<dbname>
  156 +// curl -X GET -u "testuser:123" http://localhost:4001/redis/logs/<dbname>
  157 +// curl -X GET -u "testuser:123" http://localhost:4001/redis/config/<dbname>
  158 +// curl -X GET -u "testuser:123" http://localhost:4001/redis/start/<dbname>
  159 +// curl -X GET -u "testuser:123" http://localhost:4001/redis/stop/<dbname>
  160 +// curl -X GET -u "testuser:123" http://localhost:4001/redis/restart/<dbname>
  161 +// curl -X POST -u "testuser:123" -d "dbname=test" http://localhost:4001/redis
  162 +// curl -X DELETE -u "testuser:123" -d "dbname=test" http://localhost:4001/redis
  163 +myapp.get('/redis/:dbname', middle.authenticate, middle.authenticate_redisdb, redisdb.get);
  164 +myapp.get('/redis', middle.authenticate, redisdb.get_all);
  165 +myapp.get('/redis/start/:dbname', middle.authenticate, middle.authenticate_redisdb, redisdb.redis_start);
  166 +myapp.get('/redis/stop/:dbname', middle.authenticate, middle.authenticate_redisdb, redisdb.redis_stop);
  167 +myapp.get('/redis/restart/:dbname', middle.authenticate, middle.authenticate_redisdb, redisdb.redis_restart);
  168 +myapp.get('/redis/logs/:dbname', middle.authenticate, middle.authenticate_redisdb, redisdb.logs);
  169 +myapp.get('/redis/config/:dbname', middle.authenticate, middle.authenticate_redisdb, redisdb.config);
  170 +myapp.post('/redis', middle.authenticate, redisdb.post);
  171 +myapp.delete('/redis', middle.authenticate, middle.authenticate_redisdb, redisdb.delete);
  172 +
153 173
154 174 myapp.use(express.errorHandler({
155 175 showStack: true
34 bin/app_start.sh
... ... @@ -1,34 +0,0 @@
1   -#!/bin/bash
2   -
3   -#if [ "$USER" != "root" ]; then
4   -# echo "Must be root to run this.. Please sudo this command."
5   -# exit
6   -#fi
7   -
8   -cd `dirname $0`
9   -
10   -./node-config.js
11   -wait
12   -source ./.nodester.config
13   -rm ./.nodester.config
14   -
15   -export HOME=$HOME_DIR;
16   -export PATH="/usr/local/bin:${HOME}/bin:${PATH}";
17   -
18   -APPDIR=$APP_DIR
19   -FHOME=$HOME/forever-app/
20   -
21   -if [ ! -d $FHOME ]; then
22   - mkdir -p $FHOME/logs
23   - mkdir -p $FHOME/pids
24   -fi
25   -
26   -if [ -f $FHOME/logs/forever.log ]; then
27   - rm -rRf $FHOME/logs/forever.log
28   -fi
29   -
30   -
31   -wait
32   -forever start -l logs/forever.log -o $FHOME/logs/app-out.log -e $FHOME/logs/app-err.log -d $APPDIR -p $FHOME ../app.js
33   -wait
34   -forever list -p $FHOME app.js
25 bin/app_stop.sh
... ... @@ -1,25 +0,0 @@
1   -#!/bin/bash
2   -
3   -#if [ "$USER" != "root" ]; then
4   -# echo "Must be root to run this.. Please sudo this command."
5   -# exit
6   -#fi
7   -
8   -cd `dirname $0`
9   -
10   -./node-config.js
11   -wait
12   -source ./.nodester.config
13   -rm ./.nodester.config
14   -
15   -export HOME=$HOME_DIR;
16   -export PATH="/usr/local/bin:${HOME}/bin:${PATH}";
17   -
18   -APPDIR=$APP_DIR
19   -
20   -
21   -FHOME=$HOME/forever-app
22   -
23   -forever stopall -p $FHOME
24   -
25   -sleep 1
15 bin/forever-app
... ... @@ -1,15 +0,0 @@
1   -#!/bin/bash
2   -
3   -cd `dirname $0`
4   -
5   -./node-config.js
6   -wait
7   -source ./.nodester.config
8   -
9   -export HOME=$HOME_DIR;
10   -export PATH="/usr/local/bin:${PATH}";
11   -
12   -FHOME=$HOME/forever-app/
13   -
14   -forever "$@" -p $FHOME
15   -
15 bin/forever-proxy
... ... @@ -1,15 +0,0 @@
1   -#!/bin/bash
2   -
3   -cd `dirname $0`
4   -
5   -./node-config.js
6   -wait
7   -source ./.nodester.config
8   -
9   -export HOME=$HOME_DIR;
10   -export PATH="/usr/local/bin:${PATH}";
11   -
12   -FHOME=$HOME/forever-proxy
13   -
14   -
15   -forever "$@" -p $FHOME
39 bin/proxy_start.sh
... ... @@ -1,39 +0,0 @@
1   -#!/bin/bash
2   -
3   -if [ "$USER" != "root" ]; then
4   - echo "Must be root to run this.. Please sudo this command."
5   - exit
6   -fi
7   -
8   -cd `dirname $0`
9   -
10   -./node-config.js
11   -wait
12   -source ./.nodester.config
13   -wait
14   -rm ./.nodester.config
15   -
16   -export HOME=$HOME_DIR;
17   -export PATH="/usr/local/node-v0.4.0/usr/local/bin:${HOME}/bin:${PATH}";
18   -
19   -APPDIR=$APP_DIR/proxy
20   -
21   -FHOME=$HOME/forever-proxy
22   -
23   -if [ ! -d $HOME/var ]; then
24   - mkdir $HOME/var
25   -fi
26   -
27   -if [ ! -d $FHOME ]; then
28   - mkdir -p $FHOME/logs
29   - mkdir -p $FHOME/pids
30   -fi
31   -
32   -if [ -f $FHOME/logs/forever.log ]; then
33   - rm -rRf $FHOME/logs/forever.log
34   -fi
35   -
36   -ulimit -n 99999;
37   -forever start -l logs/forever.log -o $FHOME/logs/proxy-out.log -e $FHOME/logs/proxy-err.log -d $APPDIR -p $FHOME $APPDIR/proxy.js
38   -wait
39   -forever list -p $FHOME proxy.js
25 bin/proxy_stop.sh
... ... @@ -1,25 +0,0 @@
1   -#!/bin/bash
2   -
3   -if [ "$USER" != "root" ]; then
4   - echo "Must be root to run this.. Please sudo this command."
5   - exit
6   -fi
7   -
8   -cd `dirname $0`
9   -
10   -./node-config.js
11   -wait
12   -source ./.nodester.config
13   -wait
14   -rm ./.nodester.config
15   -
16   -export HOME=$HOME_DIR;
17   -export PATH="/usr/local/bin:${HOME}/bin:${PATH}";
18   -
19   -APPDIR=$APP_DIR
20   -
21   -FHOME=$HOME/forever-proxy
22   -
23   -forever stopall -p $FHOME
24   -
25   -sleep 1
30 bin/proxyd
@@ -6,12 +6,18 @@ APP="Proxy"
6 6 DATE=$(date)
7 7 LOG="proxyd.log"
8 8
  9 +# Stashboard bin path
  10 +STASH_PATH=/home/hajo/bin
  11 +
  12 +# used to append the current date to the archive name
  13 +DATE2=$(date +"%Y%m%d")
  14 +
9 15 if [ -z "$USER" ]; then
10 16 USER=root
11 17 fi
12 18
13 19 cd /var/cloudnode/nodester
14   -#echo "$DATE Proxy control started with command $1 as user $USER" | tee -a $LOG
  20 +echo "$DATE Proxy control started with command $1 as user $USER" | tee -a $LOG
15 21
16 22 get_pid()
17 23 {
@@ -26,8 +32,18 @@ case "$1" in
26 32 fi
27 33 get_pid
28 34 if [ -z "$PID" ]; then
29   - /usr/local/node-v0.4.0/node proxy/proxy.js > proxy.log | tee -a $LOG &
  35 + # save log file
  36 + mv proxy.log proxy.log.$DATE2
  37 + # start proxy
  38 +# /usr/local/node-v0.4.0/node proxy/proxy.js > proxy.log | tee -a $LOG &
  39 +# /usr/local/node-v0.6.11/node proxy/proxy.js > proxy.log | tee -a $LOG &
  40 + node proxy/proxy.js > proxy.log | tee -a $LOG &
30 41 echo "$APP started" | tee -a $LOG
  42 +
  43 + # log event
  44 + if [ "$2" = "notify" ]; then
  45 + python ${STASH_PATH}/stashboard-client/cloudnode-status.py -t cloudnode-proxy -s up -m "online with all services"
  46 + fi
31 47 else
32 48 echo "$APP is already running ($PID)" | tee -a$LOG
33 49 fi
@@ -38,6 +54,12 @@ case "$1" in
38 54 if [ -n "$PID" ]; then
39 55 kill -9 $PID
40 56 echo "$APP stopped ($PID)" | tee -a $LOG
  57 +
  58 + # log event
  59 + if [ "$2" = "notify" ]; then
  60 + python ${STASH_PATH}/stashboard-client/cloudnode-status.py -t cloudnode-proxy -s down -m "The Cloudnode proxy service is experiencing a service disruption"
  61 + fi
  62 +
41 63 else
42 64 echo "$APP is not running ($PID)" | tee -a $LOG
43 65 fi
@@ -49,9 +71,7 @@ case "$1" in
49 71 exit
50 72 fi
51 73 $0 stop
52   - $0 stat
53 74 sleep 1
54   - $0 stat
55 75 $0 start
56 76 $0 stat
57 77 ;;
@@ -71,5 +91,3 @@ case "$1" in
71 91 ;;
72 92
73 93 esac
74   -
75   -
3  bin/start_hosted_apps.sh
@@ -6,4 +6,5 @@ cd `dirname $0`
6 6 wait
7 7 source ./.nodester.config
8 8
9   -node $APP_DIR/scripts/start_hosted_apps.js start "$@"
  9 +ulimit -n 2048
  10 +sudo -u cloudnode /usr/local/node-v0.4.12/node $APP_DIR/scripts/start_hosted_apps.js start "$@"
2  bin/stop_hosted_apps.sh
@@ -6,4 +6,4 @@ cd `dirname $0`
6 6 wait
7 7 source ./.nodester.config
8 8
9   -node $APP_DIR/scripts/start_hosted_apps.js stop "$@"
  9 +/usr/local/node-v0.4.12/node $APP_DIR/scripts/start_hosted_apps.js stop "$@"
2  bin/top
... ... @@ -1,7 +1,7 @@
1 1 #!/usr/bin/env node
2 2
3 3 var exec = require('child_process').exec;
4   -var cmd = "ps aux | awk '/launch_chroot/ && !/awk/ {print $3,$4,$2,$5,$6,$10,$13}' | sort -r | head -n 20";
  4 +var cmd = "ps aux | awk '/launch_/ {print $3,$4,$2,$5,$6,$10,$13}' | sort -r | head -n 20";
5 5
6 6 require('colors');
7 7
6 deps/cloudnode-proxy/proxy-stats.js
@@ -59,13 +59,13 @@ exports.recordRequest = function(req, options) {
59 59 "hits",
60 60 "hits-by-app:" + appName,
61 61 "hits-by-day:" + day,
62   - "hits-by-app-by-month:" + appName + ':' + month,
63   - "hits-by-ip-by-day:" + ip,
  62 + "hits-by-app-by-month:" + appName + ':' + month,
  63 + "hits-by-ip-by-day:" + ip + ':' + day,
64 64 ];
65 65
66 66 if (referer) {
67 67 urlhash = crypto.createHash("md5").update(referer).digest("hex");
68   - keys.push("hits-by-app-by-url-by-day:" + urlhash + ":" + day);
  68 + keys.push("hits-by-app-by-url-by-day:" + appName + ':' + urlhash + ":" + day);
69 69 client.set("url:" + urlhash, referer);
70 70 }
71 71
79 lib/app.js
@@ -3,6 +3,7 @@ var config = require('../config'),
3 3 path = require('path'),
4 4 cradle = require('cradle'),
5 5 lib = require('./lib'),
  6 + util = require('util'),
6 7 spawn = require('child_process').spawn,
7 8 exec = require('child_process').exec;
8 9
@@ -39,17 +40,17 @@ module.exports = {
39 40 res.writeHead(500, { 'Content-Type': 'application/json' });
40 41 res.end(JSON.stringify({status: "failure", message: err.error + ' - ' + err.reason}) + '\n');
41 42 } else {
42   - console.log('Resetting repo from git: ', app.repo_id);
  43 + util.log('Resetting repo from git: ' + app.repo_id);
43 44 var app_user_home = path.join(config.opt.apps_home_dir, user._id, app.repo_id);
44 45 var cmd = 'rm -rf "' + app_user_home + '"';
45   - console.log('cmd:', cmd);
  46 + util.log('cmd:' + cmd);
46 47
47 48 //Delete the Git clone chroot dir
48 49 exec(cmd, function() {
49 50 var git = 'cd "' + app_user_home + '.git" && git clone . "' + app_user_home + '"';
50   - console.log('Clone: ', git);
  51 + util.log('Clone: ' + git);
51 52 exec(git, function() {
52   - console.log('Restarting app');
  53 + util.log('Restarting app');
53 54 //Restart the app to make a fresh clone
54 55 app_restart(app.repo_id, function() {
55 56 res.send({
@@ -333,10 +334,10 @@ module.exports = {
333 334 res.end(JSON.stringify({status: "failure", message: err.error + ' - ' + err.reason}) + '\n');
334 335 } else {
335 336 var cmd = config.opt.app_dir + '/scripts/gitreposetup.sh ' + [config.opt.app_dir, config.opt.git_home_dir, user._id, repo_id, start, config.opt.userid, appname, config.opt.apps_home_dir].join(' ');
336   - console.log('gitsetup cmd: %s', cmd);
  337 + util.log('gitsetup cmd: ' + cmd);
337 338 exec(cmd, function(err, stdout, stderr) {
338 339 if (err) console.error('gitsetup error: %s', err);
339   - if (stdout.length > 0) console.log('gitsetup stdout: %s', stdout);
  340 + if (stdout.length > 0) util.log('gitsetup stdout: ' + stdout);
340 341 if (stderr.length > 0) console.error('gitsetup stderr: %s', stderr);
341 342 });
342 343
@@ -376,7 +377,7 @@ module.exports = {
376 377 });
377 378 },
378 379 env_put: function(req, res, next) {
379   - var appname = req.body.appname.toLowerCase();
  380 + var appname = req.body.appname;
380 381 var db = lib.get_couchdb_database('apps');
381 382 var key = req.body.key,
382 383 value = req.body.value;
@@ -406,7 +407,7 @@ module.exports = {
406 407 });
407 408 },
408 409 env_delete: function(req, res, next) {
409   - var appname = req.body.appname.toLowerCase();
  410 + var appname = req.body.appname;
410 411 var db = lib.get_couchdb_database('apps');
411 412 var key = req.body.key;
412 413 if (!key) {
@@ -470,23 +471,23 @@ var env_update = function(res, db, appname, appdoc, key, value) {
470 471
471 472
472 473 var force_stop = function(repo_id, callback) {
473   - console.log('Forcing stop for: ', repo_id);
474   - console.log("ps aux | awk '/" + repo_id + "/ && !/awk |curl / {print $2}'");
  474 + util.log('Forcing stop for: ' + repo_id);
  475 + util.log("ps aux | awk '/" + repo_id + "/ && !/awk |curl / {print $2}'");
475 476 exec("ps aux | awk '/" + repo_id + "/ && !/awk |curl / {print $2}'", function(err, pid) {
476 477 if (err) {
477 478 callback(false);
478 479 return;
479 480 }
480 481 try {
481   - console.log('PID: "' + pid + '"');
482 482 var pids = pid.split('\n'),
483 483 k = false;
484 484 var p = parseInt(pids[0]);
485   - console.log('p: "' + p + '"');
  485 + util.log('PID: "' + p + '"');
486 486 if (p > 0) {
487   - console.log('Sending SIGKILL to ', p);
  487 + util.log('Sending SIGKILL to ' + p);
488 488 process.kill(p, 'SIGKILL');
489 489 k = true;
  490 + util.log('Application stopped. (Forced SIGKILL)');
490 491 }
491 492 callback(k);
492 493 } catch (e) {
@@ -502,9 +503,12 @@ var app_stop = function (repo_id, callback) {
502 503 if (err) {
503 504 callback(false);
504 505 } else {
  506 + util.log('### Application ' + doc.appname + ' stopping...');
505 507 var app_home = path.join(config.opt.apps_home_dir, doc.username, doc._id);
  508 + util.log('Reading: ' + path.join(app_home, '.nodester', 'pids', 'app.pid'));
506 509 fs.readFile(path.join(app_home, '.nodester', 'pids', 'app.pid'), function (err, data) {
507 510 if (err) {
  511 + util.log('Could not read app.pid - forcing stop');
508 512 force_stop(repo_id, callback);
509 513 } else {
510 514 try {
@@ -512,6 +516,11 @@ var app_stop = function (repo_id, callback) {
512 516 fs.unlink(path.join(app_home, '.nodester', 'pids', 'app.pid'));
513 517 if (p > 0) {
514 518 process.kill(p, 'SIGKILL');
  519 + util.log('Application stopped. (SIGKILL)');
  520 + // write stop event to log file
  521 + var error_log_fd = fs.openSync(path.join(app_home, '', 'error.log'), 'a');
  522 + fs.write(error_log_fd, "\n\nApplication stopped. (API app stop) " + new Date());
  523 + fs.closeSync(error_log_fd);
515 524 } else {
516 525 force_stop(repo_id, callback);
517 526 }
@@ -538,6 +547,7 @@ var app_start = function (repo_id, callback) {
538 547 if (err) {
539 548 callback(false);
540 549 } else {
  550 + util.log('### Application ' + doc.appname + ' starting...');
541 551 var configData = {
542 552 appdir: config.opt.app_dir,
543 553 userid: config.opt.uid,
@@ -546,46 +556,57 @@ var app_start = function (repo_id, callback) {
546 556 port: app.port,
547 557 ip: '127.0.0.1',
548 558 name: doc.appname,
549   - env: app.env || {}
  559 + env: app.env || {}
550 560 };
551   - console.log('Checking: ', app_home);
  561 + util.log('Checking: ' + app_home);
552 562 if (!path.existsSync(app_home)) {
553 563 //Bad install??
554   - console.log('App directory does not exist: ', app_home);
  564 + util.log('App directory does not exist: ' + app_home);
555 565 callback(false);
556 566 return;
557 567 }
558   - console.log('Checking: ', path.join(app_home, app.start));
  568 + util.log('Checking: ' + path.join(app_home, app.start));
559 569 if (!path.existsSync(path.join(app_home, app.start))) {
560 570 //Bad install??
561   - console.log('App start file does not exist: ', path.join(app_home, app.start));
  571 + util.log('App start file does not exist: ' + path.join(app_home, app.start));
562 572 callback(false);
563 573 return;
564 574 }
565 575
566   - console.log('Checking: ', path.join(app_home, '.nodester'));
  576 + util.log('Checking: ' + path.join(app_home, '.nodester'));
567 577 if (!path.existsSync(path.join(app_home, '.nodester'))) {
568   - console.log('Making Directories..');
  578 + util.log('Making Directories..');
569 579 fs.mkdirSync(path.join(app_home, '.nodester'), 0777);
570 580 fs.mkdirSync(path.join(app_home, '.nodester', 'logs'), 0777);
571 581 fs.mkdirSync(path.join(app_home, '.nodester', 'pids'), 0777);
572 582 }
573   - console.log('Writing config data: ', path.join(app_home, '.nodester', 'config.json'));
  583 + util.log('Writing config data: ' + path.join(app_home, '.nodester', 'config.json'));
574 584 fs.writeFileSync(path.join(app_home, '.nodester', 'config.json'), JSON.stringify(configData), encoding='utf8');
575   - //var cmd = "sudo " + path.join(config.opt.app_dir, 'scripts', 'launch_app.sh') + ' ' + config.opt.app_dir + ' ' + config.opt.userid + ' ' + app_home + ' ' + app.start + ' ' + app.port + ' ' + '127.0.0.1' + ' ' + doc.appname;
576   - var cmd = 'cd ' + app_home + ' && sudo ' + path.join(config.opt.app_dir, 'scripts', 'launch_chrooted_app.js') + ' "' + doc.username + '/' + repo_id + '/' + doc.appname + '/' + app.start + ':' + app.port + '"';
577   - console.log(cmd);
  585 +
  586 + var cmd = 'cd ' + app_home + ' && sudo ' + path.join(config.opt.app_dir, 'scripts', 'launch_app.js') +
  587 + ' "' + doc.username + '/' + repo_id + '/' + doc.appname + '/' + app.start + ':' + app.port + '"';
  588 +
  589 + // check node version
  590 + var node_version = configData.env.node_version;
  591 +
  592 + if (node_version != undefined && node_version.substring(0, 3) == '0.6') {
  593 + cmd = 'sudo ' + path.join(config.opt.app_dir, 'bin', 'node-runner') + ' ' + app_home + ' ' + doc.appname + ' ' + app.start + ' ' + app.port;
  594 + }
  595 +
  596 + util.log(cmd);
578 597 exec(cmd, function (error, stdout, stderr) {
579 598 if (stdout) {
580 599 console.log(stdout);
581 600 }
582 601 if (stderr) {
583   - console.log(stderr);
  602 + console.log('Launcher: ' + stderr);
  603 + }
  604 + if (error != null) {
  605 + console.log('Exec: ' + error);
584 606 }
585   - console.log('Getting new PID');
586   - console.log("ps aux | awk '/" + repo_id + "/ && !/awk |curl / {print $2}'");
  607 + util.log('Getting new PID');
  608 + util.log("ps aux | awk '/" + repo_id + "/ && !/awk |curl / {print $2}'");
587 609 exec("ps aux | awk '/" + repo_id + "/ && !/awk |curl / {print $2}'", function(err, pid) {
588   - console.log('PID: "' + pid + '"');
589 610 var tapp = {
590 611 pid: 'unknown',
591 612 running: 'failed-to-start'
@@ -597,7 +618,7 @@ var app_start = function (repo_id, callback) {
597 618 tapp.pid = p;
598 619 tapp.running = 'true';
599 620 }
600   - console.log(tapp);
  621 + util.log('Application ' + doc.appname + ' has been started - ' + util.inspect(tapp));
601 622 apps.merge(doc.appname, tapp, function() {
602 623 callback(true, p);
603 624 });
4 lib/lib.js
@@ -69,8 +69,8 @@ var default_routes = {
69 69 router: {}
70 70 };
71 71 default_routes.router["127.0.0.1"] = "127.0.0.1:4001";
72   -default_routes.router[www_dom] = "81.169.133.153";
73   -default_routes.router[tl_dom] = "81.169.133.153";
  72 +default_routes.router[www_dom] = "127.0.0.1:8989";
  73 +default_routes.router[tl_dom] = "127.0.0.1:8989";
74 74 default_routes.router[api_dom] = "127.0.0.1:4001";
75 75 default_routes.router[docs_dom] = "81.169.133.153";
76 76 default_routes.router[gitweb_dom] = "127.0.0.1:90";
58 lib/middle.js
@@ -100,9 +100,65 @@ var authenticate_app = function(req, res, next) {
100 100 }
101 101 };
102 102
  103 +/**
  104 + * Use CouchDB to get redis information, this route must come AFTER middle.authenticate
  105 + */
  106 +var authenticate_redisdb = function(req, res, next) {
  107 + //GET Request
  108 + var dbName = req.params.dbname;
  109 + //POST|DELETE|PUT requests
  110 + if (!dbName && req.query && req.query.dbname) {
  111 + dbName = req.query.dbname;
  112 + }
  113 + if (!dbName && req.body && req.body.dbname) {
  114 + dbName = req.body.dbname;
  115 + }
  116 + if (dbName) {
  117 + dbName = dbName.toLowerCase();
  118 + }
  119 +
  120 + if (!dbName || dbName === '') {
  121 + res.writeHead(400, {
  122 + 'Content-Type': 'application/json'
  123 + });
  124 + res.end('{"status" : "Must pass an redis database name (dbName)."}\n');
  125 + return;
  126 + }
  127 +
  128 + if (req.user) {
  129 + var db = lib.get_couchdb_database('redis');
  130 + db.get(dbName, function(err, doc) {
  131 + if (err) {
  132 + res.writeHead(400, {
  133 + 'Content-Type': 'application/json'
  134 + });
  135 + res.end('{"status" : "failure - redis database not found (' + dbName + ')"}\n');
  136 + } else {
  137 + if (doc.username == req.user._id) {
  138 + req.dbName = dbName;
  139 + req.doc = doc;
  140 + next();
  141 + } else {
  142 + res.writeHead(400, {
  143 + 'Content-Type': 'application/json'
  144 + });
  145 + res.end('{"status" : "failure - authentication for ' + dbName + ' failed."}\n');
  146 + }
  147 + }
  148 + });
  149 + } else {
  150 + res.writeHead(400, {
  151 + 'Content-Type': 'application/json'
  152 + });
  153 + res.end('{"status" : "failure - authentication."}\n');
  154 + }
  155 +};
  156 +
103 157
104 158 module.exports.authenticate = authenticate;
105 159 module.exports.authenticate_app = authenticate_app;
  160 +module.exports.authenticate_redisdb = authenticate_redisdb;
  161 +
106 162 /*
107 163 * Generic request error handler.
108 164 */
@@ -119,4 +175,4 @@ module.exports.error = function() {
119 175 };
120 176 next();
121 177 };
122   -};
  178 +};
109 old/bootstrap.sh
... ... @@ -1,109 +0,0 @@
1   -#!/bin/bash
2   -# Paste this in the userdata field while launching a new instance.
3   -
4   -########################################
5   -# Created by John Alberts
6   -# Mofied by John Dyer
7   -# Mofied by Chris Matthieu
8   -# Last modified: 1/9/2011
9   -#
10   -# Error Codes:
11   -# 1 - Not running as root
12   -# 2 - Invalid hostname
13   -# 3 - Failed to get remove Ruby OS packages
14   -# 4 - Failed to compile and install Ruby
15   -#
16   -# NOTES:
17   -# This only works on CentOS 5. Only tested on x86_64
18   -#
19   -#########################################
20   -
21   -
22   -RUBY_SOURCE_URL="ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p330.tar.gz"
23   -# The below URL only works from within the exlibrisgroup network. Anyone else should use the URL above.
24   -
25   -if ! ( whoami | grep root > /dev/null 2>&1); then
26   - echo "YOU MUST BE ROOT TO RUN THIS SCRIPT"'!'
27   - exit 1
28   -fi
29   -
30   -if ! ( ping -c1 -q `hostname -f` > /dev/null 2>&1 ); then
31   - echo "hostname -f must be a valid fqdn for Chef to work properly"'!'
32   - exit 2
33   -fi
34   -
35   -echo "Removing already installed Ruby OS packages..."
36   -PKGLIST="$(yum list | grep installed | grep ruby | sed -n 's/\([^.]*\)\.\(x86_64\|i386\).*$/\1/p' | tr '\n' ' ')"
37   - if [[ $PKGLIST != "" ]]; then
38   - yum -y erase $PKGLIST
39   - RETVAL=$?
40   - else
41   - RETVAL=0
42   - fi
43   -
44   -echo;echo
45   -if [[ ${RETVAL} -ne 0 ]]; then
46   - echo "Failed to remove Ruby OS packages"'!'
47   - exit 3
48   -fi
49   -
50   -echo "Installing Ruby and dependencies..."
51   -yum -y install gcc gcc-c++ zlib-devel openssl-devel readline-devel
52   -
53   -mkdir /tmp/sources
54   -cd /tmp/sources
55   -
56   -
57   -# Get # cpu's to make this faster
58   -CPUS="$(grep processor /proc/cpuinfo | wc -l)"
59   -
60   -wget "${RUBY_SOURCE_URL}"
61   -tar -xvzf $(basename ${RUBY_SOURCE_URL})
62   -cd $(basename ${RUBY_SOURCE_URL/.tar.gz})
63   -./configure
64   -make -j $CPUS
65   -make -j $CPUS install
66   -RETVAL=$?
67   -
68   -echo;echo
69   -
70   -if [[ ${RETVAL} -ne 0 ]]; then
71   -echo "RUBY INSTALLATION FAILED"'!'
72   -exit 4
73   -fi
74   -
75   -echo 'gem: --no-ri --no-rdoc' > /root/.gemrc
76   -
77   -sudo rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
78   -
79   -
80   -# yum install git-core
81   -cd /tmp
82   -wget http://kernel.org/pub/software/scm/git/git-1.7.3.5.tar.bz2
83   -bzip2 -d git-1.7.3.5.tar.bz2
84   -tar xvf git-1.7.3.5.tar
85   -cd git-*
86   -./configure
87   -make prefix=/usr install
88   -# make install
89   -
90   -
91   -# curl -O http://production.cf.rubygems.org/rubygems/rubygems-1.4.1.tgz
92   -wget http://production.cf.rubygems.org/rubygems/rubygems-1.4.1.tgz
93   -tar xfz rubygems-1.4.1.tgz
94   -/usr/local/bin/ruby setup.rb
95   -
96   -gem install chef ohai --no-rdoc --no-ri
97   -mkdir /etc/chef
98   -chown root:root /etc/chef
99   -
100   -cd /tmp
101   -wget http://nodejs.org/dist/node-v0.3.4.tar.gz
102   -tar -zxvf node-v0.3.4.tar.gz
103   -cd node*
104   -./configure
105   -make
106   -make install
107   -
108   -
109   -echo "Installation completed."
27 old/installmodules.rb
... ... @@ -1,27 +0,0 @@
1   -#!/usr/bin/env ruby
2   -
3   -# Replace with `npm ls | awk '{print $1}' | xargs npm install`
4   -
5   -require 'rubygems'
6   -require 'json'
7   -require 'net/http'
8   -
9   -class MethodTable # returns JSON hash containing all NPM modules available
10   -def get_table
11   -url = "http://registry.npmjs.org"
12   -url = URI.parse(url)
13   -method_list = Net::HTTP.get(url)
14   -end
15   -end
16   -
17   -method_table = MethodTable.new
18   -table = method_table.get_table
19   -table = JSON.parse(table)
20   -
21   -table.each do |i|
22   - if i[0].downcase != "uninstall"
23   - puts "nmp install #{i[0]}"
24   - # system 'npm install #{i[0]}' rescue nil
25   - `npm install #{i[0]}` rescue nil
26   - end
27   -end
64 old/launchnodester.rb
... ... @@ -1,64 +0,0 @@
1   -#!/usr/bin/env ruby
2   -
3   -# Run this app to stop and restart all Nodester jobs
4   -
5   -require 'rubygems'
6   -require 'json'
7   -
8   -# Kill all node processes
9   -# `killall node`
10   -`sudo sh -c "killall node"`
11   -
12   -
13   -# Launch Nodester
14   -child_pid = fork do
15   - # Must be started with SUDO to run on port 80
16   - `sudo sh -c "/usr/local/bin/node proxy.js"`
17   - # `sudo sh -c "/usr/local/bin/nodemon proxy.js"`
18   - # `sudo sh -c "/usr/local/bin/forever proxy.js"`
19   -end
20   -Process.detach(child_pid)
21   -
22   -child_pid = fork do
23   - `nodemon app.js`
24   -end
25   -Process.detach(child_pid)
26   -
27   -
28   -# Launch Apps
29   -require 'rest-client'
30   -res = RestClient.get 'http://nodefu:glitter@nodefu.couchone.com/apps/_design/nodeapps/_view/all', {:accept => :json}
31   -
32   -# server = Couch::Server.new("nodefu.couchone.com", "80")
33   -# res = server.get('/apps/_design/nodeapps/_view/all')
34   -
35   -jsonresp = res.body
36   -dbdata = JSON.parse(jsonresp)
37   -nodesterdir = Dir.pwd
38   -dbdata["rows"].each do |app|
39   - begin
40   - child_pid = fork do
41   - begin
42   - Dir.chdir("apps/#{app["value"]["_rev"]}")
43   - # Dir.chdir("apps/#{app["value"]["_id"]}")
44   - `nodemon #{app["value"]["start"]}`
45   - Dir.chdir("../..")
46   - puts app["value"]["_id"] + ' : ' + app["value"]["_rev"] + ' : ' + app["value"]["start"]
47   - # puts app["value"]["_id"] + ' : ' + app["value"]["_id"] + ' : ' + app["value"]["start"]
48   - rescue Exception => e
49   - Dir.chdir(nodesterdir)
50   - end
51   - end
52   - Process.detach(child_pid)
53   - rescue Exception => e
54   - Dir.chdir(nodesterdir)
55   - end
56   -
57   -
58   -end
59   -
60   -puts "Nodester launched - HiYah!"
61   -
62   -exit
63   -# res = server.put("/imsms/phonosdk", '{ "jid":"' + jid.to_s + '", "_rev":"' + dbdata["_rev"].to_s + '" }')
64   -
78 old/readme.txt
... ... @@ -1,78 +0,0 @@
1   -Nodester (http://nodester.com) = Node.js Hosting Platform
2   -
3   -This is an *experimental* service for managing hosted nodejs apps. It consists of an API that allows developers to create and manage nodejs apps. Node apps are assigned subdomains that proxy to ports with an assigned address. Instances (dynos) are launched using Forever so that they run until you stop them or using Nodemon where they run until a file changes from a git update.
4   -
5   -Please see install.txt for setup instructions.
6   -
7   -API Documentation:
8   -
9   -COUPON
10   -/coupon - creates coupon request for early access (pass in email) - <b>Note: This resource does not use base api url
11   -curl -X POST -d "email=chris@nodester.com" http://localhost:8080/coupon
12   -
13   -STATUS
14   -/status - returns status of the platform and number of nodejs apps running
15   -// curl http://api.localhost:8080/status
16   -
17   -USER
18   -/user - creates user account (pass in user and password and email) - Note: This resource does not use the api subdomain
19   -curl -X POST -d "user=testuser&password=123&email=chris@nodester.com" http://localhost:8080/user
20   -
21   -/user - delete user account (requires basic auth)
22   -curl -X DELETE -u "testuser:123" http://api.localhost:8080/user
23   -
24   -APP
25   -/app - create nodejs app for hosting (requires basic auth and returns the port address required for use along with a git repo to push to)
26   -curl -X POST -u "testuser:123" -d "appname=a&start=hello.js" http://api.localhost:8080/app
27   -
28   -Get information about an app
29   -curl -u "testuser:123" http://api.localhost:8080/app/a
30   -
31   -Start or stop an app using running=true|false
32   -curl -X POST -u "testuser:123" -d "appname=a&running=true" http://api.localhost:8080/app
33   -curl -X POST -u "testuser:123" -d "appname=a&running=false" http://api.localhost:8080/app
34   -
35   -/app - update nodejs app for hosting (requires basic auth, appname, and starting page and returns the port address required for use along with a git repo to push to)
36   -curl -X PUT -u "testuser:123" -d "appname=a&start=hello1.js" http://api.localhost:8080/app
37   -
38   -/app - delete nodejs app (requires basic auth and appname)
39   -curl -X DELETE -u "testuser:123" -d "appname=test" http://api.localhost:8080/app
40   -
41   -/app - get nodejs app info (requires basic auth and appname)
42   -curl -u "testuser:123" http://api.localhost:8080/app/appname
43   -
44   -/apps - get all your apps info (requires basic auth)
45   -curl -u "testuser:123" http://api.localhost:8080/apps
46   -
47   -/appnpm - install, update and uninstall npm packages to your application
48   -curl -X POST -u "testuser:123" -d "appname=a&action=install&package=express" http://api.localhost:8080/appnpm
49   -
50   -Testing:
51   -Subdomains can be tested by editing /etc/hosts like this:
52   -127.0.0.1 localhost a.localhost b.localhost c.localhost
53   -save etc/hosts and flush DNS like this: sudo dscacheutil -flushcache
54   -
55   -http://localhost:8080 = Homepage
56   -http://a.localhost:8080 = Runs app associated with subdomain a on couch-configured port
57   -http://b.localhost:8080 = Runs app associated with subdomain b on couch-configured port
58   -http://chris:123@api.localhost:8080/status = API to list status of all node apps
59   -http://chris:123@api.localhost:8080/list/2.json = API TBD
60   -
61   -Todos:
62   -- add rsa keys for private repos (gitolite or gitosis?)
63   -- add ability to control number of instances
64   -- Add Command Line Interface
65   -- Add SSL support
66   -- Add better error handling
67   -
68   -Considerations:
69   -- 64k port limitation per IP address on Linux - how do we scale horizontally?
70   - -- We can using 127.0.0.X so aliases on lo device
71   -- sandbox node instances?
72   - -- Chroot?
73   -
74   -Contribute:
75   -If this project inspires you, please feel free to help out by forking this project and sending me pull requests.
76   -
77   -License:
78   -Apache 2 - Have fun! :)
8 proxy/proxy.js
@@ -106,6 +106,13 @@ var handle_http_request = function(req, res) {
106 106 Location: 'http://cloudno.de'
107 107 });
108 108 res.end();
  109 + } else if (req.headers.host == 'cloudno.de' &&
  110 + (req.url.indexOf('/user') == 0 ||
  111 + req.url.indexOf('/login') == 0 ||
  112 + req.url.indexOf('/admin') == 0 ||
  113 + req.url.indexOf('/signup') == 0)) {
  114 + var proxy = new httpProxy.HttpProxy({host: "81.169.133.153", port: 80});
  115 + proxy.proxyRequest(req, res);
109 116 } else {
110 117 var options = lookup_hostport(req.headers.host);
111 118 if (options !== null) {
@@ -179,6 +186,7 @@ lib.update_proxytable_map(function(err) {
179 186 if (req.headers.host == 'cloudno.de' &&
180 187 (req.url.indexOf('/lead') == 0 ||
181 188 req.url.indexOf('/api') == 0 ||
  189 + req.url.indexOf('/beta') == 0 ||
182 190 req.url.indexOf('/account') == 0 ||
183 191 req.url.indexOf('/contact') == 0 ||
184 192 req.url.indexOf('/myapps') == 0 ||
2  public/static/css/cloudnode-min.css
... ... @@ -1 +1 @@
1   -body.landing{margin:8px;background:#254278 url(https://cloudno.de/static/img/cloudnode-bg.png) repeat}div#container{clear:both;padding-top:150px;color:white}div#container h1{text-align:center}div#container h4{text-align:center;margin-top:1.33em}p#thanks{font-weight:bold;color:white}div#form{width:660px;padding:25px 40px;border:1px solid #1b386e;margin:20px auto;display:block;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;background:#254278;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#2f4c82),to(#223f75));background:-moz-linear-gradient(center top,#2f4c82 0%,#223f75 100%);background:-ms-linear-gradient(bottom,#2f4c82,#223f75)}div.rpx_box{float:right;font-size:11px;margin-right:25px;margin-top:5px;padding-left:20px;padding-top:5px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAzZJREFUeNpiOHXqFMP/JAYbJkZGxmIGBobDAAHEABZJYWBgPHXuIgPTv99pAAEEFgGLRjP8P336NAMTUJ0bExOTCAM7AwP321sMAAHEeObMGQbjOSYMDH8YGIGS/1mABMPJnNsxQGP+s/z4sJTp////rxV3VS1h/f52KVCuBmSfCPfzKwxGM8xBilsAAogRZAPQUIZ///4xmPabMTBwMvxn+MHAeLr4HANQMdhWEFgEVPT/Yvq2JoZfDAyX07Y0Mf3/943x39+jQHGmV0B77vxnZGbUX+RVx8DGwKA7zacO6AguoEZrJlZWVjEg4z7j/7+/T+VePgl07jsGXgYG4+nGYKMBAogR5DsQMJlrCrHsN0Md0EdNIObZjDNwNzBcjtjCALR/H5BpdjlmC8OZrPNgcRaYgp98Mvo/+BWk/zOz/PrJJ6vL+O/3ZZgCZaB3zv9jZDoIDKt/wND6C0SNQHFQQLCyACXv/P371+k3v/h+9ncP9gAd+fUfK1cq868vmUAFn8FWAL26X3++KwMDM9B5LAyMf1m53gIVtIDlgPgjMBxKr4SvZGD4C7KCgcWyUY7hPzMb2G2gsBcAmpDI+ufb/y/S+kZAsY0M3EBv9+mBFQAEGAsoLkBhDsJAk8DYdAYwTiAGJDH8ZOgC2gOMGAY3UDRcSN0NVgsCfzgEEMGADE7nX2PgenmFQXtxWATQIGFg4L6/Grua4ZuYNgPjr69wA2B+gAGQnUlAyV1Mv789+Cxt8vuTirUzwxcGhg/qziEgPlD8PlB+K1AdMMExqAFxDsgAIaDgFlBcAJ1fzsDEsvgvK7ctz5NTrLz3ju9mACYJgZv714teX88KDD1/oDopIF4MxDeBuJcFGEBHgQwNYHpcAKQT/zMyMUiemc0gu6cPlDZZIe78x8b4+xcDRBOjITAyEV4A2noPnKoYGWWBbB6mf78Y7jvUMKCEDjMDg9LuCga+xyd//mPhRAkvJnZ2dm+g5jogNmJmZv4MNGoG++cXVkern0r8Y+BghloGDiuN9YkMpl1aDOyfnqK4AEQ3A2khIBYHeuUsy59vZWw/35/6KqPPCjTAHijvA9cBdIDOUn84FwCczyRTHGMoXwAAAABJRU5ErkJggg%3D%3D) no-repeat scroll 0 50% transparent}.email{color:#808080;width:490px;font-size:28px;padding:4px;background-color:#d0d0d0;border:1px inset #aaa;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}a:focus{outline:none}.error{background-color:#f9ff9a;border:1px solid #e6db55}div.inline-msg{background:#fff1a8;border-color:#fff1a8;color:black;margin-top:4px;float:right}#footer{font-size:10px;width:620px;margin:auto;color:white}div.rpx_box{color:white}div.rpx_box a,div#footer a,div#container a{color:#4c92e9;text-decoration:none}a#signup{border:solid #ffd452 1px;float:right;color:#333;display:block;font-family:Helvetica,Arial,sans-serif;font-size:18px;font-weight:bold;width:130px;padding:10px;margin-top:2px;text-align:center;text-decoration:none;text-shadow:#df6 0 1px 0;cursor:pointer;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;background:#ecd87a;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#f8efae),to(#f5d55a));background:-moz-linear-gradient(center top,#f8efae 0%,#f5d55a 100%);background:-ms-linear-gradient(bottom,#f8efae,#f5d55a)}a#signup:hover,a#signup:focus{background:#111;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#eee4a2),to(#ebcc52));background:-moz-linear-gradient(center top,#eee4a2 0%,#ebcc52 100%);background:-ms-linear-gradient(bottom,#eee4a2,#ebcc52)}a#signup:active{background:#111;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#b7a424),to(#b7a424));background:-moz-linear-gradient(center top,#b7a424 0%,#b7a424 100%);background:-ms-linear-gradient(bottom,#b7a424,#b7a424)}div.column-fields input{width:98%}form.quickform2{margin-top:-14px}.btn{font-size:1.2em!important;font-family:Arial,Helvetica,Sans-Serif}#appjetfooter{display:none}h3{text-align:center}ul.providers{width:150px;padding:0;margin:0 5px 5px;float:left;list-style-type:none}ul.providers li{background:url(https://cloudno.de/static/img/buttons.png) no-repeat;height:50px;width:150px;cursor:pointer;padding:0;margin:10px 0 8px}li#twitter{background-position:0 0}li#twitter:hover{background-position:-150px 0}li#twitter:active{background-position:-300px 0}li#yahoo{background-position:0 -50px}li#yahoo:hover{background-position:-150px -50px}li#yahoo:active{background-position:-300px -50px}a#deleteAction{background:no-repeat left center;padding-left:16px;padding-right:8px;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALBAMAAABbgmoVAAAAA3NCSVQICAjb4U/gAAAAGFBMVEX///+ZmZmZmZmZmZn///+ZmZmJiYl7e3trE/RpAAAACHRSTlMARIjM/////wcesEcAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAWdEVYdENyZWF0aW9uIFRpbWUAMTAvMTQvMDkZqeG9AAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M1cbXjNgAAAERJREFUCJljYBAODRZgYGAKDQ0NYmAQBVKhAgymIaEhoQYMoWGubqEBDKGhKalgyt0VSJmGpKYA5UTDQsOAKqH6IKYAAHwFEI290O6NAAAAAElFTkSuQmCC')}a#futonAction{background-repeat:no-repeat;padding-left:20px;padding-right:8px;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAA3NCSVQICAjb4U/gAAAAMFBMVEX/////////AAD9sbHxk5fFDhn/8PD/MzP/3t7eCA//////wMD/////MzP/ICD///+ar6PEAAAAEHRSTlMA////////////d/9E7v8zd/aTsQAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAxMC8xNC8wORmp4b0AAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzVxteM2AAAAbUlEQVQImWNgwAS8jS3LfC8AGUyJbdJFukAGi6GgkxKIcVFQ0M9dT4GBobBMUFBCCch4rCwo2LgJyFDSaxR5lv4AyFBSE1FSKmBgKJo6RTh0EtCgS1PDBcGM3SYujSbWGxgY/pxaJbjqzAdMuwFN4B3t4yT4+AAAAABJRU5ErkJggg==')}li#google{background-position:0 -100px}li#google:hover{background-position:-150px -100px}li#google:active{background-position:-300px -100px}form.quickform{background-color:#fff;border:1px solid #ccc;padding:.6em}form.quickform div.qfheader{font-size:1em;font-weight:bold;border-bottom:1px solid #ccc;margin-bottom:1em;padding:.1em .2em .2em 0}form.quickform div.qflabeldiv{margin-top:1em}form.quickform label.qflabel{color:#222;font-weight:bold;font-size:76%}form.quickform .qffield{margin-bottom:1em}form.quickform input.qfinputtext,form.quickform textarea.qfinputtextarea{border:1px solid #8faec6}form.quickform input.qfsubmit{margin-top:1em;padding:2px 6px}form.quickform span.surroundtext{color:#555;font-size:80%}div.qfclearfloats{clear:both}.qfcontainer{width:100%;margin-top:15px}.qflabel{color:#555;font-weight:bold;cursor:default}.qflabeldiv{margin-top:10px}.qfbuttondiv{margin-top:1.5em;margin-bottom:1.5em;height:27px}.qfcheckerdiv{margin-top:1.5em;margin-bottom:1.5em}div.checker{margin-left:-3px;margin-top:-3px}body{font-family:Arial,Helvetica,sans-serif;margin:0;padding:0;background-attachment:fixed;background-color:#dee3e5;background-position:0% 40px;background-repeat:repeat-x;color:#333;background-image:none}.header-container{left:0;position:fixed;top:0;width:100%;z-index:12}.top-header a:link,.top-header a:visited{color:black}.top-header{color:black;font-size:13px;height:36px;background:#d4d9db;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#d4d9db),to(#bdc0c2));background:-moz-linear-gradient(center top,#d4d9db 0%,#bdc0c2 100%);background:-ms-linear-gradient(bottom,#d4d9db,#bdc0c2)}.rpx_box2{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAM2SURBVHjaYmRAA/wcDAxRZtwMmQ4CDEqiLAzMDP8ZgcKhQJwExOE//zB85OdjZHj95juD5eR/DMfP32QQFRFiAAggFmRDmJiYGAJMRRi4+bgYCjczMIhwMTAsiPg/B2rISyD+7TOPicFMloFBRYgVyP3F8OfPH4a7d+4wAAQQ3CBhAUEGXh4ehoMPWRh+/P4PFpMTAFMmUCU/QcTN1wwMt98wMDAysDFws7EwxESEMzx+9IgBIIBYQK6QEpdg4OTgYPj//z8Yc7MBrf7LwMDKDDbgB9zFjAz/2YBiHGDrQZYxMty+dYuBhYWFASCAWOSkpMGMf//+MeAAjDD6P0Q3CmBjYwPTAAHEAjIE5AokoADEnkDsABT9+Osvw28uoNq//xi+Fm1i6gWKSwHxQSDeDvIpVA8rQACxIBkiA8S1QBwFdALPP6AwMyPDPiD1B+QkRkaGv8DwkQWK+wL5AUDxdqDwKiC+C8SqAAHEBDXEAYhPAnEaEPP8+sewBRhOIWqi/6OANNsfYHgBFXJP8P+XKcjJ4PnzL8NyoDpgQmGIA+JGIDYGCCBQsOkC8TogFgTiL0Abk3/8Zlglyg0JbKAhzNCgZVYTZXjBwsTwCugJf7SgEgMIIJBBk6GGgPyYDjRoFVjjfwiGijP8g0QoGzDG//7+x9DD+p9hLTAWTYFSFiCvAQQQyCB7qKkgvy5DSaCMCDbUUGBQMfwCsu+CMDA+90ClOQECiAlJ30/0qJUVwEwLf7GlAQaG7wABBDLoMpSjhuQ6SJwyY+rggSbWLz9BzmMCYoizAQIIZFAJyCKQPiCeD/SO4X+oH7CBJVH/GLYm/2cosP3H8PPHF4bfv3+DAw8ggEAG7YJG+28gVgQadISdmaELGHO6wETIzMLMAEvyIIsYpPgYGKxUGMAGff74muHR0ycMj549ZQAIIFgYzYOmpb1AzAXMS6VffjFcWnqe6cqVF4x67JCs/Qjk8n//Ibnm1qu/DH/+QcILVAIABBByMXIMiF2A2A0oGc7MxODw5iuDxscfjC8YGf83AMXngiLkzdd/DNO2fmSYfeQL0I08DCsXzWHg5eVlAAggRrR8RjYACDAAHjz4hh8Y0YUAAAAASUVORK5CYII%3D) no-repeat scroll 0 50%;float:right;font-size:12px;padding-left:22px;padding-top:5px;margin-top:5px;margin-right:25px}.login-google{background:url(data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7PT7/3zF6/9Ptu//RbHx/0227/+Tzvb/9vv5/97h0f9JeBz/NHoA/z98Av9AfAD/PHsA/0F6AP8AAAAA/vz7/1+33/8Mp+z/FrHw/xWy8f8bs/T/Hqrx/3zE7v////7/t8qp/zF2A/87gwH/P4ID/z59AP8+egD/Q3kA/97s8v8botj/ELn3/wy58f8PtfL/D7Lw/xuz9P8vq+f/8/n///779v9KhR3/OYYA/0GFAv88hgD/QIAC/z17AP/0+/j/N6bM/wC07/8Cxf7/CsP7/wm+9v8Aqur/SrDb//7+/v///P7/VZEl/zSJAP87jQD/PYYA/0OBBf8+fQH///3//9Dp8/84sM7/CrDf/wC14/8CruL/KqnW/9ns8f/8/v//4OjX/z+GDf85kAD/PIwD/z2JAv8+hQD/PoEA/9C7pv/97uv////+/9Xw+v+w3ej/ls/e/+rz9///////+/z6/22mSf8qjQH/OJMA/zuQAP85iwL/PIgA/zyFAP+OSSL/nV44/7J+Vv/AkG7/7trP//7//f/9//7/6/Lr/2uoRv8tjQH/PJYA/zuTAP87kwD/PY8A/z2KAP89hAD/olkn/6RVHP+eSgj/mEgR//Ho3//+/v7/5Ozh/1GaJv8tlAD/OZcC/zuXAv84lAD/O5IC/z2PAf89iwL/OIkA/6hWFf+cTxD/pm9C/76ihP/8/v//+////8nav/8fdwL/NZsA/zeZAP83mgD/PJQB/zyUAf84jwD/PYsB/z6HAf+fXif/1r6s//79///58u//3r+g/+3i2v/+//3/mbiF/yyCAP87mgP/OpgD/zeWAP85lgD/OpEB/z+TAP9ChwH/7eHb/////v/28ej/tWwo/7tUAP+5XQ7/5M+5/////v+bsZn/IHAd/zeVAP89lgP/O5MA/zaJCf8tZTr/DyuK//3////9////0qmC/7lTAP/KZAT/vVgC/8iQWf/+//3///j//ygpx/8GGcL/ESax/xEgtv8FEMz/AALh/wAB1f///f7///z//758O//GXQL/yGYC/8RaAv/Ojlf/+/////////9QU93/BAD0/wAB//8DAP3/AAHz/wAA5f8DAtr///////v7+/+2bCT/yGMA/89mAP/BWQD/0q+D///+/////P7/Rkbg/wEA+f8AA/z/AQH5/wMA8P8AAev/AADf///7/P////7/uINQ/7lXAP/MYwL/vGIO//Lm3P/8/v//1dT2/woM5/8AAP3/AwH+/wAB/f8AAfb/BADs/wAC4P8AAAAA//z7/+LbzP+mXyD/oUwE/9Gshv/8//3/7/H5/zo/w/8AAdX/AgL6/wAA/f8CAP3/AAH2/wAA7v8AAAAAgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAA%3D%3D) no-repeat scroll 0 50%;padding-left:18px;margin-left:8px}.login-yahoo{background:url(data:image/x-icon;base64,AAABAAEAEBAQAAEABAAoAQAAFgAAACgAAAAQAAAAIAAAAAEABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbgJqAIoCdgCaAnoAnhKCAKYijgCuLpIAskKeALpSpgC+Yq4AzHy8ANqezgDmvt4A7tLqAPz5+wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKlRFIoABWAKERERE6ADcKMzzu2hOgAAhERK8REWCWBERE36ERMHMEREvo6iEgY6hEn6Pu0mAzqkz/xjMzoDNwpERERDoAMzAKlERIoAAzMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAP//AADAOQAAgBkAAAAPAAAACQAAAAkAAAAIAAAACAAAAAgAAIAYAADAOAAA//8AAP//AAD//wAA) no-repeat scroll 0 50%;padding-left:18px;margin-left:8px}.login-twitter{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAABIAAAASABGyWs+AAAACXZwQWcAAAAQAAAAEABcxq3DAAAClklEQVQ4y42TTUhUURzFf/e+Gb+1pjFGqcW4KcsMojZaFBW0Cqxm0TJcRUSLiCQK3EjYSko3LXKn0ictamEUQYjlBNZYphNmjiKp5cw4H46j8977txidIgs6cLhwuff8zzmXC6vo6OjwjI6O3Jifm3k3PzfrHxsbu9zU1FTC/8Dn8xVEwuFuEZGJJZHpZRERkb6+vuv/JdDT03NQbCvxJipyadiUayOmjKVE0snE9I3W1l0AoVAor7+/3/HnXQ1QVlpSmTGtoq8pSFkQzcDXpJBfVFh5/tzZ28upxceecvejndXb738OBi+0tLSUrgk4ACzbFkREKzAUaAXRFZuptKEpcO23bRANZWUlbNvkPnmioWFbMBi82N3dba6zpACngsEYBOJWbt8WyNfg22pQW739TE1NzUPglf5XL6Zk46wxbcNMGj7FAW2UbnK5qnIR/oQABTo7UX5z4MlX7HWBbWaSo8Hg9F8FZHX6AZfisFth2r9ECh2KfGvFvHvvQU9XV9ebnIChNcKvgyJQbMBGp1rnrq9/4Omt9vbmcDi8mHvGWDyeNJSyClcbUQqCCZhNw7INS1aWKzbU19cdam+/dXpN0ADwer32saNHfDgcG4YWsj5iGRhOQCAuvF0Q/FFhKCZUlDgKa7Z49sTiiZd+v39WA7S1tY0PBoae7CiGOrfGFLCASEaYTAlTKWF6SfiQEAbCgNYVu2tra3MRAO50dt6MhOffn6pUHK80cDsVTgV5OkuHBpcTqopBI5mJUCi2rqDGxsZ9kxMTr0VE4rbI55TIx4TIcCK7Tqazn8w/MPDM6/VuznWwhkAg8O3L+HjvYjL5I08sR7m2ljx59sJGSUdcshzNRL7PPX/xovfK1avNoyMjIYCfvt1TZlC7XREAAAAldEVYdGNyZWF0ZS1kYXRlADIwMDktMDUtMjZUMDk6NTk6NDUtMDc6MDACVu8eAAAAJXRFWHRtb2RpZnktZGF0ZQAyMDA5LTA1LTI2VDA5OjU5OjQ1LTA3OjAwXeeZKgAAAABJRU5ErkJggg%3D%3D) no-repeat scroll 0 50%;padding-left:18px;margin-left:8px}.top_nav{height:36px;float:right;font-size:12px;margin-top:10px;margin-bottom:-10px;margin-right:10px}span.free{background-color:#e09000;color:white;text-shadow:none;margin-right:3px;margin-left:3px;padding-right:3px;padding-left:3px}.top-nav-outer{display:block;height:40px;position:relative;text-align:center;width:100%;float:left}.top-nav{-webkit-box-shadow:rgba(0,0,0,0.496094) 0 1px 2px;-moz-box-shadow:0 1px 2px rgba(0,0,0,0.5);height:100%;left:0;position:absolute;top:0;width:100%;background:#333;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#333333),to(#111111));background:-moz-linear-gradient(center top,#333333 0%,#111111 100%);background:-ms-linear-gradient(bottom,#333333,#111111)}.top-nav-inner{max-width:1040px;min-width:920px;position:relative}#logo{float:left;height:40px;with:200px}#logo a{background:transparent url(../img/cloudnode-header-logo.png) no-repeat 20px 9px;color:white;display:block;height:40px;margin-right:5px;margin-top:-9px;width:200px}#global-nav ul{float:left;list-style-type:none;margin:0}#global-nav ul li{float:left;margin:0}#global-nav{float:left;margin-left:8px}#global-nav ul li a{display:block;padding:10px;text-decoration:none;font-weight:bold;-webkit-transition-duration:400ms;-webkit-transition-property:color}#global-nav ul li a:hover{color:white}ul{list-style:disc}#global-nav .active a{background:rgba(0,0,0,0.699219);color:white;font-weight:bold;padding:10px}.page-container{margin:0 auto;max-width:1120px;min-width:1000px}.page{padding-top:100px;margin:0 auto;max-width:1120px;min-width:1000px}#page-inner-hilite{background-color:white;-moz-border-radius:5px 5px 5px 5px;border-bottom-left-radius:5px 5px;border-bottom-right-radius:5px 5px;border-top-left-radius:5px 5px;border-top-right-radius:5px 5px;margin:0 40px;max-width:1040px;min-width:920px;overflow:hidden;position:relative;text-align:left;-webkit-box-shadow:rgba(0,0,0,0.496094) 0 1px 2px;-moz-box-shadow:0 1px 2px rgba(0,0,0,0.5)}#page-inner{background:url(../img/page-bg2.jpg) repeat-x;-moz-border-radius:5px 5px 5px 5px;border-bottom-left-radius:5px 5px;border-bottom-right-radius:5px 5px;border-top-left-radius:5px 5px;border-top-right-radius:5px 5px;margin:1px 0 0 1px;max-width:1040px;min-width:920px;overflow:hidden;position:relative;text-align:left;z-index:1}.left-col{font-size:62.5%;width:50%;position:relative;float:left}.right-col{position:absolute;right:45px;margin-top:45px;margin-left:15px}div.features{margin:15px 0;padding:10px;font-size:12px;color:#333;background:#e8f0f5;border:1px solid #d2d9de;border-right-color:#e5e9ed;border-bottom-color:#e5e9ed;-webkit-border-radius:3px;-moz-border-radius:3px}div.features .rule{width:100%;padding:0 10px;margin:10px 0 10px -10px;border-top:1px solid #c6d5df;border-bottom:1px solid white}ul.features li{list-style-type:none;font-weight:bold;margin:5px 0;padding:2px 0 0 20px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAARCAYAAAAG/yacAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQNJREFUeNpi/P//PwMpgJGRUZWFRA26QKqMiQQNPEBqJRC/ZyLBoglArAnEVxlAfiKEgcAbiEGMF0AsxgK01piADexAPAXKngc05BUxzvMDYgUgvg7EG2CCIJuMoc4AGeIDoqF8LiC+B3VaGUwdE1LomACp7UC8GYgLocIhQKwI1XgYphbZeSCFblB2M9AQPSAdC+UvB+JfcAugzgOBh0B8EoiVoPxHQCwKxKxAbAgNEFBonoXbBOS8AVLZUPeDgBwQc4IMAspdQQ4ZlNADSu6Axjoy2IYenNiCvB2JfQk5mGEAI8ECbbsEDITZQOYJIF4K5P/ESIdIAUEUQAkIUgBAgAEAW55lYzym6yUAAAAASUVORK5CYII%3D) 0 0 no-repeat}.feature-container{position:relative;float:left;width:100%}a{text-decoration:none;color:#0084b4}a:hover{text-decoration:underline;color:#0084b4}.col1,.col2,.col3{width:32%;float:left;padding-bottom:30px;font-size:12px}.col4{width:210px;float:left;padding-bottom:30px;font-size:14px;font-weight:bold;text-align:center;color:#999;border:solid 1px #ddd}div.sep{border-right:solid 1px #ddd;padding-right:5px}img.thumbs{margin-right:5px;margin-top:5px;border:none}#thumbs-container{overflow:hidden;height:114px}.message{-moz-border-radius:4px;-webkit-border-radius:4px;border:1px solid #bfb;margin:.5em 0 1em;padding:.5em 1em .5em 40px;position:relative;color:#1f5714;background:#dfd;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#f1fef4),to(#c4e6bd));background:-moz-linear-gradient(center top,#f1fef4 0%,#c4e6bd 100%);background:-ms-linear-gradient(bottom,#f1fef4,#c4e6bd)}.error-msg{border:1px solid #fbb;margin:.5em 0 1em;padding:.5em 1em .5em 40px;position:relative;color:#900;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#fdd;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#fef1f4),to(#e6c4bd));background:-moz-linear-gradient(center top,#fef1f4 0%,#e6c4bd 100%);background:-ms-linear-gradient(bottom,#fef1f4,#e6c4bd)}.icon_label_feed_sm{background:transparent url(http://apps.jgate.de/static/img/spriteme.png) no-repeat -10px -43px;background-position:-10px -43px;padding-left:15px;padding-top:2px}div.icon_label_feed_sm{margin-bottom:5px}h4.feature{margin-bottom:5px;font-size:20px}.left-col .padded{padding:15px 15px 15px 20px}.padded{padding:15px}.subhead{color:#999;font-size:1.4em;font-weight:normal;margin-top:0;margin-bottom:30px}h1{font-family:'Lucida Grande','Trebuchet MS','Lucida Sans Unicode','Lucida Sans Regular',Verdana,sans-serif;font-weight:bold;letter-spacing:-1px;line-height:1em;text-align:left;color:#999;text-shadow:0 2px 0 rgba(255,255,255,0.7)}h4{margin-top:0;margin-bottom:0;font-size:16px;color:#999}.post{color:#333;line-height:1.8em}.footer-container{margin-top:25px;padding:20px;font-size:12px;background-color:#e8ebec;border-top:1px solid #c4cacc;border-bottom:1px solid #c4cacc}.footer-container a:link,.footer-container a:visited{color:#010259}#appjetfooter{display:none}.content{font-size:12px;color:#acacac;margin:auto}dl{border-bottom:1px solid #ddd;padding:8px 0;line-height:1.4em;margin:0 15px;overflow:hidden;color:#666}dl.row:hover{background-color:#e6e6e6}dt{float:left;margin-left:5px;margin-right:15px;width:150px;overflow:hidden}dd{float:left;margin-right:15px;overflow:hidden}div.header{color:#707070;padding:8px 3px 8px 10px;border:1px solid #999;border-bottom:none;-webkit-box-shadow:rgba(0,0,0,0.196094) 0 0 5px;-moz-box-shadow:0 0 5px rgba(0,0,0,0.196094);font-size:14px;text-shadow:0 1px 0 rgba(255,255,255,0.7);-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0;background:#c7c7c7;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#d0d0d0),to(#bfbfbf));background:-moz-linear-gradient(center top,#d0d0d0 0%,#bfbfbf 100%);background:-ms-linear-gradient(bottom,#d0d0d0,#bfbfbf)}div.group{-webkit-box-shadow:rgba(0,0,0,0.196094) 0 0 5px;-moz-box-shadow:0 1px 2px rgba(0,0,0,0.5);background-color:white;border:1px solid #999;padding-bottom:15px;-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px}div.sub-header{font-weight:bold;background:#e6e6e6;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#f2f2f2),to(#dadada));background:-moz-linear-gradient(center top,#f2f2f2 0%,#dadada 100%);background:-ms-linear-gradient(bottom,#f2f2f2,#dadada)}span.header dl{margin-top:10px;border-bottom:2px solid #2f4e6f}span.header dl:hover{background-color:white}div.detail dt{font-weight:bold;text-align:right}div.detail dl:hover{background-color:white}div.group button{margin-top:10px}div.group button.detail{margin-left:30%}div.rateMe{float:left;height:auto;padding-left:6px;padding-right:10px;padding-top:6px}div.rateMe a.off{float:left;height:12px;width:12px;background:url(../img/small_star_off.gif) no-repeat}div.rateMe a.on{float:left;height:12px;width:12px;background:url(../img/small_star_on.gif) no-repeat}#iframe{width:100%;height:80px;position:absolute;left:0;border:none;margin-top:77px}a.signup{border:solid #ffd452 1px;color:#333;display:block;font-family:Helvetica,Arial,sans-serif;font-size:18px;font-weight:bold;height:22px;width:164px;padding:8px 10px;text-align:center;text-decoration:none;text-shadow:#df6 0 1px 0;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;background:#ecd87a;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#f8efae),to(#f5d55a));background:-moz-linear-gradient(center top,#f8efae 0%,#f5d55a 100%);background:-ms-linear-gradient(bottom,#f8efae,#f5d55a)}a.signup:hover,a.signup:focus{background:#111;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#eee4a2),to(#ebcc52));background:-moz-linear-gradient(center top,#eee4a2 0%,#ebcc52 100%);background:-ms-linear-gradient(bottom,#eee4a2,#ebcc52)}a.signup:active{background:#111;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#b7a424),to(#b7a424));background:-moz-linear-gradient(center top,#b7a424 0%,#b7a424 100%);background:-ms-linear-gradient(bottom,#b7a424,#b7a424)}#big-counter{font-size:80px;font-weight:bold;margin-top:0;margin-bottom:10px;letter-spacing:-0.1em;text-shadow:0 -1px 0 rgba(0,0,0,0.7)}#download-button{border:solid #ffd452 1px;color:black;padding:.35em 2.5em;vertical-align:middle;border-style:solid;border-width:1px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;background:#ecd87a;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#f8efae),to(#f5d55a));background:-moz-linear-gradient(center top,#f8efae 0%,#f5d55a 100%);background:-ms-linear-gradient(bottom,#f8efae,#f5d55a)}.twoCols{float:left;width:240px}.twoCols.next{margin-left:0}ul.noStyle li{list-style:none}.clear{clear:both}.htabs{margin:15px 0;border-top:1px solid #ddd}ul.sidetabs{float:left;margin:0 0 25px;width:220px;line-height:1.4em;padding:0;border-right:1px solid #ddd;height:420px}ul.sidetabs li{list-style-type:none;margin:10px 0}ul.sidetabs li a{display:block;padding:8px 10px 7px;font-size:14px;text-decoration:none;border:1px solid transparent;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}ul.sidetabs li a.selected{color:#333;font-weight:bold;text-shadow:1px 1px 0 white;border:1px solid #ddd;border-right:none;background:url(../img/sidebar_selected.gif) 0 0 repeat-x}ul.sidetabs li a:hover{border-top-left-radius:4px;border-bottom-left-radius:4px;background:#f1f1f1}.htabs .tab-content{float:right;width:74%;margin-top:10px}div.column-fields img{background:white;border:1px solid #ddd;margin-right:10px;padding:2px;float:left}div.column-fields p{color:#999;line-height:1.2em}div.avatar{clear:both;border-top:1px solid #ddd;padding-top:10px;margin-top:30px;margin-bottom:30px}div.fingerprint{border-top:1px solid #ddd;margin-top:16px;padding-top:5px}.hidden{display:none}div.column-main{width:440px;float:left}div.column-sidebar{width:190px;float:left;margin-left:20px}div.column-group{background:url(../img/column-group-bg.png) no-repeat}div.column-fields{padding:8px}ul.field-pills{margin:0;padding:0}ul.field-pills li{position:relative;list-style-type:none;margin:3px 0;min-height:24px;line-height:24px;padding:4px 5px;background:#eee;font-size:12px;font-weight:bold;color:#333;border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}ul.field-pills li:hover{background-color:#f5f5f5;border-color:#ccc}ul.field-pills li .remove{position:absolute;top:50%;right:6px;margin-top:-6px;width:18px;height:18px;text-indent:-9999px;text-decoration:none;opacity:.7;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALBAMAAABbgmoVAAAAA3NCSVQICAjb4U/gAAAAGFBMVEX///+ZmZmZmZmZmZn///+ZmZmJiYl7e3trE/RpAAAACHRSTlMARIjM/////wcesEcAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAWdEVYdENyZWF0aW9uIFRpbWUAMTAvMTQvMDkZqeG9AAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M1cbXjNgAAAERJREFUCJljYBAODRZgYGAKDQ0NYmAQBVKhAgymIaEhoQYMoWGubqEBDKGhKalgyt0VSJmGpKYA5UTDQsOAKqH6IKYAAHwFEI290O6NAAAAAElFTkSuQmCC') no-repeat}ul.field-pills li .remove:hover{opacity:1}.explain{font-size:12px;line-height:1.5em}.add-pill{margin:15px 0;padding:4px 5px 12px;background:whiteSmoke;font-size:12px;color:#333;border:1px solid #ddd;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}ul.apps li{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADUAAAA1CAYAAADh5qNwAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAxMi8yMi8xMIw6XH0AAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzVxteM2AAAEkElEQVRoge2aT3LbNhTGf/J0X92g0jLc1C4X4S70CaqcoNYJap9A1glsn8DKCeIbhNlxwym74dbsCcobsAs8yhBFAAQFN/FMvhnNSBTw8D7g4f0BOOOVkBfVOXAOLICf5ftX+bsEsiSOmtDjtm3LLLTQvKhWwB2KjAtPwE0SR3Wo8YOTEkKfPbs1wDLUqrVty1kIQRrOJ/SZT+xnRDBSeVEtUHvHd8ZL4Pe8qOahdDmZVF5U87yoboFn1IwvgS1QO7qWwDqJowvgGnjOi+r6VH0A/z0lK7KQnwtgo/3Okji6NLTdI4mjrCez1X7WwA0vK177OJLRjiIvqivgDyB1NK2TOFqOVUBkL1CrbEMDZMBDf0L6cJISO/+C30bOUGZVuxrmRZUCj4xz/x12SRytTX+OIXWNijlT8AT8jSKpYw58QK36VK93aVqxtm35ydG5nDgowEo+G0ubBkXSBw0OJ2T0fpLmpMBHlxANNXDpaqSh9JSfifyN7MVBHJmf7KMNys3uvZmQXAG/cLgHasTMkjgqpa3uzaxKavJT1CT+yuHqlcA/A/Ib4AG417ORoz0le2ijCS0ljnhhCqkT5NfANomjHfTSJM0p6LN0Lu7cZ0Afx5JOkP/Ye7QAHvXA3V+pcxSxtNcxAz4BT0OJp9h3ymEg9kGGMqXBckTkr4A/B+TXqBCSgcWljygfMu17Okrt8Wg49Lom+Q3K7O71h9Y4JQ7jGjU7Y91uLW193HSJf7y6RxE6WtW2bZnlRfUFVagNxiRZ+g1wNWKwDFhL+xV2cnvvBfw7QnYn36XraqZ5kp10GCwdxOVusJtbP6FNUSa80NqUqByx1Nq5vGUtuj0ZdNOtqpz1BDaopPHWJF28Vd9L7gefkNDOMa/UWH0OKoU+qb1yaB7FoEgX0/rYYVnxnpwFqvwf2lNWORbLMZLaN8CScYtSd6j9o6NBJbRfURNUJnHUyGR0p0wfBvp1Y24dE3qHeY87SXUwehsZKJWBTjlrqNEyA8M4t7i98WhSYIgLvUH7adZYuUc5XE+uz7GbF6kOJcrWM4MCekLsgvXcz5Lh2DCJ1FiFFqiqdkihkBPTx0mkOmyxm07KS8neoMjsTMImmrCOIKRgnLJXGBJi+T/F/7xiCMFI7QViccdDcJjpJB1Ck+qwQ5GrTQ0cAfwUZKHP0jtcAX9JXDmCmOIz4QkBAc/SBzBHHZCk+kMh+sh0R+DEa5L6ZvhB6q3gB6m3gjP8b/6+dzRnqJs/YznxhtAA2/e/vft4lsRRk8TRDYpc9m31mowd6ob/Fni5ypGU5jJgYvl/IGMg1zy6n5IGywAlwGuixlL6G72flO1L1NJ+T9gCF7Yyx3qTKLXPOi+qB/zL6tCwVto6XNejAMhp6qXnAUgoWEv/IXgFXzn2vUCZwGvHtwZ5ecSHEEzIKCQE3KLI7Xz7j8Q9ykVPkj/K/IYgtr3Oi+oT7ouDscgY+Q6GDZNJdRDTyBwXBy7UWM7ufREsoRVT6V62GovuFGoZihAEztK1/bZEuWAbdqh987byzryo0v5LHPLslIsEK9q25T+aPkwOloQA7AAAAABJRU5ErkJggg%3D%3D) no-repeat;list-style-type:none;line-height:60px;padding-left:70px;font-weight:bold;font-size:16px}div.manage .qfbuttondiv{padding-top:16px;padding-left:120px;padding-bottom:16px;font-size:12px;margin:0;background-color:#f0f0f0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;visibility:hidden}div.manage>.manage{margin-left:25px;padding:10px;background-color:#e0e0e0;visibility:hidden}div.manage:hover>.qfbuttondiv{visibility:visible}div.bar{border:2px solid #ddd}span#bar,div#bar{width:100% height 20px;min-width:2%;max-width:100%;text-indent:-9999px;background:url('../img/usage_bars.gif') 0 0 repeat-x}div.selector,div.selector span,div.checker span,div.radio span,div.uploader,div.uploader span.action{background-image:url(../img/sprite-aristo.png);background-repeat:no-repeat}.selector,.radio,.checker,.uploader,.selector *,.radio *,.checker *,.uploader *{margin:0;padding:0}div.selector{background-position:-483px -160px;line-height:32px;height:32px}div.selector span{background-position:right 0;height:32px;line-height:32px}div.selector select{top:0;left:0}div.selector:active,div.selector.active{background-position:-483px -192px}div.selector:active span,div.selector.active span{background-position:right -32px}div.selector.focus,div.selector.hover,div.selector:hover{background-position:-483px -224px}div.selector.focus span,div.selector.hover span,div.selector:hover span{background-position:right -64px}div.selector.focus:active,div.selector.focus.active,div.selector:hover:active,div.selector.active:hover{background-position:-483px -256px}div.selector.focus:active span,div.selector:hover:active span,div.selector.active:hover span,div.selector.focus.active span{background-position:right -96px}div.selector.disabled,div.selector.disabled:active,div.selector.disabled.active{background-position:-483px -288px}div.selector.disabled span,div.selector.disabled:active span,div.selector.disabled.active span{background-position:right -128px}div.checker,div.checker input{width:23px;height:23px}div.checker span{background-position:0 -320px;height:23px;width:23px}div.checker:active span,div.checker.active span{background-position:-23px -320px}div.checker.focus span,div.checker:hover span{background-position:-46px -320px}div.checker.focus:active span,div.checker:active:hover span,div.checker.active:hover span,div.checker.focus.active span{background-position:-69px -320px}div.checker span.checked{background-position:-92px -320px}div.checker:active span.checked,div.checker.active span.checked{background-position:-115px -320px}div.checker.focus span.checked,div.checker:hover span.checked{background-position:-138px -320px}div.checker.focus:active span.checked,div.checker:hover:active span.checked,div.checker.active:hover span.checked,div.checker.active.focus span.checked{background-position:-161px -320px}div.checker.disabled span,div.checker.disabled:active span,div.checker.disabled.active span{background-position:-184px -320px}div.checker.disabled span.checked,div.checker.disabled:active span.checked,div.checker.disabled.active span.checked{background-position:-207px -320px}div.radio,div.radio input{width:23px;height:23px}div.radio span{height:23px;width:23px;background-position:0 -343px}div.radio:active span,div.radio.active span{background-position:-23px -343px}div.radio.focus span,div.radio:hover span{background-position:-46px -343px}div.radio.focus:active span,div.radio:active:hover span,div.radio.active:hover span,div.radio.active.focus span{background-position:-69px -343px}div.radio span.checked{background-position:-92px -343px}div.radio:active span.checked,div.radio.active span.checked{background-position:-115px -343px}div.radio.focus span.checked,div.radio:hover span.checked{background-position:-138px -343px}div.radio.focus:active span.checked,div.radio:hover:active span.checked,div.radio.focus.active span.checked,div.radio.active:hover span.checked{background-position:-161px -343px}div.radio.disabled span,div.radio.disabled:active span,div.radio.disabled.active span{background-position:-184px -343px}div.radio.disabled span.checked,div.radio.disabled:active span.checked,div.radio.disabled.active span.checked{background-position:-207px -343px}div.uploader{background-position:0 -366px;height:32px}div.uploader span.action{background-position:right -494px;height:24px;line-height:24px}div.uploader span.filename{height:24px;margin:4px 0 4px 4px;line-height:24px}div.uploader.focus,div.uploader.hover,div.uploader:hover{background-position:0 -430px}div.uploader.focus span.action,div.uploader.hover span.action,div.uploader:hover span.action{background-position:right -526px}div.uploader.active span.action,div.uploader:active span.action{background-position:right -558px}div.uploader.focus.active span.action,div.uploader:focus.active span.action,div.uploader.focus:active span.action,div.uploader:focus:active span.action{background-position:right -590px}div.uploader.disabled{background-position:0 -398px}div.uploader.disabled span.action{background-position:right -462px}div.selector{margin-bottom:20px;width:190px;font-weight:bold;color:#464545;font-size:14px}div.selector select{width:190px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:1em;border:solid 1px #fff}div.selector span{padding:0 25px 0 2px;cursor:pointer;color:#666;width:158px;text-shadow:0 1px 0 #fff}div.selector.disabled span{color:#bbb}div.checker,div.radio{margin-right:10px}div.uploader{width:190px;margin-bottom:20px;cursor:pointer}div.uploader span.action{width:83px;text-align:center;text-shadow:rgba(255,255,255,0.5) 0 1px 0;background-color:#fff;font-weight:bold;color:#1c4257}div.uploader span.filename{color:#777;width:82px;border-right:solid 1px #567c91;font-size:11px}div.uploader input{width:190px}div.uploader.disabled span.action{color:#aaa}div.uploader.disabled span.filename{border-color:#ddd;color:#aaa}.btn{font-weight:bold;color:#234e70!important;border-radius:2px;-moz-border-radius:2px;-webkit-border-radius:2px;-webkit-box-shadow:rgba(0,0,0,0.15) 0 1px 3px;-moz-box-shadow:rgba(0,0,0,0.15) 0 1px 3px;box-shadow:rgba(0,0,0,0.15) 0 1px 3px;border:solid 1px #6e93b0;background:url('../img/btn-sm-bg.png') repeat-x 0 0;height:27px;line-height:26px;text-shadow:rgba(255,255,255,0.5) 0 1px 0;display:inline;float:left;margin-right:5px;padding:0 10px;-webkit-transition:-webkit-box-shadow .2s linear}.btn:hover{text-decoration:none!important;color:#234e70;-webkit-box-shadow:0 0 10px #a1cae2;-moz-box-shadow:0 0 10px #a1cae2}.btn:active{background-position:0 bottom}a.btn{text-decoration:none}select{height:28px}input[type=text],input[type=password],select,textarea{border:1px solid #aaa;transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,-moz-box-shadow linear .2s;-webkit-transition:border linear .2s,-webkit-box-shadow linear .2s;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;resize:none;font:normal normal normal 1.15em/1.1 'Lucida Grande',sans-serif}input[type=text]:focus,input[type=password]:focus,textarea:focus{outline:none;border-color:rgba(82,168,236,.75)!important;box-shadow:0 0 8px rgba(82,168,236,.5);-moz-box-shadow:0 0 8px rgba(82,168,236,.5);-webkit-box-shadow:0 0 8px rgba(82,168,236,.5)}.callout div.group{padding-left:10px}.boxheader h2,.header h2{margin:0;font-size:15px}label.radio,label.checker{color:#555;display:block;font-weight:bold;margin-bottom:10px}.selector select:focus,.radio input:focus,.checker input:focus,uploader input:focus{outline:0}div.selector{position:relative;padding-left:10px}div.selector span{display:block;float:left}div.selector select{position:absolute;opacity:0}div.checker{position:relative;float:left}div.checker span{display:block;float:left;text-align:center}div.checker input{opacity:0;display:inline-block}div.radio{position:relative;float:left}div.radio span{display:block;float:left;text-align:center}div.radio input{opacity:0;text-align:center;display:inline-block}div.uploader{position:relative;float:left;overflow:hidden}div.uploader span.action{float:left;display:inline;padding:4px 0;overflow:hidden;cursor:pointer}div.uploader span.filename{padding:0 10px;float:left;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}div.uploader input{opacity:0;position:absolute;top:0;right:0;bottom:0;float:right}
  1 +body.landing{margin:8px;background:#254278 url(https://cloudno.de/static/img/cloudnode-bg.png) repeat}div#container{clear:both;padding-top:150px;color:white}div#container h1{text-align:center}div#container h4{text-align:center;margin-top:1.33em}p#thanks{font-weight:bold;color:white}div#form{width:660px;padding:25px 40px;border:1px solid #1b386e;margin:20px auto;display:block;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;background:#254278;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#2f4c82),to(#223f75));background:-moz-linear-gradient(center top,#2f4c82 0%,#223f75 100%);background:-ms-linear-gradient(bottom,#2f4c82,#223f75)}div.rpx_box{float:right;font-size:11px;margin-right:25px;margin-top:5px;padding-left:20px;padding-top:5px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAzZJREFUeNpiOHXqFMP/JAYbJkZGxmIGBobDAAHEABZJYWBgPHXuIgPTv99pAAEEFgGLRjP8P336NAMTUJ0bExOTCAM7AwP321sMAAHEeObMGQbjOSYMDH8YGIGS/1mABMPJnNsxQGP+s/z4sJTp////rxV3VS1h/f52KVCuBmSfCPfzKwxGM8xBilsAAogRZAPQUIZ///4xmPabMTBwMvxn+MHAeLr4HANQMdhWEFgEVPT/Yvq2JoZfDAyX07Y0Mf3/943x39+jQHGmV0B77vxnZGbUX+RVx8DGwKA7zacO6AguoEZrJlZWVjEg4z7j/7+/T+VePgl07jsGXgYG4+nGYKMBAogR5DsQMJlrCrHsN0Md0EdNIObZjDNwNzBcjtjCALR/H5BpdjlmC8OZrPNgcRaYgp98Mvo/+BWk/zOz/PrJJ6vL+O/3ZZgCZaB3zv9jZDoIDKt/wND6C0SNQHFQQLCyACXv/P371+k3v/h+9ncP9gAd+fUfK1cq868vmUAFn8FWAL26X3++KwMDM9B5LAyMf1m53gIVtIDlgPgjMBxKr4SvZGD4C7KCgcWyUY7hPzMb2G2gsBcAmpDI+ufb/y/S+kZAsY0M3EBv9+mBFQAEGAsoLkBhDsJAk8DYdAYwTiAGJDH8ZOgC2gOMGAY3UDRcSN0NVgsCfzgEEMGADE7nX2PgenmFQXtxWATQIGFg4L6/Grua4ZuYNgPjr69wA2B+gAGQnUlAyV1Mv789+Cxt8vuTirUzwxcGhg/qziEgPlD8PlB+K1AdMMExqAFxDsgAIaDgFlBcAJ1fzsDEsvgvK7ctz5NTrLz3ju9mACYJgZv714teX88KDD1/oDopIF4MxDeBuJcFGEBHgQwNYHpcAKQT/zMyMUiemc0gu6cPlDZZIe78x8b4+xcDRBOjITAyEV4A2noPnKoYGWWBbB6mf78Y7jvUMKCEDjMDg9LuCga+xyd//mPhRAkvJnZ2dm+g5jogNmJmZv4MNGoG++cXVkern0r8Y+BghloGDiuN9YkMpl1aDOyfnqK4AEQ3A2khIBYHeuUsy59vZWw/35/6KqPPCjTAHijvA9cBdIDOUn84FwCczyRTHGMoXwAAAABJRU5ErkJggg%3D%3D) no-repeat scroll 0 50% transparent}.email{color:#808080;width:490px;font-size:28px;padding:4px;background-color:#d0d0d0;border:1px inset #aaa;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}a:focus{outline:none}.error{background-color:#f9ff9a;border:1px solid #e6db55}div.inline-msg{background:#fff1a8;border-color:#fff1a8;color:black;margin-top:4px;float:right}#footer{font-size:12px;width:640px;margin:auto;color:white}div.rpx_box{color:white}div.rpx_box a,div#footer a,div#container a{color:#4c92e9;text-decoration:none}a#signup{border:solid #ffd452 1px;float:right;color:#333;display:block;font-family:Helvetica,Arial,sans-serif;font-size:18px;font-weight:bold;width:130px;padding:10px;margin-top:2px;text-align:center;text-decoration:none;text-shadow:#df6 0 1px 0;cursor:pointer;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;background:#ecd87a;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#f8efae),to(#f5d55a));background:-moz-linear-gradient(center top,#f8efae 0%,#f5d55a 100%);background:-ms-linear-gradient(bottom,#f8efae,#f5d55a)}a#signup:hover,a#signup:focus{background:#111;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#eee4a2),to(#ebcc52));background:-moz-linear-gradient(center top,#eee4a2 0%,#ebcc52 100%);background:-ms-linear-gradient(bottom,#eee4a2,#ebcc52)}a#signup:active{background:#111;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#b7a424),to(#b7a424));background:-moz-linear-gradient(center top,#b7a424 0%,#b7a424 100%);background:-ms-linear-gradient(bottom,#b7a424,#b7a424)}div.column-fields input{width:98%}form.quickform2{margin-top:-14px}.btn{font-size:1.2em!important;font-family:Arial,Helvetica,Sans-Serif}#appjetfooter{display:none}h3{text-align:center}ul.providers{width:150px;padding:0;margin:0 5px 5px;float:left;list-style-type:none}ul.providers li{background:url(https://cloudno.de/static/img/buttons.png) no-repeat;height:50px;width:150px;cursor:pointer;padding:0;margin:10px 0 8px}li#twitter{background-position:0 0}li#twitter:hover{background-position:-150px 0}li#twitter:active{background-position:-300px 0}li#yahoo{background-position:0 -50px}li#yahoo:hover{background-position:-150px -50px}li#yahoo:active{background-position:-300px -50px}a#deleteAction{background:no-repeat left center;padding-left:16px;padding-right:8px;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALBAMAAABbgmoVAAAAA3NCSVQICAjb4U/gAAAAGFBMVEX///+ZmZmZmZmZmZn///+ZmZmJiYl7e3trE/RpAAAACHRSTlMARIjM/////wcesEcAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAWdEVYdENyZWF0aW9uIFRpbWUAMTAvMTQvMDkZqeG9AAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M1cbXjNgAAAERJREFUCJljYBAODRZgYGAKDQ0NYmAQBVKhAgymIaEhoQYMoWGubqEBDKGhKalgyt0VSJmGpKYA5UTDQsOAKqH6IKYAAHwFEI290O6NAAAAAElFTkSuQmCC')}a#futonAction{background-repeat:no-repeat;padding-left:20px;padding-right:8px;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAA3NCSVQICAjb4U/gAAAAMFBMVEX/////////AAD9sbHxk5fFDhn/8PD/MzP/3t7eCA//////wMD/////MzP/ICD///+ar6PEAAAAEHRSTlMA////////////d/9E7v8zd/aTsQAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAxMC8xNC8wORmp4b0AAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzVxteM2AAAAbUlEQVQImWNgwAS8jS3LfC8AGUyJbdJFukAGi6GgkxKIcVFQ0M9dT4GBobBMUFBCCch4rCwo2LgJyFDSaxR5lv4AyFBSE1FSKmBgKJo6RTh0EtCgS1PDBcGM3SYujSbWGxgY/pxaJbjqzAdMuwFN4B3t4yT4+AAAAABJRU5ErkJggg==')}li#google{background-position:0 -100px}li#google:hover{background-position:-150px -100px}li#google:active{background-position:-300px -100px}form.quickform{background-color:#fff;border:1px solid #ccc;padding:.6em}form.quickform div.qfheader{font-size:1em;font-weight:bold;border-bottom:1px solid #ccc;margin-bottom:1em;padding:.1em .2em .2em 0}form.quickform div.qflabeldiv{margin-top:1em}form.quickform label.qflabel{color:#222;font-weight:bold;font-size:76%}form.quickform .qffield{margin-bottom:1em}form.quickform input.qfinputtext,form.quickform textarea.qfinputtextarea{border:1px solid #8faec6}form.quickform input.qfsubmit{margin-top:1em;padding:2px 6px}form.quickform span.surroundtext{color:#555;font-size:80%}div.qfclearfloats{clear:both}.qfcontainer{width:100%;margin-top:15px}.qflabel{color:#555;font-weight:bold;cursor:default}.qflabeldiv{margin-top:10px}.qfbuttondiv{margin-top:1.5em;margin-bottom:1.5em;height:27px}.qfcheckerdiv{margin-top:1.5em;margin-bottom:1.5em}div.checker{margin-left:-3px;margin-top:-3px}body{font-family:Arial,Helvetica,sans-serif;margin:0;padding:0;background-color:#dee3e5;background-image:url(https://cloudno.de/static/img/page-bg1.jpg);color:#333}.header-container{left:0;position:fixed;top:0;width:100%;z-index:12}.top-header a:link,.top-header a:visited{color:black}.top-header{color:black;font-size:13px;height:36px;background:#d4d9db;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#d4d9db),to(#bdc0c2));background:-moz-linear-gradient(center top,#d4d9db 0%,#bdc0c2 100%);background:-ms-linear-gradient(bottom,#d4d9db,#bdc0c2)}.rpx_box2{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAM2SURBVHjaYmRAA/wcDAxRZtwMmQ4CDEqiLAzMDP8ZgcKhQJwExOE//zB85OdjZHj95juD5eR/DMfP32QQFRFiAAggFmRDmJiYGAJMRRi4+bgYCjczMIhwMTAsiPg/B2rISyD+7TOPicFMloFBRYgVyP3F8OfPH4a7d+4wAAQQ3CBhAUEGXh4ehoMPWRh+/P4PFpMTAFMmUCU/QcTN1wwMt98wMDAysDFws7EwxESEMzx+9IgBIIBYQK6QEpdg4OTgYPj//z8Yc7MBrf7LwMDKDDbgB9zFjAz/2YBiHGDrQZYxMty+dYuBhYWFASCAWOSkpMGMf//+MeAAjDD6P0Q3CmBjYwPTAAHEAjIE5AokoADEnkDsABT9+Osvw28uoNq//xi+Fm1i6gWKSwHxQSDeDvIpVA8rQACxIBkiA8S1QBwFdALPP6AwMyPDPiD1B+QkRkaGv8DwkQWK+wL5AUDxdqDwKiC+C8SqAAHEBDXEAYhPAnEaEPP8+sewBRhOIWqi/6OANNsfYHgBFXJP8P+XKcjJ4PnzL8NyoDpgQmGIA+JGIDYGCCBQsOkC8TogFgTiL0Abk3/8Zlglyg0JbKAhzNCgZVYTZXjBwsTwCugJf7SgEgMIIJBBk6GGgPyYDjRoFVjjfwiGijP8g0QoGzDG//7+x9DD+p9hLTAWTYFSFiCvAQQQyCB7qKkgvy5DSaCMCDbUUGBQMfwCsu+CMDA+90ClOQECiAlJ30/0qJUVwEwLf7GlAQaG7wABBDLoMpSjhuQ6SJwyY+rggSbWLz9BzmMCYoizAQIIZFAJyCKQPiCeD/SO4X+oH7CBJVH/GLYm/2cosP3H8PPHF4bfv3+DAw8ggEAG7YJG+28gVgQadISdmaELGHO6wETIzMLMAEvyIIsYpPgYGKxUGMAGff74muHR0ycMj549ZQAIIFgYzYOmpb1AzAXMS6VffjFcWnqe6cqVF4x67JCs/Qjk8n//Ibnm1qu/DH/+QcILVAIABBByMXIMiF2A2A0oGc7MxODw5iuDxscfjC8YGf83AMXngiLkzdd/DNO2fmSYfeQL0I08DCsXzWHg5eVlAAggRrR8RjYACDAAHjz4hh8Y0YUAAAAASUVORK5CYII%3D) no-repeat scroll 0 50%;float:right;font-size:12px;padding-left:22px;padding-top:5px;margin-top:5px;margin-right:25px}.login-google{background:url(data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7PT7/3zF6/9Ptu//RbHx/0227/+Tzvb/9vv5/97h0f9JeBz/NHoA/z98Av9AfAD/PHsA/0F6AP8AAAAA/vz7/1+33/8Mp+z/FrHw/xWy8f8bs/T/Hqrx/3zE7v////7/t8qp/zF2A/87gwH/P4ID/z59AP8+egD/Q3kA/97s8v8botj/ELn3/wy58f8PtfL/D7Lw/xuz9P8vq+f/8/n///779v9KhR3/OYYA/0GFAv88hgD/QIAC/z17AP/0+/j/N6bM/wC07/8Cxf7/CsP7/wm+9v8Aqur/SrDb//7+/v///P7/VZEl/zSJAP87jQD/PYYA/0OBBf8+fQH///3//9Dp8/84sM7/CrDf/wC14/8CruL/KqnW/9ns8f/8/v//4OjX/z+GDf85kAD/PIwD/z2JAv8+hQD/PoEA/9C7pv/97uv////+/9Xw+v+w3ej/ls/e/+rz9///////+/z6/22mSf8qjQH/OJMA/zuQAP85iwL/PIgA/zyFAP+OSSL/nV44/7J+Vv/AkG7/7trP//7//f/9//7/6/Lr/2uoRv8tjQH/PJYA/zuTAP87kwD/PY8A/z2KAP89hAD/olkn/6RVHP+eSgj/mEgR//Ho3//+/v7/5Ozh/1GaJv8tlAD/OZcC/zuXAv84lAD/O5IC/z2PAf89iwL/OIkA/6hWFf+cTxD/pm9C/76ihP/8/v//+////8nav/8fdwL/NZsA/zeZAP83mgD/PJQB/zyUAf84jwD/PYsB/z6HAf+fXif/1r6s//79///58u//3r+g/+3i2v/+//3/mbiF/yyCAP87mgP/OpgD/zeWAP85lgD/OpEB/z+TAP9ChwH/7eHb/////v/28ej/tWwo/7tUAP+5XQ7/5M+5/////v+bsZn/IHAd/zeVAP89lgP/O5MA/zaJCf8tZTr/DyuK//3////9////0qmC/7lTAP/KZAT/vVgC/8iQWf/+//3///j//ygpx/8GGcL/ESax/xEgtv8FEMz/AALh/wAB1f///f7///z//758O//GXQL/yGYC/8RaAv/Ojlf/+/////////9QU93/BAD0/wAB//8DAP3/AAHz/wAA5f8DAtr///////v7+/+2bCT/yGMA/89mAP/BWQD/0q+D///+/////P7/Rkbg/wEA+f8AA/z/AQH5/wMA8P8AAev/AADf///7/P////7/uINQ/7lXAP/MYwL/vGIO//Lm3P/8/v//1dT2/woM5/8AAP3/AwH+/wAB/f8AAfb/BADs/wAC4P8AAAAA//z7/+LbzP+mXyD/oUwE/9Gshv/8//3/7/H5/zo/w/8AAdX/AgL6/wAA/f8CAP3/AAH2/wAA7v8AAAAAgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAA%3D%3D) no-repeat scroll 0 50%;padding-left:18px;margin-left:8px}.login-yahoo{background:url(data:image/x-icon;base64,AAABAAEAEBAQAAEABAAoAQAAFgAAACgAAAAQAAAAIAAAAAEABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbgJqAIoCdgCaAnoAnhKCAKYijgCuLpIAskKeALpSpgC+Yq4AzHy8ANqezgDmvt4A7tLqAPz5+wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKlRFIoABWAKERERE6ADcKMzzu2hOgAAhERK8REWCWBERE36ERMHMEREvo6iEgY6hEn6Pu0mAzqkz/xjMzoDNwpERERDoAMzAKlERIoAAzMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAP//AADAOQAAgBkAAAAPAAAACQAAAAkAAAAIAAAACAAAAAgAAIAYAADAOAAA//8AAP//AAD//wAA) no-repeat scroll 0 50%;padding-left:18px;margin-left:8px}.login-twitter{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAABIAAAASABGyWs+AAAACXZwQWcAAAAQAAAAEABcxq3DAAAClklEQVQ4y42TTUhUURzFf/e+Gb+1pjFGqcW4KcsMojZaFBW0Cqxm0TJcRUSLiCQK3EjYSko3LXKn0ictamEUQYjlBNZYphNmjiKp5cw4H46j8977txidIgs6cLhwuff8zzmXC6vo6OjwjI6O3Jifm3k3PzfrHxsbu9zU1FTC/8Dn8xVEwuFuEZGJJZHpZRERkb6+vuv/JdDT03NQbCvxJipyadiUayOmjKVE0snE9I3W1l0AoVAor7+/3/HnXQ1QVlpSmTGtoq8pSFkQzcDXpJBfVFh5/tzZ28upxceecvejndXb738OBi+0tLSUrgk4ACzbFkREKzAUaAXRFZuptKEpcO23bRANZWUlbNvkPnmioWFbMBi82N3dba6zpACngsEYBOJWbt8WyNfg22pQW739TE1NzUPglf5XL6Zk46wxbcNMGj7FAW2UbnK5qnIR/oQABTo7UX5z4MlX7HWBbWaSo8Hg9F8FZHX6AZfisFth2r9ECh2KfGvFvHvvQU9XV9ebnIChNcKvgyJQbMBGp1rnrq9/4Omt9vbmcDi8mHvGWDyeNJSyClcbUQqCCZhNw7INS1aWKzbU19cdam+/dXpN0ADwer32saNHfDgcG4YWsj5iGRhOQCAuvF0Q/FFhKCZUlDgKa7Z49sTiiZd+v39WA7S1tY0PBoae7CiGOrfGFLCASEaYTAlTKWF6SfiQEAbCgNYVu2tra3MRAO50dt6MhOffn6pUHK80cDsVTgV5OkuHBpcTqopBI5mJUCi2rqDGxsZ9kxMTr0VE4rbI55TIx4TIcCK7Tqazn8w/MPDM6/VuznWwhkAg8O3L+HjvYjL5I08sR7m2ljx59sJGSUdcshzNRL7PPX/xovfK1avNoyMjIYCfvt1TZlC7XREAAAAldEVYdGNyZWF0ZS1kYXRlADIwMDktMDUtMjZUMDk6NTk6NDUtMDc6MDACVu8eAAAAJXRFWHRtb2RpZnktZGF0ZQAyMDA5LTA1LTI2VDA5OjU5OjQ1LTA3OjAwXeeZKgAAAABJRU5ErkJggg%3D%3D) no-repeat scroll 0 50%;padding-left:18px;margin-left:8px}.top_nav{height:36px;float:right;font-size:12px;margin-top:10px;margin-bottom:-10px;margin-right:10px}span.free{background-color:#e09000;color:white;text-shadow:none;margin-right:3px;margin-left:3px;padding-right:3px;padding-left:3px}.top-nav-outer{display:block;height:40px;position:relative;text-align:center;width:100%;float:left}.top-nav{-webkit-box-shadow:rgba(0,0,0,0.496094) 0 1px 2px;-moz-box-shadow:0 1px 2px rgba(0,0,0,0.5);height:100%;left:0;position:absolute;top:0;width:100%;background:#333;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#333333),to(#111111));background:-moz-linear-gradient(center top,#333333 0%,#111111 100%);background:-ms-linear-gradient(bottom,#333333,#111111)}.top-nav-inner{max-width:1040px;min-width:920px;position:relative}#logo{float:left;height:40px;with:200px}#logo a{background:transparent url(../img/cloudnode-header-logo.png) no-repeat 20px 9px;color:white;display:block;height:40px;margin-right:5px;margin-top:-9px;width:200px}#global-nav ul{float:left;list-style-type:none;margin:0}#global-nav ul li{float:left;margin:0}#global-nav{float:left;margin-left:8px}#global-nav ul li a{display:block;padding:10px;text-decoration:none;font-weight:bold;-webkit-transition-duration:400ms;-webkit-transition-property:color}#global-nav ul li a:hover{color:white}ul{list-style:disc}#global-nav .active a{background:rgba(0,0,0,0.699219);color:white;font-weight:bold;padding:10px}.page-container{margin:0 auto;max-width:1120px;min-width:1000px}.page{padding-top:100px;margin:0 auto;max-width:1120px;min-width:1000px}#page-inner-hilite{background-color:white;-moz-border-radius:5px 5px 5px 5px;border-bottom-left-radius:5px 5px;border-bottom-right-radius:5px 5px;border-top-left-radius:5px 5px;border-top-right-radius:5px 5px;margin:0 40px;max-width:1040px;min-width:920px;overflow:hidden;position:relative;text-align:left;-webkit-box-shadow:rgba(0,0,0,0.496094) 0 1px 2px;-moz-box-shadow:0 1px 2px rgba(0,0,0,0.5)}#page-inner{background:url(../img/page-bg2.jpg) repeat-x;-moz-border-radius:5px 5px 5px 5px;border-bottom-left-radius:5px 5px;border-bottom-right-radius:5px 5px;border-top-left-radius:5px 5px;border-top-right-radius:5px 5px;margin:1px 0 0 1px;max-width:1040px;min-width:920px;overflow:hidden;position:relative;text-align:left;z-index:1}.left-col{font-size:62.5%;width:50%;position:relative;float:left}.right-col{position:absolute;right:45px;margin-top:45px;margin-left:15px}div.features{margin:15px 0;padding:10px;font-size:12px;color:#333;background:#e8f0f5;border:1px solid #d2d9de;border-right-color:#e5e9ed;border-bottom-color:#e5e9ed;-webkit-border-radius:3px;-moz-border-radius:3px}div.features .rule{width:100%;padding:0 10px;margin:10px 0 10px -10px;border-top:1px solid #c6d5df;border-bottom:1px solid white}ul.features li{list-style-type:none;font-weight:bold;margin:5px 0;padding:2px 0 0 20px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAARCAYAAAAG/yacAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQNJREFUeNpi/P//PwMpgJGRUZWFRA26QKqMiQQNPEBqJRC/ZyLBoglArAnEVxlAfiKEgcAbiEGMF0AsxgK01piADexAPAXKngc05BUxzvMDYgUgvg7EG2CCIJuMoc4AGeIDoqF8LiC+B3VaGUwdE1LomACp7UC8GYgLocIhQKwI1XgYphbZeSCFblB2M9AQPSAdC+UvB+JfcAugzgOBh0B8EoiVoPxHQCwKxKxAbAgNEFBonoXbBOS8AVLZUPeDgBwQc4IMAspdQQ4ZlNADSu6Axjoy2IYenNiCvB2JfQk5mGEAI8ECbbsEDITZQOYJIF4K5P/ESIdIAUEUQAkIUgBAgAEAW55lYzym6yUAAAAASUVORK5CYII%3D) 0 0 no-repeat}.feature-container{position:relative;float:left;width:100%}a{text-decoration:none;color:#0084b4}a:hover{text-decoration:underline;color:#0084b4}.col1,.col2,.col3{width:32%;float:left;padding-bottom:30px;font-size:12px}.col4{width:210px;float:left;padding-bottom:30px;font-size:14px;font-weight:bold;text-align:center;color:#999;border:solid 1px #ddd}div.sep{border-right:solid 1px #ddd;padding-right:5px}img.thumbs{margin-right:5px;margin-top:5px;border:none}#thumbs-container{overflow:hidden;height:114px}.message{-moz-border-radius:4px;-webkit-border-radius:4px;border:1px solid #bfb;margin:.5em 0 1em;padding:.5em 1em .5em 40px;position:relative;color:#1f5714;background:#dfd;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#f1fef4),to(#c4e6bd));background:-moz-linear-gradient(center top,#f1fef4 0%,#c4e6bd 100%);background:-ms-linear-gradient(bottom,#f1fef4,#c4e6bd)}.error-msg{border:1px solid #fbb;margin:.5em 0 1em;padding:.5em 1em .5em 40px;position:relative;color:#900;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#fdd;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#fef1f4),to(#e6c4bd));background:-moz-linear-gradient(center top,#fef1f4 0%,#e6c4bd 100%);background:-ms-linear-gradient(bottom,#fef1f4,#e6c4bd)}.icon_label_feed_sm{background:transparent url(http://apps.jgate.de/static/img/spriteme.png) no-repeat -10px -43px;background-position:-10px -43px;padding-left:15px;padding-top:2px}div.icon_label_feed_sm{margin-bottom:5px}h4.feature{margin-bottom:5px;font-size:20px}.left-col .padded{padding:15px 15px 15px 20px}.padded{padding:15px}.subhead{color:#999;font-size:1.4em;font-weight:normal;margin-top:0;margin-bottom:30px}h1{font-family:'Lucida Grande','Trebuchet MS','Lucida Sans Unicode','Lucida Sans Regular',Verdana,sans-serif;font-weight:bold;letter-spacing:-1px;line-height:1em;text-align:left;color:#999;text-shadow:0 2px 0 rgba(255,255,255,0.7)}h4{margin-top:0;margin-bottom:0;font-size:16px;color:#999}.post{color:#333;line-height:1.8em}.footer-container{max-width:1120px;min-width:1000px;margin:auto;padding:10px;font-size:12px;text-align:center;color:#4d4d4d}.footer-container a:link,.footer-container a:visited{color:#486999}#appjetfooter{display:none}.content{font-size:12px;color:#acacac;margin:auto}dl{border-bottom:1px solid #ddd;padding:8px 0;line-height:1.4em;margin:0 15px;overflow:hidden;color:#666}dl.row:hover{background-color:#e6e6e6}dt{float:left;margin-left:5px;margin-right:15px;width:150px;overflow:hidden}dd{float:left;margin-right:15px;overflow:hidden}div.header{color:#707070;padding:8px 3px 8px 10px;border:1px solid #999;border-bottom:none;-webkit-box-shadow:rgba(0,0,0,0.196094) 0 0 5px;-moz-box-shadow:0 0 5px rgba(0,0,0,0.196094);font-size:14px;text-shadow:0 1px 0 rgba(255,255,255,0.7);-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0;background:#c7c7c7;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#d0d0d0),to(#bfbfbf));background:-moz-linear-gradient(center top,#d0d0d0 0%,#bfbfbf 100%);background:-ms-linear-gradient(bottom,#d0d0d0,#bfbfbf)}div.group{-webkit-box-shadow:rgba(0,0,0,0.196094) 0 0 5px;-moz-box-shadow:0 1px 2px rgba(0,0,0,0.5);background-color:white;border:1px solid #999;padding-bottom:15px;-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px}div.sub-header{font-weight:bold;background:#e6e6e6;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#f2f2f2),to(#dadada));background:-moz-linear-gradient(center top,#f2f2f2 0%,#dadada 100%);background:-ms-linear-gradient(bottom,#f2f2f2,#dadada)}span.header dl{margin-top:10px;border-bottom:2px solid #2f4e6f}span.header dl:hover{background-color:white}div.detail dt{font-weight:bold;text-align:right}div.detail dl:hover{background-color:white}div.group button{margin-top:10px}div.group button.detail{margin-left:30%}div.rateMe{float:left;height:auto;padding-left:6px;padding-right:10px;padding-top:6px}div.rateMe a.off{float:left;height:12px;width:12px;background:url(../img/small_star_off.gif) no-repeat}div.rateMe a.on{float:left;height:12px;width:12px;background:url(../img/small_star_on.gif) no-repeat}#iframe{width:100%;height:80px;position:absolute;left:0;border:none;margin-top:77px}a.signup{border:solid #ffd452 1px;color:#333;display:block;font-family:Helvetica,Arial,sans-serif;font-size:18px;font-weight:bold;height:22px;width:164px;padding:8px 10px;text-align:center;text-decoration:none;text-shadow:#df6 0 1px 0;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;background:#ecd87a;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#f8efae),to(#f5d55a));background:-moz-linear-gradient(center top,#f8efae 0%,#f5d55a 100%);background:-ms-linear-gradient(bottom,#f8efae,#f5d55a)}a.signup:hover,a.signup:focus{background:#111;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#eee4a2),to(#ebcc52));background:-moz-linear-gradient(center top,#eee4a2 0%,#ebcc52 100%);background:-ms-linear-gradient(bottom,#eee4a2,#ebcc52)}a.signup:active{background:#111;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#b7a424),to(#b7a424));background:-moz-linear-gradient(center top,#b7a424 0%,#b7a424 100%);background:-ms-linear-gradient(bottom,#b7a424,#b7a424)}#big-counter{font-size:80px;font-weight:bold;margin-top:0;margin-bottom:10px;letter-spacing:-0.1em;text-shadow:0 -1px 0 rgba(0,0,0,0.7)}#download-button{border:solid #ffd452 1px;color:black;padding:.35em 2.5em;vertical-align:middle;border-style:solid;border-width:1px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;background:#ecd87a;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#f8efae),to(#f5d55a));background:-moz-linear-gradient(center top,#f8efae 0%,#f5d55a 100%);background:-ms-linear-gradient(bottom,#f8efae,#f5d55a)}.twoCols{float:left;width:240px}.twoCols.next{margin-left:0}ul.noStyle li{list-style:none}.clear{clear:both}.htabs{margin:15px 0;border-top:1px solid #ddd}ul.sidetabs{float:left;margin:0 0 25px;width:220px;line-height:1.4em;padding:0;border-right:1px solid #ddd;height:420px}ul.sidetabs li{list-style-type:none;margin:10px 0}ul.sidetabs li a{display:block;padding:8px 10px 7px;font-size:14px;text-decoration:none;border:1px solid transparent;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}ul.sidetabs li a.selected{color:#333;font-weight:bold;text-shadow:1px 1px 0 white;border:1px solid #ddd;border-right:none;background:url(../img/sidebar_selected.gif) 0 0 repeat-x}ul.sidetabs li a:hover{border-top-left-radius:4px;border-bottom-left-radius:4px;background:#f1f1f1}.htabs .tab-content{float:right;width:74%;margin-top:10px}div.column-fields img{background:white;border:1px solid #ddd;margin-right:10px;padding:2px;float:left}div.column-fields p{color:#999;line-height:1.2em}div.avatar{clear:both;border-top:1px solid #ddd;padding-top:10px;margin-top:30px;margin-bottom:30px}div.fingerprint{border-top:1px solid #ddd;margin-top:16px;padding-top:5px}.hidden{display:none}div.column-main{width:440px;float:left}div.column-sidebar{width:190px;float:left;margin-left:20px}div.column-group{background:url(../img/column-group-bg.png) no-repeat}div.column-fields{padding:8px}ul.field-pills{margin:0;padding:0}ul.field-pills li{position:relative;list-style-type:none;margin:3px 0;min-height:24px;line-height:24px;padding:4px 5px;background:#eee;font-size:12px;font-weight:bold;color:#333;border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}ul.field-pills li:hover{background-color:#f5f5f5;border-color:#ccc}ul.field-pills li .remove{position:absolute;top:50%;right:6px;margin-top:-6px;width:18px;height:18px;text-indent:-9999px;text-decoration:none;opacity:.7;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALBAMAAABbgmoVAAAAA3NCSVQICAjb4U/gAAAAGFBMVEX///+ZmZmZmZmZmZn///+ZmZmJiYl7e3trE/RpAAAACHRSTlMARIjM/////wcesEcAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAWdEVYdENyZWF0aW9uIFRpbWUAMTAvMTQvMDkZqeG9AAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M1cbXjNgAAAERJREFUCJljYBAODRZgYGAKDQ0NYmAQBVKhAgymIaEhoQYMoWGubqEBDKGhKalgyt0VSJmGpKYA5UTDQsOAKqH6IKYAAHwFEI290O6NAAAAAElFTkSuQmCC') no-repeat}ul.field-pills li .remove:hover{opacity:1}.explain{font-size:12px;line-height:1.5em}.add-pill{margin:15px 0;padding:4px 5px 12px;background:whiteSmoke;font-size:12px;color:#333;border:1px solid #ddd;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}ul.apps li{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADUAAAA1CAYAAADh5qNwAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAxMi8yMi8xMIw6XH0AAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzVxteM2AAAEkElEQVRoge2aT3LbNhTGf/J0X92g0jLc1C4X4S70CaqcoNYJap9A1glsn8DKCeIbhNlxwym74dbsCcobsAs8yhBFAAQFN/FMvhnNSBTw8D7g4f0BOOOVkBfVOXAOLICf5ftX+bsEsiSOmtDjtm3LLLTQvKhWwB2KjAtPwE0SR3Wo8YOTEkKfPbs1wDLUqrVty1kIQRrOJ/SZT+xnRDBSeVEtUHvHd8ZL4Pe8qOahdDmZVF5U87yoboFn1IwvgS1QO7qWwDqJowvgGnjOi+r6VH0A/z0lK7KQnwtgo/3Okji6NLTdI4mjrCez1X7WwA0vK177OJLRjiIvqivgDyB1NK2TOFqOVUBkL1CrbEMDZMBDf0L6cJISO/+C30bOUGZVuxrmRZUCj4xz/x12SRytTX+OIXWNijlT8AT8jSKpYw58QK36VK93aVqxtm35ydG5nDgowEo+G0ubBkXSBw0OJ2T0fpLmpMBHlxANNXDpaqSh9JSfifyN7MVBHJmf7KMNys3uvZmQXAG/cLgHasTMkjgqpa3uzaxKavJT1CT+yuHqlcA/A/Ib4AG417ORoz0le2ijCS0ljnhhCqkT5NfANomjHfTSJM0p6LN0Lu7cZ0Afx5JOkP/Ye7QAHvXA3V+pcxSxtNcxAz4BT0OJp9h3ymEg9kGGMqXBckTkr4A/B+TXqBCSgcWljygfMu17Okrt8Wg49Lom+Q3K7O71h9Y4JQ7jGjU7Y91uLW193HSJf7y6RxE6WtW2bZnlRfUFVagNxiRZ+g1wNWKwDFhL+xV2cnvvBfw7QnYn36XraqZ5kp10GCwdxOVusJtbP6FNUSa80NqUqByx1Nq5vGUtuj0ZdNOtqpz1BDaopPHWJF28Vd9L7gefkNDOMa/UWH0OKoU+qb1yaB7FoEgX0/rYYVnxnpwFqvwf2lNWORbLMZLaN8CScYtSd6j9o6NBJbRfURNUJnHUyGR0p0wfBvp1Y24dE3qHeY87SXUwehsZKJWBTjlrqNEyA8M4t7i98WhSYIgLvUH7adZYuUc5XE+uz7GbF6kOJcrWM4MCekLsgvXcz5Lh2DCJ1FiFFqiqdkihkBPTx0mkOmyxm07KS8neoMjsTMImmrCOIKRgnLJXGBJi+T/F/7xiCMFI7QViccdDcJjpJB1Ck+qwQ5GrTQ0cAfwUZKHP0jtcAX9JXDmCmOIz4QkBAc/SBzBHHZCk+kMh+sh0R+DEa5L6ZvhB6q3gB6m3gjP8b/6+dzRnqJs/YznxhtAA2/e/vft4lsRRk8TRDYpc9m31mowd6ob/Fni5ypGU5jJgYvl/IGMg1zy6n5IGywAlwGuixlL6G72flO1L1NJ+T9gCF7Yyx3qTKLXPOi+qB/zL6tCwVto6XNejAMhp6qXnAUgoWEv/IXgFXzn2vUCZwGvHtwZ5ecSHEEzIKCQE3KLI7Xz7j8Q9ykVPkj/K/IYgtr3Oi+oT7ouDscgY+Q6GDZNJdRDTyBwXBy7UWM7ufREsoRVT6V62GovuFGoZihAEztK1/bZEuWAbdqh987byzryo0v5LHPLslIsEK9q25T+aPkwOloQA7AAAAABJRU5ErkJggg%3D%3D) no-repeat;list-style-type:none;line-height:60px;padding-left:70px;font-weight:bold;font-size:16px}div.manage .qfbuttondiv{padding-top:16px;padding-left:120px;padding-bottom:16px;font-size:12px;margin:0;background-color:#f0f0f0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;visibility:hidden}div.manage>.manage{margin-left:25px;padding:10px;background-color:#e0e0e0;visibility:hidden}div.manage:hover>.qfbuttondiv{visibility:visible}div.bar{border:2px solid #ddd}span#bar,div#bar{width:100% height 20px;min-width:2%;max-width:100%;text-indent:-9999px;background:url('../img/usage_bars.gif') 0 0 repeat-x}div.page{padding-top:0}div.selector{margin-left:-4px}div.notifier{height:17px;width:13px;background-color:#cc3c29;margin:7px 10px 0 0;float:right;padding:3px 1px 1px 8px;border-radius:4px;color:white}a.notifier:hover{text-decoration:none}div.username{margin-top:-12px}span.username{color:#495961}div.following{color:#495961;font-size:14px;font-weight:bold;clear:both;margin-top:72px}div.vcard{border-top:1px solid #ddd;margin-top:20px;padding-top:10px;float:left;width:50%;min-height:400px;margin-bottom:50px}div.vcard dl{border-bottom:none;line-height:1em;padding:4px 0;margin-left:-5px}div.vcard dt{width:80px}div.vcard h4{font-size:14px;color:#495961;margin-top:30px;margin-bottom:10px}div.vcard a:hover{text-decoration:none;opacity:.6}div.actions{float:left;width:250px;line-height:2em;font-size:14px;min-height:300px}div.posts{color:#666;float:left;margin-top:-14px;margin-bottom:50px}ul.social-stats{padding:0}ul.social-stats li{list-style-type:none;display:inline;font-size:18px;font-weight:bold;display:inline;float:left;border-right:1px solid #ddd;margin-right:6px;padding-right:6px}ul.social-stats span.meta{color:#999;font-size:12px;font-weight:normal;display:block}ul.avatars{padding:0}ul.avatars li{list-style-type:none;display:inline}ul.avatars li img{padding:1px;border:1px solid #ddd;margin-right:6px}ul.following,ul.messages{padding:0;color:#666}ul.following li,ul.messages li{list-style-type:none;border-bottom:1px solid #ddd;padding:10px 0}ul.following li img,ul.messages li img{padding:1px;border:1px solid #ddd;margin-right:6px}ul.following div.follow-avatar,ul.following div.follow-user{float:left}div.bio{font-style:italic;width:440px;margin-top:5px}li.unread{background-color:#eaf2f5}ul.messages div.follow-avatar{float:left;padding-left:8px}ul.messages div.follow-user{float:left;width:490px}div.compose{margin:0 60px 12px 0;border-bottom:1px solid #ddd;color:#333}span.compose{font-size:24px;margin-right:3px;vertical-align:-3px}div.posts h4{color:#495961;margin:20px 0 0 10px}div.notification{margin-top:4px}div.subject{margin:3px 0;font-weight:bold}div.selector,div.selector span,div.checker span,div.radio span,div.uploader,div.uploader span.action{background-image:url(../img/sprite-aristo.png);background-repeat:no-repeat}.selector,.radio,.checker,.uploader,.selector *,.radio *,.checker *,.uploader *{margin:0;padding:0}div.selector{background-position:-483px -160px;line-height:32px;height:32px}div.selector span{background-position:right 0;height:32px;line-height:32px}div.selector select{top:0;left:0}div.selector:active,div.selector.active{background-position:-483px -192px}div.selector:active span,div.selector.active span{background-position:right -32px}div.selector.focus,div.selector.hover,div.selector:hover{background-position:-483px -224px}div.selector.focus span,div.selector.hover span,div.selector:hover span{background-position:right -64px}div.selector.focus:active,div.selector.focus.active,div.selector:hover:active,div.selector.active:hover{background-position:-483px -256px}div.selector.focus:active span,div.selector:hover:active span,div.selector.active:hover span,div.selector.focus.active span{background-position:right -96px}div.selector.disabled,div.selector.disabled:active,div.selector.disabled.active{background-position:-483px -288px}div.selector.disabled span,div.selector.disabled:active span,div.selector.disabled.active span{background-position:right -128px}div.checker,div.checker input{width:23px;height:23px}div.checker span{background-position:0 -320px;height:23px;width:23px}div.checker:active span,div.checker.active span{background-position:-23px -320px}div.checker.focus span,div.checker:hover span{background-position:-46px -320px}div.checker.focus:active span,div.checker:active:hover span,div.checker.active:hover span,div.checker.focus.active span{background-position:-69px -320px}div.checker span.checked{background-position:-92px -320px}div.checker:active span.checked,div.checker.active span.checked{background-position:-115px -320px}div.checker.focus span.checked,div.checker:hover span.checked{background-position:-138px -320px}div.checker.focus:active span.checked,div.checker:hover:active span.checked,div.checker.active:hover span.checked,div.checker.active.focus span.checked{background-position:-161px -320px}div.checker.disabled span,div.checker.disabled:active span,div.checker.disabled.active span{background-position:-184px -320px}div.checker.disabled span.checked,div.checker.disabled:active span.checked,div.checker.disabled.active span.checked{background-position:-207px -320px}div.radio,div.radio input{width:23px;height:23px}div.radio span{height:23px;width:23px;background-position:0 -343px}div.radio:active span,div.radio.active span{background-position:-23px -343px}div.radio.focus span,div.radio:hover span{background-position:-46px -343px}div.radio.focus:active span,div.radio:active:hover span,div.radio.active:hover span,div.radio.active.focus span{background-position:-69px -343px}div.radio span.checked{background-position:-92px -343px}div.radio:active span.checked,div.radio.active span.checked{background-position:-115px -343px}div.radio.focus span.checked,div.radio:hover span.checked{background-position:-138px -343px}div.radio.focus:active span.checked,div.radio:hover:active span.checked,div.radio.focus.active span.checked,div.radio.active:hover span.checked{background-position:-161px -343px}div.radio.disabled span,div.radio.disabled:active span,div.radio.disabled.active span{background-position:-184px -343px}div.radio.disabled span.checked,div.radio.disabled:active span.checked,div.radio.disabled.active span.checked{background-position:-207px -343px}div.uploader{background-position:0 -366px;height:32px}div.uploader span.action{background-position:right -494px;height:24px;line-height:24px}div.uploader span.filename{height:24px;margin:4px 0 4px 4px;line-height:24px}div.uploader.focus,div.uploader.hover,div.uploader:hover{background-position:0 -430px}div.uploader.focus span.action,div.uploader.hover span.action,div.uploader:hover span.action{background-position:right -526px}div.uploader.active span.action,div.uploader:active span.action{background-position:right -558px}div.uploader.focus.active span.action,div.uploader:focus.active span.action,div.uploader.focus:active span.action,div.uploader:focus:active span.action{background-position:right -590px}div.uploader.disabled{background-position:0 -398px}div.uploader.disabled span.action{background-position:right -462px}div.selector{margin-bottom:20px;width:190px;font-weight:bold;color:#464545;font-size:14px}div.selector select{width:190px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:1em;border:solid 1px #fff}div.selector span{padding:0 25px 0 2px;cursor:pointer;color:#666;width:158px;text-shadow:0 1px 0 #fff}div.selector.disabled span{color:#bbb}div.checker,div.radio{margin-right:10px}div.uploader{width:190px;margin-bottom:20px;cursor:pointer}div.uploader span.action{width:83px;text-align:center;text-shadow:rgba(255,255,255,0.5) 0 1px 0;background-color:#fff;font-weight:bold;color:#1c4257}div.uploader span.filename{color:#777;width:82px;border-right:solid 1px #567c91;font-size:11px}div.uploader input{width:190px}div.uploader.disabled span.action{color:#aaa}div.uploader.disabled span.filename{border-color:#ddd;color:#aaa}.btn{font-weight:bold;color:#234e70!important;border-radius:2px;-moz-border-radius:2px;-webkit-border-radius:2px;-webkit-box-shadow:rgba(0,0,0,0.15) 0 1px 3px;-moz-box-shadow:rgba(0,0,0,0.15) 0 1px 3px;box-shadow:rgba(0,0,0,0.15) 0 1px 3px;border:solid 1px #6e93b0;background:url('../img/btn-sm-bg.png') repeat-x 0 0;height:27px;line-height:26px;text-shadow:rgba(255,255,255,0.5) 0 1px 0;display:inline;float:left;margin-right:5px;padding:0 10px;-webkit-transition:-webkit-box-shadow .2s linear}.btn:hover{text-decoration:none!important;color:#234e70;-webkit-box-shadow:0 0 10px #a1cae2;-moz-box-shadow:0 0 10px #a1cae2}.btn:active{background-position:0 bottom}a.btn{text-decoration:none}select{height:28px}input[type=text],input[type=password],select,textarea{border:1px solid #aaa;transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,-moz-box-shadow linear .2s;-webkit-transition:border linear .2s,-webkit-box-shadow linear .2s;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;resize:none;font:normal normal normal 1.15em/1.1 'Lucida Grande',sans-serif}input[type=text]:focus,input[type=password]:focus,textarea:focus{outline:none;border-color:rgba(82,168,236,.75)!important;box-shadow:0 0 8px rgba(82,168,236,.5);-moz-box-shadow:0 0 8px rgba(82,168,236,.5);-webkit-box-shadow:0 0 8px rgba(82,168,236,.5)}.callout div.group{padding-left:10px}.boxheader h2,.header h2{margin:0;font-size:15px}label.radio,label.checker{color:#555;display:block;font-weight:bold;margin-bottom:10px}.selector select:focus,.radio input:focus,.checker input:focus,uploader input:focus{outline:0}div.selector{position:relative;padding-left:10px}div.selector span{display:block;float:left}div.selector select{position:absolute;opacity:0}div.checker{position:relative;float:left}div.checker span{display:block;float:left;text-align:center}div.checker input{opacity:0;display:inline-block}div.radio{position:relative;float:left}div.radio span{display:block;float:left;text-align:center}div.radio input{opacity:0;text-align:center;display:inline-block}div.uploader{position:relative;float:left;overflow:hidden}div.uploader span.action{float:left;display:inline;padding:4px 0;overflow:hidden;cursor:pointer}div.uploader span.filename{padding:0 10px;float:left;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}div.uploader input{opacity:0;position:absolute;top:0;right:0;bottom:0;float:right}
116 public/static/css/greycurve.css
... ... @@ -1,4 +1,4 @@
1   -body
  1 +body
2 2 {
3 3 font-family: Arial, Helvetica, sans-serif;
4 4 margin: 0;
@@ -27,12 +27,10 @@
27 27
28 28 .top-header
29 29 {
30   - background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#D4D9DB), to(#BDC0C2));
31   - background: -moz-linear-gradient(center top , #D4D9DB, #BDC0C2) repeat scroll 0 0 transparent;
32   - background-color: #D4D9DB;
33 30 color: black;
34 31 font-size: 13px;
35 32 height: 36px;
  33 + @mixin gradient(#D4D9DB, #D4D9DB, #BDC0C2);
36 34 }
37 35
38 36 .rpx_box2
@@ -96,14 +94,12 @@ span.free {
96 94 {
97 95 -webkit-box-shadow: rgba(0, 0, 0, 0.496094) 0px 1px 2px;
98 96 -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
99   - background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#333), to(#111));
100   - background: -moz-linear-gradient(center top , #333333, #111111) repeat scroll 0 0 transparent;
101   - background-color: #333333;
102 97 height: 100%;
103 98 left: 0px;
104 99 position: absolute;
105 100 top: 0px;
106 101 width: 100%;
  102 + @mixin gradient(#333333, #333333, #111111);
107 103 }
108 104
109 105 .top-nav-inner
@@ -332,9 +328,6 @@ img.thumbs
332 328 }
333 329
334 330 .message {
335   - background: #DDFFDD;
336   - background: url(../img/accept.png) no-repeat scroll 10px 0.6em, -moz-linear-gradient(center top,#F1FEF4,#C4E6BD);
337   - background: url(../img/accept.png) no-repeat scroll 10px 0.6em, -webkit-gradient(linear,0% 0%,0% 100%,from(#F1FEF4),to(#C4E6BD));
338 331 -moz-border-radius: 4px;
339 332 -webkit-border-radius: 4px;
340 333 border: 1px solid #BFB;
@@ -342,19 +335,18 @@ img.thumbs
342 335 padding: 0.5em 1em 0.5em 40px;
343 336 position: relative;
344 337 color: #1F5714;
  338 + @mixin gradient(#DDFFDD, #F1FEF4,#C4E6BD);
345 339 }
346 340
347 341 .error-msg {
348   - background: #FFDDDD;
349   - background: url(../img/error.png) no-repeat scroll 10px 0.6em, -moz-linear-gradient(center top,#FEF1F4,#E6C4BD);
350   - background: url(../img/error.png) no-repeat scroll 10px 0.6em, -webkit-gradient(linear,0% 0%,0% 100%,from(#FEF1F4),to(#E6C4BD));
351   - -moz-border-radius: 4px;
352   - -webkit-border-radius: 4px;
  342 + /* @alternate */ background: url(../img/error.png) no-repeat scroll 10px 0.6em;
353 343 border: 1px solid #FFBBBB;
354 344 margin: 0.5em 0 1em;
355 345 padding: 0.5em 1em 0.5em 40px;
356 346 position: relative;
357 347 color: #900;
  348 + @mixin radius(4px);
  349 + @mixin gradient(#FFDDDD, #FEF1F4, #E6C4BD);
358 350 }
359 351
360 352 .icon_label_feed_sm
@@ -422,18 +414,18 @@ h4
422 414
423 415 .footer-container
424 416 {
425   - /*background-color: #8EC1DA;*/
426   - margin-top: 25px;
427   - padding: 20px 20px 20px 20px;
  417 + max-width: 1120px;
  418 + min-width: 1000px;
  419 + margin: auto;
  420 + padding: 10px 10px 10px 10px;
428 421 font-size: 12px;
429   - background-color: #E8EBEC;
430   - border-top: 1px solid #C4CACC;
431   - border-bottom: 1px solid #C4CACC;
  422 + text-align: center;
  423 + color: #4d4d4d;
432 424 }
433 425
434 426 .footer-container a:link, .footer-container a:visited
435 427 {
436   - color: #010259;
  428 + color: #486999;
437 429 }
438 430
439 431 #appjetfooter
@@ -476,41 +468,30 @@ dd {
476 468 }
477 469
478 470 div.header {
479   - -moz-border-radius-topleft: 5px;
480   - -moz-border-radius-topright: 5px;
481   - -webkit-border-radius: 5px 0px;
482   - border-top-left-radius: 5px 5px;
483   - border-top-right-radius: 5px 5px;
484   - background-color: #C7C7C7;
485 471 color: #707070;
486 472 padding: 8px 3px 8px 10px;
487 473 border: 1px solid #999999;
488 474 border-bottom: none;
489   - background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#D0D0D0), to(#BFBFBF) );
490   - background: -moz-linear-gradient(center top, #D0D0D0, #BFBFBF) repeat scroll 0 0 transparent;
491 475 -webkit-box-shadow: rgba(0, 0, 0, 0.196094) 0px 0px 5px;
492 476 -moz-box-shadow: 0 0px 5px rgba(0, 0, 0, 0.196094);
493 477 font-size: 14px;
494 478 text-shadow: 0 1px 0 rgba(255, 255, 255, 0.7)
  479 + @mixin radius(5px 5px 0px 0px);
  480 + @mixin gradient(#C7C7C7, #D0D0D0, #BFBFBF);
495 481 }
496 482
497 483 div.group {
498   - -moz-border-radius: 5px 5px 5px 5px;
499   - border-bottom-left-radius: 5px 5px;
500   - border-bottom-right-radius: 5px 5px;
501 484 -webkit-box-shadow: rgba(0, 0, 0, 0.196094) 0px 0px 5px;
502 485 -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
503 486 background-color: white;
504 487 border: 1px solid #999999;
505 488 padding-bottom: 15px;
  489 + @mixin radius(0px 0px 5px 5px);
506 490 }
507 491
508 492 div.sub-header {
509   - font-weight: bold;
510   - background-color: #E6E6E6;
511   - /* background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#E6E6E6), to(#BFBFBF)); */
512   - background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#F2F2F2), to(#DADADA) );
513   - background: -moz-linear-gradient(center top, #F2F2F2, #DADADA) repeat scroll 0 0 transparent;
  493 + font-weight: bold;
  494 + @mixin gradient(#E6E6E6, #F2F2F2, #DADADA);
514 495 }
515 496
516 497 span.header dl {
@@ -573,12 +554,7 @@ div.rateMe a.on {
573 554
574 555 a.signup
575 556 {
576   - background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#F8EFAE), to(#F5D55A));
577   - background: -moz-linear-gradient(center top , #F8EFAE, #F5D55A) repeat scroll 0 0 transparent;
578   - background-color: #ECD87A;
579 557 border: solid #FFD452 1px;
580   - -webkit-border-radius: 5px 5px;
581   - -moz-border-radius: 5px;
582 558 color: #333;
583 559 display: block;
584 560 font-family: Helvetica, Arial, sans-serif;
@@ -590,20 +566,18 @@ a.signup
590 566 text-align: center;
591 567 text-decoration: none;
592 568 text-shadow: #DF6 0px 1px 0px;
  569 + @mixin radius(5px);