http://git-wip-us.apache.org/repos/asf/metron/blob/8bf3b6ec/metron-interface/metron-alerts/cypress/integration/pcap/pcap.spec.js
----------------------------------------------------------------------
diff --git 
a/metron-interface/metron-alerts/cypress/integration/pcap/pcap.spec.js 
b/metron-interface/metron-alerts/cypress/integration/pcap/pcap.spec.js
new file mode 100644
index 0000000..58f7d26
--- /dev/null
+++ b/metron-interface/metron-alerts/cypress/integration/pcap/pcap.spec.js
@@ -0,0 +1,228 @@
+/// <reference types="Cypress" />
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+context('PCAP Tab', () => {
+
+  beforeEach(() => {
+    cy.server();
+    cy.route({
+      method: 'GET',
+      url: '/api/v1/user',
+      response: 'user'
+    });
+
+    cy.route('GET', 'config', 'fixture:config.json');
+    cy.route('POST', 'search', 'fixture:search.json');
+
+    cy.route({
+      method: 'GET',
+      url: '/api/v1/pcap?state=*',
+      response: []
+    }).as('runningJobs');
+    
+    cy.visit('http://localhost:4200/login');
+    cy.get('[name="user"]').type('user');
+    cy.get('[name="password"]').type('password');
+    cy.contains('LOG IN').click();
+  });
+
+  afterEach(() => {
+    cy.get('.logout-link').click();
+  });
+
+  it('checking running jobs on navigating to PCAP tab', () => {
+    cy.contains('PCAP').click();
+    cy.wait('@runningJobs').its('url').should('include', '?state=RUNNING');
+  });
+
+  it('submitting PCAP job request', () => {
+    cy.contains('PCAP').click();
+    cy.route('POST', '/api/v1/pcap/fixed', 'fixture:pcap.status-00.json')
+      .as('postingPcapJob');
+
+    cy.get('[data-qe-id="ip-src-addr"]').type('222.123.111.000');
+    cy.get('[data-qe-id="ip-dst-addr"]').type('111.123.222.000');
+    cy.get('[data-qe-id="ip-src-port"]').type('3333');
+    cy.get('[data-qe-id="ip-dst-port"]').type('7777');
+    cy.get('[data-qe-id="protocol"]').type('24');
+    cy.get('[data-qe-id="include-reverse"]').check();
+    cy.get('[data-qe-id="packet-filter"]').type('filter');
+    
+    cy.get('[data-qe-id="submit-button"]').click();
+
+    cy.wait('@postingPcapJob').then((xhr) => {
+      expect(xhr.request.body.ipSrcAddr).to.equal('222.123.111.000');
+      expect(xhr.request.body.ipDstAddr).to.equal('111.123.222.000');
+      expect(xhr.request.body.ipSrcPort).to.equal('3333');
+      expect(xhr.request.body.ipDstPort).to.equal('7777');
+      expect(xhr.request.body.protocol).to.equal('24');
+      expect(xhr.request.body.includeReverse).to.equal(true);
+      expect(xhr.request.body.packetFilter).to.equal('filter');
+    });
+  });
+
+  it('requesting job status', () => {
+    cy.route('POST', '/api/v1/pcap/fixed', 'fixture:pcap.status-00.json');
+    cy.route('GET', '/api/v1/pcap/*', 
'fixture:pcap.status-01.json').as('jobStatusCheck');
+
+    cy.contains('PCAP').click();
+    cy.get('[data-qe-id="submit-button"]').click();
+    
+    cy.wait('@jobStatusCheck').its('url').should('include', 
'/api/v1/pcap/job_1537878471649_0001');
+  });
+
+  it('process status in percentage', () => {
+    cy.route('POST', '/api/v1/pcap/fixed', 'fixture:pcap.status-00.json');
+    cy.route('GET', '/api/v1/pcap/*', 
'fixture:pcap.status-01.json').as('jobStatusCheck');
+
+    cy.contains('PCAP').click();
+    cy.get('[data-qe-id="submit-button"]').click();
+    
+    cy.wait('@jobStatusCheck');
+
+    cy.contains('75%').should('be.visible');
+  });
+
+  it('getting pcap json', () => {
+    cy.route('POST', '/api/v1/pcap/fixed', 'fixture:pcap.status-00.json');
+    cy.route('GET', '/api/v1/pcap/*', 
'fixture:pcap.status-02.json').as('statusCheck');
+    cy.route('GET', '/api/v1/pcap/*/pdml*', 
'fixture:pcap.page-01.json').as('gettingPdml');
+
+    cy.contains('PCAP').click();
+    cy.get('[data-qe-id="submit-button"]').click();
+    
+    cy.wait('@statusCheck');
+
+    cy.wait('@gettingPdml').its('url').should('include', 
'/api/v1/pcap/job_1537878471649_0001/pdml?page=1');
+  });
+
+
+  it('rendering pcap table', () => {
+    cy.route('POST', '/api/v1/pcap/fixed', 'fixture:pcap.status-00.json');
+    cy.route('GET', '/api/v1/pcap/*', 
'fixture:pcap.status-02.json').as('statusCheck');
+    cy.route('GET', '/api/v1/pcap/*/pdml*', 
'fixture:pcap.page-01.json').as('gettingPdml');
+
+    cy.contains('PCAP').click();
+    cy.get('[data-qe-id="submit-button"]').click();
+    
+    cy.wait('@statusCheck');
+
+    cy.wait('@gettingPdml');
+
+    cy.get('app-pcap-list table').should('be.visible');
+    cy.get(':nth-child(3) > .timestamp').should('contain', 
'1458240269.414664000 Mar 17, 2016 18:44:29.414664000 UTC');
+  });
+
+  it('showing pcap details', () => {
+    cy.route('POST', '/api/v1/pcap/fixed', 'fixture:pcap.status-00.json');
+    cy.route('GET', '/api/v1/pcap/*', 
'fixture:pcap.status-02.json').as('statusCheck');
+    cy.route('GET', '/api/v1/pcap/*/pdml*', 
'fixture:pcap.page-01.json').as('gettingPdml');
+
+    cy.contains('PCAP').click();
+    cy.get('[data-qe-id="submit-button"]').click();
+    
+    cy.wait('@statusCheck');
+    cy.wait('@gettingPdml');
+
+    cy.get('app-pcap-list table').should('be.visible');
+    cy.contains('General information').should('not.be.visible');
+
+    cy.get(':nth-child(3) > .timestamp').click();
+    
+    cy.contains('General information').should('be.visible');
+    cy.get('[data-qe-id="proto"]').should('have.length', 6);
+  });
+
+  it('navigating accross pages', () => {
+    cy.route('POST', '/api/v1/pcap/fixed', 'fixture:pcap.status-00.json');
+    cy.route('GET', '/api/v1/pcap/*', 
'fixture:pcap.status-02.json').as('statusCheck');
+    cy.route('GET', '/api/v1/pcap/*/pdml*', 
'fixture:pcap.page-01.json').as('gettingPdml');
+
+    cy.contains('PCAP').click();
+    cy.get('[data-qe-id="submit-button"]').click();
+    
+    cy.wait('@statusCheck');
+    cy.wait('@gettingPdml');
+
+    cy.contains('Page 1 of 2').should('be.visible');
+    
+    cy.get('.fa-chevron-right').click();
+
+    cy.wait('@gettingPdml').its('url').should('include', '?page=2');
+  });
+
+  it('downloading pdml', () => {
+    cy.route('POST', '/api/v1/pcap/fixed', 'fixture:pcap.status-00.json');
+    cy.route('GET', '/api/v1/pcap/*', 
'fixture:pcap.status-02.json').as('statusCheck');
+    cy.route('GET', '/api/v1/pcap/*/pdml*', 
'fixture:pcap.page-01.json').as('gettingPdml');
+    // cy.route('GET', '/api/v1/pcap/*/pdml*').as('download');
+
+    cy.contains('PCAP').click();
+    cy.get('[data-qe-id="submit-button"]').click();
+    
+    cy.wait('@statusCheck');
+    cy.wait('@gettingPdml');
+
+    cy.contains('Download').should('be.visible');
+    
cy.get('[href="/api/v1/pcap/job_1537878471649_0001/raw?page=1"]').should('be.visible');
+
+    cy.get('.fa-chevron-right').click();
+
+    
cy.get('[href="/api/v1/pcap/job_1537878471649_0001/raw?page=2"]').should('be.visible');
+  });
+
+
+  it('cancelling (kill) pcap query job', () => {
+    cy.route('POST', '/api/v1/pcap/fixed', 'fixture:pcap.status-00.json');
+    cy.route('GET', '/api/v1/pcap/*', 
'fixture:pcap.status-01.json').as('jobStatusCheck');
+    cy.route('DELETE', '/api/v1/pcap/kill/*', 
'fixture:pcap.status-02.json').as('killJob');
+
+    cy.contains('PCAP').click();
+    cy.get('[data-qe-id="submit-button"]').click();
+    
+    cy.wait('@jobStatusCheck');
+
+    cy.get('[data-qe-id="pcap-cancel-query-button"]').click();
+    cy.contains('Yes').click();
+
+    cy.wait('@killJob').its('url').should('include', 
'/api/v1/pcap/kill/job_1537878471649_0001');
+  });
+
+  it('showing filter validation messages', () => {
+    cy.contains('PCAP').click();
+
+    cy.get('[data-qe-id="ip-src-addr"]').type('aaa.bbb.111.000');
+    cy.get('[data-qe-id="ip-dst-addr"]').type('ccc.ddd.222.000');
+    cy.get('[data-qe-id="ip-src-port"]').type('99999');
+    cy.get('[data-qe-id="ip-dst-port"]').type('aaaa');
+    
+    cy.get('.pcap-search-validation-errors').should('be.visible');
+    cy.get('.pcap-search-validation-errors li').should('have.length', 4);
+  });
+
+  it('showing date validation messages', () => {
+    cy.contains('PCAP').click();
+
+    cy.get('[data-qe-id="end-time"]').click();
+    cy.get('.pika-select-year').select('2015');
+    cy.get('[data-day="11"] > .pika-button').click();
+    
+    cy.get('.pcap-search-validation-errors').should('be.visible');
+    cy.get('.pcap-search-validation-errors li').should('have.length', 1);
+  });
+})

