diff --git a/.ctags b/.ctags deleted file mode 100644 index fa51e9e..0000000 --- a/.ctags +++ /dev/null @@ -1,11 +0,0 @@ ---extra=+f ---exclude=*jquery* ---exclude=node_modules/a* ---exclude=node_modules/[c-z]* ---exclude=*grunt* ---exclude=*bower* ---exclude=.swp ---exclude=public ---links=yes ---totals=yes - diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index c2cdfb8..0000000 --- a/.editorconfig +++ /dev/null @@ -1,21 +0,0 @@ -# EditorConfig helps developers define and maintain consistent -# coding styles between different editors and IDEs -# editorconfig.org - -root = true - - -[*] - -# Change these settings to your own preference -indent_style = space -indent_size = 2 - -# We recommend you to keep these unchanged -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -[*.md] -trim_trailing_whitespace = false diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 32edf24..0000000 --- a/.travis.yml +++ /dev/null @@ -1,7 +0,0 @@ -language: node_js -node_js: - - "0.10" -env: - - NODE_ENV=travis -services: - - mongodb diff --git a/Gruntfile.js b/Gruntfile.js index 7b04cce..5cd0641 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -3,66 +3,18 @@ module.exports = function(grunt) { //Load NPM tasks - grunt.loadNpmTasks('grunt-contrib-watch'); grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-concat'); grunt.loadNpmTasks('grunt-css'); - grunt.loadNpmTasks('grunt-mocha-test'); - grunt.loadNpmTasks('grunt-nodemon'); - grunt.loadNpmTasks('grunt-concurrent'); - grunt.loadNpmTasks('grunt-env'); grunt.loadNpmTasks('grunt-markdown'); // Project Configuration grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), - watch: { - readme: { - files: ['README.md'], - tasks: ['markdown'] - }, - jade: { - files: ['app/views/**'], - options: { - livereload: true, - }, - }, - js: { - files: ['Gruntfile.js', 'insight.js', 'app/**/*.js', 'public/js/**'], - tasks: ['jshint'], - options: { - livereload: true, - }, - }, - assets: { - files: ['public/src/**/*.js', 'public/**/*.css'], - tasks: ['compile'], - options: { - livereload: true, - }, - }, - html: { - files: ['public/views/**'], - options: { - livereload: true, - }, - }, - css: { - files: ['public/css/**'], - options: { - livereload: true - } - }, - // we monitor only app/models/* because we have test for models only now -// test: { -// files: ['test/**/*.js', 'test/*.js','app/models/*.js'], -// tasks: ['test'], -// } - }, jshint: { all: { - src: ['Gruntfile.js', 'insight.js', 'app/**/*.js', 'public/src/js/**/*.js','lib/*.js'], + src: ['Gruntfile.js', 'public/src/js/**/*.js'], options: { jshintrc: true } @@ -92,7 +44,7 @@ module.exports = function(grunt) { dest: 'public/js/main.js' }, css: { - src: ['public/src/css/**/*.css'], + src: ['public/lib/bootstrap/dist/css/bootstrap.min.css', 'public/src/css/**/*.css'], dest: 'public/css/main.css' } }, @@ -120,38 +72,6 @@ module.exports = function(grunt) { dest: 'public/css/main.min.css' } }, - mochaTest: { - options: { - reporter: 'spec', - }, - src: ['test/**/*.js'], - }, - nodemon: { - dev: { - script: 'insight.js', - options: { - args: [], - ignore: ['public/**/*.html','public/**/*.css', 'public/**/*.js', 'test/**/*','util/**/*', ,'dev-util/**/*'], - // nodeArgs: ['--debug'], - delayTime: 1, - env: { - PORT: 3000 - }, - cwd: __dirname - } - } - }, - concurrent: { - tasks: ['nodemon', 'watch'], - options: { - logConcurrentOutput: true - } - }, - env: { - test: { - NODE_ENV: 'test' - } - }, markdown: { all: { files: [ @@ -170,11 +90,8 @@ module.exports = function(grunt) { grunt.option('force', true); //Default task(s). - grunt.registerTask('default', ['jshint', 'compile', 'concurrent']); + grunt.registerTask('default', ['jshint']); //Compile task (concat + minify) grunt.registerTask('compile', ['concat', 'uglify', 'cssmin']); - - //Test task. - grunt.registerTask('test', ['env:test', 'mochaTest']); }; diff --git a/README.md b/README.md index 889eb7e..2551e29 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ front-end and LevelDB for storage. Check some screenshots and more details at [insight's project homepage](http://insight.bitcore.io). +*Insight* project is now splitted in two repositories. One for the [API](https://github.com/bitpay/insight-api) and for the front-end. This repository is for the front-end, which will install the API as a NPM dependency. ## Prerequisites @@ -39,7 +40,11 @@ bitcoind must be running and must have finished downloading the blockchain **bef Run the main application: - $ node insight.js + $ npm start + + Or just run: + + $ INSIGHT_PUBLIC_PATH=public node node_modules/insight-bitcore-api/insight.js Then open a browser and go to: @@ -110,10 +115,6 @@ To compile and minify the web application's assets: ```$ grunt compile``` -To run the tests - -```$ grunt test``` - Contributions and suggestions are welcomed at [insight github repository](https://github.com/bitpay/insight). diff --git a/app/controllers/addresses.js b/app/controllers/addresses.js deleted file mode 100644 index c94779b..0000000 --- a/app/controllers/addresses.js +++ /dev/null @@ -1,53 +0,0 @@ -'use strict'; - -/** - * Module dependencies. - */ - -var Address = require('../models/Address'), - common = require('./common'); - -var getAddr = function(req, res, next) { - var a; - try { - var addr = req.param('addr'); - a = Address.new(addr); - } catch (e) { - common.handleErrors({message: 'Invalid address:' + e.message, code: 1}, res, next); - return null; - } - return a; -}; - - -exports.show = function(req, res, next) { - var a = getAddr(req, res, next); - - if (a) - a.update(function(err) { - if (err) { - return common.handleErrors(err, res); - } - else { - return res.jsonp(a); - } - }); -}; - - - -exports.utxo = function(req, res, next) { - var a = getAddr(req, res, next); - - if (a) - a.getUtxo(function(err, utxo) { - if (err) - return common.handleErrors(err, res); - else { - return res.jsonp(utxo); - } - }); -}; - - - diff --git a/app/controllers/blocks.js b/app/controllers/blocks.js deleted file mode 100644 index def4e35..0000000 --- a/app/controllers/blocks.js +++ /dev/null @@ -1,156 +0,0 @@ -'use strict'; - -/** - * Module dependencies. - */ -var common = require('./common'), - async = require('async'), - BlockDb = require('../../lib/BlockDb').class(); - -var bdb = new BlockDb(); - -/** - * Find block by hash ... - */ -exports.block = function(req, res, next, hash) { - bdb.fromHashWithInfo(hash, function(err, block) { - if (err || !block) - return common.handleErrors(err, res, next); - else { - bdb.getPoolInfo(block.info.tx[0], function(info) { - block.info.poolInfo = info; - req.block = block.info; - return next(); - }); - } - }); -}; - - -/** - * Show block - */ -exports.show = function(req, res) { - if (req.block) { - res.jsonp(req.block); - } -}; - -/** - * Show block by Height - */ -exports.blockindex = function(req, res, next, height) { - bdb.blockIndex(height, function(err, hashStr) { - if (err) { - console.log(err); - res.status(400).send('Bad Request'); // TODO - } else { - res.jsonp(hashStr); - } - }); -}; - -var getBlock = function(blockhash, cb) { - bdb.fromHashWithInfo(blockhash, function(err, block) { - if (err) { - console.log(err); - return cb(err); - } - - // TODO - if (!block.info) { - console.log('[blocks.js.60]: could not get %s from RPC. Orphan? Error?', blockhash); //TODO - // Probably orphan - block.info = { - hash: blockhash, - isOrphan: 1, - }; - } - - bdb.getPoolInfo(block.info.tx[0], function(info) { - block.info.poolInfo = info; - return cb(err, block.info); - }); - - }); -}; - -/** - * List of blocks by date - */ -exports.list = function(req, res) { - var isToday = false; - - //helper to convert timestamps to yyyy-mm-dd format - var formatTimestamp = function(date) { - var yyyy = date.getUTCFullYear().toString(); - var mm = (date.getUTCMonth() + 1).toString(); // getMonth() is zero-based - var dd = date.getUTCDate().toString(); - - return yyyy + '-' + (mm[1] ? mm : '0' + mm[0]) + '-' + (dd[1] ? dd : '0' + dd[0]); //padding - }; - - var dateStr; - var todayStr = formatTimestamp(new Date()); - - if (req.query.blockDate) { - // TODO: Validate format yyyy-mm-dd - dateStr = req.query.blockDate; - isToday = dateStr === todayStr; - } else { - dateStr = todayStr; - isToday = true; - } - - var gte = Math.round((new Date(dateStr)).getTime() / 1000); - - //pagination - var lte = gte + 86400; - var prev = formatTimestamp(new Date((gte - 86400) * 1000)); - var next = formatTimestamp(new Date(lte * 1000)); - - bdb.getBlocksByDate(gte, lte, function(err, blocks) { - if (err) { - res.status(500).send(err); - } else { - var blockList = []; - var l = blocks.length; - var limit = parseInt(req.query.limit || l); - if (l < limit) limit = l; - - for (var i = 0; i < limit; i++) { - blockList.push(blocks[i]); - } - - async.mapSeries(blockList, - function(b, cb) { - getBlock(b.hash, function(err, info) { - if (err) { - console.log(err); - return cb(err); - } - return cb(err, { - height: info.height, - size: info.size, - hash: b.hash, - time: b.ts || info.time, - txlength: info.tx.length, - poolInfo: info.poolInfo - }); - }); - }, function(err, allblocks) { - res.jsonp({ - blocks: allblocks, - length: allblocks.length, - pagination: { - next: next, - prev: prev, - currentTs: lte - 1, - current: dateStr, - isToday: isToday - } - }); - }); - } - }); -}; diff --git a/app/controllers/common.js b/app/controllers/common.js deleted file mode 100644 index b44756b..0000000 --- a/app/controllers/common.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict'; - - -exports.handleErrors = function (err, res) { - if (err) { - if (err.code) { - res.status(400).send(err.message + '. Code:' + err.code); - } - else { - res.status(503).send(err.message); - } - } - else { - res.status(404).send('Not found'); - } -}; diff --git a/app/controllers/currency.js b/app/controllers/currency.js deleted file mode 100644 index 244ef32..0000000 --- a/app/controllers/currency.js +++ /dev/null @@ -1,60 +0,0 @@ -'use strict'; - -var config = require('../../config/config'); - -// Set the initial vars -var timestamp = +new Date(), - delay = config.currencyRefresh * 60000, - bitstampRate = 0; - -exports.index = function(req, res) { - - var _xhr = function() { - if (typeof XMLHttpRequest !== 'undefined' && XMLHttpRequest !== null) { - return new XMLHttpRequest(); - } else if (typeof require !== 'undefined' && require !== null) { - var XMLhttprequest = require('xmlhttprequest').XMLHttpRequest; - return new XMLhttprequest(); - } - }; - - var _request = function(url, cb) { - var request; - request = _xhr(); - request.open('GET', url, true); - request.onreadystatechange = function() { - if (request.readyState === 4) { - if (request.status === 200) { - return cb(false, request.responseText); - } - - return cb(true, { - status: request.status, - message: 'Request error' - }); - } - }; - - return request.send(null); - }; - - // Init - var currentTime = +new Date(); - if (bitstampRate === 0 || currentTime >= (timestamp + delay)) { - timestamp = currentTime; - - _request('https://www.bitstamp.net/api/ticker/', function(err, data) { - if (!err) bitstampRate = parseFloat(JSON.parse(data).last); - - res.jsonp({ - status: 200, - data: { bitstamp: bitstampRate } - }); - }); - } else { - res.jsonp({ - status: 200, - data: { bitstamp: bitstampRate } - }); - } -}; diff --git a/app/controllers/index.js b/app/controllers/index.js deleted file mode 100644 index b4982db..0000000 --- a/app/controllers/index.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict'; - -exports.render = function(req, res) { - res.render('index'); -}; - -exports.version = function(req, res) { - var pjson = require('../../package.json'); - res.json({version: pjson.version}); -}; - diff --git a/app/controllers/socket.js b/app/controllers/socket.js deleted file mode 100644 index 9a11f5b..0000000 --- a/app/controllers/socket.js +++ /dev/null @@ -1,57 +0,0 @@ -'use strict'; - -// server-side socket behaviour -// io is a variable already taken in express -var ios = null; -var util = require('bitcore/util/util'); - -module.exports.init = function(app, io_ext) { - ios = io_ext; - ios.set('log level', 1); // reduce logging - ios.sockets.on('connection', function(socket) { - socket.on('subscribe', function(topic) { - socket.join(topic); - }); - }); -}; - -module.exports.broadcastTx = function(tx) { - if (ios) { - var t; - if (typeof tx === 'string') { - t = { - txid: tx - }; - } - - else { - t = { - txid: tx.txid, - size: tx.size, - }; - // Outputs - var valueOut = 0; - tx.vout.forEach(function(o) { - valueOut += o.value * util.COIN; - }); - - t.valueOut = parseInt(valueOut) / util.COIN; - } - ios.sockets. in ('inv').emit('tx', t); - } -}; - -module.exports.broadcastBlock = function(block) { - if (ios) ios.sockets. in ('inv').emit('block', block); -}; - -module.exports.broadcastAddressTx = function(address, tx) { - if (ios) ios.sockets. in (address).emit(address, tx); -}; - -module.exports.broadcastSyncInfo = function(historicSync) { - - if (ios) { - ios.sockets. in ('sync').emit('status', historicSync); - } -}; diff --git a/app/controllers/status.js b/app/controllers/status.js deleted file mode 100644 index 0d9194b..0000000 --- a/app/controllers/status.js +++ /dev/null @@ -1,59 +0,0 @@ -'use strict'; - -/** - * Module dependencies. - */ - -var Status = require('../models/Status'), - common = require('./common'); - -/** - * Status - */ -exports.show = function(req, res) { - - if (! req.query.q) { - res.status(400).send('Bad Request'); - } - else { - var option = req.query.q; - var statusObject = Status.new(); - - var returnJsonp = function (err) { - if (err || ! statusObject) - return common.handleErrors(err, res); - else { - res.jsonp(statusObject); - } - }; - - switch(option) { - case 'getInfo': - statusObject.getInfo(returnJsonp); - break; - case 'getDifficulty': - statusObject.getDifficulty(returnJsonp); - break; - case 'getTxOutSetInfo': - statusObject.getTxOutSetInfo(returnJsonp); - break; - case 'getLastBlockHash': - statusObject.getLastBlockHash(returnJsonp); - break; - default: - res.status(400).send('Bad Request'); - } - } -}; - -exports.sync = function(req, res) { - if (req.historicSync) - res.jsonp(req.historicSync.info()); -}; - -exports.peer = function(req, res) { - if (req.peerSync) { - var info = req.peerSync.info(); - res.jsonp(info); - } -}; diff --git a/app/controllers/transactions.js b/app/controllers/transactions.js deleted file mode 100644 index cda2868..0000000 --- a/app/controllers/transactions.js +++ /dev/null @@ -1,145 +0,0 @@ -'use strict'; - -/** - * Module dependencies. - */ -var Address = require('../models/Address'); -var async = require('async'); -var common = require('./common'); - -var TransactionDb = require('../../lib/TransactionDb').class(); -var BlockDb = require('../../lib/BlockDb').class(); - -var tDb = new TransactionDb(); -var bdb = new BlockDb(); - - -/** - * Find transaction by hash ... - */ -exports.transaction = function(req, res, next, txid) { - - tDb.fromIdWithInfo(txid, function(err, tx) { - if (err || ! tx) - return common.handleErrors(err, res); - else { - req.transaction = tx.info; - return next(); - } - }); -}; - - -/** - * Show transaction - */ -exports.show = function(req, res) { - - if (req.transaction) { - res.jsonp(req.transaction); - } -}; - - -var getTransaction = function(txid, cb) { - - tDb.fromIdWithInfo(txid, function(err, tx) { - if (err) console.log(err); - - if (!tx || !tx.info) { - console.log('[transactions.js.48]:: TXid %s not found in RPC. CHECK THIS.', txid); - return ({ txid: txid }); - } - - return cb(null, tx.info); - }); -}; - - -/** - * List of transaction - */ -exports.list = function(req, res, next) { - var bId = req.query.block; - var addrStr = req.query.address; - var page = req.query.pageNum; - var pageLength = 10; - var pagesTotal = 1; - var txLength; - var txs; - - if (bId) { - bdb.fromHashWithInfo(bId, function(err, block) { - if (err) { - console.log(err); - return res.status(500).send('Internal Server Error'); - } - - if (! block) { - return res.status(404).send('Not found'); - } - - txLength = block.info.tx.length; - - if (page) { - var spliceInit = page * pageLength; - txs = block.info.tx.splice(spliceInit, pageLength); - pagesTotal = Math.ceil(txLength / pageLength); - } - else { - txs = block.info.tx; - } - - async.mapSeries(txs, getTransaction, function(err, results) { - if (err) { - console.log(err); - res.status(404).send('TX not found'); - } - - res.jsonp({ - pagesTotal: pagesTotal, - txs: results - }); - }); - }); - } - else if (addrStr) { - var a = Address.new(addrStr); - - a.update(function(err) { - if (err && !a.totalReceivedSat) { - console.log(err); - res.status(404).send('Invalid address'); - return next(); - } - - txLength = a.transactions.length; - - if (page) { - var spliceInit = page * pageLength; - txs = a.transactions.splice(spliceInit, pageLength); - pagesTotal = Math.ceil(txLength / pageLength); - } - else { - txs = a.transactions; - } - - async.mapSeries(txs, getTransaction, function(err, results) { - if (err) { - console.log(err); - res.status(404).send('TX not found'); - } - - res.jsonp({ - pagesTotal: pagesTotal, - txs: results - }); - }); - }); - } - else { - res.jsonp({ - txs: [] - }); - } -}; diff --git a/app/models/Address.js b/app/models/Address.js deleted file mode 100644 index aef9c25..0000000 --- a/app/models/Address.js +++ /dev/null @@ -1,194 +0,0 @@ -'use strict'; - -require('classtool'); - - -function spec() { - var async = require('async'); - var BitcoreAddress = require('bitcore/Address').class(); - var BitcoreUtil = require('bitcore/util/util'); - var TransactionDb = require('../../lib/TransactionDb').class(); - var BitcoreTransaction = require('bitcore/Transaction').class(); - var Parser = require('bitcore/util/BinaryParser').class(); - var Buffer = require('buffer').Buffer; - var CONCURRENCY = 5; - - function Address(addrStr) { - this.balanceSat = 0; - this.totalReceivedSat = 0; - this.totalSentSat = 0; - - this.unconfirmedBalanceSat = 0; - - this.txApperances = 0; - this.unconfirmedTxApperances= 0; - - // TODO store only txids? +index? +all? - this.transactions = []; - - var a = new BitcoreAddress(addrStr); - a.validate(); - this.addrStr = addrStr; - - Object.defineProperty(this, 'totalSent', { - get: function() { - return parseFloat(this.totalSentSat) / parseFloat(BitcoreUtil.COIN); - }, - set: function(i) { - this.totalSentSat = i * BitcoreUtil.COIN; - }, - enumerable: 1, - }); - - Object.defineProperty(this, 'balance', { - get: function() { - return parseFloat(this.balanceSat) / parseFloat(BitcoreUtil.COIN); - }, - set: function(i) { - this.balance = i * BitcoreUtil.COIN; - }, - enumerable: 1, - }); - - Object.defineProperty(this, 'totalReceived', { - get: function() { - return parseFloat(this.totalReceivedSat) / parseFloat(BitcoreUtil.COIN); - }, - set: function(i) { - this.totalReceived = i * BitcoreUtil.COIN; - }, - enumerable: 1, - }); - - - Object.defineProperty(this, 'unconfirmedBalance', { - get: function() { - return parseFloat(this.unconfirmedBalanceSat) / parseFloat(BitcoreUtil.COIN); - }, - set: function(i) { - this.unconfirmedBalanceSat = i * BitcoreUtil.COIN; - }, - enumerable: 1, - }); - - } - - Address.prototype._getScriptPubKey = function(hex,n) { - // ScriptPubKey is not provided by bitcoind RPC, so we parse it from tx hex. - - var parser = new Parser(new Buffer(hex,'hex')); - var tx = new BitcoreTransaction(); - tx.parse(parser); - return (tx.outs[n].s.toString('hex')); - }; - - Address.prototype.getUtxo = function(next) { - var self = this; - if (!self.addrStr) return next(); - - var ret = []; - var db = new TransactionDb(); - - db.fromAddr(self.addrStr, function(err,txOut){ - if (err) return next(err); - - // Complete utxo info - async.eachLimit(txOut,CONCURRENCY,function (txItem, a_c) { - db.fromIdInfoSimple(txItem.txid, function(err, info) { - - var scriptPubKey = self._getScriptPubKey(info.hex, txItem.index); - - // we are filtering out even unconfirmed spents! - // add || !txItem.spentIsConfirmed - if (!txItem.spentTxId) { - ret.push({ - address: self.addrStr, - txid: txItem.txid, - vout: txItem.index, - ts: txItem.ts, - scriptPubKey: scriptPubKey, - amount: txItem.value_sat / BitcoreUtil.COIN, - confirmations: txItem.isConfirmed ? info.confirmations : 0, - }); - } - return a_c(err); - }); - }, function(err) { - return next(err,ret); - }); - }); - }; - - Address.prototype.update = function(next) { - var self = this; - if (!self.addrStr) return next(); - - var txs = []; - var db = new TransactionDb(); - async.series([ - function (cb) { - var seen={}; - db.fromAddr(self.addrStr, function(err,txOut){ - if (err) return cb(err); - txOut.forEach(function(txItem){ - var add=0, addSpend=0; - var v = txItem.value_sat; - - if ( !seen[txItem.txid] ) { - txs.push({txid: txItem.txid, ts: txItem.ts}); - seen[txItem.txid]=1; - add=1; - } - - if (txItem.spentTxId && !seen[txItem.spentTxId] ) { - txs.push({txid: txItem.spentTxId, ts: txItem.spentTs}); - seen[txItem.spentTxId]=1; - addSpend=1; - } - - if (txItem.isConfirmed) { - self.txApperances += add; - self.totalReceivedSat += v; - if (! txItem.spentTxId ) { - //unspent - self.balanceSat += v; - } - else if(!txItem.spentIsConfirmed) { - // unspent - self.balanceSat += v; - self.unconfirmedBalanceSat -= v; - self.unconfirmedTxApperances += addSpend; - } - else { - // spent - self.totalSentSat += v; - self.txApperances += addSpend; - } - } - else { - self.unconfirmedBalanceSat += v; - self.unconfirmedTxApperances += add; - } - }); - return cb(); - }); - }, - ], function (err) { - - // sort input and outputs togheter - txs.sort( - function compare(a,b) { - if (a.ts < b.ts) return 1; - if (a.ts > b.ts) return -1; - return 0; - }); - - self.transactions = txs.map(function(i) { return i.txid; } ); - return next(err); - }); - }; - - return Address; -} -module.defineClass(spec); - diff --git a/app/models/Status.js b/app/models/Status.js deleted file mode 100644 index 106c309..0000000 --- a/app/models/Status.js +++ /dev/null @@ -1,112 +0,0 @@ -'use strict'; - -require('classtool'); - -function spec() { - var async = require('async'); - var RpcClient = require('bitcore/RpcClient').class(); - var BlockDb = require('../../lib/BlockDb').class(); - var config = require('../../config/config'); - var rpc = new RpcClient(config.bitcoind); - - function Status() { - this.bDb = new BlockDb(); - } - - Status.prototype.getInfo = function(next) { - var that = this; - async.series([ - function (cb) { - rpc.getInfo(function(err, info){ - if (err) return cb(err); - - that.info = info.result; - return cb(); - }); - }, - ], function (err) { - return next(err); - }); - }; - - Status.prototype.getDifficulty = function(next) { - var that = this; - async.series([ - function (cb) { - rpc.getDifficulty(function(err, df){ - if (err) return cb(err); - - that.difficulty = df.result; - return cb(); - }); - } - ], function (err) { - return next(err); - }); - }; - - Status.prototype.getTxOutSetInfo = function(next) { - var that = this; - async.series([ - function (cb) { - rpc.getTxOutSetInfo(function(err, txout){ - if (err) return cb(err); - - that.txoutsetinfo = txout.result; - return cb(); - }); - } - ], function (err) { - return next(err); - }); - }; - - Status.prototype.getBestBlockHash = function(next) { - var that = this; - async.series([ - function (cb) { - rpc.getBestBlockHash(function(err, bbh){ - if (err) return cb(err); - - that.bestblockhash = bbh.result; - return cb(); - }); - }, - - ], function (err) { - return next(err); - }); - }; - - Status.prototype.getLastBlockHash = function(next) { - var that = this; - that.bDb.getTip(function(err,tip) { - that.syncTipHash = tip; - async.waterfall( - [ - function(callback){ - rpc.getBlockCount(function(err, bc){ - if (err) return callback(err); - callback(null, bc.result); - }); - }, - function(bc, callback){ - rpc.getBlockHash(bc, function(err, bh){ - if (err) return callback(err); - callback(null, bh.result); - }); - } - ], - function (err, result) { - that.lastblockhash = result; - return next(); - } - ); - }); - }; - - return Status; - -} -module.defineClass(spec); - diff --git a/app/views/404.jade b/app/views/404.jade deleted file mode 100644 index af5da97..0000000 --- a/app/views/404.jade +++ /dev/null @@ -1,12 +0,0 @@ -extends layouts/default - -block main - h1 Oops something went wrong - br - span 404 - -block content - #error-message-box - #error-stack-trace - pre - code!= error diff --git a/app/views/500.jade b/app/views/500.jade deleted file mode 100644 index 491b000..0000000 --- a/app/views/500.jade +++ /dev/null @@ -1,12 +0,0 @@ -extends layouts/default - -block main - h1 Oops something went wrong - br - span 500 - -block content - #error-message-box - #error-stack-trace - pre - code!= error diff --git a/app/views/includes/foot.jade b/app/views/includes/foot.jade deleted file mode 100644 index 8659501..0000000 --- a/app/views/includes/foot.jade +++ /dev/null @@ -1,7 +0,0 @@ -#footer(data-ng-include="'/views/includes/footer.html'", role='navigation') - -script(type='text/javascript', src='/socket.io/socket.io.js') -script(type='text/javascript', src='/js/vendors.min.js') -script(type='text/javascript', src='/js/angularjs-all.min.js') -script(type='text/javascript', src='/js/main.min.js') - diff --git a/app/views/includes/head.jade b/app/views/includes/head.jade deleted file mode 100644 index 9afe8d7..0000000 --- a/app/views/includes/head.jade +++ /dev/null @@ -1,22 +0,0 @@ -head - meta(charset='utf-8') - meta(http-equiv='X-UA-Compatible', content='IE=edge,chrome=1') - meta(name='viewport', content='width=device-width,initial-scale=1.0') - meta(name="fragment", content="!") - - title(data-ng-bind="$root.title + $root.titleDetail + ' | #{appName}'")= appName - meta(http-equiv='Content-type', content='text/html;charset=UTF-8') - meta(name="keywords", content="bitcoins, transactions, blocks, address, block chain, best block, mining difficulty, hash serialized") - meta(name="description", content="Bitcoin Insight. View detailed information on all bitcoin transactions and block. {{ $root.title + $root.titleDetail }}") - - link(rel='shortcut icon', href='/img/icons/favicon.ico', type='image/x-icon') - - link(rel='stylesheet', href='//fonts.googleapis.com/css?family=Ubuntu:300,400,500,700,400italic') - link(rel='stylesheet', href='/lib/bootstrap/dist/css/bootstrap.min.css') - link(rel='stylesheet', href='/css/main.min.css') - - if (config.keys.segmentio) - script(type='text/javascript'). - window.analytics||(window.analytics=[]),window.analytics.methods=['identify','track','trackLink','trackForm','trackClick','trackSubmit','page','pageview','ab','alias','ready','group','on','once','off'],window.analytics.factory=function(t){return function(){var a=Array.prototype.slice.call(arguments);return a.unshift(t),window.analytics.push(a),window.analytics}};for(var i=0;i ' + data.value); //TODO - }) - .on('error', function () { - }) - .on('end', function () { - }); - - diff --git a/dev-util/read_block.js b/dev-util/read_block.js deleted file mode 100755 index 99fd0d8..0000000 --- a/dev-util/read_block.js +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env node -'use strict'; - -process.env.NODE_ENV = process.env.NODE_ENV || 'development'; - -var assert = require('assert'), - config = require('../config/config'), - BlockExtractor = require('../lib/BlockExtractor').class(), - networks = require('bitcore/networks'), - util = require('bitcore/util/util'); - - var be = new BlockExtractor(config.bitcoind.dataDir, config.network); - var network = config.network === 'testnet' ? networks.testnet: networks.livenet; -// console.log('[read_block.js.13]', be.nextFile() ); - - var c=0; - while (c++ < 100) { - be.getNextBlock(function(err, b) { - console.log('[read_block.js.14]',err, c, b?util.formatHashAlt(b.hash):''); //TODO - }); - } - - - - diff --git a/dev-util/stats b/dev-util/stats deleted file mode 100644 index f68bf9e..0000000 --- a/dev-util/stats +++ /dev/null @@ -1,56 +0,0 @@ - - -first 5% - - => with data + mongo + w/RPC for blocks: 48.8s - => with RPC + mongo: 2m26s - => with files + mongo + wo/RPC for blocks: 36.7s - => with files + mongo + wo/RPC for blocks + wo/mongoIndexes: - - -first 10% - - => sin RPC, sin Tx, sin store block => 0.7s - => sin RPC, sin grabar, procesando TX => 8.5s - => sin RPC, sin TX processing, sin grabar => 12s28 - => con RPC, TX processing, sin Grabar Tx, grabando bloques => 29s - => con RPC, sin TX processing, sin Grabar Tx, grabando bloques => 35s - => con RPC, TX processing, sin Grabar Tx, grabando bloques => 43s - - => TX processing, sin RPC, sin saves TX, y blocks => 11.6s - => TX processing, CON RPC, sin saves TX, y blocks => 35s - => con RPC, TX processing, sin saves TX => 45s - => con RPC, TX processing, Grabarndo todo => 78s - => con RPC, TX processing, Grabarndo todo => 78s - (18k blocks, 36k txouts) - -//LEVEL DB - => sin RPC, TX processing, todo en level => 14s - => con RPC, TX processing, todo en level => 39.7s - => con RPC, TX processing, tx mongo, blocks en level => 64s - - - => sin RPC, TX processing, todo en level, handling REORGs, more data => 28s - => sin RPC, TX processing, todo en level, handling REORGs, more data, tx ts => 34t s - - -//FROM blk00002.dat (more txs), 5% - - => now total : 1m13s - => removing block writes => 1m8s - => sacando los contenidos adentro de getblock from file de => 4.5s!! - - => con base58 cpp => 21s - => toda la testnet => 17m - -10% de blk2 - => 50s con base58cpp - => 41s commentando todo addr - => 5s commentando todo get HistoricSync.prototype.getBlockFromFile = function(cb) { - => 15s commentando todo get HistoricSync.prototype.getBlockFromFile = function(cb) { - -10% de blk 1 - => 59s - => 15s comentando desde b.getStandardizedObject() - => 39s comentando dps b.getStandardizedObject() - diff --git a/dev-util/status_info.js b/dev-util/status_info.js deleted file mode 100755 index 1b4deb8..0000000 --- a/dev-util/status_info.js +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env node -process.env.NODE_ENV = process.env.NODE_ENV || 'development'; - -var RpcClient = require('../node_modules/bitcore/RpcClient').class(); - -var config = require('../config/config'); - -var rpc = new RpcClient(config.bitcoind); - -var block = rpc.getInfo(function(err, block) { - if (err) { - console.log("Err:"); - console.log(err); - } - - console.log("Block info:"); - console.log(block); -}); - - diff --git a/dev-util/sync-level.js b/dev-util/sync-level.js deleted file mode 100644 index 2f2f95b..0000000 --- a/dev-util/sync-level.js +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env node -'use strict'; - -var Sync = require('../lib/Sync').class(); - - -var s = new Sync(); - - -s.setOrphan( - '0000000000c2b1e8dab92a72741289e5ef0d4f375fd1b26f729da2ba979c028a', - '000000000228f9d02654459e09998c7557afa9082784c11226853f5feb805df9', - function (err) { - console.log('[sync-level.js.15]',err); //TODO - }); - - diff --git a/etc/bitcoind/bitcoin-livenet.conf b/etc/bitcoind/bitcoin-livenet.conf deleted file mode 100644 index 52e6d08..0000000 --- a/etc/bitcoind/bitcoin-livenet.conf +++ /dev/null @@ -1,10 +0,0 @@ -rpcuser=user -rpcpassword=pass -server=1 -txindex=1 - -# Allow connections outsite localhost? -rpcallowip=192.168.1.* - -rpcport=8332 - diff --git a/etc/bitcoind/bitcoin-testnet.conf b/etc/bitcoind/bitcoin-testnet.conf deleted file mode 100644 index 99bc260..0000000 --- a/etc/bitcoind/bitcoin-testnet.conf +++ /dev/null @@ -1,10 +0,0 @@ -rpcuser=user -rpcpassword=pass -server=1 -txindex=1 - -# Allow connections outsite localhost? -rpcallowip=192.168.1.* - -rpcport=18332 -testnet=3 diff --git a/etc/minersPoolStrings.json b/etc/minersPoolStrings.json deleted file mode 100644 index 3729aac..0000000 --- a/etc/minersPoolStrings.json +++ /dev/null @@ -1,178 +0,0 @@ -[ - { - "poolName":"50BTC", - "url":"https://50btc.com/", - "searchStrings":[ - "50BTC.com", - "50btc.com" - ] - }, - { - "poolName":"175btc", - "url":"http://www.175btc.com/", - "searchStrings":[ - "Mined By 175btc.com" - ] - }, - { - "poolName":"ASICminer", - "url":"https://bitcointalk.org/index.php?topic=99497.0", - "searchStrings":[ - "Mined By ASICMiner" - ] - }, - { - "poolName":"BitMinter", - "url":"https://bitminter.com/", - "searchStrings":[ - "BitMinter" - ] - }, - { - "poolName":"Bitparking", - "url":"http://bitparking.com/", - "searchStrings":[ - "bitparking" - ] - }, - { - "poolName":"BTC Guild", - "url":"https://www.btcguild.com/", - "searchStrings":[ - "Mined by BTC Guild", - "BTC Guild" - ] - }, - { - "poolName":"Discus Fish", - "url":"http://f2pool.com/", - "searchStrings":[ - "七彩神仙鱼", - "Made in China", - "Mined by user" - ] - }, - { - "poolName":"Discus Fish Solo", - "url":"http://f2pool.com/", - "searchStrings":[ - "For Pierce and Paul" - ] - }, - { - "poolName":"Eligius", - "url":"http://eligius.st/", - "searchStrings":[ - "Eligius" - ] - }, - { - "poolName":"EclipseMC", - "url":"https://eclipsemc.com/", - "searchStrings":[ - "Josh Zerlan was here!", - "EclipseMC", - "Aluminum Falcon" - ] - }, - { - "poolName":"GIVE-ME-COINS", - "url":"https://give-me-coins.com/", - "searchStrings":[ - "Mined at GIVE-ME-COINS.com" - ] - }, - { - "poolName":"ghash.io", - "url":"https://ghash.io/", - "searchStrings":[ - "ghash.io", - "GHash.IO" - ] - }, - { - "poolName":"HHTT", - "url":"http://hhtt.1209k.com/", - "searchStrings":[ - "HHTT" - ] - }, - { - "poolName":"Megabigpower", - "url":"http://megabigpower.com/", - "searchStrings":[ - "megabigpower.com" - ] - }, - { - "poolName":"Mt Red", - "url":"https://mtred.com/‎", - "searchStrings":[ - "/mtred/" - ] - }, - { - "poolName":"MaxBTC", - "url":"https://www.maxbtc.com", - "searchStrings":[ - "MaxBTC" - ] - }, - { - "poolName":"NMCbit", - "url":"http://nmcbit.com/", - "searchStrings":[ - "nmcbit.com" - ] - }, - { - "poolName":"ozcoin", - "url":"https://ozco.in/", - "searchStrings":[ - "ozco.in", - "ozcoin" - ] - }, - { - "poolName":"Polmine.pl", - "url":"https://polmine.pl/‎", - "searchStrings":[ - "by polmine.pl" - ] - }, - { - "poolName":"simplecoin", - "url":"http://simplecoin.us/", - "searchStrings":[ - "simplecoin.us ftw" - ] - }, - { - "poolName":"Slush", - "url":"https://mining.bitcoin.cz/", - "searchStrings":[ - "slush" - ] - }, - { - "poolName":"TripleMining", - "url":"https://www.triplemining.com/", - "searchStrings":[ - "Triplemining.com" - ] - }, - { - "poolName":"wizkid057", - "url":"http://wizkid057.com/btc", - "searchStrings":[ - "wizkid057" - ] - }, - { - "poolName":"Yourbtc.net", - "url":"http://yourbtc.net/", - "searchStrings":[ - "yourbtc.net" - ] - } -] diff --git a/insight.js b/insight.js deleted file mode 100644 index d290dc0..0000000 --- a/insight.js +++ /dev/null @@ -1,92 +0,0 @@ -'use strict'; - - -//Set the node enviornment variable if not set before -process.env.NODE_ENV = process.env.NODE_ENV || 'development'; - -/** - * Module dependencies. - */ -var express = require('express'), - fs = require('fs'), - PeerSync = require('./lib/PeerSync').class(), - HistoricSync = require('./lib/HistoricSync').class(); - -//Initializing system variables -var config = require('./config/config'); - -/** - * express app - */ -var expressApp = express(); - -/** - * Bootstrap models - */ -var models_path = __dirname + '/app/models'; -var walk = function(path) { - fs.readdirSync(path).forEach(function(file) { - var newPath = path + '/' + file; - var stat = fs.statSync(newPath); - if (stat.isFile()) { - if (/(.*)\.(js$)/.test(file)) { - require(newPath); - } - } - else if (stat.isDirectory()) { - walk(newPath); - } - }); -}; - -walk(models_path); - -/** - * p2pSync process - */ - -var peerSync = new PeerSync({shouldBroadcast: true}); - -if (!config.disableP2pSync) { - peerSync.run(); -} - -/** - * historic_sync process - */ -var historicSync = new HistoricSync({ - shouldBroadcastSync: true -}); -peerSync.historicSync = historicSync; - -if (!config.disableHistoricSync) { - historicSync.start({}, function(err){ - if (err) { - var txt = 'ABORTED with error: ' + err.message; - console.log('[historic_sync] ' + txt); - } - if (peerSync) peerSync.allowReorgs = true; - }); -} -else - if (peerSync) peerSync.allowReorgs = true; - - -//express settings -require('./config/express')(expressApp, historicSync, peerSync); - -//Bootstrap routes -require('./config/routes')(expressApp); - -// socket.io -var server = require('http').createServer(expressApp); -var ios = require('socket.io').listen(server); -require('./app/controllers/socket.js').init(expressApp, ios); - -//Start the app by listening on -server.listen(config.port, function(){ - console.log('Express server listening on port %d in %s mode', server.address().port, process.env.NODE_ENV); -}); - -//expose app -exports = module.exports = expressApp; diff --git a/lib/BlockDb.js b/lib/BlockDb.js deleted file mode 100644 index f4608b8..0000000 --- a/lib/BlockDb.js +++ /dev/null @@ -1,235 +0,0 @@ -'use strict'; - -require('classtool'); - - -function spec(b) { - - var superclass = b.superclass || require('events').EventEmitter; - var TIMESTAMP_PREFIX = 'bts-'; // b-ts- => - var PREV_PREFIX = 'bpr-'; // b-prev- => - var NEXT_PREFIX = 'bne-'; // b-next- => - var MAIN_PREFIX = 'bma-'; // b-main- => 1/0 - var TIP = 'bti-'; // last block on the chain - var LAST_FILE_INDEX = 'file-'; // last processed file index - - var MAX_OPEN_FILES = 500; - - - /** - * Module dependencies. - */ - var levelup = require('levelup'), - config = require('../config/config'); - var db = b.db || levelup(config.leveldb + '/blocks',{maxOpenFiles: MAX_OPEN_FILES} ); - var Rpc = b.rpc || require('./Rpc').class(); - var PoolMatch = b.poolMatch || require('./PoolMatch').class(config); - - var buffertools = require('buffertools'); - var TransactionDb = require('./TransactionDb.js').class(); - - var BlockDb = function() { - BlockDb.super(this, arguments); - this.poolMatch = new PoolMatch(); - }; - - BlockDb.superclass = superclass; - - BlockDb.prototype.close = function(cb) { - db.close(cb); - }; - - BlockDb.prototype.drop = function(cb) { - var path = config.leveldb + '/blocks'; - db.close(function() { - require('leveldown').destroy(path, function () { - db = levelup(path,{maxOpenFiles: MAX_OPEN_FILES} ); - return cb(); - }); - }); - }; - - // adds a block. Does not update Next pointer in - // the block prev to the new block, nor TIP pointer - // - BlockDb.prototype.add = function(b, cb) { - var self = this; - var time_key = TIMESTAMP_PREFIX + - ( b.time || Math.round(new Date().getTime() / 1000) ); - - return db.batch() - .put(time_key, b.hash) - .put(MAIN_PREFIX + b.hash, 1) - .put(PREV_PREFIX + b.hash, b.previousblockhash) - .write(function(err){ - if (!err) { - self.emit('new_block', {blockid: b.hash}); - } - cb(err); - }); - }; - - BlockDb.prototype.getTip = function(cb) { - db.get(TIP, function(err, val) { - return cb(err,val); - }); - }; - - BlockDb.prototype.setTip = function(hash, cb) { - db.put(TIP, hash, function(err) { - return cb(err); - }); - }; - - //mainly for testing - BlockDb.prototype.setPrev = function(hash, prevHash, cb) { - db.put(PREV_PREFIX + hash, prevHash, function(err) { - return cb(err); - }); - }; - - BlockDb.prototype.getPrev = function(hash, cb) { - db.get(PREV_PREFIX + hash, function(err,val) { - if (err && err.notFound) { err = null; val = null;} - return cb(err,val); - }); - }; - - - BlockDb.prototype.setLastFileIndex = function(idx, cb) { - var self = this; - if (this.lastFileIndexSaved === idx) return cb(); - - db.put(LAST_FILE_INDEX, idx, function(err) { - self.lastFileIndexSaved = idx; - return cb(err); - }); - }; - - BlockDb.prototype.getLastFileIndex = function(cb) { - db.get(LAST_FILE_INDEX, function(err,val) { - if (err && err.notFound) { err = null; val = null;} - return cb(err,val); - }); - }; - - BlockDb.prototype.getNext = function(hash, cb) { - db.get(NEXT_PREFIX + hash, function(err,val) { - if (err && err.notFound) { err = null; val = null;} - return cb(err,val); - }); - }; - - BlockDb.prototype.isMain = function(hash, cb) { - db.get(MAIN_PREFIX + hash, function(err, val) { - if (err && err.notFound) { err = null; val = 0;} - return cb(err,parseInt(val)); - }); - }; - - BlockDb.prototype.setMain = function(hash, isMain, cb) { - if (!isMain) console.log('\tNew orphan: %s',hash); - db.put(MAIN_PREFIX + hash, isMain?1:0, function(err) { - return cb(err); - }); - }; - BlockDb.prototype.setNext = function(hash, nextHash, cb) { - db.put(NEXT_PREFIX + hash, nextHash, function(err) { - return cb(err); - }); - }; - - BlockDb.prototype.countConnected = function(cb) { - var c = 0; - console.log('Counting connected blocks. This could take some minutes'); - db.createReadStream({start: MAIN_PREFIX, end: MAIN_PREFIX + '~' }) - .on('data', function (data) { - if (data.value !== 0) c++; - }) - .on('error', function (err) { - return cb(err); - }) - .on('end', function () { - return cb(null, c); - }); - }; - - // .has() return true orphans also - BlockDb.prototype.has = function(hash, cb) { - var k = PREV_PREFIX + hash; - db.get(k, function (err) { - var ret = true; - if (err && err.notFound) { - err = null; - ret = false; - } - return cb(err, ret); - }); - }; - - BlockDb.prototype.getPoolInfo = function(tx, cb) { - var tr = new TransactionDb(); - var self = this; - - tr._getInfo(tx, function(e, a) { - if (e) return cb(false); - - if (a.isCoinBase) { - var coinbaseHexBuffer = new Buffer(a.vin[0].coinbase, 'hex'); - var a = self.poolMatch.match(coinbaseHexBuffer); - - return cb(a); - } - }); - }; - - BlockDb.prototype.fromHashWithInfo = function(hash, cb) { - var self = this; - - Rpc.getBlock(hash, function(err, info) { - if (err || !info) return cb(err); - - self.isMain(hash, function(err, val) { - if (err) return cb(err); - - info.isMainChain = val ? true : false; - - return cb(null, { - hash: hash, - info: info, - }); - }); - }); - }; - - BlockDb.prototype.getBlocksByDate = function(start_ts, end_ts, cb) { - var list = []; - db.createReadStream({ - start: TIMESTAMP_PREFIX + start_ts, - end: TIMESTAMP_PREFIX + end_ts, - fillCache: true - }) - .on('data', function (data) { - var k = data.key.split('-'); - list.push({ - ts: k[1], - hash: data.value, - }); - }) - .on('error', function (err) { - return cb(err); - }) - .on('end', function () { - return cb(null, list.reverse()); - }); - }; - - BlockDb.prototype.blockIndex = function(height, cb) { - return Rpc.blockIndex(height,cb); - }; - - return BlockDb; -} -module.defineClass(spec); - - diff --git a/lib/BlockExtractor.js b/lib/BlockExtractor.js deleted file mode 100644 index 92c6740..0000000 --- a/lib/BlockExtractor.js +++ /dev/null @@ -1,162 +0,0 @@ -'use strict'; - -require('classtool'); - -function spec() { - - var Block = require('bitcore/Block').class(), - networks = require('bitcore/networks'), - Parser = require('bitcore/util/BinaryParser').class(), - fs = require('fs'), - Buffer = require('buffer').Buffer, - glob = require('glob'), - async = require('async'); - - function BlockExtractor(dataDir, network) { - - var self = this; - var path = dataDir + '/blocks/blk*.dat'; - - self.dataDir = dataDir; - self.files = glob.sync(path); - self.nfiles = self.files.length; - - if (self.nfiles === 0) - throw new Error('Could not find block files at: ' + path); - - self.currentFileIndex = 0; - self.isCurrentRead = false; - self.currentBuffer = null; - self.currentParser = null; - self.network = network === 'testnet' ? networks.testnet: networks.livenet; - self.magic = self.network.magic.toString('hex'); - } - - BlockExtractor.prototype.currentFile = function() { - var self = this; - - return self.files[self.currentFileIndex]; - }; - - - BlockExtractor.prototype.nextFile = function() { - var self = this; - - if (self.currentFileIndex < 0) return false; - - var ret = true; - - self.isCurrentRead = false; - self.currentBuffer = null; - self.currentParser = null; - - if (self.currentFileIndex < self.nfiles - 1) { - self.currentFileIndex++; - } - else { - self.currentFileIndex=-1; - ret = false; - } - return ret; - }; - - BlockExtractor.prototype.readCurrentFileSync = function() { - var self = this; - - if (self.currentFileIndex < 0 || self.isCurrentRead) return; - - - self.isCurrentRead = true; - - var fname = self.currentFile(); - if (!fname) return; - - - var stats = fs.statSync(fname); - - var size = stats.size; - - console.log('Reading Blockfile %s [%d MB]', - fname, parseInt(size/1024/1024)); - - var fd = fs.openSync(fname, 'r'); - - var buffer = new Buffer(size); - - fs.readSync(fd, buffer, 0, size, 0); - - self.currentBuffer = buffer; - self.currentParser = new Parser(buffer); - }; - - - - BlockExtractor.prototype.getNextBlock = function(cb) { - var self = this; - - var b; - var magic; - async.series([ - function (a_cb) { - - async.whilst( - function() { - return (!magic); - }, - function(w_cb) { - - self.readCurrentFileSync(); - - if (self.currentFileIndex < 0) return cb(); - - - magic = self.currentParser ? self.currentParser.buffer(4).toString('hex') - : null ; - - if (!self.currentParser || self.currentParser.eof() || magic === '00000000') { - magic = null; - if (self.nextFile()) { - console.log('Moving forward to file:' + self.currentFile() ); - return w_cb(); - } - else { - console.log('Finished all files'); - magic = null; - return w_cb(); - } - } - else { - return w_cb(); - } - }, a_cb); - }, - function (a_cb) { - if (!magic) return a_cb(); - - if (magic !== self.magic) { - var e = new Error('CRITICAL ERROR: Magic number mismatch: ' + - magic + '!=' + self.magic); - return a_cb(e); - } - - // spacer? - self.currentParser.word32le(); - return a_cb(); - }, - function (a_cb) { - if (!magic) return a_cb(); - - b = new Block(); - b.parse(self.currentParser); - b.getHash(); - return a_cb(); - }, - ], function(err) { - return cb(err,b); - }); - }; - - return BlockExtractor; -} -module.defineClass(spec); - diff --git a/lib/HistoricSync.js b/lib/HistoricSync.js deleted file mode 100644 index b87f54a..0000000 --- a/lib/HistoricSync.js +++ /dev/null @@ -1,429 +0,0 @@ -'use strict'; - -require('classtool'); - - - -function spec() { - var util = require('util'); - var assert = require('assert'); - var RpcClient = require('bitcore/RpcClient').class(); - var Script = require('bitcore/Script').class(); - var networks = require('bitcore/networks'); - var async = require('async'); - var config = require('../config/config'); - var Sync = require('./Sync').class(); - var sockets = require('../app/controllers/socket.js'); - var BlockExtractor = require('./BlockExtractor.js').class(); - var buffertools = require('buffertools'); - - // var bitcoreUtil = require('bitcore/util/util'); - // var Deserialize = require('bitcore/Deserialize'); - - - var BAD_GEN_ERROR = 'Bad genesis block. Network mismatch between Insight and bitcoind? Insight is configured for:'; - - var BAD_GEN_ERROR_DB = 'Bad genesis block. Network mismatch between Insight and levelDB? Insight is configured for:'; - function HistoricSync(opts) { - opts = opts || {}; - - this.network = config.network === 'testnet' ? networks.testnet: networks.livenet; - - var genesisHashReversed = new Buffer(32); - this.network.genesisBlock.hash.copy(genesisHashReversed); - buffertools.reverse(genesisHashReversed); - this.genesis = genesisHashReversed.toString('hex'); - - this.rpc = new RpcClient(config.bitcoind); - this.shouldBroadcast = opts.shouldBroadcastSync; - this.sync = new Sync(opts); - } - - function p() { - var args = []; - Array.prototype.push.apply(args, arguments); - - args.unshift('[historic_sync]'); - /*jshint validthis:true */ - console.log.apply(this, args); - } - - HistoricSync.prototype.showProgress = function() { - var self = this; - - if ( self.status ==='syncing' && - ( self.syncedBlocks ) % self.step !== 1) return; - - if (self.error) { - p('ERROR: ' + self.error); - } - else { - self.updatePercentage(); - p(util.format('status: [%d%%]', self.syncPercentage)); - } - if (self.shouldBroadcast) { - sockets.broadcastSyncInfo(self.info()); - } - - // if (self.syncPercentage > 10) { - // process.exit(-1); - // } - }; - - - HistoricSync.prototype.setError = function(err) { - var self = this; - self.error = err.message?err.message:err.toString(); - self.status='error'; - self.showProgress(); - return err; - }; - - - - HistoricSync.prototype.close = function() { - this.sync.close(); - }; - - - HistoricSync.prototype.info = function() { - this.updatePercentage(); - return { - status: this.status, - blockChainHeight: this.blockChainHeight, - syncPercentage: this.syncPercentage, - syncedBlocks: this.syncedBlocks, - syncTipHash: this.sync.tip, - error: this.error, - type: this.type, - startTs: this.startTs, - endTs: this.endTs, - }; - }; - - HistoricSync.prototype.updatePercentage = function() { - var r = this.syncedBlocks / this.blockChainHeight; - this.syncPercentage = parseFloat(100 * r).toFixed(3); - if (this.syncPercentage > 100) this.syncPercentage = 100; - }; - - HistoricSync.prototype.getBlockFromRPC = function(cb) { - var self = this; - - if (!self.currentRpcHash) return cb(); - - var blockInfo; - self.rpc.getBlock(self.currentRpcHash, function(err, ret) { - if (err) return cb(err); - if (ret) { - blockInfo = ret.result; - // this is to match block retreived from file - if (blockInfo.hash === self.genesis) - blockInfo.previousblockhash = - self.network.genesisBlock.prev_hash.toString('hex'); - - self.currentRpcHash = blockInfo.nextblockhash; - } - else { - blockInfo = null; - } - return cb(null, blockInfo); - }); - }; - - HistoricSync.prototype.getBlockFromFile = function(cb) { - var self = this; - - var blockInfo; - - //get Info - self.blockExtractor.getNextBlock(function(err, b) { - if (err || ! b) return cb(err); - blockInfo = b.getStandardizedObject(b.txs, self.network); - blockInfo.previousblockhash = blockInfo.prev_block; - - var ti=0; - // Get TX Address - b.txs.forEach(function(t) { - - - var objTx = blockInfo.tx[ti++]; - - //add time from block - objTx.time = blockInfo.time; - - var to=0; - t.outs.forEach( function(o) { - - - var s = new Script(o.s); - var addrs = self.sync.txDb.getAddrStr(s); - - // support only for p2pubkey p2pubkeyhash and p2sh - if (addrs.length === 1) { - objTx.out[to].addrStr = addrs[0]; - } - to++; - }); - }); - self.sync.bDb.setLastFileIndex(self.blockExtractor.currentFileIndex, function(err) { - return cb(err,blockInfo); - }); - }); - }; - - HistoricSync.prototype.updateConnectedCountDB = function(cb) { - var self = this; - self.sync.bDb.countConnected(function(err, count) { - self.connectedCountDB = count || 0; - self.syncedBlocks = count || 0; - return cb(err); - }); - }; - - - HistoricSync.prototype.updateBlockChainHeight = function(cb) { - var self = this; - - self.rpc.getBlockCount(function(err, res) { - self.blockChainHeight = res.result; - return cb(err); - }); - }; - - - HistoricSync.prototype.checkNetworkSettings = function(next) { - var self = this; - - self.hasGenesis = false; - - // check network config - self.rpc.getBlockHash(0, function(err, res){ - if (!err && ( res && res.result !== self.genesis)) { - err = new Error(BAD_GEN_ERROR + config.network); - } - if (err) return next(err); - self.sync.bDb.has(self.genesis, function(err, b) { - if (!err && ( res && res.result !== self.genesis)) { - err = new Error(BAD_GEN_ERROR_DB + config.network); - } - self.hasGenesis = b?true:false; - return next(err); - }); - }); - }; - - HistoricSync.prototype.updateStartBlock = function(next) { - var self = this; - - self.startBlock = self.genesis; - - self.sync.bDb.getTip(function(err,tip) { - if (!tip) return next(); - - var blockInfo; - var oldtip; - - //check that the tip is still on the mainchain - async.doWhilst( - function(cb) { - self.sync.bDb.fromHashWithInfo(tip, function(err, bi) { - blockInfo = bi ? bi.info : {}; - if (oldtip) - self.sync.setBlockMain(oldtip, false, cb); - else - return cb(); - }); - }, - function(err) { - if (err) return next(err); - var ret = false; - if ( self.blockChainHeight === blockInfo.height || - blockInfo.confirmations > 0) { - ret = false; - } - else { - oldtip = tip; - tip = blockInfo.previousblockhash; - assert(tip); - p('Previous TIP is now orphan. Back to:' + tip); - ret = true; - } - return ret; - }, - function(err) { - self.startBlock = tip; - p('Resuming sync from block:'+tip); - return next(err); - } - ); - }); - }; - - HistoricSync.prototype.prepareFileSync = function(opts, next) { - var self = this; - - if ( opts.forceRPC || !config.bitcoind.dataDir || - self.connectedCountDB > self.blockChainHeight * 0.9) return next(); - - - try { - self.blockExtractor = new BlockExtractor(config.bitcoind.dataDir, config.network); - } catch (e) { - p(e.message + '. Disabling file sync.'); - return next(); - } - - self.getFn = self.getBlockFromFile; - self.allowReorgs = true; - self.sync.bDb.getLastFileIndex(function(err, idx) { - if (opts.forceStartFile) - self.blockExtractor.currentFileIndex = opts.forceStartFile; - else if (idx) self.blockExtractor.currentFileIndex = idx; - - var h = self.genesis; - - p('Seeking file to:' + self.startBlock); - //forward till startBlock - async.whilst( - function() { - return h !== self.startBlock; - }, - function (w_cb) { - self.getBlockFromFile(function(err,b) { - if (!b) return w_cb('Could not find block ' + self.startBlock); - h=b.hash; - setImmediate(function(){ - return w_cb(err); - }); - }); - }, next); - }); - }; - - //NOP - HistoricSync.prototype.prepareRpcSync = function(opts, next) { - var self = this; - - if (self.blockExtractor) return next(); - self.getFn = self.getBlockFromRPC; - self.currentRpcHash = self.startBlock; - self.allowReorgs = false; - return next(); - }; - - HistoricSync.prototype.showSyncStartMessage = function() { - var self = this; - - p('Got ' + self.connectedCountDB + - ' blocks in current DB, out of ' + self.blockChainHeight + ' block at bitcoind'); - - if (self.blockExtractor) { - p('bitcoind dataDir configured...importing blocks from .dat files'); - p('First file index: ' + self.blockExtractor.currentFileIndex); - } - else { - p('syncing from RPC (slow)'); - } - - p('Starting from: ', self.startBlock); - self.showProgress(); - }; - - - HistoricSync.prototype.setupSyncStatus = function() { - var self = this; - - var step = parseInt( (self.blockChainHeight - self.syncedBlocks) / 1000); - if (step < 10) step = 10; - - self.step = step; - self.type = self.blockExtractor?'from .dat Files':'from RPC calls'; - self.status = 'syncing'; - self.startTs = Date.now(); - self.endTs = null; - this.error = null; - this.syncPercentage = 0; - }; - - HistoricSync.prototype.prepareToSync = function(opts, next) { - var self = this; - - self.status = 'starting'; - async.series([ - function(s_c) { - self.checkNetworkSettings(s_c); - }, - function(s_c) { - self.updateConnectedCountDB(s_c); - }, - function(s_c) { - self.updateBlockChainHeight(s_c); - }, - function(s_c) { - self.updateStartBlock(s_c); - }, - function(s_c) { - self.prepareFileSync(opts, s_c); - }, - function(s_c) { - self.prepareRpcSync(opts, s_c); - }, - ], - function(err) { - if (err) return(self.setError(err)); - - self.showSyncStartMessage(); - self.setupSyncStatus(); - return next(); - }); - }; - - - HistoricSync.prototype.start = function(opts, next) { - var self = this; - - if (self.status==='starting' || self.status==='syncing') { - p('## Wont start to sync while status is %s', self.status); - return next(); - } - - self.prepareToSync(opts, function(err) { - if (err) return next(self.setError(err)); - - async.whilst( - function() { - self.showProgress(); - return self.status === 'syncing'; - }, - function (w_cb) { - self.getFn(function(err,blockInfo) { - if (err) return w_cb(self.setError(err)); - if (blockInfo && blockInfo.hash) { - self.syncedBlocks++; - self.sync.storeTipBlock(blockInfo, self.allowReorgs, function(err) { - if (err) return w_cb(self.setError(err)); - - self.sync.bDb.setTip(blockInfo.hash, function(err) { - if (err) return w_cb(self.setError(err)); - - setImmediate(function(){ - return w_cb(err); - }); - }); - }); - } - else { - self.endTs = Date.now(); - self.status = 'finished'; - console.log('Done Syncing', self.info()); - return w_cb(err); - } - }); - }, next); - }); - }; - return HistoricSync; -} -module.defineClass(spec); - diff --git a/lib/PeerSync.js b/lib/PeerSync.js deleted file mode 100644 index 7122fe4..0000000 --- a/lib/PeerSync.js +++ /dev/null @@ -1,127 +0,0 @@ -'use strict'; -require('classtool'); - -function spec() { - var fs = require('fs'); - var bitcoreUtil = require('bitcore/util/util'); - var Sync = require('./Sync').class(); - var Peer = require('bitcore/Peer').class(); - var config = require('../config/config'); - var networks = require('bitcore/networks'); - - var peerdb_fn = 'peerdb.json'; - - function PeerSync(opts) { - this.connected = false; - this.peerdb = undefined; - this.allowReorgs = false; - this.PeerManager = require('bitcore/PeerManager').createClass({ - network: (config.network === 'testnet' ? networks.testnet : networks.livenet) - }); - this.peerman = new this.PeerManager(); - this.load_peers(); - this.sync = new Sync(opts); - } - - PeerSync.prototype.load_peers = function() { - this.peerdb = [{ - ipv4: config.bitcoind.host, - port: config.bitcoind.p2pPort - }]; - - fs.writeFileSync(peerdb_fn, JSON.stringify(this.peerdb)); - }; - - PeerSync.prototype.info = function() { - return { - connected: this.connected, - host: this.peerdb[0].ipv4, - port: this.peerdb[0].port - }; - }; - - PeerSync.prototype.handleInv = function(info) { - var invs = info.message.invs; - info.conn.sendGetData(invs); - }; - - PeerSync.prototype.handleTx = function(info) { - var tx = info.message.tx.getStandardizedObject(); - tx.outs = info.message.tx.outs; - tx.ins = info.message.tx.ins; - console.log('[p2p_sync] Handle tx: ' + tx.hash); - tx.time = tx.time || Math.round(new Date().getTime() / 1000); - - this.sync.storeTxs([tx], function(err) { - if (err) { - console.log('[p2p_sync] Error in handle TX: ' + JSON.stringify(err)); - } - }); - }; - - PeerSync.prototype.handleBlock = function(info) { - var self = this; - var block = info.message.block; - var blockHash = bitcoreUtil.formatHashFull(block.calcHash()); - - console.log('[p2p_sync] Handle block: %s (allowReorgs: %s)', blockHash, self.allowReorgs); - - var tx_hashes = block.txs.map(function(tx) { - return bitcoreUtil.formatHashFull(tx.hash); - }); - - this.sync.storeTipBlock({ - 'hash': blockHash, - 'tx': tx_hashes, - 'previousblockhash': bitcoreUtil.formatHashFull(block.prev_hash), - }, self.allowReorgs, function(err) { - if (err && err.message.match(/NEED_SYNC/) && self.historicSync) { - console.log('[p2p_sync] Orphan block received. Triggering sync'); - self.historicSync.start({}, function(){ - console.log('[p2p_sync] Done resync.'); - }); - } - else if (err) { - console.log('[p2p_sync] Error in handle Block: ' + err); - } - }); - }; - - PeerSync.prototype.handle_connected = function(data) { - var peerman = data.pm; - var peers_n = peerman.peers.length; - console.log('[p2p_sync] Connected to ' + peers_n + ' peer' + (peers_n !== 1 ? 's' : '')); - }; - - PeerSync.prototype.run = function() { - var self = this; - - this.peerdb.forEach(function(datum) { - var peer = new Peer(datum.ipv4, datum.port); - self.peerman.addPeer(peer); - }); - - this.peerman.on('connection', function(conn) { - self.connected = true; - conn.on('inv', self.handleInv.bind(self)); - conn.on('block', self.handleBlock.bind(self)); - conn.on('tx', self.handleTx.bind(self)); - }); - this.peerman.on('connect', self.handle_connected.bind(self)); - - this.peerman.on('netDisconnected', function() { - self.connected = false; - }); - - this.peerman.start(); - }; - - PeerSync.prototype.close = function() { - this.sync.close(); - }; - - - return PeerSync; - -} -module.defineClass(spec); diff --git a/lib/PoolMatch.js b/lib/PoolMatch.js deleted file mode 100644 index ca793c0..0000000 --- a/lib/PoolMatch.js +++ /dev/null @@ -1,38 +0,0 @@ -'use strict'; - -require('classtool'); - -function spec(b) { - - var fs = require('fs'); - var buffertools = require('buffertools'); - var db = b.db || JSON.parse( fs.readFileSync(b.poolMatchFile || './poolMatchFile.json')); - - var PoolMatch = function() { - var self = this; - - self.strings = {}; - db.forEach(function(pool) { - pool.searchStrings.forEach(function(s) { - self.strings[s] = { - poolName: pool.poolName, - url: pool.url - }; - }); - }); - }; - - - PoolMatch.prototype.match = function(buffer) { - var self = this; - for(var k in self.strings) { - if (buffertools.indexOf(buffer, k) >= 0) { - return self.strings[k]; - } - }; - }; - - return PoolMatch; -} -module.defineClass(spec); - diff --git a/lib/Rpc.js b/lib/Rpc.js deleted file mode 100644 index 428f619..0000000 --- a/lib/Rpc.js +++ /dev/null @@ -1,103 +0,0 @@ -'use strict'; - -require('classtool'); - - -function spec(b) { - var RpcClient = require('bitcore/RpcClient').class(), - BitcoreBlock = require('bitcore/Block').class(), - bitcoreUtil = require('bitcore/util/util'), - util = require('util'), - config = require('../config/config'); - - var bitcoreRpc = b.bitcoreRpc || new RpcClient(config.bitcoind); - - function Rpc() { - } - - Rpc._parseTxResult = function(info) { - var b = new Buffer(info.hex,'hex'); - - // remove fields we dont need, to speed and adapt the information - delete info['hex']; - - // Inputs => add index + coinBase flag - var n =0; - info.vin.forEach(function(i) { - i.n = n++; - if (i.coinbase) info.isCoinBase = true; - if (i.scriptSig) delete i.scriptSig['hex']; - }); - - // Outputs => add total - var valueOutSat = 0; - info.vout.forEach( function(o) { - valueOutSat += o.value * bitcoreUtil.COIN; - delete o.scriptPubKey['hex']; - }); - info.valueOut = parseInt(valueOutSat) / bitcoreUtil.COIN; - info.size = b.length; - - return info; - }; - - - Rpc.errMsg = function(err) { - var e = err; - e.message += util.format(' [Host: %s:%d User:%s Using password:%s]', - bitcoreRpc.host, - bitcoreRpc.port, - bitcoreRpc.user, - bitcoreRpc.pass?'yes':'no' - ); - return e; - }; - - Rpc.getTxInfo = function(txid, doNotParse, cb) { - var self = this; - - if (typeof doNotParse === 'function') { - cb = doNotParse; - doNotParse = false; - } - - bitcoreRpc.getRawTransaction(txid, 1, function(err, txInfo) { - // Not found? - if (err && err.code === -5) return cb(); - if (err) return cb(self.errMsg(err)); - - var info = doNotParse ? txInfo.result : self._parseTxResult(txInfo.result); - return cb(null,info); - }); - }; - - - Rpc.blockIndex = function(height, cb) { - var self = this; - - bitcoreRpc.getBlockHash(height, function(err, bh){ - if (err) return cb(self.errMsg(err)); - cb(null, { blockHash: bh.result }); - }); - }; - - Rpc.getBlock = function(hash, cb) { - var self = this; - - bitcoreRpc.getBlock(hash, function(err,info) { - // Not found? - if (err && err.code === -5) return cb(); - if (err) return cb(self.errMsg(err)); - - - if (info.result.height) - info.result.reward = BitcoreBlock.getBlockValue(info.result.height) / bitcoreUtil.COIN ; - - return cb(err,info.result); - }); - }; - return Rpc; -} -module.defineClass(spec); - - diff --git a/lib/Sync.js b/lib/Sync.js deleted file mode 100644 index a712304..0000000 --- a/lib/Sync.js +++ /dev/null @@ -1,289 +0,0 @@ -'use strict'; - -require('classtool'); - - -function spec() { - var sockets = require('../app/controllers/socket.js'); - var BlockDb = require('./BlockDb').class(); - - var TransactionDb = require('./TransactionDb').class(); - var config = require('../config/config'); - var networks = require('bitcore/networks'); - var async = require('async'); - - - function Sync(opts) { - this.opts = opts || {}; - this.bDb = new BlockDb(opts); - this.txDb = new TransactionDb(opts); - this.txDb.on('tx_for_address', this.handleTxForAddress.bind(this)); - this.txDb.on('new_tx', this.handleNewTx.bind(this)); - this.bDb.on('new_block', this.handleNewBlock.bind(this)); - this.network = config.network === 'testnet' ? networks.testnet : networks.livenet; - } - - Sync.prototype.close = function(cb) { - var self = this; - self.txDb.close(function() { - self.bDb.close(cb); - }); - }; - - - Sync.prototype.destroy = function(next) { - var self = this; - async.series([ - - function(b) { - self.bDb.drop(b); - }, - function(b) { - self.txDb.drop(b); - }, - ], next); - }; - - /* - * Arrives a NEW block, which is the new TIP - * - * Case 0) Simple case - * A-B-C-D-E(TIP)-NEW - * - * Case 1) - * A-B-C-D-E(TIP) - * \ - * NEW - * - * 1) Declare D-E orphans (and possible invalidate TXs on them) - * - * Case 2) - * A-B-C-D-E(TIP) - * \ - * F-G-NEW - * 1) Set F-G as connected (mark TXs as valid) - * 2) Declare D-E orphans (and possible invalidate TXs on them) - * - * - * Case 3) - * - * A-B-C-D-E(TIP) ... NEW - * - * NEW is ignored (if allowReorgs is false) - * - * - */ - - Sync.prototype.storeTipBlock = function(b, allowReorgs, cb) { - - if (typeof allowReorgs === 'function') { - cb = allowReorgs; - allowReorgs = true; - } - if (!b) return cb(); - - var self = this; - var oldTip, oldNext, needReorg = false; - var newPrev = b.previousblockhash; - - async.series([ - - function(c) { - self.bDb.has(b.hash, function(err, val) { - return c(err || - (val ? new Error('WARN: Ignoring already existing block:' + b.hash) : null)); - }); - }, - function(c) { - if (!allowReorgs) return c(); - self.bDb.has(newPrev, function(err, val) { - if (!val && newPrev.match(/^0+$/)) return c(); - - return c(err || - (!val ? new Error('NEED_SYNC Ignoring block with non existing prev:' + b.hash) : null)); - }); - }, - function(c) { - self.txDb.createFromBlock(b, function(err) { - return c(err); - }); - }, - function(c) { - if (!allowReorgs) return c(); - self.bDb.getTip(function(err, val) { - oldTip = val; - if (oldTip && newPrev !== oldTip) needReorg = true; - return c(); - }); - }, - function(c) { - if (!needReorg) return c(); - self.bDb.getNext(newPrev, function(err, val) { - if (err) return c(err); - oldNext = val; - return c(); - }); - }, - function(c) { - self.bDb.add(b, c); - }, - function(c) { - if (!needReorg) return c(); - console.log('NEW TIP: %s NEED REORG (old tip: %s)', b.hash, oldTip); - self.processReorg(oldTip, oldNext, newPrev, c); - }, - function(c) { - if (!allowReorgs) return c(); - self.bDb.setTip(b.hash, function(err) { - return c(err); - }); - }, - function(c) { - self.bDb.setNext(newPrev, b.hash, function(err) { - return c(err); - }); - } - - ], - function(err) { - if (err && err.toString().match(/WARN/)) { - err = null; - } - return cb(err); - }); - }; - - - - Sync.prototype.processReorg = function(oldTip, oldNext, newPrev, cb) { - var self = this; - - var orphanizeFrom; - - async.series([ - - function(c) { - self.bDb.isMain(newPrev, function(err, val) { - if (!val) return c(); - - console.log('# Reorg Case 1)'); - // case 1 - orphanizeFrom = oldNext; - return c(err); - }); - }, - function(c) { - if (orphanizeFrom) return c(); - - console.log('# Reorg Case 2)'); - self.setBranchConnectedBackwards(newPrev, function(err, yHash, newYHashNext) { - if (err) return c(err); - self.bDb.getNext(yHash, function(err, yHashNext) { - orphanizeFrom = yHashNext; - self.bDb.setNext(yHash, newYHashNext, function(err) { - return c(err); - }); - }); - }); - }, - function(c) { - if (!orphanizeFrom) return c(); - self.setBranchOrphan(orphanizeFrom, function(err) { - return c(err); - }); - }, - ], - function(err) { - return cb(err); - }); - }; - - Sync.prototype.setBlockMain = function(hash, isMain, cb) { - var self = this; - self.bDb.setMain(hash, isMain, function(err) { - if (err) return cb(err); - return self.txDb.handleBlockChange(hash, isMain, cb); - }); - }; - - Sync.prototype.setBranchOrphan = function(fromHash, cb) { - var self = this, - hashInterator = fromHash; - - async.whilst( - function() { - return hashInterator; - }, - function(c) { - self.setBlockMain(hashInterator, false, function(err) { - if (err) return cb(err); - self.bDb.getNext(hashInterator, function(err, val) { - hashInterator = val; - return c(err); - }); - }); - }, cb); - }; - - Sync.prototype.setBranchConnectedBackwards = function(fromHash, cb) { - var self = this, - hashInterator = fromHash, - lastHash = fromHash, - isMain; - - async.doWhilst( - function(c) { - self.setBlockMain(hashInterator, true, function(err) { - if (err) return c(err); - self.bDb.getPrev(hashInterator, function(err, val) { - if (err) return c(err); - lastHash = hashInterator; - hashInterator = val; - self.bDb.isMain(hashInterator, function(err, val) { - isMain = val; - return c(); - }); - }); - }); - }, - function() { - return hashInterator && !isMain; - }, - function(err) { - console.log('\tFound yBlock:', hashInterator); - return cb(err, hashInterator, lastHash); - } - ); - }; - - - Sync.prototype.handleTxForAddress = function(data) { - if (this.opts.shouldBroadcast) { - sockets.broadcastAddressTx(data.address, data.txid); - } - }; - - Sync.prototype.handleNewTx = function(data) { - if (this.opts.shouldBroadcast) { - sockets.broadcastTx(data.tx); - } - }; - - Sync.prototype.handleNewBlock = function(data) { - if (this.opts.shouldBroadcast) { - sockets.broadcastBlock(data.blockid); - } - }; - - Sync.prototype.storeTxs = function(txs, cb) { - var self = this; - self.txDb.createFromArray(txs, null, function(err) { - if (err) return cb(err); - return cb(err); - }); - }; - - - return Sync; -} -module.defineClass(spec); diff --git a/lib/TransactionDb.js b/lib/TransactionDb.js deleted file mode 100644 index 0341540..0000000 --- a/lib/TransactionDb.js +++ /dev/null @@ -1,733 +0,0 @@ -'use strict'; - -require('classtool'); - - -function spec(b) { - - var superclass = b.superclass || require('events').EventEmitter; - // blockHash -> txid mapping - var IN_BLK_PREFIX = 'txb-'; //txb-- => 1/0 (connected or not) - - // Only for orphan blocks - var FROM_BLK_PREFIX = 'tx-'; //tx-- => 1 - - // to show tx outs - var OUTS_PREFIX = 'txo-'; //txo-- => [addr, btc_sat] - var SPENT_PREFIX = 'txs-'; //txs---- = ts - - // to sum up addr balance (only outs, spents are gotten later) - var ADDR_PREFIX = 'txa-'; //txa--- => + btc_sat:ts - - // TODO: use bitcore networks module - var genesisTXID = '4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b'; - var CONCURRENCY = 10; - - var MAX_OPEN_FILES = 500; -// var CONFIRMATION_NR_TO_NOT_CHECK = 10; //Spend - /** - * Module dependencies. - */ - var Rpc = b.rpc || require('./Rpc').class(), - util = require('bitcore/util/util'), - levelup = require('levelup'), - async = require('async'), - config = require('../config/config'), - assert = require('assert'); - var db = b.db || levelup(config.leveldb + '/txs',{maxOpenFiles: MAX_OPEN_FILES} ); - var Script = require('bitcore/Script').class(); - // This is 0.1.2 => c++ version of base57-native - var base58 = require('base58-native').base58Check; - var encodedData = require('bitcore/util/EncodedData').class({ - base58: base58 - }); - var versionedData = require('bitcore/util/VersionedData').class({ - superclass: encodedData - }); - var Address = require('bitcore/Address').class({ - superclass: versionedData - }); - var bitutil = require('bitcore/util/util'); - var networks = require('bitcore/networks'); - - var TransactionDb = function() { - TransactionDb.super(this, arguments); - this.network = config.network === 'testnet' ? networks.testnet : networks.livenet; - }; - TransactionDb.superclass = superclass; - - TransactionDb.prototype.close = function(cb) { - db.close(cb); - }; - - TransactionDb.prototype.drop = function(cb) { - var path = config.leveldb + '/txs'; - db.close(function() { - require('leveldown').destroy(path, function() { - db = levelup(path, {maxOpenFiles: 500}); - return cb(); - }); - }); - }; - - - TransactionDb.prototype.has = function(txid, cb) { - - var k = OUTS_PREFIX + txid; - db.get(k, function(err, val) { - - var ret; - - if (err && err.notFound) { - err = null; - ret = false; - } - if (typeof val !== undefined) { - ret = true; - } - return cb(err, ret); - }); - }; - - TransactionDb.prototype._addSpentInfo = function(r, txid, index, ts) { - if (r.spentTxId) { - if (!r.multipleSpentAttempts) { - r.multipleSpentAttempts = [{ - txid: r.spentTxId, - index: r.index, - }]; - } - r.multipleSpentAttempts.push({ - txid: txid, - index: parseInt(index), - }); - } else { - r.spentTxId = txid; - r.spentIndex = parseInt(index); - r.spentTs = parseInt(ts); - } - }; - - - // This is not used now - TransactionDb.prototype.fromTxId = function(txid, cb) { - var self = this; - var k = OUTS_PREFIX + txid; - var ret = []; - var idx = {}; - var i = 0; - - // outs. - db.createReadStream({ - start: k, - end: k + '~' - }) - .on('data', function(data) { - var k = data.key.split('-'); - var v = data.value.split(':'); - ret.push({ - addr: v[0], - value_sat: parseInt(v[1]), - index: parseInt(k[2]), - }); - idx[parseInt(k[2])] = i++; - }) - .on('error', function(err) { - return cb(err); - }) - .on('end', function() { - - var k = SPENT_PREFIX + txid + '-'; - db.createReadStream({ - start: k, - end: k + '~' - }) - .on('data', function(data) { - var k = data.key.split('-'); - var j = idx[parseInt(k[2])]; - - assert(typeof j !== 'undefined', 'Spent could not be stored: tx ' + txid + - 'spent in TX:' + k[1] + ',' + k[2] + ' j:' + j); - - self._addSpentInfo(ret[j], k[3], k[4], data.value); - }) - .on('error', function(err) { - return cb(err); - }) - .on('end', function(err) { - return cb(err, ret); - }); - }); - }; - - - TransactionDb.prototype._fillSpent = function(info, cb) { - var self = this; - - if (!info) return cb(); - - var k = SPENT_PREFIX + info.txid + '-'; - db.createReadStream({ - start: k, - end: k + '~' - }) - .on('data', function(data) { - var k = data.key.split('-'); - self._addSpentInfo(info.vout[k[2]], k[3], k[4], data.value); - }) - .on('error', function(err) { - return cb(err); - }) - .on('end', function(err) { - return cb(err); - }); - }; - - - TransactionDb.prototype._fillOutpoints = function(info, cb) { - var self = this; - - if (!info || info.isCoinBase) return cb(); - - var valueIn = 0; - var incompleteInputs = 0; - - async.eachLimit(info.vin, CONCURRENCY, function(i, c_in) { - self.fromTxIdN(i.txid, i.vout, info.confirmations, function(err, ret) { - //console.log('[TransactionDb.js.154:ret:]',ret); //TODO - if (!ret || !ret.addr || !ret.valueSat) { - console.log('Could not get TXouts in %s,%d from %s ', i.txid, i.vout, info.txid); - if (ret) i.unconfirmedInput = ret.unconfirmedInput; - incompleteInputs = 1; - return c_in(); // error not scalated - } - - info.firstSeenTs = ret.spentTs; - i.unconfirmedInput = i.unconfirmedInput; - i.addr = ret.addr; - i.valueSat = ret.valueSat; - i.value = ret.valueSat / util.COIN; - valueIn += i.valueSat; - -/* - * If confirmed by bitcoind, we could not check for double spents - * but we prefer to keep the flag of double spent attempt - * - if (info.confirmations - && info.confirmations >= CONFIRMATION_NR_TO_NOT_CHECK) - return c_in(); -isspent -*/ - // Double spent? - if (ret.multipleSpentAttempt || !ret.spentTxId || - (ret.spentTxId && ret.spentTxId !== info.txid) - ) { - if (ret.multipleSpentAttempts) { - ret.multipleSpentAttempts.each(function(mul) { - if (mul.spentTxId !== info.txid) { - i.doubleSpentTxID = ret.spentTxId; - i.doubleSpentIndex = ret.spentIndex; - } - }); - } else if (!ret.spentTxId) { - i.dbError = 'Input spent not registered'; - } else { - i.doubleSpentTxID = ret.spentTxId; - i.doubleSpentIndex = ret.spentIndex; - } - } else { - i.doubleSpentTxID = null; - } - return c_in(); - }); - }, - function() { - if (!incompleteInputs) { - info.valueIn = valueIn / util.COIN; - info.fees = (valueIn - parseInt(info.valueOut * util.COIN)) / util.COIN; - } else { - info.incompleteInputs = 1; - } - return cb(); - }); - }; - - TransactionDb.prototype._getInfo = function(txid, next) { - var self = this; - - Rpc.getTxInfo(txid, function(err, info) { - if (err) return next(err); - - self._fillOutpoints(info, function() { - self._fillSpent(info, function() { - return next(null, info); - }); - }); - }); - }; - - - // Simplified / faster Info version: No spent / outpoints info. - TransactionDb.prototype.fromIdInfoSimple = function(txid, cb) { - Rpc.getTxInfo(txid, true, function(err, info) { - if (err) return cb(err); - if (!info) return cb(); - return cb(err, info); - }); - }; - - TransactionDb.prototype.fromIdWithInfo = function(txid, cb) { - var self = this; - - self._getInfo(txid, function(err, info) { - if (err) return cb(err); - if (!info) return cb(); - return cb(err, { - txid: txid, - info: info - }); - }); - }; - - TransactionDb.prototype.fromTxIdN = function(txid, n, confirmations, cb) { - var self = this; - var k = OUTS_PREFIX + txid + '-' + n; - - db.get(k, function(err, val) { - if (!val || (err && err.notFound)) { - return cb(null, { - unconfirmedInput: 1 - }); - } - - var a = val.split(':'); - var ret = { - addr: a[0], - valueSat: parseInt(a[1]), - }; - - /* - * If this TxID comes from an RPC request - * the .confirmations value from bitcoind is available - * so we could avoid checking if the input were double spented - * - * This speed up address calculations by ~30% - * - if (confirmations >= CONFIRMATION_NR_TO_NOT_CHECK) { - return cb(null, ret); - } - */ - - // spent? - var k = SPENT_PREFIX + txid + '-' + n + '-'; - db.createReadStream({ - start: k, - end: k + '~' - }) - .on('data', function(data) { - var k = data.key.split('-'); - self._addSpentInfo(ret, k[3], k[4], data.value); - }) - .on('error', function(error) { - return cb(error); - }) - .on('end', function() { - return cb(null, ret); - }); - }); - }; - - TransactionDb.prototype.fillConfirmations = function(o, cb) { - var self = this; - - self.isConfirmed(o.txid, function(err, is) { - if (err) return cb(err); - - o.isConfirmed = is; - if (!o.spentTxId) return cb(); - - if (o.multipleSpentAttempts) { - - async.eachLimit(o.multipleSpentAttempts, CONCURRENCY, - function(oi, e_c) { - self.isConfirmed(oi.spentTxId, function(err, is) { - if (err) return; - if (is) { - o.spentTxId = oi.spentTxId; - o.index = oi.index; - o.spentIsConfirmed = 1; - } - return e_c(); - }); - }, cb); - } else { - self.isConfirmed(o.spentTxId, function(err, is) { - if (err) return cb(err); - o.spentIsConfirmed = is; - return cb(); - }); - } - }); - }; - - TransactionDb.prototype.fromAddr = function(addr, cb) { - var self = this; - - var k = ADDR_PREFIX + addr + '-'; - var ret = []; - - db.createReadStream({ - start: k, - end: k + '~' - }) - .on('data', function(data) { - var k = data.key.split('-'); - var v = data.value.split(':'); - ret.push({ - txid: k[2], - index: parseInt(k[3]), - value_sat: parseInt(v[0]), - ts: parseInt(v[1]), - }); - }) - .on('error', function(err) { - return cb(err); - }) - .on('end', function() { - - async.eachLimit(ret, CONCURRENCY, function(o, e_c) { - var k = SPENT_PREFIX + o.txid + '-' + o.index + '-'; - db.createReadStream({ - start: k, - end: k + '~' - }) - .on('data', function(data) { - var k = data.key.split('-'); - self._addSpentInfo(o, k[3], k[4], data.value); - }) - .on('error', function(err) { - return e_c(err); - }) - .on('end', function(err) { - return e_c(err); - }); - }, - function() { - async.eachLimit(ret, CONCURRENCY, function(o, e_c) { - self.fillConfirmations(o, e_c); - }, function(err) { - return cb(err, ret); - }); - }); - }); - }; - - - TransactionDb.prototype.removeFromTxId = function(txid, cb) { - - async.series([ - - function(c) { - db.createReadStream({ - start: OUTS_PREFIX + txid + '-', - end: OUTS_PREFIX + txid + '~', - }).pipe( - db.createWriteStream({ - type: 'del' - }) - ).on('close', c); - }, - function(c) { - db.createReadStream({ - start: SPENT_PREFIX + txid + '-', - end: SPENT_PREFIX + txid + '~' - }) - .pipe( - db.createWriteStream({ - type: 'del' - }) - ).on('close', c); - } - ], - function(err) { - cb(err); - }); - - }; - - - // TODO. replace with - // Script.prototype.getAddrStrs if that one get merged in bitcore - TransactionDb.prototype.getAddrStr = function(s) { - var self = this; - - var addrStrs = []; - var type = s.classify(); - var addr; - - switch (type) { - case Script.TX_PUBKEY: - var chunk = s.captureOne(); - addr = new Address(self.network.addressPubkey, bitutil.sha256ripe160(chunk)); - addrStrs.push(addr.toString()); - break; - case Script.TX_PUBKEYHASH: - addr = new Address(self.network.addressPubkey, s.captureOne()); - addrStrs.push(addr.toString()); - break; - case Script.TX_SCRIPTHASH: - addr = new Address(self.network.addressScript, s.captureOne()); - addrStrs.push(addr.toString()); - break; - case Script.TX_MULTISIG: - var chunks = s.capture(); - chunks.forEach(function(chunk) { - var a = new Address(self.network.addressPubkey, bitutil.sha256ripe160(chunk)); - addrStrs.push(a.toString()); - }); - break; - case Script.TX_UNKNOWN: - break; - } - - return addrStrs; - }; - - TransactionDb.prototype.adaptTxObject = function(txInfo) { - var self = this; - // adapt bitcore TX object to bitcoind JSON response - txInfo.txid = txInfo.hash; - - - var to = 0; - var tx = txInfo; - if (tx.outs) { - tx.outs.forEach(function(o) { - var s = new Script(o.s); - var addrs = self.getAddrStr(s); - - // support only for p2pubkey p2pubkeyhash and p2sh - if (addrs.length === 1) { - tx.out[to].addrStr = addrs[0]; - tx.out[to].n = to; - } - to++; - }); - } - - var count = 0; - txInfo.vin = txInfo. in .map(function(txin) { - var i = {}; - - if (txin.coinbase) { - txInfo.isCoinBase = true; - } else { - i.txid = txin.prev_out.hash; - i.vout = txin.prev_out.n; - } - i.n = count++; - return i; - }); - - - count = 0; - txInfo.vout = txInfo.out.map(function(txout) { - var o = {}; - - o.value = txout.value; - o.n = count++; - - if (txout.addrStr) { - o.scriptPubKey = {}; - o.scriptPubKey.addresses = [txout.addrStr]; - } - return o; - }); - }; - - - - TransactionDb.prototype.add = function(tx, blockhash, cb) { - var self = this; - var addrs = []; - - if (tx.hash) self.adaptTxObject(tx); - - var ts = tx.time; - - async.series([ - // Input Outpoints (mark them as spent) - function(p_c) { - if (tx.isCoinBase) return p_c(); - async.forEachLimit(tx.vin, CONCURRENCY, - function(i, next_out) { - db.batch() - .put(SPENT_PREFIX + i.txid + '-' + i.vout + '-' + tx.txid + '-' + i.n, - ts || 0) - .write(next_out); - }, - function(err) { - return p_c(err); - }); - }, - // Parse Outputs - function(p_c) { - async.forEachLimit(tx.vout, CONCURRENCY, - function(o, next_out) { - if (o.value && o.scriptPubKey && - o.scriptPubKey.addresses && - o.scriptPubKey.addresses[0] && !o.scriptPubKey.addresses[1] // TODO : not supported - ) { - var addr = o.scriptPubKey.addresses[0]; - var sat = Math.round(o.value * util.COIN); - - if (addrs.indexOf(addr) === -1) { - addrs.push(addr); - } - - // existed? - var k = OUTS_PREFIX + tx.txid + '-' + o.n; - db.get(k, function(err) { - if (err && err.notFound) { - db.batch() - .put(k, addr + ':' + sat) - .put(ADDR_PREFIX + addr + '-' + tx.txid + '-' + o.n, sat + ':' + ts) - .write(next_out); - } else { - return next_out(); - } - }); - } else { - return next_out(); - } - }, - function(err) { - if (err) { - console.log('ERR at TX %s: %s', tx.txid, err); - return cb(err); - } - return p_c(); - }); - }, - function(p_c) { - if (!blockhash) { - return p_c(); - } - return self.setConfirmation(tx.txid, blockhash, true, p_c); - }, - ], function(err) { - if (addrs.length > 0 && !blockhash) { - // only emit if we are processing a single tx (not from a block) - addrs.forEach(function(addr) { - self.emit('tx_for_address', { - address: addr, - txid: tx.txid - }); - }); - } - self.emit('new_tx', { - tx: tx - }); - - return cb(err); - }); - }; - - - - TransactionDb.prototype.setConfirmation = function(txId, blockHash, confirmed, c) { - if (!blockHash) return c(); - - confirmed = confirmed ? 1 : 0; - - db.batch() - .put(IN_BLK_PREFIX + txId + '-' + blockHash, confirmed) - .put(FROM_BLK_PREFIX + blockHash + '-' + txId, 1) - .write(c); - }; - - - // This slowdown addr balance calculation by 100% - TransactionDb.prototype.isConfirmed = function(txId, c) { - var k = IN_BLK_PREFIX + txId; - var ret = false; - - db.createReadStream({ - start: k, - end: k + '~' - }) - .on('data', function(data) { - if (data.value === '1') ret = true; - }) - .on('error', function(err) { - return c(err); - }) - .on('end', function(err) { - return c(err, ret); - }); - }; - - TransactionDb.prototype.handleBlockChange = function(hash, isMain, cb) { - var toChange = []; - console.log('\tSearching Txs from block:' + hash); - - var k = FROM_BLK_PREFIX + hash; - var k2 = IN_BLK_PREFIX; - // This is slow, but prevent us to create a new block->tx index. - db.createReadStream({ - start: k, - end: k + '~' - }) - .on('data', function(data) { - var ks = data.key.split('-'); - toChange.push({ - key: k2 + ks[2] + '-' + ks[1], - type: 'put', - value: isMain ? 1 : 0, - }); - }) - .on('error', function(err) { - return cb(err); - }) - .on('end', function(err) { - if (err) return cb(err); - console.log('\t%s %d Txs', isMain ? 'Confirming' : 'Invalidating', toChange.length); - db.batch(toChange, cb); - }); - }; - - // txs can be a [hashes] or [txObjects] - TransactionDb.prototype.createFromArray = function(txs, blockHash, next) { - var self = this; - if (!txs) return next(); - - async.forEachLimit(txs, CONCURRENCY, function(t, each_cb) { - if (typeof t === 'string') { - // TODO: parse it from networks.genesisTX? - if (t === genesisTXID) return each_cb(); - - Rpc.getTxInfo(t, function(err, inInfo) { - if (!inInfo) return each_cb(err); - - return self.add(inInfo, blockHash, each_cb); - }); - } else { - return self.add(t, blockHash, each_cb); - } - }, - function(err) { - return next(err); - }); - }; - - - TransactionDb.prototype.createFromBlock = function(b, next) { - var self = this; - if (!b || !b.tx) return next(); - - return self.createFromArray(b.tx, b.hash, next); - }; - - return TransactionDb; -} -module.defineClass(spec); diff --git a/package.json b/package.json index e3d8318..0ed7267 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "insight-bitcore", - "description": "An open-source bitcoin blockchain API. The Insight API provides you with a convenient, powerful and simple way to query and broadcast data on the bitcoin network and build your own services with it.", - "version": "0.1.2", + "description": "An open-source frontend for the Insight API. The Insight API provides you with a convenient, powerful and simple way to query and broadcast data on the bitcoin network and build your own services with it.", + "version": "0.1.3", "author": { "name": "Ryan X Charles", "email": "ryan@bitpay.com" @@ -41,50 +41,23 @@ "riddle", "mystification", "puzzle", - "conundrum" + "conundrum", + "client", + "front-end" ], - "engines": { - "node": "*" - }, "scripts": { - "start": "node node_modules/grunt-cli/bin/grunt" + "start": "INSIGHT_PUBLIC_PATH=public node node_modules/insight-bitcore-api/insight.js" }, "dependencies": { - "base58-native": "0.1.2", - "async": "*", - "leveldown": "*", - "levelup": "*", - "glob": "*", - "classtool": "*", - "commander": "*", - "bignum": "*", - "express": "~3.4.7", - "jade": "~1.0.2", - "lodash": "~2.4.1", - "buffertools": "*", - "should": "~2.1.1", - "view-helpers": "latest", - "socket.io": "~0.9.16", - "moment": "~2.5.0", - "sinon": "~1.7.3", - "chai": "~1.8.1", - "bitcore": "git://github.com/bitpay/bitcore.git", - "bufferput": "git://github.com/bitpay/node-bufferput.git", - "xmlhttprequest": "~1.6.0" + "insight-bitcore-api": "latest" }, "devDependencies": { "bower": "~1.2.8", "grunt": "~0.4.2", "grunt-cli": "~0.1.11", - "grunt-env": "~0.4.1", "grunt-contrib-jshint": "~0.8.0", - "grunt-contrib-watch": "~0.5.3", - "grunt-concurrent": "~0.4.2", - "grunt-nodemon": "~0.2.0", - "grunt-mocha-test": "~0.8.1", "grunt-contrib-concat": "~0.3.0", "grunt-contrib-uglify": "~0.3.2", - "should": "latest", "grunt-css": "~0.5.4", "grunt-markdown": "~0.5.0" } diff --git a/public/css/main.min.css b/public/css/main.min.css index 08f5383..e3835f3 100644 --- a/public/css/main.min.css +++ b/public/css/main.min.css @@ -1 +1,5 @@ -@charset "UTF-8";html,body{color:#373D42;font-family:Ubuntu,sans-serif;height:100%}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{color:#373D42;font-family:Ubuntu,sans-serif}[ng\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide{display:none!important}#ngProgress{background-color:#6C9032!important;box-shadow:none!important;color:#373D42!important;height:3px!important;margin:0;opacity:0;padding:0;z-index:99998;-webkit-transition:all .5s ease-in-out;-moz-transition:all .5s ease-in-out;-o-transition:all .5s ease-in-out;transition:all .5s ease-in-out}#ngProgress-container{position:fixed;margin:0;padding:0;top:63px;left:0;right:0;z-index:99999}#wrap{min-height:100%;height:auto;margin:0 auto -51px;padding:0 0 75px}.m10h{margin:0 10px}.m20h{margin:0 20px}.m5v{margin:5px 0}.m20v{margin:20px 0}.m10v{margin:10px 0}.m50v{margin:50px 0}.m10b{margin-bottom:10px}.m10l{margin-left:10px}.vm{vertical-align:middle}.bgwhite{background-color:#fff}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:0}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#F0F7E2}.navbar-default .navbar-toggle{border-color:#fff;margin-top:15px}.navbar-default .navbar-toggle .icon-bar{background-color:#fff}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#373D42}.navbar-default{background-color:#8DC429;margin:0;border:0}.navbar-default .navbar-nav>li>a{color:#F4FBE8;font-family:Ubuntu,sans-serif;padding-left:25px;padding-right:25px}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus{background-color:#6C9032;color:#fff}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>.active>a:hover{background-color:#fff}.navbar-form .form-group{display:block}.navbar-form{width:35%;margin-top:15px}@media (max-width:991px){.status{margin:0}.navbar-form{width:15%}}@media (max-width:767px){.navbar-form{width:auto}}.nav-tabs.nav-justified>li>a:hover{cursor:pointer}.insight{font-family:Ubuntu,sans-serif;font-size:34px;font-style:italic;font-weight:700;overflow:hidden}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#fffffe}.navbar-default .navbar-brand{color:#FFF;padding:22px 15px}.navbar-form .form-control{background-color:#7CAD23;border-radius:3px;-webkit-border-radius:3px;-moz-border-radius:3px;border:0;-webkit-box-shadow:1px 1px 0 0 rgba(255,255,255,.41),inset 1px 1px 3px 0 rgba(0,0,0,.10);-moz-box-shadow:1px 1px 0 0 rgba(255,255,255,.41),inset 1px 1px 3px 0 rgba(0,0,0,.10);box-shadow:1px 1px 0 0 rgba(255,255,255,.41),inset 1px 1px 3px 0 rgba(0,0,0,.10)}.navbar-nav>li>a{padding-top:22px;padding-bottom:22px}#search{color:#fff;font-family:Ubuntu,sans-serif}#search.loading{background-image:url(/img/loading.gif);background-position:5px center;background-repeat:no-repeat;padding-left:25px}#search::-webkit-input-placeholder{color:#BCDF7E;font-family:Ubuntu,sans-serif;font-size:14px;font-style:italic;font-weight:100}#search::-moz-placeholder{color:#BCDF7E;font-family:Ubuntu,sans-serif;font-size:14px;font-weight:100}.status{-moz-border-radius:3px;-webkit-border-radius:3px;background-color:#597338;border-radius:3px;margin:15px 0;padding:8px 10px;font-size:12px;color:#eee;text-align:center;margin-right:10px}.status .tooltip{margin:0}.col-gray{-moz-border-radius:5px;-webkit-border-radius:5px;background-color:#F4F4F4;border-radius:5px;padding:14px;border:1px solid #eee}.col-gray-responsive{width:auto}.col-gray-fixed{margin-top:15px;position:fixed;width:250px;border:1px solid #eee;z-index:1}@media (max-width:768px){.col-gray-fixed{width:100%}}@media (max-width:995px){.col-gray-fixed{position:static;width:100%}}@media (min-width:1200px){.col-gray-fixed{width:280px}}.ellipsis{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.line20{border:1px solid #D4D4D4;margin-bottom:15px}.line10{border:1px solid #EAEAEA;margin:10px 0}.block-id{background-color:#373D42;border:3px solid #FFF;margin:0 auto;width:165px;color:#fff;text-align:center}.block-id span{font-size:40px;margin:30px 0}.block-id h2{color:#FFF;font-weight:700;line-height:30px;font-size:24px;margin-top:0;margin-bottom:10px}.icon-block{color:#FFF;font-size:35px;margin-top:10px}.icon-block h3{color:#fff}.block-tx{-moz-border-radius:2px;-webkit-border-radius:2px;background-color:#F4F4F4;border-radius:2px;margin:20px 0 10px;overflow:hidden;padding:15px;border:1px solid #eee}.btn{border-radius:2px}.btn-primary{background-color:#8DC429;border:2px solid #76AF0F}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary,.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success,.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-color:#fff;border:2px solid #ccc;color:#373D42}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-color:#fff}.btn-default{background-color:#E7E7E7}.btn-success{background-color:#2FA4D7;border:2px solid #237FA7}.btn-danger{background-color:#AC0015;border:2px solid #6C0000}.txvalues{display:inline-block;padding:.7em 2em;font-size:13px;text-transform:uppercase;font-weight:100;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}@media (max-width:768px){.txvalues{display:block;margin:5px}}.txvalues-primary{background-color:#8DC429}.txvalues-default{background-color:#EBEBEB;color:#333}.txvalues-success{background-color:#2FA4D7}.txvalues-danger{background-color:#AC0015}.txvalues-normal{background-color:transparent;text-transform:none;color:#333;font-size:14px;font-weight:400}.progress-bar-info{background-color:#8DC429}#footer{background-color:#373D42;color:#fff;height:51px;overflow:hidden}#footer a.insight{font-size:20px;text-decoration:none;color:#fff}#footer a.insight:hover{color:#fffffe}#footer a.insight small{font-size:11px}.line-footer{border-top:2px dashed #ccc}.line-bot{border-bottom:2px solid #EAEAEA;padding:0 0 10px}.line-mid{padding:15px}.line-top{border-top:1px solid #EAEAEA;padding:15px 0 0}#wrap>.container{padding:70px 15px 0}#footer>.container{padding:auto 15px}.code{font-size:80%}.address{font-size:11px}.no_matching{-moz-border-radius-bottomleft:2px;-moz-border-radius-bottomright:2px;-webkit-border-bottom-left-radius:2px;-webkit-border-bottom-right-radius:2px;background-color:#FFF;border-bottom-left-radius:2px;border-bottom-right-radius:2px;border-top:0;border:1px solid #64920F;padding:10px 20px;position:absolute;text-align:center;top:45px;width:300px}.fader.ng-enter{opacity:0;-webkit-transition:opacity 1s;-moz-transition:opacity 1s;-o-transition:opacity 1s;transition:opacity 1s}.fader.ng-enter-active{opacity:1}.tx-bg{background-color:#F4F4F4;left:0;min-height:340px;position:absolute;top:0;width:100%;z-index:-9999}.badge{-moz-border-radius:9px;-webkit-border-radius:9px;background-color:#999;border-radius:9px;color:#fff;font-size:12.025px;font-weight:700;padding:1px 9px 2px;white-space:nowrap}.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.badge-error{background-color:#b94a48}.badge-error:hover{background-color:#953b39}.badge-warning{background-color:#f89406}.badge-warning:hover{background-color:#c67605}.badge-success{background-color:#468847}.badge-success:hover{background-color:#356635}.badge-info{background-color:#3a87ad}.badge-info:hover{background-color:#2d6987}.badge-inverse{background-color:#333}.badge-inverse:hover{background-color:#1a1a1a}.status .t{color:#fff}.status .text-danger{background:red}.status .text-warning{background:#ff0;color:#000}.btn-copy{color:#9b9b9b;display:inline-block;height:16px;width:16px;outline:0;vertical-align:sub}.btn-expand{color:#9b9b9b;vertical-align:middle}.btn-copy:hover,.btn-expand:hover{color:#000;text-decoration:none}.btn-copy{background:transparent url(/img/icons/copy.png) center center no-repeat}.btn-copy .tooltip{display:block;margin-left:20px;margin-top:-2px;opacity:0}.btn-copy.zeroclipboard-is-hover{color:#2a6496}.btn-copy.zeroclipboard-is-active .tooltip{opacity:1}@media (max-width:991px){.btn-copy{display:none}}.txid{line-height:26px}.tx-id{background-color:#373D42;border:3px solid #FFF;margin:0 auto;width:165px;color:#FFF;text-align:center}.tx-id span{font-size:40px;margin:30px 0}.page-header{margin-top:0}.panel{margin-bottom:1em}.panel-body{padding:.7em}#home .btn-more{border-top:1px solid #ddd;margin:30px auto 0;text-align:center;width:90%}#home .btn-more .btn-default{margin-top:-23px}#powered .powered-text{border-top:1px solid #ddd;margin:30px auto 0;text-align:center;width:90%}#powered .powered-text small{background-color:#f4f4f4;padding:4px;position:relative;top:-12px}#powered a{background-repeat:no-repeat;background-position:center center;display:inline-block;float:left;height:45px}#powered a.bitcore{background-image:url(http://bitcore.io/images/logo.svg);background-size:80px;width:30%}#powered a.nodejs{background-image:url(/img/nodejs.png);background-size:80px;width:30%}#powered a.angularjs{background-image:url(/img/angularjs.png);background-size:50px;width:20%}#powered a.leveldb{background-image:url(/img/leveldb.png);background-size:50px;width:20%}@keyframes rotateThis{from{transform:scale(1) rotate(0deg)}to{transform:scale(1) rotate(360deg)}}@-webkit-keyframes rotateThis{from{-webkit-transform:scale(1) rotate(0deg)}to{-webkit-transform:scale(1) rotate(360deg)}}.icon-rotate{animation-name:rotateThis;animation-duration:2s;animation-iteration-count:infinite;animation-timing-function:linear;-webkit-animation-name:rotateThis;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-timing-function:linear}.transaction-vin-vout{}.v_highlight{background-color:#8DC429;overflow:hidden;color:#fff}a.v_highlight_more{background-color:#8DC429;color:#fff}.secondary_navbar{width:100%;background:#fff;position:fixed;top:64px;left:0;text-align:center;z-index:1000;margin:0 auto;-moz-box-shadow:0 1px 4px 0 rgba(0,0,0,.20);-webkit-box-shadow:0 1px 4px 0 rgba(0,0,0,.20);box-shadow:0 1px 4px 0 rgba(0,0,0,.20)}.secondary_navbar .container{margin:0 auto;padding:1.8em 0}.secondary_navbar h3,.secondary_navbar p,.secondary_navbar .lead{margin:0}.secondary_navbar p{line-height:1.9em}.hide_snavbar{border-bottom-right-radius:.3em;border-bottom-left-radius:.3em;position:absolute;right:25px;padding:5px 10px;background:#fff;-moz-box-shadow:0 2px 3px 0 rgba(0,0,0,.20);-webkit-box-shadow:0 2px 3px 0 rgba(0,0,0,.20);box-shadow:0 2px 3px 0 rgba(0,0,0,.20)} \ No newline at end of file +@charset "UTF-8";/*! + * Bootstrap v3.0.3 (http://getbootstrap.com) + * Copyright 2013 Twitter, Inc. + * Licensed under http://www.apache.org/licenses/LICENSE-2.0 + *//*! normalize.css v2.1.3 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden],template{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a{background:transparent}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{margin:.67em 0;font-size:2em}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}mark{color:#000;background:#ff0}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}button,input,select,textarea{margin:0;font-family:inherit;font-size:100%}button,input{line-height:normal}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;box-sizing:border-box}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:2cm .5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*,:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}img{vertical-align:middle}.img-responsive{display:block;height:auto;max-width:100%}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#999}h1,h2,h3{margin-top:20px;margin-bottom:10px}h1 small,h2 small,h3 small,h1 .small,h2 .small,h3 .small{font-size:65%}h4,h5,h6{margin-top:10px;margin-bottom:10px}h4 small,h5 small,h6 small,h4 .small,h5 .small,h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media(min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-muted{color:#999}.text-primary{color:#428bca}.text-primary:hover{color:#3071a9}.text-warning{color:#8a6d3b}.text-warning:hover{color:#66512c}.text-danger{color:#a94442}.text-danger:hover{color:#843534}.text-success{color:#3c763d}.text-success:hover{color:#2b542c}.text-info{color:#31708f}.text-info:hover{color:#245269}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}.list-inline>li:first-child{padding-left:0}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.428571429}dt{font-weight:700}dd{margin-left:0}@media(min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small,blockquote .small{display:block;line-height:1.428571429;color:#999}blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small,blockquote.pull-right .small{text-align:right}blockquote.pull-right small:before,blockquote.pull-right .small:before{content:''}blockquote.pull-right small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.428571429}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}@media(min-width:768px){.container{width:750px}}@media(min-width:992px){.container{width:970px}}@media(min-width:1200px){.container{width:1170px}}.row{margin-right:-15px;margin-left:-15px}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666666666666%}.col-xs-10{width:83.33333333333334%}.col-xs-9{width:75%}.col-xs-8{width:66.66666666666666%}.col-xs-7{width:58.333333333333336%}.col-xs-6{width:50%}.col-xs-5{width:41.66666666666667%}.col-xs-4{width:33.33333333333333%}.col-xs-3{width:25%}.col-xs-2{width:16.666666666666664%}.col-xs-1{width:8.333333333333332%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666666666666%}.col-xs-pull-10{right:83.33333333333334%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666666666666%}.col-xs-pull-7{right:58.333333333333336%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666666666667%}.col-xs-pull-4{right:33.33333333333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.666666666666664%}.col-xs-pull-1{right:8.333333333333332%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666666666666%}.col-xs-push-10{left:83.33333333333334%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666666666666%}.col-xs-push-7{left:58.333333333333336%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666666666667%}.col-xs-push-4{left:33.33333333333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.666666666666664%}.col-xs-push-1{left:8.333333333333332%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666666666666%}.col-xs-offset-10{margin-left:83.33333333333334%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666666666666%}.col-xs-offset-7{margin-left:58.333333333333336%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666666666667%}.col-xs-offset-4{margin-left:33.33333333333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.666666666666664%}.col-xs-offset-1{margin-left:8.333333333333332%}.col-xs-offset-0{margin-left:0}@media(min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666666666666%}.col-sm-10{width:83.33333333333334%}.col-sm-9{width:75%}.col-sm-8{width:66.66666666666666%}.col-sm-7{width:58.333333333333336%}.col-sm-6{width:50%}.col-sm-5{width:41.66666666666667%}.col-sm-4{width:33.33333333333333%}.col-sm-3{width:25%}.col-sm-2{width:16.666666666666664%}.col-sm-1{width:8.333333333333332%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666666666666%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666666666666%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-0{margin-left:0}}@media(min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666666666666%}.col-md-10{width:83.33333333333334%}.col-md-9{width:75%}.col-md-8{width:66.66666666666666%}.col-md-7{width:58.333333333333336%}.col-md-6{width:50%}.col-md-5{width:41.66666666666667%}.col-md-4{width:33.33333333333333%}.col-md-3{width:25%}.col-md-2{width:16.666666666666664%}.col-md-1{width:8.333333333333332%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666666666666%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666666666666%}.col-md-push-10{left:83.33333333333334%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666666666666%}.col-md-push-7{left:58.333333333333336%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666666666667%}.col-md-push-4{left:33.33333333333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.666666666666664%}.col-md-push-1{left:8.333333333333332%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666666666666%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-0{margin-left:0}}@media(min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666666666666%}.col-lg-10{width:83.33333333333334%}.col-lg-9{width:75%}.col-lg-8{width:66.66666666666666%}.col-lg-7{width:58.333333333333336%}.col-lg-6{width:50%}.col-lg-5{width:41.66666666666667%}.col-lg-4{width:33.33333333333333%}.col-lg-3{width:25%}.col-lg-2{width:16.666666666666664%}.col-lg-1{width:8.333333333333332%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666666666666%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666666666666%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{display:table-cell;float:none}.table>thead>tr>.active,.table>tbody>tr>.active,.table>tfoot>tr>.active,.table>thead>.active>td,.table>tbody>.active>td,.table>tfoot>.active>td,.table>thead>.active>th,.table>tbody>.active>th,.table>tfoot>.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>.active:hover,.table-hover>tbody>.active:hover>td,.table-hover>tbody>.active:hover>th{background-color:#e8e8e8}.table>thead>tr>.success,.table>tbody>tr>.success,.table>tfoot>tr>.success,.table>thead>.success>td,.table>tbody>.success>td,.table>tfoot>.success>td,.table>thead>.success>th,.table>tbody>.success>th,.table>tfoot>.success>th{background-color:#dff0d8}.table-hover>tbody>tr>.success:hover,.table-hover>tbody>.success:hover>td,.table-hover>tbody>.success:hover>th{background-color:#d0e9c6}.table>thead>tr>.danger,.table>tbody>tr>.danger,.table>tfoot>tr>.danger,.table>thead>.danger>td,.table>tbody>.danger>td,.table>tfoot>.danger>td,.table>thead>.danger>th,.table>tbody>.danger>th,.table>tfoot>.danger>th{background-color:#f2dede}.table-hover>tbody>tr>.danger:hover,.table-hover>tbody>.danger:hover>td,.table-hover>tbody>.danger:hover>th{background-color:#ebcccc}.table>thead>tr>.warning,.table>tbody>tr>.warning,.table>tfoot>tr>.warning,.table>thead>.warning>td,.table>tbody>.warning>td,.table>tfoot>.warning>td,.table>thead>.warning>th,.table>tbody>.warning>th,.table>tfoot>.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>.warning:hover,.table-hover>tbody>.warning:hover>td,.table-hover>tbody>.warning:hover>th{background-color:#faf2cc}@media(max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:scroll;overflow-y:hidden;border:1px solid #ddd;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}select[multiple],select[size]{height:auto}select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}input[type=number]::-webkit-outer-spin-button,input[type=number]::-webkit-inner-spin-button{height:auto}output{display:block;padding-top:7px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee}textarea.form-control{height:auto}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.radio label,.checkbox label{display:inline;margin-bottom:0;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm{height:auto}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg{height:auto}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media(min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block}.form-inline select.form-control{width:auto}.form-inline .radio,.form-inline .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:none;margin-left:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-control-static{padding-top:7px}@media(min-width:768px){.form-horizontal .control-label{text-align:right}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.428571429;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#fff}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-link{font-weight:400;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:400;line-height:1;-moz-osx-font-smoothing:grayscale}.glyphicon:empty{width:1em}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.428571429;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media(min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar .btn-group{float:left}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group,.btn-toolbar>.btn-group+.btn-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-bottom-left-radius:4px;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child>.btn:last-child,.btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle=buttons]>.btn>input[type=radio],[data-toggle=buttons]>.btn>input[type=checkbox]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=radio],.input-group-addon input[type=checkbox]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;white-space:nowrap}.input-group-btn:first-child>.btn{margin-right:-1px}.input-group-btn:last-child>.btn{margin-left:-1px}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-4px}.input-group-btn>.btn:hover,.input-group-btn>.btn:active{z-index:2}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}@media(min-width:768px){.navbar{border-radius:4px}}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}@media(min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse.in{overflow-y:auto}@media(min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.container>.navbar-header,.container>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media(min-width:768px){.container>.navbar-header,.container>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media(min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media(min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media(min-width:768px){.navbar>.container .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media(min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media(max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media(min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media(min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media(min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block}.navbar-form select.form-control{width:auto}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{float:none;margin-left:0}}@media(max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media(min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-nav.pull-right>li>.dropdown-menu,.navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media(min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#ccc}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7}@media(max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808}@media(max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.428571429;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{background-color:#eee}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:gray}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;font-size:21px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{line-height:1;color:inherit}.jumbotron p{line-height:1.4}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{display:block;height:auto;max-width:100%;margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0}.panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel>.list-group .list-group-item:last-child{border-bottom:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child th,.panel>.table>tbody:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:last-child>th,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:last-child>td,.panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-group .panel{margin-bottom:0;overflow:hidden;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:auto;overflow-y:scroll}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;z-index:1050;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1030;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.428571429}.modal-body{position:relative;padding:20px}.modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}}.tooltip{position:absolute;z-index:1030;display:block;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0;content:" "}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0;content:" "}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0;content:" "}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0;content:" "}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;height:auto;max-width:100%;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);opacity:.5;filter:alpha(opacity=50)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5) 0),color-stop(rgba(0,0,0,.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.0001) 0),color-stop(rgba(0,0,0,.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;outline:0;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicons-chevron-left,.carousel-control .glyphicons-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after{display:table;content:" "}.clearfix:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,tr.visible-xs,th.visible-xs,td.visible-xs{display:none!important}@media(max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-xs.visible-sm{display:block!important}table.visible-xs.visible-sm{display:table}tr.visible-xs.visible-sm{display:table-row!important}th.visible-xs.visible-sm,td.visible-xs.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-xs.visible-md{display:block!important}table.visible-xs.visible-md{display:table}tr.visible-xs.visible-md{display:table-row!important}th.visible-xs.visible-md,td.visible-xs.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-xs.visible-lg{display:block!important}table.visible-xs.visible-lg{display:table}tr.visible-xs.visible-lg{display:table-row!important}th.visible-xs.visible-lg,td.visible-xs.visible-lg{display:table-cell!important}}.visible-sm,tr.visible-sm,th.visible-sm,td.visible-sm{display:none!important}@media(max-width:767px){.visible-sm.visible-xs{display:block!important}table.visible-sm.visible-xs{display:table}tr.visible-sm.visible-xs{display:table-row!important}th.visible-sm.visible-xs,td.visible-sm.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-sm.visible-md{display:block!important}table.visible-sm.visible-md{display:table}tr.visible-sm.visible-md{display:table-row!important}th.visible-sm.visible-md,td.visible-sm.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-sm.visible-lg{display:block!important}table.visible-sm.visible-lg{display:table}tr.visible-sm.visible-lg{display:table-row!important}th.visible-sm.visible-lg,td.visible-sm.visible-lg{display:table-cell!important}}.visible-md,tr.visible-md,th.visible-md,td.visible-md{display:none!important}@media(max-width:767px){.visible-md.visible-xs{display:block!important}table.visible-md.visible-xs{display:table}tr.visible-md.visible-xs{display:table-row!important}th.visible-md.visible-xs,td.visible-md.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-md.visible-sm{display:block!important}table.visible-md.visible-sm{display:table}tr.visible-md.visible-sm{display:table-row!important}th.visible-md.visible-sm,td.visible-md.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-md.visible-lg{display:block!important}table.visible-md.visible-lg{display:table}tr.visible-md.visible-lg{display:table-row!important}th.visible-md.visible-lg,td.visible-md.visible-lg{display:table-cell!important}}.visible-lg,tr.visible-lg,th.visible-lg,td.visible-lg{display:none!important}@media(max-width:767px){.visible-lg.visible-xs{display:block!important}table.visible-lg.visible-xs{display:table}tr.visible-lg.visible-xs{display:table-row!important}th.visible-lg.visible-xs,td.visible-lg.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-lg.visible-sm{display:block!important}table.visible-lg.visible-sm{display:table}tr.visible-lg.visible-sm{display:table-row!important}th.visible-lg.visible-sm,td.visible-lg.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-lg.visible-md{display:block!important}table.visible-lg.visible-md{display:table}tr.visible-lg.visible-md{display:table-row!important}th.visible-lg.visible-md,td.visible-lg.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}.hidden-xs{display:block!important}table.hidden-xs{display:table}tr.hidden-xs{display:table-row!important}th.hidden-xs,td.hidden-xs{display:table-cell!important}@media(max-width:767px){.hidden-xs,tr.hidden-xs,th.hidden-xs,td.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-xs.hidden-sm,tr.hidden-xs.hidden-sm,th.hidden-xs.hidden-sm,td.hidden-xs.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-xs.hidden-md,tr.hidden-xs.hidden-md,th.hidden-xs.hidden-md,td.hidden-xs.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-xs.hidden-lg,tr.hidden-xs.hidden-lg,th.hidden-xs.hidden-lg,td.hidden-xs.hidden-lg{display:none!important}}.hidden-sm{display:block!important}table.hidden-sm{display:table}tr.hidden-sm{display:table-row!important}th.hidden-sm,td.hidden-sm{display:table-cell!important}@media(max-width:767px){.hidden-sm.hidden-xs,tr.hidden-sm.hidden-xs,th.hidden-sm.hidden-xs,td.hidden-sm.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-sm,tr.hidden-sm,th.hidden-sm,td.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-sm.hidden-md,tr.hidden-sm.hidden-md,th.hidden-sm.hidden-md,td.hidden-sm.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-sm.hidden-lg,tr.hidden-sm.hidden-lg,th.hidden-sm.hidden-lg,td.hidden-sm.hidden-lg{display:none!important}}.hidden-md{display:block!important}table.hidden-md{display:table}tr.hidden-md{display:table-row!important}th.hidden-md,td.hidden-md{display:table-cell!important}@media(max-width:767px){.hidden-md.hidden-xs,tr.hidden-md.hidden-xs,th.hidden-md.hidden-xs,td.hidden-md.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-md.hidden-sm,tr.hidden-md.hidden-sm,th.hidden-md.hidden-sm,td.hidden-md.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-md,tr.hidden-md,th.hidden-md,td.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-md.hidden-lg,tr.hidden-md.hidden-lg,th.hidden-md.hidden-lg,td.hidden-md.hidden-lg{display:none!important}}.hidden-lg{display:block!important}table.hidden-lg{display:table}tr.hidden-lg{display:table-row!important}th.hidden-lg,td.hidden-lg{display:table-cell!important}@media(max-width:767px){.hidden-lg.hidden-xs,tr.hidden-lg.hidden-xs,th.hidden-lg.hidden-xs,td.hidden-lg.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-lg.hidden-sm,tr.hidden-lg.hidden-sm,th.hidden-lg.hidden-sm,td.hidden-lg.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-lg.hidden-md,tr.hidden-lg.hidden-md,th.hidden-lg.hidden-md,td.hidden-lg.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-lg,tr.hidden-lg,th.hidden-lg,td.hidden-lg{display:none!important}}.visible-print,tr.visible-print,th.visible-print,td.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}.hidden-print,tr.hidden-print,th.hidden-print,td.hidden-print{display:none!important}}html,body{color:#373D42;font-family:Ubuntu,sans-serif;height:100%}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{color:#373D42;font-family:Ubuntu,sans-serif}[ng\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide{display:none!important}#ngProgress{background-color:#6C9032!important;box-shadow:none!important;color:#373D42!important;height:3px!important;margin:0;opacity:0;padding:0;z-index:99998;-webkit-transition:all .5s ease-in-out;-moz-transition:all .5s ease-in-out;-o-transition:all .5s ease-in-out;transition:all .5s ease-in-out}#ngProgress-container{position:fixed;margin:0;padding:0;top:63px;left:0;right:0;z-index:99999}#wrap{min-height:100%;height:auto;margin:0 auto -51px;padding:0 0 75px}.m10h{margin:0 10px}.m20h{margin:0 20px}.m5v{margin:5px 0}.m20v{margin:20px 0}.m10v{margin:10px 0}.m50v{margin:50px 0}.m10b{margin-bottom:10px}.m10l{margin-left:10px}.vm{vertical-align:middle}.bgwhite{background-color:#fff}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:0}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#F0F7E2}.navbar-default .navbar-toggle{border-color:#fff;margin-top:15px}.navbar-default .navbar-toggle .icon-bar{background-color:#fff}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#373D42}.navbar-default{background-color:#8DC429;margin:0;border:0}.navbar-default .navbar-nav>li>a{color:#F4FBE8;font-family:Ubuntu,sans-serif;padding-left:25px;padding-right:25px}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus{background-color:#6C9032;color:#fff}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>.active>a:hover{background-color:#fff}.navbar-form .form-group{display:block}.navbar-form{width:35%;margin-top:15px}@media (max-width:991px){.status{margin:0}.navbar-form{width:15%}}@media (max-width:767px){.navbar-form{width:auto}}.nav-tabs.nav-justified>li>a:hover{cursor:pointer}.insight{font-family:Ubuntu,sans-serif;font-size:34px;font-style:italic;font-weight:700;overflow:hidden}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#fffffe}.navbar-default .navbar-brand{color:#FFF;padding:22px 15px}.navbar-form .form-control{background-color:#7CAD23;border-radius:3px;-webkit-border-radius:3px;-moz-border-radius:3px;border:0;-webkit-box-shadow:1px 1px 0 0 rgba(255,255,255,.41),inset 1px 1px 3px 0 rgba(0,0,0,.10);-moz-box-shadow:1px 1px 0 0 rgba(255,255,255,.41),inset 1px 1px 3px 0 rgba(0,0,0,.10);box-shadow:1px 1px 0 0 rgba(255,255,255,.41),inset 1px 1px 3px 0 rgba(0,0,0,.10)}.navbar-nav>li>a{padding-top:22px;padding-bottom:22px}#search{color:#fff;font-family:Ubuntu,sans-serif}#search.loading{background-image:url(/img/loading.gif);background-position:5px center;background-repeat:no-repeat;padding-left:25px}#search::-webkit-input-placeholder{color:#BCDF7E;font-family:Ubuntu,sans-serif;font-size:14px;font-style:italic;font-weight:100}#search::-moz-placeholder{color:#BCDF7E;font-family:Ubuntu,sans-serif;font-size:14px;font-weight:100}.status{-moz-border-radius:3px;-webkit-border-radius:3px;background-color:#597338;border-radius:3px;margin:15px 0;padding:8px 10px;font-size:12px;color:#eee;text-align:center;margin-right:10px}.status .tooltip{margin:0}.col-gray{-moz-border-radius:5px;-webkit-border-radius:5px;background-color:#F4F4F4;border-radius:5px;padding:14px;border:1px solid #eee}.col-gray-responsive{width:auto}.col-gray-fixed{margin-top:15px;position:fixed;width:250px;border:1px solid #eee;z-index:1}@media (max-width:768px){.col-gray-fixed{width:100%}}@media (max-width:995px){.col-gray-fixed{position:static;width:100%}}@media (min-width:1200px){.col-gray-fixed{width:280px}}.ellipsis{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.line20{border:1px solid #D4D4D4;margin-bottom:15px}.line10{border:1px solid #EAEAEA;margin:10px 0}.block-id{background-color:#373D42;border:3px solid #FFF;margin:0 auto;width:165px;color:#fff;text-align:center}.block-id span{font-size:40px;margin:30px 0}.block-id h2{color:#FFF;font-weight:700;line-height:30px;font-size:24px;margin-top:0;margin-bottom:10px}.icon-block{color:#FFF;font-size:35px;margin-top:10px}.icon-block h3{color:#fff}.block-tx{-moz-border-radius:2px;-webkit-border-radius:2px;background-color:#F4F4F4;border-radius:2px;margin:20px 0 10px;overflow:hidden;padding:15px;border:1px solid #eee}.btn{border-radius:2px}.btn-primary{background-color:#8DC429;border:2px solid #76AF0F}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary,.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success,.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-color:#fff;border:2px solid #ccc;color:#373D42}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-color:#fff}.btn-default{background-color:#E7E7E7}.btn-success{background-color:#2FA4D7;border:2px solid #237FA7}.btn-danger{background-color:#AC0015;border:2px solid #6C0000}.txvalues{display:inline-block;padding:.7em 2em;font-size:13px;text-transform:uppercase;font-weight:100;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}@media (max-width:768px){.txvalues{display:block;margin:5px}}.txvalues-primary{background-color:#8DC429}.txvalues-default{background-color:#EBEBEB;color:#333}.txvalues-success{background-color:#2FA4D7}.txvalues-danger{background-color:#AC0015}.txvalues-normal{background-color:transparent;text-transform:none;color:#333;font-size:14px;font-weight:400}.progress-bar-info{background-color:#8DC429}#footer{background-color:#373D42;color:#fff;height:51px;overflow:hidden}#footer a.insight{font-size:20px;text-decoration:none;color:#fff}#footer a.insight:hover{color:#fffffe}#footer a.insight small{font-size:11px}.line-footer{border-top:2px dashed #ccc}.line-bot{border-bottom:2px solid #EAEAEA;padding:0 0 10px}.line-mid{padding:15px}.line-top{border-top:1px solid #EAEAEA;padding:15px 0 0}#wrap>.container{padding:70px 15px 0}#footer>.container{padding:auto 15px}.code{font-size:80%}.address{font-size:11px}.no_matching{-moz-border-radius-bottomleft:2px;-moz-border-radius-bottomright:2px;-webkit-border-bottom-left-radius:2px;-webkit-border-bottom-right-radius:2px;background-color:#FFF;border-bottom-left-radius:2px;border-bottom-right-radius:2px;border-top:0;border:1px solid #64920F;padding:10px 20px;position:absolute;text-align:center;top:45px;width:300px}.fader.ng-enter{opacity:0;-webkit-transition:opacity 1s;-moz-transition:opacity 1s;-o-transition:opacity 1s;transition:opacity 1s}.fader.ng-enter-active{opacity:1}.tx-bg{background-color:#F4F4F4;left:0;min-height:340px;position:absolute;top:0;width:100%;z-index:-9999}.badge{-moz-border-radius:9px;-webkit-border-radius:9px;background-color:#999;border-radius:9px;color:#fff;font-size:12.025px;font-weight:700;padding:1px 9px 2px;white-space:nowrap}.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.badge-error{background-color:#b94a48}.badge-error:hover{background-color:#953b39}.badge-warning{background-color:#f89406}.badge-warning:hover{background-color:#c67605}.badge-success{background-color:#468847}.badge-success:hover{background-color:#356635}.badge-info{background-color:#3a87ad}.badge-info:hover{background-color:#2d6987}.badge-inverse{background-color:#333}.badge-inverse:hover{background-color:#1a1a1a}.status .t{color:#fff}.status .text-danger{background:red}.status .text-warning{background:#ff0;color:#000}.btn-copy{color:#9b9b9b;display:inline-block;height:16px;width:16px;outline:0;vertical-align:sub}.btn-expand{color:#9b9b9b;vertical-align:middle}.btn-copy:hover,.btn-expand:hover{color:#000;text-decoration:none}.btn-copy{background:transparent url(/img/icons/copy.png) center center no-repeat}.btn-copy .tooltip{display:block;margin-left:20px;margin-top:-2px;opacity:0}.btn-copy.zeroclipboard-is-hover{color:#2a6496}.btn-copy.zeroclipboard-is-active .tooltip{opacity:1}@media (max-width:991px){.btn-copy{display:none}}.txid{line-height:26px}.tx-id{background-color:#373D42;border:3px solid #FFF;margin:0 auto;width:165px;color:#FFF;text-align:center}.tx-id span{font-size:40px;margin:30px 0}.page-header{margin-top:0}.panel{margin-bottom:1em}.panel-body{padding:.7em}#home .btn-more{border-top:1px solid #ddd;margin:30px auto 0;text-align:center;width:90%}#home .btn-more .btn-default{margin-top:-23px}#powered .powered-text{border-top:1px solid #ddd;margin:30px auto 0;text-align:center;width:90%}#powered .powered-text small{background-color:#f4f4f4;padding:4px;position:relative;top:-12px}#powered a{background-repeat:no-repeat;background-position:center center;display:inline-block;float:left;height:45px}#powered a.bitcore{background-image:url(http://bitcore.io/images/logo.svg);background-size:80px;width:30%}#powered a.nodejs{background-image:url(/img/nodejs.png);background-size:80px;width:30%}#powered a.angularjs{background-image:url(/img/angularjs.png);background-size:50px;width:20%}#powered a.leveldb{background-image:url(/img/leveldb.png);background-size:50px;width:20%}@keyframes rotateThis{from{transform:scale(1) rotate(0deg)}to{transform:scale(1) rotate(360deg)}}@-webkit-keyframes rotateThis{from{-webkit-transform:scale(1) rotate(0deg)}to{-webkit-transform:scale(1) rotate(360deg)}}.icon-rotate{animation-name:rotateThis;animation-duration:2s;animation-iteration-count:infinite;animation-timing-function:linear;-webkit-animation-name:rotateThis;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-timing-function:linear}.transaction-vin-vout{}.v_highlight{background-color:#8DC429;overflow:hidden;color:#fff}a.v_highlight_more{background-color:#8DC429;color:#fff}.secondary_navbar{width:100%;background:#fff;position:fixed;top:64px;left:0;text-align:center;z-index:1000;margin:0 auto;-moz-box-shadow:0 1px 4px 0 rgba(0,0,0,.20);-webkit-box-shadow:0 1px 4px 0 rgba(0,0,0,.20);box-shadow:0 1px 4px 0 rgba(0,0,0,.20)}.secondary_navbar .container{margin:0 auto;padding:1.8em 0}.secondary_navbar h3,.secondary_navbar p,.secondary_navbar .lead{margin:0}.secondary_navbar p{line-height:1.9em}.hide_snavbar{border-bottom-right-radius:.3em;border-bottom-left-radius:.3em;position:absolute;right:25px;padding:5px 10px;background:#fff;-moz-box-shadow:0 2px 3px 0 rgba(0,0,0,.20);-webkit-box-shadow:0 2px 3px 0 rgba(0,0,0,.20);box-shadow:0 2px 3px 0 rgba(0,0,0,.20)} \ No newline at end of file diff --git a/public/fonts/glyphicons-halflings-regular.eot b/public/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000..423bd5d Binary files /dev/null and b/public/fonts/glyphicons-halflings-regular.eot differ diff --git a/public/fonts/glyphicons-halflings-regular.svg b/public/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 0000000..4469488 --- /dev/null +++ b/public/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/fonts/glyphicons-halflings-regular.ttf b/public/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000..a498ef4 Binary files /dev/null and b/public/fonts/glyphicons-halflings-regular.ttf differ diff --git a/public/fonts/glyphicons-halflings-regular.woff b/public/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000..d83c539 Binary files /dev/null and b/public/fonts/glyphicons-halflings-regular.woff differ diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..2246854 --- /dev/null +++ b/public/index.html @@ -0,0 +1,26 @@ + + + + + + + + Insight + + + + + + + +
+ +
+
+ + + + + + + diff --git a/public/js/angularjs-all.min.js b/public/js/angularjs-all.min.js index fffef14..14337e8 100644 --- a/public/js/angularjs-all.min.js +++ b/public/js/angularjs-all.min.js @@ -1,4 +1,4 @@ -/*! insight-bitcore 0.1.2 */ +/*! insight-bitcore 0.1.3 */ !function(P,R,s){"use strict";function t(b){return function(){var c,a=arguments[0],a="["+(b?b+":":"")+a+"] http://errors.angularjs.org/1.2.12/"+(b?b+"/":"")+a;for(c=1;c0&&a-1 in b}function q(b,a,c){var d;if(b)if(M(b))for(d in b)"prototype"==d||"length"==d||"name"==d||b.hasOwnProperty&&!b.hasOwnProperty(d)||a.call(c,b[d],d);else if(b.forEach&&b.forEach!==q)b.forEach(a,c);else if(qb(b))for(d=0;d=0&&b.splice(c,1),a}function $(b,a){if(za(b)||b&&b.$evalAsync&&b.$watch)throw Na("cpws");if(a){if(b===a)throw Na("cpi");if(L(b))for(var c=a.length=0;cd;d++)if(!ta(b[d],a[d]))return!1;return!0}}return!1}function Sb(){return R.securityPolicy&&R.securityPolicy.isActive||R.querySelector&&!(!R.querySelector("[ng-csp]")&&!R.querySelector("[data-ng-csp]"))}function bb(b,a){var c=2").append(b).html();try{return 3===b[0].nodeType?x(c):c.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+x(b)})}catch(d){return x(c)}}function Ub(b){try{return decodeURIComponent(b)}catch(a){}}function Vb(b){var c,d,a={};return q((b||"").split("&"),function(b){b&&(c=b.split("="),d=Ub(c[0]),D(d)&&(b=D(c[1])?Ub(c[1]):!0,a[d]?L(a[d])?a[d].push(b):a[d]=[a[d],b]:a[d]=b))}),a}function Wb(b){var a=[];return q(b,function(b,d){L(b)?q(b,function(b){a.push(va(d,!0)+(!0===b?"":"="+va(b,!0)))}):a.push(va(d,!0)+(!0===b?"":"="+va(b,!0)))}),a.length?a.join("&"):""}function sb(b){return va(b,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function va(b,a){return encodeURIComponent(b).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,a?"%20":"+")}function Sc(b,a){function c(a){a&&d.push(a)}var e,g,d=[b],f=["ng:app","ng-app","x-ng-app","data-ng-app"],h=/\sng[:\-]app(:\s*([\w\d_]+);?)?\s/;q(f,function(a){f[a]=!0,c(R.getElementById(a)),a=a.replace(":","\\:"),b.querySelectorAll&&(q(b.querySelectorAll("."+a),c),q(b.querySelectorAll("."+a+"\\:"),c),q(b.querySelectorAll("["+a+"]"),c))}),q(d,function(a){if(!e){var b=h.exec(" "+a.className+" ");b?(e=a,g=(b[2]||"").replace(/\s+/g,",")):q(a.attributes,function(b){!e&&f[b.name]&&(e=a,g=b.value)})}}),e&&a(e,g?[g]:[])}function Xb(b,a){var c=function(){if(b=z(b),b.injector()){var c=b[0]===R?"document":fa(b);throw Na("btstrpd",c)}return a=a||[],a.unshift(["$provide",function(a){a.value("$rootElement",b)}]),a.unshift("ng"),c=Yb(a),c.invoke(["$rootScope","$rootElement","$compile","$injector","$animate",function(a,b,c,d){a.$apply(function(){b.data("$injector",d),c(b)(a)})}]),c},d=/^NG_DEFER_BOOTSTRAP!/;return P&&!d.test(P.name)?c():(P.name=P.name.replace(d,""),void(Ba.resumeBootstrap=function(b){q(b,function(b){a.push(b)}),c()}))}function cb(b,a){return a=a||"_",b.replace(Tc,function(b,d){return(d?a:"")+b.toLowerCase()})}function tb(b,a,c){if(!b)throw Na("areq",a||"?",c||"required");return b}function Pa(b,a,c){return c&&L(b)&&(b=b[b.length-1]),tb(M(b),a,"not a function, got "+(b&&"object"==typeof b?b.constructor.name||"Object":typeof b)),b}function wa(b,a){if("hasOwnProperty"===b)throw Na("badname",a)}function Zb(b,a,c){if(!a)return b;a=a.split(".");for(var d,e=b,g=a.length,f=0;g>f;f++)d=a[f],b&&(b=(e=b)[d]);return!c&&M(b)?bb(e,b):b}function ub(b){var a=b[0];if(b=b[b.length-1],a===b)return z(a);var c=[a];do{if(a=a.nextSibling,!a)break;c.push(a)}while(a!==b);return z(c)}function Uc(b){var a=t("$injector"),c=t("ng");return b=b.angular||(b.angular={}),b.$$minErr=b.$$minErr||t,b.module||(b.module=function(){var b={};return function(e,g,f){if("hasOwnProperty"===e)throw c("badname","module");return g&&b.hasOwnProperty(e)&&(b[e]=null),b[e]||(b[e]=function(){function b(a,d,e){return function(){return c[e||"push"]([a,d,arguments]),n}}if(!g)throw a("nomod",e);var c=[],d=[],l=b("$injector","invoke"),n={_invokeQueue:c,_runBlocks:d,requires:g,name:e,provider:b("$provide","provider"),factory:b("$provide","factory"),service:b("$provide","service"),value:b("$provide","value"),constant:b("$provide","constant","unshift"),animation:b("$animateProvider","register"),filter:b("$filterProvider","register"),controller:b("$controllerProvider","register"),directive:b("$compileProvider","directive"),config:l,run:function(a){return d.push(a),this}};return f&&l(f),n}())}}())}function Qa(b){return b.replace(Vc,function(a,b,d,e){return e?d.toUpperCase():d}).replace(Wc,"Moz$1")}function vb(b,a,c,d){function e(b){var k,l,n,p,r,F,e=c&&b?[this.filter(b)]:[this],m=a;if(!d||null!=b)for(;e.length;)for(k=e.shift(),l=0,n=k.length;n>l;l++)for(p=z(k[l]),m?p.triggerHandler("$destroy"):m=!m,r=0,p=(F=p.children()).length;p>r;r++)e.push(Ca(F[r]));return g.apply(this,arguments)}var g=Ca.fn[b],g=g.$original||g;e.$original=g,Ca.fn[b]=e}function O(b){if(b instanceof O)return b;if(w(b)&&(b=Z(b)),!(this instanceof O)){if(w(b)&&"<"!=b.charAt(0))throw wb("nosel");return new O(b)}if(w(b)){var a=R.createElement("div");a.innerHTML="
 
"+b,a.removeChild(a.firstChild),xb(this,a.childNodes),z(R.createDocumentFragment()).append(this)}else xb(this,b)}function yb(b){return b.cloneNode(!0)}function Da(b){$b(b);var a=0;for(b=b.childNodes||[];ad;d++)if((c=b.data(a[d]))!==s)return c;b=b.parent()}}function dc(b){for(var a=0,c=b.childNodes;a=N?(c.preventDefault=null,c.stopPropagation=null,c.isDefaultPrevented=null):(delete c.preventDefault,delete c.stopPropagation,delete c.isDefaultPrevented)};return c.elem=b,c}function Ea(b){var c,a=typeof b;return"object"==a&&null!==b?"function"==typeof(c=b.$$hashKey)?c=b.$$hashKey():c===s&&(c=b.$$hashKey=Za()):c=b,a+":"+c}function Sa(b){q(b,this.put,this)}function gc(b){var a,c;return"function"==typeof b?(a=b.$inject)||(a=[],b.length&&(c=b.toString().replace(Zc,""),c=c.match($c),q(c[1].split(ad),function(b){b.replace(bd,function(b,c,d){a.push(d)})})),b.$inject=a):L(b)?(c=b.length-1,Pa(b[c],"fn"),a=b.slice(0,c)):Pa(b,"fn",!0),a}function Yb(b){function a(a){return function(b,c){return W(b)?void q(b,Ob(a)):a(b,c)}}function c(a,b){if(wa(a,"service"),(M(b)||L(b))&&(b=n.instantiate(b)),!b.$get)throw Ta("pget",a);return l[a+h]=b}function d(a,b){return c(a,{$get:b})}function e(a){var c,d,g,h,b=[];return q(a,function(a){if(!k.get(a)){k.put(a,!0);try{if(w(a))for(c=Ua(a),b=b.concat(e(c.requires)).concat(c._runBlocks),d=c._invokeQueue,g=0,h=d.length;h>g;g++){var f=d[g],m=n.get(f[0]);m[f[1]].apply(m,f[2])}else M(a)?b.push(n.invoke(a)):L(a)?b.push(n.invoke(a)):Pa(a,"module")}catch(r){throw L(a)&&(a=a[a.length-1]),r.message&&r.stack&&-1==r.stack.indexOf(r.message)&&(r=r.message+"\n"+r.stack),Ta("modulerr",a,r.stack||r.message||r)}}}),b}function g(a,b){function c(d){if(a.hasOwnProperty(d)){if(a[d]===f)throw Ta("cdep",m.join(" <- "));return a[d]}try{return m.unshift(d),a[d]=f,a[d]=b(d)}catch(e){throw a[d]===f&&delete a[d],e}finally{m.shift()}}function d(a,b,e){var f,m,k,g=[],h=gc(a);for(m=0,f=h.length;f>m;m++){if(k=h[m],"string"!=typeof k)throw Ta("itkn",k);g.push(e&&e.hasOwnProperty(k)?e[k]:c(k))}return a.$inject||(a=a[f]),a.apply(b,g)}return{invoke:d,instantiate:function(a,b){var e,c=function(){};return c.prototype=(L(a)?a[a.length-1]:a).prototype,c=new c,e=d(a,c,b),W(e)||M(e)?e:c},get:c,annotate:gc,has:function(b){return l.hasOwnProperty(b+h)||a.hasOwnProperty(b)}}}var f={},h="Provider",m=[],k=new Sa,l={$provide:{provider:a(c),factory:a(d),service:a(function(a,b){return d(a,["$injector",function(a){return a.instantiate(b)}])}),value:a(function(a,b){return d(a,Y(b))}),constant:a(function(a,b){wa(a,"constant"),l[a]=b,p[a]=b}),decorator:function(a,b){var c=n.get(a+h),d=c.$get;c.$get=function(){var a=r.invoke(d,c);return r.invoke(b,null,{$delegate:a})}}}},n=l.$injector=g(l,function(){throw Ta("unpr",m.join(" <- "))}),p={},r=p.$injector=g(p,function(a){return a=n.get(a+h),r.invoke(a.$get,a)});return q(e(b),function(a){r.invoke(a||E)}),r}function cd(){var b=!0;this.disableAutoScrolling=function(){b=!1},this.$get=["$window","$location","$rootScope",function(a,c,d){function e(a){var b=null;return q(a,function(a){b||"a"!==x(a.nodeName)||(b=a)}),b}function g(){var d,b=c.hash();b?(d=f.getElementById(b))?d.scrollIntoView():(d=e(f.getElementsByName(b)))?d.scrollIntoView():"top"===b&&a.scrollTo(0,0):a.scrollTo(0,0)}var f=a.document;return b&&d.$watch(function(){return c.hash()},function(){d.$evalAsync(g)}),g}]}function dd(b,a,c,d){function e(a){try{a.apply(null,ua.call(arguments,1))}finally{if(F--,0===F)for(;A.length;)try{A.pop()()}catch(b){c.error(b)}}}function g(a,b){!function S(){q(H,function(a){a()}),v=b(S,a)}()}function f(){C=null,Q!=h.url()&&(Q=h.url(),q(ka,function(a){a(h.url())}))}var h=this,m=a[0],k=b.location,l=b.history,n=b.setTimeout,p=b.clearTimeout,r={};h.isMock=!1;var F=0,A=[];h.$$completeOutstandingRequest=e,h.$$incOutstandingRequestCount=function(){F++},h.notifyWhenNoOutstandingRequests=function(a){q(H,function(a){a()}),0===F?a():A.push(a)};var v,H=[];h.addPollFn=function(a){return u(v)&&g(100,n),H.push(a),a};var Q=k.href,K=a.find("base"),C=null;h.url=function(a,c){return k!==b.location&&(k=b.location),l!==b.history&&(l=b.history),a?Q!=a?(Q=a,d.history?c?l.replaceState(null,"",a):(l.pushState(null,"",a),K.attr("href",K.attr("href"))):(C=a,c?k.replace(a):k.href=a),h):void 0:C||k.href.replace(/%27/g,"'")};var ka=[],I=!1;h.onUrlChange=function(a){return I||(d.history&&z(b).on("popstate",f),d.hashchange?z(b).on("hashchange",f):h.addPollFn(f),I=!0),ka.push(a),a},h.baseHref=function(){var a=K.attr("href");return a?a.replace(/^(https?\:)?\/\/[^\/]*/,""):""};var U={},ba="",aa=h.baseHref();h.cookies=function(a,b){var d,e,g,h;if(!a){if(m.cookie!==ba)for(ba=m.cookie,d=ba.split("; "),U={},g=0;g0&&(a=unescape(e.substring(0,h)),U[a]===s&&(U[a]=unescape(e.substring(h+1))));return U}b===s?m.cookie=escape(a)+"=;path="+aa+";expires=Thu, 01 Jan 1970 00:00:00 GMT":w(b)&&(d=(m.cookie=escape(a)+"="+escape(b)+";path="+aa).length+1,d>4096&&c.warn("Cookie '"+a+"' possibly not set or overflowed because it was too large ("+d+" > 4096 bytes)!"))},h.defer=function(a,b){var c;return F++,c=n(function(){delete r[c],e(a)},b||0),r[c]=!0,c},h.defer.cancel=function(a){return r[a]?(delete r[a],p(a),e(E),!0):!1}}function ed(){this.$get=["$window","$log","$sniffer","$document",function(b,a,c,d){return new dd(b,d,a,c)}]}function fd(){this.$get=function(){function b(b,d){function e(a){a!=n&&(p?p==a&&(p=a.n):p=a,g(a.n,a.p),g(a,n),n=a,n.n=null)}function g(a,b){a!=b&&(a&&(a.p=b),b&&(b.n=a))}if(b in a)throw t("$cacheFactory")("iid",b);var f=0,h=y({},d,{id:b}),m={},k=d&&d.capacity||Number.MAX_VALUE,l={},n=null,p=null;return a[b]={put:function(a,b){var c=l[a]||(l[a]={key:a});return e(c),u(b)?void 0:(a in m||f++,m[a]=b,f>k&&this.remove(p.key),b)},get:function(a){var b=l[a];return b?(e(b),m[a]):void 0},remove:function(a){var b=l[a];b&&(b==n&&(n=b.p),b==p&&(p=b.n),g(b.n,b.p),delete l[a],delete m[a],f--)},removeAll:function(){m={},f=0,l={},n=p=null},destroy:function(){l=h=m=null,delete a[b]},info:function(){return y({},h,{size:f})}}}var a={};return b.info=function(){var b={};return q(a,function(a,e){b[e]=a.info()}),b},b.get=function(b){return a[b]},b}}function gd(){this.$get=["$cacheFactory",function(b){return b("templates")}]}function ic(b,a){var c={},d="Directive",e=/^\s*directive\:\s*([\d\w\-_]+)\s+(.*)$/,g=/(([\d\w\-_]+)(?:\:([^;]+))?;?)/,f=/^(on[a-z]+|formaction)$/;this.directive=function m(a,e){return wa(a,"directive"),w(a)?(tb(e,"directiveFactory"),c.hasOwnProperty(a)||(c[a]=[],b.factory(a+d,["$injector","$exceptionHandler",function(b,d){var e=[];return q(c[a],function(c,g){try{var f=b.invoke(c);M(f)?f={compile:Y(f)}:!f.compile&&f.link&&(f.compile=Y(f.link)),f.priority=f.priority||0,f.index=g,f.name=f.name||a,f.require=f.require||f.controller&&f.name,f.restrict=f.restrict||"A",e.push(f)}catch(m){d(m)}}),e}])),c[a].push(e)):q(a,Ob(m)),this},this.aHrefSanitizationWhitelist=function(b){return D(b)?(a.aHrefSanitizationWhitelist(b),this):a.aHrefSanitizationWhitelist()},this.imgSrcSanitizationWhitelist=function(b){return D(b)?(a.imgSrcSanitizationWhitelist(b),this):a.imgSrcSanitizationWhitelist()},this.$get=["$injector","$interpolate","$exceptionHandler","$http","$templateCache","$parse","$controller","$rootScope","$document","$sce","$animate","$$sanitizeUri",function(a,b,l,n,p,r,F,A,H,v,Q,K){function C(a,b,c,d,e){a instanceof z||(a=z(a)),q(a,function(b,c){3==b.nodeType&&b.nodeValue.match(/\S+/)&&(a[c]=z(b).wrap("").parent()[0])});var g=I(a,b,a,c,d,e);return ka(a,"ng-scope"),function(b,c,d){tb(b,"scope");var e=c?Fa.clone.call(a):a;q(d,function(a,b){e.data("$"+b+"Controller",a)}),d=0;for(var f=e.length;f>d;d++){var m=e[d].nodeType;1!==m&&9!==m||e.eq(d).data("$scope",b)}return c&&c(e,b),g&&g(b,e,e),e}}function ka(a,b){try{a.addClass(b)}catch(c){}}function I(a,b,c,d,e,g){function f(a,c,d,e){var g,k,r,l,n,p,J;g=c.length;var F=Array(g);for(n=0;g>n;n++)F[n]=c[n];for(J=n=0,p=m.length;p>n;J++)k=F[J],c=m[n++],g=m[n++],r=z(k),c?(c.scope?(l=a.$new(),r.data("$scope",l)):l=a,(r=c.transclude)||!e&&b?c(g,l,k,d,U(a,r||b)):c(g,l,k,d,e)):g&&g(a,k.childNodes,s,e)}for(var k,r,l,n,m=[],p=0;pp;p++){var A=!1,Q=!1;if(r=k[p],!N||N>=8||r.specified){l=r.name,n=la(l),T.test(n)&&(l=cb(n.substr(6),"-"));var C=n.replace(/(Start|End)$/,"");n===C+"Start"&&(A=l,Q=l.substr(0,l.length-5)+"end",l=l.substr(0,l.length-6)),n=la(l.toLowerCase()),m[n]=l,c[n]=r=Z(r.value),ec(a,n)&&(c[n]=!0),O(a,b,r,n),S(b,n,"A",d,f,A,Q)}}if(a=a.className,w(a)&&""!==a)for(;k=g.exec(a);)n=la(k[2]),S(b,n,"C",d,f)&&(c[n]=Z(k[3])),a=a.substr(k.index+k[0].length);break;case 3:t(b,a.nodeValue);break;case 8:try{(k=e.exec(a.nodeValue))&&(n=la(k[1]),S(b,n,"M",d,f)&&(c[n]=Z(k[2])))}catch(H){}}return b.sort(u),b}function aa(a,b,c){var d=[],e=0;if(b&&a.hasAttribute&&a.hasAttribute(b)){do{if(!a)throw ha("uterdir",b,c);1==a.nodeType&&(a.hasAttribute(b)&&e++,a.hasAttribute(c)&&e--),d.push(a),a=a.nextSibling}while(e>0)}else d.push(a);return z(d)}function B(a,b,c){return function(d,e,g,f,k){return e=aa(e[0],b,c),a(d,e,g,f,k)}}function ga(a,c,d,e,g,f,m,n,p){function A(a,b,c,d){a&&(c&&(a=B(a,c,d)),a.require=G.require,(K===G||G.$$isolateScope)&&(a=jc(a,{isolateScope:!0})),m.push(a)),b&&(c&&(b=B(b,c,d)),b.require=G.require,(K===G||G.$$isolateScope)&&(b=jc(b,{isolateScope:!0})),n.push(b))}function Q(a,b,c){var d,e="data",g=!1;if(w(a)){for(;"^"==(d=a.charAt(0))||"?"==d;)a=a.substr(1),"^"==d&&(e="inheritedData"),g=g||"?"==d;if(d=null,c&&"data"===e&&(d=c[a]),d=d||b[e]("$"+a+"Controller"),!d&&!g)throw ha("ctreq",a,ca)}else L(a)&&(d=[],q(a,function(a){d.push(Q(a,b,c))}));return d}function H(a,e,g,f,p){function A(a,b){var c;return 2>arguments.length&&(b=a,a=s),u&&(c=aa),p(a,b,c)}var J,C,v,I,ba,B,gb,aa={};if(J=c===g?d:Rb(d,new Db(z(g),d.$attr)),C=J.$$element,K){var t=/^\s*([@=&])(\??)\s*(\w*)\s*$/;f=z(g),B=e.$new(!0),ga&&ga===K.$$originalDirective?f.data("$isolateScope",B):f.data("$isolateScopeNoTemplate",B),ka(f,"ng-isolate-scope"),q(K.scope,function(a,c){var m,l,n,p,d=a.match(t)||[],g=d[3]||c,f="?"==d[2],d=d[1];switch(B.$$isolateBindings[c]=d+g,d){case"@":J.$observe(g,function(a){B[c]=a}),J.$$observers[g].$$scope=e,J[g]&&(B[c]=b(J[g])(e));break;case"=":if(f&&!J[g])break;l=r(J[g]),p=l.literal?ta:function(a,b){return a===b},n=l.assign||function(){throw m=B[c]=l(e),ha("nonassign",J[g],K.name)},m=B[c]=l(e),B.$watch(function(){var a=l(e);return p(a,B[c])||(p(a,m)?n(e,a=B[c]):B[c]=a),m=a},null,l.literal);break;case"&":l=r(J[g]),B[c]=function(a){return l(e,a)};break;default:throw ha("iscp",K.name,c,a)}})}for(gb=p&&A,U&&q(U,function(a){var c,b={$scope:a===K||a.$$isolateScope?B:e,$element:C,$attrs:J,$transclude:gb};ba=a.controller,"@"==ba&&(ba=J[a.name]),c=F(ba,b),aa[a.name]=c,u||C.data("$"+a.name+"Controller",c),a.controllerAs&&(b.$scope[a.controllerAs]=c)}),f=0,v=m.length;v>f;f++)try{(I=m[f])(I.isolateScope?B:e,C,J,I.require&&Q(I.require,C,aa),gb)}catch(S){l(S,fa(C))}for(f=e,K&&(K.template||null===K.templateUrl)&&(f=B),a&&a(f,g.childNodes,s,p),f=n.length-1;f>=0;f--)try{(I=n[f])(I.isolateScope?B:e,C,J,I.require&&Q(I.require,C,aa),gb)}catch(G){l(G,fa(C))}}p=p||{};var I,v=-Number.MAX_VALUE,U=p.controllerDirectives,K=p.newIsolateScopeDirective,ga=p.templateDirective;p=p.nonTlbTranscludeDirective;for(var G,ca,t,O,S=!1,u=!1,y=d.$$element=z(c),P=e,N=0,ma=a.length;ma>N;N++){G=a[N];var Va=G.$$start,T=G.$$end;if(Va&&(y=aa(c,Va,T)),t=s,v>G.priority)break;if((t=G.scope)&&(I=I||G,G.templateUrl||(x("new/isolated scope",K,G,y),W(t)&&(K=G))),ca=G.name,!G.templateUrl&&G.controller&&(t=G.controller,U=U||{},x("'"+ca+"' controller",U[ca],G,y),U[ca]=G),(t=G.transclude)&&(S=!0,G.$$tlb||(x("transclusion",p,G,y),p=G),"element"==t?(u=!0,v=G.priority,t=aa(c,Va,T),y=d.$$element=z(R.createComment(" "+ca+": "+d[ca]+" ")),c=y[0],hb(g,z(ua.call(t,0)),c),P=C(t,e,v,f&&f.name,{nonTlbTranscludeDirective:p})):(t=z(yb(c)).contents(),y.empty(),P=C(t,e))),G.template)if(x("template",ga,G,y),ga=G,t=M(G.template)?G.template(y,d):G.template,t=V(t),G.replace){if(f=G,t=z("
"+Z(t)+"
").contents(),c=t[0],1!=t.length||1!==c.nodeType)throw ha("tplrt",ca,"");hb(g,y,c),ma={$attr:{}},t=ba(c,[],ma);var X=a.splice(N+1,a.length-(N+1));K&&hc(t),a=a.concat(t).concat(X),D(d,ma),ma=a.length}else y.html(t);if(G.templateUrl)x("template",ga,G,y),ga=G,G.replace&&(f=G),H=E(a.splice(N,a.length-N),y,d,g,P,m,n,{controllerDirectives:U,newIsolateScopeDirective:K,templateDirective:ga,nonTlbTranscludeDirective:p}),ma=a.length;else if(G.compile)try{O=G.compile(y,d,P),M(O)?A(null,O,Va,T):O&&A(O.pre,O.post,Va,T)}catch(Y){l(Y,fa(y))}G.terminal&&(H.terminal=!0,v=Math.max(v,G.priority))}return H.scope=I&&!0===I.scope,H.transclude=S&&P,H}function hc(a){for(var b=0,c=a.length;c>b;b++)a[b]=Qb(a[b],{$$isolateScope:!0})}function S(b,e,g,f,k,r,n){if(e===k)return null;if(k=null,c.hasOwnProperty(e)){var p;e=a.get(e+d);for(var F=0,A=e.length;A>F;F++)try{p=e[F],(f===s||f>p.priority)&&-1!=p.restrict.indexOf(g)&&(r&&(p=Qb(p,{$$start:r,$$end:n})),b.push(p),k=p)}catch(Q){l(Q)}}return k}function D(a,b){var c=b.$attr,d=a.$attr,e=a.$$element;q(a,function(d,e){"$"!=e.charAt(0)&&(b[e]&&(d+=("style"===e?";":" ")+b[e]),a.$set(e,d,!0,c[e]))}),q(b,function(b,g){"class"==g?(ka(e,b),a["class"]=(a["class"]?a["class"]+" ":"")+b):"style"==g?(e.attr("style",e.attr("style")+";"+b),a.style=(a.style?a.style+";":"")+b):"$"==g.charAt(0)||a.hasOwnProperty(g)||(a[g]=b,d[g]=c[g])})}function E(a,b,c,d,e,g,f,k){var r,l,m=[],F=b[0],A=a.shift(),Q=y({},A,{templateUrl:null,transclude:null,replace:null,$$originalDirective:A}),C=M(A.templateUrl)?A.templateUrl(b,c):A.templateUrl;return b.empty(),n.get(v.getTrustedResourceUrl(C),{cache:p}).success(function(n){var p,H;if(n=V(n),A.replace){if(n=z("
"+Z(n)+"
").contents(),p=n[0],1!=n.length||1!==p.nodeType)throw ha("tplrt",A.name,C);n={$attr:{}},hb(d,b,p);var v=ba(p,[],n);W(A.scope)&&hc(v),a=v.concat(a),D(c,n)}else p=F,b.html(n);for(a.unshift(Q),r=ga(a,p,c,e,b,A,g,f,k),q(d,function(a,c){a==p&&(d[c]=b[0])}),l=I(b[0].childNodes,e);m.length;){n=m.shift(),H=m.shift();var K=m.shift(),B=m.shift(),v=b[0];if(H!==F){var aa=H.className,v=yb(p);hb(K,z(H),v),ka(z(v),aa)}H=r.transclude?U(n,r.transclude):B,r(l,n,v,d,H)}m=null}).error(function(a,b,c,d){throw ha("tpload",d.url)}),function(a,b,c,d,e){m?(m.push(b),m.push(c),m.push(d),m.push(e)):r(l,b,c,d,e)}}function u(a,b){var c=b.priority-a.priority;return 0!==c?c:a.name!==b.name?a.namef;f++)if(a[f]==d){a[f++]=c,m=f+e-1;for(var k=a.length;k>f;f++,m++)k>m?a[f]=a[m]:delete a[f];a.length-=e-1;break}for(g&&g.replaceChild(c,d),a=R.createDocumentFragment(),a.appendChild(d),c[z.expando]=d[z.expando],d=1,e=b.length;e>d;d++)g=b[d],z(g).remove(),a.appendChild(g),delete b[d];b[0]=c,b.length=1}function jc(a,b){return y(function(){return a.apply(null,arguments)},a,b)}var Db=function(a,b){this.$$element=a,this.$attr=b||{}};Db.prototype={$normalize:la,$addClass:function(a){a&&0a.status?b:n.reject(b)}var d={transformRequest:e.transformRequest,transformResponse:e.transformResponse},g=function(a){function b(a){var c;q(a,function(b,d){M(b)&&(c=b(),null!=c?a[d]=c:delete a[d])})}var g,f,c=e.headers,d=y({},a.headers),c=y({},c.common,c[x(a.method)]);b(c),b(d);a:for(g in c){a=x(g);for(f in d)if(x(f)===a)continue a;d[g]=c[g]}return d}(a);y(d,a),d.headers=g,d.method=Ha(d.method),(a=Eb(d.url)?b.cookies()[d.xsrfCookieName||e.xsrfCookieName]:s)&&(g[d.xsrfHeaderName||e.xsrfHeaderName]=a);var f=[function(a){g=a.headers;var b=nc(a.data,mc(g),a.transformRequest);return u(a.data)&&q(g,function(a,b){"content-type"===x(b)&&delete g[b]}),u(a.withCredentials)&&!u(e.withCredentials)&&(a.withCredentials=e.withCredentials),F(a,b,g).then(c,c)},s],k=n.when(d);for(q(v,function(a){(a.request||a.requestError)&&f.unshift(a.request,a.requestError),(a.response||a.responseError)&&f.push(a.response,a.responseError)});f.length;){a=f.shift();var h=f.shift(),k=k.then(a,h)}return k.success=function(a){return k.then(function(b){a(b.data,b.status,b.headers,d)}),k},k.error=function(a){return k.then(null,function(b){a(b.data,b.status,b.headers,d)}),k},k}function F(b,c,g){function f(a,b,c){v&&(a>=200&&300>a?v.put(s,[a,b,lc(c)]):v.remove(s)),m(b,a,c),d.$$phase||d.$apply()}function m(a,c,d){c=Math.max(c,0),(c>=200&&300>c?p.resolve:p.reject)({data:a,status:c,headers:mc(d),config:b})}function k(){var a=ab(r.pendingRequests,b);-1!==a&&r.pendingRequests.splice(a,1)}var v,q,p=n.defer(),F=p.promise,s=A(b.url,b.params);if(r.pendingRequests.push(b),F.then(k,k),(b.cache||e.cache)&&!1!==b.cache&&"GET"==b.method&&(v=W(b.cache)?b.cache:W(e.cache)?e.cache:H),v)if(q=v.get(s),D(q)){if(q.then)return q.then(k,k),q;L(q)?m(q[1],q[0],$(q[2])):m(q,200,{})}else v.put(s,F);return u(q)&&a(b.method,s,c,f,g,b.timeout,b.withCredentials,b.responseType),F}function A(a,b){if(!b)return a;var c=[];return Oc(b,function(a,b){null===a||u(a)||(L(a)||(a=[a]),q(a,function(a){W(a)&&(a=pa(a)),c.push(va(b)+"="+va(a))}))}),a+(-1==a.indexOf("?")?"?":"&")+c.join("&")}var H=c("$http"),v=[];return q(g,function(a){v.unshift(w(a)?p.get(a):p.invoke(a))}),q(f,function(a,b){var c=w(a)?p.get(a):p.invoke(a);v.splice(b,0,{response:function(a){return c(n.when(a))},responseError:function(a){return c(n.reject(a))}}) }),r.pendingRequests=[],function(){q(arguments,function(a){r[a]=function(b,c){return r(y(c||{},{method:a,url:b}))}})}("get","delete","head","jsonp"),function(){q(arguments,function(a){r[a]=function(b,c,d){return r(y(d||{},{method:a,url:b,data:c}))}})}("post","put"),r.defaults=e,r}]}function md(b){if(8>=N&&(!b.match(/^(get|post|head|put|delete|options)$/i)||!P.XMLHttpRequest))return new P.ActiveXObject("Microsoft.XMLHTTP");if(P.XMLHttpRequest)return new P.XMLHttpRequest;throw t("$httpBackend")("noxhr")}function nd(){this.$get=["$browser","$window","$document",function(b,a,c){return od(b,md,b.defer,a.angular.callbacks,c[0])}]}function od(b,a,c,d,e){function g(a,b){var c=e.createElement("script"),d=function(){c.onreadystatechange=c.onload=c.onerror=null,e.body.removeChild(c),b&&b()};return c.type="text/javascript",c.src=a,N&&8>=N?c.onreadystatechange=function(){/loaded|complete/.test(c.readyState)&&d()}:c.onload=c.onerror=function(){d()},e.body.appendChild(c),d}var f=-1;return function(e,m,k,l,n,p,r,F){function A(){v=f,K&&K(),C&&C.abort()}function H(a,d,e,g){I&&c.cancel(I),K=C=null,d=0===d?e?200:404:d,a(1223==d?204:d,e,g),b.$$completeOutstandingRequest(E)}var v;if(b.$$incOutstandingRequestCount(),m=m||b.url(),"jsonp"==x(e)){var Q="_"+(d.counter++).toString(36);d[Q]=function(a){d[Q].data=a};var K=g(m.replace("JSON_CALLBACK","angular.callbacks."+Q),function(){d[Q].data?H(l,200,d[Q].data):H(l,v||-2),d[Q]=Ba.noop})}else{var C=a(e);if(C.open(e,m,!0),q(n,function(a,b){D(a)&&C.setRequestHeader(b,a)}),C.onreadystatechange=function(){if(C&&4==C.readyState){var a=null,b=null;v!==f&&(a=C.getAllResponseHeaders(),b="response"in C?C.response:C.responseText),H(l,v||C.status,b,a)}},r&&(C.withCredentials=!0),F)try{C.responseType=F}catch(s){if("json"!==F)throw s}C.send(k||null)}if(p>0)var I=c(A,p);else p&&p.then&&p.then(A)}}function pd(){var b="{{",a="}}";this.startSymbol=function(a){return a?(b=a,this):b},this.endSymbol=function(b){return b?(a=b,this):a},this.$get=["$parse","$exceptionHandler","$sce",function(c,d,e){function g(g,k,l){for(var n,p,r=0,F=[],A=g.length,H=!1,v=[];A>r;)-1!=(n=g.indexOf(b,r))&&-1!=(p=g.indexOf(a,n+f))?(r!=n&&F.push(g.substring(r,n)),F.push(r=c(H=g.substring(n+f,p))),r.exp=H,r=p+h,H=!0):(r!=A&&F.push(g.substring(r)),r=A);if((A=F.length)||(F.push(""),A=1),l&&1b;b++)"function"==typeof(f=F[b])&&(f=f(a),f=l?e.getTrusted(l,f):e.valueOf(f),null===f||u(f)?f="":"string"!=typeof f&&(f=pa(f))),v[b]=f;return v.join("")}catch(k){a=oc("interr",g,k.toString()),d(a)}},r.exp=g,r.parts=F,r):void 0}var f=b.length,h=a.length;return g.startSymbol=function(){return b},g.endSymbol=function(){return a},g}]}function qd(){this.$get=["$rootScope","$window","$q",function(b,a,c){function d(d,f,h,m){var k=a.setInterval,l=a.clearInterval,n=c.defer(),p=n.promise,r=0,F=D(m)&&!m;return h=D(h)?h:0,p.then(null,null,d),p.$$intervalId=k(function(){n.notify(r++),h>0&&r>=h&&(n.resolve(r),l(p.$$intervalId),delete e[p.$$intervalId]),F||b.$apply()},f),e[p.$$intervalId]=n,p}var e={};return d.cancel=function(a){return a&&a.$$intervalId in e?(e[a.$$intervalId].reject("canceled"),clearInterval(a.$$intervalId),delete e[a.$$intervalId],!0):!1},d}]}function rd(){this.$get=function(){return{id:"en-us",NUMBER_FORMATS:{DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{minInt:1,minFrac:0,maxFrac:3,posPre:"",posSuf:"",negPre:"-",negSuf:"",gSize:3,lgSize:3},{minInt:1,minFrac:2,maxFrac:2,posPre:"¤",posSuf:"",negPre:"(¤",negSuf:")",gSize:3,lgSize:3}],CURRENCY_SYM:"$"},DATETIME_FORMATS:{MONTH:"January February March April May June July August September October November December".split(" "),SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),AMPMS:["AM","PM"],medium:"MMM d, y h:mm:ss a","short":"M/d/yy h:mm a",fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",mediumDate:"MMM d, y",shortDate:"M/d/yy",mediumTime:"h:mm:ss a",shortTime:"h:mm a"},pluralCat:function(b){return 1===b?"one":"other"}}}}function pc(b){b=b.split("/");for(var a=b.length;a--;)b[a]=sb(b[a]);return b.join("/")}function qc(b,a,c){b=xa(b,c),a.$$protocol=b.protocol,a.$$host=b.hostname,a.$$port=V(b.port)||sd[b.protocol]||null}function rc(b,a,c){var d="/"!==b.charAt(0);d&&(b="/"+b),b=xa(b,c),a.$$path=decodeURIComponent(d&&"/"===b.pathname.charAt(0)?b.pathname.substring(1):b.pathname),a.$$search=Vb(b.search),a.$$hash=decodeURIComponent(b.hash),a.$$path&&"/"!=a.$$path.charAt(0)&&(a.$$path="/"+a.$$path)}function na(b,a){return 0===a.indexOf(b)?a.substr(b.length):void 0}function Wa(b){var a=b.indexOf("#");return-1==a?b:b.substr(0,a)}function Fb(b){return b.substr(0,Wa(b).lastIndexOf("/")+1)}function sc(b,a){this.$$html5=!0,a=a||"";var c=Fb(b);qc(b,this,b),this.$$parse=function(a){var e=na(c,a);if(!w(e))throw Gb("ipthprfx",a,c);rc(e,this,b),this.$$path||(this.$$path="/"),this.$$compose()},this.$$compose=function(){var a=Wb(this.$$search),b=this.$$hash?"#"+sb(this.$$hash):"";this.$$url=pc(this.$$path)+(a?"?"+a:"")+b,this.$$absUrl=c+this.$$url.substr(1)},this.$$rewrite=function(d){var e;return(e=na(b,d))!==s?(d=e,(e=na(a,e))!==s?c+(na("/",e)||e):b+d):(e=na(c,d))!==s?c+e:c==d+"/"?c:void 0}}function Hb(b,a){var c=Fb(b);qc(b,this,b),this.$$parse=function(d){var e=na(b,d)||na(c,d),e="#"==e.charAt(0)?na(a,e):this.$$html5?e:"";if(!w(e))throw Gb("ihshprfx",d,a);rc(e,this,b),d=this.$$path;var g=/^\/?.*?:(\/.*)/;0===e.indexOf(b)&&(e=e.replace(b,"")),g.exec(e)||(d=(e=g.exec(d))?e[1]:d),this.$$path=d,this.$$compose()},this.$$compose=function(){var c=Wb(this.$$search),e=this.$$hash?"#"+sb(this.$$hash):"";this.$$url=pc(this.$$path)+(c?"?"+c:"")+e,this.$$absUrl=b+(this.$$url?a+this.$$url:"")},this.$$rewrite=function(a){return Wa(b)==Wa(a)?a:void 0}}function tc(b,a){this.$$html5=!0,Hb.apply(this,arguments);var c=Fb(b);this.$$rewrite=function(d){var e;return b==Wa(d)?d:(e=na(c,d))?b+a+e:c===d+"/"?c:void 0}}function ib(b){return function(){return this[b]}}function uc(b,a){return function(c){return u(c)?this[b]:(this[b]=a(c),this.$$compose(),this)}}function td(){var b="",a=!1;this.hashPrefix=function(a){return D(a)?(b=a,this):b},this.html5Mode=function(b){return D(b)?(a=b,this):a},this.$get=["$rootScope","$browser","$sniffer","$rootElement",function(c,d,e,g){function f(a){c.$broadcast("$locationChangeSuccess",h.absUrl(),a)}var h,m=d.baseHref(),k=d.url();a?(m=k.substring(0,k.indexOf("/",k.indexOf("//")+2))+(m||"/"),e=e.history?sc:tc):(m=Wa(k),e=Hb),h=new e(m,"#"+b),h.$$parse(h.$$rewrite(k)),g.on("click",function(a){if(!a.ctrlKey&&!a.metaKey&&2!=a.which){for(var b=z(a.target);"a"!==x(b[0].nodeName);)if(b[0]===g[0]||!(b=b.parent())[0])return;var e=b.prop("href");W(e)&&"[object SVGAnimatedString]"===e.toString()&&(e=xa(e.animVal).href);var f=h.$$rewrite(e);e&&!b.attr("target")&&f&&!a.isDefaultPrevented()&&(a.preventDefault(),f!=d.url()&&(h.$$parse(f),c.$apply(),P.angular["ff-684208-preventDefault"]=!0))}}),h.absUrl()!=k&&d.url(h.absUrl(),!0),d.onUrlChange(function(a){h.absUrl()!=a&&(c.$evalAsync(function(){var b=h.absUrl();h.$$parse(a),c.$broadcast("$locationChangeStart",a,b).defaultPrevented?(h.$$parse(b),d.url(b)):f(b)}),c.$$phase||c.$digest())});var l=0;return c.$watch(function(){var a=d.url(),b=h.$$replace;return l&&a==h.absUrl()||(l++,c.$evalAsync(function(){c.$broadcast("$locationChangeStart",h.absUrl(),a).defaultPrevented?h.$$parse(a):(d.url(h.absUrl(),b),f(a))})),h.$$replace=!1,l}),h}]}function ud(){var b=!0,a=this;this.debugEnabled=function(a){return D(a)?(b=a,this):b},this.$get=["$window",function(c){function d(a){return a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&(a=a.message+"\n"+a.sourceURL+":"+a.line)),a}function e(a){var b=c.console||{},e=b[a]||b.log||E;a=!1;try{a=!!e.apply}catch(m){}return a?function(){var a=[];return q(arguments,function(b){a.push(d(b))}),e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){b&&c.apply(a,arguments)}}()}}]}function da(b,a){if("constructor"===b)throw ya("isecfld",a);return b}function Xa(b,a){if(b){if(b.constructor===b)throw ya("isecfn",a);if(b.document&&b.location&&b.alert&&b.setInterval)throw ya("isecwindow",a);if(b.children&&(b.nodeName||b.on&&b.find))throw ya("isecdom",a)}return b}function jb(b,a,c,d,e){e=e||{},a=a.split(".");for(var g,f=0;1e?vc(d[0],d[1],d[2],d[3],d[4],c,a):function(b,g){var h,f=0;do h=vc(d[f++],d[f++],d[f++],d[f++],d[f++],c,a)(b,g),g=s,b=h;while(e>f);return h};else{var f="var p;\n";q(d,function(b,d){da(b,c),f+="if(s == null) return undefined;\ns="+(d?"s":'((k&&k.hasOwnProperty("'+b+'"))?k:s)')+'["'+b+'"];\n'+(a.unwrapPromises?'if (s && s.then) {\n pw("'+c.replace(/(["\r\n])/g,"\\$1")+'");\n if (!("$$v" in s)) {\n p=s;\n p.$$v = undefined;\n p.then(function(v) {p.$$v=v;});\n}\n s=s.$$v\n}\n':"")});var f=f+"return s;",h=new Function("s","k","pw",f);h.toString=Y(f),g=a.unwrapPromises?function(a,b){return h(a,b,qa)}:h}else g=wd(d[0],d[1],c);else g=vd(d[0],c);return"hasOwnProperty"!==b&&(Ib[b]=g),g}function xd(){var b={},a={csp:!1,unwrapPromises:!1,logPromiseWarnings:!0};this.unwrapPromises=function(b){return D(b)?(a.unwrapPromises=!!b,this):a.unwrapPromises},this.logPromiseWarnings=function(b){return D(b)?(a.logPromiseWarnings=b,this):a.logPromiseWarnings},this.$get=["$filter","$sniffer","$log",function(c,d,e){return a.csp=d.csp,qa=function(b){a.logPromiseWarnings&&!xc.hasOwnProperty(b)&&(xc[b]=!0,e.warn("[$parse] Promise found in the expression `"+b+"`. Automatic unwrapping of promises in Angular expressions is deprecated."))},function(d){var e;switch(typeof d){case"string":return b.hasOwnProperty(d)?b[d]:(e=new Jb(a),e=new Ya(e,c,a).parse(d,!1),"hasOwnProperty"!==d&&(b[d]=e),e);case"function":return d;default:return E}}}]}function yd(){this.$get=["$rootScope","$exceptionHandler",function(b,a){return zd(function(a){b.$evalAsync(a)},a)}]}function zd(b,a){function c(a){return a}function d(a){return f(a)}var e=function(){var k,l,f=[];return l={resolve:function(a){if(f){var c=f;f=s,k=g(a),c.length&&b(function(){for(var a,b=0,d=c.length;d>b;b++)a=c[b],k.then(a[0],a[1],a[2])})}},reject:function(a){l.resolve(h(a))},notify:function(a){if(f){var c=f;f.length&&b(function(){for(var b,d=0,e=c.length;e>d;d++)b=c[d],b[2](a)})}},promise:{then:function(b,g,h){var l=e(),A=function(d){try{l.resolve((M(b)?b:c)(d))}catch(e){l.reject(e),a(e)}},H=function(b){try{l.resolve((M(g)?g:d)(b))}catch(c){l.reject(c),a(c)}},v=function(b){try{l.notify((M(h)?h:c)(b))}catch(d){a(d)}};return f?f.push([A,H,v]):k.then(A,H,v),l.promise},"catch":function(a){return this.then(null,a)},"finally":function(a){function b(a,c){var d=e();return c?d.resolve(a):d.reject(a),d.promise}function d(e,g){var f=null;try{f=(a||c)()}catch(k){return b(k,!1)}return f&&M(f.then)?f.then(function(){return b(e,g)},function(a){return b(a,!1)}):b(e,g)}return this.then(function(a){return d(a,!0)},function(a){return d(a,!1)})}}}},g=function(a){return a&&M(a.then)?a:{then:function(c){var d=e();return b(function(){d.resolve(c(a))}),d.promise}}},f=function(a){var b=e();return b.reject(a),b.promise},h=function(c){return{then:function(g,f){var h=e();return b(function(){try{h.resolve((M(f)?f:d)(c))}catch(b){h.reject(b),a(b)}}),h.promise}}};return{defer:e,reject:f,when:function(h,k,l,n){var r,p=e(),F=function(b){try{return(M(k)?k:c)(b)}catch(d){return a(d),f(d)}},A=function(b){try{return(M(l)?l:d)(b)}catch(c){return a(c),f(c)}},q=function(b){try{return(M(n)?n:c)(b)}catch(d){a(d)}};return b(function(){g(h).then(function(a){r||(r=!0,p.resolve(g(a).then(F,A,q)))},function(a){r||(r=!0,p.resolve(A(a)))},function(a){r||p.notify(q(a))})}),p.promise},all:function(a){var b=e(),c=0,d=L(a)?[]:{};return q(a,function(a,e){c++,g(a).then(function(a){d.hasOwnProperty(e)||(d[e]=a,--c||b.resolve(d))},function(a){d.hasOwnProperty(e)||b.reject(a)})}),0===c&&b.resolve(d),b.promise}}}function Ad(){var b=10,a=t("$rootScope"),c=null;this.digestTtl=function(a){return arguments.length&&(b=a),b},this.$get=["$injector","$exceptionHandler","$parse","$browser",function(d,e,g,f){function h(){this.$id=Za(),this.$$phase=this.$parent=this.$$watchers=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null,this["this"]=this.$root=this,this.$$destroyed=!1,this.$$asyncQueue=[],this.$$postDigestQueue=[],this.$$listeners={},this.$$listenerCount={},this.$$isolateBindings={}}function m(b){if(p.$$phase)throw a("inprog",p.$$phase);p.$$phase=b}function k(a,b){var c=g(a);return Pa(c,b),c}function l(a,b,c){do a.$$listenerCount[c]-=b,0===a.$$listenerCount[c]&&delete a.$$listenerCount[c];while(a=a.$parent)}function n(){}h.prototype={constructor:h,$new:function(a){return a?(a=new h,a.$root=this.$root,a.$$asyncQueue=this.$$asyncQueue,a.$$postDigestQueue=this.$$postDigestQueue):(a=function(){},a.prototype=this,a=new a,a.$id=Za()),a["this"]=a,a.$$listeners={},a.$$listenerCount={},a.$parent=this,a.$$watchers=a.$$nextSibling=a.$$childHead=a.$$childTail=null,a.$$prevSibling=this.$$childTail,this.$$childHead?this.$$childTail=this.$$childTail.$$nextSibling=a:this.$$childHead=this.$$childTail=a,a},$watch:function(a,b,d){var e=k(a,"watch"),g=this.$$watchers,f={fn:b,last:n,get:e,exp:a,eq:!!d};if(c=null,!M(b)){var h=k(b||E,"listener");f.fn=function(a,b,c){h(c)}}if("string"==typeof a&&e.constant){var m=f.fn;f.fn=function(a,b,c){m.call(this,a,b,c),Ma(g,f)}}return g||(g=this.$$watchers=[]),g.unshift(f),function(){Ma(g,f),c=null}},$watchCollection:function(a,b){var d,e,c=this,f=0,h=g(a),k=[],m={},l=0;return this.$watch(function(){e=h(c);var a,b;if(W(e))if(qb(e))for(d!==k&&(d=k,l=d.length=0,f++),a=e.length,l!==a&&(f++,d.length=l=a),b=0;a>b;b++)d[b]!==e[b]&&(f++,d[b]=e[b]);else{d!==m&&(d=m={},l=0,f++),a=0;for(b in e)e.hasOwnProperty(b)&&(a++,d.hasOwnProperty(b)?d[b]!==e[b]&&(f++,d[b]=e[b]):(l++,d[b]=e[b],f++));if(l>a)for(b in f++,d)d.hasOwnProperty(b)&&!e.hasOwnProperty(b)&&(l--,delete d[b])}else d!==e&&(d=e,f++);return f},function(){b(e,d,c)})},$digest:function(){var d,f,g,h,q,C,I,t,z,B,k=this.$$asyncQueue,l=this.$$postDigestQueue,s=b,U=[];m("$digest"),c=null;do{for(C=!1,I=this;k.length;){try{B=k.shift(),B.scope.$eval(B.expression)}catch(D){p.$$phase=null,e(D)}c=null}a:do{if(h=I.$$watchers)for(q=h.length;q--;)try{if(d=h[q])if((f=d.get(I))===(g=d.last)||(d.eq?ta(f,g):"number"==typeof f&&"number"==typeof g&&isNaN(f)&&isNaN(g))){if(d===c){C=!1;break a}}else C=!0,c=d,d.last=d.eq?$(f):f,d.fn(f,g===n?f:g,I),5>s&&(t=4-s,U[t]||(U[t]=[]),z=M(d.exp)?"fn: "+(d.exp.name||d.exp.toString()):d.exp,z+="; newVal: "+pa(f)+"; oldVal: "+pa(g),U[t].push(z))}catch(y){p.$$phase=null,e(y)}if(!(h=I.$$childHead||I!==this&&I.$$nextSibling))for(;I!==this&&!(h=I.$$nextSibling);)I=I.$parent}while(I=h);if((C||k.length)&&!s--)throw p.$$phase=null,a("infdig",b,pa(U))}while(C||k.length);for(p.$$phase=null;l.length;)try{l.shift()()}catch(w){e(w)}},$destroy:function(){if(!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy"),this.$$destroyed=!0,this!==p&&(q(this.$$listenerCount,bb(null,l,this)),a.$$childHead==this&&(a.$$childHead=this.$$nextSibling),a.$$childTail==this&&(a.$$childTail=this.$$prevSibling),this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling),this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling),this.$parent=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null)}},$eval:function(a,b){return g(a)(this,b)},$evalAsync:function(a){p.$$phase||p.$$asyncQueue.length||f.defer(function(){p.$$asyncQueue.length&&p.$digest()}),this.$$asyncQueue.push({scope:this,expression:a})},$$postDigest:function(a){this.$$postDigestQueue.push(a)},$apply:function(a){try{return m("$apply"),this.$eval(a)}catch(b){e(b)}finally{p.$$phase=null;try{p.$digest()}catch(c){throw e(c),c}}},$on:function(a,b){var c=this.$$listeners[a];c||(this.$$listeners[a]=c=[]),c.push(b);var d=this;do d.$$listenerCount[a]||(d.$$listenerCount[a]=0),d.$$listenerCount[a]++;while(d=d.$parent);var e=this;return function(){c[ab(c,b)]=null,l(e,1,a)}},$emit:function(a){var d,m,l,c=[],f=this,g=!1,h={name:a,targetScope:f,stopPropagation:function(){g=!0},preventDefault:function(){h.defaultPrevented=!0},defaultPrevented:!1},k=[h].concat(ua.call(arguments,1));do{for(d=f.$$listeners[a]||c,h.currentScope=f,m=0,l=d.length;l>m;m++)if(d[m])try{d[m].apply(null,k)}catch(p){e(p)}else d.splice(m,1),m--,l--;if(g)break;f=f.$parent}while(f);return h},$broadcast:function(a){for(var h,k,c=this,d=this,f={name:a,targetScope:this,preventDefault:function(){f.defaultPrevented=!0},defaultPrevented:!1},g=[f].concat(ua.call(arguments,1));c=d;){for(f.currentScope=c,d=c.$$listeners[a]||[],h=0,k=d.length;k>h;h++)if(d[h])try{d[h].apply(null,g)}catch(m){e(m)}else d.splice(h,1),h--,k--;if(!(d=c.$$listenerCount[a]&&c.$$childHead||c!==this&&c.$$nextSibling))for(;c!==this&&!(d=c.$$nextSibling);)c=c.$parent}return f}};var p=new h;return p}]}function Bd(){var b=/^\s*(https?|ftp|mailto|tel|file):/,a=/^\s*(https?|ftp|file):|data:image\//;this.aHrefSanitizationWhitelist=function(a){return D(a)?(b=a,this):b},this.imgSrcSanitizationWhitelist=function(b){return D(b)?(a=b,this):a},this.$get=function(){return function(c,d){var g,e=d?a:b;return N&&!(N>=8)||(g=xa(c).href,""===g||g.match(e))?c:"unsafe:"+g}}}function Cd(b){if("self"===b)return b;if(w(b)){if(-1l;l++)if("self"===b[l]?Eb(g):b[l].exec(g.href)){p=!0;break}if(p)for(l=0,n=a.length;n>l;l++)if("self"===a[l]?Eb(g):a[l].exec(g.href)){p=!1;break}if(p)return d;throw ra("insecurl",d.toString())}if(c===ea.HTML)return e(d);throw ra("unsafe")},valueOf:function(a){return a instanceof g?a.$$unwrapTrustedValue():a}}}]}function Ed(){var b=!0;this.enabled=function(a){return arguments.length&&(b=!!a),b},this.$get=["$parse","$sniffer","$sceDelegate",function(a,c,d){if(b&&c.msie&&8>c.msieDocumentMode)throw ra("iequirks");var e=$(ea);e.isEnabled=function(){return b},e.trustAs=d.trustAs,e.getTrusted=d.getTrusted,e.valueOf=d.valueOf,b||(e.trustAs=e.getTrusted=function(a,b){return b},e.valueOf=Aa),e.parseAs=function(b,c){var d=a(c);return d.literal&&d.constant?d:function(a,c){return e.getTrusted(b,d(a,c))}};var g=e.parseAs,f=e.getTrusted,h=e.trustAs;return q(ea,function(a,b){var c=x(b);e[Qa("parse_as_"+c)]=function(b){return g(a,b)},e[Qa("get_trusted_"+c)]=function(b){return f(a,b)},e[Qa("trust_as_"+c)]=function(b){return h(a,b)}}),e}]}function Fd(){this.$get=["$window","$document",function(b,a){var h,c={},d=V((/android (\d+)/.exec(x((b.navigator||{}).userAgent))||[])[1]),e=/Boxee/i.test((b.navigator||{}).userAgent),g=a[0]||{},f=g.documentMode,m=/^(Moz|webkit|O|ms)(?=[A-Z])/,k=g.body&&g.body.style,l=!1,n=!1;if(k){for(var p in k)if(l=m.exec(p)){h=l[0],h=h.substr(0,1).toUpperCase()+h.substr(1);break}h||(h="WebkitOpacity"in k&&"webkit"),l=!!("transition"in k||h+"Transition"in k),n=!!("animation"in k||h+"Animation"in k),!d||l&&n||(l=w(g.body.style.webkitTransition),n=w(g.body.style.webkitAnimation))}return{history:!(!b.history||!b.history.pushState||4>d||e),hashchange:"onhashchange"in b&&(!f||f>7),hasEvent:function(a){if("input"==a&&9==N)return!1;if(u(c[a])){var b=g.createElement("div");c[a]="on"+a in b}return c[a]},csp:Sb(),vendorPrefix:h,transitions:l,animations:n,android:d,msie:N,msieDocumentMode:f}}]}function Gd(){this.$get=["$rootScope","$browser","$q","$exceptionHandler",function(b,a,c,d){function e(e,h,m){var k=c.defer(),l=k.promise,n=D(m)&&!m;return h=a.defer(function(){try{k.resolve(e())}catch(a){k.reject(a),d(a)}finally{delete g[l.$$timeoutId]}n||b.$apply()},h),l.$$timeoutId=h,g[h]=k,l}var g={};return e.cancel=function(b){return b&&b.$$timeoutId in g?(g[b.$$timeoutId].reject("canceled"),delete g[b.$$timeoutId],a.defer.cancel(b.$$timeoutId)):!1},e}]}function xa(b){var c=b;return N&&(T.setAttribute("href",c),c=T.href),T.setAttribute("href",c),{href:T.href,protocol:T.protocol?T.protocol.replace(/:$/,""):"",host:T.host,search:T.search?T.search.replace(/^\?/,""):"",hash:T.hash?T.hash.replace(/^#/,""):"",hostname:T.hostname,port:T.port,pathname:"/"===T.pathname.charAt(0)?T.pathname:"/"+T.pathname}}function Eb(b){return b=w(b)?xa(b):b,b.protocol===zc.protocol&&b.host===zc.host}function Hd(){this.$get=Y(P)}function Ac(b){function a(d,e){if(W(d)){var g={};return q(d,function(b,c){g[c]=a(c,b)}),g}return b.factory(d+c,e)}var c="Filter";this.register=a,this.$get=["$injector",function(a){return function(b){return a.get(b+c)}}],a("currency",Bc),a("date",Cc),a("filter",Id),a("json",Jd),a("limitTo",Kd),a("lowercase",Ld),a("number",Dc),a("orderBy",Ec),a("uppercase",Md)}function Id(){return function(b,a,c){if(!L(b))return b;var d=typeof c,e=[];e.check=function(a){for(var b=0;bb;b=Math.abs(b);var f=b+"",h="",m=[],k=!1;if(-1!==f.indexOf("e")){var l=f.match(/([\d\.]+)e(-?)(\d+)/);l&&"-"==l[2]&&l[3]>e+1?f="0":(h=f,k=!0)}if(k)e>0&&b>-1&&1>b&&(h=b.toFixed(e));else{f=(f.split(Gc)[1]||"").length,u(e)&&(e=Math.min(Math.max(a.minFrac,f),a.maxFrac)),f=Math.pow(10,e),b=Math.round(b*f)/f,b=(""+b).split(Gc),f=b[0],b=b[1]||"";var l=0,n=a.lgSize,p=a.gSize;if(f.length>=n+p)for(l=f.length-n,k=0;l>k;k++)0===(l-k)%p&&0!==k&&(h+=c),h+=f.charAt(k);for(k=l;kb&&(d="-",b=-b),b=""+b;b.length0||e>-c)&&(e+=c),0===e&&-12==c&&(e=12),Kb(e,a,d)}}function kb(b,a){return function(c,d){var e=c["get"+b](),g=Ha(a?"SHORT"+b:b);return d[g][e]}}function Cc(b){function a(a){var b;if(b=a.match(c)){a=new Date(0);var g=0,f=0,h=b[8]?a.setUTCFullYear:a.setFullYear,m=b[8]?a.setUTCHours:a.setHours;b[9]&&(g=V(b[9]+b[10]),f=V(b[9]+b[11])),h.call(a,V(b[1]),V(b[2])-1,V(b[3])),g=V(b[4]||0)-g,f=V(b[5]||0)-f,h=V(b[6]||0),b=Math.round(1e3*parseFloat("0."+(b[7]||0))),m.call(a,g,f,h,b)}return a}var c=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,e){var h,m,g="",f=[];if(e=e||"mediumDate",e=b.DATETIME_FORMATS[e]||e,w(c)&&(c=Nd.test(c)?V(c):a(c)),rb(c)&&(c=new Date(c)),!Ka(c))return c;for(;e;)(m=Od.exec(e))?(f=f.concat(ua.call(m,1)),e=f.pop()):(f.push(e),e=null);return q(f,function(a){h=Pd[a],g+=h?h(c,b.DATETIME_FORMATS):a.replace(/(^'|'$)/g,"").replace(/''/g,"'")}),g}}function Jd(){return function(b){return pa(b,!0)}}function Kd(){return function(b,a){if(!L(b)&&!w(b))return b;if(a=V(a),w(b))return a?a>=0?b.slice(0,a):b.slice(a,b.length):"";var d,e,c=[];for(a>b.length?a=b.length:a<-b.length&&(a=-b.length),a>0?(d=0,e=a):(d=b.length+a,e=b.length);e>d;d++)c.push(b[d]);return c}}function Ec(b){return function(a,c,d){function e(a,b){return Oa(b)?function(b,c){return a(c,b)}:a}if(!L(a)||!c)return a;c=L(c)?c:[c],c=Qc(c,function(a){var c=!1,d=a||Aa;return w(a)&&(("+"==a.charAt(0)||"-"==a.charAt(0))&&(c="-"==a.charAt(0),a=a.substring(1)),d=b(a)),e(function(a,b){var c;c=d(a);var e=d(b),f=typeof c,g=typeof e;return f==g?("string"==f&&(c=c.toLowerCase(),e=e.toLowerCase()),c=c===e?0:e>c?-1:1):c=g>f?-1:1,c},c)});for(var g=[],f=0;f15&&19>a||a>=37&&40>=a||k()}),e.hasEvent("paste")&&a.on("paste cut",k)}a.on("change",h),d.$render=function(){a.val(d.$isEmpty(d.$viewValue)?"":d.$viewValue)};var l=c.ngPattern;if(l&&((e=l.match(/^\/(.*)\/([gim]*)$/))?(l=RegExp(e[1],e[2]),e=function(a){return oa(d,"pattern",d.$isEmpty(a)||l.test(a),a)}):e=function(c){var e=b.$eval(l);if(!e||!e.test)throw t("ngPattern")("noregexp",l,e,fa(a));return oa(d,"pattern",d.$isEmpty(c)||e.test(c),c)},d.$formatters.push(e),d.$parsers.push(e)),c.ngMinlength){var n=V(c.ngMinlength);e=function(a){return oa(d,"minlength",d.$isEmpty(a)||a.length>=n,a)},d.$parsers.push(e),d.$formatters.push(e)}if(c.ngMaxlength){var p=V(c.ngMaxlength);e=function(a){return oa(d,"maxlength",d.$isEmpty(a)||a.length<=p,a)},d.$parsers.push(e),d.$formatters.push(e)}}function Lb(b,a){return b="ngClass"+b,function(){return{restrict:"AC",link:function(c,d,e){function g(b){if(!0===a||c.$index%2===a){var d=f(b||"");h?ta(b,h)||e.$updateClass(d,f(h)):e.$addClass(d)}h=$(b)}function f(a){if(L(a))return a.join(" ");if(W(a)){var b=[];return q(a,function(a,c){a&&b.push(c)}),b.join(" ")}return a}var h;c.$watch(e[b],g,!0),e.$observe("class",function(){g(c.$eval(e[b]))}),"ngClass"!==b&&c.$watch("$index",function(d,g){var h=1&d;if(h!==g&1){var n=f(c.$eval(e[b]));h===a?e.$addClass(n):e.$removeClass(n)}})}}}}var N,z,Ca,Ua,Ga,x=function(b){return w(b)?b.toLowerCase():b},Ha=function(b){return w(b)?b.toUpperCase():b},ua=[].slice,Qd=[].push,La=Object.prototype.toString,Na=t("ng"),Ba=P.angular||(P.angular={}),ia=["0","0","0"];N=V((/msie (\d+)/.exec(x(navigator.userAgent))||[])[1]),isNaN(N)&&(N=V((/trident\/.*; rv:(\d+)/.exec(x(navigator.userAgent))||[])[1])),E.$inject=[],Aa.$inject=[];var Z=function(){return String.prototype.trim?function(b){return w(b)?b.trim():b}:function(b){return w(b)?b.replace(/^\s\s*/,"").replace(/\s\s*$/,""):b}}();Ga=9>N?function(b){return b=b.nodeName?b:b[0],b.scopeName&&"HTML"!=b.scopeName?Ha(b.scopeName+":"+b.nodeName):b.nodeName}:function(b){return b.nodeName?b.nodeName:b[0].nodeName};var Tc=/[A-Z]/g,Rd={full:"1.2.12",major:1,minor:2,dot:12,codeName:"cauliflower-eradication"},Ra=O.cache={},db=O.expando="ng-"+(new Date).getTime(),Xc=1,Ic=P.document.addEventListener?function(b,a,c){b.addEventListener(a,c,!1)}:function(b,a,c){b.attachEvent("on"+a,c)},zb=P.document.removeEventListener?function(b,a,c){b.removeEventListener(a,c,!1)}:function(b,a,c){b.detachEvent("on"+a,c)},Vc=/([\:\-\_]+(.))/g,Wc=/^moz([A-Z])/,wb=t("jqLite"),Fa=O.prototype={ready:function(b){function a(){c||(c=!0,b())}var c=!1;"complete"===R.readyState?setTimeout(a):(this.on("DOMContentLoaded",a),O(P).on("load",a))},toString:function(){var b=[];return q(this,function(a){b.push(""+a)}),"["+b.join(", ")+"]"},eq:function(b){return z(b>=0?this[b]:this[this.length+b])},length:0,push:Qd,sort:[].sort,splice:[].splice},fb={};q("multiple selected checked disabled readOnly required open".split(" "),function(b){fb[x(b)]=b });var fc={};q("input select option textarea button form details".split(" "),function(b){fc[Ha(b)]=!0}),q({data:bc,inheritedData:eb,scope:function(b){return z(b).data("$scope")||eb(b.parentNode||b,["$isolateScope","$scope"])},isolateScope:function(b){return z(b).data("$isolateScope")||z(b).data("$isolateScopeNoTemplate")},controller:cc,injector:function(b){return eb(b,"$injector")},removeAttr:function(b,a){b.removeAttribute(a)},hasClass:Ab,css:function(b,a,c){if(a=Qa(a),!D(c)){var d;return 8>=N&&(d=b.currentStyle&&b.currentStyle[a],""===d&&(d="auto")),d=d||b.style[a],8>=N&&(d=""===d?s:d),d}b.style[a]=c},attr:function(b,a,c){var d=x(a);if(fb[d]){if(!D(c))return b[a]||(b.attributes.getNamedItem(a)||E).specified?d:s;c?(b[a]=!0,b.setAttribute(a,d)):(b[a]=!1,b.removeAttribute(d))}else if(D(c))b.setAttribute(a,c);else if(b.getAttribute)return b=b.getAttribute(a,2),null===b?s:b},prop:function(b,a,c){return D(c)?void(b[a]=c):b[a]},text:function(){function b(b,d){var e=a[b.nodeType];return u(d)?e?b[e]:"":void(b[e]=d)}var a=[];return 9>N?(a[1]="innerText",a[3]="nodeValue"):a[1]=a[3]="textContent",b.$dv="",b}(),val:function(b,a){if(u(a)){if("SELECT"===Ga(b)&&b.multiple){var c=[];return q(b.options,function(a){a.selected&&c.push(a.value||a.text)}),0===c.length?null:c}return b.value}b.value=a},html:function(b,a){if(u(a))return b.innerHTML;for(var c=0,d=b.childNodes;cf;f++){var h=b(this[f],a,d);e=e?e+h:h}return e}for(e=0;e":function(a,c,d,e){return d(a,c)>e(a,c)},"<=":function(a,c,d,e){return d(a,c)<=e(a,c)},">=":function(a,c,d,e){return d(a,c)>=e(a,c)},"&&":function(a,c,d,e){return d(a,c)&&e(a,c)},"||":function(a,c,d,e){return d(a,c)||e(a,c)},"&":function(a,c,d,e){return d(a,c)&e(a,c)},"|":function(a,c,d,e){return e(a,c)(a,c,d(a,c))},"!":function(a,c,d){return!d(a,c)}},Vd={n:"\n",f:"\f",r:"\r",t:" ",v:" ","'":"'",'"':'"'},Jb=function(a){this.options=a};Jb.prototype={constructor:Jb,lex:function(a){this.text=a,this.index=0,this.ch=s,this.lastCh=":",this.tokens=[];var c;for(a=[];this.index="0"&&"9">=a},isWhitespace:function(a){return" "===a||"\r"===a||" "===a||"\n"===a||" "===a||" "===a},isIdent:function(a){return a>="a"&&"z">=a||a>="A"&&"Z">=a||"_"===a||"$"===a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,c,d){throw d=d||this.index,c=D(c)?"s "+c+"-"+this.index+" ["+this.text.substring(c,d)+"]":" "+d,ya("lexerr",a,c,this.text)},readNumber:function(){for(var a="",c=this.index;this.index","<=",">="))&&(a=this.binaryFn(a,c.fn,this.relational())),a},additive:function(){for(var c,a=this.multiplicative();c=this.expect("+","-");)a=this.binaryFn(a,c.fn,this.multiplicative());return a},multiplicative:function(){for(var c,a=this.unary();c=this.expect("*","/","%");)a=this.binaryFn(a,c.fn,this.unary());return a},unary:function(){var a;return this.expect("+")?this.primary():(a=this.expect("-"))?this.binaryFn(Ya.ZERO,a.fn,this.unary()):(a=this.expect("!"))?this.unaryFn(a.fn,this.unary()):this.primary()},fieldAccess:function(a){var c=this,d=this.expect().text,e=wc(d,this.options,this.text);return y(function(c,d,h){return e(h||a(c,d))},{assign:function(e,f,h){return jb(a(e,h),d,f,c.text,c.options)}})},objectIndex:function(a){var c=this,d=this.expression();return this.consume("]"),y(function(e,g){var m,f=a(e,g),h=d(e,g);return f?((f=Xa(f[h],c.text))&&f.then&&c.options.unwrapPromises&&(m=f,"$$v"in f||(m.$$v=s,m.then(function(a){m.$$v=a})),f=f.$$v),f):s},{assign:function(e,g,f){var h=d(e,f);return Xa(a(e,f),c.text)[h]=g}})},functionCall:function(a,c){var d=[];if(")"!==this.peekToken().text)do d.push(this.expression());while(this.expect(","));this.consume(")");var e=this;return function(g,f){for(var h=[],m=c?c(g,f):g,k=0;ka.getHours()?c.AMPMS[0]:c.AMPMS[1]},Z:function(a){return a=-1*a.getTimezoneOffset(),a=(a>=0?"+":"")+(Kb(Math[a>0?"floor":"ceil"](a/60),2)+Kb(Math.abs(a%60),2))}},Od=/((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z))(.*)/,Nd=/^\-?\d+$/;Cc.$inject=["$locale"];var Ld=Y(x),Md=Y(Ha);Ec.$inject=["$parse"];var Wd=Y({restrict:"E",compile:function(a,c){return 8>=N&&(c.href||c.name||c.$set("href",""),a.append(R.createComment("IE fix"))),c.href||c.xlinkHref||c.name?void 0:function(a,c){var g="[object SVGAnimatedString]"===La.call(c.prop("href"))?"xlink:href":"href";c.on("click",function(a){c.attr(g)||a.preventDefault()})}}}),Mb={};q(fb,function(a,c){if("multiple"!=a){var d=la("ng-"+c);Mb[d]=function(){return{priority:100,link:function(a,g,f){a.$watch(f[d],function(a){f.$set(c,!!a)})}}}}}),q(["src","srcset","href"],function(a){var c=la("ng-"+a);Mb[c]=function(){return{priority:99,link:function(d,e,g){g.$observe(c,function(c){c&&(g.$set(a,c),N&&e.prop(a,g[a]))})}}}});var nb={$addControl:E,$removeControl:E,$setValidity:E,$setDirty:E,$setPristine:E};Hc.$inject=["$element","$attrs","$scope"];var Jc=function(a){return["$timeout",function(c){return{name:"form",restrict:a?"EAC":"E",controller:Hc,compile:function(){return{pre:function(a,e,g,f){if(!g.action){var h=function(a){a.preventDefault?a.preventDefault():a.returnValue=!1};Ic(e[0],"submit",h),e.on("$destroy",function(){c(function(){zb(e[0],"submit",h)},0,!1)})}var m=e.parent().controller("form"),k=g.name||g.ngForm;k&&jb(a,k,f,k),m&&e.on("$destroy",function(){m.$removeControl(f),k&&jb(a,k,s,k),y(f,nb)})}}}}}]},Xd=Jc(),Yd=Jc(!0),Zd=/^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/,$d=/^[a-z0-9!#$%&'*+/=?^_`{|}~.-]+@[a-z0-9-]+(\.[a-z0-9-]+)*$/i,ae=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/,Kc={text:pb,number:function(a,c,d,e,g,f){pb(a,c,d,e,g,f),e.$parsers.push(function(a){var c=e.$isEmpty(a);return c||ae.test(a)?(e.$setValidity("number",!0),""===a?null:c?a:parseFloat(a)):(e.$setValidity("number",!1),s)}),e.$formatters.push(function(a){return e.$isEmpty(a)?"":""+a}),d.min&&(a=function(a){var c=parseFloat(d.min);return oa(e,"min",e.$isEmpty(a)||a>=c,a)},e.$parsers.push(a),e.$formatters.push(a)),d.max&&(a=function(a){var c=parseFloat(d.max);return oa(e,"max",e.$isEmpty(a)||c>=a,a)},e.$parsers.push(a),e.$formatters.push(a)),e.$formatters.push(function(a){return oa(e,"number",e.$isEmpty(a)||rb(a),a)})},url:function(a,c,d,e,g,f){pb(a,c,d,e,g,f),a=function(a){return oa(e,"url",e.$isEmpty(a)||Zd.test(a),a)},e.$formatters.push(a),e.$parsers.push(a)},email:function(a,c,d,e,g,f){pb(a,c,d,e,g,f),a=function(a){return oa(e,"email",e.$isEmpty(a)||$d.test(a),a)},e.$formatters.push(a),e.$parsers.push(a)},radio:function(a,c,d,e){u(d.name)&&c.attr("name",Za()),c.on("click",function(){c[0].checked&&a.$apply(function(){e.$setViewValue(d.value)})}),e.$render=function(){c[0].checked=d.value==e.$viewValue},d.$observe("value",e.$render)},checkbox:function(a,c,d,e){var g=d.ngTrueValue,f=d.ngFalseValue;w(g)||(g=!0),w(f)||(f=!1),c.on("click",function(){a.$apply(function(){e.$setViewValue(c[0].checked)})}),e.$render=function(){c[0].checked=e.$viewValue},e.$isEmpty=function(a){return a!==g},e.$formatters.push(function(a){return a===g}),e.$parsers.push(function(a){return a?g:f})},hidden:E,button:E,submit:E,reset:E},Lc=["$browser","$sniffer",function(a,c){return{restrict:"E",require:"?ngModel",link:function(d,e,g,f){f&&(Kc[x(g.type)]||Kc.text)(d,e,g,f,c,a)}}}],mb="ng-valid",lb="ng-invalid",Ia="ng-pristine",ob="ng-dirty",be=["$scope","$exceptionHandler","$attrs","$element","$parse",function(a,c,d,e,g){function f(a,c){c=c?"-"+cb(c,"-"):"",e.removeClass((a?lb:mb)+c).addClass((a?mb:lb)+c)}this.$modelValue=this.$viewValue=Number.NaN,this.$parsers=[],this.$formatters=[],this.$viewChangeListeners=[],this.$pristine=!0,this.$dirty=!1,this.$valid=!0,this.$invalid=!1,this.$name=d.name;var h=g(d.ngModel),m=h.assign;if(!m)throw t("ngModel")("nonassign",d.ngModel,fa(e));this.$render=E,this.$isEmpty=function(a){return u(a)||""===a||null===a||a!==a};var k=e.inheritedData("$formController")||nb,l=0,n=this.$error={};e.addClass(Ia),f(!0),this.$setValidity=function(a,c){n[a]!==!c&&(c?(n[a]&&l--,l||(f(!0),this.$valid=!0,this.$invalid=!1)):(f(!1),this.$invalid=!0,this.$valid=!1,l++),n[a]=!c,f(c,a),k.$setValidity(a,c,this))},this.$setPristine=function(){this.$dirty=!1,this.$pristine=!0,e.removeClass(ob).addClass(Ia)},this.$setViewValue=function(d){this.$viewValue=d,this.$pristine&&(this.$dirty=!0,this.$pristine=!1,e.removeClass(Ia).addClass(ob),k.$setDirty()),q(this.$parsers,function(a){d=a(d)}),this.$modelValue!==d&&(this.$modelValue=d,m(a,d),q(this.$viewChangeListeners,function(a){try{a()}catch(d){c(d)}}))};var p=this;a.$watch(function(){var c=h(a);if(p.$modelValue!==c){var d=p.$formatters,e=d.length;for(p.$modelValue=c;e--;)c=d[e](c);p.$viewValue!==c&&(p.$viewValue=c,p.$render())}return c})}],ce=function(){return{require:["ngModel","^?form"],controller:be,link:function(a,c,d,e){var g=e[0],f=e[1]||nb;f.$addControl(g),a.$on("$destroy",function(){f.$removeControl(g)})}}},de=Y({require:"ngModel",link:function(a,c,d,e){e.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),Mc=function(){return{require:"?ngModel",link:function(a,c,d,e){if(e){d.required=!0;var g=function(a){return d.required&&e.$isEmpty(a)?void e.$setValidity("required",!1):(e.$setValidity("required",!0),a)};e.$formatters.push(g),e.$parsers.unshift(g),d.$observe("required",function(){g(e.$viewValue)})}}}},ee=function(){return{require:"ngModel",link:function(a,c,d,e){var g=(a=/\/(.*)\//.exec(d.ngList))&&RegExp(a[1])||d.ngList||",";e.$parsers.push(function(a){if(!u(a)){var c=[];return a&&q(a.split(g),function(a){a&&c.push(Z(a))}),c}}),e.$formatters.push(function(a){return L(a)?a.join(", "):s}),e.$isEmpty=function(a){return!a||!a.length}}}},fe=/^(true|false|\d+)$/,ge=function(){return{priority:100,compile:function(a,c){return fe.test(c.ngValue)?function(a,c,g){g.$set("value",a.$eval(g.ngValue))}:function(a,c,g){a.$watch(g.ngValue,function(a){g.$set("value",a)})}}}},he=sa(function(a,c,d){c.addClass("ng-binding").data("$binding",d.ngBind),a.$watch(d.ngBind,function(a){c.text(a==s?"":a)})}),ie=["$interpolate",function(a){return function(c,d,e){c=a(d.attr(e.$attr.ngBindTemplate)),d.addClass("ng-binding").data("$binding",c),e.$observe("ngBindTemplate",function(a){d.text(a)})}}],je=["$sce","$parse",function(a,c){return function(d,e,g){e.addClass("ng-binding").data("$binding",g.ngBindHtml);var f=c(g.ngBindHtml);d.$watch(function(){return(f(d)||"").toString()},function(){e.html(a.getTrustedHtml(f(d))||"")})}}],ke=Lb("",!0),le=Lb("Odd",0),me=Lb("Even",1),ne=sa({compile:function(a,c){c.$set("ngCloak",s),a.removeClass("ng-cloak")}}),oe=[function(){return{scope:!0,controller:"@",priority:500}}],Nc={};q("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var c=la("ng-"+a);Nc[c]=["$parse",function(d){return{compile:function(e,g){var f=d(g[c]);return function(c,d){d.on(x(a),function(a){c.$apply(function(){f(c,{$event:a})})})}}}}]});var pe=["$animate",function(a){return{transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(c,d,e,g,f){var h,m;c.$watch(e.ngIf,function(g){Oa(g)?m||(m=c.$new(),f(m,function(c){c[c.length++]=R.createComment(" end ngIf: "+e.ngIf+" "),h={clone:c},a.enter(c,d.parent(),d)})):(m&&(m.$destroy(),m=null),h&&(a.leave(ub(h.clone)),h=null))})}}}],qe=["$http","$templateCache","$anchorScroll","$animate","$sce",function(a,c,d,e,g){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:Ba.noop,compile:function(f,h){var m=h.ngInclude||h.src,k=h.onload||"",l=h.autoscroll;return function(f,h,q,s,A){var v,z,t=0,K=function(){v&&(v.$destroy(),v=null),z&&(e.leave(z),z=null)};f.$watch(g.parseAsResourceUrl(m),function(g){var m=function(){!D(l)||l&&!f.$eval(l)||d()},q=++t;g?(a.get(g,{cache:c}).success(function(a){if(q===t){var c=f.$new();s.template=a,a=A(c,function(a){K(),e.enter(a,null,h,m)}),v=c,z=a,v.$emit("$includeContentLoaded"),f.$eval(k)}}).error(function(){q===t&&K()}),f.$emit("$includeContentRequested")):(K(),s.template=null)})}}}}],re=["$compile",function(a){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(c,d,e,g){d.html(g.template),a(d.contents())(c)}}}],se=sa({priority:450,compile:function(){return{pre:function(a,c,d){a.$eval(d.ngInit)}}}}),te=sa({terminal:!0,priority:1e3}),ue=["$locale","$interpolate",function(a,c){var d=/{}/g;return{restrict:"EA",link:function(e,g,f){var h=f.count,m=f.$attr.when&&g.attr(f.$attr.when),k=f.offset||0,l=e.$eval(m)||{},n={},p=c.startSymbol(),r=c.endSymbol(),s=/^when(Minus)?(.+)$/;q(f,function(a,c){s.test(c)&&(l[x(c.replace("when","").replace("Minus","-"))]=g.attr(f.$attr[c]))}),q(l,function(a,e){n[e]=c(a.replace(d,p+h+"-"+k+r))}),e.$watch(function(){var c=parseFloat(e.$eval(h));return isNaN(c)?"":(c in l||(c=a.pluralCat(c-k)),n[c](e,g,!0))},function(a){g.text(a)})}}}],ve=["$parse","$animate",function(a,c){var d=t("ngRepeat");return{transclude:"element",priority:1e3,terminal:!0,$$tlb:!0,link:function(e,g,f,h,m){var n,p,r,s,A,t,k=f.ngRepeat,l=k.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?\s*$/),v={$id:Ea};if(!l)throw d("iexp",k);if(f=l[1],h=l[2],(l=l[3])?(n=a(l),p=function(a,c,d){return t&&(v[t]=a),v[A]=c,v.$index=d,n(e,v)}):(r=function(a,c){return Ea(c)},s=function(a){return a}),l=f.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/),!l)throw d("iidexp",f);A=l[3]||l[1],t=l[2];var D={};e.$watchCollection(h,function(a){var f,h,n,y,B,w,u,S,E,l=g[0],v={},x=[];if(qb(a))S=a,n=p||r;else{n=p||s,S=[];for(w in a)a.hasOwnProperty(w)&&"$"!=w.charAt(0)&&S.push(w);S.sort()}for(y=S.length,h=x.length=S.length,f=0;h>f;f++)if(w=a===S?f:S[f],u=a[w],u=n(w,u,f),wa(u,"`track by` id"),D.hasOwnProperty(u))E=D[u],delete D[u],v[u]=E,x[f]=E;else{if(v.hasOwnProperty(u))throw q(x,function(a){a&&a.scope&&(D[a.id]=a)}),d("dupes",k,u);x[f]={id:u},v[u]=!1}for(w in D)D.hasOwnProperty(w)&&(E=D[w],f=ub(E.clone),c.leave(f),q(f,function(a){a.$$NG_REMOVED=!0}),E.scope.$destroy());for(f=0,h=S.length;h>f;f++){if(w=a===S?f:S[f],u=a[w],E=x[f],x[f-1]&&(l=x[f-1].clone[x[f-1].clone.length-1]),E.scope){B=E.scope,n=l;do n=n.nextSibling;while(n&&n.$$NG_REMOVED);E.clone[0]!=n&&c.move(ub(E.clone),null,z(l)),l=E.clone[E.clone.length-1]}else B=e.$new();B[A]=u,t&&(B[t]=w),B.$index=f,B.$first=0===f,B.$last=f===y-1,B.$middle=!(B.$first||B.$last),B.$odd=!(B.$even=0===(1&f)),E.scope||m(B,function(a){a[a.length++]=R.createComment(" end ngRepeat: "+k+" "),c.enter(a,null,z(l)),l=a,E.scope=B,E.clone=a,v[E.id]=E})}D=v})}}}],we=["$animate",function(a){return function(c,d,e){c.$watch(e.ngShow,function(c){a[Oa(c)?"removeClass":"addClass"](d,"ng-hide")})}}],xe=["$animate",function(a){return function(c,d,e){c.$watch(e.ngHide,function(c){a[Oa(c)?"addClass":"removeClass"](d,"ng-hide")})}}],ye=sa(function(a,c,d){a.$watch(d.ngStyle,function(a,d){d&&a!==d&&q(d,function(a,d){c.css(d,"")}),a&&c.css(a)},!0)}),ze=["$animate",function(a){return{restrict:"EA",require:"ngSwitch",controller:["$scope",function(){this.cases={}}],link:function(c,d,e,g){var f,h,m=[];c.$watch(e.ngSwitch||e.on,function(d){for(var l=0,n=m.length;n>l;l++)m[l].$destroy(),a.leave(h[l]);h=[],m=[],(f=g.cases["!"+d]||g.cases["?"])&&(c.$eval(e.change),q(f,function(d){var e=c.$new();m.push(e),d.transclude(e,function(c){var e=d.element;h.push(c),a.enter(c,e.parent(),e)})}))})}}}],Ae=sa({transclude:"element",priority:800,require:"^ngSwitch",link:function(a,c,d,e,g){e.cases["!"+d.ngSwitchWhen]=e.cases["!"+d.ngSwitchWhen]||[],e.cases["!"+d.ngSwitchWhen].push({transclude:g,element:c})}}),Be=sa({transclude:"element",priority:800,require:"^ngSwitch",link:function(a,c,d,e,g){e.cases["?"]=e.cases["?"]||[],e.cases["?"].push({transclude:g,element:c})}}),Ce=sa({controller:["$element","$transclude",function(a,c){if(!c)throw t("ngTransclude")("orphan",fa(a));this.$transclude=c}],link:function(a,c,d,e){e.$transclude(function(a){c.empty(),c.append(a)})}}),De=["$templateCache",function(a){return{restrict:"E",terminal:!0,compile:function(c,d){"text/ng-template"==d.type&&a.put(d.id,c[0].text)}}}],Ee=t("ngOptions"),Fe=Y({terminal:!0}),Ge=["$compile","$parse",function(a,c){var d=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/,e={$setViewValue:E};return{restrict:"E",require:["select","?ngModel"],controller:["$element","$scope","$attrs",function(a,c,d){var n,m=this,k={},l=e;m.databound=d.ngModel,m.init=function(a,c,d){l=a,n=d},m.addOption=function(c){wa(c,'"option value"'),k[c]=!0,l.$viewValue==c&&(a.val(c),n.parent()&&n.remove())},m.removeOption=function(a){this.hasOption(a)&&(delete k[a],l.$viewValue==a&&this.renderUnknownOption(a))},m.renderUnknownOption=function(c){c="? "+Ea(c)+" ?",n.val(c),a.prepend(n),a.val(c),n.prop("selected",!0)},m.hasOption=function(a){return k.hasOwnProperty(a)},c.$on("$destroy",function(){m.renderUnknownOption=E})}],link:function(e,f,h,m){function k(a,c,d,e){d.$render=function(){var a=d.$viewValue;e.hasOption(a)?(y.parent()&&y.remove(),c.val(a),""===a&&w.prop("selected",!0)):u(a)&&w?c.val(""):e.renderUnknownOption(a)},c.on("change",function(){a.$apply(function(){y.parent()&&y.remove(),d.$setViewValue(c.val())})})}function l(a,c,d){var e;d.$render=function(){var a=new Sa(d.$viewValue);q(c.find("option"),function(c){c.selected=D(a.get(c.value))})},a.$watch(function(){ta(e,d.$viewValue)||(e=$(d.$viewValue),d.$render())}),c.on("change",function(){a.$apply(function(){var a=[];q(c.find("option"),function(c){c.selected&&a.push(c.value)}),d.$setViewValue(a)})})}function n(e,f,g){function h(){var d,k,s,t,u,a={"":[]},c=[""];t=g.$modelValue,u=z(e)||[];var F,J,x,C=n?Nb(u):u;J={},s=!1;var B,H;if(r)if(w&&L(t))for(s=new Sa([]),x=0;xx;x++){if(k=x,n){if(k=C[x],"$"===k.charAt(0))continue;J[n]=k}J[m]=u[k],d=p(e,J)||"",(k=a[d])||(k=a[d]=[],c.push(d)),r?d=D(s.remove(w?w(e,J):q(e,J))):(w?(d={},d[m]=t,d=w(e,d)===w(e,J)):d=t===q(e,J),s=s||d),B=l(e,J),B=D(B)?B:"",k.push({id:w?w(e,J):n?C[x]:x,label:B,selected:d})}for(r||(A||null===t?a[""].unshift({id:"",label:"",selected:!s}):s||a[""].unshift({id:"?",label:"",selected:!0})),J=0,C=c.length;C>J;J++){for(d=c[J],k=a[d],y.length<=J?(t={element:E.clone().attr("label",d),label:k.label},u=[t],y.push(u),f.append(t.element)):(u=y[J],t=u[0],t.label!=d&&t.element.attr("label",t.label=d)),B=null,x=0,F=k.length;F>x;x++)s=k[x],(d=u[x+1])?(B=d.element,d.label!==s.label&&B.text(d.label=s.label),d.id!==s.id&&B.val(d.id=s.id),B[0].selected!==s.selected&&B.prop("selected",d.selected=s.selected)):(""===s.id&&A?H=A:(H=v.clone()).val(s.id).attr("selected",s.selected).text(s.label),u.push({element:H,label:s.label,id:s.id,selected:s.selected}),B?B.after(H):t.element.append(H),B=H);for(x++;u.length>x;)u.pop().element.remove() diff --git a/public/js/main.min.js b/public/js/main.min.js index ade12de..7e902c3 100644 --- a/public/js/main.min.js +++ b/public/js/main.min.js @@ -1,2 +1,2 @@ -/*! insight-bitcore 0.1.2 */ +/*! insight-bitcore 0.1.3 */ angular.module("insight",["ngAnimate","ngResource","ngRoute","ngProgress","ui.bootstrap","ui.route","monospaced.qrcode","insight.system","insight.socket","insight.blocks","insight.transactions","insight.address","insight.search","insight.status","insight.connection","insight.currency"]),angular.module("insight.system",[]),angular.module("insight.socket",[]),angular.module("insight.blocks",[]),angular.module("insight.transactions",[]),angular.module("insight.address",[]),angular.module("insight.search",[]),angular.module("insight.status",[]),angular.module("insight.connection",[]),angular.module("insight.currency",[]),angular.module("insight.address").controller("AddressController",function($scope,$rootScope,$routeParams,$location,Global,Address,getSocket){$scope.global=Global,$scope.findOne=function(){$rootScope.currentAddr=$routeParams.addrStr,Address.get({addrStr:$routeParams.addrStr},function(address){$rootScope.titleDetail=address.addrStr.substring(0,7)+"...",$rootScope.flashMessage=null,$scope.address=address},function(e){$rootScope.flashMessage=400===e.status?"Invalid Address: "+$routeParams.addrStr:503===e.status?"Backend Error. "+e.data:"Address Not Found",$location.path("/")})};var socket=getSocket($scope);socket.on("connect",function(){socket.emit("subscribe",$routeParams.addrStr),socket.on($routeParams.addrStr,function(tx){console.log("AddressTx event received "+tx),$rootScope.$broadcast("tx",tx)})}),$scope.params=$routeParams}),angular.module("insight.blocks").controller("BlocksController",function($scope,$rootScope,$routeParams,$location,Global,Block,Blocks,BlockByHeight){$scope.global=Global,$scope.loading=!1,$routeParams.blockHeight&&BlockByHeight.get({blockHeight:$routeParams.blockHeight},function(hash){$location.path("/block/"+hash.blockHash)},function(){$rootScope.flashMessage="Bad Request",$location.path("/")});var _formatTimestamp=function(date){var yyyy=date.getUTCFullYear().toString(),mm=(date.getUTCMonth()+1).toString(),dd=date.getUTCDate().toString();return yyyy+"-"+(mm[1]?mm:"0"+mm[0])+"-"+(dd[1]?dd:"0"+dd[0])};$scope.$watch("dt",function(newValue,oldValue){newValue!==oldValue&&$location.path("/blocks-date/"+_formatTimestamp(newValue))}),$scope.openCalendar=function($event){$event.preventDefault(),$event.stopPropagation(),$scope.opened=!0},$scope.humanSince=function(time){var m=moment.unix(time).startOf("day"),b=moment().startOf("day");return m.max().from(b)},$scope.list=function(){$scope.loading=!0,$routeParams.blockDate&&($rootScope.titleDetail="on "+$routeParams.blockDate),Blocks.get({blockDate:$routeParams.blockDate},function(res){$scope.loading=!1,$scope.blocks=res.blocks,$scope.pagination=res.pagination})},$scope.findOne=function(){$scope.loading=!0,Block.get({blockHash:$routeParams.blockHash},function(block){$rootScope.titleDetail=block.height,$rootScope.flashMessage=null,$scope.loading=!1,$scope.block=block},function(e){$rootScope.flashMessage=400===e.status?"Invalid Transaction ID: "+$routeParams.txId:503===e.status?"Backend Error. "+e.data:"Block Not Found",$location.path("/")})},$scope.params=$routeParams}),angular.module("insight.connection").controller("ConnectionController",function($scope,$window,Status,getSocket,PeerSync){$scope.apiOnline=!0,$scope.serverOnline=!0,$scope.clienteOnline=!0;var socket=getSocket($scope);socket.on("connect",function(){$scope.serverOnline=!0,socket.on("disconnect",function(){$scope.serverOnline=!1})}),$scope.getConnStatus=function(){PeerSync.get({},function(peer){$scope.apiOnline=peer.connected,$scope.host=peer.host,$scope.port=peer.port},function(){$scope.apiOnline=!1})},socket.emit("subscribe","sync"),socket.on("status",function(sync){$scope.sync=sync,$scope.apiOnline="aborted"!==sync.status&&"error"!==sync.status}),$window.addEventListener("offline",function(){$scope.$apply(function(){$scope.clienteOnline=!1})},!0),$window.addEventListener("online",function(){$scope.$apply(function(){$scope.clienteOnline=!0})},!0)}),angular.module("insight.currency").controller("CurrencyController",function($scope,$rootScope,Currency){var _roundFloat=function(x,n){return parseInt(n,10)&&parseFloat(x)||(n=0),Math.round(x*Math.pow(10,n))/Math.pow(10,n)};$rootScope.currency.getConvertion=function(value){if("undefined"!=typeof value&&null!==value){var response;return"USD"===this.symbol?response=_roundFloat(value*this.factor,2):"mBTC"===this.symbol?(this.factor=1e3,response=_roundFloat(value*this.factor,5)):(this.factor=1,response=value),response+" "+this.symbol}return"value error"},$scope.setCurrency=function(currency){$rootScope.currency.symbol=currency,"USD"===currency?Currency.get({},function(res){$rootScope.currency.factor=$rootScope.currency.bitstamp=res.data.bitstamp}):$rootScope.currency.factor="mBTC"===currency?1e3:1},Currency.get({},function(res){$rootScope.currency.bitstamp=res.data.bitstamp})}),angular.module("insight.system").controller("FooterController",function($scope,Version){var _getVersion=function(){Version.get({},function(res){$scope.version=res.version})};$scope.version=_getVersion()}),angular.module("insight.system").controller("HeaderController",function($scope,$rootScope,getSocket,Global,Block){$scope.global=Global,$rootScope.currency={factor:1,bitstamp:0,symbol:"BTC"},$scope.menu=[{title:"Blocks",link:"blocks"},{title:"Status",link:"status"}];var _getBlock=function(hash){Block.get({blockHash:hash},function(res){$scope.totalBlocks=res.height})},socket=getSocket($scope);socket.on("connect",function(){socket.emit("subscribe","inv"),socket.on("block",function(block){var blockHash=block.toString();_getBlock(blockHash)})}),$rootScope.isCollapsed=!0});var TRANSACTION_DISPLAYED=10,BLOCKS_DISPLAYED=5;angular.module("insight.system").controller("IndexController",function($scope,Global,getSocket,Blocks){$scope.global=Global;var _getBlocks=function(){Blocks.get({limit:BLOCKS_DISPLAYED},function(res){$scope.blocks=res.blocks,$scope.blocksLength=res.lenght})},socket=getSocket($scope);socket.on("connect",function(){socket.emit("subscribe","inv"),socket.on("tx",function(tx){$scope.txs.unshift(tx),parseInt($scope.txs.length,10)>=parseInt(TRANSACTION_DISPLAYED,10)&&($scope.txs=$scope.txs.splice(0,TRANSACTION_DISPLAYED))}),socket.on("block",function(){_getBlocks()})}),$scope.humanSince=function(time){var m=moment.unix(time);return m.max().fromNow()},$scope.index=function(){_getBlocks()},$scope.txs=[],$scope.blocks=[]}),angular.module("insight.search").controller("SearchController",function($scope,$routeParams,$location,$timeout,Global,Block,Transaction,Address,BlockByHeight){$scope.global=Global,$scope.loading=!1;var _badQuery=function(){$scope.badQuery=!0,$timeout(function(){$scope.badQuery=!1},2e3)},_resetSearch=function(){$scope.q="",$scope.loading=!1};$scope.search=function(){var q=$scope.q;$scope.badQuery=!1,$scope.loading=!0,Block.get({blockHash:q},function(){_resetSearch(),$location.path("block/"+q)},function(){Transaction.get({txId:q},function(){_resetSearch(),$location.path("tx/"+q)},function(){Address.get({addrStr:q},function(){_resetSearch(),$location.path("address/"+q)},function(){isFinite(q)?BlockByHeight.get({blockHeight:q},function(hash){_resetSearch(),$location.path("/block/"+hash.blockHash)},function(){_badQuery()}):($scope.loading=!1,_badQuery())})})})}}),angular.module("insight.status").controller("StatusController",function($scope,$routeParams,$location,Global,Status,Sync,getSocket){$scope.global=Global,$scope.getStatus=function(q){Status.get({q:"get"+q},function(d){$scope.loaded=1,angular.extend($scope,d)},function(e){$scope.error="API ERROR: "+e.data})},$scope.humanSince=function(time){var m=moment.unix(time/1e3);return m.max().fromNow()};var _onSyncUpdate=function(sync){$scope.sync=sync};$scope.getSync=function(){Sync.get({},function(sync){_onSyncUpdate(sync)},function(e){var err="Could not get sync information"+e.toString();$scope.sync={error:err}})};var socket=getSocket($scope);socket.on("connect",function(){socket.emit("subscribe","sync"),socket.on("status",function(sync){_onSyncUpdate(sync)})})}),angular.module("insight.transactions").controller("transactionsController",function($scope,$rootScope,$routeParams,$location,Global,Transaction,TransactionsByBlock,TransactionsByAddress){$scope.global=Global,$scope.loading=!1,$scope.loadedBy=null;var pageNum=0,pagesTotal=1,COIN=1e8,_aggregateItems=function(items){if(!items)return[];for(var l=items.length,ret=[],tmp={},u=0,i=0;l>i;i++){var notAddr=!1;if(items[i].scriptSig&&!items[i].addr&&(items[i].addr="Unparsed address ["+u++ +"]",items[i].notAddr=!0,notAddr=!0),items[i].scriptPubKey&&!items[i].scriptPubKey.addresses&&(items[i].scriptPubKey.addresses=["Unparsed address ["+u++ +"]"],items[i].notAddr=!0,notAddr=!0),items[i].scriptPubKey&&items[i].scriptPubKey.addresses.length>1)items[i].addr=items[i].scriptPubKey.addresses.join(","),ret.push(items[i]);else{var addr=items[i].addr||items[i].scriptPubKey&&items[i].scriptPubKey.addresses[0];tmp[addr]||(tmp[addr]={},tmp[addr].valueSat=0,tmp[addr].count=0,tmp[addr].addr=addr,tmp[addr].items=[]),tmp[addr].isSpent=items[i].spentTxId,tmp[addr].doubleSpentTxID=tmp[addr].doubleSpentTxID||items[i].doubleSpentTxID,tmp[addr].doubleSpentIndex=tmp[addr].doubleSpentIndex||items[i].doubleSpentIndex,tmp[addr].unconfirmedInput+=items[i].unconfirmedInput,tmp[addr].dbError=tmp[addr].dbError||items[i].dbError,tmp[addr].valueSat+=Math.round(items[i].value*COIN),tmp[addr].items.push(items[i]),tmp[addr].notAddr=notAddr,tmp[addr].count++}}return angular.forEach(tmp,function(v){v.value=v.value||parseInt(v.valueSat)/COIN,ret.push(v)}),ret},_processTX=function(tx){tx.vinSimple=_aggregateItems(tx.vin),tx.voutSimple=_aggregateItems(tx.vout)},_paginate=function(data){$scope.loading=!1,pagesTotal=data.pagesTotal,pageNum+=1,data.txs.forEach(function(tx){_processTX(tx),$scope.txs.push(tx)})},_byBlock=function(){TransactionsByBlock.get({block:$routeParams.blockHash,pageNum:pageNum},function(data){_paginate(data)})},_byAddress=function(){TransactionsByAddress.get({address:$routeParams.addrStr,pageNum:pageNum},function(data){_paginate(data)})},_findTx=function(txid){Transaction.get({txId:txid},function(tx){$rootScope.titleDetail=tx.txid.substring(0,7)+"...",$rootScope.flashMessage=null,$scope.tx=tx,_processTX(tx),$scope.txs.unshift(tx)},function(e){$rootScope.flashMessage=400===e.status?"Invalid Transaction ID: "+$routeParams.txId:503===e.status?"Backend Error. "+e.data:"Transaction Not Found",$location.path("/")})};$scope.findThis=function(){_findTx($routeParams.txId)},$scope.load=function(from){$scope.loadedBy=from,$scope.loadMore()},$scope.loadMore=function(){pagesTotal>pageNum&&!$scope.loading&&($scope.loading=!0,"address"===$scope.loadedBy?_byAddress():_byBlock())},(">"==$routeParams.v_type||"<"==$routeParams.v_type)&&($scope.from_vin="<"==$routeParams.v_type?!0:!1,$scope.from_vout=">"==$routeParams.v_type?!0:!1,$scope.v_index=parseInt($routeParams.v_index),$scope.itemsExpanded=!0),$scope.txs=[],$scope.$on("tx",function(event,txid){_findTx(txid)})}),angular.module("insight.address").factory("Address",function($resource){return $resource("/api/addr/:addrStr",{addrStr:"@addStr"},{get:{method:"GET",interceptor:{response:function(res){return res.data},responseError:function(res){return 404===res.status?res:void 0}}}})}),angular.module("insight.blocks").factory("Block",function($resource){return $resource("/api/block/:blockHash",{blockHash:"@blockHash"},{get:{method:"GET",interceptor:{response:function(res){return res.data},responseError:function(res){return 404===res.status?res:void 0}}}})}).factory("Blocks",function($resource){return $resource("/api/blocks")}).factory("BlockByHeight",function($resource){return $resource("/api/block-index/:blockHeight")}),angular.module("insight.currency").factory("Currency",function($resource){return $resource("/api/currency")}),angular.module("insight.system").factory("Global",[function(){}]).factory("Version",function($resource){return $resource("/api/version")});var ScopedSocket=function(socket,$rootScope){this.socket=socket,this.$rootScope=$rootScope,this.listeners=[]};ScopedSocket.prototype.removeAllListeners=function(opts){opts||(opts={});for(var i=0;i=200?!0:!1,scope.$apply()})}}).directive("whenScrolled",function($window){return{restric:"A",link:function(scope,elm,attr){var pageHeight,clientHeight,scrollPos;$window=angular.element($window);var handler=function(){pageHeight=window.document.documentElement.scrollHeight,clientHeight=window.document.documentElement.clientHeight,scrollPos=window.pageYOffset,pageHeight-(scrollPos+clientHeight)===0&&scope.$apply(attr.whenScrolled)};$window.on("scroll",handler),scope.$on("$destroy",function(){return $window.off("scroll",handler)})}}}).directive("clipCopy",function(){return ZeroClipboard.config({moviePath:"/lib/zeroclipboard/ZeroClipboard.swf",trustedDomains:["*"],allowScriptAccess:"always",forceHandCursor:!0}),{restric:"A",scope:{clipCopy:"=clipCopy"},template:'
Copied!
',link:function(scope,elm){var clip=new ZeroClipboard(elm);clip.on("load",function(client){var onMousedown=function(client){client.setText(scope.clipCopy)};client.on("mousedown",onMousedown),scope.$on("$destroy",function(){client.off("mousedown",onMousedown)})}),clip.on("noFlash wrongflash",function(){return elm.remove()})}}}),angular.module("insight").filter("startFrom",function(){return function(input,start){return start=+start,input.slice(start)}}),angular.module("insight").config(function($routeProvider){$routeProvider.when("/block/:blockHash",{templateUrl:"/views/block.html",title:"Bitcoin Block "}).when("/block-index/:blockHeight",{controller:"BlocksController",templateUrl:"/views/redirect.html"}).when("/tx/:txId/:v_type?/:v_index?",{templateUrl:"/views/transaction.html",title:"Bitcoin Transaction "}).when("/",{templateUrl:"/views/index.html",title:"Home"}).when("/blocks",{templateUrl:"/views/block_list.html",title:"Bitcoin Blocks solved Today"}).when("/blocks-date/:blockDate",{templateUrl:"/views/block_list.html",title:"Bitcoin Blocks solved "}).when("/address/:addrStr",{templateUrl:"/views/address.html",title:"Bitcoin Address "}).when("/status",{templateUrl:"/views/status.html",title:"Status"}).otherwise({templateUrl:"/views/404.html",title:"Error"})}),angular.module("insight").config(function($locationProvider){$locationProvider.html5Mode(!0),$locationProvider.hashPrefix("!")}).run(function($rootScope,$route,ngProgress){$rootScope.$on("$routeChangeStart",function(){ngProgress.start()}),$rootScope.$on("$routeChangeSuccess",function(){ngProgress.complete(),$rootScope.titleDetail="",$rootScope.title=$route.current.title,$rootScope.isCollapsed=!0,$rootScope.currentAddr=null})}),angular.element(document).ready(function(){}); \ No newline at end of file diff --git a/public/js/vendors.min.js b/public/js/vendors.min.js index 120c61c..5271aea 100644 --- a/public/js/vendors.min.js +++ b/public/js/vendors.min.js @@ -1,3 +1,3 @@ -/*! insight-bitcore 0.1.2 */ +/*! insight-bitcore 0.1.3 */ (function(a){function b(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function c(a,b){return function(c){return k(a.call(this,c),b)}}function d(a,b){return function(c){return this.lang().ordinal(a.call(this,c),b)}}function e(){}function f(a){w(a),h(this,a)}function g(a){var b=q(a),c=b.year||0,d=b.month||0,e=b.week||0,f=b.day||0,g=b.hour||0,h=b.minute||0,i=b.second||0,j=b.millisecond||0;this._milliseconds=+j+1e3*i+6e4*h+36e5*g,this._days=+f+7*e,this._months=+d+12*c,this._data={},this._bubble()}function h(a,b){for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return b.hasOwnProperty("toString")&&(a.toString=b.toString),b.hasOwnProperty("valueOf")&&(a.valueOf=b.valueOf),a}function i(a){var b,c={};for(b in a)a.hasOwnProperty(b)&&qb.hasOwnProperty(b)&&(c[b]=a[b]);return c}function j(a){return 0>a?Math.ceil(a):Math.floor(a)}function k(a,b,c){for(var d=""+Math.abs(a),e=a>=0;d.lengthd;d++)(c&&a[d]!==b[d]||!c&&s(a[d])!==s(b[d]))&&g++;return g+f}function p(a){if(a){var b=a.toLowerCase().replace(/(.)s$/,"$1");a=Tb[a]||Ub[b]||b}return a}function q(a){var b,c,d={};for(c in a)a.hasOwnProperty(c)&&(b=p(c),b&&(d[b]=a[c]));return d}function r(b){var c,d;if(0===b.indexOf("week"))c=7,d="day";else{if(0!==b.indexOf("month"))return;c=12,d="month"}db[b]=function(e,f){var g,h,i=db.fn._lang[b],j=[];if("number"==typeof e&&(f=e,e=a),h=function(a){var b=db().utc().set(d,a);return i.call(db.fn._lang,b,e||"")},null!=f)return h(f);for(g=0;c>g;g++)j.push(h(g));return j}}function s(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=b>=0?Math.floor(b):Math.ceil(b)),c}function t(a,b){return new Date(Date.UTC(a,b+1,0)).getUTCDate()}function u(a){return v(a)?366:365}function v(a){return a%4===0&&a%100!==0||a%400===0}function w(a){var b;a._a&&-2===a._pf.overflow&&(b=a._a[jb]<0||a._a[jb]>11?jb:a._a[kb]<1||a._a[kb]>t(a._a[ib],a._a[jb])?kb:a._a[lb]<0||a._a[lb]>23?lb:a._a[mb]<0||a._a[mb]>59?mb:a._a[nb]<0||a._a[nb]>59?nb:a._a[ob]<0||a._a[ob]>999?ob:-1,a._pf._overflowDayOfYear&&(ib>b||b>kb)&&(b=kb),a._pf.overflow=b)}function x(a){return null==a._isValid&&(a._isValid=!isNaN(a._d.getTime())&&a._pf.overflow<0&&!a._pf.empty&&!a._pf.invalidMonth&&!a._pf.nullInput&&!a._pf.invalidFormat&&!a._pf.userInvalidated,a._strict&&(a._isValid=a._isValid&&0===a._pf.charsLeftOver&&0===a._pf.unusedTokens.length)),a._isValid}function y(a){return a?a.toLowerCase().replace("_","-"):a}function z(a,b){return b._isUTC?db(a).zone(b._offset||0):db(a).local()}function A(a,b){return b.abbr=a,pb[a]||(pb[a]=new e),pb[a].set(b),pb[a]}function B(a){delete pb[a]}function C(a){var b,c,d,e,f=0,g=function(a){if(!pb[a]&&rb)try{require("./lang/"+a)}catch(b){}return pb[a]};if(!a)return db.fn._lang;if(!m(a)){if(c=g(a))return c;a=[a]}for(;f0;){if(c=g(e.slice(0,b).join("-")))return c;if(d&&d.length>=b&&o(e,d,!0)>=b-1)break;b--}f++}return db.fn._lang}function D(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function E(a){var b,c,d=a.match(vb);for(b=0,c=d.length;c>b;b++)d[b]=Yb[d[b]]?Yb[d[b]]:D(d[b]);return function(e){var f="";for(b=0;c>b;b++)f+=d[b]instanceof Function?d[b].call(e,a):d[b];return f}}function F(a,b){return a.isValid()?(b=G(b,a.lang()),Vb[b]||(Vb[b]=E(b)),Vb[b](a)):a.lang().invalidDate()}function G(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(wb.lastIndex=0;d>=0&&wb.test(a);)a=a.replace(wb,c),wb.lastIndex=0,d-=1;return a}function H(a,b){var c,d=b._strict;switch(a){case"DDDD":return Ib;case"YYYY":case"GGGG":case"gggg":return d?Jb:zb;case"Y":case"G":case"g":return Lb;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return d?Kb:Ab;case"S":if(d)return Gb;case"SS":if(d)return Hb;case"SSS":if(d)return Ib;case"DDD":return yb;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Cb;case"a":case"A":return C(b._l)._meridiemParse;case"X":return Fb;case"Z":case"ZZ":return Db;case"T":return Eb;case"SSSS":return Bb;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return d?Hb:xb;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return xb;default:return c=new RegExp(P(O(a.replace("\\","")),"i"))}}function I(a){a=a||"";var b=a.match(Db)||[],c=b[b.length-1]||[],d=(c+"").match(Qb)||["-",0,0],e=+(60*d[1])+s(d[2]);return"+"===d[0]?-e:e}function J(a,b,c){var d,e=c._a;switch(a){case"M":case"MM":null!=b&&(e[jb]=s(b)-1);break;case"MMM":case"MMMM":d=C(c._l).monthsParse(b),null!=d?e[jb]=d:c._pf.invalidMonth=b;break;case"D":case"DD":null!=b&&(e[kb]=s(b));break;case"DDD":case"DDDD":null!=b&&(c._dayOfYear=s(b));break;case"YY":e[ib]=s(b)+(s(b)>68?1900:2e3);break;case"YYYY":case"YYYYY":case"YYYYYY":e[ib]=s(b);break;case"a":case"A":c._isPm=C(c._l).isPM(b);break;case"H":case"HH":case"h":case"hh":e[lb]=s(b);break;case"m":case"mm":e[mb]=s(b);break;case"s":case"ss":e[nb]=s(b);break;case"S":case"SS":case"SSS":case"SSSS":e[ob]=s(1e3*("0."+b));break;case"X":c._d=new Date(1e3*parseFloat(b));break;case"Z":case"ZZ":c._useUTC=!0,c._tzm=I(b);break;case"w":case"ww":case"W":case"WW":case"d":case"dd":case"ddd":case"dddd":case"e":case"E":a=a.substr(0,1);case"gg":case"gggg":case"GG":case"GGGG":case"GGGGG":a=a.substr(0,2),b&&(c._w=c._w||{},c._w[a]=b)}}function K(a){var b,c,d,e,f,g,h,i,j,k,l=[];if(!a._d){for(d=M(a),a._w&&null==a._a[kb]&&null==a._a[jb]&&(f=function(b){var c=parseInt(b,10);return b?b.length<3?c>68?1900+c:2e3+c:c:null==a._a[ib]?db().weekYear():a._a[ib]},g=a._w,null!=g.GG||null!=g.W||null!=g.E?h=Z(f(g.GG),g.W||1,g.E,4,1):(i=C(a._l),j=null!=g.d?V(g.d,i):null!=g.e?parseInt(g.e,10)+i._week.dow:0,k=parseInt(g.w,10)||1,null!=g.d&&ju(e)&&(a._pf._overflowDayOfYear=!0),c=U(e,0,a._dayOfYear),a._a[jb]=c.getUTCMonth(),a._a[kb]=c.getUTCDate()),b=0;3>b&&null==a._a[b];++b)a._a[b]=l[b]=d[b];for(;7>b;b++)a._a[b]=l[b]=null==a._a[b]?2===b?1:0:a._a[b];l[lb]+=s((a._tzm||0)/60),l[mb]+=s((a._tzm||0)%60),a._d=(a._useUTC?U:T).apply(null,l)}}function L(a){var b;a._d||(b=q(a._i),a._a=[b.year,b.month,b.day,b.hour,b.minute,b.second,b.millisecond],K(a))}function M(a){var b=new Date;return a._useUTC?[b.getUTCFullYear(),b.getUTCMonth(),b.getUTCDate()]:[b.getFullYear(),b.getMonth(),b.getDate()]}function N(a){a._a=[],a._pf.empty=!0;var b,c,d,e,f,g=C(a._l),h=""+a._i,i=h.length,j=0;for(d=G(a._f,g).match(vb)||[],b=0;b0&&a._pf.unusedInput.push(f),h=h.slice(h.indexOf(c)+c.length),j+=c.length),Yb[e]?(c?a._pf.empty=!1:a._pf.unusedTokens.push(e),J(e,c,a)):a._strict&&!c&&a._pf.unusedTokens.push(e);a._pf.charsLeftOver=i-j,h.length>0&&a._pf.unusedInput.push(h),a._isPm&&a._a[lb]<12&&(a._a[lb]+=12),a._isPm===!1&&12===a._a[lb]&&(a._a[lb]=0),K(a),w(a)}function O(a){return a.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e})}function P(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function Q(a){var c,d,e,f,g;if(0===a._f.length)return a._pf.invalidFormat=!0,void(a._d=new Date(0/0));for(f=0;fg)&&(e=g,d=c));h(a,d||c)}function R(a){var b,c,d=a._i,e=Mb.exec(d);if(e){for(a._pf.iso=!0,b=0,c=Ob.length;c>b;b++)if(Ob[b][1].exec(d)){a._f=Ob[b][0]+(e[6]||" ");break}for(b=0,c=Pb.length;c>b;b++)if(Pb[b][1].exec(d)){a._f+=Pb[b][0];break}d.match(Db)&&(a._f+="Z"),N(a)}else a._d=new Date(d)}function S(b){var c=b._i,d=sb.exec(c);c===a?b._d=new Date:d?b._d=new Date(+d[1]):"string"==typeof c?R(b):m(c)?(b._a=c.slice(0),K(b)):n(c)?b._d=new Date(+c):"object"==typeof c?L(b):b._d=new Date(c)}function T(a,b,c,d,e,f,g){var h=new Date(a,b,c,d,e,f,g);return 1970>a&&h.setFullYear(a),h}function U(a){var b=new Date(Date.UTC.apply(null,arguments));return 1970>a&&b.setUTCFullYear(a),b}function V(a,b){if("string"==typeof a)if(isNaN(a)){if(a=b.weekdaysParse(a),"number"!=typeof a)return null}else a=parseInt(a,10);return a}function W(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function X(a,b,c){var d=hb(Math.abs(a)/1e3),e=hb(d/60),f=hb(e/60),g=hb(f/24),h=hb(g/365),i=45>d&&["s",d]||1===e&&["m"]||45>e&&["mm",e]||1===f&&["h"]||22>f&&["hh",f]||1===g&&["d"]||25>=g&&["dd",g]||45>=g&&["M"]||345>g&&["MM",hb(g/30)]||1===h&&["y"]||["yy",h];return i[2]=b,i[3]=a>0,i[4]=c,W.apply({},i)}function Y(a,b,c){var d,e=c-b,f=c-a.day();return f>e&&(f-=7),e-7>f&&(f+=7),d=db(a).add("d",f),{week:Math.ceil(d.dayOfYear()/7),year:d.year()}}function Z(a,b,c,d,e){var f,g,h=U(a,0,1).getUTCDay();return c=null!=c?c:e,f=e-h+(h>d?7:0)-(e>h?7:0),g=7*(b-1)+(c-e)+f+1,{year:g>0?a:a-1,dayOfYear:g>0?g:u(a-1)+g}}function $(a){var b=a._i,c=a._f;return null===b?db.invalid({nullInput:!0}):("string"==typeof b&&(a._i=b=C().preparse(b)),db.isMoment(b)?(a=i(b),a._d=new Date(+b._d)):c?m(c)?Q(a):N(a):S(a),new f(a))}function _(a,b){db.fn[a]=db.fn[a+"s"]=function(a){var c=this._isUTC?"UTC":"";return null!=a?(this._d["set"+c+b](a),db.updateOffset(this),this):this._d["get"+c+b]()}}function ab(a){db.duration.fn[a]=function(){return this._data[a]}}function bb(a,b){db.duration.fn["as"+a]=function(){return+this/b}}function cb(a){var b=!1,c=db;"undefined"==typeof ender&&(a?(gb.moment=function(){return!b&&console&&console.warn&&(b=!0,console.warn("Accessing Moment through the global scope is deprecated, and will be removed in an upcoming release.")),c.apply(null,arguments)},h(gb.moment,c)):gb.moment=db)}for(var db,eb,fb="2.5.1",gb=this,hb=Math.round,ib=0,jb=1,kb=2,lb=3,mb=4,nb=5,ob=6,pb={},qb={_isAMomentObject:null,_i:null,_f:null,_l:null,_strict:null,_isUTC:null,_offset:null,_pf:null,_lang:null},rb="undefined"!=typeof module&&module.exports&&"undefined"!=typeof require,sb=/^\/?Date\((\-?\d+)/i,tb=/(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/,ub=/^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/,vb=/(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|X|zz?|ZZ?|.)/g,wb=/(\[[^\[]*\])|(\\)?(LT|LL?L?L?|l{1,4})/g,xb=/\d\d?/,yb=/\d{1,3}/,zb=/\d{1,4}/,Ab=/[+\-]?\d{1,6}/,Bb=/\d+/,Cb=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,Db=/Z|[\+\-]\d\d:?\d\d/gi,Eb=/T/i,Fb=/[\+\-]?\d+(\.\d{1,3})?/,Gb=/\d/,Hb=/\d\d/,Ib=/\d{3}/,Jb=/\d{4}/,Kb=/[+-]?\d{6}/,Lb=/[+-]?\d+/,Mb=/^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Nb="YYYY-MM-DDTHH:mm:ssZ",Ob=[["YYYYYY-MM-DD",/[+-]\d{6}-\d{2}-\d{2}/],["YYYY-MM-DD",/\d{4}-\d{2}-\d{2}/],["GGGG-[W]WW-E",/\d{4}-W\d{2}-\d/],["GGGG-[W]WW",/\d{4}-W\d{2}/],["YYYY-DDD",/\d{4}-\d{3}/]],Pb=[["HH:mm:ss.SSSS",/(T| )\d\d:\d\d:\d\d\.\d{1,3}/],["HH:mm:ss",/(T| )\d\d:\d\d:\d\d/],["HH:mm",/(T| )\d\d:\d\d/],["HH",/(T| )\d\d/]],Qb=/([\+\-]|\d\d)/gi,Rb="Date|Hours|Minutes|Seconds|Milliseconds".split("|"),Sb={Milliseconds:1,Seconds:1e3,Minutes:6e4,Hours:36e5,Days:864e5,Months:2592e6,Years:31536e6},Tb={ms:"millisecond",s:"second",m:"minute",h:"hour",d:"day",D:"date",w:"week",W:"isoWeek",M:"month",y:"year",DDD:"dayOfYear",e:"weekday",E:"isoWeekday",gg:"weekYear",GG:"isoWeekYear"},Ub={dayofyear:"dayOfYear",isoweekday:"isoWeekday",isoweek:"isoWeek",weekyear:"weekYear",isoweekyear:"isoWeekYear"},Vb={},Wb="DDD w W M D d".split(" "),Xb="M D H h m s w W".split(" "),Yb={M:function(){return this.month()+1},MMM:function(a){return this.lang().monthsShort(this,a)},MMMM:function(a){return this.lang().months(this,a)},D:function(){return this.date()},DDD:function(){return this.dayOfYear()},d:function(){return this.day()},dd:function(a){return this.lang().weekdaysMin(this,a)},ddd:function(a){return this.lang().weekdaysShort(this,a)},dddd:function(a){return this.lang().weekdays(this,a)},w:function(){return this.week()},W:function(){return this.isoWeek()},YY:function(){return k(this.year()%100,2)},YYYY:function(){return k(this.year(),4)},YYYYY:function(){return k(this.year(),5)},YYYYYY:function(){var a=this.year(),b=a>=0?"+":"-";return b+k(Math.abs(a),6)},gg:function(){return k(this.weekYear()%100,2)},gggg:function(){return k(this.weekYear(),4)},ggggg:function(){return k(this.weekYear(),5)},GG:function(){return k(this.isoWeekYear()%100,2)},GGGG:function(){return k(this.isoWeekYear(),4)},GGGGG:function(){return k(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.lang().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.lang().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return s(this.milliseconds()/100)},SS:function(){return k(s(this.milliseconds()/10),2)},SSS:function(){return k(this.milliseconds(),3)},SSSS:function(){return k(this.milliseconds(),3)},Z:function(){var a=-this.zone(),b="+";return 0>a&&(a=-a,b="-"),b+k(s(a/60),2)+":"+k(s(a)%60,2)},ZZ:function(){var a=-this.zone(),b="+";return 0>a&&(a=-a,b="-"),b+k(s(a/60),2)+k(s(a)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},X:function(){return this.unix()},Q:function(){return this.quarter()}},Zb=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"];Wb.length;)eb=Wb.pop(),Yb[eb+"o"]=d(Yb[eb],eb);for(;Xb.length;)eb=Xb.pop(),Yb[eb+eb]=c(Yb[eb],2);for(Yb.DDDD=c(Yb.DDD,3),h(e.prototype,{set:function(a){var b,c;for(c in a)b=a[c],"function"==typeof b?this[c]=b:this["_"+c]=b},_months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),months:function(a){return this._months[a.month()]},_monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),monthsShort:function(a){return this._monthsShort[a.month()]},monthsParse:function(a){var b,c,d;for(this._monthsParse||(this._monthsParse=[]),b=0;12>b;b++)if(this._monthsParse[b]||(c=db.utc([2e3,b]),d="^"+this.months(c,"")+"|^"+this.monthsShort(c,""),this._monthsParse[b]=new RegExp(d.replace(".",""),"i")),this._monthsParse[b].test(a))return b},_weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdays:function(a){return this._weekdays[a.day()]},_weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysShort:function(a){return this._weekdaysShort[a.day()]},_weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),weekdaysMin:function(a){return this._weekdaysMin[a.day()]},weekdaysParse:function(a){var b,c,d;for(this._weekdaysParse||(this._weekdaysParse=[]),b=0;7>b;b++)if(this._weekdaysParse[b]||(c=db([2e3,1]).day(b),d="^"+this.weekdays(c,"")+"|^"+this.weekdaysShort(c,"")+"|^"+this.weekdaysMin(c,""),this._weekdaysParse[b]=new RegExp(d.replace(".",""),"i")),this._weekdaysParse[b].test(a))return b},_longDateFormat:{LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D YYYY",LLL:"MMMM D YYYY LT",LLLL:"dddd, MMMM D YYYY LT"},longDateFormat:function(a){var b=this._longDateFormat[a];return!b&&this._longDateFormat[a.toUpperCase()]&&(b=this._longDateFormat[a.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(a){return a.slice(1)}),this._longDateFormat[a]=b),b},isPM:function(a){return"p"===(a+"").toLowerCase().charAt(0)},_meridiemParse:/[ap]\.?m?\.?/i,meridiem:function(a,b,c){return a>11?c?"pm":"PM":c?"am":"AM"},_calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},calendar:function(a,b){var c=this._calendar[a];return"function"==typeof c?c.apply(b):c},_relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},relativeTime:function(a,b,c,d){var e=this._relativeTime[c];return"function"==typeof e?e(a,b,c,d):e.replace(/%d/i,a)},pastFuture:function(a,b){var c=this._relativeTime[a>0?"future":"past"];return"function"==typeof c?c(b):c.replace(/%s/i,b)},ordinal:function(a){return this._ordinal.replace("%d",a)},_ordinal:"%d",preparse:function(a){return a},postformat:function(a){return a},week:function(a){return Y(a,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),db=function(c,d,e,f){var g;return"boolean"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._i=c,g._f=d,g._l=e,g._strict=f,g._isUTC=!1,g._pf=b(),$(g)},db.utc=function(c,d,e,f){var g;return"boolean"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._useUTC=!0,g._isUTC=!0,g._l=e,g._i=c,g._f=d,g._strict=f,g._pf=b(),$(g).utc()},db.unix=function(a){return db(1e3*a)},db.duration=function(a,b){var c,d,e,f=a,h=null;return db.isDuration(a)?f={ms:a._milliseconds,d:a._days,M:a._months}:"number"==typeof a?(f={},b?f[b]=a:f.milliseconds=a):(h=tb.exec(a))?(c="-"===h[1]?-1:1,f={y:0,d:s(h[kb])*c,h:s(h[lb])*c,m:s(h[mb])*c,s:s(h[nb])*c,ms:s(h[ob])*c}):(h=ub.exec(a))&&(c="-"===h[1]?-1:1,e=function(a){var b=a&&parseFloat(a.replace(",","."));return(isNaN(b)?0:b)*c},f={y:e(h[2]),M:e(h[3]),d:e(h[4]),h:e(h[5]),m:e(h[6]),s:e(h[7]),w:e(h[8])}),d=new g(f),db.isDuration(a)&&a.hasOwnProperty("_lang")&&(d._lang=a._lang),d},db.version=fb,db.defaultFormat=Nb,db.updateOffset=function(){},db.lang=function(a,b){var c;return a?(b?A(y(a),b):null===b?(B(a),a="en"):pb[a]||C(a),c=db.duration.fn._lang=db.fn._lang=C(a),c._abbr):db.fn._lang._abbr},db.langData=function(a){return a&&a._lang&&a._lang._abbr&&(a=a._lang._abbr),C(a)},db.isMoment=function(a){return a instanceof f||null!=a&&a.hasOwnProperty("_isAMomentObject")},db.isDuration=function(a){return a instanceof g},eb=Zb.length-1;eb>=0;--eb)r(Zb[eb]);for(db.normalizeUnits=function(a){return p(a)},db.invalid=function(a){var b=db.utc(0/0);return null!=a?h(b._pf,a):b._pf.userInvalidated=!0,b},db.parseZone=function(a){return db(a).parseZone()},h(db.fn=f.prototype,{clone:function(){return db(this)},valueOf:function(){return+this._d+6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().lang("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},toDate:function(){return this._offset?new Date(+this):this._d},toISOString:function(){var a=db(this).utc();return 00:!1},parsingFlags:function(){return h({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(){return this.zone(0)},local:function(){return this.zone(0),this._isUTC=!1,this},format:function(a){var b=F(this,a||db.defaultFormat);return this.lang().postformat(b)},add:function(a,b){var c;return c="string"==typeof a?db.duration(+b,a):db.duration(a,b),l(this,c,1),this},subtract:function(a,b){var c;return c="string"==typeof a?db.duration(+b,a):db.duration(a,b),l(this,c,-1),this},diff:function(a,b,c){var d,e,f=z(a,this),g=6e4*(this.zone()-f.zone());return b=p(b),"year"===b||"month"===b?(d=432e5*(this.daysInMonth()+f.daysInMonth()),e=12*(this.year()-f.year())+(this.month()-f.month()),e+=(this-db(this).startOf("month")-(f-db(f).startOf("month")))/d,e-=6e4*(this.zone()-db(this).startOf("month").zone()-(f.zone()-db(f).startOf("month").zone()))/d,"year"===b&&(e/=12)):(d=this-f,e="second"===b?d/1e3:"minute"===b?d/6e4:"hour"===b?d/36e5:"day"===b?(d-g)/864e5:"week"===b?(d-g)/6048e5:d),c?e:j(e)},from:function(a,b){return db.duration(this.diff(a)).lang(this.lang()._abbr).humanize(!b)},fromNow:function(a){return this.from(db(),a)},calendar:function(){var a=z(db(),this).startOf("day"),b=this.diff(a,"days",!0),c=-6>b?"sameElse":-1>b?"lastWeek":0>b?"lastDay":1>b?"sameDay":2>b?"nextDay":7>b?"nextWeek":"sameElse";return this.format(this.lang().calendar(c,this))},isLeapYear:function(){return v(this.year())},isDST:function(){return this.zone()+db(a).startOf(b)},isBefore:function(a,b){return b="undefined"!=typeof b?b:"millisecond",+this.clone().startOf(b)<+db(a).startOf(b)},isSame:function(a,b){return b=b||"ms",+this.clone().startOf(b)===+z(a,this).startOf(b)},min:function(a){return a=db.apply(null,arguments),this>a?this:a},max:function(a){return a=db.apply(null,arguments),a>this?this:a},zone:function(a){var b=this._offset||0;return null==a?this._isUTC?b:this._d.getTimezoneOffset():("string"==typeof a&&(a=I(a)),Math.abs(a)<16&&(a=60*a),this._offset=a,this._isUTC=!0,b!==a&&l(this,db.duration(b-a,"m"),1,!0),this)},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.zone(this._tzm):"string"==typeof this._i&&this.zone(this._i),this},hasAlignedHourOffset:function(a){return a=a?db(a).zone():0,(this.zone()-a)%60===0},daysInMonth:function(){return t(this.year(),this.month())},dayOfYear:function(a){var b=hb((db(this).startOf("day")-db(this).startOf("year"))/864e5)+1;return null==a?b:this.add("d",a-b)},quarter:function(){return Math.ceil((this.month()+1)/3)},weekYear:function(a){var b=Y(this,this.lang()._week.dow,this.lang()._week.doy).year;return null==a?b:this.add("y",a-b)},isoWeekYear:function(a){var b=Y(this,1,4).year;return null==a?b:this.add("y",a-b)},week:function(a){var b=this.lang().week(this);return null==a?b:this.add("d",7*(a-b))},isoWeek:function(a){var b=Y(this,1,4).week;return null==a?b:this.add("d",7*(a-b))},weekday:function(a){var b=(this.day()+7-this.lang()._week.dow)%7;return null==a?b:this.add("d",a-b)},isoWeekday:function(a){return null==a?this.day()||7:this.day(this.day()%7?a:a-7)},get:function(a){return a=p(a),this[a]()},set:function(a,b){return a=p(a),"function"==typeof this[a]&&this[a](b),this},lang:function(b){return b===a?this._lang:(this._lang=C(b),this)}}),eb=0;ebrow;row+=1){modules[row]=new Array(moduleCount);for(var col=0;moduleCount>col;col+=1)modules[row][col]=null}return modules}(_moduleCount),setupPositionProbePattern(0,0),setupPositionProbePattern(_moduleCount-7,0),setupPositionProbePattern(0,_moduleCount-7),setupPositionAdjustPattern(),setupTimingPattern(),setupTypeInfo(test,maskPattern),_typeNumber>=7&&setupTypeNumber(test),null==_dataCache&&(_dataCache=createData(_typeNumber,_errorCorrectLevel,_dataList)),mapData(_dataCache,maskPattern)},setupPositionProbePattern=function(row,col){for(var r=-1;7>=r;r+=1)if(!(-1>=row+r||row+r>=_moduleCount))for(var c=-1;7>=c;c+=1)-1>=col+c||col+c>=_moduleCount||(_modules[row+r][col+c]=r>=0&&6>=r&&(0==c||6==c)||c>=0&&6>=c&&(0==r||6==r)||r>=2&&4>=r&&c>=2&&4>=c?!0:!1)},getBestMaskPattern=function(){for(var minLostPoint=0,pattern=0,i=0;8>i;i+=1){makeImpl(!0,i);var lostPoint=QRUtil.getLostPoint(_this);(0==i||minLostPoint>lostPoint)&&(minLostPoint=lostPoint,pattern=i)}return pattern},setupTimingPattern=function(){for(var r=8;_moduleCount-8>r;r+=1)null==_modules[r][6]&&(_modules[r][6]=r%2==0);for(var c=8;_moduleCount-8>c;c+=1)null==_modules[6][c]&&(_modules[6][c]=c%2==0)},setupPositionAdjustPattern=function(){for(var pos=QRUtil.getPatternPosition(_typeNumber),i=0;i=r;r+=1)for(var c=-2;2>=c;c+=1)_modules[row+r][col+c]=-2==r||2==r||-2==c||2==c||0==r&&0==c?!0:!1}},setupTypeNumber=function(test){for(var bits=QRUtil.getBCHTypeNumber(_typeNumber),i=0;18>i;i+=1){var mod=!test&&1==(bits>>i&1);_modules[Math.floor(i/3)][i%3+_moduleCount-8-3]=mod}for(var i=0;18>i;i+=1){var mod=!test&&1==(bits>>i&1);_modules[i%3+_moduleCount-8-3][Math.floor(i/3)]=mod}},setupTypeInfo=function(test,maskPattern){for(var data=_errorCorrectLevel<<3|maskPattern,bits=QRUtil.getBCHTypeInfo(data),i=0;15>i;i+=1){var mod=!test&&1==(bits>>i&1);6>i?_modules[i][8]=mod:8>i?_modules[i+1][8]=mod:_modules[_moduleCount-15+i][8]=mod}for(var i=0;15>i;i+=1){var mod=!test&&1==(bits>>i&1);8>i?_modules[8][_moduleCount-i-1]=mod:9>i?_modules[8][15-i-1+1]=mod:_modules[8][15-i-1]=mod}_modules[_moduleCount-8][8]=!test},mapData=function(data,maskPattern){for(var inc=-1,row=_moduleCount-1,bitIndex=7,byteIndex=0,maskFunc=QRUtil.getMaskFunction(maskPattern),col=_moduleCount-1;col>0;col-=2)for(6==col&&(col-=1);;){for(var c=0;2>c;c+=1)if(null==_modules[row][col-c]){var dark=!1;byteIndex>>bitIndex&1));var mask=maskFunc(row,col-c);mask&&(dark=!dark),_modules[row][col-c]=dark,bitIndex-=1,-1==bitIndex&&(byteIndex+=1,bitIndex=7)}if(row+=inc,0>row||row>=_moduleCount){row-=inc,inc=-inc;break}}},createBytes=function(buffer,rsBlocks){for(var offset=0,maxDcCount=0,maxEcCount=0,dcdata=new Array(rsBlocks.length),ecdata=new Array(rsBlocks.length),r=0;r=0?modPoly.getAt(modIndex):0}}for(var totalCodeCount=0,i=0;ii;i+=1)for(var r=0;ri;i+=1)for(var r=0;r8*totalDataCount)throw new Error("code length overflow. ("+buffer.getLengthInBits()+">"+8*totalDataCount+")");for(buffer.getLengthInBits()+4<=8*totalDataCount&&buffer.put(0,4);buffer.getLengthInBits()%8!=0;)buffer.putBit(!1);for(;;){if(buffer.getLengthInBits()>=8*totalDataCount)break;if(buffer.put(PAD0,8),buffer.getLengthInBits()>=8*totalDataCount)break;buffer.put(PAD1,8) }return createBytes(buffer,rsBlocks)};return _this.addData=function(data){var newData=qr8BitByte(data);_dataList.push(newData),_dataCache=null},_this.isDark=function(row,col){if(0>row||row>=_moduleCount||0>col||col>=_moduleCount)throw new Error(row+","+col);return _modules[row][col]},_this.getModuleCount=function(){return _moduleCount},_this.make=function(){makeImpl(!1,getBestMaskPattern())},_this.createTableTag=function(cellSize,margin){cellSize=cellSize||2,margin="undefined"==typeof margin?4*cellSize:margin;var qrHtml="";qrHtml+='";for(var c=0;c<_this.getModuleCount();c+=1)qrHtml+='"}return qrHtml+="",qrHtml+="
';qrHtml+="
"},_this.createImgTag=function(cellSize,margin){cellSize=cellSize||2,margin="undefined"==typeof margin?4*cellSize:margin;var size=_this.getModuleCount()*cellSize+2*margin,min=margin,max=size-margin;return createImgTag(size,size,function(x,y){if(x>=min&&max>x&&y>=min&&max>y){var c=Math.floor((x-min)/cellSize),r=Math.floor((y-min)/cellSize);return _this.isDark(r,c)?0:1}return 1})},_this};qrcode.stringToBytes=function(s){for(var bytes=new Array,i=0;ic)bytes.push(c);else{var b=unicodeMap[s.charAt(i)];"number"==typeof b?(255&b)==b?bytes.push(b):(bytes.push(b>>>8),bytes.push(255&b)):bytes.push(unknownChar)}}return bytes}};var QRMode={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8},QRErrorCorrectLevel={L:1,M:0,Q:3,H:2},QRMaskPattern={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7},QRUtil=function(){var PATTERN_POSITION_TABLE=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15=1335,G18=7973,G15_MASK=21522,_this={},getBCHDigit=function(data){for(var digit=0;0!=data;)digit+=1,data>>>=1;return digit};return _this.getBCHTypeInfo=function(data){for(var d=data<<10;getBCHDigit(d)-getBCHDigit(G15)>=0;)d^=G15<=0;)d^=G18<i;i+=1)a=a.multiply(qrPolynomial([1,QRMath.gexp(i)],0));return a},_this.getLengthInBits=function(mode,type){if(type>=1&&10>type)switch(mode){case QRMode.MODE_NUMBER:return 10;case QRMode.MODE_ALPHA_NUM:return 9;case QRMode.MODE_8BIT_BYTE:return 8;case QRMode.MODE_KANJI:return 8;default:throw new Error("mode:"+mode)}else if(27>type)switch(mode){case QRMode.MODE_NUMBER:return 12;case QRMode.MODE_ALPHA_NUM:return 11;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 10;default:throw new Error("mode:"+mode)}else{if(!(41>type))throw new Error("type:"+type);switch(mode){case QRMode.MODE_NUMBER:return 14;case QRMode.MODE_ALPHA_NUM:return 13;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 12;default:throw new Error("mode:"+mode)}}},_this.getLostPoint=function(qrcode){for(var moduleCount=qrcode.getModuleCount(),lostPoint=0,row=0;moduleCount>row;row+=1)for(var col=0;moduleCount>col;col+=1){for(var sameCount=0,dark=qrcode.isDark(row,col),r=-1;1>=r;r+=1)if(!(0>row+r||row+r>=moduleCount))for(var c=-1;1>=c;c+=1)0>col+c||col+c>=moduleCount||(0!=r||0!=c)&&dark==qrcode.isDark(row+r,col+c)&&(sameCount+=1);sameCount>5&&(lostPoint+=3+sameCount-5)}for(var row=0;moduleCount-1>row;row+=1)for(var col=0;moduleCount-1>col;col+=1){var count=0;qrcode.isDark(row,col)&&(count+=1),qrcode.isDark(row+1,col)&&(count+=1),qrcode.isDark(row,col+1)&&(count+=1),qrcode.isDark(row+1,col+1)&&(count+=1),(0==count||4==count)&&(lostPoint+=3)}for(var row=0;moduleCount>row;row+=1)for(var col=0;moduleCount-6>col;col+=1)qrcode.isDark(row,col)&&!qrcode.isDark(row,col+1)&&qrcode.isDark(row,col+2)&&qrcode.isDark(row,col+3)&&qrcode.isDark(row,col+4)&&!qrcode.isDark(row,col+5)&&qrcode.isDark(row,col+6)&&(lostPoint+=40);for(var col=0;moduleCount>col;col+=1)for(var row=0;moduleCount-6>row;row+=1)qrcode.isDark(row,col)&&!qrcode.isDark(row+1,col)&&qrcode.isDark(row+2,col)&&qrcode.isDark(row+3,col)&&qrcode.isDark(row+4,col)&&!qrcode.isDark(row+5,col)&&qrcode.isDark(row+6,col)&&(lostPoint+=40);for(var darkCount=0,col=0;moduleCount>col;col+=1)for(var row=0;moduleCount>row;row+=1)qrcode.isDark(row,col)&&(darkCount+=1);var ratio=Math.abs(100*darkCount/moduleCount/moduleCount-50)/5;return lostPoint+=10*ratio},_this}(),QRMath=function(){for(var EXP_TABLE=new Array(256),LOG_TABLE=new Array(256),i=0;8>i;i+=1)EXP_TABLE[i]=1<i;i+=1)EXP_TABLE[i]=EXP_TABLE[i-4]^EXP_TABLE[i-5]^EXP_TABLE[i-6]^EXP_TABLE[i-8];for(var i=0;255>i;i+=1)LOG_TABLE[EXP_TABLE[i]]=i;var _this={};return _this.glog=function(n){if(1>n)throw new Error("glog("+n+")");return LOG_TABLE[n]},_this.gexp=function(n){for(;0>n;)n+=255;for(;n>=256;)n-=255;return EXP_TABLE[n]},_this}(),QRRSBlock=function(){var RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16]],qrRSBlock=function(totalCount,dataCount){var _this={};return _this.totalCount=totalCount,_this.dataCount=dataCount,_this},_this={},getRsBlockTable=function(typeNumber,errorCorrectLevel){switch(errorCorrectLevel){case QRErrorCorrectLevel.L:return RS_BLOCK_TABLE[4*(typeNumber-1)+0];case QRErrorCorrectLevel.M:return RS_BLOCK_TABLE[4*(typeNumber-1)+1];case QRErrorCorrectLevel.Q:return RS_BLOCK_TABLE[4*(typeNumber-1)+2];case QRErrorCorrectLevel.H:return RS_BLOCK_TABLE[4*(typeNumber-1)+3];default:return void 0}};return _this.getRSBlocks=function(typeNumber,errorCorrectLevel){var rsBlock=getRsBlockTable(typeNumber,errorCorrectLevel);if("undefined"==typeof rsBlock)throw new Error("bad rs block @ typeNumber:"+typeNumber+"/errorCorrectLevel:"+errorCorrectLevel);for(var length=rsBlock.length/3,list=new Array,i=0;length>i;i+=1)for(var count=rsBlock[3*i+0],totalCount=rsBlock[3*i+1],dataCount=rsBlock[3*i+2],j=0;count>j;j+=1)list.push(qrRSBlock(totalCount,dataCount));return list},_this}(),qrBitBuffer=function(){var _buffer=new Array,_length=0,_this={};return _this.getBuffer=function(){return _buffer},_this.getAt=function(index){var bufIndex=Math.floor(index/8);return 1==(_buffer[bufIndex]>>>7-index%8&1)},_this.put=function(num,length){for(var i=0;length>i;i+=1)_this.putBit(1==(num>>>length-i-1&1))},_this.getLengthInBits=function(){return _length},_this.putBit=function(bit){var bufIndex=Math.floor(_length/8);_buffer.length<=bufIndex&&_buffer.push(0),bit&&(_buffer[bufIndex]|=128>>>_length%8),_length+=1},_this},qr8BitByte=function(data){var _mode=QRMode.MODE_8BIT_BYTE,_bytes=qrcode.stringToBytes(data),_this={};return _this.getMode=function(){return _mode},_this.getLength=function(){return _bytes.length},_this.write=function(buffer){for(var i=0;i<_bytes.length;i+=1)buffer.put(_bytes[i],8)},_this},byteArrayOutputStream=function(){var _bytes=new Array,_this={};return _this.writeByte=function(b){_bytes.push(255&b)},_this.writeShort=function(i){_this.writeByte(i),_this.writeByte(i>>>8)},_this.writeBytes=function(b,off,len){off=off||0,len=len||b.length;for(var i=0;len>i;i+=1)_this.writeByte(b[i+off])},_this.writeString=function(s){for(var i=0;i0&&(s+=","),s+=_bytes[i];return s+="]"},_this},base64EncodeOutputStream=function(){var _buffer=0,_buflen=0,_length=0,_base64="",_this={},writeEncoded=function(b){_base64+=String.fromCharCode(encode(63&b))},encode=function(n){if(0>n);else{if(26>n)return 65+n;if(52>n)return 97+(n-26);if(62>n)return 48+(n-52);if(62==n)return 43;if(63==n)return 47}throw new Error("n:"+n)};return _this.writeByte=function(n){for(_buffer=_buffer<<8|255&n,_buflen+=8,_length+=1;_buflen>=6;)writeEncoded(_buffer>>>_buflen-6),_buflen-=6},_this.flush=function(){if(_buflen>0&&(writeEncoded(_buffer<<6-_buflen),_buffer=0,_buflen=0),_length%3!=0)for(var padlen=3-_length%3,i=0;padlen>i;i+=1)_base64+="="},_this.toString=function(){return _base64},_this},base64DecodeInputStream=function(str){var _str=str,_pos=0,_buffer=0,_buflen=0,_this={};_this.read=function(){for(;8>_buflen;){if(_pos>=_str.length){if(0==_buflen)return-1;throw new Error("unexpected end of file./"+_buflen)}var c=_str.charAt(_pos);if(_pos+=1,"="==c)return _buflen=0,-1;c.match(/^\s$/)||(_buffer=_buffer<<6|decode(c.charCodeAt(0)),_buflen+=6)}var n=_buffer>>>_buflen-8&255;return _buflen-=8,n};var decode=function(c){if(c>=65&&90>=c)return c-65;if(c>=97&&122>=c)return c-97+26;if(c>=48&&57>=c)return c-48+52;if(43==c)return 62;if(47==c)return 63;throw new Error("c:"+c)};return _this},gifImage=function(width,height){var _width=width,_height=height,_data=new Array(width*height),_this={};_this.setPixel=function(x,y,pixel){_data[y*_width+x]=pixel},_this.write=function(out){out.writeString("GIF87a"),out.writeShort(_width),out.writeShort(_height),out.writeByte(128),out.writeByte(0),out.writeByte(0),out.writeByte(0),out.writeByte(0),out.writeByte(0),out.writeByte(255),out.writeByte(255),out.writeByte(255),out.writeString(","),out.writeShort(0),out.writeShort(0),out.writeShort(_width),out.writeShort(_height),out.writeByte(0);var lzwMinCodeSize=2,raster=getLZWRaster(lzwMinCodeSize);out.writeByte(lzwMinCodeSize);for(var offset=0;raster.length-offset>255;)out.writeByte(255),out.writeBytes(raster,offset,255),offset+=255;out.writeByte(raster.length-offset),out.writeBytes(raster,offset,raster.length-offset),out.writeByte(0),out.writeString(";")};var bitOutputStream=function(out){var _out=out,_bitLength=0,_bitBuffer=0,_this={};return _this.write=function(data,length){if(data>>>length!=0)throw new Error("length over");for(;_bitLength+length>=8;)_out.writeByte(255&(data<<_bitLength|_bitBuffer)),length-=8-_bitLength,data>>>=8-_bitLength,_bitBuffer=0,_bitLength=0;_bitBuffer=data<<_bitLength|_bitBuffer,_bitLength+=length},_this.flush=function(){_bitLength>0&&_out.writeByte(_bitBuffer)},_this},getLZWRaster=function(lzwMinCodeSize){for(var clearCode=1<i;i+=1)table.add(String.fromCharCode(i));table.add(String.fromCharCode(clearCode)),table.add(String.fromCharCode(endCode));var byteOut=byteArrayOutputStream(),bitOut=bitOutputStream(byteOut);bitOut.write(clearCode,bitLength);var dataIndex=0,s=String.fromCharCode(_data[dataIndex]);for(dataIndex+=1;dataIndex<_data.length;){var c=String.fromCharCode(_data[dataIndex]);dataIndex+=1,table.contains(s+c)?s+=c:(bitOut.write(table.indexOf(s),bitLength),table.size()<4095&&(table.size()==1<y;y+=1)for(var x=0;width>x;x+=1)gif.setPixel(x,y,getPixel(x,y));var b=byteArrayOutputStream();gif.write(b);for(var base64=base64EncodeOutputStream(),bytes=b.toByteArray(),i=0;i=10}var c,d={bridge:null,version:"0.0.0",disabled:null,outdated:null,ready:null},e={},f=0,g={},h=0,i={},j=null,k=null,l=function(){var a,b,c,d,e="ZeroClipboard.swf";if(document.currentScript&&(d=document.currentScript.src));else{var f=document.getElementsByTagName("script");if("readyState"in f[0])for(a=f.length;a--&&("interactive"!==f[a].readyState||!(d=f[a].src)););else if("loading"===document.readyState)d=f[f.length-1].src;else{for(a=f.length;a--;){if(c=f[a].src,!c){b=null;break}if(c=c.split("#")[0].split("?")[0],c=c.slice(0,c.lastIndexOf("/")+1),null==b)b=c;else if(b!==c){b=null;break}}null!==b&&(d=b)}}return d&&(d=d.split("#")[0].split("?")[0],e=d.slice(0,d.lastIndexOf("/")+1)+e),e}(),m=function(){var a=/\-([a-z])/g,b=function(a,b){return b.toUpperCase()};return function(c){return c.replace(a,b)}}(),n=function(a,b){var c,d,e;return window.getComputedStyle?c=window.getComputedStyle(a,null).getPropertyValue(b):(d=m(b),c=a.currentStyle?a.currentStyle[d]:a.style[d]),"cursor"!==b||c&&"auto"!==c||(e=a.tagName.toLowerCase(),"a"!==e)?c:"pointer"},o=function(a){a||(a=window.event);var b;this!==window?b=this:a.target?b=a.target:a.srcElement&&(b=a.srcElement),I.activate(b)},p=function(a,b,c){a&&1===a.nodeType&&(a.addEventListener?a.addEventListener(b,c,!1):a.attachEvent&&a.attachEvent("on"+b,c))},q=function(a,b,c){a&&1===a.nodeType&&(a.removeEventListener?a.removeEventListener(b,c,!1):a.detachEvent&&a.detachEvent("on"+b,c))},r=function(a,b){if(!a||1!==a.nodeType)return a;if(a.classList)return a.classList.contains(b)||a.classList.add(b),a;if(b&&"string"==typeof b){var c=(b||"").split(/\s+/);if(1===a.nodeType)if(a.className){for(var d=" "+a.className+" ",e=a.className,f=0,g=c.length;g>f;f++)d.indexOf(" "+c[f]+" ")<0&&(e+=" "+c[f]);a.className=e.replace(/^\s+|\s+$/g,"")}else a.className=b}return a},s=function(a,b){if(!a||1!==a.nodeType)return a;if(a.classList)return a.classList.contains(b)&&a.classList.remove(b),a;if(b&&"string"==typeof b||void 0===b){var c=(b||"").split(/\s+/);if(1===a.nodeType&&a.className)if(b){for(var d=(" "+a.className+" ").replace(/[\n\t]/g," "),e=0,f=c.length;f>e;e++)d=d.replace(" "+c[e]+" "," ");a.className=d.replace(/^\s+|\s+$/g,"")}else a.className=""}return a},t=function(){var a,b,c,d=1;return"function"==typeof document.body.getBoundingClientRect&&(a=document.body.getBoundingClientRect(),b=a.right-a.left,c=document.body.offsetWidth,d=Math.round(b/c*100)/100),d},u=function(a,b){var c={left:0,top:0,width:0,height:0,zIndex:A(b)-1};if(a.getBoundingClientRect){var d,e,f,g=a.getBoundingClientRect();"pageXOffset"in window&&"pageYOffset"in window?(d=window.pageXOffset,e=window.pageYOffset):(f=t(),d=Math.round(document.documentElement.scrollLeft/f),e=Math.round(document.documentElement.scrollTop/f));var h=document.documentElement.clientLeft||0,i=document.documentElement.clientTop||0;c.left=g.left+d-h,c.top=g.top+e-i,c.width="width"in g?g.width:g.right-g.left,c.height="height"in g?g.height:g.bottom-g.top}return c},v=function(a,b){var c=null==b||b&&b.cacheBust===!0&&b.useNoCache===!0;return c?(-1===a.indexOf("?")?"?":"&")+"noCache="+(new Date).getTime():""},w=function(a){var b,c,d,e=[],f=[],g=[];if(a.trustedOrigins&&("string"==typeof a.trustedOrigins?f.push(a.trustedOrigins):"object"==typeof a.trustedOrigins&&"length"in a.trustedOrigins&&(f=f.concat(a.trustedOrigins))),a.trustedDomains&&("string"==typeof a.trustedDomains?f.push(a.trustedDomains):"object"==typeof a.trustedDomains&&"length"in a.trustedDomains&&(f=f.concat(a.trustedDomains))),f.length)for(b=0,c=f.length;c>b;b++)if(f.hasOwnProperty(b)&&f[b]&&"string"==typeof f[b]){if(d=D(f[b]),!d)continue;if("*"===d){g=[d];break}g.push.apply(g,[d,"//"+d,window.location.protocol+"//"+d])}return g.length&&e.push("trustedOrigins="+encodeURIComponent(g.join(","))),"string"==typeof a.jsModuleId&&a.jsModuleId&&e.push("jsModuleId="+encodeURIComponent(a.jsModuleId)),e.join("&")},x=function(a,b,c){if("function"==typeof b.indexOf)return b.indexOf(a,c);var d,e=b.length;for("undefined"==typeof c?c=0:0>c&&(c=e+c),d=c;e>d;d++)if(b.hasOwnProperty(d)&&b[d]===a)return d;return-1},y=function(a){if("string"==typeof a)throw new TypeError("ZeroClipboard doesn't accept query strings.");return a.length?a:[a]},z=function(a,b,c,d){d?window.setTimeout(function(){a.apply(b,c)},0):a.apply(b,c)},A=function(a){var b,c;return a&&("number"==typeof a&&a>0?b=a:"string"==typeof a&&(c=parseInt(a,10))&&!isNaN(c)&&c>0&&(b=c)),b||("number"==typeof L.zIndex&&L.zIndex>0?b=L.zIndex:"string"==typeof L.zIndex&&(c=parseInt(L.zIndex,10))&&!isNaN(c)&&c>0&&(b=c)),b||0},B=function(a,b){if(a&&b!==!1&&"undefined"!=typeof console&&console&&(console.warn||console.log)){var c="`"+a+"` is deprecated. See docs for more info:\n https://github.com/zeroclipboard/zeroclipboard/blob/master/docs/instructions.md#deprecations";console.warn?console.warn(c):console.log(c)}},C=function(){var a,b,c,d,e,f,g=arguments[0]||{};for(a=1,b=arguments.length;b>a;a++)if(null!=(c=arguments[a]))for(d in c)if(c.hasOwnProperty(d)){if(e=g[d],f=c[d],g===f)continue;void 0!==f&&(g[d]=f)}return g},D=function(a){if(null==a||""===a)return null;if(a=a.replace(/^\s+|\s+$/g,""),""===a)return null;var b=a.indexOf("//");a=-1===b?a:a.slice(b+2);var c=a.indexOf("/");return a=-1===c?a:-1===b||0===c?null:a.slice(0,c),a&&".swf"===a.slice(-4).toLowerCase()?null:a||null},E=function(){var a=function(a,b){var c,d,e;if(null!=a&&"*"!==b[0]&&("string"==typeof a&&(a=[a]),"object"==typeof a&&"length"in a))for(c=0,d=a.length;d>c;c++)if(a.hasOwnProperty(c)&&(e=D(a[c]))){if("*"===e){b.length=0,b.push("*");break}-1===x(e,b)&&b.push(e)}},b={always:"always",samedomain:"sameDomain",never:"never"};return function(c,d){var e,f=d.allowScriptAccess;if("string"==typeof f&&(e=f.toLowerCase())&&/^always|samedomain|never$/.test(e))return b[e];var g=D(d.moviePath);null===g&&(g=c);var h=[];a(d.trustedOrigins,h),a(d.trustedDomains,h);var i=h.length;if(i>0){if(1===i&&"*"===h[0])return"always";if(-1!==x(c,h))return 1===i&&c===g?"sameDomain":"always"}return"never"}}(),F=function(a){if(null==a)return[];if(Object.keys)return Object.keys(a);var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c);return b},G=function(a){if(a)for(var b in a)a.hasOwnProperty(b)&&delete a[b];return a},H=function(){var a=!1;if("boolean"==typeof d.disabled)a=d.disabled===!1;else{if("function"==typeof ActiveXObject)try{new ActiveXObject("ShockwaveFlash.ShockwaveFlash")&&(a=!0)}catch(b){}!a&&navigator.mimeTypes["application/x-shockwave-flash"]&&(a=!0)}return a},I=function(a,b){return this instanceof I?(this.id=""+f++,g[this.id]={instance:this,elements:[],handlers:{}},a&&this.clip(a),"undefined"!=typeof b&&(B("new ZeroClipboard(elements, options)",L.debug),I.config(b)),this.options=I.config(),"boolean"!=typeof d.disabled&&(d.disabled=!H()),void(d.disabled===!1&&d.outdated!==!0&&null===d.bridge&&(d.outdated=!1,d.ready=!1,M()))):new I(a,b)};I.prototype.setText=function(a){return a&&""!==a&&(e["text/plain"]=a,d.ready===!0&&d.bridge&&d.bridge.setText(a)),this},I.prototype.setSize=function(a,b){return d.ready===!0&&d.bridge&&d.bridge.setSize(a,b),this};var J=function(a){d.ready===!0&&d.bridge&&d.bridge.setHandCursor(a)};I.prototype.destroy=function(){this.unclip(),this.off(),delete g[this.id]};var K=function(){var a,b,c,d=[],e=F(g);for(a=0,b=e.length;b>a;a++)c=g[e[a]].instance,c&&c instanceof I&&d.push(c);return d};I.version="1.3.2";var L={swfPath:l,trustedDomains:window.location.host?[window.location.host]:[],cacheBust:!0,forceHandCursor:!1,zIndex:999999999,debug:!0,title:null,autoActivate:!0};I.config=function(a){if("object"==typeof a&&null!==a&&C(L,a),"string"!=typeof a||!a){var b={};for(var c in L)L.hasOwnProperty(c)&&(b[c]="object"==typeof L[c]&&null!==L[c]?"length"in L[c]?L[c].slice(0):C({},L[c]):L[c]);return b}return L.hasOwnProperty(a)?L[a]:void 0},I.destroy=function(){I.deactivate();for(var a in g)if(g.hasOwnProperty(a)&&g[a]){var b=g[a].instance;b&&"function"==typeof b.destroy&&b.destroy()}var c=N(d.bridge);c&&c.parentNode&&(c.parentNode.removeChild(c),d.ready=null,d.bridge=null)},I.activate=function(a){c&&(s(c,L.hoverClass),s(c,L.activeClass)),c=a,r(a,L.hoverClass),O();var b=L.title||a.getAttribute("title");if(b){var e=N(d.bridge);e&&e.setAttribute("title",b)}var f=L.forceHandCursor===!0||"pointer"===n(a,"cursor");J(f)},I.deactivate=function(){var a=N(d.bridge);a&&(a.style.left="0px",a.style.top="-9999px",a.removeAttribute("title")),c&&(s(c,L.hoverClass),s(c,L.activeClass),c=null)};var M=function(){var a,b,c=document.getElementById("global-zeroclipboard-html-bridge");if(!c){var e=I.config();e.jsModuleId="string"==typeof j&&j||"string"==typeof k&&k||null;var f=E(window.location.host,L),g=w(e),h=L.moviePath+v(L.moviePath,L),i=' ';c=document.createElement("div"),c.id="global-zeroclipboard-html-bridge",c.setAttribute("class","global-zeroclipboard-container"),c.style.position="absolute",c.style.left="0px",c.style.top="-9999px",c.style.width="15px",c.style.height="15px",c.style.zIndex=""+A(L.zIndex),document.body.appendChild(c),c.innerHTML=i}a=document["global-zeroclipboard-flash-bridge"],a&&(b=a.length)&&(a=a[b-1]),d.bridge=a||c.children[0].lastElementChild},N=function(a){for(var b=/^OBJECT|EMBED$/,c=a&&a.parentNode;c&&b.test(c.nodeName)&&c.parentNode;)c=c.parentNode;return c||null},O=function(){if(c){var a=u(c,L.zIndex),b=N(d.bridge);b&&(b.style.top=a.top+"px",b.style.left=a.left+"px",b.style.width=a.width+"px",b.style.height=a.height+"px",b.style.zIndex=a.zIndex+1),d.ready===!0&&d.bridge&&d.bridge.setSize(a.width,a.height)}return this};I.prototype.on=function(a,b){var c,e,f,h={},i=g[this.id]&&g[this.id].handlers;if("string"==typeof a&&a)f=a.toLowerCase().split(/\s+/);else if("object"==typeof a&&a&&"undefined"==typeof b)for(c in a)a.hasOwnProperty(c)&&"string"==typeof c&&c&&"function"==typeof a[c]&&this.on(c,a[c]);if(f&&f.length){for(c=0,e=f.length;e>c;c++)a=f[c].replace(/^on/,""),h[a]=!0,i[a]||(i[a]=[]),i[a].push(b);h.noflash&&d.disabled&&R.call(this,"noflash",{}),h.wrongflash&&d.outdated&&R.call(this,"wrongflash",{flashVersion:d.version}),h.load&&d.ready&&R.call(this,"load",{flashVersion:d.version})}return this},I.prototype.off=function(a,b){var c,d,e,f,h,i=g[this.id]&&g[this.id].handlers;if(0===arguments.length)f=F(i);else if("string"==typeof a&&a)f=a.split(/\s+/);else if("object"==typeof a&&a&&"undefined"==typeof b)for(c in a)a.hasOwnProperty(c)&&"string"==typeof c&&c&&"function"==typeof a[c]&&this.off(c,a[c]);if(f&&f.length)for(c=0,d=f.length;d>c;c++)if(a=f[c].toLowerCase().replace(/^on/,""),h=i[a],h&&h.length)if(b)for(e=x(b,h);-1!==e;)h.splice(e,1),e=x(b,h,e);else i[a].length=0;return this},I.prototype.handlers=function(a){var b,c=null,d=g[this.id]&&g[this.id].handlers;if(d){if("string"==typeof a&&a)return d[a]?d[a].slice(0):null;c={};for(b in d)d.hasOwnProperty(b)&&d[b]&&(c[b]=d[b].slice(0))}return c};var P=function(a,b,c,d){var e=g[this.id]&&g[this.id].handlers[a];if(e&&e.length){var f,h,i,j=b||this;for(f=0,h=e.length;h>f;f++)i=e[f],b=j,"string"==typeof i&&"function"==typeof window[i]&&(i=window[i]),"object"==typeof i&&i&&"function"==typeof i.handleEvent&&(b=i,i=i.handleEvent),"function"==typeof i&&z(i,b,c,d)}return this};I.prototype.clip=function(a){a=y(a);for(var b=0;bd;d++)f=g[c[d]].instance,f&&f instanceof I&&h.push(f);return h};L.hoverClass="zeroclipboard-is-hover",L.activeClass="zeroclipboard-is-active",L.trustedOrigins=null,L.allowScriptAccess=null,L.useNoCache=!0,L.moviePath="ZeroClipboard.swf",I.detectFlashSupport=function(){return B("ZeroClipboard.detectFlashSupport",L.debug),H()},I.dispatch=function(a,b){if("string"==typeof a&&a){var d=a.toLowerCase().replace(/^on/,"");if(d)for(var e=c?Q(c):K(),f=0,g=e.length;g>f;f++)R.call(e[f],d,b)}},I.prototype.setHandCursor=function(a){return B("ZeroClipboard.prototype.setHandCursor",L.debug),a="boolean"==typeof a?a:!!a,J(a),L.forceHandCursor=a,this},I.prototype.reposition=function(){return B("ZeroClipboard.prototype.reposition",L.debug),O()},I.prototype.receiveEvent=function(a,b){if(B("ZeroClipboard.prototype.receiveEvent",L.debug),"string"==typeof a&&a){var c=a.toLowerCase().replace(/^on/,"");c&&R.call(this,c,b)}},I.prototype.setCurrent=function(a){return B("ZeroClipboard.prototype.setCurrent",L.debug),I.activate(a),this},I.prototype.resetBridge=function(){return B("ZeroClipboard.prototype.resetBridge",L.debug),I.deactivate(),this},I.prototype.setTitle=function(a){if(B("ZeroClipboard.prototype.setTitle",L.debug),a=a||L.title||c&&c.getAttribute("title")){var b=N(d.bridge);b&&b.setAttribute("title",a)}return this},I.setDefaults=function(a){B("ZeroClipboard.setDefaults",L.debug),I.config(a)},I.prototype.addEventListener=function(a,b){return B("ZeroClipboard.prototype.addEventListener",L.debug),this.on(a,b)},I.prototype.removeEventListener=function(a,b){return B("ZeroClipboard.prototype.removeEventListener",L.debug),this.off(a,b)},I.prototype.ready=function(){return B("ZeroClipboard.prototype.ready",L.debug),d.ready===!0};var R=function(f,g){f=f.toLowerCase().replace(/^on/,"");var h=g&&g.flashVersion&&a(g.flashVersion)||null,i=c,j=!0;switch(f){case"load":if(h){if(!b(h))return void R.call(this,"onWrongFlash",{flashVersion:h});d.outdated=!1,d.ready=!0,d.version=h}break;case"wrongflash":h&&!b(h)&&(d.outdated=!0,d.ready=!1,d.version=h);break;case"mouseover":r(i,L.hoverClass);break;case"mouseout":L.autoActivate===!0&&I.deactivate();break;case"mousedown":r(i,L.activeClass);break;case"mouseup":s(i,L.activeClass);break;case"datarequested":var k=i.getAttribute("data-clipboard-target"),l=k?document.getElementById(k):null;if(l){var m=l.value||l.textContent||l.innerText;m&&this.setText(m)}else{var n=i.getAttribute("data-clipboard-text");n&&this.setText(n)}j=!1;break;case"complete":G(e)}var o=i,p=[this,g];return P.call(this,f,o,p,j)};"function"==typeof define&&define.amd?define(["require","exports","module"],function(a,b,c){return j=c&&c.id||null,I}):"object"==typeof module&&module&&"object"==typeof module.exports&&module.exports?(k=module.id||null,module.exports=I):window.ZeroClipboard=I}(); \ No newline at end of file diff --git a/test/integration/01-transactionouts.js b/test/integration/01-transactionouts.js deleted file mode 100644 index 0fc7e0f..0000000 --- a/test/integration/01-transactionouts.js +++ /dev/null @@ -1,170 +0,0 @@ -#!/usr/bin/env node -'use strict'; - -process.env.NODE_ENV = process.env.NODE_ENV || 'development'; - - - -var assert = require('assert'), - fs = require('fs'), - util = require('util'), - TransactionDb = require('../../lib/TransactionDb').class(); - -var txItemsValid = JSON.parse(fs.readFileSync('test/integration/txitems.json')); -var txDb; - -describe('TransactionDb fromIdWithInfo', function(){ - - before(function(c) { - txDb = new TransactionDb(); - return c(); - }); - - - var txid = '7e621eeb02874ab039a8566fd36f4591e65eca65313875221842c53de6907d6c'; - it('tx info ' + txid, function(done) { - txDb.fromIdWithInfo(txid, function(err, tx) { - - if (err) done(err); - assert.equal(tx.txid, txid); - assert(!tx.info.isCoinBase); - - for(var i=0; i<20; i++) - assert(parseFloat(tx.info.vin[i].value) === parseFloat(50), 'input '+i); - assert(tx.info.vin[0].addr === 'msGKGCy2i8wbKS5Fo1LbWUTJnf1GoFFG59', 'addr 0'); - assert(tx.info.vin[1].addr === 'mfye7oHsdrHbydtj4coPXCasKad2eYSv5P', 'addr 1'); - done(); - }); - }); - - it('tx info', function(done) { - var txid = '21798ddc9664ac0ef618f52b151dda82dafaf2e26d2bbef6cdaf55a6957ca237'; - txDb.fromIdWithInfo(txid, function(err, tx) { - if (err) done(err); - assert.equal(tx.txid, txid); - assert(!tx.info.isCoinBase); - done(); - }); - }); - - it('should pool tx\'s info from bitcoind', function(done) { - var txid = '21798ddc9664ac0ef618f52b151dda82dafaf2e26d2bbef6cdaf55a6957ca237'; - txDb.fromIdWithInfo(txid, function(err, tx) { - if (err) done(err); - assert.equal(tx.info.txid, txid); - assert.equal(tx.info.blockhash, '000000000185678d3d7ecc9962c96418174431f93fe20bf216d5565272423f74'); - assert.equal(tx.info.valueOut, 1.66174); - assert.equal(tx.info.fees, 0.0005 ); - assert.equal(tx.info.size, 226 ); - assert(!tx.info.isCoinBase); - done(); - }); - }); - - var txid1 = '2a104bab1782e9b6445583296d4a0ecc8af304e4769ceb64b890e8219c562399'; - it('test a coinbase TX ' + txid1, function(done) { - txDb.fromIdWithInfo(txid1, function(err, tx) { - if (err) done(err); - assert(tx.info.isCoinBase); - assert.equal(tx.info.txid, txid1); - assert(!tx.info.feeds); - done(); - }); - }); - var txid22 = '666'; - it('test invalid TX ' + txid22, function(done) { - txDb.fromIdWithInfo(txid22, function(err, tx) { - if (err && err.message.match(/must.be.hexadecimal/)) { - return done(); - } - else { - return done(err); - } - }); - }); - - var txid23 = '21798ddc9664ac0ef618f52b151dda82dafaf2e26d2bbef6cdaf55a6957ca227'; - it('test unexisting TX ' + txid23, function(done) { - - txDb.fromIdWithInfo(txid23, function(err, tx) { - assert(!err); - assert(!tx); - return done(); - }); - }); - - - - var txid2 = '64496d005faee77ac5a18866f50af6b8dd1f60107d6795df34c402747af98608'; - it('create TX on the fly ' + txid2, function(done) { - txDb.fromIdWithInfo(txid2, function(err, tx) { - if (err) return done(err); - assert.equal(tx.info.txid, txid2); - done(); - }); - }); - - txid2 = '64496d005faee77ac5a18866f50af6b8dd1f60107d6795df34c402747af98608'; - it('test a broken TX ' + txid2, function(done) { - txDb.fromIdWithInfo(txid2, function(err, tx) { - if (err) return done(err); - assert.equal(tx.info.txid, txid2); - assert.equal(tx.info.vin[0].addr, 'n1JagbRWBDi6VMvG7HfZmXX74dB9eiHJzU'); - done(); - }); - }); -}); - -describe('TransactionDb Outs', function(){ - - before(function(c) { - txDb = new TransactionDb(); - return c(); - }); - - txItemsValid.forEach( function(v) { - if (v.disabled) return; - it('test a processing tx ' + v.txid, function(done) { - this.timeout(60000); - - // Remove first - txDb.removeFromTxId(v.txid, function() { - - txDb.fromTxId( v.txid, function(err, readItems) { - assert.equal(readItems.length,0); - - var unmatch=[]; - txDb.createFromArray([v.txid], null, function(err) { - if (err) return done(err); - - txDb.fromTxId( v.txid, function(err, readItems) { - - v.items.forEach(function(validItem){ - unmatch[validItem.addr] =1; - }); - assert.equal(readItems.length,v.items.length); - - v.items.forEach(function(validItem){ - var readItem = readItems.shift(); - - assert.equal(readItem.addr,validItem.addr); - assert.equal(readItem.value_sat,validItem.value_sat); - assert.equal(readItem.index,validItem.index); - assert.equal(readItem.spendIndex, null); - assert.equal(readItem.spendTxIdBuf, null); - delete unmatch[validItem.addr]; - }); - - var valid = util.inspect(v.items, { depth: null }); - assert(!Object.keys(unmatch).length,'\n\tUnmatchs:' + Object.keys(unmatch) + "\n\n" +valid + '\nvs.\n' + readItems); - return done(); - - }); - }); - }); - }); - }); - }); -}); - - diff --git a/test/integration/02-transactionouts.js b/test/integration/02-transactionouts.js deleted file mode 100644 index 5b18fd2..0000000 --- a/test/integration/02-transactionouts.js +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env node -'use strict'; - -process.env.NODE_ENV = process.env.NODE_ENV || 'development'; - - - -var - assert = require('assert'), - fs = require('fs'), - util = require('util'), - async = require('async'), - config = require('../../config/config'), - TransactionDb = require('../../lib/TransactionDb').class(); - -var spentValid = JSON.parse(fs.readFileSync('test/integration/spent.json')); - -var txDb; - -describe('TransactionDb Expenses', function(){ - - before(function(c) { - txDb = new TransactionDb(); - - // lets spend! - async.each(Object.keys(spentValid), - function(txid,c_out) { - async.each(spentValid[txid], - function(i,c_in) { - txDb.createFromArray([i.txid], null, function(err) { - return c_in(); - }); - }, - function(err) { - return c_out(); - } - ); - }, - function(err) { - return c(); - } - ); - }); - - Object.keys(spentValid).forEach( function(txid) { - it('test result of spending tx ' + txid, function(done) { - var s = spentValid[txid]; - var c=0; - txDb.fromTxId( txid, function(err, readItems) { - s.forEach( function(v) { - assert.equal(readItems[c].spentTxId,v.txid); - assert.equal(readItems[c].spentIndex,v.n); - c++; - }); - done(); - }); - }); - }); -}); diff --git a/test/integration/99-sync.js.descructive-test b/test/integration/99-sync.js.descructive-test deleted file mode 100644 index 23ae44d..0000000 --- a/test/integration/99-sync.js.descructive-test +++ /dev/null @@ -1,548 +0,0 @@ -#!/usr/bin/env node -'use strict'; -process.env.NODE_ENV = process.env.NODE_ENV || 'development'; - - -var - assert = require('assert'), - async = require('async'), - HistoricSync = require('../../lib/HistoricSync').class(); - - -var s; -var b = [ - '00000000c4cbd75af741f3a2b2ff72d9ed4d83a048462c1efe331be31ccf006b', //0 B#16 - '00000000fe198cce4c8abf9dca0fee1182cb130df966cc428ad2a230df8da743', //1 - '000000008d55c3e978639f70af1d2bf1fe6f09cb3143e104405a599215c89a48', //2 - '000000009b3bca4909f38313f2746120129cce4a699a1f552390955da470c5a9', //3 - '00000000ede57f31cc598dc241d129ccb4d8168ef112afbdc870dc60a85f5dd3', //4 B#20 -]; -var t = [ - 'd08582d3711f75d085c618874fb0d049ae09d5ec95ec6f5abd289f4b54712c54', // TX from B#16 - '1729001087e0cebea8d14de1653d5cf59628d9746bc1ae65f776f1cbaff7ebad', //1 - 'cf53d7ccd83a099acfbc319ee10c1e3b10e3d42ba675b569fdd6b69cb8d2db4e', //2 - '73a4988adf462b6540cfa59097804174b298cfa439f73c1a072c2c6fbdbe57c7', //3 - 'd45f9da73619799e9d7bd03cc290e70875ea4cbad56b8bffa15135fbbb3df9ea', //4 Tx from B20 -]; - -var test = function(cb) { - async.each([2,3,4], function(i,c) { - s.sync.bDb.getPrev(b[i], function(err, p) { - assert.equal(p,b[i-1]); - return c(); - }); - }, function() { - async.each([0,1,2,3,4], function(i,c) { - s.sync.bDb.has(b[i], function(err, p) { - assert(p); - return c(); - }); - }, function() { - async.each([0,1,2,3], function(i,c) { - s.sync.bDb.getNext(b[i], function(err, p) { - assert.equal(p,b[i+1]); - return c(); - }); - }, cb); - }); - }); -}; - -/* - * TEST CASES - * - * Blocks: 0-1-2-3-4 - * case 1) - * 0-1-2-3-4 - * \ - * C1* - * - * case 2) - * 0-1-2---3-4 - * \ \ - * C1 C2* - * - * case 2b) - * 0-1-2---3-4 - * \ \ - * C1 C2-C2b(TX=C1.TX)* - * case 2c) - * 0-1-2---3-4 - * \ \ - * C1 C2-C2b(TX=C1.TX) - * \ - * C2c(TX=C2.TX)* - * - */ - -describe('Sync Reorgs', function(){ - - before(function(done) { - s = new HistoricSync(); - s.init({}, function(err) { - if (err) return done(err); - s.sync.destroy(done); - }); - }); - - it('simple RPC forward syncing', function(done) { - s.getPrevNextBlock(s.genesis,b[4], { - next: true, - }, function(err) { - if (err) return done(err); - test(done); - }); - }); - - var case1 = { - hash: '0000000000000000000000000000000000000000000000000000000000000001', - tx: [ 'f0596531810160d090813673b4a397f4617aab44eb26c7f06c8a766eac984b91' ], - time: 1296690099, - previousblockhash: b[2], - }; - - - it('reorg, case 1', function(done) { - async.series([ - function (c) { - s.sync.txDb.isConfirmed(t[0], function(err,is) { - assert(!err); - assert(is); - return c(); - }); - }, - function (c) { - s.sync.txDb.isConfirmed(t[3], function(err,is) { - assert(!err); - assert(is); - return c(); - }); - }, - function (c) { - s.sync.txDb.isConfirmed(t[4], function(err,is) { - assert(!err); - assert(is); - return c(); - }); - }, - function (c) { - s.sync.storeTipBlock(case1, function(err) { - assert(!err, 'shouldnt return error' + err); - return c(); - }); - }, - function (c) { - s.sync.bDb.isMain(b[2], function(err,is) { - assert(!err); - assert(is); - return c(); - }); - }, - function (c) { - s.sync.bDb.isMain(b[3], function(err,is) { - assert(!err); - assert(!is, b[3] + 'should not be on main chain'); - return c(); - }); - }, - function (c) { - s.sync.bDb.isMain(b[4], function(err,is) { - assert(!err); - assert(!is); - return c(); - }); - }, - function (c) { - s.sync.txDb.isConfirmed(t[0], function(err,is) { - assert(!err); - assert(is); - return c(); - }); - }, - function (c) { - s.sync.txDb.isConfirmed(t[3], function(err,is) { - assert(!err); - assert(!is); - return c(); - }); - }, - function (c) { - s.sync.txDb.isConfirmed(t[4], function(err,is) { - assert(!err); - assert(!is); - return c(); - }); - }, - function (c) { - s.sync.txDb.isConfirmed(case1.tx[0], function(err,is) { - assert(!err); - assert(is); - return c(); - }); - }, - ], done ); - }); - - it('reorg, case 1 (repeat)', function(done) { - s.sync.storeTipBlock(case1, function(err) { - assert(!err, 'shouldnt return error' + err); - return done(); - }); - }); - - var case2 = { - hash: '0000000000000000000000000000000000000000000000000000000000000002', - tx: [ '99bb359a4b12a588fcb9e59e5e8d92d593ce7a56d2ba42085fe86d9a0b4fde15' ], - time: 1296690099, - previousblockhash: b[3], - }; - - - it('reorg, case 2', function(done) { - async.series([ - function (c) { - s.sync.txDb.isConfirmed(t[0], function(err,is) { - assert(!err); - assert(is); - return c(); - }); - }, - function (c) { - s.sync.txDb.isConfirmed(case1.tx[0], function(err,is) { - assert(!err); - assert(is); - return c(); - }); - }, - function (c) { - s.sync.txDb.isConfirmed(t[4], function(err,is) { - assert(!err); - assert(!is); - return c(); - }); - }, - function (c) { - s.sync.storeTipBlock(case2, function(err) { - assert(!err, 'shouldnt return error' + err); - return c(); - }); - }, - function (c) { - s.sync.bDb.isMain(b[3], function(err,is) { - assert(!err); - assert(is); - return c(); - }); - }, - function (c) { - s.sync.bDb.isMain(b[4], function(err,is) { - assert(!err); - assert(!is, b[3] + 'should not be on main chain'); - return c(); - }); - }, - function (c) { - s.sync.bDb.isMain(case1.hash, function(err,is) { - assert(!err); - assert(!is); - return c(); - }); - }, - function (c) { - s.sync.bDb.isMain(case2.hash, function(err,is) { - assert(!err); - assert(is); - return c(); - }); - }, - function (c) { - s.sync.txDb.isConfirmed(t[3], function(err,is) { - assert(!err); - assert(is, 'transaction t[3] should be valid:' + t[3]); - return c(); - }); - }, - function (c) { - s.sync.txDb.isConfirmed(case1.tx[0], function(err,is) { - assert(!err); - assert(!is); - return c(); - }); - }, - function (c) { - s.sync.txDb.isConfirmed(case2.tx[0], function(err,is) { - assert(!err); - assert(is); - return c(); - }); - }, - function (c) { - s.sync.txDb.isConfirmed(t[4], function(err,is) { - assert(!err); - assert(!is); - return c(); - }); - }, - function (c) { - s.sync.bDb.getNext(b[2], function(err, val) { - assert(!err); - assert.equal(val,b[3]); - return c(); - }); - }, - - - - ], done ); - }); - - - var case2b = { - hash: '0000000000000000000000000000000000000000000000000000000000000003', - tx: case1.tx, - time: 1296690099, - previousblockhash: case2.hash, - }; - - it('reorg, case 2b', function(done) { - async.series([ - function (c) { - s.sync.txDb.isConfirmed(case2b.tx[0], function(err,is) { - assert(!err); - assert(!is); - return c(); - }); - }, - function (c) { - s.sync.storeTipBlock(case2b, function(err) { - assert(!err, 'shouldnt return error' + err); - return c(); - }); - }, - function (c) { - s.sync.txDb.isConfirmed(t[3], function(err,is) { - assert(!err); - assert(is, 'transaction t[3] should be valid:' + t[3]); - return c(); - }); - }, - function (c) { - s.sync.txDb.isConfirmed(case2b.tx[0], function(err,is) { - assert(!err); - assert(is); - return c(); - }); - }, - ], done ); - }); - - - - var case2c = { - hash: '0000000000000000000000000000000000000000000000000000000000000004', - tx: case2.tx, - time: 1296690099, - previousblockhash: case1.hash, - }; - - it('reorg, case 2c', function(done) { - async.series([ - function (c) { - s.sync.txDb.isConfirmed(case1.tx[0], function(err,is) { - assert(!err); - assert(is); - return c(); - }); - }, - function (c) { - s.sync.bDb.isMain(case1.hash, function(err,is) { - assert(!err); - assert(!is, 'case1 block shouldnt be main:' + case1.hash); - return c(); - }); - }, - function (c) { - s.sync.txDb.isConfirmed(case2c.tx[0], function(err,is) { - assert(!err); - assert(is); //It was there before (from case2) - return c(); - }); - }, - function (c) { - s.sync.storeTipBlock(case2c, function(err) { - assert(!err, 'shouldnt return error' + err); - return c(); - }); - }, - function (c) { - s.sync.txDb.isConfirmed(case1.tx[0], function(err,is) { - assert(!err); - assert(is); - return c(); - }); - }, - function (c) { - s.sync.bDb.has(case1.hash, function(err,is) { - assert(!err); - assert(is); - return c(); - }); - }, - function (c) { - s.sync.bDb.has(case2c.hash, function(err,is) { - assert(!err); - assert(is); - return c(); - }); - }, - function (c) { - s.sync.txDb.isConfirmed(case2c.tx[0], function(err,is) { - assert(!err); - assert(is); - return c(); - }); - }, - function (c) { - s.sync.txDb.isConfirmed(t[3], function(err,is) { - assert(!err); - assert(!is, 'TX t[3]: shouldnt be confirmed:' + t[3] +':'+ is); - return c(); - }); - }, - function (c) { - s.sync.txDb.isConfirmed(t[4], function(err,is) { - assert(!err); - assert(!is); - return c(); - }); - }, - function (c) { - s.sync.txDb.isConfirmed(case2.tx[0], function(err,is) { - assert(!err); - assert(is); - return c(); - }); - }, - - ], done ); - }); - - var case3 = { - hash: '0000000000000000000000000000000000000000000000000000000000000005', - tx: case2.tx, - time: 1296690099, - previousblockhash: '666', - }; - - it('reorg, case 3)', function(done) { - async.series([ - function (c) { - s.sync.storeTipBlock(case3, function(err) { - assert(!err, 'shouldnt return error' + err); - return c(); - }); - }, - - //shoudnt change anything - function (c) { - s.sync.txDb.isConfirmed(case1.tx[0], function(err,is) { - assert(!err); - assert(is); - return c(); - }); - }, - function (c) { - s.sync.bDb.has(case1.hash, function(err,is) { - assert(!err); - assert(is); - return c(); - }); - }, - function (c) { - s.sync.bDb.has(case2c.hash, function(err,is) { - assert(!err); - assert(is); - return c(); - }); - }, - function (c) { - s.sync.txDb.isConfirmed(case2c.tx[0], function(err,is) { - assert(!err); - assert(is); - return c(); - }); - }, - function (c) { - s.sync.txDb.isConfirmed(t[3], function(err,is) { - assert(!err); - assert(!is, 'TX t[3]: shouldnt be confirmed:' + t[3] +':'+ is); - return c(); - }); - }, - function (c) { - s.sync.txDb.isConfirmed(t[4], function(err,is) { - assert(!err); - assert(!is); - return c(); - }); - }, - function (c) { - s.sync.txDb.isConfirmed(case2.tx[0], function(err,is) { - assert(!err); - assert(is); - return c(); - }); - }, - - ], done ); - }); - - var p2p = { - hash: '0000000000000000000000000000000000000000000000000000000000000006', - tx: ['f6c2901f39fd07f2f2e503183d76f73ecc1aee9ac9216fde58e867bc29ce674e'], - time: 1296690099, - previousblockhash: '111', - }; - - it('p2p, no reorg allowed', function(done) { - async.series([ - function (c) { - s.sync.storeTipBlock(p2p, false, function(err) { - assert(!err, 'shouldnt return error' + err); - return c(); - }); - }, - function (c) { - s.sync.bDb.has(p2p.hash, function(err,is) { - assert(!err); - assert(is); - return c(); - }); - }, - function (c) { - s.sync.txDb.isConfirmed(p2p.tx[0], function(err,is) { - assert(!err); - assert(is); - return c(); - }); - }, - function (c) { - s.sync.bDb.getNext(p2p.hash, function(err,v) { - assert(!err); - assert.equal(v,p2p.nextblockhash); - return c(); - }); - }, - function (c) { - s.sync.bDb.getNext(p2p.previousblockhash, function(err,v) { - assert(!err); - assert.equal(v,p2p.hash); - return c(); - }); - }, - - ], done ); - }); -}); - - diff --git a/test/integration/addr.js b/test/integration/addr.js deleted file mode 100644 index fecc736..0000000 --- a/test/integration/addr.js +++ /dev/null @@ -1,81 +0,0 @@ -#!/usr/bin/env node - -'use strict'; - -process.env.NODE_ENV = process.env.NODE_ENV || 'development'; - -var assert = require('assert'), - fs = require('fs'), - Address = require('../../app/models/Address').class(), - TransactionDb = require('../../lib/TransactionDb').class(), - addrValid = JSON.parse(fs.readFileSync('test/integration/addr.json')), - utxoValid = JSON.parse(fs.readFileSync('test/integration/utxo.json')); - -var txDb; -describe('Address balances', function() { - - before(function(c) { - txDb = new TransactionDb(); - return c(); - }); - - addrValid.forEach(function(v) { - if (v.disabled) { - console.log(v.addr + ' => disabled in JSON'); - } else { - it('Address info for: ' + v.addr, function(done) { - this.timeout(5000); - - var a = new Address(v.addr, txDb); - - a.update(function(err) { - if (err) done(err); - assert.equal(v.addr, a.addrStr); - assert.equal(a.unconfirmedTxApperances ,0, 'unconfirmedTxApperances: 0'); - assert.equal(a.unconfirmedBalanceSat ,0, 'unconfirmedBalanceSat: 0'); - if (v.txApperances) - assert.equal(v.txApperances, a.txApperances, 'txApperances: ' + a.txApperances); - if (v.totalReceived) assert.equal(v.totalReceived, a.totalReceived, 'received: ' + a.totalReceived); - if (v.totalSent) assert.equal(v.totalSent, a.totalSent, 'send: ' + a.totalSent); - - if (v.balance) assert.equal(v.balance, a.balance, 'balance: ' + a.balance); - - if (v.transactions) { - - v.transactions.forEach(function(tx) { - assert(a.transactions.indexOf(tx) > -1, 'have tx ' + tx); - }); - } - done(); - }); - }); - } - }); - -}); - - -describe('Address utxo', function() { - utxoValid.forEach(function(v) { - if (v.disabled) { - console.log(v.addr + ' => disabled in JSON'); - } else { - it('Address utxo for: ' + v.addr, function(done) { - this.timeout(50000); - - var a = new Address(v.addr, txDb); - a.getUtxo(function(err, utxo) { - if (err) done(err); - assert.equal(v.addr, a.addrStr); - if (v.length) assert.equal(v.length, utxo.length, 'length: ' + utxo.length); - if (v.tx0id) assert.equal(v.tx0id, utxo[0].txid, 'have tx: ' + utxo[0].txid); - if (v.tx0scriptPubKey) - assert.equal(v.tx0scriptPubKey, utxo[0].scriptPubKey, 'have tx: ' + utxo[0].scriptPubKey); - if (v.tx0amount) - assert.equal(v.tx0amount, utxo[0].amount, 'amount: ' + utxo[0].amount); - done(); - }); - }); - } - }); -}); diff --git a/test/integration/addr.json b/test/integration/addr.json deleted file mode 100644 index 15c47af..0000000 --- a/test/integration/addr.json +++ /dev/null @@ -1,129 +0,0 @@ -[ - { - "addr": "mp3Rzxx9s1A21SY3sjJ3CQoa2Xjph7e5eS", - "balance": 0, - "totalReceived": 50, - "totalSent": 50.0, - "txApperances": 2 - }, - { - "addr": "muyg1K5WsHkfMVCkUXU2y7Xp5ZD6RGzCeH", - "balance": 0.38571339, - "totalReceived": 0.38571339, - "totalSent": 0, - "txApperances": 1 - }, - { - "addr": "mhPEfAmeKVwT7arwMYbhwnL2TfwuWbP4r4", - "totalReceived": 1069, - "txApperances": 13, - "balance": 1065, - "totalSent": 4 - }, - { - "addr": "n47CfqnKWdNwqY1UWxTmNJAqYutFxdH3zY", - "balance": 0, - "totalReceived":26.4245, - "totalSent": 26.4245, - "txApperances": 4 - }, - { - "addr": "mzSyyXgofoBxpr6gYcU3cV345G8hJpixRd", - "balance": 0, - "totalReceived":3.9775, - "totalSent": 3.9775, - "txApperances": 2 - }, - { - "addr": "mgqvRGJMwR9JU5VhJ3x9uX9MTkzTsmmDgQ", - "txApperances": 27, - "balance": 0, - "totalReceived": 54.81284116 - }, - { - "addr": "mzW2hdZN2um7WBvTDerdahKqRgj3md9C29", - "balance": 1199.74393853, - "totalReceived": 1199.74393853, - "totalSent": 0, - "txApperances": 6048 - }, - { - "addr": "mjRmkmYzvZN3cA3aBKJgYJ65epn3WCG84H", - "txApperances": 7164, - "balance": 46413.0, - "totalReceived": 357130.17644359, - "totalSent": 310717.17644359 - }, - { - "addr": "mgKY35SXqxFpcKK3Dq9mW9919N7wYXvcFM", - "txApperances": 1, - "balance": 0.01979459, - "totalReceived": 0.01979459, - "totalSent": 0, - "transactions": [ "91800d80bb4c69b238c9bfd94eb5155ab821e6b25cae5c79903d12853bbb4ed5" ] - }, - { - "addr": "mmvP3mTe53qxHdPqXEvdu8WdC7GfQ2vmx5", - "balance": 10580.50027254, - "totalReceived": 12157.65075053, - "totalSent": 1577.15047799, - "txApperances": 441, - "transactions": [ - "91800d80bb4c69b238c9bfd94eb5155ab821e6b25cae5c79903d12853bbb4ed5", - "f6e80d4fd1a2377406856c67d0cee5ac7e5120993ff97e617ca9aac33b4c6b1e", - "bc27f31caae86750b126d9b09e969362b85b7c15f41421387d682064544bf7e7", - "2cd6a1cb26880276fbc9851396f1bd8081cb2b9107ff6921e8fd65ed2df3df79", - "8bea41f573bccb7b648bc0b1bbfeba8a96da05b1d819ff4a33d39fbcd334ecfd", - "cb0d55c37acc57f759255193673e13858b5ab3d8fdfa7ee8b25f9964bdaa11e3", - "7b007aeace2299d27b6bb6c24d0a8040d6a87e4c2601216c34d226462b75f915", - "a9f40fbaecd2b28a05405e28b95566d7b3bd8ac38a2853debd72517f2994c6fc", - "4123255b7678e37c168b9e929927760bc5d9363b0c78ec61a7b4a78b2a07adab", - "cb3760529c2684c32047a2fddf0e2534c9241e5d72011aac4a8982e0c7b46df3", - "e8d00d8cc744381233dbc95e2d657345084dfb6df785b81285183f4c89b678d4", - "7a748364255c5b64979d9d3da35ea0fbef0114e0d7f96fccd5bea76f6d19f06b", - "d0b7e087040f67ef9bd9f21ccf53d1b5410400351d949cabf127caf28a6e7add", - "209f97873265652b83922921148cad92d7e048c6822e4864e984753e04181470", - "3a4af7755d3061ecced2f3707c2623534104f08aa73a52ca243d7ddecf5fe86d", - "4a4b5c8d464a77814ed35a37e2a28e821d467a803761427c057f67823309b725", - "d85f5265618fb694c3ea3ca6f73eba93df8a644bc1c7286cec2fbc2fbf7d895e", - "0d2c778ed9976b52792c941cac126bda37d3b1453082022d5e36ac401be3b249", - "daf03d666047ca0b5340b4a0027f8562b7c5bac87dca3727093b5393176a541a", - "a0dc03a870e589ea51e3d3a8aed0d34f4f1ae6844acad26dae48fe523b26e764", - "3df1a50e2e5d8525f04bd21a66bad824364a975449fa24fd5c2537d0f713919b", - "7bc26c1f3b4ab5ca57677593d28d13bff468a658f4d5efc379c1612554cf668e", - "ded4cbc9c52fd5599b6a93f89a79cde9aeb5a7f8f56732bb67ae9554325b3666", - "91224a219196a3f6e6f40ad2137b13fe54109e57aaed7527ea34aa903e6b8313", - "ee899a182bbb75e98ef14d83489e631dd66a8c5059dc8255692dd8ca9efba01f", - "0a61590c7548bd4f6a0df1575b268057e5e3e295a44eaeeb1dfbd01332c585ed", - "d56c22950ad2924f404b5b0baa6e49b0df1aaf09d1947842aed9d0178958eb9d", - "c6b5368c5a256141894972fbd02377b3894aa0df7c35fab5e0eca90de064fdc1", - "158e1f9c3f8ec44e88052cadef74e8eb99fbad5697d0b005ba48c933f7d96816", - "7f6191c0f4e3040901ef0d5d6e76af4f16423061ca1347524c86205e35d904d9", - "2c2e20f976b98a0ca76c57eca3653699b60c1bd9503cc9cc2fb755164a679a26", - "59bc81733ff0eaf2b106a70a655e22d2cdeff80ada27b937693993bf0c22e9ea", - "7da38b66fb5e8582c8be85abecfd744a6de89e738dd5f3aaa0270b218ec424eb", - "393d51119cdfbf0a308c0bbde2d4c63546c0961022bad1503c4bbaed0638c837", - "4518868741817ae6757fd98de27693b51fad100e89e5206b9bbf798aeebb804c", - "c58bce14de1e3016504babd8bbe8175207d75074134a2548a71743fa3e56c58d", - "6e69ec4a97515a8fd424f123a5fc1fdfd3c3adcd741292cbc09c09a2cc433bea", - "0e15f2498362050e5ceb6157d0fbf820fdcaf936e447207d433ee7701d7b99c2", - "a3789e113041db907a1217ddb5c3aaf0eff905cc3d913e68d977e1ab4d19acea", - "80b460922faf0ad1e8b8a55533654c9a9f3039bfff0fff2bcf8536b8adf95939" - ] - }, - { - "addr": "mtA6woo1wjCeu1dLkWgpSD3tRnRfrHt3FL", - "balance": 349.845, - "totalReceived": 349.845, - "totalSent": 0, - "txApperances": 13, - "transactions": [ - "794eafc0ad68a3576034eb137d7d20d3bdf1777ecf27e0e20e96e1adcfc66659", - "0130721f29f50b773858c3c9081678bdddebcd18078c5fa2436d979b54ed5cef", - "fb1024947b48d90255aedd3f0f1df3673a7e98d06346bb2ac89b116aa19c5db4" - ] - } - -] - - diff --git a/test/integration/block.js b/test/integration/block.js deleted file mode 100644 index 037f709..0000000 --- a/test/integration/block.js +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env node - -'use strict'; - -process.env.NODE_ENV = process.env.NODE_ENV || 'development'; - - -var TESTING_BLOCK = '000000000185678d3d7ecc9962c96418174431f93fe20bf216d5565272423f74'; - -var -assert = require('assert'), - // config = require('../../config/config'), - BlockDb = require('../../lib/BlockDb').class(); - -var bDb; - -describe('BlockDb fromHashWithInfo', function() { - - before(function(c) { - bDb = new BlockDb(); - return c(); - }); - - it('should poll block\'s info from bitcoind', function(done) { - bDb.fromHashWithInfo(TESTING_BLOCK, function(err, b2) { - if (err) done(err); - assert.equal(b2.hash, TESTING_BLOCK, 'hash'); - assert.equal(b2.info.hash, TESTING_BLOCK, 'info.hash'); - assert.equal(b2.info.height, 71619); - assert.equal(b2.info.nonce, 3960980741); - assert.equal(b2.info.bits, '1c018c14'); - assert.equal(b2.info.merkleroot, '9a326cb524aa2e5bc926b8c1f6de5b01257929ee02158054b55aae93a55ec9dd'); - assert.equal(b2.info.nextblockhash, '000000000121941b3b10d76fbe67b35993df91eb3398e9153e140b4f6213cb84'); - done(); - }); - }); - it('return true in has', function(done) { - bDb.has(TESTING_BLOCK, function(err, has) { - assert.equal(has, true); - done(); - }); - }); -}); diff --git a/test/integration/blockExtractor.js b/test/integration/blockExtractor.js deleted file mode 100644 index 13c7e8d..0000000 --- a/test/integration/blockExtractor.js +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/env node -'use strict'; - -process.env.NODE_ENV = process.env.NODE_ENV || 'development'; - - - -var assert = require('assert'), - config = require('../../config/config'), - BlockExtractor = require('../../lib/BlockExtractor').class(), - networks = require('bitcore/networks'), - util = require('bitcore/util/util'); - -//var txItemsValid = JSON.parse(fs.readFileSync('test/model/txitems.json')); - -describe('BlockExtractor', function(){ - - var be = new BlockExtractor(config.bitcoind.dataDir, config.network); - - var network = config.network === 'testnet' ? networks.testnet: networks.livenet; - - it('should glob block files ', function(done) { - assert(be.files.length>0); - done(); - }); - - var lastTs; - - it('should read genesis block ', function(done) { - be.getNextBlock(function(err,b) { - assert(!err); - var genesisHashReversed = new Buffer(32); - network.genesisBlock.hash.copy(genesisHashReversed); - var genesis = util.formatHashFull(network.genesisBlock.hash); - - assert.equal(util.formatHashFull(b.hash),genesis); - assert.equal(b.nounce,network.genesisBlock.nounce); - assert.equal(b.timestamp,network.genesisBlock.timestamp); - assert.equal(b.merkle_root.toString('hex'),network.genesisBlock.merkle_root.toString('hex')); - - lastTs = b.timestamp; - done(); - }); - }); - - it('should read next testnet block ', function(done) { - be.getNextBlock(function(err,b) { - assert(!err); - assert(b.timestamp > lastTs, 'timestamp > genesis_ts'); - done(); - }); - }); - - it.skip('should read 100000 blocks with no error ', function(done) { - - var i=0; - while(i++<100000) { - be.getNextBlock(function(err,b) { - assert(!err,err); - assert(lastTs < b.timestamp, 'genesisTS < b.timestamp: ' + lastTs + '<' + b.timestamp + ":" + i); - if(i % 1000 === 1) process.stdout.write('.'); - if(i === 100000) done(); - }); - } - }); - - - -}); - - - diff --git a/test/integration/blocklist.js b/test/integration/blocklist.js deleted file mode 100644 index 628ef0d..0000000 --- a/test/integration/blocklist.js +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env node -'use strict'; - -process.env.NODE_ENV = process.env.NODE_ENV || 'development'; - -var TESTING_BLOCK0 = '00000000b873e79784647a6c82962c70d228557d24a747ea4d1b8bbe878e1206'; -var TESTING_BLOCK1 = '000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943'; -var START_TS = 1; -var END_TS = '1296688928~'; // 2/2/2011 23:23PM - -var assert = require('assert'), - BlockDb = require('../../lib/BlockDb').class(); - -var bDb; - -describe('BlockDb getBlocksByDate', function(){ - - - before(function(c) { - bDb = new BlockDb(); - return c(); - }); - - it('Get Hash by Date', function(done) { - - bDb.getBlocksByDate(START_TS, END_TS, function(err, list) { - if (err) done(err); - assert(list, 'returns list'); - assert.equal(list.length,2, 'list has 2 items'); - assert.equal(list[0].hash, TESTING_BLOCK0); - assert.equal(list[1].hash, TESTING_BLOCK1); - done(); - }); - }); -}); - diff --git a/test/integration/nodecheck.js b/test/integration/nodecheck.js deleted file mode 100644 index 1cfef43..0000000 --- a/test/integration/nodecheck.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict'; - -var BlockDb = require('../../lib/BlockDb').class(); -var height_needed = 180000; -var bDb = new BlockDb(); - -var expect = require('chai').expect; - -describe('Node check', function() { - it('should contain block ' + height_needed, function(done) { - bDb.blockIndex(height_needed, function(err, b) { - expect(err).to.equal(null); - expect(b).to.not.equal(null); - done(); - }); - }); -}); diff --git a/test/integration/spent.json b/test/integration/spent.json deleted file mode 100644 index 351661b..0000000 --- a/test/integration/spent.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "21798ddc9664ac0ef618f52b151dda82dafaf2e26d2bbef6cdaf55a6957ca237": [ - { - "txid": "bcd8da8ee847da377f8aaca92502c05e5f914c6a2452753146013b0e642a25a0", - "n": 0 - }, - { - "txid": "deb7bddc67e936ae49b97a97885d29e60afc6f6784f6d871f2904614a67250f5", - "n": 0 - } - ], - "b633a6249d4a2bc123e7f8a151cae2d4afd17aa94840009f8697270c7818ceee": [ - { - "txid": "c0c46d6be0183f52c88afe2d649800ecdaa7594ee390c77bafbd06322e6c823d", - "n": 11 - }, - { - "txid": "d60e980419c5a8abd629fdea5032d561678b62e23b3fdba62b42f410c5a29560", - "n": 1 - } - ], - "ca2f42e44455b8a84434de139efea1fe2c7d71414a8939e0a20f518849085c3b": [ - { - "txid": "aa21822f1a69bc54e5a4ab60b25c09503702a821379fd2dfbb696b8ada4ce5b9", - "n": 0 - }, - { - "txid": "a33bd24a47ab6f23758ed09e05716f809614f2e280e5a05a317ec6d839e81225", - "n": 1 - } - ] -} diff --git a/test/integration/status.js b/test/integration/status.js deleted file mode 100644 index 82dea3a..0000000 --- a/test/integration/status.js +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env node -'use strict'; - -process.env.NODE_ENV = process.env.NODE_ENV || 'development'; - -var assert = require('assert'), - Status = require('../../app/models/Status').class(); - -describe('Status', function(){ - - it('getInfo', function(done) { - var d = new Status(); - - d.getInfo(function(err) { - if (err) done(err); - assert.equal('number', typeof d.info.difficulty); - done(); - }); - }); - - it('getDifficulty', function(done) { - var d = new Status(); - - d.getDifficulty(function(err) { - if (err) done(err); - assert.equal('number', typeof d.difficulty); - done(); - }); - }); - - it('getLastBlockHash', function(done) { - var d = new Status(); - - d.getLastBlockHash(function(err) { - if (err) done(err); - assert.equal('string', typeof d.lastblockhash); - done(); - }); - }); - - -}); - diff --git a/test/integration/txitems.json b/test/integration/txitems.json deleted file mode 100644 index 283e873..0000000 --- a/test/integration/txitems.json +++ /dev/null @@ -1,62 +0,0 @@ -[ - { - "disabled": 1, - "txid": "75c5ffe6dc2eb0f6bd011a08c041ef115380ccd637d859b379506a0dca4c26fc" - }, - { - "txid": "21798ddc9664ac0ef618f52b151dda82dafaf2e26d2bbef6cdaf55a6957ca237", - "toRm": [ - "txs-86a03cac7d87f596008c6d5a8d3fd8b88842932ea6f0337673eda16f6b472f7f-0", - "txs-bcd8da8ee847da377f8aaca92502c05e5f914c6a2452753146013b0e642a25a0-0" - ], - "items": [ - { - "addr": "mzjLe62faUqCSjkwQkwPAL5nYyR8K132fA", - "value_sat": 134574000, - "index": 0 - }, - { - "addr": "n28wb1cRGxPtfmsenYKFfsvnZ6kRapx3jF", - "value_sat": 31600000, - "index": 1 - } - ] - }, - { - "txid": "b633a6249d4a2bc123e7f8a151cae2d4afd17aa94840009f8697270c7818ceee", - "toRm": [ - "txs-01621403689cb4a95699a3dbae029d7031c5667678ef14e2054793954fb27917-0" - ], - "items": [ - { - "addr": "mhfQJUSissP6nLM5pz6DxHfctukrrLct2T", - "value_sat": 19300000, - "index": 0 - }, - { - "addr": "mzcDhbL877ES3MGftWnc3EuTSXs3WXDDML", - "value_sat": 21440667, - "index": 1 - } - ] - }, - { - "txid": "ca2f42e44455b8a84434de139efea1fe2c7d71414a8939e0a20f518849085c3b", - "toRm": [ - "txs-2d7b680fb06e4d7eeb65ca49ac7522276586e0090b7fe662fc708129429c5e6a-0" - ], - "items": [ - { - "addr": "mhqyL1nDQDo1WLH9qH8sjRjx2WwrnmAaXE", - "value_sat": 1327746, - "index": 0 - }, - { - "addr": "mkGrySSnxcqRbtPCisApj3zXCQVmUUWbf1", - "value_sat": 1049948, - "index": 1 - } - ] - } - -] diff --git a/test/integration/utxo.json b/test/integration/utxo.json deleted file mode 100644 index b38e4f0..0000000 --- a/test/integration/utxo.json +++ /dev/null @@ -1,16 +0,0 @@ -[ - { - "addr": "muyg1K5WsHkfMVCkUXU2y7Xp5ZD6RGzCeH", - "length": 1, - "tx0id": "eeabc70063d3f266e190e8735bc4599c811d3a79d138da1364e88502069b029c", - "tx0scriptPubKey": "76a9149e9f6515c70db535abdbbc983c7d8d1bff6c20cd88ac", - "tx0amount": 0.38571339 - }, - { - "addr": "mgKY35SXqxFpcKK3Dq9mW9919N7wYXvcFM", - "length": 1, - "tx0id": "91800d80bb4c69b238c9bfd94eb5155ab821e6b25cae5c79903d12853bbb4ed5", - "tx0scriptPubKey": "76a91408cf4ceb2b7278043fcc7f545e6e6e73ef9a644f88ac", - "tx0amount": 0.01979459 - } -] diff --git a/test/lib/PeerSync.js b/test/lib/PeerSync.js deleted file mode 100644 index c4dc973..0000000 --- a/test/lib/PeerSync.js +++ /dev/null @@ -1,50 +0,0 @@ -'use strict'; -var chai = require('chai'), - expect = chai.expect, - sinon = require('sinon'); - -var PeerSync = require('../../lib/PeerSync.js').class(); -describe('PeerSync', function() { - var ps; - - beforeEach(function(done) { - ps = new PeerSync(); - done(); - }); - afterEach(function() { - ps.close(); - }); - - - describe('#handleInv()', function() { - var inv_info = { - message: { - invs: [] - }, - conn: { - sendGetData: sinon.spy() - } - }; - it('should return with no errors', function() { - expect(function() { - ps.handleInv(inv_info); - }).not.to. - throw (Error); - }); - it('should call sendGetData', function() { - ps.handleInv(inv_info); - expect(inv_info.conn.sendGetData.calledTwice).to.be.ok; - }); - }); - - describe('#run()', function() { - it('should setup peerman', function() { - var startSpy = sinon.spy(ps.peerman, 'start'); - var onSpy = sinon.spy(ps.peerman, 'on'); - ps.run(); - - expect(startSpy.called).to.be.ok; - expect(onSpy.called).to.be.ok; - }); - }); -}); diff --git a/test/mocha.opts b/test/mocha.opts deleted file mode 100644 index a9caeb4..0000000 --- a/test/mocha.opts +++ /dev/null @@ -1,5 +0,0 @@ ---require should --R spec ---ui bdd ---recursive - diff --git a/util/p2p.js b/util/p2p.js deleted file mode 100755 index c7a11b5..0000000 --- a/util/p2p.js +++ /dev/null @@ -1,18 +0,0 @@ -#! /usr/bin/env node -'use strict'; - -process.env.NODE_ENV = process.env.NODE_ENV || 'development'; - -var PeerSync = require('../lib/PeerSync').class(); - -var PROGRAM_VERSION = '0.1'; -var program = require('commander'); - -program - .version(PROGRAM_VERSION) - .parse(process.argv); - -var ps = new PeerSync(); -ps.run(); - - diff --git a/util/sync.js b/util/sync.js deleted file mode 100755 index ee29e65..0000000 --- a/util/sync.js +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env node - - -'use strict'; - -process.env.NODE_ENV = process.env.NODE_ENV || 'development'; - -var SYNC_VERSION = '0.1'; -var program = require('commander'); -var HistoricSync = require('../lib/HistoricSync').class(); -var async = require('async'); - -program - .version(SYNC_VERSION) - .option('-D --destroy', 'Remove current DB (and start from there)', 0) - .option('-S --startfile', 'Number of file from bitcoind to start(default=0)') - .option('-R --rpc', 'Force sync with RPC') - .option('-v --verbose', 'Verbose 0/1', 0) - .parse(process.argv); - -var historicSync = new HistoricSync({ - shouldBroadcastSync: true, -}); - - -async.series([ - function(cb) { - if (!program.destroy) return cb(); - console.log('Deleting Sync DB...'); - historicSync.sync.destroy(cb); - }, - function(cb) { - historicSync.start({ - forceStartFile: program.startfile, - forceRPC: program.rpc, - },cb); - }, - ], - function(err) { - historicSync.close(); - if (err) console.log('CRITICAL ERROR: ', historicSync.info()); -}); -