{ "log": { "version": "1.2", "creator": { "name": "WebInspector", "version": "537.36" }, "pages": [ { "startedDateTime": "2016-09-15T02:01:51.044Z", "id": "page_4", "title": "http://gc-build-01.soteriadev.net/blue/pipelines/", "pageTimings": { "onContentLoad": 8465.392999991309, "onLoad": 8465.323999989778 } } ], "entries": [ { "startedDateTime": "2016-09-15T02:01:51.044Z", "time": 277.8319999924861, "request": { "method": "GET", "url": "http://gc-build-01.soteriadev.net/blue/pipelines/", "httpVersion": "HTTP/1.1", "headers": [ { "name": "Pragma", "value": "no-cache" }, { "name": "Accept-Encoding", "value": "gzip, deflate, sdch" }, { "name": "Host", "value": "gc-build-01.soteriadev.net" }, { "name": "Accept-Language", "value": "en-US,en;q=0.8" }, { "name": "Upgrade-Insecure-Requests", "value": "1" }, { "name": "User-Agent", "value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" }, { "name": "Accept", "value": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" }, { "name": "Cache-Control", "value": "no-cache" }, { "name": "Cookie", "value": "ACEGI_SECURITY_HASHED_REMEMBER_ME_COOKIE=ZGFycmFnaF9zaGVyd2luOjE0NzQ0NDgxODU0Mzg6ODlkMzlmMmIzZTE0OWE5ZmZkNzlhYWFhNjAwNDk2NjhkNDU2YzNkNmFlODZlMGQ4ZDM5MTM3Y2UzYWRmNGM2Zg==; jenkins-timestamper-offset=25200000; jenkins-timestamper=system; jenkins-timestamper-local=false; JSESSIONID.0a959749=1hk2jl2xk3r511uypp40s4qsgo; JSESSIONID.96246bea=8iofxbtqat6w171206x9d8j2p; screenResolution=1920x1200" }, { "name": "Connection", "value": "keep-alive" } ], "queryString": [], "cookies": [ { "name": "ACEGI_SECURITY_HASHED_REMEMBER_ME_COOKIE", "value": "ZGFycmFnaF9zaGVyd2luOjE0NzQ0NDgxODU0Mzg6ODlkMzlmMmIzZTE0OWE5ZmZkNzlhYWFhNjAwNDk2NjhkNDU2YzNkNmFlODZlMGQ4ZDM5MTM3Y2UzYWRmNGM2Zg==", "expires": null, "httpOnly": false, "secure": false }, { "name": "jenkins-timestamper-offset", "value": "25200000", "expires": null, "httpOnly": false, "secure": false }, { "name": "jenkins-timestamper", "value": "system", "expires": null, "httpOnly": false, "secure": false }, { "name": "jenkins-timestamper-local", "value": "false", "expires": null, "httpOnly": false, "secure": false }, { "name": "JSESSIONID.0a959749", "value": "1hk2jl2xk3r511uypp40s4qsgo", "expires": null, "httpOnly": false, "secure": false }, { "name": "JSESSIONID.96246bea", "value": "8iofxbtqat6w171206x9d8j2p", "expires": null, "httpOnly": false, "secure": false }, { "name": "screenResolution", "value": "1920x1200", "expires": null, "httpOnly": false, "secure": false } ], "headersSize": 854, "bodySize": 0 }, "response": { "status": 200, "statusText": "OK", "httpVersion": "HTTP/1.1", "headers": [ { "name": "Date", "value": "Thu, 15 Sep 2016 02:01:50 GMT" }, { "name": "Content-Encoding", "value": "gzip" }, { "name": "X-Content-Type-Options", "value": "nosniff" }, { "name": "Server", "value": "nginx/1.2.1" }, { "name": "Connection", "value": "keep-alive" }, { "name": "Content-Length", "value": "980" }, { "name": "Content-Type", "value": "text/html;charset=UTF-8" } ], "cookies": [], "content": { "size": 2569, "mimeType": "text/html", "compression": 1589, "text": "\n \n\n Jenkins Blue Ocean
" }, "redirectURL": "", "headersSize": 218, "bodySize": 980, "_transferSize": 1198 }, "cache": {}, "timings": { "blocked": 1.55400000221562, "dns": -1, "connect": -1, "send": 0.07999999797903001, "wait": 273.77699999487936, "receive": 2.420999997412082, "ssl": -1 }, "serverIPAddress": "146.148.6.102", "connection": "474768", "pageref": "page_4" }, { "startedDateTime": "2016-09-15T02:01:51.381Z", "time": 524.8099999880651, "request": { "method": "GET", "url": "http://gc-build-01.soteriadev.net/adjuncts/76087cd9/org/jenkinsci/plugins/ssegateway/sse/EventSource.js", "httpVersion": "HTTP/1.1", "headers": [ { "name": "Pragma", "value": "no-cache" }, { "name": "Accept-Encoding", "value": "gzip, deflate, sdch" }, { "name": "Host", "value": "gc-build-01.soteriadev.net" }, { "name": "Accept-Language", "value": "en-US,en;q=0.8" }, { "name": "User-Agent", "value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" }, { "name": "Accept", "value": "*/*" }, { "name": "Referer", "value": "http://gc-build-01.soteriadev.net/blue/pipelines/" }, { "name": "Cookie", "value": "ACEGI_SECURITY_HASHED_REMEMBER_ME_COOKIE=ZGFycmFnaF9zaGVyd2luOjE0NzQ0NDgxODU0Mzg6ODlkMzlmMmIzZTE0OWE5ZmZkNzlhYWFhNjAwNDk2NjhkNDU2YzNkNmFlODZlMGQ4ZDM5MTM3Y2UzYWRmNGM2Zg==; jenkins-timestamper-offset=25200000; jenkins-timestamper=system; jenkins-timestamper-local=false; JSESSIONID.0a959749=1hk2jl2xk3r511uypp40s4qsgo; JSESSIONID.96246bea=8iofxbtqat6w171206x9d8j2p; screenResolution=1920x1200" }, { "name": "Connection", "value": "keep-alive" }, { "name": "Cache-Control", "value": "no-cache" } ], "queryString": [], "cookies": [ { "name": "ACEGI_SECURITY_HASHED_REMEMBER_ME_COOKIE", "value": "ZGFycmFnaF9zaGVyd2luOjE0NzQ0NDgxODU0Mzg6ODlkMzlmMmIzZTE0OWE5ZmZkNzlhYWFhNjAwNDk2NjhkNDU2YzNkNmFlODZlMGQ4ZDM5MTM3Y2UzYWRmNGM2Zg==", "expires": null, "httpOnly": false, "secure": false }, { "name": "jenkins-timestamper-offset", "value": "25200000", "expires": null, "httpOnly": false, "secure": false }, { "name": "jenkins-timestamper", "value": "system", "expires": null, "httpOnly": false, "secure": false }, { "name": "jenkins-timestamper-local", "value": "false", "expires": null, "httpOnly": false, "secure": false }, { "name": "JSESSIONID.0a959749", "value": "1hk2jl2xk3r511uypp40s4qsgo", "expires": null, "httpOnly": false, "secure": false }, { "name": "JSESSIONID.96246bea", "value": "8iofxbtqat6w171206x9d8j2p", "expires": null, "httpOnly": false, "secure": false }, { "name": "screenResolution", "value": "1920x1200", "expires": null, "httpOnly": false, "secure": false } ], "headersSize": 867, "bodySize": 0 }, "response": { "status": 200, "statusText": "OK", "httpVersion": "HTTP/1.1", "headers": [ { "name": "Date", "value": "Thu, 15 Sep 2016 02:01:51 GMT" }, { "name": "Content-Encoding", "value": "gzip" }, { "name": "X-Content-Type-Options", "value": "nosniff" }, { "name": "Last-Modified", "value": "Mon, 12 Sep 2016 14:57:06 GMT" }, { "name": "Server", "value": "nginx/1.2.1" }, { "name": "Content-Type", "value": "application/javascript" }, { "name": "Connection", "value": "keep-alive" }, { "name": "Accept-Ranges", "value": "bytes" }, { "name": "Content-Length", "value": "1865" }, { "name": "Expires", "value": "Fri, 15 Sep 2017 02:01:51 GMT" } ], "cookies": [], "content": { "size": 5681, "mimeType": "application/javascript", "compression": 3816, "text": "//\n// LICENSE - MIT: https://rem.mit-license.org/\n//\n\n;(function (global) {\n\nif (\"EventSource\" in global) return;\n\nvar reTrim = /^(\\s|\\u00A0)+|(\\s|\\u00A0)+$/g;\n\nvar EventSource = function (url) {\n var eventsource = this, \n interval = 500, // polling interval \n lastEventId = null,\n cache = '';\n\n if (!url || typeof url != 'string') {\n throw new SyntaxError('Not enough arguments');\n }\n\n this.URL = url;\n this.readyState = this.CONNECTING;\n this._pollTimer = null;\n this._xhr = null;\n \n function pollAgain(interval) {\n eventsource._pollTimer = setTimeout(function () {\n poll.call(eventsource);\n }, interval);\n }\n \n function poll() {\n try { // force hiding of the error message... insane?\n if (eventsource.readyState == eventsource.CLOSED) return;\n\n // NOTE: IE7 and upwards support\n var xhr = new XMLHttpRequest();\n xhr.open('GET', eventsource.URL, true);\n xhr.setRequestHeader('Accept', 'text/event-stream');\n xhr.setRequestHeader('Cache-Control', 'no-cache');\n // we must make use of this on the server side if we're working with Android - because they don't trigger \n // readychange until the server connection is closed\n xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\n\n if (lastEventId != null) xhr.setRequestHeader('Last-Event-ID', lastEventId);\n cache = '';\n \n xhr.timeout = 50000;\n xhr.onreadystatechange = function () {\n if (this.readyState == 3 || (this.readyState == 4 && this.status == 200)) {\n // on success\n if (eventsource.readyState == eventsource.CONNECTING) {\n eventsource.readyState = eventsource.OPEN;\n eventsource.dispatchEvent('open', { type: 'open' });\n }\n\n var responseText = '';\n try {\n responseText = this.responseText || '';\n } catch (e) {}\n \n // process this.responseText\n var parts = responseText.substr(cache.length).split(\"\\n\"),\n eventType = 'message',\n data = [],\n i = 0,\n line = '';\n \n cache = responseText;\n \n // TODO handle 'event' (for buffer name), retry\n for (; i < parts.length; i++) {\n line = parts[i].replace(reTrim, '');\n if (line.indexOf('event') == 0) {\n eventType = line.replace(/event:?\\s*/, '');\n } else if (line.indexOf('retry') == 0) { \n retry = parseInt(line.replace(/retry:?\\s*/, ''));\n if(!isNaN(retry)) { interval = retry; }\n } else if (line.indexOf('data') == 0) {\n data.push(line.replace(/data:?\\s*/, ''));\n } else if (line.indexOf('id:') == 0) {\n lastEventId = line.replace(/id:?\\s*/, '');\n } else if (line.indexOf('id') == 0) { // this resets the id\n lastEventId = null;\n } else if (line == '') {\n if (data.length) {\n var event = new MessageEvent(data.join('\\n'), eventsource.url, lastEventId);\n eventsource.dispatchEvent(eventType, event);\n data = [];\n eventType = 'message';\n }\n }\n }\n\n if (this.readyState == 4) pollAgain(interval);\n // don't need to poll again, because we're long-loading\n } else if (eventsource.readyState !== eventsource.CLOSED) {\n if (this.readyState == 4) { // and some other status\n // dispatch error\n eventsource.readyState = eventsource.CONNECTING;\n eventsource.dispatchEvent('error', { type: 'error' });\n pollAgain(interval);\n } else if (this.readyState == 0) { // likely aborted\n pollAgain(interval);\n } else {\n }\n }\n };\n \n xhr.send();\n \n setTimeout(function () {\n if (true || xhr.readyState == 3) xhr.abort();\n }, xhr.timeout);\n \n eventsource._xhr = xhr;\n \n } catch (e) { // in an attempt to silence the errors\n eventsource.dispatchEvent('error', { type: 'error', data: e.message }); // ???\n } \n };\n \n poll(); // init now\n};\n\nEventSource.prototype = {\n close: function () {\n // closes the connection - disabling the polling\n this.readyState = this.CLOSED;\n clearInterval(this._pollTimer);\n this._xhr.abort();\n },\n CONNECTING: 0,\n OPEN: 1,\n CLOSED: 2,\n dispatchEvent: function (type, event) {\n var handlers = this['_' + type + 'Handlers'];\n if (handlers) {\n for (var i = 0; i < handlers.length; i++) {\n handlers[i].call(this, event);\n }\n }\n\n if (this['on' + type]) {\n this['on' + type].call(this, event);\n }\n },\n addEventListener: function (type, handler) {\n if (!this['_' + type + 'Handlers']) {\n this['_' + type + 'Handlers'] = [];\n }\n \n this['_' + type + 'Handlers'].push(handler);\n },\n removeEventListener: function (type, handler) {\n var handlers = this['_' + type + 'Handlers'];\n if (!handlers) {\n return;\n }\n for (var i = handlers.length - 1; i >= 0; --i) {\n if (handlers[i] === handler) {\n handlers.splice(i, 1);\n break;\n }\n }\n },\n onerror: null,\n onmessage: null,\n onopen: null,\n readyState: 0,\n URL: ''\n};\n\nvar MessageEvent = function (data, origin, lastEventId) {\n this.data = data;\n this.origin = origin;\n this.lastEventId = lastEventId || '';\n};\n\nMessageEvent.prototype = {\n data: null,\n type: 'message',\n lastEventId: '',\n origin: ''\n};\n\nif ('module' in global) module.exports = EventSource;\nglobal.EventSource = EventSource;\n \n})(this);" }, "redirectURL": "", "headersSize": 326, "bodySize": 1865, "_transferSize": 2191 }, "cache": {}, "timings": { "blocked": 7.26899999426678, "dns": -1, "connect": -1, "send": 0.11199999426025986, "wait": 495.339000000968, "receive": 22.08999999857008, "ssl": -1 }, "serverIPAddress": "146.148.6.102", "connection": "474768", "pageref": "page_4" }, { "startedDateTime": "2016-09-15T02:01:51.381Z", "time": 405.58099999907427, "request": { "method": "GET", "url": "http://gc-build-01.soteriadev.net/static/76087cd9/plugin/blueocean-web/assets/jdl/css/normalize.css", "httpVersion": "HTTP/1.1", "headers": [ { "name": "Pragma", "value": "no-cache" }, { "name": "Accept-Encoding", "value": "gzip, deflate, sdch" }, { "name": "Host", "value": "gc-build-01.soteriadev.net" }, { "name": "Accept-Language", "value": "en-US,en;q=0.8" }, { "name": "User-Agent", "value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" }, { "name": "Accept", "value": "text/css,*/*;q=0.1" }, { "name": "Referer", "value": "http://gc-build-01.soteriadev.net/blue/pipelines/" }, { "name": "Cookie", "value": "ACEGI_SECURITY_HASHED_REMEMBER_ME_COOKIE=ZGFycmFnaF9zaGVyd2luOjE0NzQ0NDgxODU0Mzg6ODlkMzlmMmIzZTE0OWE5ZmZkNzlhYWFhNjAwNDk2NjhkNDU2YzNkNmFlODZlMGQ4ZDM5MTM3Y2UzYWRmNGM2Zg==; jenkins-timestamper-offset=25200000; jenkins-timestamper=system; jenkins-timestamper-local=false; JSESSIONID.0a959749=1hk2jl2xk3r511uypp40s4qsgo; JSESSIONID.96246bea=8iofxbtqat6w171206x9d8j2p; screenResolution=1920x1200" }, { "name": "Connection", "value": "keep-alive" }, { "name": "Cache-Control", "value": "no-cache" } ], "queryString": [], "cookies": [ { "name": "ACEGI_SECURITY_HASHED_REMEMBER_ME_COOKIE", "value": "ZGFycmFnaF9zaGVyd2luOjE0NzQ0NDgxODU0Mzg6ODlkMzlmMmIzZTE0OWE5ZmZkNzlhYWFhNjAwNDk2NjhkNDU2YzNkNmFlODZlMGQ4ZDM5MTM3Y2UzYWRmNGM2Zg==", "expires": null, "httpOnly": false, "secure": false }, { "name": "jenkins-timestamper-offset", "value": "25200000", "expires": null, "httpOnly": false, "secure": false }, { "name": "jenkins-timestamper", "value": "system", "expires": null, "httpOnly": false, "secure": false }, { "name": "jenkins-timestamper-local", "value": "false", "expires": null, "httpOnly": false, "secure": false }, { "name": "JSESSIONID.0a959749", "value": "1hk2jl2xk3r511uypp40s4qsgo", "expires": null, "httpOnly": false, "secure": false }, { "name": "JSESSIONID.96246bea", "value": "8iofxbtqat6w171206x9d8j2p", "expires": null, "httpOnly": false, "secure": false }, { "name": "screenResolution", "value": "1920x1200", "expires": null, "httpOnly": false, "secure": false } ], "headersSize": 878, "bodySize": 0 }, "response": { "status": 200, "statusText": "OK", "httpVersion": "HTTP/1.1", "headers": [ { "name": "Date", "value": "Thu, 15 Sep 2016 02:01:51 GMT" }, { "name": "Content-Encoding", "value": "gzip" }, { "name": "X-Content-Type-Options", "value": "nosniff" }, { "name": "Last-Modified", "value": "Fri, 09 Sep 2016 13:19:08 GMT" }, { "name": "Server", "value": "nginx/1.2.1" }, { "name": "Content-Type", "value": "text/css" }, { "name": "Connection", "value": "keep-alive" }, { "name": "Accept-Ranges", "value": "bytes" }, { "name": "Content-Length", "value": "2192" }, { "name": "Expires", "value": "Fri, 15 Sep 2017 02:01:51 GMT" } ], "cookies": [], "content": { "size": 7279, "mimeType": "text/css", "compression": 5087, "text": "/*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */\n\n/**\n * 1. Change the default font family in all browsers (opinionated).\n * 2. Prevent adjustments of font size after orientation changes in IE and iOS.\n */\n\nhtml {\n font-family: sans-serif; /* 1 */\n -ms-text-size-adjust: 100%; /* 2 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/**\n * Remove the margin in all browsers (opinionated).\n */\n\nbody {\n margin: 0;\n}\n\n/* HTML5 display definitions\n ========================================================================== */\n\n/**\n * Add the correct display in IE 9-.\n * 1. Add the correct display in Edge, IE, and Firefox.\n * 2. Add the correct display in IE.\n */\n\narticle,\naside,\ndetails, /* 1 */\nfigcaption,\nfigure,\nfooter,\nheader,\nmain, /* 2 */\nmenu,\nnav,\nsection,\nsummary { /* 1 */\n display: block;\n}\n\n/**\n * Add the correct display in IE 9-.\n */\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n}\n\n/**\n * Add the correct display in iOS 4-7.\n */\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Add the correct display in IE 10-.\n * 1. Add the correct display in IE.\n */\n\ntemplate, /* 1 */\n[hidden] {\n display: none;\n}\n\n/* Links\n ========================================================================== */\n\n/**\n * 1. Remove the gray background on active links in IE 10.\n * 2. Remove gaps in links underline in iOS 8+ and Safari 8+.\n */\n\na {\n background-color: transparent; /* 1 */\n -webkit-text-decoration-skip: objects; /* 2 */\n}\n\n/**\n * Remove the outline on focused links when they are also active or hovered\n * in all browsers (opinionated).\n */\n\na:active,\na:hover {\n outline-width: 0;\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * 1. Remove the bottom border in Firefox 39-.\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Prevent the duplicate application of `bolder` by the next rule in Safari 6.\n */\n\nb,\nstrong {\n font-weight: inherit;\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * Add the correct font style in Android 4.3-.\n */\n\ndfn {\n font-style: italic;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/**\n * Add the correct background and color in IE 9-.\n */\n\nmark {\n background-color: #ff0;\n color: #000;\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10-.\n */\n\nimg {\n border-style: none;\n}\n\n/**\n * Hide the overflow in IE.\n */\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct margin in IE 8.\n */\n\nfigure {\n margin: 1em 40px;\n}\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change font properties to `inherit` in all browsers (opinionated).\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\nselect,\ntextarea {\n font: inherit; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Restore the font weight unset by the previous rule.\n */\n\noptgroup {\n font-weight: bold;\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput { /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect { /* 1 */\n text-transform: none;\n}\n\n/**\n * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n * controls in Android 4.\n * 2. Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\nhtml [type=\"button\"], /* 1 */\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; /* 2 */\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Change the border, margin, and padding in all browsers (opinionated).\n */\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Remove the default vertical scrollbar in IE.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10-.\n * 2. Remove the padding in IE 10-.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding and cancel buttons in Chrome and Safari on OS X.\n */\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n * Correct the text style of placeholders in Chrome, Edge, and Safari.\n */\n\n::-webkit-input-placeholder {\n color: inherit;\n opacity: 0.54;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n" }, "redirectURL": "", "headersSize": 312, "bodySize": 2192, "_transferSize": 2504 }, "cache": {}, "timings": { "blocked": 7.04300000506919, "dns": -1, "connect": -1, "send": 0.08199999865610064, "wait": 303.6439999996217, "receive": 94.81199999572726, "ssl": -1 }, "serverIPAddress": "146.148.6.102", "connection": "476135", "pageref": "page_4" }, { "startedDateTime": "2016-09-15T02:01:51.381Z", "time": 337.4069999990752, "request": { "method": "GET", "url": "http://gc-build-01.soteriadev.net/static/76087cd9/plugin/blueocean-web/assets/jdl/css/latofonts.css", "httpVersion": "HTTP/1.1", "headers": [ { "name": "Pragma", "value": "no-cache" }, { "name": "Accept-Encoding", "value": "gzip, deflate, sdch" }, { "name": "Host", "value": "gc-build-01.soteriadev.net" }, { "name": "Accept-Language", "value": "en-US,en;q=0.8" }, { "name": "User-Agent", "value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" }, { "name": "Accept", "value": "text/css,*/*;q=0.1" }, { "name": "Referer", "value": "http://gc-build-01.soteriadev.net/blue/pipelines/" }, { "name": "Cookie", "value": "ACEGI_SECURITY_HASHED_REMEMBER_ME_COOKIE=ZGFycmFnaF9zaGVyd2luOjE0NzQ0NDgxODU0Mzg6ODlkMzlmMmIzZTE0OWE5ZmZkNzlhYWFhNjAwNDk2NjhkNDU2YzNkNmFlODZlMGQ4ZDM5MTM3Y2UzYWRmNGM2Zg==; jenkins-timestamper-offset=25200000; jenkins-timestamper=system; jenkins-timestamper-local=false; JSESSIONID.0a959749=1hk2jl2xk3r511uypp40s4qsgo; JSESSIONID.96246bea=8iofxbtqat6w171206x9d8j2p; screenResolution=1920x1200" }, { "name": "Connection", "value": "keep-alive" }, { "name": "Cache-Control", "value": "no-cache" } ], "queryString": [], "cookies": [ { "name": "ACEGI_SECURITY_HASHED_REMEMBER_ME_COOKIE", "value": "ZGFycmFnaF9zaGVyd2luOjE0NzQ0NDgxODU0Mzg6ODlkMzlmMmIzZTE0OWE5ZmZkNzlhYWFhNjAwNDk2NjhkNDU2YzNkNmFlODZlMGQ4ZDM5MTM3Y2UzYWRmNGM2Zg==", "expires": null, "httpOnly": false, "secure": false }, { "name": "jenkins-timestamper-offset", "value": "25200000", "expires": null, "httpOnly": false, "secure": false }, { "name": "jenkins-timestamper", "value": "system", "expires": null, "httpOnly": false, "secure": false }, { "name": "jenkins-timestamper-local", "value": "false", "expires": null, "httpOnly": false, "secure": false }, { "name": "JSESSIONID.0a959749", "value": "1hk2jl2xk3r511uypp40s4qsgo", "expires": null, "httpOnly": false, "secure": false }, { "name": "JSESSIONID.96246bea", "value": "8iofxbtqat6w171206x9d8j2p", "expires": null, "httpOnly": false, "secure": false }, { "name": "screenResolution", "value": "1920x1200", "expires": null, "httpOnly": false, "secure": false } ], "headersSize": 878, "bodySize": 0 }, "response": { "status": 200, "statusText": "OK", "httpVersion": "HTTP/1.1", "headers": [ { "name": "Date", "value": "Thu, 15 Sep 2016 02:01:51 GMT" }, { "name": "Content-Encoding", "value": "gzip" }, { "name": "X-Content-Type-Options", "value": "nosniff" }, { "name": "Last-Modified", "value": "Fri, 09 Sep 2016 13:19:08 GMT" }, { "name": "Server", "value": "nginx/1.2.1" }, { "name": "Content-Type", "value": "text/css" }, { "name": "Connection", "value": "keep-alive" }, { "name": "Accept-Ranges", "value": "bytes" }, { "name": "Content-Length", "value": "259" }, { "name": "Expires", "value": "Fri, 15 Sep 2017 02:01:51 GMT" } ], "cookies": [], "content": { "size": 1408, "mimeType": "text/css", "compression": 1149, "text": "/* Webfont: LatoLatin-Light */@font-face {\n font-family: 'LatoLatinWebLight';\n src: url('../fonts/LatoLatin-Light.woff') format('woff');\n font-style: normal;\n font-weight: normal;\n text-rendering: optimizeLegibility;\n}\n\n/* Webfont: LatoLatin-Regular */@font-face {\n font-family: 'LatoLatinWeb';\n src: url('../fonts/LatoLatin-Regular.woff') format('woff');\n font-style: normal;\n font-weight: normal;\n text-rendering: optimizeLegibility;\n}\n\n/* Webfont: LatoLatin-Bold */@font-face {\n font-family: 'LatoLatinWeb';\n src: url('../fonts/LatoLatin-Bold.woff') format('woff');\n font-style: normal;\n font-weight: bold;\n text-rendering: optimizeLegibility;\n}\n\n/* Webfont: LatoLatin-Italic */@font-face {\n font-family: 'LatoLatinWeb';\n src: url('../fonts/LatoLatin-Italic.woff') format('woff');\n font-style: italic;\n font-weight: normal;\n text-rendering: optimizeLegibility;\n}\n\n/* Webfont: LatoLatin-Medium */@font-face {\n font-family: 'LatoLatinWebMedium';\n src: url('../fonts/LatoLatin-Medium.woff') format('woff');\n font-style: normal;\n font-weight: normal;\n text-rendering: optimizeLegibility;\n}\n\n/* Webfont: LatoLatin-Semibold */@font-face {\n font-family: 'LatoLatinWebSemibold';\n src: url('../fonts/LatoLatin-Semibold.woff') format('woff');\n font-style: normal;\n font-weight: normal;\n text-rendering: optimizeLegibility;\n}\n" }, "redirectURL": "", "headersSize": 311, "bodySize": 259, "_transferSize": 570 }, "cache": {}, "timings": { "blocked": 7.57300000987016, "dns": -1, "connect": -1, "send": 0.16599999798927012, "wait": 327.14699998905456, "receive": 2.521000002161202, "ssl": -1 }, "serverIPAddress": "146.148.6.102", "connection": "476136", "pageref": "page_4" }, { "startedDateTime": "2016-09-15T02:01:51.382Z", "time": 453.6670000088634, "request": { "method": "GET", "url": "http://gc-build-01.soteriadev.net/static/76087cd9/plugin/blueocean-web/assets/jdl/octicons/octicons.css", "httpVersion": "HTTP/1.1", "headers": [ { "name": "Pragma", "value": "no-cache" }, { "name": "Accept-Encoding", "value": "gzip, deflate, sdch" }, { "name": "Host", "value": "gc-build-01.soteriadev.net" }, { "name": "Accept-Language", "value": "en-US,en;q=0.8" }, { "name": "User-Agent", "value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" }, { "name": "Accept", "value": "text/css,*/*;q=0.1" }, { "name": "Referer", "value": "http://gc-build-01.soteriadev.net/blue/pipelines/" }, { "name": "Cookie", "value": "ACEGI_SECURITY_HASHED_REMEMBER_ME_COOKIE=ZGFycmFnaF9zaGVyd2luOjE0NzQ0NDgxODU0Mzg6ODlkMzlmMmIzZTE0OWE5ZmZkNzlhYWFhNjAwNDk2NjhkNDU2YzNkNmFlODZlMGQ4ZDM5MTM3Y2UzYWRmNGM2Zg==; jenkins-timestamper-offset=25200000; jenkins-timestamper=system; jenkins-timestamper-local=false; JSESSIONID.0a959749=1hk2jl2xk3r511uypp40s4qsgo; JSESSIONID.96246bea=8iofxbtqat6w171206x9d8j2p; screenResolution=1920x1200" }, { "name": "Connection", "value": "keep-alive" }, { "name": "Cache-Control", "value": "no-cache" } ], "queryString": [], "cookies": [ { "name": "ACEGI_SECURITY_HASHED_REMEMBER_ME_COOKIE", "value": "ZGFycmFnaF9zaGVyd2luOjE0NzQ0NDgxODU0Mzg6ODlkMzlmMmIzZTE0OWE5ZmZkNzlhYWFhNjAwNDk2NjhkNDU2YzNkNmFlODZlMGQ4ZDM5MTM3Y2UzYWRmNGM2Zg==", "expires": null, "httpOnly": false, "secure": false }, { "name": "jenkins-timestamper-offset", "value": "25200000", "expires": null, "httpOnly": false, "secure": false }, { "name": "jenkins-timestamper", "value": "system", "expires": null, "httpOnly": false, "secure": false }, { "name": "jenkins-timestamper-local", "value": "false", "expires": null, "httpOnly": false, "secure": false }, { "name": "JSESSIONID.0a959749", "value": "1hk2jl2xk3r511uypp40s4qsgo", "expires": null, "httpOnly": false, "secure": false }, { "name": "JSESSIONID.96246bea", "value": "8iofxbtqat6w171206x9d8j2p", "expires": null, "httpOnly": false, "secure": false }, { "name": "screenResolution", "value": "1920x1200", "expires": null, "httpOnly": false, "secure": false } ], "headersSize": 882, "bodySize": 0 }, "response": { "status": 200, "statusText": "OK", "httpVersion": "HTTP/1.1", "headers": [ { "name": "Date", "value": "Thu, 15 Sep 2016 02:01:51 GMT" }, { "name": "Content-Encoding", "value": "gzip" }, { "name": "X-Content-Type-Options", "value": "nosniff" }, { "name": "Last-Modified", "value": "Fri, 09 Sep 2016 13:19:08 GMT" }, { "name": "Server", "value": "nginx/1.2.1" }, { "name": "Content-Type", "value": "text/css" }, { "name": "Connection", "value": "keep-alive" }, { "name": "Accept-Ranges", "value": "bytes" }, { "name": "Content-Length", "value": "1850" }, { "name": "Expires", "value": "Fri, 15 Sep 2017 02:01:51 GMT" } ], "cookies": [], "content": { "size": 9147, "mimeType": "text/css", "compression": 7297, "text": "\n@font-face {\n font-family:\"Octicons\";\n src:url(\"octicons.eot?5e5746b1afa34d378ebe1091967df505\");\n src:url(\"octicons.eot?#iefix\") format(\"embedded-opentype\"),\n\t\turl(\"octicons.woff2?5e5746b1afa34d378ebe1091967df505\") format(\"woff2\"),\n\t\turl(\"octicons.woff?5e5746b1afa34d378ebe1091967df505\") format(\"woff\"),\n\t\turl(\"octicons.ttf?5e5746b1afa34d378ebe1091967df505\") format(\"truetype\"),\n\t\turl(\"octicons.svg?5e5746b1afa34d378ebe1091967df505#octicons\") format(\"svg\");\n font-weight:normal;\n font-style:normal;\n}\n\n\n/*\n\n.octicon is optimized for 16px.\n.mega-octicon is optimized for 32px but can be used larger.\n\n*/\n.octicon, .mega-octicon {\n font: normal normal normal 16px/1 Octicons;\n display: inline-block;\n text-decoration: none;\n text-rendering: auto;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n speak: none;\n}\n.mega-octicon { font-size: 32px; }\n\n.octicon-alert:before { content:\"\\f02d\"; }\n\n.octicon-arrow-down:before { content:\"\\f03f\"; }\n\n.octicon-arrow-left:before { content:\"\\f040\"; }\n\n.octicon-arrow-right:before { content:\"\\f03e\"; }\n\n.octicon-arrow-small-down:before { content:\"\\f0a0\"; }\n\n.octicon-arrow-small-left:before { content:\"\\f0a1\"; }\n\n.octicon-arrow-small-right:before { content:\"\\f071\"; }\n\n.octicon-arrow-small-up:before { content:\"\\f09f\"; }\n\n.octicon-arrow-up:before { content:\"\\f03d\"; }\n\n.octicon-beaker:before { content:\"\\f0dd\"; }\n\n.octicon-bell:before { content:\"\\f0de\"; }\n\n.octicon-bold:before { content:\"\\f0e2\"; }\n\n.octicon-book:before { content:\"\\f007\"; }\n\n.octicon-bookmark:before { content:\"\\f07b\"; }\n\n.octicon-briefcase:before { content:\"\\f0d3\"; }\n\n.octicon-broadcast:before { content:\"\\f048\"; }\n\n.octicon-browser:before { content:\"\\f0c5\"; }\n\n.octicon-bug:before { content:\"\\f091\"; }\n\n.octicon-calendar:before { content:\"\\f068\"; }\n\n.octicon-check:before { content:\"\\f03a\"; }\n\n.octicon-checklist:before { content:\"\\f076\"; }\n\n.octicon-chevron-down:before { content:\"\\f0a3\"; }\n\n.octicon-chevron-left:before { content:\"\\f0a4\"; }\n\n.octicon-chevron-right:before { content:\"\\f078\"; }\n\n.octicon-chevron-up:before { content:\"\\f0a2\"; }\n\n.octicon-circle-slash:before { content:\"\\f084\"; }\n\n.octicon-circuit-board:before { content:\"\\f0d6\"; }\n\n.octicon-clippy:before { content:\"\\f035\"; }\n\n.octicon-clock:before { content:\"\\f046\"; }\n\n.octicon-cloud-download:before { content:\"\\f00b\"; }\n\n.octicon-cloud-upload:before { content:\"\\f00c\"; }\n\n.octicon-code:before { content:\"\\f05f\"; }\n\n.octicon-comment-discussion:before { content:\"\\f04f\"; }\n\n.octicon-comment:before { content:\"\\f02b\"; }\n\n.octicon-credit-card:before { content:\"\\f045\"; }\n\n.octicon-dash:before { content:\"\\f0ca\"; }\n\n.octicon-dashboard:before { content:\"\\f07d\"; }\n\n.octicon-database:before { content:\"\\f096\"; }\n\n.octicon-desktop-download:before { content:\"\\f0dc\"; }\n\n.octicon-device-camera-video:before { content:\"\\f057\"; }\n\n.octicon-device-camera:before { content:\"\\f056\"; }\n\n.octicon-device-desktop:before { content:\"\\f27c\"; }\n\n.octicon-device-mobile:before { content:\"\\f038\"; }\n\n.octicon-diff-added:before { content:\"\\f06b\"; }\n\n.octicon-diff-ignored:before { content:\"\\f099\"; }\n\n.octicon-diff-modified:before { content:\"\\f06d\"; }\n\n.octicon-diff-removed:before { content:\"\\f06c\"; }\n\n.octicon-diff-renamed:before { content:\"\\f06e\"; }\n\n.octicon-diff:before { content:\"\\f04d\"; }\n\n.octicon-ellipses:before { content:\"\\f101\"; }\n\n.octicon-ellipsis:before { content:\"\\f09a\"; }\n\n.octicon-eye:before { content:\"\\f04e\"; }\n\n.octicon-file-binary:before { content:\"\\f094\"; }\n\n.octicon-file-code:before { content:\"\\f010\"; }\n\n.octicon-file-directory:before { content:\"\\f016\"; }\n\n.octicon-file-media:before { content:\"\\f012\"; }\n\n.octicon-file-pdf:before { content:\"\\f014\"; }\n\n.octicon-file-submodule:before { content:\"\\f017\"; }\n\n.octicon-file-symlink-directory:before { content:\"\\f0b1\"; }\n\n.octicon-file-symlink-file:before { content:\"\\f0b0\"; }\n\n.octicon-file-text:before { content:\"\\f011\"; }\n\n.octicon-file-zip:before { content:\"\\f013\"; }\n\n.octicon-file:before { content:\"\\f102\"; }\n\n.octicon-flame:before { content:\"\\f0d2\"; }\n\n.octicon-fold:before { content:\"\\f0cc\"; }\n\n.octicon-gear:before { content:\"\\f02f\"; }\n\n.octicon-gift:before { content:\"\\f042\"; }\n\n.octicon-gist-secret:before { content:\"\\f08c\"; }\n\n.octicon-gist:before { content:\"\\f00e\"; }\n\n.octicon-git-branch:before { content:\"\\f020\"; }\n\n.octicon-git-commit:before { content:\"\\f01f\"; }\n\n.octicon-git-compare:before { content:\"\\f0ac\"; }\n\n.octicon-git-merge:before { content:\"\\f023\"; }\n\n.octicon-git-pull-request:before { content:\"\\f009\"; }\n\n.octicon-globe:before { content:\"\\f0b6\"; }\n\n.octicon-grabber:before { content:\"\\f103\"; }\n\n.octicon-graph:before { content:\"\\f043\"; }\n\n.octicon-heart:before { content:\"\\2665\"; }\n\n.octicon-history:before { content:\"\\f07e\"; }\n\n.octicon-home:before { content:\"\\f08d\"; }\n\n.octicon-horizontal-rule:before { content:\"\\f070\"; }\n\n.octicon-hubot:before { content:\"\\f09d\"; }\n\n.octicon-inbox:before { content:\"\\f0cf\"; }\n\n.octicon-info:before { content:\"\\f059\"; }\n\n.octicon-issue-closed:before { content:\"\\f028\"; }\n\n.octicon-issue-opened:before { content:\"\\f026\"; }\n\n.octicon-issue-reopened:before { content:\"\\f027\"; }\n\n.octicon-italic:before { content:\"\\f0e4\"; }\n\n.octicon-jersey:before { content:\"\\f019\"; }\n\n.octicon-key:before { content:\"\\f049\"; }\n\n.octicon-keyboard:before { content:\"\\f00d\"; }\n\n.octicon-law:before { content:\"\\f0d8\"; }\n\n.octicon-light-bulb:before { content:\"\\f000\"; }\n\n.octicon-link-external:before { content:\"\\f07f\"; }\n\n.octicon-link:before { content:\"\\f05c\"; }\n\n.octicon-list-ordered:before { content:\"\\f062\"; }\n\n.octicon-list-unordered:before { content:\"\\f061\"; }\n\n.octicon-location:before { content:\"\\f060\"; }\n\n.octicon-lock:before { content:\"\\f06a\"; }\n\n.octicon-logo-gist:before { content:\"\\f0ad\"; }\n\n.octicon-logo-github:before { content:\"\\f092\"; }\n\n.octicon-mail-read:before { content:\"\\f03c\"; }\n\n.octicon-mail-reply:before { content:\"\\f051\"; }\n\n.octicon-mail:before { content:\"\\f03b\"; }\n\n.octicon-mark-github:before { content:\"\\f00a\"; }\n\n.octicon-markdown:before { content:\"\\f0c9\"; }\n\n.octicon-megaphone:before { content:\"\\f077\"; }\n\n.octicon-mention:before { content:\"\\f0be\"; }\n\n.octicon-milestone:before { content:\"\\f075\"; }\n\n.octicon-mirror:before { content:\"\\f024\"; }\n\n.octicon-mortar-board:before { content:\"\\f0d7\"; }\n\n.octicon-mute:before { content:\"\\f080\"; }\n\n.octicon-no-newline:before { content:\"\\f09c\"; }\n\n.octicon-octoface:before { content:\"\\f008\"; }\n\n.octicon-organization:before { content:\"\\f037\"; }\n\n.octicon-package:before { content:\"\\f0c4\"; }\n\n.octicon-paintcan:before { content:\"\\f0d1\"; }\n\n.octicon-pencil:before { content:\"\\f058\"; }\n\n.octicon-person:before { content:\"\\f018\"; }\n\n.octicon-pin:before { content:\"\\f041\"; }\n\n.octicon-plug:before { content:\"\\f0d4\"; }\n\n.octicon-plus-small:before { content:\"\\f104\"; }\n\n.octicon-plus:before { content:\"\\f05d\"; }\n\n.octicon-primitive-dot:before { content:\"\\f052\"; }\n\n.octicon-primitive-square:before { content:\"\\f053\"; }\n\n.octicon-pulse:before { content:\"\\f085\"; }\n\n.octicon-question:before { content:\"\\f02c\"; }\n\n.octicon-quote:before { content:\"\\f063\"; }\n\n.octicon-radio-tower:before { content:\"\\f030\"; }\n\n.octicon-reply:before { content:\"\\f105\"; }\n\n.octicon-repo-clone:before { content:\"\\f04c\"; }\n\n.octicon-repo-force-push:before { content:\"\\f04a\"; }\n\n.octicon-repo-forked:before { content:\"\\f002\"; }\n\n.octicon-repo-pull:before { content:\"\\f006\"; }\n\n.octicon-repo-push:before { content:\"\\f005\"; }\n\n.octicon-repo:before { content:\"\\f001\"; }\n\n.octicon-rocket:before { content:\"\\f033\"; }\n\n.octicon-rss:before { content:\"\\f034\"; }\n\n.octicon-ruby:before { content:\"\\f047\"; }\n\n.octicon-search:before { content:\"\\f02e\"; }\n\n.octicon-server:before { content:\"\\f097\"; }\n\n.octicon-settings:before { content:\"\\f07c\"; }\n\n.octicon-shield:before { content:\"\\f0e1\"; }\n\n.octicon-sign-in:before { content:\"\\f036\"; }\n\n.octicon-sign-out:before { content:\"\\f032\"; }\n\n.octicon-smiley:before { content:\"\\f0e7\"; }\n\n.octicon-squirrel:before { content:\"\\f0b2\"; }\n\n.octicon-star:before { content:\"\\f02a\"; }\n\n.octicon-stop:before { content:\"\\f08f\"; }\n\n.octicon-sync:before { content:\"\\f087\"; }\n\n.octicon-tag:before { content:\"\\f015\"; }\n\n.octicon-tasklist:before { content:\"\\f0e5\"; }\n\n.octicon-telescope:before { content:\"\\f088\"; }\n\n.octicon-terminal:before { content:\"\\f0c8\"; }\n\n.octicon-text-size:before { content:\"\\f0e3\"; }\n\n.octicon-three-bars:before { content:\"\\f05e\"; }\n\n.octicon-thumbsdown:before { content:\"\\f0db\"; }\n\n.octicon-thumbsup:before { content:\"\\f0da\"; }\n\n.octicon-tools:before { content:\"\\f031\"; }\n\n.octicon-trashcan:before { content:\"\\f0d0\"; }\n\n.octicon-triangle-down:before { content:\"\\f05b\"; }\n\n.octicon-triangle-left:before { content:\"\\f044\"; }\n\n.octicon-triangle-right:before { content:\"\\f05a\"; }\n\n.octicon-triangle-up:before { content:\"\\f0aa\"; }\n\n.octicon-unfold:before { content:\"\\f039\"; }\n\n.octicon-unmute:before { content:\"\\f0ba\"; }\n\n.octicon-unverified:before { content:\"\\f0e8\"; }\n\n.octicon-verified:before { content:\"\\f0e6\"; }\n\n.octicon-versions:before { content:\"\\f064\"; }\n\n.octicon-watch:before { content:\"\\f0e0\"; }\n\n.octicon-x:before { content:\"\\f081\"; }\n\n.octicon-zap:before { content:\"\\26a1\"; }\n\n" }, "redirectURL": "", "headersSize": 312, "bodySize": 1850, "_transferSize": 2162 }, "cache": {}, "timings": { "blocked": 8.46900000760797, "dns": -1, "connect": -1, "send": 0.07399999594781903, "wait": 412.7659999940082, "receive": 32.358000011299396, "ssl": -1 }, "serverIPAddress": "146.148.6.102", "connection": "476138", "pageref": "page_4" }, { "startedDateTime": "2016-09-15T02:01:51.382Z", "time": 580.5859999964014, "request": { "method": "GET", "url": "http://gc-build-01.soteriadev.net/static/76087cd9/plugin/blueocean-web/assets/jdl/css/jenkins-design-language.css", "httpVersion": "HTTP/1.1", "headers": [ { "name": "Pragma", "value": "no-cache" }, { "name": "Accept-Encoding", "value": "gzip, deflate, sdch" }, { "name": "Host", "value": "gc-build-01.soteriadev.net" }, { "name": "Accept-Language", "value": "en-US,en;q=0.8" }, { "name": "User-Agent", "value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" }, { "name": "Accept", "value": "text/css,*/*;q=0.1" }, { "name": "Referer", "value": "http://gc-build-01.soteriadev.net/blue/pipelines/" }, { "name": "Cookie", "value": "ACEGI_SECURITY_HASHED_REMEMBER_ME_COOKIE=ZGFycmFnaF9zaGVyd2luOjE0NzQ0NDgxODU0Mzg6ODlkMzlmMmIzZTE0OWE5ZmZkNzlhYWFhNjAwNDk2NjhkNDU2YzNkNmFlODZlMGQ4ZDM5MTM3Y2UzYWRmNGM2Zg==; jenkins-timestamper-offset=25200000; jenkins-timestamper=system; jenkins-timestamper-local=false; JSESSIONID.0a959749=1hk2jl2xk3r511uypp40s4qsgo; JSESSIONID.96246bea=8iofxbtqat6w171206x9d8j2p; screenResolution=1920x1200" }, { "name": "Connection", "value": "keep-alive" }, { "name": "Cache-Control", "value": "no-cache" } ], "queryString": [], "cookies": [ { "name": "ACEGI_SECURITY_HASHED_REMEMBER_ME_COOKIE", "value": "ZGFycmFnaF9zaGVyd2luOjE0NzQ0NDgxODU0Mzg6ODlkMzlmMmIzZTE0OWE5ZmZkNzlhYWFhNjAwNDk2NjhkNDU2YzNkNmFlODZlMGQ4ZDM5MTM3Y2UzYWRmNGM2Zg==", "expires": null, "httpOnly": false, "secure": false }, { "name": "jenkins-timestamper-offset", "value": "25200000", "expires": null, "httpOnly": false, "secure": false }, { "name": "jenkins-timestamper", "value": "system", "expires": null, "httpOnly": false, "secure": false }, { "name": "jenkins-timestamper-local", "value": "false", "expires": null, "httpOnly": false, "secure": false }, { "name": "JSESSIONID.0a959749", "value": "1hk2jl2xk3r511uypp40s4qsgo", "expires": null, "httpOnly": false, "secure": false }, { "name": "JSESSIONID.96246bea", "value": "8iofxbtqat6w171206x9d8j2p", "expires": null, "httpOnly": false, "secure": false }, { "name": "screenResolution", "value": "1920x1200", "expires": null, "httpOnly": false, "secure": false } ], "headersSize": 892, "bodySize": 0 }, "response": { "status": 200, "statusText": "OK", "httpVersion": "HTTP/1.1", "headers": [ { "name": "Date", "value": "Thu, 15 Sep 2016 02:01:51 GMT" }, { "name": "Content-Encoding", "value": "gzip" }, { "name": "X-Content-Type-Options", "value": "nosniff" }, { "name": "Last-Modified", "value": "Fri, 09 Sep 2016 13:19:08 GMT" }, { "name": "Server", "value": "nginx/1.2.1" }, { "name": "Content-Type", "value": "text/css" }, { "name": "Connection", "value": "keep-alive" }, { "name": "Accept-Ranges", "value": "bytes" }, { "name": "Content-Length", "value": "8230" }, { "name": "Expires", "value": "Fri, 15 Sep 2017 02:01:51 GMT" } ], "cookies": [], "content": { "size": 52700, "mimeType": "text/css", "compression": 44470, "text": "/*!\n* Jenkins Design Language CSS Theme\n*\n* Licensed under MIT\n*/\n.weather-icon {\n display: inline-block;\n width: 32px;\n height: 32px;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center center;\n}\n.weather-icon.large-icon {\n width: 60px;\n height: 60px;\n}\n.jdl-table td .weather-icon {\n vertical-align: middle;\n}\n.weather-sunny {\n background-image: url(\"../icons/weather/Sunny.svg\");\n}\n.weather-partially-sunny {\n background-image: url(\"../icons/weather/Partially%20Sunny.svg\");\n}\n.weather-cloudy {\n background-image: url(\"../icons/weather/Cloudy.svg\");\n}\n.weather-raining {\n background-image: url(\"../icons/weather/Raining.svg\");\n}\n.weather-storm {\n background-image: url(\"../icons/weather/Storm.svg\");\n}\n.empty-state {\n display: flex;\n justify-content: center;\n}\n.empty-state .empty-state-container {\n display: flex;\n justify-content: center;\n flex-grow: 1;\n min-width: 40rem;\n max-width: 80rem;\n padding: 4rem 4rem;\n margin: 4rem 4rem;\n border-radius: 2px;\n background-image: linear-gradient(90deg, #49A3E0 0%, #4AC2E2 100%);\n}\n.empty-state .empty-state-container .empty-state-icon {\n margin-right: 3rem;\n display: block;\n width: 150px;\n height: 150px;\n padding-left: 150px;\n}\n.empty-state .empty-state-container .empty-state-icon.branch {\n background: url(\"../icons/nounproject/branch.svg\") no-repeat right center;\n}\n.empty-state .empty-state-container .empty-state-icon.goat {\n background: url(\"../icons/nounproject/goat.svg\") no-repeat right center;\n}\n.empty-state .empty-state-container .empty-state-icon.shoes {\n background: url(\"../icons/nounproject/shoes.svg\") no-repeat right center;\n}\n.empty-state .empty-state-container .empty-state-content {\n color: white;\n max-width: 40rem;\n}\n.empty-state .empty-state-container .empty-state-content h1 {\n font-size: 2.4rem;\n}\n.empty-state .empty-state-container .empty-state-content button,\n.empty-state .empty-state-container .empty-state-content a {\n display: inline-block;\n padding: 0.5rem 1rem;\n font-family: \"LatoLatinWebSemibold\", \"Lato\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n border: solid 1px white;\n border-radius: 3px;\n text-align: center;\n text-decoration: none;\n background-color: white;\n color: #49A3E0;\n cursor: pointer;\n min-width: 130px;\n}\n.empty-state .empty-state-container .empty-state-content button:hover,\n.empty-state .empty-state-container .empty-state-content a:hover,\n.empty-state .empty-state-container .empty-state-content button:focus,\n.empty-state .empty-state-container .empty-state-content a:focus,\n.empty-state .empty-state-container .empty-state-content button:active,\n.empty-state .empty-state-container .empty-state-content a:active,\n.empty-state .empty-state-container .empty-state-content button.active,\n.empty-state .empty-state-container .empty-state-content a.active {\n background-color: white;\n border-color: #e0e0e0;\n color: #49A3E0;\n text-decoration: none;\n}\n.empty-state .empty-state-container .empty-state-content button.disabled,\n.empty-state .empty-state-container .empty-state-content a.disabled,\n.empty-state .empty-state-container .empty-state-content button[disabled],\n.empty-state .empty-state-container .empty-state-content a[disabled],\nfieldset[disabled] .empty-state .empty-state-container .empty-state-content button,\nfieldset[disabled] .empty-state .empty-state-container .empty-state-content a,\n.empty-state .empty-state-container .empty-state-content button.disabled:hover,\n.empty-state .empty-state-container .empty-state-content a.disabled:hover,\n.empty-state .empty-state-container .empty-state-content button[disabled]:hover,\n.empty-state .empty-state-container .empty-state-content a[disabled]:hover,\nfieldset[disabled] .empty-state .empty-state-container .empty-state-content button:hover,\nfieldset[disabled] .empty-state .empty-state-container .empty-state-content a:hover,\n.empty-state .empty-state-container .empty-state-content button.disabled:focus,\n.empty-state .empty-state-container .empty-state-content a.disabled:focus,\n.empty-state .empty-state-container .empty-state-content button[disabled]:focus,\n.empty-state .empty-state-container .empty-state-content a[disabled]:focus,\nfieldset[disabled] .empty-state .empty-state-container .empty-state-content button:focus,\nfieldset[disabled] .empty-state .empty-state-container .empty-state-content a:focus,\n.empty-state .empty-state-container .empty-state-content button.disabled.focus,\n.empty-state .empty-state-container .empty-state-content a.disabled.focus,\n.empty-state .empty-state-container .empty-state-content button[disabled].focus,\n.empty-state .empty-state-container .empty-state-content a[disabled].focus,\nfieldset[disabled] .empty-state .empty-state-container .empty-state-content button.focus,\nfieldset[disabled] .empty-state .empty-state-container .empty-state-content a.focus,\n.empty-state .empty-state-container .empty-state-content button.disabled:active,\n.empty-state .empty-state-container .empty-state-content a.disabled:active,\n.empty-state .empty-state-container .empty-state-content button[disabled]:active,\n.empty-state .empty-state-container .empty-state-content a[disabled]:active,\nfieldset[disabled] .empty-state .empty-state-container .empty-state-content button:active,\nfieldset[disabled] .empty-state .empty-state-container .empty-state-content a:active,\n.empty-state .empty-state-container .empty-state-content button.disabled.active,\n.empty-state .empty-state-container .empty-state-content a.disabled.active,\n.empty-state .empty-state-container .empty-state-content button[disabled].active,\n.empty-state .empty-state-container .empty-state-content a[disabled].active,\nfieldset[disabled] .empty-state .empty-state-container .empty-state-content button.active,\nfieldset[disabled] .empty-state .empty-state-container .empty-state-content a.active {\n opacity: 0.4;\n}\n.empty-state .empty-state-container.tight-spacing {\n padding: 0.5rem 0;\n}\n/*\n Styles for the pipeline result status displays used in both build/branch lists, and\n within the PipelineGraph component.\n*/\n.result-status-glyph {\n stroke: none;\n fill: #fff;\n}\n.svgResultStatus.no-background .circle-bg {\n opacity: 0;\n}\n.svgResultStatus circle.success {\n stroke: none;\n fill: #8CC04F;\n}\n.svgResultStatus circle.aborted,\n.svgResultStatus circle.failure {\n stroke: none;\n fill: #D54C53;\n}\n.svgResultStatus circle.unstable {\n stroke: none;\n fill: #F6B44B;\n}\n.svgResultStatus circle.not_built {\n stroke: none;\n fill: #949393;\n}\n.svgResultStatus circle.unknown {\n stroke: none;\n fill: #D54CC4;\n}\n.jdl-table td .svgResultStatus {\n vertical-align: middle;\n}\n.progress-spinner.running circle {\n fill: none;\n stroke: #a7c7f2;\n}\n.progress-spinner.running path {\n fill: none;\n stroke: #1D7DCF;\n}\n.progress-spinner.pc-over-100 circle {\n fill: none;\n stroke: #1D7DCF;\n}\n.progress-spinner.pc-over-100 path {\n fill: none;\n stroke: #F6B44B;\n}\n.inverse .progress-spinner.running circle {\n fill: none;\n stroke: #4C9BD5;\n}\n.inverse .progress-spinner.running path {\n fill: none;\n stroke: white;\n}\n.inverse .progress-spinner.running circle.inner {\n fill: #4C9BD5;\n stroke: #4C9BD5;\n}\n.progress-spinner circle.inner,\n.progress-spinner.running.spin circle.inner {\n display: none;\n animation: progress-spinner-pulsate 1.2s ease-out;\n animation-iteration-count: infinite;\n opacity: 0;\n}\n.progress-spinner.running circle.inner {\n display: block;\n fill: #4C9BD5;\n stroke: #4C9BD5;\n}\n@keyframes progress-spinner-pulsate {\n 0% {\n transform: scale(0.1, 0.1);\n opacity: 0.0;\n }\n 50% {\n opacity: 1;\n }\n 100% {\n transform: scale(1.2, 1.2);\n opacity: 0.0;\n }\n}\n.progress-spinner.queued circle {\n fill: none;\n stroke: #949393;\n}\n.progress-spinner.queued circle.inner {\n display: block;\n fill: #949393;\n stroke: #949393;\n}\n.pipeline-result .progress-spinner.queued circle {\n fill: none;\n stroke: #fff;\n}\n.pipeline-result .progress-spinner.queued circle.inner {\n display: block;\n fill: #fff;\n stroke: #fff;\n}\n.pipeline-result .svgResultStatus {\n width: 70px;\n height: 70px;\n}\n.empty-state-content svg {\n vertical-align: middle;\n}\n.empty-state-content > span {\n padding-left: 15px;\n}\n.progress-spinner.queued path {\n fill: none;\n stroke: none;\n}\n.progress-spinner.not_built circle {\n fill: none;\n stroke: #949393;\n}\n.progress-spinner.not_built path {\n fill: none;\n stroke: none;\n}\n.result-bg.success {\n background: #8CC04F;\n border-bottom: 1px solid rgba(114, 162, 58, 0.5);\n}\n.result-bg.aborted,\n.result-bg.failure {\n background: #D54C53;\n border-bottom: 1px solid rgba(193, 45, 53, 0.5);\n}\n.result-bg.not_built,\n.result-bg.queued {\n background: #949393;\n border-bottom: 1px solid rgba(123, 121, 121, 0.5);\n}\n.result-bg.running {\n background: #1D7DCF;\n border-bottom: 1px solid rgba(23, 98, 162, 0.5);\n}\n.result-bg.unstable {\n background: #F6B44B;\n border-bottom: 1px solid rgba(244, 160, 26, 0.5);\n}\n.result-bg.unknown {\n background: #D54CC4;\n border-bottom: 1px solid rgba(193, 45, 174, 0.5);\n}\n.result-item + .result-item .result-item-head {\n border-top: 0;\n}\n.result-item-head {\n display: flex;\n align-items: stretch;\n cursor: pointer;\n border: solid 1px #eeeeee;\n}\n.result-item-icon {\n display: flex;\n align-items: flex-start;\n margin: -1px 0 -1px -1px;\n}\n.result-item-title {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n}\n.result-item-extra-info {\n padding-right: 0.6em;\n}\n.result-item-label {\n flex: 1 1 auto;\n font-family: \"LatoLatinWeb\", \"Lato\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n}\n.result-item-head:hover {\n background: #f8f8f8;\n}\n.result-item-expando {\n cursor: pointer;\n}\n.expando-glyph {\n transform: rotate(0deg);\n transition: transform 150ms ease-in;\n fill: #4A4A4A;\n}\n.result-item-expando.expanded .expando-glyph {\n transform: rotate(90deg);\n transition: transform 150ms ease-in;\n}\n.result-item-expando.disabled .expando-glyph {\n opacity: 0.3;\n}\n.result-item-children {\n background-color: #333333;\n color: #f5f5f5;\n padding: 0.5em;\n margin-bottom: 1px;\n border-left: solid 28px #262626;\n}\n.slide-down-enter,\n.slide-down-appear {\n max-height: 0;\n overflow: hidden;\n}\n.slide-down-enter.slide-down-enter-active,\n.slide-down-appear.slide-down-appear-active {\n max-height: 600px;\n transition: all 300ms ease-in;\n}\n.slide-down-leave {\n max-height: 600px;\n overflow: hidden;\n}\n.slide-down-leave.slide-down-leave-active {\n max-height: 0;\n transition: all 300ms ease-out;\n}\n.pipeline-connector {\n stroke: #949393;\n}\n.pipeline-small-label {\n font-size: 80%;\n}\n.pipeline-big-label.selected,\n.pipeline-small-label.selected {\n font-weight: bold;\n}\n.pipeline-selection-highlight circle {\n fill: none;\n stroke: #949393;\n}\n.favorite {\n display: inline-block;\n width: 24px;\n height: 24px;\n overflow: hidden;\n cursor: pointer;\n}\n.favorite input[type=\"checkbox\"] {\n border: 0;\n clip: rect(0, 0, 0, 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n}\n.favorite .star-icon {\n display: block;\n}\n.favorite input[type=\"checkbox\"]:checked + .star-icon {\n transform: translate(-264px, 0px);\n transition: 0.3s steps(11);\n}\n.favorite:hover .star-empty {\n fill: #1b5dab;\n}\n.favorite:hover .star-filled {\n fill: #aa6d08;\n}\n.favorite.dark-yellow .star-empty {\n fill: #FFF;\n}\n.favorite.dark-yellow:hover .star-empty {\n fill: #cccccc;\n}\n.favorite.dark-yellow:hover .start-filled {\n fill: #aa6d08;\n}\n.favorite.dark-white path[fill='#4a90e2'],\n.favorite.dark-white path[fill='#4A90E2'],\n.favorite.dark-white path[fill='#f5a623'],\n.favorite.dark-white path[fill='#F5A623'] {\n fill: #FFF;\n}\n.favorite.dark-white circle[stroke='#f5a623'],\n.favorite.dark-white circle[stroke='#F5A623'] {\n stroke: #FFF;\n}\n.favorite.dark-white:hover .star-empty {\n fill: #cccccc;\n}\n.favorite.dark-white:hover .star-filled {\n fill: #cccccc;\n}\n.pipeline-result {\n width: 100%;\n display: flex;\n font-family: \"LatoLatinWeb\", \"Lato\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n color: #ffffff;\n}\n.pipeline-result h4 {\n font-size: 1.8rem;\n margin: 10px 0;\n}\n.pipeline-result h4 a {\n color: white;\n cursor: pointer;\n}\n.pipeline-result .status {\n align-items: center;\n display: flex;\n margin: 10px 25px 0 0;\n}\n.pipeline-result .table {\n flex-grow: 1;\n}\n.pipeline-result .row {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n}\n.pipeline-result .commons {\n min-width: 0;\n flex-basis: 75%;\n}\n.pipeline-result .commons div {\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n}\n.pipeline-result .commons label {\n display: inline-block;\n width: 100px;\n}\n.pipeline-result .commit {\n font-family: \"Source Code Pro\", Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\n.pipeline-result .authors {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.pipeline-result .times {\n margin-left: auto;\n width: 25%;\n}\n.pipeline-result .times svg {\n margin-right: 10px;\n}\n.pipeline-result .times span,\n.pipeline-result .times time {\n vertical-align: top;\n}\n.jdl-table.fixed {\n table-layout: fixed;\n}\n.jdl-table th,\n.jdl-table td {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n padding-right: 0.8em;\n}\n.toaster {\n width: 100%;\n height: 100%;\n}\n.toaster .toast {\n margin-bottom: 10px;\n}\n.toaster > span {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column-reverse;\n justify-content: flex-start;\n align-items: flex-start;\n overflow-y: hidden;\n}\n.toast {\n display: inline-flex;\n max-width: 350px;\n flex-shrink: 0;\n padding: 20px;\n background-color: #4A4A4A;\n border-radius: 4px;\n /* TODO: get proper values from updated sketch file */\n -webkit-box-shadow: 1px 2px 2px rgba(0, 0, 0, 0.5);\n box-shadow: 1px 2px 2px rgba(0, 0, 0, 0.5);\n}\n.toast .text,\n.toast .action,\n.toast .dismiss {\n align-self: center;\n}\n.toast .text {\n font-family: \"LatoLatinWebMedium\", \"Lato\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n color: white;\n max-height: 85px;\n overflow: hidden;\n}\n.toast .action,\n.toast .dismiss {\n cursor: pointer;\n}\n.toast .action:hover,\n.toast .dismiss:hover {\n text-decoration: none;\n}\n.toast .action {\n margin: 0 20px;\n text-transform: uppercase;\n}\n.toast .dismiss {\n color: white;\n}\n.toast .dismiss svg {\n vertical-align: middle;\n}\n.toast-enter,\n.toast-appear {\n opacity: 0.01;\n}\n.toast-enter.toast-enter-active,\n.toast-appear.toast-appear-active {\n opacity: 1;\n transition: all 300ms ease-in;\n}\n.toast-leave {\n opacity: 1;\n max-height: 150px;\n}\n.toast-leave.toast-leave-active {\n opacity: 0.01;\n max-height: 0;\n transition: all 300ms ease-in;\n}\n.progress-container {\n width: 100%;\n height: 5px;\n}\n.progress-container line {\n stroke-width: 5px;\n}\n.progress-container line.progress-bg {\n stroke: #a7c7f2;\n z-index: 0;\n}\n.progress-container line.progress-bar {\n stroke: #4A90E2;\n}\n@keyframes slidein {\n from {\n transform: translate(0, 0) scale(2, 1);\n -webkit-transform: translate(0, 0) scale(2, 1);\n -o-transform: translate(0, 0) scale(2, 1);\n -moz-transform: translate(0, 0) scale(2, 1);\n }\n 100% {\n transform: translate(100px, 0) scale(1);\n -webkit-transform: translate(100px, 0) scale(1);\n -o-transform: translate(100px, 0) scale(1);\n -moz-transform: translate(100px, 0) scale(1);\n }\n}\n@keyframes bounce {\n from {\n transform: translate(0, 0);\n -webkit-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n -moz-transform: translate(0, 0);\n }\n 50% {\n transform: translate(90px, 0) scale(1);\n -webkit-transform: translate(90px, 0) scale(1);\n -o-transform: translate(90px, 0) scale(1);\n -moz-transform: translate(90px, 0) scale(1);\n }\n to {\n transform: translate(0, 0);\n -webkit-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n -moz-transform: translate(0, 0);\n }\n}\n.progress-container.indeterminate line.progress-bar {\n z-index: 10;\n animation-duration: 1s;\n animation-name: slidein;\n animation-iteration-count: infinite;\n}\n.progress-container.bounce line.progress-bar {\n z-index: 10;\n animation-duration: 3s;\n animation-name: bounce;\n animation-iteration-count: infinite;\n}\nhtml {\n font-size: 62.5%;\n}\n#root {\n font-size: 1.4rem;\n}\nbody {\n color: #4A4A4A;\n text-rendering: optimizeSpeed;\n font-feature-settings: \"kern\" on, \"liga\" off;\n -moz-font-feature-settings: \"kern\" on, \"liga\" off;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n* {\n box-sizing: border-box;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: 100%;\n font-family: \"LatoLatinWebLight\", \"Lato\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n margin: 0;\n padding: 0;\n}\nh1 {\n font-size: 36px;\n font-family: \"LatoLatinWeb\", \"Lato\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n letter-spacing: 1.1px;\n}\nh2 {\n font-size: 30px;\n}\nh3 {\n font-size: 24px;\n}\nh4 {\n font-size: 18px;\n}\nh5 {\n font-size: 14px;\n}\nh6 {\n font-size: 12px;\n}\n.success-bg {\n background-color: #4A9900;\n}\n.success-bg-lite {\n background-color: #8CC04F;\n}\n.success-fill {\n fill: #4A9900;\n}\n.success-fill-lite {\n fill: #8CC04F;\n}\n.success-color {\n color: #4A9900;\n}\n.success-color-lite {\n color: #8CC04F;\n}\n.info-bg {\n background-color: #0071C4;\n}\n.info-bg-lite {\n background-color: #4C9BD5;\n}\n.info-fill {\n fill: #0071C4;\n}\n.info-fill-lite {\n fill: #4C9BD5;\n}\n.info-color {\n color: #0071C4;\n}\n.info-color-lite {\n color: #4C9BD5;\n}\n.running-bg {\n background-color: #0071C4;\n}\n.running-bg-lite {\n background-color: #4C9BD5;\n}\n.running-fill {\n fill: #0071C4;\n}\n.running-fill-lite {\n fill: #4C9BD5;\n}\n.running-color {\n color: #0071C4;\n}\n.running-color-lite {\n color: #4C9BD5;\n}\n.failure-bg {\n background-color: #C4000A;\n}\n.failure-bg-lite {\n background-color: #D54C53;\n}\n.failure-fill {\n fill: #C4000A;\n}\n.failure-fill-lite {\n fill: #D54C53;\n}\n.failure-color {\n color: #C4000A;\n}\n.failure-color-lite {\n color: #D54C53;\n}\n.aborted-bg {\n background-color: #C4000A;\n}\n.aborted-bg-lite {\n background-color: #D54C53;\n}\n.aborted-fill {\n fill: #C4000A;\n}\n.aborted-fill-lite {\n fill: #D54C53;\n}\n.aborted-color {\n color: #C4000A;\n}\n.aborted-color-lite {\n color: #D54C53;\n}\n.unstable-bg {\n background-color: #F5A623;\n}\n.unstable-bg-lite {\n background-color: #F6B44B;\n}\n.unstable-fill {\n fill: #F5A623;\n}\n.unstable-fill-lite {\n fill: #F6B44B;\n}\n.unstable-color {\n color: #F5A623;\n}\n.unstable-color-lite {\n color: #F6B44B;\n}\n.not_built-bg {\n background-color: #4A4A4A;\n}\n.not_built-bg-lite {\n background-color: #949393;\n}\n.not_built-fill {\n fill: #4A4A4A;\n}\n.not_built-fill-lite {\n fill: #949393;\n}\n.not_built-color {\n color: #4A4A4A;\n}\n.not_built-color-lite {\n color: #949393;\n}\n.queued-bg {\n background-color: #4A4A4A;\n}\n.queued-bg-lite {\n background-color: #949393;\n}\n.queued-fill {\n fill: #4A4A4A;\n}\n.queued-fill-lite {\n fill: #949393;\n}\n.queued-color {\n color: #4A4A4A;\n}\n.queued-color-lite {\n color: #949393;\n}\n.unknown-bg {\n background-color: #8900C4;\n}\n.unknown-bg-lite {\n background-color: #D54CC4;\n}\n.unknown-fill {\n fill: #8900C4;\n}\n.unknown-fill-lite {\n fill: #D54CC4;\n}\n.unknown-color {\n color: #8900C4;\n}\n.unknown-color-lite {\n color: #D54CC4;\n}\n.label-danger {\n background-color: #C4000A;\n}\n.label-warning {\n background-color: #F5A623;\n}\n.label-info {\n background-color: #0071C4;\n}\n.label-success {\n background-color: #4A9900;\n}\n.label-primary {\n background-color: #4A90E2;\n}\n.btn-link {\n color: #4A90E2;\n}\na {\n text-decoration: none;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge,\na {\n color: #4A90E2;\n}\na:hover {\n color: #1f69c1;\n text-decoration: underline;\n}\na.inverse {\n color: white;\n}\na.inverse:hover {\n color: white;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text {\n color: white;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:focus {\n background-color: #4A90E2;\n}\n.nav-pills > li.active > a:hover {\n background-color: #1f69c1;\n}\n.progress-bar {\n background-color: #4A90E2;\n}\nbody {\n font-family: \"LatoLatinWeb\", \"Lato\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n background-color: #FFF;\n}\ncode,\npre,\nkbd {\n font-family: \"Source Code Pro\", Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\n.btn-default,\n.btn,\nbutton,\n.btn-primary {\n display: inline-block;\n padding: 0.5rem 1rem;\n font-family: \"LatoLatinWebSemibold\", \"Lato\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n border: solid 1px #4A90E2;\n border-radius: 3px;\n text-align: center;\n text-decoration: none;\n background-color: #4A90E2;\n color: #fff;\n cursor: pointer;\n min-width: 130px;\n}\n.btn-default:hover,\n.btn:hover,\nbutton:hover,\n.btn-primary:hover,\n.btn-default:focus,\n.btn:focus,\nbutton:focus,\n.btn-primary:focus,\n.btn-default:active,\n.btn:active,\nbutton:active,\n.btn-primary:active,\n.btn-default.active,\n.btn.active,\nbutton.active,\n.btn-primary.active {\n background-color: #4A90E2;\n border-color: #2171ce;\n color: #fff;\n text-decoration: none;\n}\n.btn-default.disabled,\n.btn.disabled,\nbutton.disabled,\n.btn-primary.disabled,\n.btn-default[disabled],\n.btn[disabled],\nbutton[disabled],\n.btn-primary[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn,\nfieldset[disabled] button,\nfieldset[disabled] .btn-primary,\n.btn-default.disabled:hover,\n.btn.disabled:hover,\nbutton.disabled:hover,\n.btn-primary.disabled:hover,\n.btn-default[disabled]:hover,\n.btn[disabled]:hover,\nbutton[disabled]:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\nfieldset[disabled] .btn:hover,\nfieldset[disabled] button:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-default.disabled:focus,\n.btn.disabled:focus,\nbutton.disabled:focus,\n.btn-primary.disabled:focus,\n.btn-default[disabled]:focus,\n.btn[disabled]:focus,\nbutton[disabled]:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\nfieldset[disabled] .btn:focus,\nfieldset[disabled] button:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-default.disabled.focus,\n.btn.disabled.focus,\nbutton.disabled.focus,\n.btn-primary.disabled.focus,\n.btn-default[disabled].focus,\n.btn[disabled].focus,\nbutton[disabled].focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-default.focus,\nfieldset[disabled] .btn.focus,\nfieldset[disabled] button.focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-default.disabled:active,\n.btn.disabled:active,\nbutton.disabled:active,\n.btn-primary.disabled:active,\n.btn-default[disabled]:active,\n.btn[disabled]:active,\nbutton[disabled]:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-default:active,\nfieldset[disabled] .btn:active,\nfieldset[disabled] button:active,\nfieldset[disabled] .btn-primary:active,\n.btn-default.disabled.active,\n.btn.disabled.active,\nbutton.disabled.active,\n.btn-primary.disabled.active,\n.btn-default[disabled].active,\n.btn[disabled].active,\nbutton[disabled].active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-default.active,\nfieldset[disabled] .btn.active,\nfieldset[disabled] button.active,\nfieldset[disabled] .btn-primary.active {\n opacity: 0.4;\n}\n.btn-default.inverse,\n.btn.inverse,\nbutton.inverse,\n.btn-primary.inverse {\n display: inline-block;\n padding: 0.5rem 1rem;\n font-family: \"LatoLatinWebSemibold\", \"Lato\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n border: solid 1px #4A90E2;\n border-radius: 3px;\n text-align: center;\n text-decoration: none;\n background-color: white;\n color: #4A90E2;\n cursor: pointer;\n min-width: 130px;\n}\n.btn-default.inverse:hover,\n.btn.inverse:hover,\nbutton.inverse:hover,\n.btn-primary.inverse:hover,\n.btn-default.inverse:focus,\n.btn.inverse:focus,\nbutton.inverse:focus,\n.btn-primary.inverse:focus,\n.btn-default.inverse:active,\n.btn.inverse:active,\nbutton.inverse:active,\n.btn-primary.inverse:active,\n.btn-default.inverse.active,\n.btn.inverse.active,\nbutton.inverse.active,\n.btn-primary.inverse.active {\n background-color: white;\n border-color: #2171ce;\n color: #4A90E2;\n text-decoration: none;\n}\n.btn-default.inverse.disabled,\n.btn.inverse.disabled,\nbutton.inverse.disabled,\n.btn-primary.inverse.disabled,\n.btn-default.inverse[disabled],\n.btn.inverse[disabled],\nbutton.inverse[disabled],\n.btn-primary.inverse[disabled],\nfieldset[disabled] .btn-default.inverse,\nfieldset[disabled] .btn.inverse,\nfieldset[disabled] button.inverse,\nfieldset[disabled] .btn-primary.inverse,\n.btn-default.inverse.disabled:hover,\n.btn.inverse.disabled:hover,\nbutton.inverse.disabled:hover,\n.btn-primary.inverse.disabled:hover,\n.btn-default.inverse[disabled]:hover,\n.btn.inverse[disabled]:hover,\nbutton.inverse[disabled]:hover,\n.btn-primary.inverse[disabled]:hover,\nfieldset[disabled] .btn-default.inverse:hover,\nfieldset[disabled] .btn.inverse:hover,\nfieldset[disabled] button.inverse:hover,\nfieldset[disabled] .btn-primary.inverse:hover,\n.btn-default.inverse.disabled:focus,\n.btn.inverse.disabled:focus,\nbutton.inverse.disabled:focus,\n.btn-primary.inverse.disabled:focus,\n.btn-default.inverse[disabled]:focus,\n.btn.inverse[disabled]:focus,\nbutton.inverse[disabled]:focus,\n.btn-primary.inverse[disabled]:focus,\nfieldset[disabled] .btn-default.inverse:focus,\nfieldset[disabled] .btn.inverse:focus,\nfieldset[disabled] button.inverse:focus,\nfieldset[disabled] .btn-primary.inverse:focus,\n.btn-default.inverse.disabled.focus,\n.btn.inverse.disabled.focus,\nbutton.inverse.disabled.focus,\n.btn-primary.inverse.disabled.focus,\n.btn-default.inverse[disabled].focus,\n.btn.inverse[disabled].focus,\nbutton.inverse[disabled].focus,\n.btn-primary.inverse[disabled].focus,\nfieldset[disabled] .btn-default.inverse.focus,\nfieldset[disabled] .btn.inverse.focus,\nfieldset[disabled] button.inverse.focus,\nfieldset[disabled] .btn-primary.inverse.focus,\n.btn-default.inverse.disabled:active,\n.btn.inverse.disabled:active,\nbutton.inverse.disabled:active,\n.btn-primary.inverse.disabled:active,\n.btn-default.inverse[disabled]:active,\n.btn.inverse[disabled]:active,\nbutton.inverse[disabled]:active,\n.btn-primary.inverse[disabled]:active,\nfieldset[disabled] .btn-default.inverse:active,\nfieldset[disabled] .btn.inverse:active,\nfieldset[disabled] button.inverse:active,\nfieldset[disabled] .btn-primary.inverse:active,\n.btn-default.inverse.disabled.active,\n.btn.inverse.disabled.active,\nbutton.inverse.disabled.active,\n.btn-primary.inverse.disabled.active,\n.btn-default.inverse[disabled].active,\n.btn.inverse[disabled].active,\nbutton.inverse[disabled].active,\n.btn-primary.inverse[disabled].active,\nfieldset[disabled] .btn-default.inverse.active,\nfieldset[disabled] .btn.inverse.active,\nfieldset[disabled] button.inverse.active,\nfieldset[disabled] .btn-primary.inverse.active {\n opacity: 0.4;\n}\n.btn-secondary {\n display: inline-block;\n padding: 0.5rem 1rem;\n font-family: \"LatoLatinWebSemibold\", \"Lato\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n border: solid 1px #4A90E2;\n border-radius: 3px;\n text-align: center;\n text-decoration: none;\n background-color: transparent;\n color: #4A90E2;\n cursor: pointer;\n min-width: 130px;\n}\n.btn-secondary:hover,\n.btn-secondary:focus,\n.btn-secondary:active,\n.btn-secondary.active {\n background-color: transparent;\n border-color: #2171ce;\n color: #4A90E2;\n text-decoration: none;\n}\n.btn-secondary.disabled,\n.btn-secondary[disabled],\nfieldset[disabled] .btn-secondary,\n.btn-secondary.disabled:hover,\n.btn-secondary[disabled]:hover,\nfieldset[disabled] .btn-secondary:hover,\n.btn-secondary.disabled:focus,\n.btn-secondary[disabled]:focus,\nfieldset[disabled] .btn-secondary:focus,\n.btn-secondary.disabled.focus,\n.btn-secondary[disabled].focus,\nfieldset[disabled] .btn-secondary.focus,\n.btn-secondary.disabled:active,\n.btn-secondary[disabled]:active,\nfieldset[disabled] .btn-secondary:active,\n.btn-secondary.disabled.active,\n.btn-secondary[disabled].active,\nfieldset[disabled] .btn-secondary.active {\n opacity: 0.4;\n}\n.btn-secondary.inverse {\n display: inline-block;\n padding: 0.5rem 1rem;\n font-family: \"LatoLatinWebSemibold\", \"Lato\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n border: solid 1px white;\n border-radius: 3px;\n text-align: center;\n text-decoration: none;\n background-color: transparent;\n color: white;\n cursor: pointer;\n min-width: 130px;\n}\n.btn-secondary.inverse:hover,\n.btn-secondary.inverse:focus,\n.btn-secondary.inverse:active,\n.btn-secondary.inverse.active {\n background-color: transparent;\n border-color: #e0e0e0;\n color: white;\n text-decoration: none;\n}\n.btn-secondary.inverse.disabled,\n.btn-secondary.inverse[disabled],\nfieldset[disabled] .btn-secondary.inverse,\n.btn-secondary.inverse.disabled:hover,\n.btn-secondary.inverse[disabled]:hover,\nfieldset[disabled] .btn-secondary.inverse:hover,\n.btn-secondary.inverse.disabled:focus,\n.btn-secondary.inverse[disabled]:focus,\nfieldset[disabled] .btn-secondary.inverse:focus,\n.btn-secondary.inverse.disabled.focus,\n.btn-secondary.inverse[disabled].focus,\nfieldset[disabled] .btn-secondary.inverse.focus,\n.btn-secondary.inverse.disabled:active,\n.btn-secondary.inverse[disabled]:active,\nfieldset[disabled] .btn-secondary.inverse:active,\n.btn-secondary.inverse.disabled.active,\n.btn-secondary.inverse[disabled].active,\nfieldset[disabled] .btn-secondary.inverse.active {\n opacity: 0.4;\n}\n.btn-success {\n display: inline-block;\n padding: 0.5rem 1rem;\n font-family: \"LatoLatinWebSemibold\", \"Lato\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n border: solid 1px #4A9900;\n border-radius: 3px;\n text-align: center;\n text-decoration: none;\n background-color: #4A9900;\n color: #fff;\n cursor: pointer;\n min-width: 130px;\n}\n.btn-success:hover,\n.btn-success:focus,\n.btn-success:active,\n.btn-success.active {\n background-color: #4A9900;\n border-color: #2c5c00;\n color: #fff;\n text-decoration: none;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n opacity: 0.4;\n}\n.btn-info {\n display: inline-block;\n padding: 0.5rem 1rem;\n font-family: \"LatoLatinWebSemibold\", \"Lato\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n border: solid 1px #0071C4;\n border-radius: 3px;\n text-align: center;\n text-decoration: none;\n background-color: #0071C4;\n color: #fff;\n cursor: pointer;\n min-width: 130px;\n}\n.btn-info:hover,\n.btn-info:focus,\n.btn-info:active,\n.btn-info.active {\n background-color: #0071C4;\n border-color: #004e87;\n color: #fff;\n text-decoration: none;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n opacity: 0.4;\n}\n.btn-warning {\n display: inline-block;\n padding: 0.5rem 1rem;\n font-family: \"LatoLatinWebSemibold\", \"Lato\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n border: solid 1px #F5A623;\n border-radius: 3px;\n text-align: center;\n text-decoration: none;\n background-color: #F5A623;\n color: #fff;\n cursor: pointer;\n min-width: 130px;\n}\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning:active,\n.btn-warning.active {\n background-color: #F5A623;\n border-color: #d1860a;\n color: #fff;\n text-decoration: none;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n opacity: 0.4;\n}\n.btn-danger {\n display: inline-block;\n padding: 0.5rem 1rem;\n font-family: \"LatoLatinWebSemibold\", \"Lato\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n border: solid 1px #C4000A;\n border-radius: 3px;\n text-align: center;\n text-decoration: none;\n background-color: #C4000A;\n color: #fff;\n cursor: pointer;\n min-width: 130px;\n}\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger:active,\n.btn-danger.active {\n background-color: #C4000A;\n border-color: #870007;\n color: #fff;\n text-decoration: none;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n opacity: 0.4;\n}\na.small,\nbutton.small,\n.btn.small,\n.btn-default.small,\n.btn-primary.small,\n.btn-secondary.small,\n.btn-success.small,\n.btn-info.small,\n.btn-warning.small,\n.btn-danger.small {\n font-size: 12px;\n height: 24px;\n min-width: 75px;\n padding: 3px 10px;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #4A90E2 0%, #3483de 100%);\n background-image: -o-linear-gradient(top, #4A90E2 0%, #3483de 100%);\n background-image: linear-gradient(to bottom, #4A90E2 0%, #3483de 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4a90e2', endColorstr='#ff3483de', GradientType=0);\n background-color: #3483de;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #4A90E2 0%, #3483de 100%);\n background-image: -o-linear-gradient(top, #4A90E2 0%, #3483de 100%);\n background-image: linear-gradient(to bottom, #4A90E2 0%, #3483de 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4a90e2', endColorstr='#ff3483de', GradientType=0);\n }\n}\n.alert {\n border: none;\n}\n.alert-success {\n background-color: #8CC04F;\n color: white;\n border-radius: 3px;\n}\n.alert-info {\n background-color: #4C9BD5;\n color: white;\n border-radius: 3px;\n}\n.alert-warning {\n background-color: #F6B44B;\n color: white;\n border-radius: 3px;\n}\n.alert-danger {\n background-color: #D54C53;\n color: white;\n border-radius: 3px;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #95bcef 0%, #a7c7f2 100%);\n background-image: -o-linear-gradient(top, #95bcef 0%, #a7c7f2 100%);\n background-image: linear-gradient(to bottom, #95bcef 0%, #a7c7f2 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff95bcef', endColorstr='#ffa7c7f2', GradientType=0);\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #4A90E2 0%, #2275d7 100%);\n background-image: -o-linear-gradient(top, #4A90E2 0%, #2275d7 100%);\n background-image: linear-gradient(to bottom, #4A90E2 0%, #2275d7 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4a90e2', endColorstr='#ff2275d7', GradientType=0);\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #4A9900 0%, #316600 100%);\n background-image: -o-linear-gradient(top, #4A9900 0%, #316600 100%);\n background-image: linear-gradient(to bottom, #4A9900 0%, #316600 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4a9900', endColorstr='#ff316600', GradientType=0);\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #0071C4 0%, #005491 100%);\n background-image: -o-linear-gradient(top, #0071C4 0%, #005491 100%);\n background-image: linear-gradient(to bottom, #0071C4 0%, #005491 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0071c4', endColorstr='#ff005491', GradientType=0);\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #F5A623 0%, #db8c0a 100%);\n background-image: -o-linear-gradient(top, #F5A623 0%, #db8c0a 100%);\n background-image: linear-gradient(to bottom, #F5A623 0%, #db8c0a 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5a623', endColorstr='#ffdb8c0a', GradientType=0);\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #C4000A 0%, #910007 100%);\n background-image: -o-linear-gradient(top, #C4000A 0%, #910007 100%);\n background-image: linear-gradient(to bottom, #C4000A 0%, #910007 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffc4000a', endColorstr='#ff910007', GradientType=0);\n}\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #2275d7;\n background-image: -webkit-linear-gradient(top, #4A90E2 0%, #297cdd 100%);\n background-image: -o-linear-gradient(top, #4A90E2 0%, #297cdd 100%);\n background-image: linear-gradient(to bottom, #4A90E2 0%, #297cdd 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4a90e2', endColorstr='#ff297cdd', GradientType=0);\n border-color: #297cdd;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-color: #f5f5f5;\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n color: white;\n border: inherit;\n}\n.panel-primary > .panel-heading {\n background-color: #4A90E2;\n background-image: -webkit-linear-gradient(top, #4A90E2 0%, #3483de 100%);\n background-image: -o-linear-gradient(top, #4A90E2 0%, #3483de 100%);\n background-image: linear-gradient(to bottom, #4A90E2 0%, #3483de 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4a90e2', endColorstr='#ff3483de', GradientType=0);\n color: white;\n border: inherit;\n}\n.panel-success > .panel-heading {\n background-color: #8CC04F;\n background-image: -webkit-linear-gradient(top, #8CC04F 0%, #7fb541 100%);\n background-image: -o-linear-gradient(top, #8CC04F 0%, #7fb541 100%);\n background-image: linear-gradient(to bottom, #8CC04F 0%, #7fb541 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff8cc04f', endColorstr='#ff7fb541', GradientType=0);\n color: white;\n border: inherit;\n}\n.panel-info > .panel-heading {\n background-color: #4C9BD5;\n background-image: -webkit-linear-gradient(top, #4C9BD5 0%, #378fd0 100%);\n background-image: -o-linear-gradient(top, #4C9BD5 0%, #378fd0 100%);\n background-image: linear-gradient(to bottom, #4C9BD5 0%, #378fd0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4c9bd5', endColorstr='#ff378fd0', GradientType=0);\n color: white;\n border: inherit;\n}\n.panel-warning > .panel-heading {\n background-color: #F6B44B;\n background-image: -webkit-linear-gradient(top, #F6B44B 0%, #f5aa33 100%);\n background-image: -o-linear-gradient(top, #F6B44B 0%, #f5aa33 100%);\n background-image: linear-gradient(to bottom, #F6B44B 0%, #f5aa33 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff6b44b', endColorstr='#fff5aa33', GradientType=0);\n color: white;\n border: inherit;\n}\n.panel-danger > .panel-heading {\n background-color: #D54C53;\n background-image: -webkit-linear-gradient(top, #D54C53 0%, #d0373f 100%);\n background-image: -o-linear-gradient(top, #D54C53 0%, #d0373f 100%);\n background-image: linear-gradient(to bottom, #D54C53 0%, #d0373f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd54c53', endColorstr='#ffd0373f', GradientType=0);\n color: white;\n border: inherit;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-primary {\n border-color: #4A90E2;\n}\n.panel-success {\n border-color: #93b541;\n}\n.panel-info {\n border-color: #30a5cd;\n}\n.panel-warning {\n border-color: #f58a33;\n}\n.panel-danger {\n border-color: #d03759;\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\ntable {\n border-collapse: collapse;\n width: 100%;\n}\ntable a {\n color: #4A4A4A;\n}\nthead tr:last-child {\n border-bottom: solid 1px;\n}\nthead tr:last-child th {\n padding-bottom: 1.5rem;\n}\ntbody tr:first-child td {\n padding-top: 1rem;\n}\nth {\n font-family: \"LatoLatinWebSemibold\", \"Lato\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-weight: normal;\n}\ntd,\nth {\n padding: 0.5em 0;\n text-align: left;\n}\nth:first-child,\ntd:first-child {\n padding-left: 1em;\n}\n.log-header {\n font-family: \"LatoLatinWeb\", \"Lato\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 5px;\n}\n.log-header__section {\n display: flex;\n align-items: center;\n}\n.log-header__section a {\n padding-left: 10px;\n}\n.download-log-button {\n cursor: pointer;\n opacity: 0.87000002;\n}\ncode {\n font-family: \"Source Code Pro\", Menlo, Monaco, Consolas, \"Courier New\", monospace;\n width: 100%;\n min-height: 12px;\n border: 1px solid #ccc;\n border-radius: 4px;\n position: relative;\n counter-reset: line;\n font-size: 1.2rem;\n}\ncode p:hover {\n background-color: #444 !important;\n}\ncode p {\n counter-increment: line;\n margin: 0;\n display: flex;\n align-items: baseline;\n}\ncode p::nth-line {\n color: yellow !important;\n}\ncode p a {\n margin: 0;\n padding: 0 15px 0 20px;\n word-break: break-all;\n display: inline;\n color: #f5f5f5;\n}\ncode a:hover {\n color: #f5f5f5;\n text-decoration: none;\n}\ncode p::before {\n color: #777777;\n content: counter(line);\n min-width: 35px;\n white-space: nowrap;\n padding-right: 1em;\n padding-left: 10px;\n text-align: right;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\ncode.block {\n background-color: #333333;\n color: #f5f5f5;\n display: block;\n padding: 0.5rem;\n border: solid 1px #000000;\n}\ncode.inline {\n display: inline-block;\n padding: inherit;\n white-space: pre-wrap;\n}\ncode.hash {\n border: 0;\n font-size: 1.4rem;\n}\n.material-icons {\n color: #4A90E2;\n}\n.material-icons.selected {\n color: #F5A623;\n}\n.content-width {\n min-width: 70rem;\n margin-left: 100px;\n margin-right: 100px;\n}\n@media screen and (max-width: 1000px) {\n .content-width {\n width: 80%;\n margin-left: auto;\n margin-right: auto;\n }\n}\n.global-header {\n position: relative;\n font-size: 1.5rem;\n letter-spacing: 1.1px;\n background-color: #4A90E2;\n color: white;\n}\n.global-header a {\n color: white;\n}\n.global-header nav {\n text-align: center;\n padding: 1rem 0;\n}\n.global-header nav a {\n color: white;\n font-weight: normal;\n text-decoration: none;\n display: inline-block;\n padding: 0.5rem 2rem;\n font-family: \"LatoLatinWeb\", \"Lato\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n}\n.global-header a:hover {\n color: #333333;\n}\n.global-header .button-bar {\n position: absolute;\n top: 0;\n right: 100px;\n height: 48px;\n display: flex;\n align-items: center;\n}\n.sub-header {\n background-color: #4A90E2;\n color: #4A4A4A;\n padding: 0;\n letter-spacing: 1.1px;\n}\n.sub-header nav.page-title {\n min-width: 70rem;\n margin-left: 100px;\n margin-right: 100px;\n color: white;\n display: flex;\n height: 6rem;\n align-items: center;\n}\n@media screen and (max-width: 1000px) {\n .sub-header nav.page-title {\n width: 80%;\n margin-left: auto;\n margin-right: auto;\n }\n}\n.sub-header nav.page-title > * {\n margin-right: 1rem;\n}\n.sub-header nav.page-title > *:last-child {\n margin-right: 0;\n}\n.sub-header nav.page-title a {\n color: white;\n}\n.sub-header nav.page-title h1 {\n font-size: 1.8rem;\n}\n.sub-header nav.page-tabs {\n min-width: 70rem;\n margin-left: 100px;\n margin-right: 100px;\n}\n@media screen and (max-width: 1000px) {\n .sub-header nav.page-tabs {\n width: 80%;\n margin-left: auto;\n margin-right: auto;\n }\n}\n.page-tabs a {\n color: white;\n display: inline-block;\n min-width: 133px;\n padding: 1rem 1rem 0;\n height: 40px;\n text-align: center;\n text-decoration: none;\n position: relative;\n transform: translateZ(0);\n}\n.page-tabs a:before {\n content: \"\";\n position: absolute;\n z-index: -1;\n left: 0;\n right: 0;\n bottom: 0;\n background: white;\n height: 3px;\n transition-timing-function: ease-out;\n transition-duration: 0.2s;\n transform: translateY(3px);\n transition-property: transform;\n}\n.page-tabs a.selected:before,\n.page-tabs:hover a.selected:hover:before,\n.page-tabs a:hover:before {\n transform: translateY(0);\n}\n.page-tabs:hover a.selected:before {\n transform: translateY(3px);\n}\nmain article {\n min-width: 70rem;\n margin-left: 100px;\n margin-right: 100px;\n padding: 1rem 0;\n}\n@media screen and (max-width: 1000px) {\n main article {\n width: 80%;\n margin-left: auto;\n margin-right: auto;\n }\n}\n.container-fluid {\n padding: 0;\n}\nfooter {\n text-align: center;\n margin: 1em;\n}\n.overlayStyles {\n position: fixed;\n display: block;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n zIndex: 99;\n background-color: rgba(0, 0, 0, 0.3);\n}\n.dialog {\n width: 100%;\n height: 100%;\n min-width: 640px;\n position: fixed;\n top: 0;\n left: 0;\n display: flex;\n flex-direction: column;\n background-color: #fff;\n border-radius: 2px;\n z-index: 100;\n box-shadow: 0 0 4px rgba(0, 0, 0, 0.14), 0 4px 8px rgba(0, 0, 0, 0.28);\n}\n.expand-in-appear {\n -webkit-transition: all ease-out 0.15s;\n -o-transition: all ease-out 0.15s;\n transition: all ease-out 0.15s;\n top: 4%;\n opacity: 0.01;\n transform: scale(0.96);\n}\n.expand-in-appear.expand-in-appear-active {\n top: 0;\n opacity: 1;\n transform: scale(1);\n}\n.expand-in-leave {\n -webkit-transition: all ease-out 0.1s;\n -o-transition: all ease-out 0.1s;\n transition: all ease-out 0.1s;\n top: 0;\n opacity: 1;\n transform: scale(1);\n}\n.expand-in-leave.expand-in-leave-active {\n top: 4%;\n opacity: 0.01;\n transform: scale(0.96);\n}\n.slideup-appear {\n -webkit-transition: all ease-out 0.3s;\n -o-transition: all ease-out 0.3s;\n transition: all ease-out 0.3s;\n top: 75%;\n opacity: 0.01;\n}\n.slideup-appear.slideup-appear-active {\n top: 0;\n opacity: 1;\n}\n.slideup-leave {\n -webkit-transition: all ease-out 0.3s;\n -o-transition: all ease-out 0.3s;\n transition: all ease-out 0.3s;\n top: 0;\n opacity: 1;\n}\n.slideup-leave.slideup-leave-active {\n top: 75%;\n opacity: 0.01;\n}\n.fadein-appear {\n -webkit-transition: opacity ease-out 1s;\n -o-transition: opacity ease-out 1s;\n transition: opacity ease-out 1s;\n opacity: 0.01;\n}\n.fadein-appear.fadein-appear-active {\n opacity: 1;\n}\n.dialog .header {\n color: #ffffff;\n font-weight: normal;\n line-height: 20px;\n font-size: 1.6rem;\n}\n.dialog .header-content {\n padding: 0 50px 0 50px;\n}\n.dialog .header .page-tabs {\n font-size: 1.5rem;\n}\n.dialog .header .page-tabs a {\n letter-spacing: 1.1px;\n}\n@supports (overflow:-webkit-marquee) and (justify-content:inherit) {\n .dialog .header .page-tabs {\n margin-bottom: 22px;\n }\n}\n.dialog .header.success {\n background-color: #4A9900;\n}\n.dialog .header.failure,\n.dialog .header.aborted {\n background-color: #C4000A;\n}\n.dialog .header.unstable {\n background-color: #F5A623;\n}\n.dialog .header.info,\n.dialog .header.running {\n background-color: #0071C4;\n}\n.dialog .header.not_built {\n background-color: #4A4A4A;\n}\n.dialog .header.queued {\n background-color: #949393;\n}\n.dialog .header.unknown {\n background-color: #8900C4;\n}\n.dialog .content {\n width: 100%;\n height: 100%;\n overflow-y: auto;\n padding: 25px 50px 25px 50px;\n background-color: #fff;\n}\n.header .title {\n margin-top: 0;\n}\n.header .closeButton {\n cursor: pointer;\n text-decoration: none;\n position: absolute;\n font-size: 3em;\n color: #ffffff;\n right: 10px;\n top: 10px;\n}\n.spin {\n -webkit-animation-name: spin;\n -webkit-animation-duration: 4000ms;\n -webkit-animation-iteration-count: infinite;\n -webkit-animation-timing-function: linear;\n -moz-animation-name: spin;\n -moz-animation-duration: 4000ms;\n -moz-animation-iteration-count: infinite;\n -moz-animation-timing-function: linear;\n -ms-animation-name: spin;\n -ms-animation-duration: 4000ms;\n -ms-animation-iteration-count: infinite;\n -ms-animation-timing-function: linear;\n animation-name: spin;\n animation-duration: 4000ms;\n animation-iteration-count: infinite;\n animation-timing-function: linear;\n}\n@-ms-keyframes spin {\n from {\n -ms-transform: rotate(0deg);\n }\n to {\n -ms-transform: rotate(360deg);\n }\n}\n@-moz-keyframes spin {\n from {\n -moz-transform: rotate(0deg);\n }\n to {\n -moz-transform: rotate(360deg);\n }\n}\n@-webkit-keyframes spin {\n from {\n -webkit-transform: rotate(0deg);\n }\n to {\n -webkit-transform: rotate(360deg);\n }\n}\n@keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n.left {\n float: left;\n}\n.right {\n float: right;\n}\n.clickIndicator {\n cursor: pointer;\n}\n.activity-table tbody tr:hover,\n.multibranch-table tbody tr:hover,\n.pr-table tbody tr:hover {\n cursor: pointer;\n background-color: rgba(148, 147, 147, 0.1);\n}\n.Site {\n display: flex;\n min-height: 100vh;\n flex-direction: column;\n}\n#outer {\n flex: 1;\n}\n.development-footer {\n padding-bottom: 10px;\n width: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n color: #777777;\n}\n\n/*# sourceMappingURL=jenkins-design-language.css.map */\n" }, "redirectURL": "", "headersSize": 312, "bodySize": 8230, "_transferSize": 8542 }, "cache": {}, "timings": { "blocked": 336.469999994733, "dns": -1, "connect": -1, "send": 0.1139999949380126, "wait": 240.57400001038303, "receive": 3.427999996347353, "ssl": -1 }, "serverIPAddress": "146.148.6.102", "connection": "476136", "pageref": "page_4" }, { "startedDateTime": "2016-09-15T02:01:51.382Z", "time": 582.6490000035847, "request": { "method": "GET", "url": "http://gc-build-01.soteriadev.net/static/76087cd9/plugin/blueocean-web/assets/corejs/css/blueocean-core-js.css", "httpVersion": "HTTP/1.1", "headers": [ { "name": "Pragma", "value": "no-cache" }, { "name": "Accept-Encoding", "value": "gzip, deflate, sdch" }, { "name": "Host", "value": "gc-build-01.soteriadev.net" }, { "name": "Accept-Language", "value": "en-US,en;q=0.8" }, { "name": "User-Agent", "value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" }, { "name": "Accept", "value": "text/css,*/*;q=0.1" }, { "name": "Referer", "value": "http://gc-build-01.soteriadev.net/blue/pipelines/" }, { "name": "Cookie", "value": "ACEGI_SECURITY_HASHED_REMEMBER_ME_COOKIE=ZGFycmFnaF9zaGVyd2luOjE0NzQ0NDgxODU0Mzg6ODlkMzlmMmIzZTE0OWE5ZmZkNzlhYWFhNjAwNDk2NjhkNDU2YzNkNmFlODZlMGQ4ZDM5MTM3Y2UzYWRmNGM2Zg==; jenkins-timestamper-offset=25200000; jenkins-timestamper=system; jenkins-timestamper-local=false; JSESSIONID.0a959749=1hk2jl2xk3r511uypp40s4qsgo; JSESSIONID.96246bea=8iofxbtqat6w171206x9d8j2p; screenResolution=1920x1200" }, { "name": "Connection", "value": "keep-alive" }, { "name": "Cache-Control", "value": "no-cache" } ], "queryString": [], "cookies": [ { "name": "ACEGI_SECURITY_HASHED_REMEMBER_ME_COOKIE", "value": "ZGFycmFnaF9zaGVyd2luOjE0NzQ0NDgxODU0Mzg6ODlkMzlmMmIzZTE0OWE5ZmZkNzlhYWFhNjAwNDk2NjhkNDU2YzNkNmFlODZlMGQ4ZDM5MTM3Y2UzYWRmNGM2Zg==", "expires": null, "httpOnly": false, "secure": false }, { "name": "jenkins-timestamper-offset", "value": "25200000", "expires": null, "httpOnly": false, "secure": false }, { "name": "jenkins-timestamper", "value": "system", "expires": null, "httpOnly": false, "secure": false }, { "name": "jenkins-timestamper-local", "value": "false", "expires": null, "httpOnly": false, "secure": false }, { "name": "JSESSIONID.0a959749", "value": "1hk2jl2xk3r511uypp40s4qsgo", "expires": null, "httpOnly": false, "secure": false }, { "name": "JSESSIONID.96246bea", "value": "8iofxbtqat6w171206x9d8j2p", "expires": null, "httpOnly": false, "secure": false }, { "name": "screenResolution", "value": "1920x1200", "expires": null, "httpOnly": false, "secure": false } ], "headersSize": 889, "bodySize": 0 }, "response": { "status": 200, "statusText": "OK", "httpVersion": "HTTP/1.1", "headers": [ { "name": "Date", "value": "Thu, 15 Sep 2016 02:01:51 GMT" }, { "name": "Content-Encoding", "value": "gzip" }, { "name": "X-Content-Type-Options", "value": "nosniff" }, { "name": "Last-Modified", "value": "Fri, 09 Sep 2016 13:19:08 GMT" }, { "name": "Server", "value": "nginx/1.2.1" }, { "name": "Content-Type", "value": "text/css" }, { "name": "Connection", "value": "keep-alive" }, { "name": "Accept-Ranges", "value": "bytes" }, { "name": "Content-Length", "value": "482" }, { "name": "Expires", "value": "Fri, 15 Sep 2017 02:01:51 GMT" } ], "cookies": [], "content": { "size": 2358, "mimeType": "text/css", "compression": 1876, "text": ".replay-button-component {\n display: inline-block;\n}\n.replay-button-component .replay-button {\n display: inline-block;\n cursor: pointer;\n}\n.replay-button-component .svg-icon {\n display: none;\n}\n.replay-button-component.icon-button {\n height: 24px;\n}\n.replay-button-component.icon-button .replay-button {\n width: 24px;\n height: 24px;\n background: transparent;\n border: 0;\n position: relative;\n}\n.replay-button-component.icon-button .replay-button .svg-icon {\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n}\n.replay-button-component.icon-button .button-label {\n display: none;\n}\n.replay-button-component .svg-icon {\n fill: #4A90E2;\n}\n.replay-button-component .svg-icon:hover {\n fill: #1C436A;\n}\n.replay-button-component.dark .btn {\n background: transparent;\n color: white;\n border-color: white;\n}\n.replay-button-component.dark .svg-icon {\n fill: white;\n}\n.run-button-component {\n display: inline-block;\n}\n.run-button-component .run-button,\n.run-button-component .stop-button {\n display: inline-block;\n cursor: pointer;\n}\n.run-button-component .svg-icon {\n display: none;\n}\n.run-button-component.icon-button {\n height: 24px;\n}\n.run-button-component.icon-button .run-button {\n width: 24px;\n height: 24px;\n background: transparent;\n border: 0;\n position: relative;\n}\n.run-button-component.icon-button .run-button .svg-icon {\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n}\n.run-button-component.icon-button .stop-button {\n padding: 2px;\n}\n.run-button-component.icon-button .stop-button .btn-icon {\n width: 20px;\n height: 20px;\n background-image: url('icons/stop-button-blue.svg');\n}\n.run-button-component.icon-button .stop-button .btn-icon:hover {\n background-image: url('icons/stop-button-blue-dark.svg');\n}\n.run-button-component.icon-button .stop-button.stopping {\n opacity: 0.4;\n cursor: auto;\n}\n.run-button-component.icon-button .button-label {\n display: none;\n}\n.run-button-component .svg-icon {\n fill: #4A90E2;\n}\n.run-button-component .svg-icon:hover {\n fill: #1C436A;\n}\n.run-button-component.dark .btn {\n background: transparent;\n color: white;\n border-color: white;\n}\n.run-button-component.dark .svg-icon {\n fill: white;\n}\n.run-button-component.dark .stop-button .btn-icon {\n background-image: url('icons/stop-button-white.svg');\n}\n\n/*# sourceMappingURL=blueocean-core-js.css.map */\n" }, "redirectURL": "", "headersSize": 311, "bodySize": 482, "_transferSize": 793 }, "cache": {}, "timings": { "blocked": 404.253999993671, "dns": -1, "connect": -1, "send": 0.13400000170798876, "wait": 175.48400000668994, "receive": 2.7770000015157166, "ssl": -1 }, "serverIPAddress": "146.148.6.102", "connection": "476135", "pageref": "page_4" }, { "startedDateTime": "2016-09-15T02:01:51.382Z", "time": 636.6369999886956, "request": { "method": "GET", "url": "http://gc-build-01.soteriadev.net/adjuncts/76087cd9/io/jenkins/blueocean/blueocean.css", "httpVersion": "HTTP/1.1", "headers": [ { "name": "Pragma", "value": "no-cache" }, { "name": "Accept-Encoding", "value": "gzip, deflate, sdch" }, { "name": "Host", "value": "gc-build-01.soteriadev.net" }, { "name": "Accept-Language", "value": "en-US,en;q=0.8" }, { "name": "User-Agent", "value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" }, { "name": "Accept", "value": "text/css,*/*;q=0.1" }, { "name": "Referer", "value": "http://gc-build-01.soteriadev.net/blue/pipelines/" }, { "name": "Cookie", "value": "ACEGI_SECURITY_HASHED_REMEMBER_ME_COOKIE=ZGFycmFnaF9zaGVyd2luOjE0NzQ0NDgxODU0Mzg6ODlkMzlmMmIzZTE0OWE5ZmZkNzlhYWFhNjAwNDk2NjhkNDU2YzNkNmFlODZlMGQ4ZDM5MTM3Y2UzYWRmNGM2Zg==; jenkins-timestamper-offset=25200000; jenkins-timestamper=system; jenkins-timestamper-local=false; JSESSIONID.0a959749=1hk2jl2xk3r511uypp40s4qsgo; JSESSIONID.96246bea=8iofxbtqat6w171206x9d8j2p; screenResolution=1920x1200" }, { "name": "Connection", "value": "keep-alive" }, { "name": "Cache-Control", "value": "no-cache" } ], "queryString": [], "cookies": [ { "name": "ACEGI_SECURITY_HASHED_REMEMBER_ME_COOKIE", "value": "ZGFycmFnaF9zaGVyd2luOjE0NzQ0NDgxODU0Mzg6ODlkMzlmMmIzZTE0OWE5ZmZkNzlhYWFhNjAwNDk2NjhkNDU2YzNkNmFlODZlMGQ4ZDM5MTM3Y2UzYWRmNGM2Zg==", "expires": null, "httpOnly": false, "secure": false }, { "name": "jenkins-timestamper-offset", "value": "25200000", "expires": null, "httpOnly": false, "secure": false }, { "name": "jenkins-timestamper", "value": "system", "expires": null, "httpOnly": false, "secure": false }, { "name": "jenkins-timestamper-local", "value": "false", "expires": null, "httpOnly": false, "secure": false }, { "name": "JSESSIONID.0a959749", "value": "1hk2jl2xk3r511uypp40s4qsgo", "expires": null, "httpOnly": false, "secure": false }, { "name": "JSESSIONID.96246bea", "value": "8iofxbtqat6w171206x9d8j2p", "expires": null, "httpOnly": false, "secure": false }, { "name": "screenResolution", "value": "1920x1200", "expires": null, "httpOnly": false, "secure": false } ], "headersSize": 865, "bodySize": 0 }, "response": { "status": 200, "statusText": "OK", "httpVersion": "HTTP/1.1", "headers": [ { "name": "Date", "value": "Thu, 15 Sep 2016 02:01:51 GMT" }, { "name": "Content-Encoding", "value": "gzip" }, { "name": "X-Content-Type-Options", "value": "nosniff" }, { "name": "Last-Modified", "value": "Fri, 09 Sep 2016 13:19:08 GMT" }, { "name": "Server", "value": "nginx/1.2.1" }, { "name": "Content-Type", "value": "text/css" }, { "name": "Connection", "value": "keep-alive" }, { "name": "Accept-Ranges", "value": "bytes" }, { "name": "Content-Length", "value": "261" }, { "name": "Expires", "value": "Fri, 15 Sep 2017 02:01:51 GMT" } ], "cookies": [], "content": { "size": 450, "mimeType": "text/css", "compression": 189, "text": ".toaster {\n position: fixed;\n z-index: 4000;\n bottom: 0;\n left: 0;\n width: 400px;\n height: 210px;\n padding-left: 10px;\n pointer-events: none;\n background: none !important;\n}\n.toaster .toast {\n pointer-events: all;\n}\nhtml,\nbody,\ndiv#root {\n height: 100%;\n}\n.Site {\n display: flex;\n flex-direction: column;\n height: 100%;\n /* 1, 3 */\n}\n.Site-header,\n.Site-footer {\n flex: none;\n /* 2 */\n}\n.Site-content {\n flex: 1 0 auto;\n /* 2 */\n}\n" }, "redirectURL": "", "headersSize": 311, "bodySize": 261, "_transferSize": 572 }, "cache": {}, "timings": { "blocked": 452.460999993491, "dns": -1, "connect": -1, "send": 0.11500000255199438, "wait": 181.532000002335, "receive": 2.5289999903176295, "ssl": -1 }, "serverIPAddress": "146.148.6.102", "connection": "476138", "pageref": "page_4" }, { "startedDateTime": "2016-09-15T02:01:51.383Z", "time": 7783.108000003267, "request": { "method": "GET", "url": "http://gc-build-01.soteriadev.net/adjuncts/76087cd9/io/jenkins/blueocean/blueocean.js", "httpVersion": "HTTP/1.1", "headers": [ { "name": "Pragma", "value": "no-cache" }, { "name": "Accept-Encoding", "value": "gzip, deflate, sdch" }, { "name": "Host", "value": "gc-build-01.soteriadev.net" }, { "name": "Accept-Language", "value": "en-US,en;q=0.8" }, { "name": "User-Agent", "value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" }, { "name": "Accept", "value": "*/*" }, { "name": "Referer", "value": "http://gc-build-01.soteriadev.net/blue/pipelines/" }, { "name": "Cookie", "value": "ACEGI_SECURITY_HASHED_REMEMBER_ME_COOKIE=ZGFycmFnaF9zaGVyd2luOjE0NzQ0NDgxODU0Mzg6ODlkMzlmMmIzZTE0OWE5ZmZkNzlhYWFhNjAwNDk2NjhkNDU2YzNkNmFlODZlMGQ4ZDM5MTM3Y2UzYWRmNGM2Zg==; jenkins-timestamper-offset=25200000; jenkins-timestamper=system; jenkins-timestamper-local=false; JSESSIONID.0a959749=1hk2jl2xk3r511uypp40s4qsgo; JSESSIONID.96246bea=8iofxbtqat6w171206x9d8j2p; screenResolution=1920x1200" }, { "name": "Connection", "value": "keep-alive" }, { "name": "Cache-Control", "value": "no-cache" } ], "queryString": [], "cookies": [ { "name": "ACEGI_SECURITY_HASHED_REMEMBER_ME_COOKIE", "value": "ZGFycmFnaF9zaGVyd2luOjE0NzQ0NDgxODU0Mzg6ODlkMzlmMmIzZTE0OWE5ZmZkNzlhYWFhNjAwNDk2NjhkNDU2YzNkNmFlODZlMGQ4ZDM5MTM3Y2UzYWRmNGM2Zg==", "expires": null, "httpOnly": false, "secure": false }, { "name": "jenkins-timestamper-offset", "value": "25200000", "expires": null, "httpOnly": false, "secure": false }, { "name": "jenkins-timestamper", "value": "system", "expires": null, "httpOnly": false, "secure": false }, { "name": "jenkins-timestamper-local", "value": "false", "expires": null, "httpOnly": false, "secure": false }, { "name": "JSESSIONID.0a959749", "value": "1hk2jl2xk3r511uypp40s4qsgo", "expires": null, "httpOnly": false, "secure": false }, { "name": "JSESSIONID.96246bea", "value": "8iofxbtqat6w171206x9d8j2p", "expires": null, "httpOnly": false, "secure": false }, { "name": "screenResolution", "value": "1920x1200", "expires": null, "httpOnly": false, "secure": false } ], "headersSize": 849, "bodySize": 0 }, "response": { "status": 200, "statusText": "OK", "httpVersion": "HTTP/1.1", "headers": [ { "name": "Date", "value": "Thu, 15 Sep 2016 02:01:51 GMT" }, { "name": "Content-Encoding", "value": "gzip" }, { "name": "X-Content-Type-Options", "value": "nosniff" }, { "name": "Last-Modified", "value": "Fri, 09 Sep 2016 13:19:08 GMT" }, { "name": "Server", "value": "nginx/1.2.1" }, { "name": "Transfer-Encoding", "value": "chunked" }, { "name": "Content-Type", "value": "application/javascript" }, { "name": "Connection", "value": "keep-alive" }, { "name": "Accept-Ranges", "value": "bytes" }, { "name": "Expires", "value": "Fri, 15 Sep 2017 02:01:51 GMT" } ], "cookies": [], "content": { "size": 2848094, "mimeType": "application/javascript", "compression": 2204585, "text": "(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o= 300 || response.status < 200) {\n var error = new Error(response.statusText);\n error.response = response;\n throw error;\n }\n return response;\n },\n\n\n /**\n * Adds same-origin option to the fetch.\n */\n sameOriginFetchOption: function sameOriginFetchOption() {\n var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n var newOpts = _utils2.default.clone(options);\n newOpts.credentials = newOpts.credentials || 'same-origin';\n return newOpts;\n },\n\n\n /**\n * Enhances the fetchOptions with the JWT bearer token. Will only be needed\n * if not using fetch or fetchJson.\n */\n jwtFetchOption: function jwtFetchOption(token) {\n var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n var newOpts = _utils2.default.clone(options);\n newOpts.headers = newOpts.headers || {};\n newOpts.headers.Authorization = newOpts.headers.Authorization || 'Bearer ' + token;\n return newOpts;\n },\n\n\n /**\n * REturns the json body from the response. It is only needed if\n * you are using FetchUtils.fetch\n *\n * Usage:\n * FetchUtils.fetch(..).then(FetchUtils.parseJSON)\n */\n parseJSON: function parseJSON(response) {\n return response.json()\n // FIXME: workaround for status=200 w/ empty response body that causes error in Chrome\n // server should probably return HTTP 204 instead\n .catch(function (error) {\n if (error.message === 'Unexpected end of JSON input') {\n return {};\n }\n throw error;\n });\n },\n\n\n /**\n * Error function helper to log errors to console.\n *\n * Usage;\n * fetchJson(..).catch(FetchUtils.consoleError)\n */\n consoleError: function consoleError(error) {\n console.error(error); // eslint-disable-line no-console\n },\n\n\n /**\n * Error function helper to call a callback on a rejected promise.\n * if callback is null, log to console). Use .catch() if you know it\n * will not be null though.\n *\n * Usage;\n * fetchJson(..).catch(FetchUtils.onError(error => //do something)\n */\n onError: function onError(errorFunc) {\n return function (error) {\n if (errorFunc) {\n errorFunc(error);\n } else {\n FetchFunctions.consoleError(error);\n }\n };\n },\n\n\n /**\n * Raw fetch that returns the json body.\n *\n * This method is semi-private, under normal conditions it should not be\n * used as it does not include the JWT bearer token\n *\n * @param {string} url - The URL to fetch from.\n * @param {Object} [options]\n * @param {function} [options.onSuccess] - Optional callback success function.\n * @param {function} [options.onError] - Optional error callback.\n * @param {Object} [options.fetchOptions] - Optional isomorphic-fetch options.\n * @returns JSON body\n */\n rawFetchJSON: function rawFetchJSON(url) {\n var _ref = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n var onSuccess = _ref.onSuccess;\n var onError = _ref.onError;\n var fetchOptions = _ref.fetchOptions;\n\n var request = (0, _isomorphicFetch2.default)(url, FetchFunctions.sameOriginFetchOption(fetchOptions)).then(FetchFunctions.checkRefreshHeader).then(FetchFunctions.checkStatus).then(FetchFunctions.parseJSON);\n\n if (onSuccess) {\n return request.then(onSuccess).catch(FetchFunctions.onError(onError));\n }\n\n return request;\n },\n\n /**\n * Raw fetch.\n *\n * This method is semi-private, under normal conditions it should not be\n * used as it does not include the JWT bearer token\n *\n * @param {string} url - The URL to fetch from.\n * @param {Object} [options]\n * @param {function} [options.onSuccess] - Optional callback success function.\n * @param {function} [options.onError] - Optional error callback.\n * @param {Object} [options.fetchOptions] - Optional isomorphic-fetch options.\n * @returns fetch response\n */\n rawFetch: function rawFetch(url) {\n var _ref2 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n var onSuccess = _ref2.onSuccess;\n var onError = _ref2.onError;\n var fetchOptions = _ref2.fetchOptions;\n\n var request = (0, _isomorphicFetch2.default)(url, FetchFunctions.sameOriginFetchOption(fetchOptions)).then(FetchFunctions.checkRefreshHeader).then(FetchFunctions.checkStatus);\n\n if (onSuccess) {\n return request.then(onSuccess).catch(FetchFunctions.onError(onError));\n }\n\n return request;\n }\n};\n\nvar Fetch = exports.Fetch = {\n /**\n * Fetch JSON data.\n *

\n * Utility function that can be mocked for testing.\n *\n * @param {string} url - The URL to fetch from.\n * @param {Object} [options]\n * @param {function} [options.onSuccess] - Optional callback success function.\n * @param {function} [options.onError] - Optional error callback.\n * @param {Object} [options.fetchOptions] - Optional isomorphic-fetch options.\n * @returns JSON body.\n */\n fetchJSON: function fetchJSON(url) {\n var _ref3 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n var onSuccess = _ref3.onSuccess;\n var onError = _ref3.onError;\n var fetchOptions = _ref3.fetchOptions;\n\n if (!_config2.default.isJWTEnabled()) {\n return FetchFunctions.rawFetchJSON(url, { onSuccess: onSuccess, onError: onError, fetchOptions: fetchOptions });\n }\n return _jwt2.default.getToken().then(function (token) {\n return FetchFunctions.rawFetchJSON(url, {\n onSuccess: onSuccess,\n onError: onError,\n fetchOptions: FetchFunctions.jwtFetchOption(token, fetchOptions)\n });\n });\n },\n\n\n /**\n * Fetch data.\n *

\n * Utility function that can be mocked for testing.\n *\n * @param {string} url - The URL to fetch from.\n * @param {Object} [options]\n * @param {function} [options.onSuccess] - Optional callback success function.\n * @param {function} [options.onError] - Optional error callback.\n * @param {Object} [options.fetchOptions] - Optional isomorphic-fetch options.\n * @returns fetch body.\n */\n fetch: function fetch(url) {\n var _ref4 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n var onSuccess = _ref4.onSuccess;\n var onError = _ref4.onError;\n var fetchOptions = _ref4.fetchOptions;\n\n if (!_config2.default.isJWTEnabled()) {\n return FetchFunctions.rawFetch(url, { onSuccess: onSuccess, onError: onError, fetchOptions: fetchOptions });\n }\n return _jwt2.default.getToken().then(function (token) {\n return FetchFunctions.rawFetch(url, {\n onSuccess: onSuccess,\n onError: onError,\n fetchOptions: FetchFunctions.jwtFetchOption(token, fetchOptions)\n });\n });\n }\n};\n},{\"./config\":5,\"./jwt\":8,\"./utils\":13,\"es6-promise\":156,\"isomorphic-fetch\":223}],7:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.RunApi = exports.ToastService = exports.SseBus = exports.RunButton = exports.ReplayButton = exports.AppConfig = exports.Utils = exports.TestUtils = exports.JWT = exports.UrlConfig = exports.FetchFunctions = exports.Fetch = undefined;\n\nvar _fetch = require('./fetch');\n\nObject.defineProperty(exports, 'Fetch', {\n enumerable: true,\n get: function get() {\n return _fetch.Fetch;\n }\n});\nObject.defineProperty(exports, 'FetchFunctions', {\n enumerable: true,\n get: function get() {\n return _fetch.FetchFunctions;\n }\n});\n\nvar _ReplayButton = require('./components/ReplayButton');\n\nObject.defineProperty(exports, 'ReplayButton', {\n enumerable: true,\n get: function get() {\n return _ReplayButton.ReplayButton;\n }\n});\n\nvar _RunButton = require('./components/RunButton');\n\nObject.defineProperty(exports, 'RunButton', {\n enumerable: true,\n get: function get() {\n return _RunButton.RunButton;\n }\n});\n\nvar _sseGateway = require('@jenkins-cd/sse-gateway');\n\nvar sse = _interopRequireWildcard(_sseGateway);\n\nvar _RunApi = require('./rest/RunApi');\n\nvar _SseBus = require('./sse/SseBus');\n\nvar _ToastService = require('./ToastService');\n\nvar _urlconfig = require('./urlconfig');\n\nvar _urlconfig2 = _interopRequireDefault(_urlconfig);\n\nvar _jwt = require('./jwt');\n\nvar _jwt2 = _interopRequireDefault(_jwt);\n\nvar _testutils = require('./testutils');\n\nvar _testutils2 = _interopRequireDefault(_testutils);\n\nvar _utils = require('./utils');\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _config = require('./config');\n\nvar _config2 = _interopRequireDefault(_config);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nexports.UrlConfig = _urlconfig2.default;\nexports.JWT = _jwt2.default;\nexports.TestUtils = _testutils2.default;\nexports.Utils = _utils2.default;\nexports.AppConfig = _config2.default;\n\n\n// export services as a singleton so all plugins will use the same instance\n\n// limit to single instance so that duplicate REST calls aren't made as events come in\nvar sseBus = new _SseBus.SseBus(sse, _fetch.Fetch.fetchJSON);\nexports.SseBus = sseBus;\n\n// required so new toasts are routed to the instance used in blueocean-web\n\nvar toastService = new _ToastService.ToastService();\nexports.ToastService = toastService;\n\n\nvar runApi = new _RunApi.RunApi();\nexports.RunApi = runApi;\n},{\"./ToastService\":1,\"./components/ReplayButton\":3,\"./components/RunButton\":4,\"./config\":5,\"./fetch\":6,\"./jwt\":8,\"./rest/RunApi\":9,\"./sse/SseBus\":10,\"./testutils\":11,\"./urlconfig\":12,\"./utils\":13,\"@jenkins-cd/sse-gateway\":58}],8:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _es6Promise = require('es6-promise');\n\nvar _es6Promise2 = _interopRequireDefault(_es6Promise);\n\nvar _isomorphicFetch = require('isomorphic-fetch');\n\nvar _isomorphicFetch2 = _interopRequireDefault(_isomorphicFetch);\n\nvar _jsonwebtoken = require('jsonwebtoken');\n\nvar _jsonwebtoken2 = _interopRequireDefault(_jsonwebtoken);\n\nvar _urlconfig = require('./urlconfig');\n\nvar _urlconfig2 = _interopRequireDefault(_urlconfig);\n\nvar _fetch = require('./fetch');\n\nvar _pemJwk = require('pem-jwk');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n_es6Promise2.default.polyfill();\n\nvar storedToken = null;\nvar publicKeyStore = null;\nvar tokenFetchPromise = null;\n\nvar CLOCK_SKEW_SECONDS = 60;\nexports.default = {\n /**\n * Fetches the JWT token. This token is cached for a default of 25mins.\n * If it is within 5mins or expiry it will fetch a new one.\n */\n fetchJWT: function fetchJWT() {\n if (storedToken && storedToken.exp) {\n var diff = storedToken.exp - Math.trunc(new Date().getTime() / 1000);\n\n // refetch token if we are within 60s of it exp\n if (diff < CLOCK_SKEW_SECONDS) {\n tokenFetchPromise = null;\n }\n }\n\n if (!tokenFetchPromise) {\n tokenFetchPromise = (0, _isomorphicFetch2.default)(_urlconfig2.default.getJenkinsRootURL() + '/jwt-auth/token', { credentials: 'same-origin' }).then(this.checkStatus).then(function (response) {\n var token = response.headers.get('X-BLUEOCEAN-JWT');\n if (token) {\n return token;\n }\n\n throw new Error('Could not fetch jwt_token');\n });\n }\n\n return tokenFetchPromise;\n },\n\n\n /**\n * Verifies the token using the public key.\n */\n verifyToken: function verifyToken(token, certObject) {\n return new Promise(function (resolve, reject) {\n return _jsonwebtoken2.default.verify(token, (0, _pemJwk.jwk2pem)(certObject), { algorithms: [certObject.alg], clockTolerance: CLOCK_SKEW_SECONDS }, function (err, payload) {\n if (err) {\n reject(err);\n } else {\n resolve(payload);\n }\n });\n });\n },\n\n\n /**\n * Fetches the public key that is used to verify tokens.\n */\n fetchJWTPublicKey: function fetchJWTPublicKey(token) {\n var _this = this;\n\n var decoded = _jsonwebtoken2.default.decode(token, { complete: true });\n var url = _urlconfig2.default.getJenkinsRootURL() + '/jwt-auth/jwks/' + decoded.header.kid + '/';\n if (!publicKeyStore) {\n publicKeyStore = (0, _isomorphicFetch2.default)(url, { credentials: 'same-origin' }).then(_fetch.FetchFunctions.checkStatus).then(_fetch.FetchFunctions.parseJSON).then(function (cert) {\n return _this.verifyToken(token, cert).then(function (payload) {\n return {\n token: token,\n payload: payload\n };\n });\n });\n }\n\n return publicKeyStore;\n },\n\n\n /**\n * Puts the token into global storage for later use.\n */\n storeToken: function storeToken(data) {\n storedToken = data.payload;\n return data;\n },\n\n\n /**\n * Use this function if you want the payload from the token.\n */\n getTokenWithPayload: function getTokenWithPayload() {\n var _this2 = this;\n\n return this.fetchJWT().then(_fetch.FetchFunctions.checkStatus).then(function (token) {\n return _this2.fetchJWTPublicKey(token);\n }).then(function (data) {\n return _this2.storeToken(data);\n });\n },\n\n\n /**\n * Gets the token from te server and verifies it.\n */\n getToken: function getToken() {\n return this.getTokenWithPayload().then(function (token) {\n return token.token;\n });\n }\n};\n},{\"./fetch\":6,\"./urlconfig\":12,\"es6-promise\":156,\"isomorphic-fetch\":223,\"jsonwebtoken\":242,\"pem-jwk\":292}],9:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.RunApi = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /**\n * Created by cmeyers on 8/29/16.\n */\n\n\nvar _fetch = require('../fetch');\n\nvar _urlconfig = require('../urlconfig');\n\nvar _urlconfig2 = _interopRequireDefault(_urlconfig);\n\nvar _utils = require('../utils');\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar RunApi = exports.RunApi = function () {\n function RunApi() {\n _classCallCheck(this, RunApi);\n }\n\n _createClass(RunApi, [{\n key: 'startRun',\n value: function startRun(item) {\n var path = _urlconfig2.default.getJenkinsRootURL();\n var runUrl = _utils2.default.cleanSlashes(path + '/' + item._links.self.href + '/runs/');\n\n var fetchOptions = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n }\n };\n\n return _fetch.Fetch.fetch(runUrl, { fetchOptions: fetchOptions });\n }\n }, {\n key: 'stopRun',\n value: function stopRun(run) {\n var path = _urlconfig2.default.getJenkinsRootURL();\n var runUrl = run._links.self.href;\n var stopUrl = _utils2.default.cleanSlashes(path + '/' + runUrl + '/stop/?blocking=true&timeOutInSecs=10');\n\n var fetchOptions = {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json'\n }\n };\n\n return _fetch.Fetch.fetch(stopUrl, { fetchOptions: fetchOptions });\n }\n }, {\n key: 'replayRun',\n value: function replayRun(run) {\n var path = _urlconfig2.default.getJenkinsRootURL();\n var runUrl = run._links.self.href;\n var replayPipelineUrl = _utils2.default.cleanSlashes(path + '/' + runUrl + '/replay/');\n\n var fetchOptions = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n }\n };\n\n return _fetch.Fetch.fetchJSON(replayPipelineUrl, { fetchOptions: fetchOptions });\n }\n }]);\n\n return RunApi;\n}();\n},{\"../fetch\":6,\"../urlconfig\":12,\"../utils\":13}],10:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.SseBus = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /**\n * Created by cmeyers on 7/29/16.\n */\n\n\nvar _isomorphicFetch = require('isomorphic-fetch');\n\nvar _isomorphicFetch2 = _interopRequireDefault(_isomorphicFetch);\n\nvar _urlconfig = require('../urlconfig');\n\nvar _urlconfig2 = _interopRequireDefault(_urlconfig);\n\nvar _utils = require('../utils');\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Wraps the SSE Gateway and fetches data related to events from REST API.\n */\nvar SseBus = exports.SseBus = function () {\n function SseBus(sse, fetch) {\n _classCallCheck(this, SseBus);\n\n this.id = this._random();\n this.sse = sse;\n this.fetch = fetch || _isomorphicFetch2.default;\n this.sseConnected = false;\n this.externalListeners = {};\n this.sseListeners = {};\n }\n\n _createClass(SseBus, [{\n key: 'dispose',\n value: function dispose() {\n var _this = this;\n\n Object.keys(this.sseListeners).forEach(function (token) {\n _this.unsubscribe(token);\n });\n\n this.externalListeners = {};\n this.sseListeners = {};\n }\n\n /**\n * Subscribe to job events.\n * @param callback func to invoke with job data\n * @param jobFilter func invoked for each job event, return false to suppress callback invocation\n * @returns {number} unsubscribe token\n */\n\n }, {\n key: 'subscribeToJob',\n value: function subscribeToJob(callback, jobFilter) {\n var _this2 = this;\n\n this._initialize();\n\n var id = this._random();\n\n this.externalListeners[id] = {\n listener: callback,\n filter: jobFilter\n };\n\n if (!this.sseListeners.job) {\n var sseListener = this.sse.subscribe('job', function (event) {\n _this2._handleJobEvent(event);\n });\n\n this.sseListeners.job = sseListener;\n }\n\n return id;\n }\n }, {\n key: 'unsubscribe',\n value: function unsubscribe(token) {\n delete this.externalListeners[token];\n\n if (Object.keys(this.externalListeners).length === 0) {\n this.sse.unsubscribe(this.sseListeners.job);\n delete this.sseListeners.job;\n }\n }\n }, {\n key: '_initialize',\n value: function _initialize() {\n if (!this.sseConnected) {\n // FIXME sse should not require this to end with a /\n this.sse.connect({\n clientId: 'jenkins-blueocean-core-js',\n onConnect: undefined,\n jenkinsUrl: _urlconfig2.default.getJenkinsRootURL() + '/'\n });\n\n this.sseConnected = true;\n }\n }\n }, {\n key: '_handleJobEvent',\n value: function _handleJobEvent(event) {\n var _this3 = this;\n\n var subscriptions = Object.keys(this.externalListeners).map(function (subId) {\n return _this3.externalListeners[subId];\n });\n\n var interestedListeners = subscriptions.filter(function (sub) {\n return sub.filter(event);\n }).map(function (sub) {\n return sub.listener;\n });\n\n // if no filters are interested in the event, bail\n if (interestedListeners.length === 0) {\n return;\n }\n\n switch (event.jenkins_event) {\n case 'job_crud_created':\n case 'job_crud_deleted':\n case 'job_crud_renamed':\n this._refetchPipelines();\n break;\n case 'job_run_queue_buildable':\n case 'job_run_queue_enter':\n this._enqueueJob(event, interestedListeners);\n break;\n case 'job_run_queue_left':\n case 'job_run_queue_blocked':\n {\n break;\n }\n case 'job_run_started':\n {\n this._updateJob(event, interestedListeners);\n break;\n }\n case 'job_run_ended':\n {\n this._updateJob(event, interestedListeners);\n break;\n }\n default:\n // Else ignore the event.\n }\n }\n }, {\n key: '_refetchPipelines',\n value: function _refetchPipelines() {\n // TODO: implement once migration into commons JS\n }\n }, {\n key: '_enqueueJob',\n value: function _enqueueJob(event, listeners) {\n var queuedRun = {};\n\n queuedRun.pipeline = event.job_ismultibranch ? event.blueocean_job_branch_name : event.blueocean_job_pipeline_name;\n\n var runUrl = _utils2.default.cleanSlashes(event.blueocean_job_rest_url + '/runs/' + event.job_run_queueId);\n\n queuedRun._links = {\n self: {\n href: runUrl\n }\n };\n\n queuedRun.state = 'QUEUED';\n queuedRun.result = 'UNKNOWN';\n\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = listeners[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var listener = _step.value;\n\n listener(queuedRun, event);\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n }\n }, {\n key: '_updateJob',\n value: function _updateJob(event, listeners) {\n var baseUrl = _urlconfig2.default.getJenkinsRootURL();\n var url = _utils2.default.cleanSlashes(baseUrl + '/' + event.blueocean_job_rest_url + '/runs/' + event.jenkins_object_id);\n\n this.fetch(url).then(function (data) {\n var updatedRun = _utils2.default.clone(data);\n\n // in many cases the SSE and subsequent REST call occur so quickly\n // that the run's state is stale. force the state to the correct value.\n if (event.jenkins_event === 'job_run_ended') {\n updatedRun.state = 'FINISHED';\n } else {\n updatedRun.state = 'RUNNING';\n }\n\n var _iteratorNormalCompletion2 = true;\n var _didIteratorError2 = false;\n var _iteratorError2 = undefined;\n\n try {\n for (var _iterator2 = listeners[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n var listener = _step2.value;\n\n listener(updatedRun, event);\n }\n } catch (err) {\n _didIteratorError2 = true;\n _iteratorError2 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion2 && _iterator2.return) {\n _iterator2.return();\n }\n } finally {\n if (_didIteratorError2) {\n throw _iteratorError2;\n }\n }\n }\n });\n }\n }, {\n key: '_updateMultiBranchPipelineBranches',\n value: function _updateMultiBranchPipelineBranches() {}\n // TODO: implement once migration into commons JS\n\n\n /**\n * @returns {number}\n * @private\n */\n\n }, {\n key: '_random',\n value: function _random() {\n return Math.random() * Math.pow(10, 16);\n }\n }]);\n\n return SseBus;\n}();\n},{\"../urlconfig\":12,\"../utils\":13,\"isomorphic-fetch\":223}],11:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _fetch = require('./fetch');\n\n// default impls\nvar fetchJSON = _fetch.Fetch.fetchJSON;\nvar fetch = _fetch.Fetch.fetch;\n\nexports.default = {\n /**\n * Switches fetch functions for ones that dont use JWT. Needed\n * for running tests.\n */\n patchFetchNoJWT: function patchFetchNoJWT() {\n _fetch.Fetch.fetchJSON = _fetch.FetchFunctions.rawFetchJSON;\n _fetch.Fetch.fetch = _fetch.FetchFunctions.rawFetch;\n },\n\n\n /**\n * Restores original fetch functions.\n */\n restoreFetch: function restoreFetch() {\n _fetch.Fetch.fetchJSON = fetchJSON;\n _fetch.Fetch.fetch = fetch;\n },\n\n\n /**\n * Patches fetch functions with a resolved promise. This will make all fetch calls return\n * this data.\n *\n * Usage\n *\n * TestUtils.patchFetchWithData((url, options) => {\n * assert.equals(url,\"someurl\")\n * return { mydata: 5 }\n * })\n */\n patchFetchWithData: function patchFetchWithData(dataFn) {\n _fetch.Fetch.fetchJSON = _fetch.Fetch.fetch = function (url, options) {\n var _ref = options || {};\n\n var onSuccess = _ref.onSuccess;\n var onError = _ref.onError;\n\n\n var data = Promise.resolve(dataFn(url, options));\n\n if (onSuccess) {\n return data.then(onSuccess).catch(_fetch.FetchFunctions.onError(onError));\n }\n\n return data;\n };\n }\n};\n},{\"./fetch\":6}],12:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar blueOceanAppURL = '/';\nvar jenkinsRootURL = '';\n\nvar loaded = false;\n\nfunction loadConfig() {\n try {\n var headElement = document.getElementsByTagName('head')[0];\n\n // Look up where the Blue Ocean app is hosted\n blueOceanAppURL = headElement.getAttribute('data-appurl');\n if (typeof blueOceanAppURL !== 'string') {\n blueOceanAppURL = '/';\n }\n\n jenkinsRootURL = headElement.getAttribute('data-rooturl');\n loaded = true;\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn('error reading attributes from document; urls will be empty');\n\n loaded = false;\n }\n}\n\nexports.default = {\n getJenkinsRootURL: function getJenkinsRootURL() {\n if (!loaded) {\n loadConfig();\n }\n return jenkinsRootURL;\n },\n getBlueOceanAppURL: function getBlueOceanAppURL() {\n if (!loaded) {\n loadConfig();\n }\n return blueOceanAppURL;\n }\n};\n},{}],13:[function(require,module,exports){\n(function (global){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\n/**\n * Trims duplicate forward slashes to a single slash and adds trailing slash if needed.\n * @param url\n * @returns {string}\n */\nvar cleanSlashes = function cleanSlashes(url) {\n if (url.indexOf('//') !== -1) {\n var cleanUrl = url.replace('//', '/');\n cleanUrl = cleanUrl.substr(-1) === '/' ? cleanUrl : cleanUrl + '/';\n\n return cleanSlashes(cleanUrl);\n }\n\n return url;\n};\n\nexports.default = {\n cleanSlashes: cleanSlashes,\n clone: function clone(obj) {\n return JSON.parse(JSON.stringify(obj));\n },\n windowOrGlobal: function windowOrGlobal() {\n return (typeof self === 'undefined' ? 'undefined' : _typeof(self)) === 'object' && self.self === self && self || (typeof global === 'undefined' ? 'undefined' : _typeof(global)) === 'object' && global.global === global && global || this;\n },\n refreshPage: function refreshPage() {\n if (this.windowOrGlobal().location.reload) {\n this.windowOrGlobal().location.reload(true);\n }\n }\n};\n\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],14:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.CommitHash = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require(\"react\");\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar HASH_REGEX = /\\b[0-9a-f]{5,40}\\b/;\n\n/**\n * Displays a commit hash in the proper style.\n */\n\nvar CommitHash = exports.CommitHash = function (_Component) {\n _inherits(CommitHash, _Component);\n\n function CommitHash() {\n _classCallCheck(this, CommitHash);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(CommitHash).apply(this, arguments));\n }\n\n _createClass(CommitHash, [{\n key: \"render\",\n value: function render() {\n if (HASH_REGEX.test(this.props.commitId)) {\n return _react2.default.createElement(\n \"code\",\n { className: \"hash\" },\n this.props.commitId.substring(0, 7)\n );\n }\n return _react2.default.createElement(\n \"span\",\n null,\n \"-\"\n );\n }\n }]);\n\n return CommitHash;\n}(_react.Component);\n\nCommitHash.propTypes = {\n commitId: _react.PropTypes.string\n};\n},{\"react\":494}],15:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.DownloadLink = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactMaterialIconsBlue = require('react-material-icons-blue');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar object = _react.PropTypes.object;\n\nvar DownloadLink = function (_Component) {\n _inherits(DownloadLink, _Component);\n\n function DownloadLink() {\n _classCallCheck(this, DownloadLink);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(DownloadLink).apply(this, arguments));\n }\n\n _createClass(DownloadLink, [{\n key: 'render',\n value: function render() {\n var _props = this.props;\n var style = _props.style;\n var fileData = _props.fileData;\n\n if (!fileData) return null;\n var contents = fileData.contents;\n var mime = fileData.mime;\n var filename = fileData.filename;\n\n var blob = new Blob([contents], { type: mime });\n var url = URL.createObjectURL(blob);\n\n return _react2.default.createElement(\n 'a',\n {\n download: filename,\n href: url,\n title: 'Download the log'\n },\n _react2.default.createElement(_reactMaterialIconsBlue.Icon, { style: style, icon: 'file_download' })\n );\n }\n }]);\n\n return DownloadLink;\n}(_react.Component);\n\nDownloadLink.propTypes = {\n fileData: object,\n style: object\n};\nexports.DownloadLink = DownloadLink;\n},{\"react\":494,\"react-material-icons-blue\":306}],16:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.EmptyStateIcon = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * Displays one of the available \"Noun Project\" icons used in empty state panels\n */\n\nvar EmptyStateIcon = exports.EmptyStateIcon = function (_Component) {\n _inherits(EmptyStateIcon, _Component);\n\n function EmptyStateIcon() {\n _classCallCheck(this, EmptyStateIcon);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(EmptyStateIcon).call(this));\n }\n\n _createClass(EmptyStateIcon, [{\n key: 'render',\n value: function render() {\n var classNames = 'empty-state-icon ' + this.props.name;\n return _react2.default.createElement('div', { className: classNames });\n }\n }]);\n\n return EmptyStateIcon;\n}(_react.Component);\n\nEmptyStateIcon.propTypes = {\n name: _react.PropTypes.oneOf(['branch', 'goat', 'shoes']).isRequired\n};\n},{\"react\":494}],17:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.EmptyStateView = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _EmptyStateIcon = require('./EmptyStateIcon');\n\nvar _reactMaterialIconsBlue = require('react-material-icons-blue');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * Displays an \"empty state\" dialog with arbitrary child content and an optional icon.\n *\n * Content in the following form will recent nice default styles:\n *\n *

Title

\n *

A longer message...

\n * *\n *\n * Properties:\n * iconName=\"branch|goat|shoes|\"\n * tightSpacing={true|false}\n */\n\nvar EmptyStateView = exports.EmptyStateView = function (_Component) {\n _inherits(EmptyStateView, _Component);\n\n function EmptyStateView() {\n _classCallCheck(this, EmptyStateView);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(EmptyStateView).apply(this, arguments));\n }\n\n _createClass(EmptyStateView, [{\n key: 'render',\n value: function render() {\n var layoutClasses = 'empty-state-container';\n\n if (this.props.tightSpacing) {\n layoutClasses = layoutClasses + ' tight-spacing';\n }\n\n var icon = null;\n if (this.props.iconName) {\n if (['branch', 'goat', 'shoes'].indexOf(this.props.iconName) >= 0) {\n icon = _react2.default.createElement(_EmptyStateIcon.EmptyStateIcon, { name: this.props.iconName });\n } else {\n icon = _react2.default.createElement(\n 'div',\n { className: 'empty-state-icon', style: { paddingLeft: 0 } },\n _react2.default.createElement(_reactMaterialIconsBlue.Icon, { size: 150, icon: this.props.iconName, style: { fill: '#fff' } })\n );\n }\n }\n\n return _react2.default.createElement(\n 'div',\n { className: 'empty-state' },\n _react2.default.createElement(\n 'div',\n { className: layoutClasses },\n icon,\n _react2.default.createElement(\n 'div',\n { className: 'empty-state-content' },\n this.props.children\n )\n )\n );\n }\n }]);\n\n return EmptyStateView;\n}(_react.Component);\n\nEmptyStateView.propTypes = {\n children: _react.PropTypes.node,\n iconName: _react.PropTypes.string,\n tightSpacing: _react.PropTypes.bool\n};\n},{\"./EmptyStateIcon\":16,\"react\":494,\"react-material-icons-blue\":306}],18:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.FileSize = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar oneOfType = _react.PropTypes.oneOfType;\nvar number = _react.PropTypes.number;\nvar string = _react.PropTypes.string;\n\nvar units = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];\n\n// Polyfill for old browsers and IE\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log10\nMath.log10 = Math.log10 || function (x) {\n return Math.log(x) / Math.LN10;\n};\n\nvar FileSize = exports.FileSize = function (_Component) {\n _inherits(FileSize, _Component);\n\n function FileSize() {\n _classCallCheck(this, FileSize);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(FileSize).apply(this, arguments));\n }\n\n _createClass(FileSize, [{\n key: 'render',\n value: function render() {\n var bytes = this.props.bytes;\n\n var output = '-';\n\n if (typeof bytes == 'string') {\n bytes = parseInt(bytes);\n }\n\n if (!isNaN(bytes)) {\n // calculate the unit (e.g. 'MB') to display\n // but ensure it doesn't go over the max we support\n var power = Math.floor(Math.log10(Math.abs(bytes)) / Math.log10(1024));\n power = Math.min(power, units.length - 1);\n\n // round displayed value to one decimal place\n var value = Math.round(bytes / Math.pow(1024, power) * 10) / 10;\n output = value + ' ' + units[power];\n }\n\n return _react2.default.createElement(\n 'span',\n null,\n output\n );\n }\n }]);\n\n return FileSize;\n}(_react.Component);\n\nFileSize.propTypes = {\n bytes: oneOfType([number, string])\n};\n},{\"react\":494}],19:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.PipelineGraph = exports.defaultLayout = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _StatusIndicator = require('./status/StatusIndicator');\n\nvar _SvgSpinner = require('./status/SvgSpinner');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n// Dimensions used for layout, px\nvar defaultLayout = exports.defaultLayout = {\n nodeSpacingH: 120,\n nodeSpacingV: 70,\n nodeRadius: 12,\n curveRadius: 12,\n connectorStrokeWidth: 3.5,\n labelOffsetV: 25,\n smallLabelOffsetV: 20\n};\n\n// Typedefs\n\n// FIXME-FLOW: Currently need to duplicate react's propTypes obj in Flow.\n// See: https://github.com/facebook/flow/issues/1770\n\nvar PipelineGraph = exports.PipelineGraph = function (_Component) {\n _inherits(PipelineGraph, _Component);\n\n function PipelineGraph(props) {\n _classCallCheck(this, PipelineGraph);\n\n var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(PipelineGraph).call(this, props));\n\n _this.state = {\n nodes: [],\n connections: [],\n bigLabels: [],\n smallLabels: [],\n measuredWidth: 0,\n measuredHeight: 0,\n layout: Object.assign({}, defaultLayout, props.layout),\n selectedStage: props.selectedStage\n };\n return _this;\n }\n\n // Flow typedefs\n\n\n _createClass(PipelineGraph, [{\n key: 'componentWillMount',\n value: function componentWillMount() {\n this.stagesUpdated(this.props.stages);\n }\n }, {\n key: 'componentWillReceiveProps',\n value: function componentWillReceiveProps(nextProps) {\n var _this2 = this;\n\n var newState = null; // null == no new state\n var needsLayout = false;\n\n if (nextProps.layout != this.props.layout) {\n // TODO: Does layout obj really need to be in state?\n newState = _extends({}, newState, { layout: Object.assign({}, defaultLayout, this.props.layout) });\n needsLayout = true;\n }\n\n if (nextProps.selectedStage !== this.props.selectedStage) {\n // If we're just changing selectedStage, we don't need to re-generate the children\n newState = _extends({}, newState, { selectedStage: nextProps.selectedStage });\n }\n\n if (nextProps.stages !== this.props.stages) {\n needsLayout = true;\n }\n\n var doLayoutIfNeeded = function doLayoutIfNeeded() {\n if (needsLayout) {\n _this2.stagesUpdated(nextProps.stages);\n }\n };\n\n if (newState) {\n // If we need to update the state, then we'll delay any layout changes\n this.setState(newState, doLayoutIfNeeded);\n } else {\n doLayoutIfNeeded();\n }\n }\n }, {\n key: 'addConnectionDetails',\n value: function addConnectionDetails(connections, previousNodes, columnNodes) {\n // Connect to top of previous/next column. Curves added when creating SVG\n\n // Collapse from previous node(s) to top column node\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = previousNodes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var previousNode = _step.value;\n\n connections.push([previousNode, columnNodes[0]]);\n }\n\n // Expand from top previous node to column node(s) - first one done already above\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n\n var _iteratorNormalCompletion2 = true;\n var _didIteratorError2 = false;\n var _iteratorError2 = undefined;\n\n try {\n for (var _iterator2 = columnNodes.slice(1)[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n var columnNode = _step2.value;\n\n connections.push([previousNodes[0], columnNode]);\n }\n } catch (err) {\n _didIteratorError2 = true;\n _iteratorError2 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion2 && _iterator2.return) {\n _iterator2.return();\n }\n } finally {\n if (_didIteratorError2) {\n throw _iteratorError2;\n }\n }\n }\n }\n }, {\n key: 'stagesUpdated',\n value: function stagesUpdated() {\n var newStages = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0];\n\n // FIXME: Should we calculate based on expected text size guesstimate?\n var ypStart = 50;\n\n var _state$layout = this.state.layout;\n var nodeSpacingH = _state$layout.nodeSpacingH;\n var nodeSpacingV = _state$layout.nodeSpacingV;\n\n\n var nodes = [];\n var connections = [];\n var bigLabels = [];\n var smallLabels = [];\n\n // next node position\n var xp = nodeSpacingH / 2;\n var yp = 0;\n\n var previousNodes = [];\n var mostColumnNodes = 0;\n\n // For reach top-level stage we have a column of node(s)\n var _iteratorNormalCompletion3 = true;\n var _didIteratorError3 = false;\n var _iteratorError3 = undefined;\n\n try {\n for (var _iterator3 = newStages[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {\n var topStage = _step3.value;\n\n\n yp = ypStart;\n\n // Always have a single bigLabel per top-level stage\n bigLabels.push({\n x: xp,\n y: yp,\n text: topStage.name,\n stage: topStage\n });\n\n // If stage has children, we don't draw a node for it, just its children\n var nodeStages = topStage.children && topStage.children.length ? topStage.children : [topStage];\n\n var columnNodes = [];\n\n var _iteratorNormalCompletion4 = true;\n var _didIteratorError4 = false;\n var _iteratorError4 = undefined;\n\n try {\n for (var _iterator4 = nodeStages[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {\n var nodeStage = _step4.value;\n\n var node = {\n x: xp,\n y: yp,\n name: nodeStage.name,\n state: nodeStage.state,\n completePercent: nodeStage.completePercent,\n id: nodeStage.id,\n stage: nodeStage\n };\n\n columnNodes.push(node);\n\n // Only separate child nodes need a smallLabel, as topStage already has a bigLabel\n if (nodeStage != topStage) {\n smallLabels.push({\n x: xp,\n y: yp,\n text: nodeStage.name,\n stage: nodeStage\n });\n }\n\n yp += nodeSpacingV;\n }\n } catch (err) {\n _didIteratorError4 = true;\n _iteratorError4 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion4 && _iterator4.return) {\n _iterator4.return();\n }\n } finally {\n if (_didIteratorError4) {\n throw _iteratorError4;\n }\n }\n }\n\n if (previousNodes.length) {\n this.addConnectionDetails(connections, previousNodes, columnNodes);\n }\n\n xp += nodeSpacingH;\n mostColumnNodes = Math.max(mostColumnNodes, nodeStages.length);\n nodes.push.apply(nodes, columnNodes);\n previousNodes = columnNodes;\n }\n\n // Calc dimensions\n } catch (err) {\n _didIteratorError3 = true;\n _iteratorError3 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion3 && _iterator3.return) {\n _iterator3.return();\n }\n } finally {\n if (_didIteratorError3) {\n throw _iteratorError3;\n }\n }\n }\n\n var measuredWidth = xp - Math.floor(nodeSpacingH / 2);\n var measuredHeight = ypStart + mostColumnNodes * nodeSpacingV;\n\n this.setState({\n nodes: nodes,\n connections: connections,\n bigLabels: bigLabels,\n smallLabels: smallLabels,\n measuredWidth: measuredWidth,\n measuredHeight: measuredHeight\n });\n }\n }, {\n key: 'renderBigLabel',\n value: function renderBigLabel(details) {\n var _state$layout2 = this.state.layout;\n var nodeSpacingH = _state$layout2.nodeSpacingH;\n var labelOffsetV = _state$layout2.labelOffsetV;\n\n\n var labelWidth = nodeSpacingH;\n var labelOffsetH = Math.floor(labelWidth * -0.5);\n\n // These are about layout more than appearance, so they should probably remain inline\n var bigLabelStyle = {\n position: \"absolute\",\n width: labelWidth,\n textAlign: \"center\",\n marginLeft: labelOffsetH,\n marginBottom: labelOffsetV\n };\n\n var x = details.x;\n var bottom = this.state.measuredHeight - details.y;\n\n var style = Object.assign({}, bigLabelStyle, {\n bottom: bottom + \"px\",\n left: x + \"px\"\n });\n\n var key = details.stage.id + \"-big\";\n\n var classNames = [\"pipeline-big-label\"];\n if (this.stageIsSelected(details.stage) || this.stageChildIsSelected(details.stage)) {\n classNames.push(\"selected\");\n }\n\n return _react2.default.createElement(\n 'div',\n { className: classNames.join(\" \"), style: style, key: key },\n details.text\n );\n }\n }, {\n key: 'renderSmallLabel',\n value: function renderSmallLabel(details) {\n var _state$layout3 = this.state.layout;\n var nodeSpacingH = _state$layout3.nodeSpacingH;\n var curveRadius = _state$layout3.curveRadius;\n var smallLabelOffsetV = _state$layout3.smallLabelOffsetV;\n\n\n var smallLabelWidth = nodeSpacingH - 2 * curveRadius; // Fit between lines\n var smallLabelOffsetH = Math.floor(smallLabelWidth * -0.5);\n\n // These are about layout more than appearance, so they should probably remain inline\n var smallLabelStyle = {\n position: \"absolute\",\n width: smallLabelWidth,\n textAlign: \"center\",\n marginLeft: smallLabelOffsetH,\n marginTop: smallLabelOffsetV\n };\n\n var x = details.x;\n var top = details.y;\n\n var style = Object.assign({}, smallLabelStyle, {\n top: top,\n left: x\n });\n\n var key = details.stage.id + '-big';\n\n var classNames = [\"pipeline-small-label\"];\n if (this.stageIsSelected(details.stage)) {\n classNames.push(\"selected\");\n }\n\n return _react2.default.createElement(\n 'div',\n { className: classNames.join(\" \"), style: style, key: key },\n details.text\n );\n }\n }, {\n key: 'renderConnection',\n value: function renderConnection(connection) {\n var _state$layout4 = this.state.layout;\n var nodeRadius = _state$layout4.nodeRadius;\n var curveRadius = _state$layout4.curveRadius;\n var connectorStrokeWidth = _state$layout4.connectorStrokeWidth;\n\n var _connection = _slicedToArray(connection, 2);\n\n var leftNode = _connection[0];\n var rightNode = _connection[1];\n\n var key = leftNode.name + leftNode.id + \"_con_\" + rightNode.name + rightNode.id;\n\n var leftPos = {\n x: leftNode.x + nodeRadius - _SvgSpinner.strokeWidth / 2,\n y: leftNode.y\n };\n\n var rightPos = {\n x: rightNode.x - nodeRadius + _SvgSpinner.strokeWidth / 2,\n y: rightNode.y\n };\n\n // Stroke props common to straight / curved connections\n var connectorStroke = {\n className: \"pipeline-connector\",\n strokeWidth: connectorStrokeWidth\n };\n\n if (leftPos.y == rightPos.y) {\n // Nice horizontal line\n return _react2.default.createElement('line', _extends({}, connectorStroke, {\n key: key,\n x1: leftPos.x,\n y1: leftPos.y,\n x2: rightPos.x,\n y2: rightPos.y }));\n }\n\n // Otherwise, we'd like a curve\n\n var verticalDirection = Math.sign(rightPos.y - leftPos.y); // 1 == curve down, -1 == curve up\n var midPointX = Math.round((leftPos.x + rightPos.x) / 2 + curveRadius * verticalDirection);\n var w1 = midPointX - curveRadius - leftPos.x;\n var w2 = rightPos.x - curveRadius - midPointX;\n var v = rightPos.y - leftPos.y - 2 * curveRadius * verticalDirection; // Will be -ive if curve up\n var cv = verticalDirection * curveRadius;\n\n var pathData = 'M ' + leftPos.x + ' ' + leftPos.y // start position\n + (' l ' + w1 + ' 0') // first horizontal line\n + (' c ' + curveRadius + ' 0 ' + curveRadius + ' ' + cv + ' ' + curveRadius + ' ' + cv) // turn\n + (' l 0 ' + v) // vertical line\n + (' c 0 ' + cv + ' ' + curveRadius + ' ' + cv + ' ' + curveRadius + ' ' + cv) // turn again\n + (' l ' + w2 + ' 0') // second horizontal line\n ;\n\n return _react2.default.createElement('path', _extends({}, connectorStroke, { key: key, d: pathData, fill: 'none' }));\n }\n }, {\n key: 'renderNode',\n value: function renderNode(node) {\n var _this3 = this;\n\n var nodeIsSelected = this.stageIsSelected(node.stage);\n var _state$layout5 = this.state.layout;\n var nodeRadius = _state$layout5.nodeRadius;\n var connectorStrokeWidth = _state$layout5.connectorStrokeWidth;\n\n // Use a bigger radius for invisible click/touch target\n\n var mouseTargetRadius = nodeRadius + 2 * connectorStrokeWidth;\n\n var resultClean = (0, _StatusIndicator.decodeResultValue)(node.state);\n var key = \"n_\" + node.name + node.id;\n\n var completePercent = node.completePercent || 0;\n var groupChildren = [(0, _StatusIndicator.getGroupForResult)(resultClean, completePercent, nodeRadius)];\n\n // Add an invisible click/touch target, coz the nodes are small and (more importantly)\n // many are hollow.\n groupChildren.push(_react2.default.createElement('circle', { r: mouseTargetRadius,\n cursor: 'pointer',\n className: 'pipeline-node-hittarget',\n fillOpacity: '0',\n stroke: 'none',\n onClick: function onClick() {\n return _this3.nodeClicked(node);\n } }));\n\n // All the nodes are in shared code, so they're rendered at 0,0 so we transform within a \n var groupProps = {\n key: key,\n transform: 'translate(' + node.x + ',' + node.y + ')',\n className: nodeIsSelected ? \"pipeline-node-selected\" : \"pipeline-node\"\n };\n\n return _react2.default.createElement.apply(_react2.default, [\"g\", groupProps].concat(groupChildren));\n }\n }, {\n key: 'renderSelectionHighlight',\n value: function renderSelectionHighlight() {\n var _state$layout6 = this.state.layout;\n var nodeRadius = _state$layout6.nodeRadius;\n var connectorStrokeWidth = _state$layout6.connectorStrokeWidth;\n\n var highlightRadius = nodeRadius + 0.49 * connectorStrokeWidth;\n var selectedNode = null;\n\n var _iteratorNormalCompletion5 = true;\n var _didIteratorError5 = false;\n var _iteratorError5 = undefined;\n\n try {\n for (var _iterator5 = this.state.nodes[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {\n var node = _step5.value;\n\n if (this.stageIsSelected(node.stage)) {\n selectedNode = node;\n break;\n }\n }\n } catch (err) {\n _didIteratorError5 = true;\n _iteratorError5 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion5 && _iterator5.return) {\n _iterator5.return();\n }\n } finally {\n if (_didIteratorError5) {\n throw _iteratorError5;\n }\n }\n }\n\n if (!selectedNode) {\n return null;\n }\n\n var transform = 'translate(' + selectedNode.x + ' ' + selectedNode.y + ')';\n\n return _react2.default.createElement(\n 'g',\n { className: 'pipeline-selection-highlight', transform: transform },\n _react2.default.createElement('circle', { r: highlightRadius, strokeWidth: connectorStrokeWidth * 1.1 })\n );\n }\n\n // Put in a function so we can make improvements / multi-select\n\n }, {\n key: 'stageIsSelected',\n value: function stageIsSelected(stage) {\n var selectedStage = this.state.selectedStage;\n\n\n return selectedStage && selectedStage === stage;\n }\n }, {\n key: 'stageChildIsSelected',\n value: function stageChildIsSelected(stage) {\n var children = stage.children;\n var selectedStage = this.state.selectedStage;\n\n\n if (children && selectedStage) {\n var _iteratorNormalCompletion6 = true;\n var _didIteratorError6 = false;\n var _iteratorError6 = undefined;\n\n try {\n for (var _iterator6 = children[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {\n var child = _step6.value;\n\n if (child === selectedStage) {\n return true;\n }\n }\n } catch (err) {\n _didIteratorError6 = true;\n _iteratorError6 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion6 && _iterator6.return) {\n _iterator6.return();\n }\n } finally {\n if (_didIteratorError6) {\n throw _iteratorError6;\n }\n }\n }\n }\n return false;\n }\n }, {\n key: 'nodeClicked',\n value: function nodeClicked(node) {\n var stage = node.stage;\n var listener = this.props.onNodeClick;\n\n if (listener) {\n listener(stage.name, stage.id);\n }\n\n // Update selection\n this.setState({ selectedStage: stage });\n }\n }, {\n key: 'render',\n value: function render() {\n var _this4 = this;\n\n var _state = this.state;\n var _state$nodes = _state.nodes;\n var nodes = _state$nodes === undefined ? [] : _state$nodes;\n var _state$connections = _state.connections;\n var connections = _state$connections === undefined ? [] : _state$connections;\n var _state$bigLabels = _state.bigLabels;\n var bigLabels = _state$bigLabels === undefined ? [] : _state$bigLabels;\n var _state$smallLabels = _state.smallLabels;\n var smallLabels = _state$smallLabels === undefined ? [] : _state$smallLabels;\n var measuredWidth = _state.measuredWidth;\n var measuredHeight = _state.measuredHeight;\n\n // These are about layout more than appearance, so they should probably remain inline\n\n var outerDivStyle = {\n position: \"relative\", // So we can put the labels where we need them\n overflow: \"visible\" // So long labels can escape this component in layout\n };\n\n return _react2.default.createElement(\n 'div',\n { style: outerDivStyle },\n _react2.default.createElement(\n 'svg',\n { width: measuredWidth, height: measuredHeight },\n this.renderSelectionHighlight(),\n connections.map(function (conn) {\n return _this4.renderConnection(conn);\n }),\n nodes.map(function (node) {\n return _this4.renderNode(node);\n })\n ),\n bigLabels.map(function (label) {\n return _this4.renderBigLabel(label);\n }),\n smallLabels.map(function (label) {\n return _this4.renderSmallLabel(label);\n })\n );\n }\n }]);\n\n return PipelineGraph;\n}(_react.Component);\n\nPipelineGraph.propTypes = {\n stages: _react.PropTypes.array,\n layout: _react.PropTypes.object,\n onNodeClick: _react.PropTypes.func\n};\n},{\"./status/StatusIndicator\":38,\"./status/SvgSpinner\":39,\"react\":494}],20:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.Progress = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Progress = exports.Progress = function (_Component) {\n _inherits(Progress, _Component);\n\n function Progress() {\n _classCallCheck(this, Progress);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(Progress).apply(this, arguments));\n }\n\n _createClass(Progress, [{\n key: 'render',\n value: function render() {\n var percentage = this.props.percentage;\n var groupClasses = ['progress-container'];\n\n if (typeof percentage !== 'number' || isNaN(percentage) || percentage < 0) {\n groupClasses.push('indeterminate');\n percentage = 12.5;\n } else if (percentage > 100) {\n groupClasses.push('bounce');\n percentage = 10;\n }\n\n return _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'svg',\n { xmlns: 'http://www.w3.org/2000/svg',\n preserveAspectRatio: 'none',\n viewBox: '0 0 100 10',\n className: groupClasses.join(' ')\n },\n _react2.default.createElement('line', { x1: '0', y1: '5', x2: '100', y2: '5', className: 'progress-bg' }),\n _react2.default.createElement('line', { x1: '0', y1: '5', x2: percentage, y2: '5', className: 'progress-bar' })\n )\n );\n }\n }]);\n\n return Progress;\n}(_react.Component);\n\nProgress.propTypes = {\n percentage: _react.PropTypes.number\n};\n},{\"react\":494}],21:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.ReadableDate = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _moment = require('moment');\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * Displays a date in moment's \"fromNow\" format, e.g. \"2 hours ago\", \"5 days ago\" etc\n * Also displays the original date on hover.\n * Expects \"date\" to be passed in as ISO-8601 string with time zone info.\n * If time zone is omitted, then UTC is assumed.\n */\n\nvar ReadableDate = exports.ReadableDate = function (_Component) {\n _inherits(ReadableDate, _Component);\n\n function ReadableDate(props) {\n _classCallCheck(this, ReadableDate);\n\n // When updating, average 1s period, with jitter to spread out the work\n\n var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(ReadableDate).call(this, props));\n\n _this.timerPeriodMillis = 750 + Math.ceil(Math.random() * 500);\n _this.timer = 0;\n _this.state = { date: null };\n return _this;\n }\n\n _createClass(ReadableDate, [{\n key: 'componentWillMount',\n value: function componentWillMount() {\n this.handleProps(this.props);\n }\n }, {\n key: 'componentWillReceiveProps',\n value: function componentWillReceiveProps(nextProps) {\n this.handleProps(nextProps);\n }\n }, {\n key: 'handleProps',\n value: function handleProps(props) {\n var _this2 = this;\n\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = 0;\n }\n\n var date = null;\n\n if (props.date) {\n // enforce a ISO-8601 date and try to set proper timezone\n var aMoment = (0, _moment2.default)(props.date, _moment2.default.ISO_8601).utcOffset(props.date);\n\n if (aMoment.isValid()) {\n // a moment has no name.\n date = aMoment;\n }\n }\n\n if (date && props.liveUpdate) {\n this.timer = setInterval(function () {\n _this2.forceUpdate();\n }, this.timerPeriodMillis);\n }\n\n this.setState({ date: date });\n }\n }, {\n key: 'componentWillUnmount',\n value: function componentWillUnmount() {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = 0;\n }\n }\n }, {\n key: 'render',\n value: function render() {\n var date = this.state.date;\n\n\n if (date) {\n var now = (0, _moment2.default)().utc();\n\n // only show the year if from different year\n var tooltip = date.year() !== now.year() ? date.format('MMM DD YYYY h:mma Z') : date.format('MMM DD h:mma Z');\n\n tooltip = tooltip.replace('+00:00', 'UTC');\n\n return _react2.default.createElement(\n 'time',\n { dateTime: this.props.date, title: tooltip },\n date.fromNow()\n );\n }\n\n return _react2.default.createElement(\n 'span',\n null,\n '-'\n );\n }\n }]);\n\n return ReadableDate;\n}(_react.Component);\n\nReadableDate.propTypes = {\n date: _react.PropTypes.string,\n liveUpdate: _react.PropTypes.bool\n};\n},{\"moment\":268,\"react\":494}],22:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.ResultItem = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactAddonsCssTransitionGroup = require('react-addons-css-transition-group');\n\nvar _reactAddonsCssTransitionGroup2 = _interopRequireDefault(_reactAddonsCssTransitionGroup);\n\nvar _StatusIndicator = require('./status/StatusIndicator');\n\nvar _SvgStatus = require('./status/SvgStatus');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ResultItem = exports.ResultItem = function (_Component) {\n _inherits(ResultItem, _Component);\n\n function ResultItem(props) {\n _classCallCheck(this, ResultItem);\n\n var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(ResultItem).call(this, props));\n\n _this.toggleExpanded = function (e) {\n if (_this.props.children) {\n (function () {\n var expanded = !_this.state.expanded;\n\n _this.setState({ expanded: expanded }, function () {\n var _this$props = _this.props;\n var data = _this$props.data;\n var onExpand = _this$props.onExpand;\n var onCollapse = _this$props.onCollapse;\n // Data is arbitrary, set by parent\n\n if (onExpand && expanded) {\n onExpand(data, e);\n }\n\n if (onCollapse && !expanded) {\n onCollapse(data, e);\n }\n });\n })();\n }\n };\n\n _this.state = {\n resultClean: null,\n statusGlyph: null,\n expanded: props.expanded || false\n };\n return _this;\n }\n\n _createClass(ResultItem, [{\n key: 'componentWillMount',\n value: function componentWillMount() {\n this.handleProps(this.props);\n }\n }, {\n key: 'componentWillReceiveProps',\n value: function componentWillReceiveProps(nextProps) {\n this.handleProps(nextProps);\n }\n }, {\n key: 'handleProps',\n value: function handleProps(props) {\n var resultClean = (0, _StatusIndicator.decodeResultValue)(props.result);\n if (resultClean !== this.state.resultClean) {\n var _statusGlyph = (0, _SvgStatus.getGlyphFor)(resultClean);\n this.setState({ resultClean: resultClean, statusGlyph: _statusGlyph });\n }\n // check whether we want to change the state or whether we already are in the correct state\n if (props.expanded !== this.state.expanded) {\n this.toggleExpanded();\n }\n }\n }, {\n key: 'render',\n value: function render() {\n var _props = this.props;\n var label = _props.label;\n var extraInfo = _props.extraInfo;\n var _state = this.state;\n var resultClean = _state.resultClean;\n var statusGlyph = _state.statusGlyph;\n\n\n var hasChildren = !!this.props.children;\n var expanded = this.state.expanded && hasChildren;\n\n var classes = ['result-item', resultClean];\n\n if (expanded) {\n classes.push('expanded');\n }\n\n var outerClassName = classes.join(' ');\n var iconClassName = 'result-item-icon result-bg ' + resultClean;\n\n return _react2.default.createElement(\n 'div',\n { className: outerClassName },\n _react2.default.createElement(\n 'div',\n { className: 'result-item-head', onClick: this.toggleExpanded },\n _react2.default.createElement(\n 'span',\n { className: iconClassName },\n _react2.default.createElement(\n 'svg',\n { width: '28', height: '34' },\n _react2.default.createElement(\n 'g',\n { transform: 'translate(14 18)', className: 'result-status-glyph' },\n statusGlyph\n )\n )\n ),\n _react2.default.createElement(\n 'span',\n { className: 'result-item-title' },\n _react2.default.createElement(Expando, { expanded: expanded, disabled: !hasChildren }),\n _react2.default.createElement(\n 'span',\n { className: 'result-item-label' },\n label\n ),\n _react2.default.createElement(\n 'span',\n { className: 'result-item-extra-info' },\n extraInfo\n )\n )\n ),\n _react2.default.createElement(\n _reactAddonsCssTransitionGroup2.default,\n { transitionName: 'slide-down',\n transitionAppear: true,\n transitionAppearTimeout: 300,\n transitionEnterTimeout: 300,\n transitionLeaveTimeout: 300 },\n expanded ? _react2.default.createElement(\n 'div',\n { className: 'result-item-children', key: 'k' },\n this.props.children\n ) : null\n )\n );\n }\n }]);\n\n return ResultItem;\n}(_react.Component);\n\nResultItem.propTypes = {\n result: _react.PropTypes.oneOf(Object.keys(_StatusIndicator.StatusIndicator.validResultValues)),\n label: _react.PropTypes.string,\n extraInfo: _react.PropTypes.string,\n data: _react.PropTypes.any, // Whatever you want, will be sent back to listeners\n onExpand: _react.PropTypes.func, // f(data:*, originalEvent:?event)\n onCollapse: _react.PropTypes.func, // f(data:*, originalEvent:?event)\n children: _react.PropTypes.node\n};\n\n// We can extract this into an exported component if we need it elsewhere\n\nvar Expando = function (_Component2) {\n _inherits(Expando, _Component2);\n\n function Expando() {\n _classCallCheck(this, Expando);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(Expando).apply(this, arguments));\n }\n\n _createClass(Expando, [{\n key: 'render',\n value: function render() {\n\n var classes = ['result-item-expando'];\n\n if (this.props.expanded) {\n classes.push('expanded');\n }\n\n if (this.props.disabled) {\n classes.push('disabled');\n }\n\n var outerClassName = classes.join(' ');\n return _react2.default.createElement(\n 'svg',\n { width: '28', height: '24', className: outerClassName },\n _react2.default.createElement(\n 'g',\n { transform: 'translate(14 12)' },\n _react2.default.createElement(\n 'g',\n { className: 'expando-glyph' },\n _react2.default.createElement('polygon', { points: '-1.7,-5 3.3,0 -1.7,5 -2.9,3.8 1,0 -2.9,-3.8' })\n )\n )\n );\n }\n }]);\n\n return Expando;\n}(_react.Component);\n\nExpando.propTypes = {\n expanded: _react.PropTypes.bool,\n disabled: _react.PropTypes.bool\n};\n},{\"./status/StatusIndicator\":38,\"./status/SvgStatus\":40,\"react\":494,\"react-addons-css-transition-group\":304}],23:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.polarToCartesian = polarToCartesian;\nexports.describeArcAsPath = describeArcAsPath;\n\n\n//\n// Common Helper functions for building SVGs. Could include simple math funcs as well as higher-order components.\n//\n\nfunction polarToCartesian(centerX, centerY, radius, angleInDegrees) {\n\n var angleInRadians = (angleInDegrees - 90) * Math.PI / 180.0;\n\n return {\n x: centerX + radius * Math.cos(angleInRadians),\n y: centerY + radius * Math.sin(angleInRadians)\n };\n}\n\nfunction describeArcAsPath(x, y, radius, startAngle, endAngle) {\n var start = polarToCartesian(x, y, radius, endAngle);\n var end = polarToCartesian(x, y, radius, startAngle);\n\n var arcSweep = endAngle - startAngle <= 180 ? '0' : '1';\n\n var d = ['M', start.x, start.y, 'A', radius, radius, 0, arcSweep, 0, end.x, end.y].join(' ');\n\n return d;\n}\n\n// Also export an OBJ of classes + funs, like Math\nvar SVG = {\n polarToCartesian: polarToCartesian,\n describeArcAsPath: describeArcAsPath\n};\n\nexports.default = SVG;\n},{}],24:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.Table = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar array = _react.PropTypes.array;\nvar node = _react.PropTypes.node;\nvar string = _react.PropTypes.string;\n\n/**\n * Renders a simple HTML table with optional header elements.\n *\n * Properties:\n * \"children\": one or more TR elements\n * \"headers\": an array of Strings to render, or\n * an array of Objects with shape: { label:String, className:String }\n *\n * To set explicit column widths, specify className for the header elements and\n * specify specify className=\"fixed\" on the Table component to use table-layout: fixed.\n */\n\nvar Table = exports.Table = function (_Component) {\n _inherits(Table, _Component);\n\n function Table() {\n _classCallCheck(this, Table);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(Table).apply(this, arguments));\n }\n\n _createClass(Table, [{\n key: 'getKey',\n value: function getKey(column) {\n if (typeof column === 'string') {\n return column;\n }\n return column.label;\n }\n }, {\n key: 'getLabel',\n value: function getLabel(column) {\n if (typeof column === 'string') {\n return column;\n }\n return column.label;\n }\n }, {\n key: 'getClass',\n value: function getClass(column) {\n if (typeof column === 'string') {\n return null;\n }\n return column.className;\n }\n }, {\n key: 'render',\n value: function render() {\n var _this2 = this;\n\n var _props = this.props;\n var headers = _props.headers;\n var children = _props.children;\n\n var className = 'jdl-table' + (this.props.className ? ' ' + this.props.className : '');\n\n return _react2.default.createElement(\n 'table',\n { className: className },\n headers && _react2.default.createElement(\n 'thead',\n null,\n _react2.default.createElement(\n 'tr',\n null,\n headers.map(function (column) {\n return _react2.default.createElement(\n 'th',\n { key: _this2.getKey(column), className: _this2.getClass(column) },\n _this2.getLabel(column)\n );\n })\n )\n ),\n headers ? _react2.default.createElement(\n 'tbody',\n null,\n children\n ) : {\n children: children\n }\n );\n }\n }]);\n\n return Table;\n}(_react.Component);\n\nTable.propTypes = {\n headers: array,\n children: node,\n className: string\n};\n},{\"react\":494}],25:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.TimeDuration = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _moment = require('moment');\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nrequire('moment-duration-format');\n\n/**\n * Displays a millisecond duration as text in moment-duration-format's \"humanize()\" format,\n * e.g. \"a few seconds\", \"2 hours\", etc.\n * Also displays tooltip with more precise duration in \"mos, days, hours, mins, secs\" format.\n * Tooltip text can be overridden via \"hint\" property.\n * Set liveUpdate=true to tick the duration up as time elapses.\n *\n * Properties:\n * \"millis\": number or string.\n * \"hint\": string to use for tooltip.\n * \"liveUpdate\": boolean\n */\n\nvar TimeDuration = exports.TimeDuration = function (_Component) {\n _inherits(TimeDuration, _Component);\n\n function TimeDuration(props) {\n _classCallCheck(this, TimeDuration);\n\n // track how much time has elapsed since live updating tracking started\n\n var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(TimeDuration).call(this, props));\n\n _this.state = { elapsed: 0 };\n // When updating, average 30s period, with jitter to spread out the work\n _this.timerPeriodMillis = 30000 + Math.ceil(Math.random() * 5000);\n _this.clearIntervalId = 0;\n\n return _this;\n }\n\n _createClass(TimeDuration, [{\n key: 'componentWillMount',\n value: function componentWillMount() {\n this._handleProps(this.props);\n }\n }, {\n key: 'componentWillReceiveProps',\n value: function componentWillReceiveProps(nextProps) {\n this._handleProps(nextProps);\n }\n }, {\n key: '_handleProps',\n value: function _handleProps(props) {\n var _this2 = this;\n\n if (this.clearIntervalId) {\n clearInterval(this.clearIntervalId);\n this.clearIntervalId = 0;\n }\n\n if (props.millis >= 0 && props.liveUpdate) {\n this.clearIntervalId = setInterval(function () {\n _this2._updateTime();\n }, this.timerPeriodMillis);\n }\n\n // if live update is disabled, we no longer need to track elapsed time\n if (!props.liveUpdate) {\n this.setState({\n elapsed: 0\n });\n }\n }\n }, {\n key: '_updateTime',\n value: function _updateTime() {\n var elapsed = this.state.elapsed + this.timerPeriodMillis;\n this.setState({\n elapsed: elapsed\n });\n }\n }, {\n key: 'componentWillUnmount',\n value: function componentWillUnmount() {\n if (this.clearIntervalId) {\n clearInterval(this.clearIntervalId);\n this.clearIntervalId = 0;\n }\n }\n }, {\n key: 'render',\n value: function render() {\n var millis = parseInt(this.props.millis) + this.state.elapsed;\n\n if (!isNaN(millis)) {\n var duration = _moment2.default.duration(millis).humanize();\n\n var _hint = this.props.hint ? this.props.hint : _moment2.default.duration(millis).format(\"M [mos], d [days], h[h], m[m], s[s]\");\n\n return _react2.default.createElement(\n 'span',\n { title: _hint },\n duration\n );\n }\n\n return _react2.default.createElement(\n 'span',\n null,\n '-'\n );\n }\n }]);\n\n return TimeDuration;\n}(_react.Component);\n\nTimeDuration.propTypes = {\n millis: _react.PropTypes.oneOfType([_react.PropTypes.number, _react.PropTypes.string]),\n hint: _react.PropTypes.string,\n liveUpdate: _react.PropTypes.bool\n};\n},{\"moment\":268,\"moment-duration-format\":267,\"react\":494}],26:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.Toast = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactMaterialIconsBlue = require('react-material-icons-blue');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * Toast displays a small confirmation message with an optional action link and dismiss link.\n * Toast will auto-dismiss itself after 5s.\n *\n * Supported props:\n * text - Confirmation message text, e.g. \"Run Started\"\n * action - Optional action link, e.g. \"Open\"\n * onActionClick - function to invoke when action link is clicked\n * onDismiss - function to invoke when dismiss link is clicked, or Toast auto-dismisses.\n */\n\nvar Toast = exports.Toast = function (_Component) {\n _inherits(Toast, _Component);\n\n function Toast() {\n _classCallCheck(this, Toast);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(Toast).apply(this, arguments));\n }\n\n _createClass(Toast, [{\n key: 'onActionClick',\n value: function onActionClick() {\n if (this.props.onActionClick) {\n this.props.onActionClick();\n }\n }\n }, {\n key: 'onDismissClick',\n value: function onDismissClick() {\n if (this.props.onDismiss) {\n this.props.onDismiss();\n }\n }\n }, {\n key: 'render',\n value: function render() {\n var _this2 = this;\n\n return _react2.default.createElement(\n 'div',\n { className: 'toast' },\n _react2.default.createElement(\n 'span',\n { className: 'text' },\n this.props.text\n ),\n _react2.default.createElement(\n 'a',\n { className: 'action', onClick: function onClick() {\n return _this2.onActionClick();\n } },\n this.props.action\n ),\n _react2.default.createElement(\n 'a',\n { className: 'dismiss', onClick: function onClick() {\n return _this2.onDismissClick();\n } },\n _react2.default.createElement(_reactMaterialIconsBlue.Icon, {\n size: 18,\n icon: 'clear',\n style: { fill: \"#fff\" }\n })\n )\n );\n }\n }]);\n\n return Toast;\n}(_react.Component);\n\nToast.propTypes = {\n text: _react.PropTypes.string,\n action: _react.PropTypes.string,\n onActionClick: _react.PropTypes.func,\n onDismiss: _react.PropTypes.func\n};\n},{\"react\":494,\"react-material-icons-blue\":306}],27:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.Toaster = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactAddonsCssTransitionGroup = require('react-addons-css-transition-group');\n\nvar _reactAddonsCssTransitionGroup2 = _interopRequireDefault(_reactAddonsCssTransitionGroup);\n\nvar _Toast = require('./Toast');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /**\n * Created by cmeyers on 8/17/16.\n */\n\n\n/**\n * Toaster is a container for Toast instances displayed based on supplied 'toasts' prop.\n *\n * Supported props:\n * toasts - array of toast objects\n * {\n * id: unique identifier\n * text: string, message text to display\n * action: string, text for action link\n * onActionClick: function, callback to invoke when action link is clicked\n * onDismiss: function, callback to invoke when toast is dismissed (immediately, or after timeout)\n * dismissDelay: number, duration in millis after which to auto-dismiss this Toast\n * }\n * dismissDelay - number, default duration in millis after which to hide a Toast\n */\n\nvar Toaster = exports.Toaster = function (_Component) {\n _inherits(Toaster, _Component);\n\n function Toaster() {\n _classCallCheck(this, Toaster);\n\n var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(Toaster).call(this));\n\n _this.activeToasts = {};\n return _this;\n }\n\n _createClass(Toaster, [{\n key: 'componentWillMount',\n value: function componentWillMount() {\n this._initialize(this.props);\n }\n }, {\n key: 'componentWillReceiveProps',\n value: function componentWillReceiveProps(nextProps) {\n this._initialize(nextProps);\n }\n }, {\n key: '_initialize',\n value: function _initialize(props) {\n var _this2 = this;\n\n if (!props.toasts) {\n return;\n }\n\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n var _loop = function _loop() {\n var toast = _step.value;\n\n var dismissDelay = toast.dismissDelay || props.dismissDelay || 5000;\n\n // if we aren't already tracking the toast, add an auto-dismiss handler and store the timeoutId\n if (!_this2.activeToasts[toast.id]) {\n var timeoutId = setTimeout(function () {\n return _this2._onDismiss(toast);\n }, dismissDelay);\n _this2.activeToasts[toast.id] = timeoutId;\n }\n };\n\n for (var _iterator = props.toasts[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n _loop();\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n }\n }, {\n key: '_onActionClick',\n value: function _onActionClick(toast) {\n this._cleanup(toast);\n\n if (toast.onActionClick) {\n toast.onActionClick();\n }\n\n if (this.props.onActionClick) {\n this.props.onActionClick(toast);\n }\n }\n }, {\n key: '_onDismiss',\n value: function _onDismiss(toast) {\n this._cleanup(toast);\n\n if (toast.onDismiss) {\n toast.onDismiss();\n }\n\n if (this.props.onDismiss) {\n this.props.onDismiss(toast);\n }\n }\n }, {\n key: '_cleanup',\n value: function _cleanup(toast) {\n var timeoutId = this.activeToasts[toast.id];\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n delete this.activeToasts[toast.id];\n }\n }\n }, {\n key: 'render',\n value: function render() {\n var _this3 = this;\n\n return _react2.default.createElement(\n 'div',\n { className: 'toaster' },\n _react2.default.createElement(\n _reactAddonsCssTransitionGroup2.default,\n {\n transitionName: 'toast',\n transitionAppear: true,\n transitionAppearTimeout: 300, transitionEnterTimeout: 300, transitionLeaveTimeout: 300\n },\n this.props.toasts.map(function (toast) {\n if (!toast.id) {\n console.warn(\"toast cannot be added without 'id' property\", toast);\n return null;\n }\n\n var key = toast.id;\n\n return _react2.default.createElement(_Toast.Toast, {\n key: key,\n text: toast.text,\n action: toast.action,\n onActionClick: function onActionClick() {\n return _this3._onActionClick(toast);\n },\n onDismiss: function onDismiss() {\n return _this3._onDismiss(toast);\n }\n });\n })\n )\n );\n }\n }]);\n\n return Toaster;\n}(_react.Component);\n\nToaster.propTypes = {\n toasts: _react.PropTypes.array,\n onActionClick: _react.PropTypes.func,\n onDismiss: _react.PropTypes.func,\n dismissDelay: _react.PropTypes.number\n};\n\nToaster.defaultProps = {\n toasts: []\n};\n},{\"./Toast\":26,\"react\":494,\"react-addons-css-transition-group\":304}],28:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.Favorite = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /**\n * Created by cmeyers on 4/11/16.\n */\n\n\nvar Favorite = exports.Favorite = function (_Component) {\n _inherits(Favorite, _Component);\n\n function Favorite() {\n _classCallCheck(this, Favorite);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(Favorite).apply(this, arguments));\n }\n\n _createClass(Favorite, [{\n key: 'componentWillMount',\n value: function componentWillMount() {\n this._updateState(this.props);\n }\n }, {\n key: 'componentWillReceiveProps',\n value: function componentWillReceiveProps(props) {\n this._updateState(props);\n }\n }, {\n key: '_updateState',\n value: function _updateState(props) {\n this.setState({\n checked: props.checked\n });\n }\n }, {\n key: 'toggle',\n value: function toggle(e) {\n if (e.target instanceof HTMLInputElement) {\n var _checked = e.target.checked;\n this.setState({\n checked: _checked\n });\n\n if (this.props.onToggle != null) {\n this.props.onToggle(_checked);\n }\n }\n }\n\n /* eslint-disable max-len */\n\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'label',\n { className: 'favorite ' + this.props.className,\n onClick: function onClick(event) {\n return event.stopPropagation();\n }\n },\n _react2.default.createElement('input', { type: 'checkbox',\n onChange: this.toggle.bind(this),\n checked: this.state.checked }),\n _react2.default.createElement(\n 'svg',\n { className: 'star-icon', width: '288', height: '24', viewBox: '0 0 288 24', xmlns: 'http://www.w3.org/2000/svg' },\n _react2.default.createElement(\n 'title',\n null,\n 'stars for light background'\n ),\n _react2.default.createElement(\n 'g',\n { fill: 'none', 'fill-rule': 'evenodd' },\n _react2.default.createElement('path', { className: 'star-empty', d: 'M22 9.24l-7.19-.62L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27 18.18 21l-1.63-7.03L22 9.24zM12 15.4l-3.76 2.27 1-4.28-3.32-2.88 4.38-.38L12 6.1l1.71 4.04 4.38.38-3.32 2.88 1 4.28L12 15.4z', fill: '#4A90E2' }),\n _react2.default.createElement('path', { d: 'M0 0h24v24H0V0zM49-1h24v24H49V-1z' }),\n _react2.default.createElement('path', { d: 'M49-1h24v24H49V-1zM144 0h24v24h-24V0z' }),\n _react2.default.createElement('path', { d: 'M144 0h24v24h-24V0z' }),\n _react2.default.createElement(\n 'g',\n { stroke: '#F5A623', 'stroke-width': '.8', 'stroke-linecap': 'square' },\n _react2.default.createElement('path', { d: 'M153 8l-1.5-1.5M159 8l1.5-1.5M151.051 14.054l-1.576 1.42M162.46 15.038L161 14M155.691 18.849l.02-1.12' })\n ),\n _react2.default.createElement('path', { d: 'M156 15.689l4.326 2.611-1.148-4.921L163 10.068l-5.033-.427L156 5l-1.967 4.641-5.033.427 3.822 3.311-1.148 4.921L156 15.689z', fill: '#F5A623' }),\n _react2.default.createElement('path', { d: 'M24 0h24v24H24V0z' }),\n _react2.default.createElement('path', { d: 'M24 0h24v24H24V0z' }),\n _react2.default.createElement('path', { d: 'M36 14.635l3.09 1.865-.82-3.515L41 10.62l-3.595-.305L36 7l-1.405 3.315L31 10.62l2.73 2.365-.82 3.515L36 14.635z', fill: '#F5A623', opacity: '.72' }),\n _react2.default.createElement('path', { d: 'M48 0h24v24H48V0z' }),\n _react2.default.createElement('path', { d: 'M48 0h24v24H48V0z' }),\n _react2.default.createElement('path', { d: 'M60.5 15.399l3.399 2.051-.902-3.866L66 10.982l-3.954-.335L60.5 7l-1.546 3.646-3.954.336 3.003 2.602-.902 3.866 3.399-2.051z', fill: '#F5A623', opacity: '.82' }),\n _react2.default.createElement('path', { d: 'M72 0h24v24H72V0z' }),\n _react2.default.createElement('path', { d: 'M72 0h24v24H72V0z' }),\n _react2.default.createElement('path', { d: 'M84 15.162l3.708 2.238-.984-4.218L90 10.344l-4.314-.366L84 6l-1.686 3.978-4.314.366 3.276 2.838-.984 4.218L84 15.162z', fill: '#F5A623', opacity: '.85' }),\n _react2.default.createElement('path', { d: 'M96 0h24v24H96V0z' }),\n _react2.default.createElement('path', { d: 'M96 0h24v24H96V0z' }),\n _react2.default.createElement('path', { d: 'M108.5 15.925l4.017 2.425-1.066-4.57L115 10.707l-4.674-.396L108.5 6l-1.826 4.31-4.674.396 3.549 3.075-1.066 4.569 4.017-2.425z', fill: '#F5A623' }),\n _react2.default.createElement(\n 'g',\n { stroke: '#F5A623', 'stroke-width': '.5', 'stroke-linecap': 'square' },\n _react2.default.createElement('path', { d: 'M107 11l-1.5-1.5M110 11l1.5-1.5M106.051 13.054l-1.576 1.42M112.46 14.038L111 13M108.691 16.849l.02-1.12' })\n ),\n _react2.default.createElement(\n 'g',\n null,\n _react2.default.createElement('path', { d: 'M120 0h24v24h-24V0z' }),\n _react2.default.createElement('path', { d: 'M120 0h24v24h-24V0z' }),\n _react2.default.createElement('path', { d: 'M131.75 15.307l4.171 2.518-1.106-4.745 3.685-3.193-4.853-.412L131.75 5l-1.897 4.475-4.853.412 3.685 3.193-1.107 4.745 4.172-2.518z', fill: '#F5A623' }),\n _react2.default.createElement(\n 'g',\n { stroke: '#F5A623', 'stroke-width': '.5', 'stroke-linecap': 'square' },\n _react2.default.createElement('path', { d: 'M129 8l-1.5-1.5M135 8l1.5-1.5M127.051 14.054l-1.412 1.271M138.46 15.038L137 14M131.691 18.849l.02-1.12' })\n )\n ),\n _react2.default.createElement(\n 'g',\n null,\n _react2.default.createElement('path', { d: 'M168 0h24v24h-24V0z' }),\n _react2.default.createElement('path', { d: 'M168 0h24v24h-24V0z' }),\n _react2.default.createElement(\n 'g',\n { stroke: '#F5A623', 'stroke-width': '.8', 'stroke-linecap': 'square' },\n _react2.default.createElement('path', { d: 'M177 8l-1.5-1.5M183 8l1.5-1.5M175.051 14.054l-1.576 1.42M186.46 15.038L185 14M180.396 18.849l.008-1.12' })\n ),\n _react2.default.createElement('path', { d: 'M180 16.743l5.562 3.357-1.476-6.327L189 9.516l-6.471-.549L180 3l-2.529 5.967-6.471.549 4.914 4.257-1.476 6.327L180 16.743z', fill: '#F5A623' })\n ),\n _react2.default.createElement(\n 'g',\n null,\n _react2.default.createElement('path', { d: 'M192 0h24v24h-24V0z' }),\n _react2.default.createElement('path', { d: 'M204 17.27l6.18 3.73-1.64-7.03L214 9.24l-7.19-.61L204 2l-2.81 6.63-7.19.61 5.46 4.73-1.64 7.03 6.18-3.73z', fill: '#F5A623' }),\n _react2.default.createElement('path', { d: 'M192 0h24v24h-24V0z' }),\n _react2.default.createElement(\n 'g',\n { stroke: '#F5A623', 'stroke-linecap': 'square' },\n _react2.default.createElement('path', { d: 'M201 8l-1.5-1.5M207 8l1.5-1.5M199.051 14.054l-1.576 1.42M210.46 15.038L209 14M203.495 18.849l.01-1.12' })\n )\n ),\n _react2.default.createElement(\n 'g',\n null,\n _react2.default.createElement('path', { d: 'M216 0h24v24h-24V0z' }),\n _react2.default.createElement('path', { d: 'M228 18.324l7.416 4.476-1.968-8.436L240 8.688l-8.628-.732L228 0l-3.372 7.956-8.628.732 6.552 5.676-1.968 8.436L228 18.324z', fill: '#F5A623' }),\n _react2.default.createElement('path', { d: 'M216 0h24v24h-24V0z' })\n ),\n _react2.default.createElement(\n 'g',\n null,\n _react2.default.createElement('path', { d: 'M264 0h24v24h-24V0z' }),\n _react2.default.createElement('path', { className: 'star-filled', d: 'M276 17.27l6.18 3.73-1.64-7.03L286 9.24l-7.19-.61L276 2l-2.81 6.63-7.19.61 5.46 4.73-1.64 7.03 6.18-3.73z', fill: '#F5A623' }),\n _react2.default.createElement('path', { d: 'M264 0h24v24h-24V0z' })\n ),\n _react2.default.createElement(\n 'g',\n null,\n _react2.default.createElement('path', { d: 'M240 0h24v24h-24V0z' }),\n _react2.default.createElement('path', { d: 'M252 17.797l6.798 4.103-1.804-7.733L263 8.964l-7.909-.671L252 1l-3.091 7.293-7.909.671 6.006 5.203-1.804 7.733L252 17.797z', fill: '#F5A623' }),\n _react2.default.createElement('path', { d: 'M240 0h24v24h-24V0z' })\n ),\n _react2.default.createElement('circle', { stroke: '#F5A623', 'stroke-width': '.5', cx: '156', cy: '12', r: '8' }),\n _react2.default.createElement('circle', { stroke: '#F5A623', 'stroke-width': '.3', cx: '180', cy: '12', r: '10' }),\n _react2.default.createElement('circle', { stroke: '#F5A623', 'stroke-width': '.1', cx: '204', cy: '12', r: '11' }),\n _react2.default.createElement('circle', { stroke: '#F5A623', 'stroke-width': '.8', cx: '132', cy: '12', r: '7' }),\n _react2.default.createElement('circle', { stroke: '#F5A623', cx: '108.5', cy: '12.5', r: '5.5' })\n )\n )\n );\n }\n /* eslint-enable max-len */\n\n }]);\n\n return Favorite;\n}(_react.Component);\n\nFavorite.defaultProps = {\n checked: false,\n className: ''\n};\n\n\nFavorite.propTypes = {\n checked: _react.PropTypes.bool,\n className: _react.PropTypes.oneOf(['', 'dark-yellow', 'dark-white']),\n onToggle: _react.PropTypes.func\n};\n},{\"react\":494}],29:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.GlobalNav = exports.GlobalHeader = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require(\"react\");\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar GlobalHeader = exports.GlobalHeader = function (_Component) {\n _inherits(GlobalHeader, _Component);\n\n function GlobalHeader() {\n _classCallCheck(this, GlobalHeader);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(GlobalHeader).apply(this, arguments));\n }\n\n _createClass(GlobalHeader, [{\n key: \"render\",\n value: function render() {\n return _react2.default.createElement(\n \"header\",\n { className: \"global-header\" },\n this.props.children\n );\n }\n }]);\n\n return GlobalHeader;\n}(_react.Component);\n\nGlobalHeader.propTypes = {\n children: _react.PropTypes.node\n};\n\nvar GlobalNav = exports.GlobalNav = function (_Component2) {\n _inherits(GlobalNav, _Component2);\n\n function GlobalNav() {\n _classCallCheck(this, GlobalNav);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(GlobalNav).apply(this, arguments));\n }\n\n _createClass(GlobalNav, [{\n key: \"render\",\n value: function render() {\n return _react2.default.createElement(\n \"nav\",\n null,\n this.props.children\n );\n }\n }]);\n\n return GlobalNav;\n}(_react.Component);\n\nGlobalNav.propTypes = {\n children: _react.PropTypes.node\n};\n},{\"react\":494}],30:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _modalview = require('./modal/modalview');\n\nObject.defineProperty(exports, 'ModalView', {\n enumerable: true,\n get: function get() {\n return _modalview.ModalView;\n }\n});\nObject.defineProperty(exports, 'ModalBody', {\n enumerable: true,\n get: function get() {\n return _modalview.ModalBody;\n }\n});\nObject.defineProperty(exports, 'ModalStyles', {\n enumerable: true,\n get: function get() {\n return _modalview.ModalStyles;\n }\n});\nObject.defineProperty(exports, 'ModalHeader', {\n enumerable: true,\n get: function get() {\n return _modalview.ModalHeader;\n }\n});\n\nvar _weatherIcon = require('./weather-icon');\n\nObject.defineProperty(exports, 'WeatherIcon', {\n enumerable: true,\n get: function get() {\n return _weatherIcon.WeatherIcon;\n }\n});\n\nvar _page = require('./page');\n\nObject.defineProperty(exports, 'Page', {\n enumerable: true,\n get: function get() {\n return _page.Page;\n }\n});\n\nvar _globalHeader = require('./global-header');\n\nObject.defineProperty(exports, 'GlobalHeader', {\n enumerable: true,\n get: function get() {\n return _globalHeader.GlobalHeader;\n }\n});\nObject.defineProperty(exports, 'GlobalNav', {\n enumerable: true,\n get: function get() {\n return _globalHeader.GlobalNav;\n }\n});\n\nvar _pageHeader = require('./page-header');\n\nObject.defineProperty(exports, 'PageHeader', {\n enumerable: true,\n get: function get() {\n return _pageHeader.PageHeader;\n }\n});\nObject.defineProperty(exports, 'Title', {\n enumerable: true,\n get: function get() {\n return _pageHeader.Title;\n }\n});\nObject.defineProperty(exports, 'PageTabs', {\n enumerable: true,\n get: function get() {\n return _pageHeader.PageTabs;\n }\n});\nObject.defineProperty(exports, 'TabLink', {\n enumerable: true,\n get: function get() {\n return _pageHeader.TabLink;\n }\n});\n\nvar _Table = require('./Table');\n\nObject.defineProperty(exports, 'Table', {\n enumerable: true,\n get: function get() {\n return _Table.Table;\n }\n});\n\nvar _StatusIndicator = require('./status/StatusIndicator');\n\nObject.defineProperty(exports, 'StatusIndicator', {\n enumerable: true,\n get: function get() {\n return _StatusIndicator.StatusIndicator;\n }\n});\nObject.defineProperty(exports, 'SvgSpinner', {\n enumerable: true,\n get: function get() {\n return _StatusIndicator.SvgSpinner;\n }\n});\nObject.defineProperty(exports, 'SvgStatus', {\n enumerable: true,\n get: function get() {\n return _StatusIndicator.SvgStatus;\n }\n});\n\nvar _LiveStatusIndicator = require('./status/LiveStatusIndicator');\n\nObject.defineProperty(exports, 'LiveStatusIndicator', {\n enumerable: true,\n get: function get() {\n return _LiveStatusIndicator.LiveStatusIndicator;\n }\n});\n\nvar _Favorite = require('./favorite/Favorite');\n\nObject.defineProperty(exports, 'Favorite', {\n enumerable: true,\n get: function get() {\n return _Favorite.Favorite;\n }\n});\n\nvar _ReadableDate = require('./ReadableDate');\n\nObject.defineProperty(exports, 'ReadableDate', {\n enumerable: true,\n get: function get() {\n return _ReadableDate.ReadableDate;\n }\n});\n\nvar _CommitHash = require('./CommitHash');\n\nObject.defineProperty(exports, 'CommitHash', {\n enumerable: true,\n get: function get() {\n return _CommitHash.CommitHash;\n }\n});\n\nvar _DownloadLink = require('./DownloadLink');\n\nObject.defineProperty(exports, 'DownloadLink', {\n enumerable: true,\n get: function get() {\n return _DownloadLink.DownloadLink;\n }\n});\n\nvar _EmptyStateView = require('./EmptyStateView');\n\nObject.defineProperty(exports, 'EmptyStateView', {\n enumerable: true,\n get: function get() {\n return _EmptyStateView.EmptyStateView;\n }\n});\n\nvar _EmptyStateIcon = require('./EmptyStateIcon');\n\nObject.defineProperty(exports, 'EmptyStateIcon', {\n enumerable: true,\n get: function get() {\n return _EmptyStateIcon.EmptyStateIcon;\n }\n});\n\nvar _PipelineGraph = require('./PipelineGraph');\n\nObject.defineProperty(exports, 'PipelineGraph', {\n enumerable: true,\n get: function get() {\n return _PipelineGraph.PipelineGraph;\n }\n});\n\nvar _FileSize = require('./FileSize');\n\nObject.defineProperty(exports, 'FileSize', {\n enumerable: true,\n get: function get() {\n return _FileSize.FileSize;\n }\n});\n\nvar _Toast = require('./Toast');\n\nObject.defineProperty(exports, 'Toast', {\n enumerable: true,\n get: function get() {\n return _Toast.Toast;\n }\n});\n\nvar _Toaster = require('./Toaster');\n\nObject.defineProperty(exports, 'Toaster', {\n enumerable: true,\n get: function get() {\n return _Toaster.Toaster;\n }\n});\n\nvar _ResultItem = require('./ResultItem');\n\nObject.defineProperty(exports, 'ResultItem', {\n enumerable: true,\n get: function get() {\n return _ResultItem.ResultItem;\n }\n});\n\nvar _TimeDuration = require('./TimeDuration');\n\nObject.defineProperty(exports, 'TimeDuration', {\n enumerable: true,\n get: function get() {\n return _TimeDuration.TimeDuration;\n }\n});\n\nvar _Progress = require('./Progress');\n\nObject.defineProperty(exports, 'Progress', {\n enumerable: true,\n get: function get() {\n return _Progress.Progress;\n }\n});\n},{\"./CommitHash\":14,\"./DownloadLink\":15,\"./EmptyStateIcon\":16,\"./EmptyStateView\":17,\"./FileSize\":18,\"./PipelineGraph\":19,\"./Progress\":20,\"./ReadableDate\":21,\"./ResultItem\":22,\"./Table\":24,\"./TimeDuration\":25,\"./Toast\":26,\"./Toaster\":27,\"./favorite/Favorite\":28,\"./global-header\":29,\"./modal/modalview\":33,\"./page\":36,\"./page-header\":35,\"./status/LiveStatusIndicator\":37,\"./status/StatusIndicator\":38,\"./weather-icon\":41}],31:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/*eslint-disable no-unused-vars*/\n\n\n/*eslint-enable no-unused-vars*/\n\nvar Body = function (_Component) {\n _inherits(Body, _Component);\n\n function Body() {\n _classCallCheck(this, Body);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(Body).apply(this, arguments));\n }\n\n _createClass(Body, [{\n key: 'render',\n value: function render() {\n var _props = this.props;\n var children = _props.children;\n var _props$body = _props.body;\n var body = _props$body === undefined ? 'no body' : _props$body;\n\n if (children) {\n return children;\n } else {\n return _react2.default.createElement(\n 'span',\n null,\n body\n );\n }\n }\n }]);\n\n return Body;\n}(_react.Component);\n\nBody.propTypes = {\n body: _react.PropTypes.string,\n children: _react.PropTypes.node\n};\n\nexports.default = Body;\n},{\"react\":494}],32:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Header = function (_Component) {\n _inherits(Header, _Component);\n\n function Header() {\n _classCallCheck(this, Header);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(Header).apply(this, arguments));\n }\n\n _createClass(Header, [{\n key: 'render',\n value: function render() {\n var _props = this.props;\n var children = _props.children;\n var _props$title = _props.title;\n var title = _props$title === undefined ? 'no title' : _props$title;\n var titleStyle = _props.titleStyle;\n\n if (children) {\n return children;\n } else {\n return _react2.default.createElement(\n 'h2',\n { className: 'title', style: titleStyle },\n title\n );\n }\n }\n }]);\n\n return Header;\n}(_react.Component);\n\nHeader.propTypes = {\n children: _react.PropTypes.node,\n title: _react.PropTypes.string,\n titleStyle: _react.PropTypes.object\n};\n\nexports.default = Header;\n},{\"react\":494}],33:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.ModalHeader = exports.ModalView = exports.ModalStyles = exports.ModalBody = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactAddonsCssTransitionGroup = require('react-addons-css-transition-group');\n\nvar _reactAddonsCssTransitionGroup2 = _interopRequireDefault(_reactAddonsCssTransitionGroup);\n\nvar _styles = require('./styles');\n\nvar _styles2 = _interopRequireDefault(_styles);\n\nvar _header = require('./header');\n\nvar _header2 = _interopRequireDefault(_header);\n\nvar _body = require('./body');\n\nvar _body2 = _interopRequireDefault(_body);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n// Typedefs\n\nvar ModalView = function (_Component) {\n _inherits(ModalView, _Component);\n\n function ModalView(props) {\n _classCallCheck(this, ModalView);\n\n var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(ModalView).call(this, props));\n\n _this._handleKeys = function (event) {\n var ignoreEscapeKey = _this.props.ignoreEscapeKey;\n\n\n if (!ignoreEscapeKey && event.keyCode == 27) {\n _this.hide();\n }\n };\n\n _this.state = {\n dismissing: false,\n isVisible: props.isVisible || false\n };\n return _this;\n }\n\n _createClass(ModalView, [{\n key: 'componentWillMount',\n value: function componentWillMount() {\n document.addEventListener(\"keydown\", this._handleKeys, false);\n }\n }, {\n key: 'componentWillUnmount',\n value: function componentWillUnmount() {\n document.removeEventListener(\"keydown\", this._handleKeys, false);\n }\n }, {\n key: 'componentWillUpdate',\n value: function componentWillUpdate(nextProps, nextState) {\n var isVisible = this.state.isVisible;\n var _props = this.props;\n var beforeOpen = _props.beforeOpen;\n var beforeClose = _props.beforeClose;\n\n\n if (nextState.isVisible && !isVisible && beforeOpen) {\n beforeOpen();\n }\n\n if (!nextState.isVisible && isVisible && beforeClose) {\n beforeClose();\n }\n }\n }, {\n key: 'componentDidUpdate',\n value: function componentDidUpdate(prevProps, prevState) {\n var isVisible = this.state.isVisible;\n var _props2 = this.props;\n var afterOpen = _props2.afterOpen;\n var afterClose = _props2.afterClose;\n\n\n if (!prevState.isVisible && isVisible && afterOpen) {\n afterOpen();\n }\n\n if (prevState.isVisible && !isVisible && afterClose) {\n afterClose();\n }\n }\n }, {\n key: 'show',\n value: function show() {\n this.setState({ isVisible: true });\n }\n }, {\n key: 'hide',\n value: function hide() {\n var _this2 = this;\n\n if (this.props.transitionClass) {\n this.setState({ dismissing: true });\n // after transition finishes, \"destroy\" the component\n setTimeout(function () {\n return _this2.setState({ isVisible: false });\n }, this.props.transitionDuration);\n } else {\n this.setState({ isVisible: false });\n }\n }\n }, {\n key: 'onOverlayClicked',\n value: function onOverlayClicked() {\n var _props3 = this.props;\n var hideOnOverlayClicked = _props3.hideOnOverlayClicked;\n var onOverlayClicked = _props3.onOverlayClicked;\n\n\n if (hideOnOverlayClicked) {\n this.hide();\n }\n\n if (onOverlayClicked) {\n onOverlayClicked();\n }\n }\n }, {\n key: 'getStyles',\n value: function getStyles() {\n var styleArray = ['dialogStyles', 'overlayStyles', 'closeButtonStyle', 'titleStyle', 'headerStyle', 'contentStyle'];\n var _props$styles = this.props.styles;\n var styles = _props$styles === undefined ? {} : _props$styles;\n\n var noStyle = !styles;\n\n var returnObject = {};\n\n styleArray.map(function (item) {\n returnObject[item] = !noStyle ? Object.assign({}, _styles2.default[item], styles[item]) : {};\n });\n\n return returnObject;\n }\n }, {\n key: 'getParts',\n value: function getParts(children, part) {\n return _react2.default.Children.map(children, function (child) {\n if (child.type instanceof Function && child.type.name === part) {\n return child;\n }\n });\n }\n }, {\n key: 'renderDialog',\n value: function renderDialog() {\n var _this3 = this;\n\n var _getStyles = this.getStyles();\n\n var dialogStyles = _getStyles.dialogStyles;\n var closeButtonStyle = _getStyles.closeButtonStyle;\n var titleStyle = _getStyles.titleStyle;\n var contentStyle = _getStyles.contentStyle;\n var headerStyle = _getStyles.headerStyle;\n var _props4 = this.props;\n var children = _props4.children;\n var _props4$result = _props4.result;\n var result = _props4$result === undefined ? 'info' : _props4$result;\n\n var rest = _objectWithoutProperties(_props4, ['children', 'result']);\n\n var head = this.getParts(children, 'Header');\n var body = this.getParts(children, 'Body');\n\n return _react2.default.createElement(\n 'div',\n { className: 'dialog', style: dialogStyles },\n _react2.default.createElement(\n 'div',\n { className: 'header ' + result.toLowerCase(), style: headerStyle },\n _react2.default.createElement(\n 'a',\n { onClick: function onClick() {\n return _this3.hide();\n },\n role: 'button',\n className: 'closeButton',\n style: closeButtonStyle },\n '×'\n ),\n _react2.default.createElement(\n 'div',\n { className: 'header-content' },\n head && head[0] ? head : _react2.default.createElement(_header2.default, _extends({}, titleStyle, rest))\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'content', style: contentStyle },\n body ? body[0] : _react2.default.createElement(\n _body2.default,\n rest,\n children\n )\n )\n );\n }\n }, {\n key: 'render',\n value: function render() {\n var _this4 = this;\n\n var isVisible = this.state.isVisible;\n //early out\n\n if (!isVisible) {\n return null;\n }\n\n var overlay = void 0;\n var transitionDuration = this.props.transitionDuration;\n\n var _getStyles2 = this.getStyles();\n\n var overlayStyles = _getStyles2.overlayStyles;\n var _props5 = this.props;\n var transitionClass = _props5.transitionClass;\n\n var rest = _objectWithoutProperties(_props5, ['transitionClass']);\n\n if (isNaN(transitionDuration)) {\n transitionDuration = 300;\n }\n\n if (rest.showOverlay) {\n overlay = _react2.default.createElement('div', {\n className: 'overlayStyles',\n onClick: function onClick() {\n return _this4.onOverlayClicked();\n },\n style: overlayStyles\n });\n }\n\n return _react2.default.createElement(\n 'section',\n { className: 'modalview' },\n overlay,\n transitionClass ? _react2.default.createElement(\n _reactAddonsCssTransitionGroup2.default,\n {\n transitionName: transitionClass,\n transitionAppear: true,\n transitionAppearTimeout: transitionDuration,\n transitionEnterTimeout: transitionDuration,\n transitionLeaveTimeout: transitionDuration\n },\n !this.state.dismissing ? this.renderDialog() : null\n ) : this.renderDialog()\n );\n }\n }]);\n\n return ModalView;\n}(_react.Component);\n\nModalView.defaultProps = {\n styles: false,\n showOverlay: true,\n hideOnOverlayClicked: false,\n ignoreEscapeKey: false\n};\n\n\nModalView.displayName = 'ModalView';\n\nModalView.propTypes = {\n afterClose: _react.PropTypes.func,\n afterOpen: _react.PropTypes.func,\n beforeClose: _react.PropTypes.func,\n beforeOpen: _react.PropTypes.func,\n body: _react.PropTypes.string,\n children: _react.PropTypes.node,\n hideOnOverlayClicked: _react.PropTypes.bool,\n isVisible: _react.PropTypes.bool,\n onOverlayClicked: _react.PropTypes.func,\n showOverlay: _react.PropTypes.bool,\n styles: _react2.default.PropTypes.oneOfType([_react.PropTypes.shape({\n closeButtonStyle: _react.PropTypes.object,\n dialogStyles: _react.PropTypes.object,\n overlayStyles: _react.PropTypes.object,\n titleStyle: _react.PropTypes.object\n }), _react.PropTypes.bool]),\n transitionClass: _react.PropTypes.string,\n transitionDuration: _react.PropTypes.number,\n result: _react.PropTypes.string,\n title: _react.PropTypes.string,\n ignoreEscapeKey: _react.PropTypes.bool\n};\n\nexports.ModalBody = _body2.default;\nexports.ModalStyles = _styles2.default;\nexports.ModalView = ModalView;\nexports.ModalHeader = _header2.default;\n},{\"./body\":31,\"./header\":32,\"./styles\":34,\"react\":494,\"react-addons-css-transition-group\":304}],34:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar defaultStyles = {\n overlayStyles: {\n position: 'fixed',\n display: 'block',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n zIndex: 99,\n backgroundColor: 'rgba(0,0,0,0.3)'\n },\n dialogStyles: {\n width: '100%',\n display: 'block',\n height: '100%',\n position: 'fixed',\n top: 0,\n left: 0,\n backgroundColor: '#fff',\n borderRadius: '2px',\n zIndex: 100,\n boxShadow: '0 0 4px rgba(0,0,0,.14),0 4px 8px rgba(0,0,0,.28)'\n },\n headerStyle: {\n padding: '25px 20px 25px 50px',\n backgroundColor: '#168BB9',\n color: '#ffffff',\n fontSize: '18px',\n fontWeight: 'normal',\n overflowY: 'auto',\n maxHeight: '20%',\n minHeight: '5%'\n },\n contentStyle: {\n backgroundColor: '#FFF',\n color: '#000',\n overflowY: 'auto',\n maxHeight: '90%',\n minHeight: '75%',\n padding: '25px 20px 25px 50px'\n },\n titleStyle: {\n marginTop: '0'\n },\n closeButtonStyle: {\n cursor: 'pointer',\n position: 'absolute',\n fontSize: '3em',\n color: '#ffffff',\n right: '20px',\n top: '5px'\n }\n};\n\nexports.default = defaultStyles;\n},{}],35:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.TabLink = exports.PageTabs = exports.Title = exports.PageHeader = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouter = require('react-router');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar PageHeader = exports.PageHeader = function (_Component) {\n _inherits(PageHeader, _Component);\n\n function PageHeader() {\n _classCallCheck(this, PageHeader);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(PageHeader).apply(this, arguments));\n }\n\n _createClass(PageHeader, [{\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'header',\n { className: 'sub-header' },\n this.props.children\n );\n }\n }]);\n\n return PageHeader;\n}(_react.Component);\n\nPageHeader.propTypes = {\n children: _react.PropTypes.node\n};\n\nvar Title = exports.Title = function (_Component2) {\n _inherits(Title, _Component2);\n\n function Title() {\n _classCallCheck(this, Title);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(Title).apply(this, arguments));\n }\n\n _createClass(Title, [{\n key: 'render',\n value: function render() {\n // If we've been given a plain string, wrap it as

\n var contents = this.props.children;\n if (typeof contents === \"string\") {\n contents = _react2.default.createElement(\n 'h1',\n null,\n 'contents'\n );\n }\n\n return _react2.default.createElement(\n 'nav',\n { className: 'page-title' },\n contents\n );\n }\n }]);\n\n return Title;\n}(_react.Component);\n\nTitle.propTypes = {\n children: _react.PropTypes.node\n};\n\nvar PageTabs = exports.PageTabs = function (_Component3) {\n _inherits(PageTabs, _Component3);\n\n function PageTabs() {\n _classCallCheck(this, PageTabs);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(PageTabs).apply(this, arguments));\n }\n\n _createClass(PageTabs, [{\n key: 'render',\n value: function render() {\n var base = this.props.base;\n return _react2.default.createElement(\n 'nav',\n { className: 'page-tabs' },\n _react2.default.Children.map(this.props.children, function (child) {\n return _react2.default.cloneElement(child, { base: base });\n })\n );\n }\n }]);\n\n return PageTabs;\n}(_react.Component);\n\nPageTabs.propTypes = {\n children: _react.PropTypes.node,\n base: _react.PropTypes.string\n};\n\nvar TabLink = exports.TabLink = function (_Component4) {\n _inherits(TabLink, _Component4);\n\n function TabLink() {\n _classCallCheck(this, TabLink);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(TabLink).apply(this, arguments));\n }\n\n _createClass(TabLink, [{\n key: 'render',\n value: function render() {\n var base = this.props.base || \"\";\n var to = this.props.to.substring(1);\n var routeUrl = base + '/' + to;\n var linkClassName = this.context.router.isActive(routeUrl) ? \"selected \" + to : to;\n return _react2.default.createElement(\n _reactRouter.Link,\n { to: routeUrl, className: linkClassName },\n this.props.children\n );\n }\n }]);\n\n return TabLink;\n}(_react.Component);\n\nTabLink.propTypes = {\n children: _react.PropTypes.node,\n base: _react.PropTypes.string,\n to: _react.PropTypes.string.isRequired\n};\n\nTabLink.contextTypes = {\n router: _react2.default.PropTypes.object\n};\n},{\"react\":494,\"react-router\":344}],36:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.Page = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require(\"react\");\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Page = exports.Page = function (_Component) {\n _inherits(Page, _Component);\n\n function Page() {\n _classCallCheck(this, Page);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(Page).apply(this, arguments));\n }\n\n _createClass(Page, [{\n key: \"render\",\n value: function render() {\n return _react2.default.createElement(\n \"div\",\n { id: \"outer\" },\n this.props.children\n );\n }\n }]);\n\n return Page;\n}(_react.Component);\n\nPage.propTypes = {\n children: _react.PropTypes.node\n};\n},{\"react\":494}],37:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.LiveStatusIndicator = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _moment = require('moment');\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _StatusIndicator = require('./StatusIndicator');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * LiveStatusIndicator is a wrapper around StatusIndicator that allows\n * for an in-progress status to self update.\n *\n * Properties:\n * \"estimatedDuration\": time in millis over which the progress indicator will update.\n * \"startTime\": ISO-8601 string indicating when tracking of progress begins from.\n */\n\nvar LiveStatusIndicator = exports.LiveStatusIndicator = function (_Component) {\n _inherits(LiveStatusIndicator, _Component);\n\n function LiveStatusIndicator(props) {\n _classCallCheck(this, LiveStatusIndicator);\n\n var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(LiveStatusIndicator).call(this, props));\n\n _this.state = {\n // percentage of progress currently drawn in UI\n percentage: 0\n };\n\n // percentage of progress based on last check\n _this.percentage = 0;\n _this.startTime = null;\n _this.clearIntervalId = 0;\n _this.animationFrameId = 0;\n return _this;\n }\n\n _createClass(LiveStatusIndicator, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n this._initializeProgress(this.props);\n }\n }, {\n key: 'componentWillReceiveProps',\n value: function componentWillReceiveProps(nextProps) {\n this._initializeProgress(nextProps);\n }\n }, {\n key: '_initializeProgress',\n value: function _initializeProgress(props) {\n var _this2 = this;\n\n // ensure we don't leak setInterval by proactively clearing it\n // the code will restart the interval if needed\n this._stopProgressUpdates();\n\n if (!props) {\n return;\n }\n\n var cleanResult = (0, _StatusIndicator.decodeResultValue)(props.result);\n // TODO: pull in validResultValues from StatusIndicator\n var isRunning = cleanResult === 'running';\n\n if (isRunning) {\n this.startTime = (0, _moment2.default)(props.startTime, _moment2.default.ISO_8601).utcOffset(props.startTime);\n\n // update the progress each second\n this.clearIntervalId = setInterval(function () {\n _this2._updateProgress(_this2.props);\n }, 1000);\n\n this._updateProgress(props);\n }\n }\n }, {\n key: '_updateProgress',\n value: function _updateProgress(props) {\n var now = (0, _moment2.default)();\n var elapsed = now.diff(this.startTime);\n var estimatedDuration = props.estimatedDuration;\n\n if (elapsed > 0 && estimatedDuration > 0) {\n this.percentage = Math.floor(elapsed / estimatedDuration * 100);\n } else {\n // if both aren't available, set to 'indeterminate' state\n this.percentage = 101;\n }\n\n if (0 <= this.percentage && this.percentage <= 100) {\n this._drawProgress();\n } else {\n // set the percentage > 100 so the indeterminate spinner will display\n // no more progress updates are required\n this.setState({\n percentage: 101\n });\n\n this._stopProgressUpdates();\n }\n }\n }, {\n key: '_drawProgress',\n value: function _drawProgress() {\n var _this3 = this;\n\n if (this.state.percentage <= this.percentage) {\n // increment the progress to trigger a rerender\n // then request another draw on next frame\n var newPercent = this.state.percentage + 1;\n this.setState({\n percentage: newPercent\n });\n\n this.animationFrameId = requestAnimationFrame(function () {\n _this3._drawProgress();\n });\n }\n }\n }, {\n key: '_stopProgressUpdates',\n value: function _stopProgressUpdates() {\n clearInterval(this.clearIntervalId);\n this.clearIntervalId = 0;\n cancelAnimationFrame(this.animationFrameId);\n this.animationFrameId = 0;\n }\n }, {\n key: 'componentWillUnmount',\n value: function componentWillUnmount() {\n this._stopProgressUpdates();\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement(_StatusIndicator.StatusIndicator, _extends({}, this.props, { percentage: this.state.percentage }));\n }\n }]);\n\n return LiveStatusIndicator;\n}(_react.Component);\n\nLiveStatusIndicator.propTypes = {\n result: _react.PropTypes.string,\n percentage: _react.PropTypes.number,\n width: _react.PropTypes.string,\n height: _react.PropTypes.string,\n noBackground: _react.PropTypes.bool,\n startTime: _react.PropTypes.string,\n estimatedDuration: _react.PropTypes.number\n};\n},{\"./StatusIndicator\":38,\"moment\":268,\"react\":494}],38:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.SvgStatus = exports.SvgSpinner = exports.StatusIndicator = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.decodeResultValue = decodeResultValue;\nexports.getGroupForResult = getGroupForResult;\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _SvgSpinner = require('./SvgSpinner');\n\nvar _SvgSpinner2 = _interopRequireDefault(_SvgSpinner);\n\nvar _SvgStatus = require('./SvgStatus');\n\nvar _SvgStatus2 = _interopRequireDefault(_SvgStatus);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar validResultValues = {\n success: 'success',\n failure: 'failure',\n running: 'running',\n queued: 'queued',\n unstable: 'unstable',\n aborted: 'aborted',\n not_built: 'not_built',\n unknown: 'unknown'\n};\n\n// Enum type from const validResultValues\n\n\n// Clean up result value, or return \"invalid\" value\nfunction decodeResultValue(resultMaybe) {\n if (resultMaybe) {\n var lcResult = String(resultMaybe).toLowerCase();\n if (validResultValues.hasOwnProperty(lcResult)) {\n return validResultValues[lcResult];\n }\n }\n return 'unknown';\n}\n\n// Returns the correct element for the result / progress percent\nfunction getGroupForResult(result, percentage, radius) {\n if (usesSvgSpinner(result)) {\n return _react2.default.createElement(_SvgSpinner2.default, { radius: radius, result: result, percentage: percentage });\n } else {\n return _react2.default.createElement(_SvgStatus2.default, { radius: radius, result: result });\n }\n}\n\n// indicates whether result should use the Spinner (or Status)\nfunction usesSvgSpinner(result) {\n switch (result) {\n case 'running':\n case 'queued':\n case 'not_built':\n return true;\n default:\n return false;\n }\n}\n\nvar StatusIndicator = function (_Component) {\n _inherits(StatusIndicator, _Component);\n\n function StatusIndicator() {\n _classCallCheck(this, StatusIndicator);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(StatusIndicator).apply(this, arguments));\n }\n\n _createClass(StatusIndicator, [{\n key: 'render',\n value: function render() {\n var _props = this.props;\n var result = _props.result;\n var percentage = _props.percentage;\n var _props$width = _props.width;\n var width = _props$width === undefined ? '24px' : _props$width;\n var _props$height = _props.height;\n var height = _props$height === undefined ? '24px' : _props$height;\n var noBackground = _props.noBackground;\n\n\n var groupClasses = ['svgResultStatus', noBackground ? 'no-background' : null];\n\n var radius = 12; // px.\n var resultClean = decodeResultValue(result);\n\n var translate = 'translate(' + radius + ' ' + radius + ')';\n // SvgStatus needs to be scaled up to fill the available space when no bg is used\n var scale = noBackground && !usesSvgSpinner(resultClean) ? 'scale(2,2)' : null;\n\n var transforms = [translate, scale];\n\n return _react2.default.createElement(\n 'svg',\n { className: groupClasses.join(' '), xmlns: 'http://www.w3.org/2000/svg',\n viewBox: '0 0 ' + 2 * radius + ' ' + 2 * radius, width: width, height: height\n },\n _react2.default.createElement(\n 'title',\n null,\n resultClean\n ),\n _react2.default.createElement(\n 'g',\n { transform: transforms.join(' ') },\n getGroupForResult(resultClean, percentage, radius)\n )\n );\n }\n }]);\n\n return StatusIndicator;\n}(_react.Component);\n\nStatusIndicator.propTypes = {\n result: _react.PropTypes.string,\n percentage: _react.PropTypes.number,\n width: _react.PropTypes.string,\n height: _react.PropTypes.string,\n noBackground: _react.PropTypes.bool\n};\n\nStatusIndicator.validResultValues = validResultValues;\n\nexports.StatusIndicator = StatusIndicator;\nexports.SvgSpinner = _SvgSpinner2.default;\nexports.SvgStatus = _SvgStatus2.default;\n},{\"./SvgSpinner\":39,\"./SvgStatus\":40,\"react\":494}],39:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.strokeWidth = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _SVG = require('../SVG');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar strokeWidth = exports.strokeWidth = 3.5; // px. Maybe we can fetch this from CSS at runtime in the future\n\nvar SvgSpinner = function (_Component) {\n _inherits(SvgSpinner, _Component);\n\n function SvgSpinner() {\n _classCallCheck(this, SvgSpinner);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(SvgSpinner).apply(this, arguments));\n }\n\n _createClass(SvgSpinner, [{\n key: 'render',\n value: function render() {\n var result = this.props.result;\n\n var radius = (this.props.radius || 12) - 0.5 * strokeWidth; // No \"inside\" stroking in SVG`\n\n var percentage = this.props.percentage;\n var groupClasses = ['progress-spinner', result];\n\n if (result === 'queued') {\n percentage = 0;\n } else if (result === 'not_built') {\n percentage = 0;\n } else if (typeof percentage !== 'number' || isNaN(percentage) || percentage < 0) {\n percentage = 0;\n } else if (percentage === 100) {\n groupClasses.push('pc-over-100');\n percentage = 0;\n } else if (percentage > 100) {\n groupClasses.push('spin');\n percentage = 25;\n }\n\n var rotate = percentage / 100 * 360;\n var d = (0, _SVG.describeArcAsPath)(0, 0, radius, 0, rotate);\n\n var innerRadius = radius / 3;\n\n return _react2.default.createElement(\n 'g',\n { className: groupClasses.join(' ') },\n _react2.default.createElement('circle', { cx: '0', cy: '0', r: radius, strokeWidth: strokeWidth }),\n _react2.default.createElement('circle', { className: 'inner', cx: '0', cy: '0', r: innerRadius }),\n percentage ? _react2.default.createElement('path', { className: result, fill: 'none', strokeWidth: strokeWidth, d: d }) : null\n );\n }\n }]);\n\n return SvgSpinner;\n}(_react.Component);\n\nexports.default = SvgSpinner;\n\n\nSvgSpinner.propTypes = {\n percentage: _react.PropTypes.number,\n radius: _react.PropTypes.number,\n result: _react.PropTypes.string\n};\n},{\"../SVG\":23,\"react\":494}],40:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.getGlyphFor = getGlyphFor;\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n// These were mostly taken from SVG and pre-translated\nvar questionMarkPath = \"M-0.672,4.29 L0.753,4.29 L0.753,5.78 L-0.672,5.78 L-0.672,4.29 Z M-2.21,-3.94 \" + \"C-1.63,-4.57 -0.830,-4.88 0.187,-4.88 C1.13,-4.88 1.88,-4.61 2.45,-4.07 C3.01,-3.54 3.30,-2.85 3.30,-2.01 \" + \"C3.30,-1.51 3.19,-1.10 2.99,-0.782 C2.78,-0.467 2.36,-0.00346 1.73,0.608 C1.27,1.05 0.972,1.43 0.836,1.74 \" + \"C0.700,2.04 0.632,2.50 0.632,3.10 L-0.644,3.10 C-0.644,2.42 -0.562,1.87 -0.400,1.45 \" + \"C-0.238,1.03 0.118,0.553 0.668,0.0133 L1.24,-0.553 C1.41,-0.715 1.55,-0.885 1.66,-1.06 \" + \"C1.85,-1.37 1.94,-1.69 1.94,-2.03 C1.94,-2.50 1.80,-2.90 1.52,-3.25 C1.24,-3.59 0.782,-3.76 0.137,-3.76 \" + \"C-0.660,-3.76 -1.21,-3.47 -1.52,-2.87 C-1.69,-2.54 -1.79,-2.07 -1.81,-1.45 L-3.09,-1.45 \" + \"C-3.09,-2.48 -2.80,-3.31 -2.21,-3.94 L-2.21,-3.94 Z\";\n\nvar hollowCirclePath = \"M 0,-6 A 6,6 0 0 1 0,6 A 6,6 0 0 1 0,-6 m 0,1.3 A 4,4 0 0 0 0,4.7 A 4,4 0 0 0 0,-4.7\";\n\nvar checkMarkPoints = \"-2.00 2.80 -4.80 0.00 -5.73 0.933 -2.00 4.67 6.00 -3.33 5.07 -4.27\";\n\nvar crossPoints = \"4.67 -3.73 3.73 -4.67 0 -0.94 -3.73 -4.67 -4.67 -3.73 -0.94 0 -4.67 3.73 -3.73 4.67 0 0.94 \" + \"3.73 4.67 4.67 3.73 0.94 0\";\n\n/**\n Returns a glyph (as ) for specified result type. Centered at 0,0, scaled for 24px icons.\n */\nfunction getGlyphFor(result) {\n\n // NB: If we start resizing these things, we'll need to use radius/12 to\n // generate a \"scale\" transform for the group\n\n switch (result) {\n case \"aborted\":\n return _react2.default.createElement(\n 'g',\n { className: 'result-status-glyph' },\n _react2.default.createElement('polygon', { points: '-5 -1 5 -1 5 1 -5 1' })\n );\n case \"unstable\":\n // \"!\"\n return _react2.default.createElement(\n 'g',\n { className: 'result-status-glyph' },\n _react2.default.createElement('polygon', { points: '-1 -5 1 -5 1 1 -1 1' }),\n _react2.default.createElement('polygon', { points: '-1 3 1 3 1 5 -1 5' })\n );\n case \"success\":\n // check-mark\n return _react2.default.createElement(\n 'g',\n { className: 'result-status-glyph' },\n _react2.default.createElement('polygon', { points: checkMarkPoints })\n );\n case \"failure\":\n // \"X\"\n return _react2.default.createElement(\n 'g',\n { className: 'result-status-glyph' },\n _react2.default.createElement('polygon', { points: crossPoints })\n );\n case \"running\":\n case \"not_built\":\n case \"queued\":\n // hollow circle\n return _react2.default.createElement(\n 'g',\n { className: 'result-status-glyph' },\n _react2.default.createElement('path', { transform: 'scale(0.9)', d: hollowCirclePath })\n );\n }\n // \"?\" for unknown / invalid\n return _react2.default.createElement(\n 'g',\n { className: 'result-status-glyph' },\n _react2.default.createElement('path', { d: questionMarkPath })\n );\n}\n\nvar SvgStatus = function (_Component) {\n _inherits(SvgStatus, _Component);\n\n function SvgStatus() {\n _classCallCheck(this, SvgStatus);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(SvgStatus).apply(this, arguments));\n }\n\n _createClass(SvgStatus, [{\n key: 'render',\n value: function render() {\n var _props = this.props;\n var result = _props.result;\n var _props$radius = _props.radius;\n var radius = _props$radius === undefined ? 12 : _props$radius;\n\n\n return _react2.default.createElement(\n 'g',\n { className: 'svgResultStatus' },\n _react2.default.createElement('circle', { cx: '0', cy: '0', r: radius, className: 'circle-bg ' + result }),\n getGlyphFor(result)\n );\n }\n }]);\n\n return SvgStatus;\n}(_react.Component);\n\nexports.default = SvgStatus;\n\n\nSvgStatus.propTypes = {\n result: _react.PropTypes.string,\n radius: _react.PropTypes.number\n};\n},{\"react\":494}],41:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.WeatherIcon = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction getStatusClassName(successpc) {\n if (successpc < 21) return 'weather-storm';\n if (successpc < 41) return 'weather-raining';\n if (successpc < 61) return 'weather-cloudy';\n if (successpc < 81) return 'weather-partially-sunny';\n return 'weather-sunny';\n}\n\nvar WeatherIcon = exports.WeatherIcon = function (_Component) {\n _inherits(WeatherIcon, _Component);\n\n function WeatherIcon() {\n _classCallCheck(this, WeatherIcon);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(WeatherIcon).apply(this, arguments));\n }\n\n _createClass(WeatherIcon, [{\n key: 'render',\n value: function render() {\n var successpc = parseInt(this.props.score) || 0;\n var status = getStatusClassName(successpc);\n var classNames = 'weather-icon ' + status;\n\n if (this.props.size === \"large\") {\n classNames += \" large-icon\";\n }\n\n return _react2.default.createElement('svg', { title: status, className: classNames });\n }\n }]);\n\n return WeatherIcon;\n}(_react.Component);\n\nWeatherIcon.defaultProps = {\n size: \"default\"\n};\nWeatherIcon.propTypes = {\n score: _react.PropTypes.oneOfType([_react.PropTypes.number, _react.PropTypes.string]),\n size: _react.PropTypes.string\n};\n},{\"react\":494}],42:[function(require,module,exports){\nvar enabled = require('enabled');\nvar logCategoryConfigCache = {};\n\nfunction getCategoryConfig(category) {\n var config = logCategoryConfigCache[category];\n if (!config) {\n config = {\n category: category,\n enabled: enabled(category)\n };\n logCategoryConfigCache[category] = config;\n }\n return config;\n}\n\nexports.reloadConfig = function(category) {\n if (category) {\n // Reload a specific config\n getCategoryConfig(category).enabled = enabled(category);\n } else {\n // Reload all configs\n for (var categoryName in logCategoryConfigCache) {\n if (logCategoryConfigCache.hasOwnProperty(categoryName)) {\n exports.reloadConfig(categoryName);\n }\n }\n }\n};\n\nexports.logger = function (category) {\n if (category === undefined) {\n throw new Error('Cannot create logger. Log \"category\" name must be specified.');\n }\n \n var LOGGER = {};\n var categoryConfig = getCategoryConfig(category);\n \n LOGGER.isDebugEnabled = function () {\n return categoryConfig.enabled;\n };\n\n LOGGER.debug = function (message) {\n if (LOGGER.isDebugEnabled()) {\n console.debug.apply(console, [category].concat(arguments));\n }\n };\n \n LOGGER.error = function (message) {\n console.error.apply(console, [category].concat(arguments));\n }; \n \n return LOGGER;\n};\n},{\"enabled\":154}],43:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * ClassMetadataStore is responsible for maintaining extension metadata\n * including type/capability info\n */\nvar ClassMetadataStore = function () {\n function ClassMetadataStore() {\n _classCallCheck(this, ClassMetadataStore);\n }\n\n _createClass(ClassMetadataStore, [{\n key: 'init',\n value: function init(classMetadataProvider) {\n /**\n * Type info cache\n */\n this.classMetadata = {};\n\n /**\n * Fetch function for the classMetadata\n */\n this.classMetadataProvider = classMetadataProvider;\n\n /**\n * Onload callbacks cache. Used to ensure we don't\n * issue multiple in-parallel requests for the same\n * class metadata.\n */\n this.classMetadataOnloadCallbacks = {};\n }\n\n /**\n * Gets the type/capability info for the given data type\n */\n\n }, {\n key: 'getClassMetadata',\n value: function getClassMetadata(type, onload) {\n var _this = this;\n\n var classMeta = this.classMetadata[type];\n if (classMeta) {\n return onload(classMeta);\n }\n\n var callbacks = this.classMetadataOnloadCallbacks[type];\n if (!callbacks) {\n // This is the first request for this type. Initialise the\n // callback cache and then issue the request to\n // the classMetadataProvider.\n callbacks = this.classMetadataOnloadCallbacks[type] = [];\n this.classMetadataProvider(type, function (data) {\n classMeta = _this.classMetadata[type] = JSON.parse(JSON.stringify(data));\n classMeta.classes = classMeta.classes || [];\n // Make sure the type itself is in the list\n if (classMeta.classes.indexOf(type) < 0) {\n classMeta.classes = [type].concat(_toConsumableArray(classMeta.classes));\n }\n delete _this.classMetadataOnloadCallbacks[type];\n\n // Notify all callbacks\n for (var i = 0; i < callbacks.length; i++) {\n try {\n callbacks[i](classMeta);\n } catch (e) {\n console.error('Unexpected Error in ClassMetadataStore onload callback function.', e);\n }\n }\n });\n } else {\n // We already have an inflight request to get class metadata info about\n // the requested type, so nothing to do except store the onload callback.\n }\n callbacks.push(onload);\n }\n }, {\n key: 'dataType',\n value: function dataType(_dataType) {\n var _this2 = this;\n\n return function (extensions, onload) {\n if (_dataType && (typeof _dataType === 'undefined' ? 'undefined' : _typeof(_dataType)) === 'object' && '_class' in _dataType) {\n // handle the common API incoming data\n _dataType = _dataType._class;\n }\n\n _this2.getClassMetadata(_dataType, function (currentTypeInfo) {\n // prevent returning extensions for the given type\n // when a more specific extension is found\n var matchingExtensions = [];\n eachType: for (var typeIndex = 0; typeIndex < currentTypeInfo.classes.length; typeIndex++) {\n // currentTypeInfo.classes is ordered by java hierarchy, including\n // and beginning with the current data type\n var type = currentTypeInfo.classes[typeIndex];\n for (var i = 0; i < extensions.length; i++) {\n var extension = extensions[i];\n if (type === extension.dataType) {\n matchingExtensions.push(extension);\n }\n }\n // if we have this specific type handled, don't\n // proceed to parent types\n if (matchingExtensions.length > 0) {\n break eachType;\n }\n }\n onload(matchingExtensions);\n });\n };\n }\n\n /**\n * Returns a filtering function to only return untyped extensions\n */\n\n }, {\n key: 'untyped',\n value: function untyped() {\n return function (extensions, onload) {\n // exclude typed extensions when types not requested\n extensions = extensions.filter(function (m) {\n return !('dataType' in m);\n });\n onload(extensions);\n };\n }\n }]);\n\n return ClassMetadataStore;\n}();\n\nexports.ClassMetadataStore = ClassMetadataStore;\nvar instance = exports.instance = new ClassMetadataStore();\n},{}],44:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\nexports.isType = isType;\nexports.componentType = componentType;\n/**\n * Tries to determine if the objectToTest is of the given type.\n * Will normalize things like String/'string' inconsistencies\n * as well as ES6 class & traditional prototype inheritance.\n * NOTE: This ALSO tests the prototype hierarchy if objectToTest\n * is a Function.\n */\nfunction isType(objectToTest, type) {\n var o = objectToTest;\n if ((typeof o === 'undefined' ? 'undefined' : _typeof(o)) === type) {\n return true;\n }\n if (type === String || type === 'string') {\n return o instanceof String;\n }\n if (type === Function || type === 'function') {\n return o instanceof Function;\n }\n if (type === Object || type === 'object') {\n return o instanceof Object;\n }\n if (objectToTest instanceof Function) {\n var proto = objectToTest;\n while (proto) {\n if (proto === type) {\n return true;\n }\n proto = Object.getPrototypeOf(proto);\n }\n }\n return objectToTest instanceof type;\n}\n\nfunction componentType(componentType) {\n return function (extensions, onload) {\n extensions = extensions.filter(function (e) {\n return isType(e.instance, componentType);\n });\n onload(extensions);\n };\n}\n},{}],45:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar React = require('react');\nvar ReactDOM = require('react-dom');\nvar ExtensionStore = require('./ExtensionStore.js').instance;\nvar ResourceLoadTracker = require('./ResourceLoadTracker').instance;\n\n/**\n * An internal component that inserts things into the (separate) context of mounted extensions. We need this for our\n * configuration object, which helps resolve URLs for media, REST endpoints, etc, and we also need to bridge the\n * \"router\" context property in order for extensions to be able to use <Link> from react-router.\n */\n\nvar ContextBridge = function (_React$Component) {\n _inherits(ContextBridge, _React$Component);\n\n function ContextBridge() {\n _classCallCheck(this, ContextBridge);\n\n return _possibleConstructorReturn(this, (ContextBridge.__proto__ || Object.getPrototypeOf(ContextBridge)).apply(this, arguments));\n }\n\n _createClass(ContextBridge, [{\n key: 'getChildContext',\n value: function getChildContext() {\n return {\n router: this.props.router,\n config: this.props.config\n };\n }\n }, {\n key: 'render',\n value: function render() {\n return this.props.children;\n }\n }]);\n\n return ContextBridge;\n}(React.Component);\n\nContextBridge.childContextTypes = {\n router: React.PropTypes.object,\n config: React.PropTypes.object\n};\n\nContextBridge.propTypes = {\n children: React.PropTypes.any,\n router: React.PropTypes.object,\n config: React.PropTypes.object\n};\n\n/**\n * Renderer for react component extensions for which other plugins can provide an implementing Component.\n */\n\nvar ExtensionRenderer = exports.ExtensionRenderer = function (_React$Component2) {\n _inherits(ExtensionRenderer, _React$Component2);\n\n function ExtensionRenderer() {\n _classCallCheck(this, ExtensionRenderer);\n\n // Initial state is empty. See the componentDidMount and render functions.\n var _this2 = _possibleConstructorReturn(this, (ExtensionRenderer.__proto__ || Object.getPrototypeOf(ExtensionRenderer)).call(this));\n\n _this2.state = { extensions: null };\n return _this2;\n }\n\n _createClass(ExtensionRenderer, [{\n key: 'componentWillMount',\n value: function componentWillMount() {\n this._setExtensions();\n }\n }, {\n key: 'componentDidMount',\n value: function componentDidMount() {\n ResourceLoadTracker.onMount(this.props.extensionPoint);\n this._renderAllExtensions();\n }\n }, {\n key: 'componentDidUpdate',\n value: function componentDidUpdate() {\n this._renderAllExtensions();\n }\n }, {\n key: 'componentWillUnmount',\n value: function componentWillUnmount() {\n this._unmountAllExtensions();\n ResourceLoadTracker.onUnmount(this.props.extensionPoint);\n }\n }, {\n key: '_setExtensions',\n value: function _setExtensions() {\n var _this3 = this;\n\n ExtensionStore.getExtensions(this.props.extensionPoint, this.props.filter, function (extensions) {\n return _this3.setState({ extensions: extensions });\n });\n }\n\n /**\n * This method renders the \"leaf node\" container divs, one for each registered extension, that live in the same\n * react hierarchy as the <ExtensionRenderer> instance itself. As far as our react is concerned, these are\n * childless divs that are never updated. Actually rendering the extensions themselves is done by\n * _renderAllExtensions.\n */\n\n }, {\n key: 'render',\n value: function render() {\n var extensions = this.state.extensions;\n if (!extensions) {\n return null; // this is called before extension data is available\n }\n\n // Add a
for each of the extensions. See the __renderAllExtensions function.\n var extensionDivs = [];\n for (var i = 0; i < extensions.length; i++) {\n extensionDivs.push(React.createElement('div', { key: i }));\n }\n return React.createElement(this.props.wrappingElement, null, extensionDivs);\n }\n\n /**\n * For each extension, we have created a \"leaf node\" element in the DOM. This method creates a new react hierarchy\n * for each, and instructs it to render. From that point on we have a separation that keeps the main app insulated\n * from any plugin issues that may cause react to throw while updating. Inspired by Nylas N1.\n */\n\n }, {\n key: '_renderAllExtensions',\n value: function _renderAllExtensions() {\n // NB: This needs to be a lot cleverer if the list of extensions for a specific point can change;\n // We will need to link each extension with its containing element, in some way that doesn't leak :) Easy in\n // browsers with WeakMap, less so otherwise.\n var el = ReactDOM.findDOMNode(this);\n if (el) {\n var children = el.children;\n if (children) {\n var extensions = this.state.extensions;\n\n // The number of children should be exactly the same as the number\n // of extensions. See the render function for where these are added.\n if (!extensions || extensions.length !== children.length) {\n console.error('Unexpected error in Jenkins ExtensionRenderer rendering (' + this.props.extensionPoint + '). Expecting a child DOM node for each extension point.');\n return;\n }\n // render each extension on the allocated child node.\n for (var i = 0; i < extensions.length; i++) {\n this._renderExtension(children[i], extensions[i]);\n }\n }\n }\n }\n\n /** Actually render an individual extension */\n\n }, {\n key: '_renderExtension',\n value: function _renderExtension(element, extension) {\n var component = React.createElement(extension, this.props);\n try {\n var contextValuesAsProps = {\n config: this.context.config,\n router: this.context.router\n };\n var bridgedComponent = React.createElement(ContextBridge, contextValuesAsProps, component);\n ReactDOM.render(bridgedComponent, element);\n } catch (e) {\n console.log(\"error rendering\", extension.name, e);\n\n var errorDiv = React.createElement(\n 'div',\n { className: 'error alien' },\n 'Error rendering ',\n extension.name,\n ': ',\n e.toString()\n );\n ReactDOM.render(errorDiv, element);\n }\n }\n\n /**\n * Clean up child extensions' react hierarchies. Necessary because they live in their own react hierarchies that\n * would otherwise not be notified when this is being unmounted.\n */\n\n }, {\n key: '_unmountAllExtensions',\n value: function _unmountAllExtensions() {\n var thisNode = ReactDOM.findDOMNode(this);\n var children = thisNode ? thisNode.children : null;\n if (children && children.length) {\n for (var i = 0; i < children.length; i++) {\n var child = children[i];\n try {\n if (child) {\n ReactDOM.unmountComponentAtNode(child);\n }\n } catch (err) {\n // Log and continue, don't want to stop unmounting children\n console.log(\"Error unmounting component\", child, err);\n }\n }\n }\n }\n }]);\n\n return ExtensionRenderer;\n}(React.Component);\n\nExtensionRenderer.defaultProps = {\n wrappingElement: \"div\"\n};\n\nExtensionRenderer.propTypes = {\n extensionPoint: React.PropTypes.string.isRequired,\n filter: React.PropTypes.any,\n wrappingElement: React.PropTypes.oneOfType([React.PropTypes.string, React.PropTypes.element])\n};\n\nExtensionRenderer.contextTypes = {\n router: React.PropTypes.object,\n config: React.PropTypes.object\n};\n},{\"./ExtensionStore.js\":46,\"./ResourceLoadTracker\":47,\"react\":494,\"react-dom\":305}],46:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * ExtensionStore is responsible for maintaining extension metadata\n * including type/capability info\n */\nvar ExtensionStore = exports.ExtensionStore = function () {\n function ExtensionStore() {\n _classCallCheck(this, ExtensionStore);\n }\n\n _createClass(ExtensionStore, [{\n key: 'init',\n\n /**\n * FIXME this is NOT a constructor, as there's no common way to\n * pass around a DI singleton at the moment across everything\n * that needs it (e.g. redux works for the app, not for other\n * things in this module).\n * \n * NOTE: this is currently called from `blueocean-web/src/main/js/init.jsx`\n * \n * Needs:\n * args = {\n * extensionDataProvider: callback => {\n * ... // get the data\n * callback(extensionData); // array of extensions\n * },\n * classMetadataStore: {\n * getClassMetadata(dataType, callback) => {\n * ... // get the data based on 'dataType'\n * callback(typeInfo);\n * }\n * }\n * }\n */\n value: function init(args) {\n // This data should come from /blue/js-extensions\n this.extensionDataProvider = args.extensionDataProvider;\n this.extensionPointList = undefined; // cache from extensionDataProvider...\n /**\n * The registered ExtensionPoint metadata + instance refs\n */\n this.extensionPoints = {};\n /**\n * Used to fetch type information\n */\n this.classMetadataStore = args.classMetadataStore;\n }\n\n /**\n * Register the extension script object\n */\n\n }, {\n key: '_registerComponentInstance',\n value: function _registerComponentInstance(extensionPointId, pluginId, component, instance) {\n var _this = this;\n\n var extensions = this.extensionPoints[extensionPointId];\n if (!extensions) {\n this._loadBundles(extensionPointId, function () {\n return _this._registerComponentInstance(extensionPointId, pluginId, component, instance);\n });\n return;\n }\n var extension = this._findPlugin(extensionPointId, pluginId, component);\n if (extension) {\n extension.instance = instance;\n return;\n }\n throw new Error('Unable to locate plugin for ' + extensionPointId + ' / ' + pluginId + ' / ' + component);\n }\n\n /**\n * Finds a plugin by extension point id, plugin id, component name\n */\n\n }, {\n key: '_findPlugin',\n value: function _findPlugin(extensionPointId, pluginId, component) {\n var extensions = this.extensionPoints[extensionPointId];\n if (extensions) {\n for (var i = 0; i < extensions.length; i++) {\n var extension = extensions[i];\n if (extension.pluginId == pluginId && extension.component == component) {\n return extension;\n }\n }\n }\n }\n\n /**\n * The primary function to use in order to get extensions,\n * will call the onload callback with a list of exported extension\n * objects (e.g. React classes or otherwise).\n */\n\n }, {\n key: 'getExtensions',\n value: function getExtensions(extensionPoint, filter, onload) {\n var _this2 = this;\n\n // Allow calls like: getExtensions('something', a => ...)\n if (arguments.length === 2 && typeof filter === 'function') {\n onload = filter;\n filter = undefined;\n }\n\n // And calls like: getExtensions(['a','b'], (a,b) => ...)\n if (extensionPoint instanceof Array) {\n var args = [];\n var nextArg = function nextArg(ext) {\n if (ext) args.push(ext);\n if (extensionPoint.length === 0) {\n onload.apply(undefined, args);\n } else {\n var arg = extensionPoint[0];\n extensionPoint = extensionPoint.slice(1);\n _this2.getExtensions(arg, filter, nextArg);\n }\n };\n nextArg();\n return;\n }\n\n this._loadBundles(extensionPoint, function (extensions) {\n return _this2._filterExtensions(extensions, filter, onload);\n });\n }\n }, {\n key: '_filterExtensions',\n value: function _filterExtensions(extensions, filters, onload) {\n if (extensions.length === 0) {\n onload(extensions); // no extensions to filter\n return;\n }\n\n if (filters) {\n // allow calls like: getExtensions('abcd', dataType(something), ext => ...)\n if (!filters.length) {\n filters = [filters];\n }\n var remaining = [].concat(filters);\n var nextFilter = function nextFilter(extensions) {\n if (remaining.length === 0) {\n // Map to instances and proceed\n onload(extensions.map(function (m) {\n return m.instance;\n }));\n } else {\n var filter = remaining[0];\n remaining = remaining.slice(1);\n filter(extensions, nextFilter);\n }\n };\n nextFilter(extensions);\n } else {\n // Map to instances and proceed\n onload(extensions.map(function (m) {\n return m.instance;\n }));\n }\n }\n\n /**\n * Fetch all the extension data\n */\n\n }, {\n key: '_loadExtensionData',\n value: function _loadExtensionData(oncomplete) {\n var _this3 = this;\n\n if (!this.extensionDataProvider) {\n throw new Error(\"Must call ExtensionStore.init({ extensionDataProvider: (cb) => ..., typeInfoProvider: (type, cb) => ... }) first\");\n }\n if (this.extensionPointList) {\n onconplete(this.extensionPointList);\n return;\n }\n this.extensionDataProvider(function (data) {\n // We clone the data because we add to it.\n _this3.extensionPointList = JSON.parse(JSON.stringify(data));\n for (var i1 = 0; i1 < _this3.extensionPointList.length; i1++) {\n var pluginMetadata = _this3.extensionPointList[i1];\n var extensions = pluginMetadata.extensions || [];\n\n for (var i2 = 0; i2 < extensions.length; i2++) {\n var extensionMetadata = extensions[i2];\n extensionMetadata.pluginId = pluginMetadata.hpiPluginId;\n var extensionPointMetadatas = _this3.extensionPoints[extensionMetadata.extensionPoint] = _this3.extensionPoints[extensionMetadata.extensionPoint] || [];\n extensionPointMetadatas.push(extensionMetadata);\n }\n }\n var ResourceLoadTracker = require('./ResourceLoadTracker').instance;\n ResourceLoadTracker.setExtensionPointMetadata(_this3.extensionPointList);\n if (oncomplete) oncomplete(_this3.extensionPointList);\n });\n }\n\n /**\n * Load the bundles for the given type\n */\n\n }, {\n key: '_loadBundles',\n value: function _loadBundles(extensionPointId, onload) {\n var _this4 = this;\n\n // Make sure this has been initialized first\n if (!this.extensionPointList) {\n this._loadExtensionData(function () {\n _this4._loadBundles(extensionPointId, onload);\n });\n return;\n }\n\n var extensionPointMetadatas = this.extensionPoints[extensionPointId];\n if (extensionPointMetadatas && extensionPointMetadatas.loaded) {\n onload(extensionPointMetadatas);\n return;\n }\n\n extensionPointMetadatas = this.extensionPoints[extensionPointId] = this.extensionPoints[extensionPointId] || [];\n\n var jsModules = require('@jenkins-cd/js-modules');\n var loadCountMonitor = new LoadCountMonitor();\n\n var loadPluginBundle = function loadPluginBundle(pluginMetadata) {\n loadCountMonitor.inc();\n\n // The plugin bundle for this plugin may already be in the process of loading (async extension\n // point rendering). If it's not, pluginMetadata.loadCountMonitors will not be undefined,\n // which means we can go ahead with the async loading. If it is, pluginMetadata.loadCountMonitors\n // is defined, we just add \"this\" loadCountMonitor to pluginMetadata.loadCountMonitors.\n // It will get called as soon as the script loading is complete.\n if (!pluginMetadata.loadCountMonitors) {\n pluginMetadata.loadCountMonitors = [];\n pluginMetadata.loadCountMonitors.push(loadCountMonitor);\n jsModules.importModule(pluginMetadata.hpiPluginId + ':jenkins-js-extension').onFulfilled(function () {\n pluginMetadata.bundleLoaded = true;\n for (var i = 0; i < pluginMetadata.loadCountMonitors.length; i++) {\n pluginMetadata.loadCountMonitors[i].dec();\n }\n delete pluginMetadata.loadCountMonitors;\n });\n } else {\n pluginMetadata.loadCountMonitors.push(loadCountMonitor);\n }\n };\n\n var checkLoading = function checkLoading() {\n if (loadCountMonitor.counter === 0) {\n extensionPointMetadatas.loaded = true;\n onload(extensionPointMetadatas);\n }\n };\n\n // Iterate over each plugin in extensionPointMetadata, async loading\n // the extension point .js bundle (if not already loaded) for each of the\n // plugins that implement the specified extensionPointId.\n for (var i1 = 0; i1 < this.extensionPointList.length; i1++) {\n\n var pluginMetadata = this.extensionPointList[i1];\n var extensions = pluginMetadata.extensions || [];\n\n for (var i2 = 0; i2 < extensions.length; i2++) {\n var extensionMetadata = extensions[i2];\n if (extensionMetadata.extensionPoint === extensionPointId) {\n // This plugin implements the ExtensionPoint.\n // If we haven't already loaded the extension point\n // bundle for this plugin, lets load it now.\n if (!pluginMetadata.bundleLoaded) {\n loadPluginBundle(pluginMetadata);\n }\n }\n }\n }\n\n // Listen to the inc/dec calls now that we've iterated\n // over all of the plugins.\n loadCountMonitor.onchange(function () {\n checkLoading();\n });\n\n // Call checkLoading immediately in case all plugin\n // bundles have been loaded already.\n checkLoading();\n }\n }]);\n\n return ExtensionStore;\n}();\n\n/**\n * Maintains load counts for components\n */\n\n\nvar LoadCountMonitor = function () {\n function LoadCountMonitor() {\n _classCallCheck(this, LoadCountMonitor);\n\n this.counter = 0;\n this.callback = undefined;\n }\n\n _createClass(LoadCountMonitor, [{\n key: 'inc',\n value: function inc() {\n this.counter++;\n if (this.callback) {\n this.callback();\n }\n }\n }, {\n key: 'dec',\n value: function dec() {\n this.counter--;\n if (this.callback) {\n this.callback();\n }\n }\n }, {\n key: 'onchange',\n value: function onchange(callback) {\n this.callback = callback;\n }\n }]);\n\n return LoadCountMonitor;\n}();\n\n// should figure out DI with singletons so we can move\n// required providers to other injection points, ideally\n\n\nvar instance = exports.instance = new ExtensionStore();\n},{\"./ResourceLoadTracker\":47,\"@jenkins-cd/js-modules\":51}],47:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.instance = exports.ResourceLoadTracker = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _jsModules = require('@jenkins-cd/js-modules');\n\nvar _jsModules2 = _interopRequireDefault(_jsModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * CSS load tracker.\n *

\n * Keeps track of page CSS, adding and removing CSS as ExtensionPoint components are\n * mounted and unmounted.\n */\nvar ResourceLoadTracker = exports.ResourceLoadTracker = function () {\n function ResourceLoadTracker() {\n _classCallCheck(this, ResourceLoadTracker);\n\n // The CSS resources to be added for each Extension point.\n // Key: Extension point name.\n // Value: An array of CSS adjunct URLs that need to be activated when the extension point is rendered.\n this.pointCSSs = {};\n\n // Active CSS.\n // Key: CSS URL.\n // Value: Counter of the number of mounted Extension Points that need the CSS to be active.\n // The onMount and onUnmount functions increment and decrement the counter. When the\n // counter gets back to zero, the CSS can be removed from the page.\n this.activeCSSs = {};\n }\n\n /**\n * Initialize the loader with the extension point information.\n * @param extensionPointList The Extension point list. An array containing ExtensionPoint\n * metadata for all plugins that define such. It's an aggregation of\n * of the /jenkins-js-extension.json files found on the server classpath.\n */\n\n\n _createClass(ResourceLoadTracker, [{\n key: 'setExtensionPointMetadata',\n value: function setExtensionPointMetadata(extensionPointList) {\n // Reset - for testing.\n this.pointCSSs = {};\n this.activeCSSs = {};\n\n // Iterate through each plugin /jenkins-js-extension.json\n for (var i1 = 0; i1 < extensionPointList.length; i1++) {\n var pluginMetadata = extensionPointList[i1];\n var extensions = pluginMetadata.extensions; // All the extensions defined on the plugin\n var pluginCSS = pluginMetadata.extensionCSS; // The plugin CSS URL (adjunct URL).\n\n // Iterate through the ExtensionPoints defined in each plugin\n for (var i2 = 0; i2 < extensions.length; i2++) {\n var extensionPoint = extensions[i2].extensionPoint; // The extension point name.\n var pointCSS = this.pointCSSs[extensionPoint]; // The current list of CSS URLs for the named extension point.\n\n if (!pointCSS) {\n pointCSS = [];\n this.pointCSSs[extensionPoint] = pointCSS;\n }\n\n // Add the plugin CSS if it's not already in the list.\n if (pointCSS.indexOf(pluginCSS) === -1) {\n pointCSS.push(pluginCSS);\n }\n }\n }\n }\n\n /**\n * Called when a Jenkins ExtensionPoint is mounted.\n *

\n * If the extension point implementations use CSS (comes from plugins that define CSS)\n * then this method will use requireCSS, and then addCSS, for each CSS. addCSS only\n * gets called for a CSS by the first extension point to \"require\" that CSS.\n *\n * @param extensionPointName The extension point name.\n */\n\n }, {\n key: 'onMount',\n value: function onMount(extensionPointName) {\n var pointCSS = this.pointCSSs[extensionPointName];\n if (pointCSS) {\n for (var i = 0; i < pointCSS.length; i++) {\n this._requireCSS(pointCSS[i]);\n }\n }\n }\n\n /**\n * Called when a Jenkins ExtensionPoint is unmounted.\n *

\n * If the extension point implementations use CSS (comes from plugins that define CSS)\n * then this method will use unrequireCSS, and then removeCSS, for each CSS. removeCSS only\n * gets called for a CSS by the last extension point to \"unrequire\" that CSS.\n *\n * @param extensionPointName The extension point name.\n */\n\n }, {\n key: 'onUnmount',\n value: function onUnmount(extensionPointName) {\n var pointCSS = this.pointCSSs[extensionPointName];\n if (pointCSS) {\n for (var i = 0; i < pointCSS.length; i++) {\n this._unrequireCSS(pointCSS[i]);\n }\n }\n }\n }, {\n key: '_requireCSS',\n value: function _requireCSS(url) {\n var activeCount = this.activeCSSs[url];\n\n if (!activeCount) {\n activeCount = 0;\n this._addCSS(url);\n }\n activeCount++;\n this.activeCSSs[url] = activeCount;\n }\n }, {\n key: '_unrequireCSS',\n value: function _unrequireCSS(url) {\n var activeCount = this.activeCSSs[url];\n\n if (!activeCount) {\n // Huh?\n console.warn('Unexpected call to deactivate an inactive Jenkins Extension Point CSS: ' + url);\n // Does this mean that react calls unmount multiple times for a given component instance?\n // That would sound like a bug, no?\n } else {\n activeCount--;\n if (activeCount === 0) {\n // All extension points using this CSS have been unmounted.\n delete this.activeCSSs[url];\n this._removeCSS(url);\n } else {\n this.activeCSSs[url] = activeCount;\n }\n }\n }\n }, {\n key: '_addCSS',\n value: function _addCSS(url) {\n var cssURLPrefix = _jsModules2.default.getAdjunctURL();\n _jsModules2.default.addCSSToPage(cssURLPrefix + '/' + url);\n }\n }, {\n key: '_removeCSS',\n value: function _removeCSS(url) {\n var cssURLPrefix = _jsModules2.default.getAdjunctURL();\n var cssURL = cssURLPrefix + '/' + url;\n var linkElId = _jsModules2.default.toCSSId(cssURL);\n var linkEl = document.getElementById(linkElId);\n\n if (linkEl) {\n linkEl.parentNode.removeChild(linkEl);\n }\n }\n }]);\n\n return ResourceLoadTracker;\n}();\n\n// in lieu of DI\n\n\nvar instance = exports.instance = new ResourceLoadTracker();\n},{\"@jenkins-cd/js-modules\":51}],48:[function(require,module,exports){\nexports.store = require('./dist/ExtensionStore.js').instance;\n\nexports.Renderer = require('./dist/ExtensionRenderer.js').ExtensionRenderer;\n\nexports.classMetadataStore = require('./dist/ClassMetadataStore.js').instance;\n\nexports.dataType = function dataType(dataType) { return exports.classMetadataStore.dataType(dataType); };\n\nexports.untyped = function untyped() { return exports.classMetadataStore.untyped(); };\n\nexports.isType = require('./dist/ComponentTypeFilter.js').isType;\n\nexports.componentType = require('./dist/ComponentTypeFilter.js').componentType;\n\nexports.init = function init(args) {\n exports.classMetadataStore.init(args.classMetadataProvider);\n exports.store.init({\n extensionDataProvider: args.extensionDataProvider,\n classMetadataStore: exports.classMetadataStore,\n });\n};\n},{\"./dist/ClassMetadataStore.js\":43,\"./dist/ComponentTypeFilter.js\":44,\"./dist/ExtensionRenderer.js\":45,\"./dist/ExtensionStore.js\":46}],49:[function(require,module,exports){\nvar Version = require('./Version');\n\nfunction ModuleSpec(qName) {\n var qNameTokens = qName.split(\":\");\n \n if (qNameTokens.length === 2) {\n var namespace = qNameTokens[0].trim();\n var nsTokens = namespace.split(\"/\");\n var namespaceProvider = undefined;\n if (nsTokens.length === 2) {\n namespaceProvider = nsTokens[0].trim();\n namespace = nsTokens[1].trim();\n if (namespaceProvider !== 'plugin' && namespaceProvider !== 'core-assets') {\n console.error('Unsupported module namespace provider \"' + namespaceProvider + '\". Setting to undefined.');\n namespaceProvider = undefined;\n }\n }\n \n var npmName = parseNPMName(qNameTokens[1].trim());\n \n this.nsProvider = namespaceProvider;\n this.namespace = namespace;\n this.moduleName = npmName.name;\n this.moduleVersion = npmName.version;\n } else {\n // The module/bundle is not in a namespace and doesn't\n // need to be loaded i.e. it will load itself and export.\n var npmName = parseNPMName(qNameTokens[0].trim());\n\n this.moduleName = npmName.name;\n this.moduleVersion = npmName.version;\n }\n\n // Attach version compatibility info\n var versions = [];\n \n if (this.moduleVersion) {\n var moduleVersionTokens = this.moduleVersion.split(/[,|]+/);\n\n for (var i = 0; i < moduleVersionTokens.length; i++) {\n var moduleVersionToken = moduleVersionTokens[i].trim();\n var parsedVersion = new Version(moduleVersionToken);\n versions.push(parsedVersion);\n }\n }\n \n this.moduleCompatVersions = versions;\n}\n\nModuleSpec.prototype.getLoadBundleVersion = function() {\n if (this.moduleCompatVersions.length === 0) {\n // If no versions were specified on the name, then we\n // just return undefined.\n return undefined;\n }\n // If a version is specified, we use the first \"specific\" version\n // e.g. \"1.1.2\" is specific while \"1.1.x\" and \"any\" are not.\n for (var i = 0; i < this.moduleCompatVersions.length; i++) {\n var version = this.moduleCompatVersions[i];\n if (version.isSpecific()) {\n return version;\n }\n }\n \n // If there's no specific version then we return the first\n // version in the list.\n return this.moduleCompatVersions[0];\n};\n\nModuleSpec.prototype.getLoadBundleName = function() {\n var version = this.getLoadBundleVersion();\n if (version) {\n return this.moduleName + '@' + version.raw;\n } else {\n return this.moduleName;\n }\n};\n\nModuleSpec.prototype.importAs = function() {\n if (this.moduleName.charAt(0) === '.') {\n return this.moduleName;\n }\n \n var version = this.getLoadBundleVersion();\n var importName = normalizePackageName(this.moduleName);\n var importNS = this.namespace;\n \n if (!importNS) {\n importNS = importName;\n }\n \n var importAs = importNS + ':' + importName;\n if (this.nsProvider) {\n importAs = this.nsProvider + '/' + importAs;\n }\n if (version) {\n importAs += '@' + version.raw;\n }\n \n return importAs;\n};\n\nModuleSpec.prototype.getLoadBundleFileNamePrefix = function() {\n var version = this.getLoadBundleVersion();\n var normalizedName = normalizePackageName(this.moduleName);\n if (version) {\n // If a version was specified then we only do the script load if a\n // specific version was provided i.e. loading does not get triggered\n // by imports that specify non-specific version numbers e.g. \"any\"\n // or \"1.2.x\". A specific version number would be e.g. \"1.2.3\" i.e.\n // fully qualified. When loading is not triggered, the import is depending\n // on another import (with a specific version) or on a bundle do an\n // export of an internal dependency i.e. on another bundle \"providing\"\n // the module be exporting it.\n if (version.isSpecific()) {\n return normalizedName + '-' + version.raw.replace(new RegExp('\\\\.', 'g'), '-');\n } else {\n return undefined;\n }\n } else {\n return normalizedName;\n }\n};\n\n/**\n * Normalize an NPM package name by removing all non alpha numerics and replacing\n * with hyphens.\n * @param packageName The NPM package name.\n * @returns The normalized NPM package name.\n */\nfunction normalizePackageName(packageName) {\n packageName = packageName.replace(/[^\\w.]/g, \"-\"); // replace non alphanumerics.\n if (packageName.charAt(0) === '-') {\n packageName = packageName.substring(1);\n }\n return packageName;\n};\n\nfunction parseNPMName(resourceName) {\n if (resourceName.length > 1) {\n var npmName = {};\n var orgSlashIndex = resourceName.indexOf('/');\n \n if (resourceName.charAt(0) === '@' && orgSlashIndex > 0) {\n // It's an NPM org package. Strip off the org and package\n // and add it to the name. We'll get the rest then and parse\n // that.\n npmName.name = resourceName.substring(0, orgSlashIndex + 1);\n \n // Remove the org part from the name and continue parsing.\n resourceName = resourceName.substring(orgSlashIndex + 1);\n } else {\n // Initialise it so we can append to it below.\n npmName.name = '';\n }\n \n var versionIndex = resourceName.indexOf('@');\n if (versionIndex > 0) {\n npmName.name += resourceName.substring(0, versionIndex);\n npmName.version = resourceName.substring(versionIndex + 1);\n } else {\n npmName.name += resourceName;\n }\n \n return npmName;\n } else {\n return {\n name: resourceName\n }\n }\n}\n\nmodule.exports = ModuleSpec;\n},{\"./Version\":50}],50:[function(require,module,exports){\nfunction Version(version) {\n this.raw = version;\n \n // The version string must start with a digit.\n // It's not an error for it not to start with a number e.g. it can\n // be \"any\" and we may introduce other aliases.\n if (!version || version.length === 0 || isNaN(version.charAt(0))) {\n return;\n }\n \n function normalizeToken(string) {\n // remove anything that's not a digit, a dot or an x.\n var normalized = string.replace(/[^\\d]/g, '');\n if (normalized === '') {\n return undefined;\n }\n return normalized;\n }\n \n var versionTokens = version.split('.');\n \n this.prerelease = undefined;\n \n var patchAndPrerelease = '';\n for (var i = 2; i < versionTokens.length; i++) {\n if (patchAndPrerelease.length > 0) {\n patchAndPrerelease += '.';\n }\n patchAndPrerelease += versionTokens[i];\n \n var separatorIdx = patchAndPrerelease.indexOf('-');\n if (separatorIdx !== -1) {\n this.patch = normalizeToken(patchAndPrerelease.substring(0, separatorIdx));\n this.prerelease = patchAndPrerelease.substring(separatorIdx + 1);\n } else {\n this.patch = normalizeToken(patchAndPrerelease);\n }\n }\n \n if (versionTokens.length >= 2) {\n this.minor = normalizeToken(versionTokens[1]);\n }\n if (versionTokens.length >= 1) {\n this.major = normalizeToken(versionTokens[0]);\n } \n}\n\nVersion.prototype.isSpecific = function() {\n return (this.major !== undefined && this.minor !== undefined && this.patch !== undefined);\n};\n\nmodule.exports = Version;\n},{}],51:[function(require,module,exports){\nvar internal = require(\"./internal\");\nvar promise = require(\"./promise\");\nvar ModuleSpec = require('./ModuleSpec');\nvar onRegisterTimeout;\nvar whoami;\n\n/**\n * What's the top level module/bundle name.\n * @param moduleQName The module QName.\n * @returns The module QName, or undefined if unknown.\n */\nexports.whoami = function(moduleQName) {\n if (moduleQName) {\n whoami = moduleQName;\n internal.whoami(whoami);\n }\n return whoami;\n};\n\n/**\n * Asynchronously import/require a set of modules.\n *\n *

\n * Responsible for triggering the async loading of modules if a given module is not already loaded.\n *\n * @param moduleQNames... A list of module \"qualified\" names, each containing the module name prefixed with the namespace\n * and separated by a colon i.e. \":\" e.g. \"jquery:jquery2\".\n *\n * @return A Promise, allowing async load of all modules. The promise is only fulfilled when all modules are loaded.\n */\nexports.importModule = function() {\n if (arguments.length === 1) {\n return internal.importModule(arguments[0], onRegisterTimeout); \n }\n \n var moduleQNames = []; \n for (var i = 0; i < arguments.length; i++) {\n var argument = arguments[i];\n if (typeof argument === 'string') {\n moduleQNames.push(argument);\n }\n }\n \n if (moduleQNames.length == 0) {\n throw new Error(\"No module names specified.\");\n }\n \n return promise.make(function (resolve, reject) {\n var fulfillments = [];\n \n function onFulfillment() {\n if (fulfillments.length === moduleQNames.length) {\n var modules = [];\n for (var i = 0; i < fulfillments.length; i++) {\n if (fulfillments[i].value) {\n modules.push(fulfillments[i].value);\n } else {\n // don't have everything yet so can't fulfill all.\n return;\n }\n }\n // If we make it here, then we have fulfilled all individual promises, which \n // means we can now fulfill the top level import promise.\n resolve(modules);\n }\n } \n \n // doRequire for each module\n for (var i = 0; i < moduleQNames.length; i++) { \n function doRequire(moduleQName) {\n var promise = internal.importModule(moduleQName, onRegisterTimeout);\n var fulfillment = {\n promise: promise,\n value: undefined\n };\n fulfillments.push(fulfillment);\n promise\n .onFulfilled(function(value) {\n fulfillment.value = value;\n onFulfillment();\n })\n .onRejected(function(error) {\n reject(error);\n });\n }\n doRequire(moduleQNames[i]);\n }\n }).applyArgsOnFulfill(); \n};\n\n/**\n * Synchronously \"require\" a module that it already loaded/registered.\n *\n *

\n * This function will throw an error if the module is not already loaded via an outer call to 'import'\n * (or 'import').\n *\n * @param moduleQName The module \"qualified\" name containing the module name prefixed with the namespace\n * separated by a colon i.e. \":\" e.g. \"jquery:jquery2\".\n *\n * @return The module.\n */\nexports.requireModule = function(moduleQName) {\n var parsedModuleName = new ModuleSpec(moduleQName);\n var module = internal.getModule(parsedModuleName); \n if (!module) {\n throw new Error(\"Unable to perform synchronous 'require' for module '\" + moduleQName + \"'. This module is not pre-loaded. \" +\n \"The module needs to have been asynchronously pre-loaded via an outer call to 'import'.\");\n }\n return module.exports;\n};\n\n/**\n * Export a module.\n * \n * @param namespace The namespace in which the module resides, or \"undefined\" if the modules is in\n * the \"global\" module namespace e.g. a Jenkins core bundle.\n * @param moduleName The name of the module. \n * @param module The CommonJS style module, or \"undefined\" if we just want to notify other modules waiting on\n * the loading of this module.\n * @param onError On error callback;\n */\nexports.exportModule = function(namespace, moduleName, module, onError) {\n try {\n var moduleQName = (namespace ? namespace + ':' : '') + moduleName;\n var moduleSpec = new ModuleSpec(moduleQName);\n var moduleNamespaceObj = internal.getModuleNamespaceObj(moduleSpec);\n var moduleLoadName = moduleSpec.getLoadBundleName();\n\n if (moduleNamespaceObj[moduleLoadName]) {\n if (namespace) {\n console.debug(\"Jenkins plugin module '\" + namespace + \":\" + moduleName + \"' already registered.\");\n } else {\n console.debug(\"Jenkins global module '\" + moduleName + \"' already registered.\");\n }\n return;\n }\n\n if (!module) {\n module = {\n exports: {}\n };\n } else if (module.exports === undefined) {\n module = {\n exports: module\n };\n }\n moduleNamespaceObj[moduleLoadName] = module;\n\n // Notify all that the module has been registered. See internal.loadModule also.\n internal.notifyModuleExported(moduleSpec, module.exports);\n } catch (e) {\n console.error(e);\n if (onError) {\n onError(e);\n }\n }\n};\n\n/**\n * Add a module's CSS to the browser page.\n * \n *

\n * The assumption is that the CSS can be accessed at e.g.\n * {@code /plugin//jsmodules//style.css} i.e.\n * the pluginId acts as the namespace.\n * \n * @param namespace The namespace in which the module resides.\n * @param moduleName The name of the module. \n * @param onError On error callback;\n */\nexports.addModuleCSSToPage = function(namespace, moduleName, onError) {\n try {\n internal.addModuleCSSToPage(namespace, moduleName);\n } catch (e) {\n console.error(e);\n if (onError) {\n onError(e);\n }\n }\n};\n\n/**\n * Add a plugin CSS file to the browser page.\n * \n * @param pluginName The Jenkins plugin in which the module resides.\n * @param cssPath The CSS path. \n * @param onError On error callback;\n */\nexports.addPluginCSSToPage = function(pluginName, cssPath, onError) {\n try {\n internal.addPluginCSSToPage(pluginName, cssPath);\n } catch (e) {\n console.error(e);\n if (onError) {\n onError(e);\n }\n }\n};\n\n/**\n * Create a js-modules CSS id that can be used to refer to a link element.\n * @param cssPath The CSS path/url.\n * @param namespace Optional namespace.\n */\nexports.toCSSId = function (cssPath, namespace) {\n return internal.toCSSId(cssPath, namespace);\n};\n\n/**\n * Add CSS file to the browser page.\n * \n * @param cssPath The CSS path. \n * @param onError On error callback;\n */\nexports.addCSSToPage = function(cssPath, onError) {\n try {\n if (cssPath.indexOf(internal.getAdjunctURL()) === 0) {\n internal.addCSSToPage(undefined, cssPath);\n } else {\n internal.addCSSToPage(undefined, internal.getRootURL() + '/' + cssPath);\n }\n } catch (e) {\n console.error(e);\n if (onError) {\n onError(e);\n }\n }\n};\n\n/**\n * Add a javascript <script> element to the document <head>.\n *

\n * Options:\n *

    \n *
  • scriptId: The script Id to use for the element. If not specified, one will be generated from the scriptSrc.
  • \n *
  • async: Asynchronous loading of the script. Default is 'true'.
  • \n *
  • success: An optional onload success function for the script element.
  • \n *
  • error: An optional onload error function for the script element. This is called if the .js file exists but there's an error evaluating the script. It is NOT called if the .js file doesn't exist (ala 404).
  • \n *
  • removeElementOnLoad: Remove the script element after loading the script. Default is 'false'.
  • \n *
\n * \n * @param scriptSrc The script src.\n * @param options Optional script load options object. See above.\n */\nexports.addScript = function(scriptSrc, options) {\n internal.addScript(scriptSrc, options);\n};\n\n/**\n * Set the module registration timeout i.e. the length of time to wait for a module to load before failing.\n *\n * @param timeout Millisecond duration before onRegister times out. Defaults to 10000 (10s) if not specified.\n */\nexports.setRegisterTimeout = function(timeout) {\n onRegisterTimeout = timeout;\n}\n\n/**\n * Set the Jenkins root/base URL.\n * \n * @param rootUrl The root/base URL.\n */\nexports.setRootURL = function(rootUrl) {\n internal.setRootURL(rootUrl);\n};\n\nexports.getRootURL = internal.getRootURL;\nexports.getAdjunctURL = internal.getAdjunctURL;\n\n/**\n * Manually initialise the Jenkins Global.\n *

\n * This should only ever be called from a test environment.\n */\nexports.initJenkinsGlobal = function() {\n internal.initJenkinsGlobal();\n};\n\ninternal.onJenkinsGlobalInit(function(jenkinsCIGlobal) {\n // For backward compatibility, we need to make some js-modules\n // functions globally available e.g. to allow legacy code wait for\n // certain modules to be loaded, as with legacy adjuncts.\n if (!jenkinsCIGlobal._internal) {\n // Put the functions on an object called '_internal' as a way\n // of hinting to people to not use it.\n jenkinsCIGlobal._internal = {\n importModule: exports.importModule,\n addScript: internal.addScript\n };\n }\n});\n},{\"./ModuleSpec\":49,\"./internal\":52,\"./promise\":53}],52:[function(require,module,exports){\nvar promise = require(\"./promise\");\nvar ModuleSpec = require('./ModuleSpec');\n\nvar jenkinsCIGlobal;\nvar globalInitListeners = [];\nvar whoami;\n\nexports.whoami = function(moduleQName) {\n if (moduleQName) {\n whoami = new ModuleSpec(moduleQName);\n whoami.nsProvider = getBundleNSProviderFromScriptElement(whoami.namespace, whoami.moduleName);\n }\n return whoami;\n};\n\nexports.onJenkinsGlobalInit = function(callback) {\n globalInitListeners.push(callback);\n};\n\nexports.initJenkinsGlobal = function() {\n jenkinsCIGlobal = {\n };\n if (globalInitListeners) {\n for (var i = 0; i < globalInitListeners.length; i++) {\n globalInitListeners[i](jenkinsCIGlobal);\n }\n }\n};\n\nexports.clearJenkinsGlobal = function() { \n jenkinsCIGlobal = undefined;\n whoami = undefined;\n};\n\nexports.getJenkins = function() {\n if (jenkinsCIGlobal) {\n return jenkinsCIGlobal;\n }\n if (window.jenkinsCIGlobal) {\n jenkinsCIGlobal = window.jenkinsCIGlobal;\n } else {\n exports.initJenkinsGlobal();\n jenkinsCIGlobal.rootURL = getRootURL();\n window.jenkinsCIGlobal = jenkinsCIGlobal;\n } \n return jenkinsCIGlobal;\n};\n\nexports.getModuleNamespaceObj = function(moduleSpec) {\n if (moduleSpec.namespace) {\n return exports.getNamespace(moduleSpec.namespace);\n } else {\n return exports.getGlobalModules();\n }\n};\n\nexports.getNamespace = function(namespaceName) {\n var namespaces = exports.getNamespaces();\n var namespace = namespaces[namespaceName];\n if (!namespace) {\n namespace = {\n globalNS: false \n };\n namespaces[namespaceName] = namespace;\n }\n return namespace;\n};\n\nexports.importModule = function(moduleQName, onRegisterTimeout) {\n return promise.make(function (resolve, reject) {\n var moduleSpec = new ModuleSpec(moduleQName);\n var module = exports.getModule(moduleSpec);\n\n if (module) {\n // module already loaded\n resolve(module.exports);\n } else {\n if (onRegisterTimeout === 0) {\n if (moduleSpec.namespace) {\n throw new Error('Module ' + moduleSpec.namespace + ':' + moduleSpec.moduleName + ' require failure. Async load mode disabled.');\n } else {\n throw new Error('Global module ' + moduleSpec.moduleName + ' require failure. Async load mode disabled.');\n }\n }\n\n // module not loaded. Load async, fulfilling promise once registered\n exports.loadModule(moduleSpec, onRegisterTimeout)\n .onFulfilled(function (moduleExports) {\n resolve(moduleExports);\n })\n .onRejected(function (error) {\n reject(error);\n });\n }\n }); \n};\n\nexports.loadModule = function(moduleSpec, onRegisterTimeout) {\n var module = exports.getModule(moduleSpec);\n \n if (module) {\n // Module already loaded. This prob shouldn't happen.\n console.log(\"Unexpected call to 'loadModule' for a module (\" + moduleSpec.moduleName + \") that's already loaded.\");\n return promise.make(function (resolve) {\n resolve(module.exports);\n });\n }\n\n function waitForRegistration(loadingModule, onRegisterTimeout) {\n return promise.make(function (resolve, reject) {\n if (typeof onRegisterTimeout !== \"number\") {\n onRegisterTimeout = 10000;\n }\n \n var timeoutObj = setTimeout(function () {\n // Timed out waiting on the module to load and register itself.\n if (!loadingModule.loaded) {\n var moduleSpec = loadingModule.moduleSpec;\n var errorDetail;\n \n if (moduleSpec.namespace) {\n errorDetail = \"Timed out waiting on module '\" + moduleSpec.namespace + \":\" + moduleSpec.moduleName + \"' to load.\";\n } else {\n errorDetail = \"Timed out waiting on module '\" + moduleSpec.moduleName + \"' to load.\";\n } \n console.error('Module load failure: ' + errorDetail);\n\n // Call the reject function and tell it we timed out\n reject({\n reason: 'timeout',\n detail: errorDetail\n });\n }\n }, onRegisterTimeout);\n \n loadingModule.waitList.push({\n resolve: resolve,\n timeoutObj: timeoutObj\n }); \n });\n }\n \n var moduleNamespaceObj = exports.getModuleNamespaceObj(moduleSpec);\n var loadModuleName = moduleSpec.getLoadBundleName();\n var loadVersion = moduleSpec.getLoadBundleVersion();\n var doScriptLoad = true;\n \n if (loadVersion) {\n // If a version was specified then we only do the script load if a\n // specific version was provided i.e. loading does not get triggered\n // by imports that specify non-specific version numbers e.g. \"any\"\n // or \"1.2.x\". A specific version number would be e.g. \"1.2.3\" i.e.\n // fully qualified. When loading is not triggered, the import is depending\n // on another import (with a specific version) or on another bundle to do an\n // export of an internal dependency i.e. on another bundle \"providing\"\n // the module by exporting it.\n doScriptLoad = loadVersion.isSpecific();\n }\n \n var loadingModule = getLoadingModule(moduleNamespaceObj, loadModuleName);\n if (!loadingModule.waitList) {\n loadingModule.waitList = [];\n }\n loadingModule.moduleSpec = moduleSpec; \n loadingModule.loaded = false;\n\n try {\n return waitForRegistration(loadingModule, onRegisterTimeout);\n } finally {\n if (doScriptLoad) {\n var scriptId = exports.toModuleId(moduleSpec.namespace, loadModuleName) + ':js';\n var scriptSrc = exports.toModuleSrc(moduleSpec, 'js');\n var scriptEl = exports.addScript(scriptSrc, {\n scriptId: scriptId,\n scriptSrcBase: ''\n });\n\n if (scriptEl) {\n // Set the module spec info on the