http://git-wip-us.apache.org/repos/asf/metron/blob/8bf3b6ec/metron-interface/metron-alerts/package-lock.json
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/package-lock.json 
b/metron-interface/metron-alerts/package-lock.json
index bb2512e..b912b52 100644
--- a/metron-interface/metron-alerts/package-lock.json
+++ b/metron-interface/metron-alerts/package-lock.json
@@ -3541,6 +3541,45 @@
         }
       }
     },
+    "@cypress/listr-verbose-renderer": {
+      "version": "0.4.1",
+      "resolved": 
"https://registry.npmjs.org/@cypress/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz";,
+      "integrity": "sha1-p3SS9LEdzHxEajSz4ochr9M8ZCo=",
+      "dev": true,
+      "requires": {
+        "chalk": "^1.1.3",
+        "cli-cursor": "^1.0.2",
+        "date-fns": "^1.27.2",
+        "figures": "^1.7.0"
+      }
+    },
+    "@cypress/xvfb": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.3.tgz";,
+      "integrity": 
"sha512-yYrK+/bgL3hwoRHMZG4r5fyLniCy1pXex5fimtewAY6vE/jsVs8Q37UsEO03tFlcmiLnQ3rBNMaZBYTi/+C1cw==",
+      "dev": true,
+      "requires": {
+        "debug": "^3.1.0",
+        "lodash.once": "^4.1.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.5",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz";,
+          "integrity": 
"sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz";,
+          "integrity": 
"sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+          "dev": true
+        }
+      }
+    },
     "@ngtools/webpack": {
       "version": "6.0.8",
       "resolved": 
"https://registry.npmjs.org/@ngtools/webpack/-/webpack-6.0.8.tgz";,
@@ -5431,6 +5470,18 @@
       "integrity": "sha1-1YSBOWBgdUDdsgLeiz4ilQTUXP8=",
       "dev": true
     },
+    "@types/blob-util": {
+      "version": "1.3.3",
+      "resolved": 
"https://registry.npmjs.org/@types/blob-util/-/blob-util-1.3.3.tgz";,
+      "integrity": 
"sha512-4ahcL/QDnpjWA2Qs16ZMQif7HjGP2cw3AGjHabybjw7Vm1EKu+cfQN1D78BaZbS1WJNa1opSMF5HNMztx7lR0w==",
+      "dev": true
+    },
+    "@types/bluebird": {
+      "version": "3.5.18",
+      "resolved": 
"https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.18.tgz";,
+      "integrity": 
"sha512-OTPWHmsyW18BhrnG5x8F7PzeZ2nFxmHGb42bZn79P9hl+GI5cMzyPgQTwNjbem0lJhoru/8vtjAFCUOu3+gE2w==",
+      "dev": true
+    },
     "@types/bootstrap": {
       "version": "4.1.2",
       "resolved": 
"https://registry.npmjs.org/@types/bootstrap/-/bootstrap-4.1.2.tgz";,
@@ -5440,6 +5491,22 @@
         "popper.js": "^1.14.1"
       }
     },
+    "@types/chai": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.0.8.tgz";,
+      "integrity": 
"sha512-m812CONwdZn/dMzkIJEY0yAs4apyTkTORgfB2UsMOxgkUbC205AHnm4T8I0I5gPg9MHrFc1dJ35iS75c0CJkjg==",
+      "dev": true
+    },
+    "@types/chai-jquery": {
+      "version": "1.1.35",
+      "resolved": 
"https://registry.npmjs.org/@types/chai-jquery/-/chai-jquery-1.1.35.tgz";,
+      "integrity": 
"sha512-7aIt9QMRdxuagLLI48dPz96YJdhu64p6FCa6n4qkGN5DQLHnrIjZpD9bXCvV2G0NwgZ1FAmfP214dxc5zNCfgQ==",
+      "dev": true,
+      "requires": {
+        "@types/chai": "*",
+        "@types/jquery": "*"
+      }
+    },
     "@types/es6-promise": {
       "version": "0.0.33",
       "resolved": 
"https://registry.npmjs.org/@types/es6-promise/-/es6-promise-0.0.33.tgz";,
@@ -5457,6 +5524,24 @@
       "resolved": 
"https://registry.npmjs.org/@types/jquery/-/jquery-3.3.6.tgz";,
       "integrity": 
"sha512-403D4wN95Mtzt2EoQHARf5oe/jEPhzBOBNrunk+ydQGW8WmkQ/E8rViRAEB1qEt/vssfGfNVD6ujP4FVeegrLg=="
     },
+    "@types/lodash": {
+      "version": "4.14.87",
+      "resolved": 
"https://registry.npmjs.org/@types/lodash/-/lodash-4.14.87.tgz";,
+      "integrity": 
"sha512-AqRC+aEF4N0LuNHtcjKtvF9OTfqZI0iaBoe3dA6m/W+/YZJBZjBmW/QIZ8fBeXC6cnytSY9tBoFBqZ9uSCeVsw==",
+      "dev": true
+    },
+    "@types/minimatch": {
+      "version": "3.0.3",
+      "resolved": 
"https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz";,
+      "integrity": 
"sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+      "dev": true
+    },
+    "@types/mocha": {
+      "version": "2.2.44",
+      "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.44.tgz";,
+      "integrity": 
"sha512-k2tWTQU8G4+iSMvqKi0Q9IIsWAp/n8xzdZS4Q4YVIltApoMA00wFBFdlJnmoaK1/z7B0Cy0yPe6GgXteSmdUNw==",
+      "dev": true
+    },
     "@types/moment": {
       "version": "2.13.0",
       "resolved": 
"https://registry.npmjs.org/@types/moment/-/moment-2.13.0.tgz";,
@@ -5487,6 +5572,22 @@
       "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=",
       "dev": true
     },
+    "@types/sinon": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-4.0.0.tgz";,
+      "integrity": 
"sha512-cuK4xM8Lg2wd8cxshcQa8RG4IK/xfyB6TNE6tNVvkrShR4xdrYgsV04q6Dp6v1Lp6biEFdzD8k8zg/ujQeiw+A==",
+      "dev": true
+    },
+    "@types/sinon-chai": {
+      "version": "2.7.29",
+      "resolved": 
"https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-2.7.29.tgz";,
+      "integrity": 
"sha512-EkI/ZvJT4hglWo7Ipf9SX+J+R9htNOMjW8xiOhce7+0csqvgoF5IXqY5Ae1GqRgNtWCuaywR5HjVa1snkTqpOw==",
+      "dev": true,
+      "requires": {
+        "@types/chai": "*",
+        "@types/sinon": "*"
+      }
+    },
     "@webassemblyjs/ast": {
       "version": "1.4.3",
       "resolved": 
"https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.4.3.tgz";,
@@ -5817,6 +5918,12 @@
         "tslib": "^1.9.0"
       }
     },
+    "ansi-escapes": {
+      "version": "1.4.0",
+      "resolved": 
"https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz";,
+      "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=",
+      "dev": true
+    },
     "ansi-html": {
       "version": "0.0.7",
       "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz";,
@@ -5897,6 +6004,12 @@
       "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
       "dev": true
     },
+    "array-filter": {
+      "version": "0.0.1",
+      "resolved": 
"https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz";,
+      "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=",
+      "dev": true
+    },
     "array-find-index": {
       "version": "1.0.2",
       "resolved": 
"https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz";,
@@ -5919,6 +6032,18 @@
         "es-abstract": "^1.7.0"
       }
     },
+    "array-map": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz";,
+      "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=",
+      "dev": true
+    },
+    "array-reduce": {
+      "version": "0.0.0",
+      "resolved": 
"https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz";,
+      "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=",
+      "dev": true
+    },
     "array-slice": {
       "version": "0.2.3",
       "resolved": 
"https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz";,
@@ -6076,6 +6201,12 @@
         "postcss-value-parser": "^3.2.3"
       }
     },
+    "aws-sign2": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz";,
+      "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+      "dev": true
+    },
     "aws4": {
       "version": "1.6.0",
       "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz";,
@@ -6684,6 +6815,12 @@
       "integrity": 
"sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==",
       "dev": true
     },
+    "buffer-crc32": {
+      "version": "0.2.13",
+      "resolved": 
"https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz";,
+      "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
+      "dev": true
+    },
     "buffer-fill": {
       "version": "1.0.0",
       "resolved": 
"https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz";,
@@ -6828,6 +6965,15 @@
         "schema-utils": "^0.4.2"
       }
     },
+    "cachedir": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-1.3.0.tgz";,
+      "integrity": 
"sha512-O1ji32oyON9laVPJL1IZ5bmwd2cB46VfpxkDequezH+15FDzzVddEyrGEeX4WusDSqKxdyFdDQDEG1yo1GoWkg==",
+      "dev": true,
+      "requires": {
+        "os-homedir": "^1.0.1"
+      }
+    },
     "callsite": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz";,
@@ -6904,6 +7050,12 @@
         }
       }
     },
+    "check-more-types": {
+      "version": "2.24.0",
+      "resolved": 
"https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz";,
+      "integrity": "sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA=",
+      "dev": true
+    },
     "chokidar": {
       "version": "1.7.0",
       "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz";,
@@ -6933,6 +7085,12 @@
       "integrity": 
"sha512-sjndyZHrrWiu4RY7AkHgjn80GfAM2ZSzUkZLV/Js59Ldmh6JDThf0SUmOHU53rFu2rVxxfCzJ30Ukcfch3Gb/A==",
       "dev": true
     },
+    "ci-info": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz";,
+      "integrity": 
"sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==",
+      "dev": true
+    },
     "cipher-base": {
       "version": "1.0.4",
       "resolved": 
"https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz";,
@@ -7001,6 +7159,53 @@
         }
       }
     },
