You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ab...@apache.org on 2017/06/22 13:16:28 UTC

[01/21] ambari git commit: AMBARI-21309 Create Log Search UI application skeleton (akovalenko)

Repository: ambari
Updated Branches:
  refs/heads/branch-feature-logsearch-ui 5fc8ccc96 -> 4bfc6f13e


AMBARI-21309 Create Log Search UI application skeleton (akovalenko)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/da6ea9f5
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/da6ea9f5
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/da6ea9f5

Branch: refs/heads/branch-feature-logsearch-ui
Commit: da6ea9f54adc2b274d87d3e38bc8bec737378ea0
Parents: 5fc8ccc
Author: Aleksandr Kovalenko <ak...@hortonworks.com>
Authored: Fri Apr 7 17:37:17 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jun 22 14:51:28 2017 +0300

----------------------------------------------------------------------
 .../ambari-logsearch-web-new/.angular-cli.json  |  57 +++++++++
 .../ambari-logsearch-web-new/.editorconfig      |  13 +++
 .../ambari-logsearch-web-new/.gitignore         |  42 +++++++
 .../ambari-logsearch-web-new/README.md          |  28 +++++
 .../e2e/app.e2e-spec.ts                         |  14 +++
 .../ambari-logsearch-web-new/e2e/app.po.ts      |  11 ++
 .../e2e/tsconfig.e2e.json                       |  12 ++
 .../ambari-logsearch-web-new/karma.conf.js      |  44 +++++++
 .../ambari-logsearch-web-new/package.json       |  45 +++++++
 .../ambari-logsearch-web-new/protractor.conf.js |  30 +++++
 .../src/app/app.component.html                  |   3 +
 .../src/app/app.component.less                  |   0
 .../src/app/app.component.spec.ts               |  32 +++++
 .../src/app/app.component.ts                    |  10 ++
 .../src/app/app.module.ts                       |  20 ++++
 .../src/assets/.gitkeep                         |   0
 .../src/environments/environment.prod.ts        |   3 +
 .../src/environments/environment.ts             |   8 ++
 .../ambari-logsearch-web-new/src/favicon.ico    | Bin 0 -> 1150 bytes
 .../ambari-logsearch-web-new/src/index.html     |  14 +++
 .../ambari-logsearch-web-new/src/main.ts        |  11 ++
 .../ambari-logsearch-web-new/src/polyfills.ts   |  68 +++++++++++
 .../ambari-logsearch-web-new/src/styles.less    |   1 +
 .../ambari-logsearch-web-new/src/test.ts        |  32 +++++
 .../src/tsconfig.app.json                       |  13 +++
 .../src/tsconfig.spec.json                      |  20 ++++
 .../ambari-logsearch-web-new/src/typings.d.ts   |   5 +
 .../ambari-logsearch-web-new/tsconfig.json      |  20 ++++
 .../ambari-logsearch-web-new/tslint.json        | 116 +++++++++++++++++++
 29 files changed, 672 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/.angular-cli.json
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/.angular-cli.json b/ambari-logsearch/ambari-logsearch-web-new/.angular-cli.json
new file mode 100644
index 0000000..7b5c13b
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/.angular-cli.json
@@ -0,0 +1,57 @@
+{
+  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
+  "project": {
+    "name": "ambari-logsearch-web-new"
+  },
+  "apps": [
+    {
+      "root": "src",
+      "outDir": "dist",
+      "assets": [
+        "assets",
+        "favicon.ico"
+      ],
+      "index": "index.html",
+      "main": "main.ts",
+      "polyfills": "polyfills.ts",
+      "test": "test.ts",
+      "tsconfig": "tsconfig.app.json",
+      "testTsconfig": "tsconfig.spec.json",
+      "prefix": "app",
+      "styles": [
+        "styles.less"
+      ],
+      "scripts": [],
+      "environmentSource": "environments/environment.ts",
+      "environments": {
+        "dev": "environments/environment.ts",
+        "prod": "environments/environment.prod.ts"
+      }
+    }
+  ],
+  "e2e": {
+    "protractor": {
+      "config": "./protractor.conf.js"
+    }
+  },
+  "lint": [
+    {
+      "project": "src/tsconfig.app.json"
+    },
+    {
+      "project": "src/tsconfig.spec.json"
+    },
+    {
+      "project": "e2e/tsconfig.e2e.json"
+    }
+  ],
+  "test": {
+    "karma": {
+      "config": "./karma.conf.js"
+    }
+  },
+  "defaults": {
+    "styleExt": "less",
+    "component": {}
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/.editorconfig
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/.editorconfig b/ambari-logsearch/ambari-logsearch-web-new/.editorconfig
new file mode 100644
index 0000000..6e87a00
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/.editorconfig
@@ -0,0 +1,13 @@
+# Editor configuration, see http://editorconfig.org
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.md]
+max_line_length = off
+trim_trailing_whitespace = false

http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/.gitignore
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/.gitignore b/ambari-logsearch/ambari-logsearch-web-new/.gitignore
new file mode 100644
index 0000000..54bfd20
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/.gitignore
@@ -0,0 +1,42 @@
+# See http://help.github.com/ignore-files/ for more about ignoring files.
+
+# compiled output
+/dist
+/tmp
+/out-tsc
+
+# dependencies
+/node_modules
+
+# IDEs and editors
+/.idea
+.project
+.classpath
+.c9/
+*.launch
+.settings/
+*.sublime-workspace
+
+# IDE - VSCode
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+
+# misc
+/.sass-cache
+/connect.lock
+/coverage
+/libpeerconnection.log
+npm-debug.log
+testem.log
+/typings
+
+# e2e
+/e2e/*.js
+/e2e/*.map
+
+# System Files
+.DS_Store
+Thumbs.db

http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/README.md
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/README.md b/ambari-logsearch/ambari-logsearch-web-new/README.md
new file mode 100644
index 0000000..2fb07fb
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/README.md
@@ -0,0 +1,28 @@
+# AmbariLogsearchWebNew
+
+This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.0.0.
+
+## Development server
+
+Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files.
+
+## Code scaffolding
+
+Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive/pipe/service/class/module`.
+
+## Build
+
+Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `-prod` flag for a production build.
+
+## Running unit tests
+
+Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
+
+## Running end-to-end tests
+
+Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/).
+Before running the tests make sure you are serving the app via `ng serve`.
+
+## Further help
+
+To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md).

http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/e2e/app.e2e-spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/e2e/app.e2e-spec.ts b/ambari-logsearch/ambari-logsearch-web-new/e2e/app.e2e-spec.ts
new file mode 100644
index 0000000..a9f0798
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/e2e/app.e2e-spec.ts
@@ -0,0 +1,14 @@
+import { AmbariLogsearchWebNewPage } from './app.po';
+
+describe('ambari-logsearch-web-new App', () => {
+  let page: AmbariLogsearchWebNewPage;
+
+  beforeEach(() => {
+    page = new AmbariLogsearchWebNewPage();
+  });
+
+  it('should display message saying app works', () => {
+    page.navigateTo();
+    expect(page.getParagraphText()).toEqual('app works!');
+  });
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/e2e/app.po.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/e2e/app.po.ts b/ambari-logsearch/ambari-logsearch-web-new/e2e/app.po.ts
new file mode 100644
index 0000000..0dab904
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/e2e/app.po.ts
@@ -0,0 +1,11 @@
+import { browser, element, by } from 'protractor';
+
+export class AmbariLogsearchWebNewPage {
+  navigateTo() {
+    return browser.get('/');
+  }
+
+  getParagraphText() {
+    return element(by.css('app-root h1')).getText();
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/e2e/tsconfig.e2e.json
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/e2e/tsconfig.e2e.json b/ambari-logsearch/ambari-logsearch-web-new/e2e/tsconfig.e2e.json
new file mode 100644
index 0000000..ac7a373
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/e2e/tsconfig.e2e.json
@@ -0,0 +1,12 @@
+{
+  "extends": "../tsconfig.json",
+  "compilerOptions": {
+    "outDir": "../out-tsc/e2e",
+    "module": "commonjs",
+    "target": "es5",
+    "types":[
+      "jasmine",
+      "node"
+    ]
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/karma.conf.js
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/karma.conf.js b/ambari-logsearch/ambari-logsearch-web-new/karma.conf.js
new file mode 100644
index 0000000..84b4cd5
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/karma.conf.js
@@ -0,0 +1,44 @@
+// Karma configuration file, see link for more information
+// https://karma-runner.github.io/0.13/config/configuration-file.html
+
+module.exports = function (config) {
+  config.set({
+    basePath: '',
+    frameworks: ['jasmine', '@angular/cli'],
+    plugins: [
+      require('karma-jasmine'),
+      require('karma-chrome-launcher'),
+      require('karma-jasmine-html-reporter'),
+      require('karma-coverage-istanbul-reporter'),
+      require('@angular/cli/plugins/karma')
+    ],
+    client:{
+      clearContext: false // leave Jasmine Spec Runner output visible in browser
+    },
+    files: [
+      { pattern: './src/test.ts', watched: false }
+    ],
+    preprocessors: {
+      './src/test.ts': ['@angular/cli']
+    },
+    mime: {
+      'text/x-typescript': ['ts','tsx']
+    },
+    coverageIstanbulReporter: {
+      reports: [ 'html', 'lcovonly' ],
+      fixWebpackSourcePaths: true
+    },
+    angularCli: {
+      environment: 'dev'
+    },
+    reporters: config.angularCli && config.angularCli.codeCoverage
+              ? ['progress', 'coverage-istanbul']
+              : ['progress', 'kjhtml'],
+    port: 9876,
+    colors: true,
+    logLevel: config.LOG_INFO,
+    autoWatch: true,
+    browsers: ['Chrome'],
+    singleRun: false
+  });
+};

http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/package.json
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/package.json b/ambari-logsearch/ambari-logsearch-web-new/package.json
new file mode 100644
index 0000000..f13d358
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/package.json
@@ -0,0 +1,45 @@
+{
+  "name": "ambari-logsearch-web",
+  "version": "3.0.0",
+  "license": "Apache 2.0",
+  "scripts": {
+    "ng": "ng",
+    "start": "ng serve",
+    "build": "ng build",
+    "test": "ng test",
+    "lint": "ng lint",
+    "e2e": "ng e2e"
+  },
+  "dependencies": {
+    "@angular/common": "^4.0.0",
+    "@angular/compiler": "^4.0.0",
+    "@angular/core": "^4.0.0",
+    "@angular/forms": "^4.0.0",
+    "@angular/http": "^4.0.0",
+    "@angular/platform-browser": "^4.0.0",
+    "@angular/platform-browser-dynamic": "^4.0.0",
+    "@angular/router": "^4.0.0",
+    "core-js": "^2.4.1",
+    "rxjs": "^5.1.0",
+    "zone.js": "^0.8.4"
+  },
+  "devDependencies": {
+    "@angular/cli": "1.0.0",
+    "@angular/compiler-cli": "^4.0.0",
+    "@types/jasmine": "2.5.38",
+    "@types/node": "~6.0.60",
+    "codelyzer": "~2.0.0",
+    "jasmine-core": "~2.5.2",
+    "jasmine-spec-reporter": "~3.2.0",
+    "karma": "~1.4.1",
+    "karma-chrome-launcher": "~2.0.0",
+    "karma-cli": "~1.0.1",
+    "karma-jasmine": "~1.1.0",
+    "karma-jasmine-html-reporter": "^0.2.2",
+    "karma-coverage-istanbul-reporter": "^0.2.0",
+    "protractor": "~5.1.0",
+    "ts-node": "~2.0.0",
+    "tslint": "~4.5.0",
+    "typescript": "~2.2.0"
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/protractor.conf.js
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/protractor.conf.js b/ambari-logsearch/ambari-logsearch-web-new/protractor.conf.js
new file mode 100644
index 0000000..1c5e1e5
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/protractor.conf.js
@@ -0,0 +1,30 @@
+// Protractor configuration file, see link for more information
+// https://github.com/angular/protractor/blob/master/lib/config.ts
+
+const { SpecReporter } = require('jasmine-spec-reporter');
+
+exports.config = {
+  allScriptsTimeout: 11000,
+  specs: [
+    './e2e/**/*.e2e-spec.ts'
+  ],
+  capabilities: {
+    'browserName': 'chrome'
+  },
+  directConnect: true,
+  baseUrl: 'http://localhost:4200/',
+  framework: 'jasmine',
+  jasmineNodeOpts: {
+    showColors: true,
+    defaultTimeoutInterval: 30000,
+    print: function() {}
+  },
+  beforeLaunch: function() {
+    require('ts-node').register({
+      project: 'e2e/tsconfig.e2e.json'
+    });
+  },
+  onPrepare() {
+    jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
+  }
+};

http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html
new file mode 100644
index 0000000..b6931b5
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html
@@ -0,0 +1,3 @@
+<h1>
+  {{title}}
+</h1>

http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
new file mode 100644
index 0000000..e69de29

http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.spec.ts
new file mode 100644
index 0000000..c740bcd
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.spec.ts
@@ -0,0 +1,32 @@
+import { TestBed, async } from '@angular/core/testing';
+
+import { AppComponent } from './app.component';
+
+describe('AppComponent', () => {
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [
+        AppComponent
+      ],
+    }).compileComponents();
+  }));
+
+  it('should create the app', async(() => {
+    const fixture = TestBed.createComponent(AppComponent);
+    const app = fixture.debugElement.componentInstance;
+    expect(app).toBeTruthy();
+  }));
+
+  it(`should have as title 'app works!'`, async(() => {
+    const fixture = TestBed.createComponent(AppComponent);
+    const app = fixture.debugElement.componentInstance;
+    expect(app.title).toEqual('app works!');
+  }));
+
+  it('should render title in a h1 tag', async(() => {
+    const fixture = TestBed.createComponent(AppComponent);
+    fixture.detectChanges();
+    const compiled = fixture.debugElement.nativeElement;
+    expect(compiled.querySelector('h1').textContent).toContain('app works!');
+  }));
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts
new file mode 100644
index 0000000..3ffdc2e
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts
@@ -0,0 +1,10 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-root',
+  templateUrl: './app.component.html',
+  styleUrls: ['./app.component.less']
+})
+export class AppComponent {
+  title = 'Ambari Log Search';
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
new file mode 100644
index 0000000..67ae491
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
@@ -0,0 +1,20 @@
+import { BrowserModule } from '@angular/platform-browser';
+import { NgModule } from '@angular/core';
+import { FormsModule } from '@angular/forms';
+import { HttpModule } from '@angular/http';
+
+import { AppComponent } from './app.component';
+
+@NgModule({
+  declarations: [
+    AppComponent
+  ],
+  imports: [
+    BrowserModule,
+    FormsModule,
+    HttpModule
+  ],
+  providers: [],
+  bootstrap: [AppComponent]
+})
+export class AppModule { }

http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/src/assets/.gitkeep
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/assets/.gitkeep b/ambari-logsearch/ambari-logsearch-web-new/src/assets/.gitkeep
new file mode 100644
index 0000000..e69de29

http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.prod.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.prod.ts b/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.prod.ts
new file mode 100644
index 0000000..3612073
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.prod.ts
@@ -0,0 +1,3 @@
+export const environment = {
+  production: true
+};

http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.ts b/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.ts
new file mode 100644
index 0000000..b7f639a
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.ts
@@ -0,0 +1,8 @@
+// The file contents for the current environment will overwrite these during build.
+// The build system defaults to the dev environment which uses `environment.ts`, but if you do
+// `ng build --env=prod` then `environment.prod.ts` will be used instead.
+// The list of which env maps to which file can be found in `.angular-cli.json`.
+
+export const environment = {
+  production: false
+};

http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/src/favicon.ico
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/favicon.ico b/ambari-logsearch/ambari-logsearch-web-new/src/favicon.ico
new file mode 100644
index 0000000..62604cb
Binary files /dev/null and b/ambari-logsearch/ambari-logsearch-web-new/src/favicon.ico differ

http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/src/index.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/index.html b/ambari-logsearch/ambari-logsearch-web-new/src/index.html
new file mode 100644
index 0000000..b067fe4
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/index.html
@@ -0,0 +1,14 @@
+<!doctype html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>LogSearch</title>
+  <base href="/">
+
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+  <link rel="icon" type="image/x-icon" href="favicon.ico">
+</head>
+<body>
+  <app-root>Loading...</app-root>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/src/main.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/main.ts b/ambari-logsearch/ambari-logsearch-web-new/src/main.ts
new file mode 100644
index 0000000..a9ca1ca
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/main.ts
@@ -0,0 +1,11 @@
+import { enableProdMode } from '@angular/core';
+import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
+
+import { AppModule } from './app/app.module';
+import { environment } from './environments/environment';
+
+if (environment.production) {
+  enableProdMode();
+}
+
+platformBrowserDynamic().bootstrapModule(AppModule);

http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/src/polyfills.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/polyfills.ts b/ambari-logsearch/ambari-logsearch-web-new/src/polyfills.ts
new file mode 100644
index 0000000..53bdaf1
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/polyfills.ts
@@ -0,0 +1,68 @@
+/**
+ * This file includes polyfills needed by Angular and is loaded before the app.
+ * You can add your own extra polyfills to this file.
+ *
+ * This file is divided into 2 sections:
+ *   1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.
+ *   2. Application imports. Files imported after ZoneJS that should be loaded before your main
+ *      file.
+ *
+ * The current setup is for so-called "evergreen" browsers; the last versions of browsers that
+ * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera),
+ * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.
+ *
+ * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html
+ */
+
+/***************************************************************************************************
+ * BROWSER POLYFILLS
+ */
+
+/** IE9, IE10 and IE11 requires all of the following polyfills. **/
+// import 'core-js/es6/symbol';
+// import 'core-js/es6/object';
+// import 'core-js/es6/function';
+// import 'core-js/es6/parse-int';
+// import 'core-js/es6/parse-float';
+// import 'core-js/es6/number';
+// import 'core-js/es6/math';
+// import 'core-js/es6/string';
+// import 'core-js/es6/date';
+// import 'core-js/es6/array';
+// import 'core-js/es6/regexp';
+// import 'core-js/es6/map';
+// import 'core-js/es6/set';
+
+/** IE10 and IE11 requires the following for NgClass support on SVG elements */
+// import 'classlist.js';  // Run `npm install --save classlist.js`.
+
+/** IE10 and IE11 requires the following to support `@angular/animation`. */
+// import 'web-animations-js';  // Run `npm install --save web-animations-js`.
+
+
+/** Evergreen browsers require these. **/
+import 'core-js/es6/reflect';
+import 'core-js/es7/reflect';
+
+
+/** ALL Firefox browsers require the following to support `@angular/animation`. **/
+// import 'web-animations-js';  // Run `npm install --save web-animations-js`.
+
+
+
+/***************************************************************************************************
+ * Zone JS is required by Angular itself.
+ */
+import 'zone.js/dist/zone';  // Included with Angular CLI.
+
+
+
+/***************************************************************************************************
+ * APPLICATION IMPORTS
+ */
+
+/**
+ * Date, currency, decimal and percent pipes.
+ * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10
+ */
+// import 'intl';  // Run `npm install --save intl`.

http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/styles.less b/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
new file mode 100644
index 0000000..90d4ee0
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
@@ -0,0 +1 @@
+/* You can add global styles to this file, and also import other style files */

http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/src/test.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/test.ts b/ambari-logsearch/ambari-logsearch-web-new/src/test.ts
new file mode 100644
index 0000000..9bf7226
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/test.ts
@@ -0,0 +1,32 @@
+// This file is required by karma.conf.js and loads recursively all the .spec and framework files
+
+import 'zone.js/dist/long-stack-trace-zone';
+import 'zone.js/dist/proxy.js';
+import 'zone.js/dist/sync-test';
+import 'zone.js/dist/jasmine-patch';
+import 'zone.js/dist/async-test';
+import 'zone.js/dist/fake-async-test';
+import { getTestBed } from '@angular/core/testing';
+import {
+  BrowserDynamicTestingModule,
+  platformBrowserDynamicTesting
+} from '@angular/platform-browser-dynamic/testing';
+
+// Unfortunately there's no typing for the `__karma__` variable. Just declare it as any.
+declare var __karma__: any;
+declare var require: any;
+
+// Prevent Karma from running prematurely.
+__karma__.loaded = function () {};
+
+// First, initialize the Angular testing environment.
+getTestBed().initTestEnvironment(
+  BrowserDynamicTestingModule,
+  platformBrowserDynamicTesting()
+);
+// Then we find all the tests.
+const context = require.context('./', true, /\.spec\.ts$/);
+// And load the modules.
+context.keys().map(context);
+// Finally, start Karma to run the tests.
+__karma__.start();

http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/src/tsconfig.app.json
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/tsconfig.app.json b/ambari-logsearch/ambari-logsearch-web-new/src/tsconfig.app.json
new file mode 100644
index 0000000..5e2507d
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/tsconfig.app.json
@@ -0,0 +1,13 @@
+{
+  "extends": "../tsconfig.json",
+  "compilerOptions": {
+    "outDir": "../out-tsc/app",
+    "module": "es2015",
+    "baseUrl": "",
+    "types": []
+  },
+  "exclude": [
+    "test.ts",
+    "**/*.spec.ts"
+  ]
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/src/tsconfig.spec.json
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/tsconfig.spec.json b/ambari-logsearch/ambari-logsearch-web-new/src/tsconfig.spec.json
new file mode 100644
index 0000000..510e3f1
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/tsconfig.spec.json
@@ -0,0 +1,20 @@
+{
+  "extends": "../tsconfig.json",
+  "compilerOptions": {
+    "outDir": "../out-tsc/spec",
+    "module": "commonjs",
+    "target": "es5",
+    "baseUrl": "",
+    "types": [
+      "jasmine",
+      "node"
+    ]
+  },
+  "files": [
+    "test.ts"
+  ],
+  "include": [
+    "**/*.spec.ts",
+    "**/*.d.ts"
+  ]
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/src/typings.d.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/typings.d.ts b/ambari-logsearch/ambari-logsearch-web-new/src/typings.d.ts
new file mode 100644
index 0000000..ef5c7bd
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/typings.d.ts
@@ -0,0 +1,5 @@
+/* SystemJS module definition */
+declare var module: NodeModule;
+interface NodeModule {
+  id: string;
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/tsconfig.json
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/tsconfig.json b/ambari-logsearch/ambari-logsearch-web-new/tsconfig.json
new file mode 100644
index 0000000..a35a8ee
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/tsconfig.json
@@ -0,0 +1,20 @@
+{
+  "compileOnSave": false,
+  "compilerOptions": {
+    "outDir": "./dist/out-tsc",
+    "baseUrl": "src",
+    "sourceMap": true,
+    "declaration": false,
+    "moduleResolution": "node",
+    "emitDecoratorMetadata": true,
+    "experimentalDecorators": true,
+    "target": "es5",
+    "typeRoots": [
+      "node_modules/@types"
+    ],
+    "lib": [
+      "es2016",
+      "dom"
+    ]
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/tslint.json
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/tslint.json b/ambari-logsearch/ambari-logsearch-web-new/tslint.json
new file mode 100644
index 0000000..9113f13
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/tslint.json
@@ -0,0 +1,116 @@
+{
+  "rulesDirectory": [
+    "node_modules/codelyzer"
+  ],
+  "rules": {
+    "callable-types": true,
+    "class-name": true,
+    "comment-format": [
+      true,
+      "check-space"
+    ],
+    "curly": true,
+    "eofline": true,
+    "forin": true,
+    "import-blacklist": [true, "rxjs"],
+    "import-spacing": true,
+    "indent": [
+      true,
+      "spaces"
+    ],
+    "interface-over-type-literal": true,
+    "label-position": true,
+    "max-line-length": [
+      true,
+      140
+    ],
+    "member-access": false,
+    "member-ordering": [
+      true,
+      "static-before-instance",
+      "variables-before-functions"
+    ],
+    "no-arg": true,
+    "no-bitwise": true,
+    "no-console": [
+      true,
+      "debug",
+      "info",
+      "time",
+      "timeEnd",
+      "trace"
+    ],
+    "no-construct": true,
+    "no-debugger": true,
+    "no-duplicate-variable": true,
+    "no-empty": false,
+    "no-empty-interface": true,
+    "no-eval": true,
+    "no-inferrable-types": [true, "ignore-params"],
+    "no-shadowed-variable": true,
+    "no-string-literal": false,
+    "no-string-throw": true,
+    "no-switch-case-fall-through": true,
+    "no-trailing-whitespace": true,
+    "no-unused-expression": true,
+    "no-use-before-declare": true,
+    "no-var-keyword": true,
+    "object-literal-sort-keys": false,
+    "one-line": [
+      true,
+      "check-open-brace",
+      "check-catch",
+      "check-else",
+      "check-whitespace"
+    ],
+    "prefer-const": true,
+    "quotemark": [
+      true,
+      "single"
+    ],
+    "radix": true,
+    "semicolon": [
+      "always"
+    ],
+    "triple-equals": [
+      true,
+      "allow-null-check"
+    ],
+    "typedef-whitespace": [
+      true,
+      {
+        "call-signature": "nospace",
+        "index-signature": "nospace",
+        "parameter": "nospace",
+        "property-declaration": "nospace",
+        "variable-declaration": "nospace"
+      }
+    ],
+    "typeof-compare": true,
+    "unified-signatures": true,
+    "variable-name": false,
+    "whitespace": [
+      true,
+      "check-branch",
+      "check-decl",
+      "check-operator",
+      "check-separator",
+      "check-type"
+    ],
+
+    "directive-selector": [true, "attribute", "app", "camelCase"],
+    "component-selector": [true, "element", "app", "kebab-case"],
+    "use-input-property-decorator": true,
+    "use-output-property-decorator": true,
+    "use-host-property-decorator": true,
+    "no-input-rename": true,
+    "no-output-rename": true,
+    "use-life-cycle-interface": true,
+    "use-pipe-transform-interface": true,
+    "component-class-suffix": true,
+    "directive-class-suffix": true,
+    "no-access-missing-member": true,
+    "templates-use-public": true,
+    "invoke-injectable": true
+  }
+}


[18/21] ambari git commit: AMBARI-21321 Log Search UI: fix mock data service. (ababiichuk)

Posted by ab...@apache.org.
AMBARI-21321 Log Search UI: fix mock data service. (ababiichuk)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/56681d79
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/56681d79
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/56681d79

Branch: refs/heads/branch-feature-logsearch-ui
Commit: 56681d79f25cbd98f70be8d23f3ae46619a90707
Parents: c3d8e31
Author: ababiichuk <ab...@hortonworks.com>
Authored: Fri Jun 16 15:05:09 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jun 22 15:44:46 2017 +0300

----------------------------------------------------------------------
 .../accordion-panel.component.less              |    2 +-
 .../accordion-panel.component.spec.ts           |    2 +-
 .../accordion-panel.component.ts                |    2 +-
 .../src/app/app.component.less                  |    2 +-
 .../src/app/app.module.ts                       |   38 +-
 .../filter-dropdown.component.less              |    2 +-
 .../filter-dropdown.component.spec.ts           |    2 +-
 .../filter-dropdown.component.ts                |    2 +-
 .../filter-text-field.component.less            |    2 +-
 .../filter-text-field.component.spec.ts         |    2 +-
 .../filter-text-field.component.ts              |    2 +-
 .../app/login-form/login-form.component.less    |    2 +-
 .../src/app/logs-list/logs-list.component.less  |    2 +-
 .../app/logs-list/logs-list.component.spec.ts   |    2 +-
 .../src/app/logs-list/logs-list.component.ts    |    2 +-
 .../app/menu-button/menu-button.component.less  |    2 +-
 .../src/app/services/http-client.service.ts     |    4 +-
 .../app/services/mock-api-data.service.spec.ts  |   81 ++
 .../src/app/services/mock-api-data.service.ts   | 1260 +++++++++---------
 .../src/app/top-menu/top-menu.component.less    |    2 +-
 20 files changed, 788 insertions(+), 627 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.less
index f3630bb..8366952 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.less
@@ -1,4 +1,4 @@
-/*
+/**
  * 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.

http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.spec.ts
index d1b185e..3706d51 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.spec.ts
@@ -1,4 +1,4 @@
-/*
+/**
  * 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.

http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.ts
index ae7fd7e..e48349e 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.ts
@@ -1,4 +1,4 @@
-/*
+/**
  * 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.

http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
index fba0ae6..f948b12 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
@@ -1,4 +1,4 @@
-/*
+/**
  * 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.

http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
index 659172d..6670082 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
@@ -17,15 +17,16 @@
  */
 
 import {BrowserModule} from '@angular/platform-browser';
-import {NgModule, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
+import {NgModule, CUSTOM_ELEMENTS_SCHEMA, Injector} from '@angular/core';
 import {FormsModule} from '@angular/forms';
-import {HttpModule, Http} from '@angular/http';
-import {InMemoryWebApiModule} from 'angular-in-memory-web-api';
-import {mockApiDataService} from './services/mock-api-data.service'
+import {HttpModule, Http, XHRBackend, BrowserXhr, ResponseOptions, XSRFStrategy} from '@angular/http';
+import {InMemoryBackendService} from 'angular-in-memory-web-api';
 import {AlertModule} from 'ngx-bootstrap';
 import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
 import {TranslateHttpLoader} from '@ngx-translate/http-loader';
 import {StoreModule} from '@ngrx/store';
+import {environment} from '../environments/environment';
+import {mockApiDataService} from '@app/services/mock-api-data.service'
 import {HttpClientService} from '@app/services/http-client.service';
 import {ComponentActionsService} from '@app/services/component-actions.service';
 import {FilteringService} from '@app/services/filtering.service';
@@ -51,7 +52,23 @@ import {AccordionPanelComponent} from '@app/accordion-panel/accordion-panel.comp
 import {LogsListComponent} from '@app/logs-list/logs-list.component';
 
 export function HttpLoaderFactory(http: Http) {
-  return new TranslateHttpLoader(http, 'assets/i18n/', '.json');
+  // adding 'static' parameter to step over mock data request
+  return new TranslateHttpLoader(http, 'assets/i18n/', '.json?static=true');
+}
+
+export function getXHRBackend(injector: Injector, browser: BrowserXhr, xsrf: XSRFStrategy, options: ResponseOptions): any {
+  if (environment.production) {
+    return new XHRBackend(browser, options, xsrf);
+  } else {
+    return new InMemoryBackendService(
+      injector,
+      new mockApiDataService(),
+      {
+        passThruUnknownUrl: true,
+        rootPath: ''
+      }
+    );
+  }
 }
 
 @NgModule({
@@ -72,10 +89,6 @@ export function HttpLoaderFactory(http: Http) {
     BrowserModule,
     FormsModule,
     HttpModule,
-    InMemoryWebApiModule.forRoot(mockApiDataService, {
-      passThruUnknownUrl: true,
-      rootPath: ''
-    }),
     AlertModule.forRoot(),
     TranslateModule.forRoot({
       loader: {
@@ -104,7 +117,12 @@ export function HttpLoaderFactory(http: Http) {
     GraphsService,
     NodesService,
     UserConfigsService,
-    FiltersService
+    FiltersService,
+    {
+      provide: XHRBackend,
+      useFactory: getXHRBackend,
+      deps: [Injector, BrowserXhr, XSRFStrategy, ResponseOptions]
+    }
   ],
   bootstrap: [AppComponent],
   schemas: [CUSTOM_ELEMENTS_SCHEMA]

http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.less
index 2c97a17..ec8e84b 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.less
@@ -1,4 +1,4 @@
-/*
+/**
  * 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.

http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.spec.ts
index 49eaf1f..ba0bd03 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.spec.ts
@@ -1,4 +1,4 @@
-/*
+/**
  * 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.

http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.ts
index 65446da..de6e79b 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.ts
@@ -1,4 +1,4 @@
-/*
+/**
  * 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.

http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.less
index 3a9dcac..1395959 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.less
@@ -1,4 +1,4 @@
-/*
+/**
  * 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.

http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.spec.ts
index d1df7b0..c54171a 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.spec.ts
@@ -1,4 +1,4 @@
-/*
+/**
  * 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.

http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.ts
index c86d4cb..6bab2e6 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.ts
@@ -1,4 +1,4 @@
-/*
+/**
  * 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.

http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.less
index b84296a..f760ee8 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.less
@@ -1,4 +1,4 @@
-/*
+/**
  * 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.

http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.less
index 1179e55..6bf54fe 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.less
@@ -1,4 +1,4 @@
-/*
+/**
  * 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.

http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.spec.ts
index 6442864..53cdee6 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.spec.ts
@@ -1,4 +1,4 @@
-/*
+/**
  * 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.

http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.ts
index 107fb0d..5fd0ce5 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.ts
@@ -1,4 +1,4 @@
-/*
+/**
  * 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.

http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.less
index d6024c2..6a3a43d 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.less
@@ -1,4 +1,4 @@
-/*
+/**
  * 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.

http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts
index 2b69f45..84f82b3 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts
@@ -21,7 +21,6 @@ import {Observable} from 'rxjs/Observable';
 import {Http, XHRBackend, Request, RequestOptions, RequestOptionsArgs, Response} from '@angular/http';
 import 'rxjs/add/operator/map';
 import 'rxjs/add/operator/catch';
-import {environment} from '@app/../environments/environment';
 
 @Injectable()
 export class HttpClientService extends Http {
@@ -75,8 +74,7 @@ export class HttpClientService extends Http {
   }
 
   post(url: string, body: any, options?: RequestOptionsArgs):Observable<Response> {
-    return environment.production ?
-      super.post(this.generateUrlString(url), body, options) : super.get(this.generateUrlString(url), options);
+    return super.post(this.generateUrlString(url), body, options);
   }
 
   put(url: string, body: any, options?: RequestOptionsArgs):Observable<Response> {

http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.spec.ts
new file mode 100644
index 0000000..410f70d
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.spec.ts
@@ -0,0 +1,81 @@
+/**
+ * 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.
+ */
+
+import {TestBed, inject} from '@angular/core/testing';
+import {mockApiDataService} from './mock-api-data.service';
+
+describe('mockApiDataService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [mockApiDataService]
+    });
+  });
+
+  it('should create service', inject([mockApiDataService], (service: mockApiDataService) => {
+    expect(service).toBeTruthy();
+  }));
+
+  describe('#parseUrl()', () => {
+    const cases = [
+      {
+        url: 'root',
+        base: '/',
+        collectionName: 'root',
+        query: '',
+        title: 'one-level depth url, no query params'
+      },
+      {
+        url: 'root?param0=1&param1=2',
+        base: '/',
+        collectionName: 'root',
+        query: 'param0=1&param1=2',
+        title: 'one-level depth url with query params'
+      },
+      {
+        url: 'root/resources/collection',
+        base: 'root/resources/',
+        collectionName: 'collection',
+        query: '',
+        title: 'more than one-level depth url, no query params'
+      },
+      {
+        url: 'root/resources/collection?param0=1&param1=2',
+        base: 'root/resources/',
+        collectionName: 'collection',
+        query: 'param0=1&param1=2',
+        title: 'more than one-level depth url with query params'
+      }
+    ];
+
+    cases.forEach(test => {
+      describe(test.title, () => {
+        it('base', inject([mockApiDataService], (service: mockApiDataService) => {
+          expect(service.parseUrl(test.url).base).toEqual(test.base);
+        }));
+
+        it('collectionName', inject([mockApiDataService], (service: mockApiDataService) => {
+          expect(service.parseUrl(test.url).collectionName).toEqual(test.collectionName);
+        }));
+
+        it('query', inject([mockApiDataService], (service: mockApiDataService) => {
+          expect(service.parseUrl(test.url).query.toString()).toEqual(test.query);
+        }));
+      });
+    });
+  });
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
index ff2ed2c..a6215e6 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
@@ -16,350 +16,398 @@
  * limitations under the License.
  */
 
-import {InMemoryDbService} from 'angular-in-memory-web-api';
+import {URLSearchParams, Response, ResponseOptions} from '@angular/http';
+import {InMemoryDbService, InMemoryBackendService, createErrorResponse} from 'angular-in-memory-web-api';
+import {Observable} from 'rxjs/Observable';
+import {Subscriber} from 'rxjs/Subscriber';
+
+export class mockBackendService extends InMemoryBackendService {
+  getLocation(url: string): any {
+    return super.getLocation(url);
+  }
+}
 
 export class mockApiDataService implements InMemoryDbService {
+
+  parseUrl(url: string): any {
+    const urlLocation = mockBackendService.prototype.getLocation(url),
+      query = urlLocation.search && new URLSearchParams(urlLocation.search.substr(1)),
+      splitUrl = urlLocation.pathname.substr(1).split('/'),
+      urlPartsCount = splitUrl.length,
+      collectionName = splitUrl[urlPartsCount - 1],
+      base = splitUrl.slice(0, urlPartsCount - 1).join('/') + '/';
+    return {
+      base: base,
+      collectionName: collectionName,
+      query: query
+    };
+  }
+
+  get(interceptorArgs: any): Observable<Response> {
+    const query = interceptorArgs.requestInfo.query,
+      path = interceptorArgs.requestInfo.base + interceptorArgs.requestInfo.collectionName,
+      pathArray = path.split('/').filter(part => part !== '');
+    if (query && query.paramsMap.has('static') && interceptorArgs.passThruBackend) {
+      return interceptorArgs.passThruBackend.createConnection(interceptorArgs.requestInfo.req).response;
+    } else {
+      let is404 = false;
+      const data = pathArray.reduce((currentObject, currentKey, index, array) => {
+        if (!currentObject && index < array.length - 1) {
+          return {};
+        } else if (currentObject.hasOwnProperty(currentKey)) {
+          return currentObject[currentKey];
+        } else {
+          is404 = true;
+          return {};
+        }
+      }, interceptorArgs.db);
+      if (is404) {
+        return new Observable<Response>((subscriber: Subscriber<Response>) => subscriber.error(new Response(createErrorResponse(
+          interceptorArgs.requestInfo.req, 404, 'Not found'
+        ))));
+      } else {
+        return new Observable<Response>((subscriber: Subscriber<Response>) => subscriber.next(new Response(new ResponseOptions({
+          status: 200,
+          body: data
+        }))));
+      }
+    }
+  }
+
+  post(interceptorArgs: any) {
+    // TODO implement posting data to mock object except login call
+    return this.get(interceptorArgs);
+  }
+
   createDb() {
     return {
       login: {},
-      audit: {
-        logs: {
-          logList: [
-            {
-              policy: 'policy',
-              reason: 'Authentication required',
-              result: 0,
-              text: 'Please log in',
-              tags: [
-                'ambari_agent'
-              ],
-              resource: '/ambari-agent',
-              sess: '0',
-              access: '0',
-              logType: 'AmbariAudit',
-              tags_str: 'ambari_agent',
-              resType: 'agent',
-              reqUser: 'admin',
-              reqData: 'data',
-              repoType: 1,
-              repo: 'ambari',
-              proxyUsers: [
-                'admin'
-              ],
-              evtTime: '2017-05-29T11:30:22.531Z',
-              enforcer: 'ambari-acl',
-              reqContext: 'ambari',
-              cliType: 'GET',
-              cliIP: '192.168.0.1',
-              agent: 'agent',
-              agentHost: 'localhost',
-              action: 'SERVICE_CHECK',
-              type: 'ambari-audit',
-              _version_: 2,
-              id: 'id0',
-              file: 'ambari-agent.log',
-              seq_num: 3,
-              bundle_id: 'b0',
-              case_id: 'c0',
-              log_message: 'User(admin), Operation(SERVICE_CHECK)',
-              logfile_line_number: 4,
-              message_md5: '12345678900987654321',
-              cluster: 'cl0',
-              event_count: 0,
-              event_md5: '09876543211234567890',
-              event_dur_ms: 100,
-              _ttl_: "+7DAYS",
-              _expire_at_: '2017-05-29T11:30:22.531Z',
-              _router_field_: 5
-            },
-            {
-              policy: 'policy',
-              reason: 'Server error',
-              result: 1,
-              text: 'Something went wrong',
-              tags: [
-                'ambari_agent'
-              ],
-              resource: '/ambari-agent',
-              sess: '1',
-              access: '1',
-              logType: 'AmbariAudit',
-              tags_str: 'ambari_server',
-              resType: 'server',
-              reqUser: 'user',
-              reqData: 'data',
-              repoType: 1,
-              repo: 'ambari',
-              proxyUsers: [
-                'user'
+      api: {
+        v1: {
+          audit: {
+            logs: {
+              logList: [
+                {
+                  policy: 'policy',
+                  reason: 'Authentication required',
+                  result: 0,
+                  text: 'Please log in',
+                  tags: [
+                    'ambari_agent'
+                  ],
+                  resource: '/ambari-agent',
+                  sess: '0',
+                  access: '0',
+                  logType: 'AmbariAudit',
+                  tags_str: 'ambari_agent',
+                  resType: 'agent',
+                  reqUser: 'admin',
+                  reqData: 'data',
+                  repoType: 1,
+                  repo: 'ambari',
+                  proxyUsers: [
+                    'admin'
+                  ],
+                  evtTime: '2017-05-29T11:30:22.531Z',
+                  enforcer: 'ambari-acl',
+                  reqContext: 'ambari',
+                  cliType: 'GET',
+                  cliIP: '192.168.0.1',
+                  agent: 'agent',
+                  agentHost: 'localhost',
+                  action: 'SERVICE_CHECK',
+                  type: 'ambari-audit',
+                  _version_: 2,
+                  id: 'id0',
+                  file: 'ambari-agent.log',
+                  seq_num: 3,
+                  bundle_id: 'b0',
+                  case_id: 'c0',
+                  log_message: 'User(admin), Operation(SERVICE_CHECK)',
+                  logfile_line_number: 4,
+                  message_md5: '12345678900987654321',
+                  cluster: 'cl0',
+                  event_count: 0,
+                  event_md5: '09876543211234567890',
+                  event_dur_ms: 100,
+                  _ttl_: "+7DAYS",
+                  _expire_at_: '2017-05-29T11:30:22.531Z',
+                  _router_field_: 5
+                },
+                {
+                  policy: 'policy',
+                  reason: 'Server error',
+                  result: 1,
+                  text: 'Something went wrong',
+                  tags: [
+                    'ambari_agent'
+                  ],
+                  resource: '/ambari-agent',
+                  sess: '1',
+                  access: '1',
+                  logType: 'AmbariAudit',
+                  tags_str: 'ambari_server',
+                  resType: 'server',
+                  reqUser: 'user',
+                  reqData: 'data',
+                  repoType: 1,
+                  repo: 'ambari',
+                  proxyUsers: [
+                    'user'
+                  ],
+                  evtTime: '2017-05-29T11:30:22.531Z',
+                  enforcer: 'hdfs',
+                  reqContext: 'ambari_server',
+                  cliType: 'PUT',
+                  cliIP: '192.168.0.1',
+                  agent: 'agent',
+                  agentHost: 'localhost',
+                  action: 'SERVICE_CHECK',
+                  type: 'ambari-audit',
+                  _version_: 4,
+                  id: 'id1',
+                  file: 'ambari-agent.log',
+                  seq_num: 5,
+                  bundle_id: 'b1',
+                  case_id: 'c1',
+                  log_message: 'User(user), Operation(SERVICE_CHECK)',
+                  logfile_line_number: 6,
+                  message_md5: '10293847561029384756',
+                  cluster: 'cl1',
+                  event_count: 2,
+                  event_md5: '01928374650192837465',
+                  event_dur_ms: 500,
+                  _ttl_: "+7DAYS",
+                  _expire_at_: '2017-05-29T11:30:22.531Z',
+                  _router_field_: 10
+                }
               ],
-              evtTime: '2017-05-29T11:30:22.531Z',
-              enforcer: 'hdfs',
-              reqContext: 'ambari_server',
-              cliType: 'PUT',
-              cliIP: '192.168.0.1',
-              agent: 'agent',
-              agentHost: 'localhost',
-              action: 'SERVICE_CHECK',
-              type: 'ambari-audit',
-              _version_: 4,
-              id: 'id1',
-              file: 'ambari-agent.log',
-              seq_num: 5,
-              bundle_id: 'b1',
-              case_id: 'c1',
-              log_message: 'User(user), Operation(SERVICE_CHECK)',
-              logfile_line_number: 6,
-              message_md5: '10293847561029384756',
-              cluster: 'cl1',
-              event_count: 2,
-              event_md5: '01928374650192837465',
-              event_dur_ms: 500,
-              _ttl_: "+7DAYS",
-              _expire_at_: '2017-05-29T11:30:22.531Z',
-              _router_field_: 10
-            }
-          ],
-          bargraph: {
-            graphData: [
-              {
-                dataCount: [
-                  {
-                    name: 'n0',
-                    value: 1
-                  },
-                  {
-                    name: 'n1',
-                    value: 2
-                  }
-                ],
-                name: 'graph0'
-              },
-              {
-                dataCount: [
-                  {
-                    name: 'n2',
-                    value: 10
-                  },
-                  {
-                    name: 'n3',
-                    value: 20
-                  }
-                ],
-                name: 'graph1'
-              }
-            ]
-          },
-          components: {},
-          resources: {
-            graphData: [
-              {
-                dataCount: [
-                  {
-                    name: 'n16',
-                    value: 800
-                  },
-                  {
-                    name: 'n17',
-                    value: 400
-                  }
-                ],
-                name: 'graph8'
-              },
-              {
-                dataCount: [
-                  {
-                    name: 'n18',
-                    value: 600
-                  },
-                  {
-                    name: 'n19',
-                    value: 300
-                  }
-                ],
-                name: 'graph9'
-              }
-            ]
-          },
-          schema: {
-            fields: ''
-          },
-          serviceload: {
-            graphData: [
-              {
-                dataCount: [
+              bargraph: {
+                graphData: [
                   {
-                    name: 'n4',
-                    value: 1
+                    dataCount: [
+                      {
+                        name: 'n0',
+                        value: 1
+                      },
+                      {
+                        name: 'n1',
+                        value: 2
+                      }
+                    ],
+                    name: 'graph0'
                   },
                   {
-                    name: 'n5',
-                    value: 2
+                    dataCount: [
+                      {
+                        name: 'n2',
+                        value: 10
+                      },
+                      {
+                        name: 'n3',
+                        value: 20
+                      }
+                    ],
+                    name: 'graph1'
                   }
-                ],
-                name: 'graph2'
+                ]
               },
-              {
-                dataCount: [
-                  {
-                    name: 'n6',
-                    value: 10
-                  },
-                  {
-                    name: 'n7',
-                    value: 20
-                  }
-                ],
-                name: 'graph3'
-              }
-            ]
-          }
-        }
-      },
-      public: {
-        config: {}
-      },
-      service: {
-        logs: {
-          logList: [
-            {
-              path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
-              host: 'h0',
-              level: 'WARN',
-              logtime: '2017-05-28T11:30:22.531Z',
-              ip: '192.168.0.1',
-              logfile_line_number: 8,
-              type: 'ams_collector',
-              _version_: 9,
-              id: 'id2',
-              file: 'ambari-metrics-collector.log',
-              seq_num: 10,
-              bundle_id: 'b2',
-              case_id: 'c2',
-              log_message: 'Connection refused',
-              message_md5: '1357908642',
-              cluster: 'cl2',
-              event_count: 5,
-              event_md5: '1908755391',
-              event_dur_ms: 200,
-              _ttl_: "+5DAYS",
-              _expire_at_: '2017-05-29T11:30:22.531Z',
-              _router_field_: 20
-            },
-            {
-              path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
-              host: 'h1',
-              level: 'ERROR',
-              logtime: '2017-05-28T10:30:22.531Z',
-              ip: '192.168.0.2',
-              type: 'ams_collector',
-              _version_: 14,
-              id: 'id3',
-              file: 'ambari-metrics-collector.log',
-              seq_num: 15,
-              bundle_id: 'b3',
-              case_id: 'c3',
-              log_message: 'Connection refused',
-              logfile_line_number: 16,
-              message_md5: '1357908642',
-              cluster: 'cl3',
-              event_count: 2,
-              event_md5: '1029384756',
-              event_dur_ms: 700,
-              _ttl_: "+5DAYS",
-              _expire_at_: '2017-05-29T10:30:22.531Z',
-              _router_field_: 5
-            }
-          ],
-          aggregated: {
-            graphData: [
-              {
-                name: 'n0',
-                count: 100,
-                dataList: [
+              components: {},
+              resources: {
+                graphData: [
                   {
-                    name: 'n1',
-                    count: 50,
-                    dataList: null
+                    dataCount: [
+                      {
+                        name: 'n16',
+                        value: 800
+                      },
+                      {
+                        name: 'n17',
+                        value: 400
+                      }
+                    ],
+                    name: 'graph8'
                   },
                   {
-                    name: 'n2',
-                    count: 200,
-                    dataList: null
+                    dataCount: [
+                      {
+                        name: 'n18',
+                        value: 600
+                      },
+                      {
+                        name: 'n19',
+                        value: 300
+                      }
+                    ],
+                    name: 'graph9'
                   }
                 ]
               },
-              {
-                name: 'n3',
-                count: 10,
-                dataList: [
+              schema: {
+                fields: ''
+              },
+              serviceload: {
+                graphData: [
                   {
-                    name: 'n4',
-                    count: 5,
-                    dataList: null
+                    dataCount: [
+                      {
+                        name: 'n4',
+                        value: 1
+                      },
+                      {
+                        name: 'n5',
+                        value: 2
+                      }
+                    ],
+                    name: 'graph2'
                   },
                   {
-                    name: 'n5',
-                    count: 20,
-                    dataList: null
+                    dataCount: [
+                      {
+                        name: 'n6',
+                        value: 10
+                      },
+                      {
+                        name: 'n7',
+                        value: 20
+                      }
+                    ],
+                    name: 'graph3'
                   }
                 ]
               }
-            ]
+            }
           },
-          components: {
-            count: {
-              anygraph: {
+          public: {
+            config: {}
+          },
+          service: {
+            logs: {
+              logList: [
+                {
+                  path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
+                  host: 'h0',
+                  level: 'WARN',
+                  logtime: '2017-05-28T11:30:22.531Z',
+                  ip: '192.168.0.1',
+                  logfile_line_number: 8,
+                  type: 'ams_collector',
+                  _version_: 9,
+                  id: 'id2',
+                  file: 'ambari-metrics-collector.log',
+                  seq_num: 10,
+                  bundle_id: 'b2',
+                  case_id: 'c2',
+                  log_message: 'Connection refused',
+                  message_md5: '1357908642',
+                  cluster: 'cl2',
+                  event_count: 5,
+                  event_md5: '1908755391',
+                  event_dur_ms: 200,
+                  _ttl_: "+5DAYS",
+                  _expire_at_: '2017-05-29T11:30:22.531Z',
+                  _router_field_: 20
+                },
+                {
+                  path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
+                  host: 'h1',
+                  level: 'ERROR',
+                  logtime: '2017-05-28T10:30:22.531Z',
+                  ip: '192.168.0.2',
+                  type: 'ams_collector',
+                  _version_: 14,
+                  id: 'id3',
+                  file: 'ambari-metrics-collector.log',
+                  seq_num: 15,
+                  bundle_id: 'b3',
+                  case_id: 'c3',
+                  log_message: 'Connection refused',
+                  logfile_line_number: 16,
+                  message_md5: '1357908642',
+                  cluster: 'cl3',
+                  event_count: 2,
+                  event_md5: '1029384756',
+                  event_dur_ms: 700,
+                  _ttl_: "+5DAYS",
+                  _expire_at_: '2017-05-29T10:30:22.531Z',
+                  _router_field_: 5
+                }
+              ],
+              aggregated: {
                 graphData: [
                   {
-                    dataCount: [
+                    name: 'n0',
+                    count: 100,
+                    dataList: [
                       {
-                        name: 'n8',
-                        value: 50
+                        name: 'n1',
+                        count: 50,
+                        dataList: null
                       },
                       {
-                        name: 'n9',
-                        value: 100
+                        name: 'n2',
+                        count: 200,
+                        dataList: null
                       }
-                    ],
-                    name: 'graph4'
+                    ]
                   },
                   {
-                    dataCount: [
+                    name: 'n3',
+                    count: 10,
+                    dataList: [
                       {
-                        name: 'n10',
-                        value: 5
+                        name: 'n4',
+                        count: 5,
+                        dataList: null
                       },
                       {
-                        name: 'n11',
-                        value: 10
+                        name: 'n5',
+                        count: 20,
+                        dataList: null
                       }
-                    ],
-                    name: 'graph5'
+                    ]
                   }
                 ]
-              }
-            },
-            levels: {
-              counts: {
-                vNodeList: [
-                  {
-                    name: 'ambari',
-                    type: 0,
-                    logLevelCount: [
+              },
+              components: {
+                count: {
+                  anygraph: {
+                    graphData: [
                       {
-                        name: 'ERROR',
-                        value: '10'
+                        dataCount: [
+                          {
+                            name: 'n8',
+                            value: 50
+                          },
+                          {
+                            name: 'n9',
+                            value: 100
+                          }
+                        ],
+                        name: 'graph4'
                       },
                       {
-                        name: 'WARN',
-                        value: '50'
+                        dataCount: [
+                          {
+                            name: 'n10',
+                            value: 5
+                          },
+                          {
+                            name: 'n11',
+                            value: 10
+                          }
+                        ],
+                        name: 'graph5'
                       }
-                    ],
-                    childs: [
+                    ]
+                  }
+                },
+                levels: {
+                  counts: {
+                    vNodeList: [
                       {
-                        name: 'hdfs',
-                        type: 2,
+                        name: 'ambari',
+                        type: 0,
                         logLevelCount: [
                           {
                             name: 'ERROR',
@@ -367,114 +415,114 @@ export class mockApiDataService implements InMemoryDbService {
                           },
                           {
                             name: 'WARN',
-                            value: '20'
+                            value: '50'
                           }
                         ],
-                        isParent: false,
+                        childs: [
+                          {
+                            name: 'hdfs',
+                            type: 2,
+                            logLevelCount: [
+                              {
+                                name: 'ERROR',
+                                value: '10'
+                              },
+                              {
+                                name: 'WARN',
+                                value: '20'
+                              }
+                            ],
+                            isParent: false,
+                            isRoot: false
+                          },
+                          {
+                            name: 'zookeeper',
+                            type: 3,
+                            logLevelCount: [
+                              {
+                                name: 'ERROR',
+                                value: '20'
+                              },
+                              {
+                                name: 'WARN',
+                                value: '40'
+                              }
+                            ],
+                            isParent: false,
+                            isRoot: false
+                          }
+                        ],
+                        isParent: true,
                         isRoot: false
                       },
                       {
-                        name: 'zookeeper',
-                        type: 3,
+                        name: 'ambari_agent',
+                        type: 1,
                         logLevelCount: [
                           {
                             name: 'ERROR',
-                            value: '20'
+                            value: '100'
                           },
                           {
                             name: 'WARN',
-                            value: '40'
+                            value: '500'
                           }
                         ],
                         isParent: false,
                         isRoot: false
                       }
+                    ]
+                  }
+                }
+              },
+              files: {
+                hostLogFiles: {
+                  clusters: [
+                    'c0',
+                    'c1'
+                  ],
+                  services: [
+                    'hdfs',
+                    'zookeeper'
+                  ]
+                }
+              },
+              histogram: {
+                graphData: [
+                  {
+                    dataCount: [
+                      {
+                        name: 'n12',
+                        value: 1000
+                      },
+                      {
+                        name: 'n13',
+                        value: 2000
+                      }
                     ],
-                    isParent: true,
-                    isRoot: false
+                    name: 'graph6'
                   },
                   {
-                    name: 'ambari_agent',
-                    type: 1,
-                    logLevelCount: [
+                    dataCount: [
                       {
-                        name: 'ERROR',
-                        value: '100'
+                        name: 'n14',
+                        value: 700
                       },
                       {
-                        name: 'WARN',
-                        value: '500'
+                        name: 'n15',
+                        value: 900
                       }
                     ],
-                    isParent: false,
-                    isRoot: false
+                    name: 'graph7'
                   }
                 ]
-              }
-            }
-          },
-          files: {
-            hostLogFiles: {
-              clusters: [
-                'c0',
-                'c1'
-              ],
-              services: [
-                'hdfs',
-                'zookeeper'
-              ]
-            }
-          },
-          histogram: {
-            graphData: [
-              {
-                dataCount: [
-                  {
-                    name: 'n12',
-                    value: 1000
-                  },
-                  {
-                    name: 'n13',
-                    value: 2000
-                  }
-                ],
-                name: 'graph6'
               },
-              {
-                dataCount: [
-                  {
-                    name: 'n14',
-                    value: 700
-                  },
-                  {
-                    name: 'n15',
-                    value: 900
-                  }
-                ],
-                name: 'graph7'
-              }
-            ]
-          },
-          hosts: {
-            components: {
-              vNodeList: [
-                {
-                  name: 'ambari',
-                  type: 0,
-                  logLevelCount: [
-                    {
-                      name: 'ERROR',
-                      value: '100'
-                    },
+              hosts: {
+                components: {
+                  vNodeList: [
                     {
-                      name: 'WARN',
-                      value: '500'
-                    }
-                  ],
-                  childs: [
-                    {
-                      name: 'ambari_metrics',
-                      type: 2,
+                      name: 'ambari',
+                      type: 0,
                       logLevelCount: [
                         {
                           name: 'ERROR',
@@ -482,100 +530,100 @@ export class mockApiDataService implements InMemoryDbService {
                         },
                         {
                           name: 'WARN',
-                          value: '200'
+                          value: '500'
                         }
                       ],
-                      isParent: false,
+                      childs: [
+                        {
+                          name: 'ambari_metrics',
+                          type: 2,
+                          logLevelCount: [
+                            {
+                              name: 'ERROR',
+                              value: '100'
+                            },
+                            {
+                              name: 'WARN',
+                              value: '200'
+                            }
+                          ],
+                          isParent: false,
+                          isRoot: false
+                        },
+                        {
+                          name: 'hbase',
+                          type: 3,
+                          logLevelCount: [
+                            {
+                              name: 'ERROR',
+                              value: '200'
+                            },
+                            {
+                              name: 'WARN',
+                              value: '400'
+                            }
+                          ],
+                          isParent: false,
+                          isRoot: false
+                        }
+                      ],
+                      isParent: true,
                       isRoot: false
                     },
                     {
-                      name: 'hbase',
-                      type: 3,
+                      name: 'ambari_server',
+                      type: 1,
                       logLevelCount: [
                         {
                           name: 'ERROR',
-                          value: '200'
+                          value: '1000'
                         },
                         {
                           name: 'WARN',
-                          value: '400'
+                          value: '5000'
                         }
                       ],
                       isParent: false,
                       isRoot: false
                     }
-                  ],
-                  isParent: true,
-                  isRoot: false
+                  ]
                 },
-                {
-                  name: 'ambari_server',
-                  type: 1,
-                  logLevelCount: [
+                count: {
+                  getvCounts: [
                     {
-                      name: 'ERROR',
-                      value: '1000'
+                      name: 'n20',
+                      count: 100
                     },
                     {
-                      name: 'WARN',
-                      value: '5000'
+                      name: 'n21',
+                      count: 200
                     }
-                  ],
-                  isParent: false,
-                  isRoot: false
-                }
-              ]
-            },
-            count: {
-              getvCounts: [
-                {
-                  name: 'n20',
-                  count: 100
-                },
-                {
-                  name: 'n21',
-                  count: 200
+                  ]
                 }
-              ]
-            }
-          },
-          levels: {
-            counts: {
-              getvNameValues: [
-                {
-                  name: 'n22',
-                  count: 1000
-                },
-                {
-                  name: 'n23',
-                  count: 2000
+              },
+              levels: {
+                counts: {
+                  getvNameValues: [
+                    {
+                      name: 'n22',
+                      count: 1000
+                    },
+                    {
+                      name: 'n23',
+                      count: 2000
+                    }
+                  ]
                 }
-              ]
-            }
-          },
-          schema: {
-            fields: ''
-          },
-          serviceconfig: '',
-          tree: {
-            vNodeList: [
-              {
-                name: 'ambari',
-                type: 0,
-                logLevelCount: [
-                  {
-                    name: 'ERROR',
-                    value: '1000'
-                  },
-                  {
-                    name: 'WARN',
-                    value: '5000'
-                  }
-                ],
-                childs: [
+              },
+              schema: {
+                fields: ''
+              },
+              serviceconfig: '',
+              tree: {
+                vNodeList: [
                   {
-                    name: 'yarn',
-                    type: 2,
+                    name: 'ambari',
+                    type: 0,
                     logLevelCount: [
                       {
                         name: 'ERROR',
@@ -583,182 +631,198 @@ export class mockApiDataService implements InMemoryDbService {
                       },
                       {
                         name: 'WARN',
-                        value: '2000'
+                        value: '5000'
                       }
                     ],
-                    isParent: false,
+                    childs: [
+                      {
+                        name: 'yarn',
+                        type: 2,
+                        logLevelCount: [
+                          {
+                            name: 'ERROR',
+                            value: '1000'
+                          },
+                          {
+                            name: 'WARN',
+                            value: '2000'
+                          }
+                        ],
+                        isParent: false,
+                        isRoot: false
+                      },
+                      {
+                        name: 'hive',
+                        type: 3,
+                        logLevelCount: [
+                          {
+                            name: 'ERROR',
+                            value: '2000'
+                          },
+                          {
+                            name: 'WARN',
+                            value: '4000'
+                          }
+                        ],
+                        isParent: false,
+                        isRoot: false
+                      }
+                    ],
+                    isParent: true,
                     isRoot: false
                   },
                   {
-                    name: 'hive',
-                    type: 3,
+                    name: 'ambari_server',
+                    type: 1,
                     logLevelCount: [
                       {
                         name: 'ERROR',
-                        value: '2000'
+                        value: '10000'
                       },
                       {
                         name: 'WARN',
-                        value: '4000'
+                        value: '50000'
                       }
                     ],
                     isParent: false,
                     isRoot: false
                   }
-                ],
-                isParent: true,
-                isRoot: false
+                ]
               },
-              {
-                name: 'ambari_server',
-                type: 1,
-                logLevelCount: [
+              truncated: {
+                logList: [
                   {
-                    name: 'ERROR',
-                    value: '10000'
+                    path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
+                    host: 'h0',
+                    level: 'WARN',
+                    logtime: '2017-05-28T11:30:22.531Z',
+                    ip: '192.168.0.1',
+                    logfile_line_number: 8,
+                    type: 'ams_collector',
+                    _version_: 9,
+                    id: 'id2',
+                    file: 'ambari-metrics-collector.log',
+                    seq_num: 10,
+                    bundle_id: 'b2',
+                    case_id: 'c2',
+                    log_message: 'Connection refused',
+                    message_md5: '1357908642',
+                    cluster: 'cl2',
+                    event_count: 5,
+                    event_md5: '1908755391',
+                    event_dur_ms: 200,
+                    _ttl_: "+5DAYS",
+                    _expire_at_: '2017-05-29T11:30:22.531Z',
+                    _router_field_: 20
                   },
                   {
-                    name: 'WARN',
-                    value: '50000'
+                    path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
+                    host: 'h1',
+                    level: 'ERROR',
+                    logtime: '2017-05-28T10:30:22.531Z',
+                    ip: '192.168.0.2',
+                    type: 'ams_collector',
+                    _version_: 14,
+                    id: 'id3',
+                    file: 'ambari-metrics-collector.log',
+                    seq_num: 15,
+                    bundle_id: 'b3',
+                    case_id: 'c3',
+                    log_message: 'Connection refused',
+                    logfile_line_number: 16,
+                    message_md5: '1357908642',
+                    cluster: 'cl3',
+                    event_count: 2,
+                    event_md5: '1029384756',
+                    event_dur_ms: 700,
+                    _ttl_: "+5DAYS",
+                    _expire_at_: '2017-05-29T10:30:22.531Z',
+                    _router_field_: 5
                   }
-                ],
-                isParent: false,
-                isRoot: false
+                ]
               }
-            ]
+            }
           },
-          truncated: {
-            logList: [
+          status: {
+            auditlogs: {
+              znodeReady: true,
+              solrCollectionReady: true,
+              solrAliasReady: false,
+              configurationUploaded: true
+            },
+            servicelogs: {
+              znodeReady: true,
+              solrCollectionReady: true,
+              configurationUploaded: true
+            },
+            userconfig: {
+              znodeReady: true,
+              solrCollectionReady: true,
+              configurationUploaded: true
+            }
+          },
+          userconfig: {
+            userConfigList: [
               {
-                path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
-                host: 'h0',
-                level: 'WARN',
-                logtime: '2017-05-28T11:30:22.531Z',
-                ip: '192.168.0.1',
-                logfile_line_number: 8,
-                type: 'ams_collector',
-                _version_: 9,
-                id: 'id2',
-                file: 'ambari-metrics-collector.log',
-                seq_num: 10,
-                bundle_id: 'b2',
-                case_id: 'c2',
-                log_message: 'Connection refused',
-                message_md5: '1357908642',
-                cluster: 'cl2',
-                event_count: 5,
-                event_md5: '1908755391',
-                event_dur_ms: 200,
-                _ttl_: "+5DAYS",
-                _expire_at_: '2017-05-29T11:30:22.531Z',
-                _router_field_: 20
+                id: 'c0',
+                userName: 'admin',
+                filtername: 'service',
+                values: 'hdfs',
+                shareNameList: [
+                  's0',
+                  's1'
+                ],
+                rowType: 'history'
               },
               {
-                path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
-                host: 'h1',
-                level: 'ERROR',
-                logtime: '2017-05-28T10:30:22.531Z',
-                ip: '192.168.0.2',
-                type: 'ams_collector',
-                _version_: 14,
-                id: 'id3',
-                file: 'ambari-metrics-collector.log',
-                seq_num: 15,
-                bundle_id: 'b3',
-                case_id: 'c3',
-                log_message: 'Connection refused',
-                logfile_line_number: 16,
-                message_md5: '1357908642',
-                cluster: 'cl3',
-                event_count: 2,
-                event_md5: '1029384756',
-                event_dur_ms: 700,
-                _ttl_: "+5DAYS",
-                _expire_at_: '2017-05-29T10:30:22.531Z',
-                _router_field_: 5
+                id: 'c0',
+                userName: 'user',
+                filtername: 'component',
+                values: 'namenode',
+                shareNameList: [
+                  's2',
+                  's3'
+                ],
+                rowType: 'history'
               }
-            ]
-          }
-        }
-      },
-      status: {
-        auditlogs: {
-          znodeReady: true,
-          solrCollectionReady: true,
-          solrAliasReady: false,
-          configurationUploaded: true
-        },
-        servicelogs: {
-          znodeReady: true,
-          solrCollectionReady: true,
-          configurationUploaded: true
-        },
-        userconfig: {
-          znodeReady: true,
-          solrCollectionReady: true,
-          configurationUploaded: true
-        }
-      },
-      userconfig: {
-        userConfigList: [
-          {
-            id: 'c0',
-            userName: 'admin',
-            filtername: 'service',
-            values: 'hdfs',
-            shareNameList: [
-              's0',
-              's1'
             ],
-            rowType: 'history'
-          },
-          {
-            id: 'c0',
-            userName: 'user',
-            filtername: 'component',
-            values: 'namenode',
-            shareNameList: [
-              's2',
-              's3'
-            ],
-            rowType: 'history'
-          }
-        ],
-        filters: {
-          filter0: {
-            label: 'filter0',
-            hosts: [
-              'h0',
-              'h1'
-            ],
-            defaultLevels: [
-              'l0',
-              'l1'
-            ],
-            overrideLevels: [
-              'l2',
-              'l3'
-            ],
-            expiryTime: '2017-05-29T11:30:22.531Z'
-          },
-          filter1: {
-            label: 'filter1',
-            hosts: [
-              'h1',
-              'h2'
-            ],
-            defaultLevels: [
-              'l4',
-              'l5'
-            ],
-            overrideLevels: [
-              'l6',
-              'l7'
-            ],
-            expiryTime: '2017-05-30T11:30:22.531Z'
+            filters: {
+              filter0: {
+                label: 'filter0',
+                hosts: [
+                  'h0',
+                  'h1'
+                ],
+                defaultLevels: [
+                  'l0',
+                  'l1'
+                ],
+                overrideLevels: [
+                  'l2',
+                  'l3'
+                ],
+                expiryTime: '2017-05-29T11:30:22.531Z'
+              },
+              filter1: {
+                label: 'filter1',
+                hosts: [
+                  'h1',
+                  'h2'
+                ],
+                defaultLevels: [
+                  'l4',
+                  'l5'
+                ],
+                overrideLevels: [
+                  'l6',
+                  'l7'
+                ],
+                expiryTime: '2017-05-30T11:30:22.531Z'
+              }
+            },
+            names: []
           }
-        },
-        names: []
+        }
       }
     };
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less
index 2e8e77a..e5e85f4 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less
@@ -1,4 +1,4 @@
-/*
+/**
  * 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.


[09/21] ambari git commit: AMBARI-21314 Log Search UI: implement top bar. (ababiichuk)

Posted by ab...@apache.org.
AMBARI-21314 Log Search UI: implement top bar. (ababiichuk)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/e71ad966
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/e71ad966
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/e71ad966

Branch: refs/heads/branch-feature-logsearch-ui
Commit: e71ad9666728cd20c99c5528cdbd5b238d41f438
Parents: 8aa761f
Author: ababiichuk <ab...@hortonworks.com>
Authored: Thu May 25 13:57:40 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jun 22 15:28:31 2017 +0300

----------------------------------------------------------------------
 .../ambari-logsearch-web-new/.angular-cli.json  |  1 +
 .../src/app/app.component.html                  |  9 +-
 .../src/app/app.component.less                  | 26 +++++
 .../src/app/app.component.spec.ts               |  2 +-
 .../src/app/app.component.ts                    |  2 +-
 .../src/app/app.module.ts                       | 16 +++-
 .../src/app/http-client.service.spec.ts         | 57 -----------
 .../src/app/http-client.service.ts              | 97 -------------------
 .../app/login-form/login-form.component.spec.ts |  6 +-
 .../src/app/login-form/login-form.component.ts  |  2 +-
 .../app/menu-button/menu-button.component.html  | 31 ++++++
 .../app/menu-button/menu-button.component.less  | 29 ++++++
 .../menu-button/menu-button.component.spec.ts   | 87 +++++++++++++++++
 .../app/menu-button/menu-button.component.ts    | 73 +++++++++++++++
 .../src/app/mock-api-data.service.ts            | 25 -----
 .../src/app/services/actions.service.spec.ts    | 33 +++++++
 .../src/app/services/actions.service.ts         | 47 ++++++++++
 .../app/services/http-client.service.spec.ts    | 57 +++++++++++
 .../src/app/services/http-client.service.ts     | 99 ++++++++++++++++++++
 .../src/app/services/mock-api-data.service.ts   | 25 +++++
 .../src/app/top-menu/top-menu.component.html    | 18 ++++
 .../src/app/top-menu/top-menu.component.less    | 22 +++++
 .../src/app/top-menu/top-menu.component.spec.ts | 45 +++++++++
 .../src/app/top-menu/top-menu.component.ts      | 90 ++++++++++++++++++
 .../src/assets/.gitkeep                         |  0
 .../src/assets/i18n/en.json                     | 11 ++-
 26 files changed, 716 insertions(+), 194 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/.angular-cli.json
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/.angular-cli.json b/ambari-logsearch/ambari-logsearch-web-new/.angular-cli.json
index 2f90ebe..cc74739 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/.angular-cli.json
+++ b/ambari-logsearch/ambari-logsearch-web-new/.angular-cli.json
@@ -26,6 +26,7 @@
       ],
       "scripts": [
         "../node_modules/jquery/dist/jquery.min.js",
+        "../node_modules/bootstrap/dist/js/bootstrap.min.js",
         "../src/vendor/js/bootstrap-logsearch.min.js"
       ],
       "environmentSource": "environments/environment.ts",

http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html
index 8d9f6d0..9b44246 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html
@@ -15,5 +15,10 @@
   limitations under the License.
 -->
 
-<h1>{{'common.title' | translate}}</h1>
-<login-form *ngIf="!httpClient.isAuthorized"></login-form>
\ No newline at end of file
+<nav class="navbar">
+  <div class="container-fluid">
+    <h1 [ngClass]="{'full-flex-width': !httpClient.isAuthorized, 'navbar-left': true}">{{'common.title' | translate}}</h1>
+    <top-menu *ngIf="httpClient.isAuthorized" class="navbar-right"></top-menu>
+  </div>
+</nav>
+<login-form *ngIf="!httpClient.isAuthorized"></login-form>

http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
index 2944f98..d8410cf 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
@@ -14,3 +14,29 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
+.navbar {
+  border-radius: 0;
+  background-color: #323544;
+  color: #fff;
+
+  .container-fluid {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+  }
+
+  h1 {
+    flex-basis: 70%;
+    margin-bottom: 20px;
+    text-transform: uppercase;
+
+    &.full-flex-width {
+      flex-basis: 100%;
+    }
+  }
+
+  /deep/ top-menu {
+    flex-basis: 30%;
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.spec.ts
index dfe6fbf..96cb0b4 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.spec.ts
@@ -21,7 +21,7 @@ import {TestBed, async} from '@angular/core/testing';
 import {Http} from '@angular/http';
 import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
 import {TranslateHttpLoader} from '@ngx-translate/http-loader';
-import {HttpClientService} from './http-client.service';
+import {HttpClientService} from './services/http-client.service';
 
 import {AppComponent} from './app.component';
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts
index 79cdc5d..fb79ccb 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts
@@ -18,7 +18,7 @@
 
 import {Component} from '@angular/core';
 import {TranslateService} from '@ngx-translate/core';
-import {HttpClientService} from './http-client.service';
+import {HttpClientService} from './services/http-client.service';
 
 @Component({
   selector: 'app-root',

http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
index 2d132e2..e8dee1b 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
@@ -21,14 +21,17 @@ import {NgModule, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
 import {FormsModule} from '@angular/forms';
 import {HttpModule, Http} from '@angular/http';
 import {InMemoryWebApiModule} from 'angular-in-memory-web-api';
-import {mockApiDataService} from './mock-api-data.service'
+import {mockApiDataService} from './services/mock-api-data.service'
 import {AlertModule} from 'ngx-bootstrap';
 import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
 import {TranslateHttpLoader} from '@ngx-translate/http-loader';
-import {HttpClientService} from './http-client.service';
+import {HttpClientService} from './services/http-client.service';
+import {ActionsService} from './services/actions.service';
 
 import {AppComponent} from './app.component';
 import {LoginFormComponent} from './login-form/login-form.component';
+import {TopMenuComponent} from './top-menu/top-menu.component';
+import {MenuButtonComponent} from './menu-button/menu-button.component';
 
 export function HttpLoaderFactory(http: Http) {
   return new TranslateHttpLoader(http, 'assets/i18n/', '.json');
@@ -37,7 +40,9 @@ export function HttpLoaderFactory(http: Http) {
 @NgModule({
   declarations: [
     AppComponent,
-    LoginFormComponent
+    LoginFormComponent,
+    TopMenuComponent,
+    MenuButtonComponent
   ],
   imports: [
     BrowserModule,
@@ -55,7 +60,10 @@ export function HttpLoaderFactory(http: Http) {
       }
     })
   ],
-  providers: [HttpClientService],
+  providers: [
+    HttpClientService,
+    ActionsService
+  ],
   bootstrap: [AppComponent],
   schemas: [CUSTOM_ELEMENTS_SCHEMA]
 })

http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/http-client.service.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/http-client.service.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/http-client.service.spec.ts
deleted file mode 100644
index ec8596d..0000000
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/http-client.service.spec.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * 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.
- */
-
-import {TestBed, inject} from '@angular/core/testing';
-import {HttpModule, Request} from '@angular/http';
-import {HttpClientService} from './http-client.service';
-
-describe('HttpClientService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      imports: [HttpModule],
-      providers: [HttpClientService]
-    });
-  });
-
-  it('should create service', inject([HttpClientService], (service: HttpClientService) => {
-    expect(service).toBeTruthy();
-  }));
-
-  describe('generateUrlString()', () => {
-    it('should generate URL from presets', inject([HttpClientService], (service:HttpClientService) => {
-      expect(service.generateUrlString('status')).toEqual('api/v1/status');
-    }));
-
-    it('should return explicit URL', inject([HttpClientService], (service:HttpClientService) => {
-      expect(service.generateUrlString('login')).toEqual('login');
-    }));
-  });
-
-  describe('generateUrl()', () => {
-    it('string parameter', inject([HttpClientService], (service:HttpClientService) => {
-      expect(service.generateUrl('status')).toEqual('api/v1/status');
-    }));
-
-    it('request object parameter', inject([HttpClientService], (service:HttpClientService) => {
-      let request = new Request({
-        url: 'status'
-      });
-      expect(service.generateUrl(request).url).toEqual('api/v1/status');
-    }));
-  });
-});

http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/http-client.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/http-client.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/http-client.service.ts
deleted file mode 100644
index 3585600..0000000
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/http-client.service.ts
+++ /dev/null
@@ -1,97 +0,0 @@
-/**
- * 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.
- */
-
-import {Injectable} from '@angular/core';
-import {Observable} from 'rxjs/Observable';
-import {Http, XHRBackend, Request, RequestOptions, RequestOptionsArgs, Response} from '@angular/http';
-import 'rxjs/add/operator/map';
-import 'rxjs/add/operator/catch';
-
-@Injectable()
-export class HttpClientService extends Http {
-
-  constructor(backend: XHRBackend, defaultOptions: RequestOptions) {
-    super(backend, defaultOptions);
-  }
-
-  readonly apiPrefix = 'api/v1/';
-
-  readonly urls = {
-    status: 'status'
-  };
-
-  isAuthorized: boolean;
-
-  generateUrlString(url: string): string {
-    const presetUrl = this.urls[url];
-    return presetUrl ? (this.apiPrefix + this.urls[url]) : url;
-  }
-
-  generateUrl(url: string | Request): string | Request {
-    if (typeof url === 'string') {
-      return this.generateUrlString(url);
-    }
-    if (url instanceof Request) {
-      url.url = this.generateUrlString(url.url);
-      return url;
-    }
-  }
-
-  handleError(request: Observable<Response>) {
-    request.subscribe(null, (error: any) => {
-      if ([401, 403, 419].indexOf(error.status) > -1) {
-        this.isAuthorized = false;
-      }
-    });
-  }
-
-  request(url: string | Request, options?: RequestOptionsArgs):Observable<Response> {
-    let req = super.request(this.generateUrl(url), options);
-    this.handleError(req);
-    return req;
-  }
-
-  get(url: string, options?: RequestOptionsArgs):Observable<Response> {
-    return super.get(this.generateUrlString(url), options);
-  }
-
-  post(url: string, body: any, options?: RequestOptionsArgs):Observable<Response> {
-    return super.post(this.generateUrlString(url), body, options);
-  }
-
-  put(url: string, body: any, options?: RequestOptionsArgs):Observable<Response> {
-    return super.put(this.generateUrlString(url), body, options);
-  }
-
-  delete(url: string, options?: RequestOptionsArgs):Observable<Response> {
-    return super.delete(this.generateUrlString(url), options);
-  }
-
-  patch(url: string, body: any, options?: RequestOptionsArgs):Observable<Response> {
-    return super.patch(this.generateUrlString(url), body, options);
-  }
-
-  head(url: string, options?: RequestOptionsArgs):Observable<Response> {
-    return super.head(this.generateUrlString(url), options);
-  }
-
-  options(url: string, options?: RequestOptionsArgs):Observable<Response> {
-    return super.options(this.generateUrlString(url), options);
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.spec.ts
index b58e834..55d125a 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.spec.ts
@@ -21,7 +21,7 @@ import {FormsModule} from '@angular/forms';
 import {HttpModule, Http} from '@angular/http';
 import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
 import {TranslateHttpLoader} from '@ngx-translate/http-loader';
-import {HttpClientService} from '../http-client.service';
+import {HttpClientService} from '../services/http-client.service';
 
 import {LoginFormComponent} from './login-form.component';
 
@@ -84,8 +84,8 @@ describe('LoginFormComponent', () => {
     expect(component).toBeTruthy();
   });
 
-  describe('login()', () => {
-    let cases = [
+  describe('#login()', () => {
+    const cases = [
       {
         isError: true,
         isLoginAlertDisplayed: true,

http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.ts
index 8dfa344..bffa412 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.ts
@@ -18,7 +18,7 @@
 
 import {Component, OnInit} from '@angular/core';
 import 'rxjs/add/operator/finally';
-import {HttpClientService} from '../http-client.service';
+import {HttpClientService} from '../services/http-client.service';
 
 @Component({
   selector: 'login-form',

http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html
new file mode 100644
index 0000000..6bdbac4
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html
@@ -0,0 +1,31 @@
+<!--
+  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.
+-->
+
+<div #dropdown [ngClass]="{'dropdown': hasSubItems, 'text-center': true}">
+  <span (mousedown)="onMouseDown()" (mouseup)="onMouseUp($event)" (click)="$event.stopPropagation()">
+    <a *ngIf="title" class="icon" [ngClass]="iconClassNames"></a>
+    <span *ngIf="!title" class="icon" [ngClass]="iconClassNames"></span>
+  </span>
+  <a #dropdownToggle [ngClass]="{'dropdown-toggle': hasSubItems, 'caret': true}" [attr.data-toggle]="hasSubItems ? 'dropdown': null" *ngIf="hasSubItems"></a>
+  <br>
+  <span class="icon-title" *ngIf="title" (mousedown)="onMouseDown()" (mouseup)="onMouseUp($event)" (click)="$event.stopPropagation()">{{title | translate}}</span>
+  <ul class="dropdown-menu" *ngIf="hasSubItems">
+    <li *ngFor="let item of subItems">
+      <a href="#">{{item.title}}</a>
+    </li>
+  </ul>
+</div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.less
new file mode 100644
index 0000000..16b06c4
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.less
@@ -0,0 +1,29 @@
+/*
+ * 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.
+ */
+
+:host {
+  display: inline-block;
+  cursor: pointer;
+
+  a:hover, a:focus {
+    text-decoration: none;
+  }
+
+  .icon {
+    padding: 5px;
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts
new file mode 100644
index 0000000..62afe07
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts
@@ -0,0 +1,87 @@
+/**
+ * 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.
+ */
+
+import {async, ComponentFixture, TestBed} from '@angular/core/testing';
+import {Http} from '@angular/http';
+import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
+import {TranslateHttpLoader} from '@ngx-translate/http-loader';
+import {ActionsService} from '../services/actions.service';
+
+import {MenuButtonComponent} from './menu-button.component';
+
+export function HttpLoaderFactory(http: Http) {
+  return new TranslateHttpLoader(http, 'assets/i18n/', '.json');
+}
+
+describe('MenuButtonComponent', () => {
+  let component: MenuButtonComponent;
+  let fixture: ComponentFixture<MenuButtonComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [MenuButtonComponent],
+      imports: [
+        TranslateModule.forRoot({
+        provide: TranslateLoader,
+        useFactory: HttpLoaderFactory,
+        deps: [Http]
+      })],
+      providers: [ActionsService]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(MenuButtonComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create component', () => {
+    expect(component).toBeTruthy();
+  });
+
+  describe('#hasSubItems', () => {
+
+    const cases = [
+      {
+        subItems: null,
+        hasSubItems: false,
+        title: 'no sub-items'
+      },
+      {
+        subItems: [],
+        hasSubItems: false,
+        title: 'empty sub-items array'
+      },
+      {
+        subItems: [{}],
+        hasSubItems: true,
+        title: 'sub-items present'
+      }
+    ];
+
+    cases.forEach((test) => {
+      it(test.title, () => {
+        component.subItems = test.subItems;
+        expect(component.hasSubItems).toEqual(test.hasSubItems);
+      });
+    });
+
+  });
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
new file mode 100644
index 0000000..7a967ad
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
@@ -0,0 +1,73 @@
+/**
+ * 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.
+ */
+
+import {Component, AfterViewInit, Input, ViewChild, ElementRef} from '@angular/core';
+import {ActionsService} from '../services/actions.service';
+
+@Component({
+  selector: 'menu-button',
+  templateUrl: './menu-button.component.html',
+  styleUrls: ['./menu-button.component.less']
+})
+export class MenuButtonComponent implements AfterViewInit {
+
+  constructor(private actions: ActionsService) {
+  }
+
+  ngAfterViewInit() {
+  }
+
+  @ViewChild('dropdown')
+  dropdown: ElementRef;
+
+  @Input()
+  title?: string;
+
+  @Input()
+  action: string;
+
+  @Input()
+  iconClassNames: string[];
+
+  @Input()
+  subItems?: any[];
+
+  @Input()
+  get hasSubItems(): boolean {
+    return Boolean(this.subItems && this.subItems.length);
+  }
+
+  private clickStartTime: number;
+
+  private readonly longClickInterval = 1000;
+
+  onMouseDown() {
+    this.clickStartTime = (new Date()).getTime();
+  }
+
+  onMouseUp(event: Event) {
+    const clickEndTime = (new Date()).getTime();
+    if (this.hasSubItems && clickEndTime - this.clickStartTime >= this.longClickInterval) {
+      this.dropdown.nativeElement.classList.add('open');
+    } else {
+      this.actions[this.action]();
+    }
+    event.stopPropagation();
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/mock-api-data.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/mock-api-data.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/mock-api-data.service.ts
deleted file mode 100644
index da32c7e..0000000
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/mock-api-data.service.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * 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.
- */
-
-import {InMemoryDbService} from 'angular-in-memory-web-api';
-
-export class mockApiDataService implements InMemoryDbService {
-  createDb() {
-    return {};
-  }
-}

http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/services/actions.service.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/actions.service.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/actions.service.spec.ts
new file mode 100644
index 0000000..a14e0db
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/actions.service.spec.ts
@@ -0,0 +1,33 @@
+/**
+ * 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.
+ */
+
+import {TestBed, inject} from '@angular/core/testing';
+
+import {ActionsService} from './actions.service';
+
+describe('ActionsService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [ActionsService]
+    });
+  });
+
+  it('should create service', inject([ActionsService], (service: ActionsService) => {
+    expect(service).toBeTruthy();
+  }));
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/services/actions.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/actions.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/actions.service.ts
new file mode 100644
index 0000000..2bcd909
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/actions.service.ts
@@ -0,0 +1,47 @@
+/**
+ * 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.
+ */
+
+import {Injectable} from '@angular/core';
+
+@Injectable()
+export class ActionsService {
+
+  constructor() {
+  }
+
+  //TODO implement actions
+
+  undo() {
+  }
+
+  redo() {
+  }
+
+  refresh() {
+  }
+
+  openHistory() {
+  }
+
+  openAlerts() {
+  }
+
+  openUserDetails() {
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.spec.ts
new file mode 100644
index 0000000..083ea23
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.spec.ts
@@ -0,0 +1,57 @@
+/**
+ * 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.
+ */
+
+import {TestBed, inject} from '@angular/core/testing';
+import {HttpModule, Request} from '@angular/http';
+import {HttpClientService} from './http-client.service';
+
+describe('HttpClientService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      imports: [HttpModule],
+      providers: [HttpClientService]
+    });
+  });
+
+  it('should create service', inject([HttpClientService], (service: HttpClientService) => {
+    expect(service).toBeTruthy();
+  }));
+
+  describe('#generateUrlString()', () => {
+    it('should generate URL from presets', inject([HttpClientService], (service: HttpClientService) => {
+      expect(service.generateUrlString('status')).toEqual('api/v1/status');
+    }));
+
+    it('should return explicit URL', inject([HttpClientService], (service: HttpClientService) => {
+      expect(service.generateUrlString('login')).toEqual('login');
+    }));
+  });
+
+  describe('#generateUrl()', () => {
+    it('string parameter', inject([HttpClientService], (service: HttpClientService) => {
+      expect(service.generateUrl('status')).toEqual('api/v1/status');
+    }));
+
+    it('request object parameter', inject([HttpClientService], (service: HttpClientService) => {
+      let request = new Request({
+        url: 'status'
+      });
+      expect(service.generateUrl(request).url).toEqual('api/v1/status');
+    }));
+  });
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts
new file mode 100644
index 0000000..2aa87f9
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts
@@ -0,0 +1,99 @@
+/**
+ * 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.
+ */
+
+import {Injectable} from '@angular/core';
+import {Observable} from 'rxjs/Observable';
+import {Http, XHRBackend, Request, RequestOptions, RequestOptionsArgs, Response} from '@angular/http';
+import 'rxjs/add/operator/map';
+import 'rxjs/add/operator/catch';
+
+@Injectable()
+export class HttpClientService extends Http {
+
+  constructor(backend: XHRBackend, defaultOptions: RequestOptions) {
+    super(backend, defaultOptions);
+  }
+
+  private readonly apiPrefix = 'api/v1/';
+
+  private readonly urls = {
+    status: 'status'
+  };
+
+  private readonly unauthorizedStatuses = [401, 403, 419];
+
+  isAuthorized: boolean;
+
+  generateUrlString(url: string): string {
+    const presetUrl = this.urls[url];
+    return presetUrl ? (this.apiPrefix + this.urls[url]) : url;
+  }
+
+  generateUrl(url: string | Request): string | Request {
+    if (typeof url === 'string') {
+      return this.generateUrlString(url);
+    }
+    if (url instanceof Request) {
+      url.url = this.generateUrlString(url.url);
+      return url;
+    }
+  }
+
+  handleError(request: Observable<Response>) {
+    request.subscribe(null, (error: any) => {
+      if (this.unauthorizedStatuses.indexOf(error.status) > -1) {
+        this.isAuthorized = false;
+      }
+    });
+  }
+
+  request(url: string | Request, options?: RequestOptionsArgs):Observable<Response> {
+    let req = super.request(this.generateUrl(url), options);
+    this.handleError(req);
+    return req;
+  }
+
+  get(url: string, options?: RequestOptionsArgs):Observable<Response> {
+    return super.get(this.generateUrlString(url), options);
+  }
+
+  post(url: string, body: any, options?: RequestOptionsArgs):Observable<Response> {
+    return super.post(this.generateUrlString(url), body, options);
+  }
+
+  put(url: string, body: any, options?: RequestOptionsArgs):Observable<Response> {
+    return super.put(this.generateUrlString(url), body, options);
+  }
+
+  delete(url: string, options?: RequestOptionsArgs):Observable<Response> {
+    return super.delete(this.generateUrlString(url), options);
+  }
+
+  patch(url: string, body: any, options?: RequestOptionsArgs):Observable<Response> {
+    return super.patch(this.generateUrlString(url), body, options);
+  }
+
+  head(url: string, options?: RequestOptionsArgs):Observable<Response> {
+    return super.head(this.generateUrlString(url), options);
+  }
+
+  options(url: string, options?: RequestOptionsArgs):Observable<Response> {
+    return super.options(this.generateUrlString(url), options);
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
new file mode 100644
index 0000000..da32c7e
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
@@ -0,0 +1,25 @@
+/**
+ * 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.
+ */
+
+import {InMemoryDbService} from 'angular-in-memory-web-api';
+
+export class mockApiDataService implements InMemoryDbService {
+  createDb() {
+    return {};
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.html
new file mode 100644
index 0000000..82ab60a
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.html
@@ -0,0 +1,18 @@
+<!--
+  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.
+-->
+
+<menu-button *ngFor="let item of items" [title]="item.title" [action]="item.action" [iconClassNames]="item.iconClassNames" [subItems]="item.subItems"></menu-button>

http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less
new file mode 100644
index 0000000..c992c9e
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less
@@ -0,0 +1,22 @@
+/*
+ * 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.
+ */
+
+:host {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.spec.ts
new file mode 100644
index 0000000..1649a50
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.spec.ts
@@ -0,0 +1,45 @@
+/**
+ * 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.
+ */
+
+import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
+import {async, ComponentFixture, TestBed} from '@angular/core/testing';
+
+import {TopMenuComponent} from './top-menu.component';
+
+describe('TopMenuComponent', () => {
+  let component: TopMenuComponent;
+  let fixture: ComponentFixture<TopMenuComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [TopMenuComponent],
+      schemas: [CUSTOM_ELEMENTS_SCHEMA]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(TopMenuComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create component', () => {
+    expect(component).toBeTruthy();
+  });
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts
new file mode 100644
index 0000000..d5f05875
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts
@@ -0,0 +1,90 @@
+/**
+ * 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.
+ */
+
+import {Component, OnInit} from '@angular/core';
+
+@Component({
+  selector: 'top-menu',
+  templateUrl: './top-menu.component.html',
+  styleUrls: ['./top-menu.component.less']
+})
+export class TopMenuComponent implements OnInit {
+
+  constructor() {
+  }
+
+  ngOnInit() {
+  }
+
+  //TODO implement loading of real data into subItems
+  readonly items = [
+    {
+      iconClassNames: ['fa', 'fa-arrow-left'],
+      title: 'topMenu.undo',
+      action: 'undo',
+      subItems: [
+        {
+          title: 'Item 1'
+        },
+        {
+          title: 'Item 2'
+        }
+      ]
+    },
+    {
+      iconClassNames: ['fa', 'fa-arrow-right'],
+      title: 'topMenu.redo',
+      action: 'redo',
+      subItems: [
+        {
+          title: 'Item 1'
+        },
+        {
+          title: 'Item 2'
+        }
+      ]
+    },
+    {
+      iconClassNames: ['fa', 'fa-refresh'],
+      title: 'topMenu.refresh',
+      action: 'refresh'
+    },
+    {
+      iconClassNames: ['fa', 'fa-clock-o'],
+      title: 'topMenu.history',
+      action: 'openHistory',
+      subItems: [
+        {
+          title: 'Item 1'
+        },
+        {
+          title: 'Item 2'
+        }
+      ]
+    },
+    {
+      iconClassNames: ['fa', 'fa-bell'],
+      action: 'openAlerts'
+    },
+    {
+      iconClassNames: ['fa', 'fa-user'],
+      action: 'openUserDetails'
+    }
+  ];
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/assets/.gitkeep
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/assets/.gitkeep b/ambari-logsearch/ambari-logsearch-web-new/src/assets/.gitkeep
deleted file mode 100644
index e69de29..0000000

http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/assets/i18n/en.json
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/assets/i18n/en.json b/ambari-logsearch/ambari-logsearch-web-new/src/assets/i18n/en.json
index 13c3805..dea8120 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/assets/i18n/en.json
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/assets/i18n/en.json
@@ -1,8 +1,13 @@
 {
-  "common.title": "Ambari Log Search",
+  "common.title": "Log Search",
 
   "authorization.name": "Username",
   "authorization.password": "Password",
   "authorization.signIn": "Sign In",
-  "authorization.error": "<strong>Error!</strong> Invalid User credentials.<br>Please try again."
-}
\ No newline at end of file
+  "authorization.error": "<strong>Error!</strong> Invalid User credentials.<br>Please try again.",
+
+  "topMenu.undo": "Undo",
+  "topMenu.redo": "Redo",
+  "topMenu.refresh": "Refresh",
+  "topMenu.history": "History"
+}


[19/21] ambari git commit: AMBARI-21322 Log Search UI: implement loading of logs list with filter conditions. (ababiichuk)

Posted by ab...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/assets/mock-data.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/assets/mock-data.ts b/ambari-logsearch/ambari-logsearch-web-new/src/assets/mock-data.ts
new file mode 100644
index 0000000..d269bc3
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/assets/mock-data.ts
@@ -0,0 +1,883 @@
+/**
+ * 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.
+ */
+
+export const mockData = {
+  login: {},
+  api: {
+    v1: {
+      audit: {
+        logs: {
+          logList: [
+            {
+              policy: 'policy',
+              reason: 'Authentication required',
+              result: 0,
+              text: 'Please log in',
+              tags: [
+                'ambari_agent'
+              ],
+              resource: '/ambari-agent',
+              sess: '0',
+              access: '0',
+              logType: 'AmbariAudit',
+              tags_str: 'ambari_agent',
+              resType: 'agent',
+              reqUser: 'admin',
+              reqData: 'data',
+              repoType: 1,
+              repo: 'ambari',
+              proxyUsers: [
+                'admin'
+              ],
+              evtTime: '2017-05-29T11:30:22.531Z',
+              enforcer: 'ambari-acl',
+              reqContext: 'ambari',
+              cliType: 'GET',
+              cliIP: '192.168.0.1',
+              agent: 'agent',
+              agentHost: 'localhost',
+              action: 'SERVICE_CHECK',
+              type: 'ambari-audit',
+              _version_: 2,
+              id: 'id0',
+              file: 'ambari-agent.log',
+              seq_num: 3,
+              bundle_id: 'b0',
+              case_id: 'c0',
+              log_message: 'User(admin), Operation(SERVICE_CHECK)',
+              logfile_line_number: 4,
+              message_md5: '12345678900987654321',
+              cluster: 'cl0',
+              event_count: 0,
+              event_md5: '09876543211234567890',
+              event_dur_ms: 100,
+              _ttl_: "+7DAYS",
+              _expire_at_: '2017-05-29T11:30:22.531Z',
+              _router_field_: 5
+            },
+            {
+              policy: 'policy',
+              reason: 'Server error',
+              result: 1,
+              text: 'Something went wrong',
+              tags: [
+                'ambari_agent'
+              ],
+              resource: '/ambari-agent',
+              sess: '1',
+              access: '1',
+              logType: 'AmbariAudit',
+              tags_str: 'ambari_server',
+              resType: 'server',
+              reqUser: 'user',
+              reqData: 'data',
+              repoType: 1,
+              repo: 'ambari',
+              proxyUsers: [
+                'user'
+              ],
+              evtTime: '2017-05-29T11:30:22.531Z',
+              enforcer: 'hdfs',
+              reqContext: 'ambari_server',
+              cliType: 'PUT',
+              cliIP: '192.168.0.1',
+              agent: 'agent',
+              agentHost: 'localhost',
+              action: 'SERVICE_CHECK',
+              type: 'ambari-audit',
+              _version_: 4,
+              id: 'id1',
+              file: 'ambari-agent.log',
+              seq_num: 5,
+              bundle_id: 'b1',
+              case_id: 'c1',
+              log_message: 'User(user), Operation(SERVICE_CHECK)',
+              logfile_line_number: 6,
+              message_md5: '10293847561029384756',
+              cluster: 'cl1',
+              event_count: 2,
+              event_md5: '01928374650192837465',
+              event_dur_ms: 500,
+              _ttl_: "+7DAYS",
+              _expire_at_: '2017-05-29T11:30:22.531Z',
+              _router_field_: 10
+            }
+          ],
+          bargraph: {
+            graphData: [
+              {
+                dataCount: [
+                  {
+                    name: 'n0',
+                    value: 1
+                  },
+                  {
+                    name: 'n1',
+                    value: 2
+                  }
+                ],
+                name: 'graph0'
+              },
+              {
+                dataCount: [
+                  {
+                    name: 'n2',
+                    value: 10
+                  },
+                  {
+                    name: 'n3',
+                    value: 20
+                  }
+                ],
+                name: 'graph1'
+              }
+            ]
+          },
+          components: {},
+          resources: {
+            graphData: [
+              {
+                dataCount: [
+                  {
+                    name: 'n16',
+                    value: 800
+                  },
+                  {
+                    name: 'n17',
+                    value: 400
+                  }
+                ],
+                name: 'graph8'
+              },
+              {
+                dataCount: [
+                  {
+                    name: 'n18',
+                    value: 600
+                  },
+                  {
+                    name: 'n19',
+                    value: 300
+                  }
+                ],
+                name: 'graph9'
+              }
+            ]
+          },
+          schema: {
+            fields: ''
+          },
+          serviceload: {
+            graphData: [
+              {
+                dataCount: [
+                  {
+                    name: 'n4',
+                    value: 1
+                  },
+                  {
+                    name: 'n5',
+                    value: 2
+                  }
+                ],
+                name: 'graph2'
+              },
+              {
+                dataCount: [
+                  {
+                    name: 'n6',
+                    value: 10
+                  },
+                  {
+                    name: 'n7',
+                    value: 20
+                  }
+                ],
+                name: 'graph3'
+              }
+            ]
+          }
+        }
+      },
+      public: {
+        config: {}
+      },
+      service: {
+        logs: {
+          logList: [
+            {
+              path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
+              host: 'h0',
+              level: 'WARN',
+              logtime: 1497474000000,
+              ip: '192.168.0.1',
+              logfile_line_number: 8,
+              type: 'ams_collector',
+              _version_: 9,
+              id: 'id2',
+              file: 'ambari-metrics-collector.log',
+              seq_num: 10,
+              bundle_id: 'b2',
+              case_id: 'c2',
+              log_message: 'Connection refused.\nPlease check Ambari Metrics.\nCheck log file for details.',
+              message_md5: '1357908642',
+              cluster: 'cl2',
+              event_count: 5,
+              event_md5: '1908755391',
+              event_dur_ms: 200,
+              _ttl_: "+5DAYS",
+              _expire_at_: 1497906000000,
+              _router_field_: 20
+            },
+            {
+              path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
+              host: 'h1',
+              level: 'ERROR',
+              logtime: 1497387600000,
+              ip: '192.168.0.2',
+              type: 'ams_collector',
+              _version_: 14,
+              id: 'id3',
+              file: 'ambari-metrics-collector.log',
+              seq_num: 15,
+              bundle_id: 'b3',
+              case_id: 'c3',
+              log_message: 'Connection refused.\nPlease check Ambari Metrics.\nCheck log file for details.',
+              logfile_line_number: 16,
+              message_md5: '1357908642',
+              cluster: 'cl3',
+              event_count: 2,
+              event_md5: '1029384756',
+              event_dur_ms: 700,
+              _ttl_: "+5DAYS",
+              _expire_at_: 1497819600000,
+              _router_field_: 5
+            },
+            {
+              path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
+              host: 'h1',
+              level: 'FATAL',
+              logtime: 1497042000000,
+              ip: '192.168.0.3',
+              type: 'ambari_agent',
+              _version_: 14,
+              id: 'id4',
+              file: 'ambari-agent.log',
+              seq_num: 15,
+              bundle_id: 'b4',
+              case_id: 'c4',
+              log_message: 'Connection refused.\nPlease check Ambari Agent.\nCheck log file for details.',
+              logfile_line_number: 16,
+              message_md5: '1038027502',
+              cluster: 'cl4',
+              event_count: 2,
+              event_md5: '67589403',
+              event_dur_ms: 100,
+              _ttl_: "+5DAYS",
+              _expire_at_: 1497474000000,
+              _router_field_: 45
+            },
+            {
+              path: '/var/log/ambari-metrics-collector/zookeeper-server.log',
+              host: 'h1',
+              level: 'INFO',
+              logtime: 1497956919700,
+              ip: '192.168.0.4',
+              type: 'zookeeper_server',
+              _version_: 14,
+              id: 'id4',
+              file: 'zookeeper_server.log',
+              seq_num: 15,
+              bundle_id: 'b0',
+              case_id: 'c0',
+              log_message: 'Connection refused.\nPlease check ZooKeeper Server.\nCheck log file for details.',
+              logfile_line_number: 16,
+              message_md5: '1038027502',
+              cluster: 'cl0',
+              event_count: 2,
+              event_md5: '67589403',
+              event_dur_ms: 1000,
+              _ttl_: "+5DAYS",
+              _expire_at_: 1497956939700,
+              _router_field_: 55
+            },
+            {
+              path: '/var/log/ambari-metrics-collector/zookeeper-server.log',
+              host: 'h1',
+              level: 'DEBUG',
+              logtime: 1497956919700,
+              ip: '192.168.0.4',
+              type: 'zookeeper_server',
+              _version_: 14,
+              id: 'id4',
+              file: 'zookeeper_server.log',
+              seq_num: 15,
+              bundle_id: 'b0',
+              case_id: 'c0',
+              log_message: 'Connection refused.\nPlease check ZooKeeper Server.\nCheck log file for details.',
+              logfile_line_number: 16,
+              message_md5: '1038027502',
+              cluster: 'cl1',
+              event_count: 2,
+              event_md5: '67589403',
+              event_dur_ms: 1000,
+              _ttl_: "+5DAYS",
+              _expire_at_: 1497956939700,
+              _router_field_: 55
+            },
+            {
+              path: '/var/log/ambari-metrics-collector/zookeeper-client.log',
+              host: 'h1',
+              level: 'TRACE',
+              logtime: 1497956919700,
+              ip: '192.168.0.4',
+              type: 'zookeeper_client',
+              _version_: 14,
+              id: 'id4',
+              file: 'zookeeper_client.log',
+              seq_num: 15,
+              bundle_id: 'b0',
+              case_id: 'c0',
+              log_message: 'Connection refused.\nPlease check ZooKeeper Client.\nCheck log file for details.',
+              logfile_line_number: 16,
+              message_md5: '1038027502',
+              cluster: 'cl1',
+              event_count: 2,
+              event_md5: '67589403',
+              event_dur_ms: 1000,
+              _ttl_: "+5DAYS",
+              _expire_at_: 1497956939700,
+              _router_field_: 55
+            },
+            {
+              path: '/var/log/ambari-metrics-collector/zookeeper-client.log',
+              host: 'h1',
+              level: 'UNKNOWN',
+              logtime: 1497956919700,
+              ip: '192.168.0.4',
+              type: 'zookeeper_client',
+              _version_: 14,
+              id: 'id4',
+              file: 'zookeeper_client.log',
+              seq_num: 15,
+              bundle_id: 'b0',
+              case_id: 'c0',
+              log_message: 'Connection refused.\nPlease check ZooKeeper Client.\nCheck log file for details.',
+              logfile_line_number: 16,
+              message_md5: '1038027502',
+              cluster: 'cl1',
+              event_count: 2,
+              event_md5: '67589403',
+              event_dur_ms: 1000,
+              _ttl_: "+5DAYS",
+              _expire_at_: 1497956939700,
+              _router_field_: 55
+            }
+          ],
+          aggregated: {
+            graphData: [
+              {
+                name: 'n0',
+                count: 100,
+                dataList: [
+                  {
+                    name: 'n1',
+                    count: 50,
+                    dataList: null
+                  },
+                  {
+                    name: 'n2',
+                    count: 200,
+                    dataList: null
+                  }
+                ]
+              },
+              {
+                name: 'n3',
+                count: 10,
+                dataList: [
+                  {
+                    name: 'n4',
+                    count: 5,
+                    dataList: null
+                  },
+                  {
+                    name: 'n5',
+                    count: 20,
+                    dataList: null
+                  }
+                ]
+              }
+            ]
+          },
+          components: {
+            count: {
+              anygraph: {
+                graphData: [
+                  {
+                    dataCount: [
+                      {
+                        name: 'n8',
+                        value: 50
+                      },
+                      {
+                        name: 'n9',
+                        value: 100
+                      }
+                    ],
+                    name: 'graph4'
+                  },
+                  {
+                    dataCount: [
+                      {
+                        name: 'n10',
+                        value: 5
+                      },
+                      {
+                        name: 'n11',
+                        value: 10
+                      }
+                    ],
+                    name: 'graph5'
+                  }
+                ]
+              }
+            },
+            levels: {
+              counts: {
+                vNodeList: [
+                  {
+                    name: 'ambari',
+                    type: 0,
+                    logLevelCount: [
+                      {
+                        name: 'ERROR',
+                        value: '10'
+                      },
+                      {
+                        name: 'WARN',
+                        value: '50'
+                      }
+                    ],
+                    childs: [
+                      {
+                        name: 'hdfs',
+                        type: 2,
+                        logLevelCount: [
+                          {
+                            name: 'ERROR',
+                            value: '10'
+                          },
+                          {
+                            name: 'WARN',
+                            value: '20'
+                          }
+                        ],
+                        isParent: false,
+                        isRoot: false
+                      },
+                      {
+                        name: 'zookeeper',
+                        type: 3,
+                        logLevelCount: [
+                          {
+                            name: 'ERROR',
+                            value: '20'
+                          },
+                          {
+                            name: 'WARN',
+                            value: '40'
+                          }
+                        ],
+                        isParent: false,
+                        isRoot: false
+                      }
+                    ],
+                    isParent: true,
+                    isRoot: false
+                  },
+                  {
+                    name: 'ambari_agent',
+                    type: 1,
+                    logLevelCount: [
+                      {
+                        name: 'ERROR',
+                        value: '100'
+                      },
+                      {
+                        name: 'WARN',
+                        value: '500'
+                      }
+                    ],
+                    isParent: false,
+                    isRoot: false
+                  }
+                ]
+              }
+            }
+          },
+          files: {
+            hostLogFiles: {
+              clusters: [
+                'c0',
+                'c1'
+              ],
+              services: [
+                'hdfs',
+                'zookeeper'
+              ]
+            }
+          },
+          histogram: {
+            graphData: [
+              {
+                dataCount: [
+                  {
+                    name: 'n12',
+                    value: 1000
+                  },
+                  {
+                    name: 'n13',
+                    value: 2000
+                  }
+                ],
+                name: 'graph6'
+              },
+              {
+                dataCount: [
+                  {
+                    name: 'n14',
+                    value: 700
+                  },
+                  {
+                    name: 'n15',
+                    value: 900
+                  }
+                ],
+                name: 'graph7'
+              }
+            ]
+          },
+          hosts: {
+            components: {
+              vNodeList: [
+                {
+                  name: 'ambari',
+                  type: 0,
+                  logLevelCount: [
+                    {
+                      name: 'ERROR',
+                      value: '100'
+                    },
+                    {
+                      name: 'WARN',
+                      value: '500'
+                    }
+                  ],
+                  childs: [
+                    {
+                      name: 'ambari_metrics',
+                      type: 2,
+                      logLevelCount: [
+                        {
+                          name: 'ERROR',
+                          value: '100'
+                        },
+                        {
+                          name: 'WARN',
+                          value: '200'
+                        }
+                      ],
+                      isParent: false,
+                      isRoot: false
+                    },
+                    {
+                      name: 'hbase',
+                      type: 3,
+                      logLevelCount: [
+                        {
+                          name: 'ERROR',
+                          value: '200'
+                        },
+                        {
+                          name: 'WARN',
+                          value: '400'
+                        }
+                      ],
+                      isParent: false,
+                      isRoot: false
+                    }
+                  ],
+                  isParent: true,
+                  isRoot: false
+                },
+                {
+                  name: 'ambari_server',
+                  type: 1,
+                  logLevelCount: [
+                    {
+                      name: 'ERROR',
+                      value: '1000'
+                    },
+                    {
+                      name: 'WARN',
+                      value: '5000'
+                    }
+                  ],
+                  isParent: false,
+                  isRoot: false
+                }
+              ]
+            },
+            count: {
+              getvCounts: [
+                {
+                  name: 'n20',
+                  count: 100
+                },
+                {
+                  name: 'n21',
+                  count: 200
+                }
+              ]
+            }
+          },
+          levels: {
+            counts: {
+              getvNameValues: [
+                {
+                  name: 'n22',
+                  count: 1000
+                },
+                {
+                  name: 'n23',
+                  count: 2000
+                }
+              ]
+            }
+          },
+          schema: {
+            fields: ''
+          },
+          serviceconfig: '',
+          tree: {
+            vNodeList: [
+              {
+                name: 'ambari',
+                type: 0,
+                logLevelCount: [
+                  {
+                    name: 'ERROR',
+                    value: '1000'
+                  },
+                  {
+                    name: 'WARN',
+                    value: '5000'
+                  }
+                ],
+                childs: [
+                  {
+                    name: 'yarn',
+                    type: 2,
+                    logLevelCount: [
+                      {
+                        name: 'ERROR',
+                        value: '1000'
+                      },
+                      {
+                        name: 'WARN',
+                        value: '2000'
+                      }
+                    ],
+                    isParent: false,
+                    isRoot: false
+                  },
+                  {
+                    name: 'hive',
+                    type: 3,
+                    logLevelCount: [
+                      {
+                        name: 'ERROR',
+                        value: '2000'
+                      },
+                      {
+                        name: 'WARN',
+                        value: '4000'
+                      }
+                    ],
+                    isParent: false,
+                    isRoot: false
+                  }
+                ],
+                isParent: true,
+                isRoot: false
+              },
+              {
+                name: 'ambari_server',
+                type: 1,
+                logLevelCount: [
+                  {
+                    name: 'ERROR',
+                    value: '10000'
+                  },
+                  {
+                    name: 'WARN',
+                    value: '50000'
+                  }
+                ],
+                isParent: false,
+                isRoot: false
+              }
+            ]
+          },
+          truncated: {
+            logList: [
+              {
+                path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
+                host: 'h0',
+                level: 'WARN',
+                logtime: '2017-05-28T11:30:22.531Z',
+                ip: '192.168.0.1',
+                logfile_line_number: 8,
+                type: 'ams_collector',
+                _version_: 9,
+                id: 'id2',
+                file: 'ambari-metrics-collector.log',
+                seq_num: 10,
+                bundle_id: 'b2',
+                case_id: 'c2',
+                log_message: 'Connection refused',
+                message_md5: '1357908642',
+                cluster: 'cl2',
+                event_count: 5,
+                event_md5: '1908755391',
+                event_dur_ms: 200,
+                _ttl_: "+5DAYS",
+                _expire_at_: '2017-05-29T11:30:22.531Z',
+                _router_field_: 20
+              },
+              {
+                path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
+                host: 'h1',
+                level: 'ERROR',
+                logtime: '2017-05-28T10:30:22.531Z',
+                ip: '192.168.0.2',
+                type: 'ams_collector',
+                _version_: 14,
+                id: 'id3',
+                file: 'ambari-metrics-collector.log',
+                seq_num: 15,
+                bundle_id: 'b3',
+                case_id: 'c3',
+                log_message: 'Connection refused',
+                logfile_line_number: 16,
+                message_md5: '1357908642',
+                cluster: 'cl3',
+                event_count: 2,
+                event_md5: '1029384756',
+                event_dur_ms: 700,
+                _ttl_: "+5DAYS",
+                _expire_at_: '2017-05-29T10:30:22.531Z',
+                _router_field_: 5
+              }
+            ]
+          }
+        }
+      },
+      status: {
+        auditlogs: {
+          znodeReady: true,
+          solrCollectionReady: true,
+          solrAliasReady: false,
+          configurationUploaded: true
+        },
+        servicelogs: {
+          znodeReady: true,
+          solrCollectionReady: true,
+          configurationUploaded: true
+        },
+        userconfig: {
+          znodeReady: true,
+          solrCollectionReady: true,
+          configurationUploaded: true
+        }
+      },
+      userconfig: {
+        userConfigList: [
+          {
+            id: 'c0',
+            userName: 'admin',
+            filtername: 'service',
+            values: 'hdfs',
+            shareNameList: [
+              's0',
+              's1'
+            ],
+            rowType: 'history'
+          },
+          {
+            id: 'c0',
+            userName: 'user',
+            filtername: 'component',
+            values: 'namenode',
+            shareNameList: [
+              's2',
+              's3'
+            ],
+            rowType: 'history'
+          }
+        ],
+        filters: {
+          filter0: {
+            label: 'filter0',
+            hosts: [
+              'h0',
+              'h1'
+            ],
+            defaultLevels: [
+              'l0',
+              'l1'
+            ],
+            overrideLevels: [
+              'l2',
+              'l3'
+            ],
+            expiryTime: '2017-05-29T11:30:22.531Z'
+          },
+          filter1: {
+            label: 'filter1',
+            hosts: [
+              'h1',
+              'h2'
+            ],
+            defaultLevels: [
+              'l4',
+              'l5'
+            ],
+            overrideLevels: [
+              'l6',
+              'l7'
+            ],
+            expiryTime: '2017-05-30T11:30:22.531Z'
+          }
+        },
+        names: []
+      }
+    }
+  }
+};
\ No newline at end of file


[02/21] ambari git commit: AMBARI-21310 Log Search UI: Provide ability to use mocked data for api calls (akovalenko)

Posted by ab...@apache.org.
AMBARI-21310 Log Search UI: Provide ability to use mocked data for api calls (akovalenko)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/4ce2f2c5
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/4ce2f2c5
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/4ce2f2c5

Branch: refs/heads/branch-feature-logsearch-ui
Commit: 4ce2f2c528c62a7f2651381df17630a86e104c1b
Parents: da6ea9f
Author: Aleksandr Kovalenko <ak...@hortonworks.com>
Authored: Tue Apr 11 14:01:25 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jun 22 14:53:24 2017 +0300

----------------------------------------------------------------------
 .../ambari-logsearch-web-new/.angular-cli.json  |  3 +-
 .../ambari-logsearch-web-new/package.json       |  3 ++
 .../src/app/app.component.html                  | 17 +++++++++
 .../src/app/app.component.less                  | 16 +++++++++
 .../src/app/app.component.spec.ts               | 18 ++++++++++
 .../src/app/app.component.ts                    | 21 ++++++++++-
 .../src/app/app.module.ts                       | 38 ++++++++++++++++----
 .../src/app/mock-api-data.service.ts            | 25 +++++++++++++
 .../src/environments/environment.prod.ts        | 18 ++++++++++
 .../src/environments/environment.ts             | 21 ++++++++---
 .../ambari-logsearch-web-new/src/styles.less    | 18 +++++++++-
 11 files changed, 184 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/4ce2f2c5/ambari-logsearch/ambari-logsearch-web-new/.angular-cli.json
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/.angular-cli.json b/ambari-logsearch/ambari-logsearch-web-new/.angular-cli.json
index 7b5c13b..03c5382 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/.angular-cli.json
+++ b/ambari-logsearch/ambari-logsearch-web-new/.angular-cli.json
@@ -19,7 +19,8 @@
       "testTsconfig": "tsconfig.spec.json",
       "prefix": "app",
       "styles": [
-        "styles.less"
+        "styles.less",
+        "../node_modules/bootstrap/dist/css/bootstrap.min.css"
       ],
       "scripts": [],
       "environmentSource": "environments/environment.ts",

http://git-wip-us.apache.org/repos/asf/ambari/blob/4ce2f2c5/ambari-logsearch/ambari-logsearch-web-new/package.json
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/package.json b/ambari-logsearch/ambari-logsearch-web-new/package.json
index f13d358..01ac4be 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/package.json
+++ b/ambari-logsearch/ambari-logsearch-web-new/package.json
@@ -19,7 +19,9 @@
     "@angular/platform-browser": "^4.0.0",
     "@angular/platform-browser-dynamic": "^4.0.0",
     "@angular/router": "^4.0.0",
+    "bootstrap": "^3.3.7",
     "core-js": "^2.4.1",
+    "ngx-bootstrap": "^1.6.6",
     "rxjs": "^5.1.0",
     "zone.js": "^0.8.4"
   },
@@ -28,6 +30,7 @@
     "@angular/compiler-cli": "^4.0.0",
     "@types/jasmine": "2.5.38",
     "@types/node": "~6.0.60",
+    "angular-in-memory-web-api": "^0.3.1",
     "codelyzer": "~2.0.0",
     "jasmine-core": "~2.5.2",
     "jasmine-spec-reporter": "~3.2.0",

http://git-wip-us.apache.org/repos/asf/ambari/blob/4ce2f2c5/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html
index b6931b5..85b96dc 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html
@@ -1,3 +1,20 @@
+<!--
+  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.
+-->
+
 <h1>
   {{title}}
 </h1>

http://git-wip-us.apache.org/repos/asf/ambari/blob/4ce2f2c5/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
index e69de29..2944f98 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
@@ -0,0 +1,16 @@
+/*
+ * 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.
+ */

http://git-wip-us.apache.org/repos/asf/ambari/blob/4ce2f2c5/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.spec.ts
index c740bcd..d57f9c4 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.spec.ts
@@ -1,3 +1,21 @@
+/**
+ * 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.
+ */
+
 import { TestBed, async } from '@angular/core/testing';
 
 import { AppComponent } from './app.component';

http://git-wip-us.apache.org/repos/asf/ambari/blob/4ce2f2c5/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts
index 3ffdc2e..5f59b8e 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts
@@ -1,10 +1,29 @@
-import { Component } from '@angular/core';
+/**
+ * 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.
+ */
+
+import {Component} from '@angular/core';
 
 @Component({
   selector: 'app-root',
   templateUrl: './app.component.html',
   styleUrls: ['./app.component.less']
 })
+
 export class AppComponent {
   title = 'Ambari Log Search';
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/4ce2f2c5/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
index 67ae491..34b7978 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
@@ -1,9 +1,30 @@
-import { BrowserModule } from '@angular/platform-browser';
-import { NgModule } from '@angular/core';
-import { FormsModule } from '@angular/forms';
-import { HttpModule } from '@angular/http';
+/**
+ * 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.
+ */
 
-import { AppComponent } from './app.component';
+import {BrowserModule} from '@angular/platform-browser';
+import {NgModule} from '@angular/core';
+import {FormsModule} from '@angular/forms';
+import {HttpModule} from '@angular/http';
+import {InMemoryWebApiModule} from 'angular-in-memory-web-api';
+import {mockApiDataService} from './mock-api-data.service'
+import {AlertModule} from 'ngx-bootstrap';
+
+import {AppComponent} from './app.component';
 
 @NgModule({
   declarations: [
@@ -12,9 +33,12 @@ import { AppComponent } from './app.component';
   imports: [
     BrowserModule,
     FormsModule,
-    HttpModule
+    HttpModule,
+    InMemoryWebApiModule.forRoot(mockApiDataService),
+    AlertModule.forRoot()
   ],
   providers: [],
   bootstrap: [AppComponent]
 })
-export class AppModule { }
+export class AppModule {
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/4ce2f2c5/ambari-logsearch/ambari-logsearch-web-new/src/app/mock-api-data.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/mock-api-data.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/mock-api-data.service.ts
new file mode 100644
index 0000000..da32c7e
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/mock-api-data.service.ts
@@ -0,0 +1,25 @@
+/**
+ * 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.
+ */
+
+import {InMemoryDbService} from 'angular-in-memory-web-api';
+
+export class mockApiDataService implements InMemoryDbService {
+  createDb() {
+    return {};
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/4ce2f2c5/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.prod.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.prod.ts b/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.prod.ts
index 3612073..690ddb1 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.prod.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.prod.ts
@@ -1,3 +1,21 @@
+/**
+ * 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.
+ */
+
 export const environment = {
   production: true
 };

http://git-wip-us.apache.org/repos/asf/ambari/blob/4ce2f2c5/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.ts b/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.ts
index b7f639a..e34c67c 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.ts
@@ -1,7 +1,20 @@
-// The file contents for the current environment will overwrite these during build.
-// The build system defaults to the dev environment which uses `environment.ts`, but if you do
-// `ng build --env=prod` then `environment.prod.ts` will be used instead.
-// The list of which env maps to which file can be found in `.angular-cli.json`.
+/**
+ * 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.
+ */
 
 export const environment = {
   production: false

http://git-wip-us.apache.org/repos/asf/ambari/blob/4ce2f2c5/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/styles.less b/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
index 90d4ee0..5d5f1e3 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
@@ -1 +1,17 @@
-/* You can add global styles to this file, and also import other style files */
+/**
+ * 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.
+ */


[10/21] ambari git commit: AMBARI-21313 Log Search UI: implement service for string constants (additional patch). (ababiichuk)

Posted by ab...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/84a59d71/ambari-logsearch/ambari-logsearch-web-new/yarn.lock
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/yarn.lock b/ambari-logsearch/ambari-logsearch-web-new/yarn.lock
new file mode 100644
index 0000000..d521f70
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/yarn.lock
@@ -0,0 +1,5312 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@angular/cli@1.0.0":
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-1.0.0.tgz#7bfde1e7c5f28bf5bed4dda1352ee67ee887302f"
+  dependencies:
+    "@ngtools/json-schema" "1.0.5"
+    "@ngtools/webpack" "1.3.0"
+    autoprefixer "^6.5.3"
+    chalk "^1.1.3"
+    common-tags "^1.3.1"
+    css-loader "^0.26.1"
+    cssnano "^3.10.0"
+    debug "^2.1.3"
+    denodeify "^1.2.1"
+    diff "^3.1.0"
+    ember-cli-normalize-entity-name "^1.0.0"
+    ember-cli-string-utils "^1.0.0"
+    exports-loader "^0.6.3"
+    extract-text-webpack-plugin "~2.0.0"
+    file-loader "^0.10.0"
+    fs-extra "^2.0.0"
+    get-caller-file "^1.0.0"
+    glob "^7.0.3"
+    html-webpack-plugin "^2.19.0"
+    inflection "^1.7.0"
+    inquirer "^3.0.0"
+    isbinaryfile "^3.0.0"
+    istanbul-instrumenter-loader "^2.0.0"
+    json-loader "^0.5.4"
+    karma-sourcemap-loader "^0.3.7"
+    karma-webpack "^2.0.0"
+    less "^2.7.2"
+    less-loader "^2.2.3"
+    lodash "^4.11.1"
+    minimatch "^3.0.3"
+    node-modules-path "^1.0.0"
+    nopt "^4.0.1"
+    opn "4.0.2"
+    portfinder "~1.0.12"
+    postcss-loader "^0.13.0"
+    postcss-url "^5.1.2"
+    raw-loader "^0.5.1"
+    resolve "^1.1.7"
+    rimraf "^2.5.3"
+    rsvp "^3.0.17"
+    rxjs "^5.0.1"
+    sass-loader "^4.1.1"
+    script-loader "^0.7.0"
+    semver "^5.1.0"
+    silent-error "^1.0.0"
+    source-map-loader "^0.1.5"
+    style-loader "^0.13.1"
+    stylus "^0.54.5"
+    stylus-loader "^2.4.0"
+    temp "0.8.3"
+    typescript ">=2.0.0 <2.3.0"
+    url-loader "^0.5.7"
+    walk-sync "^0.3.1"
+    webpack "~2.2.0"
+    webpack-dev-server "~2.3.0"
+    webpack-merge "^2.4.0"
+    zone.js "^0.7.2"
+  optionalDependencies:
+    node-sass "^4.3.0"
+
+"@angular/common@^4.0.0":
+  version "4.1.3"
+  resolved "https://registry.yarnpkg.com/@angular/common/-/common-4.1.3.tgz#e7c4791e32131cf74c239428c2a67daab2eef017"
+
+"@angular/compiler-cli@^4.0.0":
+  version "4.1.3"
+  resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-4.1.3.tgz#c2362ffdf65756471481f839fab675bcac213f96"
+  dependencies:
+    "@angular/tsc-wrapped" "4.1.3"
+    minimist "^1.2.0"
+    reflect-metadata "^0.1.2"
+
+"@angular/compiler@^4.0.0":
+  version "4.1.3"
+  resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-4.1.3.tgz#d2dd30853b0cf4a54758b4a314632c231f9c94c3"
+
+"@angular/core@^4.0.0":
+  version "4.1.3"
+  resolved "https://registry.yarnpkg.com/@angular/core/-/core-4.1.3.tgz#285498eb86ab7d0b6f982f8f9f487ef610013b35"
+
+"@angular/forms@^4.0.0":
+  version "4.1.3"
+  resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-4.1.3.tgz#380ab4c3af84c5d1d748c2a7d04151c7dc8e4982"
+
+"@angular/http@^4.0.0":
+  version "4.1.3"
+  resolved "https://registry.yarnpkg.com/@angular/http/-/http-4.1.3.tgz#eb9d1c302a0172815f9a573310d9be0bdeb845ae"
+
+"@angular/platform-browser-dynamic@^4.0.0":
+  version "4.1.3"
+  resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-4.1.3.tgz#3c13fdcf591d487f6efdc1d46913f280c6d8c2ec"
+
+"@angular/platform-browser@^4.0.0":
+  version "4.1.3"
+  resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-4.1.3.tgz#4fa1db5119dd178b315ddae5b329bee1a932a5bd"
+
+"@angular/router@^4.0.0":
+  version "4.1.3"
+  resolved "https://registry.yarnpkg.com/@angular/router/-/router-4.1.3.tgz#ddafd46ae7ccc8b1f74904ffb45f394e44625216"
+
+"@angular/tsc-wrapped@4.1.3":
+  version "4.1.3"
+  resolved "https://registry.yarnpkg.com/@angular/tsc-wrapped/-/tsc-wrapped-4.1.3.tgz#2d6372c9187bf1621eacd960b94b39c4f95293cd"
+  dependencies:
+    tsickle "^0.21.0"
+
+"@ngtools/json-schema@1.0.5":
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/@ngtools/json-schema/-/json-schema-1.0.5.tgz#ad39037c70c88b245ac7267a71777646b6063d77"
+
+"@ngtools/webpack@1.3.0":
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-1.3.0.tgz#a1071230985358ecdf87b2fa9879ae6cc6355e83"
+  dependencies:
+    enhanced-resolve "^3.1.0"
+    loader-utils "^1.0.2"
+    magic-string "^0.19.0"
+    source-map "^0.5.6"
+
+"@ngx-translate/core@^6.0.1":
+  version "6.0.1"
+  resolved "https://registry.yarnpkg.com/@ngx-translate/core/-/core-6.0.1.tgz#7c7a80077feb994fc815b67a72065af04d394efe"
+
+"@ngx-translate/http-loader@^0.0.3":
+  version "0.0.3"
+  resolved "https://registry.yarnpkg.com/@ngx-translate/http-loader/-/http-loader-0.0.3.tgz#8346c8d2d6f630254601029668f17abe2afe8a9b"
+
+"@types/jasmine@2.5.38":
+  version "2.5.38"
+  resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.5.38.tgz#a4379124c4921d4e21de54ec74669c9e9b356717"
+
+"@types/node@^6.0.46", "@types/node@~6.0.60":
+  version "6.0.73"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.73.tgz#85dc4bb6f125377c75ddd2519a1eeb63f0a4ed70"
+
+"@types/q@^0.0.32":
+  version "0.0.32"
+  resolved "https://registry.yarnpkg.com/@types/q/-/q-0.0.32.tgz#bd284e57c84f1325da702babfc82a5328190c0c5"
+
+"@types/selenium-webdriver@^2.53.35", "@types/selenium-webdriver@~2.53.39":
+  version "2.53.42"
+  resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-2.53.42.tgz#74cb77fb6052edaff2a8984ddafd88d419f25cac"
+
+abbrev@1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f"
+
+accepts@1.3.3, accepts@~1.3.3:
+  version "1.3.3"
+  resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca"
+  dependencies:
+    mime-types "~2.1.11"
+    negotiator "0.6.1"
+
+acorn-dynamic-import@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4"
+  dependencies:
+    acorn "^4.0.3"
+
+acorn@^4.0.3, acorn@^4.0.4:
+  version "4.0.13"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
+
+adm-zip@0.4.4:
+  version "0.4.4"
+  resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.4.tgz#a61ed5ae6905c3aea58b3a657d25033091052736"
+
+adm-zip@^0.4.7:
+  version "0.4.7"
+  resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.7.tgz#8606c2cbf1c426ce8c8ec00174447fd49b6eafc1"
+
+after@0.8.2:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f"
+
+agent-base@2:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-2.1.0.tgz#193455e4347bca6b05847cb81e939bb325446da8"
+  dependencies:
+    extend "~3.0.0"
+    semver "~5.0.1"
+
+ajv-keywords@^1.1.1:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c"
+
+ajv@^4.11.2, ajv@^4.7.0, ajv@^4.9.1:
+  version "4.11.8"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
+  dependencies:
+    co "^4.6.0"
+    json-stable-stringify "^1.0.1"
+
+align-text@^0.1.1, align-text@^0.1.3:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
+  dependencies:
+    kind-of "^3.0.2"
+    longest "^1.0.1"
+    repeat-string "^1.5.2"
+
+alphanum-sort@^1.0.1, alphanum-sort@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
+
+amdefine@>=0.0.4:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
+
+angular-in-memory-web-api@^0.3.1:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/angular-in-memory-web-api/-/angular-in-memory-web-api-0.3.2.tgz#8836d9e2534d37b728f3cb5a1caf6fe1e7fbbecd"
+
+ansi-align@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f"
+  dependencies:
+    string-width "^2.0.0"
+
+ansi-escapes@^1.1.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
+
+ansi-html@0.0.7:
+  version "0.0.7"
+  resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e"
+
+ansi-regex@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+
+ansi-styles@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+
+any-promise@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
+
+anymatch@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507"
+  dependencies:
+    arrify "^1.0.0"
+    micromatch "^2.1.5"
+
+app-root-path@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.0.1.tgz#cd62dcf8e4fd5a417efc664d2e5b10653c651b46"
+
+append-transform@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991"
+  dependencies:
+    default-require-extensions "^1.0.0"
+
+aproba@^1.0.3:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.1.tgz#95d3600f07710aa0e9298c726ad5ecf2eacbabab"
+
+are-we-there-yet@~1.1.2:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d"
+  dependencies:
+    delegates "^1.0.0"
+    readable-stream "^2.0.6"
+
+argparse@^1.0.7:
+  version "1.0.9"
+  resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86"
+  dependencies:
+    sprintf-js "~1.0.2"
+
+arr-diff@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
+  dependencies:
+    arr-flatten "^1.0.1"
+
+arr-flatten@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1"
+
+array-find-index@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
+
+array-flatten@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+
+array-slice@^0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5"
+
+array-union@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
+  dependencies:
+    array-uniq "^1.0.1"
+
+array-uniq@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+
+array-unique@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
+
+arraybuffer.slice@0.0.6:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca"
+
+arrify@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
+
+asap@~2.0.3:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f"
+
+asn1.js@^4.0.0:
+  version "4.9.1"
+  resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.1.tgz#48ba240b45a9280e94748990ba597d216617fd40"
+  dependencies:
+    bn.js "^4.0.0"
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+
+asn1@~0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+
+assert-plus@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234"
+
+assert@^1.1.1:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
+  dependencies:
+    util "0.10.3"
+
+async-each@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
+
+async-foreach@^0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542"
+
+async@^0.9.0, async@~0.9.0:
+  version "0.9.2"
+  resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d"
+
+async@^1.4.0, async@^1.5.2:
+  version "1.5.2"
+  resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+
+async@^2.0.1, async@^2.1.2, async@^2.1.4:
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/async/-/async-2.4.1.tgz#62a56b279c98a11d0987096a01cc3eeb8eb7bbd7"
+  dependencies:
+    lodash "^4.14.0"
+
+async@~0.2.6:
+  version "0.2.10"
+  resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1"
+
+asynckit@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+
+autoprefixer@^6.3.1, autoprefixer@^6.5.3:
+  version "6.7.7"
+  resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014"
+  dependencies:
+    browserslist "^1.7.6"
+    caniuse-db "^1.0.30000634"
+    normalize-range "^0.1.2"
+    num2fraction "^1.2.2"
+    postcss "^5.2.16"
+    postcss-value-parser "^3.2.3"
+
+aws-sign2@~0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
+
+aws4@^1.2.1:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
+
+babel-code-frame@^6.11.0, babel-code-frame@^6.20.0, babel-code-frame@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4"
+  dependencies:
+    chalk "^1.1.0"
+    esutils "^2.0.2"
+    js-tokens "^3.0.0"
+
+babel-generator@^6.18.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.1.tgz#e715f486c58ded25649d888944d52aa07c5d9497"
+  dependencies:
+    babel-messages "^6.23.0"
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+    detect-indent "^4.0.0"
+    jsesc "^1.3.0"
+    lodash "^4.2.0"
+    source-map "^0.5.0"
+    trim-right "^1.0.1"
+
+babel-messages@^6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-runtime@^6.18.0, babel-runtime@^6.22.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b"
+  dependencies:
+    core-js "^2.4.0"
+    regenerator-runtime "^0.10.0"
+
+babel-template@^6.16.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.24.1.tgz#04ae514f1f93b3a2537f2a0f60a5a45fb8308333"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+    babylon "^6.11.0"
+    lodash "^4.2.0"
+
+babel-traverse@^6.18.0, babel-traverse@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.24.1.tgz#ab36673fd356f9a0948659e7b338d5feadb31695"
+  dependencies:
+    babel-code-frame "^6.22.0"
+    babel-messages "^6.23.0"
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+    babylon "^6.15.0"
+    debug "^2.2.0"
+    globals "^9.0.0"
+    invariant "^2.2.0"
+    lodash "^4.2.0"
+
+babel-types@^6.18.0, babel-types@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2ff0975"
+  dependencies:
+    babel-runtime "^6.22.0"
+    esutils "^2.0.2"
+    lodash "^4.2.0"
+    to-fast-properties "^1.0.1"
+
+babylon@^6.11.0, babylon@^6.13.0, babylon@^6.15.0:
+  version "6.17.1"
+  resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.1.tgz#17f14fddf361b695981fe679385e4f1c01ebd86f"
+
+backo2@1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947"
+
+balanced-match@^0.4.1, balanced-match@^0.4.2:
+  version "0.4.2"
+  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838"
+
+base64-arraybuffer@0.1.5:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8"
+
+base64-js@^1.0.2:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1"
+
+base64id@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6"
+
+batch@0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
+
+bcrypt-pbkdf@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
+  dependencies:
+    tweetnacl "^0.14.3"
+
+better-assert@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522"
+  dependencies:
+    callsite "1.0.0"
+
+big.js@^3.1.3:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978"
+
+binary-extensions@^1.0.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774"
+
+blob@0.0.4:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921"
+
+block-stream@*:
+  version "0.0.9"
+  resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
+  dependencies:
+    inherits "~2.0.0"
+
+blocking-proxy@0.0.5:
+  version "0.0.5"
+  resolved "https://registry.yarnpkg.com/blocking-proxy/-/blocking-proxy-0.0.5.tgz#462905e0dcfbea970f41aa37223dda9c07b1912b"
+  dependencies:
+    minimist "^1.2.0"
+
+bluebird@^3.3.0, bluebird@^3.4.7:
+  version "3.5.0"
+  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c"
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
+  version "4.11.6"
+  resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215"
+
+body-parser@^1.12.4:
+  version "1.17.2"
+  resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.17.2.tgz#f8892abc8f9e627d42aedafbca66bf5ab99104ee"
+  dependencies:
+    bytes "2.4.0"
+    content-type "~1.0.2"
+    debug "2.6.7"
+    depd "~1.1.0"
+    http-errors "~1.6.1"
+    iconv-lite "0.4.15"
+    on-finished "~2.3.0"
+    qs "6.4.0"
+    raw-body "~2.2.0"
+    type-is "~1.6.15"
+
+boolbase@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+
+boom@2.x.x:
+  version "2.10.1"
+  resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
+  dependencies:
+    hoek "2.x.x"
+
+bootstrap@^3.3.7:
+  version "3.3.7"
+  resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-3.3.7.tgz#5a389394549f23330875a3b150656574f8a9eb71"
+
+boxen@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.1.0.tgz#b1b69dd522305e807a99deee777dbd6e5167b102"
+  dependencies:
+    ansi-align "^2.0.0"
+    camelcase "^4.0.0"
+    chalk "^1.1.1"
+    cli-boxes "^1.0.0"
+    string-width "^2.0.0"
+    term-size "^0.1.0"
+    widest-line "^1.0.0"
+
+brace-expansion@^1.1.7:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59"
+  dependencies:
+    balanced-match "^0.4.1"
+    concat-map "0.0.1"
+
+braces@^0.1.2:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-0.1.5.tgz#c085711085291d8b75fdd74eab0f8597280711e6"
+  dependencies:
+    expand-range "^0.1.0"
+
+braces@^1.8.2:
+  version "1.8.5"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
+  dependencies:
+    expand-range "^1.8.1"
+    preserve "^0.2.0"
+    repeat-element "^1.1.2"
+
+brorand@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.0.6.tgz#5e7725dbdef1fd5930d4ebab48567ce451c48a0a"
+  dependencies:
+    buffer-xor "^1.0.2"
+    cipher-base "^1.0.0"
+    create-hash "^1.1.0"
+    evp_bytestokey "^1.0.0"
+    inherits "^2.0.1"
+
+browserify-cipher@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a"
+  dependencies:
+    browserify-aes "^1.0.4"
+    browserify-des "^1.0.0"
+    evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd"
+  dependencies:
+    cipher-base "^1.0.1"
+    des.js "^1.0.0"
+    inherits "^2.0.1"
+
+browserify-rsa@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
+  dependencies:
+    bn.js "^4.1.0"
+    randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+  version "4.0.4"
+  resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
+  dependencies:
+    bn.js "^4.1.1"
+    browserify-rsa "^4.0.0"
+    create-hash "^1.1.0"
+    create-hmac "^1.1.2"
+    elliptic "^6.0.0"
+    inherits "^2.0.1"
+    parse-asn1 "^5.0.0"
+
+browserify-zlib@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d"
+  dependencies:
+    pako "~0.2.0"
+
+browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6:
+  version "1.7.7"
+  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9"
+  dependencies:
+    caniuse-db "^1.0.30000639"
+    electron-to-chromium "^1.2.7"
+
+buffer-shims@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51"
+
+buffer-xor@^1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+
+buffer@^4.3.0:
+  version "4.9.1"
+  resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
+  dependencies:
+    base64-js "^1.0.2"
+    ieee754 "^1.1.4"
+    isarray "^1.0.0"
+
+builtin-modules@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
+
+builtin-status-codes@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+
+bytes@2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.3.0.tgz#d5b680a165b6201739acb611542aabc2d8ceb070"
+
+bytes@2.4.0:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339"
+
+callsite@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20"
+
+camel-case@3.0.x:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73"
+  dependencies:
+    no-case "^2.2.0"
+    upper-case "^1.1.1"
+
+camelcase-keys@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
+  dependencies:
+    camelcase "^2.0.0"
+    map-obj "^1.0.0"
+
+camelcase@^1.0.2:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
+
+camelcase@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
+
+camelcase@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
+
+camelcase@^4.0.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
+
+caniuse-api@^1.5.2:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c"
+  dependencies:
+    browserslist "^1.3.6"
+    caniuse-db "^1.0.30000529"
+    lodash.memoize "^4.1.2"
+    lodash.uniq "^4.5.0"
+
+caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639:
+  version "1.0.30000676"
+  resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000676.tgz#82ea578237637c8ff34a28acaade373b624c4ea8"
+
+capture-stack-trace@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d"
+
+caseless@~0.12.0:
+  version "0.12.0"
+  resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+
+center-align@^0.1.1:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
+  dependencies:
+    align-text "^0.1.3"
+    lazy-cache "^1.0.3"
+
+chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+  dependencies:
+    ansi-styles "^2.2.1"
+    escape-string-regexp "^1.0.2"
+    has-ansi "^2.0.0"
+    strip-ansi "^3.0.0"
+    supports-color "^2.0.0"
+
+chokidar@^1.4.1, chokidar@^1.4.3, chokidar@^1.6.0:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
+  dependencies:
+    anymatch "^1.3.0"
+    async-each "^1.0.0"
+    glob-parent "^2.0.0"
+    inherits "^2.0.1"
+    is-binary-path "^1.0.0"
+    is-glob "^2.0.0"
+    path-is-absolute "^1.0.0"
+    readdirp "^2.0.0"
+  optionalDependencies:
+    fsevents "^1.0.0"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.3.tgz#eeabf194419ce900da3018c207d212f2a6df0a07"
+  dependencies:
+    inherits "^2.0.1"
+
+clap@^1.0.9:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/clap/-/clap-1.1.3.tgz#b3bd36e93dd4cbfb395a3c26896352445265c05b"
+  dependencies:
+    chalk "^1.1.3"
+
+clean-css@4.1.x:
+  version "4.1.3"
+  resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.3.tgz#07cfe8980edb20d455ddc23aadcf1e04c6e509ce"
+  dependencies:
+    source-map "0.5.x"
+
+cli-boxes@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143"
+
+cli-cursor@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
+  dependencies:
+    restore-cursor "^2.0.0"
+
+cli-width@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a"
+
+cliui@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
+  dependencies:
+    center-align "^0.1.1"
+    right-align "^0.1.1"
+    wordwrap "0.0.2"
+
+cliui@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
+  dependencies:
+    string-width "^1.0.1"
+    strip-ansi "^3.0.1"
+    wrap-ansi "^2.0.0"
+
+clone@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149"
+
+co@^4.6.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+
+coa@~1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.2.tgz#2ba9fec3b4aa43d7a49d7e6c3561e92061b6bcec"
+  dependencies:
+    q "^1.1.2"
+
+code-point-at@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+
+codelyzer@~2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/codelyzer/-/codelyzer-2.0.1.tgz#d0f7121f67a8424c92d21d3b31f3640b83def9ed"
+  dependencies:
+    app-root-path "^2.0.1"
+    css-selector-tokenizer "^0.7.0"
+    cssauron "^1.4.0"
+    semver-dsl "^1.0.1"
+    source-map "^0.5.6"
+    sprintf-js "^1.0.3"
+
+color-convert@^1.3.0:
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a"
+  dependencies:
+    color-name "^1.1.1"
+
+color-name@^1.0.0, color-name@^1.1.1:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.2.tgz#5c8ab72b64bd2215d617ae9559ebb148475cf98d"
+
+color-string@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991"
+  dependencies:
+    color-name "^1.0.0"
+
+color@^0.11.0:
+  version "0.11.4"
+  resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764"
+  dependencies:
+    clone "^1.0.2"
+    color-convert "^1.3.0"
+    color-string "^0.3.0"
+
+colormin@^1.0.5:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133"
+  dependencies:
+    color "^0.11.0"
+    css-color-names "0.0.4"
+    has "^1.0.1"
+
+colors@1.1.2, colors@^1.1.0, colors@^1.1.2, colors@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
+
+combine-lists@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/combine-lists/-/combine-lists-1.0.1.tgz#458c07e09e0d900fc28b70a3fec2dacd1d2cb7f6"
+  dependencies:
+    lodash "^4.5.0"
+
+combined-stream@^1.0.5, combined-stream@~1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009"
+  dependencies:
+    delayed-stream "~1.0.0"
+
+commander@2.9.x, commander@~2.9.0:
+  version "2.9.0"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4"
+  dependencies:
+    graceful-readlink ">= 1.0.0"
+
+common-tags@^1.3.1:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.4.0.tgz#1187be4f3d4cf0c0427d43f74eef1f73501614c0"
+  dependencies:
+    babel-runtime "^6.18.0"
+
+component-bind@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1"
+
+component-emitter@1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3"
+
+component-emitter@1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+
+component-inherit@0.0.3:
+  version "0.0.3"
+  resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143"
+
+compressible@~2.0.8:
+  version "2.0.10"
+  resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.10.tgz#feda1c7f7617912732b29bf8cf26252a20b9eecd"
+  dependencies:
+    mime-db ">= 1.27.0 < 2"
+
+compression@^1.5.2:
+  version "1.6.2"
+  resolved "https://registry.yarnpkg.com/compression/-/compression-1.6.2.tgz#cceb121ecc9d09c52d7ad0c3350ea93ddd402bc3"
+  dependencies:
+    accepts "~1.3.3"
+    bytes "2.3.0"
+    compressible "~2.0.8"
+    debug "~2.2.0"
+    on-headers "~1.0.1"
+    vary "~1.1.0"
+
+concat-map@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
+configstore@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.0.tgz#45df907073e26dfa1cf4b2d52f5b60545eaa11d1"
+  dependencies:
+    dot-prop "^4.1.0"
+    graceful-fs "^4.1.2"
+    make-dir "^1.0.0"
+    unique-string "^1.0.0"
+    write-file-atomic "^2.0.0"
+    xdg-basedir "^3.0.0"
+
+connect-history-api-fallback@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz#e51d17f8f0ef0db90a64fdb47de3051556e9f169"
+
+connect@^3.3.5:
+  version "3.6.2"
+  resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.2.tgz#694e8d20681bfe490282c8ab886be98f09f42fe7"
+  dependencies:
+    debug "2.6.7"
+    finalhandler "1.0.3"
+    parseurl "~1.3.1"
+    utils-merge "1.0.0"
+
+console-browserify@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
+  dependencies:
+    date-now "^0.1.4"
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+
+constants-browserify@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+
+content-disposition@0.5.2:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
+
+content-type@~1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed"
+
+convert-source-map@^1.3.0:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5"
+
+cookie-signature@1.0.6:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+
+cookie@0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
+
+core-js@^2.2.0, core-js@^2.4.0, core-js@^2.4.1:
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e"
+
+core-util-is@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+
+create-ecdh@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d"
+  dependencies:
+    bn.js "^4.1.0"
+    elliptic "^6.0.0"
+
+create-error-class@^3.0.0:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6"
+  dependencies:
+    capture-stack-trace "^1.0.0"
+
+create-hash@^1.1.0, create-hash@^1.1.1, create-hash@^1.1.2:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd"
+  dependencies:
+    cipher-base "^1.0.1"
+    inherits "^2.0.1"
+    ripemd160 "^2.0.0"
+    sha.js "^2.4.0"
+
+create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06"
+  dependencies:
+    cipher-base "^1.0.3"
+    create-hash "^1.1.0"
+    inherits "^2.0.1"
+    ripemd160 "^2.0.0"
+    safe-buffer "^5.0.1"
+    sha.js "^2.4.8"
+
+cross-spawn-async@^2.1.1:
+  version "2.2.5"
+  resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc"
+  dependencies:
+    lru-cache "^4.0.0"
+    which "^1.2.8"
+
+cross-spawn@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982"
+  dependencies:
+    lru-cache "^4.0.1"
+    which "^1.2.9"
+
+cryptiles@2.x.x:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
+  dependencies:
+    boom "2.x.x"
+
+crypto-browserify@^3.11.0:
+  version "3.11.0"
+  resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.11.0.tgz#3652a0906ab9b2a7e0c3ce66a408e957a2485522"
+  dependencies:
+    browserify-cipher "^1.0.0"
+    browserify-sign "^4.0.0"
+    create-ecdh "^4.0.0"
+    create-hash "^1.1.0"
+    create-hmac "^1.1.0"
+    diffie-hellman "^5.0.0"
+    inherits "^2.0.1"
+    pbkdf2 "^3.0.3"
+    public-encrypt "^4.0.0"
+    randombytes "^2.0.0"
+
+crypto-random-string@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e"
+
+css-color-names@0.0.4:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
+
+css-loader@^0.26.1:
+  version "0.26.4"
+  resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.26.4.tgz#b61e9e30db94303e6ffc892f10ecd09ad025a1fd"
+  dependencies:
+    babel-code-frame "^6.11.0"
+    css-selector-tokenizer "^0.7.0"
+    cssnano ">=2.6.1 <4"
+    loader-utils "^1.0.2"
+    lodash.camelcase "^4.3.0"
+    object-assign "^4.0.1"
+    postcss "^5.0.6"
+    postcss-modules-extract-imports "^1.0.0"
+    postcss-modules-local-by-default "^1.0.1"
+    postcss-modules-scope "^1.0.0"
+    postcss-modules-values "^1.1.0"
+    source-list-map "^0.1.7"
+
+css-parse@1.7.x:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-1.7.0.tgz#321f6cf73782a6ff751111390fc05e2c657d8c9b"
+
+css-select@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858"
+  dependencies:
+    boolbase "~1.0.0"
+    css-what "2.1"
+    domutils "1.5.1"
+    nth-check "~1.0.1"
+
+css-selector-tokenizer@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86"
+  dependencies:
+    cssesc "^0.1.0"
+    fastparse "^1.1.1"
+    regexpu-core "^1.0.0"
+
+css-what@2.1:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd"
+
+cssauron@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/cssauron/-/cssauron-1.4.0.tgz#a6602dff7e04a8306dc0db9a551e92e8b5662ad8"
+  dependencies:
+    through X.X.X
+
+cssesc@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4"
+
+"cssnano@>=2.6.1 <4", cssnano@^3.10.0:
+  version "3.10.0"
+  resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38"
+  dependencies:
+    autoprefixer "^6.3.1"
+    decamelize "^1.1.2"
+    defined "^1.0.0"
+    has "^1.0.1"
+    object-assign "^4.0.1"
+    postcss "^5.0.14"
+    postcss-calc "^5.2.0"
+    postcss-colormin "^2.1.8"
+    postcss-convert-values "^2.3.4"
+    postcss-discard-comments "^2.0.4"
+    postcss-discard-duplicates "^2.0.1"
+    postcss-discard-empty "^2.0.1"
+    postcss-discard-overridden "^0.1.1"
+    postcss-discard-unused "^2.2.1"
+    postcss-filter-plugins "^2.0.0"
+    postcss-merge-idents "^2.1.5"
+    postcss-merge-longhand "^2.0.1"
+    postcss-merge-rules "^2.0.3"
+    postcss-minify-font-values "^1.0.2"
+    postcss-minify-gradients "^1.0.1"
+    postcss-minify-params "^1.0.4"
+    postcss-minify-selectors "^2.0.4"
+    postcss-normalize-charset "^1.1.0"
+    postcss-normalize-url "^3.0.7"
+    postcss-ordered-values "^2.1.0"
+    postcss-reduce-idents "^2.2.2"
+    postcss-reduce-initial "^1.0.0"
+    postcss-reduce-transforms "^1.0.3"
+    postcss-svgo "^2.1.1"
+    postcss-unique-selectors "^2.0.2"
+    postcss-value-parser "^3.2.3"
+    postcss-zindex "^2.0.1"
+
+csso@~2.3.1:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85"
+  dependencies:
+    clap "^1.0.9"
+    source-map "^0.5.3"
+
+currently-unhandled@^0.4.1:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
+  dependencies:
+    array-find-index "^1.0.1"
+
+custom-event@~1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425"
+
+dashdash@^1.12.0:
+  version "1.14.1"
+  resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+  dependencies:
+    assert-plus "^1.0.0"
+
+date-now@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
+
+debug@*, debug@2, debug@2.6.8, debug@^2.1.3, debug@^2.2.0, debug@^2.6.3, debug@^2.6.8:
+  version "2.6.8"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc"
+  dependencies:
+    ms "2.0.0"
+
+debug@2.2.0, debug@~2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
+  dependencies:
+    ms "0.7.1"
+
+debug@2.3.3:
+  version "2.3.3"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c"
+  dependencies:
+    ms "0.7.2"
+
+debug@2.6.7:
+  version "2.6.7"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.7.tgz#92bad1f6d05bbb6bba22cca88bcd0ec894c2861e"
+  dependencies:
+    ms "2.0.0"
+
+decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+
+deep-extend@~0.4.0:
+  version "0.4.2"
+  resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f"
+
+default-require-extensions@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8"
+  dependencies:
+    strip-bom "^2.0.0"
+
+defined@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
+
+del@^2.2.0:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8"
+  dependencies:
+    globby "^5.0.0"
+    is-path-cwd "^1.0.0"
+    is-path-in-cwd "^1.0.0"
+    object-assign "^4.0.1"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+    rimraf "^2.2.8"
+
+delayed-stream@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+
+delegates@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+
+denodeify@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631"
+
+depd@1.1.0, depd@~1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3"
+
+des.js@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
+  dependencies:
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+
+destroy@~1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+
+detect-indent@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+  dependencies:
+    repeating "^2.0.0"
+
+detect-node@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127"
+
+di@^0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c"
+
+diff@^3.0.1, diff@^3.1.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9"
+
+diffie-hellman@^5.0.0:
+  version "5.0.2"
+  resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e"
+  dependencies:
+    bn.js "^4.1.0"
+    miller-rabin "^4.0.0"
+    randombytes "^2.0.0"
+
+directory-encoder@^0.7.2:
+  version "0.7.2"
+  resolved "https://registry.yarnpkg.com/directory-encoder/-/directory-encoder-0.7.2.tgz#59b4e2aa4f25422f6c63b527b462f5e2d0dd2c58"
+  dependencies:
+    fs-extra "^0.23.1"
+    handlebars "^1.3.0"
+    img-stats "^0.5.2"
+
+dom-converter@~0.1:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.1.4.tgz#a45ef5727b890c9bffe6d7c876e7b19cb0e17f3b"
+  dependencies:
+    utila "~0.3"
+
+dom-serialize@^2.2.0:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b"
+  dependencies:
+    custom-event "~1.0.0"
+    ent "~2.2.0"
+    extend "^3.0.0"
+    void-elements "^2.0.0"
+
+dom-serializer@0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
+  dependencies:
+    domelementtype "~1.1.1"
+    entities "~1.1.1"
+
+domain-browser@^1.1.1:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc"
+
+domelementtype@1:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2"
+
+domelementtype@~1.1.1:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b"
+
+domhandler@2.1:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.1.0.tgz#d2646f5e57f6c3bab11cf6cb05d3c0acf7412594"
+  dependencies:
+    domelementtype "1"
+
+domutils@1.1:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.1.6.tgz#bddc3de099b9a2efacc51c623f28f416ecc57485"
+  dependencies:
+    domelementtype "1"
+
+domutils@1.5.1:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
+  dependencies:
+    dom-serializer "0"
+    domelementtype "1"
+
+dot-prop@^4.1.0:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.1.1.tgz#a8493f0b7b5eeec82525b5c7587fa7de7ca859c1"
+  dependencies:
+    is-obj "^1.0.0"
+
+duplexer3@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
+
+ecc-jsbn@~0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
+  dependencies:
+    jsbn "~0.1.0"
+
+ee-first@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+
+electron-to-chromium@^1.2.7:
+  version "1.3.13"
+  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.13.tgz#1b3a5eace6e087bb5e257a100b0cbfe81b2891fc"
+
+elliptic@^6.0.0:
+  version "6.4.0"
+  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df"
+  dependencies:
+    bn.js "^4.4.0"
+    brorand "^1.0.1"
+    hash.js "^1.0.0"
+    hmac-drbg "^1.0.0"
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+    minimalistic-crypto-utils "^1.0.0"
+
+ember-cli-normalize-entity-name@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/ember-cli-normalize-entity-name/-/ember-cli-normalize-entity-name-1.0.0.tgz#0b14f7bcbc599aa117b5fddc81e4fd03c4bad5b7"
+  dependencies:
+    silent-error "^1.0.0"
+
+ember-cli-string-utils@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz#39b677fc2805f55173735376fcef278eaa4452a1"
+
+emojis-list@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
+
+encodeurl@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20"
+
+engine.io-client@1.8.2:
+  version "1.8.2"
+  resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.2.tgz#c38767547f2a7d184f5752f6f0ad501006703766"
+  dependencies:
+    component-emitter "1.2.1"
+    component-inherit "0.0.3"
+    debug "2.3.3"
+    engine.io-parser "1.3.2"
+    has-cors "1.1.0"
+    indexof "0.0.1"
+    parsejson "0.0.3"
+    parseqs "0.0.5"
+    parseuri "0.0.5"
+    ws "1.1.1"
+    xmlhttprequest-ssl "1.5.3"
+    yeast "0.1.2"
+
+engine.io-parser@1.3.2:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.2.tgz#937b079f0007d0893ec56d46cb220b8cb435220a"
+  dependencies:
+    after "0.8.2"
+    arraybuffer.slice "0.0.6"
+    base64-arraybuffer "0.1.5"
+    blob "0.0.4"
+    has-binary "0.1.7"
+    wtf-8 "1.0.0"
+
+engine.io@1.8.2:
+  version "1.8.2"
+  resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.2.tgz#6b59be730b348c0125b0a4589de1c355abcf7a7e"
+  dependencies:
+    accepts "1.3.3"
+    base64id "1.0.0"
+    cookie "0.3.1"
+    debug "2.3.3"
+    engine.io-parser "1.3.2"
+    ws "1.1.1"
+
+enhanced-resolve@^3.0.0, enhanced-resolve@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.1.0.tgz#9f4b626f577245edcf4b2ad83d86e17f4f421dec"
+  dependencies:
+    graceful-fs "^4.1.2"
+    memory-fs "^0.4.0"
+    object-assign "^4.0.1"
+    tapable "^0.2.5"
+
+ensure-posix-path@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/ensure-posix-path/-/ensure-posix-path-1.0.2.tgz#a65b3e42d0b71cfc585eb774f9943c8d9b91b0c2"
+
+ent@~2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d"
+
+entities@~1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
+
+errno@^0.1.1, errno@^0.1.3:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d"
+  dependencies:
+    prr "~0.0.0"
+
+error-ex@^1.2.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
+  dependencies:
+    is-arrayish "^0.2.1"
+
+escape-html@~1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+
+escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+
+esprima@^2.6.0:
+  version "2.7.3"
+  resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
+
+esprima@^3.1.1:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
+
+esutils@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
+
+etag@~1.8.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051"
+
+eventemitter3@1.x.x:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508"
+
+events@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
+
+eventsource@~0.1.6:
+  version "0.1.6"
+  resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232"
+  dependencies:
+    original ">=0.0.5"
+
+evp_bytestokey@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz#497b66ad9fef65cd7c08a6180824ba1476b66e53"
+  dependencies:
+    create-hash "^1.1.1"
+
+execa@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/execa/-/execa-0.4.0.tgz#4eb6467a36a095fabb2970ff9d5e3fb7bce6ebc3"
+  dependencies:
+    cross-spawn-async "^2.1.1"
+    is-stream "^1.1.0"
+    npm-run-path "^1.0.0"
+    object-assign "^4.0.1"
+    path-key "^1.0.0"
+    strip-eof "^1.0.0"
+
+exit@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
+
+expand-braces@^0.1.1:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f44c5855fea"
+  dependencies:
+    array-slice "^0.2.3"
+    array-unique "^0.2.1"
+    braces "^0.1.2"
+
+expand-brackets@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
+  dependencies:
+    is-posix-bracket "^0.1.0"
+
+expand-range@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-0.1.1.tgz#4cb8eda0993ca56fa4f41fc42f3cbb4ccadff044"
+  dependencies:
+    is-number "^0.1.1"
+    repeat-string "^0.2.2"
+
+expand-range@^1.8.1:
+  version "1.8.2"
+  resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
+  dependencies:
+    fill-range "^2.1.0"
+
+exports-loader@^0.6.3:
+  version "0.6.4"
+  resolved "https://registry.yarnpkg.com/exports-loader/-/exports-loader-0.6.4.tgz#d70fc6121975b35fc12830cf52754be2740fc886"
+  dependencies:
+    loader-utils "^1.0.2"
+    source-map "0.5.x"
+
+express@^4.13.3:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/express/-/express-4.15.3.tgz#bab65d0f03aa80c358408972fc700f916944b662"
+  dependencies:
+    accepts "~1.3.3"
+    array-flatten "1.1.1"
+    content-disposition "0.5.2"
+    content-type "~1.0.2"
+    cookie "0.3.1"
+    cookie-signature "1.0.6"
+    debug "2.6.7"
+    depd "~1.1.0"
+    encodeurl "~1.0.1"
+    escape-html "~1.0.3"
+    etag "~1.8.0"
+    finalhandler "~1.0.3"
+    fresh "0.5.0"
+    merge-descriptors "1.0.1"
+    methods "~1.1.2"
+    on-finished "~2.3.0"
+    parseurl "~1.3.1"
+    path-to-regexp "0.1.7"
+    proxy-addr "~1.1.4"
+    qs "6.4.0"
+    range-parser "~1.2.0"
+    send "0.15.3"
+    serve-static "1.12.3"
+    setprototypeof "1.0.3"
+    statuses "~1.3.1"
+    type-is "~1.6.15"
+    utils-merge "1.0.0"
+    vary "~1.1.1"
+
+extend@3, extend@^3.0.0, extend@~3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
+
+external-editor@^2.0.1:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.4.tgz#1ed9199da9cbfe2ef2f7a31b2fde8b0d12368972"
+  dependencies:
+    iconv-lite "^0.4.17"
+    jschardet "^1.4.2"
+    tmp "^0.0.31"
+
+extglob@^0.3.1:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
+  dependencies:
+    is-extglob "^1.0.0"
+
+extract-text-webpack-plugin@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/extract-text-webpack-plugin/-/extract-text-webpack-plugin-2.0.0.tgz#8640f72609800a3528f13a2a9634d566a5c1ae60"
+  dependencies:
+    ajv "^4.11.2"
+    async "^2.1.2"
+    loader-utils "^1.0.2"
+    webpack-sources "^0.1.0"
+
+extsprintf@1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550"
+
+fastparse@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8"
+
+faye-websocket@^0.10.0:
+  version "0.10.0"
+  resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4"
+  dependencies:
+    websocket-driver ">=0.5.1"
+
+faye-websocket@~0.11.0:
+  version "0.11.1"
+  resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38"
+  dependencies:
+    websocket-driver ">=0.5.1"
+
+figures@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
+  dependencies:
+    escape-string-regexp "^1.0.5"
+
+file-loader@^0.10.0:
+  version "0.10.1"
+  resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-0.10.1.tgz#815034119891fc6441fb5a64c11bc93c22ddd842"
+  dependencies:
+    loader-utils "^1.0.2"
+
+filename-regex@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
+
+fileset@^2.0.2:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0"
+  dependencies:
+    glob "^7.0.3"
+    minimatch "^3.0.3"
+
+fill-range@^2.1.0:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723"
+  dependencies:
+    is-number "^2.1.0"
+    isobject "^2.0.0"
+    randomatic "^1.1.3"
+    repeat-element "^1.1.2"
+    repeat-string "^1.5.2"
+
+finalhandler@1.0.3, finalhandler@~1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.3.tgz#ef47e77950e999780e86022a560e3217e0d0cc89"
+  dependencies:
+    debug "2.6.7"
+    encodeurl "~1.0.1"
+    escape-html "~1.0.3"
+    on-finished "~2.3.0"
+    parseurl "~1.3.1"
+    statuses "~1.3.1"
+    unpipe "~1.0.0"
+
+find-up@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+  dependencies:
+    path-exists "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+findup-sync@~0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.3.0.tgz#37930aa5d816b777c03445e1966cc6790a4c0b16"
+  dependencies:
+    glob "~5.0.0"
+
+flatten@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782"
+
+font-awesome@^4.7.0:
+  version "4.7.0"
+  resolved "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133"
+
+for-in@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+
+for-own@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
+  dependencies:
+    for-in "^1.0.1"
+
+forever-agent@~0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+
+form-data@~2.1.1:
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1"
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "^1.0.5"
+    mime-types "^2.1.12"
+
+forwarded@~0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363"
+
+fresh@0.5.0:
+  version "0.5.0"
+  resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e"
+
+fs-access@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/fs-access/-/fs-access-1.0.1.tgz#d6a87f262271cefebec30c553407fb995da8777a"
+  dependencies:
+    null-check "^1.0.0"
+
+fs-extra@^0.23.1:
+  version "0.23.1"
+  resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.23.1.tgz#6611dba6adf2ab8dc9c69fab37cddf8818157e3d"
+  dependencies:
+    graceful-fs "^4.1.2"
+    jsonfile "^2.1.0"
+    path-is-absolute "^1.0.0"
+    rimraf "^2.2.8"
+
+fs-extra@^2.0.0:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-2.1.2.tgz#046c70163cef9aad46b0e4a7fa467fb22d71de35"
+  dependencies:
+    graceful-fs "^4.1.2"
+    jsonfile "^2.1.0"
+
+fs.realpath@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+
+fsevents@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.1.tgz#f19fd28f43eeaf761680e519a203c4d0b3d31aff"
+  dependencies:
+    nan "^2.3.0"
+    node-pre-gyp "^0.6.29"
+
+fstream-ignore@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105"
+  dependencies:
+    fstream "^1.0.0"
+    inherits "2"
+    minimatch "^3.0.0"
+
+fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2:
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"
+  dependencies:
+    graceful-fs "^4.1.2"
+    inherits "~2.0.0"
+    mkdirp ">=0.5 0"
+    rimraf "2"
+
+function-bind@^1.0.2:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771"
+
+gauge@~2.7.3:
+  version "2.7.4"
+  resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+  dependencies:
+    aproba "^1.0.3"
+    console-control-strings "^1.0.0"
+    has-unicode "^2.0.0"
+    object-assign "^4.1.0"
+    signal-exit "^3.0.0"
+    string-width "^1.0.1"
+    strip-ansi "^3.0.1"
+    wide-align "^1.1.0"
+
+gaze@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.2.tgz#847224677adb8870d679257ed3388fdb61e40105"
+  dependencies:
+    globule "^1.0.0"
+
+get-caller-file@^1.0.0, get-caller-file@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
+
+get-stdin@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
+
+get-stream@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+
+getpass@^0.1.1:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+  dependencies:
+    assert-plus "^1.0.0"
+
+glob-base@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
+  dependencies:
+    glob-parent "^2.0.0"
+    is-glob "^2.0.0"
+
+glob-parent@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
+  dependencies:
+    is-glob "^2.0.0"
+
+glob@7.0.x:
+  version "7.0.6"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a"
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.0.2"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@~7.1.1:
+  version "7.1.2"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.0.4"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+glob@~5.0.0:
+  version "5.0.15"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
+  dependencies:
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "2 || 3"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+globals@^9.0.0:
+  version "9.17.0"
+  resolved "https://registry.yarnpkg.com/globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286"
+
+globby@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d"
+  dependencies:
+    array-union "^1.0.1"
+    arrify "^1.0.0"
+    glob "^7.0.3"
+    object-assign "^4.0.1"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+globule@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/globule/-/globule-1.1.0.tgz#c49352e4dc183d85893ee825385eb994bb6df45f"
+  dependencies:
+    glob "~7.1.1"
+    lodash "~4.16.4"
+    minimatch "~3.0.2"
+
+got@^6.7.1:
+  version "6.7.1"
+  resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0"
+  dependencies:
+    create-error-class "^3.0.0"
+    duplexer3 "^0.1.4"
+    get-stream "^3.0.0"
+    is-redirect "^1.0.0"
+    is-retry-allowed "^1.0.0"
+    is-stream "^1.0.0"
+    lowercase-keys "^1.0.0"
+    safe-buffer "^5.0.1"
+    timed-out "^4.0.0"
+    unzip-response "^2.0.1"
+    url-parse-lax "^1.0.0"
+
+graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6:
+  version "4.1.11"
+  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
+
+"graceful-readlink@>= 1.0.0":
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
+
+handle-thing@^1.2.5:
+  version "1.2.5"
+  resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4"
+
+handlebars@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-1.3.0.tgz#9e9b130a93e389491322d975cf3ec1818c37ce34"
+  dependencies:
+    optimist "~0.3"
+  optionalDependencies:
+    uglify-js "~2.3"
+
+handlebars@^4.0.3:
+  version "4.0.10"
+  resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.10.tgz#3d30c718b09a3d96f23ea4cc1f403c4d3ba9ff4f"
+  dependencies:
+    async "^1.4.0"
+    optimist "^0.6.1"
+    source-map "^0.4.4"
+  optionalDependencies:
+    uglify-js "^2.6"
+
+har-schema@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e"
+
+har-validator@~4.2.1:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a"
+  dependencies:
+    ajv "^4.9.1"
+    har-schema "^1.0.5"
+
+has-ansi@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+  dependencies:
+    ansi-regex "^2.0.0"
+
+has-binary@0.1.7:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c"
+  dependencies:
+    isarray "0.0.1"
+
+has-cors@1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39"
+
+has-flag@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
+
+has-unicode@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+
+has@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28"
+  dependencies:
+    function-bind "^1.0.2"
+
+hash-base@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1"
+  dependencies:
+    inherits "^2.0.1"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.0.3.tgz#1332ff00156c0a0ffdd8236013d07b77a0451573"
+  dependencies:
+    inherits "^2.0.1"
+
+hawk@~3.1.3:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4"
+  dependencies:
+    boom "2.x.x"
+    cryptiles "2.x.x"
+    hoek "2.x.x"
+    sntp "1.x.x"
+
+he@1.1.x:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
+
+hmac-drbg@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+  dependencies:
+    hash.js "^1.0.3"
+    minimalistic-assert "^1.0.0"
+    minimalistic-crypto-utils "^1.0.1"
+
+hoek@2.x.x:
+  version "2.16.3"
+  resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
+
+hosted-git-info@^2.1.4:
+  version "2.4.2"
+  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.2.tgz#0076b9f46a270506ddbaaea56496897460612a67"
+
+hpack.js@^2.1.6:
+  version "2.1.6"
+  resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2"
+  dependencies:
+    inherits "^2.0.1"
+    obuf "^1.0.0"
+    readable-stream "^2.0.1"
+    wbuf "^1.1.0"
+
+html-comment-regex@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e"
+
+html-entities@^1.2.0:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f"
+
+html-minifier@^3.2.3:
+  version "3.5.2"
+  resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.2.tgz#d73bc3ff448942408818ce609bf3fb0ea7ef4eb7"
+  dependencies:
+    camel-case "3.0.x"
+    clean-css "4.1.x"
+    commander "2.9.x"
+    he "1.1.x"
+    ncname "1.0.x"
+    param-case "2.1.x"
+    relateurl "0.2.x"
+    uglify-js "3.0.x"
+
+html-webpack-plugin@^2.19.0:
+  version "2.28.0"
+  resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-2.28.0.tgz#2e7863b57e5fd48fe263303e2ffc934c3064d009"
+  dependencies:
+    bluebird "^3.4.7"
+    html-minifier "^3.2.3"
+    loader-utils "^0.2.16"
+    lodash "^4.17.3"
+    pretty-error "^2.0.2"
+    toposort "^1.0.0"
+
+htmlparser2@~3.3.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.3.0.tgz#cc70d05a59f6542e43f0e685c982e14c924a9efe"
+  dependencies:
+    domelementtype "1"
+    domhandler "2.1"
+    domutils "1.1"
+    readable-stream "1.0"
+
+http-deceiver@^1.2.7:
+  version "1.2.7"
+  resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87"
+
+http-errors@~1.6.1:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257"
+  dependencies:
+    depd "1.1.0"
+    inherits "2.0.3"
+    setprototypeof "1.0.3"
+    statuses ">= 1.3.1 < 2"
+
+http-proxy-middleware@~0.17.1:
+  version "0.17.4"
+  resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz#642e8848851d66f09d4f124912846dbaeb41b833"
+  dependencies:
+    http-proxy "^1.16.2"
+    is-glob "^3.1.0"
+    lodash "^4.17.2"
+    micromatch "^2.3.11"
+
+http-proxy@^1.13.0, http-proxy@^1.16.2:
+  version "1.16.2"
+  resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742"
+  dependencies:
+    eventemitter3 "1.x.x"
+    requires-port "1.x.x"
+
+http-signature@~1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf"
+  dependencies:
+    assert-plus "^0.2.0"
+    jsprim "^1.2.2"
+    sshpk "^1.7.0"
+
+https-browserify@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82"
+
+https-proxy-agent@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz#35f7da6c48ce4ddbfa264891ac593ee5ff8671e6"
+  dependencies:
+    agent-base "2"
+    debug "2"
+    extend "3"
+
+iconv-lite@0.4.15:
+  version "0.4.15"
+  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb"
+
+iconv-lite@^0.4.17:
+  version "0.4.17"
+  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.17.tgz#4fdaa3b38acbc2c031b045d0edcdfe1ecab18c8d"
+
+icss-replace-symbols@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
+
+ieee754@^1.1.4:
+  version "1.1.8"
+  resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
+
+image-size@~0.5.0:
+  version "0.5.4"
+  resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.4.tgz#94e07beec0659386f1aefb84b2222e88405485cd"
+
+img-stats@^0.5.2:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/img-stats/-/img-stats-0.5.2.tgz#c203496c42f2d9eb2e5ab8232fa756bab32c9e2b"
+  dependencies:
+    xmldom "^0.1.19"
+
+imurmurhash@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+
+in-publish@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51"
+
+indent-string@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
+  dependencies:
+    repeating "^2.0.0"
+
+indexes-of@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
+
+indexof@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
+
+inflection@^1.7.0:
+  version "1.12.0"
+  resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416"
+
+inflight@^1.0.4:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+  dependencies:
+    once "^1.3.0"
+    wrappy "1"
+
+inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
+inherits@2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+
+ini@^1.3.4, ini@~1.3.0:
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e"
+
+inquirer@^3.0.0:
+  version "3.0.6"
+  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.0.6.tgz#e04aaa9d05b7a3cb9b0f407d04375f0447190347"
+  dependencies:
+    ansi-escapes "^1.1.0"
+    chalk "^1.0.0"
+    cli-cursor "^2.1.0"
+    cli-width "^2.0.0"
+    external-editor "^2.0.1"
+    figures "^2.0.0"
+    lodash "^4.3.0"
+    mute-stream "0.0.7"
+    run-async "^2.2.0"
+    rx "^4.1.0"
+    string-width "^2.0.0"
+    strip-ansi "^3.0.0"
+    through "^2.3.6"
+
+interpret@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90"
+
+invariant@^2.2.0:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360"
+  dependencies:
+    loose-envify "^1.0.0"
+
+invert-kv@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
+
+ipaddr.js@1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.3.0.tgz#1e03a52fdad83a8bbb2b25cbf4998b4cffcd3dec"
+
+is-absolute-url@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
+
+is-arrayish@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+
+is-binary-path@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+  dependencies:
+    binary-extensions "^1.0.0"
+
+is-buffer@^1.1.5:
+  version "1.1.5"
+  resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc"
+
+is-builtin-module@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
+  dependencies:
+    builtin-modules "^1.0.0"
+
+is-dotfile@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d"
+
+is-equal-shallow@^0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
+  dependencies:
+    is-primitive "^2.0.0"
+
+is-extendable@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+
+is-extglob@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
+
+is-extglob@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+
+is-finite@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
+  dependencies:
+    number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+  dependencies:
+    number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+
+is-glob@^2.0.0, is-glob@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
+  dependencies:
+    is-extglob "^1.0.0"
+
+is-glob@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+  dependencies:
+    is-extglob "^2.1.0"
+
+is-npm@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4"
+
+is-number@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806"
+
+is-number@^2.0.2, is-number@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-obj@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
+
+is-path-cwd@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d"
+
+is-path-in-cwd@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc"
+  dependencies:
+    is-path-inside "^1.0.0"
+
+is-path-inside@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f"
+  dependencies:
+    path-is-inside "^1.0.1"
+
+is-plain-obj@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
+
+is-posix-bracket@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
+
+is-primitive@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
+
+is-promise@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
+
+is-redirect@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24"
+
+is-retry-allowed@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34"
+
+is-stream@^1.0.0, is-stream@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+
+is-svg@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9"
+  dependencies:
+    html-comment-regex "^1.1.0"
+
+is-typedarray@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+
+is-utf8@^0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+
+isarray@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+isbinaryfile@^3.0.0:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621"
+
+isexe@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+
+isobject@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+  dependencies:
+    isarray "1.0.0"
+
+isstream@~0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+
+istanbul-api@^1.1.1:
+  version "1.1.9"
+  resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.1.9.tgz#2827920d380d4286d857d57a2968a841db8a7ec8"
+  dependencies:
+    async "^2.1.4"
+    fileset "^2.0.2"
+    istanbul-lib-coverage "^1.1.1"
+    istanbul-lib-hook "^1.0.7"
+    istanbul-lib-instrument "^1.7.2"
+    istanbul-lib-report "^1.1.1"
+    istanbul-lib-source-maps "^1.2.1"
+    istanbul-reports "^1.1.1"
+    js-yaml "^3.7.0"
+    mkdirp "^0.5.1"
+    once "^1.4.0"
+
+istanbul-instrumenter-loader@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-2.0.0.tgz#e5492900ab0bba835efa8024cb00be9b3eea2700"
+  dependencies:
+    convert-source-map "^1.3.0"
+    istanbul-lib-instrument "^1.1.3"
+    loader-utils "^0.2.16"
+    object-assign "^4.1.0"
+
+istanbul-lib-coverage@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da"
+
+istanbul-lib-hook@^1.0.7:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz#dd6607f03076578fe7d6f2a630cf143b49bacddc"
+  dependencies:
+    append-transform "^0.4.0"
+
+istanbul-lib-instrument@^1.1.3, istanbul-lib-instrument@^1.7.2:
+  version "1.7.2"
+  resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.2.tgz#6014b03d3470fb77638d5802508c255c06312e56"
+  dependencies:
+    babel-generator "^6.18.0"
+    babel-template "^6.16.0"
+    babel-traverse "^6.18.0"
+    babel-types "^6.18.0"
+    babylon "^6.13.0"
+    istanbul-lib-coverage "^1.1.1"
+    semver "^5.3.0"
+
+istanbul-lib-report@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#f0e55f56655ffa34222080b7a0cd4760e1405fc9"
+  dependencies:
+    istanbul-lib-coverage "^1.1.1"
+    mkdirp "^0.5.1"
+    path-parse "^1.0.5"
+    supports-color "^3.1.2"
+
+istanbul-lib-source-maps@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz#a6fe1acba8ce08eebc638e572e294d267008aa0c"
+  dependencies:
+    debug "^2.6.3"
+    istanbul-lib-coverage "^1.1.1"
+    mkdirp "^0.5.1"
+    rimraf "^2.6.1"
+    source-map "^0.5.3"
+
+istanbul-reports@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.1.tgz#042be5c89e175bc3f86523caab29c014e77fee4e"
+  dependencies:
+    handlebars "^4.0.3"
+
+jasmine-core@~2.5.2:
+  version "2.5.2"
+  resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.5.2.tgz#6f61bd79061e27f43e6f9355e44b3c6cab6ff29

<TRUNCATED>

[15/21] ambari git commit: AMBARI-21318 Log Search UI: implement filters panel. (ababiichuk)

Posted by ab...@apache.org.
AMBARI-21318 Log Search UI: implement filters panel. (ababiichuk)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/6fc2fef6
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/6fc2fef6
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/6fc2fef6

Branch: refs/heads/branch-feature-logsearch-ui
Commit: 6fc2fef6e0f3480551bbd18a888ad44b0005fade
Parents: ae40a5f
Author: ababiichuk <ab...@hortonworks.com>
Authored: Thu Jun 8 13:35:12 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jun 22 15:40:37 2017 +0300

----------------------------------------------------------------------
 .../ambari-logsearch-web-new/package.json       |   4 +
 .../src/app/app.component.html                  |   2 +-
 .../src/app/app.component.less                  |   6 +-
 .../src/app/app.component.ts                    |   2 +-
 .../src/app/app.module.ts                       |  15 +-
 .../dropdown-list/dropdown-list.component.html  |  20 +++
 .../dropdown-list.component.spec.ts             |  92 ++++++++++
 .../dropdown-list/dropdown-list.component.ts    |  50 ++++++
 .../filter-dropdown.component.html              |  23 +++
 .../filter-dropdown.component.less              |  31 ++++
 .../filter-dropdown.component.spec.ts           |  95 +++++++++++
 .../filter-dropdown.component.ts                |  45 +++++
 .../filter-text-field.component.html            |  21 +++
 .../filter-text-field.component.less            |  33 ++++
 .../filter-text-field.component.spec.ts         |  61 +++++++
 .../filter-text-field.component.ts              |  35 ++++
 .../filters-panel/filters-panel.component.html  |  36 ++++
 .../filters-panel/filters-panel.component.less  |  38 +++++
 .../filters-panel.component.spec.ts             |  59 +++++++
 .../filters-panel/filters-panel.component.ts    |  35 ++++
 .../app/login-form/login-form.component.html    |   2 +-
 .../app/login-form/login-form.component.less    |  22 +++
 .../app/login-form/login-form.component.spec.ts |   2 +-
 .../src/app/login-form/login-form.component.ts  |   3 +-
 .../main-container.component.html               |  19 +++
 .../main-container.component.spec.ts            |  49 ++++++
 .../main-container/main-container.component.ts  |  33 ++++
 .../app/menu-button/menu-button.component.html  |  17 +-
 .../app/menu-button/menu-button.component.less  |   4 +
 .../menu-button/menu-button.component.spec.ts   |  39 ++++-
 .../app/menu-button/menu-button.component.ts    |  25 ++-
 .../app/services/component-actions.service.ts   |   6 -
 .../src/app/services/filtering.service.spec.ts  |  33 ++++
 .../src/app/services/filtering.service.ts       | 167 +++++++++++++++++++
 .../src/app/top-menu/top-menu.component.html    |   5 +-
 .../src/app/top-menu/top-menu.component.less    |   6 +-
 .../src/app/top-menu/top-menu.component.ts      |  60 ++++---
 .../src/assets/i18n/en.json                     |  29 +++-
 .../ambari-logsearch-web-new/src/styles.less    |  15 ++
 .../ambari-logsearch-web-new/yarn.lock          |  20 ++-
 40 files changed, 1194 insertions(+), 65 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/package.json
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/package.json b/ambari-logsearch/ambari-logsearch-web-new/package.json
index 0994703..da44d30 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/package.json
+++ b/ambari-logsearch/ambari-logsearch-web-new/package.json
@@ -27,6 +27,8 @@
     "core-js": "^2.4.1",
     "font-awesome": "^4.7.0",
     "jquery": "^1.12.4",
+    "moment": "^2.18.1",
+    "moment-timezone": "^0.5.13",
     "ngx-bootstrap": "^1.6.6",
     "rxjs": "^5.1.0",
     "zone.js": "^0.8.4"
@@ -35,6 +37,8 @@
     "@angular/cli": "1.0.0",
     "@angular/compiler-cli": "^4.0.0",
     "@types/jasmine": "2.5.38",
+    "@types/moment": "^2.13.0",
+    "@types/moment-timezone": "^0.2.34",
     "@types/node": "~6.0.60",
     "angular-in-memory-web-api": "^0.3.1",
     "codelyzer": "~2.0.0",

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html
index 8b8687a..267e08b 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html
@@ -29,4 +29,4 @@
   <h1>&nbsp;</h1>
 </div>
 
-<login-form *ngIf="!httpClient.isAuthorized"></login-form>
+<main-container></main-container>

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
index e09da49..3affd3f 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
@@ -15,18 +15,16 @@
  * limitations under the License.
  */
 
-
 @import '../styles.less';
 
 .navbar {
+  margin-bottom: 0;
   border-radius: 0;
   background-color: @navbar-background-color;
   color: #fff;
 
   .container-fluid {
-    display: flex;
-    align-items: center;
-    justify-content: space-between;
+    .default-flex;
   }
 
   h1 {

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts
index fb79ccb..e86a8a1 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts
@@ -18,7 +18,7 @@
 
 import {Component} from '@angular/core';
 import {TranslateService} from '@ngx-translate/core';
-import {HttpClientService} from './services/http-client.service';
+import {HttpClientService} from '@app/services/http-client.service';
 
 @Component({
   selector: 'app-root',

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
index f4ee972..f7221b3 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
@@ -28,6 +28,8 @@ import {TranslateHttpLoader} from '@ngx-translate/http-loader';
 import {StoreModule} from '@ngrx/store';
 import {HttpClientService} from '@app/services/http-client.service';
 import {ComponentActionsService} from '@app/services/component-actions.service';
+import {FilteringService} from '@app/services/filtering.service';
+
 import {AuditLogsService, auditLogs} from '@app/services/storage/audit-logs.service';
 import {ServiceLogsService, serviceLogs} from '@app/services/storage/service-logs.service';
 import {BarGraphsService, barGraphs} from '@app/services/storage/bar-graphs.service';
@@ -40,6 +42,11 @@ import {AppComponent} from '@app/app.component';
 import {LoginFormComponent} from '@app/login-form/login-form.component';
 import {TopMenuComponent} from '@app/top-menu/top-menu.component';
 import {MenuButtonComponent} from '@app/menu-button/menu-button.component';
+import {MainContainerComponent} from '@app/main-container/main-container.component';
+import {FiltersPanelComponent} from '@app/filters-panel/filters-panel.component';
+import {FilterDropdownComponent} from '@app/filter-dropdown/filter-dropdown.component';
+import {DropdownListComponent} from '@app/dropdown-list/dropdown-list.component';
+import {FilterTextFieldComponent} from '@app/filter-text-field/filter-text-field.component';
 
 export function HttpLoaderFactory(http: Http) {
   return new TranslateHttpLoader(http, 'assets/i18n/', '.json');
@@ -50,7 +57,12 @@ export function HttpLoaderFactory(http: Http) {
     AppComponent,
     LoginFormComponent,
     TopMenuComponent,
-    MenuButtonComponent
+    MenuButtonComponent,
+    MainContainerComponent,
+    FiltersPanelComponent,
+    DropdownListComponent,
+    FilterDropdownComponent,
+    FilterTextFieldComponent
   ],
   imports: [
     BrowserModule,
@@ -80,6 +92,7 @@ export function HttpLoaderFactory(http: Http) {
   providers: [
     HttpClientService,
     ComponentActionsService,
+    FilteringService,
     AuditLogsService,
     ServiceLogsService,
     BarGraphsService,

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.html
new file mode 100644
index 0000000..db4ee79
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.html
@@ -0,0 +1,20 @@
+<!--
+  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.
+-->
+
+<li *ngFor="let item of items">
+  <a href="#" (click)="changeSelectedItem({value: item.value, label: item.label})">{{item.label | translate}}</a>
+</li>

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.spec.ts
new file mode 100644
index 0000000..445ee97
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.spec.ts
@@ -0,0 +1,92 @@
+/**
+ * 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.
+ */
+
+import {async, ComponentFixture, TestBed} from '@angular/core/testing';
+import {Http} from '@angular/http';
+import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
+import {TranslateHttpLoader} from '@ngx-translate/http-loader';
+
+import {DropdownListComponent} from './dropdown-list.component';
+
+export function HttpLoaderFactory(http: Http) {
+  return new TranslateHttpLoader(http, 'assets/i18n/', '.json');
+}
+
+describe('DropdownListComponent', () => {
+  let component: DropdownListComponent;
+  let fixture: ComponentFixture<DropdownListComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [DropdownListComponent],
+      imports: [TranslateModule.forRoot({
+        provide: TranslateLoader,
+        useFactory: HttpLoaderFactory,
+        deps: [Http]
+      })]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(DropdownListComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create component', () => {
+    expect(component).toBeTruthy();
+  });
+
+  describe('#changeSelectedItem()', () => {
+
+    beforeEach(() => {
+      spyOn(component.selectedItemChange, 'emit').and.callFake(() => {});
+    });
+
+    describe('not a filter list', () => {
+      it('event should not be emitted', () => {
+        component.isFilter = false;
+        component.changeSelectedItem({});
+        expect(component.selectedItemChange.emit).not.toHaveBeenCalled();
+      });
+    });
+
+    describe('filter list', () => {
+      const options = {
+        label: 'l',
+        value: 'v'
+      };
+
+      beforeEach(() => {
+        component.isFilter = true;
+        component.changeSelectedItem(options);
+      });
+
+      it('event should be emitted', () => {
+        expect(component.selectedItemChange.emit).toHaveBeenCalled();
+      });
+
+      it('event emitter should be called with correct arguments', () => {
+        expect(component.selectedItemChange.emit).toHaveBeenCalledWith(options);
+      });
+
+    });
+
+  });
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.ts
new file mode 100644
index 0000000..dfd2527
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.ts
@@ -0,0 +1,50 @@
+/**
+ * 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.
+ */
+
+import {Component, OnInit, Input, Output, EventEmitter} from '@angular/core';
+
+@Component({
+  selector: 'ul.dropdown-menu',
+  templateUrl: './dropdown-list.component.html'
+})
+export class DropdownListComponent implements OnInit {
+
+  constructor() { }
+
+  ngOnInit() {
+  }
+
+  @Input()
+  items: any[];
+
+  @Input()
+  defaultAction: Function;
+
+  @Input()
+  isFilter: boolean;
+
+  @Output()
+  selectedItemChange: EventEmitter<any> = new EventEmitter();
+
+  changeSelectedItem(options: any): void {
+    if (this.isFilter) {
+      this.selectedItemChange.emit(options);
+    }
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.html
new file mode 100644
index 0000000..1ac663e
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.html
@@ -0,0 +1,23 @@
+<!--
+  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.
+-->
+
+<div class="filter-label" *ngIf="filterInstance.label">{{filterInstance.label | translate}}</div>
+<button class="btn btn-link dropdown-toggle" data-toggle="dropdown">
+  {{filterInstance.selectedLabel | translate}} <span class="caret"></span>
+</button>
+<ul class="dropdown-menu" [items]="filterInstance.options" [isFilter]="true"
+    (selectedItemChange)="setSelectedValue($event)"></ul>

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.less
new file mode 100644
index 0000000..c3a25cb
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.less
@@ -0,0 +1,31 @@
+/*
+ * 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.
+ */
+
+@import '../../styles.less';
+
+:host {
+  position: relative;
+  .default-flex;
+
+  .filter-label {
+    padding: @input-group-addon-padding;
+  }
+
+  .btn {
+    text-transform: none;
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.spec.ts
new file mode 100644
index 0000000..49eaf1f
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.spec.ts
@@ -0,0 +1,95 @@
+/*
+ * 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.
+ */
+
+import {NO_ERRORS_SCHEMA} from '@angular/core';
+import {async, ComponentFixture, TestBed} from '@angular/core/testing';
+import {Http} from '@angular/http';
+import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
+import {TranslateHttpLoader} from '@ngx-translate/http-loader';
+
+import {FilterDropdownComponent} from './filter-dropdown.component';
+
+export function HttpLoaderFactory(http: Http) {
+  return new TranslateHttpLoader(http, 'assets/i18n/', '.json');
+}
+
+describe('FilterDropdownComponent', () => {
+  let component: FilterDropdownComponent;
+  let fixture: ComponentFixture<FilterDropdownComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [FilterDropdownComponent],
+      imports: [TranslateModule.forRoot({
+        provide: TranslateLoader,
+        useFactory: HttpLoaderFactory,
+        deps: [Http]
+      })],
+      schemas: [NO_ERRORS_SCHEMA]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(FilterDropdownComponent);
+    component = fixture.componentInstance;
+    component.filterInstance = {
+      options: [
+        {
+          value: 'v0',
+          label: 'l0'
+        },
+        {
+          value: 'v1',
+          label: 'l1'
+        }
+      ]
+    };
+    fixture.detectChanges();
+  });
+
+  it('should create component', () => {
+    expect(component).toBeTruthy();
+  });
+
+  describe('should take initial filter values from 1st item', () => {
+    it('selectedValue', () => {
+      expect(component.filterInstance.selectedValue).toEqual('v0');
+    });
+
+    it('selectedLabel', () => {
+      expect(component.filterInstance.selectedLabel).toEqual('l0');
+    });
+  });
+
+  describe('#setSelectedValue()', () => {
+    beforeEach(() => {
+      component.setSelectedValue({
+        value: 'v2',
+        label: 'l2'
+      });
+    });
+
+    it('selectedValue', () => {
+      expect(component.filterInstance.selectedValue).toEqual('v2');
+    });
+
+    it('selectedLabel', () => {
+      expect(component.filterInstance.selectedLabel).toEqual('l2');
+    });
+  });
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.ts
new file mode 100644
index 0000000..65446da
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.ts
@@ -0,0 +1,45 @@
+/*
+ * 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.
+ */
+
+import {Component, OnInit, Input} from '@angular/core';
+
+@Component({
+  selector: 'filter-dropdown',
+  templateUrl: './filter-dropdown.component.html',
+  styleUrls: ['./filter-dropdown.component.less']
+})
+export class FilterDropdownComponent implements OnInit {
+
+  constructor() { }
+
+  ngOnInit() {
+    this.filterInstance.selectedValue = this.filterInstance.options[0].value;
+    this.filterInstance.selectedLabel = this.filterInstance.options[0].label;
+  }
+
+  @Input()
+  filterInstance: any;
+
+  @Input()
+  options: any[];
+
+  setSelectedValue(options: any): void {
+    this.filterInstance.selectedValue = options.value;
+    this.filterInstance.selectedLabel = options.label;
+  };
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.html
new file mode 100644
index 0000000..3ccbd6f
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.html
@@ -0,0 +1,21 @@
+<!--
+  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.
+-->
+
+<div class="input-group">
+  <span class="input-group-addon">{{filterInstance.label | translate}}</span>
+  <input type="text" class="form-control" [(ngModel)]="filterInstance.value">
+</div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.less
new file mode 100644
index 0000000..b5e65c9
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.less
@@ -0,0 +1,33 @@
+/*
+ * 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.
+ */
+
+@import '../../styles.less';
+
+.input-group {
+  border: @input-border;
+  border-right-width: 0;
+}
+
+.input-group-addon {
+  border: none;
+  background-color: transparent;
+  text-transform: uppercase;
+
+  & + input {
+    border: none;
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.spec.ts
new file mode 100644
index 0000000..d1df7b0
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.spec.ts
@@ -0,0 +1,61 @@
+/*
+ * 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.
+ */
+
+import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
+import {async, ComponentFixture, TestBed} from '@angular/core/testing';
+import {Http} from '@angular/http';
+import {FormsModule} from '@angular/forms';
+import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
+import {TranslateHttpLoader} from '@ngx-translate/http-loader';
+
+import {FilterTextFieldComponent} from './filter-text-field.component';
+
+export function HttpLoaderFactory(http: Http) {
+  return new TranslateHttpLoader(http, 'assets/i18n/', '.json');
+}
+
+describe('FilterTextFieldComponent', () => {
+  let component: FilterTextFieldComponent;
+  let fixture: ComponentFixture<FilterTextFieldComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [FilterTextFieldComponent],
+      imports: [
+        FormsModule,
+        TranslateModule.forRoot({
+          provide: TranslateLoader,
+          useFactory: HttpLoaderFactory,
+          deps: [Http]
+        })
+      ],
+      schemas: [CUSTOM_ELEMENTS_SCHEMA]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(FilterTextFieldComponent);
+    component = fixture.componentInstance;
+    component.filterInstance = {};
+    fixture.detectChanges();
+  });
+
+  it('should create component', () => {
+    expect(component).toBeTruthy();
+  });
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.ts
new file mode 100644
index 0000000..c86d4cb
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.ts
@@ -0,0 +1,35 @@
+/*
+ * 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.
+ */
+
+import {Component, OnInit, Input} from '@angular/core';
+
+@Component({
+  selector: 'filter-text-field',
+  templateUrl: './filter-text-field.component.html',
+  styleUrls: ['./filter-text-field.component.less']
+})
+export class FilterTextFieldComponent implements OnInit {
+
+  constructor() { }
+
+  ngOnInit() {
+  }
+
+  @Input()
+  filterInstance: any;
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.html
new file mode 100644
index 0000000..20f4353
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.html
@@ -0,0 +1,36 @@
+<!--
+  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.
+-->
+
+<div class="form-inline filter-input-container col-md-8">
+  <filter-dropdown [filterInstance]="filtering.filters.clusters"></filter-dropdown>
+  <filter-text-field [filterInstance]="filtering.filters.text"></filter-text-field>
+  <filter-dropdown [filterInstance]="filtering.filters.timeRange"></filter-dropdown>
+  <filter-dropdown [filterInstance]="filtering.filters.timeZone"></filter-dropdown>
+  <button class="btn btn-success" type="button">
+    <span class="fa fa-search"></span>
+  </button>
+</div>
+<div class="default-flex col-md-4">
+  <menu-button [label]="filtering.filters.components.label" [iconClass]="filtering.filters.components.iconClass"
+               [subItems]="filtering.filters.components.options" [isFilter]="true"></menu-button>
+  <menu-button [label]="filtering.filters.levels.label" [iconClass]="filtering.filters.levels.iconClass"
+               [subItems]="filtering.filters.levels.options" [isFilter]="true"></menu-button>
+  <menu-button label="filter.capture" iconClass="fa fa-caret-right"></menu-button>
+  <a href="#">
+    <span class="fa fa-search-minus"></span> {{'filter.excluded' | translate}}
+  </a>
+</div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.less
new file mode 100644
index 0000000..b393196
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.less
@@ -0,0 +1,38 @@
+/**
+ * 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.
+ */
+
+@import '../../styles.less';
+
+.filter-input-container {
+  .flex-vertical-align;
+  justify-content: flex-start;
+
+  .btn-success {
+    border-top-left-radius: 0;
+    border-bottom-left-radius: 0;
+  }
+
+  filter-dropdown {
+    border: @input-border;
+    border-right-width: 0;
+
+    &:first-child {
+      border-radius: @button-border-radius 0 0 @button-border-radius;
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.spec.ts
new file mode 100644
index 0000000..934f37a
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.spec.ts
@@ -0,0 +1,59 @@
+/**
+ * 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.
+ */
+
+import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
+import {async, ComponentFixture, TestBed} from '@angular/core/testing';
+import {Http} from '@angular/http';
+import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
+import {TranslateHttpLoader} from '@ngx-translate/http-loader';
+import {FilteringService} from '@app/services/filtering.service';
+
+import {FiltersPanelComponent} from './filters-panel.component';
+
+export function HttpLoaderFactory(http: Http) {
+  return new TranslateHttpLoader(http, 'assets/i18n/', '.json');
+}
+
+describe('FiltersPanelComponent', () => {
+  let component: FiltersPanelComponent;
+  let fixture: ComponentFixture<FiltersPanelComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [FiltersPanelComponent],
+      imports: [TranslateModule.forRoot({
+        provide: TranslateLoader,
+        useFactory: HttpLoaderFactory,
+        deps: [Http]
+      })],
+      providers: [FilteringService],
+      schemas: [CUSTOM_ELEMENTS_SCHEMA]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(FiltersPanelComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create component', () => {
+    expect(component).toBeTruthy();
+  });
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.ts
new file mode 100644
index 0000000..8c986f4
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.ts
@@ -0,0 +1,35 @@
+/**
+ * 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.
+ */
+
+import {Component, OnInit} from '@angular/core';
+import {FilteringService} from '@app/services/filtering.service';
+
+@Component({
+  selector: 'filters-panel',
+  templateUrl: './filters-panel.component.html',
+  styleUrls: ['./filters-panel.component.less']
+})
+export class FiltersPanelComponent implements OnInit {
+
+  constructor(private filtering: FilteringService) {
+  }
+
+  ngOnInit() {
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.html
index 4b7951a..37a96e9 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.html
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.html
@@ -15,7 +15,7 @@
   limitations under the License.
 -->
 
-<div class="well col-md-4 col-md-offset-4 col-sm-offset-4">
+<div class="login-form well col-md-4 col-md-offset-4 col-sm-offset-4">
   <div class="alert alert-danger" *ngIf="isLoginAlertDisplayed" [innerHTML]="'authorization.error' | translate"></div>
   <form #loginForm="ngForm" (ngSubmit)="login()">
     <div class="form-group">

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.less
new file mode 100644
index 0000000..7e37ea1
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.less
@@ -0,0 +1,22 @@
+/*
+ * 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.
+ */
+
+@import '../../styles.less';
+
+.login-form {
+  margin-top: @login-form-top-margin;
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.spec.ts
index 55d125a..0498ee4 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.spec.ts
@@ -21,7 +21,7 @@ import {FormsModule} from '@angular/forms';
 import {HttpModule, Http} from '@angular/http';
 import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
 import {TranslateHttpLoader} from '@ngx-translate/http-loader';
-import {HttpClientService} from '../services/http-client.service';
+import {HttpClientService} from '@app/services/http-client.service';
 
 import {LoginFormComponent} from './login-form.component';
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.ts
index 400e65b..2a93775 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.ts
@@ -22,7 +22,8 @@ import {HttpClientService} from '@app/services/http-client.service';
 
 @Component({
   selector: 'login-form',
-  templateUrl: './login-form.component.html'
+  templateUrl: './login-form.component.html',
+  styleUrls: ['./login-form.component.less']
 })
 export class LoginFormComponent implements OnInit {
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.html
new file mode 100644
index 0000000..bc641a6
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.html
@@ -0,0 +1,19 @@
+<!--
+  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.
+-->
+
+<login-form *ngIf="!httpClient.isAuthorized"></login-form>
+<filters-panel *ngIf="httpClient.isAuthorized" class="row"></filters-panel>

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.spec.ts
new file mode 100644
index 0000000..536f1ef
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.spec.ts
@@ -0,0 +1,49 @@
+/**
+ * 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.
+ */
+
+import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
+import {async, ComponentFixture, TestBed} from '@angular/core/testing';
+import {HttpModule} from '@angular/http';
+import {HttpClientService} from '@app/services/http-client.service';
+
+import {MainContainerComponent} from './main-container.component';
+
+describe('MainContainerComponent', () => {
+  let component: MainContainerComponent;
+  let fixture: ComponentFixture<MainContainerComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [MainContainerComponent],
+      imports: [HttpModule],
+      schemas: [CUSTOM_ELEMENTS_SCHEMA],
+      providers: [HttpClientService]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(MainContainerComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create component', () => {
+    expect(component).toBeTruthy();
+  });
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.ts
new file mode 100644
index 0000000..d2e6a7f
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.ts
@@ -0,0 +1,33 @@
+/**
+ * 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.
+ */
+
+import {Component, OnInit} from '@angular/core';
+import {HttpClientService} from '@app/services/http-client.service';
+
+@Component({
+  selector: 'main-container',
+  templateUrl: './main-container.component.html'
+})
+export class MainContainerComponent implements OnInit {
+
+  constructor(private httpClient: HttpClientService) {}
+
+  ngOnInit() {
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html
index 1afe6c0..4ed01bd 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html
@@ -16,16 +16,11 @@
 -->
 
 <div #dropdown [ngClass]="{'dropdown': hasSubItems, 'text-center': true}">
-  <span (mousedown)="onMouseDown($event)" (mouseup)="onMouseUp($event)" (click)="$event.stopPropagation()">
-    <a *ngIf="title" class="icon" [ngClass]="iconClassNames"></a>
-    <span *ngIf="!title" class="icon" [ngClass]="iconClassNames"></span>
-  </span>
-  <a #dropdownToggle [ngClass]="{'dropdown-toggle': hasSubItems, 'caret': true}" [attr.data-toggle]="hasSubItems ? 'dropdown': null" *ngIf="hasSubItems"></a>
+  <a [ngClass]="iconClass + ' icon'" (mousedown)="onMouseDown($event)" (mouseup)="onMouseUp($event)"
+     (click)="$event.stopPropagation()"></a>
+  <a #dropdownToggle class="dropdown-toggle caret" data-toggle="dropdown" *ngIf="hasCaret"></a>
   <br>
-  <span class="icon-title" *ngIf="title" (mousedown)="onMouseDown($event)" (mouseup)="onMouseUp($event)" (click)="$event.stopPropagation()">{{title | translate}}</span>
-  <ul class="dropdown-menu" *ngIf="hasSubItems">
-    <li *ngFor="let item of subItems">
-      <a href="#">{{item.title}}</a>
-    </li>
-  </ul>
+  <a *ngIf="label" (mousedown)="onMouseDown($event)" [ngClass]="labelClass" (mouseup)="onMouseUp($event)"
+     (click)="$event.stopPropagation()">{{label | translate}}</a>
+  <ul class="dropdown-menu" [isFilter]="isFilter" *ngIf="hasSubItems" [items]="subItems"></ul>
 </div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.less
index 16b06c4..d6024c2 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.less
@@ -26,4 +26,8 @@
   .icon {
     padding: 5px;
   }
+
+  .unstyled-link {
+    color: inherit;
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts
index 5419b36..9af8f00 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts
@@ -16,6 +16,7 @@
  * limitations under the License.
  */
 
+import {NO_ERRORS_SCHEMA} from '@angular/core';
 import {async, ComponentFixture, TestBed} from '@angular/core/testing';
 import {Http} from '@angular/http';
 import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
@@ -41,7 +42,8 @@ describe('MenuButtonComponent', () => {
         useFactory: HttpLoaderFactory,
         deps: [Http]
       })],
-      providers: [ComponentActionsService]
+      providers: [ComponentActionsService],
+      schemas: [NO_ERRORS_SCHEMA]
     })
     .compileComponents();
   }));
@@ -57,7 +59,6 @@ describe('MenuButtonComponent', () => {
   });
 
   describe('#hasSubItems', () => {
-
     const cases = [
       {
         subItems: null,
@@ -82,6 +83,40 @@ describe('MenuButtonComponent', () => {
         expect(component.hasSubItems).toEqual(test.hasSubItems);
       });
     });
+  });
+
+  describe('#hasCaret', () => {
+    const cases = [
+      {
+        subItems: null,
+        hasCaret: false,
+        title: 'no sub-items'
+      },
+      {
+        subItems: [],
+        hasCaret: false,
+        title: 'empty sub-items array'
+      },
+      {
+        subItems: [{}],
+        hideCaret: false,
+        hasCaret: true,
+        title: 'sub-items present, caret not hidden'
+      },
+      {
+        subItems: [{}],
+        hideCaret: true,
+        hasCaret: true,
+        title: 'sub-items present, caret hidden'
+      }
+    ];
 
+    cases.forEach((test) => {
+      it(test.title, () => {
+        component.subItems = test.subItems;
+        component.hideCaret = Boolean(test.hideCaret);
+        expect(component.hasSubItems).toEqual(test.hasCaret);
+      });
+    });
   });
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
index 716d3ae..9505f5b 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
@@ -18,6 +18,7 @@
 
 import {Component, AfterViewInit, Input, ViewChild, ElementRef} from '@angular/core';
 import {ComponentActionsService} from '@app/services/component-actions.service';
+import * as $ from 'jquery';
 
 @Component({
   selector: 'menu-button',
@@ -36,28 +37,40 @@ export class MenuButtonComponent implements AfterViewInit {
   dropdown: ElementRef;
 
   @Input()
-  title?: string;
+  label?: string;
 
   @Input()
   action: string;
 
   @Input()
-  iconClassNames: string[];
+  isFilter: boolean;
+
+  @Input()
+  iconClass: string;
+
+  @Input()
+  labelClass?: string;
 
   @Input()
   subItems?: any[];
 
   @Input()
+  hideCaret?: boolean;
+
   get hasSubItems(): boolean {
     return Boolean(this.subItems && this.subItems.length);
   }
 
+  get hasCaret(): boolean {
+    return this.hasSubItems && !this.hideCaret;
+  }
+
   private clickStartTime: number;
 
   private readonly longClickInterval = 1000;
 
   onMouseDown(event: MouseEvent): void {
-    if (event.button === 0) {
+    if (this.action && event.button === 0) {
       this.clickStartTime = (new Date()).getTime();
     }
   }
@@ -65,9 +78,9 @@ export class MenuButtonComponent implements AfterViewInit {
   onMouseUp(event: MouseEvent): void {
     if (event.button === 0) {
       const clickEndTime = (new Date()).getTime();
-      if (this.hasSubItems && clickEndTime - this.clickStartTime >= this.longClickInterval) {
-        this.dropdown.nativeElement.classList.add('open');
-      } else {
+      if (this.hasSubItems && (!this.action || clickEndTime - this.clickStartTime >= this.longClickInterval)) {
+        $(this.dropdown.nativeElement).toggleClass('open');
+      } else if (this.action) {
         this.actions[this.action]();
       }
       event.stopPropagation();

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/services/component-actions.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/component-actions.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/component-actions.service.ts
index 1a1062e..4cde0a0 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/component-actions.service.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/component-actions.service.ts
@@ -38,10 +38,4 @@ export class ComponentActionsService {
   openHistory() {
   }
 
-  openAlerts() {
-  }
-
-  openUserDetails() {
-  }
-
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/services/filtering.service.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/filtering.service.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/filtering.service.spec.ts
new file mode 100644
index 0000000..d471e00
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/filtering.service.spec.ts
@@ -0,0 +1,33 @@
+/**
+ * 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.
+ */
+
+import {TestBed, inject} from '@angular/core/testing';
+
+import {FilteringService} from './filtering.service';
+
+describe('FilteringService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [FilteringService]
+    });
+  });
+
+  it('should create service', inject([FilteringService], (service: FilteringService) => {
+    expect(service).toBeTruthy();
+  }));
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/services/filtering.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/filtering.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/filtering.service.ts
new file mode 100644
index 0000000..84cbc50
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/filtering.service.ts
@@ -0,0 +1,167 @@
+/**
+ * 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.
+ */
+
+import {Injectable} from '@angular/core';
+import * as moment from 'moment-timezone';
+
+@Injectable()
+export class FilteringService {
+
+  constructor() {
+  }
+
+  // TODO implement loading of real options data
+  readonly filters = {
+    clusters: {
+      label: 'filter.clusters',
+      options: [
+        {
+          label: 'filter.all',
+          value: 'ALL'
+        },
+        {
+          label: 'c0',
+          value: 'c0'
+        },
+        {
+          label: 'c1',
+          value: 'c1'
+        }
+      ],
+      selectedValue: '',
+      selectedLabel: ''
+    },
+    text: {
+      label: 'filter.message',
+      value: ''
+    },
+    timeRange: {
+      options: [
+        {
+          label: 'filter.timeRange.1hr',
+          value: '1HR'
+        },
+        {
+          label: 'filter.timeRange.24hr',
+          value: '24HR'
+        },
+        {
+          label: 'filter.timeRange.today',
+          value: 'TODAY'
+        },
+        {
+          label: 'filter.timeRange.yesterday',
+          value: 'YESTERDAY'
+        },
+        {
+          label: 'filter.timeRange.7d',
+          value: '7D'
+        },
+        {
+          label: 'filter.timeRange.30d',
+          value: '30d'
+        },
+        {
+          label: 'filter.timeRange.thisMonth',
+          value: 'THIS_MONTH'
+        },
+        {
+          label: 'filter.timeRange.lastMonth',
+          value: 'LAST_MONTH'
+        },
+        {
+          label: 'filter.timeRange.custom',
+          value: 'CUSTOM'
+        }
+      ],
+      selectedValue: '',
+      selectedLabel: ''
+    },
+    timeZone: {
+      options: moment.tz.names().map(zone => {
+        return {
+          label: zone,
+          value: zone
+        };
+      }),
+      selectedValue: '',
+      selectedLabel: ''
+    },
+    components: {
+      label: 'filter.components',
+      iconClass: 'fa fa-cubes',
+      options: [
+        {
+          label: 'DataNode',
+          value: 'DATANODE'
+        },
+        {
+          label: 'NameNode',
+          value: 'NAMENODE'
+        },
+        {
+          label: 'ZooKeeper Server',
+          value: 'ZOOKEEPER_SERVER'
+        },
+        {
+          label: 'Metrics Collector',
+          value: 'METRICS_COLLECTOR'
+        }
+      ],
+      selectedValue: '',
+      selectedLabel: ''
+    },
+    levels: {
+      label: 'filter.levels',
+      iconClass: 'fa fa-sort-amount-asc',
+      options: [
+        {
+          label: 'levels.fatal',
+          value: 'FATAL'
+        },
+        {
+          label: 'levels.error',
+          value: 'ERROR'
+        },
+        {
+          label: 'levels.warn',
+          value: 'WARN'
+        },
+        {
+          label: 'levels.info',
+          value: 'INFO'
+        },
+        {
+          label: 'levels.debug',
+          value: 'DEBUG'
+        },
+        {
+          label: 'levels.trace',
+          value: 'TRACE'
+        },
+        {
+          label: 'levels.unknown',
+          value: 'UNKNOWN'
+        }
+      ],
+      selectedValue: '',
+      selectedLabel: ''
+    }
+  };
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.html
index 82ab60a..6898354 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.html
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.html
@@ -15,4 +15,7 @@
   limitations under the License.
 -->
 
-<menu-button *ngFor="let item of items" [title]="item.title" [action]="item.action" [iconClassNames]="item.iconClassNames" [subItems]="item.subItems"></menu-button>
+<menu-button *ngFor="let item of items" [label]="item.label" [action]="item.action"
+             [iconClass]="item.iconClass" [labelClass]="item.labelClass"
+             [subItems]="item.subItems" [hideCaret]="item.hideCaret">
+</menu-button>

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less
index c992c9e..8728ecf 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less
@@ -15,8 +15,8 @@
  * limitations under the License.
  */
 
+@import '../../styles.less';
+
 :host {
-  display: flex;
-  align-items: center;
-  justify-content: space-between;
+  .default-flex;
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts
index 641fca0..bad588b 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts
@@ -34,76 +34,88 @@ export class TopMenuComponent implements OnInit {
   //TODO implement loading of real data into subItems
   readonly items = [
     {
-      iconClassNames: ['fa', 'fa-arrow-left'],
-      title: 'topMenu.undo',
+      iconClass: 'fa fa-arrow-left',
+      label: 'topMenu.undo',
+      labelClass: 'unstyled-link',
       action: 'undo',
       subItems: [
         {
-          title: 'Apply \'Last week\' filter'
+          label: 'Apply \'Last week\' filter'
         },
         {
-          title: 'Clear all filters'
+          label: 'Clear all filters'
         },
         {
-          title: 'Apply \'HDFS\' filter'
+          label: 'Apply \'HDFS\' filter'
         },
         {
-          title: 'Apply \'Errors\' filter'
+          label: 'Apply \'Errors\' filter'
         }
       ]
     },
     {
-      iconClassNames: ['fa', 'fa-arrow-right'],
-      title: 'topMenu.redo',
+      iconClass: 'fa fa-arrow-right',
+      label: 'topMenu.redo',
+      labelClass: 'unstyled-link',
       action: 'redo',
       subItems: [
         {
-          title: 'Apply \'Warnings\' filter'
+          label: 'Apply \'Warnings\' filter'
         },
         {
-          title: 'Switch to graph mode'
+          label: 'Switch to graph mode'
         },
         {
-          title: 'Apply \'Custom Date\' filter'
+          label: 'Apply \'Custom Date\' filter'
         }
       ]
     },
     {
-      iconClassNames: ['fa', 'fa-refresh'],
-      title: 'topMenu.refresh',
+      iconClass: 'fa fa-refresh',
+      label: 'topMenu.refresh',
+      labelClass: 'unstyled-link',
       action: 'refresh'
     },
     {
-      iconClassNames: ['fa', 'fa-clock-o'],
-      title: 'topMenu.history',
+      iconClass: 'fa fa-clock-o',
+      label: 'topMenu.history',
+      labelClass: 'unstyled-link',
       action: 'openHistory',
       subItems: [
         {
-          title: 'Apply \'Custom Date\' filter'
+          label: 'Apply \'Custom Date\' filter'
         },
         {
-          title: 'Switch to graph mode'
+          label: 'Switch to graph mode'
         },
         {
-          title: 'Apply \'Warnings\' filter'
+          label: 'Apply \'Warnings\' filter'
         },
         {
-          title: 'Apply \'Last week\' filter'
+          label: 'Apply \'Last week\' filter'
         },
         {
-          title: 'Clear all filters'
+          label: 'Clear all filters'
         },
         {
-          title: 'Apply \'HDFS\' filter'
+          label: 'Apply \'HDFS\' filter'
         },
         {
-          title: 'Apply \'Errors\' filter'
+          label: 'Apply \'Errors\' filter'
         }
       ]
     },
     {
-      iconClassNames: ['fa', 'fa-user'],
-      action: 'openUserDetails'
+      iconClass: 'fa fa-user unstyled-link',
+      hideCaret: true,
+      subItems: [
+        {
+          label: 'Options'
+        },
+        {
+          label: 'Logout'
+        }
+      ]
     }
   ];
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/assets/i18n/en.json
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/assets/i18n/en.json b/ambari-logsearch/ambari-logsearch-web-new/src/assets/i18n/en.json
index dea8120..755f307 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/assets/i18n/en.json
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/assets/i18n/en.json
@@ -9,5 +9,32 @@
   "topMenu.undo": "Undo",
   "topMenu.redo": "Redo",
   "topMenu.refresh": "Refresh",
-  "topMenu.history": "History"
+  "topMenu.history": "History",
+
+  "filter.all": "All",
+
+  "filter.clusters": "Clusters",
+  "filter.message": "Message:",
+  "filter.components": "Components",
+  "filter.levels": "Levels",
+  "filter.capture": "Capture",
+  "filter.excluded": "Excluded",
+
+  "filter.timeRange.1hr": "Last 1 hour",
+  "filter.timeRange.24hr": "Last 24 hours",
+  "filter.timeRange.today": "Today",
+  "filter.timeRange.yesterday": "Yesterday",
+  "filter.timeRange.7d": "Last 7 days",
+  "filter.timeRange.30d": "Last 30 days",
+  "filter.timeRange.thisMonth": "This month",
+  "filter.timeRange.lastMonth": "Last month",
+  "filter.timeRange.custom": "Custom range",
+
+  "levels.fatal": "Fatal",
+  "levels.error": "Error",
+  "levels.warn": "Warn",
+  "levels.info": "Info",
+  "levels.debug": "Debug",
+  "levels.trace": "Trace",
+  "levels.unknown": "Unknown"
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/styles.less b/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
index 24136fe..db6da5c 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
@@ -18,3 +18,18 @@
 
 @navbar-background-color: #323544;
 @h1-vertical-margin: 20px;
+@button-border-radius: 4px;
+@input-border: 1px solid #CFD3D7;
+@button-border-radius: 4px;
+@input-group-addon-padding: 6px 12px;
+@login-form-top-margin: 20px;
+
+.flex-vertical-align {
+  display: flex;
+  align-items: center;
+}
+
+.default-flex {
+  .flex-vertical-align;
+  justify-content: space-between;
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/yarn.lock
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/yarn.lock b/ambari-logsearch/ambari-logsearch-web-new/yarn.lock
index d521f70..5412b84 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/yarn.lock
+++ b/ambari-logsearch/ambari-logsearch-web-new/yarn.lock
@@ -137,6 +137,18 @@
   version "2.5.38"
   resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.5.38.tgz#a4379124c4921d4e21de54ec74669c9e9b356717"
 
+"@types/moment-timezone@^0.2.34":
+  version "0.2.34"
+  resolved "https://registry.yarnpkg.com/@types/moment-timezone/-/moment-timezone-0.2.34.tgz#948e0aff82742a31dd63714d1aac9616bc375053"
+  dependencies:
+    moment ">=2.14.0"
+
+"@types/moment@^2.13.0":
+  version "2.13.0"
+  resolved "https://registry.yarnpkg.com/@types/moment/-/moment-2.13.0.tgz#604ebd189bc3bc34a1548689404e61a2a4aac896"
+  dependencies:
+    moment "*"
+
 "@types/node@^6.0.46", "@types/node@~6.0.60":
   version "6.0.73"
   resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.73.tgz#85dc4bb6f125377c75ddd2519a1eeb63f0a4ed70"
@@ -3019,7 +3031,13 @@ mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkd
   dependencies:
     minimist "0.0.8"
 
-moment@2.18.1:
+moment-timezone@^0.5.13:
+  version "0.5.13"
+  resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.13.tgz#99ce5c7d827262eb0f1f702044177f60745d7b90"
+  dependencies:
+    moment ">= 2.9.0"
+
+moment@*, moment@2.18.1, "moment@>= 2.9.0", moment@>=2.14.0, moment@^2.18.1:
   version "2.18.1"
   resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f"
 


[21/21] ambari git commit: AMBARI-21308 Log Search UI GA - fix yarn.lock file. (ababiichuk)

Posted by ab...@apache.org.
AMBARI-21308 Log Search UI GA - fix yarn.lock file. (ababiichuk)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/4bfc6f13
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/4bfc6f13
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/4bfc6f13

Branch: refs/heads/branch-feature-logsearch-ui
Commit: 4bfc6f13e578e1c2d257df2f4180769068edb1d8
Parents: 1a2d6ce
Author: ababiichuk <ab...@hortonworks.com>
Authored: Thu Jun 22 16:16:26 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jun 22 16:16:26 2017 +0300

----------------------------------------------------------------------
 ambari-logsearch/ambari-logsearch-web-new/yarn.lock | 8 ++++++++
 1 file changed, 8 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/4bfc6f13/ambari-logsearch/ambari-logsearch-web-new/yarn.lock
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/yarn.lock b/ambari-logsearch/ambari-logsearch-web-new/yarn.lock
index 5412b84..ff37374 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/yarn.lock
+++ b/ambari-logsearch/ambari-logsearch-web-new/yarn.lock
@@ -112,6 +112,14 @@
   dependencies:
     tsickle "^0.21.0"
 
+"@ngrx/core@^1.2.0":
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/@ngrx/core/-/core-1.2.0.tgz#882b46abafa2e0e6d887cb71a1b2c2fa3e6d0dc6"
+
+"@ngrx/store@^2.2.2":
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/@ngrx/store/-/store-2.2.2.tgz#a00305a6452032a3385886a11ce529dce2dae65b"
+
 "@ngtools/json-schema@1.0.5":
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/@ngtools/json-schema/-/json-schema-1.0.5.tgz#ad39037c70c88b245ac7267a71777646b6063d77"


[08/21] ambari git commit: AMBARI-21313 Log Search UI: implement service for string constants (additional patch). (ababiichuk)

Posted by ab...@apache.org.
AMBARI-21313 Log Search UI: implement service for string constants (additional patch). (ababiichuk)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/8aa761f9
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/8aa761f9
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/8aa761f9

Branch: refs/heads/branch-feature-logsearch-ui
Commit: 8aa761f9661fd07a3b75ca6b53a8a5fa9cbe4d51
Parents: 72c7400
Author: ababiichuk <ab...@hortonworks.com>
Authored: Fri May 19 18:08:08 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jun 22 15:24:50 2017 +0300

----------------------------------------------------------------------
 .../src/app/app.component.spec.ts               | 20 ++++++++++++--------
 .../app/login-form/login-form.component.spec.ts | 18 ++++++++++++++++--
 2 files changed, 28 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/8aa761f9/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.spec.ts
index f6d229f..dfe6fbf 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.spec.ts
@@ -18,10 +18,17 @@
 
 import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
 import {TestBed, async} from '@angular/core/testing';
+import {Http} from '@angular/http';
+import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
+import {TranslateHttpLoader} from '@ngx-translate/http-loader';
 import {HttpClientService} from './http-client.service';
 
 import {AppComponent} from './app.component';
 
+export function HttpLoaderFactory(http: Http) {
+  return new TranslateHttpLoader(http, 'assets/i18n/', '.json');
+}
+
 describe('AppComponent', () => {
   beforeEach(async(() => {
     const httpClient = {
@@ -29,6 +36,11 @@ describe('AppComponent', () => {
     };
     TestBed.configureTestingModule({
       declarations: [AppComponent],
+      imports: [TranslateModule.forRoot({
+        provide: TranslateLoader,
+        useFactory: HttpLoaderFactory,
+        deps: [Http]
+      })],
       providers: [
         {
           provide: HttpClientService,
@@ -44,12 +56,4 @@ describe('AppComponent', () => {
     const app = fixture.debugElement.componentInstance;
     expect(app).toBeTruthy();
   }));
-
-  it('should render title in a h1 tag', async(() => {
-    const fixture = TestBed.createComponent(AppComponent);
-    const app = fixture.debugElement.componentInstance;
-    fixture.detectChanges();
-    const compiled = fixture.debugElement.nativeElement;
-    expect(compiled.querySelector('h1').textContent).toContain(app.title);
-  }));
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/8aa761f9/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.spec.ts
index 0a13c1e..b58e834 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.spec.ts
@@ -18,11 +18,17 @@
 
 import {async, ComponentFixture, TestBed} from '@angular/core/testing';
 import {FormsModule} from '@angular/forms';
-import {HttpModule} from '@angular/http';
+import {HttpModule, Http} from '@angular/http';
+import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
+import {TranslateHttpLoader} from '@ngx-translate/http-loader';
 import {HttpClientService} from '../http-client.service';
 
 import {LoginFormComponent} from './login-form.component';
 
+export function HttpLoaderFactory(http: Http) {
+  return new TranslateHttpLoader(http, 'assets/i18n/', '.json');
+}
+
 describe('LoginFormComponent', () => {
   let component: LoginFormComponent;
   let fixture: ComponentFixture<LoginFormComponent>;
@@ -49,7 +55,15 @@ describe('LoginFormComponent', () => {
   beforeEach(async(() => {
     TestBed.configureTestingModule({
       declarations: [LoginFormComponent],
-      imports: [HttpModule, FormsModule],
+      imports: [
+        HttpModule,
+        FormsModule,
+        TranslateModule.forRoot({
+          provide: TranslateLoader,
+          useFactory: HttpLoaderFactory,
+          deps: [Http]
+        })
+      ],
       providers: [
         {
           provide: HttpClientService,


[05/21] ambari git commit: AMBARI-21312 Provide Log Search UI authorization functionality. (ababiichuk)

Posted by ab...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/fonts/Roboto-Regular-webfont.svg
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/fonts/Roboto-Regular-webfont.svg b/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/fonts/Roboto-Regular-webfont.svg
new file mode 100644
index 0000000..06824bf
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/fonts/Roboto-Regular-webfont.svg
@@ -0,0 +1,7606 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata></metadata>
+<defs>
+<font id="robotoregular" horiz-adv-x="1164" >
+<font-face units-per-em="2048" ascent="1638" descent="-410" />
+<missing-glyph horiz-adv-x="509" />
+<glyph unicode="fi" horiz-adv-x="1140" d="M28 936v146h170v117q0 182 106.5 282t295.5 100q67 0 132 -15.5t153 -45.5l-34 -160q-53 21 -113 36t-123 15q-117 0 -168.5 -52t-51.5 -160v-117h215v-146h-215v-936h-197v936h-170zM783 0v1082h198v-1082h-198z" />
+<glyph unicode=" "  horiz-adv-x="509" />
+<glyph unicode="&#x09;" horiz-adv-x="509" />
+<glyph unicode="&#xa0;" horiz-adv-x="509" />
+<glyph unicode="!" horiz-adv-x="539" d="M171 0v204h198v-204h-198zM171 478v978h197v-978h-197z" />
+<glyph unicode="&#x22;" horiz-adv-x="668" d="M80 1040l1 240v280h197v-270l-101 -250h-97zM389 1040l1 248v272h197v-270l-101 -250h-97z" />
+<glyph unicode="#" horiz-adv-x="1276" d="M70 410v140h264l68 348h-256v142h284l82 416h151l-82 -416h255l82 416h151l-82 -416h199v-142h-226l-68 -348h219v-140h-247l-80 -410h-152l80 410h-255l-80 -410h-151l80 410h-236zM485 550h255l68 348h-255z" />
+<glyph unicode="$" horiz-adv-x="1153" d="M114 424l2 5h190q0 -154 77.5 -219.5t190.5 -65.5q129 0 201.5 61.5t72.5 170.5q0 89 -64 153t-210 114q-202 61 -305 163t-103 272q0 165 94.5 269t260.5 125v221h158v-222q168 -24 260.5 -143.5t92.5 -320.5h-196q0 136 -63 220t-175 84q-118 0 -176.5 -61.5 t-58.5 -168.5q0 -97 60.5 -157t218.5 -114q205 -66 304 -164.5t99 -267.5q0 -172 -103 -273.5t-283 -120.5v-192h-157v191q-172 18 -282 125.5t-106 315.5z" />
+<glyph unicode="%" horiz-adv-x="1498" d="M104 1099v77q0 127 82 214t219 87t219 -86.5t82 -214.5v-77q0 -127 -81.5 -213t-217.5 -86q-138 0 -220.5 86t-82.5 213zM250 1099q0 -74 40.5 -125.5t116.5 -51.5q73 0 113 51t40 126v77q0 74 -40.5 126.5t-114.5 52.5q-75 0 -115 -52.5t-40 -126.5v-77zM349 177 l711 1138l109 -67l-711 -1138zM809 279v78q0 127 82 213.5t219 86.5q136 0 218.5 -86.5t82.5 -213.5v-78q0 -128 -82 -214t-217 -86q-138 0 -220.5 86t-82.5 214zM955 279q0 -75 40.5 -126.5t116.5 -51.5q73 0 113 51.5t40 126.5v78q0 74 -41 126t-114 52q-74 0 -114.5 -52 t-40.5 -126v-78z" />
+<glyph unicode="&#x26;" horiz-adv-x="1276" d="M64 392q0 122 70.5 213.5t210.5 183.5q-78 99 -116 176.5t-38 159.5q0 169 97.5 260.5t268.5 91.5q158 0 257 -91t99 -219q0 -98 -52.5 -169.5t-155.5 -146.5l-109 -80l340 -409q41 65 64 144t23 167h176q0 -132 -39 -244t-113 -201l185 -223l-2 -5h-229l-85 102 q-80 -60 -177 -91.5t-201 -31.5q-217 0 -345.5 115t-128.5 298zM261 392q0 -113 71 -186t206 -73q72 0 142 24.5t132 70.5l-361 435l-40 -29q-91 -68 -120.5 -130t-29.5 -112zM388 1127q0 -53 27 -110.5t81 -125.5l138 95q57 38 77.5 82.5t20.5 98.5q0 61 -48.5 108 t-126.5 47q-81 0 -125 -56.5t-44 -138.5z" />
+<glyph unicode="'" horiz-adv-x="359" d="M80 1055l1 265v240h197v-223l-101 -282h-97z" />
+<glyph unicode="(" horiz-adv-x="679" d="M132 582v9q0 394 159 673t334 372l6 -1l38 -116q-137 -107 -238.5 -343t-101.5 -583v-13q0 -347 101 -583t239 -352l-38 -108h-6q-175 93 -334 371.5t-159 673.5z" />
+<glyph unicode=")" horiz-adv-x="687" d="M6 -355q135 105 237.5 345.5t102.5 589.5v13q0 342 -105.5 583.5t-234.5 351.5l38 108h6q174 -93 333.5 -372t159.5 -673v-9q0 -395 -159.5 -673.5t-333.5 -371.5h-6z" />
+<glyph unicode="*" horiz-adv-x="884" d="M28 1071l49 154l296 -111l-10 342h161l-10 -348l293 110l48 -156l-302 -89l193 -270l-131 -96l-181 287l-176 -279l-132 93l198 274z" />
+<glyph unicode="+" horiz-adv-x="1162" d="M78 605v178h402v423h197v-423h399v-178h-399v-459h-197v459h-402z" />
+<glyph unicode="," horiz-adv-x="404" d="M48 -258l70 316v163h197v-173l-150 -306h-117z" />
+<glyph unicode="-" horiz-adv-x="561" d="M35 538v154h490v-154h-490z" />
+<glyph unicode="." horiz-adv-x="548" d="M161 0v202h197v-202h-197z" />
+<glyph unicode="/" horiz-adv-x="850" d="M16 -125l608 1581h167l-607 -1581h-168z" />
+<glyph unicode="0" horiz-adv-x="1154" d="M113 555v345q0 278 124.5 427.5t338.5 149.5q215 0 339.5 -149.5t124.5 -427.5v-345q0 -279 -123.5 -427.5t-338.5 -148.5t-340 149t-125 427zM310 515q0 -189 69 -285.5t199 -96.5t197.5 96t67.5 286v427q0 189 -68.5 284.5t-198.5 95.5t-198 -95.5t-68 -284.5v-427z " />
+<glyph unicode="1" horiz-adv-x="1153" d="M186 1260v142l495 54v-1456h-197v1264z" />
+<glyph unicode="2" horiz-adv-x="1153" d="M97 1033q-5 188 125 316t360 128q196 0 312.5 -114.5t116.5 -291.5q0 -119 -70.5 -238.5t-197.5 -256.5l-383 -417l2 -5h700v-154h-944v135l477 530q128 143 173.5 227t45.5 172q0 109 -63.5 183.5t-168.5 74.5q-151 0 -222.5 -77.5t-71.5 -217.5h-189z" />
+<glyph unicode="3" horiz-adv-x="1153" d="M100 378l3 6h188q0 -115 70.5 -183t193.5 -68q125 0 196 68t71 201q0 135 -63 199t-199 64h-172v154h172q131 0 185.5 65.5t54.5 182.5q0 125 -62 190t-183 65q-115 0 -184.5 -67.5t-69.5 -179.5h-189l-2 6q-5 165 119.5 280.5t325.5 115.5q202 0 322 -107.5t120 -306.5 q0 -90 -54.5 -179.5t-163.5 -136.5q131 -43 185.5 -135t54.5 -206q0 -199 -130.5 -313t-333.5 -114q-199 0 -329.5 107.5t-125.5 291.5z" />
+<glyph unicode="4" horiz-adv-x="1153" d="M55 336v111l642 1009h208v-966h201v-154h-201v-336h-196v336h-654zM265 490h444v683l-6 1l-19 -50z" />
+<glyph unicode="5" horiz-adv-x="1153" d="M157 377l2 6h178q0 -119 68.5 -184.5t177.5 -65.5q125 0 194 88t69 241q0 140 -70 230t-193 90q-116 0 -168 -35t-76 -107l-164 17l84 799h729v-175h-562l-48 -409q46 34 102.5 56.5t130.5 24.5q201 2 316.5 -131t115.5 -358q0 -219 -117.5 -352t-342.5 -133 q-185 0 -308 101t-118 297z" />
+<glyph unicode="6" horiz-adv-x="1153" d="M132 571v278q0 280 156 454t387 174q75 0 148.5 -17t121.5 -43l-42 -151q-49 25 -102.5 40.5t-125.5 15.5q-156 0 -251.5 -125t-95.5 -326v-23q64 56 146.5 87.5t177.5 31.5q195 0 311 -135t116 -342q0 -226 -123.5 -368.5t-329.5 -142.5q-214 0 -354 155t-140 437z M328 552q0 -201 85 -310t213 -109q121 0 188.5 102.5t67.5 254.5q0 144 -72.5 237t-201.5 93q-101 0 -172 -41t-108 -109v-118z" />
+<glyph unicode="7" horiz-adv-x="1153" d="M77 1301v155h985v-155q-264 -314 -356.5 -556.5t-133.5 -587.5l-16 -157h-197l16 157q42 344 163 615t331 529h-792z" />
+<glyph unicode="8" horiz-adv-x="1153" d="M102 394q0 123 74 217t200 138q-109 42 -171 127.5t-62 199.5q0 192 118.5 296.5t313.5 104.5q192 0 313.5 -104.5t121.5 -296.5q0 -114 -64 -199.5t-173 -127.5q126 -44 201.5 -138t75.5 -217q0 -202 -131.5 -308.5t-341.5 -106.5q-214 0 -344.5 106.5t-130.5 308.5z M299 398q0 -124 76 -194.5t202 -70.5q123 0 200 71t77 194q0 120 -79 197t-200 77q-123 0 -199.5 -77t-76.5 -197zM340 1072q0 -111 65.5 -178t171.5 -67q104 0 170 67t66 178q0 108 -67.5 179t-170.5 71q-105 0 -170 -68.5t-65 -181.5z" />
+<glyph unicode="9" horiz-adv-x="1153" d="M83 978q0 219 131.5 359t319.5 140q228 0 359.5 -142.5t131.5 -419.5v-347q0 -285 -142.5 -437t-371.5 -152q-77 0 -156.5 14.5t-142.5 44.5l30 151q59 -31 122.5 -43.5t146.5 -12.5q144 0 230.5 109t86.5 324v66q-49 -71 -122.5 -107.5t-163.5 -36.5q-211 0 -335 130.5 t-124 359.5zM280 978q0 -150 70.5 -243t191.5 -93q109 0 181.5 47t104.5 120v126q0 191 -73.5 289t-214.5 98q-108 0 -184 -96.5t-76 -247.5z" />
+<glyph unicode=":" horiz-adv-x="517" d="M161 0v202h197v-202h-197zM161 876v202h197v-202h-197z" />
+<glyph unicode=";" horiz-adv-x="525" d="M99 -258l70 316v163h197v-173l-150 -306h-117zM162 876v202h197v-202h-197z" />
+<glyph unicode="&#x3c;" horiz-adv-x="1040" d="M71 466v149l816 378v-201l-559 -233l-85 -18v-6l85 -19l559 -228v-201z" />
+<glyph unicode="=" horiz-adv-x="1153" d="M152 407v164h834v-164h-834zM152 823v164h834v-164h-834z" />
+<glyph unicode="&#x3e;" horiz-adv-x="1072" d="M136 87v196l598 238l85 17v6l-85 20l-598 234v195l856 -378v-149z" />
+<glyph unicode="?" horiz-adv-x="974" d="M61 1122q-3 161 113.5 258t296.5 97q197 0 306 -100.5t109 -280.5q0 -129 -70.5 -236t-186.5 -219q-54 -54 -65.5 -97t-11.5 -134h-197q1 145 25 201t126 148q99 117 141 180t42 152q0 106 -56.5 163t-161.5 57q-91 0 -155 -49.5t-64 -145.5h-188zM353 0v208h206v-208 h-206z" />
+<glyph unicode="@" horiz-adv-x="1833" d="M114 478q19 423 249 688t602 265q379 0 581.5 -250t185.5 -679q-9 -214 -120 -368.5t-332 -154.5q-73 0 -126 41.5t-76 117.5q-50 -80 -122 -119.5t-168 -39.5q-125 0 -194 120.5t-51 316.5q23 259 137.5 415.5t279.5 156.5q105 0 169 -26t139 -80l-4 -4h6l-51 -585 q-9 -110 21.5 -151.5t81.5 -41.5q123 0 197 113.5t82 288.5q16 382 -144 595.5t-496 213.5q-308 0 -495.5 -231t-202.5 -602q-18 -376 150 -594.5t482 -218.5q88 0 178.5 21.5t152.5 56.5l38 -107q-67 -42 -170.5 -65.5t-202.5 -23.5q-380 0 -587.5 249.5t-189.5 681.5z M720 416q-11 -142 21.5 -216t106.5 -74q64 0 117 24.5t97 87.5q-1 12 -0.5 25.5t2.5 29.5l47 538q-26 12 -54.5 19t-59.5 7q-125 0 -191 -109.5t-86 -331.5z" />
+<glyph unicode="A" horiz-adv-x="1326" d="M20 0l563 1456h169l554 -1456h-201l-136 375h-610l-138 -375h-201zM420 540h490l-240 663h-6z" />
+<glyph unicode="B" horiz-adv-x="1309" d="M180 0v1456h475q228 0 357 -98.5t129 -295.5q0 -97 -62 -173.5t-163 -113.5q132 -28 207.5 -129t75.5 -235q0 -200 -129.5 -305.5t-351.5 -105.5h-538zM377 154h341q134 0 209 66.5t75 188.5q0 128 -62.5 201t-192.5 73h-370v-529zM377 837h319q110 0 179 60.5t69 168.5 q0 118 -74.5 176.5t-214.5 58.5h-278v-464z" />
+<glyph unicode="C" horiz-adv-x="1297" d="M118 598v259q0 269 155.5 444.5t402.5 175.5q247 1 393 -131q142 -128 142 -337v-12l-2 -6h-189q0 153 -90 242t-254 89q-165 0 -263 -133t-98 -330v-261q0 -199 98 -332t263 -133q164 0 254 88.5t90 244.5h189l2 -6v-11q0 -198 -144 -332q-148 -138 -391 -138 q-247 0 -402.5 175t-155.5 444z" />
+<glyph unicode="D" horiz-adv-x="1349" d="M180 0v1456h447q286 0 459 -175.5t173 -453.5v-199q0 -279 -173 -453.5t-459 -174.5h-447zM377 154h250q202 0 318.5 133t116.5 341v201q0 206 -116.5 339t-318.5 133h-250v-1147z" />
+<glyph unicode="E" horiz-adv-x="1197" d="M180 0v1456h955v-155h-758v-471h667v-155h-667v-521h769v-154h-966z" />
+<glyph unicode="F" horiz-adv-x="1193" d="M180 0v1456h963v-155h-766v-502h664v-155h-664v-644h-197z" />
+<glyph unicode="G" horiz-adv-x="1396" d="M120 578v300q0 265 159 432t410 167q250 0 393 -123t146 -317l-2 -6h-188q-9 127 -96.5 209t-252.5 82q-167 0 -269 -125t-102 -317v-302q0 -194 114 -319.5t290 -125.5q124 0 203 33t113 75v331h-319v155h516v-534q-52 -80 -180.5 -147t-332.5 -67q-261 0 -431.5 167 t-170.5 432z" />
+<glyph unicode="H" horiz-adv-x="1461" d="M180 0v1456h197v-658h707v658h197v-1456h-197v643h-707v-643h-197z" />
+<glyph unicode="I" horiz-adv-x="579" d="M190 0v1456h198v-1456h-198z" />
+<glyph unicode="J" horiz-adv-x="1130" d="M66 395l2 6h189q0 -135 68.5 -201.5t193.5 -66.5q109 0 178 73.5t69 196.5v1053h197v-1053q0 -195 -123.5 -309.5t-320.5 -114.5q-210 0 -334 107q-119 102 -119 293v16z" />
+<glyph unicode="K" horiz-adv-x="1317" d="M180 0v1456h197v-644h152l521 644h218l3 -5l-565 -699l606 -747l-3 -5h-235l-527 657h-170v-657h-197z" />
+<glyph unicode="L" horiz-adv-x="1106" d="M180 0v1456h197v-1302h689v-154h-886z" />
+<glyph unicode="M" horiz-adv-x="1799" d="M180 0v1456h252l464 -1183h6l464 1183h252v-1456h-197v576l20 592l-5 1l-472 -1169h-131l-470 1166l-5 -1l19 -589v-576h-197z" />
+<glyph unicode="N" horiz-adv-x="1461" d="M180 0v1456h197l701 -1124l6 2v1122h197v-1456h-197l-701 1126l-6 -2v-1124h-197z" />
+<glyph unicode="O" horiz-adv-x="1396" d="M113 598v259q0 266 159.5 443t414.5 177q264 0 429.5 -176.5t165.5 -443.5v-259q0 -267 -165.5 -443t-429.5 -176q-255 0 -414.5 176t-159.5 443zM310 598q0 -202 102.5 -330t274.5 -128q183 0 290.5 127.5t107.5 330.5v261q0 200 -108 328t-290 128q-172 0 -274.5 -128 t-102.5 -328v-261z" />
+<glyph unicode="P" horiz-adv-x="1312" d="M180 0v1456h557q233 0 362 -120t129 -316q0 -199 -129 -317.5t-362 -118.5h-360v-584h-197zM377 738h360q148 0 221 79.5t73 200.5t-73.5 202t-220.5 81h-360v-563z" />
+<glyph unicode="Q" horiz-adv-x="1396" d="M113 598v259q0 266 159.5 443t414.5 177q264 0 429.5 -176.5t165.5 -443.5v-259q0 -142 -50 -263t-140 -205l247 -233l-135 -129l-276 257q-56 -23 -116.5 -34.5t-124.5 -11.5q-255 0 -414.5 176t-159.5 443zM310 598q0 -202 102.5 -330t274.5 -128q183 0 290.5 127.5 t107.5 330.5v261q0 200 -108 328t-290 128q-172 0 -274.5 -128t-102.5 -328v-261z" />
+<glyph unicode="R" horiz-adv-x="1357" d="M180 0v1455h527q239 0 365 -106t126 -308q0 -112 -58.5 -195t-170.5 -132q120 -39 172.5 -126.5t52.5 -216.5v-137q0 -68 15 -122t52 -88v-24h-203q-39 34 -50 100t-11 136v133q0 118 -69 190t-185 72h-366v-631h-197zM377 786h310q167 0 240.5 63.5t73.5 193.5 q0 123 -71.5 190.5t-222.5 67.5h-330v-515z" />
+<glyph unicode="S" horiz-adv-x="1277" d="M102 413l2 6h188q0 -140 103 -213t255 -73q149 0 236 63t87 171q0 100 -75 167.5t-266 113.5q-231 55 -360.5 162t-129.5 269q0 170 139.5 284t361.5 114q239 0 381 -131q137 -127 136 -292v-12l-2 -6h-188q0 128 -84.5 207t-242.5 79q-147 0 -225.5 -66.5t-78.5 -173.5 q0 -95 85 -158.5t276 -111.5q230 -57 350 -168t120 -275q0 -176 -144 -283t-376 -107q-218 0 -386 118q-163 115 -162 305v11z" />
+<glyph unicode="T" horiz-adv-x="1200" d="M34 1301v155h1132v-155h-468v-1301h-197v1301h-467z" />
+<glyph unicode="U" horiz-adv-x="1386" d="M147 469v987h197v-987q0 -165 94 -250.5t248 -85.5q162 0 261.5 85.5t99.5 250.5v987h197v-987q0 -238 -154.5 -364t-403.5 -126q-240 0 -389.5 126.5t-149.5 363.5z" />
+<glyph unicode="V" horiz-adv-x="1295" d="M22 1456h214l376 -1094l33 -115h6l33 115l376 1094h213l-541 -1456h-169z" />
+<glyph unicode="W" horiz-adv-x="1809" d="M54 1456h196l222 -952l27 -182l6 -1l39 183l267 952h174l269 -952l40 -187h6l29 187l217 952h197l-351 -1456h-176l-287 1010l-26 131h-6l-25 -131l-292 -1010h-176z" />
+<glyph unicode="X" horiz-adv-x="1295" d="M66 0l472 734l-462 722h236l338 -568l340 568h238l-462 -722l472 -734h-235l-349 578l-350 -578h-238z" />
+<glyph unicode="Y" horiz-adv-x="1250" d="M20 1456h225l380 -740l380 740h225l-511 -944v-512h-196v525z" />
+<glyph unicode="Z" horiz-adv-x="1225" d="M97 0v146l778 1155h-767v155h992v-141l-781 -1161h814v-154h-1036z" />
+<glyph unicode="[" horiz-adv-x="552" d="M143 -312v1976h385v-155h-188v-1666h188v-155h-385z" />
+<glyph unicode="\" horiz-adv-x="846" d="M39 1456h186l608 -1581h-186z" />
+<glyph unicode="]" horiz-adv-x="552" d="M11 -157h189v1666h-189v155h386v-1976h-386v155z" />
+<glyph unicode="^" horiz-adv-x="856" d="M61 729l299 727h134l298 -727h-181l-166 419l-16 70h-6l-16 -70l-163 -419h-183z" />
+<glyph unicode="_" horiz-adv-x="931" d="M4 0h923v-154h-923v154z" />
+<glyph unicode="`" horiz-adv-x="641" d="M82 1471l3 6h230l175 -266h-158z" />
+<glyph unicode="a" horiz-adv-x="1126" d="M106 304q0 155 125.5 242.5t340.5 87.5h214v107q0 95 -58 150.5t-164 55.5q-95 0 -154.5 -48.5t-59.5 -116.5h-188l-2 6v11q0 111 112 205q118 98 303 98q184 0 296 -93.5t112 -269.5v-521q0 -58 6 -112t22 -106h-203q-10 49 -15.5 86.5t-6.5 75.5q-55 -78 -143.5 -130.5 t-190.5 -52.5q-169 0 -257.5 86.5t-88.5 238.5zM303 300q0 -72 45 -114t133 -42q107 0 193 55t112 126v176h-221q-119 0 -190.5 -60t-71.5 -141z" />
+<glyph unicode="b" d="M143 0v1560h197v-606q51 72 126.5 110t176.5 38q200 0 312 -160t112 -421v-21q0 -234 -112.5 -377.5t-309.5 -143.5q-107 0 -186 41.5t-131 122.5l-24 -143h-161zM340 309q38 -80 99.5 -125t155.5 -45q139 0 207 99t68 262v21q0 186 -68.5 303.5t-208.5 117.5 q-91 0 -153.5 -44.5t-99.5 -119.5v-469z" />
+<glyph unicode="c" horiz-adv-x="1087" d="M97 520v42q0 231 125.5 385.5t360.5 154.5q191 0 311 -112q117 -108 116 -265v-10l-2 -6h-178q0 99 -70 168.5t-177 69.5q-155 0 -221.5 -111.5t-66.5 -273.5v-42q0 -166 66 -276.5t222 -110.5q98 0 172.5 60.5t74.5 148.5h177l2 -6v-10q-1 -134 -125 -238 q-130 -108 -301 -109q-236 0 -361 154t-125 387z" />
+<glyph unicode="d" d="M98 500v21q0 261 111.5 421t312.5 160q95 0 168.5 -35t125.5 -102v595h197v-1560h-161l-23 133q-53 -76 -130 -115t-179 -39q-198 0 -310 143.5t-112 377.5zM295 500q0 -164 67 -262.5t208 -98.5q88 0 148 40t98 112v505q-38 67 -98.5 106.5t-145.5 39.5 q-142 0 -209.5 -117t-67.5 -304v-21z" />
+<glyph unicode="e" horiz-adv-x="1083" d="M99 520v44q0 231 137.5 384.5t325.5 153.5q219 0 331 -132t112 -352v-123h-702l-3 -5q3 -156 79 -256.5t213 -100.5q100 0 175.5 28.5t130.5 78.5l77 -128q-58 -57 -153 -95t-230 -38q-226 0 -359.5 150.5t-133.5 390.5zM307 654l2 -5h499v26q0 116 -62 194t-184 78 q-99 0 -169 -83.5t-86 -209.5z" />
+<glyph unicode="f" horiz-adv-x="707" d="M56 936v146h169v137q0 173 90.5 267.5t252.5 94.5q34 0 68.5 -5.5t76.5 -15.5l-24 -150q-18 4 -43.5 7t-53.5 3q-86 0 -128 -51.5t-42 -149.5v-137h225v-146h-225v-936h-197v936h-169z" />
+<glyph unicode="g" d="M100 500v21q0 261 114 421t315 160q103 0 181 -41.5t130 -119.5l24 141h157v-1088q0 -208 -121 -319.5t-349 -111.5q-78 0 -168.5 21.5t-159.5 58.5l50 153q53 -30 128 -48.5t148 -18.5q144 0 209.5 65.5t65.5 199.5v122q-53 -68 -127 -102.5t-170 -34.5q-199 0 -313 144 t-114 377zM297 500q0 -163 69 -262t210 -99q89 0 149 40.5t99 114.5v498q-38 69 -99 109.5t-147 40.5q-141 0 -211 -118t-70 -303v-21z" />
+<glyph unicode="h" d="M143 0v1560h197v-623q56 78 137.5 121.5t180.5 43.5q173 0 269.5 -104t96.5 -320v-678h-197v680q0 134 -57.5 198t-171.5 64q-82 0 -148.5 -38.5t-109.5 -104.5v-799h-197z" />
+<glyph unicode="i" horiz-adv-x="516" d="M159 0v1082h197v-1082h-197zM159 1359v201h197v-201h-197z" />
+<glyph unicode="j" horiz-adv-x="530" d="M-66 -419l14 155q14 -5 40 -8.5t43 -3.5q65 0 103.5 44t38.5 143v1171h197v-1171q0 -167 -86 -257.5t-239 -90.5q-31 0 -56.5 4.5t-54.5 13.5zM167 1363v197h197v-197h-197z" />
+<glyph unicode="k" horiz-adv-x="1050" d="M144 0v1560h197v-904h126l296 426h236l-370 -492l423 -590h-232l-351 499h-128v-499h-197z" />
+<glyph unicode="l" horiz-adv-x="516" d="M159 0v1560h197v-1560h-197z" />
+<glyph unicode="m" horiz-adv-x="1790" d="M143 0v1082h176l14 -142q53 77 134.5 119.5t189.5 42.5t185.5 -50t116.5 -150q51 92 135 146t196 54q165 0 261 -113.5t96 -341.5v-647h-197v649q0 160 -55 226.5t-164 66.5q-101 0 -163.5 -70t-73.5 -177v-8v-687h-198v649q0 152 -56.5 222.5t-162.5 70.5 q-90 0 -148 -37t-89 -104v-801h-197z" />
+<glyph unicode="n" d="M143 0v1082h176l14 -161q54 86 135.5 133.5t185.5 47.5q175 0 271 -102.5t96 -316.5v-683h-197v679q0 143 -56.5 203t-172.5 60q-85 0 -150.5 -41t-104.5 -112v-789h-197z" />
+<glyph unicode="o" d="M97 529v22q0 240 130 395.5t353 155.5q225 0 355.5 -155t130.5 -396v-22q0 -242 -130 -396t-354 -154t-354.5 154.5t-130.5 395.5zM294 529q0 -172 72.5 -284t215.5 -112q141 0 214 112t73 284v22q0 170 -73.5 283t-215.5 113q-141 0 -213.5 -113t-72.5 -283v-22z" />
+<glyph unicode="p" d="M143 -416v1498h151l31 -140q53 78 132 119t184 41q201 0 312.5 -159.5t111.5 -421.5v-21q0 -234 -112 -377.5t-309 -143.5q-100 0 -175.5 33.5t-128.5 100.5v-529h-197zM340 275q37 -67 97 -104.5t147 -37.5q140 0 212 102.5t72 264.5v21q0 184 -72.5 302.5t-213.5 118.5 q-85 0 -145 -38.5t-97 -105.5v-523z" />
+<glyph unicode="q" d="M98 500v21q0 261 111.5 421t312.5 160q99 0 174 -37.5t127 -109.5l29 127h150v-1498h-197v518q-52 -61 -123 -92t-162 -31q-198 0 -310 143.5t-112 377.5zM295 500q0 -164 67.5 -265.5t207.5 -101.5q81 0 138.5 36t96.5 101v546q-39 61 -96.5 96t-136.5 35 q-141 0 -209 -119.5t-68 -306.5v-21z" />
+<glyph unicode="r" horiz-adv-x="702" d="M143 0v1082h176l19 -158q46 84 113.5 131t155.5 47q22 0 42 -3.5t33 -7.5l-27 -183l-101 6q-78 0 -131.5 -37t-82.5 -104v-773h-197z" />
+<glyph unicode="s" horiz-adv-x="1071" d="M109 329l2 6h188q5 -105 78 -153.5t171 -48.5q105 0 164.5 42.5t59.5 111.5q0 65 -49.5 107t-187.5 73q-197 43 -296.5 116.5t-99.5 200.5q0 132 112 225t292 93q189 0 301 -97q107 -93 106 -224v-12l-2 -6h-188q0 71 -59.5 127.5t-157.5 56.5q-105 0 -156 -46t-51 -111 q0 -64 45 -101t183 -66q205 -44 305 -119.5t100 -202.5q0 -144 -116.5 -233t-304.5 -89q-207 0 -326 105q-113 100 -113 232v13z" />
+<glyph unicode="t" horiz-adv-x="708" d="M34 936v146h172v261h197v-261h205v-146h-205v-657q0 -76 31.5 -107t83.5 -31q17 0 37.5 4t36.5 10l26 -135q-22 -18 -64.5 -29.5t-85.5 -11.5q-120 0 -191 72.5t-71 227.5v657h-172z" />
+<glyph unicode="u" d="M139 444v638h197v-640q0 -173 51 -238t159 -65q105 0 173.5 42.5t103.5 120.5v780h197v-1082h-177l-13 160q-51 -87 -131 -134t-185 -47q-177 0 -276 113t-99 352z" />
+<glyph unicode="v" horiz-adv-x="1030" d="M46 1082h202l256 -763l17 -76h6l19 76l249 763h201l-398 -1082h-149z" />
+<glyph unicode="w" horiz-adv-x="1550" d="M45 1082h196l179 -688l23 -131h6l28 131l216 688h158l217 -688l31 -146h6l29 146l170 688h196l-314 -1082h-159l-209 659l-45 184l-6 -1l-43 -183l-206 -659h-159z" />
+<glyph unicode="x" horiz-adv-x="1030" d="M46 0l361 547l-351 535h227l227 -399l230 399h230l-351 -535l361 -547h-226l-240 409l-240 -409h-228z" />
+<glyph unicode="y" horiz-adv-x="1030" d="M26 1082h220l228 -681l35 -136h6l266 817h219l-455 -1248q-41 -109 -117.5 -190t-206.5 -81q-24 0 -61 5.5t-57 10.5l20 155q-6 1 35.5 -2t52.5 -3q63 0 103 56t67 124l47 113z" />
+<glyph unicode="z" horiz-adv-x="1030" d="M94 0v138l585 788h-578v156h819v-134l-591 -794h625v-154h-860z" />
+<glyph unicode="{" horiz-adv-x="696" d="M63 543v147q106 0 157.5 61.5t51.5 174.5v206q0 171 82 290.5t277 174.5l40 -117q-110 -35 -156 -125.5t-46 -222.5v-206q0 -105 -42.5 -185t-127.5 -125q85 -46 127.5 -126.5t42.5 -183.5v-205q0 -132 46 -221.5t156 -125.5l-40 -118q-195 55 -277 175t-82 290v205 q0 112 -51.5 174.5t-157.5 62.5z" />
+<glyph unicode="|" horiz-adv-x="507" d="M175 -270v1726h158v-1726h-158z" />
+<glyph unicode="}" horiz-adv-x="696" d="M21 -246q109 36 156 125.5t47 221.5v205q0 107 45 187t139 123q-94 41 -139 121t-45 189v206q0 132 -47 222.5t-156 125.5l41 117q194 -55 276.5 -174.5t82.5 -290.5v-206q0 -113 50.5 -174.5t158.5 -61.5v-147q-108 0 -158.5 -62.5t-50.5 -174.5v-205q0 -170 -82.5 -290 t-276.5 -175z" />
+<glyph unicode="~" horiz-adv-x="1391" d="M128 474q0 136 85.5 232.5t217.5 96.5q88 0 163 -34.5t160 -104.5q58 -51 106 -74t100 -23q66 0 114.5 57t48.5 134l141 -18q0 -137 -87 -238t-217 -101q-90 0 -163.5 33t-158.5 107q-59 48 -108 72t-99 24q-67 0 -114.5 -53t-47.5 -128z" />
+<glyph unicode="&#xa1;" horiz-adv-x="507" d="M144 -374v978h197v-978h-197zM144 876v206h197v-206h-197z" />
+<glyph unicode="&#xa2;" horiz-adv-x="1122" d="M107 520v42q0 199 95 344.5t276 183.5v228h198v-223q157 -24 252.5 -130.5t92.5 -250.5l-2 -5h-179q0 99 -70 168.5t-177 69.5q-155 0 -221.5 -111.5t-66.5 -273.5v-42q0 -166 66 -276.5t222 -110.5q98 0 172.5 60.5t74.5 148.5h178l3 -6q3 -122 -98 -223t-247 -126v-232 h-198v236q-182 36 -276.5 182t-94.5 347z" />
+<glyph unicode="&#xa3;" horiz-adv-x="1194" d="M70 615v155h158l-10 270q0 204 112 320.5t300 116.5q200 0 310 -104.5t106 -276.5l-2 -6h-190q0 118 -63 175t-161 57q-99 0 -157 -74.5t-58 -207.5l10 -270h418v-155h-413l6 -149q0 -90 -15.5 -171.5t-44.5 -140.5h735l-1 -154h-976v154h10q48 13 72 111t24 201l-6 149 h-164z" />
+<glyph unicode="&#xa4;" horiz-adv-x="1456" d="M104 112l138 140q-50 76 -76.5 166.5t-26.5 189.5q0 102 28.5 196t82.5 172l-146 149l139 139l143 -146q74 55 163 85.5t185 30.5q97 0 186 -31t164 -87l146 149l140 -140l-150 -153q52 -78 80.5 -170.5t28.5 -193.5q0 -98 -26.5 -187.5t-74.5 -165.5l142 -143l-140 -139 l-133 135q-77 -62 -169.5 -95t-193.5 -33t-193.5 32.5t-167.5 93.5l-130 -132zM321 608q0 -188 120.5 -320.5t292.5 -132.5q170 0 290.5 132.5t120.5 320.5q0 186 -120.5 318t-290.5 132q-172 0 -292.5 -132t-120.5 -318z" />
+<glyph unicode="&#xa5;" horiz-adv-x="1243" d="M30 1456h226l359 -663l360 663h224l-418 -718h312v-155h-383v-135h383v-155h-383v-293h-197v293h-375v155h375v135h-375v155h311z" />
+<glyph unicode="&#xa6;" horiz-adv-x="499" d="M145 -270v792h197v-792h-197zM145 698v758h197v-758h-197z" />
+<glyph unicode="&#xa7;" horiz-adv-x="1259" d="M94 551q0 91 47 161.5t134 111.5q-68 50 -102 119.5t-34 166.5q0 166 134 266.5t358 100.5q233 0 363 -111.5t126 -313.5l-3 -6h-188q0 118 -79 197t-219 79q-145 0 -220 -59.5t-75 -150.5q0 -99 67 -148.5t278 -107.5q244 -69 355.5 -159.5t111.5 -265.5q0 -94 -48 -164 t-135 -110q69 -51 104 -119t35 -166q0 -172 -133 -269.5t-358 -97.5q-221 0 -372 102.5t-146 322.5l2 6l188 2q0 -143 96.5 -210.5t231.5 -67.5q137 0 215.5 59.5t78.5 150.5t-72 141.5t-276 113.5q-239 63 -352 156t-113 270zM291 553q0 -100 68 -151.5t278 -110.5 q56 -17 93 -28t70 -23q72 20 112 69.5t40 118.5q0 91 -73.5 144.5t-275.5 116.5q-47 12 -88.5 24.5t-77.5 27.5q-73 -19 -109.5 -69t-36.5 -119z" />
+<glyph unicode="&#xa8;" horiz-adv-x="1021" d="M170 1256v200h219v-200h-219zM640 1256v200h219v-200h-219z" />
+<glyph unicode="&#xa9;" horiz-adv-x="1604" d="M88 729q0 315 207 531t503 216q295 0 502 -216t207 -531q0 -316 -207.5 -533t-501.5 -217q-296 0 -503 217t-207 533zM209 729q0 -265 171.5 -447t417.5 -182q245 0 417 182t172 447q0 263 -172 444t-417 181q-246 0 -417.5 -181t-171.5 -444zM436 669v119q0 173 94 280 t254 107q157 0 245.5 -79t84.5 -228l-2 -6h-146q0 95 -45.5 138.5t-136.5 43.5q-94 0 -145 -70.5t-51 -184.5v-120q0 -117 51 -187t145 -70q91 0 136 43t45 141h146l2 -6q4 -151 -84 -229.5t-245 -78.5q-160 0 -254 106.5t-94 280.5z" />
+<glyph unicode="&#xaa;" horiz-adv-x="917" d="M120 920q0 110 84.5 170t245.5 60h139v52q0 63 -30 97t-88 34q-67 0 -103.5 -27t-36.5 -76l-162 13l-1 6q-6 98 78.5 163t224.5 65q134 0 212 -71t78 -205v-314q0 -50 6 -94t20 -87h-174q-8 21 -13 45t-8 50q-33 -47 -89.5 -78t-133.5 -31q-119 0 -184 61t-65 167z M293 924q0 -45 29 -69t89 -24q51 0 105.5 30t72.5 65v110h-138q-75 0 -116.5 -33t-41.5 -79z" />
+<glyph unicode="&#xab;" horiz-adv-x="966" d="M98 507v19l295 389h148l-255 -399l255 -398h-148zM432 507v19l295 389h148l-255 -399l255 -398h-148z" />
+<glyph unicode="&#xac;" horiz-adv-x="1137" d="M127 637v165h835v-427h-198v262h-637z" />
+<glyph unicode="&#xad;" horiz-adv-x="561" d="M35 538v154h490v-154h-490z" />
+<glyph unicode="&#xae;" horiz-adv-x="1604" d="M88 729q0 315 207 531t503 216q295 0 502 -216t207 -531q0 -316 -207.5 -533t-501.5 -217q-296 0 -503 217t-207 533zM209 729q0 -266 171.5 -447.5t417.5 -181.5q244 0 416 182t172 447q0 264 -171.5 444.5t-416.5 180.5q-246 0 -417.5 -180.5t-171.5 -444.5zM504 316 v850h280q152 0 238.5 -65.5t86.5 -191.5q0 -62 -33 -109t-96 -78q66 -26 95.5 -79t29.5 -128v-56q0 -41 3.5 -73.5t13.5 -53.5v-16h-153q-9 21 -11 61.5t-2 82.5v54q0 72 -33.5 106t-110.5 34h-159v-338h-149zM653 784h152q65 1 110.5 32.5t45.5 87.5q0 73 -39.5 102.5 t-137.5 29.5h-131v-252z" />
+<glyph unicode="&#xaf;" horiz-adv-x="950" d="M123 1310v146h721v-146h-721z" />
+<glyph unicode="&#xb0;" horiz-adv-x="763" d="M128 1216q0 106 76 183.5t181 77.5q103 0 177.5 -77.5t74.5 -183.5q0 -108 -74 -182.5t-178 -74.5q-106 0 -181.5 74.5t-75.5 182.5zM259 1216q0 -55 36.5 -91t89.5 -36q52 0 87.5 36t35.5 91t-36 92.5t-87 37.5q-53 0 -89.5 -37.5t-36.5 -92.5z" />
+<glyph unicode="&#xb1;" horiz-adv-x="1097" d="M99 702v154h381v411h177v-411h358v-154h-358v-413h-177v413h-381zM136 4v155h835v-155h-835z" />
+<glyph unicode="&#xb2;" horiz-adv-x="868" d="M119 1240q-6 99 78 169t225 70q135 0 211 -64t76 -180q0 -80 -44.5 -136t-160.5 -161l-153 -135l2 -6h361v-130h-592v130l302 262q69 60 91 97.5t22 79.5q0 50 -28.5 81t-86.5 31q-67 0 -103.5 -32t-36.5 -82h-161z" />
+<glyph unicode="&#xb3;" horiz-adv-x="876" d="M112 882l1 6h163q0 -46 37.5 -74.5t100.5 -28.5q72 0 114 29.5t42 77.5q0 62 -36.5 90.5t-109.5 28.5h-132v126h132q67 0 99.5 28.5t32.5 80.5q0 43 -36.5 72t-105.5 29q-56 0 -90.5 -24t-34.5 -64h-162l-2 6q-6 94 78.5 153.5t210.5 59.5q145 0 229 -59.5t84 -169.5 q0 -55 -35.5 -100.5t-97.5 -71.5q70 -23 108 -71t38 -116q0 -111 -90 -173t-236 -62q-127 0 -217.5 58t-84.5 169z" />
+<glyph unicode="&#xb4;" horiz-adv-x="654" d="M131 1211l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="&#xb5;" d="M153 -416v1498h196v-642q2 -178 57.5 -242.5t155.5 -64.5q98 0 158.5 36t92.5 106v807h197v-1082h-177l-9 108q-44 -63 -107.5 -96t-146.5 -33q-72 0 -126.5 16.5t-94.5 51.5v-463h-196z" />
+<glyph unicode="&#xb6;" horiz-adv-x="1006" d="M63 988q0 207 129.5 337.5t362.5 130.5h281v-1456h-197v520h-84q-233 0 -362.5 129.5t-129.5 338.5z" />
+<glyph unicode="&#xb7;" horiz-adv-x="540" d="M161 624v212h198v-212h-198z" />
+<glyph unicode="&#xb8;" horiz-adv-x="509" d="M119 -326q72 0 116 24.5t44 73.5q0 48 -36 67t-123 26l32 135h140l-12 -52q65 -11 108 -52t43 -121q0 -96 -79 -153t-226 -57z" />
+<glyph unicode="&#xb9;" horiz-adv-x="557" d="M95 1320v134l301 23v-812h-174v655h-127z" />
+<glyph unicode="&#xba;" horiz-adv-x="933" d="M120 1025v117q0 148 94 241.5t251 93.5q158 0 252 -93.5t94 -241.5v-117q0 -149 -93.5 -241.5t-250.5 -92.5q-158 0 -252.5 92.5t-94.5 241.5zM293 1025q0 -88 44 -140.5t130 -52.5q83 0 127.5 53t44.5 140v117q0 84 -45 137.5t-129 53.5t-128 -53.5t-44 -137.5v-117z " />
+<glyph unicode="&#xbb;" horiz-adv-x="966" d="M110 152l255 398l-255 399h148l295 -389v-19l-295 -389h-148zM456 152l255 398l-255 399h148l295 -389v-19l-295 -389h-148z" />
+<glyph unicode="&#xbc;" horiz-adv-x="1595" d="M184 1319v134l301 23v-812h-174v655h-127zM339 185l711 1138l109 -67l-711 -1138zM785 254l422 547h173v-519h126v-130h-126v-152h-170v152h-417zM967 282h243v310l-6 1l-13 -22z" />
+<glyph unicode="&#xbd;" horiz-adv-x="1708" d="M184 1319v134l301 23v-812h-174v655h-127zM352 185l711 1138l109 -67l-711 -1138zM930 573q-6 99 78 169t225 70q135 0 211 -64t76 -180q0 -80 -44.5 -136t-160.5 -161l-153 -135l2 -6h361v-130h-592v130l302 262q69 60 91 97.5t22 79.5q0 50 -28.5 81t-86.5 31 q-67 0 -103.5 -32t-36.5 -82h-161z" />
+<glyph unicode="&#xbe;" horiz-adv-x="1781" d="M128 883l1 6h163q0 -46 37.5 -74.5t100.5 -28.5q72 0 114 29.5t42 77.5q0 62 -36.5 90.5t-109.5 28.5h-132v126h132q67 0 99.5 28.5t32.5 80.5q0 43 -36.5 72t-105.5 29q-56 0 -90.5 -24t-34.5 -64h-162l-2 6q-6 94 78.5 153.5t210.5 59.5q145 0 229 -59.5t84 -169.5 q0 -55 -35.5 -100.5t-97.5 -71.5q70 -23 108 -71t38 -116q0 -111 -90 -173t-236 -62q-127 0 -217.5 58t-84.5 169zM522 185l711 1138l109 -67l-711 -1138zM974 254l422 547h173v-519h126v-130h-126v-152h-170v152h-417zM1156 282h243v310l-6 1l-13 -22z" />
+<glyph unicode="&#xbf;" horiz-adv-x="1013" d="M114 -13q0 127 70 233.5t187 220.5q53 53 65 96t12 135h197q-2 -146 -26 -202t-125 -147q-100 -118 -141.5 -181t-41.5 -150q0 -106 56 -163t162 -57q90 0 154.5 49.5t64.5 145.5h188l3 -6q2 -161 -114.5 -258t-295.5 -97q-198 0 -306.5 100.5t-108.5 280.5zM441 874v209 h206v-209h-206z" />
+<glyph unicode="&#xc0;" horiz-adv-x="1326" d="M20 0l563 1456h169l554 -1456h-201l-136 375h-610l-138 -375h-201zM378 1820l3 6h230l175 -266h-158zM420 540h490l-240 663h-6z" />
+<glyph unicode="&#xc1;" horiz-adv-x="1326" d="M20 0l563 1456h169l554 -1456h-201l-136 375h-610l-138 -375h-201zM420 540h490l-240 663h-6zM613 1556l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="&#xc2;" horiz-adv-x="1326" d="M20 0l563 1456h169l554 -1456h-201l-136 375h-610l-138 -375h-201zM356 1601v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160zM420 540h490l-240 663h-6z" />
+<glyph unicode="&#xc3;" horiz-adv-x="1326" d="M20 0l563 1456h169l554 -1456h-201l-136 375h-610l-138 -375h-201zM316 1628q0 93 59 161.5t150 68.5q56 0 140 -47t136 -47q41 0 71 32.5t30 79.5l108 -32q0 -94 -59.5 -159t-149.5 -65q-71 0 -148 46.5t-128 46.5q-43 0 -72 -32.5t-29 -78.5zM420 540h490l-240 663h-6z " />
+<glyph unicode="&#xc4;" horiz-adv-x="1326" d="M20 0l563 1456h169l554 -1456h-201l-136 375h-610l-138 -375h-201zM319 1605v200h219v-200h-219zM420 540h490l-240 663h-6zM789 1605v200h219v-200h-219z" />
+<glyph unicode="&#xc5;" horiz-adv-x="1326" d="M20 0l563 1456h169l554 -1456h-201l-136 375h-610l-138 -375h-201zM420 540h490l-240 663h-6zM457 1734q0 84 60.5 141t147.5 57q85 0 145 -56.5t60 -141.5q0 -86 -59.5 -140t-145.5 -54q-87 0 -147.5 54t-60.5 140zM560 1734q0 -43 31 -73.5t74 -30.5q42 0 72 29.5 t30 74.5t-30 76t-72 31q-43 0 -74 -31t-31 -76z" />
+<glyph unicode="&#xc6;" horiz-adv-x="1922" d="M-20 0l880 1456h967v-155h-691l20 -466h590v-155h-584l22 -526h705v-154h-895l-15 350h-557l-202 -350h-240zM525 529h447l-31 710l-5 2z" />
+<glyph unicode="&#xc7;" horiz-adv-x="1297" d="M118 598v259q0 269 155.5 444.5t402.5 175.5t393 -131.5t142 -348.5l-2 -6h-189q0 153 -90 242t-254 89q-165 0 -263 -133t-98 -330v-261q0 -199 98 -332t263 -133q164 0 254 88.5t90 244.5h189l2 -6q4 -205 -144 -343t-391 -138q-247 0 -402.5 175t-155.5 444zM581 -334 q72 0 116 24.5t44 73.5q0 48 -36 67t-123 26l32 135h140l-12 -52q65 -11 108 -52t43 -121q0 -96 -79 -153t-226 -57z" />
+<glyph unicode="&#xc8;" horiz-adv-x="1197" d="M180 0v1456h955v-155h-758v-471h667v-155h-667v-521h769v-154h-966zM303 1820l3 6h230l175 -266h-158z" />
+<glyph unicode="&#xc9;" horiz-adv-x="1197" d="M180 0v1456h955v-155h-758v-471h667v-155h-667v-521h769v-154h-966zM538 1556l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="&#xca;" horiz-adv-x="1197" d="M180 0v1456h955v-155h-758v-471h667v-155h-667v-521h769v-154h-966zM322 1601v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="&#xcb;" horiz-adv-x="1197" d="M180 0v1456h955v-155h-758v-471h667v-155h-667v-521h769v-154h-966zM284 1605v200h219v-200h-219zM754 1605v200h219v-200h-219z" />
+<glyph unicode="&#xcc;" horiz-adv-x="579" d="M-34 1820l3 6h230l175 -266h-158zM190 0v1456h198v-1456h-198z" />
+<glyph unicode="&#xcd;" horiz-adv-x="579" d="M190 0v1456h198v-1456h-198zM199 1556l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="&#xce;" horiz-adv-x="579" d="M-15 1601v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160zM190 0v1456h198v-1456h-198z" />
+<glyph unicode="&#xcf;" horiz-adv-x="579" d="M-53 1605v200h219v-200h-219zM190 0v1456h198v-1456h-198zM417 1605v200h219v-200h-219z" />
+<glyph unicode="&#xd0;" horiz-adv-x="1379" d="M42 663v155h168v638h447q286 0 459 -175.5t173 -453.5v-199q0 -279 -173 -453.5t-459 -174.5h-447v663h-168zM407 154h250q202 0 318.5 133t116.5 341v201q0 206 -116.5 339t-318.5 133h-250v-483h276v-155h-276v-509z" />
+<glyph unicode="&#xd1;" horiz-adv-x="1461" d="M180 0v1456h197l701 -1124l6 2v1122h197v-1456h-197l-701 1126l-6 -2v-1124h-197zM381 1628q0 93 59 161.5t150 68.5q56 0 140 -47t136 -47q41 0 71 32.5t30 79.5l108 -32q0 -94 -59.5 -159t-149.5 -65q-71 0 -148 46.5t-128 46.5q-43 0 -72 -32.5t-29 -78.5z" />
+<glyph unicode="&#xd2;" horiz-adv-x="1396" d="M113 598v259q0 266 159.5 443t414.5 177q264 0 429.5 -176.5t165.5 -443.5v-259q0 -267 -165.5 -443t-429.5 -176q-255 0 -414.5 176t-159.5 443zM310 598q0 -202 102.5 -330t274.5 -128q183 0 290.5 127.5t107.5 330.5v261q0 200 -108 328t-290 128q-172 0 -274.5 -128 t-102.5 -328v-261zM373 1841l3 6h230l175 -266h-158z" />
+<glyph unicode="&#xd3;" horiz-adv-x="1396" d="M113 598v259q0 266 159.5 443t414.5 177q264 0 429.5 -176.5t165.5 -443.5v-259q0 -267 -165.5 -443t-429.5 -176q-255 0 -414.5 176t-159.5 443zM310 598q0 -202 102.5 -330t274.5 -128q183 0 290.5 127.5t107.5 330.5v261q0 200 -108 328t-290 128q-172 0 -274.5 -128 t-102.5 -328v-261zM608 1577l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="&#xd4;" horiz-adv-x="1396" d="M113 598v259q0 266 159.5 443t414.5 177q264 0 429.5 -176.5t165.5 -443.5v-259q0 -267 -165.5 -443t-429.5 -176q-255 0 -414.5 176t-159.5 443zM310 598q0 -202 102.5 -330t274.5 -128q183 0 290.5 127.5t107.5 330.5v261q0 200 -108 328t-290 128q-172 0 -274.5 -128 t-102.5 -328v-261zM392 1622v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="&#xd5;" horiz-adv-x="1396" d="M113 598v259q0 266 159.5 443t414.5 177q264 0 429.5 -176.5t165.5 -443.5v-259q0 -267 -165.5 -443t-429.5 -176q-255 0 -414.5 176t-159.5 443zM310 598q0 -202 102.5 -330t274.5 -128q183 0 290.5 127.5t107.5 330.5v261q0 200 -108 328t-290 128q-172 0 -274.5 -128 t-102.5 -328v-261zM351 1649q0 93 59 161.5t150 68.5q56 0 140 -47t136 -47q41 0 71 32.5t30 79.5l108 -32q0 -94 -59.5 -159t-149.5 -65q-71 0 -148 46.5t-128 46.5q-43 0 -72 -32.5t-29 -78.5z" />
+<glyph unicode="&#xd6;" horiz-adv-x="1396" d="M113 598v259q0 266 159.5 443t414.5 177q264 0 429.5 -176.5t165.5 -443.5v-259q0 -267 -165.5 -443t-429.5 -176q-255 0 -414.5 176t-159.5 443zM310 598q0 -202 102.5 -330t274.5 -128q183 0 290.5 127.5t107.5 330.5v261q0 200 -108 328t-290 128q-172 0 -274.5 -128 t-102.5 -328v-261zM354 1626v200h219v-200h-219zM824 1626v200h219v-200h-219z" />
+<glyph unicode="&#xd7;" horiz-adv-x="1096" d="M88 351l327 334l-327 334l126 126l326 -333l327 333l126 -126l-328 -334l328 -334l-126 -126l-327 332l-326 -332z" />
+<glyph unicode="&#xd8;" horiz-adv-x="1396" d="M113 598v259q0 266 159.5 443t414.5 177q94 0 178.5 -25.5t156.5 -71.5l81 137h149l-132 -221q77 -84 119.5 -197t42.5 -242v-259q0 -267 -165.5 -443t-429.5 -176q-85 0 -160.5 20.5t-139.5 60.5l-91 -154h-149l139 234q-84 84 -128.5 202t-44.5 256zM310 598 q0 -85 19 -158t54 -125l6 -1l544 916q-50 41 -112 63t-134 22q-172 0 -274.5 -128t-102.5 -328v-261zM475 208q44 -34 97 -51t115 -17q183 0 290.5 127.5t107.5 330.5v261q0 75 -16.5 142t-46.5 117l-6 1z" />
+<glyph unicode="&#xd9;" horiz-adv-x="1386" d="M147 469v987h197v-987q0 -165 94 -250.5t248 -85.5q162 0 261.5 85.5t99.5 250.5v987h197v-987q0 -238 -154.5 -364t-403.5 -126q-240 0 -389.5 126.5t-149.5 363.5zM372 1820l3 6h230l175 -266h-158z" />
+<glyph unicode="&#xda;" horiz-adv-x="1386" d="M147 469v987h197v-987q0 -165 94 -250.5t248 -85.5q162 0 261.5 85.5t99.5 250.5v987h197v-987q0 -238 -154.5 -364t-403.5 -126q-240 0 -389.5 126.5t-149.5 363.5zM607 1556l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="&#xdb;" horiz-adv-x="1386" d="M147 469v987h197v-987q0 -165 94 -250.5t248 -85.5q162 0 261.5 85.5t99.5 250.5v987h197v-987q0 -238 -154.5 -364t-403.5 -126q-240 0 -389.5 126.5t-149.5 363.5zM391 1601v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="&#xdc;" horiz-adv-x="1386" d="M147 469v987h197v-987q0 -165 94 -250.5t248 -85.5q162 0 261.5 85.5t99.5 250.5v987h197v-987q0 -238 -154.5 -364t-403.5 -126q-240 0 -389.5 126.5t-149.5 363.5zM353 1605v200h219v-200h-219zM823 1605v200h219v-200h-219z" />
+<glyph unicode="&#xdd;" horiz-adv-x="1250" d="M20 1456h225l380 -740l380 740h225l-511 -944v-512h-196v525zM535 1555l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="&#xde;" horiz-adv-x="1209" d="M163 0v1456h197v-293h269q232 0 362 -118t130 -307q0 -190 -130 -307.5t-362 -117.5h-269v-313h-197zM360 467h269q147 0 220.5 78t73.5 191q0 114 -73.5 193.5t-220.5 79.5h-269v-542z" />
+<glyph unicode="&#xdf;" horiz-adv-x="1221" d="M137 0v1082q0 223 117.5 348t300.5 125q161 0 262 -86t101 -253q0 -118 -64.5 -228t-64.5 -167q0 -82 173.5 -224t173.5 -281q0 -167 -104.5 -252t-282.5 -85q-84 0 -172.5 20.5t-125.5 50.5l44 159q43 -28 108 -52t126 -24q108 0 159 47.5t51 125.5q0 84 -173.5 227.5 t-173.5 289.5q0 80 70.5 190.5t70.5 186.5q0 93 -51 147t-117 54q-104 0 -168 -83.5t-64 -235.5v-1082h-196z" />
+<glyph unicode="&#xe0;" horiz-adv-x="1126" d="M106 304q0 155 125.5 242.5t340.5 87.5h214v107q0 95 -58 150.5t-164 55.5q-95 0 -154.5 -48.5t-59.5 -116.5h-188l-2 6q-6 118 111.5 216t303.5 98q184 0 296 -93.5t112 -269.5v-521q0 -58 6 -112t22 -106h-203q-10 49 -15.5 86.5t-6.5 75.5q-55 -78 -143.5 -130.5 t-190.5 -52.5q-169 0 -257.5 86.5t-88.5 238.5zM230 1498l3 6h230l175 -266h-158zM303 300q0 -72 45 -114t133 -42q107 0 193 55t112 126v176h-221q-119 0 -190.5 -60t-71.5 -141z" />
+<glyph unicode="&#xe1;" horiz-adv-x="1126" d="M106 304q0 155 125.5 242.5t340.5 87.5h214v107q0 95 -58 150.5t-164 55.5q-95 0 -154.5 -48.5t-59.5 -116.5h-188l-2 6q-6 118 111.5 216t303.5 98q184 0 296 -93.5t112 -269.5v-521q0 -58 6 -112t22 -106h-203q-10 49 -15.5 86.5t-6.5 75.5q-55 -78 -143.5 -130.5 t-190.5 -52.5q-169 0 -257.5 86.5t-88.5 238.5zM303 300q0 -72 45 -114t133 -42q107 0 193 55t112 126v176h-221q-119 0 -190.5 -60t-71.5 -141zM465 1234l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="&#xe2;" horiz-adv-x="1126" d="M106 304q0 155 125.5 242.5t340.5 87.5h214v107q0 95 -58 150.5t-164 55.5q-95 0 -154.5 -48.5t-59.5 -116.5h-188l-2 6q-6 118 111.5 216t303.5 98q184 0 296 -93.5t112 -269.5v-521q0 -58 6 -112t22 -106h-203q-10 49 -15.5 86.5t-6.5 75.5q-55 -78 -143.5 -130.5 t-190.5 -52.5q-169 0 -257.5 86.5t-88.5 238.5zM249 1279v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160zM303 300q0 -72 45 -114t133 -42q107 0 193 55t112 126v176h-221q-119 0 -190.5 -60t-71.5 -141z" />
+<glyph unicode="&#xe3;" horiz-adv-x="1126" d="M106 304q0 155 125.5 242.5t340.5 87.5h214v107q0 95 -58 150.5t-164 55.5q-95 0 -154.5 -48.5t-59.5 -116.5h-188l-2 6q-6 118 111.5 216t303.5 98q184 0 296 -93.5t112 -269.5v-521q0 -58 6 -112t22 -106h-203q-10 49 -15.5 86.5t-6.5 75.5q-55 -78 -143.5 -130.5 t-190.5 -52.5q-169 0 -257.5 86.5t-88.5 238.5zM208 1306q0 93 59 161.5t150 68.5q56 0 140 -47t136 -47q41 0 71 32.5t30 79.5l108 -32q0 -94 -59.5 -159t-149.5 -65q-71 0 -148 46.5t-128 46.5q-43 0 -72 -32.5t-29 -78.5zM303 300q0 -72 45 -114t133 -42q107 0 193 55 t112 126v176h-221q-119 0 -190.5 -60t-71.5 -141z" />
+<glyph unicode="&#xe4;" horiz-adv-x="1126" d="M106 304q0 155 125.5 242.5t340.5 87.5h214v107q0 95 -58 150.5t-164 55.5q-95 0 -154.5 -48.5t-59.5 -116.5h-188l-2 6q-6 118 111.5 216t303.5 98q184 0 296 -93.5t112 -269.5v-521q0 -58 6 -112t22 -106h-203q-10 49 -15.5 86.5t-6.5 75.5q-55 -78 -143.5 -130.5 t-190.5 -52.5q-169 0 -257.5 86.5t-88.5 238.5zM211 1283v200h219v-200h-219zM303 300q0 -72 45 -114t133 -42q107 0 193 55t112 126v176h-221q-119 0 -190.5 -60t-71.5 -141zM681 1283v200h219v-200h-219z" />
+<glyph unicode="&#xe5;" horiz-adv-x="1126" d="M106 304q0 155 125.5 242.5t340.5 87.5h214v107q0 95 -58 150.5t-164 55.5q-95 0 -154.5 -48.5t-59.5 -116.5h-188l-2 6q-6 118 111.5 216t303.5 98q184 0 296 -93.5t112 -269.5v-521q0 -58 6 -112t22 -106h-203q-10 49 -15.5 86.5t-6.5 75.5q-55 -78 -143.5 -130.5 t-190.5 -52.5q-169 0 -257.5 86.5t-88.5 238.5zM303 300q0 -72 45 -114t133 -42q107 0 193 55t112 126v176h-221q-119 0 -190.5 -60t-71.5 -141zM346 1412q0 84 60.5 141t147.5 57q85 0 145 -56.5t60 -141.5q0 -86 -59.5 -140t-145.5 -54q-87 0 -147.5 54t-60.5 140z M449 1412q0 -43 31 -73.5t74 -30.5q42 0 72 29.5t30 74.5t-30 76t-72 31q-43 0 -74 -31t-31 -76z" />
+<glyph unicode="&#xe6;" horiz-adv-x="1729" d="M58 304q0 158 115 244.5t335 86.5h229v85q0 106 -51.5 166.5t-149.5 60.5q-103 0 -164 -55t-61 -133l-188 18l-2 6q-5 138 109.5 228.5t305.5 90.5q114 0 201.5 -40.5t137.5 -117.5q64 75 151.5 116.5t188.5 41.5q214 0 329.5 -130t115.5 -358v-119h-709l-2 -5 q1 -159 79.5 -258t233.5 -99q103 0 169.5 27.5t144.5 78.5l67 -138q-53 -44 -147 -83t-234 -39q-136 0 -240 48.5t-170 138.5q-56 -79 -167.5 -133t-271.5 -54q-170 0 -262.5 87t-92.5 238zM255 300q0 -74 50 -120.5t147 -46.5q76 0 159 43.5t126 100.5v216h-227 q-120 0 -187.5 -56t-67.5 -137zM953 645l2 -5h508v31q0 122 -60 199t-188 77q-113 0 -182 -84.5t-80 -217.5z" />
+<glyph unicode="&#xe7;" horiz-adv-x="1087" d="M97 520v42q0 231 125.5 385.5t360.5 154.5q190 0 310.5 -112t116.5 -275l-2 -6h-178q0 99 -70 168.5t-177 69.5q-155 0 -221.5 -111.5t-66.5 -273.5v-42q0 -166 66 -276.5t222 -110.5q98 0 172.5 60.5t74.5 148.5h177l2 -6q5 -140 -124.5 -248.5t-301.5 -108.5 q-236 0 -361 154t-125 387zM440 -334q72 0 116 24.5t44 73.5q0 48 -36 67t-123 26l32 135h140l-12 -52q65 -11 108 -52t43 -121q0 -96 -79 -153t-226 -57z" />
+<glyph unicode="&#xe8;" horiz-adv-x="1083" d="M99 520v44q0 231 137.5 384.5t325.5 153.5q219 0 331 -132t112 -352v-123h-702l-3 -5q3 -156 79 -256.5t213 -100.5q100 0 175.5 28.5t130.5 78.5l77 -128q-58 -57 -153 -95t-230 -38q-226 0 -359.5 150.5t-133.5 390.5zM233 1499l3 6h230l175 -266h-158zM307 654l2 -5 h499v26q0 116 -62 194t-184 78q-99 0 -169 -83.5t-86 -209.5z" />
+<glyph unicode="&#xe9;" horiz-adv-x="1083" d="M99 520v44q0 231 137.5 384.5t325.5 153.5q219 0 331 -132t112 -352v-123h-702l-3 -5q3 -156 79 -256.5t213 -100.5q100 0 175.5 28.5t130.5 78.5l77 -128q-58 -57 -153 -95t-230 -38q-226 0 -359.5 150.5t-133.5 390.5zM307 654l2 -5h499v26q0 116 -62 194t-184 78 q-99 0 -169 -83.5t-86 -209.5zM468 1235l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="&#xea;" horiz-adv-x="1083" d="M99 520v44q0 231 137.5 384.5t325.5 153.5q219 0 331 -132t112 -352v-123h-702l-3 -5q3 -156 79 -256.5t213 -100.5q100 0 175.5 28.5t130.5 78.5l77 -128q-58 -57 -153 -95t-230 -38q-226 0 -359.5 150.5t-133.5 390.5zM252 1280v26l246 237h120l248 -238v-25h-161 l-147 148l-146 -148h-160zM307 654l2 -5h499v26q0 116 -62 194t-184 78q-99 0 -169 -83.5t-86 -209.5z" />
+<glyph unicode="&#xeb;" horiz-adv-x="1083" d="M99 520v44q0 231 137.5 384.5t325.5 153.5q219 0 331 -132t112 -352v-123h-702l-3 -5q3 -156 79 -256.5t213 -100.5q100 0 175.5 28.5t130.5 78.5l77 -128q-58 -57 -153 -95t-230 -38q-226 0 -359.5 150.5t-133.5 390.5zM214 1284v200h219v-200h-219zM307 654l2 -5h499 v26q0 116 -62 194t-184 78q-99 0 -169 -83.5t-86 -209.5zM684 1284v200h219v-200h-219z" />
+<glyph unicode="&#xec;" horiz-adv-x="515" d="M-71 1477l3 6h230l175 -266h-158zM153 0v1082h197v-1082h-197z" />
+<glyph unicode="&#xed;" horiz-adv-x="515" d="M153 0v1082h197v-1082h-197zM162 1213l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="&#xee;" horiz-adv-x="515" d="M-52 1258v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160zM153 0v1082h197v-1082h-197z" />
+<glyph unicode="&#xef;" horiz-adv-x="515" d="M-90 1262v200h219v-200h-219zM153 0v1082h197v-1082h-197zM380 1262v200h219v-200h-219z" />
+<glyph unicode="&#xf0;" horiz-adv-x="1202" d="M72 466q0 228 138 370t351 142q90 0 169.5 -37t131.5 -97l4 5q-9 109 -51.5 197t-110.5 154l-290 -165l-77 102l256 146q-39 22 -80.5 39t-85.5 31l60 164q79 -19 151 -52t135 -79l218 125l77 -102l-195 -112q95 -104 147 -241.5t52 -300.5v-220q0 -245 -144 -400.5 t-359 -155.5q-218 0 -357.5 140t-139.5 347zM269 466q0 -132 82 -232.5t222 -100.5q133 0 217.5 114t84.5 288v148q-35 59 -115.5 99.5t-198.5 40.5q-131 0 -211.5 -104t-80.5 -253z" />
+<glyph unicode="&#xf1;" d="M143 0v1082h176l14 -161q54 86 135.5 133.5t185.5 47.5q175 0 271 -102.5t96 -316.5v-683h-197v679q0 143 -56.5 203t-172.5 60q-85 0 -150.5 -41t-104.5 -112v-789h-197zM231 1306q0 93 59 161.5t150 68.5q56 0 140 -47t136 -47q41 0 71 32.5t30 79.5l108 -32 q0 -94 -59.5 -159t-149.5 -65q-71 0 -148 46.5t-128 46.5q-43 0 -72 -32.5t-29 -78.5z" />
+<glyph unicode="&#xf2;" d="M97 529v22q0 240 130 395.5t353 155.5q225 0 355.5 -155t130.5 -396v-22q0 -242 -130 -396t-354 -154t-354.5 154.5t-130.5 395.5zM257 1498l3 6h230l175 -266h-158zM294 529q0 -172 72.5 -284t215.5 -112q141 0 214 112t73 284v22q0 170 -73.5 283t-215.5 113 q-141 0 -213.5 -113t-72.5 -283v-22z" />
+<glyph unicode="&#xf3;" d="M97 529v22q0 240 130 395.5t353 155.5q225 0 355.5 -155t130.5 -396v-22q0 -242 -130 -396t-354 -154t-354.5 154.5t-130.5 395.5zM294 529q0 -172 72.5 -284t215.5 -112q141 0 214 112t73 284v22q0 170 -73.5 283t-215.5 113q-141 0 -213.5 -113t-72.5 -283v-22z M492 1234l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="&#xf4;" d="M97 529v22q0 240 130 395.5t353 155.5q225 0 355.5 -155t130.5 -396v-22q0 -242 -130 -396t-354 -154t-354.5 154.5t-130.5 395.5zM276 1279v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160zM294 529q0 -172 72.5 -284t215.5 -112q141 0 214 112t73 284v22 q0 170 -73.5 283t-215.5 113q-141 0 -213.5 -113t-72.5 -283v-22z" />
+<glyph unicode="&#xf5;" d="M97 529v22q0 240 130 395.5t353 155.5q225 0 355.5 -155t130.5 -396v-22q0 -242 -130 -396t-354 -154t-354.5 154.5t-130.5 395.5zM235 1306q0 93 59 161.5t150 68.5q56 0 140 -47t136 -47q41 0 71 32.5t30 79.5l108 -32q0 -94 -59.5 -159t-149.5 -65q-71 0 -148 46.5 t-128 46.5q-43 0 -72 -32.5t-29 -78.5zM294 529q0 -172 72.5 -284t215.5 -112q141 0 214 112t73 284v22q0 170 -73.5 283t-215.5 113q-141 0 -213.5 -113t-72.5 -283v-22z" />
+<glyph unicode="&#xf6;" d="M97 529v22q0 240 130 395.5t353 155.5q225 0 355.5 -155t130.5 -396v-22q0 -242 -130 -396t-354 -154t-354.5 154.5t-130.5 395.5zM238 1283v200h219v-200h-219zM294 529q0 -172 72.5 -284t215.5 -112q141 0 214 112t73 284v22q0 170 -73.5 283t-215.5 113 q-141 0 -213.5 -113t-72.5 -283v-22zM708 1283v200h219v-200h-219z" />
+<glyph unicode="&#xf7;" horiz-adv-x="1170" d="M71 597v188h998v-188h-998zM472 180v203h198v-203h-198zM472 999v203h198v-203h-198z" />
+<glyph unicode="&#xf8;" d="M97 529v22q0 240 130 395.5t353 155.5q56 0 107.5 -11t97.5 -31l74 149h129l-104 -211q88 -74 135 -190t47 -257v-22q0 -242 -130 -396t-354 -154q-51 0 -97 8.5t-88 24.5l-72 -147h-129l100 204q-96 71 -147.5 191t-51.5 269zM294 529q0 -91 20 -166.5t61 -123.5h6 l332 674q-29 16 -62.5 25t-70.5 9q-141 0 -213.5 -113t-72.5 -283v-22zM469 156q24 -12 52 -17.5t61 -5.5q141 0 214 112t73 284v22q0 80 -17.5 150.5t-49.5 117.5h-6z" />
+<glyph unicode="&#xf9;" d="M139 444v638h197v-640q0 -173 51 -238t159 -65q105 0 173.5 42.5t103.5 120.5v780h197v-1082h-177l-13 160q-51 -87 -131 -134t-185 -47q-177 0 -276 113t-99 352zM255 1477l3 6h230l175 -266h-158z" />
+<glyph unicode="&#xfa;" d="M139 444v638h197v-640q0 -173 51 -238t159 -65q105 0 173.5 42.5t103.5 120.5v780h197v-1082h-177l-13 160q-51 -87 -131 -134t-185 -47q-177 0 -276 113t-99 352zM490 1213l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="&#xfb;" d="M139 444v638h197v-640q0 -173 51 -238t159 -65q105 0 173.5 42.5t103.5 120.5v780h197v-1082h-177l-13 160q-51 -87 -131 -134t-185 -47q-177 0 -276 113t-99 352zM274 1258v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="&#xfc;" d="M139 444v638h197v-640q0 -173 51 -238t159 -65q105 0 173.5 42.5t103.5 120.5v780h197v-1082h-177l-13 160q-51 -87 -131 -134t-185 -47q-177 0 -276 113t-99 352zM236 1262v200h219v-200h-219zM706 1262v200h219v-200h-219z" />
+<glyph unicode="&#xfd;" horiz-adv-x="1030" d="M26 1082h220l228 -681l35 -136h6l266 817h219l-455 -1248q-41 -109 -117.5 -190t-206.5 -81q-24 0 -61 5.5t-57 10.5l20 155q-6 1 35.5 -2t52.5 -3q63 0 103 56t67 124l47 113zM424 1213l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="&#xfe;" horiz-adv-x="1186" d="M153 -416v1976h197v-598q53 68 128 104t173 36q201 0 312.5 -159.5t111.5 -421.5v-21q0 -234 -112 -377.5t-309 -143.5q-100 0 -175.5 33.5t-128.5 100.5v-529h-197zM350 275q37 -67 97 -104.5t147 -37.5q140 0 212 102.5t72 264.5v21q0 184 -72.5 302.5t-213.5 118.5 q-85 0 -145 -38.5t-97 -105.5v-523z" />
+<glyph unicode="&#xff;" horiz-adv-x="1030" d="M26 1082h220l228 -681l35 -136h6l266 817h219l-455 -1248q-41 -109 -117.5 -190t-206.5 -81q-24 0 -61 5.5t-57 10.5l20 155q-6 1 35.5 -2t52.5 -3q63 0 103 56t67 124l47 113zM170 1262v200h219v-200h-219zM640 1262v200h219v-200h-219z" />
+<glyph unicode="&#x100;" horiz-adv-x="1326" d="M20 0l563 1456h169l554 -1456h-201l-136 375h-610l-138 -375h-201zM303 1640v146h721v-146h-721zM420 540h490l-240 663h-6z" />
+<glyph unicode="&#x101;" horiz-adv-x="1126" d="M106 304q0 155 125.5 242.5t340.5 87.5h214v107q0 95 -58 150.5t-164 55.5q-95 0 -154.5 -48.5t-59.5 -116.5h-188l-2 6q-6 118 111.5 216t303.5 98q184 0 296 -93.5t112 -269.5v-521q0 -58 6 -112t22 -106h-203q-10 49 -15.5 86.5t-6.5 75.5q-55 -78 -143.5 -130.5 t-190.5 -52.5q-169 0 -257.5 86.5t-88.5 238.5zM200 1318v146h721v-146h-721zM303 300q0 -72 45 -114t133 -42q107 0 193 55t112 126v176h-221q-119 0 -190.5 -60t-71.5 -141z" />
+<glyph unicode="&#x102;" horiz-adv-x="1326" d="M20 0l563 1456h169l554 -1456h-201l-136 375h-610l-138 -375h-201zM369 1864l2 6h151q0 -66 34 -107t108 -41q72 0 107 41.5t35 106.5h151l2 -6q4 -116 -77 -189t-218 -73q-138 0 -219 73t-76 189zM420 540h490l-240 663h-6z" />
+<glyph unicode="&#x103;" horiz-adv-x="1126" d="M106 304q0 155 125.5 242.5t340.5 87.5h214v107q0 95 -58 150.5t-164 55.5q-95 0 -154.5 -48.5t-59.5 -116.5h-188l-2 6q-6 118 111.5 216t303.5 98q184 0 296 -93.5t112 -269.5v-521q0 -58 6 -112t22 -106h-203q-10 49 -15.5 86.5t-6.5 75.5q-55 -78 -143.5 -130.5 t-190.5 -52.5q-169 0 -257.5 86.5t-88.5 238.5zM261 1542l2 6h151q0 -66 34 -107t108 -41q72 0 107 41.5t35 106.5h151l2 -6q4 -116 -77 -189t-218 -73q-138 0 -219 73t-76 189zM303 300q0 -72 45 -114t133 -42q107 0 193 55t112 126v176h-221q-119 0 -190.5 -60t-71.5 -141 z" />
+<glyph unicode="&#x104;" horiz-adv-x="1326" d="M20 0l563 1456h169l554 -1456h-201l-136 375h-610l-138 -375h-201zM420 540h490l-240 663h-6zM962 -223q0 80 60.5 152t187.5 128l72 -57q-70 -52 -109.5 -99.5t-39.5 -101.5q0 -42 22.5 -66t73.5 -24q27 0 50 7.5t49 18.5l33 -123q-36 -19 -79.5 -31.5t-103.5 -12.5 q-95 0 -155.5 55t-60.5 154z" />
+<glyph unicode="&#x105;" horiz-adv-x="1126" d="M106 304q0 155 125.5 242.5t340.5 87.5h214v107q0 95 -58 150.5t-164 55.5q-95 0 -154.5 -48.5t-59.5 -116.5h-188l-2 6q-6 118 111.5 216t303.5 98q184 0 296 -93.5t112 -269.5v-521q0 -58 6 -112t22 -106h-203q-10 49 -15.5 86.5t-6.5 75.5q-55 -78 -143.5 -130.5 t-190.5 -52.5q-169 0 -257.5 86.5t-88.5 238.5zM303 300q0 -72 45 -114t133 -42q107 0 193 55t112 126v176h-221q-119 0 -190.5 -60t-71.5 -141zM667 -223q0 80 60.5 152t187.5 128l72 -57q-70 -52 -109.5 -99.5t-39.5 -101.5q0 -42 22.5 -66t73.5 -24q27 0 50 7.5t49 18.5 l33 -123q-36 -19 -79.5 -31.5t-103.5 -12.5q-95 0 -155.5 55t-60.5 154z" />
+<glyph unicode="&#x106;" horiz-adv-x="1297" d="M118 598v259q0 269 155.5 444.5t402.5 175.5t393 -131.5t142 -348.5l-2 -6h-189q0 153 -90 242t-254 89q-165 0 -263 -133t-98 -330v-261q0 -199 98 -332t263 -133q164 0 254 88.5t90 244.5h189l2 -6q4 -205 -144 -343t-391 -138q-247 0 -402.5 175t-155.5 444zM588 1577 l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="&#x107;" horiz-adv-x="1087" d="M97 520v42q0 231 125.5 385.5t360.5 154.5q190 0 310.5 -112t116.5 -275l-2 -6h-178q0 99 -70 168.5t-177 69.5q-155 0 -221.5 -111.5t-66.5 -273.5v-42q0 -166 66 -276.5t222 -110.5q98 0 172.5 60.5t74.5 148.5h177l2 -6q5 -140 -124.5 -248.5t-301.5 -108.5 q-236 0 -361 154t-125 387zM447 1234l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="&#x108;" horiz-adv-x="1297" d="M118 598v259q0 269 155.5 444.5t402.5 175.5t393 -131.5t142 -348.5l-2 -6h-189q0 153 -90 242t-254 89q-165 0 -263 -133t-98 -330v-261q0 -199 98 -332t263 -133q164 0 254 88.5t90 244.5h189l2 -6q4 -205 -144 -343t-391 -138q-247 0 -402.5 175t-155.5 444zM372 1622 v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="&#x109;" horiz-adv-x="1087" d="M97 520v42q0 231 125.5 385.5t360.5 154.5q190 0 310.5 -112t116.5 -275l-2 -6h-178q0 99 -70 168.5t-177 69.5q-155 0 -221.5 -111.5t-66.5 -273.5v-42q0 -166 66 -276.5t222 -110.5q98 0 172.5 60.5t74.5 148.5h177l2 -6q5 -140 -124.5 -248.5t-301.5 -108.5 q-236 0 -361 154t-125 387zM231 1279v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="&#x10a;" horiz-adv-x="1297" d="M118 598v259q0 269 155.5 444.5t402.5 175.5t393 -131.5t142 -348.5l-2 -6h-189q0 153 -90 242t-254 89q-165 0 -263 -133t-98 -330v-261q0 -199 98 -332t263 -133q164 0 254 88.5t90 244.5h189l2 -6q4 -205 -144 -343t-391 -138q-247 0 -402.5 175t-155.5 444zM569 1625 v201h218v-201h-218z" />
+<glyph unicode="&#x10b;" horiz-adv-x="1087" d="M97 520v42q0 231 125.5 385.5t360.5 154.5q190 0 310.5 -112t116.5 -275l-2 -6h-178q0 99 -70 168.5t-177 69.5q-155 0 -221.5 -111.5t-66.5 -273.5v-42q0 -166 66 -276.5t222 -110.5q98 0 172.5 60.5t74.5 148.5h177l2 -6q5 -140 -124.5 -248.5t-301.5 -108.5 q-236 0 -361 154t-125 387zM428 1282v201h218v-201h-218z" />
+<glyph unicode="&#x10c;" horiz-adv-x="1297" d="M118 598v259q0 269 155.5 444.5t402.5 175.5t393 -131.5t142 -348.5l-2 -6h-189q0 153 -90 242t-254 89q-165 0 -263 -133t-98 -330v-261q0 -199 98 -332t263 -133q164 0 254 88.5t90 244.5h189l2 -6q4 -205 -144 -343t-391 -138q-247 0 -402.5 175t-155.5 444zM364 1866 v20h166l147 -148l147 148h170v-18l-257 -245h-119z" />
+<glyph unicode="&#x10d;" horiz-adv-x="1087" d="M97 520v42q0 231 125.5 385.5t360.5 154.5q190 0 310.5 -112t116.5 -275l-2 -6h-178q0 99 -70 168.5t-177 69.5q-155 0 -221.5 -111.5t-66.5 -273.5v-42q0 -166 66 -276.5t222 -110.5q98 0 172.5 60.5t74.5 148.5h177l2 -6q5 -140 -124.5 -248.5t-301.5 -108.5 q-236 0 -361 154t-125 387zM223 1523v20h166l147 -148l147 148h170v-18l-257 -245h-119z" />
+<glyph unicode="&#x10e;" horiz-adv-x="1349" d="M180 0v1456h447q286 0 459 -175.5t173 -453.5v-199q0 -279 -173 -453.5t-459 -174.5h-447zM306 1845v20h166l147 -148l147 148h170v-18l-257 -245h-119zM377 154h250q202 0 318.5 133t116.5 341v201q0 206 -116.5 339t-318.5 133h-250v-1147z" />
+<glyph unicode="&#x10f;" horiz-adv-x="1314" d="M98 500v21q0 261 111.5 421t312.5 160q95 0 168.5 -35t125.5 -102v595h197v-1560h-161l-23 133q-53 -76 -130 -115t-179 -39q-198 0 -310 143.5t-112 377.5zM295 500q0 -164 67 -262.5t208 -98.5q88 0 148 40t98 112v505q-38 67 -98.5 106.5t-145.5 39.5 q-142 0 -209.5 -117t-67.5 -304v-21zM1090 1183l61 246v131h158v-140l-122 -237h-97z" />
+<glyph unicode="&#x110;" horiz-adv-x="1379" d="M42 663v155h168v638h447q286 0 459 -175.5t173 -453.5v-199q0 -279 -173 -453.5t-459 -174.5h-447v663h-168zM407 154h250q202 0 318.5 133t116.5 341v201q0 206 -116.5 339t-318.5 133h-250v-483h276v-155h-276v-509z" />
+<glyph unicode="&#x111;" horiz-adv-x="1194" d="M98 500v21q0 261 111.5 421t312.5 160q95 0 168.5 -35t125.5 -102v266h-247v155h247v174h197v-174h197v-155h-197v-1231h-161l-23 133q-53 -76 -130 -115t-179 -39q-198 0 -310 143.5t-112 377.5zM295 500q0 -164 67 -262.5t208 -98.5q88 0 148 40t98 112v505 q-38 67 -98.5 106.5t-145.5 39.5q-142 0 -209.5 -117t-67.5 -304v-21z" />
+<glyph unicode="&#x112;" horiz-adv-x="1197" d="M180 0v1456h955v-155h-758v-471h667v-155h-667v-521h769v-154h-966zM273 1640v146h721v-146h-721z" />
+<glyph unicode="&#x113;" horiz-adv-x="1083" d="M99 520v44q0 231 137.5 384.5t325.5 153.5q219 0 331 -132t112 -352v-123h-702l-3 -5q3 -156 79 -256.5t213 -100.5q100 0 175.5 28.5t130.5 78.5l77 -128q-58 -57 -153 -95t-230 -38q-226 0 -359.5 150.5t-133.5 390.5zM203 1319v146h721v-146h-721zM307 654l2 -5h499 v26q0 116 -62 194t-184 78q-99 0 -169 -83.5t-86 -209.5z" />
+<glyph unicode="&#x114;" horiz-adv-x="1197" d="M180 0v1456h955v-155h-758v-471h667v-155h-667v-521h769v-154h-966zM334 1864l2 6h151q0 -66 34 -107t108 -41q72 0 107 41.5t35 106.5h151l2 -6q4 -116 -77 -189t-218 -73q-138 0 -219 73t-76 189z" />
+<glyph unicode="&#x115;" horiz-adv-x="1083" d="M99 520v44q0 231 137.5 384.5t325.5 153.5q219 0 331 -132t112 -352v-123h-702l-3 -5q3 -156 79 -256.5t213 -100.5q100 0 175.5 28.5t130.5 78.5l77 -128q-58 -57 -153 -95t-230 -38q-226 0 -359.5 150.5t-133.5 390.5zM264 1543l2 6h151q0 -66 34 -107t108 -41 q72 0 107 41.5t35 106.5h151l2 -6q4 -116 -77 -189t-218 -73q-138 0 -219 73t-76 189zM307 654l2 -5h499v26q0 116 -62 194t-184 78q-99 0 -169 -83.5t-86 -209.5z" />
+<glyph unicode="&#x116;" horiz-adv-x="1197" d="M180 0v1456h955v-155h-758v-471h667v-155h-667v-521h769v-154h-966zM519 1604v201h218v-201h-218z" />
+<glyph unicode="&#x117;" horiz-adv-x="1083" d="M99 520v44q0 231 137.5 384.5t325.5 153.5q219 0 331 -132t112 -352v-123h-702l-3 -5q3 -156 79 -256.5t213 -100.5q100 0 175.5 28.5t130.5 78.5l77 -128q-58 -57 -153 -95t-230 -38q-226 0 -359.5 150.5t-133.5 390.5zM307 654l2 -5h499v26q0 116 -62 194t-184 78 q-99 0 -169 -83.5t-86 -209.5zM449 1283v201h218v-201h-218z" />
+<glyph unicode="&#x118;" horiz-adv-x="1197" d="M180 0v1456h955v-155h-758v-471h667v-155h-667v-521h769v-154h-966zM399 -223q0 80 60.5 152t187.5 128l72 -57q-70 -52 -109.5 -99.5t-39.5 -101.5q0 -42 22.5 -66t73.5 -24q27 0 50 7.5t49 18.5l33 -123q-36 -19 -79.5 -31.5t-103.5 -12.5q-95 0 -155.5 55t-60.5 154z " />
+<glyph unicode="&#x119;" horiz-adv-x="1083" d="M99 520v44q0 231 137.5 384.5t325.5 153.5q219 0 331 -132t112 -352v-123h-702l-3 -5q3 -156 79 -256.5t213 -100.5q100 0 175.5 28.5t130.5 78.5l77 -128q-58 -57 -153 -95t-230 -38q-226 0 -359.5 150.5t-133.5 390.5zM307 654l2 -5h499v26q0 116 -62 194t-184 78 q-99 0 -169 -83.5t-86 -209.5zM560 -161q0 80 60.5 152t187.5 128l72 -57q-70 -52 -109.5 -99.5t-39.5 -101.5q0 -42 22.5 -66t73.5 -24q27 0 50 7.5t49 18.5l33 -123q-36 -19 -79.5 -31.5t-103.5 -12.5q-95 0 -155.5 55t-60.5 154z" />
+<glyph unicode="&#x11a;" horiz-adv-x="1197" d="M180 0v1456h955v-155h-758v-471h667v-155h-667v-521h769v-154h-966zM314 1845v20h166l147 -148l147 148h170v-18l-257 -245h-119z" />
+<glyph unicode="&#x11b;" horiz-adv-x="1083" d="M99 520v44q0 231 137.5 384.5t325.5 153.5q219 0 331 -132t112 -352v-123h-702l-3 -5q3 -156 79 -256.5t213 -100.5q100 0 175.5 28.5t130.5 78.5l77 -128q-58 -57 -153 -95t-230 -38q-226 0 -359.5 150.5t-133.5 390.5zM244 1524v20h166l147 -148l147 148h170v-18 l-257 -245h-119zM307 654l2 -5h499v26q0 116 -62 194t-184 78q-99 0 -169 -83.5t-86 -209.5z" />
+<glyph unicode="&#x11c;" horiz-adv-x="1396" d="M120 578v300q0 265 159 432t410 167q250 0 393 -123t146 -317l-2 -6h-188q-9 127 -96.5 209t-252.5 82q-167 0 -269 -125t-102 -317v-302q0 -194 114 -319.5t290 -125.5q124 0 203 33t113 75v331h-319v155h516v-534q-52 -80 -180.5 -147t-332.5 -67q-261 0 -431.5 167 t-170.5 432zM362 1622v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="&#x11d;" d="M100 500v21q0 261 114 421t315 160q103 0 181 -41.5t130 -119.5l24 141h157v-1088q0 -208 -121 -319.5t-349 -111.5q-78 0 -168.5 21.5t-159.5 58.5l50 153q53 -30 128 -48.5t148 -18.5q144 0 209.5 65.5t65.5 199.5v122q-53 -68 -127 -102.5t-170 -34.5q-199 0 -313 144 t-114 377zM258 1279v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160zM297 500q0 -163 69 -262t210 -99q89 0 149 40.5t99 114.5v498q-38 69 -99 109.5t-147 40.5q-141 0 -211 -118t-70 -303v-21z" />
+<glyph unicode="&#x11e;" horiz-adv-x="1396" d="M120 578v300q0 265 159 432t410 167q250 0 393 -123t146 -317l-2 -6h-188q-9 127 -96.5 209t-252.5 82q-167 0 -269 -125t-102 -317v-302q0 -194 114 -319.5t290 -125.5q124 0 203 33t113 75v331h-319v155h516v-534q-52 -80 -180.5 -147t-332.5 -67q-261 0 -431.5 167 t-170.5 432zM374 1885l2 6h151q0 -66 34 -107t108 -41q72 0 107 41.5t35 106.5h151l2 -6q4 -116 -77 -189t-218 -73q-138 0 -219 73t-76 189z" />
+<glyph unicode="&#x11f;" d="M100 500v21q0 261 114 421t315 160q103 0 181 -41.5t130 -119.5l24 141h157v-1088q0 -208 -121 -319.5t-349 -111.5q-78 0 -168.5 21.5t-159.5 58.5l50 153q53 -30 128 -48.5t148 -18.5q144 0 209.5 65.5t65.5 199.5v122q-53 -68 -127 -102.5t-170 -34.5q-199 0 -313 144 t-114 377zM270 1542l2 6h151q0 -66 34 -107t108 -41q72 0 107 41.5t35 106.5h151l2 -6q4 -116 -77 -189t-218 -73q-138 0 -219 73t-76 189zM297 500q0 -163 69 -262t210 -99q89 0 149 40.5t99 114.5v498q-38 69 -99 109.5t-147 40.5q-141 0 -211 -118t-70 -303v-21z" />
+<glyph unicode="&#x120;" horiz-adv-x="1396" d="M120 578v300q0 265 159 432t410 167q250 0 393 -123t146 -317l-2 -6h-188q-9 127 -96.5 209t-252.5 82q-167 0 -269 -125t-102 -317v-302q0 -194 114 -319.5t290 -125.5q124 0 203 33t113 75v331h-319v155h516v-534q-52 -80 -180.5 -147t-332.5 -67q-261 0 -431.5 167 t-170.5 432zM559 1625v201h218v-201h-218z" />
+<glyph unicode="&#x121;" d="M100 500v21q0 261 114 421t315 160q103 0 181 -41.5t130 -119.5l24 141h157v-1088q0 -208 -121 -319.5t-349 -111.5q-78 0 -168.5 21.5t-159.5 58.5l50 153q53 -30 128 -48.5t148 -18.5q144 0 209.5 65.5t65.5 199.5v122q-53 -68 -127 -102.5t-170 -34.5q-199 0 -313 144 t-114 377zM297 500q0 -163 69 -262t210 -99q89 0 149 40.5t99 114.5v498q-38 69 -99 109.5t-147 40.5q-141 0 -211 -118t-70 -303v-21zM455 1282v201h218v-201h-218z" />
+<glyph unicode="&#x122;" horiz-adv-x="1396" d="M120 578v300q0 265 159 432t410 167q250 0 393 -123t146 -317l-2 -6h-188q-9 127 -96.5 209t-252.5 82q-167 0 -269 -125t-102 -317v-302q0 -194 114 -319.5t290 -125.5q124 0 203 33t113 75v331h-319v155h516v-534q-52 -80 -180.5 -147t-332.5 -67q-261 0 -431.5 167 t-170.5 432zM521 -494l61 246v131h158v-140l-122 -237h-97z" />
+<glyph unicode="&#x123;" d="M100 500v21q0 261 114 421t315 160q103 0 181 -41.5t130 -119.5l24 141h157v-1088q0 -208 -121 -319.5t-349 -111.5q-78 0 -168.5 21.5t-159.5 58.5l50 153q53 -30 128 -48.5t148 -18.5q144 0 209.5 65.5t65.5 199.5v122q-53 -68 -127 -102.5t-170 -34.5q-199 0 -313 144 t-114 377zM297 500q0 -163 69 -262t210 -99q89 0 149 40.5t99 114.5v498q-38 69 -99 109.5t-147 40.5q-141 0 -211 -118t-70 -303v-21zM459 1253v148l121 247h97l-21 -257v-138h-197z" />
+<glyph unicode="&#x124;" horiz-adv-x="1461" d="M180 0v1456h197v-658h707v658h197v-1456h-197v643h-707v-643h-197zM415 1601v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="&#x125;" d="M143 0v1560h197v-623q56 78 137.5 121.5t180.5 43.5q173 0 269.5 -104t96.5 -320v-678h-197v680q0 134 -57.5 198t-171.5 64q-82 0 -148.5 -38.5t-109.5 -104.5v-799h-197zM203 1600v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="&#x126;" horiz-adv-x="1439" d="M31 1024v145h147v287h197v-287h707v287h197v-287h144v-145h-144v-1024h-197v643h-707v-643h-197v1024h-147zM375 798h707v226h-707v-226z" />
+<glyph unicode="&#x127;" horiz-adv-x="1194" d="M1 1231v155h172v174h197v-174h272v-155h-272v-294q56 78 137.5 121.5t180.5 43.5q173 0 269.5 -104t96.5 -320v-678h-197v680q0 134 -57.5 198t-171.5 64q-82 0 -148.5 -38.5t-109.5 -104.5v-799h-197v1231h-172z" />
+<glyph unicode="&#x128;" horiz-adv-x="579" d="M-56 1628q0 93 59 161.5t150 68.5q56 0 140 -47t136 -47q41 0 71 32.5t30 79.5l108 -32q0 -94 -59.5 -159t-149.5 -65q-71 0 -148 46.5t-128 46.5q-43 0 -72 -32.5t-29 -78.5zM190 0v1456h198v-1456h-198z" />
+<glyph unicode="&#x129;" horiz-adv-x="515" d="M-93 1285q0 93 59 161.5t150 68.5q56 0 140 -47t136 -47q41 0 71 32.5t30 79.5l108 -32q0 -94 -59.5 -159t-149.5 -65q-71 0 -148 46.5t-128 46.5q-43 0 -72 -32.5t-29 -78.5zM153 0v1082h197v-1082h-197z" />
+<glyph unicode="&#x12a;" horiz-adv-x="579" d="M-64 1640v146h721v-146h-721zM190 0v1456h198v-1456h-198z" />
+<glyph unicode="&#x12b;" horiz-adv-x="515" d="M-101 1299v146h721v-146h-721zM153 0v1082h197v-1082h-197z" />
+<glyph unicode="&#x12c;" horiz-adv-x="579" d="M-3 1864l2 6h151q0 -66 34 -107t108 -41q72 0 107 41.5t35 106.5h151l2 -6q4 -116 -77 -189t-218 -73q-138 0 -219 73t-76 189zM190 0v1456h198v-1456h-198z" />
+<glyph unicode="&#x12d;" horiz-adv-x="515" d="M-40 1521l2 6h151q0 -66 34 -107t108 -41q72 0 107 41.5t35 106.5h151l2 -6q4 -116 -77 -189t-218 -73q-138 0 -219 73t-76 189zM153 0v1082h197v-1082h-197z" />
+<glyph unicode="&#x12e;" horiz-adv-x="579" d="M46 -223q0 80 60.5 152t187.5 128l72 -57q-70 -52 -109.5 -99.5t-39.5 -101.5q0 -42 22.5 -66t73.5 -24q27 0 50 7.5t49 18.5l33 -123q-36 -19 -79.5 -31.5t-103.5 -12.5q-95 0 -155.5 55t-60.5 154zM190 0v1456h198v-1456h-198z" />
+<glyph unicode="&#x12f;" horiz-adv-x="516" d="M14 -223q0 80 60.5 152t187.5 128l72 -57q-70 -52 -109.5 -99.5t-39.5 -101.5q0 -42 22.5 -66t73.5 -24q27 0 50 7.5t49 18.5l33 -123q-36 -19 -79.5 -31.5t-103.5 -12.5q-95 0 -155.5 55t-60.5 154zM159 0v1082h197v-1082h-197zM159 1359v201h197v-201h-197z" />
+<glyph unicode="&#x130;" horiz-adv-x="579" d="M180 1604v201h218v-201h-218zM190 0v1456h198v-1456h-198z" />
+<glyph unicode="&#x131;" horiz-adv-x="515" d="M153 0v1082h197v-1082h-197z" />
+<glyph unicode="&#x132;" horiz-adv-x="1709" d="M190 0v1456h198v-1456h-198zM645 395l2 6h189q0 -135 68.5 -201.5t193.5 -66.5q109 0 178 73.5t69 196.5v1053h197v-1053q0 -195 -123.5 -309.5t-320.5 -114.5q-210 0 -334 106.5t-119 309.5z" />
+<glyph unicode="&#x133;" horiz-adv-x="1046" d="M159 0v1082h197v-1082h-197zM159 1359v201h197v-201h-197zM450 -419l14 155q14 -5 40 -8.5t43 -3.5q65 0 103.5 44t38.5 143v1171h197v-1171q0 -167 -86 -257.5t-239 -90.5q-31 0 -56.5 4.5t-54.5 13.5zM683 1363v197h197v-197h-197z" />
+<glyph unicode="&#x134;" horiz-adv-x="1130" d="M66 395l2 6h189q0 -135 68.5 -201.5t193.5 -66.5q109 0 178 73.5t69 196.5v1053h197v-1053q0 -195 -123.5 -309.5t-320.5 -114.5q-210 0 -334 106.5t-119 309.5zM550 1589v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="&#x135;" horiz-adv-x="523" d="M-68 -419l14 150q14 -5 46.5 -9t50.5 -4q59 0 93.5 51.5t34.5 141.5v1171h197v-1171q0 -167 -86 -257.5t-239 -90.5q-31 0 -56.5 4.5t-54.5 13.5zM-34 1240v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="&#x136;" horiz-adv-x="1317" d="M180 0v1456h197v-644h152l521 644h218l3 -5l-565 -699l606 -747l-3 -5h-235l-527 657h-170v-657h-197zM487 -477l61 246v131h158v-140l-122 -237h-97z" />
+<glyph unicode="&#x137;" horiz-adv-x="1050" d="M144 0v1560h197v-904h126l296 426h236l-370 -492l423 -590h-232l-351 499h-128v-499h-197zM388 -475l61 246v131h158v-140l-122 -237h-97z" />
+<glyph unicode="&#x138;" horiz-adv-x="1144" d="M153 0v1082h197v-457h84l388 457h231l2 -5l-450 -514l483 -558l-2 -5h-241l-394 459h-101v-459h-197z" />
+<glyph unicode="&#x139;" horiz-adv-x="1106" d="M180 0v1456h197v-1302h689v-154h-886zM186 1556l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="&#x13a;" horiz-adv-x="516" d="M159 0v1560h197v-1560h-197zM168 1594l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="&#x13b;" horiz-adv-x="1106" d="M180 0v1456h197v-1302h689v-154h-886zM480 -475l61 246v131h158v-140l-122 -237h-97z" />
+<glyph unicode="&#x13c;" horiz-adv-x="516" d="M110 -475l61 246v131h158v-140l-122 -237h-97zM159 0v1560h197v-1560h-197z" />
+<glyph unicode="&#x13d;" horiz-adv-x="1106" d="M180 0v1456h197v-1302h689v-154h-886zM583 1080l61 246v131h158v-140l-122 -237h-97z" />
+<glyph unicode="&#x13e;" horiz-adv-x="666" d="M159 0v1560h197v-1560h-197zM453 1183l61 246v131h158v-140l-122 -237h-97z" />
+<glyph unicode="&#x13f;" horiz-adv-x="1106" d="M180 0v1456h197v-1302h689v-154h-886zM613 688v201h218v-201h-218z" />
+<glyph unicode="&#x140;" horiz-adv-x="736" d="M159 0v1560h197v-1560h-197zM485 671v201h218v-201h-218z" />
+<glyph unicode="&#x141;" horiz-adv-x="1077" d="M40 576v166l123 39v675h197v-613l269 86v-166l-269 -86v-523h689v-154h-886v615z" />
+<glyph unicode="&#x142;" horiz-adv-x="558" d="M37 578v165l142 54v763h197v-688l150 58v-165l-150 -58v-707h-197v632z" />
+<glyph unicode="&#x143;" horiz-adv-x="1461" d="M180 0v1456h197l701 -1124l6 2v1122h197v-1456h-197l-701 1126l-6 -2v-1124h-197zM638 1556l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="&#x144;" d="M143 0v1082h176l14 -161q54 86 135.5 133.5t185.5 47.5q175 0 271 -102.5t96 -316.5v-683h-197v679q0 143 -56.5 203t-172.5 60q-85 0 -150.5 -41t-104.5 -112v-789h-197zM488 1234l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="&#x145;" horiz-adv-x="1461" d="M180 0v1456h197l701 -1124l6 2v1122h197v-1456h-197l-701 1126l-6 -2v-1124h-197zM580 -475l61 246v131h158v-140l-122 -237h-97z" />
+<glyph unicode="&#x146;" d="M143 0v1082h176l14 -161q54 86 135.5 133.5t185.5 47.5q175 0 271 -102.5t96 -316.5v-683h-197v679q0 143 -56.5 203t-172.5 60q-85 0 -150.5 -41t-104.5 -112v-789h-197zM430 -475l61 246v131h158v-140l-122 -237h-97z" />
+<glyph unicode="&#x147;" horiz-adv-x="1461" d="M180 0v1456h197l701 -1124l6 2v1122h197v-1456h-197l-701 1126l-6 -2v-1124h-197zM414 1845v20h166l147 -148l147 148h170v-18l-257 -245h-119z" />
+<glyph unicode="&#x148;" d="M143 0v1082h176l14 -161q54 86 135.5 133.5t185.5 47.5q175 0 271 -102.5t96 -316.5v-683h-197v679q0 143 -56.5 203t-172.5 60q-85 0 -150.5 -41t-104.5 -112v-789h-197zM264 1523v20h166l147 -148l147 148h170v-18l-257 -245h-119z" />
+<glyph unicode="&#x149;" d="M-32 1183l61 246v131h158v-140l-122 -237h-97zM143 0v1082h176l14 -161q54 86 135.5 133.5t185.5 47.5q175 0 271 -102.5t96 -316.5v-683h-197v679q0 143 -56.5 203t-172.5 60q-85 0 -150.5 -41t-104.5 -112v-789h-197z" />
+<glyph unicode="&#x14a;" horiz-adv-x="1416" d="M161 0v1456h197l701 -1112l6 2v1110h197v-1545q0 -167 -86 -257.5t-240 -90.5q-31 0 -57 4.5t-55 13.5l14 150q13 -5 47 -9t51 -4q60 0 94.5 51.5t34.5 141.5v89l-701 1112l-6 -2v-1110h-197z" />
+<glyph unicode="&#x14b;" d="M143 0v1082h176l13 -150q54 81 134 125.5t181 44.5q174 0 270 -102.5t96 -316.5v-772q0 -167 -86 -257.5t-240 -90.5q-31 0 -57.5 4.5t-54.5 13.5l14 160q13 -5 46.5 -8.5t51.5 -3.5q61 0 95 47t34 135v768q0 143 -57 203t-173 60q-85 0 -146.5 -33t-99.5 -92v-817h-197z " />
+<glyph unicode="&#x14c;" horiz-adv-x="1396" d="M113 598v259q0 266 159.5 443t414.5 177q264 0 429.5 -176.5t165.5 -443.5v-259q0 -267 -165.5 -443t-429.5 -176q-255 0 -414.5 176t-159.5 443zM310 598q0 -202 102.5 -330t274.5 -128q183 0 290.5 127.5t107.5 330.5v261q0 200 -108 328t-290 128q-172 0 -274.5 -128 t-102.5 -328v-261zM343 1661v146h721v-146h-721z" />
+<glyph unicode="&#x14d;" d="M97 529v22q0 240 130 395.5t353 155.5q225 0 355.5 -155t130.5 -396v-22q0 -242 -130 -396t-354 -154t-354.5 154.5t-130.5 395.5zM227 1318v146h721v-146h-721zM294 529q0 -172 72.5 -284t215.5 -112q141 0 214 112t73 284v22q0 170 -73.5 283t-215.5 113 q-141 0 -213.5 -113t-72.5 -283v-22z" />
+<glyph unicode="&#x14e;" horiz-adv-x="1396" d="M113 598v259q0 266 159.5 443t414.5 177q264 0 429.5 -176.5t165.5 -443.5v-259q0 -267 -165.5 -443t-429.5 -176q-255 0 -414.5 176t-159.5 443zM310 598q0 -202 102.5 -330t274.5 -128q183 0 290.5 127.5t107.5 330.5v261q0 200 -108 328t-290 128q-172 0 -274.5 -128 t-102.5 -328v-261zM404 1885l2 6h151q0 -66 34 -107t108 -41q72 0 107 41.5t35 106.5h151l2 -6q4 -116 -77 -189t-218 -73q-138 0 -219 73t-76 189z" />
+<glyph unicode="&#x14f;" d="M97 529v22q0 240 130 395.5t353 155.5q225 0 355.5 -155t130.5 -396v-22q0 -242 -130 -396t-354 -154t-354.5 154.5t-130.5 395.5zM288 1542l2 6h151q0 -66 34 -107t108 -41q72 0 107 41.5t35 106.5h151l2 -6q4 -116 -77 -189t-218 -73q-138 0 -219 73t-76 189zM294 529 q0 -172 72.5 -284t215.5 -112q141 0 214 112t73 284v22q0 170 -73.5 283t-215.5 113q-141 0 -213.5 -113t-72.5 -283v-22z" />
+<glyph unicode="&#x150;" horiz-adv-x="1396" d="M113 598v259q0 266 159.5 443t414.5 177q264 0 429.5 -176.5t165.5 -443.5v-259q0 -267 -165.5 -443t-429.5 -176q-255 0 -414.5 176t-159.5 443zM310 598q0 -202 102.5 -330t274.5 -128q183 0 290.5 127.5t107.5 330.5v261q0 200 -108 328t-290 128q-172 0 -274.5 -128 t-102.5 -328v-261zM462 1622l184 266h211l2 -5l-240 -261h-157zM731 1627l241 261h229l3 -6l-300 -260h-171z" />
+<glyph unicode="&#x151;" d="M97 529v22q0 240 130 395.5t353 155.5q225 0 355.5 -155t130.5 -396v-22q0 -242 -130 -396t-354 -154t-354.5 154.5t-130.5 395.5zM294 529q0 -172 72.5 -284t215.5 -112q141 0 214 112t73 284v22q0 170 -73.5 283t-215.5 113q-141 0 -213.5 -113t-72.5 -283v-22z M346 1279l184 266h211l2 -5l-240 -261h-157zM615 1284l241 261h229l3 -6l-300 -260h-171z" />
+<glyph unicode="&#x152;" horiz-adv-x="1960" d="M104 576v304q0 265 154.5 431t403.5 166q69 0 140.5 -6t150.5 -15h907v-155h-758v-471h667v-155h-667v-521h769v-154h-918q-92 -10 -157 -15.5t-132 -5.5q-249 0 -404.5 166t-155.5 431zM301 576q0 -214 97 -328t266 -114q61 0 122 4.5t119 13.5v1151q-61 8 -122 13.5 t-121 5.5q-169 0 -265 -113.5t-96 -326.5v-306z" />
+<glyph unicode="&#x153;" horiz-adv-x="1854" d="M97 529v22q0 240 130 395.5t353 155.5q130 0 230 -54.5t164 -152.5q65 97 161.5 152t204.5 55q219 0 331 -132t112 -352v-123h-702l-3 -5q3 -156 79 -256.5t213 -100.5q100 0 175.5 28.5t130.5 78.5l77 -128q-58 -57 -153 -95t-230 -38q-131 0 -232.5 52.5t-166.5 148.5 q-64 -96 -163 -148.5t-226 -52.5q-224 0 -354.5 154.5t-130.5 395.5zM294 529q0 -172 72.5 -284t215.5 -112q141 0 214 112t73 284v22q0 170 -73.5 283t-215.5 113q-141 0 -213.5 -113t-72.5 -283v-22zM1085 654l2 -5h499v26q0 116 -62 194t-184 78q-99 0 -169 -83.5 t-86 -209.5z" />
+<glyph unicode="&#x154;" horiz-adv-x="1357" d="M180 0v1455h527q239 0 365 -106t126 -308q0 -112 -58.5 -195t-170.5 -132q120 -39 172.5 -126.5t52.5 -216.5v-137q0 -68 15 -122t52 -88v-24h-203q-39 34 -50 100t-11 136v133q0 118 -69 190t-185 72h-366v-631h-197zM377 786h310q167 0 240.5 63.5t73.5 193.5 q0 123 -71.5 190.5t-222.5 67.5h-330v-515zM530 1556l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="&#x155;" horiz-adv-x="702" d="M143 0v1082h176l19 -158q46 84 113.5 131t155.5 47q22 0 42 -3.5t33 -7.5l-27 -183l-101 6q-78 0 -131.5 -37t-82.5 -104v-773h-197zM323 1234l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="&#x156;" horiz-adv-x="1357" d="M180 0v1455h527q239 0 365 -106t126 -308q0 -112 -58.5 -195t-170.5 -132q120 -39 172.5 -126.5t52.5 -216.5v-137q0 -68 15 -122t52 -88v-24h-203q-39 34 -50 100t-11 136v133q0 118 -69 190t-185 72h-366v-631h-197zM377 786h310q167 0 240.5 63.5t73.5 193.5 q0 123 -71.5 190.5t-222.5 67.5h-330v-515zM472 -475l61 246v131h158v-140l-122 -237h-97z" />
+<glyph unicode="&#x157;" horiz-adv-x="702" d="M107 -475l61 246v131h158v-140l-122 -237h-97zM143 0v1082h176l19 -158q46 84 113.5 131t155.5 47q22 0 42 -3.5t33 -7.5l-27 -183l-101 6q-78 0 -131.5 -37t-82.5 -104v-773h-197z" />
+<glyph unicode="&#x158;" horiz-adv-x="1357" d="M180 0v1455h527q239 0 365 -106t126 -308q0 -112 -58.5 -195t-170.5 -132q120 -39 172.5 -126.5t52.5 -216.5v-137q0 -68 15 -122t52 -88v-24h-203q-39 34 -50 100t-11 136v133q0 118 -69 190t-185 72h-366v-631h-197zM306 1845v20h166l147 -148l147 148h170v-18 l-257 -245h-119zM377 786h310q167 0 240.5 63.5t73.5 193.5q0 123 -71.5 190.5t-222.5 67.5h-330v-515z" />
+<glyph unicode="&#x159;" horiz-adv-x="702" d="M101 1523v20h166l147 -148l147 148h170v-18l-257 -245h-119zM143 0v1082h176l19 -158q46 84 113.5 131t155.5 47q22 0 42 -3.5t33 -7.5l-27 -183l-101 6q-78 0 -131.5 -37t-82.5 -104v-773h-197z" />
+<glyph unicode="&#x15a;" horiz-adv-x="1277" d="M102 413l2 6h188q0 -140 103 -213t255 -73q149 0 236 63t87 171q0 100 -75 167.5t-266 113.5q-231 55 -360.5 162t-129.5 269q0 170 139.5 284t361.5 114q239 0 380.5 -131t136.5 -304l-2 -6h-188q0 128 -84.5 207t-242.5 79q-147 0 -225.5 -66.5t-78.5 -173.5 q0 -95 85 -158.5t276 -111.5q230 -57 350 -168t120 -275q0 -176 -144 -283t-376 -107q-218 0 -385.5 118t-162.5 316zM523 1577l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="&#x15b;" horiz-adv-x="1071" d="M109 329l2 6h188q5 -105 78 -153.5t171 -48.5q105 0 164.5 42.5t59.5 111.5q0 65 -49.5 107t-187.5 73q-197 43 -296.5 116.5t-99.5 200.5q0 132 112 225t292 93q189 0 300.5 -97t106.5 -236l-2 -6h-188q0 71 -59.5 127.5t-157.5 56.5q-105 0 -156 -46t-51 -111 q0 -64 45 -101t183 -66q205 -44 305 -119.5t100 -202.5q0 -144 -116.5 -233t-304.5 -89q-207 0 -326 105t-113 245zM445 1234l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="&#x15c;" horiz-adv-x="1277" d="M102 413l2 6h188q0 -140 103 -213t255 -73q149 0 236 63t87 171q0 100 -75 167.5t-266 113.5q-231 55 -360.5 162t-129.5 269q0 170 139.5 284t361.5 114q239 0 380.5 -131t136.5 -304l-2 -6h-188q0 128 -84.5 207t-242.5 79q-147 0 -225.5 -66.5t-78.5 -173.5 q0 -95 85 -158.5t276 -111.5q230 -57 350 -168t120 -275q0 -176 -144 -283t-376 -107q-218 0 -385.5 118t-162.5 316zM307 1622v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="&#x15d;" horiz-adv-x="1071" d="M109 329l2 6h188q5 -105 78 -153.5t171 -48.5q105 0 164.5 42.5t59.5 111.5q0 65 -49.5 107t-187.5 73q-197 43 -296.5 116.5t-99.5 200.5q0 132 112 225t292 93q189 0 300.5 -97t106.5 -236l-2 -6h-188q0 71 -59.5 127.5t-157.5 56.5q-105 0 -156 -46t-51 -111 q0 -64 45 -101t183 -66q205 -44 305 -119.5t100 -202.5q0 -144 -116.5 -233t-304.5 -89q-207 0 -326 105t-113 245zM229 1279v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="&#x15e;" horiz-adv-x="1277" d="M102 413l2 6h188q0 -140 103 -213t255 -73q149 0 236 63t87 171q0 100 -75 167.5t-266 113.5q-231 55 -360.5 162t-129.5 269q0 170 139.5 284t361.5 114q239 0 380.5 -131t136.5 -304l-2 -6h-188q0 128 -84.5 207t-242.5 79q-147 0 -225.5 -66.5t-78.5 -173.5 q0 -95 85 -158.5t276 -111.5q230 -57 350 -168t120 -275q0 -176 -144 -283t-376 -107q-218 0 -385.5 118t-162.5 316zM516 -334q72 0 116 24.5t44 73.5q0 48 -36 67t-123 26l32 135h140l-12 -52q65 -11 108 -52t43 -121q0 -96 -79 -153t-226 -57z" />
+<glyph unicode="&#x15f;" horiz-adv-x="1071" d="M109 329l2 6h188q5 -105 78 -153.5t171 -48.5q105 0 164.5 42.5t59.5 111.5q0 65 -49.5 107t-187.5 73q-197 43 -296.5 116.5t-99.5 200.5q0 132 112 225t292 93q189 0 300.5 -97t106.5 -236l-2 -6h-188q0 71 -59.5 127.5t-157.5 56.5q-105 0 -156 -46t-51 -111 q0 -64 45 -101t183 -66q205 -44 305 -119.5t100 -202.5q0 -144 -116.5 -233t-304.5 -89q-207 0 -326 105t-113 245zM438 -333q72 0 116 24.5t44 73.5q0 48 -36 67t-123 26l32 135h140l-12 -52q65 -11 108 -52t43 -121q0 -96 -79 -153t-226 -57z" />
+<glyph unicode="&#x160;" horiz-adv-x="1277" d="M102 413l2 6h188q0 -140 103 -213t255 -73q149 0 236 63t87 171q0 100 -75 167.5t-266 113.5q-231 55 -360.5 162t-129.5 269q0 170 139.5 284t361.5 114q239 0 380.5 -131t136.5 -304l-2 -6h-188q0 128 -84.5 207t-242.5 79q-147 0 -225.5 -66.5t-78.5 -173.5 q0 -95 85 -158.5t276 -111.5q230 -57 350 -168t120 -275q0 -176 -144 -283t-376 -107q-218 0 -385.5 118t-162.5 316zM299 1866v20h166l147 -148l147 148h170v-18l-257 -245h-119z" />
+<glyph unicode="&#x161;" horiz-adv-x="1071" d="M109 329l2 6h188q5 -105 78 -153.5t171 -48.5q105 0 164.5 42.5t59.5 111.5q0 65 -49.5 107t-187.5 73q-197 43 -296.5 116.5t-99.5 200.5q0 132 112 225t292 93q189 0 300.5 -97t106.5 -236l-2 -6h-188q0 71 -59.5 127.5t-157.5 56.5q-105 0 -156 -46t-51 -111 q0 -64 45 -101t183 -66q205 -44 305 -119.5t100 -202.5q0 -144 -116.5 -233t-304.5 -89q-207 0 -326 105t-113 245zM221 1523v20h166l147 -148l147 148h170v-18l-257 -245h-119z" />
+<glyph unicode="&#x162;" horiz-adv-x="1200" d="M34 1301v155h1132v-155h-468v-1301h-197v1301h-467zM455 -475l61 246v131h158v-140l-122 -237h-97z" />
+<glyph unicode="&#x163;" horiz-adv-x="708" d="M34 936v146h172v261h197v-261h205v-146h-205v-657q0 -76 31.5 -107t83.5 -31q17 0 37.5 4t36.5 10l26 -135q-22 -18 -64.5 -29.5t-85.5 -11.5q-120 0 -191 72.5t-71 227.5v657h-172zM308 -485l61 246v131h158v-140l-122 -237h-97z" />
+<glyph unicode="&#x164;" horiz-adv-x="1200" d="M34 1301v155h1132v-155h-468v-1301h-197v1301h-467zM289 1844v20h166l147 -148l147 148h170v-18l-257 -245h-119z" />
+<glyph unicode="&#x165;" horiz-adv-x="748" d="M34 936v146h172v261h197v-261h205v-146h-205v-657q0 -76 31.5 -107t83.5 -31q17 0 37.5 4t36.5 10l26 -135q-22 -18 -64.5 -29.5t-85.5 -11.5q-120 0 -191 72.5t-71 227.5v657h-172zM545 1210l61 246v131h158v-140l-122 -237h-97z" />
+<glyph unicode="&#x166;" horiz-adv-x="1200" d="M34 1301v155h1132v-155h-468v-326h220v-155h-220v-820h-197v820h-224v155h224v326h-467z" />
+<glyph unicode="&#x167;" horiz-adv-x="708" d="M-8 600v155h214v181h-172v146h172v261h197v-261h205v-146h-205v-181h230v-155h-230v-321q0 -76 31.5 -107t83.5 -31q17 0 37.5 4t36.5 10l26 -135q-22 -18 -64.5 -29.5t-85.5 -11.5q-120 0 -191 72.5t-71 227.5v321h-214z" />
+<glyph unicode="&#x168;" horiz-adv-x="1386" d="M147 469v987h197v-987q0 -165 94 -250.5t248 -85.5q162 0 261.5 85.5t99.5 250.5v987h197v-987q0 -238 -154.5 -364t-403.5 -126q-240 0 -389.5 126.5t-149.5 363.5zM350 1628q0 93 59 161.5t150 68.5q56 0 140 -47t136 -47q41 0 71 32.5t30 79.5l108 -32 q0 -94 -59.5 -159t-149.5 -65q-71 0 -148 46.5t-128 46.5q-43 0 -72 -32.5t-29 -78.5z" />
+<glyph unicode="&#x169;" d="M139 444v638h197v-640q0 -173 51 -238t159 -65q105 0 173.5 42.5t103.5 120.5v780h197v-1082h-177l-13 160q-51 -87 -131 -134t-185 -47q-177 0 -276 113t-99 352zM233 1285q0 93 59 161.5t150 68.5q56 0 140 -47t136 -47q41 0 71 32.5t30 79.5l108 -32q0 -94 -59.5 -159 t-149.5 -65q-71 0 -148 46.5t-128 46.5q-43 0 -72 -32.5t-29 -78.5z" />
+<glyph unicode="&#x16a;" horiz-adv-x="1386" d="M147 469v987h197v-987q0 -165 94 -250.5t248 -85.5q162 0 261.5 85.5t99.5 250.5v987h197v-987q0 -238 -154.5 -364t-403.5 -126q-240 0 -389.5 126.5t-149.5 363.5zM342 1640v146h721v-146h-721z" />
+<glyph unicode="&#x16b;" d="M139 444v638h197v-640q0 -173 51 -238t159 -65q105 0 173.5 42.5t103.5 120.5v780h197v-1082h-177l-13 160q-51 -87 -131 -134t-185 -47q-177 0 -276 113t-99 352zM225 1299v146h721v-146h-721z" />
+<glyph unicode="&#x16c;" horiz-adv-x="1386" d="M147 469v987h197v-987q0 -165 94 -250.5t248 -85.5q162 0 261.5 85.5t99.5 250.5v987h197v-987q0 -238 -154.5 -364t-403.5 -126q-240 0 -389.5 126.5t-149.5 363.5zM403 1864l2 6h151q0 -66 34 -107t108 -41q72 0 107 41.5t35 106.5h151l2 -6q4 -116 -77 -189t-218 -73 q-138 0 -219 73t-76 189z" />
+<glyph unicode="&#x16d;" d="M139 444v638h197v-640q0 -173 51 -238t159 -65q105 0 173.5 42.5t103.5 120.5v780h197v-1082h-177l-13 160q-51 -87 -131 -134t-185 -47q-177 0 -276 113t-99 352zM286 1521l2 6h151q0 -66 34 -107t108 -41q72 0 107 41.5t35 106.5h151l2 -6q4 -116 -77 -189t-218 -73 q-138 0 -219 73t-76 189z" />
+<glyph unicode="&#x16e;" horiz-adv-x="1386" d="M147 469v987h197v-987q0 -165 94 -250.5t248 -85.5q162 0 261.5 85.5t99.5 250.5v987h197v-987q0 -238 -154.5 -364t-403.5 -126q-240 0 -389.5 126.5t-149.5 363.5zM488 1734q0 84 60.5 141t147.5 57q85 0 145 -56.5t60 -141.5q0 -86 -59.5 -140t-145.5 -54 q-87 0 -147.5 54t-60.5 140zM591 1734q0 -43 31 -73.5t74 -30.5q42 0 72 29.5t30 74.5t-30 76t-72 31q-43 0 -74 -31t-31 -76z" />
+<glyph unicode="&#x16f;" d="M139 444v638h197v-640q0 -173 51 -238t159 -65q105 0 173.5 42.5t103.5 120.5v780h197v-1082h-177l-13 160q-51 -87 -131 -134t-185 -47q-177 0 -276 113t-99 352zM371 1391q0 84 60.5 141t147.5 57q85 0 145 -56.5t60 -141.5q0 -86 -59.5 -140t-145.5 -54 q-87 0 -147.5 54t-60.5 140zM474 1391q0 -43 31 -73.5t74 -30.5q42 0 72 29.5t30 74.5t-30 76t-72 31q-43 0 -74 -31t-31 -76z" />
+<glyph unicode="&#x170;" horiz-adv-x="1386" d="M147 469v987h197v-987q0 -165 94 -250.5t248 -85.5q162 0 261.5 85.5t99.5 250.5v987h197v-987q0 -238 -154.5 -364t-403.5 -126q-240 0 -389.5 126.5t-149.5 363.5zM461 1601l184 266h211l2 -5l-240 -261h-157zM730 1606l241 261h229l3 -6l-300 -260h-171z" />
+<glyph unicode="&#x171;" d="M139 444v638h197v-640q0 -173 51 -238t159 -65q105 0 173.5 42.5t103.5 120.5v780h197v-1082h-177l-13 160q-51 -87 -131 -134t-185 -47q-177 0 -276 113t-99 352zM344 1258l184 266h211l2 -5l-240 -261h-157zM613 1263l241 261h229l3 -6l-300 -260h-171z" />
+<glyph unicode="&#x172;" horiz-adv-x="1386" d="M147 469v987h197v-987q0 -165 94 -250.5t248 -85.5q162 0 261.5 85.5t99.5 250.5v987h197v-987q0 -238 -154.5 -364t-403.5 -126q-240 0 -389.5 126.5t-149.5 363.5zM493 -223q0 80 60.5 152t187.5 128l72 -57q-70 -52 -109.5 -99.5t-39.5 -101.5q0 -42 22.5 -66 t73.5 -24q27 0 50 7.5t49 18.5l33 -123q-36 -19 -79.5 -31.5t-103.5 -12.5q-95 0 -155.5 55t-60.5 154z" />
+<glyph unicode="&#x173;" d="M139 444v638h197v-640q0 -173 51 -238t159 -65q105 0 173.5 42.5t103.5 120.5v780h197v-1082h-177l-13 160q-51 -87 -131 -134t-185 -47q-177 0 -276 113t-99 352zM675 -223q0 80 60.5 152t187.5 128l72 -57q-70 -52 -109.5 -99.5t-39.5 -101.5q0 -42 22.5 -66t73.5 -24 q27 0 50 7.5t49 18.5l33 -123q-36 -19 -79.5 -31.5t-103.5 -12.5q-95 0 -155.5 55t-60.5 154z" />
+<glyph unicode="&#x174;" horiz-adv-x="1809" d="M54 1456h196l222 -952l27 -182l6 -1l39 183l267 952h174l269 -952l40 -187h6l29 187l217 952h197l-351 -1456h-176l-287 1010l-26 131h-6l-25 -131l-292 -1010h-176zM592 1601v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="&#x175;" horiz-adv-x="1550" d="M45 1082h196l179 -688l23 -131h6l28 131l216 688h158l217 -688l31 -146h6l29 146l170 688h196l-314 -1082h-159l-209 659l-45 184l-6 -1l-43 -183l-206 -659h-159zM467 1258v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="&#x176;" horiz-adv-x="1250" d="M20 1456h225l380 -740l380 740h225l-511 -944v-512h-196v525zM319 1600v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="&#x177;" horiz-adv-x="1030" d="M26 1082h220l228 -681l35 -136h6l266 817h219l-455 -1248q-41 -109 -117.5 -190t-206.5 -81q-24 0 -61 5.5t-57 10.5l20 155q-6 1 35.5 -2t52.5 -3q63 0 103 56t67 124l47 113zM208 1258v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="&#x178;" horiz-adv-x="1250" d="M20 1456h225l380 -740l380 740h225l-511 -944v-512h-196v525zM281 1604v200h219v-200h-219zM751 1604v200h219v-200h-219z" />
+<glyph unicode="&#x179;" horiz-adv-x="1225" d="M97 0v146l778 1155h-767v155h992v-141l-781 -1161h814v-154h-1036zM519 1556l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="&#x17a;" horiz-adv-x="1030" d="M94 0v138l585 788h-578v156h819v-134l-591 -794h625v-154h-860zM434 1213l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="&#x17b;" horiz-adv-x="1225" d="M97 0v146l778 1155h-767v155h992v-141l-781 -1161h814v-154h-1036zM500 1604v201h218v-201h-218z" />
+<glyph unicode="&#x17c;" horiz-adv-x="1030" d="M94 0v138l585 788h-578v156h819v-134l-591 -794h625v-154h-860zM415 1261v201h218v-201h-218z" />
+<glyph unicode="&#x17d;" horiz-adv-x="1225" d="M97 0v146l778 1155h-767v155h992v-141l-781 -1161h814v-154h-1036zM295 1845v20h166l147 -148l147 148h170v-18l-257 -245h-119z" />
+<glyph unicode="&#x17e;" horiz-adv-x="1030" d="M94 0v138l585 788h-578v156h819v-134l-591 -794h625v-154h-860zM210 1502v20h166l147 -148l147 148h170v-18l-257 -245h-119z" />
+<glyph unicode="&#x17f;" horiz-adv-x="516" d="M159 0v1219q0 173 91 267.5t253 94.5q33 0 67.5 -5.5t76.5 -15.5l-24 -145q-20 5 -42 8t-47 3q-87 0 -132.5 -54.5t-45.5 -152.5v-1219h-197z" />
+<glyph unicode="&#x192;" horiz-adv-x="702" d="M-23 -419l14 150q12 -5 45.5 -9t51.5 -4q60 0 94 51.5t34 141.5v1025h-169v146h169v137q0 173 90.5 267.5t252.5 94.5q34 0 68.5 -5.5t76.5 -15.5l-24 -150q-18 4 -43.5 7t-52.5 3q-87 0 -129 -51.5t-42 -149.5v-137h196v-146h-196v-1025q0 -167 -85.5 -257.5 t-239.5 -90.5q-32 0 -58 4.5t-53 13.5z" />
+<glyph unicode="&#x1a0;" horiz-adv-x="1403" d="M108 598v259q0 266 159.5 443t414.5 177q120 0 223 -40t182 -113q123 11 187 96.5t64 232.5h197q0 -192 -88 -313.5t-250 -157.5q38 -71 59 -154t21 -171v-259q0 -267 -165.5 -443t-429.5 -176q-255 0 -414.5 176t-159.5 443zM305 598q0 -202 102.5 -330t274.5 -128 q183 0 290.5 127.5t107.5 330.5v261q0 200 -108 328t-290 128q-172 0 -274.5 -128t-102.5 -328v-261z" />
+<glyph unicode="&#x1a1;" horiz-adv-x="1175" d="M97 529v22q0 240 130 395.5t353 155.5q102 0 187 -35t149 -98q82 18 122 84t40 170h178q0 -143 -66.5 -237t-195.5 -126q35 -66 53.5 -144.5t18.5 -164.5v-22q0 -242 -130 -396t-354 -154t-354.5 154.5t-130.5 395.5zM294 529q0 -172 72.5 -284t215.5 -112q141 0 214 112 t73 284v22q0 170 -73.5 283t-215.5 113q-141 0 -213.5 -113t-72.5 -283v-22z" />
+<glyph unicode="&#x1af;" horiz-adv-x="1430" d="M147 469v987h197v-987q0 -165 94 -250.5t248 -85.5q162 0 261.5 85.5t99.5 250.5v987h197v-178l6 -2q86 27 132 108.5t46 206.5h190l3 -5q2 -193 -96 -314.5t-281 -155.5v-647q0 -238 -154.5 -364t-403.5 -126q-240 0 -389.5 126.5t-149.5 363.5z" />
+<glyph unicode="&#x1b0;" horiz-adv-x="1204" d="M139 444v638h197v-640q0 -173 51 -238t159 -65q105 0 173.5 42.5t103.5 120.5v780h197v-114l6 -2q100 7 142.5 71t42.5 190h169l3 -6q3 -177 -85.5 -273t-277.5 -110v-838h-177l-13 160q-51 -87 -131 -134t-185 -47q-177 0 -276 113t-99 352z" />
+<glyph unicode="&#x1f0;" horiz-adv-x="523" d="M-68 -419l14 150q14 -5 46.5 -9t50.5 -4q59 0 93.5 51.5t34.5 141.5v1171h197v-1171q0 -167 -86 -257.5t-239 -90.5q-31 0 -56.5 4.5t-54.5 13.5zM-42 1484v20h166l147 -148l147 148h170v-18l-257 -245h-119z" />
+<glyph unicode="&#x1fa;" horiz-adv-x="1326" d="M20 0l563 1456h169l554 -1456h-201l-136 375h-610l-138 -375h-201zM420 540h490l-240 663h-6zM487 1684q0 72 51 119.5t124 47.5q70 0 120 -47.5t50 -119.5t-49.5 -118t-120.5 -46q-73 0 -124 46t-51 118zM575 1684q0 -35 25.5 -59.5t61.5 -24.5q34 0 58.5 24t24.5 60 q0 37 -24.5 62.5t-58.5 25.5q-36 0 -61.5 -25.5t-25.5 -62.5zM615 1900l144 185h199l2 -6l-216 -179h-129z" />
+<glyph unicode="&#x1fb;" horiz-adv-x="1126" d="M106 304q0 155 125.5 242.5t340.5 87.5h214v107q0 95 -58 150.5t-164 55.5q-95 0 -154.5 -48.5t-59.5 -116.5h-188l-2 6q-6 118 111.5 216t303.5 98q184 0 296 -93.5t112 -269.5v-521q0 -58 6 -112t22 -106h-203q-10 49 -15.5 86.5t-6.5 75.5q-55 -78 -143.5 -130.5 t-190.5 -52.5q-169 0 -257.5 86.5t-88.5 238.5zM303 300q0 -72 45 -114t133 -42q107 0 193 55t112 126v176h-221q-119 0 -190.5 -60t-71.5 -141zM383 1362q0 72 51 119.5t124 47.5q70 0 120 -47.5t50 -119.5t-49.5 -118t-120.5 -46q-73 0 -124 46t-51 118zM471 1362 q0 -35 25.5 -59.5t61.5 -24.5q34 0 58.5 24t24.5 60q0 37 -24.5 62.5t-58.5 25.5q-36 0 -61.5 -25.5t-25.5 -62.5zM511 1578l144 185h199l2 -6l-216 -179h-129z" />
+<glyph unicode="&#x1fc;" horiz-adv-x="1922" d="M-20 0l880 1456h967v-155h-691l20 -466h590v-155h-584l22 -526h705v-154h-895l-15 350h-557l-202 -350h-240zM525 529h447l-31 710l-5 2zM845 1556l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="&#x1fd;" horiz-adv-x="1729" d="M58 304q0 158 115 244.5t335 86.5h229v85q0 106 -51.5 166.5t-149.5 60.5q-103 0 -164 -55t-61 -133l-188 18l-2 6q-5 138 109.5 228.5t305.5 90.5q114 0 201.5 -40.5t137.5 -117.5q64 75 151.5 116.5t188.5 41.5q214 0 329.5 -130t115.5 -358v-119h-709l-2 -5 q1 -159 79.5 -258t233.5 -99q103 0 169.5 27.5t144.5 78.5l67 -138q-53 -44 -147 -83t-234 -39q-136 0 -240 48.5t-170 138.5q-56 -79 -167.5 -133t-271.5 -54q-170 0 -262

<TRUNCATED>

[07/21] ambari git commit: AMBARI-21313 Log Search UI: implement service for string constants. (ababiichuk)

Posted by ab...@apache.org.
AMBARI-21313 Log Search UI: implement service for string constants. (ababiichuk)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/72c7400d
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/72c7400d
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/72c7400d

Branch: refs/heads/branch-feature-logsearch-ui
Commit: 72c7400dcfed179524eed0a19747bb409130aaa8
Parents: 607c918
Author: ababiichuk <ab...@hortonworks.com>
Authored: Thu Jun 22 15:23:30 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jun 22 15:23:30 2017 +0300

----------------------------------------------------------------------
 .../ambari-logsearch-web-new/package.json       |  8 +++++---
 .../src/app/app.component.html                  |  4 +---
 .../src/app/app.component.ts                    |  7 ++++---
 .../src/app/app.module.ts                       | 21 +++++++++++++++++---
 .../app/login-form/login-form.component.html    | 12 +++++------
 .../src/assets/i18n/en.json                     |  8 ++++++++
 6 files changed, 42 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/72c7400d/ambari-logsearch/ambari-logsearch-web-new/package.json
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/package.json b/ambari-logsearch/ambari-logsearch-web-new/package.json
index feccace..bda2556 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/package.json
+++ b/ambari-logsearch/ambari-logsearch-web-new/package.json
@@ -19,13 +19,15 @@
     "@angular/platform-browser": "^4.0.0",
     "@angular/platform-browser-dynamic": "^4.0.0",
     "@angular/router": "^4.0.0",
+    "@ngx-translate/core": "^6.0.1",
+    "@ngx-translate/http-loader": "^0.0.3",
     "bootstrap": "^3.3.7",
     "core-js": "^2.4.1",
+    "font-awesome": "^4.7.0",
+    "jquery": "^1.12.4",
     "ngx-bootstrap": "^1.6.6",
     "rxjs": "^5.1.0",
-    "zone.js": "^0.8.4",
-    "jquery": "^1.12.4",
-    "font-awesome": "^4.7.0"
+    "zone.js": "^0.8.4"
   },
   "devDependencies": {
     "@angular/cli": "1.0.0",

http://git-wip-us.apache.org/repos/asf/ambari/blob/72c7400d/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html
index 3ba591e..8d9f6d0 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html
@@ -15,7 +15,5 @@
   limitations under the License.
 -->
 
-<h1>
-  {{title}}
-</h1>
+<h1>{{'common.title' | translate}}</h1>
 <login-form *ngIf="!httpClient.isAuthorized"></login-form>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/72c7400d/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts
index 6f88af0..79cdc5d 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts
@@ -17,6 +17,7 @@
  */
 
 import {Component} from '@angular/core';
+import {TranslateService} from '@ngx-translate/core';
 import {HttpClientService} from './http-client.service';
 
 @Component({
@@ -27,12 +28,12 @@ import {HttpClientService} from './http-client.service';
 
 export class AppComponent {
 
-  constructor(private httpClient: HttpClientService) {
+  constructor(private httpClient: HttpClientService, private translate: TranslateService) {
+    translate.setDefaultLang('en');
+    translate.use('en');
   }
 
   ngOnInit() {
     this.httpClient.get('status');
   }
-
-  title = 'Ambari Log Search';
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/72c7400d/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
index 39dc46f..2d132e2 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
@@ -19,15 +19,21 @@
 import {BrowserModule} from '@angular/platform-browser';
 import {NgModule, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
 import {FormsModule} from '@angular/forms';
-import {HttpModule} from '@angular/http';
+import {HttpModule, Http} from '@angular/http';
 import {InMemoryWebApiModule} from 'angular-in-memory-web-api';
 import {mockApiDataService} from './mock-api-data.service'
 import {AlertModule} from 'ngx-bootstrap';
+import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
+import {TranslateHttpLoader} from '@ngx-translate/http-loader';
 import {HttpClientService} from './http-client.service';
 
 import {AppComponent} from './app.component';
 import {LoginFormComponent} from './login-form/login-form.component';
 
+export function HttpLoaderFactory(http: Http) {
+  return new TranslateHttpLoader(http, 'assets/i18n/', '.json');
+}
+
 @NgModule({
   declarations: [
     AppComponent,
@@ -37,8 +43,17 @@ import {LoginFormComponent} from './login-form/login-form.component';
     BrowserModule,
     FormsModule,
     HttpModule,
-    InMemoryWebApiModule.forRoot(mockApiDataService),
-    AlertModule.forRoot()
+    InMemoryWebApiModule.forRoot(mockApiDataService, {
+      passThruUnknownUrl: true
+    }),
+    AlertModule.forRoot(),
+    TranslateModule.forRoot({
+      loader: {
+        provide: TranslateLoader,
+        useFactory: HttpLoaderFactory,
+        deps: [Http]
+      }
+    })
   ],
   providers: [HttpClientService],
   bootstrap: [AppComponent],

http://git-wip-us.apache.org/repos/asf/ambari/blob/72c7400d/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.html
index 1cad6b3..4b7951a 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.html
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.html
@@ -16,18 +16,18 @@
 -->
 
 <div class="well col-md-4 col-md-offset-4 col-sm-offset-4">
-  <div class="alert alert-danger" *ngIf="isLoginAlertDisplayed">
-    <strong>Error!</strong> Invalid User credentials.<br>Please try again.
-  </div>
+  <div class="alert alert-danger" *ngIf="isLoginAlertDisplayed" [innerHTML]="'authorization.error' | translate"></div>
   <form #loginForm="ngForm" (ngSubmit)="login()">
     <div class="form-group">
-      <label for="username">Username</label>
+      <label for="username">{{'authorization.name' | translate}}</label>
       <input class="form-control" type="text" id="username" name="username" required [(ngModel)]="username">
     </div>
     <div class="form-group">
-      <label for="password">Password</label>
+      <label for="password">{{'authorization.password' | translate}}</label>
       <input class="form-control" type="password" id="password" name="password" required [(ngModel)]="password">
     </div>
-    <button class="btn btn-success" [disabled]="!loginForm.form.valid || isRequestInProgress">Sign In</button>
+    <button class="btn btn-success" [disabled]="!loginForm.form.valid || isRequestInProgress">
+      {{'authorization.signIn' | translate}}
+    </button>
   </form>
 </div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/72c7400d/ambari-logsearch/ambari-logsearch-web-new/src/assets/i18n/en.json
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/assets/i18n/en.json b/ambari-logsearch/ambari-logsearch-web-new/src/assets/i18n/en.json
new file mode 100644
index 0000000..13c3805
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/assets/i18n/en.json
@@ -0,0 +1,8 @@
+{
+  "common.title": "Ambari Log Search",
+
+  "authorization.name": "Username",
+  "authorization.password": "Password",
+  "authorization.signIn": "Sign In",
+  "authorization.error": "<strong>Error!</strong> Invalid User credentials.<br>Please try again."
+}
\ No newline at end of file


[12/21] ambari git commit: AMBARI-21315 Log Search UI: provide data storage functionality with mock data. (ababiichuk)

Posted by ab...@apache.org.
AMBARI-21315 Log Search UI: provide data storage functionality with mock data. (ababiichuk)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/603297ae
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/603297ae
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/603297ae

Branch: refs/heads/branch-feature-logsearch-ui
Commit: 603297ae862b633b5e562fe73860674cab2cfe94
Parents: 84a59d7
Author: ababiichuk <ab...@hortonworks.com>
Authored: Wed May 31 19:54:05 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jun 22 15:35:04 2017 +0300

----------------------------------------------------------------------
 .../ambari-logsearch-web-new/package.json       |   4 +-
 .../src/app/app.module.ts                       |  38 +-
 .../src/app/login-form/login-form.component.ts  |   2 +-
 .../menu-button/menu-button.component.spec.ts   |   4 +-
 .../app/menu-button/menu-button.component.ts    |   4 +-
 .../src/app/models/audit-log.model.ts           |  46 ++
 .../src/app/models/bar-graph.model.ts           |  24 +
 .../src/app/models/common-entry.model.ts        |  22 +
 .../src/app/models/count.model.ts               |  22 +
 .../src/app/models/filter.model.ts              |  25 +
 .../src/app/models/graph.model.ts               |  23 +
 .../src/app/models/log.model.ts                 |  37 +
 .../src/app/models/node.model.ts                |  29 +
 .../src/app/models/service-log.model.ts         |  27 +
 .../app/models/solr-collection-state.model.ts   |  23 +
 .../src/app/models/store.model.ts               |  95 +++
 .../src/app/models/user-config.model.ts         |  26 +
 .../src/app/services/actions.service.spec.ts    |  33 -
 .../src/app/services/actions.service.ts         |  47 --
 .../services/component-actions.service.spec.ts  |  33 +
 .../app/services/component-actions.service.ts   |  47 ++
 .../src/app/services/mock-api-data.service.ts   | 741 ++++++++++++++++++-
 .../app/services/storage/audit-logs.service.ts  |  34 +
 .../app/services/storage/bar-graphs.service.ts  |  34 +
 .../src/app/services/storage/filters.service.ts |  34 +
 .../src/app/services/storage/graphs.service.ts  |  34 +
 .../src/app/services/storage/nodes.service.ts   |  34 +
 .../services/storage/service-logs.service.ts    |  34 +
 .../services/storage/user-configs.service.ts    |  34 +
 .../src/tsconfig.app.json                       |   2 +-
 .../ambari-logsearch-web-new/tsconfig.json      |   5 +
 31 files changed, 1502 insertions(+), 95 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/package.json
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/package.json b/ambari-logsearch/ambari-logsearch-web-new/package.json
index bda2556..0994703 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/package.json
+++ b/ambari-logsearch/ambari-logsearch-web-new/package.json
@@ -19,6 +19,8 @@
     "@angular/platform-browser": "^4.0.0",
     "@angular/platform-browser-dynamic": "^4.0.0",
     "@angular/router": "^4.0.0",
+    "@ngrx/core": "^1.2.0",
+    "@ngrx/store": "^2.2.2",
     "@ngx-translate/core": "^6.0.1",
     "@ngx-translate/http-loader": "^0.0.3",
     "bootstrap": "^3.3.7",
@@ -41,9 +43,9 @@
     "karma": "~1.4.1",
     "karma-chrome-launcher": "~2.0.0",
     "karma-cli": "~1.0.1",
+    "karma-coverage-istanbul-reporter": "^0.2.0",
     "karma-jasmine": "~1.1.0",
     "karma-jasmine-html-reporter": "^0.2.2",
-    "karma-coverage-istanbul-reporter": "^0.2.0",
     "protractor": "~5.1.0",
     "ts-node": "~2.0.0",
     "tslint": "~4.5.0",

http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
index e8dee1b..f4ee972 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
@@ -25,13 +25,21 @@ import {mockApiDataService} from './services/mock-api-data.service'
 import {AlertModule} from 'ngx-bootstrap';
 import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
 import {TranslateHttpLoader} from '@ngx-translate/http-loader';
-import {HttpClientService} from './services/http-client.service';
-import {ActionsService} from './services/actions.service';
+import {StoreModule} from '@ngrx/store';
+import {HttpClientService} from '@app/services/http-client.service';
+import {ComponentActionsService} from '@app/services/component-actions.service';
+import {AuditLogsService, auditLogs} from '@app/services/storage/audit-logs.service';
+import {ServiceLogsService, serviceLogs} from '@app/services/storage/service-logs.service';
+import {BarGraphsService, barGraphs} from '@app/services/storage/bar-graphs.service';
+import {GraphsService, graphs} from '@app/services/storage/graphs.service';
+import {NodesService, nodes} from '@app/services/storage/nodes.service';
+import {UserConfigsService, userConfigs} from '@app/services/storage/user-configs.service';
+import {FiltersService, filters} from '@app/services/storage/filters.service';
 
-import {AppComponent} from './app.component';
-import {LoginFormComponent} from './login-form/login-form.component';
-import {TopMenuComponent} from './top-menu/top-menu.component';
-import {MenuButtonComponent} from './menu-button/menu-button.component';
+import {AppComponent} from '@app/app.component';
+import {LoginFormComponent} from '@app/login-form/login-form.component';
+import {TopMenuComponent} from '@app/top-menu/top-menu.component';
+import {MenuButtonComponent} from '@app/menu-button/menu-button.component';
 
 export function HttpLoaderFactory(http: Http) {
   return new TranslateHttpLoader(http, 'assets/i18n/', '.json');
@@ -58,11 +66,27 @@ export function HttpLoaderFactory(http: Http) {
         useFactory: HttpLoaderFactory,
         deps: [Http]
       }
+    }),
+    StoreModule.provideStore({
+      auditLogs,
+      serviceLogs,
+      barGraphs,
+      graphs,
+      nodes,
+      userConfigs,
+      filters
     })
   ],
   providers: [
     HttpClientService,
-    ActionsService
+    ComponentActionsService,
+    AuditLogsService,
+    ServiceLogsService,
+    BarGraphsService,
+    GraphsService,
+    NodesService,
+    UserConfigsService,
+    FiltersService
   ],
   bootstrap: [AppComponent],
   schemas: [CUSTOM_ELEMENTS_SCHEMA]

http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.ts
index bffa412..400e65b 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.ts
@@ -18,7 +18,7 @@
 
 import {Component, OnInit} from '@angular/core';
 import 'rxjs/add/operator/finally';
-import {HttpClientService} from '../services/http-client.service';
+import {HttpClientService} from '@app/services/http-client.service';
 
 @Component({
   selector: 'login-form',

http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts
index 62afe07..5419b36 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts
@@ -20,7 +20,7 @@ import {async, ComponentFixture, TestBed} from '@angular/core/testing';
 import {Http} from '@angular/http';
 import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
 import {TranslateHttpLoader} from '@ngx-translate/http-loader';
-import {ActionsService} from '../services/actions.service';
+import {ComponentActionsService} from '@app/services/component-actions.service';
 
 import {MenuButtonComponent} from './menu-button.component';
 
@@ -41,7 +41,7 @@ describe('MenuButtonComponent', () => {
         useFactory: HttpLoaderFactory,
         deps: [Http]
       })],
-      providers: [ActionsService]
+      providers: [ComponentActionsService]
     })
     .compileComponents();
   }));

http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
index 2af5a44..716d3ae 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
@@ -17,7 +17,7 @@
  */
 
 import {Component, AfterViewInit, Input, ViewChild, ElementRef} from '@angular/core';
-import {ActionsService} from '../services/actions.service';
+import {ComponentActionsService} from '@app/services/component-actions.service';
 
 @Component({
   selector: 'menu-button',
@@ -26,7 +26,7 @@ import {ActionsService} from '../services/actions.service';
 })
 export class MenuButtonComponent implements AfterViewInit {
 
-  constructor(private actions: ActionsService) {
+  constructor(private actions: ComponentActionsService) {
   }
 
   ngAfterViewInit() {

http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/models/audit-log.model.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/models/audit-log.model.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/audit-log.model.ts
new file mode 100644
index 0000000..ef8fe14
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/audit-log.model.ts
@@ -0,0 +1,46 @@
+/**
+ * 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.
+ */
+
+import {Log} from '@app/models/log.model';
+
+export interface AuditLog extends Log {
+  policy?: string;
+  reason?: string;
+  result: number;
+  text?: string;
+  tags?: string[];
+  resource?: string;
+  sess?: string;
+  access?: string;
+  logType: string;
+  tags_str?: string;
+  resType?: string;
+  reqUser: string;
+  reqData?: string;
+  repoType: number;
+  repo: string;
+  proxyUsers?: string[];
+  evtTime: string;
+  enforcer: string;
+  reqContext?: string;
+  cliType?: string;
+  cliIP?: string;
+  agent?: string;
+  agentHost?: string;
+  action?: string;
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/models/bar-graph.model.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/models/bar-graph.model.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/bar-graph.model.ts
new file mode 100644
index 0000000..f53d56d
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/bar-graph.model.ts
@@ -0,0 +1,24 @@
+/**
+ * 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.
+ */
+
+import {CommonEntry} from '@app/models/common-entry.model';
+
+export interface BarGraph {
+  dataCount: CommonEntry[],
+  name: string;
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/models/common-entry.model.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/models/common-entry.model.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/common-entry.model.ts
new file mode 100644
index 0000000..15d2be7
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/common-entry.model.ts
@@ -0,0 +1,22 @@
+/**
+ * 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.
+ */
+
+export interface CommonEntry {
+  name: string;
+  value: string;
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/models/count.model.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/models/count.model.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/count.model.ts
new file mode 100644
index 0000000..095e8e7
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/count.model.ts
@@ -0,0 +1,22 @@
+/**
+ * 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.
+ */
+
+export interface Count {
+  name: string;
+  count: number;
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/models/filter.model.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/models/filter.model.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/filter.model.ts
new file mode 100644
index 0000000..6ceaec1
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/filter.model.ts
@@ -0,0 +1,25 @@
+/**
+ * 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.
+ */
+
+export interface Filter {
+  label: string;
+  hosts: string[];
+  defaultLevels: string[];
+  overrideLevels: string[];
+  expiryTime: string;
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/models/graph.model.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/models/graph.model.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/graph.model.ts
new file mode 100644
index 0000000..5021654
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/graph.model.ts
@@ -0,0 +1,23 @@
+/**
+ * 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.
+ */
+
+export interface Graph {
+  name: string;
+  count: string;
+  dataList?: Graph[]
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/models/log.model.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/models/log.model.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/log.model.ts
new file mode 100644
index 0000000..825b4cf
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/log.model.ts
@@ -0,0 +1,37 @@
+/**
+ * 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.
+ */
+
+export interface Log {
+  type: string;
+  _version_: number;
+  id: string;
+  file?: string;
+  seq_num: number;
+  bundle_id?: string;
+  case_id?: string;
+  log_message: string;
+  logfile_line_number: number;
+  message_md5: string;
+  cluster: string;
+  event_count: number;
+  event_md5: string;
+  event_dur_ms: number;
+  _ttl_: string;
+  _expire_at_: string;
+  _router_field_?: number;
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/models/node.model.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/models/node.model.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/node.model.ts
new file mode 100644
index 0000000..1128827
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/node.model.ts
@@ -0,0 +1,29 @@
+/**
+ * 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.
+ */
+
+import {CommonEntry} from '@app/models/common-entry.model';
+
+export interface Node {
+  name: string;
+  type?: number;
+  value: string;
+  isParent: boolean;
+  isRoot: boolean;
+  childs?: Node[];
+  logLevelCount: CommonEntry[];
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/models/service-log.model.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/models/service-log.model.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/service-log.model.ts
new file mode 100644
index 0000000..e386ad5
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/service-log.model.ts
@@ -0,0 +1,27 @@
+/**
+ * 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.
+ */
+
+import {Log} from '@app/models/log.model';
+
+export interface ServiceLog extends Log {
+  path: string;
+  host: string;
+  level: string;
+  logtime: string;
+  ip: string;
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/models/solr-collection-state.model.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/models/solr-collection-state.model.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/solr-collection-state.model.ts
new file mode 100644
index 0000000..9c40f4a
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/solr-collection-state.model.ts
@@ -0,0 +1,23 @@
+/**
+ * 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.
+ */
+
+export interface SolrCollectionState {
+  znodeReady: boolean;
+  configurationUploaded: boolean;
+  solrCollectionReady: boolean;
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/models/store.model.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/models/store.model.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/store.model.ts
new file mode 100644
index 0000000..1f3a89c
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/store.model.ts
@@ -0,0 +1,95 @@
+/**
+ * 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.
+ */
+
+import {Observable} from 'rxjs/Observable';
+import {Store, Action} from '@ngrx/store';
+import {AuditLog} from '@app/models/audit-log.model';
+import {ServiceLog} from '@app/models/service-log.model';
+import {BarGraph} from '@app/models/bar-graph.model';
+import {Graph} from '@app/models/graph.model';
+import {Node} from '@app/models/node.model';
+import {UserConfig} from '@app/models/user-config.model';
+import {Filter} from '@app/models/filter.model';
+
+export const storeActions = {
+  ADD: 'ADD',
+  DELETE: 'DELETE',
+  CLEAR: 'CLEAR'
+};
+
+export interface AppStore {
+  auditLogs: AuditLog[];
+  serviceLogs: ServiceLog[];
+  barGraphs: BarGraph[];
+  graphs: Graph[];
+  nodes: Node[];
+  userConfigs: UserConfig[];
+  filters: Filter[];
+}
+
+export class ModelService {
+
+  constructor(private modelName: string, private store: Store<AppStore>) {}
+
+  getInstances(): Observable<any> {
+    return this.store.select(this.modelName);
+  }
+
+  addInstance(instance: any): void {
+    this.store.dispatch({
+      type: storeActions.ADD,
+      payload: [instance]
+    });
+  }
+
+  addInstances(instances: any[]): void {
+    this.store.dispatch({
+      type: storeActions.ADD,
+      payload: instances
+    });
+  }
+
+  deleteInstance(instance: any): void {
+    this.store.dispatch({
+      type: storeActions.DELETE,
+      payload: instance
+    });
+  }
+
+  clear(): void {
+    this.store.dispatch({
+      type: storeActions.CLEAR
+    });
+  }
+
+}
+
+export function reducer(state: any, action: Action): any {
+  switch (action.type) {
+    case storeActions.ADD:
+      return [...state, ...action.payload];
+    case storeActions.DELETE:
+      return state.filter(instance => {
+        return instance.id !== action.payload.id;
+      });
+    case storeActions.CLEAR:
+      return [];
+    default:
+      return state;
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/models/user-config.model.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/models/user-config.model.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/user-config.model.ts
new file mode 100644
index 0000000..3c3b884
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/user-config.model.ts
@@ -0,0 +1,26 @@
+/**
+ * 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.
+ */
+
+export interface UserConfig {
+  id: string;
+  userName: string;
+  filtername: string;
+  values: string;
+  shareNameList: string[];
+  rowType: string;
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/services/actions.service.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/actions.service.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/actions.service.spec.ts
deleted file mode 100644
index a14e0db..0000000
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/actions.service.spec.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * 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.
- */
-
-import {TestBed, inject} from '@angular/core/testing';
-
-import {ActionsService} from './actions.service';
-
-describe('ActionsService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [ActionsService]
-    });
-  });
-
-  it('should create service', inject([ActionsService], (service: ActionsService) => {
-    expect(service).toBeTruthy();
-  }));
-});

http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/services/actions.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/actions.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/actions.service.ts
deleted file mode 100644
index 2bcd909..0000000
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/actions.service.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * 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.
- */
-
-import {Injectable} from '@angular/core';
-
-@Injectable()
-export class ActionsService {
-
-  constructor() {
-  }
-
-  //TODO implement actions
-
-  undo() {
-  }
-
-  redo() {
-  }
-
-  refresh() {
-  }
-
-  openHistory() {
-  }
-
-  openAlerts() {
-  }
-
-  openUserDetails() {
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/services/component-actions.service.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/component-actions.service.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/component-actions.service.spec.ts
new file mode 100644
index 0000000..303fdab
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/component-actions.service.spec.ts
@@ -0,0 +1,33 @@
+/**
+ * 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.
+ */
+
+import {TestBed, inject} from '@angular/core/testing';
+
+import {ComponentActionsService} from './component-actions.service';
+
+describe('ComponentActionsService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [ComponentActionsService]
+    });
+  });
+
+  it('should create service', inject([ComponentActionsService], (service: ComponentActionsService) => {
+    expect(service).toBeTruthy();
+  }));
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/services/component-actions.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/component-actions.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/component-actions.service.ts
new file mode 100644
index 0000000..1a1062e
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/component-actions.service.ts
@@ -0,0 +1,47 @@
+/**
+ * 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.
+ */
+
+import {Injectable} from '@angular/core';
+
+@Injectable()
+export class ComponentActionsService {
+
+  constructor() {
+  }
+
+  //TODO implement actions
+
+  undo() {
+  }
+
+  redo() {
+  }
+
+  refresh() {
+  }
+
+  openHistory() {
+  }
+
+  openAlerts() {
+  }
+
+  openUserDetails() {
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
index da32c7e..be39536 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
@@ -20,6 +20,745 @@ import {InMemoryDbService} from 'angular-in-memory-web-api';
 
 export class mockApiDataService implements InMemoryDbService {
   createDb() {
-    return {};
+    return {
+      audit: {
+        logs: {
+          logList: [
+            {
+              policy: 'policy',
+              reason: 'Authentication required',
+              result: 0,
+              text: 'Please log in',
+              tags: [
+                'ambari_agent'
+              ],
+              resource: '/ambari-agent',
+              sess: '0',
+              access: '0',
+              logType: 'AmbariAudit',
+              tags_str: 'ambari_agent',
+              resType: 'agent',
+              reqUser: 'admin',
+              reqData: 'data',
+              repoType: 1,
+              repo: 'ambari',
+              proxyUsers: [
+                'admin'
+              ],
+              evtTime: '2017-05-29T11:30:22.531Z',
+              enforcer: 'ambari-acl',
+              reqContext: 'ambari',
+              cliType: 'GET',
+              cliIP: '192.168.0.1',
+              agent: 'agent',
+              agentHost: 'localhost',
+              action: 'SERVICE_CHECK',
+              type: 'ambari-audit',
+              _version_: 2,
+              id: 'id0',
+              file: 'ambari-agent.log',
+              seq_num: 3,
+              bundle_id: 'b0',
+              case_id: 'c0',
+              log_message: 'User(admin), Operation(SERVICE_CHECK)',
+              logfile_line_number: 4,
+              message_md5: '12345678900987654321',
+              cluster: 'cl0',
+              event_count: 0,
+              event_md5: '09876543211234567890',
+              event_dur_ms: 100,
+              _ttl_: "+7DAYS",
+              _expire_at_: '2017-05-29T11:30:22.531Z',
+              _router_field_: 5
+            },
+            {
+              policy: 'policy',
+              reason: 'Server error',
+              result: 1,
+              text: 'Something went wrong',
+              tags: [
+                'ambari_agent'
+              ],
+              resource: '/ambari-agent',
+              sess: '1',
+              access: '1',
+              logType: 'AmbariAudit',
+              tags_str: 'ambari_server',
+              resType: 'server',
+              reqUser: 'user',
+              reqData: 'data',
+              repoType: 1,
+              repo: 'ambari',
+              proxyUsers: [
+                'user'
+              ],
+              evtTime: '2017-05-29T11:30:22.531Z',
+              enforcer: 'hdfs',
+              reqContext: 'ambari_server',
+              cliType: 'PUT',
+              cliIP: '192.168.0.1',
+              agent: 'agent',
+              agentHost: 'localhost',
+              action: 'SERVICE_CHECK',
+              type: 'ambari-audit',
+              _version_: 4,
+              id: 'id1',
+              file: 'ambari-agent.log',
+              seq_num: 5,
+              bundle_id: 'b1',
+              case_id: 'c1',
+              log_message: 'User(user), Operation(SERVICE_CHECK)',
+              logfile_line_number: 6,
+              message_md5: '10293847561029384756',
+              cluster: 'cl1',
+              event_count: 2,
+              event_md5: '01928374650192837465',
+              event_dur_ms: 500,
+              _ttl_: "+7DAYS",
+              _expire_at_: '2017-05-29T11:30:22.531Z',
+              _router_field_: 10
+            }
+          ],
+          bargraph: {
+            graphData: [
+              {
+                dataCount: [
+                  {
+                    name: 'n0',
+                    value: 1
+                  },
+                  {
+                    name: 'n1',
+                    value: 2
+                  }
+                ],
+                name: 'graph0'
+              },
+              {
+                dataCount: [
+                  {
+                    name: 'n2',
+                    value: 10
+                  },
+                  {
+                    name: 'n3',
+                    value: 20
+                  }
+                ],
+                name: 'graph1'
+              }
+            ]
+          },
+          components: {},
+          resources: {
+            graphData: [
+              {
+                dataCount: [
+                  {
+                    name: 'n16',
+                    value: 800
+                  },
+                  {
+                    name: 'n17',
+                    value: 400
+                  }
+                ],
+                name: 'graph8'
+              },
+              {
+                dataCount: [
+                  {
+                    name: 'n18',
+                    value: 600
+                  },
+                  {
+                    name: 'n19',
+                    value: 300
+                  }
+                ],
+                name: 'graph9'
+              }
+            ]
+          },
+          schema: {
+            fields: ''
+          },
+          serviceload: {
+            graphData: [
+              {
+                dataCount: [
+                  {
+                    name: 'n4',
+                    value: 1
+                  },
+                  {
+                    name: 'n5',
+                    value: 2
+                  }
+                ],
+                name: 'graph2'
+              },
+              {
+                dataCount: [
+                  {
+                    name: 'n6',
+                    value: 10
+                  },
+                  {
+                    name: 'n7',
+                    value: 20
+                  }
+                ],
+                name: 'graph3'
+              }
+            ]
+          }
+        }
+      },
+      public: {
+        config: {}
+      },
+      service: {
+        logs: {
+          logList: [
+            {
+              path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
+              host: 'h0',
+              level: 'WARN',
+              logtime: '2017-05-28T11:30:22.531Z',
+              ip: '192.168.0.1',
+              logfile_line_number: 8,
+              type: 'ams_collector',
+              _version_: 9,
+              id: 'id2',
+              file: 'ambari-metrics-collector.log',
+              seq_num: 10,
+              bundle_id: 'b2',
+              case_id: 'c2',
+              log_message: 'Connection refused',
+              message_md5: '1357908642',
+              cluster: 'cl2',
+              event_count: 5,
+              event_md5: '1908755391',
+              event_dur_ms: 200,
+              _ttl_: "+5DAYS",
+              _expire_at_: '2017-05-29T11:30:22.531Z',
+              _router_field_: 20
+            },
+            {
+              path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
+              host: 'h1',
+              level: 'ERROR',
+              logtime: '2017-05-28T10:30:22.531Z',
+              ip: '192.168.0.2',
+              type: 'ams_collector',
+              _version_: 14,
+              id: 'id3',
+              file: 'ambari-metrics-collector.log',
+              seq_num: 15,
+              bundle_id: 'b3',
+              case_id: 'c3',
+              log_message: 'Connection refused',
+              logfile_line_number: 16,
+              message_md5: '1357908642',
+              cluster: 'cl3',
+              event_count: 2,
+              event_md5: '1029384756',
+              event_dur_ms: 700,
+              _ttl_: "+5DAYS",
+              _expire_at_: '2017-05-29T10:30:22.531Z',
+              _router_field_: 5
+            }
+          ],
+          aggregated: {
+            graphData: [
+              {
+                name: 'n0',
+                count: 100,
+                dataList: [
+                  {
+                    name: 'n1',
+                    count: 50,
+                    dataList: null
+                  },
+                  {
+                    name: 'n2',
+                    count: 200,
+                    dataList: null
+                  }
+                ]
+              },
+              {
+                name: 'n3',
+                count: 10,
+                dataList: [
+                  {
+                    name: 'n4',
+                    count: 5,
+                    dataList: null
+                  },
+                  {
+                    name: 'n5',
+                    count: 20,
+                    dataList: null
+                  }
+                ]
+              }
+            ]
+          },
+          components: {
+            count: {
+              anygraph: {
+                graphData: [
+                  {
+                    dataCount: [
+                      {
+                        name: 'n8',
+                        value: 50
+                      },
+                      {
+                        name: 'n9',
+                        value: 100
+                      }
+                    ],
+                    name: 'graph4'
+                  },
+                  {
+                    dataCount: [
+                      {
+                        name: 'n10',
+                        value: 5
+                      },
+                      {
+                        name: 'n11',
+                        value: 10
+                      }
+                    ],
+                    name: 'graph5'
+                  }
+                ]
+              }
+            },
+            levels: {
+              counts: {
+                vNodeList: [
+                  {
+                    name: 'ambari',
+                    type: 0,
+                    logLevelCount: [
+                      {
+                        name: 'ERROR',
+                        value: '10'
+                      },
+                      {
+                        name: 'WARN',
+                        value: '50'
+                      }
+                    ],
+                    childs: [
+                      {
+                        name: 'hdfs',
+                        type: 2,
+                        logLevelCount: [
+                          {
+                            name: 'ERROR',
+                            value: '10'
+                          },
+                          {
+                            name: 'WARN',
+                            value: '20'
+                          }
+                        ],
+                        isParent: false,
+                        isRoot: false
+                      },
+                      {
+                        name: 'zookeeper',
+                        type: 3,
+                        logLevelCount: [
+                          {
+                            name: 'ERROR',
+                            value: '20'
+                          },
+                          {
+                            name: 'WARN',
+                            value: '40'
+                          }
+                        ],
+                        isParent: false,
+                        isRoot: false
+                      }
+                    ],
+                    isParent: true,
+                    isRoot: false
+                  },
+                  {
+                    name: 'ambari_agent',
+                    type: 1,
+                    logLevelCount: [
+                      {
+                        name: 'ERROR',
+                        value: '100'
+                      },
+                      {
+                        name: 'WARN',
+                        value: '500'
+                      }
+                    ],
+                    isParent: false,
+                    isRoot: false
+                  }
+                ]
+              }
+            }
+          },
+          files: {
+            hostLogFiles: {
+              clusters: [
+                'c0',
+                'c1'
+              ],
+              services: [
+                'hdfs',
+                'zookeeper'
+              ]
+            }
+          },
+          histogram: {
+            graphData: [
+              {
+                dataCount: [
+                  {
+                    name: 'n12',
+                    value: 1000
+                  },
+                  {
+                    name: 'n13',
+                    value: 2000
+                  }
+                ],
+                name: 'graph6'
+              },
+              {
+                dataCount: [
+                  {
+                    name: 'n14',
+                    value: 700
+                  },
+                  {
+                    name: 'n15',
+                    value: 900
+                  }
+                ],
+                name: 'graph7'
+              }
+            ]
+          },
+          hosts: {
+            components: {
+              vNodeList: [
+                {
+                  name: 'ambari',
+                  type: 0,
+                  logLevelCount: [
+                    {
+                      name: 'ERROR',
+                      value: '100'
+                    },
+                    {
+                      name: 'WARN',
+                      value: '500'
+                    }
+                  ],
+                  childs: [
+                    {
+                      name: 'ambari_metrics',
+                      type: 2,
+                      logLevelCount: [
+                        {
+                          name: 'ERROR',
+                          value: '100'
+                        },
+                        {
+                          name: 'WARN',
+                          value: '200'
+                        }
+                      ],
+                      isParent: false,
+                      isRoot: false
+                    },
+                    {
+                      name: 'hbase',
+                      type: 3,
+                      logLevelCount: [
+                        {
+                          name: 'ERROR',
+                          value: '200'
+                        },
+                        {
+                          name: 'WARN',
+                          value: '400'
+                        }
+                      ],
+                      isParent: false,
+                      isRoot: false
+                    }
+                  ],
+                  isParent: true,
+                  isRoot: false
+                },
+                {
+                  name: 'ambari_server',
+                  type: 1,
+                  logLevelCount: [
+                    {
+                      name: 'ERROR',
+                      value: '1000'
+                    },
+                    {
+                      name: 'WARN',
+                      value: '5000'
+                    }
+                  ],
+                  isParent: false,
+                  isRoot: false
+                }
+              ]
+            },
+            count: {
+              getvCounts: [
+                {
+                  name: 'n20',
+                  count: 100
+                },
+                {
+                  name: 'n21',
+                  count: 200
+                }
+              ]
+            }
+          },
+          levels: {
+            counts: {
+              getvNameValues: [
+                {
+                  name: 'n22',
+                  count: 1000
+                },
+                {
+                  name: 'n23',
+                  count: 2000
+                }
+              ]
+            }
+          },
+          schema: {
+            fields: ''
+          },
+          serviceconfig: '',
+          tree: {
+            vNodeList: [
+              {
+                name: 'ambari',
+                type: 0,
+                logLevelCount: [
+                  {
+                    name: 'ERROR',
+                    value: '1000'
+                  },
+                  {
+                    name: 'WARN',
+                    value: '5000'
+                  }
+                ],
+                childs: [
+                  {
+                    name: 'yarn',
+                    type: 2,
+                    logLevelCount: [
+                      {
+                        name: 'ERROR',
+                        value: '1000'
+                      },
+                      {
+                        name: 'WARN',
+                        value: '2000'
+                      }
+                    ],
+                    isParent: false,
+                    isRoot: false
+                  },
+                  {
+                    name: 'hive',
+                    type: 3,
+                    logLevelCount: [
+                      {
+                        name: 'ERROR',
+                        value: '2000'
+                      },
+                      {
+                        name: 'WARN',
+                        value: '4000'
+                      }
+                    ],
+                    isParent: false,
+                    isRoot: false
+                  }
+                ],
+                isParent: true,
+                isRoot: false
+              },
+              {
+                name: 'ambari_server',
+                type: 1,
+                logLevelCount: [
+                  {
+                    name: 'ERROR',
+                    value: '10000'
+                  },
+                  {
+                    name: 'WARN',
+                    value: '50000'
+                  }
+                ],
+                isParent: false,
+                isRoot: false
+              }
+            ]
+          },
+          truncated: {
+            logList: [
+              {
+                path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
+                host: 'h0',
+                level: 'WARN',
+                logtime: '2017-05-28T11:30:22.531Z',
+                ip: '192.168.0.1',
+                logfile_line_number: 8,
+                type: 'ams_collector',
+                _version_: 9,
+                id: 'id2',
+                file: 'ambari-metrics-collector.log',
+                seq_num: 10,
+                bundle_id: 'b2',
+                case_id: 'c2',
+                log_message: 'Connection refused',
+                message_md5: '1357908642',
+                cluster: 'cl2',
+                event_count: 5,
+                event_md5: '1908755391',
+                event_dur_ms: 200,
+                _ttl_: "+5DAYS",
+                _expire_at_: '2017-05-29T11:30:22.531Z',
+                _router_field_: 20
+              },
+              {
+                path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
+                host: 'h1',
+                level: 'ERROR',
+                logtime: '2017-05-28T10:30:22.531Z',
+                ip: '192.168.0.2',
+                type: 'ams_collector',
+                _version_: 14,
+                id: 'id3',
+                file: 'ambari-metrics-collector.log',
+                seq_num: 15,
+                bundle_id: 'b3',
+                case_id: 'c3',
+                log_message: 'Connection refused',
+                logfile_line_number: 16,
+                message_md5: '1357908642',
+                cluster: 'cl3',
+                event_count: 2,
+                event_md5: '1029384756',
+                event_dur_ms: 700,
+                _ttl_: "+5DAYS",
+                _expire_at_: '2017-05-29T10:30:22.531Z',
+                _router_field_: 5
+              }
+            ]
+          }
+        }
+      },
+      status: {
+        auditlogs: {
+          znodeReady: true,
+          solrCollectionReady: true,
+          solrAliasReady: false,
+          configurationUploaded: true
+        },
+        servicelogs: {
+          znodeReady: true,
+          solrCollectionReady: true,
+          configurationUploaded: true
+        },
+        userconfig: {
+          znodeReady: true,
+          solrCollectionReady: true,
+          configurationUploaded: true
+        }
+      },
+      userconfig: {
+        userConfigList: [
+          {
+            id: 'c0',
+            userName: 'admin',
+            filtername: 'service',
+            values: 'hdfs',
+            shareNameList: [
+              's0',
+              's1'
+            ],
+            rowType: 'history'
+          },
+          {
+            id: 'c0',
+            userName: 'user',
+            filtername: 'component',
+            values: 'namenode',
+            shareNameList: [
+              's2',
+              's3'
+            ],
+            rowType: 'history'
+          }
+        ],
+        filters: {
+          filter0: {
+            label: 'filter0',
+            hosts: [
+              'h0',
+              'h1'
+            ],
+            defaultLevels: [
+              'l0',
+              'l1'
+            ],
+            overrideLevels: [
+              'l2',
+              'l3'
+            ],
+            expiryTime: '2017-05-29T11:30:22.531Z'
+          },
+          filter1: {
+            label: 'filter1',
+            hosts: [
+              'h1',
+              'h2'
+            ],
+            defaultLevels: [
+              'l4',
+              'l5'
+            ],
+            overrideLevels: [
+              'l6',
+              'l7'
+            ],
+            expiryTime: '2017-05-30T11:30:22.531Z'
+          }
+        },
+        names: []
+      }
+    };
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/audit-logs.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/audit-logs.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/audit-logs.service.ts
new file mode 100644
index 0000000..706d2f3
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/audit-logs.service.ts
@@ -0,0 +1,34 @@
+/**
+ * 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.
+ */
+
+
+import {Injectable} from '@angular/core';
+import {Action, ActionReducer, Store} from '@ngrx/store';
+import {AuditLog} from '@app/models/audit-log.model';
+import {AppStore, ModelService, reducer} from '@app/models/store.model';
+
+@Injectable()
+export class AuditLogsService extends ModelService {
+  constructor(store: Store<AppStore>) {
+    super('auditLogs', store);
+  }
+}
+
+export const auditLogs: ActionReducer<AuditLog[]> = (state: AuditLog[] = [], action: Action) => {
+  return reducer(state, action);
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/bar-graphs.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/bar-graphs.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/bar-graphs.service.ts
new file mode 100644
index 0000000..2e2db5b
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/bar-graphs.service.ts
@@ -0,0 +1,34 @@
+/**
+ * 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.
+ */
+
+
+import {Injectable} from '@angular/core';
+import {Action, ActionReducer, Store} from '@ngrx/store';
+import {BarGraph} from '@app/models/bar-graph.model';
+import {AppStore, ModelService, reducer} from '@app/models/store.model';
+
+@Injectable()
+export class BarGraphsService extends ModelService {
+  constructor(store: Store<AppStore>) {
+    super('barGraphs', store);
+  }
+}
+
+export const barGraphs: ActionReducer<BarGraph[]> = (state: BarGraph[] = [], action: Action) => {
+  return reducer(state, action);
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/filters.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/filters.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/filters.service.ts
new file mode 100644
index 0000000..99d2140
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/filters.service.ts
@@ -0,0 +1,34 @@
+/**
+ * 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.
+ */
+
+
+import {Injectable} from '@angular/core';
+import {Action, ActionReducer, Store} from '@ngrx/store';
+import {Filter} from '@app/models/filter.model';
+import {AppStore, ModelService, reducer} from '@app/models/store.model';
+
+@Injectable()
+export class FiltersService extends ModelService {
+  constructor(store: Store<AppStore>) {
+    super('filters', store);
+  }
+}
+
+export const filters: ActionReducer<Filter[]> = (state: Filter[] = [], action: Action) => {
+  return reducer(state, action);
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/graphs.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/graphs.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/graphs.service.ts
new file mode 100644
index 0000000..1c32d34
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/graphs.service.ts
@@ -0,0 +1,34 @@
+/**
+ * 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.
+ */
+
+
+import {Injectable} from '@angular/core';
+import {Action, ActionReducer, Store} from '@ngrx/store';
+import {Graph} from '@app/models/graph.model';
+import {AppStore, ModelService, reducer} from '@app/models/store.model';
+
+@Injectable()
+export class GraphsService extends ModelService {
+  constructor(store: Store<AppStore>) {
+    super('graphs', store);
+  }
+}
+
+export const graphs: ActionReducer<Graph[]> = (state: Graph[] = [], action: Action) => {
+  return reducer(state, action);
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/nodes.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/nodes.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/nodes.service.ts
new file mode 100644
index 0000000..b194f94
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/nodes.service.ts
@@ -0,0 +1,34 @@
+/**
+ * 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.
+ */
+
+
+import {Injectable} from '@angular/core';
+import {Action, ActionReducer, Store} from '@ngrx/store';
+import {Node} from '@app/models/node.model';
+import {AppStore, ModelService, reducer} from '@app/models/store.model';
+
+@Injectable()
+export class NodesService extends ModelService {
+  constructor(store: Store<AppStore>) {
+    super('nodes', store);
+  }
+}
+
+export const nodes: ActionReducer<Node[]> = (state: Node[] = [], action: Action) => {
+  return reducer(state, action);
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/service-logs.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/service-logs.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/service-logs.service.ts
new file mode 100644
index 0000000..6859653
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/service-logs.service.ts
@@ -0,0 +1,34 @@
+/**
+ * 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.
+ */
+
+
+import {Injectable} from '@angular/core';
+import {Action, ActionReducer, Store} from '@ngrx/store';
+import {ServiceLog} from '@app/models/service-log.model';
+import {AppStore, ModelService, reducer} from '@app/models/store.model';
+
+@Injectable()
+export class ServiceLogsService extends ModelService {
+  constructor(store: Store<AppStore>) {
+    super('serviceLogs', store);
+  }
+}
+
+export const serviceLogs: ActionReducer<ServiceLog[]> = (state: ServiceLog[] = [], action: Action) => {
+  return reducer(state, action);
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/user-configs.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/user-configs.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/user-configs.service.ts
new file mode 100644
index 0000000..2c770f0
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/user-configs.service.ts
@@ -0,0 +1,34 @@
+/**
+ * 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.
+ */
+
+
+import {Injectable} from '@angular/core';
+import {Action, ActionReducer, Store} from '@ngrx/store';
+import {UserConfig} from '@app/models/user-config.model';
+import {AppStore, ModelService, reducer} from '@app/models/store.model';
+
+@Injectable()
+export class UserConfigsService extends ModelService {
+  constructor(store: Store<AppStore>) {
+    super('userConfigs', store);
+  }
+}
+
+export const userConfigs: ActionReducer<UserConfig[]> = (state: UserConfig[] = [], action: Action) => {
+  return reducer(state, action);
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/tsconfig.app.json
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/tsconfig.app.json b/ambari-logsearch/ambari-logsearch-web-new/src/tsconfig.app.json
index 5e2507d..7166e04 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/tsconfig.app.json
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/tsconfig.app.json
@@ -3,7 +3,7 @@
   "compilerOptions": {
     "outDir": "../out-tsc/app",
     "module": "es2015",
-    "baseUrl": "",
+    "baseUrl": ".",
     "types": []
   },
   "exclude": [

http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/tsconfig.json
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/tsconfig.json b/ambari-logsearch/ambari-logsearch-web-new/tsconfig.json
index a35a8ee..12163cb 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/tsconfig.json
+++ b/ambari-logsearch/ambari-logsearch-web-new/tsconfig.json
@@ -3,6 +3,11 @@
   "compilerOptions": {
     "outDir": "./dist/out-tsc",
     "baseUrl": "src",
+    "paths": {
+      "@app/*": [
+        "app/*"
+      ]
+    },
     "sourceMap": true,
     "declaration": false,
     "moduleResolution": "node",


[06/21] ambari git commit: AMBARI-21312 Provide Log Search UI authorization functionality. (ababiichuk)

Posted by ab...@apache.org.
AMBARI-21312 Provide Log Search UI authorization functionality. (ababiichuk)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/607c9185
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/607c9185
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/607c9185

Branch: refs/heads/branch-feature-logsearch-ui
Commit: 607c918595ce85e23adbe4ea2a9b79cb6b8492fa
Parents: 70633c5
Author: ababiichuk <ab...@hortonworks.com>
Authored: Thu Jun 22 15:17:33 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jun 22 15:17:33 2017 +0300

----------------------------------------------------------------------
 .../ambari-logsearch-web-new/.angular-cli.json  |    9 +-
 .../e2e/app.e2e-spec.ts                         |    6 +-
 .../ambari-logsearch-web-new/package.json       |    4 +-
 .../src/app/app.component.html                  |    1 +
 .../src/app/app.component.spec.ts               |   27 +-
 .../src/app/app.component.ts                    |    9 +
 .../src/app/app.module.ts                       |   12 +-
 .../src/app/http-client.service.spec.ts         |   57 +
 .../src/app/http-client.service.ts              |   97 +
 .../app/login-form/login-form.component.html    |   33 +
 .../app/login-form/login-form.component.spec.ts |  107 +
 .../src/app/login-form/login-form.component.ts  |   59 +
 .../src/vendor/css/bootstrap-logsearch.min.css  |   18 +
 .../vendor/css/fonts/Roboto-Regular-webfont.eot |  Bin 0 -> 79547 bytes
 .../vendor/css/fonts/Roboto-Regular-webfont.svg | 7606 ++++++++++++++++++
 .../vendor/css/fonts/Roboto-Regular-webfont.ttf |  Bin 0 -> 234464 bytes
 .../css/fonts/Roboto-Regular-webfont.woff       |  Bin 0 -> 105700 bytes
 .../src/vendor/js/bootstrap-logsearch.min.js    |   19 +
 18 files changed, 8043 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/.angular-cli.json
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/.angular-cli.json b/ambari-logsearch/ambari-logsearch-web-new/.angular-cli.json
index 03c5382..2f90ebe 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/.angular-cli.json
+++ b/ambari-logsearch/ambari-logsearch-web-new/.angular-cli.json
@@ -20,9 +20,14 @@
       "prefix": "app",
       "styles": [
         "styles.less",
-        "../node_modules/bootstrap/dist/css/bootstrap.min.css"
+        "../node_modules/bootstrap/dist/css/bootstrap.min.css",
+        "../node_modules/font-awesome/css/font-awesome.min.css",
+        "../src/vendor/css/bootstrap-logsearch.min.css"
+      ],
+      "scripts": [
+        "../node_modules/jquery/dist/jquery.min.js",
+        "../src/vendor/js/bootstrap-logsearch.min.js"
       ],
-      "scripts": [],
       "environmentSource": "environments/environment.ts",
       "environments": {
         "dev": "environments/environment.ts",

http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/e2e/app.e2e-spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/e2e/app.e2e-spec.ts b/ambari-logsearch/ambari-logsearch-web-new/e2e/app.e2e-spec.ts
index 3813a3d..ebfdcb9 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/e2e/app.e2e-spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/e2e/app.e2e-spec.ts
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-import { AmbariLogsearchWebNewPage } from './app.po';
+import {AmbariLogsearchWebNewPage} from './app.po';
 
 describe('ambari-logsearch-web-new App', () => {
   let page: AmbariLogsearchWebNewPage;
@@ -25,8 +25,8 @@ describe('ambari-logsearch-web-new App', () => {
     page = new AmbariLogsearchWebNewPage();
   });
 
-  it('should display message saying app works', () => {
+  it('should display title', () => {
     page.navigateTo();
-    expect(page.getParagraphText()).toEqual('app works!');
+    expect(page.getParagraphText()).toEqual('Ambari Log Search');
   });
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/package.json
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/package.json b/ambari-logsearch/ambari-logsearch-web-new/package.json
index 01ac4be..feccace 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/package.json
+++ b/ambari-logsearch/ambari-logsearch-web-new/package.json
@@ -23,7 +23,9 @@
     "core-js": "^2.4.1",
     "ngx-bootstrap": "^1.6.6",
     "rxjs": "^5.1.0",
-    "zone.js": "^0.8.4"
+    "zone.js": "^0.8.4",
+    "jquery": "^1.12.4",
+    "font-awesome": "^4.7.0"
   },
   "devDependencies": {
     "@angular/cli": "1.0.0",

http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html
index 85b96dc..3ba591e 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html
@@ -18,3 +18,4 @@
 <h1>
   {{title}}
 </h1>
+<login-form *ngIf="!httpClient.isAuthorized"></login-form>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.spec.ts
index d57f9c4..f6d229f 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.spec.ts
@@ -16,16 +16,26 @@
  * limitations under the License.
  */
 
-import { TestBed, async } from '@angular/core/testing';
+import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
+import {TestBed, async} from '@angular/core/testing';
+import {HttpClientService} from './http-client.service';
 
-import { AppComponent } from './app.component';
+import {AppComponent} from './app.component';
 
 describe('AppComponent', () => {
   beforeEach(async(() => {
+    const httpClient = {
+      get: () => {}
+    };
     TestBed.configureTestingModule({
-      declarations: [
-        AppComponent
+      declarations: [AppComponent],
+      providers: [
+        {
+          provide: HttpClientService,
+          useValue: httpClient
+        },
       ],
+      schemas: [CUSTOM_ELEMENTS_SCHEMA]
     }).compileComponents();
   }));
 
@@ -35,16 +45,11 @@ describe('AppComponent', () => {
     expect(app).toBeTruthy();
   }));
 
-  it(`should have as title 'app works!'`, async(() => {
-    const fixture = TestBed.createComponent(AppComponent);
-    const app = fixture.debugElement.componentInstance;
-    expect(app.title).toEqual('app works!');
-  }));
-
   it('should render title in a h1 tag', async(() => {
     const fixture = TestBed.createComponent(AppComponent);
+    const app = fixture.debugElement.componentInstance;
     fixture.detectChanges();
     const compiled = fixture.debugElement.nativeElement;
-    expect(compiled.querySelector('h1').textContent).toContain('app works!');
+    expect(compiled.querySelector('h1').textContent).toContain(app.title);
   }));
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts
index 5f59b8e..6f88af0 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts
@@ -17,6 +17,7 @@
  */
 
 import {Component} from '@angular/core';
+import {HttpClientService} from './http-client.service';
 
 @Component({
   selector: 'app-root',
@@ -25,5 +26,13 @@ import {Component} from '@angular/core';
 })
 
 export class AppComponent {
+
+  constructor(private httpClient: HttpClientService) {
+  }
+
+  ngOnInit() {
+    this.httpClient.get('status');
+  }
+
   title = 'Ambari Log Search';
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
index 34b7978..39dc46f 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
@@ -17,18 +17,21 @@
  */
 
 import {BrowserModule} from '@angular/platform-browser';
-import {NgModule} from '@angular/core';
+import {NgModule, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
 import {FormsModule} from '@angular/forms';
 import {HttpModule} from '@angular/http';
 import {InMemoryWebApiModule} from 'angular-in-memory-web-api';
 import {mockApiDataService} from './mock-api-data.service'
 import {AlertModule} from 'ngx-bootstrap';
+import {HttpClientService} from './http-client.service';
 
 import {AppComponent} from './app.component';
+import {LoginFormComponent} from './login-form/login-form.component';
 
 @NgModule({
   declarations: [
-    AppComponent
+    AppComponent,
+    LoginFormComponent
   ],
   imports: [
     BrowserModule,
@@ -37,8 +40,9 @@ import {AppComponent} from './app.component';
     InMemoryWebApiModule.forRoot(mockApiDataService),
     AlertModule.forRoot()
   ],
-  providers: [],
-  bootstrap: [AppComponent]
+  providers: [HttpClientService],
+  bootstrap: [AppComponent],
+  schemas: [CUSTOM_ELEMENTS_SCHEMA]
 })
 export class AppModule {
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/src/app/http-client.service.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/http-client.service.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/http-client.service.spec.ts
new file mode 100644
index 0000000..ec8596d
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/http-client.service.spec.ts
@@ -0,0 +1,57 @@
+/**
+ * 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.
+ */
+
+import {TestBed, inject} from '@angular/core/testing';
+import {HttpModule, Request} from '@angular/http';
+import {HttpClientService} from './http-client.service';
+
+describe('HttpClientService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      imports: [HttpModule],
+      providers: [HttpClientService]
+    });
+  });
+
+  it('should create service', inject([HttpClientService], (service: HttpClientService) => {
+    expect(service).toBeTruthy();
+  }));
+
+  describe('generateUrlString()', () => {
+    it('should generate URL from presets', inject([HttpClientService], (service:HttpClientService) => {
+      expect(service.generateUrlString('status')).toEqual('api/v1/status');
+    }));
+
+    it('should return explicit URL', inject([HttpClientService], (service:HttpClientService) => {
+      expect(service.generateUrlString('login')).toEqual('login');
+    }));
+  });
+
+  describe('generateUrl()', () => {
+    it('string parameter', inject([HttpClientService], (service:HttpClientService) => {
+      expect(service.generateUrl('status')).toEqual('api/v1/status');
+    }));
+
+    it('request object parameter', inject([HttpClientService], (service:HttpClientService) => {
+      let request = new Request({
+        url: 'status'
+      });
+      expect(service.generateUrl(request).url).toEqual('api/v1/status');
+    }));
+  });
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/src/app/http-client.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/http-client.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/http-client.service.ts
new file mode 100644
index 0000000..3585600
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/http-client.service.ts
@@ -0,0 +1,97 @@
+/**
+ * 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.
+ */
+
+import {Injectable} from '@angular/core';
+import {Observable} from 'rxjs/Observable';
+import {Http, XHRBackend, Request, RequestOptions, RequestOptionsArgs, Response} from '@angular/http';
+import 'rxjs/add/operator/map';
+import 'rxjs/add/operator/catch';
+
+@Injectable()
+export class HttpClientService extends Http {
+
+  constructor(backend: XHRBackend, defaultOptions: RequestOptions) {
+    super(backend, defaultOptions);
+  }
+
+  readonly apiPrefix = 'api/v1/';
+
+  readonly urls = {
+    status: 'status'
+  };
+
+  isAuthorized: boolean;
+
+  generateUrlString(url: string): string {
+    const presetUrl = this.urls[url];
+    return presetUrl ? (this.apiPrefix + this.urls[url]) : url;
+  }
+
+  generateUrl(url: string | Request): string | Request {
+    if (typeof url === 'string') {
+      return this.generateUrlString(url);
+    }
+    if (url instanceof Request) {
+      url.url = this.generateUrlString(url.url);
+      return url;
+    }
+  }
+
+  handleError(request: Observable<Response>) {
+    request.subscribe(null, (error: any) => {
+      if ([401, 403, 419].indexOf(error.status) > -1) {
+        this.isAuthorized = false;
+      }
+    });
+  }
+
+  request(url: string | Request, options?: RequestOptionsArgs):Observable<Response> {
+    let req = super.request(this.generateUrl(url), options);
+    this.handleError(req);
+    return req;
+  }
+
+  get(url: string, options?: RequestOptionsArgs):Observable<Response> {
+    return super.get(this.generateUrlString(url), options);
+  }
+
+  post(url: string, body: any, options?: RequestOptionsArgs):Observable<Response> {
+    return super.post(this.generateUrlString(url), body, options);
+  }
+
+  put(url: string, body: any, options?: RequestOptionsArgs):Observable<Response> {
+    return super.put(this.generateUrlString(url), body, options);
+  }
+
+  delete(url: string, options?: RequestOptionsArgs):Observable<Response> {
+    return super.delete(this.generateUrlString(url), options);
+  }
+
+  patch(url: string, body: any, options?: RequestOptionsArgs):Observable<Response> {
+    return super.patch(this.generateUrlString(url), body, options);
+  }
+
+  head(url: string, options?: RequestOptionsArgs):Observable<Response> {
+    return super.head(this.generateUrlString(url), options);
+  }
+
+  options(url: string, options?: RequestOptionsArgs):Observable<Response> {
+    return super.options(this.generateUrlString(url), options);
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.html
new file mode 100644
index 0000000..1cad6b3
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.html
@@ -0,0 +1,33 @@
+<!--
+  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.
+-->
+
+<div class="well col-md-4 col-md-offset-4 col-sm-offset-4">
+  <div class="alert alert-danger" *ngIf="isLoginAlertDisplayed">
+    <strong>Error!</strong> Invalid User credentials.<br>Please try again.
+  </div>
+  <form #loginForm="ngForm" (ngSubmit)="login()">
+    <div class="form-group">
+      <label for="username">Username</label>
+      <input class="form-control" type="text" id="username" name="username" required [(ngModel)]="username">
+    </div>
+    <div class="form-group">
+      <label for="password">Password</label>
+      <input class="form-control" type="password" id="password" name="password" required [(ngModel)]="password">
+    </div>
+    <button class="btn btn-success" [disabled]="!loginForm.form.valid || isRequestInProgress">Sign In</button>
+  </form>
+</div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.spec.ts
new file mode 100644
index 0000000..0a13c1e
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.spec.ts
@@ -0,0 +1,107 @@
+/**
+ * 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.
+ */
+
+import {async, ComponentFixture, TestBed} from '@angular/core/testing';
+import {FormsModule} from '@angular/forms';
+import {HttpModule} from '@angular/http';
+import {HttpClientService} from '../http-client.service';
+
+import {LoginFormComponent} from './login-form.component';
+
+describe('LoginFormComponent', () => {
+  let component: LoginFormComponent;
+  let fixture: ComponentFixture<LoginFormComponent>;
+
+  let authMock = {
+    isError: false
+  };
+  const httpClient = {
+    isAuthorized: true,
+    post: () => {
+      return {
+        finally: (callback: () => void) => {
+          callback();
+          return {
+            subscribe: (success: () => void, error: () => void) => {
+              authMock.isError ? error() : success();
+            }
+          }
+        }
+      }
+    }
+  };
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [LoginFormComponent],
+      imports: [HttpModule, FormsModule],
+      providers: [
+        {
+          provide: HttpClientService,
+          useValue: httpClient
+        }
+      ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(LoginFormComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create component', () => {
+    expect(component).toBeTruthy();
+  });
+
+  describe('login()', () => {
+    let cases = [
+      {
+        isError: true,
+        isLoginAlertDisplayed: true,
+        isAuthorized: false,
+        title: 'login failure'
+      },
+      {
+        isError: false,
+        isLoginAlertDisplayed: false,
+        isAuthorized: true,
+        title: 'login success'
+      }
+    ];
+
+    cases.forEach(test => {
+      describe(test.title, () => {
+        beforeEach(() => {
+          authMock.isError = test.isError;
+          component.login();
+        });
+
+        it('isLoginAlertDisplayed', () => {
+          expect(component.isLoginAlertDisplayed).toEqual(test.isLoginAlertDisplayed);
+        });
+
+        it('isRequestInProgress', () => {
+          expect(component.isRequestInProgress).toEqual(false);
+        })
+      });
+    });
+
+  });
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.ts
new file mode 100644
index 0000000..8dfa344
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.ts
@@ -0,0 +1,59 @@
+/**
+ * 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.
+ */
+
+import {Component, OnInit} from '@angular/core';
+import 'rxjs/add/operator/finally';
+import {HttpClientService} from '../http-client.service';
+
+@Component({
+  selector: 'login-form',
+  templateUrl: './login-form.component.html'
+})
+export class LoginFormComponent implements OnInit {
+
+  constructor(private httpClient: HttpClientService) {
+  }
+
+  ngOnInit() {
+  }
+
+  username: string;
+
+  password: string;
+
+  isLoginAlertDisplayed: boolean;
+
+  isRequestInProgress: boolean;
+
+  login() {
+    this.isRequestInProgress = true;
+    this.httpClient.post('login', {
+      username: this.username,
+      password: this.password
+    }).finally(() => {
+      this.isRequestInProgress = false;
+    }).subscribe(() => {
+      this.isLoginAlertDisplayed = false;
+      this.httpClient.isAuthorized = true;
+    }, () => {
+      this.isLoginAlertDisplayed = true;
+      this.httpClient.isAuthorized = false;
+    });
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/bootstrap-logsearch.min.css
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/bootstrap-logsearch.min.css b/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/bootstrap-logsearch.min.css
new file mode 100644
index 0000000..177d7df
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/bootstrap-logsearch.min.css
@@ -0,0 +1,18 @@
+/**
+ * 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.
+ */
+.btn-group.open .dropdown-menu,.dropdown.open .dropdown-menu,.font-mixin{font-family:Roboto,sans-serif;font-style:normal;font-weight:400}.pagination-block .pagination-block-item a,.pagination-block .pagination-block-item a:focus,.pagination-block .pagination-block-item a:visited,.table.table-hover .action:hover,a,a:focus,a:visited{text-decoration:none}@font-face{font-family:Roboto;font-weight:400;font-style:normal;src:url(fonts/Roboto-Regular-webfont.eot);src:url(fonts/Roboto-Regular-webfont.eot?#iefix) format('embedded-opentype'),url(fonts/Roboto-Regular-webfont.woff) format('woff'),url(fonts/Roboto-Regular-webfont.ttf) format('truetype'),url(fonts/Roboto-Regular-webfont.svg#robotoregular) format('svg')}  .font-mixin{line-height:1;color:#333}  .btn,.btn:focus{outline:0;font-family:Roboto,sans-serif;text-transform:uppercase;height:34px;font-size:14px;padding:10px 20px;line-height:14px}  .btn .glyphicon,.btn:focus .glyphicon{top:-1px;float:left}  .box-shadow{box-shadow:0 0 2px 0 #139
 1c1}  .btn-default-disabled,.btn-disabled{box-shadow:none;opacity:.6}  .btn-default-disabled{color:#FFF;background-color:#808793;border:none}  .btn-default,.btn-default:focus{color:#666;background-color:#FFF;border:1px solid #CFD3D7}  .btn-default:focus:hover,.btn-default:hover{color:#FFF;background-color:#808793}  .btn-default:active,.btn-default:focus:active{color:#666;background-color:#FFF;border:1px solid #CFD3D7;box-shadow:0 0 2px 0 #1391c1}  .btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled:active,.btn-default.disabled:hover,.btn-default:focus.disabled,.btn-default:focus.disabled.active,.btn-default:focus.disabled:active,.btn-default:focus.disabled:hover,.btn-default:focus[disabled],.btn-default:focus[disabled].active,.btn-default:focus[disabled]:active,.btn-default:focus[disabled]:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled]:active,.btn-default[disabled]:hover{opacity:.6;box-shadow:none;color:#FFF;background-color:#8
 08793;border:none}  .btn-primary-disabled{opacity:.6;box-shadow:none;color:#D1E8D1;background-color:#3FAE2A;border:1px solid #3FAE2A}  .btn-primary,.btn-primary:focus{color:#FFF;background-color:#3FAE2A;border:1px solid #3FAE2A}  .btn-primary:focus:hover,.btn-primary:hover{color:#FFF;background-color:#429929;border:1px solid #429929}  .btn-primary.active,.btn-primary:active,.btn-primary:focus.active,.btn-primary:focus:active{color:#FFF;background-color:#3FAE2A;border:1px solid #3FAE2A;box-shadow:0 0 2px 0 #1391c1}  .btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled:active,.btn-primary.disabled:hover,.btn-primary:focus.disabled,.btn-primary:focus.disabled.active,.btn-primary:focus.disabled:active,.btn-primary:focus.disabled:hover,.btn-primary:focus[disabled],.btn-primary:focus[disabled].active,.btn-primary:focus[disabled]:active,.btn-primary:focus[disabled]:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled]:active,.btn-primary[disa
 bled]:hover{opacity:.6;box-shadow:none;color:#D1E8D1;background-color:#3FAE2A;border:1px solid #3FAE2A}  .btn-secondary-disabled{opacity:.6;box-shadow:none;color:#D1E8D1;background-color:#429929;border:1px solid #3FAE2A}  .btn-secondary,.btn-secondary:focus{color:#429929;background-color:#FFF;border:1px solid #3FAE2A}  .btn-secondary:focus:hover,.btn-secondary:hover{color:#FFF;background-color:#429929}  .btn-secondary:active,.btn-secondary:focus:active{color:#429929;background-color:#FFF;box-shadow:0 0 2px 0 #1391c1}  .btn-secondary.disabled,.btn-secondary.disabled.active,.btn-secondary.disabled:active,.btn-secondary.disabled:hover,.btn-secondary:focus.disabled,.btn-secondary:focus.disabled.active,.btn-secondary:focus.disabled:active,.btn-secondary:focus.disabled:hover,.btn-secondary:focus[disabled],.btn-secondary:focus[disabled].active,.btn-secondary:focus[disabled]:active,.btn-secondary:focus[disabled]:hover,.btn-secondary[disabled],.btn-secondary[disabled].active,.btn-secondary[d
 isabled]:active,.btn-secondary[disabled]:hover{opacity:.6;box-shadow:none;color:#D1E8D1;background-color:#429929;border:1px solid #3FAE2A}  .btn-success{border:none}  .btn-regular-default-state{background-color:#FFF;color:#666;border:1px solid #cfd3d7}  .btn-primary-default-state{background-color:#3FAE2A;border:1px solid #3FAE2A;color:#FFF}  .btn-group.open .btn.dropdown-toggle,.dropdown.open .btn.dropdown-toggle{box-shadow:inset 0 0 3px 0 #1391c1}  .btn-group.open .btn.dropdown-toggle,.btn-group.open .btn.dropdown-toggle.btn-default,.btn-group.open .btn.dropdown-toggle.btn-default:hover,.btn-group.open .btn.dropdown-toggle:hover,.dropdown.open .btn.dropdown-toggle,.dropdown.open .btn.dropdown-toggle.btn-default,.dropdown.open .btn.dropdown-toggle.btn-default:hover,.dropdown.open .btn.dropdown-toggle:hover{background-color:#FFF;color:#666;border:1px solid #cfd3d7}  .btn-group.open .btn.dropdown-toggle+.dropdown-menu>li>a:hover,.btn-group.open .btn.dropdown-toggle.btn-default+.dropdo
 wn-menu>li>a:hover,.dropdown.open .btn.dropdown-toggle+.dropdown-menu>li>a:hover,.dropdown.open .btn.dropdown-toggle.btn-default+.dropdown-menu>li>a:hover{background-color:#808793;color:#FFF}  .btn-group.open .btn.dropdown-toggle.btn-primary,.btn-group.open .btn.dropdown-toggle.btn-primary:hover,.dropdown.open .btn.dropdown-toggle.btn-primary,.dropdown.open .btn.dropdown-toggle.btn-primary:hover{background-color:#3FAE2A;border:1px solid #3FAE2A;color:#FFF}  .btn-group.open .btn.dropdown-toggle.btn-primary+.dropdown-menu>li>a:hover,.dropdown.open .btn.dropdown-toggle.btn-primary+.dropdown-menu>li>a:hover{background-color:#429929;color:#FFF}  .btn-group.open .dropdown-menu,.dropdown.open .dropdown-menu{line-height:1;border-radius:2px;font-size:14px;min-width:200px;background:#FFF;color:#666;border:1px solid #cfd3d7}  .btn-group.open .dropdown-menu>li,.dropdown.open .dropdown-menu>li{margin-bottom:1px}  .btn-group.open .dropdown-menu>li>a,.dropdown.open .dropdown-menu>li>a{height:24px}
   .btn-group .btn.dropdown-toggle:first-child,.dropdown .btn.dropdown-toggle:first-child{min-width:80px}  .btn-group .btn.dropdown-toggle.disabled,.btn-group .btn.dropdown-toggle[disabled],.dropdown .btn.dropdown-toggle.disabled,.dropdown .btn.dropdown-toggle[disabled]{opacity:.6}  input.form-control{font-size:14px;border-radius:2px;color:#666;border:1px solid #CFD3D7;height:34px;padding:10px}  input.form-control:focus{border-color:#1291c1;box-shadow:none}  .help-block{color:#999;font-size:14px}  .help-block.validation-block{color:#999;margin-top:10px}  .help-block.validation-block::before{position:relative;top:2px;margin-right:5px;font-family:'Glyphicons Halflings'}  .wizard .wizard-body .wizard-content .step-description,.wizard .wizard-body .wizard-content .step-title,.wizard .wizard-header h3,h2.table-title{font-family:Roboto,sans-serif;font-style:normal}  .has-success input.form-control{color:#666;border:1px solid #1EB475}  .has-success input.form-control:focus{border-color:#1EB
 475;box-shadow:none}  .has-success .help-block.validation-block::before{content:'\e084';color:#1EB475}  .has-error input.form-control{color:#666;border:1px solid #EF6162}  .has-error input.form-control:focus{border-color:#EF6162;box-shadow:none}  .has-error .help-block.validation-block::before{content:'\e083';color:#EF6162}  .has-warning input.form-control{color:#666;border:1px solid #E98A40}  .has-warning input.form-control:focus{border-color:#E98A40;box-shadow:none}  .has-warning .help-block.validation-block::before{content:'\e101';color:#E98A40}  .form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{color:#999;border-color:#ccc;background-color:#ddd}  h2.table-title{font-weight:400;line-height:1;color:#333;margin-top:10px;font-size:20px}  .table{color:#666;font-size:13px}  .table tfoot,.table thead{color:#999}  .table input[type=checkbox]+label{position:relative;line-height:1.3em;font-size:initial;top:4px;margin-bottom:0}  .table thead>tr>th{border-bott
 om-color:#EEE}  .table tfoot>tr:first-of-type>td{border-top-width:2px;border-top-color:#EEE}  .table>tbody>tr>td{border-top-color:#EEE}  .table>tbody>tr.active,.table>tbody>tr.active>td{background-color:#EEE}  .table.table-hover .action{visibility:hidden;padding:0;line-height:1}  .table.table-hover>tbody>tr{border-width:0 1px 1px;border-style:solid;border-color:#EEE transparent}  .table.table-hover>tbody>tr>td{border-width:0}  .table.table-hover>tbody>tr:hover{border-color:#A7DFF2;background-color:#E7F6FC}  .table.table-hover>tbody>tr:hover>td{border-top:1px solid #A7DFF2;background-color:#E7F6FC}  .table.table-hover>tbody>tr:hover>td .action{visibility:visible}  .table.table-hover>tbody>tr:first-of-type>td{border-top:1px solid transparent}  .table.table-hover>tbody>tr:first-of-type:hover>td{border-color:#A7DFF2}  .pagination-block .pagination-block-item{float:left;padding:0 5px}  .pagination-block .pagination-block-item select{border:none;background-color:transparent;color:#1491C1}
   .nav.nav-tabs{border:none;margin-bottom:20px}  .nav.nav-tabs li a{border-width:0;border-radius:0;border-bottom:2px solid transparent;color:#666;text-transform:uppercase}  .nav.nav-tabs li a:active,.nav.nav-tabs li a:focus,.nav.nav-tabs li a:hover{color:#333;border-top-width:0;border-left-width:0;border-right-width:0;background:0 0}  .nav.nav-tabs li a .badge.badge-important{display:inline}  .nav.nav-tabs li.active a{color:#333;border-bottom:2px solid #3FAE2A}  .nav-tabs-left li,.nav-tabs-right li{float:none;margin-bottom:2px}  .nav-tabs-left li a,.nav-tabs-right li a{margin-right:0}  .nav-tabs-left li{margin-right:-1px}  .nav-tabs-left li a{border:2px solid transparent!important}  .nav-tabs-left li.active a,.nav-tabs-left li.active a:active,.nav-tabs-left li.active a:focus,.nav-tabs-left li.active a:hover{border-right:2px solid #3FAE2A!important}  .nav-tabs-right li{margin-left:-1px}  .nav-tabs-right li a{border:2px solid transparent!important}  .nav-tabs-right li.active a,.nav-ta
 bs-right li.active a:active,.nav-tabs-right li.active a:focus,.nav-tabs-right li.active a:hover{border-left:2px solid #3FAE2A!important}  .wizard{border:2px solid #ebecf1}  .wizard .wizard-header h3{font-weight:400;line-height:1;font-size:20px;color:#333;margin:15px 20px}  .wizard .wizard-body{overflow:hidden;margin:0}  .wizard .wizard-body .wizard-content{background:#ebecf1;padding-top:25px;float:left;margin-bottom:-99999px;padding-bottom:99999px}  .wizard .wizard-body .wizard-content .step-title{line-height:1;font-weight:700;font-size:18px;color:#666}  .wizard .wizard-body .wizard-content .step-description{font-weight:400;font-size:14px;line-height:1.4;color:#999}  .wizard .wizard-body .wizard-content .panel.panel-default{border:none;box-shadow:none;margin-top:20px}  .wizard .wizard-body .wizard-content .panel.panel-default .panel-body{padding:30px 20px}  .wizard .wizard-body .wizard-nav{min-height:550px;padding-top:25px;background-color:#323544;float:left;margin-bottom:-99999px;p
 adding-bottom:99999px}  .wizard .wizard-body .wizard-nav .nav li{padding:0 15px}  .wizard .wizard-body .wizard-nav .nav li a{height:48px;padding:0 5px;display:table-cell;vertical-align:middle}  .wizard .wizard-body .wizard-nav .nav li .step-marker{position:absolute;top:9px;line-height:16px;text-align:center;width:20px;height:20px;border:2px solid #1EB475;border-radius:50%;font-size:12px;font-style:inherit;color:#1EB475;background-color:#323544}  .wizard .wizard-body .wizard-nav .nav li .step-description,.wizard .wizard-body .wizard-nav .nav li .step-name{font-family:Roboto,sans-serif;font-weight:400;color:#999;margin-left:30px;font-style:normal}  .wizard .wizard-body .wizard-nav .nav li .step-name{line-height:1;font-size:14px}  .wizard .wizard-body .wizard-nav .nav li .step-index{line-height:18px}  .wizard .wizard-body .wizard-nav .nav li .step-description{line-height:1;font-size:12px}  .wizard .wizard-body .wizard-nav .nav li.completed .step-marker{background-color:#1EB475;color:#f
 ff;font-size:10px;padding-left:2px}  .wizard .wizard-body .wizard-nav .nav li.completed .step-marker .step-index{display:none}  .wizard .wizard-body .wizard-nav .nav li.completed .step-marker:after{font-family:"Glyphicons Halflings";content:"\e013";position:relative;top:1px;left:-1px}  .wizard .wizard-body .wizard-nav .nav li.completed:after{width:2px;height:100%;position:absolute;background-color:#1EB475;content:"";top:25px;left:29px}  .wizard .wizard-body .wizard-nav .nav li.completed:last-child:after{content:none}  .wizard .wizard-body .wizard-nav .nav li.active .step-name{font-weight:700}  .wizard .wizard-body .wizard-nav .nav li.disabled .step-marker{color:#666;border-color:#666}  .wizard .wizard-body .wizard-nav .nav li.disabled .step-description,.wizard .wizard-body .wizard-nav .nav li.disabled .step-name{color:#666}  .wizard .wizard-body .wizard-nav .nav li.disabled.completed .step-marker{background-color:#1EB475;border:2px solid #1EB475;color:#fff}  .wizard .wizard-body .wi
 zard-nav .nav-pills>li.active>a,.wizard .wizard-body .wizard-nav .nav-pills>li.active>a:focus,.wizard .wizard-body .wizard-nav .nav-pills>li.active>a:hover,.wizard .wizard-body .wizard-nav .nav>li>a:focus,.wizard .wizard-body .wizard-nav .nav>li>a:hover{background-color:inherit}  .wizard .wizard-body .wizard-footer{background:#fff;padding:15px 20px}  .wizard .wizard-body .wizard-footer button{margin:0 10px}  .checkbox-disabled-style{background-color:#b2b8c1;border-color:#b2b8c1}  input[type=radio]:checked,input[type=radio]:not(:checked),input[type=checkbox]:checked,input[type=checkbox]:not(:checked){display:none}  input[type=radio]:checked+label,input[type=radio]:not(:checked)+label,input[type=checkbox]:checked+label,input[type=checkbox]:not(:checked)+label{position:relative;padding-left:20px}  input[type=radio]:checked+label:hover:before,input[type=radio]:not(:checked)+label:hover:before,input[type=checkbox]:checked+label:hover:before,input[type=checkbox]:not(:checked)+label:hover:
 before{border-color:#1491C1;background-color:#1491C1}  input[type=radio]:checked+label:before,input[type=checkbox]:checked+label:before{background-color:#1491C1;border-color:#1491C1}  input[type=radio].disabled+label:before,input[type=radio].disabled+label:hover:before,input[type=radio][disabled]+label:before,input[type=radio][disabled]+label:hover:before,input[type=checkbox].disabled+label:before,input[type=checkbox].disabled+label:hover:before,input[type=checkbox][disabled]+label:before,input[type=checkbox][disabled]+label:hover:before{background-color:#b2b8c1;border-color:#b2b8c1}  input[type=checkbox]+label:before{content:'';position:absolute;left:0;top:4px;width:10px;height:10px;-moz-box-sizing:border-box;box-sizing:border-box;border-radius:2px;border-width:1px;border-style:solid;border-color:#ddd}  input[type=checkbox]:checked+label:after{content:'\2714';color:#FFF;position:absolute;top:0;left:2px;font-size:9px}  input.radio+label:before,input[type=radio]+label:before{content:
 '';position:absolute;left:0;top:0;width:12px;height:12px;-moz-box-sizing:border-box;box-sizing:border-box;border-radius:12px;border-width:1px;border-style:solid;border-color:#ddd}  input.radio:checked+label:after,input[type=radio]:checked+label:after{content:'';background-color:#FFF;position:absolute;top:3px;left:3px;width:6px;height:6px;border-radius:6px}  .navigation-bar-container,.navigation-bar-container ul.nav.side-nav-header{width:230px;transition:width .5s ease-out}  .navigation-bar-container{height:auto;background-color:#323544;padding:0;-ms-overflow-style:none;-webkit-font-smoothing:antialiased}  .navigation-bar-container ul.nav.side-nav-header li.navigation-header{background:#313d54;padding:15px 5px 15px 25px;height:55px}  .navigation-bar-container ul.nav.side-nav-header li.navigation-header>a.ambari-logo{padding:0}  .navigation-bar-container ul.nav.side-nav-header li.navigation-header>a.ambari-logo>img{height:25px;float:left;margin-left:-3px}  .navigation-bar-container ul
 .nav.side-nav-header li.navigation-header .btn-group{cursor:pointer;margin-top:3px}  .navigation-bar-container ul.nav.side-nav-header li.navigation-header .btn-group:hover span.ambari-header,.navigation-bar-container ul.nav.side-nav-header li.navigation-header .btn-group:hover span.toggle-icon{color:#fff}  .navigation-bar-container ul.nav.side-nav-header li.navigation-header .btn-group span.ambari-header{font-family:Roboto,sans-serif;font-weight:400;font-style:normal;line-height:1;font-size:20px;width:55px;display:inline;color:#b8bec4;padding:0 8px 0 10px}  .navigation-bar-container ul.nav.side-nav-header li.navigation-header .btn-group span.toggle-icon{margin-bottom:5px;font-size:13px;display:inline-block;vertical-align:middle;color:#b8bec4}  .navigation-bar-container ul.nav.side-nav-header li.navigation-header .btn-group.open .dropdown-toggle{box-shadow:none}  .navigation-bar-container ul.nav.side-nav-header li.navigation-header ul.dropdown-menu{top:30px}  .navigation-bar-containe
 r ul.nav.side-nav-header li.navigation-header ul.dropdown-menu li>a{font-family:Roboto,sans-serif;font-weight:400;font-style:normal;font-size:14px;color:#666;line-height:1.42;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}  .navigation-bar-container ul.nav.side-nav-header li.navigation-header ul.dropdown-menu li>a:hover{background:#f5f5f5}  .navigation-bar-container ul.nav.side-nav-footer,.navigation-bar-container ul.nav.side-nav-menu{background-color:#323544;width:230px;transition:width .5s ease-out}  .navigation-bar-container ul.nav.side-nav-footer li,.navigation-bar-container ul.nav.side-nav-menu li{padding:0;margin:0}  .navigation-bar-container ul.nav.side-nav-footer li.mainmenu-li>a,.navigation-bar-container ul.nav.side-nav-footer li.navigation-footer>a,.navigation-bar-container ul.nav.side-nav-footer li.submenu-li>a,.navigation-bar-container ul.nav.side-nav-menu li.mainmenu-li>a,.navigation-bar-container ul.nav.side-nav-menu li.navigation-footer>a,.navigation-bar-co
 ntainer ul.nav.side-nav-menu li.submenu-li>a{display:table-cell;vertical-align:middle;width:230px;border-radius:0;-moz-border-radius:0;-webkit-border-radius:0;white-space:nowrap}  .navigation-bar-container ul.nav.side-nav-footer li.mainmenu-li>a .navigation-menu-item,.navigation-bar-container ul.nav.side-nav-footer li.navigation-footer>a .navigation-menu-item,.navigation-bar-container ul.nav.side-nav-footer li.submenu-li>a .navigation-menu-item,.navigation-bar-container ul.nav.side-nav-menu li.mainmenu-li>a .navigation-menu-item,.navigation-bar-container ul.nav.side-nav-menu li.navigation-footer>a .navigation-menu-item,.navigation-bar-container ul.nav.side-nav-menu li.submenu-li>a .navigation-menu-item{font-family:Roboto,sans-serif;font-weight:400;font-style:normal;line-height:1;font-size:14px;color:#b8bec4;padding-left:8px}  .navigation-bar-container ul.nav.side-nav-footer li.mainmenu-li>a .navigation-icon,.navigation-bar-container ul.nav.side-nav-footer li.navigation-footer>a .nav
 igation-icon,.navigation-bar-container ul.nav.side-nav-footer li.submenu-li>a .navigation-icon,.navigation-bar-container ul.nav.side-nav-menu li.mainmenu-li>a .navigation-icon,.navigation-bar-container ul.nav.side-nav-menu li.navigation-footer>a .navigation-icon,.navigation-bar-container ul.nav.side-nav-menu li.submenu-li>a .navigation-icon{line-height:18px;font-size:18px;color:#b8bec4}  .navigation-bar-container ul.nav.side-nav-footer li.mainmenu-li>a .toggle-icon,.navigation-bar-container ul.nav.side-nav-footer li.navigation-footer>a .toggle-icon,.navigation-bar-container ul.nav.side-nav-footer li.submenu-li>a .toggle-icon,.navigation-bar-container ul.nav.side-nav-menu li.mainmenu-li>a .toggle-icon,.navigation-bar-container ul.nav.side-nav-menu li.navigation-footer>a .toggle-icon,.navigation-bar-container ul.nav.side-nav-menu li.submenu-li>a .toggle-icon{line-height:14px;font-size:14px;color:#b8bec4;padding:3px 5px 3px 10px}  .navigation-bar-container ul.nav.side-nav-footer li.mai
 nmenu-li>a,.navigation-bar-container ul.nav.side-nav-footer li.navigation-footer>a,.navigation-bar-container ul.nav.side-nav-menu li.mainmenu-li>a,.navigation-bar-container ul.nav.side-nav-menu li.navigation-footer>a{padding:10px 5px 10px 20px}  .navigation-bar-container ul.nav.side-nav-footer li.submenu-li>a,.navigation-bar-container ul.nav.side-nav-menu li.submenu-li>a{padding:10px 5px 10px 25px}  .navigation-bar-container ul.nav.side-nav-footer li.navigation-footer,.navigation-bar-container ul.nav.side-nav-menu li.navigation-footer{background:#313d54;height:50px}  .navigation-bar-container ul.nav.side-nav-footer li.navigation-footer a .navigation-icon,.navigation-bar-container ul.nav.side-nav-menu li.navigation-footer a .navigation-icon{color:#31823a;font-size:20px;position:relative;padding:0 15px;left:calc(30%)}  .navigation-bar-container ul.nav.side-nav-footer li.navigation-footer a .navigation-icon:hover,.navigation-bar-container ul.nav.side-nav-menu li.navigation-footer a .na
 vigation-icon:hover{color:#fff}  .navigation-bar-container ul.nav.side-nav-footer li>ul>li,.navigation-bar-container ul.nav.side-nav-menu li>ul>li{background-color:#323544}  .navigation-bar-container ul.nav.side-nav-footer li>ul>li a,.navigation-bar-container ul.nav.side-nav-menu li>ul>li a{font-family:Roboto,sans-serif;font-weight:400;font-style:normal;line-height:1;font-size:14px;color:#999}  .navigation-bar-container ul.nav.side-nav-footer li>ul>li a .submenu-icon,.navigation-bar-container ul.nav.side-nav-menu li>ul>li a .submenu-icon{line-height:14px;font-size:14px}  .navigation-bar-container ul.nav.side-nav-footer li>a:hover,.navigation-bar-container ul.nav.side-nav-footer li>ul>li>a:hover,.navigation-bar-container ul.nav.side-nav-menu li>a:hover,.navigation-bar-container ul.nav.side-nav-menu li>ul>li>a:hover{background:#404351;cursor:pointer;color:#fff}  .navigation-bar-container ul.nav.side-nav-footer li>a:hover .navigation-icon,.navigation-bar-container ul.nav.side-nav-foote
 r li>a:hover .navigation-menu-item,.navigation-bar-container ul.nav.side-nav-footer li>a:hover .submenu-item,.navigation-bar-container ul.nav.side-nav-footer li>a:hover .toggle-icon,.navigation-bar-container ul.nav.side-nav-footer li>ul>li>a:hover .navigation-icon,.navigation-bar-container ul.nav.side-nav-footer li>ul>li>a:hover .navigation-menu-item,.navigation-bar-container ul.nav.side-nav-footer li>ul>li>a:hover .submenu-item,.navigation-bar-container ul.nav.side-nav-footer li>ul>li>a:hover .toggle-icon,.navigation-bar-container ul.nav.side-nav-menu li>a:hover .navigation-icon,.navigation-bar-container ul.nav.side-nav-menu li>a:hover .navigation-menu-item,.navigation-bar-container ul.nav.side-nav-menu li>a:hover .submenu-item,.navigation-bar-container ul.nav.side-nav-menu li>a:hover .toggle-icon,.navigation-bar-container ul.nav.side-nav-menu li>ul>li>a:hover .navigation-icon,.navigation-bar-container ul.nav.side-nav-menu li>ul>li>a:hover .navigation-menu-item,.navigation-bar-cont
 ainer ul.nav.side-nav-menu li>ul>li>a:hover .submenu-item,.navigation-bar-container ul.nav.side-nav-menu li>ul>li>a:hover .toggle-icon{color:#fff}  .navigation-bar-container ul.nav.side-nav-footer li.active.collapsed,.navigation-bar-container ul.nav.side-nav-footer li.active:not(.has-sub-menu),.navigation-bar-container ul.nav.side-nav-menu li.active.collapsed,.navigation-bar-container ul.nav.side-nav-menu li.active:not(.has-sub-menu){background:#404351;cursor:pointer}  .navigation-bar-container ul.nav.side-nav-footer li.active.collapsed>a,.navigation-bar-container ul.nav.side-nav-footer li.active:not(.has-sub-menu)>a,.navigation-bar-container ul.nav.side-nav-menu li.active.collapsed>a,.navigation-bar-container ul.nav.side-nav-menu li.active:not(.has-sub-menu)>a{color:#fff}  .navigation-bar-container ul.nav.side-nav-footer li.active.collapsed>a .navigation-icon,.navigation-bar-container ul.nav.side-nav-footer li.active.collapsed>a .navigation-menu-item,.navigation-bar-container ul.na
 v.side-nav-footer li.active.collapsed>a .submenu-item,.navigation-bar-container ul.nav.side-nav-footer li.active.collapsed>a .toggle-icon,.navigation-bar-container ul.nav.side-nav-footer li.active:not(.has-sub-menu)>a .navigation-icon,.navigation-bar-container ul.nav.side-nav-footer li.active:not(.has-sub-menu)>a .navigation-menu-item,.navigation-bar-container ul.nav.side-nav-footer li.active:not(.has-sub-menu)>a .submenu-item,.navigation-bar-container ul.nav.side-nav-footer li.active:not(.has-sub-menu)>a .toggle-icon,.navigation-bar-container ul.nav.side-nav-menu li.active.collapsed>a .navigation-icon,.navigation-bar-container ul.nav.side-nav-menu li.active.collapsed>a .navigation-menu-item,.navigation-bar-container ul.nav.side-nav-menu li.active.collapsed>a .submenu-item,.navigation-bar-container ul.nav.side-nav-menu li.active.collapsed>a .toggle-icon,.navigation-bar-container ul.nav.side-nav-menu li.active:not(.has-sub-menu)>a .navigation-icon,.navigation-bar-container ul.nav.sid
 e-nav-menu li.active:not(.has-sub-menu)>a .navigation-menu-item,.navigation-bar-container ul.nav.side-nav-menu li.active:not(.has-sub-menu)>a .submenu-item,.navigation-bar-container ul.nav.side-nav-menu li.active:not(.has-sub-menu)>a .toggle-icon{color:#fff}  .navigation-bar-container ul.nav.side-nav-footer li.active.collapsed>a:after,.navigation-bar-container ul.nav.side-nav-footer li.active:not(.has-sub-menu)>a:after,.navigation-bar-container ul.nav.side-nav-menu li.active.collapsed>a:after,.navigation-bar-container ul.nav.side-nav-menu li.active:not(.has-sub-menu)>a:after{left:0;top:50%;border:solid transparent;border-width:10px 7px;content:" ";height:0;width:0;position:absolute;pointer-events:none;border-color:transparent transparent transparent #31823a;margin-top:-12px}  .navigation-bar-container ul.nav.side-nav-footer .more-actions,.navigation-bar-container ul.nav.side-nav-menu .more-actions{display:none;position:absolute;top:14px;right:33px;line-height:25px;width:20px;text-al
 ign:center;font-size:14px;cursor:pointer;vertical-align:middle;color:#fff}  .navigation-bar-container.collapsed,.navigation-bar-container.collapsed ul.nav.side-nav-footer,.navigation-bar-container.collapsed ul.nav.side-nav-header,.navigation-bar-container.collapsed ul.nav.side-nav-menu{width:50px}  .navigation-bar-container ul.nav.side-nav-footer .more-actions .dropdown-menu>li>a,.navigation-bar-container ul.nav.side-nav-footer .more-actions .dropdown-menu>li>a i,.navigation-bar-container ul.nav.side-nav-menu .more-actions .dropdown-menu>li>a,.navigation-bar-container ul.nav.side-nav-menu .more-actions .dropdown-menu>li>a i{color:#666}  .navigation-bar-container ul.nav.side-nav-footer .more-actions .dropdown-menu>li>a:hover,.navigation-bar-container ul.nav.side-nav-menu .more-actions .dropdown-menu>li>a:hover{background:#f5f5f5}  .navigation-bar-container ul.nav.side-nav-footer .menu-item-name,.navigation-bar-container ul.nav.side-nav-menu .menu-item-name{display:inline-block;vertic
 al-align:bottom;max-width:100px;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis;-ms-text-overflow:ellipsis;white-space:nowrap}  .navigation-bar-container.collapsed ul.nav.side-nav-footer .more-actions,.navigation-bar-container.collapsed ul.nav.side-nav-footer li a .navigation-menu-item,.navigation-bar-container.collapsed ul.nav.side-nav-footer li a .toggle-icon,.navigation-bar-container.collapsed ul.nav.side-nav-header li.navigation-header .dropdown-menu,.navigation-bar-container.collapsed ul.nav.side-nav-header li.navigation-header span.ambari-header,.navigation-bar-container.collapsed ul.nav.side-nav-header li.navigation-header span.toggle-icon,.navigation-bar-container.collapsed ul.nav.side-nav-menu .more-actions,.navigation-bar-container.collapsed ul.nav.side-nav-menu li a .navigation-menu-item,.navigation-bar-container.collapsed ul.nav.side-nav-menu li a .toggle-icon{display:none}  .navigation-bar-container .nav-pills>li.active>a,.navigation-bar-container .nav-
 pills>li.active>a:focus,.navigation-bar-container .nav-pills>li.active>a:hover,.navigation-bar-container .nav>li>a:focus,.navigation-bar-container .nav>li>a:hover{background-color:inherit}  .navigation-bar-container.collapsed ul.nav.side-nav-header li.navigation-header{padding:15px 0 15px 15px}  .navigation-bar-container.collapsed ul.nav.side-nav-footer li a,.navigation-bar-container.collapsed ul.nav.side-nav-menu li a{padding:15px 0 15px 15px;width:50px}  .navigation-bar-container.collapsed ul.nav.side-nav-footer li.navigation-footer a .navigation-icon,.navigation-bar-container.collapsed ul.nav.side-nav-menu li.navigation-footer a .navigation-icon{padding:0 5px;left:0}  .navigation-bar-container.collapsed ul.nav.side-nav-footer li ul.sub-menu,.navigation-bar-container.collapsed ul.nav.side-nav-menu li ul.sub-menu{display:none;width:230px;position:absolute;z-index:100;top:0;left:50px}  .navigation-bar-container.collapsed ul.nav.side-nav-footer li.submenu-li>a,.navigation-bar-contain
 er.collapsed ul.nav.side-nav-menu li.submenu-li>a{padding:10px 5px 10px 25px;width:230px}  .navigation-bar-container.collapsed ul.nav.side-nav-footer li.active,.navigation-bar-container.collapsed ul.nav.side-nav-menu li.active{background:#404351;cursor:pointer}  .navigation-bar-container.collapsed ul.nav.side-nav-footer li.active>a,.navigation-bar-container.collapsed ul.nav.side-nav-footer li.active>a .navigation-icon,.navigation-bar-container.collapsed ul.nav.side-nav-footer li.active>a .navigation-menu-item,.navigation-bar-container.collapsed ul.nav.side-nav-footer li.active>a .submenu-item,.navigation-bar-container.collapsed ul.nav.side-nav-footer li.active>a .toggle-icon,.navigation-bar-container.collapsed ul.nav.side-nav-menu li.active>a,.navigation-bar-container.collapsed ul.nav.side-nav-menu li.active>a .navigation-icon,.navigation-bar-container.collapsed ul.nav.side-nav-menu li.active>a .navigation-menu-item,.navigation-bar-container.collapsed ul.nav.side-nav-menu li.active>
 a .submenu-item,.navigation-bar-container.collapsed ul.nav.side-nav-menu li.active>a .toggle-icon{color:#fff}  .navigation-bar-container.collapsed ul.nav.side-nav-footer li.active>a:after,.navigation-bar-container.collapsed ul.nav.side-nav-menu li.active>a:after{left:0;top:50%;border:solid transparent;border-width:12px 6px;content:" ";height:0;width:0;position:absolute;pointer-events:none;border-color:transparent transparent transparent #31823a;margin-top:-12px}  .navigation-bar-fit-height{position:fixed;top:0;bottom:0;left:0;z-index:2079}  .navigation-bar-fit-height .side-nav-header{position:absolute;top:0}  .navigation-bar-fit-height .side-nav-menu{position:absolute;top:55px;bottom:50px}  .navigation-bar-fit-height .side-nav-footer{position:absolute;bottom:0}  .navigation-bar-fit-height .more-actions .dropdown-menu{position:fixed;top:auto;left:auto}  .navigation-bar-fit-height .navigation-bar-container{height:100%}  .navigation-bar-fit-height .navigation-bar-container .side-nav-me
 nu{overflow-y:auto}  .notifications-group{position:relative;top:1px}  #notifications-dropdown.dropdown-menu{min-width:300px;max-width:300px;min-height:150px;padding:0;z-index:1000;right:-50px;left:auto;top:260%;border:none;box-shadow:0 2px 10px 2px rgba(0,0,0,.29)}  #notifications-dropdown.dropdown-menu .popup-arrow-up{position:absolute;right:37px;top:-40px;width:40px;height:40px;overflow:hidden}  #notifications-dropdown.dropdown-menu .popup-arrow-up:after{content:"";position:absolute;width:20px;height:20px;background:#fff;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);top:30px;left:10px;box-shadow:-1px -1px 10px -2px rgba(0,0,0,.5)}  #notifications-dropdown.dropdown-menu .notifications-header{border-bottom:1px solid #eee;padding:15px 20px}  #notifications-dropdown.dropdown-menu .notifications-header .notifications-title{font-family:Roboto,sans-serif;font-weight:400;font-style:normal;line-height:1;color:#333;font-size:16px}  #notifications-dropdo
 wn.dropdown-menu .notifications-body{padding:0 15px;overflow:auto;max-height:500px}  #notifications-dropdown.dropdown-menu .notifications-body .no-alert-text{padding:15px 5px}  #notifications-dropdown.dropdown-menu .notifications-body .table-controls{padding:10px 0;margin:0;border-bottom:1px solid #eee}  #notifications-dropdown.dropdown-menu .notifications-body .table-controls .state-filter{padding:0;font-family:Roboto,sans-serif;font-weight:400;font-style:normal;line-height:1;font-size:12px;color:#666;position:relative}  #notifications-dropdown.dropdown-menu .notifications-body .table-controls .state-filter .form-control.filter-select{font-size:12px;color:#666;height:25px}  #notifications-dropdown.dropdown-menu .notifications-body .table.alerts-table{margin-top:0}  #notifications-dropdown.dropdown-menu .notifications-body .table.alerts-table tbody tr{cursor:pointer}  #notifications-dropdown.dropdown-menu .notifications-body .table.alerts-table tbody tr.no-alert-tr:hover{cursor:defa
 ult;border-color:transparent transparent #eee}  #notifications-dropdown.dropdown-menu .notifications-body .table.alerts-table tbody tr.no-alert-tr:hover>td{border-color:transparent;background-color:#fff}  #notifications-dropdown.dropdown-menu .notifications-body .table.alerts-table tbody td.status{width:9%;padding:15px 3px}  #notifications-dropdown.dropdown-menu .notifications-body .table.alerts-table tbody td.status .alert-state-CRITICAL{color:#EF6162}  #notifications-dropdown.dropdown-menu .notifications-body .table.alerts-table tbody td.status .alert-state-WARNING{color:#E98A40}  #notifications-dropdown.dropdown-menu .notifications-body .table.alerts-table tbody td.content{width:90%;padding:15px 3px 10px;font-family:Roboto,sans-serif;font-weight:400;font-style:normal;color:#333;line-height:1.3}  #notifications-dropdown.dropdown-menu .notifications-body .table.alerts-table tbody td.content .name{font-weight:700;font-size:14px;color:#333;margin-bottom:5px}  #notifications-dropdown.
 dropdown-menu .notifications-body .table.alerts-table tbody td.content .description{font-size:12px;color:#666;margin-bottom:4px;display:block;display:-webkit-box;-webkit-line-clamp:3;max-height:47px;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;word-break:break-word;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}  #notifications-dropdown.dropdown-menu .notifications-body .table.alerts-table tbody td.content .timestamp{text-align:right;font-size:11px;color:#999}  #notifications-dropdown.dropdown-menu .notifications-footer{border-top:1px solid #eee;padding:15px}  .modal-backdrop{background-color:grey}  .modal .modal-content{border-radius:2px}  .modal .modal-content .modal-body,.modal .modal-content .modal-footer,.modal .modal-content .modal-header{padding-left:20px;padding-right:20px}  .modal .modal-content .modal-header{border-bottom:none;padding-top:
 20px;color:#666;font-size:20px}  .modal .modal-content .modal-header h4{margin:0;color:inherit;font-size:inherit}  .modal .modal-content .modal-body{color:#666;font-size:12px}  .modal .modal-content .modal-footer{border-top:none;padding-bottom:20px}  .modal .modal-content .modal-footer .btn~.btn{margin-left:10px}  .accordion .panel-group,.wizard .wizard-body .wizard-content .accordion .panel-group{margin-bottom:0}  .accordion .panel-group .panel,.wizard .wizard-body .wizard-content .accordion .panel-group .panel{border-radius:0;border:none;margin-top:0}  .accordion .panel-group .panel .panel-heading,.wizard .wizard-body .wizard-content .accordion .panel-group .panel .panel-heading{height:50px;padding:15px 10px;border:1px solid;border-color:#ddd transparent;border-top:none;background:#fff}  .accordion .panel-group .panel .panel-heading .panel-title,.wizard .wizard-body .wizard-content .accordion .panel-group .panel .panel-heading .panel-title{font-family:Roboto,sans-serif;font-weight
 :400;font-style:normal;line-height:1;color:#333}  .accordion .panel-group .panel .panel-heading .panel-title>a,.wizard .wizard-body .wizard-content .accordion .panel-group .panel .panel-heading .panel-title>a{font-size:18px;color:#333}  .accordion .panel-group .panel .panel-heading .panel-title>i,.wizard .wizard-body .wizard-content .accordion .panel-group .panel .panel-heading .panel-title>i{font-size:20px;color:#1491c1}  .accordion .panel-group .panel .panel-heading:hover,.wizard .wizard-body .wizard-content .accordion .panel-group .panel .panel-heading:hover{background:#f3faff;cursor:pointer}  .accordion .panel-group .panel .panel-body,.wizard .wizard-body .wizard-content .accordion .panel-group .panel .panel-body{padding:15px 10px 20px 20px}  .h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif}  .h1,h1{font-size:24px}  .h2,h2{font-size:18px}  .body,body{font-family:Roboto,sans-serif;font-weight:400;font-style:normal;line-height:1;color:#333;font-size:14px}  .
 description{font-family:Roboto,sans-serif;font-size:12px;color:#000}  a,a:focus,a:visited{color:#1491C1}  a:focus:hover,a:hover,a:visited:hover{text-decoration:underline}  a.disabled:hover,a:active,a:focus.disabled:hover,a:focus:active,a:focus[disabled]:hover,a:visited.disabled:hover,a:visited:active,a:visited[disabled]:hover,a[disabled]:hover{text-decoration:none}  a.disabled,a:focus.disabled,a:focus[disabled],a:visited.disabled,a:visited[disabled],a[disabled]{cursor:not-allowed;color:#666;text-decoration:none}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/fonts/Roboto-Regular-webfont.eot
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/fonts/Roboto-Regular-webfont.eot b/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/fonts/Roboto-Regular-webfont.eot
new file mode 100644
index 0000000..d4e185d
Binary files /dev/null and b/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/fonts/Roboto-Regular-webfont.eot differ


[03/21] ambari git commit: AMBARI-21311 Log Search UI: add missing license. (ababiichuk)

Posted by ab...@apache.org.
AMBARI-21311 Log Search UI: add missing license. (ababiichuk)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/70633c5f
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/70633c5f
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/70633c5f

Branch: refs/heads/branch-feature-logsearch-ui
Commit: 70633c5f26a918f98693a69c007fa17df2619f2e
Parents: 4ce2f2c
Author: ababiichuk <ab...@hortonworks.com>
Authored: Fri Apr 28 14:40:04 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jun 22 14:54:55 2017 +0300

----------------------------------------------------------------------
 .../ambari-logsearch-web-new/e2e/app.e2e-spec.ts  | 18 ++++++++++++++++++
 .../ambari-logsearch-web-new/e2e/app.po.ts        | 18 ++++++++++++++++++
 .../ambari-logsearch-web-new/karma.conf.js        | 18 ++++++++++++++++++
 .../ambari-logsearch-web-new/protractor.conf.js   | 18 ++++++++++++++++++
 .../ambari-logsearch-web-new/src/index.html       | 17 +++++++++++++++++
 .../ambari-logsearch-web-new/src/main.ts          | 18 ++++++++++++++++++
 .../ambari-logsearch-web-new/src/polyfills.ts     | 18 ++++++++++++++++++
 .../ambari-logsearch-web-new/src/test.ts          | 18 ++++++++++++++++++
 .../ambari-logsearch-web-new/src/typings.d.ts     | 18 ++++++++++++++++++
 9 files changed, 161 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/70633c5f/ambari-logsearch/ambari-logsearch-web-new/e2e/app.e2e-spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/e2e/app.e2e-spec.ts b/ambari-logsearch/ambari-logsearch-web-new/e2e/app.e2e-spec.ts
index a9f0798..3813a3d 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/e2e/app.e2e-spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/e2e/app.e2e-spec.ts
@@ -1,3 +1,21 @@
+/**
+ * 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.
+ */
+
 import { AmbariLogsearchWebNewPage } from './app.po';
 
 describe('ambari-logsearch-web-new App', () => {

http://git-wip-us.apache.org/repos/asf/ambari/blob/70633c5f/ambari-logsearch/ambari-logsearch-web-new/e2e/app.po.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/e2e/app.po.ts b/ambari-logsearch/ambari-logsearch-web-new/e2e/app.po.ts
index 0dab904..c446bfb 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/e2e/app.po.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/e2e/app.po.ts
@@ -1,3 +1,21 @@
+/**
+ * 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.
+ */
+
 import { browser, element, by } from 'protractor';
 
 export class AmbariLogsearchWebNewPage {

http://git-wip-us.apache.org/repos/asf/ambari/blob/70633c5f/ambari-logsearch/ambari-logsearch-web-new/karma.conf.js
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/karma.conf.js b/ambari-logsearch/ambari-logsearch-web-new/karma.conf.js
index 84b4cd5..0512808 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/karma.conf.js
+++ b/ambari-logsearch/ambari-logsearch-web-new/karma.conf.js
@@ -1,3 +1,21 @@
+/**
+ * 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.
+ */
+
 // Karma configuration file, see link for more information
 // https://karma-runner.github.io/0.13/config/configuration-file.html
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/70633c5f/ambari-logsearch/ambari-logsearch-web-new/protractor.conf.js
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/protractor.conf.js b/ambari-logsearch/ambari-logsearch-web-new/protractor.conf.js
index 1c5e1e5..6b4a31c 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/protractor.conf.js
+++ b/ambari-logsearch/ambari-logsearch-web-new/protractor.conf.js
@@ -1,3 +1,21 @@
+/**
+ * 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.
+ */
+
 // Protractor configuration file, see link for more information
 // https://github.com/angular/protractor/blob/master/lib/config.ts
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/70633c5f/ambari-logsearch/ambari-logsearch-web-new/src/index.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/index.html b/ambari-logsearch/ambari-logsearch-web-new/src/index.html
index b067fe4..f1c1562 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/index.html
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/index.html
@@ -1,3 +1,20 @@
+<!--
+  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.
+-->
+
 <!doctype html>
 <html>
 <head>

http://git-wip-us.apache.org/repos/asf/ambari/blob/70633c5f/ambari-logsearch/ambari-logsearch-web-new/src/main.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/main.ts b/ambari-logsearch/ambari-logsearch-web-new/src/main.ts
index a9ca1ca..e3aeec1 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/main.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/main.ts
@@ -1,3 +1,21 @@
+/**
+ * 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.
+ */
+
 import { enableProdMode } from '@angular/core';
 import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/70633c5f/ambari-logsearch/ambari-logsearch-web-new/src/polyfills.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/polyfills.ts b/ambari-logsearch/ambari-logsearch-web-new/src/polyfills.ts
index 53bdaf1..741b82a 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/polyfills.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/polyfills.ts
@@ -1,4 +1,22 @@
 /**
+ * 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.
+ */
+
+/**
  * This file includes polyfills needed by Angular and is loaded before the app.
  * You can add your own extra polyfills to this file.
  *

http://git-wip-us.apache.org/repos/asf/ambari/blob/70633c5f/ambari-logsearch/ambari-logsearch-web-new/src/test.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/test.ts b/ambari-logsearch/ambari-logsearch-web-new/src/test.ts
index 9bf7226..6597b1c 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/test.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/test.ts
@@ -1,3 +1,21 @@
+/**
+ * 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.
+ */
+
 // This file is required by karma.conf.js and loads recursively all the .spec and framework files
 
 import 'zone.js/dist/long-stack-trace-zone';

http://git-wip-us.apache.org/repos/asf/ambari/blob/70633c5f/ambari-logsearch/ambari-logsearch-web-new/src/typings.d.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/typings.d.ts b/ambari-logsearch/ambari-logsearch-web-new/src/typings.d.ts
index ef5c7bd..e4a302b 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/typings.d.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/typings.d.ts
@@ -1,3 +1,21 @@
+/**
+ * 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.
+ */
+
 /* SystemJS module definition */
 declare var module: NodeModule;
 interface NodeModule {


[14/21] ambari git commit: AMBARI-21319 Log Search UI: provide compatibility with IE11. (ababiichuk)

Posted by ab...@apache.org.
AMBARI-21319 Log Search UI: provide compatibility with IE11. (ababiichuk)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/ae40a5f1
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/ae40a5f1
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/ae40a5f1

Branch: refs/heads/branch-feature-logsearch-ui
Commit: ae40a5f16f5992a9b9751edd22188cb70c9ffec2
Parents: c57329c
Author: ababiichuk <ab...@hortonworks.com>
Authored: Thu Jun 1 17:29:02 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jun 22 15:38:35 2017 +0300

----------------------------------------------------------------------
 ambari-logsearch/ambari-logsearch-web-new/src/polyfills.ts | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/ae40a5f1/ambari-logsearch/ambari-logsearch-web-new/src/polyfills.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/polyfills.ts b/ambari-logsearch/ambari-logsearch-web-new/src/polyfills.ts
index 741b82a..0ab921a 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/polyfills.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/polyfills.ts
@@ -38,15 +38,15 @@
 
 /** IE9, IE10 and IE11 requires all of the following polyfills. **/
 // import 'core-js/es6/symbol';
-// import 'core-js/es6/object';
+import 'core-js/es6/object';
 // import 'core-js/es6/function';
 // import 'core-js/es6/parse-int';
 // import 'core-js/es6/parse-float';
 // import 'core-js/es6/number';
 // import 'core-js/es6/math';
-// import 'core-js/es6/string';
+import 'core-js/es6/string';
 // import 'core-js/es6/date';
-// import 'core-js/es6/array';
+import 'core-js/es6/array';
 // import 'core-js/es6/regexp';
 // import 'core-js/es6/map';
 // import 'core-js/es6/set';


[11/21] ambari git commit: AMBARI-21313 Log Search UI: implement service for string constants (additional patch). (ababiichuk)

Posted by ab...@apache.org.
AMBARI-21313 Log Search UI: implement service for string constants (additional patch). (ababiichuk)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/84a59d71
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/84a59d71
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/84a59d71

Branch: refs/heads/branch-feature-logsearch-ui
Commit: 84a59d71183edfbb85de1090a5aa1092d60621cf
Parents: e71ad96
Author: ababiichuk <ab...@hortonworks.com>
Authored: Thu Jun 22 15:32:08 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jun 22 15:32:08 2017 +0300

----------------------------------------------------------------------
 .../app/menu-button/menu-button.component.html  |    4 +-
 .../app/menu-button/menu-button.component.ts    |   22 +-
 .../src/app/top-menu/top-menu.component.ts      |   40 +-
 .../ambari-logsearch-web-new/yarn.lock          | 5312 ++++++++++++++++++
 4 files changed, 5357 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/84a59d71/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html
index 6bdbac4..1afe6c0 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html
@@ -16,13 +16,13 @@
 -->
 
 <div #dropdown [ngClass]="{'dropdown': hasSubItems, 'text-center': true}">
-  <span (mousedown)="onMouseDown()" (mouseup)="onMouseUp($event)" (click)="$event.stopPropagation()">
+  <span (mousedown)="onMouseDown($event)" (mouseup)="onMouseUp($event)" (click)="$event.stopPropagation()">
     <a *ngIf="title" class="icon" [ngClass]="iconClassNames"></a>
     <span *ngIf="!title" class="icon" [ngClass]="iconClassNames"></span>
   </span>
   <a #dropdownToggle [ngClass]="{'dropdown-toggle': hasSubItems, 'caret': true}" [attr.data-toggle]="hasSubItems ? 'dropdown': null" *ngIf="hasSubItems"></a>
   <br>
-  <span class="icon-title" *ngIf="title" (mousedown)="onMouseDown()" (mouseup)="onMouseUp($event)" (click)="$event.stopPropagation()">{{title | translate}}</span>
+  <span class="icon-title" *ngIf="title" (mousedown)="onMouseDown($event)" (mouseup)="onMouseUp($event)" (click)="$event.stopPropagation()">{{title | translate}}</span>
   <ul class="dropdown-menu" *ngIf="hasSubItems">
     <li *ngFor="let item of subItems">
       <a href="#">{{item.title}}</a>

http://git-wip-us.apache.org/repos/asf/ambari/blob/84a59d71/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
index 7a967ad..2af5a44 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
@@ -56,18 +56,22 @@ export class MenuButtonComponent implements AfterViewInit {
 
   private readonly longClickInterval = 1000;
 
-  onMouseDown() {
-    this.clickStartTime = (new Date()).getTime();
+  onMouseDown(event: MouseEvent): void {
+    if (event.button === 0) {
+      this.clickStartTime = (new Date()).getTime();
+    }
   }
 
-  onMouseUp(event: Event) {
-    const clickEndTime = (new Date()).getTime();
-    if (this.hasSubItems && clickEndTime - this.clickStartTime >= this.longClickInterval) {
-      this.dropdown.nativeElement.classList.add('open');
-    } else {
-      this.actions[this.action]();
+  onMouseUp(event: MouseEvent): void {
+    if (event.button === 0) {
+      const clickEndTime = (new Date()).getTime();
+      if (this.hasSubItems && clickEndTime - this.clickStartTime >= this.longClickInterval) {
+        this.dropdown.nativeElement.classList.add('open');
+      } else {
+        this.actions[this.action]();
+      }
+      event.stopPropagation();
     }
-    event.stopPropagation();
   }
 
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/84a59d71/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts
index d5f05875..641fca0 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts
@@ -39,10 +39,16 @@ export class TopMenuComponent implements OnInit {
       action: 'undo',
       subItems: [
         {
-          title: 'Item 1'
+          title: 'Apply \'Last week\' filter'
         },
         {
-          title: 'Item 2'
+          title: 'Clear all filters'
+        },
+        {
+          title: 'Apply \'HDFS\' filter'
+        },
+        {
+          title: 'Apply \'Errors\' filter'
         }
       ]
     },
@@ -52,10 +58,13 @@ export class TopMenuComponent implements OnInit {
       action: 'redo',
       subItems: [
         {
-          title: 'Item 1'
+          title: 'Apply \'Warnings\' filter'
         },
         {
-          title: 'Item 2'
+          title: 'Switch to graph mode'
+        },
+        {
+          title: 'Apply \'Custom Date\' filter'
         }
       ]
     },
@@ -70,18 +79,29 @@ export class TopMenuComponent implements OnInit {
       action: 'openHistory',
       subItems: [
         {
-          title: 'Item 1'
+          title: 'Apply \'Custom Date\' filter'
+        },
+        {
+          title: 'Switch to graph mode'
+        },
+        {
+          title: 'Apply \'Warnings\' filter'
+        },
+        {
+          title: 'Apply \'Last week\' filter'
+        },
+        {
+          title: 'Clear all filters'
         },
         {
-          title: 'Item 2'
+          title: 'Apply \'HDFS\' filter'
+        },
+        {
+          title: 'Apply \'Errors\' filter'
         }
       ]
     },
     {
-      iconClassNames: ['fa', 'fa-bell'],
-      action: 'openAlerts'
-    },
-    {
       iconClassNames: ['fa', 'fa-user'],
       action: 'openUserDetails'
     }


[04/21] ambari git commit: AMBARI-21312 Provide Log Search UI authorization functionality. (ababiichuk)

Posted by ab...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/fonts/Roboto-Regular-webfont.ttf
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/fonts/Roboto-Regular-webfont.ttf b/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/fonts/Roboto-Regular-webfont.ttf
new file mode 100644
index 0000000..305f0d5
Binary files /dev/null and b/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/fonts/Roboto-Regular-webfont.ttf differ

http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/fonts/Roboto-Regular-webfont.woff
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/fonts/Roboto-Regular-webfont.woff b/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/fonts/Roboto-Regular-webfont.woff
new file mode 100644
index 0000000..ac7452a
Binary files /dev/null and b/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/fonts/Roboto-Regular-webfont.woff differ

http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/src/vendor/js/bootstrap-logsearch.min.js
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/vendor/js/bootstrap-logsearch.min.js b/ambari-logsearch/ambari-logsearch-web-new/src/vendor/js/bootstrap-logsearch.min.js
new file mode 100644
index 0000000..a1b68d2
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/vendor/js/bootstrap-logsearch.min.js
@@ -0,0 +1,19 @@
+/**
+ * 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.
+ */
+"use strict";$(document).ready(function(){var n=$(this).find('[data-toggle="collapseAccordion"]');n.off("click").on("click",function(n){var l=$(this);return l.siblings(".panel-body").slideToggle(500),l.children().children(".panel-toggle").toggleClass("fa-angle-down fa-angle-up"),n.stopPropagation(),!1})});
+"use strict";!function(e){e.fn.navigationBar=function(n){var t=e.extend({},e.fn.navigationBar.defaults,n);return this.each(function(){function n(){var n=window.location.pathname+window.location.hash;o.find("li a").each(function(t,a){var i=e(a),s=i.attr("data-href")||i.attr("href");n.indexOf(s)!==-1&&["","#"].indexOf(s)===-1?i.parent().addClass("active"):i.parent().removeClass("active")})}function a(n){var a=e(n).parent(),i=t.activeClass,s=f+"."+i,l=c+"."+i;o.find(s).removeClass(i),o.find(l).removeClass(i),a.addClass(i)}var i=this,s=".navigation-bar-container",o=e(this).find(s),l=e(this).find("[data-toggle="+t.navBarToggleDataAttr+"]"),r=e(this).find("[data-toggle="+t.subMenuNavToggleDataAttr+"]"),f=".side-nav-menu>li",c=".side-nav-menu>li>ul>li",d=e(this).find(".more-actions"),u=d.children(".dropdown-menu");r.each(function(n,t){return e(t).parent().addClass("has-sub-menu")}),t.fitHeight&&(e(this).addClass("navigation-bar-fit-height"),e(this).find(".side-nav-menu").on("DOMMouseScroll
  mousewheel",function(n){var t=e(this),a=this.scrollTop,i=this.scrollHeight,s=t.innerHeight(),o=n.originalEvent.wheelDelta,l=o>0,r=function(){return n.stopPropagation(),n.preventDefault(),n.returnValue=!1,!1};return!l&&-o>i-s-a?(t.scrollTop(i),r()):l&&o>a?(t.scrollTop(0),r()):void 0}));var h=o.width();t.moveLeftContent&&e(t.content).css("margin-left",h),t.moveLeftFooter&&e(t.footer).css("margin-left",h),t.handlePopState&&(n(),e(window).bind("popstate",n)),e(f+">a").on("click",function(){a(this)}),e(c+">a").on("click",function(){a(this),e(this).parent().parent().parent().addClass(t.activeClass)}),r.off("click").on("click",function(n){if(o.hasClass("collapsed"))return!1;var a=e(this);return a.siblings(".sub-menu").slideToggle(600,function(){var e=a.parent(),n=e.find("ul");return n.is(":visible")?e.removeClass("collapsed"):e.addClass("collapsed")}),a.children(".toggle-icon").toggleClass(t.menuLeftClass+" "+t.menuDownClass),n.stopPropagation(),!1}),e(this).find(".mainmenu-li>a").hover(f
 unction(){var n=e(this).siblings(".more-actions");n.length&&!o.hasClass("collapsed")&&n.css("display","inline-block")},function(){var n=e(this).siblings(".more-actions");n.length&&!o.hasClass("collapsed")&&n.hide()}),d.hover(function(){e(this).css("display","inline-block")}),t.fitHeight&&d.on("click",function(){var n=e(this),t=e(".side-nav-header");u.css({top:n.offset().top-t.offset().top+20+"px",left:n.offset().left+"px"})}),u.on("click",function(){var n=e(this).parent();setTimeout(function(){n.hide()},1e3)}),o.children(".side-nav-menu").scroll(function(){d.removeClass("open")}),l.click(function(){return o.toggleClass("collapsed").promise().done(function(){var n="ul.sub-menu",a=o.find(n),s=o.find(".side-nav-menu>li");o.hasClass("collapsed")?(a.hide(),d.hide(),s.hover(function(){e(this).find(n).show();var a=e(this),i=e(".side-nav-header");t.fitHeight&&e(this).find(n).css({position:"fixed",top:a.offset().top-i.offset().top+"px",left:"50px"})},function(){e(this).find(n).hide()})):(a.s
 how().each(function(n,t){return e(t).parent().removeClass("collapsed")}),s.unbind("mouseenter mouseleave"),o.find(".toggle-icon").removeClass(t.menuLeftClass).addClass(t.menuDownClass),t.fitHeight&&e(i).find(n).css({position:"relative",top:0,left:0})),o.on("transitionend",function(){var n=o.width();t.moveLeftContent&&e(t.content).css("margin-left",n),t.moveLeftFooter&&e(t.footer).css("margin-left",n)}),l.find("span").toggleClass(t.collapseNavBarClass+" "+t.expandNavBarClass)}),!1})})},e.fn.navigationBar.defaults={handlePopState:!0,fitHeight:!1,content:"#main",footer:"footer",moveLeftContent:!0,moveLeftFooter:!0,menuLeftClass:"glyphicon-menu-right",menuDownClass:"glyphicon-menu-down",collapseNavBarClass:"fa-angle-double-left",expandNavBarClass:"fa-angle-double-right",activeClass:"active",navBarToggleDataAttr:"collapse-side-nav",subMenuNavToggleDataAttr:"collapse-sub-menu"}}(jQuery);
\ No newline at end of file


[13/21] ambari git commit: AMBARI-21316 Log Search UI: dock navigation bar to top. (ababiichuk)

Posted by ab...@apache.org.
AMBARI-21316 Log Search UI: dock navigation bar to top. (ababiichuk)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/c57329cd
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/c57329cd
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/c57329cd

Branch: refs/heads/branch-feature-logsearch-ui
Commit: c57329cd4dafc71507ef88cd2b20ae9d0e02d66d
Parents: 603297a
Author: ababiichuk <ab...@hortonworks.com>
Authored: Thu Jun 1 16:08:41 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jun 22 15:36:00 2017 +0300

----------------------------------------------------------------------
 .../src/app/app.component.html                  | 20 ++++++++++++++------
 .../src/app/app.component.less                  |  7 +++++--
 .../ambari-logsearch-web-new/src/styles.less    |  3 +++
 3 files changed, 22 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/c57329cd/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html
index 9b44246..8b8687a 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html
@@ -15,10 +15,18 @@
   limitations under the License.
 -->
 
-<nav class="navbar">
-  <div class="container-fluid">
-    <h1 [ngClass]="{'full-flex-width': !httpClient.isAuthorized, 'navbar-left': true}">{{'common.title' | translate}}</h1>
-    <top-menu *ngIf="httpClient.isAuthorized" class="navbar-right"></top-menu>
-  </div>
-</nav>
+<header>
+  <nav class="navbar navbar-fixed-top">
+    <div class="container-fluid">
+      <h1 [ngClass]="{'full-flex-width': !httpClient.isAuthorized, 'navbar-left': true}">{{'common.title' | translate}}</h1>
+      <top-menu *ngIf="httpClient.isAuthorized" class="navbar-right"></top-menu>
+    </div>
+  </nav>
+</header>
+
+<!-- hidden element for moving the main bar outside the fixed header -->
+<div class="navbar invisible">
+  <h1>&nbsp;</h1>
+</div>
+
 <login-form *ngIf="!httpClient.isAuthorized"></login-form>

http://git-wip-us.apache.org/repos/asf/ambari/blob/c57329cd/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
index d8410cf..e09da49 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
@@ -15,9 +15,12 @@
  * limitations under the License.
  */
 
+
+@import '../styles.less';
+
 .navbar {
   border-radius: 0;
-  background-color: #323544;
+  background-color: @navbar-background-color;
   color: #fff;
 
   .container-fluid {
@@ -28,7 +31,7 @@
 
   h1 {
     flex-basis: 70%;
-    margin-bottom: 20px;
+    margin-bottom: @h1-vertical-margin;
     text-transform: uppercase;
 
     &.full-flex-width {

http://git-wip-us.apache.org/repos/asf/ambari/blob/c57329cd/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/styles.less b/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
index 5d5f1e3..24136fe 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
@@ -15,3 +15,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
+@navbar-background-color: #323544;
+@h1-vertical-margin: 20px;


[20/21] ambari git commit: AMBARI-21322 Log Search UI: implement loading of logs list with filter conditions. (ababiichuk)

Posted by ab...@apache.org.
AMBARI-21322	Log Search UI: implement loading of logs list with filter conditions. (ababiichuk)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/1a2d6ced
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/1a2d6ced
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/1a2d6ced

Branch: refs/heads/branch-feature-logsearch-ui
Commit: 1a2d6cedc162c7b71b93d5f5c3272aed30bc4fc2
Parents: 56681d7
Author: ababiichuk <ab...@hortonworks.com>
Authored: Thu Jun 22 13:47:53 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jun 22 15:45:53 2017 +0300

----------------------------------------------------------------------
 .../queries/audit-logs-query-params.class.ts    |  38 +
 .../app/classes/queries/query-params.class.ts   |  23 +
 .../queries/service-logs-query-params.class.ts  |  32 +
 .../dropdown-list/dropdown-list.component.less  |  22 +
 .../dropdown-list/dropdown-list.component.ts    |   3 +-
 .../filter-dropdown.component.spec.ts           |   2 +
 .../filter-dropdown.component.ts                |  11 +-
 .../filter-text-field.component.html            |   2 +-
 .../filter-text-field.component.spec.ts         |   2 +
 .../filter-text-field.component.ts              |   8 +-
 .../filters-panel/filters-panel.component.html  |  16 +-
 .../filters-panel/filters-panel.component.less  |   9 +-
 .../src/app/logs-list/logs-list.component.html  |   8 +-
 .../src/app/logs-list/logs-list.component.less  |   5 +-
 .../app/logs-list/logs-list.component.spec.ts   |  28 +
 .../src/app/logs-list/logs-list.component.ts    | 111 ++-
 .../main-container.component.html               |   2 +-
 .../app/menu-button/menu-button.component.html  |   3 +-
 .../menu-button/menu-button.component.spec.ts   |   6 +-
 .../app/menu-button/menu-button.component.ts    |  14 +-
 .../src/app/models/log.model.ts                 |   2 +-
 .../src/app/models/service-log.model.ts         |   2 +-
 .../src/app/services/filtering.service.ts       | 153 +++-
 .../src/app/services/http-client.service.ts     |  72 +-
 .../src/app/services/mock-api-data.service.ts   | 803 ++---------------
 .../src/app/variables.less                      |   7 +-
 .../src/assets/mock-data.ts                     | 883 +++++++++++++++++++
 27 files changed, 1379 insertions(+), 888 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/classes/queries/audit-logs-query-params.class.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/classes/queries/audit-logs-query-params.class.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/classes/queries/audit-logs-query-params.class.ts
new file mode 100644
index 0000000..749ed21
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/classes/queries/audit-logs-query-params.class.ts
@@ -0,0 +1,38 @@
+/**
+ * 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.
+ */
+
+import {QueryParams} from '@app/classes/queries/query-params.class';
+
+export class AuditLogsQueryParams extends QueryParams {
+  startIndex?: string = '0';
+  page?: string = '0';
+  pageSize?: string = '25';
+  sortBy?: string;
+  sortType?: string;
+  start_time?: string;
+  end_time?: string;
+  clusters?: string;
+  iMessage?: string;
+  eMessage?: string;
+  mustBe?: string;
+  mustNot?: string;
+  includeQuery?: string;
+  excludeQuery?: string;
+  from?: string;
+  to?: string;
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/classes/queries/query-params.class.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/classes/queries/query-params.class.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/classes/queries/query-params.class.ts
new file mode 100644
index 0000000..73db35a
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/classes/queries/query-params.class.ts
@@ -0,0 +1,23 @@
+/**
+ * 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.
+ */
+
+export class QueryParams {
+  constructor(options: QueryParams) {
+    Object.assign(this, options);
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/classes/queries/service-logs-query-params.class.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/classes/queries/service-logs-query-params.class.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/classes/queries/service-logs-query-params.class.ts
new file mode 100644
index 0000000..829783e
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/classes/queries/service-logs-query-params.class.ts
@@ -0,0 +1,32 @@
+/**
+ * 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.
+ */
+
+import {AuditLogsQueryParams} from '@app/classes/queries/audit-logs-query-params.class';
+
+export class ServiceLogsQueryParams extends AuditLogsQueryParams {
+  level?: string;
+  host_name?: string;
+  component_name?: string;
+  file_name?: string;
+  bundle_id?: string;
+  hostList?: string;
+  find?: string;
+  sourceLogId?: string;
+  keywordType?: string;
+  token?: string;
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.less
new file mode 100644
index 0000000..d0f079a
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.less
@@ -0,0 +1,22 @@
+/**
+ * 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.
+ */
+
+:host {
+  max-height: 500px; // TODO get rid of magic number, base on actual design
+  overflow-y: auto;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.ts
index dfd2527..808fcf8 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.ts
@@ -20,7 +20,8 @@ import {Component, OnInit, Input, Output, EventEmitter} from '@angular/core';
 
 @Component({
   selector: 'ul.dropdown-menu',
-  templateUrl: './dropdown-list.component.html'
+  templateUrl: './dropdown-list.component.html',
+  styleUrls: ['./dropdown-list.component.less']
 })
 export class DropdownListComponent implements OnInit {
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.spec.ts
index ba0bd03..e0414f3 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.spec.ts
@@ -20,6 +20,7 @@ import {async, ComponentFixture, TestBed} from '@angular/core/testing';
 import {Http} from '@angular/http';
 import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
 import {TranslateHttpLoader} from '@ngx-translate/http-loader';
+import {FilteringService} from '@app/services/filtering.service';
 
 import {FilterDropdownComponent} from './filter-dropdown.component';
 
@@ -39,6 +40,7 @@ describe('FilterDropdownComponent', () => {
         useFactory: HttpLoaderFactory,
         deps: [Http]
       })],
+      providers: [FilteringService],
       schemas: [NO_ERRORS_SCHEMA]
     })
     .compileComponents();

http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.ts
index de6e79b..faaafcb 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.ts
@@ -16,6 +16,7 @@
  */
 
 import {Component, OnInit, Input} from '@angular/core';
+import {FilteringService} from '@app/services/filtering.service';
 
 @Component({
   selector: 'filter-dropdown',
@@ -24,7 +25,8 @@ import {Component, OnInit, Input} from '@angular/core';
 })
 export class FilterDropdownComponent implements OnInit {
 
-  constructor() { }
+  constructor(private filtering: FilteringService) {
+  }
 
   ngOnInit() {
     this.filterInstance.selectedValue = this.filterInstance.options[0].value;
@@ -38,8 +40,11 @@ export class FilterDropdownComponent implements OnInit {
   options: any[];
 
   setSelectedValue(options: any): void {
-    this.filterInstance.selectedValue = options.value;
-    this.filterInstance.selectedLabel = options.label;
+    if (this.filterInstance.selectedValue !== options.value) {
+      this.filterInstance.selectedValue = options.value;
+      this.filterInstance.selectedLabel = options.label;
+      this.filtering.filteringSubject.next(null);
+    }
   };
 
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.html
index 3ccbd6f..ed3c4ba 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.html
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.html
@@ -17,5 +17,5 @@
 
 <div class="input-group">
   <span class="input-group-addon">{{filterInstance.label | translate}}</span>
-  <input type="text" class="form-control" [(ngModel)]="filterInstance.value">
+  <input type="text" class="form-control" [(ngModel)]="filterInstance.selectedValue" (change)="onValueChange()"> <!-- TODO use ngModelChange with debounce -->
 </div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.spec.ts
index c54171a..e4f026c 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.spec.ts
@@ -21,6 +21,7 @@ import {Http} from '@angular/http';
 import {FormsModule} from '@angular/forms';
 import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
 import {TranslateHttpLoader} from '@ngx-translate/http-loader';
+import {FilteringService} from '@app/services/filtering.service';
 
 import {FilterTextFieldComponent} from './filter-text-field.component';
 
@@ -43,6 +44,7 @@ describe('FilterTextFieldComponent', () => {
           deps: [Http]
         })
       ],
+      providers: [FilteringService],
       schemas: [CUSTOM_ELEMENTS_SCHEMA]
     })
     .compileComponents();

http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.ts
index 6bab2e6..3f23ffd 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.ts
@@ -16,6 +16,7 @@
  */
 
 import {Component, OnInit, Input} from '@angular/core';
+import {FilteringService} from '@app/services/filtering.service';
 
 @Component({
   selector: 'filter-text-field',
@@ -24,7 +25,8 @@ import {Component, OnInit, Input} from '@angular/core';
 })
 export class FilterTextFieldComponent implements OnInit {
 
-  constructor() { }
+  constructor(private filtering: FilteringService) {
+  }
 
   ngOnInit() {
   }
@@ -32,4 +34,8 @@ export class FilterTextFieldComponent implements OnInit {
   @Input()
   filterInstance: any;
 
+  onValueChange() {
+    this.filtering.filteringSubject.next(null);
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.html
index 20f4353..6387c22 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.html
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.html
@@ -20,17 +20,19 @@
   <filter-text-field [filterInstance]="filtering.filters.text"></filter-text-field>
   <filter-dropdown [filterInstance]="filtering.filters.timeRange"></filter-dropdown>
   <filter-dropdown [filterInstance]="filtering.filters.timeZone"></filter-dropdown>
-  <button class="btn btn-success" type="button">
+  <!--button class="btn btn-success" type="button">
     <span class="fa fa-search"></span>
-  </button>
+  </button-->
 </div>
 <div class="default-flex col-md-4">
-  <menu-button [label]="filtering.filters.components.label" [iconClass]="filtering.filters.components.iconClass"
-               [subItems]="filtering.filters.components.options" [isFilter]="true"></menu-button>
-  <menu-button [label]="filtering.filters.levels.label" [iconClass]="filtering.filters.levels.iconClass"
-               [subItems]="filtering.filters.levels.options" [isFilter]="true"></menu-button>
-  <menu-button label="filter.capture" iconClass="fa fa-caret-right"></menu-button>
   <a href="#">
     <span class="fa fa-search-minus"></span> {{'filter.excluded' | translate}}
   </a>
+  <menu-button [label]="filtering.filters.components.label" [iconClass]="filtering.filters.components.iconClass"
+               [subItems]="filtering.filters.components.options" [isFilter]="true"
+               [filterInstance]="filtering.filters.components"></menu-button>
+  <menu-button [label]="filtering.filters.levels.label" [iconClass]="filtering.filters.levels.iconClass"
+               [subItems]="filtering.filters.levels.options" [isFilter]="true"
+               [filterInstance]="filtering.filters.levels"></menu-button>
+  <menu-button label="filter.capture" iconClass="fa fa-caret-right"></menu-button>
 </div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.less
index d2400a4..46a157c 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.less
@@ -29,10 +29,17 @@
 
   filter-dropdown {
     border: @input-border;
-    border-right-width: 0;
+
+    &:not(:last-child) {
+      border-right-width: 0;
+    }
 
     &:first-child {
       border-radius: @button-border-radius 0 0 @button-border-radius;
     }
+
+    &:last-child {
+      border-radius: 0 @button-border-radius @button-border-radius 0;
+    }
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.html
index cf4bb57..827f63c 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.html
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.html
@@ -15,10 +15,10 @@
   limitations under the License.
 -->
 
-<accordion-panel *ngFor="let log of logs; let i = index" [toggleId]="'details-' + i" class="col-md-12">
+<accordion-panel *ngFor="let log of logs | async; let i = index" [toggleId]="'details-' + i" class="col-md-12">
   <ng-template>
-    <div [ngClass]="'hexagon ' + log.level"></div>
-    <div [ngClass]="'col-md-1 log-status ' + log.level">{{log.level}}</div>
+    <div [ngClass]="'hexagon ' + log.className"></div>
+    <div [ngClass]="'col-md-1 log-status ' + log.className">{{log.level}}</div>
     <div class="col-md-3">
       <div class="log-type">{{log.type}}</div>
       <time class="log-time">{{log.time}}</time>
@@ -29,7 +29,7 @@
         <span class="action-icon fa fa-external-link"></span>
         <span class="action-icon fa fa-bullseye"></span>
       </div>
-      <div class="log-content" [innerHTML]="log.content"></div>
+      <div class="log-content">{{log.message}}</div>
     </div>
   </ng-template>
 </accordion-panel>

http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.less
index 6bf54fe..6ed0463 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.less
@@ -19,7 +19,9 @@
 
 :host {
   display: block;
-  margin-top: @block-margin-top;
+  overflow: hidden;
+  padding-top: @block-margin-top;
+  background-color: @main-background-color; // TODO implement actual color
 
   .hexagon {
     // TODO get rid of magic numbers, base on actual design
@@ -102,6 +104,7 @@
       overflow: hidden;
       max-height: @default-line-height * 2em;
       padding-right: 65px;
+      white-space: pre-wrap;
     }
 
     .log-actions {

http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.spec.ts
index 53cdee6..072bfcd 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.spec.ts
@@ -17,16 +17,44 @@
 
 import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
 import {async, ComponentFixture, TestBed} from '@angular/core/testing';
+import {StoreModule} from '@ngrx/store';
+import {AuditLogsService, auditLogs} from '@app/services/storage/audit-logs.service';
+import {ServiceLogsService, serviceLogs} from '@app/services/storage/service-logs.service';
+import {HttpClientService} from '@app/services/http-client.service';
+import {FilteringService} from '@app/services/filtering.service';
 
 import {LogsListComponent} from './logs-list.component';
 
 describe('LogsListComponent', () => {
   let component: LogsListComponent;
   let fixture: ComponentFixture<LogsListComponent>;
+  const httpClient = {
+    get: () => {
+      return {
+        subscribe: () => {
+        }
+      };
+    }
+  };
 
   beforeEach(async(() => {
     TestBed.configureTestingModule({
       declarations: [LogsListComponent],
+      imports: [
+        StoreModule.provideStore({
+          auditLogs,
+          serviceLogs
+        })
+      ],
+      providers: [
+        {
+          provide: HttpClientService,
+          useValue: httpClient
+        },
+        AuditLogsService,
+        ServiceLogsService,
+        FilteringService
+      ],
       schemas: [CUSTOM_ELEMENTS_SCHEMA]
     })
     .compileComponents();

http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.ts
index 5fd0ce5..6bc5ab9 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.ts
@@ -15,7 +15,11 @@
  * limitations under the License.
  */
 
-import {Component, OnInit} from '@angular/core';
+import {Component, OnInit, Input} from '@angular/core';
+import 'rxjs/add/operator/map';
+import {HttpClientService} from '@app/services/http-client.service';
+import {ServiceLogsService} from '@app/services/storage/service-logs.service';
+import {FilteringService} from '@app/services/filtering.service';
 
 @Component({
   selector: 'logs-list',
@@ -24,56 +28,69 @@ import {Component, OnInit} from '@angular/core';
 })
 export class LogsListComponent implements OnInit {
 
-  constructor() {
+  constructor(private httpClient: HttpClientService, private serviceLogsStorage: ServiceLogsService, private filtering: FilteringService) {
+    this.filtering.filteringSubject.subscribe(this.loadLogs.bind(this));
   }
 
   ngOnInit() {
+    this.loadLogs();
   }
 
-  // TODO implement loading logs from API
-  private readonly logs = [
-    {
-      level: 'fatal',
-      type: 'ambari_agent',
-      time: '2017/01/31 18:00:00',
-      content: 'Something went wrong.<br>Please restart ambari-agent.<br>See log file for details.'
-    },
-    {
-      level: 'error',
-      type: 'ambari_agent',
-      time: '2017/01/31 18:00:00',
-      content: 'Something went wrong.<br>Please restart ambari-agent.<br>See log file for details.'
-    },
-    {
-      level: 'warn',
-      type: 'ambari_agent',
-      time: '2017/01/31 18:00:00',
-      content: 'Something went wrong.<br>Please restart ambari-agent.<br>See log file for details.'
-    },
-    {
-      level: 'info',
-      type: 'ambari_agent',
-      time: '2017/01/31 18:00:00',
-      content: 'Something went wrong.<br>Please restart ambari-agent.<br>See log file for details.'
-    },
-    {
-      level: 'debug',
-      type: 'ambari_agent',
-      time: '2017/01/31 18:00:00',
-      content: 'Something went wrong.<br>Please restart ambari-agent.<br>See log file for details.'
-    },
-    {
-      level: 'trace',
-      type: 'ambari_agent',
-      time: '2017/01/31 18:00:00',
-      content: 'Something went wrong.<br>Please restart ambari-agent.<br>See log file for details.'
-    },
-    {
-      level: 'unknown',
-      type: 'ambari_agent',
-      time: '2017/01/31 18:00:00',
-      content: 'Something went wrong.<br>Please restart ambari-agent.<br>See log file for details.'
-    }
-  ];
+  @Input()
+  private logsArrayId: string;
+
+  private readonly usedFilters = {
+    clusters: ['clusters'],
+    text: ['iMessage'],
+    timeRange: ['end_time', 'start_time'],
+    components: ['component_name'],
+    levels: ['level']
+  };
+
+  private logs = this.serviceLogsStorage.getInstances().map(logs => {
+    return logs.map(log => {
+      return {
+        type: log.type,
+        level: log.level,
+        className: log.level.toLowerCase(),
+        message: log.log_message,
+        time: new Date(log.logtime).toLocaleDateString() + ' ' + new Date(log.logtime).toLocaleTimeString() // TODO use moment with custom time zone
+      }
+    });
+  });
+
+  private loadLogs(): void {
+    this.httpClient.get(this.logsArrayId, this.getParams()).subscribe(response => {
+      this.serviceLogsStorage.clear();
+      const logs = response.json().logList;
+      this.serviceLogsStorage.addInstances(logs);
+    });
+  }
+
+  private getParams(): any {
+    let params = {};
+    Object.keys(this.usedFilters).forEach(key => {
+      const inputFilter = this.filtering.filters[key],
+        inputValue = inputFilter.selectedValue,
+        paramNames = this.usedFilters[key];
+      paramNames.forEach(paramName => {
+        let value;
+        const valueGetter = this.filtering.valueGetters[paramName];
+        if (valueGetter) {
+          if (paramName === 'start_time') {
+            value = valueGetter(inputValue, params['end_time']);
+          } else {
+            value = valueGetter(inputValue);
+          }
+        } else {
+          value = inputValue;
+        }
+        if (value) {
+          params[paramName] = value;
+        }
+      });
+    }, this);
+    return params;
+  }
 
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.html
index 34af2b8..61562d2 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.html
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.html
@@ -17,4 +17,4 @@
 
 <login-form *ngIf="!httpClient.isAuthorized"></login-form>
 <filters-panel *ngIf="httpClient.isAuthorized" class="row"></filters-panel>
-<logs-list *ngIf="httpClient.isAuthorized"></logs-list>
+<logs-list *ngIf="httpClient.isAuthorized" [logsArrayId]="'serviceLogs'"></logs-list>

http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html
index 4ed01bd..132d717 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html
@@ -22,5 +22,6 @@
   <br>
   <a *ngIf="label" (mousedown)="onMouseDown($event)" [ngClass]="labelClass" (mouseup)="onMouseUp($event)"
      (click)="$event.stopPropagation()">{{label | translate}}</a>
-  <ul class="dropdown-menu" [isFilter]="isFilter" *ngIf="hasSubItems" [items]="subItems"></ul>
+  <ul class="dropdown-menu" [isFilter]="isFilter" *ngIf="hasSubItems" [items]="subItems"
+      (selectedItemChange)="setSelectedValue($event)"></ul>
 </div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts
index 9af8f00..424d322 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts
@@ -22,6 +22,7 @@ import {Http} from '@angular/http';
 import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
 import {TranslateHttpLoader} from '@ngx-translate/http-loader';
 import {ComponentActionsService} from '@app/services/component-actions.service';
+import {FilteringService} from '@app/services/filtering.service';
 
 import {MenuButtonComponent} from './menu-button.component';
 
@@ -42,7 +43,10 @@ describe('MenuButtonComponent', () => {
         useFactory: HttpLoaderFactory,
         deps: [Http]
       })],
-      providers: [ComponentActionsService],
+      providers: [
+        ComponentActionsService,
+        FilteringService
+      ],
       schemas: [NO_ERRORS_SCHEMA]
     })
     .compileComponents();

http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
index 9505f5b..ded01b7 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
@@ -18,6 +18,7 @@
 
 import {Component, AfterViewInit, Input, ViewChild, ElementRef} from '@angular/core';
 import {ComponentActionsService} from '@app/services/component-actions.service';
+import {FilteringService} from '@app/services/filtering.service';
 import * as $ from 'jquery';
 
 @Component({
@@ -27,7 +28,7 @@ import * as $ from 'jquery';
 })
 export class MenuButtonComponent implements AfterViewInit {
 
-  constructor(private actions: ComponentActionsService) {
+  constructor(private actions: ComponentActionsService, private filtering: FilteringService) {
   }
 
   ngAfterViewInit() {
@@ -46,6 +47,9 @@ export class MenuButtonComponent implements AfterViewInit {
   isFilter: boolean;
 
   @Input()
+  filterInstance?: any;
+
+  @Input()
   iconClass: string;
 
   @Input()
@@ -87,4 +91,12 @@ export class MenuButtonComponent implements AfterViewInit {
     }
   }
 
+  setSelectedValue(options: any): void {
+    if (this.filterInstance.selectedValue !== options.value) {
+      this.filterInstance.selectedValue = options.value;
+      this.filterInstance.selectedLabel = options.label;
+      this.filtering.filteringSubject.next(null);
+    }
+  };
+
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/models/log.model.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/models/log.model.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/log.model.ts
index 825b4cf..abe1b48 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/models/log.model.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/log.model.ts
@@ -32,6 +32,6 @@ export interface Log {
   event_md5: string;
   event_dur_ms: number;
   _ttl_: string;
-  _expire_at_: string;
+  _expire_at_: number;
   _router_field_?: number;
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/models/service-log.model.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/models/service-log.model.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/service-log.model.ts
index e386ad5..6f76bcc 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/models/service-log.model.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/service-log.model.ts
@@ -22,6 +22,6 @@ export interface ServiceLog extends Log {
   path: string;
   host: string;
   level: string;
-  logtime: string;
+  logtime: number;
   ip: string;
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/services/filtering.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/filtering.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/filtering.service.ts
index 84cbc50..c4d2bdf 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/filtering.service.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/filtering.service.ts
@@ -17,6 +17,7 @@
  */
 
 import {Injectable} from '@angular/core';
+import {Subject} from 'rxjs/Subject';
 import * as moment from 'moment-timezone';
 
 @Injectable()
@@ -26,67 +27,110 @@ export class FilteringService {
   }
 
   // TODO implement loading of real options data
-  readonly filters = {
+  filters = {
     clusters: {
       label: 'filter.clusters',
       options: [
         {
           label: 'filter.all',
-          value: 'ALL'
+          value: ''
         },
         {
-          label: 'c0',
-          value: 'c0'
+          label: 'cl0',
+          value: 'cl0'
         },
         {
-          label: 'c1',
-          value: 'c1'
+          label: 'cl1',
+          value: 'cl1'
+        },
+        {
+          label: 'cl2',
+          value: 'cl2'
+        },
+        {
+          label: 'cl3',
+          value: 'cl3'
+        },
+        {
+          label: 'cl4',
+          value: 'cl4'
         }
       ],
       selectedValue: '',
-      selectedLabel: ''
+      selectedLabel: '',
+      paramName: 'clusters',
     },
     text: {
       label: 'filter.message',
-      value: ''
+      selectedValue: ''
     },
     timeRange: {
       options: [
         {
           label: 'filter.timeRange.1hr',
-          value: '1HR'
+          value: {
+            type: 'LAST',
+            unit: 'h',
+            interval: 1
+          }
         },
         {
           label: 'filter.timeRange.24hr',
-          value: '24HR'
+          value: {
+            type: 'LAST',
+            unit: 'h',
+            interval: 24
+          }
         },
         {
           label: 'filter.timeRange.today',
-          value: 'TODAY'
+          value: {
+            type: 'CURRENT',
+            unit: 'd'
+          }
         },
         {
           label: 'filter.timeRange.yesterday',
-          value: 'YESTERDAY'
+          value: {
+            type: 'PAST',
+            unit: 'd'
+          }
         },
         {
           label: 'filter.timeRange.7d',
-          value: '7D'
+          value: {
+            type: 'LAST',
+            unit: 'd',
+            interval: 7
+          }
         },
         {
           label: 'filter.timeRange.30d',
-          value: '30d'
+          value: {
+            type: 'LAST',
+            unit: 'd',
+            interval: 30
+          }
         },
         {
           label: 'filter.timeRange.thisMonth',
-          value: 'THIS_MONTH'
+          value: {
+            type: 'CURRENT',
+            unit: 'M'
+          }
         },
         {
           label: 'filter.timeRange.lastMonth',
-          value: 'LAST_MONTH'
+          value: {
+            type: 'PAST',
+            unit: 'M'
+          }
         },
         {
           label: 'filter.timeRange.custom',
-          value: 'CUSTOM'
+          value: {
+            type: 'CUSTOM'
+          }
         }
       ],
       selectedValue: '',
@@ -94,8 +138,9 @@ export class FilteringService {
     },
     timeZone: {
       options: moment.tz.names().map(zone => {
+        // TODO map labels according to actual design requirements
         return {
-          label: zone,
+          label: `${zone} (${moment.tz(zone).format('Z')})`,
           value: zone
         };
       }),
@@ -107,20 +152,24 @@ export class FilteringService {
       iconClass: 'fa fa-cubes',
       options: [
         {
-          label: 'DataNode',
-          value: 'DATANODE'
+          label: 'filter.all',
+          value: ''
+        },
+        {
+          label: 'ambari_agent',
+          value: 'ambari_agent'
         },
         {
-          label: 'NameNode',
-          value: 'NAMENODE'
+          label: 'ams_collector',
+          value: 'ams_collector'
         },
         {
-          label: 'ZooKeeper Server',
-          value: 'ZOOKEEPER_SERVER'
+          label: 'zookeeper_server',
+          value: 'zookeeper_server'
         },
         {
-          label: 'Metrics Collector',
-          value: 'METRICS_COLLECTOR'
+          label: 'zookeeper_client',
+          value: 'zookeeper_client'
         }
       ],
       selectedValue: '',
@@ -131,6 +180,10 @@ export class FilteringService {
       iconClass: 'fa fa-sort-amount-asc',
       options: [
         {
+          label: 'filter.all',
+          value: ''
+        },
+        {
           label: 'levels.fatal',
           value: 'FATAL'
         },
@@ -164,4 +217,52 @@ export class FilteringService {
     }
   };
 
+  readonly valueGetters = {
+    end_time: value => {
+      let time;
+      if (value) {
+        switch (value.type) {
+          case 'LAST':
+            time = moment();
+            break;
+          case 'CURRENT':
+            // TODO consider user's timezone
+            time = moment().endOf(value.unit);
+            break;
+          case 'PAST':
+            // TODO consider user's timezone
+            time = moment().startOf(value.unit).millisecond(-1);
+            break;
+          default:
+            break;
+        }
+      }
+      return time ? time.toISOString() : '';
+    },
+    start_time: (value, current) => {
+      let time;
+      if (value) {
+        const endTime = moment(moment(current).valueOf());
+        switch (value.type) {
+          case 'LAST':
+            time = endTime.subtract(value.interval, value.unit);
+            break;
+          case 'CURRENT':
+            // TODO consider user's timezone
+            time = moment().startOf(value.unit);
+            break;
+          case 'PAST':
+            // TODO consider user's timezone
+            time = endTime.startOf(value.unit);
+            break;
+          default:
+            break;
+        }
+      }
+      return time ? time.toISOString() : '';
+    }
+  };
+
+  filteringSubject = new Subject();
+
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts
index 84f82b3..cef6696 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts
@@ -21,6 +21,8 @@ import {Observable} from 'rxjs/Observable';
 import {Http, XHRBackend, Request, RequestOptions, RequestOptionsArgs, Response} from '@angular/http';
 import 'rxjs/add/operator/map';
 import 'rxjs/add/operator/catch';
+import {AuditLogsQueryParams} from '@app/classes/queries/audit-logs-query-params.class';
+import {ServiceLogsQueryParams} from '@app/classes/queries/service-logs-query-params.class';
 
 @Injectable()
 export class HttpClientService extends Http {
@@ -31,9 +33,18 @@ export class HttpClientService extends Http {
 
   private readonly apiPrefix = 'api/v1/';
 
-  private readonly urls = {
-    status: 'status',
-    auditLogs: 'audit/logs'
+  private readonly endPoints = {
+    status: {
+      url: 'status'
+    },
+    auditLogs: {
+      url: 'audit/logs',
+      params: opts => new AuditLogsQueryParams(opts)
+    },
+    serviceLogs: {
+      url: 'service/logs',
+      params: opts => new ServiceLogsQueryParams(opts)
+    }
   };
 
   private readonly unauthorizedStatuses = [401, 403, 419];
@@ -41,21 +52,28 @@ export class HttpClientService extends Http {
   isAuthorized: boolean;
 
   generateUrlString(url: string): string {
-    const presetUrl = this.urls[url];
-    return presetUrl ? (this.apiPrefix + this.urls[url]) : url;
+    const preset = this.endPoints[url];
+    return preset ? `${this.apiPrefix}${preset.url}` : url;
   }
 
-  generateUrl(url: string | Request): string | Request {
-    if (typeof url === 'string') {
-      return this.generateUrlString(url);
+  generateUrl(request: string | Request): string | Request {
+    if (typeof request === 'string') {
+      return this.generateUrlString(request);
     }
-    if (url instanceof Request) {
-      url.url = this.generateUrlString(url.url);
-      return url;
+    if (request instanceof Request) {
+      request.url = this.generateUrlString(request.url);
+      return request;
     }
   }
 
-  handleError(request: Observable<Response>) {
+  generateOptions(url: string, params: {[key: string]: string}): RequestOptionsArgs {
+    const preset = this.endPoints[url];
+    return {
+      params: preset && preset.params ? preset.params(params) : params
+    };
+  }
+
+  handleError(request: Observable<Response>): void {
     request.subscribe(null, (error: any) => {
       if (this.unauthorizedStatuses.indexOf(error.status) > -1) {
         this.isAuthorized = false;
@@ -63,38 +81,14 @@ export class HttpClientService extends Http {
     });
   }
 
-  request(url: string | Request, options?: RequestOptionsArgs):Observable<Response> {
+  request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
     let req = super.request(this.generateUrl(url), options);
     this.handleError(req);
     return req;
   }
 
-  get(url: string, options?: RequestOptionsArgs):Observable<Response> {
-    return super.get(this.generateUrlString(url), options);
-  }
-
-  post(url: string, body: any, options?: RequestOptionsArgs):Observable<Response> {
-    return super.post(this.generateUrlString(url), body, options);
-  }
-
-  put(url: string, body: any, options?: RequestOptionsArgs):Observable<Response> {
-    return super.put(this.generateUrlString(url), body, options);
-  }
-
-  delete(url: string, options?: RequestOptionsArgs):Observable<Response> {
-    return super.delete(this.generateUrlString(url), options);
-  }
-
-  patch(url: string, body: any, options?: RequestOptionsArgs):Observable<Response> {
-    return super.patch(this.generateUrlString(url), body, options);
-  }
-
-  head(url: string, options?: RequestOptionsArgs):Observable<Response> {
-    return super.head(this.generateUrlString(url), options);
-  }
-
-  options(url: string, options?: RequestOptionsArgs):Observable<Response> {
-    return super.options(this.generateUrlString(url), options);
+  get(url, params?: {[key: string]: string}): Observable<Response> {
+    return super.get(this.generateUrlString(url), this.generateOptions(url, params));
   }
 
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
index a6215e6..757f68d 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
@@ -20,6 +20,8 @@ import {URLSearchParams, Response, ResponseOptions} from '@angular/http';
 import {InMemoryDbService, InMemoryBackendService, createErrorResponse} from 'angular-in-memory-web-api';
 import {Observable} from 'rxjs/Observable';
 import {Subscriber} from 'rxjs/Subscriber';
+import * as moment from 'moment';
+import {mockData} from '../../assets/mock-data';
 
 export class mockBackendService extends InMemoryBackendService {
   getLocation(url: string): any {
@@ -29,6 +31,35 @@ export class mockBackendService extends InMemoryBackendService {
 
 export class mockApiDataService implements InMemoryDbService {
 
+  private readonly filterMap = {
+    'api/v1/service/logs': {
+      pathToCollection: 'logList',
+      filters: {
+        clusters: {
+          key: 'cluster'
+        },
+        component_name: {
+          key: 'type'
+        },
+        level: {
+          key: 'level'
+        },
+        iMessage: {
+          key: 'log_message',
+          filterFunction: (value, filterValue) => value.toLowerCase().indexOf(filterValue.toLowerCase()) > -1
+        },
+        start_time: {
+          key: 'logtime',
+          filterFunction: (value, filterValue) => value >= moment(filterValue).valueOf()
+        },
+        end_time: {
+          key: 'logtime',
+          filterFunction: (value, filterValue) => value < moment(filterValue).valueOf()
+        }
+      }
+    }
+  };
+
   parseUrl(url: string): any {
     const urlLocation = mockBackendService.prototype.getLocation(url),
       query = urlLocation.search && new URLSearchParams(urlLocation.search.substr(1)),
@@ -51,7 +82,7 @@ export class mockApiDataService implements InMemoryDbService {
       return interceptorArgs.passThruBackend.createConnection(interceptorArgs.requestInfo.req).response;
     } else {
       let is404 = false;
-      const data = pathArray.reduce((currentObject, currentKey, index, array) => {
+      const allData = pathArray.reduce((currentObject, currentKey, index, array) => {
         if (!currentObject && index < array.length - 1) {
           return {};
         } else if (currentObject.hasOwnProperty(currentKey)) {
@@ -66,9 +97,31 @@ export class mockApiDataService implements InMemoryDbService {
           interceptorArgs.requestInfo.req, 404, 'Not found'
         ))));
       } else {
+        let filteredData;
+        const filterMapItem = this.filterMap[path];
+        if (query && filterMapItem) {
+          filteredData = {};
+          const collection = allData[filterMapItem.pathToCollection],
+            filteredCollection = collection.filter(item => {
+            let result = true;
+            query.paramsMap.forEach((value, key) => {
+              const paramValue = value[0], // TODO implement multiple conditions
+                paramFilter = filterMapItem.filters[key];
+              if (paramFilter &&
+                ((paramFilter.filterFunction && !paramFilter.filterFunction(item[paramFilter.key], paramValue)) ||
+                (!paramFilter.filterFunction && item[paramFilter.key] !== paramValue))) {
+                result = false;
+              }
+            });
+            return result;
+          });
+          filteredData[filterMapItem.pathToCollection] = filteredCollection;
+        } else {
+          filteredData = allData;
+        }
         return new Observable<Response>((subscriber: Subscriber<Response>) => subscriber.next(new Response(new ResponseOptions({
           status: 200,
-          body: data
+          body: filteredData
         }))));
       }
     }
@@ -80,750 +133,6 @@ export class mockApiDataService implements InMemoryDbService {
   }
 
   createDb() {
-    return {
-      login: {},
-      api: {
-        v1: {
-          audit: {
-            logs: {
-              logList: [
-                {
-                  policy: 'policy',
-                  reason: 'Authentication required',
-                  result: 0,
-                  text: 'Please log in',
-                  tags: [
-                    'ambari_agent'
-                  ],
-                  resource: '/ambari-agent',
-                  sess: '0',
-                  access: '0',
-                  logType: 'AmbariAudit',
-                  tags_str: 'ambari_agent',
-                  resType: 'agent',
-                  reqUser: 'admin',
-                  reqData: 'data',
-                  repoType: 1,
-                  repo: 'ambari',
-                  proxyUsers: [
-                    'admin'
-                  ],
-                  evtTime: '2017-05-29T11:30:22.531Z',
-                  enforcer: 'ambari-acl',
-                  reqContext: 'ambari',
-                  cliType: 'GET',
-                  cliIP: '192.168.0.1',
-                  agent: 'agent',
-                  agentHost: 'localhost',
-                  action: 'SERVICE_CHECK',
-                  type: 'ambari-audit',
-                  _version_: 2,
-                  id: 'id0',
-                  file: 'ambari-agent.log',
-                  seq_num: 3,
-                  bundle_id: 'b0',
-                  case_id: 'c0',
-                  log_message: 'User(admin), Operation(SERVICE_CHECK)',
-                  logfile_line_number: 4,
-                  message_md5: '12345678900987654321',
-                  cluster: 'cl0',
-                  event_count: 0,
-                  event_md5: '09876543211234567890',
-                  event_dur_ms: 100,
-                  _ttl_: "+7DAYS",
-                  _expire_at_: '2017-05-29T11:30:22.531Z',
-                  _router_field_: 5
-                },
-                {
-                  policy: 'policy',
-                  reason: 'Server error',
-                  result: 1,
-                  text: 'Something went wrong',
-                  tags: [
-                    'ambari_agent'
-                  ],
-                  resource: '/ambari-agent',
-                  sess: '1',
-                  access: '1',
-                  logType: 'AmbariAudit',
-                  tags_str: 'ambari_server',
-                  resType: 'server',
-                  reqUser: 'user',
-                  reqData: 'data',
-                  repoType: 1,
-                  repo: 'ambari',
-                  proxyUsers: [
-                    'user'
-                  ],
-                  evtTime: '2017-05-29T11:30:22.531Z',
-                  enforcer: 'hdfs',
-                  reqContext: 'ambari_server',
-                  cliType: 'PUT',
-                  cliIP: '192.168.0.1',
-                  agent: 'agent',
-                  agentHost: 'localhost',
-                  action: 'SERVICE_CHECK',
-                  type: 'ambari-audit',
-                  _version_: 4,
-                  id: 'id1',
-                  file: 'ambari-agent.log',
-                  seq_num: 5,
-                  bundle_id: 'b1',
-                  case_id: 'c1',
-                  log_message: 'User(user), Operation(SERVICE_CHECK)',
-                  logfile_line_number: 6,
-                  message_md5: '10293847561029384756',
-                  cluster: 'cl1',
-                  event_count: 2,
-                  event_md5: '01928374650192837465',
-                  event_dur_ms: 500,
-                  _ttl_: "+7DAYS",
-                  _expire_at_: '2017-05-29T11:30:22.531Z',
-                  _router_field_: 10
-                }
-              ],
-              bargraph: {
-                graphData: [
-                  {
-                    dataCount: [
-                      {
-                        name: 'n0',
-                        value: 1
-                      },
-                      {
-                        name: 'n1',
-                        value: 2
-                      }
-                    ],
-                    name: 'graph0'
-                  },
-                  {
-                    dataCount: [
-                      {
-                        name: 'n2',
-                        value: 10
-                      },
-                      {
-                        name: 'n3',
-                        value: 20
-                      }
-                    ],
-                    name: 'graph1'
-                  }
-                ]
-              },
-              components: {},
-              resources: {
-                graphData: [
-                  {
-                    dataCount: [
-                      {
-                        name: 'n16',
-                        value: 800
-                      },
-                      {
-                        name: 'n17',
-                        value: 400
-                      }
-                    ],
-                    name: 'graph8'
-                  },
-                  {
-                    dataCount: [
-                      {
-                        name: 'n18',
-                        value: 600
-                      },
-                      {
-                        name: 'n19',
-                        value: 300
-                      }
-                    ],
-                    name: 'graph9'
-                  }
-                ]
-              },
-              schema: {
-                fields: ''
-              },
-              serviceload: {
-                graphData: [
-                  {
-                    dataCount: [
-                      {
-                        name: 'n4',
-                        value: 1
-                      },
-                      {
-                        name: 'n5',
-                        value: 2
-                      }
-                    ],
-                    name: 'graph2'
-                  },
-                  {
-                    dataCount: [
-                      {
-                        name: 'n6',
-                        value: 10
-                      },
-                      {
-                        name: 'n7',
-                        value: 20
-                      }
-                    ],
-                    name: 'graph3'
-                  }
-                ]
-              }
-            }
-          },
-          public: {
-            config: {}
-          },
-          service: {
-            logs: {
-              logList: [
-                {
-                  path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
-                  host: 'h0',
-                  level: 'WARN',
-                  logtime: '2017-05-28T11:30:22.531Z',
-                  ip: '192.168.0.1',
-                  logfile_line_number: 8,
-                  type: 'ams_collector',
-                  _version_: 9,
-                  id: 'id2',
-                  file: 'ambari-metrics-collector.log',
-                  seq_num: 10,
-                  bundle_id: 'b2',
-                  case_id: 'c2',
-                  log_message: 'Connection refused',
-                  message_md5: '1357908642',
-                  cluster: 'cl2',
-                  event_count: 5,
-                  event_md5: '1908755391',
-                  event_dur_ms: 200,
-                  _ttl_: "+5DAYS",
-                  _expire_at_: '2017-05-29T11:30:22.531Z',
-                  _router_field_: 20
-                },
-                {
-                  path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
-                  host: 'h1',
-                  level: 'ERROR',
-                  logtime: '2017-05-28T10:30:22.531Z',
-                  ip: '192.168.0.2',
-                  type: 'ams_collector',
-                  _version_: 14,
-                  id: 'id3',
-                  file: 'ambari-metrics-collector.log',
-                  seq_num: 15,
-                  bundle_id: 'b3',
-                  case_id: 'c3',
-                  log_message: 'Connection refused',
-                  logfile_line_number: 16,
-                  message_md5: '1357908642',
-                  cluster: 'cl3',
-                  event_count: 2,
-                  event_md5: '1029384756',
-                  event_dur_ms: 700,
-                  _ttl_: "+5DAYS",
-                  _expire_at_: '2017-05-29T10:30:22.531Z',
-                  _router_field_: 5
-                }
-              ],
-              aggregated: {
-                graphData: [
-                  {
-                    name: 'n0',
-                    count: 100,
-                    dataList: [
-                      {
-                        name: 'n1',
-                        count: 50,
-                        dataList: null
-                      },
-                      {
-                        name: 'n2',
-                        count: 200,
-                        dataList: null
-                      }
-                    ]
-                  },
-                  {
-                    name: 'n3',
-                    count: 10,
-                    dataList: [
-                      {
-                        name: 'n4',
-                        count: 5,
-                        dataList: null
-                      },
-                      {
-                        name: 'n5',
-                        count: 20,
-                        dataList: null
-                      }
-                    ]
-                  }
-                ]
-              },
-              components: {
-                count: {
-                  anygraph: {
-                    graphData: [
-                      {
-                        dataCount: [
-                          {
-                            name: 'n8',
-                            value: 50
-                          },
-                          {
-                            name: 'n9',
-                            value: 100
-                          }
-                        ],
-                        name: 'graph4'
-                      },
-                      {
-                        dataCount: [
-                          {
-                            name: 'n10',
-                            value: 5
-                          },
-                          {
-                            name: 'n11',
-                            value: 10
-                          }
-                        ],
-                        name: 'graph5'
-                      }
-                    ]
-                  }
-                },
-                levels: {
-                  counts: {
-                    vNodeList: [
-                      {
-                        name: 'ambari',
-                        type: 0,
-                        logLevelCount: [
-                          {
-                            name: 'ERROR',
-                            value: '10'
-                          },
-                          {
-                            name: 'WARN',
-                            value: '50'
-                          }
-                        ],
-                        childs: [
-                          {
-                            name: 'hdfs',
-                            type: 2,
-                            logLevelCount: [
-                              {
-                                name: 'ERROR',
-                                value: '10'
-                              },
-                              {
-                                name: 'WARN',
-                                value: '20'
-                              }
-                            ],
-                            isParent: false,
-                            isRoot: false
-                          },
-                          {
-                            name: 'zookeeper',
-                            type: 3,
-                            logLevelCount: [
-                              {
-                                name: 'ERROR',
-                                value: '20'
-                              },
-                              {
-                                name: 'WARN',
-                                value: '40'
-                              }
-                            ],
-                            isParent: false,
-                            isRoot: false
-                          }
-                        ],
-                        isParent: true,
-                        isRoot: false
-                      },
-                      {
-                        name: 'ambari_agent',
-                        type: 1,
-                        logLevelCount: [
-                          {
-                            name: 'ERROR',
-                            value: '100'
-                          },
-                          {
-                            name: 'WARN',
-                            value: '500'
-                          }
-                        ],
-                        isParent: false,
-                        isRoot: false
-                      }
-                    ]
-                  }
-                }
-              },
-              files: {
-                hostLogFiles: {
-                  clusters: [
-                    'c0',
-                    'c1'
-                  ],
-                  services: [
-                    'hdfs',
-                    'zookeeper'
-                  ]
-                }
-              },
-              histogram: {
-                graphData: [
-                  {
-                    dataCount: [
-                      {
-                        name: 'n12',
-                        value: 1000
-                      },
-                      {
-                        name: 'n13',
-                        value: 2000
-                      }
-                    ],
-                    name: 'graph6'
-                  },
-                  {
-                    dataCount: [
-                      {
-                        name: 'n14',
-                        value: 700
-                      },
-                      {
-                        name: 'n15',
-                        value: 900
-                      }
-                    ],
-                    name: 'graph7'
-                  }
-                ]
-              },
-              hosts: {
-                components: {
-                  vNodeList: [
-                    {
-                      name: 'ambari',
-                      type: 0,
-                      logLevelCount: [
-                        {
-                          name: 'ERROR',
-                          value: '100'
-                        },
-                        {
-                          name: 'WARN',
-                          value: '500'
-                        }
-                      ],
-                      childs: [
-                        {
-                          name: 'ambari_metrics',
-                          type: 2,
-                          logLevelCount: [
-                            {
-                              name: 'ERROR',
-                              value: '100'
-                            },
-                            {
-                              name: 'WARN',
-                              value: '200'
-                            }
-                          ],
-                          isParent: false,
-                          isRoot: false
-                        },
-                        {
-                          name: 'hbase',
-                          type: 3,
-                          logLevelCount: [
-                            {
-                              name: 'ERROR',
-                              value: '200'
-                            },
-                            {
-                              name: 'WARN',
-                              value: '400'
-                            }
-                          ],
-                          isParent: false,
-                          isRoot: false
-                        }
-                      ],
-                      isParent: true,
-                      isRoot: false
-                    },
-                    {
-                      name: 'ambari_server',
-                      type: 1,
-                      logLevelCount: [
-                        {
-                          name: 'ERROR',
-                          value: '1000'
-                        },
-                        {
-                          name: 'WARN',
-                          value: '5000'
-                        }
-                      ],
-                      isParent: false,
-                      isRoot: false
-                    }
-                  ]
-                },
-                count: {
-                  getvCounts: [
-                    {
-                      name: 'n20',
-                      count: 100
-                    },
-                    {
-                      name: 'n21',
-                      count: 200
-                    }
-                  ]
-                }
-              },
-              levels: {
-                counts: {
-                  getvNameValues: [
-                    {
-                      name: 'n22',
-                      count: 1000
-                    },
-                    {
-                      name: 'n23',
-                      count: 2000
-                    }
-                  ]
-                }
-              },
-              schema: {
-                fields: ''
-              },
-              serviceconfig: '',
-              tree: {
-                vNodeList: [
-                  {
-                    name: 'ambari',
-                    type: 0,
-                    logLevelCount: [
-                      {
-                        name: 'ERROR',
-                        value: '1000'
-                      },
-                      {
-                        name: 'WARN',
-                        value: '5000'
-                      }
-                    ],
-                    childs: [
-                      {
-                        name: 'yarn',
-                        type: 2,
-                        logLevelCount: [
-                          {
-                            name: 'ERROR',
-                            value: '1000'
-                          },
-                          {
-                            name: 'WARN',
-                            value: '2000'
-                          }
-                        ],
-                        isParent: false,
-                        isRoot: false
-                      },
-                      {
-                        name: 'hive',
-                        type: 3,
-                        logLevelCount: [
-                          {
-                            name: 'ERROR',
-                            value: '2000'
-                          },
-                          {
-                            name: 'WARN',
-                            value: '4000'
-                          }
-                        ],
-                        isParent: false,
-                        isRoot: false
-                      }
-                    ],
-                    isParent: true,
-                    isRoot: false
-                  },
-                  {
-                    name: 'ambari_server',
-                    type: 1,
-                    logLevelCount: [
-                      {
-                        name: 'ERROR',
-                        value: '10000'
-                      },
-                      {
-                        name: 'WARN',
-                        value: '50000'
-                      }
-                    ],
-                    isParent: false,
-                    isRoot: false
-                  }
-                ]
-              },
-              truncated: {
-                logList: [
-                  {
-                    path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
-                    host: 'h0',
-                    level: 'WARN',
-                    logtime: '2017-05-28T11:30:22.531Z',
-                    ip: '192.168.0.1',
-                    logfile_line_number: 8,
-                    type: 'ams_collector',
-                    _version_: 9,
-                    id: 'id2',
-                    file: 'ambari-metrics-collector.log',
-                    seq_num: 10,
-                    bundle_id: 'b2',
-                    case_id: 'c2',
-                    log_message: 'Connection refused',
-                    message_md5: '1357908642',
-                    cluster: 'cl2',
-                    event_count: 5,
-                    event_md5: '1908755391',
-                    event_dur_ms: 200,
-                    _ttl_: "+5DAYS",
-                    _expire_at_: '2017-05-29T11:30:22.531Z',
-                    _router_field_: 20
-                  },
-                  {
-                    path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
-                    host: 'h1',
-                    level: 'ERROR',
-                    logtime: '2017-05-28T10:30:22.531Z',
-                    ip: '192.168.0.2',
-                    type: 'ams_collector',
-                    _version_: 14,
-                    id: 'id3',
-                    file: 'ambari-metrics-collector.log',
-                    seq_num: 15,
-                    bundle_id: 'b3',
-                    case_id: 'c3',
-                    log_message: 'Connection refused',
-                    logfile_line_number: 16,
-                    message_md5: '1357908642',
-                    cluster: 'cl3',
-                    event_count: 2,
-                    event_md5: '1029384756',
-                    event_dur_ms: 700,
-                    _ttl_: "+5DAYS",
-                    _expire_at_: '2017-05-29T10:30:22.531Z',
-                    _router_field_: 5
-                  }
-                ]
-              }
-            }
-          },
-          status: {
-            auditlogs: {
-              znodeReady: true,
-              solrCollectionReady: true,
-              solrAliasReady: false,
-              configurationUploaded: true
-            },
-            servicelogs: {
-              znodeReady: true,
-              solrCollectionReady: true,
-              configurationUploaded: true
-            },
-            userconfig: {
-              znodeReady: true,
-              solrCollectionReady: true,
-              configurationUploaded: true
-            }
-          },
-          userconfig: {
-            userConfigList: [
-              {
-                id: 'c0',
-                userName: 'admin',
-                filtername: 'service',
-                values: 'hdfs',
-                shareNameList: [
-                  's0',
-                  's1'
-                ],
-                rowType: 'history'
-              },
-              {
-                id: 'c0',
-                userName: 'user',
-                filtername: 'component',
-                values: 'namenode',
-                shareNameList: [
-                  's2',
-                  's3'
-                ],
-                rowType: 'history'
-              }
-            ],
-            filters: {
-              filter0: {
-                label: 'filter0',
-                hosts: [
-                  'h0',
-                  'h1'
-                ],
-                defaultLevels: [
-                  'l0',
-                  'l1'
-                ],
-                overrideLevels: [
-                  'l2',
-                  'l3'
-                ],
-                expiryTime: '2017-05-29T11:30:22.531Z'
-              },
-              filter1: {
-                label: 'filter1',
-                hosts: [
-                  'h1',
-                  'h2'
-                ],
-                defaultLevels: [
-                  'l4',
-                  'l5'
-                ],
-                overrideLevels: [
-                  'l6',
-                  'l7'
-                ],
-                expiryTime: '2017-05-30T11:30:22.531Z'
-              }
-            },
-            names: []
-          }
-        }
-      }
-    };
+    return mockData;
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/variables.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/variables.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/variables.less
index a8c71d1..9a8ea09 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/variables.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/variables.less
@@ -26,8 +26,10 @@
 @block-margin-top: 20px;
 @link-color: #1491C1;
 @link-hover-color: #23527C;
+@grey-color: #666;
+@default-line-height: 1.42857143;
+@main-background-color: #ECECEC;
 
-// TODO implement actual colors
 @fatal-color: #830A0A;
 @error-color: #E81D1D;
 @warning-color: #FF8916;
@@ -36,9 +38,6 @@
 @trace-color: #888;
 @unknown-color: #BDBDBD;
 
-@grey-color: #666;
-@default-line-height: 1.42857143;
-
 // Mixins
 .flex-vertical-align {
   display: flex;


[17/21] ambari git commit: AMBARI-21320 Log Search UI: implement log entries display. (ababiichuk)

Posted by ab...@apache.org.
AMBARI-21320 Log Search UI: implement log entries display. (ababiichuk)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/c3d8e311
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/c3d8e311
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/c3d8e311

Branch: refs/heads/branch-feature-logsearch-ui
Commit: c3d8e31112105898ee0183cb3233fa8057bd5ab8
Parents: a0e713d
Author: ababiichuk <ab...@hortonworks.com>
Authored: Wed Jun 14 14:48:40 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jun 22 15:43:34 2017 +0300

----------------------------------------------------------------------
 .../accordion-panel.component.html              |  25 ++++
 .../accordion-panel.component.less              |  42 +++++++
 .../accordion-panel.component.spec.ts           |  42 +++++++
 .../accordion-panel.component.ts                |  38 ++++++
 .../src/app/app.component.less                  |  40 +++---
 .../src/app/app.module.ts                       |   9 +-
 .../filter-dropdown.component.less              |   2 +-
 .../filter-text-field.component.less            |   2 +-
 .../filters-panel/filters-panel.component.less  |   2 +-
 .../app/login-form/login-form.component.less    |   4 +-
 .../src/app/login-form/login-form.component.ts  |   5 +-
 .../src/app/logs-list/logs-list.component.html  |  35 ++++++
 .../src/app/logs-list/logs-list.component.less  | 125 +++++++++++++++++++
 .../app/logs-list/logs-list.component.spec.ts   |  44 +++++++
 .../src/app/logs-list/logs-list.component.ts    |  79 ++++++++++++
 .../main-container.component.html               |   1 +
 .../src/app/services/http-client.service.ts     |   7 +-
 .../src/app/top-menu/top-menu.component.less    |   2 +-
 .../src/app/top-menu/top-menu.component.ts      |   2 +-
 .../src/app/variables.less                      |  88 +++++++++++++
 .../ambari-logsearch-web-new/src/main.ts        |   8 +-
 .../ambari-logsearch-web-new/src/styles.less    |  18 ---
 22 files changed, 565 insertions(+), 55 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.html
new file mode 100644
index 0000000..b2ce3a0
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.html
@@ -0,0 +1,25 @@
+<!--
+  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.
+-->
+
+<div class="panel panel-default">
+  <div class="panel-body">
+    <ng-template [ngTemplateOutlet]="template"></ng-template>
+    <div class="accordion-toggle">
+      <span class="fa collapsed toggle-icon" data-toggle="collapse" [attr.data-target]="'#' + toggleId" aria-expanded="false">&nbsp;</span>
+    </div>
+  </div>
+</div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.less
new file mode 100644
index 0000000..f3630bb
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.less
@@ -0,0 +1,42 @@
+/*
+ * 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.
+ */
+
+@import '../variables';
+
+.panel-body {
+  position: relative;
+
+  .accordion-toggle {
+    position: absolute;
+
+    // TODO get rid of magic numbers, base on actual design
+    right: 10px;
+    top: 15px;
+
+    .toggle-icon {
+      .clickable-item;
+
+      &:before {
+        content: '\F077';
+      }
+
+      &.collapsed:before {
+        content: '\F078';
+      }
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.spec.ts
new file mode 100644
index 0000000..d1b185e
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.spec.ts
@@ -0,0 +1,42 @@
+/*
+ * 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.
+ */
+
+import {async, ComponentFixture, TestBed} from '@angular/core/testing';
+
+import {AccordionPanelComponent} from './accordion-panel.component';
+
+describe('AccordionPanelComponent', () => {
+  let component: AccordionPanelComponent;
+  let fixture: ComponentFixture<AccordionPanelComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [AccordionPanelComponent]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(AccordionPanelComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create component', () => {
+    expect(component).toBeTruthy();
+  });
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.ts
new file mode 100644
index 0000000..ae7fd7e
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.ts
@@ -0,0 +1,38 @@
+/*
+ * 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.
+ */
+
+import {Component, OnInit, Input, ContentChild, TemplateRef} from '@angular/core';
+
+@Component({
+  selector: 'accordion-panel',
+  templateUrl: './accordion-panel.component.html',
+  styleUrls: ['./accordion-panel.component.less']
+})
+export class AccordionPanelComponent implements OnInit {
+
+  constructor() { }
+
+  ngOnInit() {
+  }
+
+  @Input()
+  private toggleId: string;
+
+  @ContentChild(TemplateRef)
+  private template;
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
index 3affd3f..fba0ae6 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
@@ -15,29 +15,33 @@
  * limitations under the License.
  */
 
-@import '../styles.less';
+@import 'variables';
 
-.navbar {
-  margin-bottom: 0;
-  border-radius: 0;
-  background-color: @navbar-background-color;
-  color: #fff;
+:host {
+  line-height: @default-line-height;
 
-  .container-fluid {
-    .default-flex;
-  }
+  .navbar {
+    margin-bottom: 0;
+    border-radius: 0;
+    background-color: @navbar-background-color;
+    color: #fff;
+
+    .container-fluid {
+      .default-flex;
+    }
 
-  h1 {
-    flex-basis: 70%;
-    margin-bottom: @h1-vertical-margin;
-    text-transform: uppercase;
+    h1 {
+      flex-basis: 70%;
+      margin-bottom: @h1-vertical-margin;
+      text-transform: uppercase;
 
-    &.full-flex-width {
-      flex-basis: 100%;
+      &.full-flex-width {
+        flex-basis: 100%;
+      }
     }
-  }
 
-  /deep/ top-menu {
-    flex-basis: 30%;
+    /deep/ top-menu {
+      flex-basis: 30%;
+    }
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
index f7221b3..659172d 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
@@ -47,6 +47,8 @@ import {FiltersPanelComponent} from '@app/filters-panel/filters-panel.component'
 import {FilterDropdownComponent} from '@app/filter-dropdown/filter-dropdown.component';
 import {DropdownListComponent} from '@app/dropdown-list/dropdown-list.component';
 import {FilterTextFieldComponent} from '@app/filter-text-field/filter-text-field.component';
+import {AccordionPanelComponent} from '@app/accordion-panel/accordion-panel.component';
+import {LogsListComponent} from '@app/logs-list/logs-list.component';
 
 export function HttpLoaderFactory(http: Http) {
   return new TranslateHttpLoader(http, 'assets/i18n/', '.json');
@@ -62,14 +64,17 @@ export function HttpLoaderFactory(http: Http) {
     FiltersPanelComponent,
     DropdownListComponent,
     FilterDropdownComponent,
-    FilterTextFieldComponent
+    FilterTextFieldComponent,
+    AccordionPanelComponent,
+    LogsListComponent
   ],
   imports: [
     BrowserModule,
     FormsModule,
     HttpModule,
     InMemoryWebApiModule.forRoot(mockApiDataService, {
-      passThruUnknownUrl: true
+      passThruUnknownUrl: true,
+      rootPath: ''
     }),
     AlertModule.forRoot(),
     TranslateModule.forRoot({

http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.less
index c3a25cb..2c97a17 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.less
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-@import '../../styles.less';
+@import '../variables';
 
 :host {
   position: relative;

http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.less
index b5e65c9..3a9dcac 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.less
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-@import '../../styles.less';
+@import '../variables';
 
 .input-group {
   border: @input-border;

http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.less
index b393196..d2400a4 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.less
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-@import '../../styles.less';
+@import '../variables';
 
 .filter-input-container {
   .flex-vertical-align;

http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.less
index 7e37ea1..b84296a 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.less
@@ -15,8 +15,8 @@
  * limitations under the License.
  */
 
-@import '../../styles.less';
+@import '../variables';
 
 .login-form {
-  margin-top: @login-form-top-margin;
+  margin-top: @block-margin-top;
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.ts
index 61d1fa1..2a93775 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.ts
@@ -43,13 +43,10 @@ export class LoginFormComponent implements OnInit {
 
   login() {
     this.isRequestInProgress = true;
-    /*
-    TODO uncomment for using the real server
     this.httpClient.post('login', {
       username: this.username,
       password: this.password
-    })*/
-    this.httpClient.get('api/login').finally(() => {
+    }).finally(() => {
       this.isRequestInProgress = false;
     }).subscribe(() => {
       this.isLoginAlertDisplayed = false;

http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.html
new file mode 100644
index 0000000..cf4bb57
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.html
@@ -0,0 +1,35 @@
+<!--
+  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.
+-->
+
+<accordion-panel *ngFor="let log of logs; let i = index" [toggleId]="'details-' + i" class="col-md-12">
+  <ng-template>
+    <div [ngClass]="'hexagon ' + log.level"></div>
+    <div [ngClass]="'col-md-1 log-status ' + log.level">{{log.level}}</div>
+    <div class="col-md-3">
+      <div class="log-type">{{log.type}}</div>
+      <time class="log-time">{{log.time}}</time>
+    </div>
+    <div class="col-md-6 log-content-wrapper">
+      <div class="collapse log-actions" [attr.id]="'details-' + i">
+        <span class="action-icon fa fa-search"></span>
+        <span class="action-icon fa fa-external-link"></span>
+        <span class="action-icon fa fa-bullseye"></span>
+      </div>
+      <div class="log-content" [innerHTML]="log.content"></div>
+    </div>
+  </ng-template>
+</accordion-panel>

http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.less
new file mode 100644
index 0000000..1179e55
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.less
@@ -0,0 +1,125 @@
+/*
+ * 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.
+ */
+
+@import '../variables';
+
+:host {
+  display: block;
+  margin-top: @block-margin-top;
+
+  .hexagon {
+    // TODO get rid of magic numbers, base on actual design
+    left: -7.5px;
+
+    &.fatal {
+      .common-hexagon(15px, @fatal-color);
+    }
+
+    &.error {
+      .common-hexagon(15px, @error-color);
+    }
+
+    &.warn {
+      .common-hexagon(15px, @warning-color);
+    }
+
+    &.info {
+      .common-hexagon(15px, @info-color);
+    }
+
+    &.debug {
+      .common-hexagon(15px, @debug-color);
+    }
+
+    &.trace {
+      .common-hexagon(15px, @trace-color);
+    }
+
+    &.unknown {
+      .common-hexagon(15px, @unknown-color);
+    }
+  }
+
+  .log-status {
+    text-transform: uppercase;
+
+    &.fatal {
+      color: @fatal-color;
+    }
+
+    &.error {
+      color: @error-color;
+    }
+
+    &.warn {
+      color: @warning-color;
+    }
+
+    &.info {
+      color: @info-color;
+    }
+
+    &.debug {
+      color: @debug-color;
+    }
+
+    &.trace {
+      color: @trace-color;
+    }
+
+    &.unknown {
+      color: @unknown-color;
+    }
+  }
+
+  .log-type {
+    color: @link-color;
+  }
+
+  .log-time {
+    color: @grey-color;
+  }
+
+  .log-content-wrapper {
+    position: relative;
+
+    // TODO get rid of magic numbers, base on actual design
+    .log-content {
+      overflow: hidden;
+      max-height: @default-line-height * 2em;
+      padding-right: 65px;
+    }
+
+    .log-actions {
+      position: absolute;
+      right: 40px;
+      top: 0;
+      border: @input-border;
+
+      &.collapsing + .log-content, &.collapse.in + .log-content {
+        min-height: 6em;
+        max-height: none;
+      }
+
+      .action-icon {
+        .clickable-item;
+        display: block;
+        padding: 5px;
+      }
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.spec.ts
new file mode 100644
index 0000000..6442864
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.spec.ts
@@ -0,0 +1,44 @@
+/*
+ * 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.
+ */
+
+import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
+import {async, ComponentFixture, TestBed} from '@angular/core/testing';
+
+import {LogsListComponent} from './logs-list.component';
+
+describe('LogsListComponent', () => {
+  let component: LogsListComponent;
+  let fixture: ComponentFixture<LogsListComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [LogsListComponent],
+      schemas: [CUSTOM_ELEMENTS_SCHEMA]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(LogsListComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create component', () => {
+    expect(component).toBeTruthy();
+  });
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.ts
new file mode 100644
index 0000000..107fb0d
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.ts
@@ -0,0 +1,79 @@
+/*
+ * 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.
+ */
+
+import {Component, OnInit} from '@angular/core';
+
+@Component({
+  selector: 'logs-list',
+  templateUrl: './logs-list.component.html',
+  styleUrls: ['./logs-list.component.less']
+})
+export class LogsListComponent implements OnInit {
+
+  constructor() {
+  }
+
+  ngOnInit() {
+  }
+
+  // TODO implement loading logs from API
+  private readonly logs = [
+    {
+      level: 'fatal',
+      type: 'ambari_agent',
+      time: '2017/01/31 18:00:00',
+      content: 'Something went wrong.<br>Please restart ambari-agent.<br>See log file for details.'
+    },
+    {
+      level: 'error',
+      type: 'ambari_agent',
+      time: '2017/01/31 18:00:00',
+      content: 'Something went wrong.<br>Please restart ambari-agent.<br>See log file for details.'
+    },
+    {
+      level: 'warn',
+      type: 'ambari_agent',
+      time: '2017/01/31 18:00:00',
+      content: 'Something went wrong.<br>Please restart ambari-agent.<br>See log file for details.'
+    },
+    {
+      level: 'info',
+      type: 'ambari_agent',
+      time: '2017/01/31 18:00:00',
+      content: 'Something went wrong.<br>Please restart ambari-agent.<br>See log file for details.'
+    },
+    {
+      level: 'debug',
+      type: 'ambari_agent',
+      time: '2017/01/31 18:00:00',
+      content: 'Something went wrong.<br>Please restart ambari-agent.<br>See log file for details.'
+    },
+    {
+      level: 'trace',
+      type: 'ambari_agent',
+      time: '2017/01/31 18:00:00',
+      content: 'Something went wrong.<br>Please restart ambari-agent.<br>See log file for details.'
+    },
+    {
+      level: 'unknown',
+      type: 'ambari_agent',
+      time: '2017/01/31 18:00:00',
+      content: 'Something went wrong.<br>Please restart ambari-agent.<br>See log file for details.'
+    }
+  ];
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.html
index bc641a6..34af2b8 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.html
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.html
@@ -17,3 +17,4 @@
 
 <login-form *ngIf="!httpClient.isAuthorized"></login-form>
 <filters-panel *ngIf="httpClient.isAuthorized" class="row"></filters-panel>
+<logs-list *ngIf="httpClient.isAuthorized"></logs-list>

http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts
index 2aa87f9..2b69f45 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts
@@ -21,6 +21,7 @@ import {Observable} from 'rxjs/Observable';
 import {Http, XHRBackend, Request, RequestOptions, RequestOptionsArgs, Response} from '@angular/http';
 import 'rxjs/add/operator/map';
 import 'rxjs/add/operator/catch';
+import {environment} from '@app/../environments/environment';
 
 @Injectable()
 export class HttpClientService extends Http {
@@ -32,7 +33,8 @@ export class HttpClientService extends Http {
   private readonly apiPrefix = 'api/v1/';
 
   private readonly urls = {
-    status: 'status'
+    status: 'status',
+    auditLogs: 'audit/logs'
   };
 
   private readonly unauthorizedStatuses = [401, 403, 419];
@@ -73,7 +75,8 @@ export class HttpClientService extends Http {
   }
 
   post(url: string, body: any, options?: RequestOptionsArgs):Observable<Response> {
-    return super.post(this.generateUrlString(url), body, options);
+    return environment.production ?
+      super.post(this.generateUrlString(url), body, options) : super.get(this.generateUrlString(url), options);
   }
 
   put(url: string, body: any, options?: RequestOptionsArgs):Observable<Response> {

http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less
index 8728ecf..2e8e77a 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-@import '../../styles.less';
+@import '../variables';
 
 :host {
   .default-flex;

http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts
index bad588b..73b6131 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts
@@ -77,7 +77,7 @@ export class TopMenuComponent implements OnInit {
       action: 'refresh'
     },
     {
-      iconClass: 'fa fa-clock-o',
+      iconClass: 'fa fa-history',
       label: 'topMenu.history',
       labelClass: 'unstyled-link',
       action: 'openHistory',

http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/variables.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/variables.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/variables.less
new file mode 100644
index 0000000..a8c71d1
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/variables.less
@@ -0,0 +1,88 @@
+/**
+ * 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.
+ */
+
+// Variables
+@navbar-background-color: #323544;
+@h1-vertical-margin: 20px;
+@button-border-radius: 4px;
+@input-border: 1px solid #CFD3D7;
+@button-border-radius: 4px;
+@input-group-addon-padding: 6px 12px;
+@block-margin-top: 20px;
+@link-color: #1491C1;
+@link-hover-color: #23527C;
+
+// TODO implement actual colors
+@fatal-color: #830A0A;
+@error-color: #E81D1D;
+@warning-color: #FF8916;
+@info-color: #2577B5;
+@debug-color: #65E8FF;
+@trace-color: #888;
+@unknown-color: #BDBDBD;
+
+@grey-color: #666;
+@default-line-height: 1.42857143;
+
+// Mixins
+.flex-vertical-align {
+  display: flex;
+  align-items: center;
+}
+
+.default-flex {
+  .flex-vertical-align;
+  justify-content: space-between;
+}
+
+.common-hexagon(@side, @color) {
+  display: block;
+  position: absolute;
+  margin: (@side / 3.464101615) 0;
+  width: @side;
+  height: @side / 1.732050808;
+  background-color: @color;
+
+  &:before, &:after {
+    display: block;
+    position: absolute;
+    width: 0;
+    border-left: (@side / 2) solid transparent;
+    border-right: (@side / 2) solid transparent;
+    content: '';
+  }
+
+  &:before {
+    bottom: 100%;
+    border-bottom: (@side / 3.464101615) solid @color;
+  }
+
+  &:after {
+    top: 100%;
+    border-top: (@side / 3.464101615) solid @color;
+  }
+}
+
+.clickable-item {
+  cursor: pointer;
+  color: @link-color;
+
+  &:hover {
+    color: @link-hover-color;
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/main.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/main.ts b/ambari-logsearch/ambari-logsearch-web-new/src/main.ts
index e3aeec1..dfabf38 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/main.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/main.ts
@@ -16,11 +16,11 @@
  * limitations under the License.
  */
 
-import { enableProdMode } from '@angular/core';
-import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
+import {enableProdMode} from '@angular/core';
+import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
 
-import { AppModule } from './app/app.module';
-import { environment } from './environments/environment';
+import {AppModule} from './app/app.module';
+import {environment} from './environments/environment';
 
 if (environment.production) {
   enableProdMode();

http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/styles.less b/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
index db6da5c..5d5f1e3 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
@@ -15,21 +15,3 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-@navbar-background-color: #323544;
-@h1-vertical-margin: 20px;
-@button-border-radius: 4px;
-@input-border: 1px solid #CFD3D7;
-@button-border-radius: 4px;
-@input-group-addon-padding: 6px 12px;
-@login-form-top-margin: 20px;
-
-.flex-vertical-align {
-  display: flex;
-  align-items: center;
-}
-
-.default-flex {
-  .flex-vertical-align;
-  justify-content: space-between;
-}


[16/21] ambari git commit: AMBARI-21312 Provide Log Search UI authorization functionality (additional patch). (ababiichuk)

Posted by ab...@apache.org.
AMBARI-21312 Provide Log Search UI authorization functionality (additional patch). (ababiichuk)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/a0e713df
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/a0e713df
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/a0e713df

Branch: refs/heads/branch-feature-logsearch-ui
Commit: a0e713dfd719daba1dff3de041b47e5f2c9d57b6
Parents: 6fc2fef
Author: ababiichuk <ab...@hortonworks.com>
Authored: Mon Jun 12 13:01:21 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jun 22 15:42:28 2017 +0300

----------------------------------------------------------------------
 .../src/app/login-form/login-form.component.ts                  | 5 ++++-
 .../src/app/services/mock-api-data.service.ts                   | 1 +
 2 files changed, 5 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/a0e713df/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.ts
index 2a93775..61d1fa1 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.ts
@@ -43,10 +43,13 @@ export class LoginFormComponent implements OnInit {
 
   login() {
     this.isRequestInProgress = true;
+    /*
+    TODO uncomment for using the real server
     this.httpClient.post('login', {
       username: this.username,
       password: this.password
-    }).finally(() => {
+    })*/
+    this.httpClient.get('api/login').finally(() => {
       this.isRequestInProgress = false;
     }).subscribe(() => {
       this.isLoginAlertDisplayed = false;

http://git-wip-us.apache.org/repos/asf/ambari/blob/a0e713df/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
index be39536..ff2ed2c 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
@@ -21,6 +21,7 @@ import {InMemoryDbService} from 'angular-in-memory-web-api';
 export class mockApiDataService implements InMemoryDbService {
   createDb() {
     return {
+      login: {},
       audit: {
         logs: {
           logList: [