minispade.register('app', "(function() {(function() {\n var Travis;\nminispade.require('routes');\n\n Travis = window.Travis;\n\n Travis.store = DS.Store.extend({\n revision: 4,\n adapter: Travis.FixtureAdapter.create()\n }).create();\n\n Travis.Build.find();\n\n Travis.Repository.find();\n\n Travis.Commit.find();\n\n Travis.Job.find();\n\n Travis.Artifact.find();\n\n Travis.initialize();\n\n}).call(this);\n\n})();\n//@ sourceURL=app");minispade.register('controllers', "(function() {(function() {\n\n Travis.ApplicationController = Em.Controller.extend();\n\n Travis.RepositoriesController = Em.ArrayController.extend();\n\n Travis.RepositoryController = Em.ObjectController.extend(Travis.Urls.Repository);\n\n Travis.TabsController = Em.Controller.extend();\n\n Travis.HistoryController = Em.ArrayController.extend();\n\n Travis.JobController = Em.ObjectController.extend();\n\n Travis.LoadingController = Em.Controller.extend();\n\n Travis.CurrentController = Travis.BuildController = Em.ObjectController.extend({\n classes: (function() {\n return Travis.Helpers.colorForResult(this.getPath('content.result'));\n }).property('content.result')\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=controllers");minispade.register('helpers/handlebars', "(function() {(function() {\n var safe;\n\n safe = function(string) {\n return new Handlebars.SafeString(string);\n };\n\n Handlebars.registerHelper('whats_this', function(id) {\n return safe(' ');\n });\n\n Handlebars.registerHelper('tipsy', function(text, tip) {\n return safe('' + text + '');\n });\n\n Handlebars.registerHelper('t', function(key) {\n return safe(I18n.t(key));\n });\n\n Ember.registerBoundHelper('formatTime', function(value, options) {\n return safe(Travis.Helpers.timeAgoInWords(value) || '-');\n });\n\n Ember.registerBoundHelper('formatDuration', function(duration, options) {\n return safe(Travis.Helpers.timeInWords(duration));\n });\n\n Ember.registerBoundHelper('formatCommit', function(commit, options) {\n var branch;\n branch = commit.get('branch');\n if (branch) {\n branch = \" \" + branch;\n }\n return safe((commit.get('sha') || '').substr(0, 7) + branch);\n });\n\n Ember.registerBoundHelper('formatSha', function(sha, options) {\n return safe((sha || '').substr(0, 7));\n });\n\n Ember.registerBoundHelper('pathFrom', function(url, options) {\n return safe((url || '').split('/').pop());\n });\n\n Ember.registerBoundHelper('formatMessage', function(message, options) {\n return safe(Travis.Helpers.formatMessage(message, options));\n });\n\n Ember.registerBoundHelper('formatConfig', function(config, options) {\n return safe(Travis.Helpers.formatConfig(config));\n });\n\n Ember.registerBoundHelper('formatLog', function(log, options) {\n if (log) {\n return Travis.Log.filter(log);\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=helpers/handlebars");minispade.register('helpers/helpers', "(function() {(function() {\n\n this.Travis.Helpers = {\n colorForResult: function(result) {\n if (result === 0) {\n return 'green';\n } else {\n if (result === 1) {\n return 'red';\n } else {\n return null;\n }\n }\n },\n formatConfig: function(config) {\n var values;\n config = $.only(config, 'rvm', 'gemfile', 'env', 'otp_release', 'php', 'node_js', 'scala', 'jdk', 'python', 'perl');\n values = $.map(config, function(value, key) {\n value = (value && value.join ? value.join(', ') : value) || '';\n return '%@: %@'.fmt($.camelize(key), value);\n });\n if (values.length === 0) {\n return '-';\n } else {\n return values.join(', ');\n }\n },\n formatMessage: function(message, options) {\n message = message || '';\n if (options.short) {\n message = message.split(/\\n/)[0];\n }\n return this._emojize(this._escape(message)).replace(/\\n/g, '
');\n },\n timeAgoInWords: function(date) {\n return $.timeago.distanceInWords(date);\n },\n durationFrom: function(started, finished) {\n started = started && this._toUtc(new Date(this._normalizeDateString(started)));\n finished = finished ? this._toUtc(new Date(this._normalizeDateString(finished))) : this._nowUtc();\n if (started && finished) {\n return Math.round((finished - started) / 1000);\n } else {\n return 0;\n }\n },\n timeInWords: function(duration) {\n var days, hours, minutes, result, seconds;\n days = Math.floor(duration / 86400);\n hours = Math.floor(duration % 86400 / 3600);\n minutes = Math.floor(duration % 3600 / 60);\n seconds = duration % 60;\n if (days > 0) {\n return 'more than 24 hrs';\n } else {\n result = [];\n if (hours === 1) {\n result.push(hours + ' hr');\n }\n if (hours > 1) {\n result.push(hours + ' hrs');\n }\n if (minutes > 0) {\n result.push(minutes + ' min');\n }\n if (seconds > 0) {\n result.push(seconds + ' sec');\n }\n if (result.length > 0) {\n return result.join(' ');\n } else {\n return '-';\n }\n }\n },\n _normalizeDateString: function(string) {\n if (window.JHW) {\n string = string.replace('T', ' ').replace(/-/g, '/');\n string = string.replace('Z', '').replace(/\\..*$/, '');\n }\n return string;\n },\n _nowUtc: function() {\n return this._toUtc(new Date());\n },\n _toUtc: function(date) {\n return Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n },\n _emojize: function(text) {\n var emojis;\n emojis = text.match(/:\\S+?:/g);\n if (emojis !== null) {\n $.each(emojis.uniq(), function(ix, emoji) {\n var image, strippedEmoji;\n strippedEmoji = emoji.substring(1, emoji.length - 1);\n if (EmojiDictionary.indexOf(strippedEmoji) !== -1) {\n image = '';\n return text = text.replace(new RegExp(emoji, 'g'), image);\n }\n });\n }\n return text;\n },\n _escape: function(text) {\n return text.replace(/&/g, '&').replace(//g, '>');\n }\n };\n\n}).call(this);\n\n})();\n//@ sourceURL=helpers/helpers");minispade.register('helpers/urls', "(function() {(function() {\n\n this.Travis.Urls = {\n Repository: {\n urlGithub: (function() {\n return 'http://github.com/%@'.fmt(this.get('slug'));\n }).property('slug'),\n urlGithubWatchers: (function() {\n return 'http://github.com/%@/watchers'.fmt(this.get('slug'));\n }).property('slug'),\n urlGithubNetwork: (function() {\n return 'http://github.com/%@/network'.fmt(this.get('slug'));\n }).property('slug'),\n urlGithubAdmin: (function() {\n return 'http://github.com/%@/admin/hooks#travis_minibucket'.fmt(this.get('slug'));\n }).property('slug'),\n statusImage: (function() {\n return '%@.png'.fmt(this.get('slug'));\n }).property('slug')\n },\n Commit: {\n urlAuthor: (function() {\n return 'mailto:%@'.fmt(this.getPath('commit.author_email'));\n }).property('commit'),\n urlCommitter: (function() {\n return 'mailto:%@'.fmt(this.getPath('commit.committer_email'));\n }).property('commit')\n },\n Build: {\n githubCommit: (function() {\n return 'http://github.com/%@/commit/%@'.fmt(this.getPath('repository.slug'), this.getPath('commit.sha'));\n }).property('repository.slug', 'commit.sha')\n }\n };\n\n}).call(this);\n\n})();\n//@ sourceURL=helpers/urls");minispade.register('models/artifact', "(function() {(function() {\n\n this.Travis.Artifact = Travis.Model.extend({\n body: DS.attr('string')\n });\n\n this.Travis.Artifact.FIXTURES = [\n {\n id: 1,\n body: 'log 1'\n }, {\n id: 2,\n body: 'log 2'\n }, {\n id: 3,\n body: 'log 3'\n }, {\n id: 4,\n body: 'log 4'\n }, {\n id: 5,\n body: 'log 4'\n }\n ];\n\n}).call(this);\n\n})();\n//@ sourceURL=models/artifact");minispade.register('models/branch', "(function() {(function() {\n\n this.Travis.Branch = Travis.Model.extend(Travis.Helpers, {\n repository_id: DS.attr('number'),\n number: DS.attr('number'),\n branch: DS.attr('string'),\n message: DS.attr('string'),\n result: DS.attr('number'),\n duration: DS.attr('number'),\n started_at: DS.attr('string'),\n finished_at: DS.attr('string'),\n commit: DS.belongsTo('Travis.Commit'),\n repository: (function() {\n if (this.get('repository_id')) {\n return Travis.Repository.find(this.get('repository_id'));\n }\n }).property('repository_id').cacheable(),\n tick: function() {\n this.notifyPropertyChange('started_at');\n return this.notifyPropertyChange('finished_at');\n }\n });\n\n this.Travis.Branch.reopenClass({\n byRepositoryId: function(id) {\n return this.find({\n repository_id: id\n });\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=models/branch");minispade.register('models/build', "(function() {(function() {\n\n this.Travis.Build = Travis.Model.extend({\n state: DS.attr('string'),\n number: DS.attr('number'),\n branch: DS.attr('string'),\n message: DS.attr('string'),\n result: DS.attr('number'),\n duration: DS.attr('number'),\n started_at: DS.attr('string'),\n finished_at: DS.attr('string'),\n committed_at: DS.attr('string'),\n committer_name: DS.attr('string'),\n committer_email: DS.attr('string'),\n author_name: DS.attr('string'),\n author_email: DS.attr('string'),\n compare_url: DS.attr('string'),\n repository: DS.belongsTo('Travis.Repository'),\n commit: DS.belongsTo('Travis.Commit'),\n config: (function() {\n return this.getPath('data.config');\n }).property('data.config'),\n isMatrix: (function() {\n return this.getPath('data.job_ids.length') > 1;\n }).property('data.job_ids.length'),\n isFailureMatrix: (function() {\n return this.getPath('allowedFailureJobs.length') > 0;\n }).property('allowedFailureJobs.length'),\n jobs: (function() {\n return Travis.Job.findMany(this.getPath('data.job_ids'));\n }).property('data.job_ids.length'),\n requiredJobs: (function() {\n return this.get('jobs').filter(function(job) {\n return job.get('allow_failure') !== true;\n });\n }).property('jobs'),\n allowedFailureJobs: (function() {\n return this.get('jobs').filter(function(job) {\n return job.get('allow_failure');\n });\n }).property('jobs'),\n configKeys: (function() {\n var config, headers, keys;\n config = this.get('config');\n if (!config) {\n return [];\n }\n keys = $.keys($.only(config, 'rvm', 'gemfile', 'env', 'otp_release', 'php', 'node_js', 'perl', 'python', 'scala'));\n headers = [I18n.t('build.job'), I18n.t('build.duration'), I18n.t('build.finished_at')];\n return $.map(headers.concat(keys), function(key) {\n return $.camelize(key);\n });\n }).property('config'),\n tick: function() {\n this.notifyPropertyChange('duration');\n return this.notifyPropertyChange('finished_at');\n }\n });\n\n this.Travis.Build.reopenClass({\n byRepositoryId: function(id, parameters) {\n return this.find($.extend(parameters || {}, {\n repository_id: id,\n orderBy: 'number DESC'\n }));\n },\n olderThanNumber: function(id, build_number) {\n return this.find({\n url: '/repositories/' + id + '/builds.json?bare=true&after_number=' + build_number,\n repository_id: id,\n orderBy: 'number DESC'\n });\n }\n });\n\n this.Travis.Build.FIXTURES = [\n {\n id: 1,\n repository_id: 1,\n commit_id: 1,\n job_ids: [1, 2],\n number: 1,\n event_type: 'push',\n config: {\n rvm: ['rbx', '1.9.3']\n },\n finished_at: '2012-06-20T00:21:20Z',\n duration: 35,\n result: 0\n }, {\n id: 2,\n repository_id: 1,\n commit_id: 2,\n job_ids: [1],\n number: 2,\n event_type: 'push'\n }, {\n id: 3,\n repository_id: 2,\n commit_id: 3,\n job_ids: [2],\n number: 3,\n event_type: 'push'\n }, {\n id: 4,\n repository_id: 3,\n commit_id: 4,\n job_ids: [3],\n number: 4,\n event_type: 'push'\n }\n ];\n\n}).call(this);\n\n})();\n//@ sourceURL=models/build");minispade.register('models/commit', "(function() {(function() {\n\n this.Travis.Commit = Travis.Model.extend({\n sha: DS.attr('string'),\n branch: DS.attr('string'),\n message: DS.attr('string'),\n compare_url: DS.attr('string'),\n author_name: DS.attr('string'),\n author_email: DS.attr('string'),\n committer_name: DS.attr('string'),\n committer_email: DS.attr('string'),\n build: DS.belongsTo('Travis.Build')\n });\n\n this.Travis.Commit.FIXTURES = [\n {\n id: 1,\n sha: '123456',\n branch: 'master',\n message: 'the commit message',\n compare_url: 'http://github.com/compare',\n author_name: 'Author',\n author_email: 'author@email.org',\n committer_name: 'Committer',\n committer_email: 'committer@email.org'\n }, {\n id: 2,\n sha: '234567',\n branch: 'feature',\n message: 'the commit message',\n compare_url: 'http://github.com/compare',\n author_name: 'Author',\n author_email: 'author@email.org',\n committer_name: 'Committer',\n committer_email: 'committer@email.org'\n }, {\n id: 3,\n sha: '345678',\n branch: 'master',\n message: 'the commit message',\n compare_url: 'http://github.com/compare',\n author_name: 'Author',\n author_email: 'author@email.org',\n committer_name: 'Committer',\n committer_email: 'committer@email.org'\n }, {\n id: 4,\n sha: '456789',\n branch: 'master',\n message: 'the commit message',\n compare_url: 'http://github.com/compare',\n author_name: 'Author',\n author_email: 'author@email.org',\n committer_name: 'Committer',\n committer_email: 'committer@email.org'\n }\n ];\n\n}).call(this);\n\n})();\n//@ sourceURL=models/commit");minispade.register('models/job', "(function() {(function() {\n\n this.Travis.Job = Travis.Model.extend({\n repository_id: DS.attr('number'),\n build_id: DS.attr('number'),\n log_id: DS.attr('number'),\n queue: DS.attr('string'),\n state: DS.attr('string'),\n number: DS.attr('string'),\n result: DS.attr('number'),\n duration: DS.attr('number'),\n started_at: DS.attr('string'),\n finished_at: DS.attr('string'),\n allow_failure: DS.attr('boolean'),\n repository: DS.belongsTo('Travis.Repository'),\n commit: DS.belongsTo('Travis.Commit'),\n build: DS.belongsTo('Travis.Build'),\n log: DS.belongsTo('Travis.Artifact'),\n config: (function() {\n return this.getPath('data.config');\n }).property('data.config'),\n sponsor: (function() {\n return this.getPath('data.sponsor');\n }).property('data.sponsor'),\n configValues: (function() {\n var config;\n config = this.get('config');\n if (!config) {\n return [];\n }\n return $.values($.only(config, 'rvm', 'gemfile', 'env', 'otp_release', 'php', 'node_js', 'scala', 'jdk', 'python', 'perl'));\n }).property('config'),\n appendLog: function(log) {\n return this.set('log', this.get('log') + log);\n },\n subscribe: function() {\n return Travis.app.subscribe('job-' + this.get('id'));\n },\n onStateChange: (function() {\n if (this.get('state') === 'finished') {\n return Travis.app.unsubscribe('job-' + this.get('id'));\n }\n }).observes('state'),\n tick: function() {\n this.notifyPropertyChange('duration');\n return this.notifyPropertyChange('finished_at');\n }\n });\n\n this.Travis.Job.reopenClass({\n queued: function(queue) {\n this.all();\n return Travis.store.filter(this, function(job) {\n return job.get('queue') === 'builds.' + queue;\n });\n },\n findMany: function(ids) {\n return Travis.store.findMany(this, ids);\n }\n });\n\n this.Travis.Job.FIXTURES = [\n {\n id: 1,\n repository_id: 1,\n build_id: 1,\n log_id: 1,\n number: '1.1',\n config: {\n rvm: 'rbx'\n },\n finished_at: '2012-06-20T00:21:20Z',\n duration: 35,\n result: 0\n }, {\n id: 2,\n repository_id: 1,\n build_id: 1,\n log_id: 2,\n number: '1.2',\n config: {\n rvm: '1.9.3'\n }\n }, {\n id: 3,\n repository_id: 1,\n build_id: 2,\n log_id: 3,\n number: '2.1'\n }, {\n id: 4,\n repository_id: 2,\n build_id: 3,\n log_id: 4,\n number: '3.1'\n }, {\n id: 5,\n repository_id: 3,\n build_id: 5,\n log_id: 5,\n number: '4.1'\n }\n ];\n\n}).call(this);\n\n})();\n//@ sourceURL=models/job");minispade.register('models/repository', "(function() {(function() {\n\n this.Travis.Repository = Travis.Model.extend({\n name: DS.attr('string'),\n owner: DS.attr('string'),\n description: DS.attr('string'),\n last_build_id: DS.attr('number'),\n last_build_number: DS.attr('string'),\n last_build_result: DS.attr('number'),\n last_build_started_at: DS.attr('string'),\n last_build_finished_at: DS.attr('string'),\n lastBuild: DS.belongsTo('Travis.Build'),\n builds: (function() {\n return Travis.Build.byRepositoryId(this.get('id'), {\n event_type: 'push'\n });\n }).property(),\n pullRequests: (function() {\n return Travis.Build.byRepositoryId(this.get('id'), {\n event_type: 'pull_request'\n });\n }).property(),\n slug: (function() {\n return \"\" + (this.get('owner')) + \"/\" + (this.get('name'));\n }).property('owner', 'name'),\n last_build_duration: (function() {\n var duration;\n duration = this.getPath('data.last_build_duration');\n if (!duration) {\n duration = Travis.Helpers.durationFrom(this.get('last_build_started_at'), this.get('last_build_finished_at'));\n }\n return duration;\n }).property('data.last_build_duration', 'last_build_started_at', 'last_build_finished_at'),\n stats: (function() {\n var _this = this;\n return this.get('_stats') || $.get(\"https://api.github.com/repos/\" + (this.get('slug')), function(data) {\n _this.set('_stats', data);\n return _this.notifyPropertyChange('stats');\n }) && {};\n }).property('slug'),\n select: function() {\n return Travis.Repository.select(self.get('id'));\n },\n tick: function() {\n this.notifyPropertyChange('last_build_duration');\n return this.notifyPropertyChange('last_build_finished_at');\n }\n });\n\n this.Travis.Repository.reopenClass({\n recent: function() {\n return this.find();\n },\n ownedBy: function(owner) {\n return this.find({\n owner: owner,\n orderBy: 'name'\n });\n },\n search: function(query) {\n return this.find({\n search: query,\n orderBy: 'name'\n });\n },\n bySlug: function(slug) {\n var repo;\n repo = $.detect(this.find().toArray(), function(repo) {\n return repo.get('slug') === slug;\n });\n if (repo) {\n return Ember.ArrayProxy.create({\n content: [repo]\n });\n } else {\n return this.find({\n slug: slug\n });\n }\n },\n select: function(id) {\n return this.find().forEach(function(repository) {\n return repository.set('selected', repository.get('id') === id);\n });\n }\n });\n\n this.Travis.Repository.FIXTURES = [\n {\n id: 1,\n owner: 'travis-ci',\n name: 'travis-core',\n build_ids: [1, 2],\n last_build_id: 1,\n last_build_number: 1,\n last_build_result: 0\n }, {\n id: 2,\n owner: 'travis-ci',\n name: 'travis-assets',\n build_ids: [3],\n last_build_id: 3,\n last_build_number: 3\n }, {\n id: 3,\n owner: 'travis-ci',\n name: 'travis-hub',\n build_ids: [4],\n last_build_id: 4,\n last_build_number: 4\n }\n ];\n\n}).call(this);\n\n})();\n//@ sourceURL=models/repository");minispade.register('models/service_hook', "(function() {(function() {\n\n this.Travis.ServiceHook = Travis.Model.extend({\n primaryKey: 'slug',\n name: DS.attr('string'),\n owner_name: DS.attr('string'),\n active: DS.attr('boolean'),\n slug: (function() {\n return [this.get('owner_name'), this.get('name')].join('/');\n }).property(),\n toggle: function() {\n this.set('active', !this.get('active'));\n return Travis.app.store.commit();\n }\n });\n\n this.Travis.ServiceHook.reopenClass({\n url: 'profile/service_hooks'\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=models/service_hook");minispade.register('models/worker', "(function() {(function() {\n\n this.Travis.WorkerGroup = Ember.ArrayProxy.extend({\n init: function() {\n return this.set('content', []);\n },\n host: (function() {\n return this.getPath('firstObject.host');\n }).property()\n });\n\n this.Travis.Worker = Travis.Model.extend({\n state: DS.attr('string'),\n name: DS.attr('string'),\n host: DS.attr('string'),\n last_seen_at: DS.attr('string'),\n isTesting: (function() {\n return this.get('state') === 'working' && !!this.getPath('payload.config');\n }).property('state', 'config'),\n number: (function() {\n return this.get('name').match(/\\d+$/)[0];\n }).property('name'),\n display: (function() {\n var name, number, payload, repo, state;\n name = this.get('name').replace('travis-', '');\n state = this.get('state');\n payload = this.get('payload');\n if (state === 'working' && payload !== void 0) {\n repo = payload.repository ? $.truncate(payload.repository.slug, 18) : void 0;\n number = payload.build && payload.build.number ? ' #' + payload.build.number : '';\n state = repo ? repo + number : state;\n }\n return name + ': ' + state;\n }).property('state'),\n urlJob: (function() {\n return '#!/%@/jobs/%@'.fmt(this.getPath('payload.repository.slug'), this.getPath('payload.build.id'));\n }).property('payload', 'state')\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=models/worker");minispade.register('routes', "(function() {(function() {\n\n Travis.Router = Em.Router.extend({\n enableLogging: true,\n location: 'hash',\n root: Em.Route.extend({\n viewRepository: Ember.Route.transitionTo('current'),\n index: Em.Route.extend({\n route: '/',\n connectOutlets: function(router) {\n return router.connectLayout({}, function(repository) {\n return router.connectCurrent(repository.get('lastBuild'));\n });\n },\n viewCurrent: Ember.Route.transitionTo('current'),\n viewHistory: Ember.Route.transitionTo('history'),\n viewBuild: Ember.Route.transitionTo('build')\n }),\n current: Em.Route.extend({\n route: '/:owner/:name',\n serialize: function(router, repository) {\n return router.serializeRepository(repository);\n },\n connectOutlets: function(router, repository) {\n var params;\n params = router.serializeRepository(repository);\n return router.connectLayout(params, function(repository) {\n var builds;\n builds = repository.get('builds');\n return onceLoaded(builds, function() {\n return router.connectCurrent(builds.get('firstObject'));\n });\n });\n }\n }),\n history: Em.Route.extend({\n route: '/:owner/:name/builds',\n serialize: function(router, repository) {\n return router.serializeRepository(repository);\n },\n connectOutlets: function(router, repository) {\n var params;\n params = router.serializeRepository(repository);\n return router.connectLayout(params, function(repository) {\n var builds;\n builds = repository.get('builds');\n return onceLoaded(builds, function() {\n return router.connectHistory(builds);\n });\n });\n }\n }),\n build: Em.Route.extend({\n route: '/:owner/:name/builds/:id',\n serialize: function(router, build) {\n return router.serializeObject(build);\n },\n connectOutlets: function(router, build) {\n var params;\n params = router.serializeObject(build);\n if (!(build instanceof Travis.Build)) {\n build = Travis.Build.find(params.id);\n }\n return router.connectLayout(params, build, function(repository, build) {\n return router.connectBuild(build);\n });\n }\n }),\n job: Em.Route.extend({\n route: '/:owner/:name/jobs/:id',\n serialize: function(router, job) {\n return router.serializeObject(job);\n },\n connectOutlets: function(router, job) {\n var build, params;\n params = router.serializeObject(job);\n if (!(build instanceof Travis.Job)) {\n job = Travis.Job.find(params.id);\n }\n build = job.get('build');\n return router.connectLayout(params, build, job, function(repository, job) {\n return router.connectJob(job);\n });\n }\n }),\n viewCurrent: Ember.Route.transitionTo('current'),\n viewHistory: Ember.Route.transitionTo('history'),\n viewBuild: Ember.Route.transitionTo('build'),\n viewJob: Ember.Route.transitionTo('job')\n }),\n serializeRepository: function(repository) {\n if (repository instanceof DS.Model) {\n return repository.getProperties('owner', 'name');\n } else {\n return repository || {};\n }\n },\n serializeObject: function(object) {\n var params, repository;\n if (object instanceof DS.Model) {\n repository = object.get('repository');\n params = this.serializeRepository(repository);\n return $.extend(params, {\n id: object.get('id')\n });\n } else {\n return object || {};\n }\n },\n connectLeft: function(repositories) {\n return this.get('applicationController').connectOutlet({\n outletName: 'left',\n name: 'repositories',\n context: repositories\n });\n },\n connectRight: function() {},\n connectLoading: function() {\n return this.get('applicationController').connectOutlet({\n outletName: 'main',\n name: 'loading'\n });\n },\n connectLayout: function(params, callback) {\n var args, build, job, repositories;\n args = Array.prototype.slice.call(arguments, 1);\n callback = args.pop();\n build = args.shift();\n job = args.shift();\n repositories = Travis.Repository.find();\n this.connectLeft(repositories);\n this.connectMain(repositories, params, build, job, callback);\n return this.connectRight();\n },\n connectMain: function(repositories, params, build, job, callback) {\n var _this = this;\n this.connectLoading();\n if (params.owner && params.name) {\n repositories = Travis.Repository.find().filter(function(data) {\n return data.get('owner_name') === params.owner_name && data.get('name') === params.name;\n });\n }\n if (job && !build) {\n build = job.get('build');\n }\n return onceLoaded(repositories, build, function() {\n var repository;\n repository = repositories.get('firstObject');\n _this.connectRepository(repository);\n _this.connectTabs(repository, build, job);\n return callback(repository, build);\n });\n },\n connectRepository: function(repository) {\n return this.get('applicationController').connectOutlet({\n outletName: 'main',\n name: 'repository',\n context: repository\n });\n },\n connectTabs: function(repository, build, job) {\n this.setPath('tabsController.repository', repository);\n this.setPath('tabsController.build', build);\n this.setPath('tabsController.job', job);\n return this.get('repositoryController').connectOutlet({\n outletName: 'tabs',\n name: 'tabs'\n });\n },\n connectCurrent: function(build) {\n return this.get('repositoryController').connectOutlet({\n outletName: 'tab',\n name: 'current',\n context: build\n });\n },\n connectHistory: function(builds) {\n return this.get('repositoryController').connectOutlet({\n outletName: 'tab',\n name: 'history',\n context: builds\n });\n },\n connectBuild: function(build) {\n return this.get('repositoryController').connectOutlet({\n outletName: 'tab',\n name: 'build',\n context: build\n });\n },\n connectJob: function(job) {\n return this.get('repositoryController').connectOutlet({\n outletName: 'tab',\n name: 'job',\n context: job\n });\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=routes");minispade.register('views', "(function() {(function() {\n\n Travis.ApplicationView = Em.View.extend({\n templateName: 'application'\n });\n\n Travis.RepositoriesView = Em.View.extend({\n templateName: 'repositories/list'\n });\n\n Travis.RepositoriesItemView = Em.View.extend({\n classes: (function() {\n var classes, color;\n color = Travis.Helpers.colorForResult(this.getPath('content.last_build_result'));\n classes = ['repository', color];\n if (this.getPath('content.selected')) {\n classes.push('selected');\n }\n return classes.join(' ');\n }).property('content.last_build_result', 'content.selected')\n });\n\n Travis.RepositoryView = Em.View.extend({\n templateName: 'repositories/show'\n });\n\n Travis.TabsView = Em.View.extend({\n templateName: 'repositories/tabs'\n });\n\n Travis.HistoryView = Em.View.extend({\n templateName: 'builds/list'\n });\n\n Travis.BuildsItemView = Em.View.extend({\n classes: (function() {\n return Travis.Helpers.colorForResult(this.getPath('content.result'));\n }).property('content.result')\n });\n\n Travis.CurrentView = Travis.BuildView = Em.View.extend({\n templateName: 'builds/show'\n });\n\n Travis.LoadingView = Em.View.extend({\n templateName: 'loading'\n });\n\n Travis.JobsView = Em.View.extend({\n templateName: 'jobs/list'\n });\n\n Travis.JobView = Em.View.extend({\n templateName: 'jobs/show'\n });\n\n Travis.LogView = Em.View.extend({\n templateName: 'jobs/log'\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=views");minispade.register('data_store_adapter', "(function() {(function() {\n\n this.Travis.FixtureAdapter = DS.Adapter.extend({\n find: function(store, type, id) {\n var fixtures;\n fixtures = type.FIXTURES;\n Ember.assert(\"Unable to find fixtures for model type \" + type.toString(), !!fixtures);\n if (fixtures.hasLoaded) {\n return;\n }\n return setTimeout((function() {\n store.loadMany(type, fixtures);\n return fixtures.hasLoaded = true;\n }), 300);\n },\n findMany: function() {\n return this.find.apply(this, arguments);\n },\n findAll: function(store, type) {\n var fixtures, ids;\n fixtures = type.FIXTURES;\n Ember.assert(\"Unable to find fixtures for model type \" + type.toString(), !!fixtures);\n ids = fixtures.map(function(item, index, self) {\n return item.id;\n });\n return store.loadMany(type, ids, fixtures);\n },\n findQuery: function(store, type, params, array) {\n var fixture, fixtures, hashes, key, matches, value;\n fixtures = type.FIXTURES;\n Ember.assert(\"Unable to find fixtures for model type \" + type.toString(), !!fixtures);\n hashes = (function() {\n var _i, _len, _results;\n _results = [];\n for (_i = 0, _len = fixtures.length; _i < _len; _i++) {\n fixture = fixtures[_i];\n matches = (function() {\n var _results1;\n _results1 = [];\n for (key in params) {\n value = params[key];\n _results1.push(key === 'orderBy' || fixture[key] === value);\n }\n return _results1;\n })();\n if (matches.reduce(function(a, b) {\n return a && b;\n })) {\n _results.push(fixture);\n } else {\n _results.push(null);\n }\n }\n return _results;\n })();\n return array.load(hashes.compact());\n }\n });\n\n this.Travis.DataStoreAdapter = DS.RESTAdapter.extend({\n init: function() {\n this._super();\n return this.set('mappings', {\n builds: Travis.Build,\n commits: Travis.Commit,\n jobs: Travis.Job,\n service_hooks: Travis.ServiceHook\n });\n },\n plurals: {\n repository: 'repositories',\n branch: 'branches'\n },\n updateRecord: function(store, type, record) {\n var data, id, plural, root, url;\n id = get(record, record.get('primaryKey') || 'id');\n root = this.rootForType(type);\n plural = this.pluralize(root);\n url = this.buildURL(type.url || plural, id);\n data = {\n root: record.toJSON()\n };\n return this.ajax(url, 'PUT', {\n data: data,\n success: function(json) {\n this.sideload(store, type, json, root);\n return store.didUpdateRecord(record, json && json[root]);\n }\n });\n },\n find: function(store, type, id) {\n var plural, root, url;\n root = this.rootForType(type);\n plural = this.pluralize(root);\n url = this.buildURL(type.url || plural, id);\n return this.ajax(url, 'GET', {\n success: function(json) {\n this.sideload(store, type, json, root);\n return store.load(type, json[root]);\n },\n accepts: {\n json: 'application/vnd.travis-ci.2+json'\n }\n });\n },\n findMany: function(store, type, ids) {\n var plural, root, url;\n root = this.rootForType(type);\n plural = this.pluralize(root);\n url = this.buildURL(type.url || plural);\n return this.ajax(url, 'GET', {\n data: {\n ids: ids\n },\n success: function(json) {\n this.sideload(store, type, json, plural);\n return store.loadMany(type, json[plural]);\n },\n accepts: {\n json: 'application/vnd.travis-ci.2+json'\n }\n });\n },\n findAll: function(store, type) {\n var plural, root, url;\n root = this.rootForType(type);\n plural = this.pluralize(root);\n url = this.buildURL(type.url || plural);\n return this.ajax(url, 'GET', {\n success: function(json) {\n this.sideload(store, type, json, plural);\n return store.loadMany(type, json[plural]);\n },\n accepts: {\n json: 'application/vnd.travis-ci.2+json'\n }\n });\n },\n findQuery: function(store, type, query, recordArray) {\n var plural, root, url;\n root = this.rootForType(type);\n plural = this.pluralize(root);\n url = this.buildURL(type.url || plural);\n return this.ajax(url, 'GET', {\n data: query,\n success: function(json) {\n this.sideload(store, type, json, plural);\n return recordArray.load(json[plural]);\n },\n accepts: {\n json: 'application/vnd.travis-ci.2+json'\n }\n });\n },\n rootForType: function(type) {\n var name, parts;\n parts = type.toString().split('.');\n name = parts[parts.length - 1];\n return name.replace(/([A-Z])/g, '_$1').toLowerCase().slice(1);\n },\n buildURL: function(record, suffix) {\n var url;\n Ember.assert('Namespace URL (' + this.namespace + ') must not start with slash', !this.namespace || this.namespace.toString().charAt(0) !== '/');\n Ember.assert('Record URL (' + record + ') must not start with slash', !record || record.toString().charAt(0) !== '/');\n Ember.assert('URL suffix (' + suffix + ') must not start with slash', !suffix || suffix.toString().charAt(0) !== '/');\n url = [''];\n if (this.namespace !== void 0) {\n url.push(this.namespace);\n }\n url.push(record);\n if (suffix !== void 0) {\n url.push(suffix);\n }\n return url.join('/');\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=data_store_adapter");minispade.register('emoij', "(function() {(function() {\n\n this.EmojiDictionary = ['-1', '0', '1', '109', '2', '3', '4', '5', '6', '7', '8', '8ball', '9', 'a', 'ab', 'airplane', 'alien', 'ambulance', 'angel', 'anger', 'angry', 'apple', 'aquarius', 'aries', 'arrow_backward', 'arrow_down', 'arrow_forward', 'arrow_left', 'arrow_lower_left', 'arrow_lower_right', 'arrow_right', 'arrow_up', 'arrow_upper_left', 'arrow_upper_right', 'art', 'astonished', 'atm', 'b', 'baby', 'baby_chick', 'baby_symbol', 'balloon', 'bamboo', 'bank', 'barber', 'baseball', 'basketball', 'bath', 'bear', 'beer', 'beers', 'beginner', 'bell', 'bento', 'bike', 'bikini', 'bird', 'birthday', 'black_square', 'blue_car', 'blue_heart', 'blush', 'boar', 'boat', 'bomb', 'book', 'boot', 'bouquet', 'bow', 'bowtie', 'boy', 'bread', 'briefcase', 'broken_heart', 'bug', 'bulb', 'bullettrain_front', 'bullettrain_side', 'bus', 'busstop', 'cactus', 'cake', 'calling', 'camel', 'camera', 'cancer', 'capricorn', 'car', 'cat', 'cd', 'chart', 'checkered_flag', 'cherry_blossom', 'chicken', 'christmas_tree', 'church', 'cinema', 'city_sunrise', 'city_sunset', 'clap', 'clapper', 'clock1', 'clock10', 'clock11', 'clock12', 'clock2', 'clock3', 'clock4', 'clock5', 'clock6', 'clock7', 'clock8', 'clock9', 'closed_umbrella', 'cloud', 'clubs', 'cn', 'cocktail', 'coffee', 'cold_sweat', 'computer', 'confounded', 'congratulations', 'construction', 'construction_worker', 'convenience_store', 'cool', 'cop', 'copyright', 'couple', 'couple_with_heart', 'couplekiss', 'cow', 'crossed_flags', 'crown', 'cry', 'cupid', 'currency_exchange', 'curry', 'cyclone', 'dancer', 'dancers', 'dango', 'dart', 'dash', 'de', 'department_store', 'diamonds', 'disappointed', 'dog', 'dolls', 'dolphin', 'dress', 'dvd', 'ear', 'ear_of_rice', 'egg', 'eggplant', 'egplant', 'eight_pointed_black_star', 'eight_spoked_asterisk', 'elephant', 'email', 'es', 'european_castle', 'exclamation', 'eyes', 'factory', 'fallen_leaf', 'fast_forward', 'fax', 'fearful', 'feelsgood', 'feet', 'ferris_wheel', 'finnadie', 'fire', 'fire_engine', 'fireworks', 'fish', 'fist', 'flags', 'flushed', 'football', 'fork_and_knife', 'fountain', 'four_leaf_clover', 'fr', 'fries', 'frog', 'fuelpump', 'gb', 'gem', 'gemini', 'ghost', 'gift', 'gift_heart', 'girl', 'goberserk', 'godmode', 'golf', 'green_heart', 'grey_exclamation', 'grey_question', 'grin', 'guardsman', 'guitar', 'gun', 'haircut', 'hamburger', 'hammer', 'hamster', 'hand', 'handbag', 'hankey', 'hash', 'headphones', 'heart', 'heart_decoration', 'heart_eyes', 'heartbeat', 'heartpulse', 'hearts', 'hibiscus', 'high_heel', 'horse', 'hospital', 'hotel', 'hotsprings', 'house', 'hurtrealbad', 'icecream', 'id', 'ideograph_advantage', 'imp', 'information_desk_person', 'iphone', 'it', 'jack_o_lantern', 'japanese_castle', 'joy', 'jp', 'key', 'kimono', 'kiss', 'kissing_face', 'kissing_heart', 'koala', 'koko', 'kr', 'leaves', 'leo', 'libra', 'lips', 'lipstick', 'lock', 'loop', 'loudspeaker', 'love_hotel', 'mag', 'mahjong', 'mailbox', 'man', 'man_with_gua_pi_mao', 'man_with_turban', 'maple_leaf', 'mask', 'massage', 'mega', 'memo', 'mens', 'metal', 'metro', 'microphone', 'minidisc', 'mobile_phone_off', 'moneybag', 'monkey', 'monkey_face', 'moon', 'mortar_board', 'mount_fuji', 'mouse', 'movie_camera', 'muscle', 'musical_note', 'nail_care', 'necktie', 'new', 'no_good', 'no_smoking', 'nose', 'notes', 'o', 'o2', 'ocean', 'octocat', 'octopus', 'oden', 'office', 'ok', 'ok_hand', 'ok_woman', 'older_man', 'older_woman', 'open_hands', 'ophiuchus', 'palm_tree', 'parking', 'part_alternation_mark', 'pencil', 'penguin', 'pensive', 'persevere', 'person_with_blond_hair', 'phone', 'pig', 'pill', 'pisces', 'plus1', 'point_down', 'point_left', 'point_right', 'point_up', 'point_up_2', 'police_car', 'poop', 'post_office', 'postbox', 'pray', 'princess', 'punch', 'purple_heart', 'question', 'rabbit', 'racehorse', 'radio', 'rage', 'rage1', 'rage2', 'rage3', 'rage4', 'rainbow', 'raised_hands', 'ramen', 'red_car', 'red_circle', 'registered', 'relaxed', 'relieved', 'restroom', 'rewind', 'ribbon', 'rice', 'rice_ball', 'rice_cracker', 'rice_scene', 'ring', 'rocket', 'roller_coaster', 'rose', 'ru', 'runner', 'sa', 'sagittarius', 'sailboat', 'sake', 'sandal', 'santa', 'satellite', 'satisfied', 'saxophone', 'school', 'school_satchel', 'scissors', 'scorpius', 'scream', 'seat', 'secret', 'shaved_ice', 'sheep', 'shell', 'ship', 'shipit', 'shirt', 'shit', 'shoe', 'signal_strength', 'six_pointed_star', 'ski', 'skull', 'sleepy', 'slot_machine', 'smile', 'smiley', 'smirk', 'smoking', 'snake', 'snowman', 'sob', 'soccer', 'space_invader', 'spades', 'spaghetti', 'sparkler', 'sparkles', 'speaker', 'speedboat', 'squirrel', 'star', 'star2', 'stars', 'station', 'statue_of_liberty', 'stew', 'strawberry', 'sunflower', 'sunny', 'sunrise', 'sunrise_over_mountains', 'surfer', 'sushi', 'suspect', 'sweat', 'sweat_drops', 'swimmer', 'syringe', 'tada', 'tangerine', 'taurus', 'taxi', 'tea', 'telephone', 'tennis', 'tent', 'thumbsdown', 'thumbsup', 'ticket', 'tiger', 'tm', 'toilet', 'tokyo_tower', 'tomato', 'tongue', 'top', 'tophat', 'traffic_light', 'train', 'trident', 'trophy', 'tropical_fish', 'truck', 'trumpet', 'tshirt', 'tulip', 'tv', 'u5272', 'u55b6', 'u6307', 'u6708', 'u6709', 'u6e80', 'u7121', 'u7533', 'u7a7a', 'umbrella', 'unamused', 'underage', 'unlock', 'up', 'us', 'v', 'vhs', 'vibration_mode', 'virgo', 'vs', 'walking', 'warning', 'watermelon', 'wave', 'wc', 'wedding', 'whale', 'wheelchair', 'white_square', 'wind_chime', 'wink', 'wink2', 'wolf', 'woman', 'womans_hat', 'womens', 'x', 'yellow_heart', 'zap', 'zzz'];\n\n}).call(this);\n\n})();\n//@ sourceURL=emoij");minispade.register('ext/jquery.js', "(function() {(function() {\n\n $.fn.extend({\n outerHtml: function() {\n return $(this).wrap('
%@%@
\\n'.fmt(path, path, number, number, line);\n });\n return result.trim();\n },\n deansi: function(log) {\n var ansi, text;\n log = log.replace(/\\r\\r/g, '\\r').replace(/\\033\\[K\\r/g, '\\r').replace(/^.*\\r(?!$)/g, '').replace(/\u001b\\[2K/g, '').replace(/\\033\\(B/g, '');\n ansi = ansiparse(log);\n text = '';\n ansi.forEach(function(part) {\n var classes;\n classes = [];\n part.foreground && classes.push(part.foreground);\n part.background && classes.push('bg-' + part.background);\n part.bold && classes.push('bold');\n part.italic && classes.push('italic');\n return text += (classes.length ? '' + part.text + '' : part.text);\n });\n return text.replace(/\\033/g, '');\n },\n fold: function(log) {\n log = this.unfold(log);\n $.each(Travis.Log.FOLDS, function(name, pattern) {\n return log = log.replace(pattern, function() {\n return '