+    "cli-cursor": {
+      "version": "1.0.2",
+      "resolved": 
"https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz";,
+      "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=",
+      "dev": true,
+      "requires": {
+        "restore-cursor": "^1.0.1"
+      }
+    },
+    "cli-spinners": {
+      "version": "0.1.2",
+      "resolved": 
"https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.1.2.tgz";,
+      "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=",
+      "dev": true
+    },
+    "cli-truncate": {
+      "version": "0.2.1",
+      "resolved": 
"https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz";,
+      "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=",
+      "dev": true,
+      "requires": {
+        "slice-ansi": "0.0.4",
+        "string-width": "^1.0.1"
+      },
+      "dependencies": {
+        "is-fullwidth-code-point": {
+          "version": "1.0.0",
+          "resolved": 
"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz";,
+          "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+          "dev": true,
+          "requires": {
+            "number-is-nan": "^1.0.0"
+          }
+        },
+        "string-width": {
+          "version": "1.0.2",
+          "resolved": 
"https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz";,
+          "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+          "dev": true,
+          "requires": {
+            "code-point-at": "^1.0.0",
+            "is-fullwidth-code-point": "^1.0.0",
+            "strip-ansi": "^3.0.0"
+          }
+        }
+      }
+    },
     "cliui": {
       "version": "3.2.0",
       "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz";,
@@ -7164,6 +7369,15 @@
       "integrity": 
"sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
       "dev": true
     },
+    "common-tags": {
+      "version": "1.4.0",
+      "resolved": 
"https://registry.npmjs.org/common-tags/-/common-tags-1.4.0.tgz";,
+      "integrity": "sha1-EYe+Tz1M8MBCfUP3Tu8fc1AWFMA=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.18.0"
+      }
+    },
     "commondir": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz";,
@@ -7634,6 +7848,302 @@
       "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=",
       "dev": true
     },
+    "cypress": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/cypress/-/cypress-3.1.0.tgz";,
+      "integrity": 
"sha512-UqLbXgHvM8Y6Y+roHrepZMWcyMN5u4KcjpTbJTZi0d5O2Prvtqmnpoky7a4C65q4oRQXeSc6cBZUhxJkhU4pbQ==",
+      "dev": true,
+      "requires": {
+        "@cypress/listr-verbose-renderer": "0.4.1",
+        "@cypress/xvfb": "1.2.3",
+        "@types/blob-util": "1.3.3",
+        "@types/bluebird": "3.5.18",
+        "@types/chai": "4.0.8",
+        "@types/chai-jquery": "1.1.35",
+        "@types/jquery": "3.2.16",
+        "@types/lodash": "4.14.87",
+        "@types/minimatch": "3.0.3",
+        "@types/mocha": "2.2.44",
+        "@types/sinon": "4.0.0",
+        "@types/sinon-chai": "2.7.29",
+        "bluebird": "3.5.0",
+        "cachedir": "1.3.0",
+        "chalk": "2.4.1",
+        "check-more-types": "2.24.0",
+        "commander": "2.11.0",
+        "common-tags": "1.4.0",
+        "debug": "3.1.0",
+        "execa": "0.10.0",
+        "executable": "4.1.1",
+        "extract-zip": "1.6.6",
+        "fs-extra": "4.0.1",
+        "getos": "3.1.0",
+        "glob": "7.1.2",
+        "is-ci": "1.0.10",
+        "is-installed-globally": "0.1.0",
+        "lazy-ass": "1.6.0",
+        "listr": "0.12.0",
+        "lodash": "4.17.10",
+        "log-symbols": "2.2.0",
+        "minimist": "1.2.0",
+        "progress": "1.1.8",
+        "ramda": "0.24.1",
+        "request": "2.87.0",
+        "request-progress": "0.3.1",
+        "supports-color": "5.1.0",
+        "tmp": "0.0.31",
+        "url": "0.11.0",
+        "yauzl": "2.8.0"
+      },
+      "dependencies": {
+        "@types/jquery": {
+          "version": "3.2.16",
+          "resolved": 
"https://registry.npmjs.org/@types/jquery/-/jquery-3.2.16.tgz";,
+          "integrity": 
"sha512-q2WC02YxQoX2nY1HRKlYGHpGP1saPmD7GN0pwCDlTz35a4eOtJG+aHRlXyjCuXokUukSrR2aXyBhSW3j+jPc0A==",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "3.2.1",
+          "resolved": 
"https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz";,
+          "integrity": 
"sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^1.9.0"
+          }
+        },
+        "bluebird": {
+          "version": "3.5.0",
+          "resolved": 
"https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz";,
+          "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "2.4.1",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz";,
+          "integrity": 
"sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "5.5.0",
+              "resolved": 
"https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz";,
+              "integrity": 
"sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "commander": {
+          "version": "2.11.0",
+          "resolved": 
"https://registry.npmjs.org/commander/-/commander-2.11.0.tgz";,
+          "integrity": 
"sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==",
+          "dev": true
+        },
+        "concat-stream": {
+          "version": "1.6.0",
+          "resolved": 
"https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz";,
+          "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "readable-stream": "^2.2.2",
+            "typedarray": "^0.0.6"
+          }
+        },
+        "cross-spawn": {
+          "version": "6.0.5",
+          "resolved": 
"https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz";,
+          "integrity": 
"sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+          "dev": true,
+          "requires": {
+            "nice-try": "^1.0.4",
+            "path-key": "^2.0.1",
+            "semver": "^5.5.0",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
+          }
+        },
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz";,
+          "integrity": 
"sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "execa": {
+          "version": "0.10.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz";,
+          "integrity": 
"sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^6.0.0",
+            "get-stream": "^3.0.0",
+            "is-stream": "^1.1.0",
+            "npm-run-path": "^2.0.0",
+            "p-finally": "^1.0.0",
+            "signal-exit": "^3.0.0",
+            "strip-eof": "^1.0.0"
+          }
+        },
+        "extract-zip": {
+          "version": "1.6.6",
+          "resolved": 
"https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.6.tgz";,
+          "integrity": "sha1-EpDt6NINCHK0Kf0/NRyhKOxe+Fw=",
+          "dev": true,
+          "requires": {
+            "concat-stream": "1.6.0",
+            "debug": "2.6.9",
+            "mkdirp": "0.5.0",
+            "yauzl": "2.4.1"
+          },
+          "dependencies": {
+            "debug": {
+              "version": "2.6.9",
+              "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz";,
+              "integrity": 
"sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+              "dev": true,
+              "requires": {
+                "ms": "2.0.0"
+              }
+            },
+            "yauzl": {
+              "version": "2.4.1",
+              "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz";,
+              "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=",
+              "dev": true,
+              "requires": {
+                "fd-slicer": "~1.0.1"
+              }
+            }
+          }
+        },
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": 
"https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz";,
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+          "dev": true
+        },
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": 
"http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz";,
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        },
+        "mkdirp": {
+          "version": "0.5.0",
+          "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz";,
+          "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=",
+          "dev": true,
+          "requires": {
+            "minimist": "0.0.8"
+          },
+          "dependencies": {
+            "minimist": {
+              "version": "0.0.8",
+              "resolved": 
"http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz";,
+              "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+              "dev": true
+            }
+          }
+        },
+        "progress": {
+          "version": "1.1.8",
+          "resolved": 
"https://registry.npmjs.org/progress/-/progress-1.1.8.tgz";,
+          "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=",
+          "dev": true
+        },
+        "request": {
+          "version": "2.87.0",
+          "resolved": 
"https://registry.npmjs.org/request/-/request-2.87.0.tgz";,
+          "integrity": 
"sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==",
+          "dev": true,
+          "requires": {
+            "aws-sign2": "~0.7.0",
+            "aws4": "^1.6.0",
+            "caseless": "~0.12.0",
+            "combined-stream": "~1.0.5",
+            "extend": "~3.0.1",
+            "forever-agent": "~0.6.1",
+            "form-data": "~2.3.1",
+            "har-validator": "~5.0.3",
+            "http-signature": "~1.2.0",
+            "is-typedarray": "~1.0.0",
+            "isstream": "~0.1.2",
+            "json-stringify-safe": "~5.0.1",
+            "mime-types": "~2.1.17",
+            "oauth-sign": "~0.8.2",
+            "performance-now": "^2.1.0",
+            "qs": "~6.5.1",
+            "safe-buffer": "^5.1.1",
+            "tough-cookie": "~2.3.3",
+            "tunnel-agent": "^0.6.0",
+            "uuid": "^3.1.0"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.1.2",
+          "resolved": 
"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz";,
+          "integrity": 
"sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+          "dev": true
+        },
+        "semver": {
+          "version": "5.5.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz";,
+          "integrity": 
"sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "5.1.0",
+          "resolved": 
"https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz";,
+          "integrity": 
"sha512-Ry0AwkoKjDpVKK4sV4h6o3UJmNRbjYm2uXhwfj3J56lMVdvnUNqzQVRztOOMGQ++w1K/TjNDFvpJk0F/LoeBCQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^2.0.0"
+          },
+          "dependencies": {
+            "has-flag": {
+              "version": "2.0.0",
+              "resolved": 
"https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz";,
+              "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
+              "dev": true
+            }
+          }
+        },
+        "tmp": {
+          "version": "0.0.31",
+          "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz";,
+          "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=",
+          "dev": true,
+          "requires": {
+            "os-tmpdir": "~1.0.1"
+          }
+        },
+        "uuid": {
+          "version": "3.3.2",
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz";,
+          "integrity": 
"sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
+          "dev": true
+        },
+        "yauzl": {
+          "version": "2.8.0",
+          "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.8.0.tgz";,
+          "integrity": "sha1-eUUK/yKyqcWkHvVOAtuQfM+/nuI=",
+          "dev": true,
+          "requires": {
+            "buffer-crc32": "~0.2.3",
+            "fd-slicer": "~1.0.1"
+          }
+        }
+      }
+    },
     "d": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz";,
@@ -7652,6 +8162,12 @@
         "assert-plus": "^1.0.0"
       }
     },
