diff --git a/GitVersion.yml b/GitVersion.yml index dea097f8d..d296a4ce2 100644 --- a/GitVersion.yml +++ b/GitVersion.yml @@ -1,5 +1,5 @@ assembly-versioning-scheme: Major -next-version: 1.19 +next-version: 1.20 branches: release: tag: rc diff --git a/src/ServicePulse.Host.Tests/ApprovalFiles/APIApprovals.PlatformSampleApprovals.approved.txt b/src/ServicePulse.Host.Tests/ApprovalFiles/APIApprovals.PlatformSampleApprovals.approved.txt index 76600dd73..87aac507b 100644 --- a/src/ServicePulse.Host.Tests/ApprovalFiles/APIApprovals.PlatformSampleApprovals.approved.txt +++ b/src/ServicePulse.Host.Tests/ApprovalFiles/APIApprovals.PlatformSampleApprovals.approved.txt @@ -1,14 +1,6 @@ -;(function (window, angular, undefined) { 'use strict'; - - window.config = { - default_route: '/dashboard', - service_control_url: 'http://localhost:33333/api/', - monitoring_urls: ['http://localhost:33633/'] - }; - - angular.module('sc') - .constant('version', '1.2.0') - .constant('showPendingRetry', false) - .constant('scConfig', window.config); - -}(window, window.angular)); +window.defaultConfig = { + default_route: '/dashboard', + version: '1.2.0', + service_control_url: 'http://localhost:33333/api/', + monitoring_urls: ['http://localhost:33633/'] +}; diff --git a/src/ServicePulse.Host.Tests/ServicePulse.Host.Tests.csproj b/src/ServicePulse.Host.Tests/ServicePulse.Host.Tests.csproj index d7a07f38b..9c735cec4 100644 --- a/src/ServicePulse.Host.Tests/ServicePulse.Host.Tests.csproj +++ b/src/ServicePulse.Host.Tests/ServicePulse.Host.Tests.csproj @@ -13,6 +13,7 @@ + diff --git a/src/ServicePulse.Host.Tests/VerifyAppConstantsJSTextReplacement.cs b/src/ServicePulse.Host.Tests/VerifyAppConstantsJSTextReplacement.cs index 1c192e2fa..20162f1d0 100644 --- a/src/ServicePulse.Host.Tests/VerifyAppConstantsJSTextReplacement.cs +++ b/src/ServicePulse.Host.Tests/VerifyAppConstantsJSTextReplacement.cs @@ -1,13 +1,10 @@ -using System.Reflection; - -namespace ServicePulse.Host.Tests +namespace ServicePulse.Host.Tests { + using NUnit.Framework; using System; using System.Collections.Generic; using System.IO; - using System.Text.RegularExpressions; - using NUnit.Framework; [TestFixture] public class VerifyAppConstantsJSTextReplacement @@ -16,14 +13,14 @@ public class VerifyAppConstantsJSTextReplacement // this both user configurable and updated during installation Regex sc_url_regex = new Regex(@"(service_control_url\s*\:\s*['""])(.*?)(['""])"); - Regex version_regex = new Regex(@"(constant\s*\(\s*'version'\s*,\s*['""])(.*?)(['""])"); + Regex version_regex = new Regex(@"(version\s*\:\s*['""])(.*?)(['""])"); [Test] public void app_constants_js_validation() { var pathToConfig = Path.Combine(TestContext.CurrentContext.TestDirectory, "app.constants.js"); Assert.IsTrue(File.Exists(pathToConfig), "app.constants.js does not exist - this will break installation code"); - + var config = File.ReadAllText(pathToConfig); var matchUrl = sc_url_regex.Match(config); Assert.IsTrue(matchUrl.Success, "regex failed to match app.constant.js for SC URI update"); @@ -37,35 +34,71 @@ public void app_constants_js_validation() [Test] public void replace_version_regex_tests() { - var configSnippets = new Dictionary + var configSnippets = new Dictionary() { - {"1.3.0", @"angular.module('sc') - .constant('version', '1.3.0') - .constant('scConfig';"}, - {"1.3.0-beta1", @"angular.module('sc') - .constant ( 'version' , '1.3.0-beta1') - .constant('scConfig';"}, - {"", @"angular.module('sc') - .constant('version' , '' ) - .constant('scConfig';"} + { + "1.3.0", + ( + ConfigSnippet: @"angular.module('sc') + .constant('version', '1.3.0') + .constant('scConfig';", + VersionRegex: new Regex(@"(constant\s*\(\s*'version'\s*,\s*['""])(.*?)(['""])") + ) + }, + { + "1.3.0-beta1", + ( + ConfigSnippet: @"angular.module('sc') + .constant ( 'version' , '1.3.0-beta1') + .constant('scConfig';", + VersionRegex: new Regex(@"(constant\s*\(\s*'version'\s*,\s*['""])(.*?)(['""])") + ) + }, + { + "", + ( + ConfigSnippet: @"angular.module('sc') + .constant('version' , '' ) + .constant('scConfig';", + VersionRegex: new Regex(@"(constant\s*\(\s*'version'\s*,\s*['""])(.*?)(['""])") + ) + }, + { + "1.20.0", + ( + ConfigSnippet: @"window.defaultConfig = { + version: '1.20.0', + service_control_url: ' + };", + VersionRegex: new Regex(@"(version\s*\:\s*['""])(.*?)(['""])") + ) + }, }; foreach (var config in configSnippets) { var expectedResult = config.Key; - var text = config.Value; + var text = config.Value.ConfigSnippet; - var match = version_regex.Match(text); + var match = config.Value.VersionRegex.Match(text); Assert.IsTrue(match.Success, "regex failed to match version string"); Assert.IsTrue(match.Groups[2].Value.Equals(expectedResult), string.Format("Version regex did not return expected value which was {0}", expectedResult)); } } - + [Test] - public void test_regex_match_against_config_variants () + public void test_regex_match_against_config_variants() { var configVariations = new[] { + // Standard 1.20.0 config + @"window.defaultConfig = { + default_route: '/dashboard', + version: '1.20.0', + service_control_url: 'http://localhost:33333/api/', + monitoring_urls: ['http://localhost:33633/'] + }; + ", // Standard 1.3 config @"angular.module('sc') .constant('version', '1.3.0') diff --git a/src/ServicePulse.Host.Tests/karma.conf.js b/src/ServicePulse.Host.Tests/karma.conf.js index 3b7ba3376..16e95eb80 100644 --- a/src/ServicePulse.Host.Tests/karma.conf.js +++ b/src/ServicePulse.Host.Tests/karma.conf.js @@ -4,17 +4,21 @@ module.exports = function(config) { browsers: ['PhantomJS', 'PhantomJS_custom', 'Chrome'], basePath: '../ServicePulse.Host/app', files: [ - './modules/dist/shell.dist.js', - '../../ServicePulse.Host.Tests/tests/js/angular-mocks.js', - './js/app.js', + './modules/dist/shell.dist.js', + '../../ServicePulse.Host.Tests/tests/js/angular-mocks.js', './js/**/*.html', './js/app.constants.js', + './modules/dist/configuration.dist.js', + './js/app.js', + './js/app.bootstrap.js', './js/**/*.module.js', './js/**/*.tabset.js', - './js/**/*.js', - './modules/dist/configuration.dist.js', - './modules/dist/monitoring.dist.js', - '../../ServicePulse.Host.Tests/tests/**/*.spec.js'], + './js/directives/**/*.js', + './js/polyfill/**/*.js', + './js/services/**/*.js', + './js/views/**/*.js', + './modules/dist/monitoring.dist.js', + '../../ServicePulse.Host.Tests/tests/**/*.spec.js'], frameworks: ['jasmine'], // you can define custom flags customLaunchers: { @@ -36,12 +40,12 @@ module.exports = function(config) { }, proxies: { - '/js/views/dashboard/dashboard.html': '/base/js/views/dashboard/dashboard.html' + '/js/views/dashboard/dashboard.html': '/base/js/views/dashboard/dashboard.html' }, phantomjsLauncher: { // Have phantomjs exit if a ResourceError is encountered (useful if karma exits without killing phantom) exitOnResourceError: true - } + } }) } \ No newline at end of file diff --git a/src/ServicePulse.Host.Tests/package.json b/src/ServicePulse.Host.Tests/package.json index 764d0400c..b6bb982aa 100644 --- a/src/ServicePulse.Host.Tests/package.json +++ b/src/ServicePulse.Host.Tests/package.json @@ -1,9 +1,7 @@ { "name": "ServicePulse.Host.Tests", "version": "1.0.0", - "dependencies": { - - }, + "dependencies": {}, "devDependencies": { "karma-chrome-launcher": "^2.2.0", "karma-firefox-launcher": "^1.1.0", diff --git a/src/ServicePulse.Host.Tests/tests/js/services/services.monitoring.spec.js b/src/ServicePulse.Host.Tests/tests/js/services/services.monitoring.spec.js index 8af317602..573ec8205 100644 --- a/src/ServicePulse.Host.Tests/tests/js/services/services.monitoring.spec.js +++ b/src/ServicePulse.Host.Tests/tests/js/services/services.monitoring.spec.js @@ -22,14 +22,14 @@ var monitoringService, $httpBackend, scConfig; - beforeEach(inject(function (_monitoringService_, _$httpBackend_, _scConfig_) { + beforeEach(inject(function (_monitoringService_, _$httpBackend_) { monitoringService = _monitoringService_; $httpBackend = _$httpBackend_; - scConfig = _scConfig_; + scConfig = window.defaultConfig; })); it('should push endpoints retrieved from monitoring server', function (done) { - scConfig.monitoring_urls = ['http://localhost:33633/']; + window.defaultConfig.monitoring_urls = ['http://localhost:33633/']; $httpBackend.whenGET('http://localhost:33633/monitored-endpoints?history=5').respond(monitoredEndpointWithData); @@ -37,7 +37,7 @@ var subscription = monitoringService.createEndpointsSource(5).subscribe(function (response) { monitoredEndpoints.push(response); - if (monitoredEndpoints.length == 2) { + if (monitoredEndpoints.length === 2) { expect(monitoredEndpoints[0].name).toEqual("Samples.Metrics.Tracing.Endpoint1"); expect(monitoredEndpoints[0].data.timestamps).toEqual([]); expect(monitoredEndpoints[0].data.criticalTime).toEqual([]); @@ -56,26 +56,4 @@ $httpBackend.flush(); }, 0); }); - - it('should push endpoints retrieved from multiple monitoring servers', function (done) { - $httpBackend.whenGET('http://localhost:1234/monitored-endpoints?history=5').respond(monitoredEndpointWithData); - $httpBackend.whenGET('http://localhost:5678/monitored-endpoints?history=5').respond(monitoredEndpointWithData); - - scConfig.monitoring_urls = ['http://localhost:1234/', 'http://localhost:5678/']; - - var monitoredEndpoints = []; - var subscription = monitoringService.createEndpointsSource(5).subscribe(function (response) { - monitoredEndpoints.push(response); - - if (monitoredEndpoints.length == 4) { - expect(monitoredEndpoints.length).toEqual(4); - subscription.dispose(); - done(); - } - }); - - setTimeout(function () { - $httpBackend.flush(); - }, 0); - }); }); \ No newline at end of file diff --git a/src/ServicePulse.Host.Tests/tests/js/services/services.spec.js b/src/ServicePulse.Host.Tests/tests/js/services/services.spec.js index 5aa46fca1..214d8c523 100644 --- a/src/ServicePulse.Host.Tests/tests/js/services/services.spec.js +++ b/src/ServicePulse.Host.Tests/tests/js/services/services.spec.js @@ -3,7 +3,7 @@ describe("Unit: Uri Service ", function() { it('should load angular', function() { - expect(typeof (angular) == typeof (undefined)).toEqual(false); + expect(typeof (angular) === typeof (undefined)).toEqual(false); }); describe("Uri Joins:", function() { @@ -12,7 +12,7 @@ describe("Unit: Uri Service ", function() { it('should contain a uri service', inject(function(uri) { - expect(typeof (uri) == typeof(undefined)).toEqual(false); + expect(typeof (uri) === typeof(undefined)).toEqual(false); })); it('should prevent double slashes for leading and trailing slashes', inject(function (uri) { @@ -25,39 +25,39 @@ describe("Unit: Uri Service ", function() { expect(url).toEqual('http://localhost:33333/api/eventlogitems'); })); - it('should make a url for get Failed Messages For Exception Group', inject(function (uri, scConfig) { + it('should make a url for get Failed Messages For Exception Group', inject(function (uri) { var groupId = '85147b12-458c-431d-a389-35ea53abc9e1'; var page = 1; var sortBy = 'time_of_failure'; - var url = uri.join(scConfig.service_control_url, 'recoverability', 'groups', groupId, 'errors?page=' + page + '&sort=' + sortBy + '&status=unresolved'); + var url = uri.join(window.defaultConfig.service_control_url, 'recoverability', 'groups', groupId, 'errors?page=' + page + '&sort=' + sortBy + '&status=unresolved'); expect(url).toEqual('http://localhost:33333/api/recoverability/groups/85147b12-458c-431d-a389-35ea53abc9e1/errors?page=1&sort=time_of_failure&status=unresolved'); })); - it('should make a url for get Failed Messages For Exception Group', inject(function (uri, scConfig) { + it('should make a url for get Failed Messages For Exception Group', inject(function (uri) { var messageId = '85147b12-458c-431d-a389-35ea53abc9e1'; - var url = uri.join(scConfig.service_control_url, 'messages', messageId, 'body'); + var url = uri.join(window.defaultConfig.service_control_url, 'messages', messageId, 'body'); expect(url).toEqual('http://localhost:33333/api/messages/85147b12-458c-431d-a389-35ea53abc9e1/body'); })); - it('should make a url for getMessageBody', inject(function (uri, scConfig) { + it('should make a url for getMessageBody', inject(function (uri) { var messageId = '85147b12-458c-431d-a389-35ea53abc9e1'; - var url = uri.join(scConfig.service_control_url, 'messages', messageId, 'body'); + var url = uri.join(window.defaultConfig.service_control_url, 'messages', messageId, 'body'); expect(url).toEqual('http://localhost:33333/api/messages/85147b12-458c-431d-a389-35ea53abc9e1/body'); })); - it('should make a url for getMessageHeaders', inject(function (uri, scConfig) { + it('should make a url for getMessageHeaders', inject(function (uri) { var messageId = '85147b12-458c-431d-a389-35ea53abc9e1'; - var url = uri.join(scConfig.service_control_url, 'messages', 'search', messageId); + var url = uri.join(window.defaultConfig.service_control_url, 'messages', 'search', messageId); expect(url).toEqual('http://localhost:33333/api/messages/search/85147b12-458c-431d-a389-35ea53abc9e1'); })); - it('should make a url for getTotalFailedMessages', inject(function (uri, scConfig) { - var url = uri.join(scConfig.service_control_url, 'errors?status=unresolved'); + it('should make a url for getTotalFailedMessages', inject(function (uri) { + var url = uri.join(window.defaultConfig.service_control_url, 'errors?status=unresolved'); expect(url).toEqual('http://localhost:33333/api/errors?status=unresolved'); })); - it('should make a url for retry errors', inject(function (uri, scConfig) { - var url = uri.join(scConfig.service_control_url, 'errors', 'retry'); + it('should make a url for retry errors', inject(function (uri) { + var url = uri.join(window.defaultConfig.service_control_url, 'errors', 'retry'); expect(url).toEqual('http://localhost:33333/api/errors/retry'); })); diff --git a/src/ServicePulse.Host/Commands/ExtractAndUpdateConstantsCommand.cs b/src/ServicePulse.Host/Commands/ExtractAndUpdateConstantsCommand.cs index e850ffb55..86bd35daf 100644 --- a/src/ServicePulse.Host/Commands/ExtractAndUpdateConstantsCommand.cs +++ b/src/ServicePulse.Host/Commands/ExtractAndUpdateConstantsCommand.cs @@ -59,7 +59,7 @@ public static void UpdateVersion(string directoryPath) { var appJsPath = Path.Combine(directoryPath, "js/app.constants.js"); var appJsCode = File.ReadAllText(appJsPath); - var updatedContent = Regex.Replace(appJsCode, @"(constant\(\s*'version'\s*,\s*')(.*?)(')", "${1}" + GetFileVersion() + "$3"); + var updatedContent = Regex.Replace(appJsCode, @"(version\s*\:\s*['""])(.*?)(['""])", "${1}" + GetFileVersion() + "$3"); File.WriteAllText(appJsPath, updatedContent); } @@ -79,4 +79,4 @@ static string GetFileVersion() return typeof(AbstractCommand).Assembly.GetName().Version.ToString(4); } } -} \ No newline at end of file +} diff --git a/src/ServicePulse.Host/ServicePulse.Host.csproj b/src/ServicePulse.Host/ServicePulse.Host.csproj index c6115c258..4f1dded06 100644 --- a/src/ServicePulse.Host/ServicePulse.Host.csproj +++ b/src/ServicePulse.Host/ServicePulse.Host.csproj @@ -15,6 +15,12 @@ + + + + + + diff --git a/src/ServicePulse.Host/app/css/particular.css b/src/ServicePulse.Host/app/css/particular.css index 5105a68ef..dd0eae90d 100644 --- a/src/ServicePulse.Host/app/css/particular.css +++ b/src/ServicePulse.Host/app/css/particular.css @@ -40,6 +40,10 @@ a { margin-left: 4px; } +.navbar-nav > li > a > span.no-margin { + margin: 0; +} + .navbar-toggle { margin-top: 13px; } @@ -545,6 +549,16 @@ h6 { text-decoration: none; } + .tabs h5.disabled > a { + color: #aaa; + cursor: default; + text-decoration: none; + } + + .tabs h5.disabled > a:hover { + cursor: not-allowed; + } + .system-status:hover { background-color: #fff; border-color: #eee !important; @@ -1849,9 +1863,22 @@ hr.top-separator { padding-right: 0; } +.btn-default { + padding: 8px 16px; +} + +.btn.btn-default.disabled { + opacity: 0.4; +} + +.btn.btn-default.disabled:hover { + border-color: #00A3C4; +} + .btn-primary { background-color: #00A3C4; border-color: #0686AA; + color: #fff; } .btn-primary:hover { @@ -1865,7 +1892,7 @@ hr.top-separator { } .btn-secondary { - background-color: transparent; + background-color: #fff; color: #00A3C4; border-color: #00A3C4; } @@ -1873,6 +1900,12 @@ hr.top-separator { .btn-secondary:hover { color: #00A3C4; border-color: #00A3C4; + background-color: #fff; + opacity: 0.7; +} + +.btn-secondary.disabled { + border-color: #00A3C4; } .table-head-row { @@ -2419,6 +2452,12 @@ div.alert.alert-warning strong { } } +@media (max-width: 1439px) and screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + nav.navbar { + margin-top: 0; + } +} + @media (max-width: 1550px) { footer { @@ -2428,10 +2467,6 @@ div.alert.alert-warning strong { } -#toast-container > div.toast-warning { - -} - .license-warning, .license-warning h5 { color: black; @@ -2442,12 +2477,6 @@ div.alert.alert-warning strong { background: black; } -btn-license-warning-light { - border: black; - color: black; - background: #f89406; -} - span.fa-exclamation-triangle.warning { color: #F3BC52; background: linear-gradient(black,black) center/20% 72% no-repeat; @@ -2497,6 +2526,12 @@ span.fa-exclamation-triangle.danger { padding: 24px 24px 24px 56px; } +#toast-container > div:hover { + box-shadow: 0 0 12px #999999; + opacity: 0.8; + cursor: default; +} + .toast-close-button { right: -10px; top: -16px; @@ -2504,14 +2539,14 @@ span.fa-exclamation-triangle.danger { #toast-container > .toast-error { background-image: url('../img/toast-danger.svg') !important; - background-position-y: 22px; + background-position-y: 30px; background-size: 28px 28px; } #toast-container > .toast-warning { background-color: #F3BC52; background-image: url('../img/toast-warning.svg') !important; - background-position-y: 22px; + background-position-y: 30px; background-size: 28px 28px; } @@ -2524,8 +2559,16 @@ span.fa-exclamation-triangle.danger { color: #F3BC52; } -.toast-message a.btn.btn-license-warning:hover { - opacity: 0.75; +.toast-message a.btn.btn-license-warning:hover, .toast-error a.btn.btn-default:hover { + opacity: 0.85; +} + +.toast-error a.btn.btn-default { + color: #bd362f; + padding-right: 20px; + padding-left: 20px; + border: none; + margin-top: 16px; } .toast-message a.btn.btn-license-warning-light { @@ -2608,4 +2651,97 @@ span.fa-exclamation-triangle.danger { div[content="Unable to connect to instance"], div[content="Unable to connect to monitoring server"] { z-index: 99999; +} + +.rotate { + -webkit-animation: glyphicon-spin-r 2s infinite linear; + animation: glyphicon-spin-r 2s infinite linear; +} + +@-webkit-keyframes glyphicon-spin-r { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} + +@keyframes glyphicon-spin-r { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} + +section[name="connections"] .box { + padding-bottom: 50px; +} + +form .connection h3 { + margin-bottom: 16px; +} + +form .connection .form-group { + padding-left: 0; +} + +.connection:nth-child(2) h3 { + margin-top: 40px; +} + +form .connection .form-group input { + font-size: 16px; + height: 44px; +} + +button[ng-click="vm.save()"] { + padding-right: 24px; + padding-left: 24px; + margin-top: 30px; +} + +span.connection-test { + position: relative; + top: 14px; + left: 10px; + text-transform: uppercase; + font-weight: bold; +} + +span.failed-validation { + text-transform: uppercase; + font-weight: bold; + margin-left: 10px; +} + +span.connection-successful, span.connection-successful i { + color: #00C468 !important; +} + +span.connection-failed, span.connection-failed i, .failed-validation, .failed-validation i { + color: #CE4844 !important; +} + +.form-control:focus { + border-color: #00a3c4; + box-shadow: 0 0 2px rgb(0, 163, 196); +} + +span.auxilliary-label { + color: #aaa; +} + +.btn-connection-test { + margin-top: 25px; + padding-top: 11px; + padding-bottom: 11px; } \ No newline at end of file diff --git a/src/ServicePulse.Host/app/index.html b/src/ServicePulse.Host/app/index.html index 97e9013b0..501862062 100644 --- a/src/ServicePulse.Host/app/index.html +++ b/src/ServicePulse.Host/app/index.html @@ -48,7 +48,7 @@

Warning!

- +
@@ -57,21 +57,10 @@

Warning!

-
-
-

Cannot connect to ServiceControl

-

- ServicePulse is unable to connect to the ServiceControl instance. Please ensure that ServiceControl is running and accesible from your machine. -

- -
-
-
+
- + @@ -151,6 +140,8 @@

Cannot connect to ServiceControl

} + + @@ -159,7 +150,6 @@

Cannot connect to ServiceControl

- diff --git a/src/ServicePulse.Host/app/js/app.bootstrap.js b/src/ServicePulse.Host/app/js/app.bootstrap.js index f7dc7a7d4..6e75cccef 100644 --- a/src/ServicePulse.Host/app/js/app.bootstrap.js +++ b/src/ServicePulse.Host/app/js/app.bootstrap.js @@ -5,17 +5,23 @@ var injector = angular.injector(['ng']); var $http = injector.get('$http'); - var scConfig = window.config; - $http.get(scConfig.service_control_url + '/license').then(function (response) { + var scUrl = window.connectionsManager.getServiceControlUrl(); + console.debug('Retrieving license from ServiceControl at: ', scUrl); + + $http.get(scUrl + '/license').then(function (response) { + serviceControlApp.constant('license', response.data); + }, function () { + + serviceControlApp.constant('license', { 'license_status': 'Unavailable' }); + + }).then(function () { + angular.element(document).ready(function () { angular.bootstrap(document, ['sc']); }); - }, function () { - window.document.getElementById('cantConnectMessage').style.display = 'block'; - window.document.getElementById('connectingToServiceControl').style.display = 'none'; - window.document.getElementById('serviceControlUrl').innerHTML = ' hosted at ' + scConfig.service_control_url + ''; + }); -}(window, window.angular, window.jQuery)); \ No newline at end of file +}(window, window.angular, window.jQuery)); diff --git a/src/ServicePulse.Host/app/js/app.constants.js b/src/ServicePulse.Host/app/js/app.constants.js index 76600dd73..87aac507b 100644 --- a/src/ServicePulse.Host/app/js/app.constants.js +++ b/src/ServicePulse.Host/app/js/app.constants.js @@ -1,14 +1,6 @@ -;(function (window, angular, undefined) { 'use strict'; - - window.config = { - default_route: '/dashboard', - service_control_url: 'http://localhost:33333/api/', - monitoring_urls: ['http://localhost:33633/'] - }; - - angular.module('sc') - .constant('version', '1.2.0') - .constant('showPendingRetry', false) - .constant('scConfig', window.config); - -}(window, window.angular)); +window.defaultConfig = { + default_route: '/dashboard', + version: '1.2.0', + service_control_url: 'http://localhost:33333/api/', + monitoring_urls: ['http://localhost:33633/'] +}; diff --git a/src/ServicePulse.Host/app/js/app.controller.js b/src/ServicePulse.Host/app/js/app.controller.js index 7f5c24cd7..76cc65764 100644 --- a/src/ServicePulse.Host/app/js/app.controller.js +++ b/src/ServicePulse.Host/app/js/app.controller.js @@ -15,25 +15,43 @@ signalRListener, notifyService, semverService, - scConfig, + connectionsManager, uriService, reindexingChecker, licenseNotifierService, licenseService, - license + license, + $route ) { - $scope.isMonitoringEnabled = scConfig.monitoring_urls && scConfig.monitoring_urls.reduce(function (currentlyEnabled, url) { - return currentlyEnabled || url; - }, false); + var notifier = notifyService(); + + var mu = connectionsManager.getMonitoringUrl(); + var scu = connectionsManager.getServiceControlUrl(); + + $scope.isMonitoringEnabled = connectionsManager.getIsMonitoringEnabled(); $scope.loadingInitialData = true; - $scope.isRecoverabilityEnabled = scConfig.service_control_url; + $scope.scConnectedAtLeastOnce = false; + $scope.isRecoverabilityEnabled = scu !== null && scu !== undefined; + $scope.serviceControlUrl = scu; $scope.SCVersion = ''; $scope.is_compatible_with_sc = true; $scope.Version = version; $scope.isSCConnecting = true; + $scope.$on('$locationChangeStart', function(event, next, current) { + if (!$scope.isSCConnected && !$scope.scConnectedAtLeastOnce) { + var routeData = $route.routes[$location.path()].data; + + if (routeData && routeData.redirectWhenNotConnected) { + $log.debug('not connected, and never connected once. Current route is a configuration route that requires redirect to: ', routeData.redirectWhenNotConnected); + event.preventDefault(); + $location.path(routeData.redirectWhenNotConnected); + } + } + }); + setTimeout(function () { // This delay needs to be here for the toastr service to be ready. licenseNotifierService.warnOfLicenseProblem(license.license_status); @@ -98,7 +116,21 @@ $log.debug(data); } - var notifier = notifyService(); + notifier.subscribe($scope, function(event, data) { + if (connectionsManager.getIsMonitoringEnabled()) { + if ((data.status.isSCConnected || data.status.isSCConnecting) && (data.status.isMonitoringConnected || data.status.isMonitoringConnecting || data.status.isMonitoringConnecting === undefined)) { + $scope.connectionswarning = undefined; + } else if (!data.status.isSCConnected || !data.status.isMonitoringConnected) { + $scope.connectionswarning = 'danger'; + } + } else { + if (data.status.isSCConnected || data.status.isSCConnecting) { + $scope.connectionswarning = undefined; + } else if (!data.status.isSCConnected) { + $scope.connectionswarning = 'danger'; + } + } + }, 'ConnectionsStatusChanged'); notifier.subscribe($scope, customChecksUpdated, 'CustomChecksUpdated'); notifier.subscribe($scope, messageFailuresUpdated, 'MessageFailuresUpdated'); @@ -139,28 +171,49 @@ logit(event, data); switch(data) { + case 'SignalR starting': + $scope.isSCConnected = false; + $scope.isSCConnecting = true; + break; case 'SignalR started': $scope.isSCConnected = true; $scope.isSCConnecting = false; + $scope.scConnectedAtLeastOnce = true; break; case 'Reconnected': $scope.isSCConnected = true; $scope.isSCConnecting = false; + $scope.scConnectedAtLeastOnce = true; + + if ($scope.signalRConnectionErrorToast) { + toastService.clear($scope.signalRConnectionErrorToast); + $scope.signalRConnectionErrorToast = undefined; + } break; default: toastService.showWarning(data); break; } + + notifier.notify('ServiceControlConnectionStatusChanged', { + isSCConnected : $scope.isSCConnected, + isSCConnecting: $scope.isSCConnecting, + scConnectedAtLeastOnce: $scope.scConnectedAtLeastOnce + }); }, 'SignalREvent'); notifier.subscribe($scope, function(event, data) { logit(event, data); - if ($scope.isSCConnected) { - toastService.showError(data); - } + $scope.isSCConnected = false; $scope.isSCConnecting = false; + + notifier.notify('ServiceControlConnectionStatusChanged', { + isSCConnected : $scope.isSCConnected, + isSCConnecting : $scope.isSCConnecting, + scConnectedAtLeastOnce : $scope.scConnectedAtLeastOnce + }); }, 'SignalRError'); notifier.subscribe($scope, function(event, data) { @@ -193,7 +246,7 @@ }, 'reindexing'); // signalR Listener - var listener = signalRListener(uriService.join(scConfig.service_control_url, 'messagestream')); + var listener = signalRListener(uriService.join(scu, 'messagestream')); listener.subscribe($scope, function(message) { notifier.notify('SignalREvent', message); @@ -311,12 +364,13 @@ 'signalRListener', 'notifyService', 'semverService', - 'scConfig', + 'connectionsManager', 'uri', 'reindexingChecker', 'licenseNotifierService', 'licenseService', 'license', + '$route' ]; angular.module('sc').controller('AppCtrl', controller); diff --git a/src/ServicePulse.Host/app/js/app.js b/src/ServicePulse.Host/app/js/app.js index 2a5987989..eab61c582 100644 --- a/src/ServicePulse.Host/app/js/app.js +++ b/src/ServicePulse.Host/app/js/app.js @@ -36,7 +36,11 @@ $rootScope.$log = $log; }]); - angular.module('sc').value('$jquery', $); + angular.module('sc') + .value('$jquery', $) + .constant('version', window.defaultConfig.version) + .constant('showPendingRetry', false) + .constant('scConfig', window.defaultConfig); angular.module('sc').config(['$locationProvider', function ($locationProvider) { $locationProvider.hashPrefix(''); diff --git a/src/ServicePulse.Host/app/js/app.route.js b/src/ServicePulse.Host/app/js/app.route.js index 0519cef58..ec4dc4e75 100644 --- a/src/ServicePulse.Host/app/js/app.route.js +++ b/src/ServicePulse.Host/app/js/app.route.js @@ -1,13 +1,12 @@ ; (function (window, angular, undefined) { 'use strict'; - function routeProvider($routeProvider, scConfig) { - $routeProvider.otherwise({ redirectTo: scConfig.default_route }); + function routeProvider($routeProvider) { + $routeProvider.otherwise({ redirectTo: window.defaultConfig.default_route }); } routeProvider.$inject = [ - '$routeProvider', - 'scConfig' + '$routeProvider' ]; angular.module('sc') diff --git a/src/ServicePulse.Host/app/js/directives/ui.particular.exclamation.js b/src/ServicePulse.Host/app/js/directives/ui.particular.exclamation.js index 6c1f88dbf..88692c3a8 100644 --- a/src/ServicePulse.Host/app/js/directives/ui.particular.exclamation.js +++ b/src/ServicePulse.Host/app/js/directives/ui.particular.exclamation.js @@ -6,7 +6,7 @@ scope: { type: '@' }, - restrict: 'E', + restrict: 'EA', replace: true, templateUrl: 'js/directives/ui.particular.exclamation.tpl.html', link: function (scope, element) { } diff --git a/src/ServicePulse.Host/app/js/services/factory.listener.js b/src/ServicePulse.Host/app/js/services/factory.listener.js index 369e59017..96ac2ab37 100644 --- a/src/ServicePulse.Host/app/js/services/factory.listener.js +++ b/src/ServicePulse.Host/app/js/services/factory.listener.js @@ -1,7 +1,7 @@ ; (function (window, angular, undefined) { 'use strict'; - function factory($rootScope, $jquery, notifyService) { + function factory($rootScope, $jquery, notifyService, toastService, $window) { function listener(msgUrl) { @@ -39,7 +39,6 @@ connection.start() .done(function () { - notifier.notify('SignalREvent', 'SignalR started'); connection.error(function (error) { @@ -51,15 +50,21 @@ }); connection.stateChanged(function (change) { - if (change.newState === $jquery.signalR.connectionState.disconnected) { notifier.notify('SignalRError', 'The server is offline'); } }); }) .fail(function () { - notifier.notify('SignalRError', 'Can not connect to ServiceControl'); + //notification is needed for other part of Pulse that depend on the notifier to get connectivity status. + notifier.notify('SignalRError'); + if ($window.location.hash.indexOf('/configuration/connections') < 0) { + // Uses the toastService directly to avoid breaking the notifier class. The previous notifier calls should all be removed at some point too. + toastService.showError('Could not connect to ServiceControl. View connection settings', true, false); + } }); + + notifier.notify('SignalREvent', 'SignalR starting'); } @@ -84,7 +89,9 @@ factory.$inject = [ '$rootScope', '$jquery', - 'notifyService' + 'notifyService', + 'toastService', + '$window' ]; angular.module('sc') diff --git a/src/ServicePulse.Host/app/js/services/services.service-control.js b/src/ServicePulse.Host/app/js/services/services.service-control.js index 88caf9548..7dbacea00 100644 --- a/src/ServicePulse.Host/app/js/services/services.service-control.js +++ b/src/ServicePulse.Host/app/js/services/services.service-control.js @@ -2,17 +2,19 @@ (function(window, angular, $, undefined) { 'use strict'; - function Service($http, scConfig, notifications, uri) { + function Service($http, connectionsManager, notifications, uri) { + + var scu = connectionsManager.getServiceControlUrl(); function getVersion() { - var url = uri.join(scConfig.service_control_url); + var url = uri.join(scu); return $http.get(url).then(function(response) { return response.headers('X-Particular-Version'); }); } function checkLicense() { - var url = uri.join(scConfig.service_control_url); + var url = uri.join(scu); return $http.get(url).then(function(response) { if (response.data.license_status !== 'valid') { return false; @@ -22,14 +24,14 @@ } function getEventLogItems() { - var url = uri.join(scConfig.service_control_url, 'eventlogitems'); + var url = uri.join(scu, 'eventlogitems'); return $http.get(url).then(function(response) { return response.data; }); } function getFailedMessages(sortBy, page, direction) { - var url = uri.join(scConfig.service_control_url, 'errors?status=unresolved&page=' + page + '&sort=' + sortBy + '&direction=' + direction); + var url = uri.join(scu, 'errors?status=unresolved&page=' + page + '&sort=' + sortBy + '&direction=' + direction); return $http.get(url).then(function(response) { return { data: response.data, @@ -41,7 +43,7 @@ var previousExceptionGroupEtag; function getExceptionGroups(classifier, classifierFilter) { - var url = uri.join(scConfig.service_control_url, 'recoverability', 'groups', classifier) + '?classifierFilter=' + classifierFilter; + var url = uri.join(scu, 'recoverability', 'groups', classifier) + '?classifierFilter=' + classifierFilter; return $http.get(url).then(function (response) { var status = 200; if (previousExceptionGroupEtag === response.headers('etag')) { @@ -57,7 +59,7 @@ } function getExceptionGroup(groupId) { - var url = uri.join(scConfig.service_control_url, 'recoverability', 'groups', 'id', groupId); + var url = uri.join(scu, 'recoverability', 'groups', 'id', groupId); return $http.get(url).then(function (response) { var status = 200; if (previousExceptionGroupEtag === response.headers('etag')) { @@ -81,7 +83,7 @@ } function getHistoricGroups() { - var url = uri.join(scConfig.service_control_url, 'recoverability', 'history'); + var url = uri.join(scu, 'recoverability', 'history'); return $http.get(url).then(function (response) { return { data: response.data, @@ -91,12 +93,12 @@ } function getFailedMessageById(messageId) { - var url = uri.join(scConfig.service_control_url, 'errors', 'last', messageId); + var url = uri.join(scu, 'errors', 'last', messageId); return $http.get(url); } function getFailedMessagesForExceptionGroup(groupId, sortBy, page) { - var url = uri.join(scConfig.service_control_url, 'recoverability', 'groups', groupId, 'errors?page=' + page + '&sort=' + sortBy + '&status=unresolved'); + var url = uri.join(scu, 'recoverability', 'groups', groupId, 'errors?page=' + page + '&sort=' + sortBy + '&status=unresolved'); return $http.get(url).then(function(response) { return { data: response.data, @@ -106,7 +108,7 @@ } function getMessageBody(messageId) { - var url = uri.join(scConfig.service_control_url, 'messages', messageId, 'body'); + var url = uri.join(scu, 'messages', messageId, 'body'); return $http.get(url).then(function(response) { return { data: response.data @@ -115,7 +117,7 @@ } function getMessageHeaders(messageId) { - var url = uri.join(scConfig.service_control_url, 'messages', 'search', messageId); + var url = uri.join(scu, 'messages', 'search', messageId); return $http.get(url).then(function(response) { return { data: response.data @@ -124,49 +126,49 @@ } function getTotalFailedMessages() { - var url = uri.join(scConfig.service_control_url, 'errors?status=unresolved'); + var url = uri.join(scu, 'errors?status=unresolved'); return $http.head(url).then(function(response) { return response.headers('Total-Count'); }); } function getTotalArchivedMessages() { - var url = uri.join(scConfig.service_control_url, 'errors?status=archived'); + var url = uri.join(scu, 'errors?status=archived'); return $http.head(url).then(function(response) { return response.headers('Total-Count'); }); } function getExceptionGroupClassifiers() { - var url = uri.join(scConfig.service_control_url, 'recoverability', 'classifiers'); + var url = uri.join(scu, 'recoverability', 'classifiers'); return $http.get(url).then(function (response) { return response.data; }); } function getConfiguration() { - var url = uri.join(scConfig.service_control_url, 'configuration'); + var url = uri.join(scu, 'configuration'); return $http.get(url).then(function(response) { return response.data; }); } function getTotalFailingCustomChecks() { - var url = uri.join(scConfig.service_control_url, 'customchecks?status=fail'); + var url = uri.join(scu, 'customchecks?status=fail'); return $http.get(url).then(function(response) { return response.headers('Total-Count'); }); } function getTotalPendingRetries() { - var url = uri.join(scConfig.service_control_url, 'errors?status=retryissued'); + var url = uri.join(scu, 'errors?status=retryissued'); return $http.head(url).then(function(response) { return response.headers('Total-Count'); }); } function getFailingCustomChecks(page) { - var url = uri.join(scConfig.service_control_url, 'customchecks?status=fail&page=' + page); + var url = uri.join(scu, 'customchecks?status=fail&page=' + page); return $http.get(url).then(function(response) { return { data: response.data, @@ -176,20 +178,20 @@ } function getFailedMessageStats() { - var url = uri.join(scConfig.service_control_url, 'errors', 'summary'); + var url = uri.join(scu, 'errors', 'summary'); return $http.get(url).then(function(response) { return response.data; }); } function dismissCustomChecks(customCheck) { - var url = uri.join(scConfig.service_control_url, 'customchecks', customCheck.id); + var url = uri.join(scu, 'customchecks', customCheck.id); $http.delete(url); } function retryPendingMessagesForQueue(queueName) { - var url = uri.join(scConfig.service_control_url, 'errors', 'queues', queueName, 'retry'); + var url = uri.join(scu, 'errors', 'queues', queueName, 'retry'); $http.post(url) .then(function() { notifications.pushForCurrentRoute('Retrying all pending retry messages for queue ' + queueName, 'info'); @@ -199,7 +201,7 @@ } function retryAllFailedMessages() { - var url = uri.join(scConfig.service_control_url, 'errors', 'retry', 'all'); + var url = uri.join(scu, 'errors', 'retry', 'all'); return $http.post(url) .then(function() { notifications.pushForCurrentRoute('Retrying all messages...', 'info'); @@ -209,7 +211,7 @@ } function retryFailedMessages(selectedMessages) { - var url = uri.join(scConfig.service_control_url, 'errors', 'retry'); + var url = uri.join(scu, 'errors', 'retry'); return $http.post(url, selectedMessages) .then(function() { notifications.pushForCurrentRoute('Retrying {{num}} messages...', 'info', { num: selectedMessages.length }); @@ -219,7 +221,7 @@ } function archiveFailedMessages(selectedMessages) { - var url = uri.join(scConfig.service_control_url, 'errors', 'archive'); + var url = uri.join(scu, 'errors', 'archive'); return $http({ url: url, @@ -234,7 +236,7 @@ } function archiveExceptionGroup(id, successText) { - var url = uri.join(scConfig.service_control_url, 'recoverability', 'groups', id, 'errors', 'archive'); + var url = uri.join(scu, 'recoverability', 'groups', id, 'errors', 'archive'); return $http.post(url) .then(null, function() { notifications.pushForCurrentRoute('Archiving messages failed', 'danger'); @@ -242,14 +244,14 @@ } function acknowledgeArchiveGroup(groupId) { - var url = uri.join(scConfig.service_control_url, 'recoverability', 'unacknowledgedgroups', groupId); + var url = uri.join(scu, 'recoverability', 'unacknowledgedgroups', groupId); return $http.delete(url).then(null, function () { notifications.pushForCurrentRoute('Archive messages failed', 'danger'); }); } function acknowledgeGroup(id, successText, failureText) { - var url = uri.join(scConfig.service_control_url, 'recoverability', 'unacknowledgedgroups', id); + var url = uri.join(scu, 'recoverability', 'unacknowledgedgroups', id); return $http.delete(url).then(null, function () { notifications.pushForCurrentRoute('Retrying messages failed', 'danger'); }); @@ -257,7 +259,7 @@ function retryExceptionGroup(id, successText) { - var url = uri.join(scConfig.service_control_url, 'recoverability', 'groups', id, 'errors', 'retry'); + var url = uri.join(scu, 'recoverability', 'groups', id, 'errors', 'retry'); return $http.post(url) .then(null, function() { notifications.pushForCurrentRoute('Retrying messages failed', 'danger'); @@ -265,7 +267,7 @@ } function getHeartbeatStats() { - var url = uri.join(scConfig.service_control_url, 'heartbeats', 'stats'); + var url = uri.join(scu, 'heartbeats', 'stats'); return $http.get(url).then(function(response) { return response.data; }); @@ -277,7 +279,7 @@ .then(function(endpoints) { var results = []; endpoints.forEach(function(item) { - var url = uri.join(scConfig.service_control_url, 'endpoints', item.name, 'sla'); + var url = uri.join(scu, 'endpoints', item.name, 'sla'); $http.get(url).then(function(response) { angular.extend(item, { sla: response.data.current }); results.push(item); @@ -289,13 +291,13 @@ } function loadQueueNames() { - var url = uri.join(scConfig.service_control_url, 'errors', 'queues', 'addresses'); + var url = uri.join(scu, 'errors', 'queues', 'addresses'); return $http.get(url); } function isBusyUpgradingIndexes() { - var url = uri.join(scConfig.service_control_url, 'upgrade'); + var url = uri.join(scu, 'upgrade'); return $http.get(url); } @@ -339,7 +341,7 @@ return service; } - Service.$inject = ['$http', 'scConfig', 'notifications', 'uri']; + Service.$inject = ['$http', 'connectionsManager', 'notifications', 'uri']; angular.module('services.serviceControlService', []) .service('serviceControlService', Service); diff --git a/src/ServicePulse.Host/app/js/services/services.stream.js b/src/ServicePulse.Host/app/js/services/services.stream.js index 8f69fe3fa..746af0cb9 100644 --- a/src/ServicePulse.Host/app/js/services/services.stream.js +++ b/src/ServicePulse.Host/app/js/services/services.stream.js @@ -1,11 +1,12 @@ ; (function (window, angular, undefined) { 'use strict'; - function Service(notifications, $log, $rootScope, scConfig, $jquery, uri) { + function Service(notifications, $log, $rootScope, connectionsManager, $jquery, uri) { var subscriberRegistry = {}, registryKey = 1; - var url = uri.join(scConfig.service_control_url, 'messagestream'); + var scu = connectionsManager.getServiceControlUrl(); + var url = uri.join(scu, 'messagestream'); var connection = $jquery.connection(url); @@ -41,7 +42,7 @@ }) .fail(function () { - notifications.pushForCurrentRoute('Can\'t connect to ServiceControl ({{url}})', 'danger', { url: scConfig.service_control_url }); + notifications.pushForCurrentRoute('Can\'t connect to ServiceControl ({{url}})', 'danger', { url: scu }); }); function callSubscribers(messageType, message) { @@ -86,7 +87,7 @@ }; }; - Service.$inject = ['notifications', '$log', '$rootScope', 'scConfig', '$jquery', 'uri']; + Service.$inject = ['notifications', '$log', '$rootScope', 'connectionsManager', '$jquery', 'uri']; angular .module('services.streamService', []) diff --git a/src/ServicePulse.Host/app/js/views/archive/controller.js b/src/ServicePulse.Host/app/js/views/archive/controller.js index 62851502d..ab9ca14b8 100644 --- a/src/ServicePulse.Host/app/js/views/archive/controller.js +++ b/src/ServicePulse.Host/app/js/views/archive/controller.js @@ -9,7 +9,6 @@ moment, $location, $cookies, - scConfig, sharedDataService, notifyService, serviceControlService, @@ -285,7 +284,6 @@ "moment", "$location", "$cookies", - "scConfig", "sharedDataService", "notifyService", "serviceControlService", diff --git a/src/ServicePulse.Host/app/js/views/archive/service.js b/src/ServicePulse.Host/app/js/views/archive/service.js index d0df144d9..d76099e92 100644 --- a/src/ServicePulse.Host/app/js/views/archive/service.js +++ b/src/ServicePulse.Host/app/js/views/archive/service.js @@ -7,11 +7,12 @@ $timeout, $q, notifyService, - scConfig, + connectionsManager, uri ) { var notifier = notifyService(); + var scu = connectionsManager.getServiceControlUrl(); function patchPromise(url, success, error, ids) { @@ -35,9 +36,9 @@ getArchivedMessages: function (sort, page, direction, start, end) { var url = ''; if (start && end) { - url = uri.join(scConfig.service_control_url, 'errors?status=archived&page=' + page + '&sort=' + sort + '&direction=' + direction + '&modified=' + start + '...' + end); + url = uri.join(scu, 'errors?status=archived&page=' + page + '&sort=' + sort + '&direction=' + direction + '&modified=' + start + '...' + end); } else { - url = uri.join(scConfig.service_control_url, 'errors?status=archived&page=' + page + '&sort=' + sort + '&direction=' + direction); + url = uri.join(scu, 'errors?status=archived&page=' + page + '&sort=' + sort + '&direction=' + direction); } return $http.get(url).then(function (response) { @@ -51,7 +52,7 @@ getArchivedCount: function () { - var url = uri.join(scConfig.service_control_url, 'errors?status=archived'); + var url = uri.join(scu, 'errors?status=archived'); return $http.head(url).then(function (response) { @@ -61,19 +62,19 @@ restoreFromArchive: function (startdate, enddate, success, error) { - var url = uri.join(scConfig.service_control_url, 'errors', startdate.format('YYYY-MM-DDTHH:mm:ss') + '...' + enddate.format('YYYY-MM-DDTHH:mm:ss'), 'unarchive'); + var url = uri.join(scu, 'errors', startdate.format('YYYY-MM-DDTHH:mm:ss') + '...' + enddate.format('YYYY-MM-DDTHH:mm:ss'), 'unarchive'); return patchPromise(url, success, error); }, restoreMessageFromArchive: function (id, success, error) { - var url = uri.join(scConfig.service_control_url, 'errors', 'unarchive'); + var url = uri.join(scu, 'errors', 'unarchive'); return patchPromise(url, success, error, [id]); }, restoreMessagesFromArchive: function (ids, success, error) { - var url = uri.join(scConfig.service_control_url, 'errors', 'unarchive'); + var url = uri.join(scu, 'errors', 'unarchive'); return patchPromise(url, success, error, ids); } }; @@ -85,7 +86,7 @@ '$timeout', '$q', 'notifyService', - 'scConfig', + 'connectionsManager', 'uri' ]; diff --git a/src/ServicePulse.Host/app/js/views/archive/view.html b/src/ServicePulse.Host/app/js/views/archive/view.html index 43e2e7cb6..a90586864 100644 --- a/src/ServicePulse.Host/app/js/views/archive/view.html +++ b/src/ServicePulse.Host/app/js/views/archive/view.html @@ -3,9 +3,11 @@
+
+
-
+
diff --git a/src/ServicePulse.Host/app/js/views/custom_checks/customChecks.html b/src/ServicePulse.Host/app/js/views/custom_checks/customChecks.html index 985ad88f1..069440604 100644 --- a/src/ServicePulse.Host/app/js/views/custom_checks/customChecks.html +++ b/src/ServicePulse.Host/app/js/views/custom_checks/customChecks.html @@ -3,46 +3,51 @@
- +
+
-
-
-

Custom checks

+
+ + +
+
+

Custom checks

+
-
-
- +
+ - + -
-
-
-
-
-
-
-
-
-

{{item.failure_reason}}

-

{{item.custom_check_id}}

-

- {{item.category}} reported by {{item.originating_endpoint.name}} on {{item.originating_endpoint.host}} -

+
+
+
+
+
+
+
+
+
+

{{item.failure_reason}}

+

{{item.custom_check_id}}

+

+ {{item.category}} reported by {{item.originating_endpoint.name}} on {{item.originating_endpoint.host}} +

+
-
-
- +
+ +
-
+
\ No newline at end of file diff --git a/src/ServicePulse.Host/app/js/views/dashboard/dashboard.html b/src/ServicePulse.Host/app/js/views/dashboard/dashboard.html index ad80d1af6..27e638e24 100644 --- a/src/ServicePulse.Host/app/js/views/dashboard/dashboard.html +++ b/src/ServicePulse.Host/app/js/views/dashboard/dashboard.html @@ -3,56 +3,61 @@
\ No newline at end of file diff --git a/src/ServicePulse.Host/app/js/views/endpoints/endpoints.html b/src/ServicePulse.Host/app/js/views/endpoints/endpoints.html index 242905b0b..720a1a5f8 100644 --- a/src/ServicePulse.Host/app/js/views/endpoints/endpoints.html +++ b/src/ServicePulse.Host/app/js/views/endpoints/endpoints.html @@ -3,61 +3,67 @@
- +
+
-
-
-

Endpoint heartbeats

-
-
+
- + -
-
-
-
-
+

Endpoint heartbeats

+
+
+ + + +
+ +
+
+
+
+
-
-
-
-

{{endpoint.name}}@{{endpoint.host_display_name}}

-

- latest heartbeat received -

+
+
+
+

{{endpoint.name}}@{{endpoint.host_display_name}}

+

+ latest heartbeat received +

+
-
+
-
+
-
-
+
-
- -
-
-
-
-
-
-
-
-

{{endpoint.name}}@{{endpoint.host_display_name}}

-

- latest heartbeat received -

-

No plugin installed

+
+ +
+
+
+
+
+
+
+
+

{{endpoint.name}}@{{endpoint.host_display_name}}

+

+ latest heartbeat received +

+

No plugin installed

+
@@ -65,6 +71,6 @@
- +
+
-
+
+ - +
-
- -
- -
-
-
-
-
-
-

{{group.originator}}

+ + +
+ +
+ +
+
+
+
+
+
+

{{group.originator}}

+
-
-
-
- +
+
+ +
+ There is only 1 completed group retry + There are only {{vm.historicGroups.length}} completed group retries
- There is only 1 completed group retry - There are only {{vm.historicGroups.length}} completed group retries
-
-
-
-
Failed message groups
-
+
+
+
Failed message groups
+
-
- - -
-
-
- - +
+
+ + +
-
-
-
+
+
-
+
-
-
-
-
-
-
-

{{group.title}}

-
+
+
+
+
+
+

{{group.title}}

+ + +

+
-
-
-
- - +
+
+ + +
-
-
-
-
-
-
    -
  • -
    Initialize retry request...
    -
  • -
  • - -
    -
    -
    Prepare messages...
    -
    +
    +
    +
    +
    +
      +
    • +
      Initialize retry request...
      +
    • +
    • + +
      +
      +
      Prepare messages...
      +
      -
      -
      -
      - {{group.workflow_state.total | number : 0}}% +
      +
      +
      + {{group.workflow_state.total | number : 0}}% +
      -
      -
    • -
    • +
    • +
    • -
      -
      -
      Send messages to retry...
      -
      -
      - (Queued) -
      -
      +
      +
      +
      Send messages to retry...
      +
      +
      + (Queued) +
      +
      -
      -
      - {{group.workflow_state.total | number : 0}}% +
      +
      + {{group.workflow_state.total | number : 0}}% +
      -
      -
    • -
    • -
      Retry request completed
      - -
      - WARNING: Not all messages will be retried because ServiceControl had to restart. You need to request retrying the remaining messages. -
      -
    • -
    - -
  • +
  • +
    Retry request completed
    + +
    + WARNING: Not all messages will be retried because ServiceControl had to restart. You need to request retrying the remaining messages. +
    +
  • +
+ +
-
-
-
-
-
-
    -
  • -
    Initialize archive request...
    -
  • -
  • -
    -
    -
    Archive request in progress...
    -
    +
    +
    +
    +
    +
      +
    • +
      Initialize archive request...
      +
    • +
    • +
      +
      +
      Archive request in progress...
      +
      -
      -
      -
      - {{group.workflow_state.total | number : 0}}% +
      +
      +
      + {{group.workflow_state.total | number : 0}}% +
      -
      -
    • -
    • -
      -
      -
      Cleaning up...
      +
    • +
    • +
      +
      +
      Cleaning up...
      +
      -
    -
  • -
  • -
    Archive request completed
    - -
  • -
- -
@@ -224,10 +229,10 @@
Failed message groups
-
+
-
+
\ No newline at end of file diff --git a/src/ServicePulse.Host/app/js/views/failed_messages/view.html b/src/ServicePulse.Host/app/js/views/failed_messages/view.html index fe6e51230..64bb7a241 100644 --- a/src/ServicePulse.Host/app/js/views/failed_messages/view.html +++ b/src/ServicePulse.Host/app/js/views/failed_messages/view.html @@ -3,105 +3,109 @@
- - -
-
- -
- -
-
- -
All failed messages ({{vm.failedMessages.length}} / {{vm.selectedExceptionGroup.count}} | number)
-

- {{vm.selectedExceptionGroup.parentTitle}} - - {{vm.selectedExceptionGroup.title}} -

-

{{vm.selectedExceptionGroup.count | number}} messages in group

+
+
+ +
+ + +
+
+
-
- - - - - -
-
-
- - - - - - -
-
-
+
+
+
- + -
+
-
-
-
-
-

{{message.message_type || 'Message Type Unknown - missing metadata EnclosedMessageTypes'}}

-
+
+
+
+

{{message.message_type || 'Message Type Unknown - missing metadata EnclosedMessageTypes'}}

+ + + + + + +

-
{{ message.exception.message }}
+
{{ message.exception.message }}
+
-
+
-
-
- +
+
\ No newline at end of file diff --git a/src/ServicePulse.Host/app/js/views/message/controller.js b/src/ServicePulse.Host/app/js/views/message/controller.js index e69e2e389..9650ccb54 100644 --- a/src/ServicePulse.Host/app/js/views/message/controller.js +++ b/src/ServicePulse.Host/app/js/views/message/controller.js @@ -7,7 +7,7 @@ $routeParams, moment, $window, - scConfig, + connectionsManager, toastService, serviceControlService, archivedMessageService, @@ -136,7 +136,7 @@ vm.debugInServiceInsight = function () { var messageId = vm.message.message_id; - var dnsName = scConfig.service_control_url.toLowerCase(); + var dnsName = connectionsManager.getServiceControlUrl().toLowerCase(); if (dnsName.indexOf("https") === 0) { dnsName = dnsName.replace("https://", ""); @@ -173,7 +173,7 @@ '$routeParams', 'moment', '$window', - 'scConfig', + 'connectionsManager', 'toastService', 'serviceControlService', 'archivedMessageService', diff --git a/src/ServicePulse.Host/app/js/views/message/messages-view.html b/src/ServicePulse.Host/app/js/views/message/messages-view.html index 28574865f..37ecfc805 100644 --- a/src/ServicePulse.Host/app/js/views/message/messages-view.html +++ b/src/ServicePulse.Host/app/js/views/message/messages-view.html @@ -3,84 +3,89 @@
- +
+
-
-
-
-
BACK
-

{{vm.message.message_type}}

+
+ + +
+
+
+
BACK
+

{{vm.message.message_type}}

+
-
- + - + -
-
-
-
\ No newline at end of file diff --git a/src/ServicePulse.Host/app/js/views/pending_retries/controller.js b/src/ServicePulse.Host/app/js/views/pending_retries/controller.js index 4cff6b26d..62a9a9c3b 100644 --- a/src/ServicePulse.Host/app/js/views/pending_retries/controller.js +++ b/src/ServicePulse.Host/app/js/views/pending_retries/controller.js @@ -9,7 +9,6 @@ $location, moment, $filter, - scConfig, toastService, sharedDataService, notifyService, @@ -346,7 +345,6 @@ "$location", "moment", "$filter", - "scConfig", "toastService", "sharedDataService", "notifyService", diff --git a/src/ServicePulse.Host/app/js/views/pending_retries/service.js b/src/ServicePulse.Host/app/js/views/pending_retries/service.js index ee33e3c1b..0f021d18d 100644 --- a/src/ServicePulse.Host/app/js/views/pending_retries/service.js +++ b/src/ServicePulse.Host/app/js/views/pending_retries/service.js @@ -3,10 +3,12 @@ - function service($http, moment, scConfig, notifications, uri) { + function service($http, moment, connectionsManager, notifications, uri) { + + var scu = connectionsManager.getServiceControlUrl(); function getPendingRetryMessages(searchPhrase, sortBy, page, direction, start, end) { - var url = uri.join(scConfig.service_control_url, 'errors?status=retryissued&page=' + page + '&sort=' + sortBy + '&direction=' + direction); + var url = uri.join(scu, 'errors?status=retryissued&page=' + page + '&sort=' + sortBy + '&direction=' + direction); if (start && end) { url = url + '&modified=' + start + '...' + end; @@ -26,7 +28,7 @@ function getTotalPendingRetryMessages(searchPhrase, start, end) { - var url = uri.join(scConfig.service_control_url, 'errors?status=retryissued'); + var url = uri.join(scu, 'errors?status=retryissued'); if (start && end) { url = url + '&modified=' + start + '...' + end; @@ -52,10 +54,10 @@ var url = null; var data = {}; if (searchPhrase) { - url = uri.join(scConfig.service_control_url, 'pendingretries', 'queues', 'retry'); + url = uri.join(scu, 'pendingretries', 'queues', 'retry'); data.queueaddress = searchPhrase; } else { - url = uri.join(scConfig.service_control_url, 'pendingretries', 'retry'); + url = uri.join(scu, 'pendingretries', 'retry'); } data.from = start; data.to = end; @@ -72,7 +74,7 @@ } function retryPendingRetriedMessages(selectedMessages) { - var url = uri.join(scConfig.service_control_url, 'pendingretries', 'retry'); + var url = uri.join(scu, 'pendingretries', 'retry'); return $http.post(url, selectedMessages) .then(function () { notifications.pushForCurrentRoute('Retrying {{num}} pending retried messages...', 'info', { num: selectedMessages.length }); @@ -89,10 +91,10 @@ var data = {}; var url = null; if (searchPhrase) { - url = uri.join(scConfig.service_control_url, 'pendingretries', 'queues', 'resolve'); + url = uri.join(scu, 'pendingretries', 'queues', 'resolve'); data.queueaddress = searchPhrase; } else { - url = uri.join(scConfig.service_control_url, 'pendingretries', 'resolve'); + url = uri.join(scu, 'pendingretries', 'resolve'); } data.from = start; data.to = end; @@ -109,7 +111,7 @@ } function markAsResolvedMessages(selectedMessages) { - var url = uri.join(scConfig.service_control_url, 'pendingretries', 'resolve'); + var url = uri.join(scu, 'pendingretries', 'resolve'); return $http({ url: url, @@ -133,7 +135,7 @@ }; } - service.$inject = ['$http', 'moment', 'scConfig', 'notifications', 'uri']; + service.$inject = ['$http', 'moment', 'connectionsManager', 'notifications', 'uri']; angular.module('sc') .service('pendingRetryService', service); diff --git a/src/ServicePulse.Host/app/js/views/pending_retries/view.html b/src/ServicePulse.Host/app/js/views/pending_retries/view.html index a076aceac..a0abfe53c 100644 --- a/src/ServicePulse.Host/app/js/views/pending_retries/view.html +++ b/src/ServicePulse.Host/app/js/views/pending_retries/view.html @@ -3,7 +3,10 @@
-
+
+
+ +
diff --git a/src/ServicePulse.Host/app/js/views/sc_not_available.html b/src/ServicePulse.Host/app/js/views/sc_not_available.html new file mode 100644 index 000000000..decf500c3 --- /dev/null +++ b/src/ServicePulse.Host/app/js/views/sc_not_available.html @@ -0,0 +1,9 @@ +
+

Cannot connect to ServiceControl

+

+ ServicePulse is unable to connect to the ServiceControl instanceput here the url we tried to connect to. Please ensure that ServiceControl is running and accesible from your machine. +

+ +
diff --git a/src/ServicePulse.Host/app/layout/footer.html b/src/ServicePulse.Host/app/layout/footer.html index 2505d88a2..1d9efc579 100644 --- a/src/ServicePulse.Host/app/layout/footer.html +++ b/src/ServicePulse.Host/app/layout/footer.html @@ -3,14 +3,15 @@
- + + support@particular.net Documentation
-
+
Service Control:
Connected @@ -24,6 +25,6 @@
+
-
diff --git a/src/ServicePulse.Host/app/layout/navbar.html b/src/ServicePulse.Host/app/layout/navbar.html index 83dac63cb..3af48a9e4 100644 --- a/src/ServicePulse.Host/app/layout/navbar.html +++ b/src/ServicePulse.Host/app/layout/navbar.html @@ -46,7 +46,8 @@ Configuration - + +
  • diff --git a/src/ServicePulse.Host/app/modules/configuration/configuration.js b/src/ServicePulse.Host/app/modules/configuration/configuration.js index 102cd832e..f44f133aa 100644 --- a/src/ServicePulse.Host/app/modules/configuration/configuration.js +++ b/src/ServicePulse.Host/app/modules/configuration/configuration.js @@ -1 +1,3 @@ require('./js/configuration.module'); +require('./connectionsManager'); +require('./connectionsStatus'); \ No newline at end of file diff --git a/src/ServicePulse.Host/app/modules/configuration/connectionsManager.js b/src/ServicePulse.Host/app/modules/configuration/connectionsManager.js new file mode 100644 index 000000000..4d3f25cd5 --- /dev/null +++ b/src/ServicePulse.Host/app/modules/configuration/connectionsManager.js @@ -0,0 +1,81 @@ +require('url-search-params-polyfill'); + +class ConnectionsManager { + constructor() { + const urlParams = new URLSearchParams(window.location.search); + + if (urlParams.has('scu')) { + this.serviceControlUrl = urlParams.get('scu'); + window.localStorage.setItem('scu', this.serviceControlUrl); + console.debug(`ServiceControl Url found in QS and stored in local storage: ${this.serviceControlUrl}`); + } else if (window.localStorage.getItem('scu')) { + this.serviceControlUrl = window.localStorage.getItem('scu'); + console.debug(`ServiceControl Url, not in QS, found in local storage: ${this.serviceControlUrl}`); + } else if (window.defaultConfig && window.defaultConfig.service_control_url) { + this.serviceControlUrl = window.defaultConfig.service_control_url; + console.debug(`setting ServiceControl Url to its default value: ${window.defaultConfig.service_control_url}`); + } else { + console.warn('ServiceControl Url is not defined.'); + } + + if (urlParams.has('mu')) { + this.monitoringUrl = urlParams.get('mu'); + window.localStorage.setItem('mu', this.monitoringUrl); + console.debug(`Monitoring Url found in QS and stored in local storage: ${this.monitoringUrl}`); + } else if (window.localStorage.getItem('mu')) { + this.monitoringUrl = window.localStorage.getItem('mu'); + console.debug(`Monitoring Url, not in QS, found in local storage: ${this.monitoringUrl}`); + } else if (window.defaultConfig && window.defaultConfig.monitoring_urls && window.defaultConfig.monitoring_urls.length) { + this.monitoringUrl = window.defaultConfig.monitoring_urls[0]; + console.debug(`setting Monitoring Url to its default value: ${window.defaultConfig.monitoring_urls[0]}`); + } else { + console.warn('Monitoring Url is not defined.'); + } + } + + getIsMonitoringEnabled() { + return this.monitoringUrl !== '!' + && this.monitoringUrl !== '' + && this.monitoringUrl !== null + && this.monitoringUrl !== undefined; + } + + getMonitoringUrl() { + if (this.getIsMonitoringEnabled()) { + return this.monitoringUrl; + } + return null; + } + + getServiceControlUrl() { return this.serviceControlUrl; } + + updateConnections(serviceControlUrl, monitoringUrl) { + + const urlParams = new URLSearchParams(window.location.search); + + if (!serviceControlUrl) { + throw 'ServiceControl URL is mandatory'; + } + + urlParams.set('scu', serviceControlUrl); + + if (!monitoringUrl) { + monitoringUrl = '!'; //disabled + } + + urlParams.set('mu', monitoringUrl); + + //values have changed. They'll be reset after page reloads + window.localStorage.removeItem('scu'); + window.localStorage.removeItem('mu'); + + let newSearch = urlParams.toString(); + console.debug('updateConnections - new query string: ', newSearch); + window.location.search = newSearch; + } +} + +window.connectionsManager = new ConnectionsManager(); + +angular.module('configuration') + .service('connectionsManager', function () { return window.connectionsManager; }); diff --git a/src/ServicePulse.Host/app/modules/configuration/connectionsStatus.js b/src/ServicePulse.Host/app/modules/configuration/connectionsStatus.js new file mode 100644 index 000000000..4e6e759db --- /dev/null +++ b/src/ServicePulse.Host/app/modules/configuration/connectionsStatus.js @@ -0,0 +1,39 @@ +import { timingSafeEqual } from "crypto"; + +class ConnectionsStatus { + constructor(notifyService, $rootScope) { + + var notifier = notifyService(); + + notifier.subscribe($rootScope, (event, data) => { + if (data.isSCConnected !== this.isSCConnected + || data.isSCConnecting !== this.isSCConnecting + || data.scConnectedAtLeastOnce !== this.scConnectedAtLeastOnce) { + + this.isSCConnected = data.isSCConnected; + this.isSCConnecting = data.isSCConnecting; + this.scConnectedAtLeastOnce = data.scConnectedAtLeastOnce; + + notifier.notify('ConnectionsStatusChanged', { status: this }); + } + }, 'ServiceControlConnectionStatusChanged'); + + notifier.subscribe($rootScope, (event, data) => { + if (data.isMonitoringConnected !== this.isMonitoringConnected + || data.isMonitoringConnecting !== this.isMonitoringConnecting) { + + this.isMonitoringConnected = data.isMonitoringConnected; + this.isMonitoringConnecting = data.isMonitoringConnecting; + + notifier.notify('ConnectionsStatusChanged', { status: this }); + } + }, 'MonitoringConnectionStatusChanged'); + } +} + +angular.module('configuration') + .service('connectionsStatus', ['notifyService', '$rootScope', function (notifyService, $rootScope) { + return new ConnectionsStatus(notifyService, $rootScope); + }]).run(['connectionsStatus', function(connectionsStatus) { + //make sure the service is initialized as the app starts, otherwise it won't raise notifications unless it's required as dependency + }]); diff --git a/src/ServicePulse.Host/app/modules/configuration/js/configuration.module.js b/src/ServicePulse.Host/app/modules/configuration/js/configuration.module.js index 6d6765eb3..db706959c 100644 --- a/src/ServicePulse.Host/app/modules/configuration/js/configuration.module.js +++ b/src/ServicePulse.Host/app/modules/configuration/js/configuration.module.js @@ -10,12 +10,12 @@ require('./directives/ui.particular.configurationTabs'); require('./directives/ui.particular.redirectLink'); - require('./redirect/redirect.module'); - require('./license/license.module'); require('./redirect/redirect.module'); + require('./connections/connections.module'); + angular.module('configuration', [ 'ui.bootstrap', 'configuration.route', @@ -24,6 +24,7 @@ 'configuration.tabs', 'configuration.redirect', 'configuration.license', + 'configuration.connections', ]); } (window, window.angular)); \ No newline at end of file diff --git a/src/ServicePulse.Host/app/modules/configuration/js/configuration.route.js b/src/ServicePulse.Host/app/modules/configuration/js/configuration.route.js index 7563d287a..b2c8c5229 100644 --- a/src/ServicePulse.Host/app/modules/configuration/js/configuration.route.js +++ b/src/ServicePulse.Host/app/modules/configuration/js/configuration.route.js @@ -8,7 +8,8 @@ redirectTo: "/configuration/license" }).when('/configuration/endpoints', { data: { - pageTitle: 'Monitored endpoints - Configuration' + pageTitle: 'Monitored endpoints - Configuration', + redirectWhenNotConnected: '/configuration/connections' }, template: template, controller: 'ConfigurationCtrl', diff --git a/src/ServicePulse.Host/app/modules/configuration/js/configuration.service.js b/src/ServicePulse.Host/app/modules/configuration/js/configuration.service.js index 34726b799..a35cc3fca 100644 --- a/src/ServicePulse.Host/app/modules/configuration/js/configuration.service.js +++ b/src/ServicePulse.Host/app/modules/configuration/js/configuration.service.js @@ -2,7 +2,9 @@ (function (window, angular, undefined) { 'use strict'; - function Service($http, $q, scConfig, uri) { + function Service($http, $q, connectionsManager, uri) { + + var scu = connectionsManager.getServiceControlUrl(); function patchPromise(url, data, success, error) { @@ -30,7 +32,7 @@ } function getData() { - var url = uri.join(scConfig.service_control_url, 'endpoints'); + var url = uri.join(scu, 'endpoints'); return $http.get(url).then(function (response) { return { data: response.data @@ -41,7 +43,7 @@ var service = { getData: getData, update: function (id, newState, success, error) { - var url = uri.join(scConfig.service_control_url, 'endpoints', id); + var url = uri.join(scu, 'endpoints', id); return patchPromise(url, { "monitor_heartbeat": newState }, success, error); } }; @@ -50,7 +52,7 @@ } - Service.$inject = ['$http', '$q', 'scConfig', 'uri']; + Service.$inject = ['$http', '$q', 'connectionsManager', 'uri']; angular.module('configuration.service', []) .factory('configurationService', Service); diff --git a/src/ServicePulse.Host/app/modules/configuration/js/connections/connections.controller.js b/src/ServicePulse.Host/app/modules/configuration/js/connections/connections.controller.js new file mode 100644 index 000000000..6be749088 --- /dev/null +++ b/src/ServicePulse.Host/app/modules/configuration/js/connections/connections.controller.js @@ -0,0 +1,106 @@ +; (function (window, angular, undefined) { + 'use strict'; + + function controller( + $scope, + connectionsManager, + $http, + notifyService, + connectionsStatus, + uri) { + + var vm = this; + var notifier = notifyService(); + + var initialServiceControlUrl = connectionsManager.getServiceControlUrl(); + var initialMonitoringUrl = connectionsManager.getMonitoringUrl(); + var isMonitoringEnabled = connectionsManager.getIsMonitoringEnabled(); + + vm.loadingData = false; + vm.configuredServiceControlUrl = initialServiceControlUrl; + vm.configuredMonitoringUrl = initialMonitoringUrl; + + vm.unableToConnectToServiceControl = false; + vm.unableToConnectToMonitoring = false; + + var evalConnectionsStatus = function () { + if (connectionsStatus.isSCConnecting) { + vm.unableToConnectToServiceControl = false; + } else { + vm.unableToConnectToServiceControl = !connectionsStatus.isSCConnected; + } + + if (!isMonitoringEnabled || connectionsStatus.isMonitoringConnecting || connectionsStatus.isMonitoringConnecting === undefined) { + vm.unableToConnectToMonitoring = false; + } else { + vm.unableToConnectToMonitoring = !connectionsStatus.isMonitoringConnected; + } + } + + notifier.subscribe($scope, (event, data) => { + evalConnectionsStatus(); + }, 'ConnectionsStatusChanged'); + + function prependSchemeIfMissing(userUrl) { + var url = userUrl.toLowerCase(); + if (url.startsWith('http://') || url.startsWith('https://')) { + return userUrl; + } + + return 'http://' + userUrl; + } + + vm.testServiceControlUrl = () => { + if (vm.configuredServiceControlUrl) { + vm.configuredServiceControlUrl = prependSchemeIfMissing(vm.configuredServiceControlUrl); + vm.testingServiceControl = true; + $http.get(vm.configuredServiceControlUrl).then(() => { + vm.serviceControlValid = true; + }, (error) => { + vm.serviceControlValid = false; + }).then(() => { + vm.testingServiceControl = false; + }); + } + }; + + vm.testMonitoringUrl = () => { + if (vm.configuredMonitoringUrl) { + vm.configuredMonitoringUrl = prependSchemeIfMissing(vm.configuredMonitoringUrl); + vm.testingMonitoring = true; + /* + Monitoring root URL doesn't support CORS, + so to test connectivity we need to hit one + of the Monitoring API URLs that are CORS enabled. + */ + var urlToTest = uri.join(vm.configuredMonitoringUrl, '/monitored-endpoints'); + $http.get(urlToTest).then(() => { + vm.monitoringValid = true; + }, (error) => { + vm.monitoringValid = false; + }).then(() => { + vm.testingMonitoring = false; + }); + } + }; + + vm.save = () => { + connectionsManager.updateConnections(vm.configuredServiceControlUrl, vm.configuredMonitoringUrl); + }; + + evalConnectionsStatus(); + } + + controller.$inject = [ + '$scope', + 'connectionsManager', + '$http', + 'notifyService', + 'connectionsStatus', + 'uri', + ]; + + angular.module('configuration.connections') + .controller('connectionsController', controller); + +})(window, window.angular); \ No newline at end of file diff --git a/src/ServicePulse.Host/app/modules/configuration/js/connections/connections.module.js b/src/ServicePulse.Host/app/modules/configuration/js/connections/connections.module.js new file mode 100644 index 000000000..4f215b805 --- /dev/null +++ b/src/ServicePulse.Host/app/modules/configuration/js/connections/connections.module.js @@ -0,0 +1,9 @@ +; (function (window, angular, undefined) { + 'use strict'; + + angular.module('configuration.connections', []); + + require('./connections.route'); + require('./connections.controller'); + +}(window, window.angular)); \ No newline at end of file diff --git a/src/ServicePulse.Host/app/modules/configuration/js/connections/connections.route.js b/src/ServicePulse.Host/app/modules/configuration/js/connections/connections.route.js new file mode 100644 index 000000000..8a3e52b68 --- /dev/null +++ b/src/ServicePulse.Host/app/modules/configuration/js/connections/connections.route.js @@ -0,0 +1,26 @@ +; (function (window, angular, undefined) { + 'use strict'; + + function routeProvider($routeProvider) { + const template = require('../../views/connections.html'); + + $routeProvider.when('/connections', { + redirectTo: "/configuration/connections" + }).when('/configuration/connections', { + data: { + pageTitle: 'Connections - Configuration' + }, + template: template, + controller: 'connectionsController', + controllerAs: 'vm' + }); + } + + routeProvider.$inject = [ + '$routeProvider' + ]; + + angular.module('configuration.connections', []) + .config(routeProvider); + +}(window, window.angular)); diff --git a/src/ServicePulse.Host/app/modules/configuration/js/directives/ui.particular.configurationTabs.js b/src/ServicePulse.Host/app/modules/configuration/js/directives/ui.particular.configurationTabs.js index 1b72df2c4..f45608108 100644 --- a/src/ServicePulse.Host/app/modules/configuration/js/directives/ui.particular.configurationTabs.js +++ b/src/ServicePulse.Host/app/modules/configuration/js/directives/ui.particular.configurationTabs.js @@ -3,11 +3,35 @@ angular.module('configuration', []); - function controller($scope, $location, redirectService, notifyService, sharedDataService, licenseService, licenseNotifierService) { + function controller($scope, $location, redirectService, notifyService, sharedDataService, licenseService, licenseNotifierService, connectionsStatus, connectionsManager) { var notifier = notifyService(); + var isMonitoringEnabled = connectionsManager.getIsMonitoringEnabled(); + $scope.isActive = (viewLocation) => viewLocation === $location.path(); + $scope.connectionsStatus = connectionsStatus; + $scope.unableToConnectToServiceControl = undefined; + $scope.unableToConnectToMonitoring = undefined; + + var evalConnectionsStatus = function() { + if (connectionsStatus.isSCConnecting) { + $scope.unableToConnectToServiceControl = false; + } else { + $scope.unableToConnectToServiceControl = !connectionsStatus.isSCConnected; + } + + if (!isMonitoringEnabled || connectionsStatus.isMonitoringConnecting || connectionsStatus.isMonitoringConnecting === undefined) { + $scope.unableToConnectToMonitoring = false; + } else { + $scope.unableToConnectToMonitoring = !connectionsStatus.isMonitoringConnected; + } + } + + notifier.subscribe($scope, (event, data) => { + evalConnectionsStatus(); + }, 'ConnectionsStatusChanged'); + var stats = sharedDataService.getstats(); $scope.counters = { @@ -40,10 +64,19 @@ $scope.licensewarning = 'danger'; } }); + + evalConnectionsStatus(); } - controller.$inject = ['$scope', '$location', 'redirectService', 'notifyService', 'sharedDataService', - 'licenseService', 'licenseNotifierService']; + controller.$inject = ['$scope', + '$location', + 'redirectService', + 'notifyService', + 'sharedDataService', + 'licenseService', + 'licenseNotifierService', + 'connectionsStatus', + 'connectionsManager']; function directive() { const template = require('./ui.particular.configurationTabs.tpl.html'); diff --git a/src/ServicePulse.Host/app/modules/configuration/js/directives/ui.particular.configurationTabs.tpl.html b/src/ServicePulse.Host/app/modules/configuration/js/directives/ui.particular.configurationTabs.tpl.html index b8cf70f64..2980cf2db 100644 --- a/src/ServicePulse.Host/app/modules/configuration/js/directives/ui.particular.configurationTabs.tpl.html +++ b/src/ServicePulse.Host/app/modules/configuration/js/directives/ui.particular.configurationTabs.tpl.html @@ -1,9 +1,22 @@  + \ No newline at end of file diff --git a/src/ServicePulse.Host/app/modules/configuration/js/license/license.route.js b/src/ServicePulse.Host/app/modules/configuration/js/license/license.route.js index 1195eb059..f14a46d88 100644 --- a/src/ServicePulse.Host/app/modules/configuration/js/license/license.route.js +++ b/src/ServicePulse.Host/app/modules/configuration/js/license/license.route.js @@ -6,7 +6,8 @@ $routeProvider.when('/configuration/license', { data: { - pageTitle: 'License - Configuration' + pageTitle: 'License - Configuration', + redirectWhenNotConnected: '/configuration/connections' }, template: template, controller: 'LicenseController', diff --git a/src/ServicePulse.Host/app/modules/configuration/js/license/license.service.js b/src/ServicePulse.Host/app/modules/configuration/js/license/license.service.js index 8afcc42d8..c32f1ec76 100644 --- a/src/ServicePulse.Host/app/modules/configuration/js/license/license.service.js +++ b/src/ServicePulse.Host/app/modules/configuration/js/license/license.service.js @@ -2,7 +2,7 @@ (function (window, angular, undefined) { 'use strict'; - function service($http, $q, scConfig, uri, notifyService) { + function service($http, $q, connectionsManager, uri, notifyService) { var notifier = notifyService(); var license = { @@ -15,7 +15,7 @@ }; function getData() { - var url = uri.join(scConfig.service_control_url, 'license'); + var url = uri.join(connectionsManager.getServiceControlUrl(), 'license'); return $http.get(url).then(function (response) { license = response.data; @@ -33,7 +33,7 @@ }; } - service.$inject = ['$http', '$q', 'scConfig', 'uri', 'notifyService']; + service.$inject = ['$http', '$q', 'connectionsManager', 'uri', 'notifyService']; angular.module('configuration.license') .service('licenseService', service); diff --git a/src/ServicePulse.Host/app/modules/configuration/js/redirect/redirect.route.js b/src/ServicePulse.Host/app/modules/configuration/js/redirect/redirect.route.js index 892e4e662..336a12459 100644 --- a/src/ServicePulse.Host/app/modules/configuration/js/redirect/redirect.route.js +++ b/src/ServicePulse.Host/app/modules/configuration/js/redirect/redirect.route.js @@ -8,7 +8,8 @@ redirectTo: "/configuration/redirects" }).when('/configuration/redirects', { data: { - pageTitle: 'Retry Redirects - Configuration' + pageTitle: 'Retry Redirects - Configuration', + redirectWhenNotConnected: '/configuration/connections' }, template: template, controller: 'redirectController', diff --git a/src/ServicePulse.Host/app/modules/configuration/js/redirect/redirect.service.js b/src/ServicePulse.Host/app/modules/configuration/js/redirect/redirect.service.js index 33dc2dd53..267c5b0d4 100644 --- a/src/ServicePulse.Host/app/modules/configuration/js/redirect/redirect.service.js +++ b/src/ServicePulse.Host/app/modules/configuration/js/redirect/redirect.service.js @@ -1,8 +1,9 @@ ; (function (window, angular, undefined) { 'use strict'; - function service($http, $timeout, $q, $rootScope, $interval, moment, scConfig, uri, notifications, notifyService) { + function service($http, $timeout, $q, $rootScope, $interval, moment, connectionsManager, uri, notifications, notifyService) { var notifier = notifyService(); + var scu = connectionsManager.getServiceControlUrl(); var redirects = { total :0, @@ -10,7 +11,7 @@ }; function getData() { - var url = uri.join(scConfig.service_control_url, 'redirects'); + var url = uri.join(scu, 'redirects'); return $http.get(url).then(function (response) { redirects.data = response.data; redirects.data.forEach(function(item) { @@ -81,7 +82,7 @@ return { createRedirect: function(sourceEndpoint, targetEndpoint, success, error) { - var url = uri.join(scConfig.service_control_url, 'redirects'); + var url = uri.join(scu, 'redirects'); var promise = sendPromise(url, 'POST', { "fromphysicaladdress": sourceEndpoint, "tophysicaladdress": targetEndpoint }, @@ -91,7 +92,7 @@ return promise; }, updateRedirect: function(redirectId, sourceEndpoint, targetEndpoint, success, error) { - var url = uri.join(scConfig.service_control_url, 'redirects', redirectId); + var url = uri.join(scu, 'redirects', redirectId); var promise = sendPromise(url, 'PUT', { "id": redirectId, "fromphysicaladdress": sourceEndpoint, "tophysicaladdress": targetEndpoint }, @@ -101,7 +102,7 @@ return promise; }, deleteRedirect: function(id, success, error) { - var url = uri.join(scConfig.service_control_url, 'redirects', id); + var url = uri.join(scu, 'redirects', id); return $http.delete(url) .then(function() { notifications.pushForCurrentRoute(success, 'info'); @@ -119,7 +120,7 @@ }; } - service.$inject = ['$http', '$timeout', '$q', '$rootScope', '$interval', 'moment', 'scConfig', 'uri', 'notifications', 'notifyService']; + service.$inject = ['$http', '$timeout', '$q', '$rootScope', '$interval', 'moment', 'connectionsManager', 'uri', 'notifications', 'notifyService']; angular.module('configuration.redirect') .service('redirectService', service); diff --git a/src/ServicePulse.Host/app/modules/configuration/views/configuration.html b/src/ServicePulse.Host/app/modules/configuration/views/configuration.html index f286147c1..c3660b290 100644 --- a/src/ServicePulse.Host/app/modules/configuration/views/configuration.html +++ b/src/ServicePulse.Host/app/modules/configuration/views/configuration.html @@ -16,66 +16,72 @@

    Configuration

    -
    -
    +
    +
    -
    - Warning: The list of endpoints below only contains endpoints with the heartbeats plug-in installed. Toggling heartbeat monitoring won't toggle performance monitoring -
    +
    + +
    +
    + +
    + Warning: The list of endpoints below only contains endpoints with the heartbeats plug-in installed. Toggling heartbeat monitoring won't toggle performance monitoring +
    -
    -
    -
    -
    -
    - - +
    +
    +
    +
    +
    + + +
    +
    - -
    -
    -
    -
    -

    - {{e.name}}@{{e.host_display_name}} -

    - - - +
    +
    +
    +

    + {{e.name}}@{{e.host_display_name}} +

    + + + +
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -

    Nothing to configure

    +
    +
    +
    +
    + +
    +
    +
    +
    +

    Nothing to configure

    +
    -
    +
    -
    +
    diff --git a/src/ServicePulse.Host/app/modules/configuration/views/connections.html b/src/ServicePulse.Host/app/modules/configuration/views/connections.html new file mode 100644 index 000000000..cc8a89088 --- /dev/null +++ b/src/ServicePulse.Host/app/modules/configuration/views/connections.html @@ -0,0 +1,88 @@ + + + + +
    +
    +
    +

    Configuration

    +
    +
    +
    + +
    +
    + + + +
    +
    +
    +
    + +
    +
    +

    ServiceControl

    + +
    + + +
    + +
    + + Testing + Connection successful + Connection failed +
    + +
    + +
    +

    ServiceControl Monitoring

    +
    + + +
    + +
    + + Testing + Connection successful + Connection failed +
    + +
    + + + + Connection saved + Unable to save +
    + +
    +
    +
    +
    + +
    +
    \ No newline at end of file diff --git a/src/ServicePulse.Host/app/modules/configuration/views/license.html b/src/ServicePulse.Host/app/modules/configuration/views/license.html index 3ecaba737..5bed23bde 100644 --- a/src/ServicePulse.Host/app/modules/configuration/views/license.html +++ b/src/ServicePulse.Host/app/modules/configuration/views/license.html @@ -10,60 +10,67 @@

    Configuration

    - -
    -
    -
    -
    +
    +
    -
    Platform license type: {{vm.licenseType}}{{vm.licenseEdition}}
    +
    -
    - License expiry date: - - {{vm.formattedExpirationDate}} {{vm.expirationDaysLeft}} - - -
    - Your license expired. Please update the license to continue using the Particular Service Platform. -
    -
    - Your trial period has expired. To continue using the Particular Service Platform you'll need to extend your trial or purchase a license. -
    - -
    + + +
    +
    +
    +
    + +
    Platform license type: {{vm.licenseType}}{{vm.licenseEdition}}
    -
    - - Upgrade protection expiry date: - - {{vm.formattedUpgradeProtectionExpiration}} {{vm.upgradeDaysLeft}} +
    + License expiry date: + + {{vm.formattedExpirationDate}} {{vm.expirationDaysLeft}} - -
    - Warning: Once upgrade protection expires, you'll no longer have access to support or new product versions. +
    + Your license expired. Please update the license to continue using the Particular Service Platform. +
    +
    + Your trial period has expired. To continue using the Particular Service Platform you'll need to extend your trial or purchase a license. +
    +
    -
    - Your license upgrade protection expired before this version of ServicePulse was released. + +
    + + Upgrade protection expiry date: + + {{vm.formattedUpgradeProtectionExpiration}} {{vm.upgradeDaysLeft}} + + + +
    + Warning: Once upgrade protection expires, you'll no longer have access to support or new product versions. +
    +
    + Your license upgrade protection expired before this version of ServicePulse was released. +
    -
    -
    ServiceControl instance: {{vm.scInstanceName}}
    - +
    ServiceControl instance: {{vm.scInstanceName}}
    + -
    - Need help? Contact us +
    + Need help? Contact us +
    -
    +
    \ No newline at end of file diff --git a/src/ServicePulse.Host/app/modules/configuration/views/redirect.html b/src/ServicePulse.Host/app/modules/configuration/views/redirect.html index 413fb67e4..8b95d9004 100644 --- a/src/ServicePulse.Host/app/modules/configuration/views/redirect.html +++ b/src/ServicePulse.Host/app/modules/configuration/views/redirect.html @@ -15,57 +15,63 @@

    Configuration

    - +
    +
    -
    -
    -
    - - +
    + + + +
    +
    +
    + + +
    -
    - + -
    -
    +
    +
    -
    -
    -
    -

    - - {{redirect.from_physical_address}} -

    -

    - - {{redirect.to_physical_address}} -

    - +
    +
    +
    +

    + + {{redirect.from_physical_address}} +

    +

    + + {{redirect.to_physical_address}} +

    + +
    -
    -
    -
    -

    +

    +
    +

    - - -

    -
    + + +

    +
    +
    -
    +
    diff --git a/src/ServicePulse.Host/app/modules/monitoring/dist/monitoring.dist.js b/src/ServicePulse.Host/app/modules/monitoring/dist/monitoring.dist.js deleted file mode 100644 index 634b49e92..000000000 --- a/src/ServicePulse.Host/app/modules/monitoring/dist/monitoring.dist.js +++ /dev/null @@ -1,191 +0,0 @@ -/******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { -/******/ configurable: false, -/******/ enumerable: true, -/******/ get: getter -/******/ }); -/******/ } -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 6); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("\n\n;\n(function (window, angular, $, undefined) {\n 'use strict';\n\n function Service(toastService, scConfig) {\n\n var isConnectedToSourceIndex = Array(scConfig.monitoring_urls.length).fill(true);\n\n function reportFailedConnection(sourceIndex) {\n\n if (isConnectedToSourceIndex[sourceIndex]) {\n var message = 'Could not connect to the ServiceControl Monitoring service.';\n if (scConfig.monitoring_urls.length > 1) {\n message = 'Could not connect to the ServiceControl Monitoring service at' + scConfig.monitoring_urls[sourceIndex] + '.';\n }\n toastService.showError(message);\n }\n isConnectedToSourceIndex[sourceIndex] = false;\n }\n\n function reportSuccessfulConnection(sourceIndex) {\n if (!isConnectedToSourceIndex[sourceIndex]) {\n var message = 'Connection to ServiceControl Monitoring service was successful.';\n if (scConfig.monitoring_urls.length > 1) {\n message = 'Connection to ServiceControl Monitoring service was successful ' + scConfig.monitoring_urls[sourceIndex] + '.';\n }\n toastService.showInfo(message, 'Info', true);\n }\n isConnectedToSourceIndex[sourceIndex] = true;\n }\n\n var service = {\n reportFailedConnection: reportFailedConnection,\n reportSuccessfulConnection: reportSuccessfulConnection\n };\n\n return service;\n }\n\n Service.$inject = ['toastService', 'scConfig'];\n\n angular.module('services.connectivityNotifier', ['sc']).service('connectivityNotifier', Service);\n})(window, window.angular, window.jQuery);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hcHAvbW9kdWxlcy9tb25pdG9yaW5nL2pzL3NlcnZpY2VzL3NlcnZpY2VzLmNvbm5lY3Rpdml0eU5vdGlmaWVyLmpzP2RjZjYiXSwibmFtZXMiOlsid2luZG93IiwiYW5ndWxhciIsIiQiLCJ1bmRlZmluZWQiLCJTZXJ2aWNlIiwidG9hc3RTZXJ2aWNlIiwic2NDb25maWciLCJpc0Nvbm5lY3RlZFRvU291cmNlSW5kZXgiLCJBcnJheSIsIm1vbml0b3JpbmdfdXJscyIsImxlbmd0aCIsImZpbGwiLCJyZXBvcnRGYWlsZWRDb25uZWN0aW9uIiwic291cmNlSW5kZXgiLCJtZXNzYWdlIiwic2hvd0Vycm9yIiwicmVwb3J0U3VjY2Vzc2Z1bENvbm5lY3Rpb24iLCJzaG93SW5mbyIsInNlcnZpY2UiLCIkaW5qZWN0IiwibW9kdWxlIiwialF1ZXJ5Il0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0MsV0FBVUEsTUFBVixFQUFrQkMsT0FBbEIsRUFBMkJDLENBQTNCLEVBQThCQyxTQUE5QixFQUF5QztBQUN0Qzs7QUFFQSxhQUFTQyxPQUFULENBQWlCQyxZQUFqQixFQUErQkMsUUFBL0IsRUFBeUM7O0FBRXJDLFlBQUlDLDJCQUEyQkMsTUFBTUYsU0FBU0csZUFBVCxDQUF5QkMsTUFBL0IsRUFBdUNDLElBQXZDLENBQTRDLElBQTVDLENBQS9COztBQUVBLGlCQUFTQyxzQkFBVCxDQUFnQ0MsV0FBaEMsRUFBNkM7O0FBRXpDLGdCQUFJTix5QkFBeUJNLFdBQXpCLENBQUosRUFBMkM7QUFDdkMsb0JBQUlDLFVBQVUsNkRBQWQ7QUFDQSxvQkFBSVIsU0FBU0csZUFBVCxDQUF5QkMsTUFBekIsR0FBa0MsQ0FBdEMsRUFBeUM7QUFDckNJLDhCQUFVLGtFQUFrRVIsU0FBU0csZUFBVCxDQUF5QkksV0FBekIsQ0FBbEUsR0FBMEcsR0FBcEg7QUFDSDtBQUNEUiw2QkFBYVUsU0FBYixDQUF1QkQsT0FBdkI7QUFDSDtBQUNEUCxxQ0FBeUJNLFdBQXpCLElBQXdDLEtBQXhDO0FBQ0g7O0FBRUQsaUJBQVNHLDBCQUFULENBQW9DSCxXQUFwQyxFQUFpRDtBQUM3QyxnQkFBSSxDQUFDTix5QkFBeUJNLFdBQXpCLENBQUwsRUFBNEM7QUFDeEMsb0JBQUlDLFVBQVUsaUVBQWQ7QUFDQSxvQkFBSVIsU0FBU0csZUFBVCxDQUF5QkMsTUFBekIsR0FBa0MsQ0FBdEMsRUFBeUM7QUFDckNJLDhCQUFVLG9FQUFvRVIsU0FBU0csZUFBVCxDQUF5QkksV0FBekIsQ0FBcEUsR0FBMkcsR0FBckg7QUFDSDtBQUNEUiw2QkFBYVksUUFBYixDQUFzQkgsT0FBdEIsRUFBK0IsTUFBL0IsRUFBdUMsSUFBdkM7QUFDSDtBQUNEUCxxQ0FBeUJNLFdBQXpCLElBQXdDLElBQXhDO0FBQ0g7O0FBRUQsWUFBSUssVUFBVTtBQUNWTixvQ0FBd0JBLHNCQURkO0FBRVZJLHdDQUE0QkE7QUFGbEIsU0FBZDs7QUFLQSxlQUFPRSxPQUFQO0FBQ0g7O0FBRURkLFlBQVFlLE9BQVIsR0FBa0IsQ0FBQyxjQUFELEVBQWlCLFVBQWpCLENBQWxCOztBQUVBbEIsWUFBUW1CLE1BQVIsQ0FBZSwrQkFBZixFQUFnRCxDQUFDLElBQUQsQ0FBaEQsRUFDS0YsT0FETCxDQUNhLHNCQURiLEVBQ3FDZCxPQURyQztBQUVILENBMUNBLEVBMENDSixNQTFDRCxFQTBDU0EsT0FBT0MsT0ExQ2hCLEVBMEN5QkQsT0FBT3FCLE1BMUNoQyxDQUFEIiwiZmlsZSI6IjAuanMiLCJzb3VyY2VzQ29udGVudCI6WyI7XHJcbihmdW5jdGlvbiAod2luZG93LCBhbmd1bGFyLCAkLCB1bmRlZmluZWQpIHtcclxuICAgICd1c2Ugc3RyaWN0JztcclxuXHJcbiAgICBmdW5jdGlvbiBTZXJ2aWNlKHRvYXN0U2VydmljZSwgc2NDb25maWcpIHtcclxuXHJcbiAgICAgICAgdmFyIGlzQ29ubmVjdGVkVG9Tb3VyY2VJbmRleCA9IEFycmF5KHNjQ29uZmlnLm1vbml0b3JpbmdfdXJscy5sZW5ndGgpLmZpbGwodHJ1ZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgZnVuY3Rpb24gcmVwb3J0RmFpbGVkQ29ubmVjdGlvbihzb3VyY2VJbmRleCkge1xyXG5cclxuICAgICAgICAgICAgaWYgKGlzQ29ubmVjdGVkVG9Tb3VyY2VJbmRleFtzb3VyY2VJbmRleF0pIHtcclxuICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlID0gJ0NvdWxkIG5vdCBjb25uZWN0IHRvIHRoZSBTZXJ2aWNlQ29udHJvbCBNb25pdG9yaW5nIHNlcnZpY2UuJztcclxuICAgICAgICAgICAgICAgIGlmIChzY0NvbmZpZy5tb25pdG9yaW5nX3VybHMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAnQ291bGQgbm90IGNvbm5lY3QgdG8gdGhlIFNlcnZpY2VDb250cm9sIE1vbml0b3Jpbmcgc2VydmljZSBhdCcgKyBzY0NvbmZpZy5tb25pdG9yaW5nX3VybHNbc291cmNlSW5kZXhdICsgJy4nO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdG9hc3RTZXJ2aWNlLnNob3dFcnJvcihtZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpc0Nvbm5lY3RlZFRvU291cmNlSW5kZXhbc291cmNlSW5kZXhdID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiByZXBvcnRTdWNjZXNzZnVsQ29ubmVjdGlvbihzb3VyY2VJbmRleCkge1xyXG4gICAgICAgICAgICBpZiAoIWlzQ29ubmVjdGVkVG9Tb3VyY2VJbmRleFtzb3VyY2VJbmRleF0pIHtcclxuICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlID0gJ0Nvbm5lY3Rpb24gdG8gU2VydmljZUNvbnRyb2wgTW9uaXRvcmluZyBzZXJ2aWNlIHdhcyBzdWNjZXNzZnVsLic7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2NDb25maWcubW9uaXRvcmluZ191cmxzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gJ0Nvbm5lY3Rpb24gdG8gU2VydmljZUNvbnRyb2wgTW9uaXRvcmluZyBzZXJ2aWNlIHdhcyBzdWNjZXNzZnVsICcgKyBzY0NvbmZpZy5tb25pdG9yaW5nX3VybHNbc291cmNlSW5kZXhdICsnLic7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0b2FzdFNlcnZpY2Uuc2hvd0luZm8obWVzc2FnZSwgJ0luZm8nLCB0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpc0Nvbm5lY3RlZFRvU291cmNlSW5kZXhbc291cmNlSW5kZXhdID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBzZXJ2aWNlID0ge1xyXG4gICAgICAgICAgICByZXBvcnRGYWlsZWRDb25uZWN0aW9uOiByZXBvcnRGYWlsZWRDb25uZWN0aW9uLFxyXG4gICAgICAgICAgICByZXBvcnRTdWNjZXNzZnVsQ29ubmVjdGlvbjogcmVwb3J0U3VjY2Vzc2Z1bENvbm5lY3Rpb25cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gc2VydmljZTtcclxuICAgIH1cclxuXHJcbiAgICBTZXJ2aWNlLiRpbmplY3QgPSBbJ3RvYXN0U2VydmljZScsICdzY0NvbmZpZyddO1xyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKCdzZXJ2aWNlcy5jb25uZWN0aXZpdHlOb3RpZmllcicsIFsnc2MnXSlcclxuICAgICAgICAuc2VydmljZSgnY29ubmVjdGl2aXR5Tm90aWZpZXInLCBTZXJ2aWNlKTtcclxufSh3aW5kb3csIHdpbmRvdy5hbmd1bGFyLCB3aW5kb3cualF1ZXJ5KSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vYXBwL21vZHVsZXMvbW9uaXRvcmluZy9qcy9zZXJ2aWNlcy9zZXJ2aWNlcy5jb25uZWN0aXZpdHlOb3RpZmllci5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///0\n"); - -/***/ }), -/* 1 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("\n\n;(function (window, angular, undefined) {\n 'use strict';\n\n angular.module('monitored_endpoints').constant('largeGraphsMinimumYAxis', {\n 'queueLength': 10,\n 'throughputRetries': 10,\n 'processingCritical': 10\n }).constant('smallGraphsMinimumYAxis', {\n 'queueLength': 10,\n 'throughput': 10,\n 'retries': 10,\n 'processingTime': 10,\n 'criticalTime': 10\n });\n})(window, window.angular);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hcHAvbW9kdWxlcy9tb25pdG9yaW5nL2pzL2NvbnN0YW50LmRpYWdyYW1zLmpzPzhjMjkiXSwibmFtZXMiOlsid2luZG93IiwiYW5ndWxhciIsInVuZGVmaW5lZCIsIm1vZHVsZSIsImNvbnN0YW50Il0sIm1hcHBpbmdzIjoiOztBQUFBLENBQUcsV0FBVUEsTUFBVixFQUFrQkMsT0FBbEIsRUFBMkJDLFNBQTNCLEVBQXNDO0FBQ3JDOztBQUVBRCxZQUFRRSxNQUFSLENBQWUscUJBQWYsRUFDS0MsUUFETCxDQUNjLHlCQURkLEVBQ3lDO0FBQzdCLHVCQUFlLEVBRGM7QUFFN0IsNkJBQXFCLEVBRlE7QUFHN0IsOEJBQXNCO0FBSE8sS0FEekMsRUFNS0EsUUFOTCxDQU1jLHlCQU5kLEVBTXlDO0FBQ2pDLHVCQUFlLEVBRGtCO0FBRWpDLHNCQUFjLEVBRm1CO0FBR2pDLG1CQUFXLEVBSHNCO0FBSWpDLDBCQUFrQixFQUplO0FBS2pDLHdCQUFnQjtBQUxpQixLQU56QztBQWNILENBakJFLEVBaUJESixNQWpCQyxFQWlCT0EsT0FBT0MsT0FqQmQsQ0FBRCIsImZpbGUiOiIxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiOyAoZnVuY3Rpb24gKHdpbmRvdywgYW5ndWxhciwgdW5kZWZpbmVkKSB7XHJcbiAgICAndXNlIHN0cmljdCc7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoJ21vbml0b3JlZF9lbmRwb2ludHMnKVxyXG4gICAgICAgIC5jb25zdGFudCgnbGFyZ2VHcmFwaHNNaW5pbXVtWUF4aXMnLCB7XHJcbiAgICAgICAgICAgICAgICAncXVldWVMZW5ndGgnOiAxMCxcclxuICAgICAgICAgICAgICAgICd0aHJvdWdocHV0UmV0cmllcyc6IDEwLFxyXG4gICAgICAgICAgICAgICAgJ3Byb2Nlc3NpbmdDcml0aWNhbCc6IDEwLFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIC5jb25zdGFudCgnc21hbGxHcmFwaHNNaW5pbXVtWUF4aXMnLCB7XHJcbiAgICAgICAgICAgICdxdWV1ZUxlbmd0aCc6IDEwLFxyXG4gICAgICAgICAgICAndGhyb3VnaHB1dCc6IDEwLFxyXG4gICAgICAgICAgICAncmV0cmllcyc6IDEwLFxyXG4gICAgICAgICAgICAncHJvY2Vzc2luZ1RpbWUnOiAxMCxcclxuICAgICAgICAgICAgJ2NyaXRpY2FsVGltZSc6IDEwLFxyXG4gICAgICAgIH0pO1xyXG5cclxufSh3aW5kb3csIHdpbmRvdy5hbmd1bGFyKSk7XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2FwcC9tb2R1bGVzL21vbml0b3JpbmcvanMvY29uc3RhbnQuZGlhZ3JhbXMuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1\n"); - -/***/ }), -/* 2 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("\n\n(function (window, angular, undefined) {\n 'use strict';\n\n angular.module('ui.particular.graph', []).directive('graph', function () {\n return {\n restrict: 'E',\n scope: {\n plotData: '=',\n formatter: '&',\n minimumYaxis: '@'\n },\n template: '',\n link: function link(scope, element, attrs) {\n scope.plotData = scope.plotData || { points: [], average: 0 };\n\n scope.$watch('plotData', function () {\n var svg = element.find('svg')[0];\n\n var width = svg.clientWidth;\n var height = svg.clientHeight;\n\n //HINT: This is workaround for Firefox\n if (width === 0) {\n var box = svg.getBoundingClientRect();\n\n width = box.right - box.left;\n height = box.bottom - box.top;\n }\n\n var verticalMargin = 6;\n var horizontalMargin = 2;\n\n var points = scope.plotData.points;\n var average = scope.plotData.average || 0;\n var minimumYaxis = !isNaN(scope.minimumYaxis) ? Number(scope.minimumYaxis) : 10;\n var max = points && points.length ? Math.max(average * 1.5, d3.max(points), minimumYaxis) : 1;\n var numberOfPoints = points && points.length ? points.length : 2;\n\n var scaleY = d3.scaleLinear().domain([0, max]).range([height - verticalMargin, verticalMargin]);\n\n var scaleX = d3.scaleLinear().domain([0, numberOfPoints - 1]).range([horizontalMargin, width - horizontalMargin]);\n\n var area = d3.area().x(function (d, i) {\n return scaleX(i);\n }).y(function (d, i) {\n return scaleY(d);\n }).y1(function (d) {\n return scaleY(0);\n }).curve(d3.curveLinear);\n\n var line = d3.line().x(function (d, i) {\n return scaleX(i);\n }).y(function (d, i) {\n return scaleY(d);\n }).curve(d3.curveLinear);\n\n d3.select(svg).selectAll(\"*\").remove();\n\n var chart = d3.select(svg).attr('width', width).attr('height', height);\n\n chart.append('rect').attr('width', width - 2 * horizontalMargin).attr('height', height - 2 * verticalMargin).attr('transform', 'translate(' + horizontalMargin + ',' + verticalMargin + ')').attr('fill', '#F2F6F7');\n\n if (points) {\n chart.append('path').datum(points).attr('d', area).attr('class', 'graph-data-fill');\n\n chart.append('path').datum(points).attr('d', line).attr('class', 'graph-data-line');\n }\n\n chart.append('path').datum(Array(numberOfPoints).fill(average)).attr('d', line).attr('class', 'graph-avg-line');\n });\n }\n };\n });\n})(window, window.angular);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hcHAvbW9kdWxlcy9tb25pdG9yaW5nL2pzL2RpcmVjdGl2ZXMvdWkucGFydGljdWxhci5ncmFwaC5qcz9jMWI4Il0sIm5hbWVzIjpbIndpbmRvdyIsImFuZ3VsYXIiLCJ1bmRlZmluZWQiLCJtb2R1bGUiLCJkaXJlY3RpdmUiLCJyZXN0cmljdCIsInNjb3BlIiwicGxvdERhdGEiLCJmb3JtYXR0ZXIiLCJtaW5pbXVtWWF4aXMiLCJ0ZW1wbGF0ZSIsImxpbmsiLCJlbGVtZW50IiwiYXR0cnMiLCJwb2ludHMiLCJhdmVyYWdlIiwiJHdhdGNoIiwic3ZnIiwiZmluZCIsIndpZHRoIiwiY2xpZW50V2lkdGgiLCJoZWlnaHQiLCJjbGllbnRIZWlnaHQiLCJib3giLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJyaWdodCIsImxlZnQiLCJib3R0b20iLCJ0b3AiLCJ2ZXJ0aWNhbE1hcmdpbiIsImhvcml6b250YWxNYXJnaW4iLCJpc05hTiIsIk51bWJlciIsIm1heCIsImxlbmd0aCIsIk1hdGgiLCJkMyIsIm51bWJlck9mUG9pbnRzIiwic2NhbGVZIiwic2NhbGVMaW5lYXIiLCJkb21haW4iLCJyYW5nZSIsInNjYWxlWCIsImFyZWEiLCJ4IiwiZCIsImkiLCJ5IiwieTEiLCJjdXJ2ZSIsImN1cnZlTGluZWFyIiwibGluZSIsInNlbGVjdCIsInNlbGVjdEFsbCIsInJlbW92ZSIsImNoYXJ0IiwiYXR0ciIsImFwcGVuZCIsImRhdHVtIiwiQXJyYXkiLCJmaWxsIl0sIm1hcHBpbmdzIjoiOztBQUFDLFdBQVNBLE1BQVQsRUFBaUJDLE9BQWpCLEVBQTBCQyxTQUExQixFQUFxQztBQUNsQzs7QUFFQUQsWUFBUUUsTUFBUixDQUFlLHFCQUFmLEVBQXNDLEVBQXRDLEVBQ0tDLFNBREwsQ0FDZSxPQURmLEVBRVEsWUFBVztBQUNQLGVBQU87QUFDSEMsc0JBQVUsR0FEUDtBQUVIQyxtQkFBTztBQUNIQywwQkFBVSxHQURQO0FBRUhDLDJCQUFXLEdBRlI7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IjoiMi5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbih3aW5kb3csIGFuZ3VsYXIsIHVuZGVmaW5lZCkge1xyXG4gICAgJ3VzZSBzdHJpY3QnO1xyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKCd1aS5wYXJ0aWN1bGFyLmdyYXBoJywgW10pXHJcbiAgICAgICAgLmRpcmVjdGl2ZSgnZ3JhcGgnLFxyXG4gICAgICAgICAgICBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Q6ICdFJyxcclxuICAgICAgICAgICAgICAgICAgICBzY29wZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwbG90RGF0YTogJz0nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZXI6ICcmJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bVlheGlzOiAnQCdcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiAnPHN2Zz48L3N2Zz4nLFxyXG4gICAgICAgICAgICAgICAgICAgIGxpbms6IGZ1bmN0aW9uIGxpbmsoc2NvcGUsIGVsZW1lbnQsIGF0dHJzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLnBsb3REYXRhID0gc2NvcGUucGxvdERhdGEgfHwgeyBwb2ludHM6IFtdLCBhdmVyYWdlOiAwIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzY29wZS4kd2F0Y2goJ3Bsb3REYXRhJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdmcgPSBlbGVtZW50LmZpbmQoJ3N2ZycpWzBdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSBzdmcuY2xpZW50V2lkdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGhlaWdodCA9IHN2Zy5jbGllbnRIZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSElOVDogVGhpcyBpcyB3b3JrYXJvdW5kIGZvciBGaXJlZm94XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpZHRoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBib3ggPSBzdmcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IGJveC5yaWdodCAtIGJveC5sZWZ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSBib3guYm90dG9tIC0gYm94LnRvcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2ZXJ0aWNhbE1hcmdpbiA9IDY7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGhvcml6b250YWxNYXJnaW4gPSAyO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcG9pbnRzID0gc2NvcGUucGxvdERhdGEucG9pbnRzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhdmVyYWdlID0gc2NvcGUucGxvdERhdGEuYXZlcmFnZSB8fCAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtaW5pbXVtWWF4aXMgPSAhaXNOYU4oc2NvcGUubWluaW11bVlheGlzKSA/IE51bWJlcihzY29wZS5taW5pbXVtWWF4aXMpIDogMTA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1heCA9IHBvaW50cyAmJiBwb2ludHMubGVuZ3RoID8gTWF0aC5tYXgoYXZlcmFnZSAqIDEuNSwgZDMubWF4KHBvaW50cyksIG1pbmltdW1ZYXhpcykgOiAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBudW1iZXJPZlBvaW50cyA9IHBvaW50cyAmJiBwb2ludHMubGVuZ3RoID8gcG9pbnRzLmxlbmd0aCA6IDI7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzY2FsZVkgPSBkMy5zY2FsZUxpbmVhcigpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kb21haW4oWzAsIG1heF0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yYW5nZShbaGVpZ2h0IC0gdmVydGljYWxNYXJnaW4sIHZlcnRpY2FsTWFyZ2luXSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzY2FsZVggPSBkMy5zY2FsZUxpbmVhcigpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kb21haW4oWzAsIG51bWJlck9mUG9pbnRzIC0gMV0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yYW5nZShbaG9yaXpvbnRhbE1hcmdpbiwgd2lkdGggLSBob3Jpem9udGFsTWFyZ2luXSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmVhID0gZDMuYXJlYSgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC54KGZ1bmN0aW9uIChkLCBpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2NhbGVYKGkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAueShmdW5jdGlvbiAoZCwgaSkgeyByZXR1cm4gc2NhbGVZKGQpOyB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAueTEoZnVuY3Rpb24gKGQpIHsgcmV0dXJuIHNjYWxlWSgwKTsgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmN1cnZlKGQzLmN1cnZlTGluZWFyKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBkMy5saW5lKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLngoZnVuY3Rpb24gKGQsIGkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzY2FsZVgoaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC55KGZ1bmN0aW9uIChkLCBpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2NhbGVZKGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3VydmUoZDMuY3VydmVMaW5lYXIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMy5zZWxlY3Qoc3ZnKS5zZWxlY3RBbGwoXCIqXCIpLnJlbW92ZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hhcnQgPSBkMy5zZWxlY3Qoc3ZnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCB3aWR0aClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIGhlaWdodCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0LmFwcGVuZCgncmVjdCcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHdpZHRoIC0gMiAqIGhvcml6b250YWxNYXJnaW4pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBoZWlnaHQgLSAyICogdmVydGljYWxNYXJnaW4pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcgKyBob3Jpem9udGFsTWFyZ2luICsgJywnICsgdmVydGljYWxNYXJnaW4gKyAnKScpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdmaWxsJywgJyNGMkY2RjcnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvaW50cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFydC5hcHBlbmQoJ3BhdGgnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRhdHVtKHBvaW50cylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdkJywgYXJlYSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdncmFwaC1kYXRhLWZpbGwnKTtcclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFydC5hcHBlbmQoJ3BhdGgnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRhdHVtKHBvaW50cylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdkJywgbGluZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdncmFwaC1kYXRhLWxpbmUnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0LmFwcGVuZCgncGF0aCcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kYXR1bShBcnJheShudW1iZXJPZlBvaW50cykuZmlsbChhdmVyYWdlKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2QnLCBsaW5lKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnZ3JhcGgtYXZnLWxpbmUnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxufSh3aW5kb3csIHdpbmRvdy5hbmd1bGFyKSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vYXBwL21vZHVsZXMvbW9uaXRvcmluZy9qcy9kaXJlY3RpdmVzL3VpLnBhcnRpY3VsYXIuZ3JhcGguanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2\n"); - -/***/ }), -/* 3 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("\n\n(function (window, angular, undefined) {\n 'use strict';\n\n angular.module('ui.particular.graphdecimal', []).filter('graphdecimal', ['$filter', function ($filter) {\n return function (input, decimals) {\n if (input) {\n var lastValue = input.points.length > 0 ? input.points[input.points.length - 1] : 0;\n input.displayValue = $filter(\"metricslargenumber\")(lastValue, decimals);\n } else {\n input = {\n points: [],\n average: 0,\n displayValue: 0\n };\n }\n\n return input;\n };\n }]);\n})(window, window.angular);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hcHAvbW9kdWxlcy9tb25pdG9yaW5nL2pzL2RpcmVjdGl2ZXMvdWkucGFydGljdWxhci5ncmFwaGRlY2ltYWwuanM/NTFkMyJdLCJuYW1lcyI6WyJ3aW5kb3ciLCJhbmd1bGFyIiwidW5kZWZpbmVkIiwibW9kdWxlIiwiZmlsdGVyIiwiJGZpbHRlciIsImlucHV0IiwiZGVjaW1hbHMiLCJsYXN0VmFsdWUiLCJwb2ludHMiLCJsZW5ndGgiLCJkaXNwbGF5VmFsdWUiLCJhdmVyYWdlIl0sIm1hcHBpbmdzIjoiOztBQUFDLFdBQVVBLE1BQVYsRUFBa0JDLE9BQWxCLEVBQTJCQyxTQUEzQixFQUFzQztBQUNuQzs7QUFFQUQsWUFBUUUsTUFBUixDQUFlLDRCQUFmLEVBQTZDLEVBQTdDLEVBQ0tDLE1BREwsQ0FDWSxjQURaLEVBQzRCLENBQUMsU0FBRCxFQUFZLFVBQVVDLE9BQVYsRUFBbUI7QUFDbkQsZUFBTyxVQUFVQyxLQUFWLEVBQWlCQyxRQUFqQixFQUEyQjtBQUM5QixnQkFBSUQsS0FBSixFQUFXO0FBQ1Asb0JBQUlFLFlBQVlGLE1BQU1HLE1BQU4sQ0FBYUMsTUFBYixHQUFzQixDQUF0QixHQUEwQkosTUFBTUcsTUFBTixDQUFhSCxNQUFNRyxNQUFOLENBQWFDLE1BQWIsR0FBc0IsQ0FBbkMsQ0FBMUIsR0FBa0UsQ0FBbEY7QUFDQUosc0JBQU1LLFlBQU4sR0FBcUJOLFFBQVEsb0JBQVIsRUFBOEJHLFNBQTlCLEVBQXlDRCxRQUF6QyxDQUFyQjtBQUNILGFBSEQsTUFHTztBQUNIRCx3QkFBUTtBQUNKRyw0QkFBUSxFQURKO0FBRUpHLDZCQUFTLENBRkw7QUFHSkQsa0NBQWM7QUFIVixpQkFBUjtBQUtIOztBQUVELG1CQUFPTCxLQUFQO0FBQ0gsU0FiRDtBQWNILEtBZnVCLENBRDVCO0FBaUJILENBcEJBLEVBb0JDTixNQXBCRCxFQW9CU0EsT0FBT0MsT0FwQmhCLENBQUQiLCJmaWxlIjoiMy5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiAod2luZG93LCBhbmd1bGFyLCB1bmRlZmluZWQpIHtcclxuICAgICd1c2Ugc3RyaWN0JztcclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZSgndWkucGFydGljdWxhci5ncmFwaGRlY2ltYWwnLCBbXSlcclxuICAgICAgICAuZmlsdGVyKCdncmFwaGRlY2ltYWwnLCBbJyRmaWx0ZXInLCBmdW5jdGlvbiAoJGZpbHRlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGlucHV0LCBkZWNpbWFscykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlucHV0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RWYWx1ZSA9IGlucHV0LnBvaW50cy5sZW5ndGggPiAwID8gaW5wdXQucG9pbnRzW2lucHV0LnBvaW50cy5sZW5ndGggLSAxXSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQuZGlzcGxheVZhbHVlID0gJGZpbHRlcihcIm1ldHJpY3NsYXJnZW51bWJlclwiKShsYXN0VmFsdWUsIGRlY2ltYWxzKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50czogW10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF2ZXJhZ2U6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlWYWx1ZTogMFxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0O1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1dKTtcclxufSh3aW5kb3csIHdpbmRvdy5hbmd1bGFyKSk7XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2FwcC9tb2R1bGVzL21vbml0b3JpbmcvanMvZGlyZWN0aXZlcy91aS5wYXJ0aWN1bGFyLmdyYXBoZGVjaW1hbC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3\n"); - -/***/ }), -/* 4 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("\n\n(function (window, angular, undefined) {\n 'use strict';\n\n angular.module('ui.particular.graphduration', []).filter('graphduration', ['formatter', function (formatter) {\n return function (input) {\n if (input) {\n var lastValue = input.points.length > 0 ? input.points[input.points.length - 1] : 0;\n input.displayValue = formatter.formatTime(lastValue);\n }\n\n return input;\n };\n }]);\n})(window, window.angular);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hcHAvbW9kdWxlcy9tb25pdG9yaW5nL2pzL2RpcmVjdGl2ZXMvdWkucGFydGljdWxhci5ncmFwaGR1cmF0aW9uLmpzP2Y3NWIiXSwibmFtZXMiOlsid2luZG93IiwiYW5ndWxhciIsInVuZGVmaW5lZCIsIm1vZHVsZSIsImZpbHRlciIsImZvcm1hdHRlciIsImlucHV0IiwibGFzdFZhbHVlIiwicG9pbnRzIiwibGVuZ3RoIiwiZGlzcGxheVZhbHVlIiwiZm9ybWF0VGltZSJdLCJtYXBwaW5ncyI6Ijs7QUFBQyxXQUFVQSxNQUFWLEVBQWtCQyxPQUFsQixFQUEyQkMsU0FBM0IsRUFBc0M7QUFDbkM7O0FBRUFELFlBQVFFLE1BQVIsQ0FBZSw2QkFBZixFQUE4QyxFQUE5QyxFQUNLQyxNQURMLENBQ1ksZUFEWixFQUM2QixDQUFDLFdBQUQsRUFBYyxVQUFVQyxTQUFWLEVBQXFCO0FBQ3hELGVBQU8sVUFBVUMsS0FBVixFQUFpQjtBQUNwQixnQkFBSUEsS0FBSixFQUFXO0FBQ1Asb0JBQUlDLFlBQVlELE1BQU1FLE1BQU4sQ0FBYUMsTUFBYixHQUFzQixDQUF0QixHQUEwQkgsTUFBTUUsTUFBTixDQUFhRixNQUFNRSxNQUFOLENBQWFDLE1BQWIsR0FBc0IsQ0FBbkMsQ0FBMUIsR0FBa0UsQ0FBbEY7QUFDQUgsc0JBQU1JLFlBQU4sR0FBcUJMLFVBQVVNLFVBQVYsQ0FBcUJKLFNBQXJCLENBQXJCO0FBQ0g7O0FBRUQsbUJBQU9ELEtBQVA7QUFDSCxTQVBEO0FBUUgsS0FUd0IsQ0FEN0I7QUFXSCxDQWRBLEVBY0NOLE1BZEQsRUFjU0EsT0FBT0MsT0FkaEIsQ0FBRCIsImZpbGUiOiI0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uICh3aW5kb3csIGFuZ3VsYXIsIHVuZGVmaW5lZCkge1xyXG4gICAgJ3VzZSBzdHJpY3QnO1xyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKCd1aS5wYXJ0aWN1bGFyLmdyYXBoZHVyYXRpb24nLCBbXSlcclxuICAgICAgICAuZmlsdGVyKCdncmFwaGR1cmF0aW9uJywgWydmb3JtYXR0ZXInLCBmdW5jdGlvbiAoZm9ybWF0dGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoaW5wdXQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpbnB1dCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBsYXN0VmFsdWUgPSBpbnB1dC5wb2ludHMubGVuZ3RoID4gMCA/IGlucHV0LnBvaW50c1tpbnB1dC5wb2ludHMubGVuZ3RoIC0gMV0gOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGlucHV0LmRpc3BsYXlWYWx1ZSA9IGZvcm1hdHRlci5mb3JtYXRUaW1lKGxhc3RWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0O1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1dKTtcclxufSh3aW5kb3csIHdpbmRvdy5hbmd1bGFyKSk7XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2FwcC9tb2R1bGVzL21vbml0b3JpbmcvanMvZGlyZWN0aXZlcy91aS5wYXJ0aWN1bGFyLmdyYXBoZHVyYXRpb24uanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4\n"); - -/***/ }), -/* 5 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("\n\n(function (window, angular) {\n 'use strict';\n\n angular.module('ui.particular.metricslargenumber', []).filter('metricslargenumber', ['formatter', function (formatter) {\n return function (input, dec) {\n var decimals = 0;\n if (input < 10 || input > 1000000) {\n decimals = 2;\n }\n return formatter.formatLargeNumber(input, dec || decimals);\n };\n }]);\n})(window, window.angular);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hcHAvbW9kdWxlcy9tb25pdG9yaW5nL2pzL2RpcmVjdGl2ZXMvdWkucGFydGljdWxhci5tZXRyaWNzbGFyZ2VudW1iZXIuanM/ZWQ2MSJdLCJuYW1lcyI6WyJ3aW5kb3ciLCJhbmd1bGFyIiwibW9kdWxlIiwiZmlsdGVyIiwiZm9ybWF0dGVyIiwiaW5wdXQiLCJkZWMiLCJkZWNpbWFscyIsImZvcm1hdExhcmdlTnVtYmVyIl0sIm1hcHBpbmdzIjoiOztBQUFDLFdBQVNBLE1BQVQsRUFBaUJDLE9BQWpCLEVBQTBCO0FBQzFCOztBQUVHQSxZQUFRQyxNQUFSLENBQWUsa0NBQWYsRUFBbUQsRUFBbkQsRUFDS0MsTUFETCxDQUNZLG9CQURaLEVBQ2tDLENBQUMsV0FBRCxFQUFjLFVBQVVDLFNBQVYsRUFBcUI7QUFDN0QsZUFBTyxVQUFVQyxLQUFWLEVBQWlCQyxHQUFqQixFQUFzQjtBQUN6QixnQkFBSUMsV0FBVyxDQUFmO0FBQ0EsZ0JBQUlGLFFBQVEsRUFBUixJQUFjQSxRQUFRLE9BQTFCLEVBQW1DO0FBQy9CRSwyQkFBVyxDQUFYO0FBQ0g7QUFDRCxtQkFBT0gsVUFBVUksaUJBQVYsQ0FBNEJILEtBQTVCLEVBQW1DQyxPQUFPQyxRQUExQyxDQUFQO0FBQ0gsU0FORDtBQU9ILEtBUjZCLENBRGxDO0FBVUgsQ0FiQSxFQWFDUCxNQWJELEVBYVNBLE9BQU9DLE9BYmhCLENBQUQiLCJmaWxlIjoiNS5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbih3aW5kb3csIGFuZ3VsYXIpIHtcclxuXHQndXNlIHN0cmljdCc7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoJ3VpLnBhcnRpY3VsYXIubWV0cmljc2xhcmdlbnVtYmVyJywgW10pXHJcbiAgICAgICAgLmZpbHRlcignbWV0cmljc2xhcmdlbnVtYmVyJywgWydmb3JtYXR0ZXInLCBmdW5jdGlvbiAoZm9ybWF0dGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoaW5wdXQsIGRlYykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGRlY2ltYWxzID0gMDtcclxuICAgICAgICAgICAgICAgIGlmIChpbnB1dCA8IDEwIHx8IGlucHV0ID4gMTAwMDAwMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRlY2ltYWxzID0gMjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0TGFyZ2VOdW1iZXIoaW5wdXQsIGRlYyB8fCBkZWNpbWFscyk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfV0pO1xyXG59KHdpbmRvdywgd2luZG93LmFuZ3VsYXIpKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9hcHAvbW9kdWxlcy9tb25pdG9yaW5nL2pzL2RpcmVjdGl2ZXMvdWkucGFydGljdWxhci5tZXRyaWNzbGFyZ2VudW1iZXIuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5\n"); - -/***/ }), -/* 6 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("\n\n__webpack_require__(7);\n__webpack_require__(12);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hcHAvbW9kdWxlcy9tb25pdG9yaW5nL21vbml0b3JpbmcuanM/ZTJhZCJdLCJuYW1lcyI6WyJyZXF1aXJlIl0sIm1hcHBpbmdzIjoiOztBQUFBLG1CQUFBQSxDQUFRLENBQVI7QUFDQSxtQkFBQUEsQ0FBUSxFQUFSIiwiZmlsZSI6IjYuanMiLCJzb3VyY2VzQ29udGVudCI6WyJyZXF1aXJlKCcuL2pzL21vbml0b3JlZF9lbmRwb2ludHMubW9kdWxlJyk7XHJcbnJlcXVpcmUoJy4vanMvZW5kcG9pbnRfZGV0YWlscy5tb2R1bGUnKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9hcHAvbW9kdWxlcy9tb25pdG9yaW5nL21vbml0b3JpbmcuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6\n"); - -/***/ }), -/* 7 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("\n\n(function (window, angular, undefined) {\n 'use strict';\n\n angular.module('monitored_endpoints', []);\n\n __webpack_require__(8);\n __webpack_require__(0);\n __webpack_require__(9);\n __webpack_require__(10);\n __webpack_require__(1);\n\n __webpack_require__(2);\n __webpack_require__(3);\n __webpack_require__(4);\n __webpack_require__(5);\n})(window, window.angular);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hcHAvbW9kdWxlcy9tb25pdG9yaW5nL2pzL21vbml0b3JlZF9lbmRwb2ludHMubW9kdWxlLmpzPzA3YmQiXSwibmFtZXMiOlsid2luZG93IiwiYW5ndWxhciIsInVuZGVmaW5lZCIsIm1vZHVsZSIsInJlcXVpcmUiXSwibWFwcGluZ3MiOiI7O0FBQUMsV0FBVUEsTUFBVixFQUFrQkMsT0FBbEIsRUFBMkJDLFNBQTNCLEVBQXNDO0FBQ25DOztBQUNBRCxZQUFRRSxNQUFSLENBQWUscUJBQWYsRUFBc0MsRUFBdEM7O0FBRUFDLElBQUEsbUJBQUFBLENBQVEsQ0FBUjtBQUNBQSxJQUFBLG1CQUFBQSxDQUFRLENBQVI7QUFDQUEsSUFBQSxtQkFBQUEsQ0FBUSxDQUFSO0FBQ0FBLElBQUEsbUJBQUFBLENBQVEsRUFBUjtBQUNBQSxJQUFBLG1CQUFBQSxDQUFRLENBQVI7O0FBRUFBLElBQUEsbUJBQUFBLENBQVEsQ0FBUjtBQUNBQSxJQUFBLG1CQUFBQSxDQUFRLENBQVI7QUFDQUEsSUFBQSxtQkFBQUEsQ0FBUSxDQUFSO0FBQ0FBLElBQUEsbUJBQUFBLENBQVEsQ0FBUjtBQUNILENBZEEsRUFjQ0osTUFkRCxFQWNTQSxPQUFPQyxPQWRoQixDQUFEIiwiZmlsZSI6IjcuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gKHdpbmRvdywgYW5ndWxhciwgdW5kZWZpbmVkKSB7XHJcbiAgICAndXNlIHN0cmljdCc7XHJcbiAgICBhbmd1bGFyLm1vZHVsZSgnbW9uaXRvcmVkX2VuZHBvaW50cycsIFtdKTtcclxuXHJcbiAgICByZXF1aXJlKCcuL3NlcnZpY2VzL3NlcnZpY2VzLm1vbml0b3JpbmcnKTtcclxuICAgIHJlcXVpcmUoJy4vc2VydmljZXMvc2VydmljZXMuY29ubmVjdGl2aXR5Tm90aWZpZXInKTtcclxuICAgIHJlcXVpcmUoJy4vbW9uaXRvcmVkX2VuZHBvaW50cy5jb250cm9sbGVyJyk7XHJcbiAgICByZXF1aXJlKCcuL21vbml0b3JlZF9lbmRwb2ludHMucm91dGUuanMnKTtcclxuICAgIHJlcXVpcmUoJy4vY29uc3RhbnQuZGlhZ3JhbXMuanMnKTtcclxuXHJcbiAgICByZXF1aXJlKCcuL2RpcmVjdGl2ZXMvdWkucGFydGljdWxhci5ncmFwaC5qcycpO1xyXG4gICAgcmVxdWlyZSgnLi9kaXJlY3RpdmVzL3VpLnBhcnRpY3VsYXIuZ3JhcGhkZWNpbWFsLmpzJyk7XHJcbiAgICByZXF1aXJlKCcuL2RpcmVjdGl2ZXMvdWkucGFydGljdWxhci5ncmFwaGR1cmF0aW9uLmpzJyk7XHJcbiAgICByZXF1aXJlKCcuL2RpcmVjdGl2ZXMvdWkucGFydGljdWxhci5tZXRyaWNzbGFyZ2VudW1iZXIuanMnKTtcclxufSh3aW5kb3csIHdpbmRvdy5hbmd1bGFyKSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vYXBwL21vZHVsZXMvbW9uaXRvcmluZy9qcy9tb25pdG9yZWRfZW5kcG9pbnRzLm1vZHVsZS5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7\n"); - -/***/ }), -/* 8 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("\n\n;\n(function (window, angular, $, undefined) {\n 'use strict';\n\n function Service($http, rx, scConfig, uri, $q) {\n\n function createEndpointsSource(historyPeriod, refreshInterval) {\n return Rx.Observable.interval(refreshInterval).startWith(0).flatMap(function (i) {\n return Rx.Observable.fromArray(loadEndpointDataFromMonitoringService(historyPeriod)).flatMap(function (p) {\n var o = Rx.Observable.fromPromise(p);\n o = o.catch(Rx.Observable.empty());\n return o;\n });\n }).selectMany(function (endpoints) {\n return endpoints;\n });\n }\n\n function loadEndpointDataFromMonitoringService(historyPeriod) {\n return scConfig.monitoring_urls.map(function (url) {\n return $http.get(uri.join(url, 'monitored-endpoints') + '?history=' + historyPeriod).then(function (result) {\n var sourceIndex = scConfig.monitoring_urls.indexOf(url);\n\n result.data.forEach(function (endpoint) {\n endpoint.sourceIndex = sourceIndex;\n });\n\n return result.data;\n }, function (error) {\n var sourceIndex = scConfig.monitoring_urls.indexOf(url);\n return [{ error: error, sourceIndex: sourceIndex }];\n });\n });\n }\n\n function loadEndpointDetailsFromMonitoringService(endpointName, sourceIndex, historyPeriod) {\n return $http.get(uri.join(scConfig.monitoring_urls[sourceIndex], 'monitored-endpoints', endpointName) + \"?history=\" + historyPeriod).then(function (result) {\n return result.data;\n }, function (error) {\n return { error: error };\n });\n }\n\n function createEndpointDetailsSource(endpointName, sourceIndex, historyPeriod, refreshInterval) {\n return Rx.Observable.interval(refreshInterval).startWith(0).flatMap(function (i) {\n return Rx.Observable.fromPromise(loadEndpointDetailsFromMonitoringService(endpointName, sourceIndex, historyPeriod));\n });\n }\n\n var service = {\n createEndpointsSource: createEndpointsSource,\n createEndpointDetailsSource: createEndpointDetailsSource\n };\n\n return service;\n }\n\n Service.$inject = ['$http', 'rx', 'scConfig', 'uri', '$q', 'toastService'];\n\n angular.module('services.monitoringService', ['sc']).service('monitoringService', Service);\n})(window, window.angular, window.jQuery);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hcHAvbW9kdWxlcy9tb25pdG9yaW5nL2pzL3NlcnZpY2VzL3NlcnZpY2VzLm1vbml0b3JpbmcuanM/ZmE2NSJdLCJuYW1lcyI6WyJ3aW5kb3ciLCJhbmd1bGFyIiwiJCIsInVuZGVmaW5lZCIsIlNlcnZpY2UiLCIkaHR0cCIsInJ4Iiwic2NDb25maWciLCJ1cmkiLCIkcSIsImNyZWF0ZUVuZHBvaW50c1NvdXJjZSIsImhpc3RvcnlQZXJpb2QiLCJyZWZyZXNoSW50ZXJ2YWwiLCJSeCIsIk9ic2VydmFibGUiLCJpbnRlcnZhbCIsInN0YXJ0V2l0aCIsImZsYXRNYXAiLCJpIiwiZnJvbUFycmF5IiwibG9hZEVuZHBvaW50RGF0YUZyb21Nb25pdG9yaW5nU2VydmljZSIsInAiLCJvIiwiZnJvbVByb21pc2UiLCJjYXRjaCIsImVtcHR5Iiwic2VsZWN0TWFueSIsImVuZHBvaW50cyIsIm1vbml0b3JpbmdfdXJscyIsIm1hcCIsInVybCIsImdldCIsImpvaW4iLCJ0aGVuIiwicmVzdWx0Iiwic291cmNlSW5kZXgiLCJpbmRleE9mIiwiZGF0YSIsImZvckVhY2giLCJlbmRwb2ludCIsImVycm9yIiwibG9hZEVuZHBvaW50RGV0YWlsc0Zyb21Nb25pdG9yaW5nU2VydmljZSIsImVuZHBvaW50TmFtZSIsImNyZWF0ZUVuZHBvaW50RGV0YWlsc1NvdXJjZSIsInNlcnZpY2UiLCIkaW5qZWN0IiwibW9kdWxlIiwialF1ZXJ5Il0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0MsV0FBVUEsTUFBVixFQUFrQkMsT0FBbEIsRUFBMkJDLENBQTNCLEVBQThCQyxTQUE5QixFQUF5QztBQUN0Qzs7QUFFQSxhQUFTQyxPQUFULENBQWlCQyxLQUFqQixFQUF3QkMsRUFBeEIsRUFBNEJDLFFBQTVCLEVBQXNDQyxHQUF0QyxFQUEyQ0MsRUFBM0MsRUFBK0M7O0FBRTNDLGlCQUFTQyxxQkFBVCxDQUErQkMsYUFBL0IsRUFBOENDLGVBQTlDLEVBQStEO0FBQzNELG1C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QVYsRUFBZ0IsVUFBaEIsRUFBNEIsS0FBNUIsRUFBbUMsSUFBbkMsRUFBeUMsY0FBekMsQ0FBbEI7O0FBRUE1QyxZQUFRNkMsTUFBUixDQUFlLDRCQUFmLEVBQTZDLENBQUMsSUFBRCxDQUE3QyxFQUNLRixPQURMLENBQ2EsbUJBRGIsRUFDa0N4QyxPQURsQztBQUVILENBbkVBLEVBbUVDSixNQW5FRCxFQW1FU0EsT0FBT0MsT0FuRWhCLEVBbUV5QkQsT0FBTytDLE1BbkVoQyxDQUFEIiwiZmlsZSI6IjguanMiLCJzb3VyY2VzQ29udGVudCI6WyI7XHJcbihmdW5jdGlvbiAod2luZG93LCBhbmd1bGFyLCAkLCB1bmRlZmluZWQpIHtcclxuICAgICd1c2Ugc3RyaWN0JztcclxuXHJcbiAgICBmdW5jdGlvbiBTZXJ2aWNlKCRodHRwLCByeCwgc2NDb25maWcsIHVyaSwgJHEpIHtcclxuXHJcbiAgICAgICAgZnVuY3Rpb24gY3JlYXRlRW5kcG9pbnRzU291cmNlKGhpc3RvcnlQZXJpb2QsIHJlZnJlc2hJbnRlcnZhbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUnguT2JzZXJ2YWJsZS5pbnRlcnZhbChyZWZyZXNoSW50ZXJ2YWwpLnN0YXJ0V2l0aCgwKVxyXG4gICAgICAgICAgICAgICAgLmZsYXRNYXAoZnVuY3Rpb24gKGkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnguT2JzZXJ2YWJsZS5mcm9tQXJyYXkobG9hZEVuZHBvaW50RGF0YUZyb21Nb25pdG9yaW5nU2VydmljZShoaXN0b3J5UGVyaW9kKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmZsYXRNYXAoZnVuY3Rpb24gKHApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gUnguT2JzZXJ2YWJsZS5mcm9tUHJvbWlzZShwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBvLmNhdGNoKFJ4Lk9ic2VydmFibGUuZW1wdHkoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KS5zZWxlY3RNYW55KGZ1bmN0aW9uIChlbmRwb2ludHMpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW5kcG9pbnRzO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBsb2FkRW5kcG9pbnREYXRhRnJvbU1vbml0b3JpbmdTZXJ2aWNlKGhpc3RvcnlQZXJpb2QpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHNjQ29uZmlnLm1vbml0b3JpbmdfdXJscy5tYXAoZnVuY3Rpb24gKHVybCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICRodHRwLmdldCh1cmkuam9pbih1cmwsICdtb25pdG9yZWQtZW5kcG9pbnRzJykgKyAnP2hpc3Rvcnk9JyArIGhpc3RvcnlQZXJpb2QpXHJcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc291cmNlSW5kZXggPSBzY0NvbmZpZy5tb25pdG9yaW5nX3VybHMuaW5kZXhPZih1cmwpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmRhdGEuZm9yRWFjaChmdW5jdGlvbiAoZW5kcG9pbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50LnNvdXJjZUluZGV4ID0gc291cmNlSW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzb3VyY2VJbmRleCA9IHNjQ29uZmlnLm1vbml0b3JpbmdfdXJscy5pbmRleE9mKHVybCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbeyBlcnJvcjogZXJyb3IsIHNvdXJjZUluZGV4OiBzb3VyY2VJbmRleCB9XTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gbG9hZEVuZHBvaW50RGV0YWlsc0Zyb21Nb25pdG9yaW5nU2VydmljZShlbmRwb2ludE5hbWUsIHNvdXJjZUluZGV4LCBoaXN0b3J5UGVyaW9kKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAkaHR0cC5nZXQodXJpLmpvaW4oc2NDb25maWcubW9uaXRvcmluZ191cmxzW3NvdXJjZUluZGV4XSwgJ21vbml0b3JlZC1lbmRwb2ludHMnLCBlbmRwb2ludE5hbWUpICsgXCI/aGlzdG9yeT1cIiArIGhpc3RvcnlQZXJpb2QpXHJcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5kYXRhO1xyXG4gICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IGVycm9yIH07XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGNyZWF0ZUVuZHBvaW50RGV0YWlsc1NvdXJjZShlbmRwb2ludE5hbWUsIHNvdXJjZUluZGV4LCBoaXN0b3J5UGVyaW9kLCByZWZyZXNoSW50ZXJ2YWwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJ4Lk9ic2VydmFibGUuaW50ZXJ2YWwocmVmcmVzaEludGVydmFsKS5zdGFydFdpdGgoMClcclxuICAgICAgICAgICAgICAgIC5mbGF0TWFwKGZ1bmN0aW9uIChpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ4Lk9ic2VydmFibGUuZnJvbVByb21pc2UobG9hZEVuZHBvaW50RGV0YWlsc0Zyb21Nb25pdG9yaW5nU2VydmljZShlbmRwb2ludE5hbWUsIHNvdXJjZUluZGV4LCBoaXN0b3J5UGVyaW9kKSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBzZXJ2aWNlID0ge1xyXG4gICAgICAgICAgICBjcmVhdGVFbmRwb2ludHNTb3VyY2U6IGNyZWF0ZUVuZHBvaW50c1NvdXJjZSxcclxuICAgICAgICAgICAgY3JlYXRlRW5kcG9pbnREZXRhaWxzU291cmNlOiBjcmVhdGVFbmRwb2ludERldGFpbHNTb3VyY2VcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gc2VydmljZTtcclxuICAgIH1cclxuXHJcbiAgICBTZXJ2aWNlLiRpbmplY3QgPSBbJyRodHRwJywgJ3J4JywgJ3NjQ29uZmlnJywgJ3VyaScsICckcScsICd0b2FzdFNlcnZpY2UnXTtcclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZSgnc2VydmljZXMubW9uaXRvcmluZ1NlcnZpY2UnLCBbJ3NjJ10pXHJcbiAgICAgICAgLnNlcnZpY2UoJ21vbml0b3JpbmdTZXJ2aWNlJywgU2VydmljZSk7XHJcbn0od2luZG93LCB3aW5kb3cuYW5ndWxhciwgd2luZG93LmpRdWVyeSkpO1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9hcHAvbW9kdWxlcy9tb25pdG9yaW5nL2pzL3NlcnZpY2VzL3NlcnZpY2VzLm1vbml0b3JpbmcuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8\n"); - -/***/ }), -/* 9 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("\n\n(function (window, angular, undefined) {\n 'use strict';\n\n function controller($scope, $location, monitoringService, serviceControlService, toastService, historyPeriods, rx, $filter, smallGraphsMinimumYAxis, connectivityNotifier) {\n\n var subscription, endpointsFromScSubscription;\n\n $scope.periods = historyPeriods;\n $scope.selectedPeriod = $scope.periods[0];\n $scope.smallGraphsMinimumYAxis = smallGraphsMinimumYAxis;\n\n if ($location.$$search.historyPeriod) {\n $scope.selectedPeriod = $scope.periods[$scope.periods.findIndex(function (period) {\n return period.value == $location.$$search.historyPeriod;\n })];\n }\n\n $scope.endpoints = [];\n\n $scope.selectPeriod = function (period) {\n $scope.selectedPeriod = period;\n\n updateUI();\n };\n\n $scope.getDetailsUrl = function (endpoint) {\n return '#/endpoint_details/' + endpoint.name + '/' + (endpoint.sourceIndex | 0) + '?historyPeriod=' + $scope.selectedPeriod.value;\n };\n\n function fillDisplayValuesForEndpoint(endpoint) {\n\n $filter('graphduration')(endpoint.metrics.processingTime);\n $filter('graphduration')(endpoint.metrics.criticalTime);\n $filter('graphdecimal')(endpoint.metrics.queueLength, 0);\n $filter('graphdecimal')(endpoint.metrics.throughput, 2);\n $filter('graphdecimal')(endpoint.metrics.retries, 2);\n }\n\n function mergeIn(destination, source) {\n for (var propName in source) {\n if (source.hasOwnProperty(propName)) {\n destination[propName] = source[propName];\n }\n }\n }\n\n function updateUI() {\n if (subscription) {\n subscription.dispose();\n }\n\n if (endpointsFromScSubscription) {\n endpointsFromScSubscription.dispose();\n }\n\n var selectedPeriod = $scope.selectedPeriod;\n\n subscription = monitoringService.createEndpointsSource(selectedPeriod.value, selectedPeriod.refreshInterval).subscribe(function (endpoint) {\n if (endpoint.error) {\n connectivityNotifier.reportFailedConnection(endpoint.sourceIndex);\n if ($scope.endpoints) {\n $scope.endpoints.filter(function (item) {\n return item.sourceIndex === endpoint.sourceIndex;\n }).forEach(function (item) {\n return item.isScMonitoringDisconnected = true;\n });\n }\n } else {\n connectivityNotifier.reportSuccessfulConnection(endpoint.sourceIndex);\n var index = $scope.endpoints.findIndex(function (item) {\n return item.name === endpoint.name;\n });\n\n endpoint.isScMonitoringDisconnected = false;\n fillDisplayValuesForEndpoint(endpoint);\n if (index >= 0) {\n mergeIn($scope.endpoints[index], endpoint);\n } else {\n $scope.endpoints.push(endpoint);\n\n $scope.endpoints.sort(function (first, second) {\n if (first.name < second.name) {\n return -1;\n }\n\n if (first.name > second.name) {\n return 1;\n }\n\n return 0;\n });\n }\n }\n\n $scope.$apply();\n });\n\n endpointsFromScSubscription = Rx.Observable.interval(5000).startWith(0).flatMap(function (i) {\n return Rx.Observable.fromPromise(serviceControlService.getExceptionGroups('Endpoint Name', ''));\n }).selectMany(function (endpoints) {\n return endpoints.data;\n }).subscribe(function (endpoint) {\n var index = $scope.endpoints.findIndex(function (item) {\n return item.name === endpoint.title;\n });\n if (index >= 0) {\n $scope.endpoints[index].serviceControlId = endpoint.id;\n $scope.endpoints[index].errorCount = endpoint.count;\n } else {\n $scope.endpoints.push({ name: endpoint.title, errorCount: endpoint.count, serviceControlId: endpoint.id, isScMonitoringDisconnected: true });\n }\n });\n }\n\n updateUI();\n\n $scope.$on(\"$destroy\", function handler() {\n subscription.dispose();\n endpointsFromScSubscription.dispose();\n });\n };\n\n controller.$inject = ['$scope', '$location', 'monitoringService', 'serviceControlService', 'toastService', 'historyPeriods', 'rx', '$filter', 'smallGraphsMinimumYAxis', 'connectivityNotifier'];\n\n angular.module('monitored_endpoints').controller('monitoredEndpointsCtrl', controller);\n})(window, window.angular);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hcHAvbW9kdWxlcy9tb25pdG9yaW5nL2pzL21vbml0b3JlZF9lbmRwb2ludHMuY29udHJvbGxlci5qcz8wNmNlIl0sIm5hbWVzIjpbIndpbmRvdyIsImFuZ3VsYXIiLCJ1bmRlZmluZWQiLCJjb250cm9sbGVyIiwiJHNjb3BlIiwiJGxvY2F0aW9uIiwibW9uaXRvcmluZ1NlcnZpY2UiLCJzZXJ2aWNlQ29udHJvbFNlcnZpY2UiLCJ0b2FzdFNlcnZpY2UiLCJoaXN0b3J5UGVyaW9kcyIsInJ4IiwiJGZpbHRlciIsInNtYWxsR3JhcGhzTWluaW11bVlBeGlzIiwiY29ubmVjdGl2aXR5Tm90aWZpZXIiLCJzdWJzY3JpcHRpb24iLCJlbmRwb2ludHNGcm9tU2NTdWJzY3JpcHRpb24iLCJwZXJpb2RzIiwic2VsZWN0ZWRQZXJpb2QiLCIkJHNlYXJjaCIsImhpc3RvcnlQZXJpb2QiLCJmaW5kSW5kZXgiLCJwZXJpb2QiLCJ2YWx1ZSIsImVuZHBvaW50cyIsInNlbGVjdFBlcmlvZCIsInVwZGF0ZVVJIiwiZ2V0RGV0YWlsc1VybCIsImVuZHBvaW50IiwibmFtZSIsInNvdXJjZUluZGV4IiwiZmlsbERpc3BsYXlWYWx1ZXNGb3JFbmRwb2ludCIsIm1ldHJpY3MiLCJwcm9jZXNzaW5nVGltZSIsImNyaXRpY2FsVGltZSIsInF1ZXVlTGVuZ3RoIiwidGhyb3VnaHB1dCIsInJldHJpZXMiLCJtZXJnZUluIiwiZGVzdGluYXRpb24iLCJzb3VyY2UiLCJwcm9wTmFtZSIsImhhc093blByb3BlcnR5IiwiZGlzcG9zZSIsImNyZWF0ZUVuZHBvaW50c1NvdXJjZSIsInJlZnJlc2hJbnRlcnZhbCIsInN1YnNjcmliZSIsImVycm9yIiwicmVwb3J0RmFpbGVkQ29ubmVjdGlvbiIsImZpbHRlciIsIml0ZW0iLCJmb3JFYWNoIiwiaXNTY01vbml0b3JpbmdEaXNjb25uZWN0ZWQiLCJyZXBvcnRTdWNjZXNzZnVsQ29ubmVjdGlvbiIsImluZGV4IiwicHVzaCIsInNvcnQiLCJmaXJzdCIsInNlY29uZCIsIiRhcHBseSIsIlJ4IiwiT2JzZXJ2YWJsZSIsImludGVydmFsIiwic3RhcnRXaXRoIiwiZmxhdE1hcCIsImkiLCJmcm9tUHJvbWlzZSIsImdldEV4Y2VwdGlvbkdyb3VwcyIsInNlbGVjdE1hbnkiLCJkYXRhIiwidGl0bGUiLCJzZXJ2aWNlQ29udHJvbElkIiwiaWQiLCJlcnJvckNvdW50IiwiY291bnQiLCIkb24iLCJoYW5kbGVyIiwiJGluamVjdCIsIm1vZHVsZSJdLCJtYXBwaW5ncyI6Ijs7QUFBQyxXQUFTQSxNQUFULEVBQWlCQyxPQUFqQixFQUEwQkMsU0FBMUIsRUFBcUM7QUFDbEM7O0FBRUEsYUFBU0MsVUFBVCxDQUNJQyxNQURKLEVBRUlDLFNBRkosRUFHSUMsaUJBSEosRUFJSUMscUJBSkosRUFLSUMsWUFMSixFQU1JQyxjQU5KLEVBT0lDLEVBUEosRUFRSUMsT0FSSixFQVNJQyx1QkFUSixFQVVJQyxvQkFWSixFQVUwQjs7QUFFdEIsWUFBSUMsWUFBSixFQUFrQkMsMkJBQWxCOztBQUVBWCxlQUFPWSxPQUFQLEdBQWlCUCxjQUFqQjtBQUNBTCxlQUFPYSxjQUFQLEdBQXdCYixPQUFPWSxPQUFQLENBQWUsQ0FBZixDQUF4QjtBQUNBWixlQUFPUSx1QkFBUCxHQUFpQ0EsdUJBQWpDOztBQUVBLFlBQUlQLFVBQVVhLFFBQVYsQ0FBbUJDLGFBQXZCLEVBQXNDO0FBQ2xDZixtQkFBT2EsY0FBUCxHQUF3QmIsT0FBT1ksT0FBUCxDQUFlWixPQUFPWSxPQUFQLENBQWVJLFNBQWYsQ0FBeUIsVUFBVUMsTUFBVixFQUFrQjtBQUM5RSx1QkFBT0EsT0FBT0MsS0FBUCxJQUFnQmpCLFVBQVVhLFFBQVYsQ0FBbUJDLGFBQTFDO0FBQ0gsYUFGc0MsQ0FBZixDQUF4QjtBQUdIOztBQUVEZixlQUFPbUIsU0FBUCxHQUFtQixFQUFuQjs7QUFFQW5CLGVBQU9vQixZQUFQLEdBQXNCLFVBQVVILE1BQVYsRUFBa0I7QUFDcENqQixtQkFBT2EsY0FBUCxHQUF3QkksTUFB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QVM0QyxFQUEvRSxFQUFtRnBCLDRCQUE2QixJQUFoSCxFQUF0QjtBQUNIO0FBQ0osYUFiRCxDQURKO0FBZUg7O0FBRUQxQjs7QUFFQXJCLGVBQU9zRSxHQUFQLENBQVcsVUFBWCxFQUF1QixTQUFTQyxPQUFULEdBQW1CO0FBQ3RDN0QseUJBQWE0QixPQUFiO0FBQ0EzQix3Q0FBNEIyQixPQUE1QjtBQUNILFNBSEQ7QUFJSDs7QUFFRHZDLGVBQVd5RSxPQUFYLEdBQXFCLENBQ2pCLFFBRGlCLEVBRWpCLFdBRmlCLEVBR2pCLG1CQUhpQixFQUlqQix1QkFKaUIsRUFLakIsY0FMaUIsRUFNakIsZ0JBTmlCLEVBT2pCLElBUGlCLEVBUWpCLFNBUmlCLEVBU2pCLHlCQVRpQixFQVVqQixzQkFWaUIsQ0FBckI7O0FBYUEzRSxZQUFRNEUsTUFBUixDQUFlLHFCQUFmLEVBQ0sxRSxVQURMLENBQ2dCLHdCQURoQixFQUMwQ0EsVUFEMUM7QUFHSCxDQWhKQSxFQWdKQ0gsTUFoSkQsRUFnSlNBLE9BQU9DLE9BaEpoQixDQUFEIiwiZmlsZSI6IjkuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24od2luZG93LCBhbmd1bGFyLCB1bmRlZmluZWQpIHtcclxuICAgICd1c2Ugc3RyaWN0JztcclxuXHJcbiAgICBmdW5jdGlvbiBjb250cm9sbGVyKFxyXG4gICAgICAgICRzY29wZSxcclxuICAgICAgICAkbG9jYXRpb24sXHJcbiAgICAgICAgbW9uaXRvcmluZ1NlcnZpY2UsXHJcbiAgICAgICAgc2VydmljZUNvbnRyb2xTZXJ2aWNlLFxyXG4gICAgICAgIHRvYXN0U2VydmljZSxcclxuICAgICAgICBoaXN0b3J5UGVyaW9kcyxcclxuICAgICAgICByeCxcclxuICAgICAgICAkZmlsdGVyLFxyXG4gICAgICAgIHNtYWxsR3JhcGhzTWluaW11bVlBeGlzLFxyXG4gICAgICAgIGNvbm5lY3Rpdml0eU5vdGlmaWVyKSB7XHJcblxyXG4gICAgICAgIHZhciBzdWJzY3JpcHRpb24sIGVuZHBvaW50c0Zyb21TY1N1YnNjcmlwdGlvbjtcclxuXHJcbiAgICAgICAgJHNjb3BlLnBlcmlvZHMgPSBoaXN0b3J5UGVyaW9kcztcclxuICAgICAgICAkc2NvcGUuc2VsZWN0ZWRQZXJpb2QgPSAkc2NvcGUucGVyaW9kc1swXTtcclxuICAgICAgICAkc2NvcGUuc21hbGxHcmFwaHNNaW5pbXVtWUF4aXMgPSBzbWFsbEdyYXBoc01pbmltdW1ZQXhpcztcclxuXHJcbiAgICAgICAgaWYgKCRsb2NhdGlvbi4kJHNlYXJjaC5oaXN0b3J5UGVyaW9kKSB7XHJcbiAgICAgICAgICAgICRzY29wZS5zZWxlY3RlZFBlcmlvZCA9ICRzY29wZS5wZXJpb2RzWyRzY29wZS5wZXJpb2RzLmZpbmRJbmRleChmdW5jdGlvbiAocGVyaW9kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGVyaW9kLnZhbHVlID09ICRsb2NhdGlvbi4kJHNlYXJjaC5oaXN0b3J5UGVyaW9kO1xyXG4gICAgICAgICAgICB9KV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAkc2NvcGUuZW5kcG9pbnRzID0gW107XHJcblxyXG4gICAgICAgICRzY29wZS5zZWxlY3RQZXJpb2QgPSBmdW5jdGlvbiAocGVyaW9kKSB7XHJcbiAgICAgICAgICAgICRzY29wZS5zZWxlY3RlZFBlcmlvZCA9IHBlcmlvZDtcclxuXHJcbiAgICAgICAgICAgIHVwZGF0ZVVJKCk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgJHNjb3BlLmdldERldGFpbHNVcmwgPSBlbmRwb2ludCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAnIy9lbmRwb2ludF9kZXRhaWxzLycgKyBlbmRwb2ludC5uYW1lICsgJy8nICsgKGVuZHBvaW50LnNvdXJjZUluZGV4IHwgMCkgKyAnP2hpc3RvcnlQZXJpb2Q9JyArICRzY29wZS5zZWxlY3RlZFBlcmlvZC52YWx1ZTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBmdW5jdGlvbiBmaWxsRGlzcGxheVZhbHVlc0ZvckVuZHBvaW50KGVuZHBvaW50KSB7XHJcblxyXG4gICAgICAgICAgICAkZmlsdGVyKCdncmFwaGR1cmF0aW9uJykoZW5kcG9pbnQubWV0cmljcy5wcm9jZXNzaW5nVGltZSk7XHJcbiAgICAgICAgICAgICRmaWx0ZXIoJ2dyYXBoZHVyYXRpb24nKShlbmRwb2ludC5tZXRyaWNzLmNyaXRpY2FsVGltZSk7XHJcbiAgICAgICAgICAgICRmaWx0ZXIoJ2dyYXBoZGVjaW1hbCcpKGVuZHBvaW50Lm1ldHJpY3MucXVldWVMZW5ndGgsIDApO1xyXG4gICAgICAgICAgICAkZmlsdGVyKCdncmFwaGRlY2ltYWwnKShlbmRwb2ludC5tZXRyaWNzLnRocm91Z2hwdXQsIDIpO1xyXG4gICAgICAgICAgICAkZmlsdGVyKCdncmFwaGRlY2ltYWwnKShlbmRwb2ludC5tZXRyaWNzLnJldHJpZXMsIDIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gbWVyZ2VJbihkZXN0aW5hdGlvbiwgc291cmNlKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIHByb3BOYW1lIGluIHNvdXJjZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbltwcm9wTmFtZV0gPSBzb3VyY2VbcHJvcE5hbWVdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiB1cGRhdGVVSSgpIHtcclxuICAgICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLmRpc3Bvc2UoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGVuZHBvaW50c0Zyb21TY1N1YnNjcmlwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgZW5kcG9pbnRzRnJvbVNjU3Vic2NyaXB0aW9uLmRpc3Bvc2UoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIHNlbGVjdGVkUGVyaW9kID0gJHNjb3BlLnNlbGVjdGVkUGVyaW9kO1xyXG5cclxuICAgICAgICAgICAgc3Vic2NyaXB0aW9uID0gbW9uaXRvcmluZ1NlcnZpY2UuY3JlYXRlRW5kcG9pbnRzU291cmNlKHNlbGVjdGVkUGVyaW9kLnZhbHVlLCBzZWxlY3RlZFBlcmlvZC5yZWZyZXNoSW50ZXJ2YWwpXHJcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKGZ1bmN0aW9uKGVuZHBvaW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVuZHBvaW50LmVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpdml0eU5vdGlmaWVyLnJlcG9ydEZhaWxlZENvbm5lY3Rpb24oZW5kcG9pbnQuc291cmNlSW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHNjb3BlLmVuZHBvaW50cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmVuZHBvaW50cy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uc291cmNlSW5kZXggPT09IGVuZHBvaW50LnNvdXJjZUluZGV4KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKChpdGVtKSA9PiBpdGVtLmlzU2NNb25pdG9yaW5nRGlzY29ubmVjdGVkID0gdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aXZpdHlOb3RpZmllci5yZXBvcnRTdWNjZXNzZnVsQ29ubmVjdGlvbihlbmRwb2ludC5zb3VyY2VJbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9ICRzY29wZS5lbmRwb2ludHMuZmluZEluZGV4KGZ1bmN0aW9uKGl0ZW0pIHsgcmV0dXJuIGl0ZW0ubmFtZSA9PT0gZW5kcG9pbnQubmFtZSB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50LmlzU2NNb25pdG9yaW5nRGlzY29ubmVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxEaXNwbGF5VmFsdWVzRm9yRW5kcG9pbnQoZW5kcG9pbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlSW4oJHNjb3BlLmVuZHBvaW50c1tpbmRleF0sIGVuZHBvaW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5lbmRwb2ludHMucHVzaChlbmRwb2ludCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmVuZHBvaW50cy5zb3J0KGZ1bmN0aW9uKGZpcnN0LCBzZWNvbmQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QubmFtZSA8IHNlY29uZC5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdC5uYW1lID4gc2Vjb25kLm5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAkc2NvcGUuJGFwcGx5KCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGVuZHBvaW50c0Zyb21TY1N1YnNjcmlwdGlvbiA9XHJcbiAgICAgICAgICAgICAgICBSeC5PYnNlcnZhYmxlLmludGVydmFsKDUwMDApLnN0YXJ0V2l0aCgwKVxyXG4gICAgICAgICAgICAgICAgLmZsYXRNYXAoZnVuY3Rpb24oaSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSeC5PYnNlcnZhYmxlLmZyb21Qcm9taXNlKHNlcnZpY2VDb250cm9sU2VydmljZS5nZXRFeGNlcHRpb25Hcm91cHMoJ0VuZHBvaW50IE5hbWUnLCAnJykpO1xyXG4gICAgICAgICAgICAgICAgfSkuc2VsZWN0TWFueShmdW5jdGlvbihlbmRwb2ludHMpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW5kcG9pbnRzLmRhdGE7XHJcbiAgICAgICAgICAgICAgICB9KS5zdWJzY3JpYmUoZnVuY3Rpb24gKGVuZHBvaW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gJHNjb3BlLmVuZHBvaW50cy5maW5kSW5kZXgoZnVuY3Rpb24oaXRlbSkgeyByZXR1cm4gaXRlbS5uYW1lID09PSBlbmRwb2ludC50aXRsZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZW5kcG9pbnRzW2luZGV4XS5zZXJ2aWNlQ29udHJvbElkID0gZW5kcG9pbnQuaWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5lbmRwb2ludHNbaW5kZXhdLmVycm9yQ291bnQgPSBlbmRwb2ludC5jb3VudDtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZW5kcG9pbnRzLnB1c2goeyBuYW1lOiBlbmRwb2ludC50aXRsZSwgZXJyb3JDb3VudDogZW5kcG9pbnQuY291bnQsIHNlcnZpY2VDb250cm9sSWQ6IGVuZHBvaW50LmlkLCBpc1NjTW9uaXRvcmluZ0Rpc2Nvbm5lY3RlZCA6IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB1cGRhdGVVSSgpO1xyXG5cclxuICAgICAgICAkc2NvcGUuJG9uKFwiJGRlc3Ryb3lcIiwgZnVuY3Rpb24gaGFuZGxlcigpIHtcclxuICAgICAgICAgICAgc3Vic2NyaXB0aW9uLmRpc3Bvc2UoKTtcclxuICAgICAgICAgICAgZW5kcG9pbnRzRnJvbVNjU3Vic2NyaXB0aW9uLmRpc3Bvc2UoKTtcclxuICAgICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgY29udHJvbGxlci4kaW5qZWN0ID0gW1xyXG4gICAgICAgICckc2NvcGUnLFxyXG4gICAgICAgICckbG9jYXRpb24nLFxyXG4gICAgICAgICdtb25pdG9yaW5nU2VydmljZScsXHJcbiAgICAgICAgJ3NlcnZpY2VDb250cm9sU2VydmljZScsXHJcbiAgICAgICAgJ3RvYXN0U2VydmljZScsXHJcbiAgICAgICAgJ2hpc3RvcnlQZXJpb2RzJyxcclxuICAgICAgICAncngnLFxyXG4gICAgICAgICckZmlsdGVyJyxcclxuICAgICAgICAnc21hbGxHcmFwaHNNaW5pbXVtWUF4aXMnLFxyXG4gICAgICAgICdjb25uZWN0aXZpdHlOb3RpZmllcidcclxuICAgIF07XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoJ21vbml0b3JlZF9lbmRwb2ludHMnKVxyXG4gICAgICAgIC5jb250cm9sbGVyKCdtb25pdG9yZWRFbmRwb2ludHNDdHJsJywgY29udHJvbGxlcik7XHJcblxyXG59KHdpbmRvdywgd2luZG93LmFuZ3VsYXIpKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9hcHAvbW9kdWxlcy9tb25pdG9yaW5nL2pzL21vbml0b3JlZF9lbmRwb2ludHMuY29udHJvbGxlci5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9\n"); - -/***/ }), -/* 10 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("\n\n(function (window, angular, undefined) {\n 'use strict';\n\n function routeProvider($routeProvider) {\n var template = __webpack_require__(11);\n\n $routeProvider.when('/monitored_endpoints', {\n data: {\n pageTitle: 'Monitored Endpoints'\n },\n template: template,\n controller: 'monitoredEndpointsCtrl',\n controllerAs: 'vm',\n reloadOnSearch: false\n });\n };\n\n routeProvider.$inject = ['$routeProvider'];\n\n angular.module('monitored_endpoints').config(routeProvider);\n})(window, window.angular);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hcHAvbW9kdWxlcy9tb25pdG9yaW5nL2pzL21vbml0b3JlZF9lbmRwb2ludHMucm91dGUuanM/MjcwNiJdLCJuYW1lcyI6WyJ3aW5kb3ciLCJhbmd1bGFyIiwidW5kZWZpbmVkIiwicm91dGVQcm92aWRlciIsIiRyb3V0ZVByb3ZpZGVyIiwidGVtcGxhdGUiLCJyZXF1aXJlIiwid2hlbiIsImRhdGEiLCJwYWdlVGl0bGUiLCJjb250cm9sbGVyIiwiY29udHJvbGxlckFzIiwicmVsb2FkT25TZWFyY2giLCIkaW5qZWN0IiwibW9kdWxlIiwiY29uZmlnIl0sIm1hcHBpbmdzIjoiOztBQUFDLFdBQVVBLE1BQVYsRUFBa0JDLE9BQWxCLEVBQTJCQyxTQUEzQixFQUFzQztBQUNuQzs7QUFFQSxhQUFTQyxhQUFULENBQXVCQyxjQUF2QixFQUF1QztBQUNuQyxZQUFJQyxXQUFXLG1CQUFBQyxDQUFRLEVBQVIsQ0FBZjs7QUFFQUYsdUJBQWVHLElBQWYsQ0FBb0Isc0JBQXBCLEVBQTRDO0FBQ3hDQyxrQkFBTTtBQUNGQywyQkFBVztBQURULGFBRGtDO0FBSXhDSixzQkFBVUEsUUFKOEI7QUFLeENLLHdCQUFZLHdCQUw0QjtBQU14Q0MsMEJBQWMsSUFOMEI7QUFPeENDLDRCQUFnQjtBQVB3QixTQUE1QztBQVNIOztBQUVEVCxrQkFBY1UsT0FBZCxHQUF3QixDQUNwQixnQkFEb0IsQ0FBeEI7O0FBSUFaLFlBQVFhLE1BQVIsQ0FBZSxxQkFBZixFQUNLQyxNQURMLENBQ1laLGFBRFo7QUFFSCxDQXZCQSxFQXVCRUgsTUF2QkYsRUF1QlVBLE9BQU9DLE9BdkJqQixDQUFEIiwiZmlsZSI6IjEwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uICh3aW5kb3csIGFuZ3VsYXIsIHVuZGVmaW5lZCkge1xyXG4gICAgJ3VzZSBzdHJpY3QnO1xyXG5cclxuICAgIGZ1bmN0aW9uIHJvdXRlUHJvdmlkZXIoJHJvdXRlUHJvdmlkZXIpIHtcclxuICAgICAgICBsZXQgdGVtcGxhdGUgPSByZXF1aXJlKCcuLy4uL3ZpZXdzL21vbml0b3JlZF9lbmRwb2ludHMuaHRtbCcpO1xyXG5cclxuICAgICAgICAkcm91dGVQcm92aWRlci53aGVuKCcvbW9uaXRvcmVkX2VuZHBvaW50cycsIHtcclxuICAgICAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICAgICAgcGFnZVRpdGxlOiAnTW9uaXRvcmVkIEVuZHBvaW50cydcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiAnbW9uaXRvcmVkRW5kcG9pbnRzQ3RybCcsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ3ZtJyxcclxuICAgICAgICAgICAgcmVsb2FkT25TZWFyY2g6IGZhbHNlXHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHJvdXRlUHJvdmlkZXIuJGluamVjdCA9IFtcclxuICAgICAgICAnJHJvdXRlUHJvdmlkZXInXHJcbiAgICBdO1xyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKCdtb25pdG9yZWRfZW5kcG9pbnRzJylcclxuICAgICAgICAuY29uZmlnKHJvdXRlUHJvdmlkZXIpO1xyXG59ICh3aW5kb3csIHdpbmRvdy5hbmd1bGFyKSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vYXBwL21vZHVsZXMvbW9uaXRvcmluZy9qcy9tb25pdG9yZWRfZW5kcG9pbnRzLnJvdXRlLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///10\n"); - -/***/ }), -/* 11 */ -/***/ (function(module, exports) { - -eval("module.exports = \"

    Endpoints overview

    Endpoint name
    Queue Length (msgs)

    Queue length: The estimated number of messages in an endpoint's queue.

    WARNING: This is an experimental feature. Learn more

    Throughput (msgs/s)
    Scheduled retry rate (msgs/s)
    Processing Time (t)
    Critical Time (t)
    {{(endpoint.isStale == true || endpoint.isScMonitoringDisconnected == true) ? \\\"\\\" : endpoint.metrics.queueLength.displayValue}} ?
    {{(endpoint.isStale == true || endpoint.isScMonitoringDisconnected == true) ? \\\"\\\" : endpoint.metrics.throughput.displayValue}} ?
    {{(endpoint.isStale == true || endpoint.isScMonitoringDisconnected == true) ? \\\"\\\" : endpoint.metrics.retries.displayValue}} ?
    {{(endpoint.isStale == true || endpoint.isScMonitoringDisconnected == true) ? \\\"\\\" : endpoint.metrics.processingTime.displayValue.value}} ? {{endpoint.metrics.processingTime.displayValue.unit}}
    {{(endpoint.isStale == true || endpoint.isScMonitoringDisconnected == true) ? \\\"\\\" : endpoint.metrics.criticalTime.displayValue.value}} ? {{endpoint.metrics.criticalTime.displayValue.unit}}
    \";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hcHAvbW9kdWxlcy9tb25pdG9yaW5nL3ZpZXdzL21vbml0b3JlZF9lbmRwb2ludHMuaHRtbD8zYTg3Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHNmQUFzZixjQUFjLEtBQUssYUFBYSxtd0ZBQW13Rix5QkFBeUIsR0FBRyxlQUFlLDJoQkFBMmhCLDJCQUEyQiw4Q0FBOEMsMENBQTBDLDZIQUE2SCwwQ0FBMEMscU5BQXFOLHFDQUFxQywwR0FBMEcsOEhBQThILHFSQUFxUixvQ0FBb0Msd0dBQXdHLDZIQUE2SCxrUkFBa1IsaUNBQWlDLHFHQUFxRywwSEFBMEgseVJBQXlSLHdDQUF3Qyw2R0FBNkcsdUlBQXVJLG1MQUFtTCxtREFBbUQseU1BQXlNLHNDQUFzQywyR0FBMkcscUlBQXFJLG1MQUFtTCxpREFBaUQiLCJmaWxlIjoiMTEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiBjbGFzcz1jb250YWluZXIgbmctc2hvdz1lbmRwb2ludHMubGVuZ3RoPiA8ZGl2IGNsYXNzPVxcXCJyb3cgbW9uaXRvcmluZy1oZWFkXFxcIj4gPGRpdiBjbGFzcz1cXFwiY29sLXNtLTkgbm8tc2lkZS1wYWRkaW5nIGxpc3Qtc2VjdGlvblxcXCI+IDxoMT5FbmRwb2ludHMgb3ZlcnZpZXc8L2gxPiA8L2Rpdj4gPGRpdiBjbGFzcz1cXFwiY29sLXNtLTMgbm8tc2lkZS1wYWRkaW5nIHRvb2xiYXItbWVudXNcXFwiPiA8dWwgY2xhc3M9XFxcIm5hdiBuYXYtcGlsbHMgcGVyaW9kLXNlbGVjdG9yXFxcIj4gPGxpIHJvbGU9cHJlc2VudGF0aW9uIG5nLXJlcGVhdD1cXFwicGVyaW9kIGluIHBlcmlvZHNcXFwiIG5nLWNsYXNzPVxcXCIocGVyaW9kLnZhbHVlID09IHNlbGVjdGVkUGVyaW9kLnZhbHVlID8gJ2FjdGl2ZScgOiAnbm90c2VsZWN0ZWQnKVxcXCI+IDxhIG5nLWNsaWNrPXNlbGVjdFBlcmlvZChwZXJpb2QpIGhyZWY9XFxcIiMvbW9uaXRvcmVkX2VuZHBvaW50cz9oaXN0b3J5UGVyaW9kPXt7cGVyaW9kLnZhbHVlfX1cXFwiPnt7cGVyaW9kLnRleHR9fTwvYT4gPC9saT4gPC91bD4gPC9kaXY+IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1jb250YWluZXI+IDxzZWN0aW9uIG5nLXNob3c9dHJ1ZT4gPGRpdiBuZy1pbmNsdWRlPVxcXCInbW9kdWxlcy9tb25pdG9yaW5nL3ZpZXdzL21vbml0b3Jpbmdfbm90X2F2YWlsYWJsZS5odG1sJ1xcXCIgbmctc2hvdz0hZW5kcG9pbnRzLmxlbmd0aD48L2Rpdj4gPGRpdiBuZy1zaG93PWVuZHBvaW50cy5sZW5ndGggY2xhc3M9XFxcInJvdyBib3ggYm94LW5vLWNsaWNrIHRhYmxlLWhlYWQtcm93XFxcIj4gPGRpdiBjbGFzcz1cXFwiY29sLXNtLTIgY29sLXhsLTdcXFwiPiA8ZGl2IGNsYXNzPVxcXCJyb3cgYm94LWhlYWRlclxcXCI+IDxkaXYgY2xhc3M9Y29sLXNtLTEyPiBFbmRwb2ludCBuYW1lIDwvZGl2PiA8L2Rpdj4gPC9kaXY+IDxkaXYgY2xhc3M9XFxcImNvbC1zbS0yIGNvbC14bC0xIG5vLXNpZGUtcGFkZGluZ1xcXCI+IDxkaXYgY2xhc3M9XFxcInJvdyBib3gtaGVhZGVyXFxcIj4gPGRpdiBjbGFzcz1cXFwiY29sLXNtLTEyIG5vLXNpZGUtcGFkZGluZ1xcXCI+IDxkaXYgY2xhc3M9dG9vbHRpcC10cmlnZ2VyPiBRdWV1ZSBMZW5ndGggPHNwYW4gY2xhc3M9dGFibGUtaGVhZGVyLXVuaXQ+KG1zZ3MpPC9zcGFuPiA8aSBjbGFzcz1cXFwiZmEgZmEtZmxhc2sgZmFrZS1saW5rXFxcIj48L2k+IDxkaXYgY2xhc3M9aW50ZXJhY3RpdmUtdG9vbHRpcD4gPGRpdiBjbGFzcz10b29sdGlwLWNvbnRlbnRzPiA8cD5RdWV1ZSBsZW5ndGg6IFRoZSBlc3RpbWF0ZWQgbnVtYmVyIG9mIG1lc3NhZ2VzIGluIGFuIGVuZHBvaW50J3MgcXVldWUuPC9wPiA8cD5XQVJOSU5HOiBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlLiA8YSBocmVmPVxcXCJodHRwczovL2RvY3MucGFydGljdWxhci5uZXQvc2VhcmNoP3E9bnNlcnZpY2VidXMrcXVldWUrbGVuZ3RoK21ldHJpYyslMmJleHBlcmltZW50YWxcXFwiIHRhcmdldD1fYmxhbms+TGVhcm4gbW9yZTwvYT4gPGkgY2xhc3M9XFxcImZhIGZhLWV4dGVybmFsLWxpbmsgZmFrZS1saW5rXFxcIj48L2k+IDwvcD4gPC9kaXY+IDwvZGl2PiA8L2Rpdj4gPC9kaXY+IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cXFwiY29sLXNtLTIgY29sLXhsLTEgbm8tc2lkZS1wYWRkaW5nXFxcIj4gPGRpdiBjbGFzcz1cXFwicm93IGJveC1oZWFkZXJcXFwiPiA8ZGl2IGNsYXNzPVxcXCJjb2wtc20tMTIgbm8tc2lkZS1wYWRkaW5nXFxcIiB1aWItdG9vbHRpcD1cXFwiVGhyb3VnaHB1dDogVGhlIG51bWJlciBvZiBtZXNzYWdlcyBwZXIgc2Vjb25kIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQgYnkgYSByZWNlaXZpbmcgZW5kcG9pbnQuXFxcIj4gVGhyb3VnaHB1dCA8c3BhbiBjbGFzcz10YWJsZS1oZWFkZXItdW5pdD4obXNncy9zKTwvc3Bhbj4gPC9kaXY+IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cXFwiY29sLXNtLTIgY29sLXhsLTEgbm8tc2lkZS1wYWRkaW5nXFxcIj4gPGRpdiBjbGFzcz1cXFwicm93IGJveC1oZWFkZXJcXFwiPiA8ZGl2IGNsYXNzPVxcXCJjb2wtc20tMTIgbm8tc2lkZS1wYWRkaW5nXFxcIiB1aWItdG9vbHRpcD1cXFwiU2NoZWR1bGVkIHJldHJ5IHJhdGU6IFRoZSBudW1iZXIgb2YgbWVzc2FnZXMgcGVyIHNlY29uZCBzY2hlZHVsZWQgZm9yIHJldHJpZXMgKGltbWVkaWF0ZSBvciBkZWxheWVkKS5cXFwiPiBTY2hlZHVsZWQgcmV0cnkgcmF0ZSA8c3BhbiBjbGFzcz10YWJsZS1oZWFkZXItdW5pdD4obXNncy9zKTwvc3Bhbj4gPC9kaXY+IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cXFwiY29sLXNtLTIgY29sLXhsLTEgbm8tc2lkZS1wYWRkaW5nXFxcIj4gPGRpdiBjbGFzcz1cXFwicm93IGJveC1oZWFkZXJcXFwiPiA8ZGl2IGNsYXNzPVxcXCJjb2wtc20tMTIgbm8tc2lkZS1wYWRkaW5nXFxcIiB1aWItdG9vbHRpcD1cXFwiUHJvY2Vzc2luZyB0aW1lOiBUaGUgdGltZSB0YWtlbiBmb3IgYSByZWNlaXZpbmcgZW5kcG9pbnQgdG8gc3VjY2Vzc2Z1bGx5IHByb2Nlc3MgYSBtZXNzYWdlLlxcXCI+IFByb2Nlc3NpbmcgVGltZSA8c3BhbiBjbGFzcz10YWJsZS1oZWFkZXItdW5pdD4odCk8L3NwYW4+IDwvZGl2PiA8L2Rpdj4gPC9kaXY+IDxkaXYgY2xhc3M9XFxcImNvbC1zbS0yIGNvbC14bC0xIG5vLXNpZGUtcGFkZGluZ1xcXCI+IDxkaXYgY2xhc3M9XFxcInJvdyBib3gtaGVhZGVyXFxcIj4gPGRpdiBjbGFzcz1cXFwiY29sLXNtLTEyIG5vLXNpZGUtcGFkZGluZ1xcXCIgdWliLXRvb2x0aXA9XFxcIkNyaXRpY2FsIHRpbWU6IFRoZSBlbGFwc2VkIHRpbWUgZnJvbSB3aGVuIGEgbWVzc2FnZSB3YXMgc2VudCwgdW50aWwgaXQgd2FzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQgYnkgYSByZWNlaXZpbmcgZW5kcG9pbnQuXFxcIj4gQ3JpdGljYWwgVGltZSA8c3BhbiBjbGFzcz10YWJsZS1oZWFkZXItdW5pdD4odCk8L3NwYW4+IDwvZGl2PiA8L2Rpdj4gPC9kaXY+IDwvZGl2PiA8ZGl2IGNsYXNzPXJvdz4gPGRpdiBjbGFzcz1cXFwiY29sLXNtLTEyIG5vLXNpZGUtcGFkZGluZ1xcXCI+IDxkaXYgY2xhc3M9XFxcInJvdyBib3ggZW5kcG9pbnQtcm93XFxcIiBuZy1yZXBlYXQ9XFxcImVuZHBvaW50IGluIGVuZHBvaW50c1xcXCIgbmctbW91c2VlbnRlcj1cXFwiZW5kcG9pbnQuaG92ZXIxPXRydWVcXFwiIG5nLW1vdXNlbGVhdmU9XFxcImVuZHBvaW50LmhvdmVyMT1mYWxzZVxcXCI+IDxkaXYgY2xhc3M9XFxcImNvbC1zbS0xMiBuby1zaWRlLXBhZGRpbmdcXFwiPiA8ZGl2IGNsYXNzPXJvdz4gPGRpdiBjbGFzcz1cXFwiY29sLXNtLTIgY29sLXhsLTcgZW5kcG9pbnQtbmFtZSBuYW1lLW92ZXJ2aWV3XFxcIj4gPGRpdiBjbGFzcz1cXFwicm93IGJveC1oZWFkZXJcXFwiPiA8ZGl2IGNsYXNzPVxcXCJjb2wtbGctbWF4LTggbm8tc2lkZS1wYWRkaW5nIGxlYWRcXFwiPiA8YSBuZy1jbGljaz1cXFwiZW5kcG9pbnQuaXNFeHBhbmRlZCA9ICFlbmRwb2ludC5pc0V4cGFuZGVkXFxcIiBuZy1ocmVmPXt7Z2V0RGV0YWlsc1VybChlbmRwb2ludCl9fT57e2VuZHBvaW50Lm5hbWV9fTwvYT4gPC9kaXY+IDxkaXYgY2xhc3M9XFxcImNvbC1sZy01IG5vLXNpZGUtcGFkZGluZyBlbmRwb2ludC1zdGF0dXNcXFwiPiA8c3BhbiBjbGFzcz13YXJuaW5nIG5nLWlmPWVuZHBvaW50LmlzU2NNb25pdG9yaW5nRGlzY29ubmVjdGVkPiA8aSBjbGFzcz1cXFwiZmEgcGEtbW9uaXRvcmluZy1sb3N0IGVuZHBvaW50cy1vdmVydmlld1xcXCIgdWliLXRvb2x0aXA9XFxcIlVuYWJsZSB0byBjb25uZWN0IHRvIG1vbml0b3Jpbmcgc2VydmVyXFxcIj48L2k+IDwvc3Bhbj4gPHNwYW4gY2xhc3M9d2FybmluZyBuZy1pZj1lbmRwb2ludC5pc1N0YWxlPiA8aSBjbGFzcz1cXFwiZmEgcGEtZW5kcG9pbnQtbG9zdCBlbmRwb2ludHMtb3ZlcnZpZXdcXFwiIHVpYi10b29sdGlwPVxcXCJVbmFibGUgdG8gY29ubmVjdCB0byBpbnN0YW5jZVxcXCI+PC9pPiA8L3NwYW4+IDxzcGFuIGNsYXNzPXdhcm5pbmcgbmctaWY9ZW5kcG9pbnQuZXJyb3JDb3VudD4gPGEgbmctaWY9ZW5kcG9pbnQuZXJyb3JDb3VudCBjbGFzcz1cXFwid2FybmluZyBidG5cXFwiIGhyZWY9Iy9mYWlsZWQtbWVzc2FnZXMvZ3JvdXBzL3t7ZW5kcG9pbnQuc2VydmljZUNvbnRyb2xJZH19PiA8aSBjbGFzcz1cXFwiZmEgZmEtZW52ZWxvcGVcXFwiIHVpYi10b29sdGlwPVxcXCJ7e2VuZHBvaW50LmVycm9yQ291bnQgfCBtZXRyaWNzbGFyZ2VudW1iZXJ9fSBmYWlsZWQgbWVzc2FnZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZW5kcG9pbnQuIENsaWNrIHRvIHNlZSBsaXN0LlxcXCI+PC9pPiA8c3BhbiBjbGFzcz1cXFwiYmFkZ2UgYmFkZ2UtaW1wb3J0YW50IG5nLWJpbmRpbmdcXFwiPnt7ZW5kcG9pbnQuZXJyb3JDb3VudCB8IG1ldHJpY3NsYXJnZW51bWJlcn19PC9zcGFuPiA8L2E+IDwvc3Bhbj4gPC9kaXY+IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cXFwiY29sLXNtLTIgY29sLXhsLTEgbm8tc2lkZS1wYWRkaW5nXFxcIj4gPGRpdiBjbGFzcz1cXFwicm93IGJveC1oZWFkZXJcXFwiPiA8ZGl2IGNsYXNzPW5vLXNpZGUtcGFkZGluZz4gPGdyYXBoIHBsb3QtZGF0YT1lbmRwb2ludC5tZXRyaWNzLnF1ZXVlTGVuZ3RoIG1pbmltdW0teWF4aXM9e3tzbWFsbEdyYXBoc01pbmltdW1ZQXhpcy5xdWV1ZUxlbmd0aH19IGNsYXNzPVxcXCJncmFwaCBxdWV1ZS1sZW5ndGggcHVsbC1sZWZ0XFxcIj48L2dyYXBoPiA8L2Rpdj4gPGRpdiBjbGFzcz1cXFwibm8tc2lkZS1wYWRkaW5nIHNwYXJrbGluZS12YWx1ZVxcXCI+IHt7KGVuZHBvaW50LmlzU3RhbGUgPT0gdHJ1ZSB8fCBlbmRwb2ludC5pc1NjTW9uaXRvcmluZ0Rpc2Nvbm5lY3RlZCA9PSB0cnVlKSA/IFxcXCJcXFwiIDogZW5kcG9pbnQubWV0cmljcy5xdWV1ZUxlbmd0aC5kaXNwbGF5VmFsdWV9fSA8c3Ryb25nIG5nLWlmPVxcXCJlbmRwb2ludC5pc1N0YWxlIHx8IGVuZHBvaW50LmlzU2NNb25pdG9yaW5nRGlzY29ubmVjdGVkXFxcIj4/PC9zdHJvbmc+IDwvZGl2PiA8L2Rpdj4gPC9kaXY+IDxkaXYgY2xhc3M9XFxcImNvbC1zbS0yIGNvbC14bC0xIG5vLXNpZGUtcGFkZGluZ1xcXCI+IDxkaXYgY2xhc3M9XFxcInJvdyBib3gtaGVhZGVyXFxcIj4gPGRpdiBjbGFzcz1uby1zaWRlLXBhZGRpbmc+IDxncmFwaCBwbG90LWRhdGE9ZW5kcG9pbnQubWV0cmljcy50aHJvdWdocHV0IG1pbmltdW0teWF4aXM9e3tzbWFsbEdyYXBoc01pbmltdW1ZQXhpcy50aHJvdWdocHV0fX0gY2xhc3M9XFxcImdyYXBoIHRocm91Z2hwdXQgcHVsbC1sZWZ0XFxcIj48L2dyYXBoPiA8L2Rpdj4gPGRpdiBjbGFzcz1cXFwibm8tc2lkZS1wYWRkaW5nIHNwYXJrbGluZS12YWx1ZVxcXCI+IHt7KGVuZHBvaW50LmlzU3RhbGUgPT0gdHJ1ZSB8fCBlbmRwb2ludC5pc1NjTW9uaXRvcmluZ0Rpc2Nvbm5lY3RlZCA9PSB0cnVlKSA/IFxcXCJcXFwiIDogZW5kcG9pbnQubWV0cmljcy50aHJvdWdocHV0LmRpc3BsYXlWYWx1ZX19IDxzdHJvbmcgbmctaWY9XFxcImVuZHBvaW50LmlzU3RhbGUgfHwgZW5kcG9pbnQuaXNTY01vbml0b3JpbmdEaXNjb25uZWN0ZWRcXFwiPj88L3N0cm9uZz4gPC9kaXY+IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cXFwiY29sLXNtLTIgY29sLXhsLTEgbm8tc2lkZS1wYWRkaW5nXFxcIj4gPGRpdiBjbGFzcz1cXFwicm93IGJveC1oZWFkZXJcXFwiPiA8ZGl2IGNsYXNzPW5vLXNpZGUtcGFkZGluZz4gPGdyYXBoIHBsb3QtZGF0YT1lbmRwb2ludC5tZXRyaWNzLnJldHJpZXMgbWluaW11bS15YXhpcz17e3NtYWxsR3JhcGhzTWluaW11bVlBeGlzLnJldHJpZXN9fSBjbGFzcz1cXFwiZ3JhcGggcmV0cmllcyBwdWxsLWxlZnRcXFwiPjwvZ3JhcGg+IDwvZGl2PiA8ZGl2IGNsYXNzPVxcXCJuby1zaWRlLXBhZGRpbmcgc3BhcmtsaW5lLXZhbHVlXFxcIj4ge3soZW5kcG9pbnQuaXNTdGFsZSA9PSB0cnVlIHx8IGVuZHBvaW50LmlzU2NNb25pdG9yaW5nRGlzY29ubmVjdGVkID09IHRydWUpID8gXFxcIlxcXCIgOiBlbmRwb2ludC5tZXRyaWNzLnJldHJpZXMuZGlzcGxheVZhbHVlfX0gPHN0cm9uZyBuZy1pZj1cXFwiZW5kcG9pbnQuaXNTdGFsZSB8fCBlbmRwb2ludC5pc1NjTW9uaXRvcmluZ0Rpc2Nvbm5lY3RlZFxcXCI+Pzwvc3Ryb25nPiA8L2Rpdj4gPC9kaXY+IDwvZGl2PiA8ZGl2IGNsYXNzPVxcXCJjb2wtc20tMiBjb2wteGwtMSBuby1zaWRlLXBhZGRpbmdcXFwiPiA8ZGl2IGNsYXNzPVxcXCJyb3cgYm94LWhlYWRlclxcXCI+IDxkaXYgY2xhc3M9bm8tc2lkZS1wYWRkaW5nPiA8Z3JhcGggcGxvdC1kYXRhPWVuZHBvaW50Lm1ldHJpY3MucHJvY2Vzc2luZ1RpbWUgbWluaW11bS15YXhpcz17e3NtYWxsR3JhcGhzTWluaW11bVlBeGlzLnByb2Nlc3NpbmdUaW1lfX0gY2xhc3M9XFxcImdyYXBoIHByb2Nlc3NpbmctdGltZSBwdWxsLWxlZnRcXFwiPjwvZ3JhcGg+IDwvZGl2PiA8ZGl2IGNsYXNzPVxcXCJuby1zaWRlLXBhZGRpbmcgc3BhcmtsaW5lLXZhbHVlXFxcIj4ge3soZW5kcG9pbnQuaXNTdGFsZSA9PSB0cnVlIHx8IGVuZHBvaW50LmlzU2NNb25pdG9yaW5nRGlzY29ubmVjdGVkID09IHRydWUpID8gXFxcIlxcXCIgOiBlbmRwb2ludC5tZXRyaWNzLnByb2Nlc3NpbmdUaW1lLmRpc3BsYXlWYWx1ZS52YWx1ZX19IDxzdHJvbmcgbmctaWY9XFxcImVuZHBvaW50LmlzU3RhbGUgfHwgZW5kcG9pbnQuaXNTY01vbml0b3JpbmdEaXNjb25uZWN0ZWRcXFwiPj88L3N0cm9uZz4gPHNwYW4gbmctaWY9XFxcImVuZHBvaW50LmlzU3RhbGUgPT0gZmFsc2UgJiYgZW5kcG9pbnQuaXNTY01vbml0b3JpbmdEaXNjb25uZWN0ZWQgPT0gZmFsc2VcXFwiPiB7e2VuZHBvaW50Lm1ldHJpY3MucHJvY2Vzc2luZ1RpbWUuZGlzcGxheVZhbHVlLnVuaXR9fTwvc3Bhbj4gPC9kaXY+IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cXFwiY29sLXNtLTIgY29sLXhsLTEgbm8tc2lkZS1wYWRkaW5nXFxcIj4gPGRpdiBjbGFzcz1cXFwicm93IGJveC1oZWFkZXJcXFwiPiA8ZGl2IGNsYXNzPW5vLXNpZGUtcGFkZGluZz4gPGdyYXBoIHBsb3QtZGF0YT1lbmRwb2ludC5tZXRyaWNzLmNyaXRpY2FsVGltZSBtaW5pbXVtLXlheGlzPXt7c21hbGxHcmFwaHNNaW5pbXVtWUF4aXMuY3JpdGljYWxUaW1lfX0gY2xhc3M9XFxcImdyYXBoIGNyaXRpY2FsLXRpbWUgcHVsbC1sZWZ0XFxcIj48L2dyYXBoPiA8L2Rpdj4gPGRpdiBjbGFzcz1cXFwibm8tc2lkZS1wYWRkaW5nIHNwYXJrbGluZS12YWx1ZVxcXCI+IHt7KGVuZHBvaW50LmlzU3RhbGUgPT0gdHJ1ZSB8fCBlbmRwb2ludC5pc1NjTW9uaXRvcmluZ0Rpc2Nvbm5lY3RlZCA9PSB0cnVlKSA/IFxcXCJcXFwiIDogZW5kcG9pbnQubWV0cmljcy5jcml0aWNhbFRpbWUuZGlzcGxheVZhbHVlLnZhbHVlfX0gPHN0cm9uZyBuZy1pZj1cXFwiZW5kcG9pbnQuaXNTdGFsZSB8fCBlbmRwb2ludC5pc1NjTW9uaXRvcmluZ0Rpc2Nvbm5lY3RlZFxcXCI+Pzwvc3Ryb25nPiA8c3BhbiBuZy1pZj1cXFwiZW5kcG9pbnQuaXNTdGFsZSA9PSBmYWxzZSAmJiBlbmRwb2ludC5pc1NjTW9uaXRvcmluZ0Rpc2Nvbm5lY3RlZCA9PSBmYWxzZVxcXCI+IHt7ZW5kcG9pbnQubWV0cmljcy5jcml0aWNhbFRpbWUuZGlzcGxheVZhbHVlLnVuaXR9fTwvc3Bhbj4gPC9kaXY+IDwvZGl2PiA8L2Rpdj4gPC9kaXY+IDwvZGl2PiA8L2Rpdj4gPC9kaXY+IDwvZGl2PiA8L3NlY3Rpb24+IDwvZGl2PiBcIjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL2FwcC9tb2R1bGVzL21vbml0b3Jpbmcvdmlld3MvbW9uaXRvcmVkX2VuZHBvaW50cy5odG1sXG4vLyBtb2R1bGUgaWQgPSAxMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///11\n"); - -/***/ }), -/* 12 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("\n\n(function (window, angular, undefined) {\n 'use strict';\n\n angular.module('endpoint_details', []);\n\n __webpack_require__(0);\n __webpack_require__(13);\n __webpack_require__(14);\n __webpack_require__(1);\n\n __webpack_require__(2);\n __webpack_require__(3);\n __webpack_require__(16);\n __webpack_require__(4);\n __webpack_require__(17);\n __webpack_require__(5);\n})(window, window.angular);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hcHAvbW9kdWxlcy9tb25pdG9yaW5nL2pzL2VuZHBvaW50X2RldGFpbHMubW9kdWxlLmpzPzRmMGIiXSwibmFtZXMiOlsid2luZG93IiwiYW5ndWxhciIsInVuZGVmaW5lZCIsIm1vZHVsZSIsInJlcXVpcmUiXSwibWFwcGluZ3MiOiI7O0FBQUMsV0FBU0EsTUFBVCxFQUFpQkMsT0FBakIsRUFBMEJDLFNBQTFCLEVBQXFDO0FBQ2xDOztBQUVBRCxZQUFRRSxNQUFSLENBQWUsa0JBQWYsRUFBbUMsRUFBbkM7O0FBRUFDLElBQUEsbUJBQUFBLENBQVEsQ0FBUjtBQUNBQSxJQUFBLG1CQUFBQSxDQUFRLEVBQVI7QUFDQUEsSUFBQSxtQkFBQUEsQ0FBUSxFQUFSO0FBQ0FBLElBQUEsbUJBQUFBLENBQVEsQ0FBUjs7QUFFQUEsSUFBQSxtQkFBQUEsQ0FBUSxDQUFSO0FBQ0FBLElBQUEsbUJBQUFBLENBQVEsQ0FBUjtBQUNBQSxJQUFBLG1CQUFBQSxDQUFRLEVBQVI7QUFDQUEsSUFBQSxtQkFBQUEsQ0FBUSxDQUFSO0FBQ0FBLElBQUEsbUJBQUFBLENBQVEsRUFBUjtBQUNBQSxJQUFBLG1CQUFBQSxDQUFRLENBQVI7QUFDSCxDQWhCQSxFQWdCQ0osTUFoQkQsRUFnQlNBLE9BQU9DLE9BaEJoQixDQUFEIiwiZmlsZSI6IjEyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKHdpbmRvdywgYW5ndWxhciwgdW5kZWZpbmVkKSB7XHJcbiAgICAndXNlIHN0cmljdCc7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoJ2VuZHBvaW50X2RldGFpbHMnLCBbXSk7XHJcblxyXG4gICAgcmVxdWlyZSgnLi9zZXJ2aWNlcy9zZXJ2aWNlcy5jb25uZWN0aXZpdHlOb3RpZmllcicpO1xyXG4gICAgcmVxdWlyZSgnLi9lbmRwb2ludF9kZXRhaWxzLmNvbnRyb2xsZXInKTtcclxuICAgIHJlcXVpcmUoJy4vZW5kcG9pbnRfZGV0YWlscy5yb3V0ZS5qcycpO1xyXG4gICAgcmVxdWlyZSgnLi9jb25zdGFudC5kaWFncmFtcy5qcycpO1xyXG5cclxuICAgIHJlcXVpcmUoJy4vZGlyZWN0aXZlcy91aS5wYXJ0aWN1bGFyLmdyYXBoLmpzJyk7XHJcbiAgICByZXF1aXJlKCcuL2RpcmVjdGl2ZXMvdWkucGFydGljdWxhci5ncmFwaGRlY2ltYWwuanMnKTtcclxuICAgIHJlcXVpcmUoJy4vZGlyZWN0aXZlcy91aS5wYXJ0aWN1bGFyLmR1cmF0aW9uLmpzJyk7XHJcbiAgICByZXF1aXJlKCcuL2RpcmVjdGl2ZXMvdWkucGFydGljdWxhci5ncmFwaGR1cmF0aW9uLmpzJyk7XHJcbiAgICByZXF1aXJlKCcuL2RpcmVjdGl2ZXMvdWkucGFydGljdWxhci5sYXJnZUdyYXBoLmpzJyk7XHJcbiAgICByZXF1aXJlKCcuL2RpcmVjdGl2ZXMvdWkucGFydGljdWxhci5tZXRyaWNzbGFyZ2VudW1iZXIuanMnKTtcclxufSh3aW5kb3csIHdpbmRvdy5hbmd1bGFyKSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vYXBwL21vZHVsZXMvbW9uaXRvcmluZy9qcy9lbmRwb2ludF9kZXRhaWxzLm1vZHVsZS5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///12\n"); - -/***/ }), -/* 13 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("\n\n(function (window, angular, undefined) {\n 'use strict';\n\n function controller($scope, $routeParams, $location, toastService, serviceControlService, monitoringService, historyPeriods, $filter, smallGraphsMinimumYAxis, largeGraphsMinimumYAxis, connectivityNotifier) {\n\n $scope.endpointName = $routeParams.endpointName;\n $scope.sourceIndex = $routeParams.sourceIndex;\n $scope.loading = true;\n $scope.showInstancesBreakdown = false;\n $scope.largeGraphsMinimumYAxis = largeGraphsMinimumYAxis;\n $scope.smallGraphsMinimumYAxis = smallGraphsMinimumYAxis;\n\n var subscription;\n\n $scope.periods = historyPeriods;\n $scope.selectedPeriod = $scope.periods[0];\n\n if ($location.$$search.historyPeriod) {\n $scope.selectedPeriod = $scope.periods[$scope.periods.findIndex(function (period) {\n return period.value == $location.$$search.historyPeriod;\n })];\n }\n\n $scope.selectPeriod = function (period) {\n $scope.selectedPeriod = period;\n\n updateUI();\n };\n\n function mergeIn(destination, source) {\n for (var propName in source) {\n if (source.hasOwnProperty(propName)) {\n destination[propName] = source[propName];\n }\n }\n }\n\n function updateUI() {\n if (subscription) {\n subscription.dispose();\n }\n\n var selectedPeriod = $scope.selectedPeriod;\n\n $scope.endpoint = {};\n\n subscription = monitoringService.createEndpointDetailsSource($routeParams.endpointName, $routeParams.sourceIndex, selectedPeriod.value, selectedPeriod.refreshInterval).subscribe(function (endpoint) {\n if (endpoint.error) {\n connectivityNotifier.reportFailedConnection($routeParams.sourceIndex);\n if ($scope.endpoint && $scope.endpoint.instances) {\n $scope.endpoint.instances.forEach(function (item) {\n return item.isScMonitoringDisconnected = true;\n });\n }\n\n $scope.endpoint.isScMonitoringDisconnected = true;\n } else {\n\n mergeIn($scope.endpoint, endpoint);\n\n connectivityNotifier.reportSuccessfulConnection($routeParams.sourceIndex);\n\n $scope.endpoint.instances.sort(function (first, second) {\n if (first.id < second.id) {\n return -1;\n }\n\n if (first.id > second.id) {\n return 1;\n }\n\n return 0;\n });\n\n $scope.loading = false;\n $scope.endpoint.messageTypes.forEach(function (messageType) {\n return fillDisplayValues(messageType);\n });\n\n $scope.endpoint.isStale = true;\n $scope.endpoint.isScMonitoringDisconnected = false;\n\n $scope.endpoint.instances.forEach(function (instance) {\n fillDisplayValues(instance);\n serviceControlService.getExceptionGroupsForEndpointInstance(instance.id).then(function (result) {\n if (result.data.length > 0) {\n instance.serviceControlId = result.data[0].id;\n instance.errorCount = result.data[0].count;\n }\n }, function (err) {\n // Warn user?\n });\n $scope.endpoint.isStale = $scope.endpoint.isStale && instance.isStale;\n });\n }\n\n serviceControlService.getExceptionGroupsForLogicalEndpoint($scope.endpointName).then(function (result) {\n if (result.data.length > 0) {\n $scope.endpoint.serviceControlId = result.data[0].id;\n $scope.endpoint.errorCount = result.data[0].count;\n }\n });\n });\n }\n\n function fillDisplayValues(instance) {\n $filter('graphduration')(instance.metrics.processingTime);\n $filter('graphduration')(instance.metrics.criticalTime);\n $filter('graphdecimal')(instance.metrics.throughput, 2);\n $filter('graphdecimal')(instance.metrics.retries, 2);\n }\n\n $scope.$on(\"$destroy\", function handler() {\n subscription.dispose();\n });\n\n updateUI();\n }\n\n controller.$inject = ['$scope', '$routeParams', '$location', 'toastService', 'serviceControlService', 'monitoringService', 'historyPeriods', '$filter', 'smallGraphsMinimumYAxis', 'largeGraphsMinimumYAxis', 'connectivityNotifier'];\n\n angular.module('endpoint_details').controller('endpointDetailsCtrl', controller);\n})(window, window.angular);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hcHAvbW9kdWxlcy9tb25pdG9yaW5nL2pzL2VuZHBvaW50X2RldGFpbHMuY29udHJvbGxlci5qcz9kZjg0Il0sIm5hbWVzIjpbIndpbmRvdyIsImFuZ3VsYXIiLCJ1bmRlZmluZWQiLCJjb250cm9sbGVyIiwiJHNjb3BlIiwiJHJvdXRlUGFyYW1zIiwiJGxvY2F0aW9uIiwidG9hc3RTZXJ2aWNlIiwic2VydmljZUNvbnRyb2xTZXJ2aWNlIiwibW9uaXRvcmluZ1NlcnZpY2UiLCJoaXN0b3J5UGVyaW9kcyIsIiRmaWx0ZXIiLCJzbWFsbEdyYXBoc01pbmltdW1ZQXhpcyIsImxhcmdlR3JhcGhzTWluaW11bVlBeGlzIiwiY29ubmVjdGl2aXR5Tm90aWZpZXIiLCJlbmRwb2ludE5hbWUiLCJzb3VyY2VJbmRleCIsImxvYWRpbmciLCJzaG93SW5zdGFuY2VzQnJlYWtkb3duIiwic3Vic2NyaXB0aW9uIiwicGVyaW9kcyIsInNlbGVjdGVkUGVyaW9kIiwiJCRzZWFyY2giLCJoaXN0b3J5UGVyaW9kIiwiZmluZEluZGV4IiwicGVyaW9kIiwidmFsdWUiLCJzZWxlY3RQZXJpb2QiLCJ1cGRhdGVVSSIsIm1lcmdlSW4iLCJkZXN0aW5hdGlvbiIsInNvdXJjZSIsInByb3BOYW1lIiwiaGFzT3duUHJvcGVydHkiLCJkaXNwb3NlIiwiZW5kcG9pbnQiLCJjcmVhdGVFbmRwb2ludERldGFpbHNTb3VyY2UiLCJyZWZyZXNoSW50ZXJ2YWwiLCJzdWJzY3JpYmUiLCJlcnJvciIsInJlcG9ydEZhaWxlZENvbm5lY3Rpb24iLCJpbnN0YW5jZXMiLCJmb3JFYWNoIiwiaXRlbSIsImlzU2NNb25pdG9yaW5nRGlzY29ubmVjdGVkIiwicmVwb3J0U3VjY2Vzc2Z1bENvbm5lY3Rpb24iLCJzb3J0IiwiZmlyc3QiLCJzZWNvbmQiLCJpZCIsIm1lc3NhZ2VUeXBlcyIsIm1lc3NhZ2VUeXBlIiwiZmlsbERpc3BsYXlWYWx1ZXMiLCJpc1N0YWxlIiwiaW5zdGFuY2UiLCJnZXRFeGNlcHRpb25Hcm91cHNGb3JFbmRwb2ludEluc3RhbmNlIiwidGhlbiIsInJlc3VsdCIsImRhdGEiLCJsZW5ndGgiLCJzZXJ2aWNlQ29udHJvbElkIiwiZXJyb3JDb3VudCIsImNvdW50IiwiZXJyIiwiZ2V0RXhjZXB0aW9uR3JvdXBzRm9yTG9naWNhbEVuZHBvaW50IiwibWV0cmljcyIsInByb2Nlc3NpbmdUaW1lIiwiY3JpdGljYWxUaW1lIiwidGhyb3VnaHB1dCIsInJldHJpZXMiLCIkb24iLCJoYW5kbGVyIiwiJGluamVjdCIsIm1vZHVsZSJdLCJtYXBwaW5ncyI6Ijs7QUFBQyxXQUFTQSxNQUFULEVBQWlCQyxPQUFqQixFQUEwQkMsU0FBMUIsRUFBcUM7QUFDbEM7O0FBRUEsYUFBU0MsVUFBVCxDQUNJQyxNQURKLEVBRUlDLFlBRkosRUFHSUMsU0FISixFQUlJQyxZQUpKLEVBS0lDLHFCQUxKLEVBTUlDLGlCQU5KLEVBT0lDLGNBUEosRUFRSUMsT0FSSixFQVNJQyx1QkFUSixFQVVJQyx1QkFWSixFQVdJQyxvQkFYSixFQVlFOztBQUVFVixlQUFPVyxZQUFQLEdBQXNCVixhQUFhVSxZQUFuQztBQUNBWCxlQUFPWSxXQUFQLEdBQXFCWCxhQUFhVyxXQUFsQztBQUNBWixlQUFPYSxPQUFQLEdBQWlCLElBQWpCO0FBQ0FiLGVBQU9jLHNCQUFQLEdBQWdDLEtBQWhDO0FBQ0FkLGVBQU9TLHVCQUFQLEdBQWlDQSx1QkFBakM7QUFDQVQsZUFBT1EsdUJBQVAsR0FBaUNBLHVCQUFqQzs7QUFFQSxZQUFJTyxZQUFKOztBQUVBZixlQUFPZ0IsT0FBUCxHQUFpQlYsY0FBakI7QUFDQU4sZUFBT2lCLGNBQVAsR0FBd0JqQixPQUFPZ0IsT0FBUCxDQUFlLENBQWYsQ0FBeEI7O0FBRUEsWUFBSWQsVUFBVWdCLFFBQVYsQ0FBbUJDLGFBQXZCLEVBQXNDO0FBQ2xDbkIsbUJBQU9pQixjQUFQLEdBQXdCakIsT0FBT2dCLE9BQVAsQ0FBZWhCLE9BQU9nQixPQUFQLENBQWVJLFNBQWYsQ0FBeUIsVUFBVUMs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Q3RDcEQseUJBQWFlLE9BQWI7QUFDSCxTQUZEOztBQUlBTjtBQUNIOztBQUVEekIsZUFBV3FFLE9BQVgsR0FBcUIsQ0FDakIsUUFEaUIsRUFFakIsY0FGaUIsRUFHakIsV0FIaUIsRUFJakIsY0FKaUIsRUFLakIsdUJBTGlCLEVBTWpCLG1CQU5pQixFQU9qQixnQkFQaUIsRUFRakIsU0FSaUIsRUFTakIseUJBVGlCLEVBVWpCLHlCQVZpQixFQVdqQixzQkFYaUIsQ0FBckI7O0FBY0F2RSxZQUFRd0UsTUFBUixDQUFlLGtCQUFmLEVBQ0t0RSxVQURMLENBQ2dCLHFCQURoQixFQUN1Q0EsVUFEdkM7QUFHSCxDQWxKQSxFQWtKQ0gsTUFsSkQsRUFrSlNBLE9BQU9DLE9BbEpoQixDQUFEIiwiZmlsZSI6IjEzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKHdpbmRvdywgYW5ndWxhciwgdW5kZWZpbmVkKSB7XHJcbiAgICAndXNlIHN0cmljdCc7XHJcblxyXG4gICAgZnVuY3Rpb24gY29udHJvbGxlcihcclxuICAgICAgICAkc2NvcGUsXHJcbiAgICAgICAgJHJvdXRlUGFyYW1zLFxyXG4gICAgICAgICRsb2NhdGlvbixcclxuICAgICAgICB0b2FzdFNlcnZpY2UsXHJcbiAgICAgICAgc2VydmljZUNvbnRyb2xTZXJ2aWNlLFxyXG4gICAgICAgIG1vbml0b3JpbmdTZXJ2aWNlLFxyXG4gICAgICAgIGhpc3RvcnlQZXJpb2RzLFxyXG4gICAgICAgICRmaWx0ZXIsXHJcbiAgICAgICAgc21hbGxHcmFwaHNNaW5pbXVtWUF4aXMsXHJcbiAgICAgICAgbGFyZ2VHcmFwaHNNaW5pbXVtWUF4aXMsXHJcbiAgICAgICAgY29ubmVjdGl2aXR5Tm90aWZpZXJcclxuICAgICkge1xyXG5cclxuICAgICAgICAkc2NvcGUuZW5kcG9pbnROYW1lID0gJHJvdXRlUGFyYW1zLmVuZHBvaW50TmFtZTtcclxuICAgICAgICAkc2NvcGUuc291cmNlSW5kZXggPSAkcm91dGVQYXJhbXMuc291cmNlSW5kZXg7XHJcbiAgICAgICAgJHNjb3BlLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICRzY29wZS5zaG93SW5zdGFuY2VzQnJlYWtkb3duID0gZmFsc2U7XHJcbiAgICAgICAgJHNjb3BlLmxhcmdlR3JhcGhzTWluaW11bVlBeGlzID0gbGFyZ2VHcmFwaHNNaW5pbXVtWUF4aXM7XHJcbiAgICAgICAgJHNjb3BlLnNtYWxsR3JhcGhzTWluaW11bVlBeGlzID0gc21hbGxHcmFwaHNNaW5pbXVtWUF4aXM7XHJcblxyXG4gICAgICAgIHZhciBzdWJzY3JpcHRpb247XHJcblxyXG4gICAgICAgICRzY29wZS5wZXJpb2RzID0gaGlzdG9yeVBlcmlvZHM7XHJcbiAgICAgICAgJHNjb3BlLnNlbGVjdGVkUGVyaW9kID0gJHNjb3BlLnBlcmlvZHNbMF07XHJcblxyXG4gICAgICAgIGlmICgkbG9jYXRpb24uJCRzZWFyY2guaGlzdG9yeVBlcmlvZCkge1xyXG4gICAgICAgICAgICAkc2NvcGUuc2VsZWN0ZWRQZXJpb2QgPSAkc2NvcGUucGVyaW9kc1skc2NvcGUucGVyaW9kcy5maW5kSW5kZXgoZnVuY3Rpb24gKHBlcmlvZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBlcmlvZC52YWx1ZSA9PSAkbG9jYXRpb24uJCRzZWFyY2guaGlzdG9yeVBlcmlvZDtcclxuICAgICAgICAgICAgfSldO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJHNjb3BlLnNlbGVjdFBlcmlvZCA9IGZ1bmN0aW9uIChwZXJpb2QpIHtcclxuICAgICAgICAgICAgJHNjb3BlLnNlbGVjdGVkUGVyaW9kID0gcGVyaW9kO1xyXG5cclxuICAgICAgICAgICAgdXBkYXRlVUkoKTtcclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gbWVyZ2VJbihkZXN0aW5hdGlvbiwgc291cmNlKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIHByb3BOYW1lIGluIHNvdXJjZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbltwcm9wTmFtZV0gPSBzb3VyY2VbcHJvcE5hbWVdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiB1cGRhdGVVSSgpIHtcclxuICAgICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLmRpc3Bvc2UoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIHNlbGVjdGVkUGVyaW9kID0gJHNjb3BlLnNlbGVjdGVkUGVyaW9kO1xyXG5cclxuICAgICAgICAgICAgJHNjb3BlLmVuZHBvaW50ID0ge307XHJcblxyXG4gICAgICAgICAgICBzdWJzY3JpcHRpb24gPSBtb25pdG9yaW5nU2VydmljZS5jcmVhdGVFbmRwb2ludERldGFpbHNTb3VyY2UoJHJvdXRlUGFyYW1zLmVuZHBvaW50TmFtZSwgJHJvdXRlUGFyYW1zLnNvdXJjZUluZGV4LCBzZWxlY3RlZFBlcmlvZC52YWx1ZSwgc2VsZWN0ZWRQZXJpb2QucmVmcmVzaEludGVydmFsKS5zdWJzY3JpYmUoZnVuY3Rpb24gKGVuZHBvaW50KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZW5kcG9pbnQuZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aXZpdHlOb3RpZmllci5yZXBvcnRGYWlsZWRDb25uZWN0aW9uKCRyb3V0ZVBhcmFtcy5zb3VyY2VJbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCRzY29wZS5lbmRwb2ludCAmJiAkc2NvcGUuZW5kcG9pbnQuaW5zdGFuY2VzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5lbmRwb2ludC5pbnN0YW5jZXMuZm9yRWFjaCgoaXRlbSkgPT4gaXRlbS5pc1NjTW9uaXRvcmluZ0Rpc2Nvbm5lY3RlZCA9IHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmVuZHBvaW50LmlzU2NNb25pdG9yaW5nRGlzY29ubmVjdGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBtZXJnZUluKCRzY29wZS5lbmRwb2ludCwgZW5kcG9pbnQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aXZpdHlOb3RpZmllci5yZXBvcnRTdWNjZXNzZnVsQ29ubmVjdGlvbigkcm91dGVQYXJhbXMuc291cmNlSW5kZXgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZW5kcG9pbnQuaW5zdGFuY2VzLnNvcnQoZnVuY3Rpb24gKGZpcnN0LCBzZWNvbmQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0LmlkIDwgc2Vjb25kLmlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdC5pZCA+IHNlY29uZC5pZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAkc2NvcGUubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICRzY29wZS5lbmRwb2ludC5tZXNzYWdlVHlwZXMuZm9yRWFjaCgobWVzc2FnZVR5cGUpID0+IGZpbGxEaXNwbGF5VmFsdWVzKG1lc3NhZ2VUeXBlKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICRzY29wZS5lbmRwb2ludC5pc1N0YWxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZW5kcG9pbnQuaXNTY01vbml0b3JpbmdEaXNjb25uZWN0ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmVuZHBvaW50Lmluc3RhbmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChpbnN0YW5jZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsRGlzcGxheVZhbHVlcyhpbnN0YW5jZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VDb250cm9sU2VydmljZS5nZXRFeGNlcHRpb25Hcm91cHNGb3JFbmRwb2ludEluc3RhbmNlKGluc3RhbmNlLmlkKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2Uuc2VydmljZUNvbnRyb2xJZCA9IHJlc3VsdC5kYXRhWzBdLmlkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmVycm9yQ291bnQgPSByZXN1bHQuZGF0YVswXS5jb3VudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2FybiB1c2VyP1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZW5kcG9pbnQuaXNTdGFsZSA9ICRzY29wZS5lbmRwb2ludC5pc1N0YWxlICYmIGluc3RhbmNlLmlzU3RhbGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgc2VydmljZUNvbnRyb2xTZXJ2aWNlLmdldEV4Y2VwdGlvbkdyb3Vwc0ZvckxvZ2ljYWxFbmRwb2ludCgkc2NvcGUuZW5kcG9pbnROYW1lKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5lbmRwb2ludC5zZXJ2aWNlQ29udHJvbElkID0gcmVzdWx0LmRhdGFbMF0uaWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5lbmRwb2ludC5lcnJvckNvdW50ID0gcmVzdWx0LmRhdGFbMF0uY291bnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZmlsbERpc3BsYXlWYWx1ZXMoaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgJGZpbHRlcignZ3JhcGhkdXJhdGlvbicpKGluc3RhbmNlLm1ldHJpY3MucHJvY2Vzc2luZ1RpbWUpO1xyXG4gICAgICAgICAgICAkZmlsdGVyKCdncmFwaGR1cmF0aW9uJykoaW5zdGFuY2UubWV0cmljcy5jcml0aWNhbFRpbWUpO1xyXG4gICAgICAgICAgICAkZmlsdGVyKCdncmFwaGRlY2ltYWwnKShpbnN0YW5jZS5tZXRyaWNzLnRocm91Z2hwdXQsIDIpO1xyXG4gICAgICAgICAgICAkZmlsdGVyKCdncmFwaGRlY2ltYWwnKShpbnN0YW5jZS5tZXRyaWNzLnJldHJpZXMsIDIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJHNjb3BlLiRvbihcIiRkZXN0cm95XCIsIGZ1bmN0aW9uIGhhbmRsZXIoKSB7XHJcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5kaXNwb3NlKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHVwZGF0ZVVJKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29udHJvbGxlci4kaW5qZWN0ID0gW1xyXG4gICAgICAgICckc2NvcGUnLFxyXG4gICAgICAgICckcm91dGVQYXJhbXMnLFxyXG4gICAgICAgICckbG9jYXRpb24nLFxyXG4gICAgICAgICd0b2FzdFNlcnZpY2UnLFxyXG4gICAgICAgICdzZXJ2aWNlQ29udHJvbFNlcnZpY2UnLFxyXG4gICAgICAgICdtb25pdG9yaW5nU2VydmljZScsXHJcbiAgICAgICAgJ2hpc3RvcnlQZXJpb2RzJyxcclxuICAgICAgICAnJGZpbHRlcicsXHJcbiAgICAgICAgJ3NtYWxsR3JhcGhzTWluaW11bVlBeGlzJyxcclxuICAgICAgICAnbGFyZ2VHcmFwaHNNaW5pbXVtWUF4aXMnLFxyXG4gICAgICAgICdjb25uZWN0aXZpdHlOb3RpZmllcidcclxuICAgIF07XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoJ2VuZHBvaW50X2RldGFpbHMnKVxyXG4gICAgICAgIC5jb250cm9sbGVyKCdlbmRwb2ludERldGFpbHNDdHJsJywgY29udHJvbGxlcik7XHJcblxyXG59KHdpbmRvdywgd2luZG93LmFuZ3VsYXIpKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9hcHAvbW9kdWxlcy9tb25pdG9yaW5nL2pzL2VuZHBvaW50X2RldGFpbHMuY29udHJvbGxlci5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///13\n"); - -/***/ }), -/* 14 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("\n\n(function (window, angular, undefined) {\n 'use strict';\n\n function routeProvider($routeProvider) {\n var template = __webpack_require__(15);\n\n $routeProvider.when('/endpoint_details/:endpointName/:sourceIndex', {\n data: {\n pageTitle: 'Endpoint Details'\n },\n template: template,\n controller: 'endpointDetailsCtrl',\n controllerAs: 'vm',\n reloadOnSearch: false\n });\n };\n\n routeProvider.$inject = ['$routeProvider'];\n\n angular.module('endpoint_details').config(routeProvider);\n})(window, window.angular);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hcHAvbW9kdWxlcy9tb25pdG9yaW5nL2pzL2VuZHBvaW50X2RldGFpbHMucm91dGUuanM/NjViNiJdLCJuYW1lcyI6WyJ3aW5kb3ciLCJhbmd1bGFyIiwidW5kZWZpbmVkIiwicm91dGVQcm92aWRlciIsIiRyb3V0ZVByb3ZpZGVyIiwidGVtcGxhdGUiLCJyZXF1aXJlIiwid2hlbiIsImRhdGEiLCJwYWdlVGl0bGUiLCJjb250cm9sbGVyIiwiY29udHJvbGxlckFzIiwicmVsb2FkT25TZWFyY2giLCIkaW5qZWN0IiwibW9kdWxlIiwiY29uZmlnIl0sIm1hcHBpbmdzIjoiOztBQUFDLFdBQVVBLE1BQVYsRUFBa0JDLE9BQWxCLEVBQTJCQyxTQUEzQixFQUFzQztBQUNuQzs7QUFFQSxhQUFTQyxhQUFULENBQXVCQyxjQUF2QixFQUF1QztBQUNuQyxZQUFJQyxXQUFXLG1CQUFBQyxDQUFRLEVBQVIsQ0FBZjs7QUFFQUYsdUJBQWVHLElBQWYsQ0FBb0IsOENBQXBCLEVBQW9FO0FBQ2hFQyxrQkFBTTtBQUNGQywyQkFBVztBQURULGFBRDBEO0FBSWhFSixzQkFBVUEsUUFKc0Q7QUFLaEVLLHdCQUFZLHFCQUxvRDtBQU1oRUMsMEJBQWMsSUFOa0Q7QUFPaEVDLDRCQUFnQjtBQVBnRCxTQUFwRTtBQVNIOztBQUVEVCxrQkFBY1UsT0FBZCxHQUF3QixDQUNwQixnQkFEb0IsQ0FBeEI7O0FBSUFaLFlBQVFhLE1BQVIsQ0FBZSxrQkFBZixFQUNLQyxNQURMLENBQ1laLGFBRFo7QUFFSCxDQXZCQSxFQXVCRUgsTUF2QkYsRUF1QlVBLE9BQU9DLE9BdkJqQixDQUFEIiwiZmlsZSI6IjE0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uICh3aW5kb3csIGFuZ3VsYXIsIHVuZGVmaW5lZCkge1xyXG4gICAgJ3VzZSBzdHJpY3QnO1xyXG5cclxuICAgIGZ1bmN0aW9uIHJvdXRlUHJvdmlkZXIoJHJvdXRlUHJvdmlkZXIpIHtcclxuICAgICAgICBsZXQgdGVtcGxhdGUgPSByZXF1aXJlKCcuLy4uL3ZpZXdzL2VuZHBvaW50X2RldGFpbHMuaHRtbCcpO1xyXG5cclxuICAgICAgICAkcm91dGVQcm92aWRlci53aGVuKCcvZW5kcG9pbnRfZGV0YWlscy86ZW5kcG9pbnROYW1lLzpzb3VyY2VJbmRleCcsIHtcclxuICAgICAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICAgICAgcGFnZVRpdGxlOiAnRW5kcG9pbnQgRGV0YWlscydcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiAnZW5kcG9pbnREZXRhaWxzQ3RybCcsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ3ZtJyxcclxuICAgICAgICAgICAgcmVsb2FkT25TZWFyY2g6IGZhbHNlXHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHJvdXRlUHJvdmlkZXIuJGluamVjdCA9IFtcclxuICAgICAgICAnJHJvdXRlUHJvdmlkZXInXHJcbiAgICBdO1xyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKCdlbmRwb2ludF9kZXRhaWxzJylcclxuICAgICAgICAuY29uZmlnKHJvdXRlUHJvdmlkZXIpO1xyXG59ICh3aW5kb3csIHdpbmRvdy5hbmd1bGFyKSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vYXBwL21vZHVsZXMvbW9uaXRvcmluZy9qcy9lbmRwb2ludF9kZXRhaWxzLnJvdXRlLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///14\n"); - -/***/ }), -/* 15 */ -/***/ (function(module, exports) { - -eval("module.exports = \"
    Queue Length

    Queue length: The estimated number of messages in an endpoint's queue.

    NOTE: This is an experimental feature. Learn more

    {{endpoint.digest.metrics.queueLength.latest | metricslargenumber:0}} MSGS
    ?
    {{endpoint.digest.metrics.queueLength.average | metricslargenumber:0}} MSGS
    ? AVG
    Throughput
    {{endpoint.digest.metrics.throughput.latest | metricslargenumber:2}} MSGS/S
    ?
    {{endpoint.digest.metrics.throughput.average | metricslargenumber:2}} MSGS/S
    ? AVG
    Scheduled Retries Rate
    {{endpoint.digest.metrics.retries.latest | metricslargenumber:2}} MSGS/S
    ?
    {{endpoint.digest.metrics.retries.average | metricslargenumber:2}} MSGS/S
    ? AVG
    Processing Time
    {{endpoint.digest.metrics.processingTime.latest | durationValue}} {{endpoint.digest.metrics.processingTime.latest | durationUnit}}
    ?
    {{endpoint.digest.metrics.processingTime.average | durationValue}} {{endpoint.digest.metrics.processingTime.average | durationUnit}} AVG
    ? AVG
    Critical Time
    {{endpoint.digest.metrics.criticalTime.latest | durationValue}} {{endpoint.digest.metrics.criticalTime.latest | durationUnit}}
    ?
    {{endpoint.digest.metrics.criticalTime.average | durationValue}} {{endpoint.digest.metrics.criticalTime.average | durationUnit}}
    ? AVG
    Instance Name
    Throughput (msgs/s)
    Scheduled retry rate (msgs/s)
    Processing Time (t)
    Critical Time (t)
    {{(instance.isStale == true || instance.isScMonitoringDisconnected == true) ? \\\"\\\" : instance.metrics.throughput.displayValue}} ?
    {{(instance.isStale == true || instance.isScMonitoringDisconnected == true) ? \\\"\\\" : instance.metrics.retries.displayValue}} ?
    {{(instance.isStale == true || instance.isScMonitoringDisconnected == true) ? \\\"\\\" : instance.metrics.processingTime.displayValue.value}} {{instance.metrics.processingTime.displayValue.unit}} ?
    {{(instance.isStale == true || instance.isScMonitoringDisconnected == true) ? \\\"\\\" : instance.metrics.criticalTime.displayValue.value}} {{instance.metrics.criticalTime.displayValue.unit}} ?
    Message type name
    Throughput (msgs/s)
    Scheduled retry rate (msgs/s)
    Processing Time (t)
    Critical Time (t)
    {{messageType.typeName ? messageType.typeName : 'Unknown'}}
    {{messageType.assemblyName + '-' + messageType.assemblyVersion}}
    {{'Culture=' + messageType.culture}}
    {{'PublicKeyToken=' + messageType.publicKeyToken}}
    {{(endpoint.isStale == true || endpoint.isScMonitoringDisconnected == true) ? \\\"\\\" : messageType.metrics.throughput.displayValue}} ?
    {{(endpoint.isStale == true || endpoint.isScMonitoringDisconnected == true) ? \\\"\\\" : messageType.metrics.retries.displayValue}} ?
    {{(endpoint.isStale == true || endpoint.isScMonitoringDisconnected == true) ? \\\"\\\" : messageType.metrics.processingTime.displayValue.value}} {{messageType.metrics.processingTime.displayValue.unit}} ?
    {{(endpoint.isStale == true || endpoint.isScMonitoringDisconnected == true) ? \\\"\\\" : messageType.metrics.criticalTime.displayValue.value}} {{messageType.metrics.criticalTime.displayValue.unit}} ?
    \";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hcHAvbW9kdWxlcy9tb25pdG9yaW5nL3ZpZXdzL2VuZHBvaW50X2RldGFpbHMuaHRtbD9lODYzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtJQUErSSw2SEFBNkgsY0FBYyx3YkFBd2IsY0FBYyxHQUFHLGFBQWEsR0FBRywyQkFBMkIsOENBQThDLDBDQUEwQyw2SEFBNkgsMENBQTBDLHdVQUF3VSxjQUFjLEdBQUcsYUFBYSxpQkFBaUIsY0FBYyxLQUFLLGFBQWEseVpBQXlaLHFDQUFxQyxnM0JBQWczQixtRUFBbUUsdVhBQXVYLG9FQUFvRSx3cEJBQXdwQiwyQ0FBMkMsK25CQUErbkIsa0VBQWtFLHFTQUFxUyxtRUFBbUUsd3NCQUF3c0IsK0RBQStELHFTQUFxUyxnRUFBZ0UsOHFCQUE4cUIsNENBQTRDLDhwQkFBOHBCLCtEQUErRCwwQ0FBMEMsOERBQThELHVQQUF1UCxnRUFBZ0UsMENBQTBDLCtEQUErRCxpcUJBQWlxQiw2REFBNkQsMENBQTBDLDREQUE0RCx1UEFBdVAsOERBQThELDBDQUEwQyw2REFBNkQsOFlBQThZLGdDQUFnQyw0R0FBNEcsK0JBQStCLHdpRUFBd2lFLGVBQWUsbWdCQUFtZ0IsY0FBYyxHQUFHLGFBQWEsR0FBRywyQkFBMkIsOENBQThDLDBDQUEwQyw2SEFBNkgsMENBQTBDLG9OQUFvTixvQ0FBb0Msd0dBQXdHLDZIQUE2SCxrUkFBa1IsaUNBQWlDLHFHQUFxRywwSEFBMEgseVJBQXlSLHdDQUF3Qyw2R0FBNkcsdUlBQXVJLDZGQUE2RixtREFBbUQsOFJBQThSLHNDQUFzQywyR0FBMkcscUlBQXFJLDZGQUE2RixpREFBaUQsMnFFQUEycUUseURBQXlELHVmQUF1Zix3REFBd0QsNkJBQTZCLDhEQUE4RCx3QkFBd0Isc0RBQXNELDZCQUE2QixrQ0FBa0Msd0JBQXdCLG9FQUFvRSw2QkFBNkIsZ0RBQWdELGtNQUFrTSxvQ0FBb0Msd0dBQXdHLGdJQUFnSSxxUkFBcVIsaUNBQWlDLHFHQUFxRyw2SEFBNkgsNFJBQTRSLHdDQUF3Qyw2R0FBNkcsMElBQTBJLDZGQUE2RixzREFBc0QsaVNBQWlTLHNDQUFzQywyR0FBMkcsd0lBQXdJLDZGQUE2RixvREFBb0QiLCJmaWxlIjoiMTUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiBjbGFzcz1jb250YWluZXI+IDxkaXYgY2xhc3M9XFxcInJvdyBtb25pdG9yaW5nLWhlYWRcXFwiPiA8ZGl2IGNsYXNzPWJhY2stbmF2PiA8c3BhbiBjbGFzcz1mYWtlLWxpbmsgYXJpYS1oaWRkZW49dHJ1ZT4mIzk2NjQ7PC9zcGFuPiA8YSBocmVmPS8jL21vbml0b3JlZF9lbmRwb2ludHM+QWxsIGVuZHBvaW50czwvYT4gPC9kaXY+IDxkaXYgY2xhc3M9XFxcImNvbC1zbS05IG5vLXNpZGUtcGFkZGluZyBsaXN0LXNlY3Rpb25cXFwiPiA8aDE+IHt7ZW5kcG9pbnROYW1lfX0gPGRpdiBjbGFzcz1lbmRwb2ludC1zdGF0dXM+IDxzcGFuIG5nLWlmPWVuZHBvaW50LmlzU3RhbGUgY2xhc3M9d2FybmluZz4gPGkgY2xhc3M9XFxcImZhIHBhLWVuZHBvaW50LWxvc3QgZW5kcG9pbnQtZGV0YWlsc1xcXCIgdWliLXRvb2x0aXA9XFxcIlVuYWJsZSB0byBjb25uZWN0IHRvIGVuZHBvaW50XFxcIj48L2k+IDwvc3Bhbj4gPHNwYW4gY2xhc3M9d2FybmluZyBuZy1pZj1lbmRwb2ludC5pc1NjTW9uaXRvcmluZ0Rpc2Nvbm5lY3RlZD4gPGkgY2xhc3M9XFxcImZhIHBhLW1vbml0b3JpbmctbG9zdCBlbmRwb2ludC1kZXRhaWxzXFxcIiB1aWItdG9vbHRpcD1cXFwiVW5hYmxlIHRvIGNvbm5lY3QgdG8gbW9uaXRvcmluZyBzZXJ2ZXJcXFwiPjwvaT4gPC9zcGFuPiA8YSBuZy1pZj1lbmRwb2ludC5lcnJvckNvdW50IGNsYXNzPXdhcm5pbmcgaHJlZj0jL2ZhaWxlZC1tZXNzYWdlcy9ncm91cHMve3tlbmRwb2ludE5hbWV9fS97e3NvdXJjZUluZGV4fX0ve3tlbmRwb2ludC5zZXJ2aWNlQ29udHJvbElkfX0+IDxpIGNsYXNzPVxcXCJmYSBmYS1lbnZlbG9wZVxcXCIgdWliLXRvb2x0aXA9XFxcInt7ZW5kcG9pbnQuZXJyb3JDb3VudCB8IG1ldHJpY3NsYXJnZW51bWJlcn19IGZhaWxlZCBtZXNzYWdlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBlbmRwb2ludC4gQ2xpY2sgdG8gc2VlIGxpc3QuXFxcIj48L2k+IDxzcGFuIGNsYXNzPVxcXCJiYWRnZSBiYWRnZS1pbXBvcnRhbnQgbmctYmluZGluZ1xcXCI+e3tlbmRwb2ludC5lcnJvckNvdW50IHwgbWV0cmljc2xhcmdlbnVtYmVyfX08L3NwYW4+IDwvYT4gPC9kaXY+IDwvaDE+IDwvZGl2PiA8ZGl2IGNsYXNzPVxcXCJjb2wtc20tMyBuby1zaWRlLXBhZGRpbmcgdG9vbGJhci1tZW51c1xcXCI+IDx1bCBjbGFzcz1cXFwibmF2IG5hdi1waWxscyBwZXJpb2Qtc2VsZWN0b3JcXFwiPiA8bGkgcm9sZT1wcmVzZW50YXRpb24gbmctcmVwZWF0PVxcXCJwZXJpb2QgaW4gcGVyaW9kc1xcXCIgbmctY2xhc3M9XFxcIihwZXJpb2QudmFsdWUgPT0gc2VsZWN0ZWRQZXJpb2QudmFsdWUgPyAnYWN0aXZlJyA6ICdub3RzZWxlY3RlZCcpXFxcIj4gPGEgbmctY2xpY2s9c2VsZWN0UGVyaW9kKHBlcmlvZCkgaHJlZj1cXFwiIy9lbmRwb2ludF9kZXRhaWxzL3t7ZW5kcG9pbnROYW1lfX0ve3tzb3VyY2VJbmRleH19P2hpc3RvcnlQZXJpb2Q9e3twZXJpb2QudmFsdWV9fVxcXCI+e3twZXJpb2QudGV4dH19PC9hPiA8L2xpPiA8L3VsPiA8L2Rpdj4gPC9kaXY+IDwvZGl2PiA8ZGl2IGNsYXNzPVxcXCJjb250YWluZXIgbGFyZ2UtZ3JhcGhzXFxcIj4gPGRpdiBjbGFzcz1jb250YWluZXI+IDxkaXYgY2xhc3M9cm93PiA8ZGl2IGNsYXNzPVxcXCJjb2wtc20tNCBuby1zaWRlLXBhZGRpbmcgbGlzdC1zZWN0aW9uIGdyYXBoLWFyZWEgZ3JhcGgtcXVldWUtbGVuZ3RoXFxcIj4gPGxhcmdlLWdyYXBoIG5nLWlmPWVuZHBvaW50Lm1ldHJpY0RldGFpbHMubWV0cmljcy5xdWV1ZUxlbmd0aCBmaXJzdC1kYXRhLXNlcmllcz1lbmRwb2ludC5tZXRyaWNEZXRhaWxzLm1ldHJpY3MucXVldWVMZW5ndGggeGF4aXMtcG9pbnRzPWVuZHBvaW50Lm1ldHJpY0RldGFpbHMubWV0cmljcy5xdWV1ZUxlbmd0aC50aW1lQXhpc1ZhbHVlcyBtaW5pbXVtLXlheGlzPXt7bGFyZ2VHcmFwaHNNaW5pbXVtWUF4aXMucXVldWVMZW5ndGh9fSBwbG90LXdpZHRoPTc1MCBwbG90LWhlaWdodD0yMDAgZmlyc3Qtc2VyaWVzLWNvbG9yPSNFQTdFMDAgZmlyc3Qtc2VyaWVzLWZpbGwtY29sb3I9I0VBRERDRSBjbGFzcz1cXFwibGFyZ2UtZ3JhcGggcHVsbC1sZWZ0XFxcIj48L2xhcmdlLWdyYXBoPiA8ZGl2IGNsYXNzPVxcXCJjb2wtc20tMTIgbm8tc2lkZS1wYWRkaW5nIGdyYXBoLXZhbHVlc1xcXCI+IDxkaXYgY2xhc3M9XFxcInJvdyBxdWV1ZS1sZW5ndGgtdmFsdWVzIHRvb2x0aXAtdHJpZ2dlclxcXCI+IDxkaXYgY2xhc3M9bWV0cmljLWRpZ2VzdC1oZWFkZXI+IFF1ZXVlIExlbmd0aCA8aSBjbGFzcz1cXFwiZmEgZmEtZmxhc2sgZmFrZS1saW5rXFxcIj48L2k+IDwvZGl2PiA8ZGl2IGNsYXNzPWludGVyYWN0aXZlLXRvb2x0aXA+IDxkaXYgY2xhc3M9dG9vbHRpcC1jb250ZW50cz4gPHA+UXVldWUgbGVuZ3RoOiBUaGUgZXN0aW1hdGVkIG51bWJlciBvZiBtZXNzYWdlcyBpbiBhbiBlbmRwb2ludCdzIHF1ZXVlLjwvcD4gPHA+Tk9URTogVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZS4gPGEgaHJlZj1odHRwczovL2RvY3MucGFydGljdWxhci5uZXQvbW9uaXRvcmluZy9tZXRyaWNzL2RlZmluaXRpb25zI21ldHJpY3MtY2FwdHVyZWQtcXVldWUtbGVuZ3RoLWtub3duLWxpbWl0YXRpb25zIHRhcmdldD1fYmxhbms+TGVhcm4gbW9yZTwvYT4gPGkgY2xhc3M9XFxcImZhIGZhLWV4dGVybmFsLWxpbmsgZmFrZS1saW5rXFxcIj48L2k+PC9wPiA8L2Rpdj4gPC9kaXY+IDwvZGl2PiA8ZGl2IGNsYXNzPVxcXCJyb3cgbWV0cmljLWRpZ2VzdC12YWx1ZSBjdXJyZW50XFxcIj4gPGRpdiBuZy1pZj1cXFwiZW5kcG9pbnQuaXNTdGFsZSA9PSBmYWxzZSAmJiBlbmRwb2ludC5pc1NjTW9uaXRvcmluZ0Rpc2Nvbm5lY3RlZCA9PSBmYWxzZVxcXCI+IHt7ZW5kcG9pbnQuZGlnZXN0Lm1ldHJpY3MucXVldWVMZW5ndGgubGF0ZXN0IHwgbWV0cmljc2xhcmdlbnVtYmVyOjB9fSA8c3BhbiBuZy1pZj1cXFwiZW5kcG9pbnQuaXNTdGFsZSA9PSBmYWxzZSB8fCBlbmRwb2ludC5pc1NjTW9uaXRvcmluZ0Rpc2Nvbm5lY3RlZCA9PSBmYWxzZVxcXCIgY2xhc3M9bWV0cmljLWRpZ2VzdC12YWx1ZS1zdWZmaXg+TVNHUzwvc3Bhbj4gPC9kaXY+IDxzdHJvbmcgbmctaWY9XFxcImVuZHBvaW50LmlzU3RhbGUgfHwgZW5kcG9pbnQuaXNTY01vbml0b3JpbmdEaXNjb25uZWN0ZWRcXFwiPj88L3N0cm9uZz4gPC9kaXY+IDxkaXYgY2xhc3M9XFxcInJvdyBtZXRyaWMtZGlnZXN0LXZhbHVlIGF2ZXJhZ2VcXFwiPiA8ZGl2IG5nLWlmPVxcXCJlbmRwb2ludC5pc1N0YWxlID09IGZhbHNlICYmIGVuZHBvaW50LmlzU2NNb25pdG9yaW5nRGlzY29ubmVjdGVkID09IGZhbHNlXFxcIj4ge3tlbmRwb2ludC5kaWdlc3QubWV0cmljcy5xdWV1ZUxlbmd0aC5hdmVyYWdlIHwgbWV0cmljc2xhcmdlbnVtYmVyOjB9fSA8c3BhbiBjbGFzcz1tZXRyaWMtZGlnZXN0LXZhbHVlLXN1ZmZpeD5NU0dTPC9zcGFuPiA8L2Rpdj4gPHN0cm9uZyBuZy1pZj1cXFwiZW5kcG9pbnQuaXNTdGFsZSB8fCBlbmRwb2ludC5pc1NjTW9uaXRvcmluZ0Rpc2Nvbm5lY3RlZFxcXCI+Pzwvc3Ryb25nPiA8c3BhbiBuZy1pZj1cXFwiZW5kcG9pbnQuaXNTdGFsZSA9PSBmYWxzZSAmJiBlbmRwb2ludC5pc1NjTW9uaXRvcmluZ0Rpc2Nvbm5lY3RlZCA9PSBmYWxzZVxcXCIgY2xhc3M9bWV0cmljLWRpZ2VzdC12YWx1ZS1zdWZmaXg+IEFWRzwvc3Bhbj4gPC9kaXY+IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cXFwiY29sLXNtLTQgbm8tc2lkZS1wYWRkaW5nIGxpc3Qtc2VjdGlvbiBncmFwaC1hcmVhIGdyYXBoLW1lc3NhZ2UtcmV0cmllcy10aHJvdWdocHV0c1xcXCI+IDxsYXJnZS1ncmFwaCBuZy1pZj1lbmRwb2ludC5tZXRyaWNEZXRhaWxzLm1ldHJpY3MudGhyb3VnaHB1dCBmaXJzdC1kYXRhLXNlcmllcz1lbmRwb2ludC5tZXRyaWNEZXRhaWxzLm1ldHJpY3MudGhyb3VnaHB1dCBzZWNvbmQtZGF0YS1zZXJpZXM9ZW5kcG9pbnQubWV0cmljRGV0YWlscy5tZXRyaWNzLnJldHJpZXMgeGF4aXMtcG9pbnRzPWVuZHBvaW50Lm1ldHJpY0RldGFpbHMubWV0cmljcy50aHJvdWdocHV0LnRpbWVBeGlzVmFsdWVzIG1pbmltdW0teWF4aXM9e3tsYXJnZUdyYXBoc01pbmltdW1ZQXhpcy50aHJvdWdocHV0UmV0cmllc319IHBsb3Qtd2lkdGg9NzUwIHBsb3QtaGVpZ2h0PTIwMCBmaXJzdC1zZXJpZXMtY29sb3I9IzE3NjM5NyBmaXJzdC1zZXJpZXMtZmlsbC1jb2xvcj0jQ0FEQ0U4IHNlY29uZC1zZXJpZXMtY29sb3I9I0NDMTI1MiBzZWNvbmQtc2VyaWVzLWZpbGwtY29sb3I9I0U5QzREMSBjbGFzcz1cXFwibGFyZ2UtZ3JhcGggcHVsbC1sZWZ0XFxcIj48L2xhcmdlLWdyYXBoPiA8ZGl2IGNsYXNzPVxcXCJjb2wtc20tMTIgbm8tc2lkZS1wYWRkaW5nIGdyYXBoLXZhbHVlc1xcXCI+IDxkaXYgY2xhc3M9XFxcImNvbC1zbS02IG5vLXNpZGUtcGFkZGluZyB0aHJvdWdocHV0LXZhbHVlc1xcXCI+IDxkaXYgY2xhc3M9cm93PiA8c3BhbiBjbGFzcz1tZXRyaWMtZGlnZXN0LWhlYWRlciB1aWItdG9vbHRpcD1cXFwiVGhyb3VnaHB1dDogVGhlIG51bWJlciBvZiBtZXNzYWdlcyBwZXIgc2Vjb25kIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQgYnkgYSByZWNlaXZpbmcgZW5kcG9pbnQuXFxcIj4gVGhyb3VnaHB1dCA8L3NwYW4+IDwvZGl2PiA8ZGl2IGNsYXNzPVxcXCJyb3cgbWV0cmljLWRpZ2VzdC12YWx1ZSBjdXJyZW50XFxcIj4gPGRpdiBuZy1pZj1cXFwiZW5kcG9pbnQuaXNTdGFsZSA9PSBmYWxzZSAmJiBlbmRwb2ludC5pc1NjTW9uaXRvcmluZ0Rpc2Nvbm5lY3RlZCA9PSBmYWxzZVxcXCI+IHt7ZW5kcG9pbnQuZGlnZXN0Lm1ldHJpY3MudGhyb3VnaHB1dC5sYXRlc3QgfCBtZXRyaWNzbGFyZ2VudW1iZXI6Mn19IDxzcGFuIGNsYXNzPW1ldHJpYy1kaWdlc3QtdmFsdWUtc3VmZml4Pk1TR1MvUzwvc3Bhbj4gPC9kaXY+IDxzdHJvbmcgbmctaWY9XFxcImVuZHBvaW50LmlzU3RhbGUgfHwgZW5kcG9pbnQuaXNTY01vbml0b3JpbmdEaXNjb25uZWN0ZWRcXFwiPj88L3N0cm9uZz4gPC9kaXY+IDxkaXYgY2xhc3M9XFxcInJvdyBtZXRyaWMtZGlnZXN0LXZhbHVlIGF2ZXJhZ2VcXFwiPiA8ZGl2IG5nLWlmPVxcXCJlbmRwb2ludC5pc1N0YWxlID09IGZhbHNlICYmIGVuZHBvaW50LmlzU2NNb25pdG9yaW5nRGlzY29ubmVjdGVkID09IGZhbHNlXFxcIj4ge3tlbmRwb2ludC5kaWdlc3QubWV0cmljcy50aHJvdWdocHV0LmF2ZXJhZ2UgfCBtZXRyaWNzbGFyZ2VudW1iZXI6Mn19IDxzcGFuIGNsYXNzPW1ldHJpYy1kaWdlc3QtdmFsdWUtc3VmZml4Pk1TR1MvUzwvc3Bhbj4gPC9kaXY+IDxzdHJvbmcgbmctaWY9XFxcImVuZHBvaW50LmlzU3RhbGUgfHwgZW5kcG9pbnQuaXNTY01vbml0b3JpbmdEaXNjb25uZWN0ZWRcXFwiPj88L3N0cm9uZz4gPHNwYW4gbmctaWY9XFxcImVuZHBvaW50LmlzU3RhbGUgPT0gZmFsc2UgJiYgZW5kcG9pbnQuaXNTY01vbml0b3JpbmdEaXNjb25uZWN0ZWQgPT0gZmFsc2VcXFwiIGNsYXNzPW1ldHJpYy1kaWdlc3QtdmFsdWUtc3VmZml4PiBBVkc8L3NwYW4+IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cXFwiY29sLXNtLTYgbm8tc2lkZS1wYWRkaW5nIHNjaGVkdWxlZC1yZXRyaWVzLXJhdGUtdmFsdWVzXFxcIj4gPGRpdiBjbGFzcz1yb3c+IDxzcGFuIGNsYXNzPW1ldHJpYy1kaWdlc3QtaGVhZGVyIHVpYi10b29sdGlwPVxcXCJTY2hlZHVsZWQgcmV0cnkgcmF0ZTogVGhlIG51bWJlciBvZiBtZXNzYWdlcyBwZXIgc2Vjb25kIHNjaGVkdWxlZCBmb3IgcmV0cmllcyAoaW1tZWRpYXRlIG9yIGRlbGF5ZWQpLlxcXCI+IFNjaGVkdWxlZCBSZXRyaWVzIFJhdGUgPC9zcGFuPiA8L2Rpdj4gPGRpdiBjbGFzcz1cXFwicm93IG1ldHJpYy1kaWdlc3QtdmFsdWUgY3VycmVudFxcXCI+IDxkaXYgbmctaWY9XFxcImVuZHBvaW50LmlzU3RhbGUgPT0gZmFsc2UgJiYgZW5kcG9pbnQuaXNTY01vbml0b3JpbmdEaXNjb25uZWN0ZWQgPT0gZmFsc2VcXFwiPiB7e2VuZHBvaW50LmRpZ2VzdC5tZXRyaWNzLnJldHJpZXMubGF0ZXN0IHwgbWV0cmljc2xhcmdlbnVtYmVyOjJ9fSA8c3BhbiBjbGFzcz1tZXRyaWMtZGlnZXN0LXZhbHVlLXN1ZmZpeD5NU0dTL1M8L3NwYW4+IDwvZGl2PiA8c3Ryb25nIG5nLWlmPVxcXCJlbmRwb2ludC5pc1N0YWxlIHx8IGVuZHBvaW50LmlzU2NNb25pdG9yaW5nRGlzY29ubmVjdGVkXFxcIj4/PC9zdHJvbmc+IDwvZGl2PiA8ZGl2IGNsYXNzPVxcXCJyb3cgbWV0cmljLWRpZ2VzdC12YWx1ZSBhdmVyYWdlXFxcIj4gPGRpdiBuZy1pZj1cXFwiZW5kcG9pbnQuaXNTdGFsZSA9PSBmYWxzZSAmJiBlbmRwb2ludC5pc1NjTW9uaXRvcmluZ0Rpc2Nvbm5lY3RlZCA9PSBmYWxzZVxcXCI+IHt7ZW5kcG9pbnQuZGlnZXN0Lm1ldHJpY3MucmV0cmllcy5hdmVyYWdlIHwgbWV0cmljc2xhcmdlbnVtYmVyOjJ9fSA8c3BhbiBjbGFzcz1tZXRyaWMtZGlnZXN0LXZhbHVlLXN1ZmZpeD5NU0dTL1M8L3NwYW4+IDwvZGl2PiA8c3Ryb25nIG5nLWlmPVxcXCJlbmRwb2ludC5pc1N0YWxlIHx8IGVuZHBvaW50LmlzU2NNb25pdG9yaW5nRGlzY29ubmVjdGVkXFxcIj4/PC9zdHJvbmc+IDxzcGFuIG5nLWlmPVxcXCJlbmRwb2ludC5pc1N0YWxlID09IGZhbHNlICYmIGVuZHBvaW50LmlzU2NNb25pdG9yaW5nRGlzY29ubmVjdGVkID09IGZhbHNlXFxcIiBjbGFzcz1tZXRyaWMtZGlnZXN0LXZhbHVlLXN1ZmZpeD4gQVZHPC9zcGFuPiA8L2Rpdj4gPC9kaXY+IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cXFwiY29sLXNtLTQgbm8tc2lkZS1wYWRkaW5nIGxpc3Qtc2VjdGlvbiBncmFwaC1hcmVhIGdyYXBoLWNyaXRpY2FsLXByb2Nlc3NpbmctdGltZXNcXFwiPiA8bGFyZ2UtZ3JhcGggbmctaWY9ZW5kcG9pbnQubWV0cmljRGV0YWlscy5tZXRyaWNzLnByb2Nlc3NpbmdUaW1lIGZpcnN0LWRhdGEtc2VyaWVzPWVuZHBvaW50Lm1ldHJpY0RldGFpbHMubWV0cmljcy5jcml0aWNhbFRpbWUgc2Vjb25kLWRhdGEtc2VyaWVzPWVuZHBvaW50Lm1ldHJpY0RldGFpbHMubWV0cmljcy5wcm9jZXNzaW5nVGltZSB4YXhpcy1wb2ludHM9ZW5kcG9pbnQubWV0cmljRGV0YWlscy5tZXRyaWNzLmNyaXRpY2FsVGltZS50aW1lQXhpc1ZhbHVlcyBtaW5pbXVtLXlheGlzPXt7bGFyZ2VHcmFwaHNNaW5pbXVtWUF4aXMucHJvY2Vzc2luZ0NyaXRpY2FsfX0gcGxvdC13aWR0aD03NTAgcGxvdC1oZWlnaHQ9MjAwIGZpcnN0LXNlcmllcy1jb2xvcj0jMjcwMENCIGZpcnN0LXNlcmllcy1maWxsLWNvbG9yPSNDNEJDRTUgc2Vjb25kLXNlcmllcy1jb2xvcj0jMjU4MTM1IHNlY29uZC1zZXJpZXMtZmlsbC1jb2xvcj0jQkVFNkM1IGlzLWR1cmF0aW9uLWdyYXBoPXRydWUgY2xhc3M9XFxcImxhcmdlLWdyYXBoIHB1bGwtbGVmdFxcXCI+PC9sYXJnZS1ncmFwaD4gPGRpdiBjbGFzcz1cXFwiY29sLXNtLTEyIG5vLXNpZGUtcGFkZGluZyBncmFwaC12YWx1ZXNcXFwiPiA8ZGl2IGNsYXNzPVxcXCJjb2wtc20tNiBuby1zaWRlLXBhZGRpbmcgcHJvY2Vzc2luZy10aW1lLXZhbHVlc1xcXCI+IDxkaXYgY2xhc3M9cm93PiA8c3BhbiBjbGFzcz1tZXRyaWMtZGlnZXN0LWhlYWRlciB1aWItdG9vbHRpcD1cXFwiUHJvY2Vzc2luZyB0aW1lOiBUaGUgdGltZSB0YWtlbiBmb3IgYSByZWNlaXZpbmcgZW5kcG9pbnQgdG8gc3VjY2Vzc2Z1bGx5IHByb2Nlc3MgYSBtZXNzYWdlLlxcXCI+IFByb2Nlc3NpbmcgVGltZSA8L3NwYW4+IDwvZGl2PiA8ZGl2IGNsYXNzPVxcXCJyb3cgbWV0cmljLWRpZ2VzdC12YWx1ZSBjdXJyZW50XFxcIj4gPGRpdiBuZy1pZj1cXFwiZW5kcG9pbnQuaXNTdGFsZSA9PSBmYWxzZSAmJiBlbmRwb2ludC5pc1NjTW9uaXRvcmluZ0Rpc2Nvbm5lY3RlZCA9PSBmYWxzZVxcXCI+IHt7ZW5kcG9pbnQuZGlnZXN0Lm1ldHJpY3MucHJvY2Vzc2luZ1RpbWUubGF0ZXN0IHwgZHVyYXRpb25WYWx1ZX19IDxzcGFuIGNsYXNzPW1ldHJpYy1kaWdlc3QtdmFsdWUtc3VmZml4Pnt7ZW5kcG9pbnQuZGlnZXN0Lm1ldHJpY3MucHJvY2Vzc2luZ1RpbWUubGF0ZXN0IHwgZHVyYXRpb25Vbml0fX08L3NwYW4+IDwvZGl2PiA8c3Ryb25nIG5nLWlmPVxcXCJlbmRwb2ludC5pc1N0YWxlIHx8IGVuZHBvaW50LmlzU2NNb25pdG9yaW5nRGlzY29ubmVjdGVkXFxcIj4/PC9zdHJvbmc+IDwvZGl2PiA8ZGl2IGNsYXNzPVxcXCJyb3cgbWV0cmljLWRpZ2VzdC12YWx1ZSBhdmVyYWdlXFxcIj4gPGRpdiBuZy1pZj1cXFwiZW5kcG9pbnQuaXNTdGFsZSA9PSBmYWxzZSAmJiBlbmRwb2ludC5pc1NjTW9uaXRvcmluZ0Rpc2Nvbm5lY3RlZCA9PSBmYWxzZVxcXCI+IHt7ZW5kcG9pbnQuZGlnZXN0Lm1ldHJpY3MucHJvY2Vzc2luZ1RpbWUuYXZlcmFnZSB8IGR1cmF0aW9uVmFsdWV9fSA8c3BhbiBjbGFzcz1tZXRyaWMtZGlnZXN0LXZhbHVlLXN1ZmZpeD57e2VuZHBvaW50LmRpZ2VzdC5tZXRyaWNzLnByb2Nlc3NpbmdUaW1lLmF2ZXJhZ2UgfCBkdXJhdGlvblVuaXR9fSBBVkc8L3NwYW4+IDwvZGl2PiA8c3Ryb25nIG5nLWlmPVxcXCJlbmRwb2ludC5pc1N0YWxlIHx8IGVuZHBvaW50LmlzU2NNb25pdG9yaW5nRGlzY29ubmVjdGVkXFxcIj4/PC9zdHJvbmc+IDxzcGFuIG5nLWlmPVxcXCJlbmRwb2ludC5pc1N0YWxlID09IGZhbHNlICYmIGVuZHBvaW50LmlzU2NNb25pdG9yaW5nRGlzY29ubmVjdGVkID09IGZhbHNlXFxcIiBjbGFzcz1tZXRyaWMtZGlnZXN0LXZhbHVlLXN1ZmZpeD4gQVZHPC9zcGFuPiA8L2Rpdj4gPC9kaXY+IDxkaXYgY2xhc3M9XFxcImNvbC1zbS02IG5vLXNpZGUtcGFkZGluZyBjcml0aWNhbC10aW1lLXZhbHVlc1xcXCI+IDxkaXYgY2xhc3M9cm93PiA8c3BhbiBjbGFzcz1tZXRyaWMtZGlnZXN0LWhlYWRlciB1aWItdG9vbHRpcD1cXFwiQ3JpdGljYWwgdGltZTogVGhlIGVsYXBzZWQgdGltZSBmcm9tIHdoZW4gYSBtZXNzYWdlIHdhcyBzZW50LCB1bnRpbCBpdCB3YXMgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCBieSBhIHJlY2VpdmluZyBlbmRwb2ludC5cXFwiPiBDcml0aWNhbCBUaW1lIDwvc3Bhbj4gPC9kaXY+IDxkaXYgY2xhc3M9XFxcInJvdyBtZXRyaWMtZGlnZXN0LXZhbHVlIGN1cnJlbnRcXFwiPiA8ZGl2IG5nLWlmPVxcXCJlbmRwb2ludC5pc1N0YWxlID09IGZhbHNlICYmIGVuZHBvaW50LmlzU2NNb25pdG9yaW5nRGlzY29ubmVjdGVkID09IGZhbHNlXFxcIj4ge3tlbmRwb2ludC5kaWdlc3QubWV0cmljcy5jcml0aWNhbFRpbWUubGF0ZXN0IHwgZHVyYXRpb25WYWx1ZX19IDxzcGFuIGNsYXNzPW1ldHJpYy1kaWdlc3QtdmFsdWUtc3VmZml4Pnt7ZW5kcG9pbnQuZGlnZXN0Lm1ldHJpY3MuY3JpdGljYWxUaW1lLmxhdGVzdCB8IGR1cmF0aW9uVW5pdH19PC9zcGFuPiA8L2Rpdj4gPHN0cm9uZyBuZy1pZj1cXFwiZW5kcG9pbnQuaXNTdGFsZSB8fCBlbmRwb2ludC5pc1NjTW9uaXRvcmluZ0Rpc2Nvbm5lY3RlZFxcXCI+Pzwvc3Ryb25nPiA8L2Rpdj4gPGRpdiBjbGFzcz1cXFwicm93IG1ldHJpYy1kaWdlc3QtdmFsdWUgYXZlcmFnZVxcXCI+IDxkaXYgbmctaWY9XFxcImVuZHBvaW50LmlzU3RhbGUgPT0gZmFsc2UgJiYgZW5kcG9pbnQuaXNTY01vbml0b3JpbmdEaXNjb25uZWN0ZWQgPT0gZmFsc2VcXFwiPiB7e2VuZHBvaW50LmRpZ2VzdC5tZXRyaWNzLmNyaXRpY2FsVGltZS5hdmVyYWdlIHwgZHVyYXRpb25WYWx1ZX19IDxzcGFuIGNsYXNzPW1ldHJpYy1kaWdlc3QtdmFsdWUtc3VmZml4Pnt7ZW5kcG9pbnQuZGlnZXN0Lm1ldHJpY3MuY3JpdGljYWxUaW1lLmF2ZXJhZ2UgfCBkdXJhdGlvblVuaXR9fSA8L3NwYW4+IDwvZGl2PiA8c3Ryb25nIG5nLWlmPVxcXCJlbmRwb2ludC5pc1N0YWxlIHx8IGVuZHBvaW50LmlzU2NNb25pdG9yaW5nRGlzY29ubmVjdGVkXFxcIj4/PC9zdHJvbmc+IDxzcGFuIG5nLWlmPVxcXCJlbmRwb2ludC5pc1N0YWxlID09IGZhbHNlICYmIGVuZHBvaW50LmlzU2NNb25pdG9yaW5nRGlzY29ubmVjdGVkID09IGZhbHNlXFxcIiBjbGFzcz1tZXRyaWMtZGlnZXN0LXZhbHVlLXN1ZmZpeD4gQVZHPC9zcGFuPiA8L2Rpdj4gPC9kaXY+IDwvZGl2PiA8L2Rpdj4gPC9kaXY+IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1jb250YWluZXI+IDxidXN5IG5nLXNob3c9bG9hZGluZyBtZXNzYWdlPVxcXCJMb2FkaW5nIGRldGFpbHNcXFwiPjwvYnVzeT4gPGRpdiBjbGFzcz10YWJzPiA8aDUgbmctY2xhc3M9XFxcInthY3RpdmU6ICFzaG93SW5zdGFuY2VzQnJlYWtkb3dufVxcXCI+IDxhIG5nLWNsaWNrPVxcXCJzaG93SW5zdGFuY2VzQnJlYWtkb3duID0gZmFsc2VcXFwiIGNsYXNzPW5nLWJpbmRpbmc+TWVzc2FnZSBUeXBlczwvYT4gPC9oNT4gPGg1IG5nLWNsYXNzPVxcXCJ7YWN0aXZlOiBzaG93SW5zdGFuY2VzQnJlYWtkb3dufVxcXCI+IDxhIG5nLWNsaWNrPVxcXCJzaG93SW5zdGFuY2VzQnJlYWtkb3duID0gdHJ1ZVxcXCIgY2xhc3M9bmctYmluZGluZz5JbnN0YW5jZXM8L2E+IDwvaDU+IDwvZGl2PiA8c2VjdGlvbiBuZy1pZj1zaG93SW5zdGFuY2VzQnJlYWtkb3duIGNsYXNzPWVuZHBvaW50LWluc3RhbmNlcz4gPGRpdiBjbGFzcz1yb3c+IDxkaXYgY2xhc3M9XFxcImNvbC1zbS0xMiBuby1zaWRlLXBhZGRpbmdcXFwiPiA8YnVzeSBuZy1zaG93PWxvYWRpbmcgbWVzc2FnZT1cXFwiTG9hZGluZyBkZXRhaWxzXFxcIj48L2J1c3k+IDxkaXYgbmctc2hvdz0hbG9hZGluZyBjbGFzcz1cXFwicm93IGJveCBib3gtbm8tY2xpY2sgdGFibGUtaGVhZC1yb3dcXFwiPiA8ZGl2IGNsYXNzPVxcXCJjb2wtc20tMiBjb2wteGwtOFxcXCI+IDxkaXYgY2xhc3M9XFxcInJvdyBib3gtaGVhZGVyXFxcIj4gPGRpdiBjbGFzcz1jb2wtc20tMTI+IEluc3RhbmNlIE5hbWUgPC9kaXY+IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cXFwiY29sLXNtLTIgY29sLXhsLTEgbm8tc2lkZS1wYWRkaW5nXFxcIj4gPGRpdiBjbGFzcz1cXFwicm93IGJveC1oZWFkZXJcXFwiPiA8ZGl2IGNsYXNzPVxcXCJjb2wtc20tMTIgbm8tc2lkZS1wYWRkaW5nXFxcIiB1aWItdG9vbHRpcD1cXFwiVGhyb3VnaHB1dDogVGhlIG51bWJlciBvZiBtZXNzYWdlcyBwZXIgc2Vjb25kIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQgYnkgYSByZWNlaXZpbmcgZW5kcG9pbnQuXFxcIj4gVGhyb3VnaHB1dCA8c3BhbiBjbGFzcz10YWJsZS1oZWFkZXItdW5pdD4obXNncy9zKTwvc3Bhbj4gPC9kaXY+IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cXFwiY29sLXNtLTIgY29sLXhsLTEgbm8tc2lkZS1wYWRkaW5nXFxcIj4gPGRpdiBjbGFzcz1cXFwicm93IGJveC1oZWFkZXJcXFwiPiA8ZGl2IGNsYXNzPVxcXCJjb2wtc20tMTIgbm8tc2lkZS1wYWRkaW5nXFxcIiB1aWItdG9vbHRpcD1cXFwiU2NoZWR1bGVkIHJldHJ5IHJhdGU6IFRoZSBudW1iZXIgb2YgbWVzc2FnZXMgcGVyIHNlY29uZCBzY2hlZHVsZWQgZm9yIHJldHJpZXMgKGltbWVkaWF0ZSBvciBkZWxheWVkKS5cXFwiPiBTY2hlZHVsZWQgcmV0cnkgcmF0ZSA8c3BhbiBjbGFzcz10YWJsZS1oZWFkZXItdW5pdD4obXNncy9zKTwvc3Bhbj4gPC9kaXY+IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cXFwiY29sLXNtLTIgY29sLXhsLTEgbm8tc2lkZS1wYWRkaW5nXFxcIj4gPGRpdiBjbGFzcz1cXFwicm93IGJveC1oZWFkZXJcXFwiPiA8ZGl2IGNsYXNzPVxcXCJjb2wtc20tMTIgbm8tc2lkZS1wYWRkaW5nXFxcIiB1aWItdG9vbHRpcD1cXFwiUHJvY2Vzc2luZyB0aW1lOiBUaGUgdGltZSB0YWtlbiBmb3IgYSByZWNlaXZpbmcgZW5kcG9pbnQgdG8gc3VjY2Vzc2Z1bGx5IHByb2Nlc3MgYSBtZXNzYWdlLlxcXCI+IFByb2Nlc3NpbmcgVGltZSA8c3BhbiBjbGFzcz10YWJsZS1oZWFkZXItdW5pdD4odCk8L3NwYW4+IDwvZGl2PiA8L2Rpdj4gPC9kaXY+IDxkaXYgY2xhc3M9XFxcImNvbC1zbS0yIGNvbC14bC0xIG5vLXNpZGUtcGFkZGluZ1xcXCI+IDxkaXYgY2xhc3M9XFxcInJvdyBib3gtaGVhZGVyXFxcIj4gPGRpdiBjbGFzcz1cXFwiY29sLXNtLTEyIG5vLXNpZGUtcGFkZGluZ1xcXCIgdWliLXRvb2x0aXA9XFxcIkNyaXRpY2FsIHRpbWU6IFRoZSBlbGFwc2VkIHRpbWUgZnJvbSB3aGVuIGEgbWVzc2FnZSB3YXMgc2VudCwgdW50aWwgaXQgd2FzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQgYnkgYSByZWNlaXZpbmcgZW5kcG9pbnQuXFxcIj4gQ3JpdGljYWwgVGltZSA8c3BhbiBjbGFzcz10YWJsZS1oZWFkZXItdW5pdD4odCk8L3NwYW4+IDwvZGl2PiA8L2Rpdj4gPC9kaXY+IDwvZGl2PiA8ZGl2IGNsYXNzPXJvdz4gPGRpdiBjbGFzcz1cXFwiY29sLXNtLTEyIG5vLXNpZGUtcGFkZGluZ1xcXCI+IDxkaXYgY2xhc3M9XFxcInJvdyBib3ggZW5kcG9pbnQtcm93XFxcIiBuZy1yZXBlYXQ9XFxcImluc3RhbmNlIGluIGVuZHBvaW50Lmluc3RhbmNlc1xcXCI+IDxkaXYgY2xhc3M9XFxcImNvbC1zbS0xMiBuby1zaWRlLXBhZGRpbmdcXFwiPiA8ZGl2IGNsYXNzPXJvdz4gPGRpdiBjbGFzcz1cXFwiY29sLXNtLTIgY29sLXhsLTggZW5kcG9pbnQtbmFtZVxcXCI+IDxkaXYgY2xhc3M9XFxcInJvdyBib3gtaGVhZGVyXFxcIj4gPGRpdiBjbGFzcz1cXFwiY29sLWxnLW1heC05IG5vLXNpZGUtcGFkZGluZyBsZWFkXFxcIj4ge3tpbnN0YW5jZS5uYW1lfX0gPC9kaXY+IDxkaXYgY2xhc3M9XFxcImNvbC1sZy00IGVuZHBvaW50LXN0YXR1c1xcXCI+IDxzcGFuIGNsYXNzPXdhcm5pbmcgbmctaWY9aW5zdGFuY2UuaXNTY01vbml0b3JpbmdEaXNjb25uZWN0ZWQ+IDxpIGNsYXNzPVxcXCJmYSBwYS1tb25pdG9yaW5nLWxvc3QgZW5kcG9pbnQtZGV0YWlsc1xcXCIgdWliLXRvb2x0aXA9XFxcIlVuYWJsZSB0byBjb25uZWN0IHRvIG1vbml0b3Jpbmcgc2VydmVyXFxcIj48L2k+IDwvc3Bhbj4gPHNwYW4gY2xhc3M9d2FybmluZyBuZy1pZj1pbnN0YW5jZS5pc1N0YWxlPiA8aSBjbGFzcz1cXFwiZmEgcGEtZW5kcG9pbnQtbG9zdCBlbmRwb2ludC1kZXRhaWxzXFxcIiB1aWItdG9vbHRpcD1cXFwiVW5hYmxlIHRvIGNvbm5lY3QgdG8gaW5zdGFuY2VcXFwiPjwvaT4gPC9zcGFuPiA8c3BhbiBjbGFzcz13YXJuaW5nIG5nLWlmPWluc3RhbmNlLmVycm9yQ291bnQ+IDxhIG5nLWlmPWluc3RhbmNlLmVycm9yQ291bnQgY2xhc3M9XFxcIndhcm5pbmcgYnRuXFxcIiBocmVmPSMvZmFpbGVkLW1lc3NhZ2VzL2dyb3Vwcy97e2VuZHBvaW50TmFtZX19L3t7c291cmNlSW5kZXh9fS97e2luc3RhbmNlLnNlcnZpY2VDb250cm9sSWR9fT4gPGkgY2xhc3M9XFxcImZhIGZhLWVudmVsb3BlXFxcIiB1aWItdG9vbHRpcD1cXFwie3tpbnN0YW5jZS5lcnJvckNvdW50IHwgbWV0cmljc2xhcmdlbnVtYmVyfX0gZmFpbGVkIG1lc3NhZ2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVuZHBvaW50LiBDbGljayB0byBzZWUgbGlzdC5cXFwiPjwvaT4gPHNwYW4gY2xhc3M9XFxcImJhZGdlIGJhZGdlLWltcG9ydGFudCBuZy1iaW5kaW5nXFxcIj57e2luc3RhbmNlLmVycm9yQ291bnQgfCBtZXRyaWNzbGFyZ2VudW1iZXJ9fTwvc3Bhbj4gPC9hPiA8L3NwYW4+IDwvZGl2PiA8L2Rpdj4gPC9kaXY+IDxkaXYgY2xhc3M9XFxcImNvbC1zbS0yIGNvbC14bC0xIG5vLXNpZGUtcGFkZGluZ1xcXCI+IDxkaXYgY2xhc3M9XFxcInJvdyBib3gtaGVhZGVyXFxcIj4gPGRpdiBjbGFzcz1uby1zaWRlLXBhZGRpbmc+IDxncmFwaCBwbG90LWRhdGE9aW5zdGFuY2UubWV0cmljcy50aHJvdWdocHV0IG1pbmltdW0teWF4aXM9e3tzbWFsbEdyYXBoc01pbmltdW1ZQXhpcy50aHJvdWdocHV0fX0gY2xhc3M9XFxcImdyYXBoIHRocm91Z2hwdXQgcHVsbC1sZWZ0XFxcIj48L2dyYXBoPiA8L2Rpdj4gPGRpdiBjbGFzcz1cXFwibm8tc2lkZS1wYWRkaW5nIHNwYXJrbGluZS12YWx1ZVxcXCI+IHt7KGluc3RhbmNlLmlzU3RhbGUgPT0gdHJ1ZSB8fCBpbnN0YW5jZS5pc1NjTW9uaXRvcmluZ0Rpc2Nvbm5lY3RlZCA9PSB0cnVlKSA/IFxcXCJcXFwiIDogaW5zdGFuY2UubWV0cmljcy50aHJvdWdocHV0LmRpc3BsYXlWYWx1ZX19IDxzdHJvbmcgbmctaWY9XFxcImluc3RhbmNlLmlzU3RhbGUgfHwgaW5zdGFuY2UuaXNTY01vbml0b3JpbmdEaXNjb25uZWN0ZWRcXFwiPj88L3N0cm9uZz4gPC9kaXY+IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cXFwiY29sLXNtLTIgY29sLXhsLTEgbm8tc2lkZS1wYWRkaW5nXFxcIj4gPGRpdiBjbGFzcz1cXFwicm93IGJveC1oZWFkZXJcXFwiPiA8ZGl2IGNsYXNzPW5vLXNpZGUtcGFkZGluZz4gPGdyYXBoIHBsb3QtZGF0YT1pbnN0YW5jZS5tZXRyaWNzLnJldHJpZXMgbWluaW11bS15YXhpcz17e3NtYWxsR3JhcGhzTWluaW11bVlBeGlzLnJldHJpZXN9fSBjbGFzcz1cXFwiZ3JhcGggcmV0cmllcyBwdWxsLWxlZnRcXFwiPjwvZ3JhcGg+IDwvZGl2PiA8ZGl2IGNsYXNzPVxcXCJuby1zaWRlLXBhZGRpbmcgc3BhcmtsaW5lLXZhbHVlXFxcIj4ge3soaW5zdGFuY2UuaXNTdGFsZSA9PSB0cnVlIHx8IGluc3RhbmNlLmlzU2NNb25pdG9yaW5nRGlzY29ubmVjdGVkID09IHRydWUpID8gXFxcIlxcXCIgOiBpbnN0YW5jZS5tZXRyaWNzLnJldHJpZXMuZGlzcGxheVZhbHVlfX0gPHN0cm9uZyBuZy1pZj1cXFwiaW5zdGFuY2UuaXNTdGFsZSB8fCBpbnN0YW5jZS5pc1NjTW9uaXRvcmluZ0Rpc2Nvbm5lY3RlZFxcXCI+Pzwvc3Ryb25nPiA8L2Rpdj4gPC9kaXY+IDwvZGl2PiA8ZGl2IGNsYXNzPVxcXCJjb2wtc20tMiBjb2wteGwtMSBuby1zaWRlLXBhZGRpbmdcXFwiPiA8ZGl2IGNsYXNzPVxcXCJyb3cgYm94LWhlYWRlclxcXCI+IDxkaXYgY2xhc3M9bm8tc2lkZS1wYWRkaW5nPiA8Z3JhcGggcGxvdC1kYXRhPWluc3RhbmNlLm1ldHJpY3MucHJvY2Vzc2luZ1RpbWUgbWluaW11bS15YXhpcz17e3NtYWxsR3JhcGhzTWluaW11bVlBeGlzLnByb2Nlc3NpbmdUaW1lfX0gY2xhc3M9XFxcImdyYXBoIHByb2Nlc3NpbmctdGltZSBwdWxsLWxlZnRcXFwiPjwvZ3JhcGg+IDwvZGl2PiA8ZGl2IGNsYXNzPVxcXCJuby1zaWRlLXBhZGRpbmcgc3BhcmtsaW5lLXZhbHVlXFxcIj4ge3soaW5zdGFuY2UuaXNTdGFsZSA9PSB0cnVlIHx8IGluc3RhbmNlLmlzU2NNb25pdG9yaW5nRGlzY29ubmVjdGVkID09IHRydWUpID8gXFxcIlxcXCIgOiBpbnN0YW5jZS5tZXRyaWNzLnByb2Nlc3NpbmdUaW1lLmRpc3BsYXlWYWx1ZS52YWx1ZX19IDxzcGFuIG5nLWlmPVxcXCJpbnN0YW5jZS5pc1N0YWxlID09IGZhbHNlIHx8IGluc3RhbmNlLmlzU2NNb25pdG9yaW5nRGlzY29ubmVjdGVkID09IGZhbHNlXFxcIj57e2luc3RhbmNlLm1ldHJpY3MucHJvY2Vzc2luZ1RpbWUuZGlzcGxheVZhbHVlLnVuaXR9fTwvc3Bhbj4gPHN0cm9uZyBuZy1pZj1cXFwiaW5zdGFuY2UuaXNTdGFsZSB8fCBpbnN0YW5jZS5pc1NjTW9uaXRvcmluZ0Rpc2Nvbm5lY3RlZFxcXCI+Pzwvc3Ryb25nPiA8L2Rpdj4gPC9kaXY+IDwvZGl2PiA8ZGl2IGNsYXNzPVxcXCJjb2wtc20tMiBjb2wteGwtMSBuby1zaWRlLXBhZGRpbmdcXFwiPiA8ZGl2IGNsYXNzPVxcXCJyb3cgYm94LWhlYWRlclxcXCI+IDxkaXYgY2xhc3M9bm8tc2lkZS1wYWRkaW5nPiA8Z3JhcGggcGxvdC1kYXRhPWluc3RhbmNlLm1ldHJpY3MuY3JpdGljYWxUaW1lIG1pbmltdW0teWF4aXM9e3tzbWFsbEdyYXBoc01pbmltdW1ZQXhpcy5jcml0aWNhbFRpbWV9fSBjbGFzcz1cXFwiZ3JhcGggY3JpdGljYWwtdGltZSBwdWxsLWxlZnRcXFwiPjwvZ3JhcGg+IDwvZGl2PiA8ZGl2IGNsYXNzPVxcXCJuby1zaWRlLXBhZGRpbmcgc3BhcmtsaW5lLXZhbHVlXFxcIj4ge3soaW5zdGFuY2UuaXNTdGFsZSA9PSB0cnVlIHx8IGluc3RhbmNlLmlzU2NNb25pdG9yaW5nRGlzY29ubmVjdGVkID09IHRydWUpID8gXFxcIlxcXCIgOiBpbnN0YW5jZS5tZXRyaWNzLmNyaXRpY2FsVGltZS5kaXNwbGF5VmFsdWUudmFsdWV9fSA8c3BhbiBuZy1pZj1cXFwiaW5zdGFuY2UuaXNTdGFsZSA9PSBmYWxzZSB8fCBpbnN0YW5jZS5pc1NjTW9uaXRvcmluZ0Rpc2Nvbm5lY3RlZCA9PSBmYWxzZVxcXCI+e3tpbnN0YW5jZS5tZXRyaWNzLmNyaXRpY2FsVGltZS5kaXNwbGF5VmFsdWUudW5pdH19PC9zcGFuPiA8c3Ryb25nIG5nLWlmPVxcXCJpbnN0YW5jZS5pc1N0YWxlIHx8IGluc3RhbmNlLmlzU2NNb25pdG9yaW5nRGlzY29ubmVjdGVkXFxcIj4/PC9zdHJvbmc+IDwvZGl2PiA8L2Rpdj4gPC9kaXY+IDwvZGl2PiA8L2Rpdj4gPC9kaXY+IDwvZGl2PiA8L2Rpdj4gPC9kaXY+IDwvZGl2PiA8L3NlY3Rpb24+IDxzZWN0aW9uIG5nLWlmPSFzaG93SW5zdGFuY2VzQnJlYWtkb3duIGNsYXNzPWVuZHBvaW50LW1lc3NhZ2UtdHlwZXM+IDxkaXYgY2xhc3M9cm93PiA8ZGl2IGNsYXNzPVxcXCJjb2wtc20tMTIgbm8tc2lkZS1wYWRkaW5nXFxcIj4gPGJ1c3kgbmctc2hvdz1sb2FkaW5nIG1lc3NhZ2U9XFxcIkxvYWRpbmcgZGV0YWlsc1xcXCI+PC9idXN5PiA8ZGl2IG5nLXNob3c9IWxvYWRpbmcgY2xhc3M9XFxcInJvdyBib3ggYm94LW5vLWNsaWNrIHRhYmxlLWhlYWQtcm93XFxcIj4gPGRpdiBjbGFzcz1cXFwiY29sLXNtLTIgY29sLXhsLThcXFwiPiA8ZGl2IGNsYXNzPVxcXCJyb3cgYm94LWhlYWRlclxcXCI+IDxkaXYgY2xhc3M9Y29sLXNtLTEyPiBNZXNzYWdlIHR5cGUgbmFtZSA8L2Rpdj4gPC9kaXY+IDwvZGl2PiA8ZGl2IGNsYXNzPVxcXCJjb2wtc20tMiBjb2wteGwtMSBuby1zaWRlLXBhZGRpbmdcXFwiPiA8ZGl2IGNsYXNzPVxcXCJyb3cgYm94LWhlYWRlclxcXCI+IDxkaXYgY2xhc3M9XFxcImNvbC1zbS0xMiBuby1zaWRlLXBhZGRpbmdcXFwiIHVpYi10b29sdGlwPVxcXCJUaHJvdWdocHV0OiBUaGUgbnVtYmVyIG9mIG1lc3NhZ2VzIHBlciBzZWNvbmQgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCBieSBhIHJlY2VpdmluZyBlbmRwb2ludC5cXFwiPiBUaHJvdWdocHV0IDxzcGFuIGNsYXNzPXRhYmxlLWhlYWRlci11bml0Pihtc2dzL3MpPC9zcGFuPiA8L2Rpdj4gPC9kaXY+IDwvZGl2PiA8ZGl2IGNsYXNzPVxcXCJjb2wtc20tMiBjb2wteGwtMSBuby1zaWRlLXBhZGRpbmdcXFwiPiA8ZGl2IGNsYXNzPVxcXCJyb3cgYm94LWhlYWRlclxcXCI+IDxkaXYgY2xhc3M9XFxcImNvbC1zbS0xMiBuby1zaWRlLXBhZGRpbmdcXFwiIHVpYi10b29sdGlwPVxcXCJTY2hlZHVsZWQgcmV0cnkgcmF0ZTogVGhlIG51bWJlciBvZiBtZXNzYWdlcyBwZXIgc2Vjb25kIHNjaGVkdWxlZCBmb3IgcmV0cmllcyAoaW1tZWRpYXRlIG9yIGRlbGF5ZWQpLlxcXCI+IFNjaGVkdWxlZCByZXRyeSByYXRlIDxzcGFuIGNsYXNzPXRhYmxlLWhlYWRlci11bml0Pihtc2dzL3MpPC9zcGFuPiA8L2Rpdj4gPC9kaXY+IDwvZGl2PiA8ZGl2IGNsYXNzPVxcXCJjb2wtc20tMiBjb2wteGwtMSBuby1zaWRlLXBhZGRpbmdcXFwiPiA8ZGl2IGNsYXNzPVxcXCJyb3cgYm94LWhlYWRlclxcXCI+IDxkaXYgY2xhc3M9XFxcImNvbC1zbS0xMiBuby1zaWRlLXBhZGRpbmdcXFwiIHVpYi10b29sdGlwPVxcXCJQcm9jZXNzaW5nIHRpbWU6IFRoZSB0aW1lIHRha2VuIGZvciBhIHJlY2VpdmluZyBlbmRwb2ludCB0byBzdWNjZXNzZnVsbHkgcHJvY2VzcyBhIG1lc3NhZ2UuXFxcIj4gUHJvY2Vzc2luZyBUaW1lIDxzcGFuIGNsYXNzPXRhYmxlLWhlYWRlci11bml0Pih0KTwvc3Bhbj4gPC9kaXY+IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cXFwiY29sLXNtLTIgY29sLXhsLTEgbm8tc2lkZS1wYWRkaW5nXFxcIj4gPGRpdiBjbGFzcz1cXFwicm93IGJveC1oZWFkZXJcXFwiPiA8ZGl2IGNsYXNzPVxcXCJjb2wtc20tMTIgbm8tc2lkZS1wYWRkaW5nXFxcIiB1aWItdG9vbHRpcD1cXFwiQ3JpdGljYWwgdGltZTogVGhlIGVsYXBzZWQgdGltZSBmcm9tIHdoZW4gYSBtZXNzYWdlIHdhcyBzZW50LCB1bnRpbCBpdCB3YXMgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCBieSBhIHJlY2VpdmluZyBlbmRwb2ludC5cXFwiPiBDcml0aWNhbCBUaW1lIDxzcGFuIGNsYXNzPXRhYmxlLWhlYWRlci11bml0Pih0KTwvc3Bhbj4gPC9kaXY+IDwvZGl2PiA8L2Rpdj4gPC9kaXY+IDxkaXYgY2xhc3M9cm93PiA8ZGl2IGNsYXNzPVxcXCJjb2wtc20tMTIgbm8tc2lkZS1wYWRkaW5nXFxcIj4gPGRpdiBjbGFzcz1cXFwicm93IGJveCBlbmRwb2ludC1yb3dcXFwiIG5nLXJlcGVhdD1cXFwibWVzc2FnZVR5cGUgaW4gZW5kcG9pbnQubWVzc2FnZVR5cGVzXFxcIj4gPGRpdiBjbGFzcz1cXFwiY29sLXNtLTEyIG5vLXNpZGUtcGFkZGluZ1xcXCI+IDxkaXYgY2xhc3M9cm93PiA8ZGl2IGNsYXNzPVxcXCJjb2wtc20tMiBjb2wteGwtOCBlbmRwb2ludC1uYW1lXFxcIj4gPGRpdiBjbGFzcz1cXFwicm93IGJveC1oZWFkZXJcXFwiPiA8ZGl2IGNsYXNzPVxcXCJjb2wtbGctbWF4LTkgbm8tc2lkZS1wYWRkaW5nIGxlYWQgbWVzc2FnZS10eXBlLWxhYmVsXFxcIj4gPGRpdiBjbGFzcz1sZWFkPiB7e21lc3NhZ2VUeXBlLnR5cGVOYW1lID8gbWVzc2FnZVR5cGUudHlwZU5hbWUgOiAnVW5rbm93bid9fSA8L2Rpdj4gPC9kaXY+IDxkaXYgY2xhc3M9XFxcImNvbC1sZy00IG5vLXNpZGUtcGFkZGluZyBlbmRwb2ludC1zdGF0dXMgbWVzc2FnZS10eXBlLXN0YXR1c1xcXCI+IDxzcGFuIGNsYXNzPXdhcm5pbmcgbmctaWY9ZW5kcG9pbnQuaXNTY01vbml0b3JpbmdEaXNjb25uZWN0ZWQ+IDxpIGNsYXNzPVxcXCJmYSBwYS1tb25pdG9yaW5nLWxvc3QgZW5kcG9pbnQtZGV0YWlsc1xcXCIgdWliLXRvb2x0aXA9XFxcIlVuYWJsZSB0byBjb25uZWN0IHRvIG1vbml0b3Jpbmcgc2VydmVyXFxcIj48L2k+IDwvc3Bhbj4gPHNwYW4gY2xhc3M9d2FybmluZyBuZy1pZj1lbmRwb2ludC5pc1N0YWxlPiA8aSBjbGFzcz1cXFwiZmEgcGEtZW5kcG9pbnQtbG9zdCBlbmRwb2ludC1kZXRhaWxzXFxcIiB1aWItdG9vbHRpcD1cXFwiVW5hYmxlIHRvIGNvbm5lY3QgdG8gaW5zdGFuY2VcXFwiPjwvaT4gPC9zcGFuPiA8L2Rpdj4gPC9kaXY+IDxkaXYgY2xhc3M9XFxcInJvdyBtZXNzYWdlLXR5cGUtcHJvcGVydGllc1xcXCI+IDxkaXYgbmctc2hvdz1cXFwie3ttZXNzYWdlVHlwZS50eXBlTmFtZSAmJiBtZXNzYWdlVHlwZS50eXBlTmFtZSAhPSAnbnVsbCd9fVxcXCIgY2xhc3M9bWVzc2FnZS10eXBlLXBhcnQ+e3ttZXNzYWdlVHlwZS5hc3NlbWJseU5hbWUgKyAnLScgKyBtZXNzYWdlVHlwZS5hc3NlbWJseVZlcnNpb259fTwvZGl2PiA8ZGl2IG5nLXNob3c9XFxcInt7bWVzc2FnZVR5cGUuY3VsdHVyZSAmJiBtZXNzYWdlVHlwZS5jdWx0dXJlICE9ICdudWxsJ319XFxcIiBjbGFzcz1tZXNzYWdlLXR5cGUtcGFydD57eydDdWx0dXJlPScgKyBtZXNzYWdlVHlwZS5jdWx0dXJlfX08L2Rpdj4gPGRpdiBuZy1zaG93PVxcXCJ7e21lc3NhZ2VUeXBlLnB1YmxpY0tleVRva2VuICYmIG1lc3NhZ2VUeXBlLnB1YmxpY0tleVRva2VuICE9ICdudWxsJ319XFxcIiBjbGFzcz1tZXNzYWdlLXR5cGUtcGFydD57eydQdWJsaWNLZXlUb2tlbj0nICsgbWVzc2FnZVR5cGUucHVibGljS2V5VG9rZW59fTwvZGl2PiA8L2Rpdj4gPC9kaXY+IDxkaXYgY2xhc3M9XFxcImNvbC1zbS0yIGNvbC14bC0xIG5vLXNpZGUtcGFkZGluZ1xcXCI+IDxkaXYgY2xhc3M9XFxcInJvdyBib3gtaGVhZGVyXFxcIj4gPGRpdiBjbGFzcz1uby1zaWRlLXBhZGRpbmc+IDxncmFwaCBwbG90LWRhdGE9bWVzc2FnZVR5cGUubWV0cmljcy50aHJvdWdocHV0IG1pbmltdW0teWF4aXM9e3tzbWFsbEdyYXBoc01pbmltdW1ZQXhpcy50aHJvdWdocHV0fX0gY2xhc3M9XFxcImdyYXBoIHRocm91Z2hwdXQgcHVsbC1sZWZ0XFxcIj48L2dyYXBoPiA8L2Rpdj4gPGRpdiBjbGFzcz1cXFwibm8tc2lkZS1wYWRkaW5nIHNwYXJrbGluZS12YWx1ZVxcXCI+IHt7KGVuZHBvaW50LmlzU3RhbGUgPT0gdHJ1ZSB8fCBlbmRwb2ludC5pc1NjTW9uaXRvcmluZ0Rpc2Nvbm5lY3RlZCA9PSB0cnVlKSA/IFxcXCJcXFwiIDogbWVzc2FnZVR5cGUubWV0cmljcy50aHJvdWdocHV0LmRpc3BsYXlWYWx1ZX19IDxzdHJvbmcgbmctaWY9XFxcImVuZHBvaW50LmlzU3RhbGUgfHwgZW5kcG9pbnQuaXNTY01vbml0b3JpbmdEaXNjb25uZWN0ZWRcXFwiPj88L3N0cm9uZz4gPC9kaXY+IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cXFwiY29sLXNtLTIgY29sLXhsLTEgbm8tc2lkZS1wYWRkaW5nXFxcIj4gPGRpdiBjbGFzcz1cXFwicm93IGJveC1oZWFkZXJcXFwiPiA8ZGl2IGNsYXNzPW5vLXNpZGUtcGFkZGluZz4gPGdyYXBoIHBsb3QtZGF0YT1tZXNzYWdlVHlwZS5tZXRyaWNzLnJldHJpZXMgbWluaW11bS15YXhpcz17e3NtYWxsR3JhcGhzTWluaW11bVlBeGlzLnJldHJpZXN9fSBjbGFzcz1cXFwiZ3JhcGggcmV0cmllcyBwdWxsLWxlZnRcXFwiPjwvZ3JhcGg+IDwvZGl2PiA8ZGl2IGNsYXNzPVxcXCJuby1zaWRlLXBhZGRpbmcgc3BhcmtsaW5lLXZhbHVlXFxcIj4ge3soZW5kcG9pbnQuaXNTdGFsZSA9PSB0cnVlIHx8IGVuZHBvaW50LmlzU2NNb25pdG9yaW5nRGlzY29ubmVjdGVkID09IHRydWUpID8gXFxcIlxcXCIgOiBtZXNzYWdlVHlwZS5tZXRyaWNzLnJldHJpZXMuZGlzcGxheVZhbHVlfX0gPHN0cm9uZyBuZy1pZj1cXFwiZW5kcG9pbnQuaXNTdGFsZSB8fCBlbmRwb2ludC5pc1NjTW9uaXRvcmluZ0Rpc2Nvbm5lY3RlZFxcXCI+Pzwvc3Ryb25nPiA8L2Rpdj4gPC9kaXY+IDwvZGl2PiA8ZGl2IGNsYXNzPVxcXCJjb2wtc20tMiBjb2wteGwtMSBuby1zaWRlLXBhZGRpbmdcXFwiPiA8ZGl2IGNsYXNzPVxcXCJyb3cgYm94LWhlYWRlclxcXCI+IDxkaXYgY2xhc3M9bm8tc2lkZS1wYWRkaW5nPiA8Z3JhcGggcGxvdC1kYXRhPW1lc3NhZ2VUeXBlLm1ldHJpY3MucHJvY2Vzc2luZ1RpbWUgbWluaW11bS15YXhpcz17e3NtYWxsR3JhcGhzTWluaW11bVlBeGlzLnByb2Nlc3NpbmdUaW1lfX0gY2xhc3M9XFxcImdyYXBoIHByb2Nlc3NpbmctdGltZSBwdWxsLWxlZnRcXFwiPjwvZ3JhcGg+IDwvZGl2PiA8ZGl2IGNsYXNzPVxcXCJuby1zaWRlLXBhZGRpbmcgc3BhcmtsaW5lLXZhbHVlXFxcIj4ge3soZW5kcG9pbnQuaXNTdGFsZSA9PSB0cnVlIHx8IGVuZHBvaW50LmlzU2NNb25pdG9yaW5nRGlzY29ubmVjdGVkID09IHRydWUpID8gXFxcIlxcXCIgOiBtZXNzYWdlVHlwZS5tZXRyaWNzLnByb2Nlc3NpbmdUaW1lLmRpc3BsYXlWYWx1ZS52YWx1ZX19IDxzcGFuIG5nLWlmPVxcXCJpbnN0YW5jZS5pc1N0YWxlID09IGZhbHNlIHx8IGluc3RhbmNlLmlzU2NNb25pdG9yaW5nRGlzY29ubmVjdGVkID09IGZhbHNlXFxcIj57e21lc3NhZ2VUeXBlLm1ldHJpY3MucHJvY2Vzc2luZ1RpbWUuZGlzcGxheVZhbHVlLnVuaXR9fTwvc3Bhbj4gPHN0cm9uZyBuZy1pZj1cXFwiZW5kcG9pbnQuaXNTdGFsZSB8fCBlbmRwb2ludC5pc1NjTW9uaXRvcmluZ0Rpc2Nvbm5lY3RlZFxcXCI+Pzwvc3Ryb25nPiA8L2Rpdj4gPC9kaXY+IDwvZGl2PiA8ZGl2IGNsYXNzPVxcXCJjb2wtc20tMiBjb2wteGwtMSBuby1zaWRlLXBhZGRpbmdcXFwiPiA8ZGl2IGNsYXNzPVxcXCJyb3cgYm94LWhlYWRlclxcXCI+IDxkaXYgY2xhc3M9bm8tc2lkZS1wYWRkaW5nPiA8Z3JhcGggcGxvdC1kYXRhPW1lc3NhZ2VUeXBlLm1ldHJpY3MuY3JpdGljYWxUaW1lIG1pbmltdW0teWF4aXM9e3tzbWFsbEdyYXBoc01pbmltdW1ZQXhpcy5jcml0aWNhbFRpbWV9fSBjbGFzcz1cXFwiZ3JhcGggY3JpdGljYWwtdGltZSBwdWxsLWxlZnRcXFwiPjwvZ3JhcGg+IDwvZGl2PiA8ZGl2IGNsYXNzPVxcXCJuby1zaWRlLXBhZGRpbmcgc3BhcmtsaW5lLXZhbHVlXFxcIj4ge3soZW5kcG9pbnQuaXNTdGFsZSA9PSB0cnVlIHx8IGVuZHBvaW50LmlzU2NNb25pdG9yaW5nRGlzY29ubmVjdGVkID09IHRydWUpID8gXFxcIlxcXCIgOiBtZXNzYWdlVHlwZS5tZXRyaWNzLmNyaXRpY2FsVGltZS5kaXNwbGF5VmFsdWUudmFsdWV9fSA8c3BhbiBuZy1pZj1cXFwiaW5zdGFuY2UuaXNTdGFsZSA9PSBmYWxzZSB8fCBpbnN0YW5jZS5pc1NjTW9uaXRvcmluZ0Rpc2Nvbm5lY3RlZCA9PSBmYWxzZVxcXCI+e3ttZXNzYWdlVHlwZS5tZXRyaWNzLmNyaXRpY2FsVGltZS5kaXNwbGF5VmFsdWUudW5pdH19PC9zcGFuPiA8c3Ryb25nIG5nLWlmPVxcXCJlbmRwb2ludC5pc1N0YWxlIHx8IGVuZHBvaW50LmlzU2NNb25pdG9yaW5nRGlzY29ubmVjdGVkXFxcIj4/PC9zdHJvbmc+IDwvZGl2PiA8L2Rpdj4gPC9kaXY+IDwvZGl2PiA8L2Rpdj4gPC9kaXY+IDwvZGl2PiA8L2Rpdj4gPC9kaXY+IDwvZGl2PiA8L3NlY3Rpb24+IDwvZGl2PlwiO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vYXBwL21vZHVsZXMvbW9uaXRvcmluZy92aWV3cy9lbmRwb2ludF9kZXRhaWxzLmh0bWxcbi8vIG1vZHVsZSBpZCA9IDE1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///15\n"); - -/***/ }), -/* 16 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("\n\n(function (window, angular, undefined) {\n 'use strict';\n\n angular.module('ui.particular.duration', []).filter('duration', ['formatter', function (formatter) {\n return function (input) {\n var time = formatter.formatTime(input);\n return time.value + ' ' + time.unit;\n };\n }]).filter('durationValue', ['formatter', function (formatter) {\n return function (input) {\n return formatter.formatTime(input).value;\n };\n }]).filter('durationUnit', ['formatter', function (formatter) {\n return function (input) {\n return formatter.formatTime(input).unit;\n };\n }]);\n})(window, window.angular);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hcHAvbW9kdWxlcy9tb25pdG9yaW5nL2pzL2RpcmVjdGl2ZXMvdWkucGFydGljdWxhci5kdXJhdGlvbi5qcz85YjhlIl0sIm5hbWVzIjpbIndpbmRvdyIsImFuZ3VsYXIiLCJ1bmRlZmluZWQiLCJtb2R1bGUiLCJmaWx0ZXIiLCJmb3JtYXR0ZXIiLCJpbnB1dCIsInRpbWUiLCJmb3JtYXRUaW1lIiwidmFsdWUiLCJ1bml0Il0sIm1hcHBpbmdzIjoiOztBQUFDLFdBQVVBLE1BQVYsRUFBa0JDLE9BQWxCLEVBQTJCQyxTQUEzQixFQUFzQztBQUNuQzs7QUFFQUQsWUFBUUUsTUFBUixDQUFlLHdCQUFmLEVBQXlDLEVBQXpDLEVBQ0tDLE1BREwsQ0FDWSxVQURaLEVBQ3dCLENBQUMsV0FBRCxFQUFjLFVBQVVDLFNBQVYsRUFBcUI7QUFDbkQsZUFBTyxVQUFVQyxLQUFWLEVBQWlCO0FBQ3BCLGdCQUFJQyxPQUFPRixVQUFVRyxVQUFWLENBQXFCRixLQUFyQixDQUFYO0FBQ0EsbUJBQVVDLEtBQUtFLEtBQWYsU0FBd0JGLEtBQUtHLElBQTdCO0FBQ0gsU0FIRDtBQUlILEtBTG1CLENBRHhCLEVBT0tOLE1BUEwsQ0FPWSxlQVBaLEVBTzZCLENBQUMsV0FBRCxFQUFjLFVBQVVDLFNBQVYsRUFBcUI7QUFDeEQsZUFBTyxVQUFVQyxLQUFWLEVBQWlCO0FBQ3BCLG1CQUFPRCxVQUFVRyxVQUFWLENBQXFCRixLQUFyQixFQUE0QkcsS0FBbkM7QUFDSCxTQUZEO0FBR0gsS0FKd0IsQ0FQN0IsRUFZS0wsTUFaTCxDQVlZLGNBWlosRUFZNEIsQ0FBQyxXQUFELEVBQWMsVUFBVUMsU0FBVixFQUFxQjtBQUN2RCxlQUFPLFVBQVVDLEtBQVYsRUFBaUI7QUFDcEIsbUJBQU9ELFVBQVVHLFVBQVYsQ0FBcUJGLEtBQXJCLEVBQTRCSSxJQUFuQztBQUNILFNBRkQ7QUFHSCxLQUp1QixDQVo1QjtBQWlCSCxDQXBCQSxFQW9CQ1YsTUFwQkQsRUFvQlNBLE9BQU9DLE9BcEJoQixDQUFEIiwiZmlsZSI6IjE2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uICh3aW5kb3csIGFuZ3VsYXIsIHVuZGVmaW5lZCkge1xyXG4gICAgJ3VzZSBzdHJpY3QnO1xyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKCd1aS5wYXJ0aWN1bGFyLmR1cmF0aW9uJywgW10pXHJcbiAgICAgICAgLmZpbHRlcignZHVyYXRpb24nLCBbJ2Zvcm1hdHRlcicsIGZ1bmN0aW9uIChmb3JtYXR0ZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChpbnB1dCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHRpbWUgPSBmb3JtYXR0ZXIuZm9ybWF0VGltZShpbnB1dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7dGltZS52YWx1ZX0gJHt0aW1lLnVuaXR9YDtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XSlcclxuICAgICAgICAuZmlsdGVyKCdkdXJhdGlvblZhbHVlJywgWydmb3JtYXR0ZXInLCBmdW5jdGlvbiAoZm9ybWF0dGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoaW5wdXQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0VGltZShpbnB1dCkudmFsdWU7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfV0pXHJcbiAgICAgICAgLmZpbHRlcignZHVyYXRpb25Vbml0JywgWydmb3JtYXR0ZXInLCBmdW5jdGlvbiAoZm9ybWF0dGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoaW5wdXQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0VGltZShpbnB1dCkudW5pdDtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XSk7XHJcbn0od2luZG93LCB3aW5kb3cuYW5ndWxhcikpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2FwcC9tb2R1bGVzL21vbml0b3JpbmcvanMvZGlyZWN0aXZlcy91aS5wYXJ0aWN1bGFyLmR1cmF0aW9uLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///16\n"); - -/***/ }), -/* 17 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("\n\n(function (window, angular) {\n 'use strict';\n\n function drawDataSeries(chart, data, color, fillColor, scaleX, scaleY) {\n\n var area = d3.area().x(function (d, i) {\n return scaleX(i);\n }).y(function (d) {\n return scaleY(d);\n }).y1(function () {\n return scaleY(0);\n }).curve(d3.curveLinear);\n\n var line = d3.line().x(function (d, i) {\n return scaleX(i);\n }).y(function (d, i) {\n return scaleY(d);\n }).curve(d3.curveLinear);\n\n var group = chart.append('g').attr('class', 'dataSeries');\n\n group.append('path').datum(data.points).attr('d', area).attr('fill', fillColor).attr('opacity', 0.8).attr('stroke', fillColor);\n\n group.append('path').datum(data.points).attr('d', line).attr('stroke', color).attr('stroke-width', 2.75).attr('fill', 'none');\n }\n\n function drawAverageLine(chart, data, color, fillColor, scaleX, scaleY) {\n\n var line = d3.line().x(function (d, i) {\n return scaleX(i);\n }).y(function (d, i) {\n return scaleY(d);\n }).curve(d3.curveLinear);\n\n var group = chart.append('g').attr('class', 'dataAverage');\n\n group.append('path').datum(Array(data.points.length).fill(data.average)).attr('d', line).attr('stroke', color).attr('stroke-width', 1.5).attr('opacity', 0.5).attr('stroke-dasharray', '10,10');\n }\n\n function padToWholeValue(value) {\n var emptyDataSetyAxisMax = 10;\n\n if (!value) {\n return emptyDataSetyAxisMax;\n }\n\n var upperBound = 10;\n\n while (value > upperBound) {\n upperBound *= 10;\n }\n\n upperBound /= 10;\n\n return Math.floor(value / upperBound) * upperBound + upperBound;\n }\n\n angular.module('ui.particular.largeGraph', []).directive('largeGraph', function (formatter) {\n return {\n restrict: 'E',\n scope: {\n dates: '=xaxisPoints',\n firstDataSeries: '=firstDataSeries',\n secondDataSeries: '=secondDataSeries',\n isDurationGraph: '=isDurationGraph',\n minimumYaxis: '@',\n width: '=plotWidth',\n height: '=plotHeight'\n },\n template: '',\n link: function link(scope, element, attrs) {\n scope.$watch('firstDataSeries', function () {\n\n var svg = element.find('svg')[0];\n\n d3.select(svg).selectAll('*').remove();\n\n var topMargin = 10;\n var bottomMargin = 5;\n var leftMargin = 60;\n\n var chart = d3.select(svg).attr('width', scope.width).attr('height', scope.height);\n\n var width = svg.clientWidth;\n var height = svg.clientHeight;\n\n //HINT: This is workaround for Firefox\n if (width === 0) {\n var box = svg.getBoundingClientRect();\n\n width = box.right - box.left;\n height = box.bottom - box.top;\n }\n\n var firstSeries = scope.firstDataSeries;\n var secondSeries = scope.secondDataSeries;\n\n var scaleX = d3.scaleLinear().domain([0, firstSeries.points.length - 1]).range([leftMargin, width]);\n\n chart.append('rect').attr('width', width - leftMargin).attr('height', height - topMargin - bottomMargin).attr('transform', 'translate(' + leftMargin + ',' + topMargin + ')').attr('fill', '#F2F6F7');\n\n var minimumYaxis = !isNaN(scope.minimumYaxis) ? Number(scope.minimumYaxis) : 10;\n var max = Math.max(firstSeries.average, d3.max(firstSeries.points), minimumYaxis);\n\n if (secondSeries && secondSeries.points.length > 0) {\n max = Math.max(max, secondSeries.average, d3.max(secondSeries.points));\n }\n\n var max = padToWholeValue(max);\n\n var scaleY = d3.scaleLinear().domain([0, max]).range([height - bottomMargin, topMargin]);\n\n var yAxis = d3.axisLeft(scaleY).tickValues([0, max * 1 / 4, max * 1 / 2, max * 3 / 4, max]);\n\n if (scope.isDurationGraph) {\n yAxis = yAxis.tickFormat(function (v) {\n var formattedTime = formatter.formatTime(v);\n\n return formattedTime.value + ' ' + formattedTime.unit;\n });\n }\n\n chart.append('g').attr('class', 'y axis').attr('transform', 'translate(' + leftMargin + ', 0)').call(function (g) {\n g.call(yAxis);\n g.select('.domain').remove();\n g.selectAll('.tick line').attr('stroke', 'black').attr('stroke-width', '1.75').attr('opacity', 0.1).attr('x', 0).attr('x2', width - leftMargin);\n g.selectAll('.tick text').attr('x', -4).attr('fill', '#828282');\n });\n\n var drawSeries = function drawSeries(data, lineColor, fillColor) {\n drawDataSeries(chart, data, lineColor, fillColor, scaleX, scaleY);\n };\n\n var drawAverage = function drawAverage(data, lineColor, fillColor) {\n drawAverageLine(chart, data, lineColor, fillColor, scaleX, scaleY);\n };\n\n drawSeries(firstSeries, attrs.firstSeriesColor, attrs.firstSeriesFillColor);\n\n if (secondSeries) {\n drawSeries(secondSeries, attrs.secondSeriesColor, attrs.secondSeriesFillColor);\n }\n\n drawAverage(firstSeries, attrs.firstSeriesColor, attrs.firstSeriesFillColor);\n\n if (secondSeries) {\n drawAverage(secondSeries, attrs.secondSeriesColor, attrs.secondSeriesFillColor);\n }\n });\n }\n };\n });\n})(window, window.angular);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hcHAvbW9kdWxlcy9tb25pdG9yaW5nL2pzL2RpcmVjdGl2ZXMvdWkucGFydGljdWxhci5sYXJnZUdyYXBoLmpzPzA3MGIiXSwibmFtZXMiOlsid2luZG93IiwiYW5ndWxhciIsImRyYXdEYXRhU2VyaWVzIiwiY2hhcnQiLCJkYXRhIiwiY29sb3IiLCJmaWxsQ29sb3IiLCJzY2FsZVgiLCJzY2FsZVkiLCJhcmVhIiwiZDMiLCJ4IiwiZCIsImkiLCJ5IiwieTEiLCJjdXJ2ZSIsImN1cnZlTGluZWFyIiwibGluZSIsImdyb3VwIiwiYXBwZW5kIiwiYXR0ciIsImRhdHVtIiwicG9pbnRzIiwiZHJhd0F2ZXJhZ2VMaW5lIiwiQXJyYXkiLCJsZW5ndGgiLCJmaWxsIiwiYXZlcmFnZSIsInBhZFRvV2hvbGVWYWx1ZSIsInZhbHVlIiwiZW1wdHlEYXRhU2V0eUF4aXNNYXgiLCJ1cHBlckJvdW5kIiwiTWF0aCIsImZsb29yIiwibW9kdWxlIiwiZGlyZWN0aXZlIiwiZm9ybWF0dGVyIiwicmVzdHJpY3QiLCJzY29wZSIsImRhdGVzIiwiZmlyc3REYXRhU2VyaWVzIiwic2Vjb25kRGF0YVNlcmllcyIsImlzRHVyYXRpb25HcmFwaCIsIm1pbmltdW1ZYXhpcyIsIndpZHRoIiwiaGVpZ2h0IiwidGVtcGxhdGUiLCJsaW5rIiwiZWxlbWVudCIsImF0dHJzIiwiJHdhdGNoIiwic3ZnIiwiZmluZCIsInNlbGVjdCIsInNlbGVjdEFsbCIsInJlbW92ZSIsInRvcE1hcmdpbiIsImJvdHRvbU1hcmdpbiIsImxlZnRNYXJnaW4iLCJjbGllbnRXaWR0aCIsImNsaWVudEhlaWdodCIsImJveCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsInJpZ2h0IiwibGVmdCIsImJvdHRvbSIsInRvcCIsImZpcnN0U2VyaWVzIiwic2Vjb25kU2VyaWVzIiwic2NhbGVMaW5lYXIiLCJkb21haW4iLCJyYW5nZSIsImlzTmFOIiwiTnVtYmVyIiwibWF4IiwieUF4aXMiLCJheGlzTGVmdCIsInRpY2tWYWx1ZXMiLCJ0aWNrRm9ybWF0IiwidiIsImZvcm1hdHRlZFRpbWUiLCJmb3JtYXRUaW1lIiwidW5pdCIsImNhbGwiLCJnIiwiZHJhd1NlcmllcyIsImxpbmVDb2xvciIsImRyYXdBdmVyYWdlIiwiZmlyc3RTZXJpZXNDb2xvciIsImZpcnN0U2VyaWVzRmlsbENvbG9yIiwic2Vjb25kU2VyaWVzQ29sb3IiLCJzZWNvbmRTZXJpZXNGaWxsQ29sb3IiXSwibWFwcGluZ3MiOiI7O0FBQUMsV0FBU0EsTUFBVCxFQUFpQkMsT0FBakIsRUFBMEI7QUFDdkI7O0FBRUEsYUFBU0MsY0FBVCxDQUF3QkMsS0FBeEIsRUFBK0JDLElBQS9CLEVBQXFDQyxLQUFyQyxFQUE0Q0MsU0FBNUMsRUFBdURDLE1BQXZELEVBQStEQyxNQUEvRCxFQUF1RTs7QUFFbkUsWUFBSUMsT0FBT0MsR0FBR0QsSUFBSCxHQUNORSxDQURNLENBQ0osVUFBVUMsQ0FBVixFQUFhQyxDQUFiLEVBQWdCO0FBQUUsbUJBQU9OLE9BQU9NLENBQVAsQ0FBUDtBQUFrQixTQURoQyxFQUVOQyxDQUZNLENBRUosVUFBVUYsQ0FBVixFQUFnQjtBQUFFLG1CQUFPSixPQUFPSSxDQUFQLENBQVA7QUFBbUIsU0FGakMsRUFHTkcsRUFITSxDQUdILFlBQWU7QUFBRSxtQkFBT1AsT0FBTyxDQUFQLENBQVA7QUFBbUIsU0FIakMsRUFJTlEsS0FKTSxDQUlBTixHQUFHTyxXQUpILENBQVg7O0FBTUEsWUFBSUMsT0FBT1IsR0FBR1EsSUFBSCxHQUNOUCxDQURNLENBQ0osVUFBVUMsQ0FBVixFQUFhQyxDQUFiLEVBQWdCO0FBQUUsbUJBQU9OLE9BQU9NLENBQVAsQ0FBUDtBQUFrQixTQURoQyxFQUVOQyxDQUZNLENBRUosVUFBVUYsQ0FBVixFQUFhQyxDQUFiLEVBQWdCO0FBQUUsbUJBQU9MLE9BQU9JLENBQVAsQ0FBUDtBQUFrQixTQUZoQyxFQUdOSSxLQUhNLENBR0FOLEdBQUdPLFdBSEgsQ0FBWDs7QUFLQSxZQUFJRSxRQUFRaEIsTUFBTWlC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d0JBQUlnRixjQUFjLFNBQWRBLFdBQWMsQ0FBU3BGLElBQVQsRUFBZW1GLFNBQWYsRUFBMEJqRixTQUExQixFQUFxQztBQUNuRGtCLHdDQUFnQnJCLEtBQWhCLEVBQXVCQyxJQUF2QixFQUE2Qm1GLFNBQTdCLEVBQXdDakYsU0FBeEMsRUFBbURDLE1BQW5ELEVBQTJEQyxNQUEzRDtBQUNILHFCQUZEOztBQUlBOEUsK0JBQVdsQixXQUFYLEVBQXdCbEIsTUFBTXVDLGdCQUE5QixFQUFnRHZDLE1BQU13QyxvQkFBdEQ7O0FBRUEsd0JBQUlyQixZQUFKLEVBQWtCO0FBQ2RpQixtQ0FBV2pCLFlBQVgsRUFBeUJuQixNQUFNeUMsaUJBQS9CLEVBQWlEekMsTUFBTTBDLHFCQUF2RDtBQUNIOztBQUVESixnQ0FBWXBCLFdBQVosRUFBeUJsQixNQUFNdUMsZ0JBQS9CLEVBQWlEdkMsTUFBTXdDLG9CQUF2RDs7QUFFQSx3QkFBSXJCLFlBQUosRUFBa0I7QUFDZG1CLG9DQUFZbkIsWUFBWixFQUEwQm5CLE1BQU15QyxpQkFBaEMsRUFBbUR6QyxNQUFNMEMscUJBQXpEO0FBQ0g7QUFDSixpQkEzRkQ7QUE0Rkg7QUF6R0UsU0FBUDtBQTJHSCxLQTlHVDtBQWdISCxDQXJMQSxFQXFMQzVGLE1BckxELEVBcUxTQSxPQUFPQyxPQXJMaEIsQ0FBRCIsImZpbGUiOiIxNy5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbih3aW5kb3csIGFuZ3VsYXIpIHtcclxuICAgICd1c2Ugc3RyaWN0JztcclxuXHJcbiAgICBmdW5jdGlvbiBkcmF3RGF0YVNlcmllcyhjaGFydCwgZGF0YSwgY29sb3IsIGZpbGxDb2xvciwgc2NhbGVYLCBzY2FsZVkpIHtcclxuXHJcbiAgICAgICAgdmFyIGFyZWEgPSBkMy5hcmVhKClcclxuICAgICAgICAgICAgLngoZnVuY3Rpb24gKGQsIGkpIHsgcmV0dXJuIHNjYWxlWChpKTt9KVxyXG4gICAgICAgICAgICAueShmdW5jdGlvbiAoZCkgICAgeyByZXR1cm4gc2NhbGVZKGQpOyB9KVxyXG4gICAgICAgICAgICAueTEoZnVuY3Rpb24gKCkgICAgeyByZXR1cm4gc2NhbGVZKDApOyB9KVxyXG4gICAgICAgICAgICAuY3VydmUoZDMuY3VydmVMaW5lYXIpO1xyXG5cclxuICAgICAgICB2YXIgbGluZSA9IGQzLmxpbmUoKVxyXG4gICAgICAgICAgICAueChmdW5jdGlvbiAoZCwgaSkgeyByZXR1cm4gc2NhbGVYKGkpO30pXHJcbiAgICAgICAgICAgIC55KGZ1bmN0aW9uIChkLCBpKSB7IHJldHVybiBzY2FsZVkoZCk7fSlcclxuICAgICAgICAgICAgLmN1cnZlKGQzLmN1cnZlTGluZWFyKTtcclxuXHJcbiAgICAgICAgdmFyIGdyb3VwID0gY2hhcnQuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnZGF0YVNlcmllcycpO1xyXG5cclxuICAgICAgICBncm91cC5hcHBlbmQoJ3BhdGgnKVxyXG4gICAgICAgICAgICAuZGF0dW0oZGF0YS5wb2ludHMpXHJcbiAgICAgICAgICAgIC5hdHRyKCdkJywgYXJlYSlcclxuICAgICAgICAgICAgLmF0dHIoJ2ZpbGwnLCBmaWxsQ29sb3IpXHJcbiAgICAgICAgICAgIC5hdHRyKCdvcGFjaXR5JywgMC44KVxyXG4gICAgICAgICAgICAuYXR0cignc3Ryb2tlJywgZmlsbENvbG9yKTtcclxuXHJcbiAgICAgICAgZ3JvdXAuYXBwZW5kKCdwYXRoJylcclxuICAgICAgICAgICAgLmRhdHVtKGRhdGEucG9pbnRzKVxyXG4gICAgICAgICAgICAuYXR0cignZCcsIGxpbmUpXHJcbiAgICAgICAgICAgIC5hdHRyKCdzdHJva2UnLCBjb2xvcilcclxuICAgICAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIDIuNzUpXHJcbiAgICAgICAgICAgIC5hdHRyKCdmaWxsJywgJ25vbmUnKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBkcmF3QXZlcmFnZUxpbmUoY2hhcnQsIGRhdGEsIGNvbG9yLCBmaWxsQ29sb3IsIHNjYWxlWCwgc2NhbGVZKSB7XHJcblxyXG4gICAgICAgIHZhciBsaW5lID0gZDMubGluZSgpXHJcbiAgICAgICAgICAgIC54KGZ1bmN0aW9uIChkLCBpKSB7IHJldHVybiBzY2FsZVgoaSk7IH0pXHJcbiAgICAgICAgICAgIC55KGZ1bmN0aW9uIChkLCBpKSB7IHJldHVybiBzY2FsZVkoZCk7IH0pXHJcbiAgICAgICAgICAgIC5jdXJ2ZShkMy5jdXJ2ZUxpbmVhcik7XHJcblxyXG4gICAgICAgIHZhciBncm91cCA9IGNoYXJ0LmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2RhdGFBdmVyYWdlJyk7XHJcblxyXG4gICAgICAgIGdyb3VwLmFwcGVuZCgncGF0aCcpXHJcbiAgICAgICAgICAgIC5kYXR1bShBcnJheShkYXRhLnBvaW50cy5sZW5ndGgpLmZpbGwoZGF0YS5hdmVyYWdlKSlcclxuICAgICAgICAgICAgLmF0dHIoJ2QnLCBsaW5lKVxyXG4gICAgICAgICAgICAuYXR0cignc3Ryb2tlJywgY29sb3IpXHJcbiAgICAgICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCAxLjUpXHJcbiAgICAgICAgICAgIC5hdHRyKCdvcGFjaXR5JywgMC41KVxyXG4gICAgICAgICAgICAuYXR0cignc3Ryb2tlLWRhc2hhcnJheScsICcxMCwxMCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHBhZFRvV2hvbGVWYWx1ZSh2YWx1ZSkge1xyXG4gICAgICAgIHZhciBlbXB0eURhdGFTZXR5QXhpc01heCA9IDEwO1xyXG5cclxuICAgICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlbXB0eURhdGFTZXR5QXhpc01heDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciB1cHBlckJvdW5kID0gMTA7XHJcblxyXG4gICAgICAgIHdoaWxlICh2YWx1ZSA+IHVwcGVyQm91bmQpIHtcclxuICAgICAgICAgICAgdXBwZXJCb3VuZCAqPSAxMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHVwcGVyQm91bmQgLz0gMTA7XHJcblxyXG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKHZhbHVlIC8gdXBwZXJCb3VuZCkgKiB1cHBlckJvdW5kICsgdXBwZXJCb3VuZDtcclxuICAgIH1cclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZSgndWkucGFydGljdWxhci5sYXJnZUdyYXBoJywgW10pXHJcbiAgICAgICAgLmRpcmVjdGl2ZSgnbGFyZ2VHcmFwaCcsXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uKGZvcm1hdHRlcikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN0cmljdDogJ0UnLFxyXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlOiB7ICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVzOiAnPXhheGlzUG9pbnRzJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3REYXRhU2VyaWVzOiAnPWZpcnN0RGF0YVNlcmllcycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZERhdGFTZXJpZXM6ICc9c2Vjb25kRGF0YVNlcmllcycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzRHVyYXRpb25HcmFwaDogJz1pc0R1cmF0aW9uR3JhcGgnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtWWF4aXM6ICdAJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6ICc9cGxvdFdpZHRoJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAnPXBsb3RIZWlnaHQnXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogJzxzdmc+PC9zdmc+JyxcclxuICAgICAgICAgICAgICAgICAgICBsaW5rOiBmdW5jdGlvbiBsaW5rKHNjb3BlLCBlbGVtZW50LCBhdHRycykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzY29wZS4kd2F0Y2goJ2ZpcnN0RGF0YVNlcmllcycsIGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ZnID0gZWxlbWVudC5maW5kKCdzdmcnKVswXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMy5zZWxlY3Qoc3ZnKS5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9wTWFyZ2luID0gMTA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYm90dG9tTWFyZ2luID0gNTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsZWZ0TWFyZ2luID0gNjA7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoYXJ0ID0gZDMuc2VsZWN0KHN2ZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCBzY29wZS53aWR0aClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0Jywgc2NvcGUuaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSBzdmcuY2xpZW50V2lkdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0ID0gc3ZnLmNsaWVudEhlaWdodDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0hJTlQ6IFRoaXMgaXMgd29ya2Fyb3VuZCBmb3IgRmlyZWZveFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpZHRoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJveCA9IHN2Zy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBib3gucmlnaHQgLSBib3gubGVmdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSBib3guYm90dG9tIC0gYm94LnRvcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3RTZXJpZXMgPSBzY29wZS5maXJzdERhdGFTZXJpZXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2Vjb25kU2VyaWVzID0gc2NvcGUuc2Vjb25kRGF0YVNlcmllcztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2NhbGVYID0gZDMuc2NhbGVMaW5lYXIoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kb21haW4oWzAsIGZpcnN0U2VyaWVzLnBvaW50cy5sZW5ndGggLSAxXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmFuZ2UoW2xlZnRNYXJnaW4sIHdpZHRoXSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnQuYXBwZW5kKCdyZWN0JylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCB3aWR0aCAtIGxlZnRNYXJnaW4pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIGhlaWdodCAtIHRvcE1hcmdpbiAtIGJvdHRvbU1hcmdpbilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgbGVmdE1hcmdpbiArICcsJyArIHRvcE1hcmdpbiArICcpJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignZmlsbCcsICcjRjJGNkY3Jyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1pbmltdW1ZYXhpcyA9ICFpc05hTihzY29wZS5taW5pbXVtWWF4aXMpID8gTnVtYmVyKHNjb3BlLm1pbmltdW1ZYXhpcykgOiAxMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXggPSBNYXRoLm1heChmaXJzdFNlcmllcy5hdmVyYWdlLCBkMy5tYXgoZmlyc3RTZXJpZXMucG9pbnRzKSwgbWluaW11bVlheGlzKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vjb25kU2VyaWVzICYmIHNlY29uZFNlcmllcy5wb2ludHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgc2Vjb25kU2VyaWVzLmF2ZXJhZ2UsIGQzLm1heChzZWNvbmRTZXJpZXMucG9pbnRzKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1heCA9IHBhZFRvV2hvbGVWYWx1ZShtYXgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzY2FsZVkgPSBkMy5zY2FsZUxpbmVhcigpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRvbWFpbihbMCwgbWF4XSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmFuZ2UoW2hlaWdodCAtIGJvdHRvbU1hcmdpbiwgdG9wTWFyZ2luXSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHlBeGlzID0gZDMuYXhpc0xlZnQoc2NhbGVZKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGlja1ZhbHVlcyhbMCwgbWF4ICogMS80LCBtYXggKiAxLzIsIG1heCAqIDMvNCwgbWF4XSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmlzRHVyYXRpb25HcmFwaCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlBeGlzID0geUF4aXMudGlja0Zvcm1hdChmdW5jdGlvbiAodikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybWF0dGVkVGltZSA9IGZvcm1hdHRlci5mb3JtYXRUaW1lKHYpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvcm1hdHRlZFRpbWUudmFsdWUgKyAnICAnICsgZm9ybWF0dGVkVGltZS51bml0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0LmFwcGVuZCgnZycpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ3kgYXhpcycpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyArIGxlZnRNYXJnaW4gKyAnLCAwKScpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhbGwoZnVuY3Rpb24gKGcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5jYWxsKHlBeGlzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5zZWxlY3QoJy5kb21haW4nKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5zZWxlY3RBbGwoJy50aWNrIGxpbmUnKS5hdHRyKCdzdHJva2UnLCAnYmxhY2snKS5hdHRyKCdzdHJva2Utd2lkdGgnLCAnMS43NScpLmF0dHIoJ29wYWNpdHknLCAwLjEpLmF0dHIoJ3gnLCAwKS5hdHRyKCd4MicsIHdpZHRoIC0gbGVmdE1hcmdpbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuc2VsZWN0QWxsKCcudGljayB0ZXh0JykuYXR0cigneCcsIC00KS5hdHRyKCdmaWxsJywgJyM4MjgyODInKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHJhd1NlcmllcyA9IGZ1bmN0aW9uKGRhdGEsIGxpbmVDb2xvciwgZmlsbENvbG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0RhdGFTZXJpZXMoY2hhcnQsIGRhdGEsIGxpbmVDb2xvciwgZmlsbENvbG9yLCBzY2FsZVgsIHNjYWxlWSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRyYXdBdmVyYWdlID0gZnVuY3Rpb24oZGF0YSwgbGluZUNvbG9yLCBmaWxsQ29sb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3QXZlcmFnZUxpbmUoY2hhcnQsIGRhdGEsIGxpbmVDb2xvciwgZmlsbENvbG9yLCBzY2FsZVgsIHNjYWxlWSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd1NlcmllcyhmaXJzdFNlcmllcywgYXR0cnMuZmlyc3RTZXJpZXNDb2xvciwgYXR0cnMuZmlyc3RTZXJpZXNGaWxsQ29sb3IpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWNvbmRTZXJpZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3U2VyaWVzKHNlY29uZFNlcmllcywgYXR0cnMuc2Vjb25kU2VyaWVzQ29sb3IsYXR0cnMuc2Vjb25kU2VyaWVzRmlsbENvbG9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3QXZlcmFnZShmaXJzdFNlcmllcywgYXR0cnMuZmlyc3RTZXJpZXNDb2xvciwgYXR0cnMuZmlyc3RTZXJpZXNGaWxsQ29sb3IgKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vjb25kU2VyaWVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0F2ZXJhZ2Uoc2Vjb25kU2VyaWVzLCBhdHRycy5zZWNvbmRTZXJpZXNDb2xvciwgYXR0cnMuc2Vjb25kU2VyaWVzRmlsbENvbG9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG59KHdpbmRvdywgd2luZG93LmFuZ3VsYXIpKTtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vYXBwL21vZHVsZXMvbW9uaXRvcmluZy9qcy9kaXJlY3RpdmVzL3VpLnBhcnRpY3VsYXIubGFyZ2VHcmFwaC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///17\n"); - -/***/ }) -/******/ ]); \ No newline at end of file diff --git a/src/ServicePulse.Host/app/modules/monitoring/js/directives/ui.particular.monitoringConnectivityStatus.js b/src/ServicePulse.Host/app/modules/monitoring/js/directives/ui.particular.monitoringConnectivityStatus.js index 3346142cf..21c6291e9 100644 --- a/src/ServicePulse.Host/app/modules/monitoring/js/directives/ui.particular.monitoringConnectivityStatus.js +++ b/src/ServicePulse.Host/app/modules/monitoring/js/directives/ui.particular.monitoringConnectivityStatus.js @@ -3,20 +3,35 @@ 'use strict'; - function controller($scope, connectivityNotifier, monitoringService, $interval) { - $scope.isSCMonitoringConnecting = true; + function controller($scope, connectivityNotifier, monitoringService, $interval, connectionsManager) { + $scope.isSCMonitoringConnecting = connectionsManager.getIsMonitoringEnabled() + + if ($scope.isSCMonitoringConnecting) { + connectivityNotifier.reportConnecting(); + } + + $scope.monitoringUrl = connectionsManager.getMonitoringUrl(); connectivityNotifier.getConnectionStatusSource().subscribe(value => { - $scope.isSCMonitoringConnected = value; - $scope.isSCMonitoringConnecting = false; + $scope.isSCMonitoringConnected = value.isConnected; + $scope.isSCMonitoringConnecting = value.isConnecting; }); + var lastReport = undefined; var scMonitoringConnectionPing = $interval(function () { - var promises = monitoringService.getMonitoredEndpoints().map((request, index) => { - request.then(r => { - connectivityNotifier.reportSuccessfulConnection(index); - }, e => { - connectivityNotifier.reportFailedConnection(index); - }); + var promise = monitoringService.getMonitoredEndpoints().then(r => { + if (lastReport === 'success') { + return; + } + + connectivityNotifier.reportSuccessfulConnection(); + lastReport = 'success'; + }, e => { + if (lastReport === 'failed') { + return; + } + + connectivityNotifier.reportFailedConnection(); + lastReport = 'failed'; }); }, 10000); @@ -33,7 +48,7 @@ - controller.$inject = ['$scope', 'connectivityNotifier', 'monitoringService', '$interval']; + controller.$inject = ['$scope', 'connectivityNotifier', 'monitoringService', '$interval', 'connectionsManager']; function directive() { return { diff --git a/src/ServicePulse.Host/app/modules/monitoring/js/directives/ui.particular.monitoringConnectivityStatus.tpl.html b/src/ServicePulse.Host/app/modules/monitoring/js/directives/ui.particular.monitoringConnectivityStatus.tpl.html index b9256ac10..8a7836166 100644 --- a/src/ServicePulse.Host/app/modules/monitoring/js/directives/ui.particular.monitoringConnectivityStatus.tpl.html +++ b/src/ServicePulse.Host/app/modules/monitoring/js/directives/ui.particular.monitoringConnectivityStatus.tpl.html @@ -1,4 +1,4 @@ - + SC Monitoring:
    Connected diff --git a/src/ServicePulse.Host/app/modules/monitoring/js/endpoint_details.controller.js b/src/ServicePulse.Host/app/modules/monitoring/js/endpoint_details.controller.js index 5109a99de..a475df4bf 100644 --- a/src/ServicePulse.Host/app/modules/monitoring/js/endpoint_details.controller.js +++ b/src/ServicePulse.Host/app/modules/monitoring/js/endpoint_details.controller.js @@ -18,7 +18,6 @@ ) { $scope.endpointName = $routeParams.endpointName; - $scope.sourceIndex = $routeParams.sourceIndex; $scope.showInstancesBreakdown = $routeParams.tab === 'instancesBreakdown'; $scope.loading = true; $scope.loadedSuccessfully = false; @@ -50,7 +49,7 @@ var breakdownTabName = showInstacesBreakdown ? 'instancesBreakdown' : 'messageTypeBreakdown'; - return `#/monitoring/endpoint/${$scope.endpointName}/${$scope.sourceIndex}?historyPeriod=${selectedPeriodValue}&tab=${breakdownTabName}&pageNo=${breakdownPageNo}`; + return `#/monitoring/endpoint/${$scope.endpointName}?historyPeriod=${selectedPeriodValue}&tab=${breakdownTabName}&pageNo=${breakdownPageNo}`; }; $scope.updateUrl = function () { @@ -101,12 +100,12 @@ var selectedPeriod = $scope.selectedPeriod; - subscription = monitoringService.createEndpointDetailsSource($routeParams.endpointName, $routeParams.sourceIndex, selectedPeriod.value, selectedPeriod.refreshInterval).subscribe(function (endpoint) { + subscription = monitoringService.createEndpointDetailsSource($routeParams.endpointName, selectedPeriod.value, selectedPeriod.refreshInterval).subscribe(function (endpoint) { $scope.loading = false; if (endpoint.error) { - connectivityNotifier.reportFailedConnection($routeParams.sourceIndex); + connectivityNotifier.reportFailedConnection(); if ($scope.endpoint && $scope.endpoint.instances) { $scope.endpoint.instances.forEach((item) => item.isScMonitoringDisconnected = true); } @@ -127,7 +126,7 @@ mergeIn($scope.endpoint, endpoint); } - connectivityNotifier.reportSuccessfulConnection($routeParams.sourceIndex); + connectivityNotifier.reportSuccessfulConnection(); $scope.endpoint.instances.sort(function (first, second) { if (first.id < second.id) { diff --git a/src/ServicePulse.Host/app/modules/monitoring/js/endpoint_details.route.js b/src/ServicePulse.Host/app/modules/monitoring/js/endpoint_details.route.js index 7c8ced8a4..e1cbc743c 100644 --- a/src/ServicePulse.Host/app/modules/monitoring/js/endpoint_details.route.js +++ b/src/ServicePulse.Host/app/modules/monitoring/js/endpoint_details.route.js @@ -4,7 +4,7 @@ function routeProvider($routeProvider) { let template = require('./../views/endpoint_details.html'); - $routeProvider.when('/monitoring/endpoint/:endpointName/:sourceIndex', { + $routeProvider.when('/monitoring/endpoint/:endpointName', { data: { pageTitle: 'Endpoint Details' }, diff --git a/src/ServicePulse.Host/app/modules/monitoring/js/monitored_endpoints.controller.js b/src/ServicePulse.Host/app/modules/monitoring/js/monitored_endpoints.controller.js index 145dd8629..fc2f75d0d 100644 --- a/src/ServicePulse.Host/app/modules/monitoring/js/monitored_endpoints.controller.js +++ b/src/ServicePulse.Host/app/modules/monitoring/js/monitored_endpoints.controller.js @@ -28,7 +28,7 @@ }; $scope.getDetailsUrl = endpoint => { - return '#/monitoring/endpoint/' + endpoint.name + '/' + (endpoint.sourceIndex | 0) + '?historyPeriod=' + $scope.selectedPeriod.value; + return '#/monitoring/endpoint/' + endpoint.name + '?historyPeriod=' + $scope.selectedPeriod.value; }; function fillDisplayValuesForEndpoint(endpoint) { @@ -69,14 +69,13 @@ } if (endpoint.error) { - connectivityNotifier.reportFailedConnection(endpoint.sourceIndex); + connectivityNotifier.reportFailedConnection(); if ($scope.endpoints) { - $scope.endpoints.filter((item) => item.sourceIndex === endpoint.sourceIndex) - .forEach((item) => item.isScMonitoringDisconnected = true); + $scope.endpoints.forEach((item) => item.isScMonitoringDisconnected = true); } } else { - connectivityNotifier.reportSuccessfulConnection(endpoint.sourceIndex); - var index = $scope.endpoints.findIndex(function(item) { return item.name === endpoint.name }); + connectivityNotifier.reportSuccessfulConnection(); + var index = $scope.endpoints.findIndex(function (item) { return item.name === endpoint.name; }); endpoint.isScMonitoringDisconnected = false; fillDisplayValuesForEndpoint(endpoint); diff --git a/src/ServicePulse.Host/app/modules/monitoring/js/services/services.connectivityNotifier.js b/src/ServicePulse.Host/app/modules/monitoring/js/services/services.connectivityNotifier.js index 6d35c1a25..b976adea2 100644 --- a/src/ServicePulse.Host/app/modules/monitoring/js/services/services.connectivityNotifier.js +++ b/src/ServicePulse.Host/app/modules/monitoring/js/services/services.connectivityNotifier.js @@ -2,45 +2,58 @@ (function (window, angular, $, undefined) { 'use strict'; - function Service(toastService, scConfig) { + function Service(toastService, connectionsManager, notifyService) { - var isConnectedToSourceIndex = Array(scConfig.monitoring_urls.length).fill(true); + var notifier = notifyService(); + var mu = connectionsManager.getMonitoringUrl(); + var isConnected = false; + var isConnecting = false; var connectivitySource = new Rx.Subject(); var shouldShowFailedMessage = true; - function reportFailedConnection(sourceIndex) { + function reportFailedConnection() { - if (isConnectedToSourceIndex[sourceIndex]) { - var message = 'Could not connect to the ServiceControl Monitoring service.'; - if (scConfig.monitoring_urls.length > 1) { - message = 'Could not connect to the ServiceControl Monitoring service at' + scConfig.monitoring_urls[sourceIndex] + '.'; - } + if (isConnected) { + var message = 'Could not connect to the ServiceControl Monitoring service at ' + mu + '. View connection settings'; console.log(message); if (shouldShowFailedMessage) { toastService.showError(message); shouldShowFailedMessage = false; } } - isConnectedToSourceIndex[sourceIndex] = false; - emitChange(isConnectedToSourceIndex); + isConnected = false; + isConnecting = false; + emitChange(); } - function reportSuccessfulConnection(sourceIndex) { - if (!isConnectedToSourceIndex[sourceIndex]) { - var message = 'Connection to ServiceControl Monitoring service was successful.'; - if (scConfig.monitoring_urls.length > 1) { - message = 'Connection to ServiceControl Monitoring service was successful ' + scConfig.monitoring_urls[sourceIndex] +'.'; - } + function reportSuccessfulConnection() { + if (!isConnected) { + var message = 'Connection to ServiceControl Monitoring service was successful ' + mu + '.'; console.log(message); shouldShowFailedMessage = true; } - isConnectedToSourceIndex[sourceIndex] = true; - emitChange(isConnectedToSourceIndex); + isConnected = true; + isConnecting = false; + emitChange(); + } + + function reportConnecting() { + isConnecting = true; + emitChange(); } - function emitChange(connectedToSourceIndex) { - var result = connectedToSourceIndex.every(item => item); + function emitChange() { + var result = { + isConnected: isConnected, + isConnecting: isConnecting + }; + connectivitySource.onNext(result); + + notifier.notify('MonitoringConnectionStatusChanged', { + isMonitoringConnected : isConnected, + isMonitoringConnecting : isConnecting + }); }; function getConnectionStatusSource() { @@ -48,6 +61,7 @@ } var service = { + reportConnecting: reportConnecting, reportFailedConnection: reportFailedConnection, reportSuccessfulConnection: reportSuccessfulConnection, getConnectionStatusSource: getConnectionStatusSource, @@ -57,8 +71,8 @@ return service; } - Service.$inject = ['toastService', 'scConfig']; + Service.$inject = ['toastService', 'connectionsManager', 'notifyService']; angular.module('services.connectivityNotifier', ['sc']) .service('connectivityNotifier', Service); -}(window, window.angular, window.jQuery)); \ No newline at end of file +}(window, window.angular, window.jQuery)); diff --git a/src/ServicePulse.Host/app/modules/monitoring/js/services/services.monitoring.js b/src/ServicePulse.Host/app/modules/monitoring/js/services/services.monitoring.js index 324510a6c..6369f3eb0 100644 --- a/src/ServicePulse.Host/app/modules/monitoring/js/services/services.monitoring.js +++ b/src/ServicePulse.Host/app/modules/monitoring/js/services/services.monitoring.js @@ -2,46 +2,34 @@ (function (window, angular, $, undefined) { 'use strict'; - function Service($http, rx, scConfig, uri, $q) { + function Service($http, rx, connectionsManager, uri, $q) { + + var mu = connectionsManager.getMonitoringUrl(); function createEndpointsSource(historyPeriod, refreshInterval) { return Rx.Observable.interval(refreshInterval).startWith(0) .flatMap(function (i) { - return Rx.Observable.fromArray(loadEndpointDataFromMonitoringService(historyPeriod)) - .flatMap(function (p) { - var o = Rx.Observable.fromPromise(p); - o = o.catch(Rx.Observable.empty()); - return o; - }); + return Rx.Observable.fromPromise(loadEndpointDataFromMonitoringService(historyPeriod)); }).selectMany(function (endpoints) { return endpoints; }); } function loadEndpointDataFromMonitoringService(historyPeriod) { - return scConfig.monitoring_urls.map(function (url) { - return $http.get(uri.join(url, 'monitored-endpoints') + '?history=' + historyPeriod) - .then(function (result) { - var sourceIndex = scConfig.monitoring_urls.indexOf(url); - - result.data.forEach(function (endpoint) { - endpoint.sourceIndex = sourceIndex; - }); - - return result.data.length !== 0 - ? result.data - : [{empty: true, sourceIndex: sourceIndex}]; - }, + return $http.get(uri.join(mu, 'monitored-endpoints') + '?history=' + historyPeriod) + .then(function (result) { + return result.data.length !== 0 + ? result.data + : [{ empty: true }]; + }, (error) => { - var sourceIndex = scConfig.monitoring_urls.indexOf(url); - return [{ error: error, sourceIndex: sourceIndex }]; - } - ); - }); + return [{ error: error }]; + } + ); } - function loadEndpointDetailsFromMonitoringService(endpointName, sourceIndex, historyPeriod) { - return $http.get(uri.join(scConfig.monitoring_urls[sourceIndex], 'monitored-endpoints', endpointName) + "?history=" + historyPeriod) + function loadEndpointDetailsFromMonitoringService(endpointName, historyPeriod) { + return $http.get(uri.join(mu, 'monitored-endpoints', endpointName) + "?history=" + historyPeriod) .then(function (result) { filterOutSystemMessage(result.data); return result.data; @@ -57,17 +45,15 @@ }); } - function createEndpointDetailsSource(endpointName, sourceIndex, historyPeriod, refreshInterval) { + function createEndpointDetailsSource(endpointName, historyPeriod, refreshInterval) { return Rx.Observable.interval(refreshInterval).startWith(0) .flatMap(function (i) { - return Rx.Observable.fromPromise(loadEndpointDetailsFromMonitoringService(endpointName, sourceIndex, historyPeriod)); + return Rx.Observable.fromPromise(loadEndpointDetailsFromMonitoringService(endpointName, historyPeriod)); }); } function getMonitoredEndpoints() { - return scConfig.monitoring_urls.map(function (url) { - return $http.get(uri.join(url, 'monitored-endpoints') + '?history=1'); - }); + return $http.get(uri.join(mu, 'monitored-endpoints') + '?history=1'); } var service = { @@ -79,7 +65,7 @@ return service; } - Service.$inject = ['$http', 'rx', 'scConfig', 'uri', '$q', 'toastService']; + Service.$inject = ['$http', 'rx', 'connectionsManager', 'uri', '$q', 'toastService']; angular.module('services.monitoringService', ['sc']) .service('monitoringService', Service); diff --git a/src/ServicePulse.Host/app/modules/monitoring/views/endpoint_details.html b/src/ServicePulse.Host/app/modules/monitoring/views/endpoint_details.html index c8ff06521..0e79603ee 100644 --- a/src/ServicePulse.Host/app/modules/monitoring/views/endpoint_details.html +++ b/src/ServicePulse.Host/app/modules/monitoring/views/endpoint_details.html @@ -22,7 +22,7 @@

    - + {{endpoint.errorCount | metricslargenumber}} @@ -275,7 +275,7 @@

    - + {{instance.errorCount | metricslargenumber}} diff --git a/src/ServicePulse.Host/app/modules/monitoring/views/monitoring_not_available.html b/src/ServicePulse.Host/app/modules/monitoring/views/monitoring_not_available.html index c13cbdf80..8c796a9c3 100644 --- a/src/ServicePulse.Host/app/modules/monitoring/views/monitoring_not_available.html +++ b/src/ServicePulse.Host/app/modules/monitoring/views/monitoring_not_available.html @@ -3,10 +3,10 @@

    Endpoint monitoring not available

    Monitoring is not available due to one or more of these reasons:

    • the monitoring server is not configured or is unavailable
    • -
    • the monitoring plugin is not installed on the endpoints to be monitored
    • +
    • no endpoints with monitoring plugin available yet
    • endpoints without the monitoring plugin do not have auditing enabled
    diff --git a/src/ServicePulse.Host/app/modules/shell/js/services/service.toast.js b/src/ServicePulse.Host/app/modules/shell/js/services/service.toast.js index e3fdfab05..e2c52fb41 100644 --- a/src/ServicePulse.Host/app/modules/shell/js/services/service.toast.js +++ b/src/ServicePulse.Host/app/modules/shell/js/services/service.toast.js @@ -4,33 +4,42 @@ function ToastService(toaster) { this.showToast = function(text, type, title, sticky) { sticky = sticky || false; + const toastId = Math.random(); + toaster.pop({ type: type || 'info', title: title, body: text, bodyOutputType: 'trustedHtml', timeout: sticky ? 0 : 5000, - showCloseButton: sticky + showCloseButton: sticky, + toastId }); + + return toastId; }; this.showInfo = function(text, title, sticky) { - this.showToast(text, 'info', title || 'Info', sticky); + return this.showToast(text, 'info', title || 'Info', sticky); }; this.showError = function(text, sticky) { if (sticky === undefined) { sticky = true; } - this.showToast(text, 'error', 'Error', sticky); + return this.showToast(text, 'error', 'Error', sticky); }; this.showWarning = function(text, sticky, showTitle = true) { if (sticky === undefined) { sticky = true; } - this.showToast(text, 'warning', showTitle ? 'Warning' : '', sticky); + return this.showToast(text, 'warning', showTitle ? 'Warning' : '', sticky); }; + + this.clear = function(toastInstance) { + toaster.clear('*', toastInstance); + } } ToastService.$inject = [ diff --git a/src/ServicePulse.Host/package.json b/src/ServicePulse.Host/package.json index 6059f09e2..3c6a59121 100644 --- a/src/ServicePulse.Host/package.json +++ b/src/ServicePulse.Host/package.json @@ -25,6 +25,7 @@ "rx": "^4.1.0", "signalr": "^2.2.1", "ui-select": "^0.18.1", + "url-search-params-polyfill": "^5.0.0", "zeroclipboard": "^2.2.0" }, "devDependencies": { @@ -38,6 +39,7 @@ "file-loader": "^1.1.6", "html-loader": "^0.5.1", "http-server": "^0.11.1", + "npm-run-all": "^4.1.5", "style-loader": "^0.19.1", "url-loader": "^0.6.2", "webpack": "^3.8.1" @@ -46,8 +48,9 @@ "test": "cd ../ServicePulse.Host.Tests && npm test", "load": "npm install && node ./node_modules/webpack/bin/webpack.js --config app/modules/modules.webpackconfig.builder.js", "setup": "npm install && node ./node_modules/webpack/bin/webpack.js --config app/modules/modules.webpackconfig.js", - "serve": "start http-server ./app", - "webpack": "node ./node_modules/webpack/bin/webpack.js --config app/modules/modules.webpackconfig.js" + "serve": "http-server ./app", + "webpack": "node ./node_modules/webpack/bin/webpack.js --config app/modules/modules.webpackconfig.js", + "dev": "npm-run-all -p serve webpack" }, "author": "Particular Software", "license": "RPL-1.5" diff --git a/src/Setup/ServicePulse.aip b/src/Setup/ServicePulse.aip index b4c370dc5..73bb5129d 100644 --- a/src/Setup/ServicePulse.aip +++ b/src/Setup/ServicePulse.aip @@ -211,22 +211,21 @@ - + - - + + - - - - - - - - - + + + + + + + +