+    "date-fns": {
+      "version": "1.29.0",
+      "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz";,
+      "integrity": 
"sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==",
+      "dev": true
+    },
     "date-format": {
       "version": "1.2.0",
       "resolved": 
"https://registry.npmjs.org/date-format/-/date-format-1.2.0.tgz";,
@@ -7983,6 +8499,12 @@
         "crossvent": "1.5.4"
       }
     },
+    "duplexer": {
+      "version": "0.1.1",
+      "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz";,
+      "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
+      "dev": true
+    },
     "duplexify": {
       "version": "3.6.0",
       "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz";,
@@ -8024,6 +8546,12 @@
       "integrity": 
"sha512-PbJGGpDSNn3fyUN1eQESAmnMT+a1QAO4NEZgikDuGOn7tbAuMHF87jNna+NoVsMBfEEYzfpn/ay88HgDCJUbQA==",
       "dev": true
     },
+    "elegant-spinner": {
+      "version": "1.0.1",
+      "resolved": 
"https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz";,
+      "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=",
+      "dev": true
+    },
     "elliptic": {
       "version": "6.4.1",
       "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz";,
@@ -8342,6 +8870,22 @@
       "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
       "dev": true
     },
+    "event-stream": {
+      "version": "3.3.6",
+      "resolved": 
"https://registry.npmjs.org/event-stream/-/event-stream-3.3.6.tgz";,
+      "integrity": 
"sha512-dGXNg4F/FgVzlApjzItL+7naHutA3fDqbV/zAZqDDlXTjiMnQmZKu+prImWKszeBM5UQeGvAl3u1wBiKeDh61g==",
+      "dev": true,
+      "requires": {
+        "duplexer": "^0.1.1",
+        "flatmap-stream": "^0.1.0",
+        "from": "^0.1.7",
+        "map-stream": "0.0.7",
+        "pause-stream": "^0.0.11",
+        "split": "^1.0.1",
+        "stream-combiner": "^0.2.2",
+        "through": "^2.3.8"
+      }
+    },
     "eventemitter3": {
       "version": "1.2.0",
       "resolved": 
"https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz";,
@@ -8409,12 +8953,27 @@
         }
       }
     },
+    "executable": {
+      "version": "4.1.1",
+      "resolved": 
"https://registry.npmjs.org/executable/-/executable-4.1.1.tgz";,
+      "integrity": 
"sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==",
+      "dev": true,
+      "requires": {
+        "pify": "^2.2.0"
+      }
+    },
     "exit": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz";,
       "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
       "dev": true
     },
+    "exit-hook": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz";,
+      "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=",
+      "dev": true
+    },
     "expand-braces": {
       "version": "0.1.2",
       "resolved": 
"https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz";,
@@ -8809,6 +9368,16 @@
         "pend": "~1.2.0"
       }
     },
+    "figures": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz";,
+      "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
+      "dev": true,
+      "requires": {
+        "escape-string-regexp": "^1.0.5",
+        "object-assign": "^4.1.0"
+      }
+    },
     "file-loader": {
       "version": "1.1.11",
       "resolved": 
"https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz";,
@@ -8916,6 +9485,12 @@
         }
       }
     },
+    "flatmap-stream": {
+      "version": "0.1.0",
+      "resolved": 
"https://registry.npmjs.org/flatmap-stream/-/flatmap-stream-0.1.0.tgz";,
+      "integrity": 
"sha512-Nlic4ZRYxikqnK5rj3YoxDVKGGtUjcNDUtvQ7XsdGLZmMwdUYnXf10o1zcXtzEZTBgc6GxeRpQxV/Wu3WPIIHA==",
+      "dev": true
+    },
     "flush-write-stream": {
       "version": "1.0.3",
       "resolved": 
"https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz";,
@@ -8952,6 +9527,28 @@
       "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
       "dev": true
     },
+    "form-data": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz";,
+      "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
+      "dev": true,
+      "requires": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "1.0.6",
+        "mime-types": "^2.1.12"
+      },
+      "dependencies": {
+        "combined-stream": {
+          "version": "1.0.6",
+          "resolved": 
"http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz";,
+          "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
+          "dev": true,
+          "requires": {
+            "delayed-stream": "~1.0.0"
+          }
+        }
+      }
+    },
     "forwarded": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz";,
@@ -8973,6 +9570,12 @@
       "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
       "dev": true
     },
+    "from": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz";,
+      "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=",
+      "dev": true
+    },
     "from2": {
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz";,
@@ -8992,6 +9595,17 @@
         "null-check": "^1.0.0"
       }
     },
+    "fs-extra": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.1.tgz";,
+      "integrity": "sha1-f8DGyJV/mD9X8waiTlud3Y0N2IA=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "jsonfile": "^3.0.0",
+        "universalify": "^0.1.0"
+      }
+    },
     "fs-write-stream-atomic": {
       "version": "1.0.10",
       "resolved": 
"https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz";,
@@ -9627,6 +10241,26 @@
       "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
       "dev": true
     },
+    "getos": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/getos/-/getos-3.1.0.tgz";,
+      "integrity": 
"sha512-i9vrxtDu5DlLVFcrbqUqGWYlZN/zZ4pGMICCAcZoYsX3JA54nYp8r5EThw5K+m2q3wszkx4Th746JstspB0H4Q==",
+      "dev": true,
+      "requires": {
+        "async": "2.4.0"
+      },
+      "dependencies": {
+        "async": {
+          "version": "2.4.0",
+          "resolved": "https://registry.npmjs.org/async/-/async-2.4.0.tgz";,
+          "integrity": "sha1-SZAgDxjqW4N8LMT4wDGmmFw4VhE=",
+          "dev": true,
+          "requires": {
+            "lodash": "^4.14.0"
+          }
+        }
+      }
+    },
     "getpass": {
       "version": "0.1.7",
       "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz";,
@@ -9668,6 +10302,15 @@
         "is-glob": "^2.0.0"
       }
     },
+    "global-dirs": {
+      "version": "0.1.1",
+      "resolved": 
"https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz";,
+      "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=",
+      "dev": true,
+      "requires": {
+        "ini": "^1.3.4"
+      }
+    },
     "globals": {
       "version": "9.18.0",
       "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz";,
@@ -9800,6 +10443,36 @@
         }
       }
     },
+    "har-schema": {
+      "version": "2.0.0",
+      "resolved": 
"https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz";,
+      "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+      "dev": true
+    },
+    "har-validator": {
+      "version": "5.0.3",
+      "resolved": 
"https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz";,
+      "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
+      "dev": true,
+      "requires": {
+        "ajv": "^5.1.0",
+        "har-schema": "^2.0.0"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "5.5.2",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz";,
+          "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+          "dev": true,
+          "requires": {
+            "co": "^4.6.0",
+            "fast-deep-equal": "^1.0.0",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.3.0"
+          }
+        }
+      }
+    },
     "has": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz";,
@@ -10420,6 +11093,17 @@
         }
       }
     },
+    "http-signature": {
+      "version": "1.2.0",
+      "resolved": 
"https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz";,
+      "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "^1.0.0",
+        "jsprim": "^1.2.2",
+        "sshpk": "^1.7.0"
+      }
+    },
     "https-browserify": {
       "version": "1.0.0",
       "resolved": 
"https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz";,
@@ -10638,6 +11322,15 @@
       "integrity": 
"sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==",
       "dev": true
     },
+    "is-ci": {
+      "version": "1.0.10",
+      "resolved": "http://registry.npmjs.org/is-ci/-/is-ci-1.0.10.tgz";,
+      "integrity": "sha1-9zkzayYyNlBhqdSCcM1WrjNpMY4=",
+      "dev": true,
+      "requires": {
+        "ci-info": "^1.0.0"
+      }
+    },
     "is-data-descriptor": {
       "version": "0.1.4",
       "resolved": 
"https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz";,
@@ -10729,6 +11422,16 @@
         "is-extglob": "^1.0.0"
       }
     },
+    "is-installed-globally": {
+      "version": "0.1.0",
+      "resolved": 
"https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz";,
+      "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=",
+      "dev": true,
+      "requires": {
+        "global-dirs": "^0.1.0",
+        "is-path-inside": "^1.0.0"
+      }
+    },
     "is-number": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz";,
@@ -10791,6 +11494,12 @@
       "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
       "dev": true
     },
+    "is-promise": {
+      "version": "2.1.0",
+      "resolved": 
"https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz";,
+      "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
+      "dev": true
+    },
     "is-regex": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz";,
@@ -11229,6 +11938,21 @@
       "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
       "dev": true
     },
+    "jsonfile": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz";,
+      "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.6"
+      }
+    },
+    "jsonify": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz";,
+      "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
+      "dev": true
+    },
     "jsprim": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz";,
@@ -12301,6 +13025,12 @@
         "is-buffer": "^1.1.5"
       }
     },
+    "lazy-ass": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz";,
+      "integrity": "sha1-eZllXoZGwX8In90YfRUNMyTVRRM=",
+      "dev": true
+    },
     "lazy-cache": {
       "version": "1.0.4",
       "resolved": 
"https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz";,
@@ -12585,6 +13315,107 @@
         "immediate": "~3.0.5"
       }
     },
+    "listr": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/listr/-/listr-0.12.0.tgz";,
+      "integrity": "sha1-a84sD1YD+klYDqF81qAMwOX6RRo=",
+      "dev": true,
+      "requires": {
+        "chalk": "^1.1.3",
+        "cli-truncate": "^0.2.1",
+        "figures": "^1.7.0",
+        "indent-string": "^2.1.0",
+        "is-promise": "^2.1.0",
+        "is-stream": "^1.1.0",
+        "listr-silent-renderer": "^1.1.1",
+        "listr-update-renderer": "^0.2.0",
+        "listr-verbose-renderer": "^0.4.0",
+        "log-symbols": "^1.0.2",
+        "log-update": "^1.0.2",
+        "ora": "^0.2.3",
+        "p-map": "^1.1.1",
+        "rxjs": "^5.0.0-beta.11",
+        "stream-to-observable": "^0.1.0",
+        "strip-ansi": "^3.0.1"
+      },
+      "dependencies": {
+        "log-symbols": {
+          "version": "1.0.2",
+          "resolved": 
"https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz";,
+          "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=",
+          "dev": true,
+          "requires": {
+            "chalk": "^1.0.0"
+          }
+        },
+        "rxjs": {
+          "version": "5.5.12",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz";,
+          "integrity": 
"sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==",
+          "dev": true,
+          "requires": {
+            "symbol-observable": "1.0.1"
+          }
+        },
+        "symbol-observable": {
+          "version": "1.0.1",
+          "resolved": 
"https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz";,
+          "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=",
+          "dev": true
+        }
+      }
+    },
+    "listr-silent-renderer": {
+      "version": "1.1.1",
+      "resolved": 
"https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz";,
+      "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=",
+      "dev": true
+    },
+    "listr-update-renderer": {
+      "version": "0.2.0",
+      "resolved": 
"https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.2.0.tgz";,
+      "integrity": "sha1-yoDhd5tOcCZoB+ju0a1qvjmFUPk=",
+      "dev": true,
+      "requires": {
+        "chalk": "^1.1.3",
+        "cli-truncate": "^0.2.1",
+        "elegant-spinner": "^1.0.1",
+        "figures": "^1.7.0",
+        "indent-string": "^3.0.0",
+        "log-symbols": "^1.0.2",
+        "log-update": "^1.0.2",
+        "strip-ansi": "^3.0.1"
+      },
+      "dependencies": {
+        "indent-string": {
+          "version": "3.2.0",
+          "resolved": 
"https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz";,
+          "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=",
+          "dev": true
+        },
+        "log-symbols": {
+          "version": "1.0.2",
+          "resolved": 
"https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz";,
+          "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=",
+          "dev": true,
+          "requires": {
+            "chalk": "^1.0.0"
+          }
+        }
+      }
+    },
+    "listr-verbose-renderer": {
+      "version": "0.4.1",
+      "resolved": 
"https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz";,
+      "integrity": "sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=",
+      "dev": true,
+      "requires": {
+        "chalk": "^1.1.3",
+        "cli-cursor": "^1.0.2",
+        "date-fns": "^1.27.2",
+        "figures": "^1.7.0"
+      }
+    },
     "load-json-file": {
       "version": "1.1.0",
       "resolved": 
"https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz";,
@@ -12663,6 +13494,12 @@
       "integrity": "sha1-FQzwoWeR9ZA7iJHqsVRgknS96lU=",
       "dev": true
     },
+    "lodash.once": {
+      "version": "4.1.1",
+      "resolved": 
"https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz";,
+      "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=",
+      "dev": true
+    },
     "lodash.tail": {
       "version": "4.1.1",
       "resolved": 
"https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz";,
@@ -12715,6 +13552,16 @@
         }
       }
     },
+    "log-update": {
+      "version": "1.0.2",
+      "resolved": 
"https://registry.npmjs.org/log-update/-/log-update-1.0.2.tgz";,
+      "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=",
+      "dev": true,
+      "requires": {
+        "ansi-escapes": "^1.0.0",
+        "cli-cursor": "^1.0.2"
+      }
+    },
     "log4js": {
       "version": "3.0.5",
       "resolved": "https://registry.npmjs.org/log4js/-/log4js-3.0.5.tgz";,
@@ -12836,6 +13683,12 @@
       "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
       "dev": true
     },
+    "map-stream": {
+      "version": "0.0.7",
+      "resolved": 
"https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz";,
+      "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=",
+      "dev": true
+    },
     "map-visit": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz";,
@@ -12886,6 +13739,12 @@
         "readable-stream": "^2.0.1"
       }
     },
+    "memorystream": {
+      "version": "0.3.1",
+      "resolved": 
"https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz";,
+      "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=",
+      "dev": true
+    },
     "meow": {
       "version": "3.7.0",
       "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz";,
@@ -13207,6 +14066,12 @@
         "dragula": "^3.7.2"
       }
     },
+    "nice-try": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz";,
+      "integrity": 
"sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
+      "dev": true
+    },
     "no-case": {
       "version": "2.3.2",
       "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz";,
@@ -13597,6 +14462,133 @@
         }
       }
     },
+    "npm-run-all": {
+      "version": "4.1.3",
+      "resolved": 
"https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.3.tgz";,
+      "integrity": 
"sha512-aOG0N3Eo/WW+q6sUIdzcV2COS8VnTZCmdji0VQIAZF3b+a3YWb0AD0vFIyjKec18A7beLGbaQ5jFTNI2bPt9Cg==",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "^3.2.0",
+        "chalk": "^2.1.0",
+        "cross-spawn": "^6.0.4",
+        "memorystream": "^0.3.1",
+        "minimatch": "^3.0.4",
+        "ps-tree": "^1.1.0",
+        "read-pkg": "^3.0.0",
+        "shell-quote": "^1.6.1",
+        "string.prototype.padend": "^3.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "3.2.1",
+          "resolved": 
"https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz";,
+          "integrity": 
"sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^1.9.0"
+          }
+        },
+        "chalk": {
+          "version": "2.4.1",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz";,
+          "integrity": 
"sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          }
+        },
+        "cross-spawn": {
+          "version": "6.0.5",
+          "resolved": 
"https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz";,
+          "integrity": 
"sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+          "dev": true,
+          "requires": {
+            "nice-try": "^1.0.4",
+            "path-key": "^2.0.1",
+            "semver": "^5.5.0",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
+          }
+        },
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": 
"https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz";,
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+          "dev": true
+        },
+        "load-json-file": {
+          "version": "4.0.0",
+          "resolved": 
"https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz";,
+          "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.2",
+            "parse-json": "^4.0.0",
+            "pify": "^3.0.0",
+            "strip-bom": "^3.0.0"
+          }
+        },
+        "parse-json": {
+          "version": "4.0.0",
+          "resolved": 
"https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz";,
+          "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+          "dev": true,
+          "requires": {
+            "error-ex": "^1.3.1",
+            "json-parse-better-errors": "^1.0.1"
+          }
+        },
+        "path-type": {
+          "version": "3.0.0",
+          "resolved": 
"https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz";,
+          "integrity": 
"sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
+          "dev": true,
+          "requires": {
+            "pify": "^3.0.0"
+          }
+        },
+        "pify": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz";,
+          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+          "dev": true
+        },
+        "read-pkg": {
+          "version": "3.0.0",
+          "resolved": 
"https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz";,
+          "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
+          "dev": true,
+          "requires": {
+            "load-json-file": "^4.0.0",
+            "normalize-package-data": "^2.3.2",
+            "path-type": "^3.0.0"
+          }
+        },
+        "semver": {
+          "version": "5.5.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz";,
+          "integrity": 
"sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==",
+          "dev": true
+        },
+        "strip-bom": {
+          "version": "3.0.0",
+          "resolved": 
"https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz";,
+          "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": 
"https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz";,
+          "integrity": 
"sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
     "npm-run-path": {
       "version": "2.0.2",
       "resolved": 
"https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz";,
@@ -13786,6 +14778,12 @@
         "wrappy": "1"
       }
     },
+    "onetime": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz";,
+      "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
+      "dev": true
+    },
     "opn": {
       "version": "5.3.0",
       "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz";,
@@ -13827,6 +14825,18 @@
         }
       }
     },
+    "ora": {
+      "version": "0.2.3",
+      "resolved": "http://registry.npmjs.org/ora/-/ora-0.2.3.tgz";,
+      "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=",
+      "dev": true,
+      "requires": {
+        "chalk": "^1.1.1",
+        "cli-cursor": "^1.0.2",
+        "cli-spinners": "^0.1.2",
+        "object-assign": "^4.0.1"
+      }
+    },
     "original": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz";,
@@ -14066,6 +15076,15 @@
         "pinkie-promise": "^2.0.0"
       }
     },
+    "pause-stream": {
+      "version": "0.0.11",
+      "resolved": 
"http://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz";,
+      "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=",
+      "dev": true,
+      "requires": {
+        "through": "~2.3"
+      }
+    },
     "pbkdf2": {
       "version": "3.0.16",
       "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz";,
@@ -14084,6 +15103,12 @@
       "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz";,
       "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA="
     },
+    "performance-now": {
+      "version": "2.1.0",
+      "resolved": 
"https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz";,
+      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+      "dev": true
+    },
     "pify": {
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz";,
@@ -14537,6 +15562,15 @@
       "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
       "dev": true
     },
+    "ps-tree": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.0.tgz";,
+      "integrity": "sha1-tCGyQUDWID8e08dplrRCewjowBQ=",
+      "dev": true,
+      "requires": {
+        "event-stream": "~3.3.0"
+      }
+    },
     "pseudomap": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz";,
@@ -14652,6 +15686,12 @@
       "integrity": 
"sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==",
       "dev": true
     },
+    "ramda": {
+      "version": "0.24.1",
+      "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.24.1.tgz";,
+      "integrity": "sha1-w7d1UZfzW43DUCIoJixMkd22uFc=",
+      "dev": true
+    },
     "randomatic": {
       "version": "3.1.0",
       "resolved": 
"https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz";,
@@ -15098,6 +16138,15 @@
         }
       }
     },
+    "request-progress": {
+      "version": "0.3.1",
+      "resolved": 
"https://registry.npmjs.org/request-progress/-/request-progress-0.3.1.tgz";,
+      "integrity": "sha1-ByHBBdipasayzossia4tXs/Pazo=",
+      "dev": true,
+      "requires": {
+        "throttleit": "~0.0.2"
+      }
+    },
     "require-directory": {
       "version": "2.1.1",
       "resolved": 
"https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz";,
@@ -15152,6 +16201,16 @@
       "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
       "dev": true
     },
+    "restore-cursor": {
+      "version": "1.0.1",
+      "resolved": 
"https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz";,
+      "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=",
+      "dev": true,
+      "requires": {
+        "exit-hook": "^1.0.0",
+        "onetime": "^1.0.0"
+      }
+    },
     "ret": {
       "version": "0.1.15",
       "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz";,
@@ -15720,6 +16779,18 @@
       "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
       "dev": true
     },
+    "shell-quote": {
+      "version": "1.6.1",
+      "resolved": 
"https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz";,
+      "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=",
+      "dev": true,
+      "requires": {
+        "array-filter": "~0.0.0",
+        "array-map": "~0.0.0",
+        "array-reduce": "~0.0.0",
+        "jsonify": "~0.0.0"
+      }
+    },
     "signal-exit": {
       "version": "3.0.2",
       "resolved": 
"https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz";,
@@ -15741,6 +16812,12 @@
       "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
       "dev": true
     },
+    "slice-ansi": {
+      "version": "0.0.4",
+      "resolved": 
"https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz";,
+      "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=",
+      "dev": true
+    },
     "slide": {
       "version": "1.1.6",
       "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz";,
@@ -16072,6 +17149,15 @@
         "wbuf": "^1.7.2"
       }
     },
+    "split": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz";,
+      "integrity": 
"sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
+      "dev": true,
+      "requires": {
+        "through": "2"
+      }
+    },
     "split-string": {
       "version": "3.1.0",
       "resolved": 
"https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz";,
@@ -16196,6 +17282,16 @@
         "readable-stream": "^2.0.2"
       }
     },
+    "stream-combiner": {
+      "version": "0.2.2",
+      "resolved": 
"http://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz";,
+      "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=",
+      "dev": true,
+      "requires": {
+        "duplexer": "~0.1.1",
+        "through": "~2.3.4"
+      }
+    },
     "stream-each": {
       "version": "1.2.3",
       "resolved": 
"https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz";,
@@ -16263,6 +17359,12 @@
       "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
       "dev": true
     },
+    "stream-to-observable": {
+      "version": "0.1.0",
+      "resolved": 
"https://registry.npmjs.org/stream-to-observable/-/stream-to-observable-0.1.0.tgz";,
+      "integrity": "sha1-Rb8dny19wJvtgfHDB8Qw5ouEz/4=",
+      "dev": true
+    },
     "streamroller": {
       "version": "0.7.0",
       "resolved": 
"https://registry.npmjs.org/streamroller/-/streamroller-0.7.0.tgz";,
@@ -16355,6 +17457,17 @@
         }
       }
     },
+    "string.prototype.padend": {
+      "version": "3.0.0",
+      "resolved": 
"https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz";,
+      "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.2",
+        "es-abstract": "^1.4.3",
+        "function-bind": "^1.0.2"
+      }
+    },
     "string_decoder": {
       "version": "1.0.2",
       "resolved": 
"https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.2.tgz";,
@@ -16499,6 +17612,12 @@
       "resolved": "https://registry.npmjs.org/tether/-/tether-1.4.0.tgz";,
       "integrity": "sha1-D5+hcfdb9YSF2BSelHmdeudNHBo="
     },
+    "throttleit": {
+      "version": "0.0.2",
+      "resolved": 
"https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz";,
+      "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=",
+      "dev": true
+    },
     "through": {
       "version": "2.3.8",
       "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz";,
@@ -16610,6 +17729,15 @@
       "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=",
       "dev": true
     },
+    "tough-cookie": {
+      "version": "2.3.4",
+      "resolved": 
"https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz";,
+      "integrity": 
"sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
+      "dev": true,
+      "requires": {
+        "punycode": "^1.4.1"
+      }
+    },
     "tree-kill": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.0.tgz";,
@@ -16946,6 +18074,12 @@
         "imurmurhash": "^0.1.4"
       }
     },
+    "universalify": {
+      "version": "0.1.2",
+      "resolved": 
"https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz";,
+      "integrity": 
"sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+      "dev": true
+    },
     "unpipe": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz";,

http://git-wip-us.apache.org/repos/asf/metron/blob/8bf3b6ec/metron-interface/metron-alerts/package.json
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/package.json 
b/metron-interface/metron-alerts/package.json
index ef72bb7..ff3e27c 100644
--- a/metron-interface/metron-alerts/package.json
+++ b/metron-interface/metron-alerts/package.json
@@ -5,12 +5,15 @@
   "angular-cli": {},
   "scripts": {
     "build": "./node_modules/@angular/cli/bin/ng build --prod",
-    "start": "ng serve",
+    "start": "ng serve --aot",
     "lint": "tslint \"src/**/*.ts\"",
     "test": "ng test --browsers=Chrome",
-    "testCI": "ng test --watch=false --browsers=ChromeHeadless",
+    "testCI": "ng test --watch=false --browsers=ChromeHeadless && npm run 
cypress:ci",
     "pree2e": "webdriver-manager update",
-    "e2e": "protractor-flake --protractor-path=./node_modules/.bin/protractor 
--max-attempts=3 -- ./protractor.conf.js"
+    "e2e": "protractor-flake --protractor-path=./node_modules/.bin/protractor 
--max-attempts=3 -- ./protractor.conf.js",
+    "cypress:run": "cypress run", 
+    "cypress:open": "cypress open", 
+    "cypress:ci": "run-p --race start cypress:run"
   },
   "private": true,
   "dependencies": {
@@ -51,6 +54,7 @@
     "@types/pikaday-time": "^1.4.2",
     "codelyzer": "^4.0.1",
     "compression": "^1.7.3",
+    "cypress": "^3.1.0",
     "express": "^4.16.3",
     "http-proxy-middleware": "^0.18.0",
     "jasmine-core": "~2.5.2",
@@ -62,6 +66,7 @@
     "karma-jasmine": "~1.1.0",
     "karma-jasmine-html-reporter": "^0.2.2",
     "node-sass": "^4.9.3",
+    "npm-run-all": "^4.1.3",
     "optimist": "0.6.1",
     "protractor": "^5.4.0",
     "protractor-flake": "^3.3.0",

http://git-wip-us.apache.org/repos/asf/metron/blob/8bf3b6ec/metron-interface/metron-alerts/src/app/alerts/alert-details/alert-details.component.ts
----------------------------------------------------------------------
diff --git 
a/metron-interface/metron-alerts/src/app/alerts/alert-details/alert-details.component.ts
 
b/metron-interface/metron-alerts/src/app/alerts/alert-details/alert-details.component.ts
index 0693457..4c0b18b 100644
--- 
a/metron-interface/metron-alerts/src/app/alerts/alert-details/alert-details.component.ts
+++ 
b/metron-interface/metron-alerts/src/app/alerts/alert-details/alert-details.component.ts
@@ -29,10 +29,11 @@ import {PatchRequest} from '../../model/patch-request';
 import {Patch} from '../../model/patch';
 import {AlertComment} from './alert-comment';
 import {AuthenticationService} from '../../service/authentication.service';
-import {MetronDialogBox} from '../../shared/metron-dialog-box';
 import {CommentAddRemoveRequest} from "../../model/comment-add-remove-request";
 import {META_ALERTS_SENSOR_TYPE} from '../../utils/constants';
 import {GlobalConfigService} from '../../service/global-config.service';
+import { DialogService } from 'app/service/dialog.service';
+import { ConfirmationType } from 'app/model/confirmation-type';
 
 export enum AlertState {
   NEW, OPEN, ESCALATE, DISMISS, RESOLVE
@@ -83,7 +84,7 @@ export class AlertDetailsComponent implements OnInit {
               private updateService: UpdateService,
               private alertsService: AlertsService,
               private authenticationService: AuthenticationService,
-              private metronDialogBox: MetronDialogBox,
+              private dialogService: DialogService,
               globalConfigService: GlobalConfigService) {
     this.globalConfigService = globalConfigService;
   }
@@ -249,8 +250,8 @@ export class AlertDetailsComponent implements OnInit {
       commentText += ' \'' + 
this.alertCommentsWrapper[index].alertComment.comment + '\'';
     }
 
-    
this.metronDialogBox.showConfirmationMessage(commentText).subscribe(response => 
{
-      if (response) {
+    const confirmedSubscription = 
this.dialogService.launchDialog(commentText).subscribe(action => {
+      if (action === ConfirmationType.Confirmed) {
         let deletedCommentWrapper = this.alertCommentsWrapper.splice(index, 
1)[0];
         let commentRequest = new CommentAddRemoveRequest();
         commentRequest.guid = this.alertSource.guid;
@@ -268,6 +269,7 @@ export class AlertDetailsComponent implements OnInit {
               this.alertCommentsWrapper.sort((a, b) => 
b.alertComment.timestamp - a.alertComment.timestamp);
             });
       }
+      confirmedSubscription.unsubscribe();
     });
   }
 }

http://git-wip-us.apache.org/repos/asf/metron/blob/8bf3b6ec/metron-interface/metron-alerts/src/app/alerts/alerts-list/alerts-list.component.ts
----------------------------------------------------------------------
diff --git 
a/metron-interface/metron-alerts/src/app/alerts/alerts-list/alerts-list.component.ts
 
b/metron-interface/metron-alerts/src/app/alerts/alerts-list/alerts-list.component.ts
index d5b3c8b..fcc129f 100644
--- 
a/metron-interface/metron-alerts/src/app/alerts/alerts-list/alerts-list.component.ts
+++ 
b/metron-interface/metron-alerts/src/app/alerts/alerts-list/alerts-list.component.ts
@@ -33,7 +33,6 @@ import {SaveSearchService} from 
'../../service/save-search.service';
 import {RefreshInterval} from '../configure-rows/configure-rows-enums';
 import {SaveSearch} from '../../model/save-search';
 import {TableMetadata} from '../../model/table-metadata';
-import {MetronDialogBox, DialogType} from '../../shared/metron-dialog-box';
 import {AlertSearchDirective} from 
'../../shared/directives/alert-search.directive';
 import {SearchResponse} from '../../model/search-response';
 import {ElasticsearchUtils} from '../../utils/elasticsearch-utils';
@@ -45,6 +44,8 @@ import {META_ALERTS_SENSOR_TYPE} from '../../utils/constants';
 import {MetaAlertService} from '../../service/meta-alert.service';
 import {Facets} from '../../model/facets';
 import { GlobalConfigService } from '../../service/global-config.service';
+import { DialogService } from 'app/service/dialog.service';
+import { DialogType } from 'app/model/dialog-type';
 
 @Component({
   selector: 'app-alerts-list',
@@ -88,9 +89,9 @@ export class AlertsListComponent implements OnInit, OnDestroy 
{
               private alertsService: AlertsService,
               private clusterMetaDataService: ClusterMetaDataService,
               private saveSearchService: SaveSearchService,
-              private metronDialogBox: MetronDialogBox,
               private metaAlertsService: MetaAlertService,
-              private globalConfigService: GlobalConfigService) {
+              private globalConfigService: GlobalConfigService,
+              private dialogService: DialogService) {
     router.events.subscribe(event => {
       if (event instanceof NavigationStart && event.url === '/alerts-list') {
         this.selectedAlerts = [];
@@ -339,7 +340,7 @@ export class AlertsListComponent implements OnInit, 
OnDestroy {
       this.setData(results);
     }, error => {
       this.setData(new SearchResponse());
-      
this.metronDialogBox.showConfirmationMessage(ElasticsearchUtils.extractESErrorMessage(error),
 DialogType.Error);
+      
this.dialogService.launchDialog(ElasticsearchUtils.extractESErrorMessage(error),
 DialogType.Error);
     });
 
     this.tryStartPolling();

http://git-wip-us.apache.org/repos/asf/metron/blob/8bf3b6ec/metron-interface/metron-alerts/src/app/alerts/alerts-list/table-view/table-view.component.spec.ts
----------------------------------------------------------------------
diff --git 
a/metron-interface/metron-alerts/src/app/alerts/alerts-list/table-view/table-view.component.spec.ts
 
b/metron-interface/metron-alerts/src/app/alerts/alerts-list/table-view/table-view.component.spec.ts
index 73dde50..2d7af57 100644
--- 
a/metron-interface/metron-alerts/src/app/alerts/alerts-list/table-view/table-view.component.spec.ts
+++ 
b/metron-interface/metron-alerts/src/app/alerts/alerts-list/table-view/table-view.component.spec.ts
@@ -26,11 +26,11 @@ import { MetronSorterComponent } from 
'../../../shared/metron-table/metron-sorte
 import { CenterEllipsesPipe } from 
'../../../shared/pipes/center-ellipses.pipe';
 import { ColumnNameTranslatePipe } from 
'../../../shared/pipes/column-name-translate.pipe';
 import { AlertSeverityDirective } from 
'../../../shared/directives/alert-severity.directive';
-import { MetronDialogBox } from '../../../shared/metron-dialog-box';
 import { SearchService } from '../../../service/search.service';
 import { UpdateService } from '../../../service/update.service';
 import { GlobalConfigService } from '../../../service/global-config.service';
 import { MetaAlertService } from '../../../service/meta-alert.service';
+import { DialogService } from 'app/service/dialog.service';
 
 @Component({selector: 'metron-table-pagination', template: ''})
 class MetronTablePaginationComponent {
@@ -50,7 +50,7 @@ describe('TableViewComponent', () => {
         UpdateService,
         GlobalConfigService,
         MetaAlertService,
-        MetronDialogBox,
+        DialogService
       ],
       declarations: [
         MetronTableDirective,

http://git-wip-us.apache.org/repos/asf/metron/blob/8bf3b6ec/metron-interface/metron-alerts/src/app/alerts/alerts-list/table-view/table-view.component.ts
----------------------------------------------------------------------
diff --git 
a/metron-interface/metron-alerts/src/app/alerts/alerts-list/table-view/table-view.component.ts
 
b/metron-interface/metron-alerts/src/app/alerts/alerts-list/table-view/table-view.component.ts
index fd05b69..fd47b67 100644
--- 
a/metron-interface/metron-alerts/src/app/alerts/alerts-list/table-view/table-view.component.ts
+++ 
b/metron-interface/metron-alerts/src/app/alerts/alerts-list/table-view/table-view.component.ts
@@ -24,7 +24,6 @@ import {SortEvent} from 
'../../../shared/metron-table/metron-table.directive';
 import {ColumnMetadata} from '../../../model/column-metadata';
 import {Alert} from '../../../model/alert';
 import {SearchService} from '../../../service/search.service';
-import {MetronDialogBox} from '../../../shared/metron-dialog-box';
 import {QueryBuilder} from '../query-builder';
 import {Sort} from '../../../utils/enums';
 import {Filter} from '../../../model/filter';
@@ -34,6 +33,8 @@ import {MetaAlertService} from 
'../../../service/meta-alert.service';
 import {MetaAlertAddRemoveRequest} from 
'../../../model/meta-alert-add-remove-request';
 import {GetRequest} from '../../../model/get-request';
 import { GlobalConfigService } from '../../../service/global-config.service';
+import { DialogService } from '../../../service/dialog.service';
+import { ConfirmationType } from 'app/model/confirmation-type';
 
 export enum MetronAlertDisplayState {
   COLLAPSE, EXPAND
@@ -47,15 +48,10 @@ export enum MetronAlertDisplayState {
 
 export class TableViewComponent implements OnInit, OnChanges, OnDestroy {
 
-  searchService: SearchService;
-  updateService: UpdateService;
   isStatusFieldPresent = false;
-  metronDialogBox: MetronDialogBox;
-  metaAlertService: MetaAlertService;
   metaAlertsDisplayState: {[key: string]: MetronAlertDisplayState} = {};
   metronAlertDisplayState = MetronAlertDisplayState;
   globalConfig: {} = {};
-  globalConfigService: GlobalConfigService;
   configSubscription: Subscription;
 
   @Input() alerts: Alert[] = [];
@@ -71,16 +67,11 @@ export class TableViewComponent implements OnInit, 
OnChanges, OnDestroy {
   @Output() onShowConfigureTable = new EventEmitter<Alert>();
   @Output() onSelectedAlertsChange = new EventEmitter< Alert[]>();
 
-  constructor(searchService: SearchService,
-              metronDialogBox: MetronDialogBox,
-              updateService: UpdateService,
-              metaAlertService: MetaAlertService,
-              globalConfigService: GlobalConfigService) {
-    this.searchService = searchService;
-    this.metronDialogBox = metronDialogBox;
-    this.updateService = updateService;
-    this.metaAlertService = metaAlertService;
-    this.globalConfigService = globalConfigService;
+  constructor(public searchService: SearchService,
+              public updateService: UpdateService,
+              public metaAlertService: MetaAlertService,
+              public globalConfigService: GlobalConfigService,
+              public dialogService: DialogService) {
   }
 
   ngOnInit() {
@@ -259,20 +250,26 @@ export class TableViewComponent implements OnInit, 
OnChanges, OnDestroy {
   }
 
   deleteOneAlertFromMetaAlert($event, alert: Alert, metaAlertIndex: number) {
-    this.metronDialogBox.showConfirmationMessage('Do you wish to remove the 
alert from the meta alert?').subscribe(response => {
-      if (response) {
-        this.doDeleteOneAlertFromMetaAlert(alert, metaAlertIndex);
-      }
-    });
+    const confirmedSubscription = this.dialogService
+      .launchDialog('Do you wish to remove the alert from the meta alert?')
+      .subscribe(action => {
+        if (action === ConfirmationType.Confirmed) {
+          this.doDeleteOneAlertFromMetaAlert(alert, metaAlertIndex);
+        }
+        confirmedSubscription.unsubscribe();
+      });
     $event.stopPropagation();
   }
 
   deleteMetaAlert($event, alert: Alert) {
-    this.metronDialogBox.showConfirmationMessage('Do you wish to remove all 
the alerts from meta alert?').subscribe(response => {
-      if (response) {
-        this.doDeleteMetaAlert(alert);
-      }
-    });
+    const confirmedSubscription = this.dialogService
+      .launchDialog('Do you wish to remove all the alerts from meta alert?')
+      .subscribe(action => {
+        if (action === ConfirmationType.Confirmed) {
+          this.doDeleteMetaAlert(alert);
+        }
+        confirmedSubscription.unsubscribe();
+      });
     $event.stopPropagation();
   }
 

http://git-wip-us.apache.org/repos/asf/metron/blob/8bf3b6ec/metron-interface/metron-alerts/src/app/alerts/alerts-list/tree-view/tree-view.component.spec.ts
----------------------------------------------------------------------
diff --git 
a/metron-interface/metron-alerts/src/app/alerts/alerts-list/tree-view/tree-view.component.spec.ts
 
b/metron-interface/metron-alerts/src/app/alerts/alerts-list/tree-view/tree-view.component.spec.ts
index 9716c53..fda2b78 100644
--- 
a/metron-interface/metron-alerts/src/app/alerts/alerts-list/tree-view/tree-view.component.spec.ts
+++ 
b/metron-interface/metron-alerts/src/app/alerts/alerts-list/tree-view/tree-view.component.spec.ts
@@ -28,10 +28,10 @@ import { ColumnNameTranslatePipe } from 
'../../../shared/pipes/column-name-trans
 import { AlertSeverityDirective } from 
'../../../shared/directives/alert-severity.directive';
 import { MetronTablePaginationComponent } from 
'../../../shared/metron-table/metron-table-pagination/metron-table-pagination.component';
 import { SearchService } from '../../../service/search.service';
-import { MetronDialogBox } from '../../../shared/metron-dialog-box';
 import { UpdateService } from '../../../service/update.service';
 import { GlobalConfigService } from '../../../service/global-config.service';
 import { MetaAlertService } from '../../../service/meta-alert.service';
+import { DialogService } from 'app/service/dialog.service';
 
 describe('TreeViewComponent', () => {
   let component: TreeViewComponent;
@@ -45,7 +45,7 @@ describe('TreeViewComponent', () => {
         UpdateService,
         GlobalConfigService,
         MetaAlertService,
-        MetronDialogBox,
+        DialogService
       ],
       declarations: [
         MetronTableDirective,

http://git-wip-us.apache.org/repos/asf/metron/blob/8bf3b6ec/metron-interface/metron-alerts/src/app/alerts/alerts-list/tree-view/tree-view.component.ts
----------------------------------------------------------------------
diff --git 
a/metron-interface/metron-alerts/src/app/alerts/alerts-list/tree-view/tree-view.component.ts
 
b/metron-interface/metron-alerts/src/app/alerts/alerts-list/tree-view/tree-view.component.ts
index ab168aa..ab1d4eb 100644
--- 
a/metron-interface/metron-alerts/src/app/alerts/alerts-list/tree-view/tree-view.component.ts
+++ 
b/metron-interface/metron-alerts/src/app/alerts/alerts-list/tree-view/tree-view.component.ts
@@ -27,7 +27,6 @@ import {GroupResponse} from '../../../model/group-response';
 import {GroupResult} from '../../../model/group-result';
 import {SortField} from '../../../model/sort-field';
 import {Sort} from '../../../utils/enums';
-import {MetronDialogBox, DialogType} from '../../../shared/metron-dialog-box';
 import {ElasticsearchUtils} from '../../../utils/elasticsearch-utils';
 import {SearchRequest} from '../../../model/search-request';
 import {MetaAlertCreateRequest} from 
'../../../model/meta-alert-create-request';
@@ -37,6 +36,9 @@ import {UpdateService} from '../../../service/update.service';
 import {PatchRequest} from '../../../model/patch-request';
 import {GetRequest} from '../../../model/get-request';
 import { GlobalConfigService } from '../../../service/global-config.service';
+import { DialogService } from '../../../service/dialog.service';
+import { DialogType } from 'app/model/dialog-type';
+import { ConfirmationType } from 'app/model/confirmation-type';
 
 @Component({
   selector: 'app-tree-view',
@@ -53,13 +55,14 @@ export class TreeViewComponent extends TableViewComponent 
implements OnInit, OnC
   treeGroupSubscriptionMap: {[key: string]: TreeAlertsSubscription } = {};
   alertsChangedSubscription: Subscription;
   configSubscription: Subscription;
+  dialogService: DialogService
 
   constructor(searchService: SearchService,
-              metronDialogBox: MetronDialogBox,
               updateService: UpdateService,
               metaAlertService: MetaAlertService,
-              globalConfigService: GlobalConfigService) {
-    super(searchService, metronDialogBox, updateService, metaAlertService, 
globalConfigService);
+              globalConfigService: GlobalConfigService,
+              dialogService: DialogService) {
+    super(searchService, updateService, metaAlertService, globalConfigService, 
dialogService);
   }
 
   addAlertChangedListner() {
@@ -194,7 +197,7 @@ export class TreeViewComponent extends TableViewComponent 
implements OnInit, OnC
     return this.searchService.search(searchRequest).subscribe(results => {
       this.setData(selectedGroup, results);
     }, error => {
-      
this.metronDialogBox.showConfirmationMessage(ElasticsearchUtils.extractESErrorMessage(error),
 DialogType.Error);
+      
this.dialogService.launchDialog(ElasticsearchUtils.extractESErrorMessage(error),
 DialogType.Error);
     });
   }
 
@@ -358,7 +361,7 @@ export class TreeViewComponent extends TableViewComponent 
implements OnInit, OnC
   canCreateMetaAlert(count: number) {
     if (count > MAX_ALERTS_IN_META_ALERTS) {
       let errorMessage = 'Meta Alert cannot have more than ' + 
MAX_ALERTS_IN_META_ALERTS +' alerts within it';
-      this.metronDialogBox.showConfirmationMessage(errorMessage, 
DialogType.Error).subscribe((response) => {});
+      this.dialogService.launchDialog(errorMessage, DialogType.Error);
       return false;
     }
     return true;
@@ -421,10 +424,11 @@ export class TreeViewComponent extends TableViewComponent 
implements OnInit, OnC
     if (this.canCreateMetaAlert(group.total)) {
       let confirmationMsg = 'Do you wish to create a meta alert with ' +
                             (group.total === 1 ? ' alert' : group.total + ' 
selected alerts') + '?';
-      
this.metronDialogBox.showConfirmationMessage(confirmationMsg).subscribe((response)
 => {
-        if (response) {
+      const confirmedSubscription = 
this.dialogService.launchDialog(confirmationMsg).subscribe(action => {
+        if (action === ConfirmationType.Confirmed) {
           this.doCreateMetaAlert(group, index);
         }
+        confirmedSubscription.unsubscribe();
       });
     }
 

http://git-wip-us.apache.org/repos/asf/metron/blob/8bf3b6ec/metron-interface/metron-alerts/src/app/alerts/meta-alerts/meta-alerts.component.ts
----------------------------------------------------------------------
diff --git 
a/metron-interface/metron-alerts/src/app/alerts/meta-alerts/meta-alerts.component.ts
 
b/metron-interface/metron-alerts/src/app/alerts/meta-alerts/meta-alerts.component.ts
index bcead06..7031a08 100644
--- 
a/metron-interface/metron-alerts/src/app/alerts/meta-alerts/meta-alerts.component.ts
+++ 
b/metron-interface/metron-alerts/src/app/alerts/meta-alerts/meta-alerts.component.ts
@@ -26,7 +26,6 @@ import {SearchService} from '../../service/search.service';
 import {SearchResponse} from '../../model/search-response';
 import {SortField} from '../../model/sort-field';
 import { META_ALERTS_SENSOR_TYPE } from '../../utils/constants';
-import {MetronDialogBox} from '../../shared/metron-dialog-box';
 import {MetaAlertAddRemoveRequest} from 
'../../model/meta-alert-add-remove-request';
 import {GetRequest} from '../../model/get-request';
 import { GlobalConfigService } from '../../service/global-config.service';
@@ -47,7 +46,6 @@ export class MetaAlertsComponent implements OnInit, OnDestroy 
{
               private metaAlertService: MetaAlertService,
               private updateService: UpdateService,
               private searchService: SearchService,
-              private metronDialogBox: MetronDialogBox,
               private globalConfigService: GlobalConfigService) {
   }
 

http://git-wip-us.apache.org/repos/asf/metron/blob/8bf3b6ec/metron-interface/metron-alerts/src/app/alerts/save-search/save-search.component.spec.ts
----------------------------------------------------------------------
diff --git 
a/metron-interface/metron-alerts/src/app/alerts/save-search/save-search.component.spec.ts
 
b/metron-interface/metron-alerts/src/app/alerts/save-search/save-search.component.spec.ts
index b47caca..d230b02 100644
--- 
a/metron-interface/metron-alerts/src/app/alerts/save-search/save-search.component.spec.ts
+++ 
b/metron-interface/metron-alerts/src/app/alerts/save-search/save-search.component.spec.ts
@@ -21,7 +21,7 @@ import { SaveSearchComponent } from './save-search.component';
 import { FormsModule } from '@angular/forms';
 import { Router } from '@angular/router';
 import { SaveSearchService } from '../../service/save-search.service';
-import { MetronDialogBox } from '../../shared/metron-dialog-box';
+import { DialogService } from 'app/service/dialog.service';
 
 describe('SaveSearchComponent', () => {
   let component: SaveSearchComponent;
@@ -33,7 +33,7 @@ describe('SaveSearchComponent', () => {
         FormsModule
       ],
       providers: [
-        MetronDialogBox,
+        DialogService,
         { provide: Router, useValue: {} },
         { provide: SaveSearchService, useValue: {} }
       ],

http://git-wip-us.apache.org/repos/asf/metron/blob/8bf3b6ec/metron-interface/metron-alerts/src/app/alerts/save-search/save-search.component.ts
----------------------------------------------------------------------
diff --git 
a/metron-interface/metron-alerts/src/app/alerts/save-search/save-search.component.ts
 
b/metron-interface/metron-alerts/src/app/alerts/save-search/save-search.component.ts
index b27da3a..276cb9b 100644
--- 
a/metron-interface/metron-alerts/src/app/alerts/save-search/save-search.component.ts
+++ 
b/metron-interface/metron-alerts/src/app/alerts/save-search/save-search.component.ts
@@ -20,7 +20,8 @@ import {Router} from '@angular/router';
 
 import {SaveSearchService} from '../../service/save-search.service';
 import {SaveSearch} from '../../model/save-search';
-import {MetronDialogBox} from '../../shared/metron-dialog-box';
+import { DialogService } from 'app/service/dialog.service';
+import { ConfirmationType } from 'app/model/confirmation-type';
 
 @Component({
   selector: 'app-save-search',
@@ -33,7 +34,7 @@ export class SaveSearchComponent implements OnInit {
 
   constructor(private router: Router,
               private saveSearchService: SaveSearchService,
-              private metronDialogBox: MetronDialogBox) {
+              private dialogService: DialogService) {
   }
 
   goBack() {
@@ -49,7 +50,7 @@ export class SaveSearchComponent implements OnInit {
     this.saveSearch.tableColumns = this.saveSearchService.tableColumns;
     this.saveSearch.filters = this.saveSearchService.queryBuilder.filters;
     this.saveSearch.searchRequest.query = '';
-    
+
     this.saveSearchService.saveSearch(this.saveSearch).subscribe(() => {
       this.goBack();
     }, error => {
@@ -68,11 +69,12 @@ export class SaveSearchComponent implements OnInit {
 
   update() {
     let message = 'A Search with the name \'' + this.saveSearch.name + '\' 
already exist do you wish to override it?';
-    this.metronDialogBox.showConfirmationMessage(message).subscribe(result => {
-      if (result) {
+    const confirmedSubscription = 
this.dialogService.launchDialog(message).subscribe(action => {
+      if (action === ConfirmationType.Confirmed) {
         this.saveSearch.searchRequest = 
this.saveSearchService.queryBuilder.searchRequest;
         this.saveSearchService.updateSearch(this.saveSearch).subscribe(() => { 
this.goBack(); }, error => {});
       }
+      confirmedSubscription.unsubscribe();
     });
   }
 

Reply via email to