You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@falcon.apache.org by so...@apache.org on 2015/10/13 02:03:54 UTC

[01/22] falcon git commit: FALCON-1315 Update falcon ui for HiveDR, secure clusters and bug fixes. Contributed by Armando Reyna/Venkat Ranganathan.

Repository: falcon
Updated Branches:
  refs/heads/master d81820082 -> 86180d932


http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/express-data/mockData.js
----------------------------------------------------------------------
diff --git a/falcon-ui/express-data/mockData.js b/falcon-ui/express-data/mockData.js
index cdd783c..1c52358 100644
--- a/falcon-ui/express-data/mockData.js
+++ b/falcon-ui/express-data/mockData.js
@@ -16,34 +16,110 @@
  * limitations under the License.
  */
 (function () {
-  'use strict';  
-  
+  'use strict';
+
   function findByNameInList(type, name) {
     var i;
     for (i = 0; i < entitiesList[type].entity.length; i++) {
-      if (entitiesList[type].entity[i]["name"] === name) {       
-        return i;     
+      if (entitiesList[type].entity[i]["name"] === name) {
+        return i;
+      }
+    }
+  };
+
+  function findByStartEnd(type, start, end) {
+    for (var i = 0; i < instancesList[type].length; i++) {
+      if (instancesList[type][i].startTime === start && instancesList[type][i].endTime === end) {
+        return i;
       }
-    } 
-  }
+    }
+  };
 
   var entitiesList = {
     cluster : {
       "entity":[
-        {"type":"cluster","name":"completeCluster","status":"SUBMITTED","list":{"tag":["uruguay=mvd","argentina=bsas","mexico=mex", "usa=was"]}},
+        {"type":"cluster","name":"completeCluster","status":"SUBMITTED","tags":{"tag":["uruguay=mvd","argentina=bsas","mexico=mex", "usa=was"]}},
         {"type":"cluster","name":"primaryCluster","status":"SUBMITTED"}
       ]
     },
     feed: {
       "entity":[
-        {"type":"FEED","name":"feedOne","status":"SUBMITTED","list":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
-        {"type":"FEED","name":"feedTwo","status":"RUNNING","list":{"tag":["owner=USMarketing","classification=Secure","externalSource=USProdEmailServers","externalTarget=BITools"]}}
+        {"type":"FEED","name":"feedOne","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}, "clusters": {"cluster":"primaryCluster"}},
+        {"type":"FEED","name":"feedTwo","status":"RUNNING","tags":{"tag":["owner=USMarketing","classification=Secure","externalSource=USProdEmailServers","externalTarget=BITools"]}, "clusters": {"cluster":["SampleCluster1","primaryCluster"]}},
+        {"type":"FEED","name":"feedTree","status":"SUBMITTED","tags":{"tag":"externalSystem=USWestEmailServers"}},
+        {"type":"FEED","name":"feedFour","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feedFive","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feedSix","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feedSeven","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feedEight","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feedNine","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feedTen","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed11","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed12","status":"RUNNING","tags":{"tag":["owner=USMarketing","classification=Secure"]}},
+        {"type":"FEED","name":"feed13","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed14","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed15","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed16","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed17","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed18","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed19","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed20","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed21","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed22","status":"RUNNING","tags":{"tag":["owner=USMarketing"]}},
+        {"type":"FEED","name":"feed23","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed24","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed25","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed26","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed27","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed28","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed29","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed30","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed31","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed32","status":"RUNNING","tags":{"tag":["owner=USMarketing"]}},
+        {"type":"FEED","name":"feed33","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed34","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed35","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed36","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed37","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed38","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed39","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed40","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed41","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed42","status":"RUNNING","tags":{"tag":["owner=USMarketing"]}},
+        {"type":"FEED","name":"feed43","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed44","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed45","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed46","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed47","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed48","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed49","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed50","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed51","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed52","status":"RUNNING","tags":{"tag":["owner=USMarketing"]}},
+        {"type":"FEED","name":"feed53","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed54","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed55","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed56","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed57","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed58","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed59","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed60","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed61","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}},
+        {"type":"FEED","name":"feed62","status":"RUNNING","tags":{"tag":["owner=USMarketing"]}},
+        {"type":"FEED","name":"feed63","status":"SUBMITTED","tags":{"tag":["externalSystem=USWestEmailServers","classification=secure"]}}
       ]
     },
     process:{"entity":[
-      {"type":"process","name":"processOne","status":"SUBMITTED","list":{"tag":["pipeline=churnAnalysisDataPipeline","owner=ETLGroup","montevideo=mvd"]}},
-      {"type":"process","name":"processTwo","status":"SUBMITTED","list":{"tag":["pipeline=churnAnalysisDataPipeline","owner=ETLGroup","externalSystem=USWestEmailServers"]}}]}
-    },
+      {"type":"process","name":"processOne","status":"SUBMITTED","tags":{"tag":["pipeline=churnAnalysisDataPipeline","owner=ETLGroup","montevideo=mvd"]}},
+      {"type":"process","name":"processTwo","status":"SUBMITTED","tags":{"tag":["pipeline=churnAnalysisDataPipeline","owner=ETLGroup","externalSystem=USWestEmailServers"]}},
+      {"type":"process","name":"hdfs-mirror-test","status":"SUBMITTED","tags":{"tag":["_falcon_mirroring_type=HDFS"]}},
+      {"type":"process","name":"hdfs-azure-mirror-test","status":"SUBMITTED","tags":{"tag":["_falcon_mirroring_type=HDFS","runsOn=target"]}},
+      {"type":"process","name":"hdfs-s3-mirror-test","status":"SUBMITTED","tags":{"tag":["_falcon_mirroring_type=HDFS","runsOn=target"]}},
+      {"type":"process","name":"hive-databases-mirror-test","status":"SUBMITTED","tags":{"tag":["_falcon_mirroring_type=HIVE","runsOn=target"]}},
+      {"type":"process","name":"hive-db-tables-mirror-test","status":"SUBMITTED","tags":{"tag":["_falcon_mirroring_type=HIVE","runsOn=source"]}},
+      {"type":"process","name":"mirror4","status":"SUBMITTED","tags":{"tag":["_falcon_mirroring_type=HDFS","runsOn=source"]}}
+    ]}
+  },
     definitions = {
       CLUSTER: {
         completeCluster : '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' +
@@ -65,7 +141,7 @@
             '<ACL owner="ambari-qa" group="users" permission="0755"/>' +
             '<properties>' +
               '<property name="this" value="property"/>' +
-            '</properties>' +   
+            '</properties>' +
           '</cluster>',
         primaryCluster: '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' +
           '<cluster name="primaryCluster" description="oregonHadoopCluster" colo="USWestOregon" xmlns="uri:falcon:cluster:0.1">' +
@@ -88,7 +164,7 @@
           '<feed name="feedOne" description="Raw customer email feed" xmlns="uri:falcon:feed:0.1">' +
             '<tags>externalSystem=USWestEmailServers,classification=secure</tags>' +
             '<frequency>hours(1)</frequency>' +
-            '<timezone>UTC</timezone>' +
+            '<timezone>GMT+00:00</timezone>' +
             '<late-arrival cut-off="hours(4)"/>' +
             '<clusters>' +
               '<cluster name="primaryCluster" type="source">' +
@@ -122,7 +198,7 @@
             '<tags>owner=USMarketing,classification=Secure,externalSource=USProdEmailServers,externalTarget=BITools</tags>' +
             '<groups>churnAnalysisDataPipeline</groups>' +
             '<frequency>hours(1)</frequency>' +
-            '<timezone>UTC</timezone>' +
+            '<timezone>GMT+00:00</timezone>' +
             '<clusters>' +
               '<cluster name="primaryCluster" type="source">' +
                 '<validity start="2014-02-28T00:00Z" end="2016-04-01T00:00Z"/>' +
@@ -187,18 +263,352 @@
             '<parallel>1</parallel>' +
             '<order>FIFO</order>' +
             '<frequency>hours(1)</frequency>' +
-            '<timezone>UTC</timezone>' +
+            '<timezone>GMT+00:00</timezone>' +
             '<outputs>' +
               '<output name="output" feed="rawEmailFeed" instance="now(0,0)"/>' +
             '</outputs>' +
             '<workflow name="emailIngestWorkflow" version="2.0.0" engine="oozie" path="/user/ambari-qa/falcon/demo/apps/ingest/fs"/>' +
             '<retry policy="periodic" delay="minutes(15)" attempts="3"/>' +
-          '</process>'
+          '</process>',
+
+        'hdfs-mirror-test': "<?xml version='1.0' encoding='UTF-8' standalone='yes'?><process xmlns='uri:falcon:process:0.1' name='hdfs-mirror-test'><tags>_falcon_mirroring_type=HDFS</tags><clusters><cluster name='completeCluster'><validity start='2015-03-28T07:32:00.000Z' end='2015-12-31T20:00:00.000Z'/></cluster></clusters><parallel>1</parallel><order>LAST_ONLY</order><frequency>days(7)</frequency><timezone>GMT+00:00</timezone><properties><property name='oozie.wf.subworkflow.classpath.inheritance' value='true'></property><property name='distcpMaxMaps' value='50'></property><property name='distcpMapBandwidth' value='1100'></property><property name='drSourceDir' value='first-path/source/cluster'></property><property name='drTargetDir' value='second-path/source/cluster'></property><property name='drTargetClusterFS' value='hdfs://sandbox.hortonworks.com:8020'></property><property name='drSourceClusterFS' value='hdfs://sandbox.hortonworks.com:8020'></property><property name='drNotifyEma
 il' value='first-test@hdfs.com'></property><property name='targetCluster' value='primaryCluster'></property><property name='sourceCluster' value='completeCluster'></property></properties><workflow name='hdfs-mirror-test2-WF' engine='oozie' path='hdfs://node-1.example.com:8020/apps/falcon/recipe/hdfs-replication/resources/runtime/hdfs-replication-workflow.xml' lib=''/><retry policy='EXPONENTIAL_BACKOFF' delay='days(60)' attempts='7'/><ACL owner='ambari-qa' group='users2' permission='0x755'/></process>",
+
+        'hdfs-azure-mirror-test': "<?xml version='1.0' encoding='UTF-8' standalone='yes'?><process xmlns='uri:falcon:process:0.1' name='hdfs-azure-mirror-test'><tags>_falcon_mirroring_type=HDFS,runsOn=target</tags><clusters><cluster name='completeCluster'><validity start='2015-03-28T06:32:00.000Z' end='2015-12-31T21:00:00.000Z'/></cluster></clusters><parallel>1</parallel><order>LAST_ONLY</order><frequency>hours(7)</frequency><timezone>GMT+00:00</timezone><properties><property name='oozie.wf.subworkflow.classpath.inheritance' value='true'></property><property name='distcpMaxMaps' value='340'></property><property name='distcpMapBandwidth' value='2200'></property><property name='drSourceDir' value='first-path/azure/something'></property><property name='drTargetDir' value='second-path/target/cluster'></property><property name='drTargetClusterFS' value='hdfs://sandbox.hortonworks.com:8020'></property><property name='drSourceClusterFS' value='http://some.addres.blob.core.windows.net'></pr
 operty><property name='drNotifyEmail' value='first-test@hdfs.com,second-test@azure.com'></property><property name='targetCluster' value='completeCluster'></property><property name='sourceCluster' value=''></property></properties><workflow name='hdfs-azure-mirror-test-WF' engine='oozie' path='hdfs://node-1.example.com:8020/apps/falcon/recipe/hdfs-replication/resources/runtime/hdfs-replication-workflow.xml' lib=''/><retry policy='EXPONENTIAL_BACKOFF' delay='days(60)' attempts='1'/><ACL owner='ambari-qa' group='users2' permission='0x755'/></process>",
+
+        'hdfs-s3-mirror-test': "<?xml version='1.0' encoding='UTF-8' standalone='yes'?><process xmlns='uri:falcon:process:0.1' name='hdfs-s3-mirror-test'><tags>_falcon_mirroring_type=HDFS,runsOn=target</tags><clusters><cluster name='completeCluster'><validity start='2015-04-03T00:42:00.000Z' end='2015-12-08T21:00:00.000Z'/></cluster></clusters><parallel>1</parallel><order>LAST_ONLY</order><frequency>months(7)</frequency><timezone>GMT+00:00</timezone><properties><property name='oozie.wf.subworkflow.classpath.inheritance' value='true'></property><property name='distcpMaxMaps' value='3340'></property><property name='distcpMapBandwidth' value='5500'></property><property name='drSourceDir' value='first-path/s3/something'></property><property name='drTargetDir' value='third-path/target/cluster'></property><property name='drTargetClusterFS' value='hdfs://sandbox.hortonworks.com:8020'></property><property name='drSourceClusterFS' value='s3://some.address..amazonaws.com'></property><property
  name='drNotifyEmail' value='second-test@s3.com'></property><property name='targetCluster' value='completeCluster'></property><property name='sourceCluster' value=''></property></properties><workflow name='hdfs-s3-mirror-test-WF' engine='oozie' path='hdfs://node-1.example.com:8020/apps/falcon/recipe/hdfs-replication/resources/runtime/hdfs-replication-workflow.xml' lib=''/><retry policy='FINAL' delay='months(60)' attempts='15'/><ACL owner='ambari-qa' group='users' permission='0x755'/></process>",
+
+        'hive-databases-mirror-test': "<?xml version='1.0' encoding='UTF-8' standalone='yes'?><process xmlns='uri:falcon:process:0.1' name='hive-databases-mirror-test'><tags>_falcon_mirroring_type=HIVE,runsOn=target</tags><clusters><cluster name='completeCluster'><validity start='2015-04-14T15:42:00.000Z' end='2016-01-22T14:04:00.000Z'/></cluster></clusters><parallel>1</parallel><order>LAST_ONLY</order><frequency>months(7)</frequency><timezone>GMT+00:00</timezone><properties><property name='oozie.wf.subworkflow.classpath.inheritance' value='true'></property><property name='distcpMaxMaps' value='111'></property><property name='distcpMapBandwidth' value='678'></property><property name='targetCluster' value='primaryCluster'></property><property name='sourceCluster' value='completeCluster'></property><property name='targetHiveServer2Uri' value='some/path/staging'></property><property name='sourceHiveServer2Uri' value='thrift://localhost:10000'></property><property name='sourceStagingPat
 h' value='/apps/falcon/backupCluster/staging'></property><property name='targetStagingPath' value='*'></property><property name='targetNN' value='hdfs://sandbox.hortonworks.com:8020'></property><property name='sourceNN' value='hdfs://sandbox.hortonworks.com:8020'></property><property name='sourceServicePrincipal' value='hive'></property><property name='targetServicePrincipal' value='hive'></property><property name='targetMetastoreUri' value=''></property><property name='sourceMetastoreUri' value='thrift://localhost:9083'></property><property name='sourceTable' value='*'></property><property name='sourceDatabase' value='db1,db2,db3'></property><property name='maxEvents' value='-10'></property><property name='replicationMaxMaps' value='52'></property><property name='clusterForJobRun' value='primaryCluster'></property><property name='clusterForJobRunWriteEP' value='hdfs://sandbox.hortonworks.com:8020'></property><property name='drJobName' value='hive-databases-mirror-test'></property><
 property name='drNotifyEmail' value='hive-databases@test.com'></property></properties><workflow name='falcon-dr-hive-workflow' engine='oozie' path='hdfs://node-1.example.com:8020/apps/falcon/recipe/hive-disaster-recovery/resources/runtime/hive-disaster-recovery-workflow.xml' lib=''/><retry policy='PERIODIC' delay='months(60)' attempts='15'/><ACL owner='ambari-qa' group='users' permission='0x755'/></process>",
+
+        'hive-db-tables-mirror-test': "<?xml version='1.0' encoding='UTF-8' standalone='yes'?><process xmlns='uri:falcon:process:0.1' name='hive-db-tables-mirror-test'><tags>_falcon_mirroring_type=HIVE,runsOn=source</tags><clusters><cluster name='completeCluster'><validity start='2015-05-01T09:42:00.000Z' end='2016-04-09T09:04:00.000Z'/></cluster></clusters><parallel>1</parallel><order>LAST_ONLY</order><frequency>months(7)</frequency><timezone>GMT+00:00</timezone><properties><property name='oozie.wf.subworkflow.classpath.inheritance' value='true'></property><property name='distcpMaxMaps' value='111'></property><property name='distcpMapBandwidth' value='678'></property><property name='targetCluster' value='primaryCluster'></property><property name='sourceCluster' value='completeCluster'></property><property name='targetHiveServer2Uri' value='some/path/staging'></property><property name='sourceHiveServer2Uri' value='thrift://localhost:10000'></property><property name='sourceStagingPat
 h' value='/apps/falcon/backupCluster/staging'></property><property name='targetStagingPath' value='/apps/falcon/some/staging'></property><property name='targetNN' value='hdfs://sandbox.hortonworks.com:8020'></property><property name='sourceNN' value='hdfs://sandbox.hortonworks.com:8020'></property><property name='sourceServicePrincipal' value='hive'></property><property name='targetServicePrincipal' value='hive'></property><property name='targetMetastoreUri' value=''></property><property name='sourceMetastoreUri' value='thrift://localhost:9083'></property><property name='sourceTable' value='table1,table2,table3'></property><property name='sourceDatabase' value='database1'></property><property name='maxEvents' value='-10'></property><property name='replicationMaxMaps' value='52'></property><property name='clusterForJobRun' value='completeCluster'></property><property name='clusterForJobRunWriteEP' value='hdfs://sandbox.hortonworks.com:8020'></property><property name='drJobName' value
 ='hive-db-tables-mirror-test'></property><property name='drNotifyEmail' value='hive-tables@test.com'></property></properties><workflow name='falcon-dr-hive-workflow' engine='oozie' path='hdfs://node-1.example.com:8020/apps/falcon/recipe/hive-disaster-recovery/resources/runtime/hive-disaster-recovery-workflow.xml' lib=''/><retry policy='PERIODIC' delay='months(60)' attempts='15'/><ACL owner='ambari-qa' group='users' permission='0x755'/></process>"
+
+      }
+
+    },
+    instancesList = {
+      FEED: [
+        {
+          "details": "",
+          "endTime": "2014-10-21T14:40:26-07:00",
+          "startTime": "2015-10-21T14:39:56-07:00",
+          "cluster": "primary-cluster",
+          "logFile": "http:\/\/localhost:11000\/oozie?job=0000070-131021115933395-oozie-rgau-W",
+          "status": "SUCCEEDED",
+          "instance": "2012-04-01T07:00Z"
+        }, {
+          "details": "",
+          "endTime": "2014-10-21T14:42:26-07:00",
+          "startTime": "2015-10-21T14:41:56-07:00",
+          "cluster": "primary-cluster",
+          "logFile": "http:\/\/localhost:11000\/oozie?job=0000070-131021115933397-oozie-rgau-W",
+          "status": "RUNNING",
+          "instance": "2012-04-02T08:00Z"
+        }, {
+          "details": "",
+          "endTime": "2014-10-21T14:42:26-07:00",
+          "startTime": "2015-10-21T14:41:56-07:00",
+          "cluster": "primary-cluster",
+          "logFile": "http:\/\/localhost:11000\/oozie?job=0000070-131021115933397-oozie-rgau-W",
+          "status": "SUSPENDED",
+          "instance": "2012-04-03T08:00Z"
+        }, {
+          "details": "",
+          "endTime": "2014-10-21T14:42:26-07:00",
+          "startTime": "2015-10-21T14:41:56-07:00",
+          "cluster": "primary-cluster",
+          "logFile": "http:\/\/localhost:11000\/oozie?job=0000070-131021115933397-oozie-rgau-W",
+          "status": "KILLED",
+          "instance": "2012-04-04T08:00Z"
+        }, {
+          "details": "",
+          "endTime": "2014-10-21T14:42:26-07:00",
+          "startTime": "2015-10-21T14:41:56-07:00",
+          "cluster": "primary-cluster",
+          "logFile": "http:\/\/localhost:11000\/oozie?job=0000070-131021115933397-oozie-rgau-W",
+          "status": "SUCCEEDED",
+          "instance": "2012-04-05T08:00Z"
+        }, {
+          "details": "",
+          "endTime": "2014-10-21T14:42:26-07:00",
+          "startTime": "2015-10-21T14:41:56-07:00",
+          "cluster": "primary-cluster",
+          "logFile": "http:\/\/localhost:11000\/oozie?job=0000070-131021115933397-oozie-rgau-W",
+          "status": "WAITING",
+          "instance": "2012-04-06T08:00Z"
+        }, {
+          "details": "",
+          "endTime": "2014-10-21T14:42:26-07:00",
+          "startTime": "2015-10-21T14:41:56-07:00",
+          "cluster": "primary-cluster",
+          "logFile": "http:\/\/localhost:11000\/oozie?job=0000070-131021115933397-oozie-rgau-W",
+          "status": "FAILED",
+          "instance": "2012-04-07T08:00Z"
+        }, {
+          "details": "",
+          "endTime": "2014-10-21T14:42:26-07:00",
+          "startTime": "2015-10-21T14:41:56-07:00",
+          "cluster": "primary-cluster",
+          "logFile": "http:\/\/localhost:11000\/oozie?job=0000070-131021115933397-oozie-rgau-W",
+          "status": "SUCCEEDED",
+          "instance": "2012-04-08T08:00Z"
+        }, {
+          "details": "",
+          "endTime": "2014-10-21T14:42:26-07:00",
+          "startTime": "2015-10-21T14:41:56-07:00",
+          "cluster": "primary-cluster",
+          "logFile": "http:\/\/localhost:11000\/oozie?job=0000070-131021115933397-oozie-rgau-W",
+          "status": "SUSPENDED",
+          "instance": "2012-04-09T08:00Z"
+        },{
+          "details": "",
+          "endTime": "2014-10-21T14:40:26-07:00",
+          "startTime": "2015-10-21T14:39:56-07:00",
+          "cluster": "primary-cluster",
+          "logFile": "http:\/\/localhost:11000\/oozie?job=0000070-131021115933395-oozie-rgau-W",
+          "status": "SUSPENDED",
+          "instance": "2012-04-10T07:00Z"
+        }, {
+          "details": "",
+          "endTime": "2014-10-21T14:42:26-07:00",
+          "startTime": "2015-10-21T14:41:56-07:00",
+          "cluster": "primary-cluster",
+          "logFile": "http:\/\/localhost:11000\/oozie?job=0000070-131021115933397-oozie-rgau-W",
+          "status": "RUNNING",
+          "instance": "2012-04-11T08:00Z"
+        }, {
+          "details": "",
+          "endTime": "2014-10-21T14:42:26-07:00",
+          "startTime": "2015-10-21T14:41:56-07:00",
+          "cluster": "primary-cluster",
+          "logFile": "http:\/\/localhost:11000\/oozie?job=0000070-131021115933397-oozie-rgau-W",
+          "status": "SUSPENDED",
+          "instance": "2012-04-12T08:00Z"
+        }, {
+          "details": "",
+          "endTime": "2014-10-21T14:42:26-07:00",
+          "startTime": "2015-10-21T14:41:56-07:00",
+          "cluster": "primary-cluster",
+          "logFile": "http:\/\/localhost:11000\/oozie?job=0000070-131021115933397-oozie-rgau-W",
+          "status": "KILLED",
+          "instance": "2012-04-13T08:00Z"
+        }, {
+          "details": "",
+          "endTime": "2014-10-21T14:42:26-07:00",
+          "startTime": "2015-10-21T14:41:56-07:00",
+          "cluster": "primary-cluster",
+          "logFile": "http:\/\/localhost:11000\/oozie?job=0000070-131021115933397-oozie-rgau-W",
+          "status": "SUCCEEDED",
+          "instance": "2012-04-14T08:00Z"
+        }, {
+          "details": "",
+          "endTime": "2014-10-21T14:42:26-07:00",
+          "startTime": "2015-10-21T14:41:56-07:00",
+          "cluster": "primary-cluster",
+          "logFile": "http:\/\/localhost:11000\/oozie?job=0000070-131021115933397-oozie-rgau-W",
+          "status": "SUCCEEDED",
+          "instance": "2012-04-15T08:00Z"
+        }, {
+          "details": "",
+          "endTime": "2014-10-21T14:42:26-07:00",
+          "startTime": "2015-10-21T14:41:56-07:00",
+          "cluster": "primary-cluster",
+          "logFile": "http:\/\/localhost:11000\/oozie?job=0000070-131021115933397-oozie-rgau-W",
+          "status": "SUCCEEDED",
+          "instance": "2012-04-16T08:00Z"
+        }, {
+          "details": "",
+          "endTime": "2014-10-21T14:42:26-07:00",
+          "startTime": "2015-10-21T14:41:56-07:00",
+          "cluster": "primary-cluster",
+          "logFile": "http:\/\/localhost:11000\/oozie?job=0000070-131021115933397-oozie-rgau-W",
+          "status": "SUCCEEDED",
+          "instance": "2012-04-17T08:00Z"
+        }, {
+          "details": "",
+          "endTime": "2014-10-21T14:42:26-07:00",
+          "startTime": "2015-10-21T14:41:56-07:00",
+          "cluster": "primary-cluster",
+          "logFile": "http:\/\/localhost:11000\/oozie?job=0000070-131021115933397-oozie-rgau-W",
+          "status": "SUCCEEDED",
+          "instance": "2012-04-18T08:00Z"
+        }, {
+          "details": "",
+          "endTime": "2014-10-21T14:42:26-07:00",
+          "startTime": "2015-10-21T14:41:56-07:00",
+          "cluster": "primary-cluster",
+          "logFile": "http:\/\/localhost:11000\/oozie?job=0000070-131021115933397-oozie-rgau-W",
+          "status": "SUCCEEDED",
+          "instance": "2012-04-19T08:00Z"
+        }, {
+          "details": "",
+          "endTime": "2014-10-21T14:42:26-07:00",
+          "startTime": "2015-10-21T14:41:56-07:00",
+          "cluster": "primary-cluster",
+          "logFile": "http:\/\/localhost:11000\/oozie?job=0000070-131021115933397-oozie-rgau-W",
+          "status": "SUCCEEDED",
+          "instance": "2012-04-20T08:00Z"
+        }, {
+          "details": "",
+          "endTime": "2014-10-21T14:42:26-07:00",
+          "startTime": "2015-10-21T14:41:56-07:00",
+          "cluster": "primary-cluster",
+          "logFile": "http:\/\/localhost:11000\/oozie?job=0000070-131021115933397-oozie-rgau-W",
+          "status": "SUCCEEDED",
+          "instance": "2012-04-21T08:00Z"
+        }, {
+          "details": "",
+          "endTime": "2014-10-21T14:42:26-07:00",
+          "startTime": "2015-10-21T14:41:56-07:00",
+          "cluster": "primary-cluster",
+          "logFile": "http:\/\/localhost:11000\/oozie?job=0000070-131021115933397-oozie-rgau-W",
+          "status": "SUCCEEDED",
+          "instance": "2012-04-22T08:00Z"
+        }, {
+          "details": "",
+          "endTime": "2014-10-21T14:42:26-07:00",
+          "startTime": "2015-10-21T14:41:56-07:00",
+          "cluster": "primary-cluster",
+          "logFile": "http:\/\/localhost:11000\/oozie?job=0000070-131021115933397-oozie-rgau-W",
+          "status": "SUCCEEDED",
+          "instance": "2012-04-18T08:00Z"
+        }, {
+          "details": "",
+          "endTime": "2014-10-21T14:42:26-07:00",
+          "startTime": "2015-10-21T14:41:56-07:00",
+          "cluster": "primary-cluster",
+          "logFile": "http:\/\/localhost:11000\/oozie?job=0000070-131021115933397-oozie-rgau-W",
+          "status": "SUCCEEDED",
+          "instance": "2012-04-19T08:00Z"
+        }, {
+          "details": "",
+          "endTime": "2014-10-21T14:42:26-07:00",
+          "startTime": "2015-10-21T14:41:56-07:00",
+          "cluster": "primary-cluster",
+          "logFile": "http:\/\/localhost:11000\/oozie?job=0000070-131021115933397-oozie-rgau-W",
+          "status": "SUCCEEDED",
+          "instance": "2012-04-20T08:00Z"
+        }, {
+          "details": "",
+          "endTime": "2014-10-21T14:42:26-07:00",
+          "startTime": "2015-10-21T14:41:56-07:00",
+          "cluster": "primary-cluster",
+          "logFile": "http:\/\/localhost:11000\/oozie?job=0000070-131021115933397-oozie-rgau-W",
+          "status": "SUCCEEDED",
+          "instance": "2012-04-21T08:00Z"
+        }, {
+          "details": "",
+          "endTime": "2014-10-21T14:42:26-07:00",
+          "startTime": "2015-10-21T14:41:56-07:00",
+          "cluster": "primary-cluster",
+          "logFile": "http:\/\/localhost:11000\/oozie?job=0000070-131021115933397-oozie-rgau-W",
+          "status": "SUCCEEDED",
+          "instance": "2012-04-22T08:00Z"
+        }, {
+          "details": "",
+          "endTime": "2014-10-21T14:42:26-07:00",
+          "startTime": "2015-10-21T14:41:56-07:00",
+          "cluster": "primary-cluster",
+          "logFile": "http:\/\/localhost:11000\/oozie?job=0000070-131021115933397-oozie-rgau-W",
+          "status": "SUCCEEDED",
+          "instance": "2012-04-18T08:00Z"
+        }, {
+          "details": "",
+          "endTime": "2014-10-21T14:42:26-07:00",
+          "startTime": "2015-10-21T14:41:56-07:00",
+          "cluster": "primary-cluster",
+          "logFile": "http:\/\/localhost:11000\/oozie?job=0000070-131021115933397-oozie-rgau-W",
+          "status": "SUCCEEDED",
+          "instance": "2012-04-19T08:00Z"
+        }, {
+          "details": "",
+          "endTime": "2014-10-21T14:42:26-07:00",
+          "startTime": "2015-10-21T14:41:56-07:00",
+          "cluster": "primary-cluster",
+          "logFile": "http:\/\/localhost:11000\/oozie?job=0000070-131021115933397-oozie-rgau-W",
+          "status": "SUCCEEDED",
+          "instance": "2012-04-20T08:00Z"
+        }, {
+          "details": "",
+          "endTime": "2014-10-21T14:42:26-07:00",
+          "startTime": "2015-10-21T14:41:56-07:00",
+          "cluster": "primary-cluster",
+          "logFile": "http:\/\/localhost:11000\/oozie?job=0000070-131021115933397-oozie-rgau-W",
+          "status": "SUCCEEDED",
+          "instance": "2012-04-20T08:00Z"
         }
-      };
-  
+      ],
+      PROCESS: [
+        {
+          "details": "",
+          "endTime": "2014-10-21T14:40:26-07:00",
+          "startTime": "2015-10-21T14:39:56-07:00",
+          "cluster": "primary-cluster",
+          "logFile": "http:\/\/localhost:11000\/oozie?job=0000070-131021115933395-oozie-rgau-W",
+          "status": "SUCCEEDED",
+          "instance": "2012-04-03T07:00Z"
+        },
+        {
+          "details": "",
+          "endTime": "2014-10-21T14:42:26-07:00",
+          "startTime": "2015-10-21T14:41:56-07:00",
+          "cluster": "primary-cluster",
+          "logFile": "http:\/\/localhost:11000\/oozie?job=0000070-131021115933397-oozie-rgau-W",
+          "status": "SUCCEEDED",
+          "instance": "2012-04-03T08:00Z"
+        }
+      ]
+    },
+    entityDependencies = {
+      "entity": [
+        {
+          "name": "SampleInput",
+          "type": "feed",
+          "tag": ["Input"]
+          //"list": {"tag": ["Input"]}
+        },
+        {
+          "name": "SampleOutput",
+          "type": "feed",
+          "tag": ["Output"]
+          //"list": {"tag": ["Output"]}
+        },
+        {
+          "name": "primary-cluster",
+          "type": "cluster"
+        }
+      ]
+    },
+    vertices = {
+      "results":[{"timestamp":"2015-03-26T20:24Z","name":"SampleProcess3\/2014-11-01T23:00Z","type":"process-instance","version":"1.0","_id":40108,"_type":"vertex"}],"totalSize":1
+    },
+    verticesDirection = [
+      {"results":[{"_id":"2wm3-aqU-4u","_type":"edge","_outV":40108,"_inV":16,"_label":"owned-by"},{"_id":"2wm1-aqU-5o","_type":"edge","_outV":40108,"_inV":4,"_label":"runs-on"},{"_id":"2wm7-apq-5w","_type":"edge","_outV":40016,"_inV":40108,"_label":"input"},{"_id":"2wm5-aqU-5E","_type":"edge","_outV":40108,"_inV":40012,"_label":"output"},{"_id":"2wlZ-aqU-86","_type":"edge","_outV":40108,"_inV":32,"_label":"instance-of"}],"totalSize":5},
+      {"results":[{"timestamp":"2015-03-26T02:45Z","name":"ambari-qa","type":"user","_id":16,"_type":"vertex"},{"timestamp":"2015-03-26T02:42Z","name":"primaryCluster","type":"cluster-entity","_id":4,"_type":"vertex"},{"timestamp":"2015-03-26T20:21Z","name":"SampleFeed1\/yearno=2014\/monthno=11","type":"feed-instance","_id":40016,"_type":"vertex"},{"timestamp":"2015-03-26T20:21Z","name":"SampleFeed6\/yearno=2014\/monthno=11","type":"feed-instance","_id":40012,"_type":"vertex"},{"timestamp":"2015-03-26T02:46Z","name":"SampleProcess3","type":"process-entity","version":"1.0","_id":32,"_type":"vertex"}],"totalSize":5},
+      {"results":[{"_id":"2w9d-apm-4u","_type":"edge","_outV":40012,"_inV":16,"_label":"owned-by"},{"_id":"2w9b-apm-4S","_type":"edge","_outV":40012,"_inV":4,"_label":"stored-in"},{"_id":"2whH-aqo-5E","_type":"edge","_outV":40076,"_inV":40012,"_label":"output"},{"_id":"2wif-aqs-5E","_type":"edge","_outV":40080,"_inV":40012,"_label":"output"},{"_id":"2w9f-api-5E","_type":"edge","_outV":40008,"_inV":40012,"_label":"output"},{"_id":"2wiN-aqw-5E","_type":"edge","_outV":40084,"_inV":40012,"_label":"output"},{"_id":"2wa1-apu-5E","_type":"edge","_outV":40020,"_inV":40012,"_label":"output"},{"_id":"2wjl-aqA-5E","_type":"edge","_outV":40088,"_inV":40012,"_label":"output"},{"_id":"2waz-apy-5E","_type":"edge","_outV":40024,"_inV":40012,"_label":"output"},{"_id":"2wjT-aqE-5E","_type":"edge","_outV":40092,"_inV":40012,"_label":"output"},{"_id":"2wb7-apC-5E","_type":"edge","_outV":40028,"_inV":40012,"_label":"output"},{"_id":"2wkr-aqI-5E","_type":"edge","_outV":40096,"_inV":40012,"_label":"output
 "},{"_id":"2wbF-apG-5E","_type":"edge","_outV":40032,"_inV":40012,"_label":"output"},{"_id":"2wkZ-aqM-5E","_type":"edge","_outV":40100,"_inV":40012,"_label":"output"},{"_id":"2wcd-apK-5E","_type":"edge","_outV":40036,"_inV":40012,"_label":"output"},{"_id":"2wlx-aqQ-5E","_type":"edge","_outV":40104,"_inV":40012,"_label":"output"},{"_id":"2wcL-apO-5E","_type":"edge","_outV":40040,"_inV":40012,"_label":"output"},{"_id":"2wm5-aqU-5E","_type":"edge","_outV":40108,"_inV":40012,"_label":"output"},{"_id":"2wdj-apS-5E","_type":"edge","_outV":40044,"_inV":40012,"_label":"output"},{"_id":"2wdR-apW-5E","_type":"edge","_outV":40048,"_inV":40012,"_label":"output"},{"_id":"2wep-aq0-5E","_type":"edge","_outV":40052,"_inV":40012,"_label":"output"},{"_id":"2weX-aq4-5E","_type":"edge","_outV":40056,"_inV":40012,"_label":"output"},{"_id":"2wfv-aq8-5E","_type":"edge","_outV":40060,"_inV":40012,"_label":"output"},{"_id":"2wg3-aqc-5E","_type":"edge","_outV":40064,"_inV":40012,"_label":"output"},{"_id":"2w
 gB-aqg-5E","_type":"edge","_outV":40068,"_inV":40012,"_label":"output"},{"_id":"2wh9-aqk-5E","_type":"edge","_outV":40072,"_inV":40012,"_label":"output"},{"_id":"2w99-apm-86","_type":"edge","_outV":40012,"_inV":28,"_label":"instance-of"}],"totalSize":27},
+      {"results":[{"_id":"2w9t-apq-4u","_type":"edge","_outV":40016,"_inV":16,"_label":"owned-by"},{"_id":"2w9r-apq-4S","_type":"edge","_outV":40016,"_inV":4,"_label":"stored-in"},{"_id":"2wih-apq-5w","_type":"edge","_outV":40016,"_inV":40080,"_label":"input"},{"_id":"2wiP-apq-5w","_type":"edge","_outV":40016,"_inV":40084,"_label":"input"},{"_id":"2wa3-apq-5w","_type":"edge","_outV":40016,"_inV":40020,"_label":"input"},{"_id":"2wjn-apq-5w","_type":"edge","_outV":40016,"_inV":40088,"_label":"input"},{"_id":"2waB-apq-5w","_type":"edge","_outV":40016,"_inV":40024,"_label":"input"},{"_id":"2w9v-apq-5w","_type":"edge","_outV":40016,"_inV":40008,"_label":"input"},{"_id":"2wjV-apq-5w","_type":"edge","_outV":40016,"_inV":40092,"_label":"input"},{"_id":"2wb9-apq-5w","_type":"edge","_outV":40016,"_inV":40028,"_label":"input"},{"_id":"2wkt-apq-5w","_type":"edge","_outV":40016,"_inV":40096,"_label":"input"},{"_id":"2wbH-apq-5w","_type":"edge","_outV":40016,"_inV":40032,"_label":"input"},{"_id":
 "2wl1-apq-5w","_type":"edge","_outV":40016,"_inV":40100,"_label":"input"},{"_id":"2wcf-apq-5w","_type":"edge","_outV":40016,"_inV":40036,"_label":"input"},{"_id":"2wlz-apq-5w","_type":"edge","_outV":40016,"_inV":40104,"_label":"input"},{"_id":"2wcN-apq-5w","_type":"edge","_outV":40016,"_inV":40040,"_label":"input"},{"_id":"2wm7-apq-5w","_type":"edge","_outV":40016,"_inV":40108,"_label":"input"},{"_id":"2wdl-apq-5w","_type":"edge","_outV":40016,"_inV":40044,"_label":"input"},{"_id":"2wdT-apq-5w","_type":"edge","_outV":40016,"_inV":40048,"_label":"input"},{"_id":"2wer-apq-5w","_type":"edge","_outV":40016,"_inV":40052,"_label":"input"},{"_id":"2weZ-apq-5w","_type":"edge","_outV":40016,"_inV":40056,"_label":"input"},{"_id":"2wfx-apq-5w","_type":"edge","_outV":40016,"_inV":40060,"_label":"input"},{"_id":"2wg5-apq-5w","_type":"edge","_outV":40016,"_inV":40064,"_label":"input"},{"_id":"2wgD-apq-5w","_type":"edge","_outV":40016,"_inV":40068,"_label":"input"},{"_id":"2whb-apq-5w","_type":"ed
 ge","_outV":40016,"_inV":40072,"_label":"input"},{"_id":"2whJ-apq-5w","_type":"edge","_outV":40016,"_inV":40076,"_label":"input"},{"_id":"2w9p-apq-86","_type":"edge","_outV":40016,"_inV":12,"_label":"instance-of"}],"totalSize":27}
+    ],
+    verticesProps = {
+      "results":
+      {
+        "timestamp":"2014-04-25T22:20Z",
+        "name":"local",
+        "type":"cluster-entity"
+      },
+      "totalSize":3
+    },
+    server = {
+      //"properties":[{key: "authentication", value: "kerberos"}]
+      "properties":[{key: "authentication", value: "simple"}]
+    };
+
   exports.findByNameInList = findByNameInList;
+  exports.findByStartEnd = findByStartEnd;
   exports.entitiesList = entitiesList;
   exports.definitions = definitions;
-  
+  exports.instancesList = instancesList;
+  exports.entityDependencies = entityDependencies;
+  exports.vertices = vertices;
+  exports.verticesDirection = verticesDirection;
+  exports.verticesProps = verticesProps;
+  exports.server = server;
+
 })();
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/package.json
----------------------------------------------------------------------
diff --git a/falcon-ui/package.json b/falcon-ui/package.json
index dda4855..bee5174 100644
--- a/falcon-ui/package.json
+++ b/falcon-ui/package.json
@@ -16,6 +16,7 @@
     "file": "~0.2.2",
     "grunt": "~0.4.4",
     "grunt-cli": "~0.1.9",
+    "grunt-concurrent": "^1.0.0",
     "grunt-contrib-clean": "^0.6.0",
     "grunt-contrib-copy": "~0.5.0",
     "grunt-contrib-concat": "^0.5.0",
@@ -27,6 +28,7 @@
     "grunt-datauri": "~0.4.0",
     "grunt-express-server": "~0.4.13",
     "grunt-karma": "^0.9.0",
+    "grunt-protractor-runner": "^1.1.4",
     "grunt-scp": "^0.1.7",
     "jasmine": "^2.0.1",
     "karma": "^0.12.23",

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/pom.xml
----------------------------------------------------------------------
diff --git a/falcon-ui/pom.xml b/falcon-ui/pom.xml
index adb219b..6469b3d 100644
--- a/falcon-ui/pom.xml
+++ b/falcon-ui/pom.xml
@@ -76,7 +76,6 @@
               <arguments>test</arguments>
             </configuration>
           </execution>
-
         </executions>
       </plugin>
 
@@ -89,7 +88,9 @@
             <exclude>app/css/bootstrap/**</exclude>
             <exclude>app/test/lib/**</exclude>
             <exclude>app/css/fonts/**</exclude>
-            <exclude>app/config/loginData.js</exclude>
+            <exclude>app/css/styles/**</exclude>
+            <exclude>app/config/loginData.json</exclude>
+            <exclude>README.md</exclude>
             <exclude>dist/**</exclude>
             <exclude>node/**</exclude>
 	    <exclude>node_modules/**</exclude>
@@ -98,7 +99,9 @@
             <exclude>karma.conf.js</exclude>
             <exclude>bower.json</exclude>
             <exclude>app/css/main.css</exclude>
+	    <exclude>app/css/img/**</exclude>
             <exclude>app/test/e2e/protractor.js</exclude>
+            <exclude>app/js/directives/ng-tags-input.js</exclude>
           </excludes>
         </configuration>
       </plugin>

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/server.js
----------------------------------------------------------------------
diff --git a/falcon-ui/server.js b/falcon-ui/server.js
index 422bcf9..298e10a 100644
--- a/falcon-ui/server.js
+++ b/falcon-ui/server.js
@@ -21,6 +21,7 @@
   var bodyParser = require('body-parser'),
     express = require('express'),
     mockData = require('./express-data/mockData.js'),
+    chartData = require('./express-data/chartData.js'),
     server = express(),
     PORT = 3000;
 
@@ -37,18 +38,117 @@
     }
   });
 
+  function searchByName(name, list){
+    var result = [];
+    var index = 0;
+    for(var i=0; i<list.length; i++){
+      //if(list[i].name === name){
+      if(list[i].name.indexOf(name) !== -1){
+        result[index++] = list[i];
+      }
+    }
+    return result;
+  }
+
+  function searchTag(tag, list){
+    var result = [];
+    var index = 0;
+    for(var j=0; j<list.length; j++){
+      for(var k=0; k<list[j].tags.tag.length; k++){
+        if(list[j].tags.tag[k].indexOf(tag) !== -1){
+            result[index++] = list[j];
+          break;
+        }
+      }
+    }
+    return result;
+  }
+
+  function searchByTags(tags, list){
+    var arrTags = tags.split(",");
+    var result = list;
+    for(var i=0; i<arrTags.length; i++){
+      result = searchTag(arrTags[i], result);
+    }
+    return result;
+  }
+
+  function searchInstancesByDate(type, date, list){
+    var result = [];
+    var index = 0;
+    for(var i=0; i<list.length; i++){
+      var actualDate = new Date(list[i][type]);
+      if(date <= actualDate){
+        result[index++] = list[i];
+      }
+    }
+    return result;
+  }
+
+  function searchInstancesByStatus(status, list){
+    var result = [];
+    var index = 0;
+    for(var i=0; i<list.length; i++){
+      if(list[i].status === status){
+        result[index++] = list[i];
+      }
+    }
+    return result;
+  }
+
   server.get('/api/entities/list/:type', function (req, res) {
     var type = req.params.type;
-    res.json(mockData.entitiesList[type]);
+    var name = req.query.nameseq === undefined ? "" : req.query.nameseq;
+    var tags = req.query.tagkeys === undefined ? "" : req.query.tagkeys;
+    var offset = parseInt(req.query.offset === undefined ? 0 : req.query.offset);
+    var numResults = parseInt(req.query.numResults === undefined ? 10 : req.query.numResults);
+
+    var paginated = {};
+    paginated.entity = [];
+
+    //if(type === "all"){
+    //if(type === "schedulable"){
+    if(type === "feed,process"){
+      paginated.entity = paginated.entity.concat(mockData.entitiesList.feed.entity,
+          mockData.entitiesList.process.entity);
+    }else{
+      paginated.entity = paginated.entity.concat(mockData.entitiesList[type].entity);
+    }
+
+    if(tags !== "" && name !== "" && name !== "*"){
+      //console.log("Search by name " + name + " & tags " + tags);
+      paginated.entity = searchByName(name, paginated.entity);
+      paginated.entity = searchByTags(tags, paginated.entity);
+      paginated.totalResults = paginated.entity.length;
+      paginated.entity = paginated.entity.slice(offset, offset+numResults);
+    }else if(tags !== ""){
+      //console.log("Search by tags " + tags);
+      paginated.entity = searchByTags(tags, paginated.entity);
+      paginated.totalResults = paginated.entity.length;
+      paginated.entity = paginated.entity.slice(offset, offset+numResults);
+    }else if(name !== ""){
+      //console.log("Search by name " + name);
+      paginated.entity = searchByName(name, paginated.entity);
+      paginated.totalResults = paginated.entity.length;
+      paginated.entity = paginated.entity.slice(offset, offset+numResults);
+    }else{
+      //console.log("Search all type:"+type);
+      paginated.totalResults = paginated.entity.length;
+      paginated.entity = paginated.entity.slice(offset, offset+numResults);
+    }
+
+    res.json(paginated);
   });
 
+
   server.get('/api/entities/definition/:type/:name', function(req, res) {
     var type = req.params.type.toUpperCase(),
       name = req.params.name;
     if (mockData.definitions[type][name]) {
+      //console.log(mockData.definitions[type][name]);
       res.send(200, mockData.definitions[type][name]);
     } else {
-      res.send(404, "not found");
+      res.send(404, '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><result><status>FAILED</status><message>(' + type + ') '+ name +' not found.</message><requestId>586fffcd-10c1-4975-8dda-4b34a712f2f4</requestId></result>');
     }
   });
 
@@ -56,27 +156,34 @@
     var type = req.params.type.toUpperCase(),
       text = req.text,
       name,
+      tags,
       indexInArray,
       responseSuccessMessage,
       responseFailedMessage,
-      initialIndex = text.indexOf("name") + 6,
-      finalIndex = getFinalIndexOfName(),
+      initialIndexName = text.indexOf("name") + 6,
+      finalIndexName = getFinalIndexOfName(),
+      initialIndexTags = text.indexOf("<tags>")+6,
+      finalIndexTags = text.indexOf("</tags>"),
       i;
     function getFinalIndexOfName () {
-      for (i = initialIndex; i < text.length; i++) {
+      for (i = initialIndexName; i < text.length; i++) {
         if (text[i] === '"' || text[i] === "'") {
           return i;
         }
       }
     }
-    name = text.slice(initialIndex, finalIndex);
+    name = text.slice(initialIndexName, finalIndexName);
+    tags = text.slice(initialIndexTags, finalIndexTags);
+    tags = tags.split(",");
     responseSuccessMessage = {"status": "SUCCEEDED", "message": "default/successful (" + type + ") " + name + "\n\n","requestId":"default/546cbe05-2cb3-4e5c-8e7a-b1559d866c99\n"};
     responseFailedMessage = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><result><status>FAILED</status><message>(' + type + ') '+ name +' already registered with configuration store. Can\'t be submitted again. Try removing before submitting.</message><requestId>586fffcd-10c1-4975-8dda-4b34a712f2f4</requestId></result>';
 
+    if(name.length < 3) { res.send(404, responseFailedMessage); return; }
+
     if (!mockData.definitions[type][name]) {
       mockData.definitions[type][name] = text;
       mockData.entitiesList[type.toLowerCase()].entity.push(
-        {"type": type, "name": name, "status": "SUBMITTED"}
+        {"type": type, "name": name, "status": "SUBMITTED", "tags":{"tag":tags}}
       );
       res.send(200, responseSuccessMessage);
     } else {
@@ -136,6 +243,282 @@
     res.json(200, responseMessage);
   });
 
+  function getInstanceList(req, res){
+    var type = req.params.type.toUpperCase(),
+        name = req.params.name,
+        start = req.query.start === undefined ? "" : req.query.start,
+        end = req.query.end === undefined ? "" : req.query.end,
+        status = req.query.filterBy === undefined ? "" : req.query.filterBy.substring(7),
+        numResults = parseInt(req.query.numResults === undefined ? 5 : req.query.numResults),
+        offset = parseInt(req.query.offset === undefined ? 0 : req.query.offset),
+        responseMessage = {
+          "instances": [],
+          "requestId": "falcon/default/13015853-8e40-4923-9d32-6d01053c31c6\n\n",
+          "message": "default\/STATUS\n",
+          "status": "SUCCEEDED"
+        };
+
+    var instances = [];
+    instances = instances.concat(mockData.instancesList[type]);
+
+    if(status !== ""){
+      instances = searchInstancesByStatus(status, instances);
+    }
+    //if(start !== ""){
+    //  start = new Date(start);
+    //  instances = searchInstancesByDate("startTime", start, instances);
+    //}
+    //if(end !== ""){
+    //  end = new Date(end);
+    //  instances = searchInstancesByDate("endTime", end, instances);
+    //}
+
+    responseMessage.instances = instances;
+
+    var paginated = responseMessage;
+    paginated.instances = paginated.instances.slice(offset, offset+numResults);
+    return paginated;
+  }
+
+  server.get('/api/instance/logs/:type/:name', function(req, res) {
+    res.json(getInstanceList(req, res));
+  });
+
+  server.get('/api/instance/list/:type/:name', function(req, res) {
+    res.json(getInstanceList(req, res));
+  });
+
+  server.post('/api/instance/suspend/:type/:name', function (req, res) {
+    var type = req.params.type.toUpperCase(),
+        name = req.params.name,
+        start = req.query.start,
+        end = req.query.end,
+        indexInArray = mockData.findByStartEnd(type, start, end),
+        responseMessage = {
+          "status": "SUCCEEDED",
+          "message": "default/" + name + "(" + type + ") start:" + start + " end: " + end + "suspended successfully\n",
+          "requestId": "default/546cbe05-2cb3-4e5c-8e7a-b1559d866c99\n"
+        };
+    mockData.instancesList[type].forEach(function (item) {
+      if (item.instance === start) {
+        item.status = "SUSPENDED";
+      }
+    });
+    //mockData.instancesList[type][indexInArray].status = "SUSPENDED";
+    res.json(200, responseMessage);
+  });
+
+  server.post('/api/instance/resume/:type/:name', function (req, res) {
+    var type = req.params.type.toUpperCase(),
+        name = req.params.name,
+        start = req.query.start,
+        end = req.query.end,
+        indexInArray = mockData.findByStartEnd(type, start, end),
+        responseMessage = {
+          "status": "SUCCEEDED",
+          "message": "default/" + name + "(" + type + ") start:" + start + " end: " + end + "resumed successfully\n",
+          "requestId": "default/546cbe05-2cb3-4e5c-8e7a-b1559d866c99\n"
+        };
+    mockData.instancesList[type].forEach(function (item) {
+      if (item.instance === start) {
+        item.status = "RUNNING";
+      }
+    });
+
+    //mockData.instancesList[type][indexInArray].status = "RUNNING";
+    res.json(200, responseMessage);
+  });
+
+  server.post('/api/instance/rerun/:type/:name', function (req, res) {
+    var type = req.params.type.toUpperCase(),
+        name = req.params.name,
+        start = req.query.start,
+        end = req.query.end,
+        indexInArray = mockData.findByStartEnd(type, start, end),
+        responseMessage = {
+          "status": "SUCCEEDED",
+          "message": "default/" + name + "(" + type + ") start:" + start + " end: " + end + "resumed successfully\n",
+          "requestId": "default/546cbe05-2cb3-4e5c-8e7a-b1559d866c99\n"
+        };
+
+    mockData.instancesList[type].forEach(function (item) {
+      if (item.instance === start) {
+        item.status = "RUNNING";
+      }
+    });//Its badly done makes no sense
+    //mockData.instancesList[type][indexInArray].status = "RUNNING";
+    res.json(200, responseMessage);
+  });
+
+  server.post('/api/instance/kill/:type/:name', function (req, res) {
+    var type = req.params.type.toUpperCase(),
+        name = req.params.name,
+        start = req.query.start,
+        end = req.query.end,
+        indexInArray = mockData.findByStartEnd(type, start, end),
+        responseMessage = {
+          "status": "SUCCEEDED",
+          "message": "default/" + name + "(" + type + ") start:" + start + " end: " + end + "killed successfully\n",
+          "requestId": "default/546cbe05-2cb3-4e5c-8e7a-b1559d866c99\n"
+        };
+    mockData.instancesList[type].forEach(function (item) {
+      if (item.instance === start) {
+        item.status = "KILLED";
+      }
+    });
+    //mockData.instancesList[type][indexInArray].status = "KILLED";
+    res.json(200, responseMessage);
+  });
+
+  server.get('/api/entities/dependencies/:type/:name', function (req, res) {
+    var type = req.params.type.toUpperCase(),
+        name = req.params.name;
+    res.json(200, mockData.entityDependencies);
+  });
+
+  server.get('/api/metadata/lineage/vertices', function (req, res) {
+    res.json(200, mockData.vertices);
+  });
+
+  server.get('/api/metadata/lineage/vertices/:id/:direction', function (req, res) {
+    var id = req.params.id,
+        direction = req.params.direction,
+        response = "";
+    if(id === "40108" && direction === "bothE"){
+      response = mockData.verticesDirection[0];
+    }else if(id === "40108" && direction === "both"){
+      response = mockData.verticesDirection[1];
+    }else if(id === "40012" && direction === "bothE"){
+      response = mockData.verticesDirection[2];
+    }else if(id === "40016" && direction === "bothE"){
+      response = mockData.verticesDirection[3];
+    }
+    res.json(200, response);
+  });
+
+  server.get('/api/metadata/lineage/properties/:id', function (req, res) {
+    var type = req.params.id;
+    res.json(200, mockData.verticesProps);
+  });
+
+
+  /*server.post('/api/entities/prepareAndSubmitRecipe', function (req, res) {
+    var file = req.text,
+      responseMessage = {
+        "requestId": "default\/d72a41f7-6420-487b-8199-62d66e492e35\n",
+        "message": "default\/Submit successful (recipe)\n",
+        "status": "SUCCEEDED"
+      };
+    console.log(file);
+    res.json(200, responseMessage);
+  });*/
+  /*
+   *
+   * CHART
+   *
+   */
+
+  server.get('/api/instance/summary/:type/:mode', function(req, res) {
+
+    var type = req.params.type,
+        mode = req.params.mode,
+        from = req.query.start,
+        fromDate = new Date(from.slice(0,4), (from.slice(5,7)-1), from.slice(8,10), 0, 0, 0),
+        response,
+        selectedArray;
+
+    if (mode === 'hourly') {
+      response = {"summary": [],"requestId":"23c44f3f-f528-4a94-bc0e-f95019729b42","message":"date not found","status":"FAILED"}
+      chartData[type + 'Hours'].forEach(function (item) {
+        item.summary.forEach(function (date) {
+          var currentDate = new Date(
+            date.startTime.slice(0,4),
+            (date.startTime.slice(5,7) - 1),
+            date.startTime.slice(8,10), 0, 0, 0
+          );
+          if (fromDate >= currentDate && fromDate <= currentDate) {
+            response = item;
+            return;
+          }
+
+        });
+      });
+      if (response.status === 'SUCCEEDED') {
+        res.send(200, response);
+      } else {
+        res.send(404, response);
+      }
+    } else if (mode === 'daily') {
+      response = {"summary": [],"requestId":"23c44f3f-f528-4a94-bc0e-f95019729b42","message":"date range not found","status":"FAILED"}
+
+      chartData[type + 'Days'].forEach(function (item) {
+        item.summary.forEach(function (date, index) {
+          var currentDate = new Date(
+            date.startTime.slice(0,4),
+            (date.startTime.slice(5,7) - 1),
+            date.startTime.slice(8,10), 0, 0, 0
+          );
+
+          if (fromDate >= currentDate && fromDate <= currentDate) {
+            if (index + 14 < item.summary.length) {
+              selectedArray = item.summary.slice(index, (index + 14));
+              response = {"summary": selectedArray,"requestId":"23c44f3f-f528-4a94-bc0e-f95019729b42","message":"default\\/STATUS\\n","status":"SUCCEEDED"};
+              return;
+            }
+          }
+
+        });
+      });
+
+      if (response.status === 'SUCCEEDED') {
+        res.send(200, response);
+      } else {
+        res.send(404, response);
+      }
+
+    } else {
+      console.log('error');
+    }
+
+  });
+
+  server.get('/api/entities/top/:entityType', function(req, res) {
+    var type = req.params.entityType,
+        start = req.query.start,
+        end = req.query.end,
+        from = new Date(start.slice(0,4), (start.slice(5,7)-1), start.slice(8,10), 0, 0, 0),
+        to = new Date(end.slice(0,4), (end.slice(5,7)-1), end.slice(8,10), 0, 0, 0),
+        objectToGive = Math.floor(Math.random() * 2),
+        response;
+
+    response = chartData.topEntities[objectToGive];
+
+    chartData.topEntities.forEach(function (item) {
+      //console.log(item);
+    });
+
+    if (response.status === 'SUCCEEDED') {
+      res.send(200, response);
+    } else {
+      res.send(404, response);
+    }
+
+  });
+
+  server.get('/api/admin/version', function(req, res) {
+    setTimeout(function(){
+      res.send(200, mockData.server);
+    }, 3000);
+  });
+
+  server.get('/api/admin/clearuser', function(req, res) {
+    res.send(200, "cleared");
+  });
+
+  server.get('/api/admin/getuser', function(req, res) {
+    res.send(200, "ambari-qa");
+  });
+
   server.listen(PORT, function () {
     console.log('Dev server listening on port ' + PORT);
   });

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/webapp/pom.xml
----------------------------------------------------------------------
diff --git a/webapp/pom.xml b/webapp/pom.xml
index 8043ac8..e63aa44 100644
--- a/webapp/pom.xml
+++ b/webapp/pom.xml
@@ -541,6 +541,9 @@
               <artifactId>apache-rat-plugin</artifactId>
               <configuration>
                 <excludes>
+		  <exclude>**/loginData.json</exclude>
+		  <exclude>**/src/main/webapp/css/*</exclude>
+		  <exclude>**/src/main/webapp/js/*</exclude>
 		  <exclude>*.txt</exclude>
 	          <exclude>**/*.txt</exclude>
 	          <exclude>.git/**</exclude>

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/webapp/src/main/webapp/index.html
----------------------------------------------------------------------
diff --git a/webapp/src/main/webapp/index.html b/webapp/src/main/webapp/index.html
index 3dc9c89..13fbe35 100644
--- a/webapp/src/main/webapp/index.html
+++ b/webapp/src/main/webapp/index.html
@@ -1,31 +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
+/**
+ * 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 ng-app="app">
+  <head>
+    <title>Falcon Web UI</title>
+    <meta charset="utf-8">
+    <meta name="viewport" content="user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
+    <link rel="stylesheet" href="css/main.css"/>
+    <link rel="icon" type="image/x-icon"
+      href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAKL2lDQ1BJQ0MgUHJvZmlsZQAASMedlndUVNcWh8+9d3qhzTDSGXqTLjCA9C4gHQRRGGYGGMoAwwxNbIioQEQREQFFkKCAAaOhSKyIYiEoqGAPSBBQYjCKqKhkRtZKfHl57+Xl98e939pn73P32XuftS4AJE8fLi8FlgIgmSfgB3o401eFR9Cx/QAGeIABpgAwWempvkHuwUAkLzcXerrICfyL3gwBSPy+ZejpT6eD/0/SrFS+AADIX8TmbE46S8T5Ik7KFKSK7TMipsYkihlGiZkvSlDEcmKOW+Sln30W2VHM7GQeW8TinFPZyWwx94h4e4aQI2LER8QFGVxOpohvi1gzSZjMFfFbcWwyh5kOAIoktgs4rHgRm4iYxA8OdBHxcgBwpLgvOOYLFnCyBOJDuaSkZvO5cfECui5Lj25qbc2ge3IykzgCgaE/k5XI5LPpLinJqUxeNgCLZ/4sGXFt6aIiW5paW1oamhmZflGo/7r4NyXu7SK9CvjcM4jW94ftr/xS6gBgzIpqs+sPW8x+ADq2AiB3/w+b5iEAJEV9a7/xxXlo4nmJFwhSbYyNMzMzjbgclpG4oL/rfzr8DX3xPSPxdr+Xh+7KiWUKkwR0cd1YKUkpQj49PZXJ4tAN/zzE/zjwr/NYGsiJ5fA5PFFEqGjKuLw4Ubt5bK6Am8Kjc3n/qYn/MOxPWpxrkSj1nwA1yghI3aAC5Oc+gKIQARJ5UNz13/vmgw8F4psXpjqxOPefBf37rnCJ+JHOjfsc5xIYTGcJ+RmLa+JrCdCAACQBFcgDFaABdIEhMANWwBY4AjewAviBYBAO1gIWiAfJgA8yQS7YDApAEdgF9oJKUAPqQSNoASdABzgNLoDL4Dq4Ce6AB2AEjIPnYAa8AfMQBGEhMkSB5CFVSAsygMwgBmQ
 PuUE+UCAUDkVDcRAPEkK50BaoCCqFKqFaqBH6FjoFXYCuQgPQPWgUmoJ+hd7DCEyCqbAyrA0bwwzYCfaGg+E1cBycBufA+fBOuAKug4/B7fAF+Dp8Bx6Bn8OzCECICA1RQwwRBuKC+CERSCzCRzYghUg5Uoe0IF1IL3ILGUGmkXcoDIqCoqMMUbYoT1QIioVKQ21AFaMqUUdR7age1C3UKGoG9QlNRiuhDdA2aC/0KnQcOhNdgC5HN6Db0JfQd9Dj6DcYDIaG0cFYYTwx4ZgEzDpMMeYAphVzHjOAGcPMYrFYeawB1g7rh2ViBdgC7H7sMew57CB2HPsWR8Sp4sxw7rgIHA+XhyvHNeHO4gZxE7h5vBReC2+D98Oz8dn4Enw9vgt/Az+OnydIE3QIdoRgQgJhM6GC0EK4RHhIeEUkEtWJ1sQAIpe4iVhBPE68QhwlviPJkPRJLqRIkpC0k3SEdJ50j/SKTCZrkx3JEWQBeSe5kXyR/Jj8VoIiYSThJcGW2ChRJdEuMSjxQhIvqSXpJLlWMkeyXPKk5A3JaSm8lLaUixRTaoNUldQpqWGpWWmKtKm0n3SydLF0k/RV6UkZrIy2jJsMWyZf5rDMRZkxCkLRoLhQWJQtlHrKJco4FUPVoXpRE6hF1G+o/dQZWRnZZbKhslmyVbJnZEdoCE2b5kVLopXQTtCGaO+XKC9xWsJZsmNJy5LBJXNyinKOchy5QrlWuTty7+Xp8m7yifK75TvkHymgFPQVAhQyFQ4qXFKYVqQq2iqyFAsVTyjeV4KV9JUCldYpHVbqU5pVVlH2UE5V3q98UXlahabiqJKgUqZyVmVKlaJqr8pVLVM9p/qMLkt3oifRK+g99Bk1JTVPNaFarVq/2ry6jnqIep56q/ojDYIGQyNWo0yjW2NGU1XTVzNXs1nzvhZei6EVr7VPq1drTltHO0x7m3aH9qSOnI6XTo5Os85DXbKug26abp3ubT2MHkMvUe+A3k19
 WN9CP16/Sv+GAWxgacA1OGAwsBS91Hopb2nd0mFDkqGTYYZhs+GoEc3IxyjPqMPohbGmcYTxbuNe408mFiZJJvUmD0xlTFeY5pl2mf5qpm/GMqsyu21ONnc332jeaf5ymcEyzrKDy+5aUCx8LbZZdFt8tLSy5Fu2WE5ZaVpFW1VbDTOoDH9GMeOKNdra2Xqj9WnrdzaWNgKbEza/2BraJto22U4u11nOWV6/fMxO3Y5pV2s3Yk+3j7Y/ZD/ioObAdKhzeOKo4ch2bHCccNJzSnA65vTC2cSZ79zmPOdi47Le5bwr4urhWuja7ybjFuJW6fbYXd09zr3ZfcbDwmOdx3lPtKe3527PYS9lL5ZXo9fMCqsV61f0eJO8g7wrvZ/46Pvwfbp8Yd8Vvnt8H67UWslb2eEH/Lz89vg98tfxT/P/PgAT4B9QFfA00DQwN7A3iBIUFdQU9CbYObgk+EGIbogwpDtUMjQytDF0Lsw1rDRsZJXxqvWrrocrhHPDOyOwEaERDRGzq91W7109HmkRWRA5tEZnTdaaq2sV1iatPRMlGcWMOhmNjg6Lbor+wPRj1jFnY7xiqmNmWC6sfaznbEd2GXuKY8cp5UzE2sWWxk7G2cXtiZuKd4gvj5/munAruS8TPBNqEuYS/RKPJC4khSW1JuOSo5NP8WR4ibyeFJWUrJSBVIPUgtSRNJu0vWkzfG9+QzqUvia9U0AV/Uz1CXWFW4WjGfYZVRlvM0MzT2ZJZ/Gy+rL1s3dkT+S453y9DrWOta47Vy13c+7oeqf1tRugDTEbujdqbMzfOL7JY9PRzYTNiZt/yDPJK817vSVsS1e+cv6m/LGtHlubCyQK+AXD22y31WxHbedu799hvmP/jk+F7MJrRSZF5UUfilnF174y/ariq4WdsTv7SyxLDu7C7OLtGtrtsPtoqXRpTunYHt897WX0ssKy13uj9l4tX1Zes4+wT7hvpMKnonO/5v5d+z9UxlfeqXKua
 q1Wqt5RPXeAfWDwoOPBlhrlmqKa94e4h+7WetS212nXlR/GHM44/LQ+tL73a8bXjQ0KDUUNH4/wjowcDTza02jV2Nik1FTSDDcLm6eORR67+Y3rN50thi21rbTWouPguPD4s2+jvx064X2i+yTjZMt3Wt9Vt1HaCtuh9uz2mY74jpHO8M6BUytOdXfZdrV9b/T9kdNqp6vOyJ4pOUs4m3924VzOudnzqeenL8RdGOuO6n5wcdXF2z0BPf2XvC9duex++WKvU++5K3ZXTl+1uXrqGuNax3XL6+19Fn1tP1j80NZv2d9+w+pG503rm10DywfODjoMXrjleuvyba/b1++svDMwFDJ0dzhyeOQu++7kvaR7L+9n3J9/sOkh+mHhI6lH5Y+VHtf9qPdj64jlyJlR19G+J0FPHoyxxp7/lP7Th/H8p+Sn5ROqE42TZpOnp9ynbj5b/Wz8eerz+emCn6V/rn6h++K7Xxx/6ZtZNTP+kv9y4dfiV/Kvjrxe9rp71n/28ZvkN/NzhW/l3x59x3jX+z7s/cR85gfsh4qPeh+7Pnl/eriQvLDwG/eE8/s3BCkeAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QoRBwcQl9gdLAAAFKZJREFUeNrtWnl8VuWVft57vy8LoCCrhCVBAgkJYO04rVinFbVacUck7IshZF9YYlgCWQgge8hGQhLZNwHHilW72epo1bZCHQgJSdg3WXREyPZ99z3P/HFvAlqt1VHAmXl/v/vL78td3vc87znPec65F/j/8X97qKs9Yb/EMpgmXf4uf/2XpWP4RdfcmvKcy0tt7V8Z9b8HgPCk1ajImwwA+EHaJpflaeiroAYrqH8D4AZAAPWEvGIp/Wrl8ugL9n1lqMib9P0FIDyhGBUFMc0gPKKglkAh5PLErCXhBWAAMJRSfQCA5CGh+cD+/MjaAQnF2Os843sFQHBCEW
 oL4hAev2oglHpdKXQgsQtQ60Xkrcqi2A+/MEwSVvc3FZMBToLIzH2Fcc9eeT40Kh9VpYnXNwC3PbMaexZPRmhc4UoFJCmo8g+r/2vyx7+bLZ/xkMQSVORH27E/vRQfLL0c9/1i84OhjBoB/mgQvyfUb6tWxb133XtASGyucWBVioRE5+8DGKQo4VWrU44CQFhMEfYXx33pvQOnlfcSU87sWxxVDwB9o3J7GoY5g4qdQfQA8CMFfABhelVp8svXHQD9IpepyvJp7Bu14ryieudAWcojABAanYeqkqS/u77PpFxVU5bCsISSO5Shtiuo7gAglF/6+7jHvr/s6YsAcP+snb6nLp5PJXC6qb6x0jBkFYiBVBhUUzrl3d4xK3GwOPnaAhA8cYmqXZPKPhOXfqqUsaL6uakZ/WJylbfJYO2aJATHF8Dfx99UUAagoAyFD5ZN8PaZtGKTUhgF4Ncg74RSN0AZZYryMKB+I+QAZaj2IAMB9WZ1acrPAKD35GUdDQt/JLmuds30JX3GL0LNurSvtWbj2zK+54hM1K5JZe8JS97WZEr1c1Mz+k7KNcQC3f72NLWFCdi7IlK37RPO1l0DVasuPe0NUGpaU10dGi5dXOxt8vzWU3epXryeNU0N9S96GurGWh7P0976unu9jY2fNNRfHAIAvZJXwrT4Sc1z0/oTbAyesGRczbo0hKeUXH0P6DV2IQ5vmIle4xZmQKmbDq+bkdJ70nKlRLP2uVQnHa66hSLLDMP4OZRqrZypRaS6ojA2pNvw7P4CvRCG8lFwbTm1NX1t0Jj5/Y9snL3vJwDedubqO34Z6j2XcGJLBvpELoMGcKh8GgInLr6pTbubdMWKqE+vSQj0Gr9oAEWWHNkw8xdB4xapT+vr+PGObIREr+jiaWj8jWm4BkKp9QDeh+J5EAYAAVVHGCqCWp+gwmsH16SuUerrLeuWCctwaO00hKeUJlTkRhWEJ5ehYuV3J54+MwJH5SgA6Dk
 y583PnwsYlXNj4Mh5ZT3GPtvlfzJHWFLZowPiV7X6quv6J5XeF5ZcNvaqe0DgqJwyuF2ZR9fNONFjxCIc32oTUZeR89SZLXMIAD3HLMSxjTO/fPGJJdiXH42whNIQAO0Mhc4EHleKTysoCBApovYY4AVqNijArDjR8SR2Df1MPTEgqfRPe/Oi7uwXX4zKwq9Wj65vTHqjcgDxmjB9A4Xy3vF1M04EjV2IIxsus3Dbzh3YOaXc3JsbqW/o2P6fY2Vl9SaMpwHcrICDJH5JSpBSqtBU8AMA5bJt7h90DkgsOaopiZUFsbtsCS03OOyunPriu8sCx7ZmaWqdcnxzeikAHNkw05Gy5QCA6pVxUErdFJa8+taK3Oi/rxOSr2Bsw8CAxELsy499xWLdCK2xQESqQb4sxOsU+pHynkXebllys1jSV4tMIaW1AfVSeHxxiVNDmLZv85+y4Rt7AAj0GDGvk3K5VrTEauJq7M+fjMqCSPRPKr8NSuYQXFt/ts2u5mt+GvMy3ix+GABQsTIa/aeUdoGg476VURV2tihCRUGcBeAVAK+ExxYNVwpTNPBQVWHcK+GJ5YDhMWi6zlXmReUCyA2LK5oNMCc8vsiPoisAAJZFXK0RllByJRH9y4Ck1bXhSaUtRt+aWvq5CrG818CU8mUDU8o/GTil/O+IITQ6z/4bWxgTGlfIfnH5A1vujS1ouW70oHSExxTZXhdXmBYaV8h+0QUDr2qDIyzOXtCt8Rvd4Yklvw1PLGZ4QtGPv5ily6YPSCk7OjCljANSyhmWVPrTFkkcs8KpI/IUAIROXnlfaEw+Q2Ly4myQV365/I4rtAGLyd8DAP1iCr57w0PiChAWV2AAQFhswcNh8UUMiy862QXpyq79SxUAdHmiSPVPWr1iQHIZBySXXXD+sn9C6UMAEJ5Self/pHJfx/hHr/AChkbnnQKAkJj8r8xWoTH5TgX59Yz/xiSoYBj7ixKkX1xBPoFdpLy1vzCu
 2xnkcEDyaqMiL4oDkkqf6dTDVUfAf+/KSYqU/wQEFF22ryDqV/1TyqYbUD7K4ICB09a0o2acXQGuTKUItGA+ABwoTvzKeK4qtvsDlasSvnsA+kzOV1VFcRISk/+yaEkg+V5lUcK/hcWvMgGAWrqFJ5acJtl6X97kVhV5k2PCE0umAbiLAs++/OioPtHFvorI3Js76XUI2tFjtQYlxJ5BxpNETWlS4XftyV8bgOCJy1GzOpF9o/O2Q/RDJPZUFSfe0S+2wNxfGKvD41dNAHDQUNZt+/InZ4SnlN4BzIQClioKFPUcAPD1NX9FSoFT+t4tYrWlsGfgzgZQGE6i+mpw2NdKg30il6OmfCr6TFoxg5Y1jAqXaspSfhgSm29UrkrQ4QnFawn+tKIgxgcA+ieXPbcvd9LT4fGr8kiCgLeiIHZx/8SSjgq8l8QCO2XL/XD75aKhHj6vFo8HBQDevO4AqCmfiuDIFb0heqECAGX+EAAOrEqU8Piilyly5/6iuPa2JC1bD2G5IxkSQYLgDtgVUKlBQlHvdX6HKk0fUi5ASwoIKKDqagDwT4fALZFLnfC0fg0t0IKi6rIpNXYaKtpC8qH9nZo6OHo8jtS3782PeiM8rvAZW5ESJJf2inxOgfyFkNhbEH/O9gDeoJTVSwmrIfIDUACF+usKgEPl09ErcukD1Lq3gDi4dnq8owOmKnCEAI8iawpD44o6kVKovd77bWmKp0GCJKqK4nf7+TUOVkI/Cg83P1tEINpzp1bqDyICEYEGjesGgL6Ry22P93gzKAICafbOF4SRWEbKu1VF8bsAwDSMPxCsrCxOOBEaW+JLMIQkQL7t7PYkglCgT4uqJiGaQ9jUWAT7Wigt6roBwOPxuABAUwYJiUPr0hYDAIV/IgmAUQAQGl/4AMhwaD5rG+uZQGf3IdzrGHuv/T+pAYCQ6BU3Otf0M0JCTrIFEN3+ugHgyIYZ3lvGLhohloamTWyhMflzSLQlcahyV
 dI++2GqhCDE/eFGO73hcWdDQWC3A0B722CEAMCBkimfOrve5WDmcBHyPzQIKnXndcUBQv2oFg1fl88aZ/ezQYGCJNvStfBHFAmkyP7KlVnOyw/eCggBgYDVfaILO5Bw2U4DT0sIiAZFI2RS7sOmy5VNLSDlAQAIGrfo+gCg0eMJBAzUrn/m7b6TV8YTdl636HrD1sYy1Yn1d+3ipqANya7NHgDijAErQEGgICQl8DIABIUUSvahdWm/g8KnlmXhlqeX3XZkfdp14gHaaq0MtcVZ8RyIBii7a1fHX3SYLAJCkNgDAPB6O0I0IFpBNKpXJ1WRdDvG2qh0f6u5tXAaoALltp+vPmG4TPccEvDW1yVf8xAIGrOgeZGBWnvXhSYUdqSwCwkA6iUACI7Ju8NWeoRX0fEI9bOW+OflEsohQJCCkCG773B8oLIZmMPvbBt/eOPMPCp4LJHxANB/3IprB8CRjbPsDRU57u/jf1wam4Y1WyWWtRUADOHwZqMOFiftdUwdiM8jQN3CiCCgLd3H8Z63QYFzLAcAH9M1SWsLgaPnx+5bP+Xah4CCaji8adZ+EQmlsndbUZ2yw0Pf1uLaLXEt/aiI5qNXXK4bMM/Yd1IIQine5zQy/+ikQlJ0u96RS+85ujl9gzJdf2toalzmNGHNawqA28dd7fTRw5UQimhobNvK6+x2SMu2trQM6a+EUAIoIQwvgsXvxjMQCoSECCAyAgBcbv/dDgCaJOi1ygEgoEPHu7SIf8DI7GnHNqfrawpA30EPjHUYW1MIUs4eXxmre8YW+UDYxTaILakNWgIp9FIEFMIQHVabP9GiyHmKkEJSxKdvVG7vA6VJnxCopohBEVLroF7jnx29Z1VCXWv/Vo81NDYu/VnyZr+uT2WpruMWXn0Auo6ch7dSBl0RDQSAOgDw0U0mKYbj/meviBmBgoICoQgRuc1pf/8VoBvKbl1rj9d5e6FSNWhoUGlbCa4HgGObZr/kdrlzK0
 5U/vn09gxePHfq6gNwesucK1xb6mxes4sVNjb5NGcAUrpfqe+dQ5EARIIAQENW2REgSoQgJBEAhsxM26XISxBqkKTWRtDo+dsA4Oz2rCkCnu0SkZF86dV89J645Np1hET4V5vx2VysKJKg2KF9GQD57AEMtic03wV4GSHRvr0nLnmgMExRGa65mmJqUmmCXm0Nv2XMosEA8PHOnPu04P7uoxcMPLgm9doBYJjmYSe1CQBoBWlJc3LF5z9XpkASEAkAgINrpp0neYg2CygSEMubZqfcmSsUYDnSUIEUj9X4OgC0ezzVPL8966Emj8fvmvYED65J3WJXgOhyV+4rhr/LbTsyBUJB36ilHZwQULSHnd4oCJ645EEAME3XaoiYjhcAwsG9Ji7pap9z3y1CJUKK0NBa0C0ia98nLy7RAcOy1LntmX/u/i0S4dcCoM+E5Y7TGyeF0v5sRY2P+LTytmQGIbyadzjK8QJJ8zIPEJZlTQCA2rXPLBKloEGlQWoS9Hp2AsDRTbPeNl2u1XYY2Oe8Wod3i8h66dSODHZ/Kgsn1s+8NgDUrJ0Kpy+QRxJNTY3GgVWxTQCPOHEN5bV+bCth9aGQhoBoPkgZwss88e+QlkqJFA4KHvdscEBElnliy5xoH9N8WyiqmUo92vtIj5HZy05sz0BARPa1CwEAaNWqzToK4QL/1U75rNBCaBKW19vP9hJzd3MrsKUlqKVN8LhFfQHAz+eGWAK2JiKVFhGPZf3+1LYM7bonDie2ZdzlNl1/0iLKbpNR6puapnYbkb3w1La56D4iW10TAIInLkXV6uQzSqm9mhxnKzmfV1rYXikbFK+3yE6NzRxACAlNnQsAB9YknYHCC6QoJ40qLbpn0JgFT1ivF+Hm4Vnq9POZP/Fxu3fYKVMsEWF9U+OMgIjMRSe2zmXn4XONqw5A7Zrpzga7xmuv924AGD44qARQsNO9BI5K+T3atr3pIgDPFRygAGrLsu65b+EuFwD
 c2KrdeCcjEk4qtSzvCwDw4fMZ7DEqx/xwW+ZTbh/fJ5Rh+AihhJC6Js8zHYfNWX/2+Wy5JiHgtMn2GC7j47DYfL9FEyNA4AMRwhKNdz76y5C9xfEXSbzfXCE4h0nSt7Zi73gAqChLvGSYrgwRKi2AUMHSgu4j570IANrj0Y/NegFnn8988dTOHMPX7d5EEUNE0NTkGdth6Jy/5T1fbQJAtxHZVw+AW8YvRMfHMmAarlENFy/dDABu01UkQlAAj6cpGgB83b4Z1FS27ndqQMKyvN6lzc86vjk92zTMKmkOBZJer/VY4KicYad2ZGPv8SqETFyM4KcyeXZH9phuXbv2cLldiw3TRL2n6db0zWutmyMyHz+5da4t278mQX5jIgmeMB+1a2cDAHqMnIfjW+agy/AMj9babRjGmTPPZ92slEJARNZ5EelwxUwEoHzcPncf2zT7DQCImPmC683aD7xaRAMw7ZJBoWfnTp3+XJh4Pmj0AhzZNAsBI7JxyjEUAALHLHjs/KefDnKbZprL5drtY5hRp7bN3X1VAPii0W1E1rgmj2edUgpul6vfqW2ZVb1Gzp9Q521aA6XYMh8Jl2mePrUtI6BvxCJUb0tDzzGLejQ21h0TinY8UyllnD+3I7vT5+cJGPcs2p47h8pXl322aIvINk5vmyvXBoB7ooDXS9HxyfTzlmV1aOXn/+KpbRlPAEDA8IyTWusA2B9A0gFB+fr6P3hs8+zXuk8owIm1Ceg1dknnS/WfntEiopw60mW69p/ZkRXe6cnZ5rmd87/1nsC39/rpdfs7oNat2jwMw0C9xzO45Q2sr9/DohQ0SUf9KQ3Ao735AKAazwMADm9IPduq9Y3dTdNQIqIEpMfyhHUaNvcvzcb3HLvoOgUAQHDCEhzdMONdH5dPIUXadonI/HGHYXPVsQ0z97hN12KSqqUjRNLr8QYHjp4/5PjWTHQbvQgPvkocXZ968v0F2aZhut4nqQjAo63bOwxN
 ryGJYxvS0H3kvOsTgNqCVASNWajObs9MMAzzhGVZ6z7akc02Q9JwaltGmmkYv7pCHiuCqG9q3AAATY0X1asP2hEZlprGj3bOu93fzy8FUKAmvJYV3H5oel1o5NLeJ7bMgfnAt9Mo/U5eQHYYNtf8aEe2bvv4LHZse0PIwXUzq/1/MRUNry1Hp2Fzq72Wt88VDUTl7+uXdnpbxuIWkhuRA69uwLnt83Hv9DWt/3b4UL6lrYlaCwzDgK+v7/Rzz2cuu24BaB7dxy1sU9/QMPrj7dklPUcvwLFNdou907C57zdZ3h8299YMpVRQ1+7tKw7VXPC8tryFxbuOexan189oeV67oekrSUnyWF64Xe6Pb2rdaujRjelvtGShiGyc3Db3+gCg66gcnN6cbi/8ydn4ZOf8z3nJnDLLa0UC0CRNt8t14KMXckKDxy5RtRtS/+FXYT3HLPjRhbq6DK31YB+321+0TLvBz/fl41vnVgNAj1ELcXzzzGvvAV86Bo0D3lmPbiPnjbtUX79OnE5SK1//hWd2ZM76h1pjVA5OOsACwI1D026EmP3a+rd60ivicbvcG49vmlmF6310Gz1fAcAdc9b6tB+afqD1o2ls/cgzDBiVfR8AdInI+spn9ByZY7Qflu5y/XzKZ16a9Bi9EN+b0fmpDBMAbo7IfKTtE7MutHl0BruNyhnwvTPkm46eoxd85neX4ZlPdBw294OQyLw2V2P+/waCldfgs3UggwAAAABJRU5ErkJggg=="/>
+  </head>
+  <body ng-cloak ng-controller="RootCtrl" id="body">
 
-      http://www.apache.org/licenses/LICENSE-2.0
+    <section class="container-fluid">
+      <header class="row" nav-header id="mainHeader"></header>
+    </section>
 
-  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 lang="en">
-<head>
-    <meta charset="UTF-8" />
-    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20130821" />
-    <meta http-equiv="Content-Language" content="en" />
-    <title>Apache Falcon - Data management and processing platform</title>
-</head>
-<body class="topBarEnabled">
-<h1> Apache Falcon</h1>
-More information at: <a href="http://falcon.apache.org/index.html"  title="About">Project Website</a>
-</body>
+    <section class="container-fluid">
+      <div class="row mainUIView" ui-view id="mainUIView"></div>
+    </section>
+
+    <script src="js/vendor.min.js"></script>
+    <script src="js/main.min.js"></script>
+
+  </body>
 </html>


[12/22] falcon git commit: FALCON-1315 Update falcon ui for HiveDR, secure clusters and bug fixes. Contributed by Armando Reyna/Venkat Ranganathan.

Posted by so...@apache.org.
http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/dataset/datasetFormGeneralStepTpl.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/dataset/datasetFormGeneralStepTpl.html b/falcon-ui/app/html/dataset/datasetFormGeneralStepTpl.html
new file mode 100644
index 0000000..458a25b
--- /dev/null
+++ b/falcon-ui/app/html/dataset/datasetFormGeneralStepTpl.html
@@ -0,0 +1,718 @@
+<!--
+/**
+ * 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.
+ */
+-->
+<form id="formGeneralBox"
+      name="datasetForm"
+      class="col-xs-24"
+      novalidate>
+
+  <div class="row">
+    <div class="col-xs-24">
+      <label class="db"> Mirror Name
+        <input type="text"
+               name="nameInput"
+               class="form-control"
+               ng-model="UIModel.name"
+               placeholder=""
+               ng-disabled="!cloningMode"
+               ng-pattern="validations.patterns.name"
+               ng-required="true"
+               check-name="{type:'process', check:clone}"/>
+      </label>
+    </div>
+
+    <div class="col-xs-24 tagsBox mt10">
+      <label class="db">Tags
+
+        <div class="row mb10">
+          <div class="col-xs-10">
+            <input type="text"
+                   name="newTagKeyInput"
+                   class="form-control"
+                   ng-model="UIModel.tags.newTag.key"
+                   placeholder="key"
+                   ng-pattern="validations.patterns.alpha"
+                   ng-required="UIModel.tags.newTag.value"
+                   validation-optional-message="{{validations.messages.key}}"/>
+          </div>
+          <div class="col-xs-10">
+            <input type="text"
+                   name="newTagValueInput"
+                   class="form-control"
+                   ng-model="UIModel.tags.newTag.value"
+                   placeholder="value"
+                   ng-pattern="validations.patterns.alpha"
+                   ng-required="UIModel.tags.newTag.key"
+                   validation-optional-message="{{validations.messages.value}}"/>
+          </div>
+          <div class="col-xs-4">
+            <button type="button"
+                    class="btn btn-default btn-xs"
+                    ng-click="addTag()"
+                    ng-disabled="!UIModel.tags.newTag.key || !UIModel.tags.newTag.value"
+                    ng-disabled="false">
+              <span class="glyphicon glyphicon-plus"></span> add tag
+            </button>
+          </div>
+        </div>
+
+        <div ng-repeat="tag in UIModel.tags.tagsArray" class="row">
+          <div class="col-xs-10">
+            <h6>{{tag.key}}</h6>
+          </div>
+          <div class="col-xs-10">
+            <h6>{{tag.value}}</h6>
+          </div>
+          <div class="col-xs-4" ng-if="tag.key !== '_falcon_mirroring_type'">
+            <button type="button"
+                    class="btn btn-default btn-xs"
+                    ng-click="removeTag($index)"
+                    ng-disabled="false">
+              <span class="glyphicon glyphicon-minus"></span> delete
+            </button>
+          </div>
+        </div>
+
+      </label>
+    </div>
+  </div>
+  <div class="row">
+    <div class="col-xs-24 mt10">
+      <label class="db">Mirror type
+        <div class="typeButtonsBox">
+          <button type="button"
+                  ng-class="{active:UIModel.formType === 'HDFS'}"
+                  class="btn btn-default btn-xs"
+                  ng-click="switchModel('HDFS')">
+            File System
+          </button>
+          <button type="button"
+                  ng-class="{active:UIModel.formType === 'HIVE'}"
+                  class="btn btn-default btn-xs"
+                  ng-click="switchModel('HIVE')">
+            HIVE(catalog Storage)
+          </button>
+        </div>
+      </label>
+    </div>
+  </div>
+
+  <div class="row">
+    <div class="col-xs-24 clusterBox">
+      <h3>Source</h3>
+      <div class="runJobOnBox">
+        <input type="radio"
+               id="runJobOnSourceRadio"
+               ng-model="UIModel.runOn",
+               value="source"
+               ng-required="true"
+               ng-disabled="UIModel.source.location !== 'HDFS'"/>
+        Run job here
+      </div>
+
+      <div class="locationBox" ng-if="UIModel.formType === 'HDFS'">
+        <label class="db">Location:
+          <span>
+            <input type="radio"
+                   ng-change="checkFromSource()"
+                   id="sourceHDFSRadio"
+                   ng-model="UIModel.source.location"
+                   value="HDFS"
+                   ng-required="!UIModel.source.location"/> HDFS
+          </span>
+          <span ng-if="UIModel.target.location === 'HDFS'">
+            <input type="radio"
+                   ng-change="checkFromSource()"
+                   id="sourceAzureRadio"
+                   ng-model="UIModel.source.location"
+                   value="azure"
+                   ng-required="!UIModel.source.location"/> Azure
+          </span>
+          <span ng-if="UIModel.target.location === 'HDFS'">
+            <input type="radio"
+                   ng-change="checkFromSource()"
+                   id="sourceS3Radio"
+                   ng-model="UIModel.source.location"
+                   value="s3"
+                   ng-required="!UIModel.source.location"/> S3
+          </span>
+
+        </label>
+      </div>
+
+      <div>
+        <select ng-if="UIModel.source.location === 'HDFS' || UIModel.formType === 'HIVE'"
+                ng-model="UIModel.source.cluster"
+                name="sourceClusterSelect"
+                ng-change="getSourceDefinition()"
+                ng-required="UIModel.source.location === 'HDFS' || UIModel.formType === 'HIVE'"
+                class="col-xs-24 form-control"
+                id="sourceClusterSelect">
+
+          <option value="" disabled style='display:none;'>-Select cluster-</option>
+          <option ng-selected="UIModel.source.cluster === cluster.name"
+                  ng-repeat="cluster in clustersList"
+                  value="{{cluster.name}}">
+            {{cluster.name}}
+          </option>
+        </select>
+      </div>
+
+      <div ng-if="UIModel.source.location === 'azure' && UIModel.formType === 'HDFS'">
+        <label class="db">Base URL
+          <input type="text"
+                 name="sourceClusterUrlInput"
+                 class="form-control"
+                 ng-model="UIModel.source.url"
+                 placeholder="URL"
+                 ng-pattern="validations.patterns.azure"
+                 ng-required="UIModel.source.location === 'azure'"
+                 validation-message="{{validations.messages.azure}}" />
+        </label>
+      </div>
+      <div ng-if="UIModel.source.location === 's3' && UIModel.formType === 'HDFS'">
+        <label class="db">Base URL
+          <input type="text"
+                 name="sourceClusterUrlInput"
+                 class="form-control"
+                 ng-model="UIModel.source.url"
+                 placeholder="URL"
+                 ng-pattern="validations.patterns.s3"
+                 ng-required="UIModel.source.location === 's3'"
+                 validation-message="{{validations.messages.s3}}" />
+        </label>
+      </div>
+
+      <div ng-if="UIModel.formType === 'HDFS'">
+        <label class="db">Path
+          <input type="text"
+                 name="sourceClusterPathInput"
+                 class="form-control"
+                 ng-model="UIModel.source.path"
+                 placeholder="Path"
+                 ng-pattern="validations.patterns.osPath"
+                 ng-required="UIModel.source.location === 'HDFS' || UIModel.formType === 'HIVE'"
+                 validation-message="{{validations.messages.path}}"/>
+        </label>
+      </div>
+
+      <div ng-if="UIModel.formType === 'HIVE'">
+        <h5 class="hiveDatabasesTitol">I want to copy</h5>
+        <div class="databaseRadioBox">
+          <input type="radio"
+                 id="targetHIVEDatabaseRadio"
+                 ng-model="UIModel.source.hiveDatabaseType"
+                 value="databases"
+                 ng-required="!UIModel.source.location"/> Entire databases
+          <input type="radio"
+                 id="targetHIVETablesRadio"
+                 ng-model="UIModel.source.hiveDatabaseType"
+                 value="tables"
+                 ng-required="!UIModel.source.hiveDatabaseType"/> Tables in a single database
+        </div>
+
+        <div ng-if="UIModel.source.hiveDatabaseType === 'databases'">
+          <label class="db">Databases (comma separated)
+            <textarea name="sourceDatabasesInput"
+                      class="form-control databasesTextArea"
+                      ng-model="UIModel.source.hiveDatabases"
+                      ng-pattern="validations.patterns.textarea"
+                      ng-required="UIModel.target.location === 'HDFS'"
+                      validation-message="{{validations.messages.databases}}"
+                      ng-keydown="validations.acceptNoSpaces($event)">
+            </textarea>
+          </label>
+        </div>
+        <div ng-if="UIModel.source.hiveDatabaseType === 'tables'">
+          <label class="db">Database
+            <input type="text"
+                   name="sourceDatabaseInput"
+                   class="form-control"
+                   ng-model="UIModel.source.hiveDatabase"
+                   ng-pattern="validations.patterns.textarea"
+                   ng-required="UIModel.target.location === 'HDFS'"
+                   validation-message="{{validations.messages.database}}"
+                   ng-keydown="validations.acceptNoSpaces($event)"/>
+          </label>
+          <label class="db">Tables (comma separated)
+            <textarea name="sourceTablesInput"
+                      class="form-control tablesTextArea"
+                      ng-model="UIModel.source.hiveTables"
+                      ng-pattern="validations.patterns.textarea"
+                      ng-required="UIModel.target.location === 'HDFS'"
+                      validation-message="{{validations.messages.tables}}"
+                      ng-keydown="validations.acceptNoSpaces($event)">
+            </textarea>
+          </label>
+        </div>
+      </div>
+
+    </div>
+
+    <div class="col-xs-24 clusterBox">
+      <h3>Target</h3>
+      <div class="runJobOnBox">
+        <input type="radio"
+               id="runJobOnTargetRadio"
+               ng-model="UIModel.runOn"
+               value="target"
+               ng-required="true"
+               ng-disabled="UIModel.target.location !== 'HDFS'"/>
+        Run job here
+      </div>
+
+      <div class="locationBox" ng-if="UIModel.formType === 'HDFS'">
+        <label class="db">Location:
+
+          <input type="radio"
+                 ng-change="checkFromTarget()"
+                 id="targetHDFSRadio"
+                 ng-model="UIModel.target.location"
+                 value="HDFS"
+                 ng-required="!UIModel.target.location"/> HDFS
+          <span ng-if="UIModel.source.location === 'HDFS'">
+            <input type="radio"
+                   ng-change="checkFromTarget()"
+                   id="targetAzureRadio"
+                   ng-model="UIModel.target.location"
+                   value="azure"
+                   ng-required="!UIModel.target.location"/> Azure
+          </span>
+          <span ng-if="UIModel.source.location === 'HDFS'">
+            <input type="radio"
+                   ng-change="checkFromTarget()"
+                   id="targetS3Radio"
+                   ng-model="UIModel.target.location"
+                   value="S3"
+                   ng-required="!UIModel.target.location"/> S3
+          </span>
+        </label>
+      </div>
+
+      <div>
+        <select ng-if="UIModel.target.location === 'HDFS' || UIModel.formType === 'HIVE'"
+                ng-model="UIModel.target.cluster"
+                ng-change="getTargetDefinition()"
+                name="targetClusterSelect"
+                ng-required="UIModel.target.location === 'HDFS' || UIModel.formType === 'HIVE'"
+                class="col-xs-24 form-control"
+                id="targetClusterSelect">
+          <option value="" disabled selected style='display:none;'>-Select cluster-</option>
+          <option ng-selected="UIModel.target.cluster === clusterItem.name"
+                  ng-repeat="clusterItem in clustersList"
+                  value="{{clusterItem.name}}">
+            {{clusterItem.name}}
+          </option>
+        </select>
+      </div>
+
+      <div ng-if="UIModel.target.location === 'azure' && UIModel.formType === 'HDFS'">
+        <label class="db">Base URL
+          <input type="text"
+                 name="targetClusterUrlInput"
+                 class="form-control"
+                 ng-model="UIModel.target.url"
+                 placeholder="URL"
+                 ng-pattern="validations.patterns.azure"
+                 ng-required="UIModel.target.location === 'azure'"
+                 validation-message="{{validations.messages.azure}}"/>
+        </label>
+      </div>
+      <div ng-if="UIModel.target.location === 'S3' && UIModel.formType === 'HDFS'">
+        <label class="db">Base URL
+          <input type="text"
+                 name="targetClusterUrlInput"
+                 class="form-control"
+                 ng-model="UIModel.target.url"
+                 placeholder="URL"
+                 ng-pattern="validations.patterns.s3"
+                 ng-required="UIModel.target.location === 'S3'"
+                 validation-message="{{validations.messages.s3}}"/>
+        </label>
+      </div>
+
+      <div ng-if="UIModel.formType === 'HDFS'">
+        <label class="db">Path
+          <input type="text"
+                 name="targetClusterPathInput"
+                 class="form-control"
+                 ng-model="UIModel.target.path"
+                 placeholder="Path"
+                 ng-pattern="validations.patterns.osPath"
+                 ng-required="UIModel.target.location === 'HDFS'"
+                 validation-message="{{validations.messages.path}}"/>
+        </label>
+      </div>
+
+    </div>
+  </div>
+
+  <div class="row">
+    <div class="col-xs-24 validityBox">
+      <h4>Validity </h4>
+      <div class="startDateBox">
+        <label>Start
+          <input type="text"
+                 name="startDateInput"
+                 class="form-control dateInput"
+                 placeholder="mm/dd/yyyy"
+                 datepicker-popup="{{dateFormat}}"
+                 ng-model="UIModel.validity.start"
+                 is-open="$parent.startOpened"
+                 ng-click="openStartDatePicker($event)"
+                 ng-change="constructDate()"
+                 ng-required="true"
+                 simple-date>
+        </label>
+      </div>
+      <div class="startTimeBox">
+        <label>Time
+          <timepicker ng-change="constructDate()"
+                      ng-model="UIModel.validity.startTime"
+                      hour-step="1"
+                      minute-step="1"
+                      show-meridian="true">
+          </timepicker>
+        </label>
+      </div>
+      <div class="endDateBox">
+        <label>End
+          <input type="text"
+                 name="startDateInput"
+                 class="form-control dateInput"
+                 placeholder="mm/dd/yyyy"
+                 datepicker-popup="{{dateFormat}}"
+                 ng-model="UIModel.validity.end"
+                 is-open="$parent.endOpened"
+                 ng-click="openEndDatePicker($event)"
+                 ng-change="constructDate()"
+                 min-date="UIModel.validity.start"
+                 ng-required="true"
+                 simple-date>
+        </label>
+      </div>
+      <div class="endTimeBox">
+        <label>Time
+          <timepicker ng-change="constructDate()"
+                      ng-model="UIModel.validity.endTime"
+                      hour-step="1"
+                      minute-step="1"
+                      show-meridian="true">
+          </timepicker>
+        </label>
+      </div>
+      <div class="tzBox">
+        <label> &nbsp;
+          <time-zone-select
+                  ng-model="UIModel.validity.tz"
+                  class="">
+          </time-zone-select>
+          </label>
+      </div>
+    </div>
+  </div>
+
+  <div class="row">
+    <div class="col-xs-24 alertsBox">
+      <div class="emailBox">
+        <label>
+          <h4>Send alerts to </h4>
+          <input class="form-control"
+                 name="emailAlertInput"
+                 ng-model="UIModel.alerts.alert.email"
+                 type="text"
+                 placeholder="Email"
+                 ng-pattern="validations.patterns.email"
+                 validation-optional-message="{{validations.messages.email}}">
+        </label>
+      </div>
+      <div class="addAlertBox">
+        <button class="btn btn-default btn-xs"
+                ng-disabled="!UIModel.alerts.alert.email"
+                type="button"
+                ng-click="addAlert()">
+          <span class="glyphicon glyphicon-plus"></span>add alert
+        </button>
+      </div>
+
+      <div class="emailArrayRow" ng-repeat="email in UIModel.alerts.alertsArray">
+        <span>{{email}}</span>
+        <button class="btn btn-default btn-xs"
+                type="button"
+                ng-click="removeAlert()">
+          <span class="glyphicon glyphicon-minus"></span> delete
+        </button>
+      </div>
+
+    </div>
+  </div>
+
+  <div class="row advancedOptionsButton" ng-click="expandOptions = !expandOptions">
+    <h4>Advanced options
+      <span class="entypo chevron-down" ng-if="!expandOptions"></span>
+      <span class="entypo chevron-up" ng-if="expandOptions"></span>
+      <hr />
+    </h4>
+  </div>
+
+  <div id="advancedOptionsBox" ng-class="{expanded:expandOptions}">
+    <div class="frequencyBox">
+      <h4>Frequency</h4>
+      <label>Every</label>
+      <input type="text"
+             name="frequencyEveryInput"
+             ng-model="UIModel.frequency.number"
+             ng-pattern="validations.patterns.twoDigits"
+             ng-keydown="validations.acceptOnlyNumber($event)"
+             class="form-control"
+             validation-optional-message="{{validations.messages.number}}" />
+
+      <select ng-model="UIModel.frequency.unit" class="form-control">
+        <option selected value="minutes">minutes</option>
+        <option value="hours">hours</option>
+        <option value="days">days</option>
+        <option value="months">months</option>
+      </select>
+    </div>
+
+    <div class="allocationBox">
+      <h4>Allocation</h4>
+
+      <div ng-if="UIModel.formType === 'HDFS'">
+        <div>
+          <label>Max Maps for Distcp
+            <input type="text"
+                   name="maxMapsInput"
+                   ng-model="UIModel.allocation.hdfs.maxMaps"
+                   ng-pattern="validations.patterns.number"
+                   ng-keydown="validations.acceptOnlyNumber($event)"
+                   class="form-control"
+                   validation-optional-message="{{validations.messages.allocationNumber}}"/>
+          </label>
+        </div>
+        <div>
+          <label>Max bandwidth (MB)
+            <input type="text"
+                   name="maxBandwidthInput"
+                   ng-model="UIModel.allocation.hdfs.maxBandwidth"
+                   ng-pattern="validations.patterns.number"
+                   ng-keydown="validations.acceptOnlyNumber($event)"
+                   class="form-control"
+                   validation-optional-message="{{validations.messages.allocationNumber}}" />
+          </label>
+        </div>
+      </div>
+
+      <div ng-if="UIModel.formType === 'HIVE'">
+        <div>
+          <label>Max Maps for Distcp
+            <input type="text"
+                   name="hiveMaxMapsInput"
+                   ng-model="UIModel.allocation.hive.maxMapsDistcp"
+                   ng-pattern="validations.patterns.number"
+                   ng-keydown="validations.acceptOnlyNumber($event)"
+                   class="form-control"
+                   validation-optional-message="{{validations.messages.allocationNumber}}"/>
+          </label>
+        </div>
+        <div>
+          <label>Max Maps for Mirror
+            <input type="text"
+                   name="maxBandwidthInput"
+                   ng-model="UIModel.allocation.hive.maxMapsMirror"
+                   ng-pattern="validations.patterns.number"
+                   ng-keydown="validations.acceptOnlyNumber($event)"
+                   class="form-control"
+                   validation-optional-message="{{validations.messages.allocationNumber}}" />
+          </label>
+        </div>
+        <div>
+          <label>Max Events
+            <input type="text"
+                   name="maxMapsEventsInput"
+                   ng-model="UIModel.allocation.hive.maxMapsEvents"
+                   ng-pattern="validations.patterns.number"
+                   ng-keydown="validations.acceptOnlyNumber($event)"
+                   class="form-control"
+                   validation-optional-message="{{validations.messages.allocationNumber}}" />
+          </label>
+        </div>
+        <div>
+          <label>Max bandwidth (MB)
+            <input type="text"
+                   name="maxBandwidthInput"
+                   ng-model="UIModel.allocation.hive.maxBandwidth"
+                   ng-pattern="validations.patterns.number"
+                   ng-keydown="validations.acceptOnlyNumber($event)"
+                   class="form-control"
+                   validation-optional-message="{{validations.messages.allocationNumber}}" />
+          </label>
+        </div>
+      </div>
+
+    </div>
+
+    <div class="hiveOptBox" ng-if="UIModel.formType === 'HIVE'">
+      <h4>Source</h4>
+
+      <label>Staging path
+        <input type="text"
+               name="sourceStagingPathInput"
+               ng-model="UIModel.hiveOptions.source.stagingPath"
+               ng-pattern="validations.patterns.path"
+               class="form-control"
+               validation-optional-message="{{validations.messages.path}}" />
+      </label>
+      <label>HiveServer2 endpoint
+        <input type="text"
+               name="sourceHiveServerInput"
+               ng-model="UIModel.hiveOptions.source.hiveServerToEndpoint"
+               ng-pattern="validations.patterns.path"
+               class="form-control"
+               validation-optional-message="{{validations.messages.path}}" />
+      </label>
+
+      <h4>Target</h4>
+      <label>Staging path
+        <input type="text"
+               name="targetStagingPathInput"
+               ng-model="UIModel.hiveOptions.target.stagingPath"
+               ng-pattern="validations.patterns.path"
+               class="form-control"
+               validation-optional-message="{{validations.messages.path}}" />
+      </label>
+      <label>HiveServer2 endpoint
+        <input type="text"
+               name="targetHiveServerInput"
+               ng-model="UIModel.hiveOptions.target.hiveServerToEndpoint"
+               ng-pattern="validations.patterns.path"
+               class="form-control"
+               validation-optional-message="{{validations.messages.path}}" />
+      </label>
+    </div>
+
+    <div class="retryBox">
+      <h4>Retry</h4>
+
+      <div class="policyBox">
+        <label>Policy</label>
+        <select ng-model="UIModel.retry.policy"
+                class="form-control">
+          <option selected value="periodic">PERIODIC</option>
+          <option value="exp-backoff">EXPONENTIAL_BACKOFF</option>
+          <option value="final">FINAL</option>
+        </select>
+      </div>
+
+      <div>
+        <label>Delay</label>
+        <input type="text"
+               name="frequencyEveryInput"
+               ng-model="UIModel.retry.delay.number"
+               ng-pattern="validations.patterns.twoDigits"
+               ng-keydown="validations.acceptOnlyNumber($event)"
+               class="form-control"
+               validation-optional-message="{{validations.messages.number}}" />
+
+        <select ng-model="UIModel.retry.delay.unit"
+                class="form-control">
+          <option selected value="minutes">minutes</option>
+          <option value="hours">hours</option>
+          <option value="days">days</option>
+          <option value="months">months</option>
+        </select>
+      </div>
+
+      <div>
+        <label>Attempts</label>
+        <input type="text"
+               name="frequencyEveryInput"
+               ng-model="UIModel.retry.attempts"
+               ng-pattern="validations.patterns.twoDigits"
+               ng-keydown="validations.acceptOnlyNumber($event)"
+               class="form-control"
+               validation-optional-message="{{validations.messages.number}}" />
+      </div>
+    </div>
+
+    <div class="aclBox col-xs-24">
+      <h4>Access Control List</h4>
+      <div class="col-xs-8">
+        <label>Owner
+          <input type="text"
+                 name="aclOwnerInput"
+                 ng-model="UIModel.acl.owner"
+                 ng-pattern="validations.patterns.unixId"
+                 class="form-control"
+                 ng-required="true"
+                 validation-message="{{validations.messages.acl.owner}}"/>
+        </label>
+      </div>
+      <div class="col-xs-8">
+        <label>Group
+          <input type="text"
+                 name="aclGroupInput"
+                 ng-model="UIModel.acl.group"
+                 ng-pattern="validations.patterns.unixId"
+                 class="form-control"
+                 ng-required="true"
+                 validation-message="{{validations.messages.acl.group}}" />
+        </label>
+      </div>
+      <div class="col-xs-8">
+        <label>Permissions
+          <input type="text"
+                 name="aclPermissionsInput"
+                 ng-model="UIModel.acl.permissions"
+                 ng-pattern="validations.patterns.unixPermissions"
+                 class="form-control"
+                 ng-required="true"
+                 validation-message="{{validations.messages.acl.permission}}" />
+        </label>
+      </div>
+    </div>
+
+
+
+
+
+  </div>
+
+
+  <div class="row">
+    <div class="col-xs-24 mt20">
+
+      <button class="btn nextBtn pull-right"
+              ng-disabled="buttonSpinners.show"
+              ng-click="goNext(datasetForm.$invalid, 'forms.dataset.summary')" >
+        Next <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
+      </button>
+      <a class="pull-right" ui-sref="main">
+        Cancel
+      </a>
+
+    </div>
+  </div>
+
+
+
+
+
+
+</form>

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/dataset/datasetFormSummaryStepTpl.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/dataset/datasetFormSummaryStepTpl.html b/falcon-ui/app/html/dataset/datasetFormSummaryStepTpl.html
new file mode 100644
index 0000000..6d73af5
--- /dev/null
+++ b/falcon-ui/app/html/dataset/datasetFormSummaryStepTpl.html
@@ -0,0 +1,146 @@
+<!--
+/**
+ * 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 id="formSummaryBox" class="col-xs-24">
+  <div>
+    <h4 class="lightSubtitle">Name</h4>
+    {{UIModel.name}}
+  </div>
+  <div>
+    <h4 class="lightSubtitle">Type</h4>
+    {{UIModel.formType}}
+  </div>
+  <div>
+    <h4 class="lightSubtitle">Tags</h4>
+    <div ng-repeat="tag in UIModel.tags.tagsArray"><span>{{tag.key}}</span> - {{tag.value}}</div>
+  </div>
+
+  <div>
+    <h4 class="lightSubtitle">Source</h4>
+  </div>
+  <div class="box">
+    <h3 ng-if="UIModel.formType === 'HIVE' || UIModel.source.location === 'HDFS'">{{UIModel.source.cluster}}</h3>
+
+    <h4 ng-if="UIModel.formType === 'HDFS'">Location</h4>
+    <div ng-if="UIModel.formType === 'HDFS'">{{UIModel.source.location}}</div>
+    <div ng-if="UIModel.formType === 'HDFS'"><span>Path:</span> {{UIModel.source.path}}</div>
+    <div ng-if="UIModel.formType === 'HDFS' && UIModel.source.location !== 'HDFS'"><span>URL:</span>{{UIModel.source.url}}</div>
+
+
+
+
+
+    <div ng-if="UIModel.formType === 'HIVE'">I want to copy <span>{{UIModel.source.hiveDatabaseType}}</span></div>
+    <div ng-if="UIModel.formType === 'HIVE' && UIModel.source.hiveDatabaseType === 'databases'"><span>Databases:</span> {{UIModel.source.hiveDatabases}}</div>
+    <div ng-if="UIModel.formType === 'HIVE' && UIModel.source.hiveDatabaseType === 'tables'"><span>From Database </span>{{UIModel.source.hiveDatabase}}</div>
+    <div ng-if="UIModel.formType === 'HIVE' && UIModel.source.hiveDatabaseType === 'tables'"><span>Tables:</span> {{UIModel.source.hiveTables}}</div>
+
+
+
+
+  </div>
+  <div>
+    <h4 class="lightSubtitle">Target</h4>
+  </div>
+  <div class="box">
+    <h3 ng-if="(UIModel.formType === 'HDFS' && UIModel.target.location === 'HDFS') || UIModel.formType === 'HIVE'">{{UIModel.target.cluster}}</h3>
+
+    <h4 ng-if="UIModel.formType === 'HDFS'">Location</h4>
+    <div ng-if="UIModel.formType === 'HDFS'">{{UIModel.target.location}}</div>
+    <div ng-if="UIModel.formType === 'HDFS'"><span>Path:</span> {{UIModel.target.path}}</div>
+    <div ng-if="UIModel.formType === 'HDFS' && UIModel.target.location !== 'HDFS'"><span>URL:</span> {{UIModel.target.url}}</div>
+
+  </div>
+
+  <div>
+    <h4 class="lightSubtitle">Run On</h4>
+    <div ng-if="UIModel.runOn === 'source'">{{UIModel.source.cluster}}</div>
+    <div ng-if="UIModel.runOn === 'target'">{{UIModel.target.cluster}}</div>
+  </div>
+
+  <hr />
+
+  <div>
+    <h4 class="lightSubtitle">Schedule</h4>
+    <span>Start on: </span>{{UIModel.validity.startISO}} <br />
+    <span>End on: </span>{{UIModel.validity.endISO}}
+  </div>
+
+  <div ng-if="UIModel.formType === 'HDFS'">
+    <h4 class="lightSubtitle">Max Maps</h4>
+    {{UIModel.allocation.hdfs.maxMaps}}
+
+    <h4 class="lightSubtitle">Max Bandwidth</h4>
+    {{UIModel.allocation.hdfs.maxBandwidth}}
+  </div>
+  <div ng-if="UIModel.formType === 'HIVE'">
+
+    <h4 class="lightSubtitle">Max Maps for Distcp</h4>
+    {{UIModel.allocation.hive.maxMapsDistcp}}
+
+    <h4 class="lightSubtitle">Max Bandwidth</h4>
+    {{UIModel.allocation.hive.maxBandwidth}}
+
+    <h4 class="lightSubtitle">Max Events</h4>
+    {{UIModel.allocation.hive.maxMapsEvents}}
+
+    <h4 class="lightSubtitle">Max Maps for mirror</h4>
+    {{UIModel.allocation.hive.maxMapsMirror}}
+  </div>
+
+  <div>
+    <h4 ng-if="UIModel.alerts.alertsArray.length > 0" class="lightSubtitle">Alerts</h4>
+    {{ UIModel.alerts.alertsArray.join() }}
+  </div>
+
+  <hr />
+  <h4 class="lightSubtitle">ACL</h4>
+  <div><span>Owner:</span> {{UIModel.acl.owner}}</div>
+  <div><span>Group:</span> {{UIModel.acl.group}}</div>
+  <div><span>Permissions:</span> {{UIModel.acl.permissions}}</div>
+
+  <h4 class="lightSubtitle">Retry</h4>
+  <div><span>Policy: </span> {{UIModel.retry.policy}}</div>
+  <div><span>delay: </span> {{UIModel.retry.delay.number}} {{UIModel.retry.delay.unit}}</div>
+  <div><span>Attempts: </span> {{UIModel.retry.attempts}}</div>
+
+  <h4 class="lightSubtitle">Frequency</h4>
+  <div>{{UIModel.frequency.number}} {{UIModel.frequency.unit}}</div>
+
+  <hr />
+
+  <div class="row">
+    <div class="col-xs-24 mt20">
+      <button type="button" class="btn prevBtn"
+              ng-click="goBack('forms.dataset.general')"
+              ng-disabled="buttonSpinners.backShow">
+        Previous <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
+      </button>
+      <button class="btn nextBtn pull-right"
+              ng-disabled="buttonSpinners.show"
+              ng-click="save()">
+        Save <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
+      </button>
+      <a class="pull-right" ui-sref="main">
+        Cancel
+      </a>
+    </div>
+  </div>
+
+</div>

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/dataset/datasetFormTpl.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/dataset/datasetFormTpl.html b/falcon-ui/app/html/dataset/datasetFormTpl.html
new file mode 100644
index 0000000..d471d40
--- /dev/null
+++ b/falcon-ui/app/html/dataset/datasetFormTpl.html
@@ -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.
+ */
+-->
+<div id="formBox">
+  <div class="formTitol">
+    <a>Falcon Mirrors</a>
+    <h1>New Mirror</h1>
+  </div>
+
+  <div class="col-sm-24">
+    <div class="formBoxWrapper">
+
+      <div class="progressBox col-xs-24" ng-class="{ general:isActive('forms.dataset.general'),
+                                                 summary:isActive('forms.dataset.summary')}">
+        <div class="progressBar">
+          <div class="bar1"></div>
+          <span>
+            <div class="fir">
+              <b>1</b>
+              <span class="glyphicon glyphicon-ok"></span>
+              <h6>General</h6>
+            </div>
+          </span>
+          <span>
+            <div class="sec">
+              <b>2</b>
+              <span class="glyphicon glyphicon-ok"></span>
+              <h6>Summary</h6>
+            </div>
+          </span>
+        </div>
+      </div>
+
+      <div class="row" ui-view></div>
+    </div>
+  </div>
+
+  <div class="col-sm-24">
+
+  </div>
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/directives/autocomplete-template.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/directives/autocomplete-template.html b/falcon-ui/app/html/directives/autocomplete-template.html
new file mode 100644
index 0000000..4f49d84
--- /dev/null
+++ b/falcon-ui/app/html/directives/autocomplete-template.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 class="tags-wrapper">
+  <div id="tagsList" class="tags-cloud">
+    <div ng-repeat="selectedTag in selectedTags" class="tag">
+      <span class="tagName">{{selectedTag}}</span>
+      <span>&nbsp;<b ng-click="removeTag($index)" class="fa fa-times cross"></b></span>
+    </div>
+    <input type="text" placeholder="Start typing a programming language name" id="searchInput" ng-keydown="checkKeyDown($event)" class="form-control" ng-model="searchText" ng-change="search()"/>
+  </div>
+  <ul id="suggestions" class="suggestions-list">
+    <li ng-repeat="suggestion in suggestions" class="blockSpan" ng-click="addToSelectedTags($index)" ng-mouseover="$parent.selectedIndex=$index" ng-class="{active : selectedIndex===$index}">{{suggestion}}</li>
+  </ul>
+</div>

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/directives/dependenciesGraphDv.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/directives/dependenciesGraphDv.html b/falcon-ui/app/html/directives/dependenciesGraphDv.html
new file mode 100644
index 0000000..7fbba06
--- /dev/null
+++ b/falcon-ui/app/html/directives/dependenciesGraphDv.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.
+ */
+-->
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/directives/entitiesListDv.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/directives/entitiesListDv.html b/falcon-ui/app/html/directives/entitiesListDv.html
index 6ac950f..7016de1 100644
--- a/falcon-ui/app/html/directives/entitiesListDv.html
+++ b/falcon-ui/app/html/directives/entitiesListDv.html
@@ -17,82 +17,91 @@
  * limitations under the License.
  */
 -->
-<table class="listTable table">
+<table class="listTable table" id="entitiesList">
   <thead>
-    
+
     <tr>
       <th colspan="3">
-        <div class="filtersBox">Name <input type="text" class="form-control" ng-model="simpleFilter.name"/></div> 
-       
-        <div class="filtersBox">Tags <input type="text" class="form-control" ng-model="simpleFilter.tags"/></div> 
-      
-        <div ng-if="type !== 'cluster'" class="filtersSelectBox">Status 
-          
+        <div class="filtersBox" ng-class="{clusterFilters: type === 'cluster'}">Name <input type="text" class="form-control" ng-model="simpleFilter.name"/></div>
+
+        <div class="filtersBox" ng-class="{clusterFilters: type === 'cluster'}">Tags <input type="text" class="form-control" ng-model="simpleFilter.tags"/></div>
+
+        <div ng-if="type !== 'cluster'" class="filtersSelectBox">Status
+
           <select class="form-control" ng-model="simpleFilter.status">
             <option value="" selected="true">ALL</option>
             <option>SUBMITTED</option>
             <option>RUNNING</option>
             <option>SUSPENDED</option>
-            <option>UNKNOWN</option>           
+            <option>UNKNOWN</option>
           </select>
-     
+
         </div>
-      
+
       </th>
     </tr>
   </thead>
   <tbody>
-    
+
     <tr ng-if="input.length > 0" class="buttonsRow">
       <td class="buttonCell" colspan="4">
         <div class="btn btn-default btn-xs buttons-to-show" ng-click="scopeSchedule()" ng-hide="selectedDisabledButtons.schedule" ng-if="type !== 'cluster'">
-            <span class="entypo play"></span> Schedule
+            <span class="entypo play"></span> <div>Schedule</div>
         </div>
         <div class="btn btn-default btn-xs buttons-to-show" ng-click="scopeResume()" ng-hide="selectedDisabledButtons.resume" ng-if="type !== 'cluster'">
-            <span class="entypo play"></span> Resume
+            <span class="entypo play"></span> <div>Resume</div>
         </div>
         <div class="btn btn-default btn-xs buttons-to-show" ng-click="scopeSuspend()" ng-hide="selectedDisabledButtons.suspend" ng-if="type !== 'cluster'">
-            <span class="entypo paus"></span> Suspend
+            <span class="entypo paus"></span> <div>Suspend</div>
         </div>
         <div class="btn btn-default btn-xs buttons-to-show" ng-click="scopeEdit()" ng-hide="selectedRows.length === 0 || selectedRows.length > 1" ng-if="type !== 'cluster'">
-            <span class="entypo cog"></span> Edit
+            <span class="entypo cog"></span> <div>Edit</div>
         </div>
         <div class="btn btn-default btn-xs buttons-to-show" ng-click="scopeClone()" ng-hide="selectedRows.length === 0 || selectedRows.length > 1">
-            <span class="entypo docs"></span> Copy
+            <span class="entypo docs"></span> <div>Copy</div>
         </div>
         <div class="btn btn-default btn-xs buttons-to-show" ng-click="scopeRemove()" ng-hide="selectedRows.length === 0">
-            <span class="entypo trash"></span> Delete
+            <span class="entypo trash"></span> <div>Delete</div>
         </div>
         <div class="btn btn-default btn-xs buttons-to-show" ng-click="download()" ng-hide="selectedRows.length === 0 || selectedRows.length > 1">
-            <span class="entypo down"></span> Download XML
+            <span class="entypo down"></span> <div>XML</div>
         </div>
       </td>
-    </tr> 
+    </tr>
     <tr ng-if="input.length === 0 && !server.responses.listLoaded[type]">
       <td> loading {{ type }}s </td>
     </tr>
     <tr ng-if="input.length === 0 && server.responses.listLoaded[type]">
       <td> There are no {{ type }}s </td>
     </tr>
-    <tr ng-if="input.length !== 0" ng-repeat="item in input | filter:{'name':simpleFilter.name} | filter:{'status':simpleFilter.status} | tagFilter | filter:{'list':simpleFilter.tags}" class="entityRow">
+    <tr ng-if="input.length !== 0"
+          ng-repeat="item in input | filter:{'name':simpleFilter.name} | filter:{'status':simpleFilter.status} |
+                       tagFilter | filter:{'list':simpleFilter.tags}"
+          class="entityRow"
+          ng-class="{
+            firstEntityRow:$first, lastEntityRow:$last,
+            rowSelected:checkedRow(item.name)
+          }">
       <td class="checkboxCell">
-          <input type="checkbox" checklist-model="selectedRows" checklist-value="{name:item.name, type:item.type, status:item.status}" ng-change="checkButtonsToShow()"/>
+          <input type="checkbox" checklist-model="selectedRows" ng-model="$index"
+                 checklist-value="{name:item.name, type:item.type, status:item.status}"
+                 ng-change="checkButtonsToShow()"/>
       </td>
-      <td class="nameCell" ng-click="goEntityDetails(item.name, type)">
+      <td class="nameCell" ng-click="goEntityDefinition(item.name, type)">
           {{ item.name }}
       </td>
       <td class="stateCell">
           <span ng-if="type !== 'cluster'" ng-class="{'text-success': item.status === 'RUNNING', 'text-warning': item.status === 'SUSPENDED', 'text-danger': item.status === 'UNKNOWN'}">{{ item.status }}</span>
       </td>
-      
+
     </tr>
     <tr>
       <td ng-if="server.responses.multiRequest[type] > 0 || server.responses.listLoaded[type] === false">
-        <div class="spinner" ng-class="{active: server.responses.multiRequest[type] > 0 || server.responses.listLoaded[type] === false}"> 
+        <div class="spinner" ng-class="{active: server.responses.multiRequest[type] > 0 || server.responses.listLoaded[type] === false}">
           <img src="css/img/ajax-loader.gif" />
         </div>
       </td>
     </tr>
   </tbody>
-  
+
 </table>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/directives/entitiesSearchListDv.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/directives/entitiesSearchListDv.html b/falcon-ui/app/html/directives/entitiesSearchListDv.html
new file mode 100644
index 0000000..3e356fc
--- /dev/null
+++ b/falcon-ui/app/html/directives/entitiesSearchListDv.html
@@ -0,0 +1,128 @@
+<!--
+/**
+ * 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.
+ */
+-->
+
+
+<table class="listTable table" id="entitiesSearchList">
+  <thead>
+    <tr>
+      <th><div class="filtersSearchBox"><input type="checkbox" ng-model="selectedAll" ng-click="checkAll()"/></div></th>
+      <th><div class="filtersSearchBox pointer" ng-click="toggleSortOrder()">Name <span class="glyphicon glyphicon-sort"></span></div> </th>
+      <th><div class="filtersSearchBox">Tags</div></th>
+      <th><div class="filtersSearchBox">Cluster</div></th>
+      <th><div class="filtersSearchBox">Type</div></th>
+      <th><div class="filtersSearchBox">Status</div></th>
+    </tr>
+  </thead>
+
+  <tbody>
+    <tr ng-if="input.length > 0" class="buttonsRow">
+      <td class="buttonCell" colspan="9">
+        <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeSchedule()" ng-disabled="selectedDisabledButtons.schedule">
+          <span class="entypo play"></span> <div>Schedule</div>
+        </div>
+        <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeResume()" ng-disabled="selectedDisabledButtons.resume">
+          <span class="entypo play"></span> <div>Resume</div>
+        </div>
+        <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeSuspend()" ng-disabled="selectedDisabledButtons.suspend">
+          <span class="entypo paus"></span> <div>Suspend</div>
+        </div>
+        <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeEdit()" ng-disabled="selectedRows.length === 0 || selectedRows.length > 1">
+          <span class="entypo cog"></span> <div>Edit</div>
+        </div>
+        <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeClone()" ng-disabled="selectedRows.length === 0 || selectedRows.length > 1">
+          <span class="entypo docs"></span> <div>Copy</div>
+        </div>
+        <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeRemove()" ng-disabled="selectedRows.length === 0">
+          <span class="entypo trash"></span> <div>Delete</div>
+        </div>
+        <div class="btn btn-gray btn-xs buttons-to-show" ng-click="download()" ng-disabled="selectedRows.length === 0 || selectedRows.length > 1">
+          <span class="entypo down"></span> <div>XML</div>
+        </div>
+      </td>
+    </tr>
+
+    <tr ng-if="input.length === 0 && !server.responses.listLoaded">
+      <td> loading... </td>
+    </tr>
+    <tr ng-if="input.length === 0 && server.responses.listLoaded">
+      <td> There are no results </td>
+    </tr>
+
+    <tr ng-if="input.length !== 0"
+        ng-repeat="item in input | filter:{'name':simpleFilter.name} | filter:{'status':simpleFilter.status} |
+                          filter:{'list':simpleFilter.tags}"
+        class="entityRow"
+        ng-class="{
+              firstEntityRow:$first, lastEntityRow:$last,
+              rowSelected:checkedRow(item.name)
+            }">
+      <td class="checkboxCell">
+        <input type="checkbox" checklist-model="selectedRows" ng-model="$index"
+               checklist-value="{name:item.name, type:item.type, status:item.status}"
+               ng-change="checkButtonsToShow()"/>
+      </td>
+      <td class="nameCell" ng-init="entityType = item.type | uppercase">
+        <button type="button" class="btn btn-default" ng-click="goEntityDetails(item.name, item.type)">
+          <span ng-class="displayIcon((item.type | uppercase), item.tags.tag)"></span> {{ item.name }}
+        </button>
+      </td>
+      <td>
+        <span ng-repeat="tag in item.tags.tag" ng-click="addTag(tag)" class="tag">
+          {{ tag }}{{$last ? '' : ', '}}
+        </span>
+      </td>
+      <td>
+        <span ng-repeat="cluster in item.clusters.cluster">
+          {{ cluster }}{{$last ? '' : ', '}}
+        </span>
+      </td>
+      <td>
+        <span ng-repeat="tag in item.tags.tag" ng-init="type = displayType(tag)">
+          {{ type | uppercase}}
+        </span>
+      </td>
+      <td class="stateCell">
+        <span ng-class="{'blink-success': item.status == 'RUNNING',
+                         'text-success': item.status == 'SUCCEEDED',
+                         'blink-warning': item.status == 'SUSPENDED',
+                         'blink-danger': item.status == 'UNKNOWN'}">{{ item.status }}</span>
+      </td>
+    </tr>
+
+    <tr>
+      <td ng-if="server.responses.multiRequest[type] > 0 || server.responses.count.pending > 0">
+        <div class="spinner" ng-class="{active: server.responses.multiRequest[type] > 0 || server.responses.count.pending > 0}">
+          <img src="css/img/ajax-loader_2.gif" />
+        </div>
+      </td>
+    </tr>
+
+    <tr>
+      <td colspan="9">
+        <nav class="pull-right">
+          <ul class="pagination">
+            <li ng-repeat="page in pages"><a href="javascript:void(0);" ng-click="page.enabled ? scopeGoPage(page.index) : void(0)" ng-class="page.enabled ? '' : 'pagDisabled'">{{ page.label }}</a></li>
+          </ul>
+        </nav>
+      </td>
+    </tr>
+  </tbody>
+
+</table>

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/directives/entitySummaryDv.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/directives/entitySummaryDv.html b/falcon-ui/app/html/directives/entitySummaryDv.html
index c64074b..6cd10f5 100644
--- a/falcon-ui/app/html/directives/entitySummaryDv.html
+++ b/falcon-ui/app/html/directives/entitySummaryDv.html
@@ -17,26 +17,31 @@
  * limitations under the License.
  */
 -->
-<div class="row entitySummary">
+<div class="row entitySummary" id="entitySummary">
 
-  <div class="col-xs-6">     
-    <h3>{{statusCount.TOTAL_AMOUNT}}</h3>   
-    <h5>Submitted</h5>      
+  <div class="whiteBox col-xs-6">
+    <div>
+      <h3>{{statusCount.TOTAL_AMOUNT}}</h3>
+      <h5 class="notBold">Total</h5>
+    </div>
   </div>
-  
-  <div class="col-xs-6 text-success" ng-if="type !== 'cluster'">     
-    <h3>{{statusCount.RUNNING}}</h3>   
-    <h5>Running</h5>      
-  </div>
-  
-  <div class="col-xs-6 text-warning" ng-if="type !== 'cluster'">     
-    <h3>{{statusCount.SUSPENDED}}</h3>   
-    <h5>Suspended</h5>      
+
+
+  <div class="whiteBox col-xs-16 pull-right" ng-if="type !== 'cluster'">
+    <div class="col-xs-8 text-success">
+      <h3>{{statusCount.RUNNING}}</h3>
+      <h5>RUNNING</h5>
+    </div>
+
+    <div class="col-xs-8 text-warning">
+      <h3>{{statusCount.SUSPENDED}}</h3>
+      <h5>SUSPENDED</h5>
+    </div>
+
+    <div class="col-xs-8 text-danger">
+      <h3>{{statusCount.UNKNOWN}}</h3>
+      <h5>UNKNOWN</h5>
+    </div>
   </div>
-  
-  <div class="col-xs-6 text-danger" ng-if="type !== 'cluster'">     
-    <h3>{{statusCount.UNKNOWN}}</h3>   
-    <h5>Unknown</h5>      
-  </div> 
-    
+
 </div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/directives/instancesListDv.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/directives/instancesListDv.html b/falcon-ui/app/html/directives/instancesListDv.html
new file mode 100644
index 0000000..5abc9d3
--- /dev/null
+++ b/falcon-ui/app/html/directives/instancesListDv.html
@@ -0,0 +1,148 @@
+<!--
+/**
+ * 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.
+ */
+-->
+<table class="listTable table" id="instancesList">
+  <thead>
+  <tr>
+    <th><div class="filtersSearchBox vertical-align"><input type="checkbox" ng-model="selectedAll" ng-click="checkAll()"/></div></th>
+    <th><div class="filtersSearchBox vertical-align">Instance</div></th>
+    <th><div class="filtersSearchBox">Started&nbsp;<span class="glyphicon glyphicon-sort pointer" ng-click="filterInstances('startTime')"></span>
+      <input type="text" class="form-control dateInput" ng-model="startFilter" ng-keypress="validateDate($event, 'start');"
+             ng-enter="filterInstances('startTime')" placeholder="mm/dd/yyyy hh:mm">
+      <label class="error" ng-if="startFilterError">Incorrect Date Format</label>
+      <label class="error" ng-if="startAfterEndError">Start date should be before end date</label>
+      <label class="error" ng-if="startAfterNominalError">Start date should be after nominal start date {{ start }}</label>
+      <label class="error" ng-if="startBeforeNominalError">Start date should be before nominal end date {{ end }}</label>
+    </div></th>
+    <th><div class="filtersSearchBox">Ended&nbsp;<span class="glyphicon glyphicon-sort pointer" ng-click="filterInstances('endTime')"></span>
+      <input type="text" class="form-control dateInput" ng-model="endFilter" ng-keypress="validateDate($event, 'end');"
+             ng-enter="filterInstances('endTime')" placeholder="mm/dd/yyyy hh:mm">
+      <label class="error" ng-if="endFilterError">Incorrect Date Format</label>
+      <label class="error" ng-if="endAfterNominalError">End date should be after nominal start date {{ start }}</label>
+      <label class="error" ng-if="endBeforeNominalError">End date should be before nominal end date {{ end }}</label>
+    </div></th>
+    <th>
+      <div class="filtersSearchBox">Status&nbsp;<span class="glyphicon glyphicon-sort pointer" ng-click="filterInstances('status')"></span>
+        <select class="form-control padding0" ng-model="statusFilter" ng-change="filterInstances('startTime')">
+          <option value="">ALL</option>
+          <option value="RUNNING">RUNNING</option>
+          <option value="SUCCEEDED">SUCCEEDED</option>
+          <option value="SUSPENDED">SUSPENDED</option>
+          <option value="WAITING">WAITING</option>
+          <option value="KILLED">KILLED</option>
+        </select>
+      </div>
+    </th>
+  </tr>
+  </thead>
+
+  <tbody>
+  <tr ng-if="input.length > 0" class="buttonsRow">
+    <td class="buttonCell" colspan="9">
+      <div class="btn btn-gray btn-xs buttons-to-show" ng-click="download()" ng-disabled="selectedRows.length === 0 || selectedRows.length > 1">
+        <span class="entypo down"></span> <div>Log</div>
+      </div>
+      <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeResume()" ng-disabled="selectedDisabledButtons.resume">
+        <span class="entypo play"></span> <div>Resume</div>
+      </div>
+      <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeRerun()" ng-disabled="selectedDisabledButtons.rerun">
+        <span class="entypo play"></span> <div>Rerun</div>
+      </div>
+      <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeSuspend()" ng-disabled="selectedDisabledButtons.suspend">
+        <span class="entypo paus"></span> <div>Suspend</div>
+      </div>
+      <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeKill()" ng-disabled="selectedDisabledButtons.stop">
+        <span class="entypo stop"></span> <div>Kill</div>
+      </div>
+    </td>
+  </tr>
+  <tr ng-if="input.length < 1" class="buttonsRow">
+    <td class="buttonCell" colspan="9">
+      <div ng-if="" class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeSchedule()" ng-disabled="selectedDisabledButtons.schedule">
+        <span class="entypo play"></span> <div>Schedule</div>
+      </div>
+    </td>
+  </tr>
+
+  <tr ng-if="input.length === 0 && !server.responses.listLoaded">
+    <td> loading... </td>
+  </tr>
+  <tr ng-if="input.length === 0 && server.responses.listLoaded">
+    <td> There are no results </td>
+  </tr>
+
+  <tr ng-if="input.length !== 0"
+      ng-repeat="item in input"
+      class="entityRow"
+      ng-class="{
+              firstEntityRow:$first, lastEntityRow:$last,
+              rowSelected:checkedRow(item.instance)
+            }">
+    <td class="checkboxCell">
+      <input type="checkbox" checklist-model="selectedRows" ng-model="$index"
+             checklist-value="{'instance':item.instance, 'startTime':item.startTime, 'endTime':item.endTime, 'status':item.status, 'type':type, 'logFile':item.logFile}"
+             ng-change="checkButtonsToShow()"/>
+    </td>
+    <td class="nameCell">
+      <button type="button" class="btn btn-default" ng-click="goInstanceDetails(item)">
+        {{ item.instance }}
+      </button>
+    </td>
+    <td>
+      <!--{{ item.startTime }}<br/>-->
+      <!--{{ item.startTime | date :'yyyy-MM-ddTHH:mm:ssZ' }}<br/>-->
+      {{ item.startTime | date :'MM/dd/yyyy HH:mm'}}
+    </td>
+    <td>
+      {{ item.endTime | date :'MM/dd/yyyy HH:mm'}}
+    </td>
+    <td class="stateCell">
+      <span ng-class="{
+      'blink-success': item.status == 'RUNNING',
+      'text-success': item.status == 'SUCCEEDED',
+      'blink-warning': item.status == 'WAITING' || item.status == 'UNKNOWN',
+      'blink-danger': item.status == 'SUSPENDED',
+      'text-danger': item.status == 'FAILED' || item.status == 'KILLED',
+      }">{{ item.status }}</span>
+    </td>
+
+  </tr>
+  <tr>
+    <td ng-if="server.responses.multiRequest[type] > 0 || server.responses.listLoaded[type] === false">
+      <div class="spinner" ng-class="{active: server.responses.multiRequest[type] > 0 || server.responses.listLoaded[type] === false}">
+        <img src="css/img/ajax-loader.gif" />
+      </div>
+    </td>
+  </tr>
+
+  <tr>
+    <td colspan="5">
+      <nav class="pull-right">
+        <ul class="pagination">
+          <li ng-show="prevPages"><a href="javascript:void(0);" ng-click="scopePrevOffset(0)"> < </a></li>
+          <li ng-repeat="page in pages" ng-show="page.show"><a href="javascript:void(0);" ng-click="page.enabled ? scopeGoPage(page.index) : void(0)" ng-class="page.enabled ? '' : 'pagDisabled'">{{ page.label }}</a></li>
+          <li ng-show="nextPages"><a href="javascript:void(0);" ng-click="scopeNextOffset(0)"> > </a></li>
+        </ul>
+      </nav>
+    </td>
+  </tr>
+
+  </tbody>
+
+</table>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/directives/lineageGraphDv.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/directives/lineageGraphDv.html b/falcon-ui/app/html/directives/lineageGraphDv.html
new file mode 100644
index 0000000..93a2896
--- /dev/null
+++ b/falcon-ui/app/html/directives/lineageGraphDv.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 id="lineageGraph">
+  <h4><small>Legends</small></h4>
+  <ul class="lineage-legend">
+    <li class="lineage-legend-feed-inst">Feed instance</li>
+    <li class="lineage-legend-feed-inst lineage-legend-terminal">Feed instance (terminal)</li>
+    <li class="lineage-legend-process-inst">Process instance</li>
+    <li class="lineage-legend-process-inst lineage-legend-terminal">Process instance (terminal)</li>
+  </ul>
+</div>
+<div>
+  <center>
+    <svg id="lineage-graph"></svg>
+  </center>
+</div>
+<div>
+  <div id="lineage-info-panel"></div>
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/directives/navDv.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/directives/navDv.html b/falcon-ui/app/html/directives/navDv.html
index ad1223d..63046f6 100644
--- a/falcon-ui/app/html/directives/navDv.html
+++ b/falcon-ui/app/html/directives/navDv.html
@@ -18,33 +18,83 @@
  */
 -->
 <nav class="col-sm-24 navbar navbar-default" role="navigation">
-  <div class="navbar">
-
-      <h1 class="navbar-header" ui-sref="main">
-        <img src="css/img/falcon.png" /> Falcon
+  <div class="col-sm-offset-1 col-sm-22">
+    <button class="logoTitle" ui-sref="main">
+      <h1 class="navbar-header">
+        <span class="falconLogo"></span> <span>Falcon</span>
       </h1>
+    </button>
 
-      <div class="createNavWrapper">
+      <div class="createNavWrapper" ng-show="userLogged()">
         <h4>Create an entity</h4>
-        <div ng-click="resetCluster()">
-          <span class="entypo archive"></span> Cluster
-        </div>
-        <div ng-click="resetFeed()">
-          <span class="entypo download"></span> Feed
-        </div>
-        <div id="createProcessButton" ng-click="resetProcess()">
-          <span class="entypo cycle"></span> Process
-        </div>
+        <button type="button"
+                id="cluster.create"
+                ng-click="resetCluster()"
+                ng-disabled="isInForm('cluster')"
+                ng-class="{disabled:isInForm('cluster')}">
+          <span class="entypo archive"></span> <span>Cluster</span>
+        </button>
+        <button type="button"
+                id="feed.create"
+                ng-click="resetFeed()"
+                ng-disabled="isInForm('feed')"
+                ng-class="{disabled:isInForm('feed')}">
+          <span class="entypo download"></span> <span>Feed</span>
+        </button>
+        <button type="button"
+                id="process.create"
+                ng-click="resetProcess()"
+                ng-disabled="isInForm('process')"
+                ng-class="{disabled:isInForm('process')}">
+          <span class="entypo cycle"></span> <span>Process</span>
+        </button>
+        <button type="button"
+                id="dataset.create"
+                ng-click="resetDataset()"
+                ng-disabled="isInForm('dataset')"
+                ng-class="{disabled:isInForm('dataset')}">
+          <span class="glyphicon glyphicon-duplicate"></span> <span>Mirror</span>
+        </button>
       </div>
 
-      <div class="uploadNavWrapper">
-        <h4>Upload an entity</h4>
-        <div class="btn-file">
-          <span class="entypo up"></span>
-          <input type="file" id="files" name="files[]" multiple fileinput-change="handleFile" ng-model="fileJson">
-          Browse for the XML file
-        </div>
+    <div class="uploadNavWrapper" ng-show="userLogged()">
+      <h4>Upload an entity</h4>
+      <div class="btn-file" ng-class="{fakeFocus: fake.focus}">
+        <span class="entypo up"></span>
+        <input type="file"
+               id="files"
+               ng-focus="fake.focus = true"
+               ng-blur="fake.focus = false"
+               name="files[]"
+               multiple
+               fileinput-change="handleFile"
+               ng-model="fileJson">
+        <span>Browse for the XML file</span>
+      </div>
+    </div>
+
+    <div class="loginHeaderBox">
+      <div ng-show="userLogged()">
+        <span class="user"></span> <div><strong>{{userToken}}</strong></div>
       </div>
-      
+
+      <button ng-show="userLogged() && !ambariView() && !isSecureMode()" ng-click="logOut()" ng-class="responses.unreaded > 0 ? 'logoutBT' : ''">
+        <span class="glyphicon glyphicon-log-out header-icon"></span> <div><strong class="pointer">Logout</strong></div>
+      </button>
+
+      <button ng-click="notify()" ng-blur="hideNotifs()" class="no-outline">
+        <span class="badge badge-notify" ng-show="responses.unreaded > 0">{{ responses.unreaded }}</span>
+        <span class="glyphicon glyphicon-bell bell-notif header-icon"></span>
+        <strong class="pointer">Notifications</strong>
+        <div class="notifications">
+          <server-messages></server-messages>
+        </div>
+      </button>
+
+      <a href="http://hortonworks.com/hadoop/falcon/">
+        <span class="glyphicon glyphicon-question-sign header-icon"></span> <div>Help</div>
+      </a>
+    </div>
+
   </div>
 </nav>

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/directives/notify.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/directives/notify.html b/falcon-ui/app/html/directives/notify.html
new file mode 100644
index 0000000..795753a
--- /dev/null
+++ b/falcon-ui/app/html/directives/notify.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.
+ */
+-->
+<div class="messagesArrow"></div>
+<div class="messages">
+  <div ng-repeat="message in server.responses.queue | limitTo: -1" class="message"
+       ng-class="{ 'color-warning' : message.type === 'warning' || message.type === 'cancel',
+                    'color-success' : message.type === 'success',
+                     'color-danger' : message.type === 'error' }">
+
+    <span class="glyphicon icon-notif"
+          ng-class="{ 'glyphicon-warning-sign' : message.type === 'warning' || message.type === 'cancel',
+          'glyphicon-ok' : message.type === 'success' }"></span>
+
+    {{ message.message }}
+    <a class="color-warning" ng-if="message.type === 'cancel'" ng-click="restore(message.state)">UNDO</a>
+
+  </div>
+</div>

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/directives/serverMessagesDv.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/directives/serverMessagesDv.html b/falcon-ui/app/html/directives/serverMessagesDv.html
index df4e20c..dd5a2a2 100644
--- a/falcon-ui/app/html/directives/serverMessagesDv.html
+++ b/falcon-ui/app/html/directives/serverMessagesDv.html
@@ -17,15 +17,37 @@
  * limitations under the License.
  */
 -->
-<div class="col-xs-24 messages-to-show" ng-show="server.responses.display">
-    
-    <div ng-repeat="message in server.responses.queue" class="alert repeat-animation" 
-      ng-class="{'bg-success': message.success, 'bg-danger': !message.success}">
-      
-      <span ng-class="{'text-success': message.success, 'text-danger': !message.success}">{{ message.status }}</span> 
-      {{ message.message }} 
-      <div class="entypo cross" ng-class="{'text-success': message.success, 'text-danger': !message.success}" ng-click="closeAlert($index)"></div>
-      
-    </div> 
-</div>
 
+<div class="messagesArrow notifs" ng-show="server.responses.queue.length > 0"></div>
+<div class="messages notifs">
+
+  <div ng-show="server.responses.showAll" ng-repeat="message in server.responses.queue | reverse" class="message"
+      ng-class="{ 'color-warning' : message.type === 'warning' || message.type === 'cancel',
+                    'color-success' : message.type === 'success',
+                    'color-danger' : message.type === 'error',
+                    'unreaded-notif' : !message.readed }">
+
+    <span class="glyphicon icon-notif"
+          ng-class="{ 'glyphicon-warning-sign' : message.type === 'warning' || message.type === 'cancel' || message.type === 'error',
+          'glyphicon-ok' : message.type === 'success' }"></span>
+
+    {{ message.message }}
+    <a class="color-warning" ng-if="message.type === 'cancel'" ng-click="restore(message.state)">UNDO</a>
+
+  </div>
+
+  <div ng-show="!server.responses.showAll" ng-repeat="message in server.responses.queue | limitTo: -1" class="message"
+       ng-class="{ 'color-warning' : message.type === 'warning' || message.type === 'cancel',
+                    'color-success' : message.type === 'success',
+                    'color-danger' : message.type === 'error' }">
+
+    <span class="glyphicon icon-notif"
+          ng-class="{ 'glyphicon-warning-sign' : message.type === 'warning' || message.type === 'cancel' || message.type === 'error',
+          'glyphicon-ok' : message.type === 'success' }"></span>
+
+    {{ message.message }}
+    <a class="color-warning" ng-if="message.type === 'cancel'" ng-click="restore(message.state)">UNDO</a>
+
+  </div>
+
+</div>

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/directives/tags-input.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/directives/tags-input.html b/falcon-ui/app/html/directives/tags-input.html
new file mode 100644
index 0000000..53273eb
--- /dev/null
+++ b/falcon-ui/app/html/directives/tags-input.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 class="host" tabindex="-1" ti-transclude-append="">
+<div class="tags" ng-class="{focused: hasFocus}">
+<ul class="tag-list">
+<li class="tag-item" ng-repeat="tag in tagList.items track by track(tag)" ng-class="{ selected: tag == tagList.selected }">
+  <strong ng-bind="getDisplayLabel($index, tag)"></strong>
+  <span ng-bind="getDisplayText(tag)" ng-class="tag.striked"></span>
+<a class="remove-button" ng-click="tagList.remove($index)" ng-bind="options.removeTagSymbol"></a>
+</li></ul>
+  <input autofocus id="tagsInput" class="input" ng-model="newTag.text" ng-change="newTagChange()"
+         ng-trim="false" ng-class="{'invalid-tag': newTag.invalid}"
+         ti-bind-attrs="{type: options.type, placeholder: options.placeholder, tabindex: options.tabindex}" ti-autosize="">
+</div></div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/directives/timeZoneSelectDv.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/directives/timeZoneSelectDv.html b/falcon-ui/app/html/directives/timeZoneSelectDv.html
index 110c2ee..f15bed7 100644
--- a/falcon-ui/app/html/directives/timeZoneSelectDv.html
+++ b/falcon-ui/app/html/directives/timeZoneSelectDv.html
@@ -19,6 +19,7 @@
 -->
 <select class="padding0 TZSelect form-control" ng-model="ngModel">
   <option value="" disabled style='display:none;'>-Select timezone-</option>
+  <option value="UTC">UTC</option>
   <option value="GMT-12:00">(GMT -12:00) Eniwetok, Kwajalein</option>
   <option value="GMT-11:00">(GMT -11:00) Midway Island, Samoa</option>
   <option value="GMT-10:00">(GMT -10:00) Hawaii</option>

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/entityDefinitionTpl.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/entityDefinitionTpl.html b/falcon-ui/app/html/entityDefinitionTpl.html
new file mode 100644
index 0000000..bdf29eb
--- /dev/null
+++ b/falcon-ui/app/html/entityDefinitionTpl.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.
+ */
+-->
+<div class="container" id="entityDefinition">
+
+  <h3 class="link-icons entity-title entity-link-null" id="entity-title">
+    {{entity.name}} <span class="label label-success">{{entity.type | titleCase}}</span>
+  </h3>
+
+  <div class="col-sm-24 detailsBox">
+    <h5>
+      Definition
+    </h5>
+    <div>
+      <textarea ng-model="prettyXml" rows="25" ng-disabled="true"></textarea>
+    </div>
+  </div>
+
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/entityDetailsTpl.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/entityDetailsTpl.html b/falcon-ui/app/html/entityDetailsTpl.html
index 0897638..6f1a4bc 100644
--- a/falcon-ui/app/html/entityDetailsTpl.html
+++ b/falcon-ui/app/html/entityDetailsTpl.html
@@ -17,18 +17,60 @@
  * limitations under the License.
  */
 -->
-<div class="col-sm-24 detailsHeaders"> 
-  <h3>
-    <small>{{clusterEntity._name}}</small>
-    {{ viewDock._name }}
-  </h3>
-</div>
-<div class="col-sm-23 detailsBox">
-  <h5>
-    Definition
-  </h5>
-  <div>
-    <textarea ng-model="prettyXml" rows="25" ng-disabled="true"></textarea>
+<div class="container" id="entityDetails">
+
+  <div class="row">
+    <div class="col-sm-24">
+      <button class="btn " ui-sref="main">< Back to Search</button>
+    </div>
   </div>
-    
+
+	<h3 class="link-icons entity-title entity-link-null" id="entity-title">
+		{{entity.name}} <button type="button" class="detailsBT">
+		<span ng-class="displayIcon((entity.type | uppercase), entity.model)"></span> {{entityTypeLabel}}
+	</button>
+	</h3>
+
+	<div class="row">
+		<div class="col-sm-24">
+			<div class="detailsBox">
+				<h4>
+					Dependencies
+				</h4>
+        <div class="dependencies-graph"><dependencies-graph name="entity.name" type="entity.type"/></div>
+			</div>
+		</div>
+	</div>
+
+	<div class="row">
+		<div class="col-sm-16">
+			<div class="detailsBox">
+				<h4>
+					Instances
+				</h4>
+				<instances-list input="instancesList" type="entity.type" name="entity.name" instance-details="instanceDetails"
+												pages="pages" go-page="goPage" next-pages="nextPages" prev-pages="prevPages" change-pages-set="changePagesSet"
+												start="entity.start" end="entity.end"/>
+			</div>
+		</div>
+		<div class="col-sm-8">
+			<div class="summaryBox" ng-init="propsOpen = false">
+				<div class="row">
+					<div class="col-sm-21">
+						<h4>
+							Properties
+						</h4>
+					</div>
+					<div class="col-sm-3">
+						<h4 class="pointer glyphicon" ng-click="propsOpen = !propsOpen" ng-class="propsOpen ? 'glyphicon-chevron-up':'glyphicon-chevron-down'"></h4>
+					</div>
+				</div>
+        <div ng-show="propsOpen" class="animate-show">
+					<div ng-if="entity.type == 'feed'" ui-view="feedSummary"></div>
+					<div ng-if="entity.type == 'process'" ui-view="processSummary"></div>
+				</div>
+			</div>
+		</div>
+	</div>
+
 </div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/entitySummary.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/entitySummary.html b/falcon-ui/app/html/entitySummary.html
new file mode 100644
index 0000000..83e8a85
--- /dev/null
+++ b/falcon-ui/app/html/entitySummary.html
@@ -0,0 +1,147 @@
+<!--
+/**
+ * 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="row" id="entitySummary">
+  <h4 class="col-sm-24">
+    General
+  </h4>
+  <div class="col-sm-12">
+    <label>Name</label>: {{feed.name}}
+  </div>
+  <div class="col-sm-12">
+    <label>Description</label>: {{optional(feed.description)}}
+  </div>
+
+  <h4 class="col-sm-24">
+    Tags
+  </h4>
+  <div class="col-sm-24">
+    <div ng-repeat="tag in feed.tags | filter:{key: '!!'}">
+      {{tag.key}} = {{tag.value}}
+    </div>
+    <div ng-show="!hasTags()">No tags selected</div>
+  </div>
+
+  <h4 class="col-sm-24">
+    Groups
+  </h4>
+  <div class="col-sm-24">
+    {{feed.groups}}
+    <div ng-show="!feed.groups">No groups selected</div>
+  </div>
+
+  <h4 class="col-sm-24">
+    Access Control List
+  </h4>
+  <div class="col-sm-8">
+    <label>Owner</label>: {{optional(feed.ACL.owner)}}
+  </div>
+  <div class="col-sm-8">
+    <label>Group</label>: {{optional(feed.ACL.group)}}
+  </div>
+  <div class="col-sm-8">
+    <label>Permissions</label>: {{optional(feed.ACL.permission)}}
+  </div>
+
+  <h4 class="col-sm-24">
+    Schema
+  </h4>
+
+  <div class="col-sm-12">
+    <label>Location</label>: {{optional(feed.schema.location)}}
+  </div>
+  <div class="col-sm-12">
+    <label>Provider</label>: {{optional(feed.schema.provider)}}
+  </div>
+
+  <h4 class="col-sm-24">
+    Properties
+  </h4>
+
+  <div class="col-sm-8">
+    <label>Frequency</label>: <frequency value="feed.frequency" prefix="Every"/>
+  </div>
+  <div class="col-sm-8">
+    <label>Late Arrival</label>: <frequency value="feed.lateArrival.cutOff" prefix="Up to"/>
+  </div>
+  <div class="col-sm-8">
+    <label>Availability Flag</label>: {{optional(feed.availabilityFlag)}}
+  </div>
+
+  <div class="col-sm-8" ng-repeat="property in feed.properties">
+    <label>{{property.key}}</label>:
+    <span ng-if="property.key !== 'timeout'">{{optional(property.value)}}</span>
+    <frequency ng-if="property.key === 'timeout'" value="property.value" prefix="at"/>
+  </div>
+
+  <div class="col-sm-8" ng-repeat="property in feed.customProperties | filter: {key: '!!'}">
+    <label>{{property.key}}</label>: {{property.value}}
+  </div>
+
+  <h4 class="col-sm-8" >
+    Default Storage Type:
+  </h4>
+
+  <div class="col-sm-8 light" ng-show="feed.storage.fileSystem.active">File System</div>
+  <div class="col-sm-8 light" ng-show="feed.storage.catalog.active">Catalog Storage</div>
+
+  <h4 class="col-sm-24" >Default Location:</h4>
+
+  <div ng-repeat="location in feed.storage.fileSystem.locations" ng-show="feed.storage.fileSystem.active">
+    <label class="col-sm-24" >{{capitalize(location.type)}}</label>
+    <div class="col-sm-24">{{optional(location.path)}}</div>
+  </div>
+
+  <div ng-show="feed.storage.catalog.active">
+    <label class="col-sm-24" >Table uri</label>
+    <div class="col-sm-24">{{optional(feed.storage.catalog.catalogTable.uri)}}</div>
+  </div>
+
+  <div ng-repeat="cluster in feed.clusters" >
+    <h4 class="col-sm-24" >{{capitalize(cluster.type)}} Cluster</h4>
+
+    <div class="col-sm-12">
+      <label>Name</label>: {{cluster.name}}
+    </div>
+    <div class="clearfix hidden-md"></div>
+
+    <div class="col-sm-12">
+      <label>Start</label>: {{cluster.validity.start.date}} {{cluster.validity.start.time}}
+    </div>
+    <div class="col-sm-12">
+      <label>End</label>: {{cluster.validity.end.date}} {{cluster.validity.end.time}}
+    </div>
+    <div class="col-sm-24">
+      <label>Timezone</label>: {{feed.timezone}}
+    </div>
+    <div class="col-sm-24">
+      <label>Retention</label>: <frequency value="cluster.retention" prefix="Archive in"/>
+    </div>
+  </div>
+  <div class="clearfix hidden-md"></div>
+  <h4 class="col-sm-24" >Location</h4>
+  <div ng-repeat="location in cluster.storage.fileSystem.locations" ng-show="cluster.storage.fileSystem">
+    <label class="col-sm-24" >{{capitalize(location.type)}}</label>
+    <div class="col-sm-24">{{optional(location.path)}}</div>
+  </div>
+  <div ng-show="cluster.storage.catalog.active">
+    <label class="col-sm-24" >Table uri</label>
+    <div class="col-sm-24">{{optional(cluster.storage.catalog.catalogTable.uri)}}</div>
+  </div>
+</div>
\ No newline at end of file


[18/22] falcon git commit: FALCON-1315 Update falcon ui for HiveDR, secure clusters and bug fixes. Contributed by Armando Reyna/Venkat Ranganathan.

Posted by so...@apache.org.
http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/fonts/Cabin-Italic-webfont.woff
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/fonts/Cabin-Italic-webfont.woff b/falcon-ui/app/css/fonts/Cabin-Italic-webfont.woff
new file mode 100644
index 0000000..b4d80af
Binary files /dev/null and b/falcon-ui/app/css/fonts/Cabin-Italic-webfont.woff differ

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/fonts/Cabin-Italic-webfont.woff2
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/fonts/Cabin-Italic-webfont.woff2 b/falcon-ui/app/css/fonts/Cabin-Italic-webfont.woff2
new file mode 100644
index 0000000..b3c39ae
Binary files /dev/null and b/falcon-ui/app/css/fonts/Cabin-Italic-webfont.woff2 differ

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/fonts/Cabin-Regular-webfont.eot
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/fonts/Cabin-Regular-webfont.eot b/falcon-ui/app/css/fonts/Cabin-Regular-webfont.eot
new file mode 100644
index 0000000..4683978
Binary files /dev/null and b/falcon-ui/app/css/fonts/Cabin-Regular-webfont.eot differ


[13/22] falcon git commit: FALCON-1315 Update falcon ui for HiveDR, secure clusters and bug fixes. Contributed by Armando Reyna/Venkat Ranganathan.

Posted by so...@apache.org.
http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/styles/common.less
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/styles/common.less b/falcon-ui/app/css/styles/common.less
index 92a8020..1ce62f7 100644
--- a/falcon-ui/app/css/styles/common.less
+++ b/falcon-ui/app/css/styles/common.less
@@ -22,6 +22,22 @@
 html, body { height: 100%; }
 body { background-color: rgba(246, 246, 246, 1); }
 
+.color-success{
+  color: #3c763d !important;
+}
+.color-info{
+  color: #31708f !important;
+}
+.color-warning{
+  color: #8a6d3b !important;
+}
+.color-danger{
+  color: #a94442 !important;
+}
+.error{
+  color: #ff3333 !important;
+}
+
 //--------------------VALIDATION---------------------//
 @shadow-valid: rgba(0, 255, 0, .6);
 @shadow-invalid: rgba(255, 0, 0, .6);
@@ -51,6 +67,7 @@ input {
     border-color: inherit;
   }
 }
+
 .ng-invalid.ng-dirty {
   border-color: lighten(red, 10%);
   &:focus.empty {
@@ -151,7 +168,7 @@ input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focu
 .mainUIView {
   //padding: 10px 0 30px 0;
   padding-top: 10px;
-  padding-bottom: 30px;  
+  padding-bottom: 30px;
 }
 //-----------------------------------------//
 //----------------FILE UPLOAD---------------------//
@@ -185,6 +202,19 @@ input[type="password"]{
   color: black;
   padding:0;
 }
+.dateInput {
+  //padding-right: 25px!important;
+}
+.dateInputIcon {
+  position: absolute;
+  background-color: white;
+  z-index: 2;
+  right: 5px;
+  bottom:5px;
+  /*top: 6px;*/
+  line-height: 15px;
+  font-size: 30px!important;
+}
 //-------------------------//
 .padding0 {
   padding: 0;
@@ -195,15 +225,7 @@ input[type="password"]{
 .buttonsWrapper {
   text-align: center;
 }
-.entitySummary {
-  text-align: center;
-  h3 { font-size:24px; }
-  h5 { font-size:12px; }
-  h3, h5 {
-    margin:0;
-  }
-}
-
+//-----------------------//
 .logoutBar {
   position: absolute;
   bottom:5px;
@@ -221,3 +243,638 @@ input[type="password"]{
 .timePicker {
   margin-top:-10px!important;
 }
+
+@summarySuccess: #009900;
+@summaryWarning: #E6DD00;
+@summaryDanger: #FF0000;
+
+.entitySummary {
+  text-align: center;
+  .whiteBox {
+    background-color: white;
+    border-radius: 3px;
+    margin: 0 7px 0 0;
+    padding: 5px 0;
+    &:first-child {
+      margin: 0 5px;
+    }
+  }
+  h3, h5 {
+    margin:0;
+  }
+  h3 { font-size:35px; }
+  h5 { font-size:9px; font-weight: bold; }
+  .notBold {
+    font-weight: normal;
+  }
+}
+
+@keyframes blink-success {
+  0% { color: @summarySuccess; }
+  100% { color: black; }
+}
+@-webkit-keyframes blink-success {
+  0% { color: @summarySuccess; }
+  100% { color: black; }
+}
+.blink-success {
+  -webkit-animation: blink-success 1s linear infinite;
+  -moz-animation: blink-success 1s linear infinite;
+  animation: blink-success 1s linear infinite;
+}
+
+@keyframes blink-warning {
+  0% { color: @summaryWarning; }
+  100% { color: black; }
+}
+@-webkit-keyframes blink-warning {
+  0% { color: @summaryWarning; }
+  100% { color: black; }
+}
+.blink-warning {
+  -webkit-animation: blink-warning 1s linear infinite;
+  -moz-animation: blink-warning 1s linear infinite;
+  animation: blink-warning 1s linear infinite;
+}
+
+@keyframes blink-danger {
+  0% { color: @summaryWarning; }
+  100% { color: black; }
+}
+@-webkit-keyframes blink-danger {
+  0% { color: @summaryWarning; }
+  100% { color: black; }
+}
+.blink-danger {
+  -webkit-animation: blink-danger 1s linear infinite;
+  -moz-animation: blink-danger 1s linear infinite;
+  animation: blink-danger 1s linear infinite;
+}
+
+@keyframes blink-notification {
+  0% { color: #ffff00; }
+  100% { color: white; }
+}
+@-webkit-keyframes blink-notification {
+  0% { color: #ffff00; }
+  100% { color: white; }
+}
+.blink-notification {
+  -webkit-animation: blink-notification 1s linear infinite;
+  -moz-animation: blink-notification 1s linear infinite;
+  animation: blink-notification 1s linear infinite;
+}
+
+.text-success {
+  color: @summarySuccess;
+}
+.text-warning {
+  color: @summaryWarning;
+}
+.text-danger {
+  color: @summaryDanger;
+}
+
+.border-left{
+  border-left: 2px solid @gray-lighter;
+}
+
+.border-right{
+  border-right: 2px solid @gray-lighter;
+}
+
+.summaryBox {
+  border-radius: 5px;
+  border: 1px solid @gray-light2;
+  margin: 5px 0;
+  padding: 15px 5px;
+  font-size: 12px;
+  background-color: #ffffff;
+  h4 {
+    font-weight: bold;
+    margin:5px 0;
+  }
+  h5 {
+    font-weight: bold;
+    margin-top:20px;
+  }
+  table {
+    width: 100%;
+    border-spacing: 5px;
+    border-collapse: separate;
+  }
+  .tableHeader {
+    width: 70px;
+    font-weight: bold;
+  }
+  textarea {
+    width: 100%;
+  }
+  &.processCluster {
+    padding: 15px 4%;
+    margin: 5px auto;
+    h5 {
+      margin-top:15px;
+      &:first-child {
+        margin-top:0;
+      }
+    }
+  }
+  .detailsBox{
+    margin-left: 10px;
+  }
+}
+
+/*************************************** SEARCH **************************************/
+.search {
+  height: 45px;
+  font-weight: 400;
+  font-size: 25px;
+  padding-left: 40px !important;
+  padding-right: 40px !important;
+}
+
+.searchBoxContainer{
+  margin: 25px 0;
+  .popover{
+    right: 5px !important;
+    width: 400px;
+  }
+  .arrow{
+    right: 35px !important;
+  }
+}
+
+.search-icon {
+  cursor: pointer;
+  position: absolute;
+  top: 13px;
+  left: 13px;
+  z-index: 2;
+  display: block;
+  line-height: 23px;
+  text-align: center;
+  font-size: 26px;
+  color: #777;
+}
+
+.search-loading-icon {
+  cursor: pointer;
+  position: absolute;
+  top: 15px;
+  left: 15px;
+  z-index: 2;
+  display: block;
+  line-height: 23px;
+  text-align: center;
+  font-size: 26px;
+  color: #777;
+  margin-right: 40px;
+}
+
+.remove-icon {
+  cursor: pointer;
+  position: absolute;
+  top: 13px;
+  right: 14px;
+//  z-index: 2;
+  display: block;
+  line-height: 23px;
+  text-align: center;
+  font-size: 26px;
+  color: #777;
+}
+
+.question-icon {
+  cursor: pointer;
+  position: absolute;
+  top: 13px;
+  right: 40px;
+//  z-index: 2;
+  display: block;
+  line-height: 23px;
+  text-align: center;
+  font-size: 26px;
+  color: #777;
+  margin-right: 5px;
+}
+
+.searchBox {
+  display: inline-block;
+  .entityTypeButtons {
+    display: inline-block;
+    background-color: @gray-light2;
+    border-radius: 7px;
+    padding: 4px;
+
+    .btn {
+      background-color: @gray-light2;
+      border-radius: 7px;
+      border: none;
+      outline: none!important;
+      line-height: 1;
+      padding: 5px;
+      &.active {
+        background-color: @gray-light;
+        color: white;
+      }
+      &:focus {
+
+      }
+    }
+  }
+}
+
+.filtersSearchBox{
+  .padding0{
+    min-width: 115px;
+  }
+}
+
+tags-input {
+  display: block;
+  height: 40px;
+}
+tags-input *, tags-input *:before, tags-input *:after {
+  -moz-box-sizing: border-box;
+  -webkit-box-sizing: border-box;
+  box-sizing: border-box;
+}
+tags-input .host {
+  position: relative;
+  margin-top: 5px;
+  margin-bottom: 5px;
+  height: 100%;
+}
+tags-input .host:active {
+  outline: none;
+}
+
+tags-input .tags {
+  -moz-appearance: textfield;
+  -webkit-appearance: textfield;
+  padding: 1px;
+  overflow: hidden;
+  word-wrap: break-word;
+  cursor: text;
+  background-color: white;
+//  border: 1px solid darkgray;
+//  box-shadow: 1px 1px 1px 0 lightgray inset;
+  height: 100%;
+  padding-left: 40px;
+}
+tags-input .tags.focused {
+  outline: none;
+  -webkit-box-shadow: 0 0 3px 1px rgba(5, 139, 242, 0.6);
+  -moz-box-shadow: 0 0 3px 1px rgba(5, 139, 242, 0.6);
+  box-shadow: 0 0 3px 1px rgba(5, 139, 242, 0.6);
+}
+tags-input .tags .tag-list {
+  margin: 0;
+  padding: 0;
+  list-style-type: none;
+}
+tags-input .tags .tag-item {
+  margin: 3px;
+  padding: 3px;
+  display: inline-block;
+  float: left;
+  font: 18px cabin, Arial, sans-serif;
+  height: 32px;
+  line-height: 25px;
+  border: 1px solid #acacac;
+  border-radius: 3px;
+  background: -webkit-linear-gradient(top, #ede4e4 0%, #d5cccc 47%, #bcb2b2 100%);
+  background: linear-gradient(to bottom, #ede4e4 0%, #d5cccc 47%, #bcb2b2 100%);
+}
+tags-input .tags .tag-item.selected {
+  background: -webkit-linear-gradient(top, #febbbb 0%, #fe9090 45%, #ff5c5c 100%);
+  background: linear-gradient(to bottom, #febbbb 0%, #fe9090 45%, #ff5c5c 100%);
+}
+tags-input .tags .tag-item .remove-button {
+  margin: 0 0 0 5px;
+  padding: 0;
+  border: none;
+  background: none;
+  cursor: pointer;
+  vertical-align: middle;
+  font: bold 18px cabin, Arial, sans-serif;
+  color: #585858;
+}
+tags-input .tags .tag-item .remove-button:active {
+  color: red;
+}
+tags-input .tags .input {
+  border: 0;
+  outline: none;
+  margin: 2px;
+  padding: 0;
+  padding-left: 5px;
+  float: left;
+  height: 32px;
+  font: 18px cabin, Arial, sans-serif;
+}
+tags-input .tags .input.invalid-tag {
+  color: red;
+}
+tags-input .tags .input::-ms-clear {
+  display: none;
+}
+tags-input.ng-invalid .tags {
+  -webkit-box-shadow: 0 0 3px 1px rgba(255, 0, 0, 0.6);
+  -moz-box-shadow: 0 0 3px 1px rgba(255, 0, 0, 0.6);
+  box-shadow: 0 0 3px 1px rgba(255, 0, 0, 0.6);
+}
+
+tags-input .autocomplete {
+  margin-top: 5px;
+  position: absolute;
+  padding: 5px 0;
+  z-index: 999;
+  width: 100%;
+  background-color: white;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+}
+tags-input .autocomplete .suggestion-list {
+  margin: 0;
+  padding: 0;
+  list-style-type: none;
+}
+tags-input .autocomplete .suggestion-item {
+  padding: 5px 10px;
+  cursor: pointer;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  font: 16px cabin, Arial, sans-serif;
+  color: black;
+  background-color: white;
+}
+tags-input .autocomplete .suggestion-item.selected {
+  color: white;
+  background-color: #0097cf;
+}
+tags-input .autocomplete .suggestion-item.selected em {
+  color: white;
+  background-color: #0097cf;
+}
+tags-input .autocomplete .suggestion-item em {
+  font: normal bold 16px cabin, Arial, sans-serif;
+  color: black;
+  background-color: white;
+}
+
+.tag-striked{
+  text-decoration: line-through;
+}
+
+.pagination {
+  margin: 10px 0 5px 0;
+}
+
+.pagDisabled{
+  cursor: default !important;
+  background-color: #eee !important;
+}
+
+.no-margin{
+  margin: 0;
+}
+
+.buttonsRow {
+  height: 43px;
+  td {
+    border-top: none;
+    border-bottom: 1px solid @gray-lighter;
+  }
+  margin-bottom: 8px;
+}
+
+.buttonCell {
+  .entypo, div {
+    display: inline-block;
+    vertical-align: middle;
+  }
+  .entypo {
+    font-size: 22px;
+    vertical-align: sub;
+    //margin: 6px 0 0 0;
+    //line-height: 18px;
+  }
+  div {
+    //margin: 3px 0 0 0;
+  }
+}
+
+.btn-gray {
+  color: #333;
+  background-color: #ccc;
+  border-color: #ccc;
+}
+
+.btn-big {
+  color: #333;
+  background-color: #ccc;
+  border-color: #ccc;
+  padding: 8px;
+  font-size: 14px;
+}
+
+.instance-title{
+  margin: 0;
+  padding: 10px;
+}
+
+.instance-status{
+  margin-top: 8px;
+}
+
+.animate-show {
+  line-height: 20px;
+  opacity: 1;
+  padding: 10px;
+}
+
+.animate-show.ng-hide-add.ng-hide-add-active,
+.animate-show.ng-hide-remove.ng-hide-remove-active {
+  -webkit-transition: all linear 0.5s;
+  transition: all linear 0.5s;
+}
+
+.animate-show.ng-hide {
+  line-height: 0;
+  opacity: 0;
+  padding: 0 10px;
+}
+
+.vertical-align {
+  min-height: 5vh;
+  display: -webkit-box;
+  display: -moz-box;
+  display: -ms-flexbox;
+  display: -webkit-flex;
+  display: flex;
+  -webkit-box-align : center;
+  -webkit-align-items : center;
+  -moz-box-align : center;
+  -ms-flex-align : center;
+  align-items : center;
+  width: 100%;
+}
+
+.dependencies-graph{
+  text-align: center;
+}
+
+/**
+  DEPENDENCIES & LINEAGE GRAPHS
+**/
+
+.node {
+  .foreignObject {
+    padding: 5px;
+  }
+}
+
+.node-name:before {
+  font-family: 'Glyphicons Halflings';
+  -webkit-font-smoothing: antialiased;
+  font-style: normal;
+  font-weight: normal;
+  line-height: 1;
+  padding-right: 0.3em;
+  vertical-align: -20%;
+  font-size: 110%;
+  color: #428bca;
+}
+
+.node-name-cluster:before {
+  content: "\2601";
+}
+
+.node-name-process:before {
+  content: "\e110";
+}
+
+.node-name-feed:before {
+  content: "\e181";
+}
+
+.node rect {
+  stroke-width: 0.5px;
+  stroke: #999;
+  fill: @gray-dark;
+  fill-opacity: 5%;
+  &:hover {
+    fill-opacity: 10%;
+  }
+}
+
+.edge path {
+  fill: none;
+  stroke: #333;
+  stroke-width: 1px;
+}
+
+.node-name {
+  font-size: 12px;
+  vertical-align: middle;
+  margin: 10px;
+}
+
+.lineage-link {
+  fill: none;
+  stroke: #eee;
+  stroke-width: 1.5px;
+}
+
+.lineage-node, .lineage-href {
+  cursor: pointer;
+}
+
+.lineage-node-terminal {
+  stroke: #000;
+  stroke-opacity: 0.3;
+  stroke-width: 8px;
+}
+
+.lineage-node-active {
+  stroke: #45a2b5;
+  stroke-opacity: 0.3;
+  stroke-width: 8px;
+}
+
+.lineage-node-text {
+  font-size: 8pt;
+  fill: #fff;
+  word-wrap: break-word;
+}
+
+.lineage-node-feed-instance {
+  fill: #6ab545;
+}
+
+.lineage-node-process-instance {
+  fill: #456ab5;
+}
+
+ul.lineage-legend {
+  list-style-type: none;
+}
+
+.lineage-legend li {
+  padding-left: 20px;
+  display: inline;
+}
+
+ul.lineage-legend li:before {
+  content: "\25cf";
+  position: relative;
+  display: inline-block;
+  top: 2px;
+  font-style: normal;
+  font-size: 16pt;
+  line-height: 1;
+  -webkit-font-smoothing: antialiased;
+  padding-right: 5px;
+}
+
+.lineage-legend-feed-inst:before {
+  color: #6ab545;
+}
+
+.lineage-legend-process-inst:before {
+  color: #456ab5;
+}
+
+
+.lineage-legend-terminal:before {
+  -webkit-text-stroke-width: 2px;
+  -webkit-text-stroke-color: #ccc;
+}
+
+/* ALERT MESSAGE */
+
+.alert {
+  font-size: 16px;
+}
+
+.no-outline{
+ outline: 0;
+}
+
+.tittle-in-row{
+  margin-top: 20px !important;
+  margin-bottom: 0px !important;
+}
+
+.icon-lg{
+  font-size: 40px !important;
+}
+
+.prettyXml{
+  min-height: 800px;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/styles/dataset-form.less
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/styles/dataset-form.less b/falcon-ui/app/css/styles/dataset-form.less
new file mode 100644
index 0000000..1416dba
--- /dev/null
+++ b/falcon-ui/app/css/styles/dataset-form.less
@@ -0,0 +1,494 @@
+/**
+ * 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.
+ */
+//----------------mozilla outline hack-------------------//
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus,
+.btn:focus, .btn:active, .btn:active:focus, .btn.active:focus, .btn:visited {
+  outline: none;
+  outline-offset: 0;
+}
+
+//--------helpers-----------------//
+.pa { position: absolute; }
+.pr { position: relative; }
+
+.p0 { padding: 0; }
+.p5 { padding: 5px; }
+.p10 { padding: 10px; }
+.p15 { padding: 15px; }
+.p20 { padding: 20px; }
+
+.m0 { margin: 0; }
+.m20 { margin: 20px; }
+.mt5 { margin-top: 5px; }
+.mt10 { margin-top: 10px; }
+.mt15 { margin-top: 15px; }
+.mt20 { margin-top: 20px; }
+.mb5 { margin-bottom: 5px; }
+.mb10 { margin-bottom: 10px; }
+.mb15 { margin-bottom: 15px; }
+.mb20 { margin-bottom: 20px; }
+
+.tl { text-align: left; }
+.tc { text-align: center; }
+.tr { text-align: right; }
+
+.pointer{ cursor: pointer; }
+.db { display: block; }
+
+//-----------------------------------------//
+
+@nextBtnBackground: #666666;
+@prevBtnBackground: #CCCCCC;
+
+#sourceClusterSelect, #targetClusterSelect {
+  display: block;
+  margin-bottom: 8px;
+}
+#formBox {
+  padding: 0 2%;
+  .dateInput {
+    padding-right:0!important;
+  }
+  .formBoxWrapper {
+    width: 500px;
+    margin:0 auto;
+  }
+  .locationBox {
+    label { margin:0 0 10px 0 };
+  }
+
+  label {
+    font-weight: normal;
+    font-size: 11px;
+    max-width: none;
+
+  }
+  input[type="text"], select {
+    .p0;
+    padding-left: 1px;
+    font-size: 13px;
+    line-height: 15px;
+    height: 25px;
+  }
+  textarea {
+    .p0;
+    padding-left: 1px;
+    font-size: 13px;
+    line-height: 15px;
+  }
+  .tablesTextArea {
+    height: 50px;
+  }
+  .databasesTextArea {
+    height: 97px;
+  }
+
+  a {
+    line-height: 30px;
+    cursor: pointer;
+    margin: 5px 15px;
+    text-decoration: underline;
+    color: black;
+    &:focus {
+      color: red;
+    }
+  }
+  h4 {
+    font-size: 14px;
+    font-weight: 700;
+  }
+
+  .formTitol {
+    width: 500px;
+    margin:0 auto;
+    padding-top: 10px;
+    padding-bottom: 10px;
+    h1 {
+      font-size: 22px;
+      font-weight: bold;
+      margin:0;
+    }
+    a {
+      font-size: 12px;
+      line-height: 12px;
+      margin:0;
+      letter-spacing: 0.5px;
+    }
+  }
+  .tagsBox, .alertsBox {
+    .btn {
+      border-radius: 5px;
+      padding: 1px;
+      border-color: @gray;
+      height: 25px;
+      width: 65px;
+      line-height: 23px;
+      .glyphicon {
+        font-size: 8px;
+        line-height: 8px;
+        top:0;
+        color: @gray;
+      }
+    }
+  }
+
+  .typeButtonsBox {
+    background-color: @gray-lighter;
+    width: 264px;
+    padding:5px;
+    border-radius: 5px;
+    .btn {
+      padding: 5px 20px;
+      border-radius: 5px;
+      background-color: @gray-lighter;
+      border: none;
+      &.active {
+        background-color: @gray;
+        color: white;
+      }
+    }
+  }
+
+  .formBoxWrapper {
+    border: 1px solid @gray-lighter;
+    border-radius:3px;
+    .p20;
+  }
+
+  .clusterBox {
+    border: 1px solid @gray-light;
+    border-radius: 5px;
+    .mt20;
+    .mb10;
+    padding-top: 15px;
+    padding-bottom: 15px;
+
+    h3, .runJobOnBox {
+      .pa;
+      background-color: white;
+      padding: 0 5px;
+    }
+
+    h3 {
+      font-size: 16px;
+      font-weight: 700;
+      display: inline-block;
+      top: -30px;
+
+    }
+    .runJobOnBox {
+      width: 110px;
+      right: 5px;
+      top: -13px;
+    }
+    .hiveDatabasesTitol {
+      font-size: 12px;
+      padding-left: 5px;
+    }
+    .databaseRadioBox{
+      font-size: 12px;
+      input {
+        margin-left: 5px;
+      }
+    }
+  }
+  .alertsBox {
+    .mt10;
+    h4 {
+      margin: 0;
+    }
+    .emailBox {
+      padding-right: 5px;
+      width: 82%;
+      display: inline-block;
+      vertical-align: top;
+      .db { margin:0; }
+      margin-bottom:5px;
+      label {
+        width: 100%;
+      }
+    }
+    .addAlertBox {
+      margin-bottom:5px;
+      margin-left: 10px;
+      display: inline-block;
+      vertical-align: top;
+      margin-top: 24px;
+    }
+    .emailArrayRow {
+      height: 25px;
+      font-size: 12px;
+      line-height: 25px;
+      margin-bottom: 5px;
+      span {
+        font-weight: bold;
+      }
+      button {
+        float: right;
+        margin-right: 4px;
+      }
+    }
+  }
+
+}
+.advancedOptionsButton {
+  cursor: pointer;
+  hr {
+    width: 67%;
+    margin-top: -7px;
+    margin-bottom:0;
+    margin-left: 128px;
+    border-top: 1px solid @gray-dark;
+  }
+  span.entypo {
+    float: right;
+    margin: 7px 5px;
+    font-size: 50px;
+  }
+}
+#advancedOptionsBox {
+  .transition(max-height 1s ease);
+  max-height: 0;
+  overflow: hidden;
+  &.expanded {
+    max-height: 850px;
+  }
+  .frequencyBox {
+    width: 36%;
+    display: inline-block;
+    vertical-align: top;
+    input, select {
+      display: inline-block;
+    }
+    input {
+      width: 20px;
+    }
+    select {
+      width: 80px;
+    }
+    label {
+      margin:0;
+    }
+  }
+
+  .allocationBox {
+    >div>div {
+      width: 24%;
+      display: inline-block;
+    }
+
+  }
+  .retryBox {
+    .policyBox {
+      width: 45%;
+      select {
+        width: 170px;
+      }
+    }
+
+    > div {
+      width: 30%;
+      display: inline-block;
+      input, select {
+        display: inline-block;
+      }
+      input {
+        width: 20px;
+      }
+      select {
+        width: 80px;
+      }
+      label {
+        margin:0;
+      }
+      &:last-child {
+        width: 20%;
+        text-align: right;
+        padding-right: 20px;
+      }
+    }
+  }
+
+  .hiveOptBox {
+    label {
+      display: block;
+    }
+  }
+}
+
+
+//---------------SUMMARY------------------//
+
+#formSummaryBox {
+  font-size: 12px;
+  h4 {
+    margin-bottom:0;
+    font-size: 12px;
+  }
+  h5 {
+    font-size: 12px;
+    font-weight: bold;
+    display: inline-block;
+  }
+  span {
+    font-weight: bold;
+  }
+  .lightSubtitle {
+    color: @gray-light;
+    font-weight: bold;
+    font-size: 14px;
+  }
+  .box {
+    position: relative;
+    border: 1px solid @gray-lighter;
+    border-radius: 5px;
+    padding: 15px;
+    margin-top: 15px;
+
+    h3 {
+      font-size: 18px;
+      margin-top: -25px;
+      margin-left: -10px;
+      padding: 0 5px;
+      background-color: white;
+      display: inline-block;
+      position: absolute;
+    }
+    h4 {
+      margin-top:0;
+    }
+
+  }
+  .allocationSubBox {
+    width: 32%;
+    display: inline-block;
+  }
+  .previewBox {
+    text-align: right;
+  }
+  #jsonPreview {
+    width: 190px;
+    .mt20;
+    .mb20;
+  }
+
+}
+
+
+//////////////////////////////
+
+#formBox {
+  .progressBox {
+    height: 75px;
+    .pr;
+  }
+  .progressBar {
+    overflow: hidden;
+    padding: 0 35px 10px;
+    height: 100px;
+
+    h6 {
+      font-size: 10px;
+      white-space: nowrap;
+    }
+    span {
+      width: auto;
+    }
+  }
+
+  .fir, .sec {
+    .pa;
+    .transition(border, 0.4s, ease);
+    .transition(background, 0.4s, ease);
+    width: 40px;
+    height: 40px;
+    display: inline-block;
+    border: 3px solid @gray-light;
+    border-radius: 20px;
+    color: white;
+    line-height: 34px;
+    font-size: 18px;
+    font-weight: bold;
+    text-align: center;
+    span {
+      display: none;
+    }
+    h6 { .m0; .pa; top: 40px; color: black; }
+
+  }
+  .fir {
+    left:0;
+    h6 {
+      left: -5%;
+    }
+  }
+  .sec {
+    right: 0;
+    margin-left: -20px;
+    z-index: 4;
+    h6 {
+      left: -10%;
+    }
+  }
+
+  .bar1 {
+    .transition(all, 0.4s, ease);
+    .pa;
+    z-index: 3;
+    top:13px;
+    height: 10px;
+    background-color: @gray-light;
+    z-index: 5;
+    left: 38px;
+    right: 32px;
+    border-width:0;
+  }
+  .general {
+    .bar1 { background-color: @gray-light; }
+    .fir {
+      background-color: @gray-dark;
+      h6 { font-weight: bold; }
+    }
+    .sec {
+      background-color: @gray-light;
+      h6 { font-weight: normal; }
+    }
+
+  }
+
+  .summary {
+    .bar1 { background-color: @gray-dark; }
+    .fir {
+      h6 { font-weight: normal; }
+      background-color: @gray-dark;
+      border-color: @gray-dark;
+      span {
+        display: inline-block;
+      }
+      b {
+        display: none;
+      }
+    }
+    .sec {
+      background-color: @gray-dark;
+      h6 { font-weight: bold; }
+    }
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/styles/entities-list.less
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/styles/entities-list.less b/falcon-ui/app/css/styles/entities-list.less
index feb50e3..6ea757f 100644
--- a/falcon-ui/app/css/styles/entities-list.less
+++ b/falcon-ui/app/css/styles/entities-list.less
@@ -16,16 +16,17 @@
  * limitations under the License.
  */
 .dashboardBox {
+  padding: 0;
   h3 {
     margin: 0 0 5px 0;
   }
 }
 
-.listTable { 
+.listTable {
   margin-top: 5px;
   border-collapse: separate;
   border-radius: 4px;
-  border: 1px solid @gray;
+  //border: 1px solid @gray;
   width: 100%;
   min-height: 140px;
   overflow: hidden;
@@ -55,7 +56,7 @@
         //.trayAnimation;
       }
     }
-    
+
   }
   h5 {
     text-align: left;
@@ -76,6 +77,7 @@
   tbody {
     padding: 5px;
     display: table-row-group;
+    background-color: white;
   }
   tr {
     width: 100%;
@@ -86,6 +88,9 @@
     width: 35%;
     float:left;
     margin: 3px 1%;
+    &.clusterFilters {
+      width: 48%;
+    }
   }
   .filtersSelectBox {
     float:left;
@@ -97,21 +102,30 @@
       padding:0;
       font-size: 10px;
     }
-  } 
-  .buttonsRow {
-    height: 41px;
-    td {
-      border-top: none;
-    }  
-  }  
-  .buttonCell {}
+  }
+
+
   .entityRow {
+    &:hover, &.rowSelected {
+      background: #F2F2F2;
+      td {
+        border-color: #E2E2E2;
+      }
+    }
+
     td {
-      padding: 0 5px;
+      padding: 3px 3px;
+      line-height: 22px;
+      border-top: 1px solid transparent;
+      border-bottom: 1px solid transparent;
+      vertical-align: middle;
+    }
+    &.firstEntityRow {
+      td { padding-top: 6px; }
     }
-    &:last-child {
+    &.lastEntityRow {
       td {
-        border-bottom: none;
+        padding-bottom: 6px;
       }
     }
   }
@@ -130,12 +144,8 @@
   input[type="radio"] {
     margin: -1px 0 0 -18px;
     font-size: 10px;
-  } 
-  .entypo {
-    font-size: 20px;
-    margin: 8px 0 0 0;
-    display: inline-block;
-  }  
+  }
+
   .nameCell {
     cursor: pointer;
     &:hover {
@@ -143,7 +153,7 @@
     }
   }
 }
-.buttons-to-show { 
+.buttons-to-show {
   margin:2px 0;
 }
 /* LOGIN */
@@ -164,3 +174,39 @@
     color: gray;
   }
 }
+
+/* New Dashboard */
+
+.filtersResultBox {
+  font-weight: normal;
+//  font-size: 14px;
+  width: 35%;
+  float:left;
+  margin: 3px 1%;
+  &.clusterFilters {
+    width: 48%;
+  }
+}
+
+.tag:hover {
+  cursor: pointer;
+  color: #fff;
+  background-color: #5fa33e;
+  font-weight: bold;
+}
+
+
+
+
+.waitingLayer {
+  position: absolute;
+  background-color: red;
+  width: 100%;
+  height:100%;
+  opacity:0;
+  z-index: -1;
+  .active {
+    opacity:1;
+    z-index: 2;
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/styles/entity-summary.less
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/styles/entity-summary.less b/falcon-ui/app/css/styles/entity-summary.less
new file mode 100644
index 0000000..5d5f1e3
--- /dev/null
+++ b/falcon-ui/app/css/styles/entity-summary.less
@@ -0,0 +1,17 @@
+/**
+ * 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/falcon/blob/86180d93/falcon-ui/app/css/styles/form-pages.less
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/styles/form-pages.less b/falcon-ui/app/css/styles/form-pages.less
index 6f27ff5..957e148 100644
--- a/falcon-ui/app/css/styles/form-pages.less
+++ b/falcon-ui/app/css/styles/form-pages.less
@@ -20,6 +20,9 @@
 .mt1 {
   margin-top: 1px;
 }
+.mt5 {
+  margin-top: 5px;
+}
 .mt10 {
   margin-top: 10px;
 }
@@ -31,19 +34,83 @@
 }
 .formViewContainer {
   .mt10;
+
 }
-.feedBottomButtons {
-  .mt20; 
+//-----------------next and previous buttons----------//
+@nextBtnBackground: #666666;
+@prevBtnBackground: #CCCCCC;
+.nextBtn, .prevBtn {
+  .transition(background, 0.3s, ease);
+  border: 0px none;
+  width: 90px;
+  border-radius: 7px!important;
+  padding: 10px;
+}
+.nextBtn {
+  background: @nextBtnBackground;
+  color: white;
+  &:hover {
+    background: darken(@nextBtnBackground, 10%);
+    color: white;
+    outline: hidden;
+    border-radius: 7px!important;
+  }
+  &:focus, &:active, &:visited {
+    background: darken(@nextBtnBackground, 10%);
+    color: white;
+    outline: hidden;
+    border-radius: 10px!important;
+  }
+}
+.prevBtn {
+  background: @prevBtnBackground;
+  &:hover {
+    background: darken(@prevBtnBackground, 10%);
+    outline: hidden;
+    border-radius: 7px!important;
+  }
+  &:focus, &:active, &:visited {
+    background: darken(@prevBtnBackground, 10%);
+    outline: hidden;
+    border-radius: 10px!important;
+  }
+}
+//-----------------------------------------------------//
+.aclBox {
+  .mt10;
+
+  > div {
+    label {
+      margin-top:5px;
+      font-weight: normal;
+      width: 95%;
+    }
+    width: 32%;
+    display: inline-block;
+    vertical-align: top;
+  }
+}
+.dt {
+  //display: table;
+}
+@media screen and (max-width: @grid-float-breakpoint) {
+  .xmlPreviewContainer {
+    position: relative;
+    left:0;
+    top:0;
+    width: 500px;
+  }
 }
 .formPage {
-  
+
   h3 {
     font-weight: bold;
   }
   .entypo {
     font-size: 22px;
-    line-height: 10px;
-    vertical-align: middle;
+   /* line-height: 14px;*/
+    /*vertical-align: top;
+    display: inline-table;*/
   }
   h4 {
     font-size: 14px;
@@ -66,30 +133,36 @@
   .light {
     font-weight: normal;
   }
-  u {
+  a {
     line-height: 30px;
     cursor: pointer;
+    margin: 5px 15px;
+    text-decoration: underline;
+    color: black;
+    &:focus {
+      color: red;
+    }
   }
   input, select {
-    color: black;
+    color: @gray-darker;
     font-size: 13px;
   }
   .input-group-addon {
     height:13px;
     border-radius:0;
   }
-  
+
 }
-select {  
-  .form-control;  
+select {
+  .form-control;
   padding:0;
 }
 #engineVersionField{ display: inline-block; width: auto; }
 .inlineInputsGroup {
-  input {   
-    display: inline-block;    
-    margin-right: 3px; 
-    &:last-child { margin-right:0;}   
+  input {
+    display: inline-block;
+    margin-right: 3px;
+    &:last-child { margin-right:0;}
   }
   input[type="text"] {
     width: 20px;
@@ -121,7 +194,7 @@ select {
     font-size: 35px;
     line-height: 9px;
   }
-  
+
 }
 .clusterSummaryRow {
   padding: 0 10px;
@@ -140,8 +213,8 @@ select {
     }
     margin-top: 5px;
   }
-  
-  
+
+
 }
 #feedPropertiesBox {
   label {
@@ -153,7 +226,7 @@ select {
     margin-top: 10px;
   }
   label {
-    font-size: 10px;
+    font-size: 12px;
     margin:0;
   }
   input[type="checkbox"] {
@@ -191,12 +264,34 @@ select {
   }
   .feedLocationNav {
     color: black;
+
     .btn {
-      background-color: @gray-light;
+      position: relative;
+      background-color: lighten(@gray-light2, 20%);
+      border-radius: 5px;
+      font-size: 12px;
+      letter-spacing: 0.5px;
+      padding: 4px 20px;
+
+      &:last-child {
+        margin-right: -12px;
+      }
     }
     .active {
       color: white;
-      background-color: @gray-dark;
+      background-color:lighten(@gray, 20%);
+      z-index: 1234;
+    }
+    &.disabled {
+      .btn {
+        background-color: lighten(@gray-light2, 30%);
+        opacity:1;
+        color: @gray-light2;
+      }
+      .active {
+        background-color:lighten(@gray, 30%);
+        color: white;
+      }
     }
   }
 
@@ -234,7 +329,7 @@ select {
     }
 
   }
-  .validityDateBox {
+  /*.validityDateBox {
     .light {
       display: block;
     }
@@ -242,7 +337,7 @@ select {
       display: inline-block;
 
     }
-  }
+  }*/
   .input-group {
     input {
       font-size: 12px;
@@ -290,18 +385,24 @@ select {
     color: white;
   }
 }
+
+@media screen and (max-width: @grid-float-breakpoint) {
+  .detailsBox {
+    float:none!important;
+  }
+}
 .detailsBox {
   border-radius: 5px;
   border: 1px solid @gray-light2;
-  margin: 5px;
+  margin: 5px 0;
   padding: 15px 5px;
   font-size: 12px;
   background-color: #ffffff;
   h4 {
-    font-weight: bold;    
+    font-weight: bold;
     margin:5px 0;
   }
-  h5 { 
+  h5 {
     font-weight: bold;
     margin-top:2px;
   }
@@ -320,7 +421,7 @@ select {
   &.processCluster {
     padding: 15px 4%;
     margin: 5px auto;
-    h5 { 
+    h5 {
       margin-top:15px;
       &:first-child {
         margin-top:0;
@@ -328,3 +429,92 @@ select {
     }
   }
 }
+
+.detailsBT{
+  .entypo{
+    font-size: 1.5em;
+  }
+  color: #fff;
+  padding: 3px 8px;
+  border: 1px solid white;
+  border-radius: 5px;
+  border-color: #fff;
+  display: inline-block;
+  cursor: auto;
+  background-color: #5fa33e;
+}
+
+
+///////////////////////////////////////////////
+///////VALIDITY BOXES//////////////////////////
+///////////////////////////////////////////////
+.validityBox {
+  label, input, button {
+    font-weight: normal;
+  }
+
+  > div {
+    display: inline-block;
+    margin: 0 2px;
+  }
+
+  h4 {
+    margin-top: 5px;
+    margin-bottom: 0;
+  }
+  .startDateBox, .endDateBox {
+    width: 20%;
+    vertical-align: top;
+  }
+  .startTimeBox, .endTimeBox {
+    width: 15%;
+    vertical-align: top;
+    padding-left:0;
+    input {
+      //width: 20px;
+      //margin:0;
+    }
+    button {
+      border-radius: 0;
+      width: 25px;
+      height: 25px;
+      padding:0;
+      margin-left: 1px;
+    }
+    table {
+      width: auto;
+      border-spacing: 0;
+      tr {
+        &:first-child {
+          display: none;
+        }
+        &:last-child {
+          display: none;
+        }
+      }
+    }
+
+    a {
+      display: none!important;
+    }
+  }
+  .endDateBox {
+
+  }
+  .endTimeBox {
+
+  }
+  .tzBox {
+    width: 22%;
+    //padding-top: 20px;
+  }
+}
+
+.feedForm, .entityForm {
+  .validityBox {
+    .startDateBox, .endDateBox { width: 27%;}
+    .startTimeBox, .endTimeBox {width: 17%;}
+    .endDateBox { margin-left: 20px;}
+    .error_input { border:1px solid red !important;}
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/styles/nav-header.less
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/styles/nav-header.less b/falcon-ui/app/css/styles/nav-header.less
index 7bc160e..2be45af 100644
--- a/falcon-ui/app/css/styles/nav-header.less
+++ b/falcon-ui/app/css/styles/nav-header.less
@@ -27,8 +27,25 @@
   border-width: 0;
   border-radius: 0;
   position: relative;
+  &:hover{
+    cursor: default;
+  }
+}
+.logoTitle {
+  background: transparent;
+  border: none;
+  float: left;
+  h1 span{
+    vertical-align: middle;
+    display: inline-block;
+  }
+  .falconLogo{
+    background: url(img/falcon.png) no-repeat center center;
+    background-size: 100%;
+    width: 30px;
+    height: 44px;
+  }
 }
-
 .navbar-header {
   margin: 5px 15px 5px 5px;
   font-size: 30px;
@@ -47,51 +64,177 @@
     font-weight: bold;
     margin: 2px 0;
   }
-  > div {
+  > button {
     padding: 5px 10px;
     border: 1px solid white;
     border-radius: 3px;
     display: inline-block;
     cursor: pointer;
+    background-color: transparent;
+  }
+  span {
+    vertical-align: middle;
+    margin-right: 6px;
+    &.entypo, &.glyphicon{
+      vertical-align: sub;
+      &.up{
+        font-size: 2.2em;
+      }
+    }
   }
   .disabled {
-    color: lighten(@headerNavBG, 10%);
-    border-color: lighten(@headerNavBG, 10%);
+    //color: lighten(@headerNavBG, 30%);
+    //border-color: lighten(@headerNavBG, 10%);
     cursor: default;
+    .background-opacity(black, 0.2);
   }
 }
 .uploadNavWrapper {
   > div {
     min-width:183px;
+    padding: 5px 10px;
+    border: 1px solid white;
+    border-radius: 3px;
+    display: inline-block;
+    cursor: pointer;
+    &.fakeFocus {
+      .box-shadow(0 0 2px white);
+    }
   }
 }
-
 .loginHeaderBox {
   margin: 0;
   display: inline-block;
   //width: 100%;
-  text-align:right;
+  text-align: right;
+  margin-top: 10px;
+
   .pull-right;
-  div {
+  >*{
+    vertical-align: middle;
     display: inline-block;
     margin-right: 10px;
+    >*{
+      display: inline-block;
+      vertical-align: middle;
+    }
+  }
+  span.entypo{
+    vertical-align: sub;
+  }
+  span.user{
+    background: url(img/user.svg) no-repeat center center;
+    background-size: 35px 35px;
+    height: 35px;
+    width: 35px;
+  }
+  button {
+    border: none;
+    cursor: pointer;
+    background-color: transparent;
+  }
+  a {
+    color: white;
+    cursor: pointer;
+    overflow: hidden;
+    background-color: transparent;
+    &:hover {
+      text-decoration: none;
+    }
+    &:focus {
+      text-decoration: none;
+    }
   }
 }
 
-@media screen and (min-width:880px) {
-  .loginHeaderBox {
-    margin-top: 36px;
-  }
+/* NOTIFICATIONS */
+
+.notifications .messages {
+  display:none;
+  position: absolute;
+  top:50px;
+  right:0px;
+  width:280px;
+  max-width:280px;
+  max-height:300px;
+  overflow: auto;
 }
-@media screen and (max-width:880px) {
-  .loginHeaderBox {
-    //margin-top: 40px;
-    width: 100px;
-  }
+
+.messagesArrow {
+  content:'.';
+  display:none;
+  position:absolute;
+  margin-left:-10px;
+  top:30px;
+  right:130px;
+  width:0;
+  height:0;
+  color:transparent;
+  border:10px solid black;
+  border-color:transparent transparent white;
+}
+
+.notifications .messages:before {
+  content:'.';
+  display:block;
+  position:absolute;
+  margin-left:-10px;
+  left:50%;
+  top:-18px;
+  width:0;
+  height:0;
+  color:transparent;
+  border:10px solid black;
+  border-color:transparent transparent white;
+}
+
+.badge-notify{
+  background:red;
+  position:relative;
+  top: -15px;
+  right: -35px;
 }
-@media screen and (max-width:610px) {
-  .loginHeaderBox {
-    //margin-top: 40px;
-    width: 100%;
+
+.notifications .messages .message {
+  display:block;
+  position:relative;
+  padding:10px;
+  background-color:white;
+  text-decoration:none;
+  a {
+    font-weight: bold;
+    text-decoration: underline;
   }
+}
+
+.notifications .messages .message + .message {
+  border-top:1px solid #e0e0e0;
+}
+
+.icon-notif{
+  margin-right: 10px;
+}
+
+.no-margin-right{
+ margin-right: 0;
+}
+
+.bell-notif{
+  margin-right: 10px;
+}
+
+.header-icon{
+  font-size: 18px;
+}
+
+.logoutBT{
+  margin-right: -20px;
+}
+
+.no-outline{
+  outline: 0;
+}
+
+.unreaded-notif {
+  background-color: #EDEDED !important;
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/styles/popover.less
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/styles/popover.less b/falcon-ui/app/css/styles/popover.less
new file mode 100644
index 0000000..4218bc2
--- /dev/null
+++ b/falcon-ui/app/css/styles/popover.less
@@ -0,0 +1,230 @@
+/**
+ * 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.
+ */
+@popover-bg-color: #fff;
+@popover-border-color: #d2d2d2;
+
+@popover-triangle-size: 11px;
+@popover-triangle-color: @popover-bg-color;
+@popover-triangle-border-color: @popover-border-color;
+
+.ns-popover-list-theme {
+  box-sizing: border-box;
+  border: solid 1px @popover-border-color;
+  border-radius: 3px;
+  z-index: 100;
+  background-color: #fff;
+  -webkit-box-shadow: 0 0.3125rem 0.625rem rgba(0,0,0,0.2);
+  -moz-box-shadow: 0 0.3125rem 0.625rem rgba(0,0,0,0.2);
+  box-shadow: 0 0.3125rem 0.625rem rgba(0,0,0,0.2);
+
+  ul, .list {
+    padding: 0;
+    margin: 0.625rem 0;
+    display: block;
+  }
+
+  li, .list-item {
+    list-style-type: none;
+
+    a {
+      padding: 0.1875rem 0.625rem;
+      display: block;
+
+      &:hover {
+        background-color: #f5f5f5;
+      }
+    }
+  }
+}
+
+// @mixins
+//
+// We use this to create equilateral triangles
+// @triangle-size - Used to set border-size. No default, set a px or em size.
+// @triangle-color - Used to set border-color which makes up triangle. No default
+// @triangle-direction - Used to determine which direction triangle points. Options: top, bottom, left, right
+.triangle(@triangle-direction,
+  @triangle-size:@popover-triangle-size,
+  @triangle-color:@popover-triangle-color,
+  @triangle-border-color:@popover-triangle-border-color) {
+  content: "";
+  display: block;
+  width: 0;
+  height: 0;
+  border: solid @triangle-size;
+  border-color: transparent;
+  position: absolute;
+
+  &:after {
+    content: " ";
+    display: block;
+    width:0;
+    height:0;
+    border: solid 10px;
+    border-color: transparent;
+    position: absolute;
+  }
+
+  & when (@triangle-direction = "top") {
+    border-top-color: @triangle-border-color;
+    left:50%;
+    bottom: -@triangle-size;
+    margin-left: -@triangle-size;
+
+    &:after {
+      border-top-color: @triangle-color;
+      border-bottom-width: 0;
+      bottom: 1px;
+      margin-left: -10px;
+    }
+  }
+
+  & when (@triangle-direction = "bottom") {
+    border-bottom-color: @triangle-border-color;
+    left:50%;
+    top: -@triangle-size;
+    margin-left: -@triangle-size;
+
+    &:after {
+      border-bottom-color: @triangle-color;
+      border-top-width: 0;
+      top: 1px;
+      margin-left: -10px;
+    }
+  }
+
+  & when (@triangle-direction = "left") {
+    border-left-color: @triangle-border-color;
+    top:50%;
+    right: -@triangle-size;
+    margin-top: -@triangle-size;
+
+    &:after {
+      border-left-color: @triangle-color;
+      border-right-width: 0;
+      right: 1px;
+      bottom: -10px;
+    }
+  }
+
+  & when (@triangle-direction = "right") {
+    border-right-color: @triangle-border-color;
+    top:50%;
+    left: -@triangle-size;
+    margin-top: -@triangle-size;
+
+    &:after {
+      border-right-color: @triangle-color;
+      border-left-width: 0;
+      left: 1px;
+      bottom: -10px;
+    }
+  }
+}
+
+.ns-popover-tooltip-theme {
+  box-sizing: border-box;
+  z-index: 100;
+  background-color: transparent;
+
+  .ns-popover-tooltip {
+    box-sizing: border-box;
+    border: solid 1px @popover-border-color;
+    border-radius: 3px;
+    z-index: 100;
+    background-color: #fff;
+    padding: 0.5625rem 0.875rem;
+    -webkit-box-shadow: 0 0.3125rem 0.625rem rgba(0,0,0,0.2);
+    -moz-box-shadow: 0 0.3125rem 0.625rem rgba(0,0,0,0.2);
+    box-shadow: 0 0.3125rem 0.625rem rgba(0,0,0,0.2);
+    margin: 10px;
+
+    h5 {
+      font-weight: bold;
+      font-size: 16px;
+      color: #777;
+    }
+
+    ul {
+      padding: 0;
+      margin: 0.625rem 0;
+      display: block;
+    }
+
+    li {
+      list-style-type: none;
+
+      a {
+        padding: 0.1875rem 0.625rem;
+        display: block;
+
+        &:hover {
+          background-color: #f5f5f5;
+        }
+      }
+    }
+  }
+
+  &.ns-popover-bottom-placement {
+    .triangle {
+      .triangle("bottom");
+    }
+  }
+
+  &.ns-popover-top-placement {
+    .triangle {
+      .triangle("top");
+    }
+  }
+
+  &.ns-popover-right-placement {
+    .triangle {
+      .triangle("right");
+    }
+  }
+
+  &.ns-popover-left-placement {
+    .triangle {
+      .triangle("left");
+    }
+  }
+
+  &.ns-popover-left-align {
+    .ns-popover-tooltip {
+      margin-left: 0;
+    }
+  }
+
+  &.ns-popover-right-align {
+    .ns-popover-tooltip {
+      margin-right: 0;
+    }
+  }
+
+  &.ns-popover-top-align {
+    .ns-popover-tooltip {
+      margin-top: 0;
+    }
+  }
+
+  &.ns-popover-bottom-align {
+    .ns-popover-tooltip {
+      margin-bottom: 0;
+    }
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/styles/progress-bar.less
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/styles/progress-bar.less b/falcon-ui/app/css/styles/progress-bar.less
index 21b03d8..5f0ad01 100644
--- a/falcon-ui/app/css/styles/progress-bar.less
+++ b/falcon-ui/app/css/styles/progress-bar.less
@@ -23,42 +23,56 @@
   overflow: hidden;
   padding: 10px 35px;
   .entypo {
-    font-size: 37px;
-    line-height: 0;
+    /*float: none!important;
+    position: absolute;
+    margin: 0!important;
+    top:0;
+    left:0;*/
+   /* line-height: 36px;
+    height: 36px;
+    width: 36px;*/
+
+    color: white;
+    z-index:2;
+    position: relative;
+    display: none;
+    font-size: 36px;
+
+    margin: -24px -15px 0 0!important;
   }
   div {
     .transition(background-color, 0.5s, ease-out);
     background-color: @gray-light;
     height: 10px;
     border-top:2px solid @gray-light;
-    border-bottom:2px solid @gray-light;    
+    border-bottom:2px solid @gray-light;
     span {
       display: block;
       width: 55px;
       span { display: none;}
       &:first-child {
         float: left;
-        margin: -10px 0 0 -17px;     
+        margin: -10px 0 0 -17px;
         h6 {
           font-weight: bold;
         }
       }
       &:last-child {
         float: right;
-        margin: -10px -15px 0 0;    
+        margin: -10px -15px 0 0;
         div {
           background-color: @gray-light;
-        } 
-      } 
+        }
+      }
       h6 {
         margin: 0;
         font-size: 10px;
       }
-    }   
+    }
     div {
       display: inline-block;
-      border-radius: 30px;      
-      line-height: 27px;    
+      border-radius: 30px;
+      line-height: 27px;
       width: 30px;
       height: 30px;
       text-align: center;
@@ -80,14 +94,8 @@
         background-color: @gray-dark;
         border-color: @gray-dark;
         span {
-          &:first-child {           
-            span {
-              color: white;
-              display: block;           
-              z-index:2;
-              position: relative;
-              margin-top: -13px;
-            }
+          &:first-child {
+            .entypo { display: block;}
             div {
               color: @gray-dark;
               border-color: @gray-dark;
@@ -103,7 +111,7 @@
             h6 {
               font-weight: bold;
             }
-          }       
+          }
         }
       }
     }
@@ -111,14 +119,6 @@
 }
 .feedProgressBox {
   font-size: 14px;
-  .entypo {     
-    color: white;                 
-    z-index:2;
-    position: relative;
-    display: none;
-    font-size: 36px;
-    margin: -13px -15px 0 0!important;  
-  }  
   .progressBar {
     padding: 10px 6% 0 6%;
     >div {
@@ -127,18 +127,18 @@
         width: 24%;
         margin: -11px 0 0 0;
         &:first-child {
-          margin: -10px 0 0 -4%;  
+          margin: -10px 0 0 -4%;
           h6 {
             font-weight: normal;
-          }  
+          }
         }
         &:last-child {
-          margin: -10px -21% 0 0;    
+          margin: -10px -21% 0 0;
         }
-        div {       
+        div {
           background-color: @gray-dark;
-        } 
-      }       
+        }
+      }
       div {
         border-color: @gray-light;
       }
@@ -150,32 +150,32 @@
   }
   &.general {
     .fir {
-      background-color: @gray-dark;    
-      & + h6 { font-weight: bold!important; }   
+      background-color: @gray-dark;
+      & + h6 { font-weight: bold!important; }
     }
     .sec, .thi, .fou, .fif {
       background-color: @gray-light;
-    }  
-    
+    }
+
   }
   &.properties {
-    .fir {   
-      .entypo {display: block;}      
+    .fir {
+      .entypo {display: block;}
       border-color: @gray-dark;
       color: @gray-dark;
     }
-    .sec + h6 { font-weight: bold; }  
+    .sec + h6 { font-weight: bold; }
     .fir, .sec {
-      background-color: @gray-dark;  
+      background-color: @gray-dark;
     }
     .thi, .fou, .fif {
-      background-color: @gray-light;     
+      background-color: @gray-light;
     }
   }
   &.location {
-    .thi + h6 { font-weight: bold; }     
+    .thi + h6 { font-weight: bold; }
     .fir, .sec {
-      .entypo {display: block;}      
+      .entypo {display: block;}
       border-color: @gray-dark;
       color: @gray-dark;
     }
@@ -187,9 +187,9 @@
     }
   }
   &.clusters {
-    .fou + h6 { font-weight: bold; }  
+    .fou + h6 { font-weight: bold; }
     .fir, .sec, .thi {
-      .entypo {display: block;}      
+      .entypo {display: block;}
       border-color: @gray-dark;
       color: @gray-dark;
     }
@@ -201,9 +201,9 @@
     }
   }
   &.summary {
-    .fif + h6 { font-weight: bold; }  
+    .fif + h6 { font-weight: bold; }
     .fir, .sec, .thi, .fou {
-      .entypo {display: block;}      
+      .entypo {display: block;}
       border-color: @gray-dark;
       color: @gray-dark;
     }
@@ -214,16 +214,10 @@
 }
 .processProgressBox {
   font-size: 14px;
-  .entypo {
-    color: white;
-    z-index:2;
-    position: relative;
-    display: none;
-    font-size: 36px;
-    margin: -13px -15px 0 0!important;
-  }
+
 
   .progressBar {
+
     padding: 10px 6% 0 6%;
     >div {
       >span {

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/styles/server-messages.less
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/styles/server-messages.less b/falcon-ui/app/css/styles/server-messages.less
index b606810..0ab7d13 100644
--- a/falcon-ui/app/css/styles/server-messages.less
+++ b/falcon-ui/app/css/styles/server-messages.less
@@ -18,13 +18,15 @@
 //------server messages ------//
 .alert {
   position: relative;
-  margin:5px 0;
+  display: inline-block;
+  margin:5px auto 0;
+  padding: 5px 20px 5px 10px;
   .box-shadow(~"1px 1px 5px black");
   border: 1px solid white;
   opacity: 1;
   span {
     display: inline-block;
-    margin: auto 5px;   
+    margin: auto 5px;
   }
   .entypo {
     position: absolute;
@@ -32,19 +34,35 @@
     right:5px;
     cursor: pointer;
   }
+  &.bg-danger {
+    border: 1px solid darken(@brand-danger, 10%);
+  }
+  &.bg-success {
+    border: 1px solid darken(@brand-success, 10%);
+  }
+  &.bg-warning {
+    border: 1px solid darken(@brand-warning, 10%);
+  }
+  a {
+    text-decoration: underline;
+    cursor: pointer;
+  }
 }
-.alert.repeat-animation.ng-enter, 
-.alert.repeat-animation.ng-leave{ 
- // .transition (all, 0.3s, ease); 
-} 
- 
+.repeat-animation {
+  text-align: center;
+}
+.repeat-animation.ng-enter,
+.repeat-animation.ng-leave{
+ // .transition (all, 0.3s, ease);
+}
+
 //.alert.repeat-animation.ng-leave.repeat-animation.ng-leave-active,
-.alert.repeat-animation.ng-enter {   
+.repeat-animation.ng-enter {
     .messageAnimation;
 }
- 
-.alert.repeat-animation.ng-enter.repeat-animation.ng-enter-active, 
-.alert.repeat-animation.ng-leave {
+
+.repeat-animation.ng-enter.repeat-animation.ng-enter-active,
+.repeat-animation.ng-leave {
     //.messageAnimation;
 }
 
@@ -54,7 +72,10 @@
 @keyframes messageAnimation { 0% { opacity: 0;} 20% { opacity: 1;} 40% { opacity: 0;}60% { opacity: 1;} 80% { opacity: 0;} 100% { opacity: 1;} }
 
 .messageAnimation {
-  .animation(messageAnimation, 1.5s, ease-in-out, 1); 
+  .animation(messageAnimation, 1.5s, ease-in-out, 1);
 }
 
- 
\ No newline at end of file
+.repeat-leyend{
+  text-align: center;
+  margin: 10px 0;
+}

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/variables.less
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/variables.less b/falcon-ui/app/css/variables.less
index f9fad79..f1c81ab 100644
--- a/falcon-ui/app/css/variables.less
+++ b/falcon-ui/app/css/variables.less
@@ -37,7 +37,7 @@
 @brand-warning:         #f0ad4e;
 @brand-danger:          #d9534f;
 
-@headerNavBG: #5fa33e;
+@headerNavBG: #69BE28;
 //== Scaffolding
 //
 //## Settings for some of the most global styles.
@@ -57,7 +57,7 @@
 //
 //## Font, line-height, and color for body text, headings, and more.
 
-@font-family-sans-serif:  "Open Sans", Helvetica, Arial, sans-serif;
+@font-family-sans-serif:  cabin, Arial, sans-serif;
 @font-family-serif:       Georgia, "Times New Roman", Times, serif;
 //** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.
 @font-family-monospace:   Menlo, Monaco, Consolas, "Courier New", monospace;

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/authenticating.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/authenticating.html b/falcon-ui/app/html/authenticating.html
new file mode 100644
index 0000000..8706322
--- /dev/null
+++ b/falcon-ui/app/html/authenticating.html
@@ -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.
+ */
+-->
+
+<form name="loginForm" ng-submit="loggUser(loginForm)" novalidate id="loginForm">
+
+  <div class="col-sm-24 dashboardBox login" ng-class="{showValidationStyle:showLoginVal.show}">
+    <div class="row">
+      <div class="col-sm-6"></div>
+      <div class="col-sm-12">
+
+        <div class="col-sm-15 detailsBox centered">
+          <h3>Authenticating...</h3>
+        </div>
+
+      </div>
+      <div class="col-sm-6"></div>
+    </div>
+  </div>
+
+</form>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/cluster/clusterFormGeneralStepTpl.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/cluster/clusterFormGeneralStepTpl.html b/falcon-ui/app/html/cluster/clusterFormGeneralStepTpl.html
index 2ef813f..8d76c90 100644
--- a/falcon-ui/app/html/cluster/clusterFormGeneralStepTpl.html
+++ b/falcon-ui/app/html/cluster/clusterFormGeneralStepTpl.html
@@ -17,76 +17,84 @@
  * limitations under the License.
  */
 -->
-<form name="clusterForm">
-  <div class="col-sm-24">
+<form novalidate name="clusterForm" id="clusterGeneralStep">
+  <div class="col-xs-24">
     <label class="light">Name</label>
-    <input type="text" class="form-control nameInput" ng-pattern="validations.patterns.name"
-           ng-model="clusterEntity.clusterModel.cluster._name" ng-required="true"
-           ng-keydown="validations.acceptNoSpaces($event)"
-           check-name="{type:'cluster', check:true}" ng-class="{fakeInvalid:!validations.nameAvailable}"
-           ng-disabled="xmlPreview.edit" />
-           <!--check-type="cluster" check-name-flag="nameValid" check="true"-->
+    <input type="text" class="form-control nameInput"
+	ng-pattern="validations.patterns.name"
+        ng-model="clusterEntity.clusterModel.cluster._name" ng-required="true"
+        ng-keydown="validations.acceptNoSpaces($event)"
+        check-name="{type:'cluster', check:true}" ng-class="{fakeInvalid:!validations.nameAvailable}"
+        ng-disabled="xmlPreview.edit" />
+        <!--check-type="cluster" check-name-flag="nameValid" check="true"-->
 
   </div>
-  <div class="col-sm-12">
+  <div class="col-xs-12">
     <label class="light">Colo</label>
-    <input type="text" class="form-control" ng-pattern="validations.patterns.freeText"
-           ng-required="true" ng-disabled="xmlPreview.edit"
-           ng-model="clusterEntity.clusterModel.cluster._colo" validation-message="{{validations.messages.colo}}"/>
+    <input type="text" class="form-control"
+	ng-pattern="validations.patterns.freeText"
+        ng-required="true" ng-disabled="xmlPreview.edit"
+        ng-model="clusterEntity.clusterModel.cluster._colo" validation-message="{{validations.messages.colo}}"/>
   </div>
-  <div class="col-sm-12">
+  <div class="col-xs-12">
     <label class="light">Description</label>
-    <input type="text" class="form-control" ng-pattern="validations.patterns.freeText"
-           ng-required="true" ng-disabled="xmlPreview.edit" validation-message="{{validations.messages.description}}"
-           ng-model="clusterEntity.clusterModel.cluster._description" />
+    <input type="text" class="form-control"
+	ng-pattern="validations.patterns.freeText"
+        ng-required="true" ng-disabled="xmlPreview.edit" validation-message="{{validations.messages.description}}"
+        ng-model="clusterEntity.clusterModel.cluster._description" />
   </div>
-  
+
   <div class="col-xs-24">
     <label class="light">Tags</label>
   </div>
-  
+
   <div class="col-xs-24">
-    <div ng-repeat="tag in tagsArray" class="row dynamic-table-spacer">   
+    <div ng-repeat="tag in tagsArray" class="row dynamic-table-spacer">
       <div class="col-xs-10">
         <input type="text" class="form-control" ng-model="tag.key" ng-disabled="xmlPreview.edit" placeholder="key"
-               ng-pattern="validations.patterns.alpha" ng-required="tag.value"/>
+               ng-pattern="validations.patterns.alpha" ng-required="tag.value" validation-optional-message="{{validations.messages.key}}"/>
       </div>
       <div class="col-xs-11">
         <input type="text" class="form-control" ng-disabled="xmlPreview.edit" placeholder="value"
-               ng-model="tag.value" ng-pattern="validations.patterns.alpha" ng-required="tag.key"/>
+               ng-model="tag.value" ng-pattern="validations.patterns.alpha" ng-required="tag.key" validation-optional-message="{{validations.messages.value}}"/>
       </div>
       <div class="col-xs-3">
-        <div class="btn btn-default btn-xs" ng-click="removeTag($index)" ng-disabled="xmlPreview.edit" ng-if="$index>0">
+        <button type="button" class="btn btn-default btn-xs" ng-click="removeTag($index)" ng-disabled="xmlPreview.edit" ng-if="$index>0">
           <span class="entypo minus"></span> delete
-        </div>
+        </button>
       </div>
-    </div>   
+    </div>
   </div>
 
-  <div class="col-sm-24 dynamic-table-spacer">
-    <div class="btn btn-default btn-xs" ng-click="addTag()" ng-disabled="xmlPreview.edit">
+  <div class="col-xs-24 mt5">
+    <button type="button" class="btn btn-default btn-xs" ng-click="addTag()" ng-disabled="xmlPreview.edit">
       <span class="entypo plus"></span> add tag
-    </div>
+    </button>
   </div>
-  <h4 class="col-sm-24"> Access Control List </h4>
-  <div class="col-sm-8">
+  <h4 class="col-xs-24"> Access Control List </h4>
+  <div class="col-xs-8">
     <label class="light">Owner</label>
-    <input type="text" class="form-control" ng-disabled="xmlPreview.edit" ng-pattern="validations.patterns.unixId"
+    <input type="text" class="form-control" ng-disabled="xmlPreview.edit" validation-message="{{validations.messages.acl.owner}}"
+           ng-required="true"
+           ng-pattern="validations.patterns.unixId"
            ng-model="clusterEntity.clusterModel.cluster.ACL._owner"/>
   </div>
-  <div class="col-sm-8">
+  <div class="col-xs-8">
     <label class="light">Group</label>
-    <input type="text" class="form-control" ng-disabled="xmlPreview.edit" ng-pattern="validations.patterns.unixId"
+    <input type="text" class="form-control" ng-disabled="xmlPreview.edit" validation-message="{{validations.messages.acl.group}}"
+           ng-required="true"
+           ng-pattern="validations.patterns.unixId"
            ng-model="clusterEntity.clusterModel.cluster.ACL._group"/>
   </div>
-  <div class="col-sm-8">
+  <div class="col-xs-8">
     <label class="light">Permissions</label>
-    <input type="text" class="form-control" ng-disabled="xmlPreview.edit"
+    <input type="text" class="form-control" ng-disabled="xmlPreview.edit" validation-message="{{validations.messages.acl.permission}}"
+           ng-required="true"
            ng-pattern="validations.patterns.unixPermissions"
            ng-model="clusterEntity.clusterModel.cluster.ACL._permission"/>
   </div>
-  
-  <h4 class="col-sm-24"> Interfaces </h4> 
+
+  <h4 class="col-xs-24"> Interfaces </h4>
   <label class="col-xs-4">
     Type
   </label>
@@ -96,14 +104,14 @@
   <label class="col-xs-4">
     Version
   </label>
-  <div id="interfaces-detail" class="col-sm-24"
+  <div id="interfaces-detail" class="col-xs-24"
        ng-repeat="_interface in clusterEntity.clusterModel.cluster.interfaces.interface">
     <div class="row">
       <div class="col-xs-4">
-        <label>
+
           <input type="checkbox" ng-checked="registry.check" ng-model="registry.check"
                  ng-if="_interface._type === 'registry'" ng-disabled="xmlPreview.edit"/> {{_interface._type}}
-        </label>
+
       </div>
       <div class="col-xs-16">
         <input type="text" class="form-control" ng-pattern="validations.patterns.osPath"
@@ -123,25 +131,28 @@
   <div ng-repeat="property in clusterEntity.clusterModel.cluster.properties.property">
     <div class="col-xs-7 dynamic-table-spacer">
       <input type="text" class="form-control" ng-model="property._name"
-             ng-pattern="validations.patterns.alpha" ng-disabled="xmlPreview.edit"
+             validation-optional-message="{{validations.messages.name}}"
+             ng-disabled="xmlPreview.edit"
              ng-required="property._value" placeholder="name" />
     </div>
     <div class="col-xs-15 dynamic-table-spacer">
-      <input type="text" class="form-control" ng-model="property._value" ng-pattern="validations.patterns.alpha"
-             ng-disabled="xmlPreview.edit" ng-required="property._name" placeholder="value" />
+      <input type="text" class="form-control" ng-model="property._value"
+             validation-optional-message="{{validations.messages.value}}"
+             ng-disabled="xmlPreview.edit"
+             ng-required="property._name" placeholder="value" />
     </div>
     <div class="col-xs-2 dynamic-table-spacer">
-      <div class="btn btn-default btn-xs" ng-click="removeProperty($index)" ng-if="$index > 0"
+      <button type="button" class="btn btn-default btn-xs" ng-click="removeProperty($index)" ng-if="$index > 0"
            ng-disabled="xmlPreview.edit">
         <span class="entypo minus"></span> delete
-      </div>
+      </button>
     </div>
     <div class="clearfix hidden-md"></div>
   </div>
   <div class="col-xs-24 dynamic-table-spacer">
-    <div class="btn btn-default btn-xs" ng-click="addProperty()" ng-disabled="xmlPreview.edit">
+    <button type="button" class="btn btn-default btn-xs" ng-click="addProperty()" ng-disabled="xmlPreview.edit">
       <span class="entypo plus"></span> add property
-    </div>
+    </button>
   </div>
 
   <h4 class="col-xs-24"> Location </h4>
@@ -153,49 +164,52 @@
         {{location._name}}
       </div>
       <div class="col-xs-15 dynamic-table-spacer">
-        <input type="text" class="form-control" ng-model="location._path" ng-pattern="validations.patterns.osPath"
+        <input id="location.{{location._name}}" type="text" class="form-control" ng-model="location._path" ng-pattern="validations.patterns.osPath"
                ng-disabled="xmlPreview.edit" ng-required="true" validation-message="{{validations.messages.location}}"/>
       </div>
-      <div class="col-xs-2 dynamic-table-spacer"></div>     
+      <div class="col-xs-2 dynamic-table-spacer"></div>
       <div class="clearfix hidden-md"></div>
     </div>
 
     <div class="row" ng-if="location._name !== 'staging' && location._name !== 'working' && location._name !== 'temp'">
       <div class="col-xs-7 dynamic-table-spacer">
-        <input type="text" class="form-control" ng-model="location._name" ng-pattern="validations.patterns.alpha"
+        <input type="text" class="form-control" ng-model="location._name"
+               validation-optional-message="{{validations.messages.name}}"
+               ng-pattern="validations.patterns.alpha"
                ng-disabled="xmlPreview.edit" ng-required="location._path" placeholder="name" />
       </div>
-      <div class="col-xs-15 dynamic-table-spacer">   
-        <input type="text" class="form-control" ng-model="location._path" ng-pattern="validations.patterns.osPath"
+      <div class="col-xs-15 dynamic-table-spacer">
+        <input type="text" class="form-control" ng-model="location._path"
+               validation-optional-message="{{validations.messages.path}}"
+               ng-pattern="validations.patterns.osPath"
                ng-disabled="xmlPreview.edit" ng-required="location._name" placeholder="path" />
       </div>
       <div class="col-xs-2 dynamic-table-spacer">
-        <div class="btn btn-default btn-xs" ng-click="removeLocation($index)" ng-if="$index>3"
+        <button class="btn btn-default btn-xs" ng-click="removeLocation($index)" ng-if="$index>3"
              ng-disabled="xmlPreview.edit" >
           <span class="entypo minus"></span> delete
-        </div>
-      </div>    
+        </button>
+      </div>
       <div class="clearfix hidden-md"></div>
     </div>
-    
+
   </div>
 
   <div class="col-xs-24 dynamic-table-spacer">
-    <div class="btn btn-default btn-xs" ng-click="addLocation()" ng-disabled="xmlPreview.edit">
+    <button type="button" class="btn btn-default btn-xs" ng-click="addLocation()" ng-disabled="xmlPreview.edit">
       <span class="entypo plus"></span> add location
-    </div>
+    </button>
   </div>
-  <div class="col-xs-24">
-    <div class="row mt20">
-      <div class="btn btn-default col-xs-6 mt10" ui-sref="main">
-        Cancel
-      </div>
-      <div class="btn btn-default col-xs-6 pull-right mt10" ng-disabled="xmlPreview.edit"
-           ng-click="goSummaryStep(clusterForm.$invalid)">
-        Next
-      </div>
+  <div class="col-xs-24 mt20">
+
+    <button id="cluster.step1" class="btn nextBtn pull-right" ng-disabled="xmlPreview.edit || buttonSpinners.show"
+         ng-click="goSummaryStep(clusterForm.$invalid)">
+      Next <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
+    </button>
+    <a class="pull-right" ui-sref="main">
+      Cancel
+    </a>
 
-    </div>
   </div>
 
 </form>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/cluster/clusterFormSummaryStepTpl.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/cluster/clusterFormSummaryStepTpl.html b/falcon-ui/app/html/cluster/clusterFormSummaryStepTpl.html
index d13b3f5..a7caad9 100644
--- a/falcon-ui/app/html/cluster/clusterFormSummaryStepTpl.html
+++ b/falcon-ui/app/html/cluster/clusterFormSummaryStepTpl.html
@@ -17,7 +17,7 @@
  * limitations under the License.
  */
 -->
-<div class="row clusterSummaryRow">
+<div class="row clusterSummaryRow" id="clusterSummaryStep">
   <div class="col-sm-24">
     <label>Name</label>: {{clusterEntity.clusterModel.cluster._name}}
   </div>
@@ -50,7 +50,7 @@
     Properties
   </h4>
 
-  <div class="col-sm-24" ng-if="clusterEntity.clusterModel.cluster.properties.property.length > 0" 
+  <div class="col-sm-24" ng-if="clusterEntity.clusterModel.cluster.properties.property.length > 0"
     ng-repeat="property in clusterEntity.clusterModel.cluster.properties.property">
     <label>{{property._name}}</label>: {{property._value}}
   </div>
@@ -65,13 +65,23 @@
 </div>
 
 
-<div class="row clusterSummaryRow mt20">
-  <div class="btn btn-default col-xs-6" ui-sref="forms.cluster.general" ng-click="goGeneralStep()">
-    Previous
-  </div>
+<div class="row clusterSummaryRow">
+  <div class="col-xs-24 mt20">
+    <button id="cluster.backToStep1"
+         class="btn prevBtn"
+         ui-sref="forms.cluster.general"
+         ng-click="goGeneralStep()"
+         ng-disabled="buttonSpinners.backShow">
+      Previous <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
+    </button>
 
-  <div class="btn btn-default col-xs-6 pull-right" ng-click="saveCluster()" ng-disabled="xmlPreview.edit">
-    Save
-  </div>
+    <button id="cluster.step2" class="btn btn-default nextBtn pull-right"
+         ng-click="saveCluster()" ng-disabled="xmlPreview.edit || buttonSpinners.show">
+      Save <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
+    </button>
 
+    <a class="pull-right" ui-sref="main">
+      Cancel
+    </a>
+  </div>
 </div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/cluster/clusterFormTpl.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/cluster/clusterFormTpl.html b/falcon-ui/app/html/cluster/clusterFormTpl.html
index 4da4cf6..1a65172 100644
--- a/falcon-ui/app/html/cluster/clusterFormTpl.html
+++ b/falcon-ui/app/html/cluster/clusterFormTpl.html
@@ -17,55 +17,67 @@
  * limitations under the License.
  */
 -->
-<div class="col-sm-24 clusterForm">
-  <div class="col-sm-22 col-sm-offset-2">
+<div class="col-xs-22 col-xs-offset-1 clusterForm" id="clusterForm">
+  <div class="col-xs-24">
     <div class="row">
-      <h3 class="col-sm-24">
-        New Cluster
+
+      <h3 id="cluster.title" class="col-xs-24">
+        <span class="entypo archive icon-lg"></span> New Cluster
       </h3>
-      <div class="col-sm-15 detailsBox">
-        <div class="clusterProgressBox" ng-class="{summary:secondStep===true}">        
-          <div class="progressBar col-md-24">
-            <div>
+
+      <div ng-class="{'col-xs-12' : propsOpen, 'col-xs-20' : !propsOpen}">
+        <div class="detailsBox">
+          <div class="clusterProgressBox" ng-class="{summary:secondStep===true}">
+            <div class="progressBar col-xs-24">
+              <div>
               <span>
-                <div>1<span class="entypo check"></span></div>              
+                <div>1<span class="entypo check"></span></div>
                 <h6>General</h6>
               </span>
               <span>
                 <div>2</div>
                 <h6>Summary</h6>
               </span>
-            </div>           
+              </div>
+            </div>
           </div>
-        </div>      
-        <div class="row">
-          <div class="col-xs-offset-1 col-xs-22" ui-view></div>
-        </div>        
+          <div class="row">
+            <div class="col-xs-offset-1 col-xs-22" ui-view></div>
+          </div>
+        </div>
       </div>
 
-      <div class="col-sm-8 detailsBox col-sm-offset-1">
-        <div class="row">
-         
-          <h5 class="col-xs-13 col-xs-offset-1 noSpecial">XML Preview</h5>  
-    
-          <div class="col-xs-9">
-            <div class="btn btn-default btn-xs pull-right" ng-click="xmlPreview.editXML()" ng-class="{'btn-warning':xmlPreview.edit}">
-              Edit XML
+      <div ng-class="{'col-xs-12' : propsOpen, 'col-xs-4' : !propsOpen}">
+        <div class="detailsBox">
+          <div class="row">
+
+            <div class="col-xs-13 col-xs-offset-1 noSpecial">
+              <h5><i class="pointer glyphicon" ng-click="propsOpen = !propsOpen" ng-class="propsOpen ? 'glyphicon-minus-sign':'glyphicon-plus-sign'"></i> XML Preview</h5>
             </div>
-          </div>
-        
-          <div class="col-xs-24">
-            <div class="row">
-              <div class="col-xs-22 col-xs-offset-1">
-                <textarea ng-model="prettyXml" rows="35" class="form-control" ng-disabled="!xmlPreview.edit">
-                </textarea>
+
+            <div ng-if="propsOpen" class="col-xs-9">
+              <button type="button"
+                      id="cluster.editXML"
+                      class="btn btn-default btn-xs pull-right"
+                      ng-click="xmlPreview.editXML()"
+                      ng-class="{'btn-warning':xmlPreview.edit}">
+                <div ng-if="!xmlPreview.edit">Edit XML</div>
+                <div ng-if="xmlPreview.edit">Finish</div>
+              </button>
+            </div>
+
+            <div ng-show="propsOpen" class="col-xs-24">
+              <div class="row">
+                <div class="col-xs-22 col-xs-offset-1">
+                  <textarea ng-model="prettyXml" elastic class="form-control prettyXml" ng-disabled="!xmlPreview.edit"></textarea>
+                </div>
               </div>
             </div>
+
           </div>
-          
         </div>
       </div>
-      
+
     </div>
   </div>
 </div>
\ No newline at end of file


[11/22] falcon git commit: FALCON-1315 Update falcon ui for HiveDR, secure clusters and bug fixes. Contributed by Armando Reyna/Venkat Ranganathan.

Posted by so...@apache.org.
http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/feed/feedFormClustersStepTpl.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/feed/feedFormClustersStepTpl.html b/falcon-ui/app/html/feed/feedFormClustersStepTpl.html
index 8d2322f..b33b7f3 100644
--- a/falcon-ui/app/html/feed/feedFormClustersStepTpl.html
+++ b/falcon-ui/app/html/feed/feedFormClustersStepTpl.html
@@ -17,37 +17,41 @@
  * limitations under the License.
  */
 -->
-<form name="feedForm">
+<form name="feedForm" novalidate id="feedFormClusterStep">
+  <button class="hidden" ng-click="goNext(feedForm.$invalid, 'forms.feed.summary')" ></button>
   <div ng-repeat="cluster in feed.clusters">
     <div class="row">
-      <h4 class="col-sm-24">{{capitalize(cluster.type)}} Cluster </h4>
+      <h4 class="col-xs-24">{{capitalize(cluster.type)}} Cluster </h4>
     </div>
 
     <div class="row detailsBox">
-      <div class="col-sm-offset-1 col-sm-22">
+      <div class="col-xs-offset-1 col-xs-22">
 
         <div class="row">
           <div class="col-xs-24">
             <select ng-model="cluster.name" validation-message="{{validations.messages.cluster}}"
-                    ng-required="true" class="col-sm-24 form-control padding0">
+                    ng-required="true" class="col-xs-24 form-control padding0" id="clusterNameSelect">
               <option value="" disabled selected style='display:none;'>-Select cluster-</option>
-              <option ng-repeat="clusterItem in clusterList">{{clusterItem.name}}</option>
+              <option id="cluster_" ng-repeat="clusterItem in clusterList">{{clusterItem.name}}</option>
             </select>
           </div>
-            
+
 
           <div class="col-xs-24 feedLocationNavBox nopointer">
             <h4 class="col-xs-7" ng-show="!feed.storage.fileSystem.active">Default Storage type</h4>
             <h4 class="col-xs-7" ng-show="feed.storage.fileSystem.active">Storage type</h4>
 
-            <div class="col-xs-17 feedLocationNav">
-              <div class="btn btn-default pull-right" ng-class="{active: feed.storage.catalog.active}">
+            <div class="col-xs-17 feedLocationNav disabled">
+              <button class="btn btn-default pull-right"
+                      ng-class="{active: feed.storage.catalog.active}"
+                      ng-disabled="true">
                 Catalog Storage
-              </div>
-              <div class="btn btn-default pull-right" ng-class="{active: feed.storage.fileSystem.active}">
+              </button>
+              <button class="btn btn-default pull-right"
+                      ng-class="{active: feed.storage.fileSystem.active}"
+                      ng-disabled="true">
                 File System
-              </div>
-              <div class="clearfix"></div>
+              </button>
             </div>
           </div>
 
@@ -60,51 +64,85 @@
                ng-show="feed.storage.fileSystem.active"
                ng-repeat="location in cluster.storage.fileSystem.locations">
             <label class="light">{{location.type}} path</label>
-            <input type="text" class="form-control" ng-model="location.path" ng-pattern="validations.patterns.osPath" />
+            <input type="text"
+                   placeholder="{{clusterLocationsPlaceHolders[location.type]}}"
+                   class="form-control"
+                   ng-model="location.path"
+                   validation-optional-message="{{validations.messages.path}}"
+                   ng-pattern="validations.patterns.osPath" />
           </div>
 
           <div class="col-xs-24 mb10" ng-show="feed.storage.catalog.active">
             <label class="light">Table uri</label>
-            <input type="text" class="form-control" ng-model="cluster.storage.catalog.catalogTable.uri" ng-pattern="validations.patterns.osPath"/>
+            <input type="text" class="form-control"
+                   ng-model="cluster.storage.catalog.catalogTable.uri"
+                   validation-optional-message="{{validations.messages.path}}"
+                   ng-pattern="validations.patterns.osPath"/>
           </div>
-
+          <div class="clearfix mb20"></div>
           <label class="col-xs-24"> Validity </label>
-
-          <div class="col-xs-12">
-           
-              <label class="light col-xs-24">Start</label>
-            
-              <div class="input-group input-group-xs">
-                <span class="input-group-addon btn btn-default entypo calendar" ng-click="openDatePicker($event, cluster.validity.start)"></span>
-                <input type="text" class="form-control" placeholder="Select start Date"
-                  datepicker-popup="{{dateFormat}}"
-                  ng-model="cluster.validity.start.date"
-                  is-open="cluster.validity.start.opened"
-                  ng-required="true">
-              </div>
-            
-          </div>
-          <div class="col-xs-12">
-            <timepicker class="timePicker" ng-model="cluster.validity.start.time" hour-step="1" minute-step="1" ></timepicker>
-          </div>
-          <div class="col-xs-12">
-           
-            <label class="light col-xs-24">End</label>
-           
-            <div class="input-group input-group-xs">
-              <span class="input-group-addon btn btn-default entypo calendar" ng-click="openDatePicker($event, cluster.validity.end)"></span>
-              <input type="text" class="form-control" placeholder="Select end Date"
-                     datepicker-popup="{{dateFormat}}"
-                     ng-model="cluster.validity.end.date"
-                     is-open="cluster.validity.end.opened"
-                     ng-required="true">
+          <div class="col-xs-24 validityBox">
+            <div class="startDateBox">
+              <label>Start
+                <input type="text"
+                       name="startDateInput"
+                       class="form-control dateInput"
+                       placeholder="mm/dd/yyyy"
+                       datepicker-popup="{{dateFormat}}"
+                       ng-model="cluster.validity.start.date"
+                       is-open="cluster.validity.start.opened"
+                       ng-click="openDatePicker($event, cluster.validity.start)"
+                       ng-change="constructDate()"
+                       ng-required="true"
+                       simple-date>
+              </label>
+              <label class="col-xs-24 custom-danger validationMessageGral"
+                     ng-if="!cluster.validity.start.date">
+                {{validations.messages.date.empty}}
+              </label>
+            </div>
+            <div class="startTimeBox">
+              <label>Time
+                <timepicker ng-change="constructDate()"
+                            ng-model="cluster.validity.start.time"
+                            hour-step="1"
+                            minute-step="1"
+                            show-meridian="true">
+                </timepicker>
+              </label>
+            </div>
+            <div class="endDateBox">
+              <label>End
+                <input type="text"
+                       name="startDateInput"
+                       class="form-control dateInput"
+                       placeholder="mm/dd/yyyy"
+                       datepicker-popup="{{dateFormat}}"
+                       ng-model="cluster.validity.end.date"
+                       is-open="cluster.validity.end.opened"
+                       ng-click="openDatePicker($event, cluster.validity.end)"
+                       ng-change="constructDate()"
+                       ng-required="true"
+                       min-date="cluster.validity.start.date"
+                       simple-date>
+              </label>
+              <label class="col-xs-24 custom-danger validationMessageGral"
+                     ng-if="!cluster.validity.end.date">
+                {{validations.messages.date.empty}}
+              </label>
+            </div>
+            <div class="endTimeBox">
+              <label>Time
+                <timepicker ng-change="constructDate()"
+                            ng-model="cluster.validity.end.time"
+                            hour-step="1"
+                            minute-step="1"
+                            show-meridian="true">
+                </timepicker>
+              </label>
             </div>
-          </div>
-          <div class="col-xs-12">
-            <timepicker class="timePicker" ng-model="cluster.validity.end.time" hour-step="1" minute-step="1" ></timepicker>
           </div>
 
-
           <label class="light col-xs-24"> Retention </label>
 
           <div class="col-xs-24 inlineInputsGroup">
@@ -122,31 +160,37 @@
           </div>
 
           <div class="row"  ng-if="cluster.type !== 'source'">
-            <div class="btn btn-default pull-right btn-xs" ng-click="removeCluster($index)">
-              - delete
-            </div>
+            <button type="button" class="btn btn-default pull-right btn-xs" ng-click="removeCluster($index)">
+              <span class="entypo minus"></span> delete
+            </button>
           </div>
 
+
         </div>
 
       </div>
     </div>
   </div>
-
-  <div class="btn btn-default btn-xs" ng-click="addCluster()">
-    + add cluster
+  <div class="col-xs-24 mt10">
+    <button type="button" class="btn btn-default btn-xs" ng-click="addCluster()">
+      <span class="entypo plus"></span> add cluster
+    </button>
   </div>
-  <div class="col-xs-24">
-    <div class="row feedBottomButtons">
-      <div class="btn btn-default col-xs-6" ng-click="goBack('forms.feed.location')" >
-        Previous
-      </div>
-      <div class="btn btn-default col-xs-6 pull-right" ng-click="goNext(feedForm.$invalid, 'forms.feed.summary')" >
-        Next
-      </div>
-      <u class="col-xs-3 pull-right" ui-sref="main">
-        Cancel
-      </u>
-    </div>
+
+  <div class="col-xs-24 mt20">
+    <button id="feed.backToStep3"
+            class="btn prevBtn"
+            type="button"
+            ng-click="goBack('forms.feed.location')"
+            ng-disabled="buttonSpinners.backShow" >
+      Previous <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
+    </button>
+    <button id="feed.step4" class="btn nextBtn pull-right"
+            ng-click="goNext(feedForm.$invalid, 'forms.feed.summary')" >
+      Next <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
+    </button>
+    <a class="pull-right" ui-sref="main">
+      Cancel
+    </a>
   </div>
 </form>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/feed/feedFormGeneralStepTpl.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/feed/feedFormGeneralStepTpl.html b/falcon-ui/app/html/feed/feedFormGeneralStepTpl.html
index 3e2ecb9..2a4f5c4 100644
--- a/falcon-ui/app/html/feed/feedFormGeneralStepTpl.html
+++ b/falcon-ui/app/html/feed/feedFormGeneralStepTpl.html
@@ -17,80 +17,83 @@
  * limitations under the License.
  */
 -->
-<form name="feedForm">
+<form name="feedForm" novalidate id="feedFormGeneralStep">
 
-
-    <div class="col-sm-24">
+    <div class="col-xs-24">
       <label class="light">Name</label>
       <input type="text" class="form-control" ng-disabled="!cloningMode" ng-keydown="validations.acceptNoSpaces($event)"
              check-name="{type:'feed', check:cloningMode}" ng-class="{fakeInvalid:!validations.nameAvailable}"
              ng-model="feed.name" ng-required="true" ng-pattern="validations.patterns.name"/>
     </div>
-    <div class="col-sm-24">
+    <div class="col-xs-24">
       <label class="light">Description</label>
-      <input type="text" class="form-control"
+      <input type="text" class="form-control" validation-optional-message="{{validations.messages.description}}"
         ng-model="feed.description"
         ng-pattern="validations.patterns.freeText"/>
     </div>
 
-    <div class="col-sm-24">
+    <div class="col-xs-24">
       <label class="light">Tags</label>
     </div>
 
-    <div class="col-sm-24">
+    <div class="col-xs-24">
       <div ng-repeat="tag in feed.tags">
         <div class="row dynamic-table-spacer">
           <div class="col-xs-10">
             <input type="text" class="form-control" ng-model="tag.key"
+                   validation-optional-message="{{validations.messages.key}}"
               ng-pattern="validations.patterns.alpha" ng-required="tag.value" placeholder="key"/>
           </div>
           <div class="col-xs-11">
-            <input type="text" class="form-control"
+            <input type="text" class="form-control" validation-optional-message="{{validations.messages.value}}"
               ng-model="tag.value" ng-pattern="validations.patterns.alpha" ng-required="tag.key" placeholder="value"/>
           </div>
           <div class="col-xs-3">
-            <div class="btn btn-default btn-xs" ng-click="removeTag($index)" ng-if="$index>0">
+            <button type="button" class="btn btn-default btn-xs" ng-click="removeTag($index)" ng-if="$index>0">
               <span class="entypo minus"></span> delete
-            </div>
+            </button>
           </div>
         </div>
       </div>
     </div>
-    <div class="col-sm-24 dynamic-table-spacer">
-      <div class="btn btn-default btn-xs" ng-click="addTag()">
+    <div class="col-xs-24 dynamic-table-spacer">
+      <button type="button" class="btn btn-default btn-xs" ng-click="addTag()">
         <span class="entypo plus"></span> add tag
-      </div>
+      </button>
     </div>
 
-    <div class="col-sm-24">
+    <div class="col-xs-24">
       <label class="light">Groups (comma separated)</label>
-      <input type="text" class="form-control"
+      <input type="text" class="form-control" validation-optional-message="{{validations.messages.acl.group}}"
         ng-pattern="validations.patterns.commaSeparated"
         ng-model="feed.groups"/>
     </div>
 
-    <h4 class="col-sm-24"> Access Control List </h4>
-    <div class="col-sm-8">
+    <div class="col-xs-24"><h4 class="tittle-in-row">Access Control List</h4></div>
+    <div class="col-xs-8">
       <label class="light">Owner</label>
-      <input type="text" class="form-control"
-        ng-pattern="validations.patterns.unixId"
-        ng-model="feed.ACL.owner"/>
+      <input type="text" class="form-control" validation-message="{{validations.messages.acl.owner}}"
+             ng-required="true"
+             ng-pattern="validations.patterns.unixId"
+             ng-model="feed.ACL.owner"/>
     </div>
-    <div class="col-sm-8">
+    <div class="col-xs-8">
       <label class="light">Group</label>
-      <input type="text" class="form-control"
-       ng-pattern="validations.patterns.unixId"
-       ng-model="feed.ACL.group"/>
+      <input type="text" class="form-control" validation-message="{{validations.messages.acl.group}}"
+             ng-required="true"
+             ng-pattern="validations.patterns.unixId"
+             ng-model="feed.ACL.group"/>
     </div>
-    <div class="col-sm-8">
+    <div class="col-xs-8">
       <label class="light">Permissions</label>
-      <input type="text" class="form-control"
-        ng-pattern="validations.patterns.unixPermissions"
-        ng-model="feed.ACL.permission"/>
+      <input type="text" class="form-control" validation-message="{{validations.messages.acl.permission}}"
+             ng-required="true"
+             ng-pattern="validations.patterns.unixPermissions"
+             ng-model="feed.ACL.permission"/>
     </div>
 
-    <h4 class="col-sm-24">Schema</h4>
-    <div class="col-sm-12">
+    <div class="col-xs-24"><h4 class="tittle-in-row">Schema</h4></div>
+    <div class="col-xs-12">
       <label class="light">Location</label>
       <input type="text" class="form-control" validation-message="{{validations.messages.location}}"
         ng-maxlength="200"
@@ -98,24 +101,24 @@
         ng-model="feed.schema.location"
         ng-required="true"/>
     </div>
-    <div class="col-sm-12">
+    <div class="col-xs-12">
       <label class="light">Provider</label>
       <input type="text" class="form-control" validation-message="{{validations.messages.provider}}"
         ng-pattern="validations.patterns.osPath"
         ng-model="feed.schema.provider"
         ng-required="true"/>
     </div>
-  
 
-  <div class="col-xs-24">
-    <div class="feedBottomButtons row">
-      <div class="btn btn-default col-xs-6 pull-right" ng-click="goNext(feedForm.$invalid, 'forms.feed.properties')">
-        Next
-      </div>
-      <u class="col-xs-3 pull-right" ng-click="cancel()" ui-sref="main">
-        Cancel
-      </u>
-    </div>
+
+  <div class="col-xs-24 mt20">
+    <button id="feed.step1" class="btn nextBtn col-xs-6 pull-right"
+         ng-disabled="buttonSpinners.show"
+         ng-click="goNext(feedForm.$invalid, 'forms.feed.properties')">
+      Next <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
+    </button>
+    <a class="pull-right" ui-sref="main">
+      Cancel
+    </a>
   </div>
 
 </form>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/feed/feedFormLocationStepTpl.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/feed/feedFormLocationStepTpl.html b/falcon-ui/app/html/feed/feedFormLocationStepTpl.html
index 7e5b6c0..7c7355e 100644
--- a/falcon-ui/app/html/feed/feedFormLocationStepTpl.html
+++ b/falcon-ui/app/html/feed/feedFormLocationStepTpl.html
@@ -17,89 +17,97 @@
  * limitations under the License.
  */
 -->
-<form name="feedForm">
-  <div class="col-xs-24">
-  <div class="row">
-    <div class="col-xs-24 feedLocationNavBox">
-      <h4 class="col-xs-10" ng-show="feed.storage.fileSystem.active">Default Storage type </h4>
-      <h4 class="col-xs-10" ng-show="feed.storage.catalog.active"> Storage type </h4>
+<form name="feedForm" novalidate id="feedFormLocationStep">
+  <div class="col-xs-24 locationStep">
+    <div class="row">
+      <div class="col-xs-24 feedLocationNavBox">
+        <h4 class="col-xs-10" ng-show="feed.storage.fileSystem.active">Default Storage type </h4>
+        <h4 class="col-xs-10" ng-show="feed.storage.catalog.active"> Storage type </h4>
+
+        <div class="col-xs-14 feedLocationNav">
+          <button type="button"
+                  class="btn btn-default pull-right"
+                  ng-class="{active: feed.storage.catalog.active}"
+                  ng-click="toggleStorage()">
+            Catalog Storage
+          </button>
+          <button type="button"
+                  class="btn btn-default pull-right"
+                  ng-class="{active: feed.storage.fileSystem.active}"
+                  ng-click="toggleStorage()">
+            File System
+          </button>
 
-      <div class="col-xs-14 feedLocationNav">
-        <div class="btn btn-default pull-right"
-          ng-class="{active: feed.storage.catalog.active}"
-          ng-click="toggleStorage()">
-          Catalog Storage
         </div>
-        <div class="btn btn-default pull-right"
-          ng-class="{active: feed.storage.fileSystem.active}"
-          ng-click="toggleStorage()">
-          File System
+        <div class="clearfix"></div>
+      </div>
+      <h4 class="col-xs-12">Default Location</h4>
+      <div class="col-xs-24">
+        <div ng-show="feed.storage.fileSystem.active"
+          ng-repeat="location in feed.storage.fileSystem.locations" class="row">
+
+          <div class="col-xs-8">
+            <label class="light">{{capitalize(location.type)}} path</label>
+          </div>
+          <div class="pull-right" ng-show="location.focused">
+            <label class="light">add</label>
+            <label ng-repeat="timeVariable in ['${YEAR}', '${MONTH}', '${DAY} ', '${HOUR}']"
+                   ng-click="appendVariable(timeVariable, location, 'path')">
+              {{timeVariable}}
+            </label>
+          </div>
+          <div class="clearfix hidden-md"></div>
+          <div class="col-xs-24">
+            <input type="text" class="form-control" validation-message="{{validations.messages.path}}"
+              ng-required="true"
+              ng-model="location.path"
+              ng-pattern="validations.patterns.osPath"
+              ng-class="{firstInput: $index === 0}"
+              ng-focus="location.focused = true"/>
+          </div>
         </div>
-        
       </div>
-      <div class="clearfix"></div>
-    </div>
-    <h4 class="col-xs-12">Default Location</h4>
-    <div class="col-xs-24">
-      <div ng-show="feed.storage.fileSystem.active"
-        ng-repeat="location in feed.storage.fileSystem.locations" class="row">
-  
+
+
+      <div ng-show="feed.storage.catalog.active">
         <div class="col-xs-8">
-          <label class="light">{{capitalize(location.type)}} path</label>
+          <label class="light">Table uri</label>
         </div>
-        <div class="pull-right" ng-show="location.focused">
+
+        <div class="pull-right" ng-show="feed.storage.catalog.catalogTable.focused">
           <label class="light">add</label>
           <label ng-repeat="timeVariable in ['${YEAR}', '${MONTH}', '${DAY} ', '${HOUR}']"
-                 ng-click="appendVariable(timeVariable, location, 'path')">
+                 ng-click="appendVariable(timeVariable, feed.storage.catalog.catalogTable, 'uri')">
             {{timeVariable}}
           </label>
         </div>
-        <div class="clearfix hidden-md"></div>
+
         <div class="col-xs-24">
-          <input type="text" class="form-control" validation-message="{{validations.messages.path}}"
-            ng-required="true"
-            ng-model="location.path"
-            ng-pattern="validations.patterns.osPath"
-            ng-focus="location.focused = true"/>
+          <input type="text" class="form-control catalogStorageInput" custom-autofocus
+            ng-model="feed.storage.catalog.catalogTable.uri"
+            ng-pattern="validations.patterns.tableUri"
+            ng-required="feed.storage.catalog.active" validation-message="{{validations.messages.path}}"
+            ng-focus="feed.storage.catalog.catalogTable.focused = true"/>
         </div>
-      </div>
-    </div>
-    
-
-    <div ng-show="feed.storage.catalog.active">
-      <div class="col-xs-8">
-        <label class="light">Table uri</label>
-      </div>
-
-      <div class="pull-right" ng-show="feed.storage.catalog.catalogTable.focused">
-        <label class="light">add</label>
-        <label ng-repeat="timeVariable in ['${YEAR}', '${MONTH}', '${DAY} ', '${HOUR}']"
-               ng-click="appendVariable(timeVariable, feed.storage.catalog.catalogTable, 'uri')">
-          {{timeVariable}}
-        </label>
-      </div>
 
-      <div class="col-xs-24">
-        <input type="text" class="form-control"
-          ng-model="feed.storage.catalog.catalogTable.uri"
-          ng-pattern="validations.patterns.tableUri"
-          ng-required="feed.storage.catalog.active" validation-message="{{validations.messages.path}}"
-          ng-focus="feed.storage.catalog.catalogTable.focused = true"/>
       </div>
-
     </div>
-  </div>
 
-  <div class="row feedBottomButtons">
-    <div class="btn btn-default col-xs-6" ng-click="goBack('forms.feed.properties')" >
-      Previous
-    </div>
-    <div class="btn btn-default col-xs-6 pull-right" ng-click="goNext(feedForm.$invalid, 'forms.feed.clusters')" >
-      Next
+    <div class="row">
+      <div class="col-xs-24 mt20">
+        <button type="button"
+                id="feed.backToStep2" class="btn prevBtn"
+                ng-click="goBack('forms.feed.properties')"
+                ng-disabled="buttonSpinners.backShow">
+          Previous <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
+        </button>
+        <button id="feed.step3" class="btn nextBtn pull-right" ng-click="goNext(feedForm.$invalid, 'forms.feed.clusters')" >
+          Next <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
+        </button>
+        <a class="pull-right" ui-sref="main">
+          Cancel
+        </a>
+      </div>
     </div>
-    <u class="col-xs-3 pull-right" ui-sref="main">
-      Cancel
-    </u>
   </div>
-</div>
 </form>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/feed/feedFormPropertiesStepTpl.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/feed/feedFormPropertiesStepTpl.html b/falcon-ui/app/html/feed/feedFormPropertiesStepTpl.html
index 007fd91..2e4cfd1 100644
--- a/falcon-ui/app/html/feed/feedFormPropertiesStepTpl.html
+++ b/falcon-ui/app/html/feed/feedFormPropertiesStepTpl.html
@@ -17,20 +17,20 @@
  * limitations under the License.
  */
 -->
-<form name="feedForm">
+<form name="feedForm" novalidate id="feedFormPropertiesStep">
 
     <h5 class="col-xs-24 mb10">Timing</h5>
 
-    <div class="col-xs-9 inlineInputsGroup">   
+    <div class="col-xs-9 inlineInputsGroup">
       <div class="light">Frequency</div>
       <span>Every</span>
       <input type="text" class="form-control" validation-message="{{validations.messages.number}}"
-             ng-model="feed.frequency.quantity"
+             ng-model="feed.frequency.quantity" autofocus
              ng-required="true"
              ng-keydown="validations.acceptOnlyNumber($event)"
              ng-pattern="validations.patterns.twoDigits"/>
 
-      <select       
+      <select
         ng-model="feed.frequency.unit"
         ng-required="true">
         <option selected value="minutes">minutes</option>
@@ -40,16 +40,16 @@
       </select>
     </div>
 
-    <div class="col-xs-9 inlineInputsGroup">   
+    <div class="col-xs-9 inlineInputsGroup">
       <div class="light"><input type="checkbox" ng-model="feed.lateArrival.active" />Late Arrival</div>
       <span>Up to</span>
-  
+
       <input type="text" class="form-control" ng-keydown="validations.acceptOnlyNumber($event)"
         ng-model="feed.lateArrival.cutOff.quantity"
         ng-disabled="!feed.lateArrival.active"
         ng-pattern="validations.patterns.twoDigits"
         ng-required="feed.lateArrival.active"/>
-  
+
       <select
         ng-model="feed.lateArrival.cutOff.unit" ng-disabled="!feed.lateArrival.active"
         ng-required="feed.lateArrival.active">
@@ -69,11 +69,11 @@
 
   <div class="col-xs-24">
     <div class="row mt20">
-      <label class="col-xs-5 light">Timezone</label> 
+      <label class="col-xs-5 light">Timezone</label>
       <time-zone-select ng-model="feed.timezone" class="col-xs-19"></time-zone-select>
-  
+
       <h5 class="col-xs-24">Properties</h5>
-  
+
       <div class="col-xs-5">
         <label class="light">Name</label>
       </div>
@@ -82,13 +82,13 @@
       </div>
       <div class="col-xs-24" id="feedPropertiesBox">
         <div ng-repeat="property in feed.properties" class="row">
-         
+
           <label class="col-xs-5">{{property.key}}</label>
-        
+
           <div class="col-xs-19" ng-if="property.key !== 'timeout' && property.key !== 'jobPriority'">
-            <input type="text" class="form-control"
-              ng-model="property.value"
-              ng-patter="validations.patterns.alpha"/>
+            <input type="text" class="form-control" placeholder="{{propPlaceholders[property.key]}}"
+              ng-model="property.value" validation-optional-message="{{validations.messages.value}}"
+              ng-pattern="validations.patterns.alpha"/>
           </div>
           <div class="col-xs-19 inlineInputsGroup" ng-if="property.key === 'timeout'">
             At
@@ -97,7 +97,8 @@
                    ng-pattern="validations.patterns.twoDigits"/>
             <select
               ng-model="property.value.unit">
-              <option selected value="minutes">minutes</option>
+              <option value="" disabled selected style='display:none;'>-Select timeout-</option>
+              <option value="minutes">minutes</option>
               <option value="hours">hours</option>
               <option value="days">days</option>
               <option value="months">months</option>
@@ -119,42 +120,42 @@
         <div ng-repeat="property in feed.customProperties" class="row">
           <div class="col-xs-5 mt10">
             <input type="text" class="form-control" placeholder="key"
-              ng-model="property.key"
+              ng-model="property.key" validation-optional-message="{{validations.messages.key}}"
               ng-pattern="validations.patterns.alpha"
               ng-required="property.value"/>
           </div>
-    
+
           <div class="col-xs-15 mt10">
             <input type="text" class="form-control" placeholder="value"
-              ng-model="property.value"
+              ng-model="property.value" validation-optional-message="{{validations.messages.value}}"
               ng-pattern="validations.patterns.alpha"
               ng-required="property.key"/>
           </div>
-          <div class="col-xs-4 mt10"> 
-            <div class="btn btn-default btn-xs mt1" ng-click="removeCustomProperty($index)" ng-if="$index>0">
+          <div class="col-xs-4 mt10">
+            <button type="button" class="btn btn-default btn-xs mt1" ng-click="removeCustomProperty($index)" ng-if="$index>0">
               <span class="entypo minus"></span> delete
-            </div>   
+            </button>
           </div>
         </div>
       </div>
       <div class="col-xs-24 mt10">
-        <div class="btn btn-default btn-xs" ng-click="addCustomProperty()">
+        <button type="button" class="btn btn-default btn-xs" ng-click="addCustomProperty()">
           <span class="entypo plus"></span> add property
-        </div>
+        </button>
       </div>
     </div>
   </div>
-  <div class="col-xs-24">
-    <div class="feedBottomButtons row">
-      <div class="btn btn-default col-xs-6" ng-click="goBack('forms.feed.general')">
-        Previous
-      </div>
-      <div class="btn btn-default col-xs-6 pull-right" ng-click="goNext(feedForm.$invalid, 'forms.feed.location')">
-        Next
-      </div>
-      <u class="col-xs-3 pull-right" ui-sref="main">
-        Cancel
-      </u>
-    </div>
+  <div class="col-xs-24 mt20">
+    <button id="feed.backToStep1" class="btn prevBtn" type="button"
+         ng-click="goBack('forms.feed.general')"
+         ng-disabled="buttonSpinners.backShow">
+      Previous <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
+    </button>
+    <button id="feed.step2" class="btn nextBtn pull-right" ng-click="goNext(feedForm.$invalid, 'forms.feed.location')">
+      Next <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
+    </button>
+    <a class="pull-right" ui-sref="main">
+      Cancel
+    </a>
   </div>
 </form>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/feed/feedFormSummaryStepTpl.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/feed/feedFormSummaryStepTpl.html b/falcon-ui/app/html/feed/feedFormSummaryStepTpl.html
index f67fa91..a8a4844 100644
--- a/falcon-ui/app/html/feed/feedFormSummaryStepTpl.html
+++ b/falcon-ui/app/html/feed/feedFormSummaryStepTpl.html
@@ -17,7 +17,7 @@
  * limitations under the License.
  */
 -->
-<div class="row">
+<div class="row" id="feedFormSummaryStep">
   <h4 class="col-sm-24">
     General
   </h4>
@@ -122,10 +122,10 @@
     <div class="clearfix hidden-md"></div>
 
     <div class="col-sm-12">
-      <label>Start</label>: {{cluster.validity.start.date}} {{cluster.validity.start.time}}
+      <label>Start</label>: {{cluster.validity.start.date|date:'yyyy-MM-dd'}} {{cluster.validity.start.time|date:'HH:mm'}}
     </div>
     <div class="col-sm-12">
-      <label>End</label>: {{cluster.validity.end.date}} {{cluster.validity.end.time}}
+      <label>End</label>: {{cluster.validity.end.date|date:'yyyy-MM-dd'}} {{cluster.validity.end.time|date:'HH:mm'}}
     </div>
     <div class="col-sm-24">
       <label>Timezone</label>: {{feed.timezone}}
@@ -146,14 +146,18 @@
   </div>
 </div>
 
-<div class="feedBottomButtons row">
-  <div class="btn btn-default col-xs-6" ng-click="goBack('forms.feed.clusters')" >
-    Previous
-  </div>
-  <div class="btn btn-default col-xs-6 pull-right" ng-click="saveEntity()">
-    Save
+<div class="row">
+  <div class="col-xs-24 mt20">
+    <button id="feed.backToStep4" class="btn prevBtn" type="button"
+         ng-click="goBack('forms.feed.clusters')"
+         ng-disabled="buttonSpinners.backShow">
+      Previous <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
+    </button>
+    <button id="feed.step5" class="btn nextBtn pull-right" ng-click="saveEntity()">
+      Save <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
+    </button>
+    <a class="pull-right" ui-sref="main">
+      Cancel
+    </a>
   </div>
-  <u class="col-xs-3 pull-right" ui-sref="main">
-    Cancel
-  </u>
 </div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/feed/feedFormTpl.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/feed/feedFormTpl.html b/falcon-ui/app/html/feed/feedFormTpl.html
index c05b963..ee30d54 100644
--- a/falcon-ui/app/html/feed/feedFormTpl.html
+++ b/falcon-ui/app/html/feed/feedFormTpl.html
@@ -17,78 +17,88 @@
  * limitations under the License.
  */
 -->
-<div class="col-sm-24 feedForm">
-  <div class="col-sm-22 col-sm-offset-2">
-    <div class="row">
-      <h3 class="col-sm-24">
-        New Feed
+<div class="col-xs-22 col-xs-offset-1 feedForm" id="feedFormTmpl">
+  <div class="col-xs-24">
+    <div class="row dt">
+
+      <h3 id="feed.title" class="col-xs-24">
+        <span class="entypo download icon-lg"></span> New Feed
       </h3>
-      <div class="col-sm-15 detailsBox">
 
-        <div class="feedProgressBox" ng-class="{
-          general:isActive('forms.feed.general'),
-          properties:isActive('forms.feed.properties'),
-          location:isActive('forms.feed.location'),
-          clusters:isActive('forms.feed.clusters'),
-          summary:isActive('forms.feed.summary')
-          }">
-          <div class="progressBar col-md-24">
-            <div>
-              <span>
-                <div class="fir">1<span class="entypo check"></span></div>              
-                <h6>General</h6>
-              </span>
-              <span>
-                <div class="sec">2<span class="entypo check"></span></div>
-                <h6>Properties</h6>
-              </span>
-              <span>
-                <div class="thi">3<span class="entypo check"></span></div>
-                <h6>Location</h6>
-              </span>
-              <span>
-                <div class="fou">4<span class="entypo check"></span></div>
-                <h6>Clusters</h6>
-              </span>
-              <span>
-                <div class="fif">5<span class="entypo check"></span></div>
-                <h6>Summary</h6>
-              </span>
-            </div>  
+      <div ng-class="{'col-xs-12' : propsOpen, 'col-xs-20' : !propsOpen}">
+        <div class="detailsBox">
+          <div class="feedProgressBox" ng-class="{
+            general:isActive('forms.feed.general'),
+            properties:isActive('forms.feed.properties'),
+            location:isActive('forms.feed.location'),
+            clusters:isActive('forms.feed.clusters'),
+            summary:isActive('forms.feed.summary')
+            }">
+            <div class="progressBar col-xs-24">
+              <div>
+                <span>
+                  <div class="fir">1<span class="entypo check"></span></div>
+                  <h6>General</h6>
+                </span>
+                <span>
+                  <div class="sec">2<span class="entypo check"></span></div>
+                  <h6>Properties</h6>
+                </span>
+                <span>
+                  <div class="thi">3<span class="entypo check"></span></div>
+                  <h6>Location</h6>
+                </span>
+                <span>
+                  <div class="fou">4<span class="entypo check"></span></div>
+                  <h6>Clusters</h6>
+                </span>
+                <span>
+                  <div class="fif">5<span class="entypo check"></span></div>
+                  <h6>Summary</h6>
+                </span>
+              </div>
+            </div>
           </div>
-        </div>
-     
-        <div class="row">
-          <div class="col-sm-offset-1 col-sm-22">
-            <fieldset ng-disabled="!editXmlDisabled">
-              <div ui-view class="formViewContainer"></div>
-            </fieldset>
+
+          <div class="row">
+            <div class="col-xs-offset-1 col-xs-22">
+              <fieldset ng-disabled="!editXmlDisabled">
+                <div ui-view class="formViewContainer"></div>
+              </fieldset>
+            </div>
           </div>
         </div>
-    
       </div>
 
-      <div class="col-sm-8 detailsBox col-sm-offset-1">
-        <div class="row">
+      <div ng-class="{'col-xs-12' : propsOpen, 'col-xs-4' : !propsOpen}">
+        <div class="detailsBox">
+          <div class="row dt">
 
-          <h5 class="col-xs-13 col-xs-offset-1 noSpecial">XML Preview</h5>  
-          
-          <div class="col-xs-9">
-            <div class="btn btn-default btn-xs pull-right" ng-click="toggleEditXml()" ng-class="{'btn-warning':!editXmlDisabled}">
-              Edit XML
+            <div class="col-xs-13 col-xs-offset-1 noSpecial">
+              <h5><i class="pointer glyphicon" ng-click="propsOpen = !propsOpen" ng-class="propsOpen ? 'glyphicon-minus-sign':'glyphicon-plus-sign'"></i> XML Preview</h5>
             </div>
-          </div>
 
-          <div class="col-xs-24">
-            <div class="row">
-              <div class="col-sm-22 col-sm-offset-1">
-                <textarea ng-model="prettyXml" rows="35" class="form-control" ng-disabled="editXmlDisabled">
-                </textarea>
-                {{xmlEditValidationError}}
+            <div ng-if="propsOpen" class="col-xs-9">
+              <button type="button"
+                      id="feed.editXML"
+                      class="btn btn-default btn-xs pull-right"
+                      ng-click="toggleEditXml()"
+                      ng-class="{'btn-warning':!editXmlDisabled}">
+                <div ng-if="editXmlDisabled">Edit XML</div>
+                <div ng-if="!editXmlDisabled">Finish</div>
+              </button>
+
+            </div>
+
+            <div ng-show="propsOpen" class="col-sm-24">
+              <div class="row">
+                <div class="col-sm-22 col-sm-offset-1">
+                  <textarea ng-model="prettyXml" elastic class="form-control prettyXml" ng-disabled="editXmlDisabled"></textarea>
+                </div>
               </div>
             </div>
+
           </div>
-          
         </div>
       </div>
 

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/feed/feedSummary.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/feed/feedSummary.html b/falcon-ui/app/html/feed/feedSummary.html
new file mode 100644
index 0000000..760e810
--- /dev/null
+++ b/falcon-ui/app/html/feed/feedSummary.html
@@ -0,0 +1,214 @@
+<!--
+/**
+ * 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="summaryBox" id="feedFormSummary">
+  <div class="row">
+    <h5 class="col-sm-24">
+      General
+    </h5>
+  </div>
+
+  <div class="row">
+    <div class="col-sm-12">
+      <label>Name</label>: {{feed.name}}
+    </div>
+    <div class="col-sm-12">
+      <label>Description</label>: {{feed.description}}
+    </div>
+  </div>
+
+  <div class="row">
+    <h5 class="col-sm-24">
+      Tags
+    </h5>
+  </div>
+
+  <div class="row">
+    <div class="col-sm-24">
+      <div ng-repeat="tag in feed.tags | filter:{key: '!!'}">
+        {{tag.key}} = {{tag.value}}
+      </div>
+    </div>
+  </div>
+
+  <div class="row">
+    <h5 class="col-sm-24">
+      Groups
+    </h5>
+  </div>
+
+  <div class="row">
+    <div class="col-sm-24">
+      {{feed.groups}}
+    </div>
+  </div>
+
+  <div class="row">
+    <h5 class="col-sm-24">
+      Access Control List
+    </h5>
+  </div>
+
+  <div class="row">
+    <div class="col-sm-8">
+      <label>Owner</label>: {{feed.ACL.owner}}
+    </div>
+    <div class="col-sm-8">
+      <label>Group</label>: {{feed.ACL.group}}
+    </div>
+    <div class="col-sm-8">
+      <label>Permissions</label>: {{feed.ACL.permission}}
+    </div>
+  </div>
+
+  <div class="row">
+    <h5 class="col-sm-24">
+      Schema
+    </h5>
+  </div>
+
+  <div class="row">
+    <div class="col-sm-12">
+      <label>Location</label>: {{feed.schema.location}}
+    </div>
+    <div class="col-sm-12">
+      <label>Provider</label>: {{feed.schema.provider}}
+    </div>
+  </div>
+
+  <div class="row">
+    <h5 class="col-sm-24">
+      Properties
+    </h5>
+  </div>
+
+  <div class="row">
+    <div class="col-sm-8">
+      <label>Frequency</label>:
+      <frequency value="feed.frequency" prefix="Every"/>
+    </div>
+    <div class="col-sm-8">
+      <label>Late Arrival</label>:
+      <frequency value="feed.lateArrival.cutOff" prefix="Up to"/>
+    </div>
+    <div class="col-sm-8">
+      <label>Availability Flag</label>: {{feed.availabilityFlag}}
+    </div>
+  </div>
+
+  <div class="row">
+    <div class="col-sm-8" ng-repeat="property in feed.properties">
+      <label>{{property.key}}</label>:
+      <span ng-if="property.key !== 'timeout'">{{property.value}}</span>
+      <frequency ng-if="property.key === 'timeout'" value="property.value" prefix="at"/>
+    </div>
+
+    <div class="col-sm-8" ng-repeat="property in feed.customProperties | filter: {key: '!!'}">
+      <label>{{property.key}}</label>: {{property.value}}
+    </div>
+
+    <h5 class="col-xs-24">
+      Default Storage Type:
+    </h5>
+  </div>
+
+  <div class="row">
+    <div class="col-sm-8 light" ng-show="feed.storage.fileSystem.active">File System</div>
+    <div class="col-sm-8 light" ng-show="feed.storage.catalog.active">Catalog Storage</div>
+  </div>
+
+  <div class="row">
+    <h5 class="col-sm-24">Default Location:</h5>
+  </div>
+
+
+  <div ng-repeat="location in feed.storage.fileSystem.locations" ng-show="feed.storage.fileSystem.active">
+    <div class="row">
+      <label class="col-sm-24">{{capitalize(location.type)}}</label>
+    </div>
+
+    <div class="row">
+      <div class="col-sm-24">{{location.path}}</div>
+    </div>
+  </div>
+
+  <div ng-show="feed.storage.catalog.active">
+    <div class="row">
+      <label class="col-sm-24">Table uri</label>
+    </div>
+    <div class="row">
+      <div class="col-sm-24">{{feed.storage.catalog.catalogTable.uri}}</div>
+    </div>
+  </div>
+
+</div>
+
+<div class="summaryBox">
+  <div ng-repeat="cluster in feed.clusters">
+    <div class="row">
+      <h5 class="col-sm-24">{{capitalize(cluster.type)}} Cluster</h5>
+    </div>
+    <div class="row">
+      <div class="col-sm-12">
+        <label>Name</label>: {{cluster.name}}
+      </div>
+      <div class="clearfix hidden-md"></div>
+    </div>
+    <div class="row">
+      <div class="col-sm-12">
+        <label>Start</label>: {{dateFormatter(entity.start)}}
+      </div>
+      <div class="col-sm-12">
+        <label>End</label>: {{dateFormatter(entity.end)}}
+      </div>
+    </div>
+    <div class="row">
+      <div class="col-sm-24">
+        <label>Timezone</label>: {{feed.timezone}}
+      </div>
+    </div>
+    <div class="row">
+      <div class="col-sm-24">
+        <label>Retention</label>:
+        <frequency value="cluster.retention" prefix="Archive in"/>
+      </div>
+    </div>
+  </div>
+  <div class="clearfix hidden-md"></div>
+  <div class="row">
+    <h5 class="col-sm-24">Location</h5>
+  </div>
+
+  <div ng-repeat="location in cluster.storage.fileSystem.locations" ng-show="cluster.storage.fileSystem">
+    <div class="row">
+      <label class="col-sm-24">{{capitalize(location.type)}}</label>
+    </div>
+    <div class="row">
+      <div class="col-sm-24">{{location.path}}</div>
+    </div>
+  </div>
+  <div ng-show="cluster.storage.catalog.active">
+    <div class="row">
+      <label class="col-sm-24">Table uri</label>
+    </div>
+    <div class="row">
+      <div class="col-sm-24">{{cluster.storage.catalog.catalogTable.uri}}</div>
+    </div>
+  </div>
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/instanceDetails.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/instanceDetails.html b/falcon-ui/app/html/instanceDetails.html
new file mode 100644
index 0000000..b67c041
--- /dev/null
+++ b/falcon-ui/app/html/instanceDetails.html
@@ -0,0 +1,78 @@
+<!--
+/**
+ * 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="container" id="instanceDetails">
+
+  <div class="row">
+    <div class="col-sm-24">
+      <div class="detailsBox">
+        <div class="row">
+          <div class="col-sm-9">
+            <h3 class="instance-title">
+              <a href="javascript:void(0);" ng-click="backToEntity()">{{ instance.name }}</a> | {{ instance.instance }}
+            </h3>
+          </div>
+          <div class="col-sm-3 instance-status">
+            <span class="text-success">STARTED</span><br/>
+            {{ instance.startTime | date :'MM/dd/yyyy HH:mm' }}
+          </div>
+          <div class="col-sm-5 border-left">
+            <h4 class="instance-title">
+              Status: <span ng-class="{
+              'blink-success': instance.status == 'RUNNING',
+              'text-success': instance.status == 'SUCCEEDED',
+              'blink-warning': instance.status == 'WAITING' || instance.status == 'UNKNOWN',
+              'blink-danger': instance.status == 'SUSPENDED',
+              'text-danger': instance.status == 'FAILED' || instance.status == 'KILLED',
+              }">{{ instance.status }}</span>
+            </h4>
+          </div>
+          <div class="col-sm-7 buttonCell">
+            <div class="btn btn-big btn-xs buttons-to-show" ng-click="resumeInstance()"
+                 ng-disabled="!(instance.status === 'SUSPENDED')">
+              <span class="entypo play"></span> <div>Resume</div>
+            </div>
+            <div class="btn btn-big btn-xs buttons-to-show" ng-click="reRunInstance()"
+                 ng-disabled="!(instance.status === 'KILLED' || instance.status === 'SUCCEEDED' || instance.status === 'FAILED')">
+              <span class="entypo play"></span> <div>Rerun</div>
+            </div>
+            <div class="btn btn-big btn-xs buttons-to-show" ng-click="suspendInstance()" ng-disabled="!(instance.status === 'RUNNING')">
+              <span class="entypo paus"></span> <div>Suspend</div>
+            </div>
+            <div class="btn btn-big btn-xs buttons-to-show" ng-click="killInstance()" ng-disabled="!(instance.status === 'SUSPENDED' || instance.status === 'RUNNING')">
+              <span class="entypo stop"></span> <div>Kill</div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+
+  <div ng-if="instance.status === 'SUCCEEDED'" class="row">
+    <div class="col-sm-24">
+      <div class="detailsBox">
+        <h4>
+          Lineage
+        </h4>
+        <div class="lineage-graph"><lineage-graph type="instance.type" name="instance.name" instance="instance.instance" start="instance.startTime" end="instance.endTime"/></div>
+      </div>
+    </div>
+  </div>
+
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/login.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/login.html b/falcon-ui/app/html/login.html
new file mode 100644
index 0000000..556d843
--- /dev/null
+++ b/falcon-ui/app/html/login.html
@@ -0,0 +1,83 @@
+	<!--
+	/**
+	 * 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.
+	 */
+	-->
+
+	<form name="loginForm" ng-submit="loggUser(loginForm)" novalidate id="loginForm">
+
+	  <div class="col-sm-24 dashboardBox login" ng-class="{showValidationStyle:showLoginVal.show}">
+	    <div class="row">
+	      <div class="col-sm-6"></div>
+	      <div class="col-sm-12">
+
+		<div class="col-sm-15 detailsBox centered">
+		  <h3>Log In</h3>
+
+		  <!--<div class="clearfix hidden-md">&nbsp</div>-->
+
+		  <!--<div class="row">-->
+		    <!--<div class="col-sm-offset-1 col-sm-22 hint">-->
+		        <!--Default user: ambari-qa &nbsp Password: admin-->
+		    <!--</div>-->
+		  <!--</div>-->
+
+		  <div class="row">
+		    <div class="col-sm-offset-1 col-sm-22">
+		      <div class="clearfix hidden-md">&nbsp</div>
+		    </div>
+		  </div>
+
+		  <div class="row">
+		    <div class="col-sm-offset-1 col-sm-22">
+		        <label class="light">User</label>
+		        <input type="text" class="form-control"
+		          name="user"
+		          ng-model="login.user"
+		          ng-required="true"
+							ng-class="{'ng-invalid': showLoginVal.userPassInvalid}"
+		          validation-message="{{validations.messages.user}}"
+							ng-keydown="showLoginVal.userPassInvalid = false"
+		          ng-pattern="validations.patterns.id" autofocus/>
+		    </div>
+		  </div>
+
+		   <div class="row">
+				 <div class="col-sm-23 col-sm-offset-1 custom-danger" ng-if="showLoginVal.userPassInvalid">
+					 The user/password you have entered is invalid.
+				 </div>
+		     <div class="col-sm-offset-1 col-sm-22">
+		       <div class="clearfix hidden-md">&nbsp</div>
+		     </div>
+		   </div>
+
+		   <div class="row">
+		    <div class="col-sm-offset-1 col-sm-22">
+		        <button id="login.submit" type="submit" class="btn btn-default col-xs-6 pull-right dynamic-table-spacer">
+							Check-In
+		        </button>
+		    </div>
+		  </div>
+
+		</div>
+
+	      </div>
+	      <div class="col-sm-6"></div>
+	    </div>
+	  </div>
+
+	  </form>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/mainTpl.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/mainTpl.html b/falcon-ui/app/html/mainTpl.html
index 4b0116e..890463f 100644
--- a/falcon-ui/app/html/mainTpl.html
+++ b/falcon-ui/app/html/mainTpl.html
@@ -18,22 +18,58 @@
  */
 -->
 
-<div class="col-sm-24 dashboardBox"> 
-  <div class="row">   
-    <div class="col-sm-8">
-      <h3>Clusters</h3>
-      <entity-summary entities="lists.clusterList" type="cluster"></entity-summary>
-      <entities-list input="lists.clusterList" type="cluster" entity-details="entityDetails" clone="cloneEntity" remove="deleteEntity" edit="editEntity" schedule="scheduleEntity" suspend="suspendEntity" resume="resumeEntity"></entities-list>
-    </div>
-    <div class="col-sm-8">
-      <h3>Feeds</h3>
-      <entity-summary entities="lists.feedList" type="feed"></entity-summary>    
-      <entities-list input="lists.feedList" type="feed" entity-details="entityDetails" clone="cloneEntity" remove="deleteEntity" edit="editEntity" schedule="scheduleEntity" suspend="suspendEntity" resume="resumeEntity"></entities-list>
+<div class="col-sm-offset-1 col-sm-22">
+
+  <div class="row searchBoxContainer" id="searchBoxContainer">
+    <div class="col-sm-4"></div>
+    <div class="col-sm-16">
+
+      <img src="css/img/ajax-loader.gif" class="glyphicon search-loading-icon" ng-show="loading"/>
+      <i class="glyphicon glyphicon-search search-icon" ng-hide="loading"></i>
+
+      <tags-input ng-model="tags" min-length="1" add-on-space="true" add-from-autocomplete-only="true"
+                  on-tag-added="displayResults()" on-tag-removed="displayResults()" placeholder="Search">
+        <auto-complete source="loadTags($query)" min-length="0"></auto-complete>
+      </tags-input>
+
+      <i id="nsPopover" class="glyphicon glyphicon-question-sign" ng-class="tags.length > 0 ? 'question-icon' : 'remove-icon'"
+         ns-popover
+         ns-popover-template="menu"
+         ns-popover-trigger="click"
+         ns-popover-theme="ns-popover-tooltip-theme"
+         ns-popover-timeout="5"
+         ns-popover-placement="bottom|right"></i>
+      <script type="text/ng-template" id="menu">
+        <div class="triangle"></div>
+        <!--<div class="ns-popover-tooltip">-->
+          <!--<h5>Hey there! Want some search tips?</h5>-->
+          <!--The <strong>first word</strong> you type will be taken as the <strong>Name</strong> of the entity.-->
+          <!--<br/>-->
+          <!--You can search <strong>*</strong> for getting all the entities.-->
+          <!--<br/>-->
+          <!--The <strong>second and following</strong> words will be taken as <strong> Tags</strong>.-->
+          <!--<br/>-->
+          <!--For filtering by type, write <strong>type=feed|process|mirror</strong>-->
+        <!--</div>-->
+        <div class="ns-popover-tooltip">
+          <h5>Hey there! Want some search tips?</h5>
+          You can type <strong>*</strong> and select <strong>Name: *</strong> from the autocomplete for getting all the entities.
+        </div>
+      </script>
+      <i class="glyphicon glyphicon-remove remove-icon" ng-if="tags.length > 0" ng-click="clearTags()"></i>
+
     </div>
-    <div class="col-sm-8">
-      <h3>Processes</h3>
-      <entity-summary entities="lists.processList" type="process"></entity-summary>      
-      <entities-list input="lists.processList" entity-details="entityDetails" type="process" clone="cloneEntity" remove="deleteEntity" edit="editEntity" schedule="scheduleEntity" suspend="suspendEntity" resume="resumeEntity"></entities-list>
+    <div class="col-sm-4"></div>
+  </div>
+
+  <div class="col-sm-24 dashboardBox" ng-show="searchList.length > 0" id="dashboardBox">
+    <div class="row">
+      <div class="col-sm-24">
+        <entities-search-list input="searchList" entity-details="entityDetails" clone="cloneEntity" tags="tags"
+                              remove="deleteEntity" edit="editEntity" schedule="scheduleEntity" suspend="suspendEntity"
+                              resume="resumeEntity" focus-search="focusSearch" pages="pages" go-page="goPage"/>
+      </div>
     </div>
   </div>
+
 </div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/process/processFormClustersStepTpl.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/process/processFormClustersStepTpl.html b/falcon-ui/app/html/process/processFormClustersStepTpl.html
index 47886a2..21bf4bf 100644
--- a/falcon-ui/app/html/process/processFormClustersStepTpl.html
+++ b/falcon-ui/app/html/process/processFormClustersStepTpl.html
@@ -17,80 +17,117 @@
  * limitations under the License.
  */
 -->
-<form name="processForm" class="mt10">
-  <div class="col-sm-offset-1 col-sm-22">
+<form name="processForm" class="mt10" novalidate id="processFormClusterStep">
+  <div class="col-xs-offset-1 col-xs-22">
     <div ng-repeat="cluster in process.clusters" class="row">
-      <div class="col-xs-24 detailsBox processCluster">       
-          
+      <div class="col-xs-24 detailsBox processCluster">
+
         <h5>Cluster</h5>
         <div class="row">
           <div class="col-xs-24">
             <label class="light">Name</label>
-            <select ng-model="cluster.name" ng-required="true" class="form-control padding0" validation-message="{{validations.messages.cluster}}">
+            <select ng-model="cluster.name" ng-class="{firstSelectClusterStep: $index === 0}"
+                    ng-required="true"
+                    class="form-control padding0"
+                    validation-message="{{validations.messages.cluster}}">
               <option value="" disabled selected style='display:none;'>-Select cluster-</option>
               <option ng-repeat="clusterItem in clusterList">{{clusterItem.name}}</option>
             </select>
           </div>
         </div>
         <div class="clearfix"></div>
-        
-        <h5>Validity</h5>
-        <div class="row">
-          <div class="col-xs-12">
-       
-            <div>Start</div>
-           
-            <div class="input-group input-group-xs">
-              <span class="input-group-addon btn btn-default entypo calendar" ng-click="openDatePicker($event, cluster.validity.start)"></span>
-              <input type="text" class="form-control" placeholder="Start Date"
+
+        <label class="col-xs-24"> Validity </label>
+        <div class="col-xs-24 validityBox">
+          <div class="startDateBox">
+            <label>Start
+              <input type="text"
+                     name="startDateInput"
+                     class="form-control dateInput"
+                     placeholder="mm/dd/yyyy"
                      datepicker-popup="{{dateFormat}}"
                      ng-model="cluster.validity.start.date"
                      is-open="cluster.validity.start.opened"
-                     ng-required="true">
-            </div>     
+                     ng-click="openDatePicker($event, cluster.validity.start)"
+                     ng-required="true"
+                     simple-date>
+            </label>
+            <label class="col-xs-24 custom-danger validationMessageGral"
+                   ng-if="!cluster.validity.start.date">
+              {{validations.messages.date.empty}}
+            </label>
+          </div>
+          <div class="startTimeBox">
+            <label>Time
+              <timepicker
+                          ng-model="cluster.validity.start.time"
+                          hour-step="1"
+                          minute-step="1"
+                          show-meridian="true">
+              </timepicker>
+            </label>
           </div>
-    
-          <div class="col-xs-12">
-            <div>End</div>
-            
-            <div class="input-group input-group-xs">
-              <span class="input-group-addon btn btn-default entypo calendar" ng-click="openDatePicker($event, cluster.validity.end)"></span>
-              <input type="text" class="form-control" placeholder="End Date"
+          <div class="endDateBox">
+            <label>End
+              <input type="text"
+                     name="endDateInput"
+                     class="form-control dateInput"
+                     placeholder="mm/dd/yyyy"
                      datepicker-popup="{{dateFormat}}"
                      ng-model="cluster.validity.end.date"
                      is-open="cluster.validity.end.opened"
-                     ng-required="true">
-            </div>    
+                     ng-click="openDatePicker($event, cluster.validity.end)"
+                     ng-required="true"
+                     min-date="cluster.validity.start.date"
+                     simple-date>
+            </label>
+            <label class="col-xs-24 custom-danger validationMessageGral"
+                   ng-if="!cluster.validity.end.date">
+              {{validations.messages.date.empty}}
+            </label>
           </div>
+          <div class="endTimeBox">
+            <label>Time
+              <timepicker
+                          ng-model="cluster.validity.end.time"
+                          hour-step="1"
+                          minute-step="1"
+                          show-meridian="true">
+              </timepicker>
+            </label>
+          </div>
+
           <div class="col-xs-24 mt10">
-            <div class="btn btn-default pull-right btn-xs" ng-click="removeCluster($index)" ng-if="!$first">
-              - delete
-            </div>
+            <button type="button" class="btn btn-default pull-right btn-xs" ng-click="removeCluster($index)" ng-if="!$first">
+              <span class="entypo minus"></span> delete
+            </button>
           </div>
         </div>
-        
-        
-        
+
+
+
       </div>
     </div>
   </div>
   <div class="col-xs-24 mt10">
-    <div class="btn btn-default btn-xs" ng-click="addCluster()">
-      + add cluster
-    </div>
+    <button type="button" class="btn btn-default btn-xs" ng-click="addCluster()">
+      <span class="entypo plus"></span> add cluster
+    </button>
   </div>
-  <div class="col-xs-24">
-    <div class="row feedBottomButtons">
-      <div class="btn btn-default col-xs-6" ng-click="goBack('forms.process.properties')" >
-        Previous
-      </div>
-      <div class="btn btn-default col-xs-6 pull-right" ng-click="goNext(processForm.$invalid, 'forms.process.io')" >
-        Next
-      </div>
-      <u class="col-xs-3 pull-right" ui-sref="main">
-        Cancel
-      </u>
-    </div>
+  <div class="col-xs-24 mt20">
+    <button class="btn prevBtn" type="button"
+         ng-click="goBack('forms.process.properties')"
+         ng-disabled="buttonSpinners.backShow">
+      Previous <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
+    </button>
+    <button class="btn nextBtn pull-right"
+         ng-disabled="buttonSpinners.show"
+            ng-click="goNext(processForm.$invalid, 'forms.process.io')" >
+      Next <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
+    </button>
+    <a class="pull-right" ui-sref="main">
+      Cancel
+    </a>
   </div>
-  
+
 </form>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/process/processFormGeneralStepTpl.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/process/processFormGeneralStepTpl.html b/falcon-ui/app/html/process/processFormGeneralStepTpl.html
index 3f559c8..cc21854 100644
--- a/falcon-ui/app/html/process/processFormGeneralStepTpl.html
+++ b/falcon-ui/app/html/process/processFormGeneralStepTpl.html
@@ -17,14 +17,14 @@
  * limitations under the License.
  */
 -->
-<form name="processForm" class="mt10">
- 
+<form name="processForm" class="mt10" novalidate id="processFormGeneralStep">
+
     <div class="col-xs-24">
       <label class="light">Name</label>
       <input type="text" class="form-control" ng-keydown="validations.acceptNoSpaces($event)"
              check-name="{type:'process', check:cloningMode}" ng-class="{fakeInvalid:!validations.nameAvailable}"
              ng-disabled="!cloningMode" id="entityNameField" ng-model="process.name"
-             ng-required="true" ng-maxlength="39" ng-pattern="validations.patterns.name"/>
+             ng-required="true" ng-maxlength="100" ng-pattern="validations.patterns.name"/>
     </div>
 
     <div class="col-xs-24">
@@ -36,55 +36,68 @@
         <div class="row dynamic-table-spacer">
           <div class="col-xs-10">
             <input type="text" class="form-control" ng-model="tag.key" placeholder="key"
+                   validation-optional-message="{{validations.messages.key}}"
                    ng-pattern="validations.patterns.alpha" ng-required="tag.value"/>
           </div>
           <div class="col-xs-11">
             <input type="text" class="form-control" placeholder="value"
+                   validation-optional-message="{{validations.messages.value}}"
                    ng-model="tag.value" ng-pattern="validations.patterns.alpha" ng-required="tag.key"/>
           </div>
           <div class="col-xs-3">
-            <div class="btn btn-default btn-xs" ng-click="removeTag($index)" ng-if="$index>0">
+            <button type="button" class="btn btn-default btn-xs" ng-click="removeTag($index)" ng-if="$index>0">
               <span class="entypo minus"></span> delete
-            </div>
+            </button>
           </div>
         </div>
       </div>
     </div>
     <div class="col-xs-24 mt10 mb10">
-      <div class="btn btn-default btn-xs" ng-click="addTag()">
+      <button type="button" class="btn btn-default btn-xs" ng-click="addTag()">
         <span class="entypo plus"></span> add tag
-      </div>
+      </button>
     </div>
 
   <h4 class="col-xs-24">Workflow</h4>
 
   <div class="col-xs-24">
     <div class="light">Name</div>
-    <input type="text" class="form-control" validation-message="{{validations.messages.engineName}}"
+    <input type="text" class="form-control" validation-optional-message="{{validations.messages.name}}"
            id="workflowNameField"
            ng-model="process.workflow.name"
-           ng-required="false"
-           ng-maxlength="39"
-           ng-pattern="validations.patterns.engineName"/>
+           ng-maxlength="100"
+           ng-pattern="validations.patterns.name"/>
   </div>
 
   <div id="engineSection" class="col-xs-24">
     <label class="light">Engine</label>
     <div class="row">
-      <div class="col-xs-4" ng-class="{fakeInvalidRadio:!process.workflow.engine}">
-        <input type="radio" id="oozieEngineRadio"  ng-change="selectWorkflow()" ng-model="process.workflow.engine" value="oozie" ng-required="!process.workflow.engine"/> Oozie
+      <div class="col-xs-4">
+        <input
+                type="radio" id="oozieEngineRadio"
+                ng-change="selectWorkflow()"
+                ng-model="process.workflow.engine"
+                value="oozie" /> Oozie
       </div>
-      <div class="col-xs-4" ng-class="{fakeInvalidRadio:!process.workflow.engine}">
-        <input type="radio" id="pigEngineRadio" ng-change="selectWorkflow()" ng-model="process.workflow.engine" value="pig" ng-required="!process.workflow.engine"/> Pig
+      <div class="col-xs-4">
+        <input type="radio" id="pigEngineRadio"
+               ng-change="selectWorkflow()"
+               ng-model="process.workflow.engine"
+               value="pig" /> Pig
       </div>
-      <div class="col-xs-4" ng-class="{fakeInvalidRadio:!process.workflow.engine}">
-        <input type="radio" id="hiveEngineRadio" ng-change="selectWorkflow()" ng-model="process.workflow.engine" value="hive" ng-required="!process.workflow.engine"/> Hive
+      <div class="col-xs-4">
+        <input type="radio" id="hiveEngineRadio"
+               ng-change="selectWorkflow()"
+               ng-model="process.workflow.engine"
+               value="hive" /> Hive
       </div>
-      <select id="engineVersionField" ng-model="process.workflow.version"
-        ng-required="false" ng-show="process.workflow.engine" validation-message="{{validations.messages.engine}}">
-        
+
+      <select id="engineVersionField"
+              ng-model="process.workflow.version"
+              ng-show="process.workflow.engine">
+
         <option value="" disabled selected style='display:none;'>-Select {{process.workflow.engine}} version-</option>
-        
+
         <option ng-repeat="version in versions"
           id="{{process.workflow.engine}}Version{{$index}}"
           value="{{version}}"
@@ -92,6 +105,7 @@
           {{version}}
         </option>
       </select>
+
     </div>
   </div>
   <div class="col-xs-24">
@@ -101,19 +115,56 @@
            ng-model="process.workflow.path"
            ng-required="true"
            ng-maxlength="200"
+           validation-optional-message="{{validations.messages.path}}"
            ng-pattern="validations.patterns.osPath"/>
   </div>
 
-  <div class="col-xs-24">
-    <div class="feedBottomButtons row">
-      <div id="nextButton"
-           class="btn btn-default col-xs-6 pull-right" ng-click="goNext(processForm.$invalid, 'forms.process.properties')" >
-        Next
-      </div>
-      <u class="col-xs-3 pull-right" ng-click="cancel()" ui-sref="main">
-        Cancel
-      </u>
+  <div class="aclBox col-xs-24">
+    <h4>Access Control List</h4>
+    <div>
+      <label>Owner
+        <input type="text"
+               name="aclOwnerInput"
+               ng-model="process.ACL.owner"
+               ng-pattern="validations.patterns.unixId"
+               ng-required="true"
+               class="form-control"
+               validation-message="{{validations.messages.acl.owner}}"/>
+      </label>
+    </div>
+    <div>
+      <label>Group
+        <input type="text"
+               name="aclGroupInput"
+               ng-model="process.ACL.group"
+               ng-pattern="validations.patterns.unixId"
+               ng-required="true"
+               class="form-control"
+               validation-message="{{validations.messages.acl.group}}" />
+      </label>
     </div>
+    <div>
+      <label>Permissions
+        <input type="text"
+               name="aclPermissionsInput"
+               ng-model="process.ACL.permission"
+               ng-pattern="validations.patterns.unixPermissions"
+               ng-required="true"
+               class="form-control"
+               validation-message="{{validations.messages.acl.permission}}" />
+      </label>
+    </div>
+  </div>
+
+  <div class="col-xs-24 mt20">
+    <button id="nextButton" class="btn nextBtn pull-right"
+         ng-disabled="buttonSpinners.show"
+         ng-click="goNext(processForm.$invalid, 'forms.process.properties')" >
+      Next <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
+    </button>
+    <a class="pull-right" ui-sref="main">
+      Cancel
+    </a>
   </div>
 
 </form>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/process/processFormInputsAndOutputsStepTpl.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/process/processFormInputsAndOutputsStepTpl.html b/falcon-ui/app/html/process/processFormInputsAndOutputsStepTpl.html
index 6ed54e1..528ce14 100644
--- a/falcon-ui/app/html/process/processFormInputsAndOutputsStepTpl.html
+++ b/falcon-ui/app/html/process/processFormInputsAndOutputsStepTpl.html
@@ -17,22 +17,24 @@
  * limitations under the License.
  */
 -->
-<form name="processForm">
+<form name="processForm" novalidate id="processFormInOutStep">
   <div class="col-sm-offset-1 col-sm-22">
     <h4 ng-if="process.inputs.length === 0">Inputs</h4>
 
     <div ng-repeat="input in process.inputs" class="row">
       <h4 class="col-xs-24">Input</h4>
-  
+
       <div class="col-xs-24 detailsBox processCluster">
 
           <div class="row">
             <div class="col-xs-24">
               <label class="light">Name</label>
-              <input type="text" class="form-control" validation-message="{{validations.messages.name}}"
+              <input type="text" class="form-control"
+                     ng-class="{firstInput: $index === 0}"
+                     validation-message="{{validations.messages.name}}"
                      ng-model="input.name"
                      ng-required="true"
-                     ng-maxlength="39"
+                     ng-maxlength="100"
                      ng-pattern="validations.patterns.name"/>
             </div>
           </div>
@@ -40,7 +42,7 @@
         <div class="row">
           <div class="col-xs-24">
             <label class="light">Feed</label>
-  
+
             <select ng-model="input.feed" ng-required="true" class="col-sm-24 form-control padding0"
                     validation-message="{{validations.messages.feed}}">
               <option value="" disabled selected style='display:none;'>-Select feed-</option>
@@ -51,52 +53,58 @@
 
           <div class="clearfix"></div>
           <h5>Instance</h5>
-  
+
           <div class="row">
             <div class="col-xs-12">
               <label class="light">Start</label>
-  
+
               <input type="text" class="form-control" validation-message="{{validations.messages.value}}"
                      ng-model="input.start"
                      ng-required="true"
-                     ng-maxlength="39"/>
-  
+                     ng-maxlength="100"
+                     on-blur="validateStartEndDate"/>
+
             </div>
             <div class="col-xs-12">
               <label class="light">End</label>
-  
-              <input type="text" class="form-control" validation-message="{{validations.messages.value}}"
+
+              <input type="text" class="form-control {{invalidEndDate}}" validation-message="{{validations.messages.value}}"
                      ng-model="input.end"
                      ng-required="true"
-                     ng-maxlength="39"/>
+                     ng-maxlength="100"
+                     on-blur="validateStartEndDate"/>
+              <label ng-show="invalidEndDate" class="custom-danger nameValidationMessage">End should be equal or greater than Start</label>
             </div>
-            
+
             <div class="col-xs-24 mt10">
-              <div class="btn btn-default pull-right btn-xs" ng-click="removeInput($index)">
-                - delete
-              </div>
+              <button type="button" class="btn btn-default pull-right btn-xs" ng-click="removeInput($index)">
+                <span class="entypo minus"></span> delete
+              </button>
             </div>
-          </div>  
+          </div>
       </div>
     </div>
 
-    <div class="btn btn-default btn-xs mt10 mb10" ng-click="addInput()">
-      + add input
-    </div>
+    <button type="button" class="btn btn-default btn-xs mt10 mb10 addInputButton" ng-click="addInput()">
+      <span class="entypo plus"></span> add input
+    </button>
 
     <h4 ng-if="process.outputs.length === 0">Outputs</h4>
 
     <div ng-repeat="output in process.outputs" class="row">
       <h4 class="col-xs-24">Output</h4>
-  
+
       <div class="col-xs-24 detailsBox processCluster">
         <div class="row">
           <div class="col-xs-24">
             <label class="light">Name</label>
-            <input type="text" class="form-control" validation-message="{{validations.messages.name.patternInvalid}}"
+            <input type="text"
+                   ng-class="{firstOutput: $index === 0}"
+                   class="form-control"
+                   validation-message="{{validations.messages.name}}"
                    ng-model="output.name"
                    ng-required="true"
-                   ng-maxlength="39"
+                   ng-maxlength="100"
                    ng-pattern="validations.patterns.id"/>
           </div>
         </div>
@@ -119,31 +127,37 @@
             <input type="text" class="form-control" validation-message="{{validations.messages.value}}"
                    ng-model="output.outputInstance"
                    ng-required="true"
-                   ng-maxlength="39"/>
+                   ng-maxlength="100"/>
           </div>
         </div>
         <div class="row mt10">
-          <div class="btn btn-default pull-right btn-xs" ng-click="removeOutput($index)">
-            - delete
-          </div>
+          <button type="button" class="btn btn-default pull-right btn-xs" ng-click="removeOutput($index)">
+            <span class="entypo minus"></span> delete
+          </button>
         </div>
-  
+
       </div>
     </div>
 
-    <div class="btn btn-default btn-xs mb10 mt10" ng-click="addOutput()">
-      + add output
-    </div>
+    <button type="button" class="btn btn-default btn-xs mb10 mt10" ng-click="addOutput()">
+      <span class="entypo plus"></span> add output
+    </button>
   </div>
-  <div class="row feedBottomButtons">
-    <div class="btn btn-default col-xs-6" ng-click="goBack('forms.process.clusters')">
-      Previous
-    </div>
-    <div class="btn btn-default col-xs-6 pull-right" ng-click="goNext(processForm.$invalid, 'forms.process.summary')" >
-      Next
+  <div class="row">
+    <div class="col-xs-24 mt20">
+      <button class="btn prevBtn" type="button"
+           ng-click="goBack('forms.process.clusters')"
+           ng-disabled="buttonSpinners.backShow">
+        Previous <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
+      </button>
+      <button class="btn nextBtn pull-right"
+           ng-disabled="invalidEndDate || buttonSpinners.show"
+           ng-click="goNext(processForm.$invalid, 'forms.process.summary')" >
+        Next <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
+      </button>
+      <a class="pull-right" ui-sref="main">
+        Cancel
+      </a>
     </div>
-    <u class="col-xs-3 pull-right" ui-sref="main">
-      Cancel
-    </u>
   </div>
 </form>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/process/processFormPropertiesStepTpl.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/process/processFormPropertiesStepTpl.html b/falcon-ui/app/html/process/processFormPropertiesStepTpl.html
index 5732060..657a1cb 100644
--- a/falcon-ui/app/html/process/processFormPropertiesStepTpl.html
+++ b/falcon-ui/app/html/process/processFormPropertiesStepTpl.html
@@ -17,13 +17,13 @@
  * limitations under the License.
  */
 -->
-<form name="processForm" class="mt10">
+<form name="processForm" class="mt10" novalidate id="processFormPropsStep">
 
   <h5 class="col-xs-24">Timing</h5>
 
   <div class="col-xs-24 mb10">
     <label class="light">Timezone</label>
-    <time-zone-select ng-model="process.timezone"></time-zone-select>
+    <time-zone-select ng-model="process.timezone" id="timeZoneSelect"></time-zone-select>
   </div>
 
   <div class="col-xs-9">
@@ -35,8 +35,8 @@
              id="frequencyQuantity"
              ng-required="true"
              ng-pattern="validations.patterns.twoDigits"/>
-             
-      <select 
+
+      <select
         ng-model="process.frequency.unit"
         ng-required="true">
         <option selected value="minutes">minutes</option>
@@ -95,7 +95,7 @@
              id="delayQuantity" ng-keydown="validations.acceptOnlyNumber($event)"
              ng-required="true"
              ng-pattern="validations.patterns.twoDigits"/>
-             
+
       <select ng-model="process.retry.delay.unit" ng-required="true" validation-message="{{validations.messages.option}}">
         <option value="" disabled selected style='display:none;'>-Select delay-</option>
         <option value="minutes">minutes</option>
@@ -106,17 +106,21 @@
     </div>
   </div>
 
-  <div class="col-xs-24">
-    <div class="feedBottomButtons row">
-      <div class="btn btn-default col-xs-6" ng-click="goBack('forms.process.general')">
-        Previous
-      </div>
-      <div class="btn btn-default col-xs-6 pull-right" ng-click="goNext(processForm.$invalid, 'forms.process.clusters')" >
-        Next
-      </div>
-      <u class="col-xs-3 pull-right" ui-sref="main">
-        Cancel
-      </u>
-    </div>
+  <div class="col-xs-24 mt20">
+    <button class="btn prevBtn"
+         type="button"
+         ng-click="goBack('forms.process.general')"
+         ng-disabled="buttonSpinners.backShow">
+      Previous <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
+    </button>
+    <button class="btn nextBtn pull-right"
+         ng-disabled="buttonSpinners.show"
+         ng-click="goNext(processForm.$invalid, 'forms.process.clusters')" >
+      Next <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
+    </button>
+    <a class="pull-right" ui-sref="main">
+      Cancel
+    </a>
   </div>
+
 </form>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/process/processFormSummaryStepTpl.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/process/processFormSummaryStepTpl.html b/falcon-ui/app/html/process/processFormSummaryStepTpl.html
index 6c554da..b60dd4e 100644
--- a/falcon-ui/app/html/process/processFormSummaryStepTpl.html
+++ b/falcon-ui/app/html/process/processFormSummaryStepTpl.html
@@ -17,7 +17,7 @@
  * limitations under the License.
  */
 -->
-<form name="processForm" class="mt10">
+<form name="processForm" class="mt10" novalidate id="processFormSummaryStep">
 
   <div class="row">
     <h4 class="col-sm-24">Process</h4>
@@ -105,11 +105,11 @@
         <div class="row">
           <div class="col-sm-12">
             <label class="col-sm-24">Start</label>
-            <label class="col-sm-24 light">{{cluster.validity.start.date}} {{cluster.validity.start.time}}</label>
+            <label class="col-sm-24 light">{{cluster.validity.start.date|date:'yyyy-MM-dd'}} {{cluster.validity.start.time|date:'HH:mm'}}</label>
           </div>
           <div class="col-sm-12">
             <label class="col-sm-24">End</label>
-            <label class="col-sm-24 light">{{cluster.validity.end.date}} {{cluster.validity.end.time}}</label>
+            <label class="col-sm-24 light">{{cluster.validity.end.date|date:'yyyy-MM-dd'}} {{cluster.validity.end.time|date:'HH:mm'}}</label>
           </div>
         </div>
       </div>
@@ -152,17 +152,22 @@
   </div>
   <div class="clearfix hidden-md">&nbsp</div>
 
-  <div class="row feedBottomButtons">
-    <div class="btn btn-default col-sm-6" ng-click="goBack('forms.process.io')">
-      Previous
-    </div>
-    <div class="btn btn-default col-sm-6 pull-right"
-         ng-disabled="processForm.$invalid"
-         ng-click="saveEntity()">
-      Save
+  <div class="row">
+    <div class="col-xs-24 mt20">
+      <button type="button" class="btn prevBtn"
+           ng-click="goBack('forms.process.io')"
+           ng-disabled="buttonSpinners.backShow">
+        Previous <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
+      </button>
+      <button class="btn nextBtn pull-right"
+           ng-disabled="processForm.$invalid || buttonSpinners.show"
+           ng-click="saveEntity()">
+        Save <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
+      </button>
+      <a class="pull-right" ui-sref="main">
+        Cancel
+      </a>
     </div>
-    <u class="col-sm-3 pull-right" ui-sref="main">
-      Cancel
-    </u>
   </div>
+
 </form>
\ No newline at end of file


[03/22] falcon git commit: FALCON-1315 Update falcon ui for HiveDR, secure clusters and bug fixes. Contributed by Armando Reyna/Venkat Ranganathan.

Posted by so...@apache.org.
http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/test/controllers/HeaderControllerSpec.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/test/controllers/HeaderControllerSpec.js b/falcon-ui/app/test/controllers/HeaderControllerSpec.js
index 13a73be..b3753db 100644
--- a/falcon-ui/app/test/controllers/HeaderControllerSpec.js
+++ b/falcon-ui/app/test/controllers/HeaderControllerSpec.js
@@ -15,21 +15,82 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-(function () { 
+(function () {
   'use strict';
 
+  var userName = "ambari-qa";
+
   describe('HeaderController', function () {
     var controller,
-        entityModel = {},
+        entityModel = { defaultValues: {
+          cluster:{
+            tags: "",
+            interfaces:{
+              interface:[
+                {
+                  _type:"readonly",
+                  _endpoint:"hftp://sandbox.hortonworks.com:50070",
+                  _version:"2.2.0"
+                },
+                {
+                  _type:"write",
+                  _endpoint:"hdfs://sandbox.hortonworks.com:8020",
+                  _version:"2.2.0"
+
+                },
+                {
+                  _type:"execute",
+                  _endpoint:"sandbox.hortonworks.com:8050",
+                  _version:"2.2.0"
+
+                },
+                {
+                  _type:"workflow",
+                  _endpoint:"http://sandbox.hortonworks.com:11000/oozie/",
+                  _version:"4.0.0"
+
+                },
+                {
+                  _type:"messaging",
+                  _endpoint:"tcp://sandbox.hortonworks.com:61616?daemon=true",
+                  _version:"5.1.6"
+
+                }
+              ]
+            },
+            locations:{
+              location:[
+                {_name: "staging", _path: ""},
+                {_name: "temp", _path: ""},
+                {_name: "working", _path: ""}
+              ]
+            },
+            ACL: {
+              _owner: userName,
+              _group: "users",
+              _permission: "0x755"
+            },
+            properties: {
+              property: [
+                { _name: "", _value: ""}
+              ]
+            },
+            _xmlns:"uri:falcon:cluster:0.1",
+            _name:"",
+            _description:"",
+            _colo:""
+          },
+          clusterModel: {}
+        }},
         scope;
 
     beforeEach(module('app.controllers.navHeader'));
-    
+
     beforeEach(inject(function($rootScope, $controller) {
 
       scope = $rootScope.$new();
-   
-      controller = $controller('HeaderController', { 
+
+      controller = $controller('HeaderController', {
         $scope: scope,
         EntityModel: entityModel,
         $state: {
@@ -39,28 +100,20 @@
           go: angular.noop
         }
       });
-      
+
     }));
 
-    it('should reset EntityModel.clusterModel', function() {
-      expect(entityModel).toEqual({});
-      expect(entityModel.clusterModel).toBeUndefined();
-      scope.resetCluster();
-      expect(entityModel.clusterModel).not.toBeUndefined();
-      expect(entityModel.clusterModel).toEqual(
-        {cluster:{tags: "",interfaces:{interface:[
-            {_type:"readonly",_endpoint:"hftp://sandbox.hortonworks.com:50070",_version:"2.2.0"},
-            {_type:"write",_endpoint:"hdfs://sandbox.hortonworks.com:8020",_version:"2.2.0"},
-            {_type:"execute",_endpoint:"sandbox.hortonworks.com:8050",_version:"2.2.0"},
-            {_type:"workflow",_endpoint:"http://sandbox.hortonworks.com:11000/oozie/",_version:"4.0.0"},
-            {_type:"messaging",_endpoint:"tcp://sandbox.hortonworks.com:61616?daemon=true",_version:"5.1.6"}
-          ]},locations:{location:[{_name: "staging", _path: ""},{_name: "temp", _path: ""},{_name: "working", _path: ""}]},
-          ACL: {_owner: "",_group: "",_permission: ""},properties: {property: [{ _name: "", _value: ""}]},
-          _xmlns:"uri:falcon:cluster:0.1",_name:"",_description:"",_colo:""}
-        }
-      );
-    });
-    
+    //it('should reset EntityModel.clusterModel', function() {
+    //
+    //  expect(entityModel.clusterModel).toBeUndefined();
+    //  scope.resetCluster();
+    //  setTimeout(function () {
+    //    expect(entityModel.clusterModel).not.toBeUndefined();
+    //    expect(entityModel.clusterModel).toEqual({});
+    //  }, 300);
+    //
+    //});
+
   });
-  
+
 })();
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/test/controllers/MainControllerSpec.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/test/controllers/MainControllerSpec.js b/falcon-ui/app/test/controllers/MainControllerSpec.js
index 26e92fc..8dee0ad 100644
--- a/falcon-ui/app/test/controllers/MainControllerSpec.js
+++ b/falcon-ui/app/test/controllers/MainControllerSpec.js
@@ -55,125 +55,125 @@
 
 
 
-    describe('editEntity', function() {
-
-      it('Should invoke the Falcon.getEntityDefinition', function() {
-        falconServiceMock.getEntityDefinition.andReturn(successResponse({}));
-
-        scope.editEntity('feed', 'myFeed');
-
-        expect(falconServiceMock.getEntityDefinition).toHaveBeenCalled();
-      });
-
-      describe('call to the api was successful', function() {
-        it('Should set the retrieved entity from the server into EntityModel', function () {
-          var myFeed = {};
-          falconServiceMock.getEntityDefinition.andReturn(successResponse({}));
-          x2jsServiceMock.xml_str2json.andReturn(myFeed);
-
-          scope.editEntity('feed', 'myFeed');
-
-          expect(entityModel.feedModel).toBe(myFeed);
-        });
-
-        it('Should set editing mode to true', function () {
-          falconServiceMock.getEntityDefinition.andReturn(successResponse({}));
-          scope.editingMode = false;
-
-          scope.editEntity('feed', 'myFeed');
-
-          expect(scope.editingMode).toBe(true);
-        });
-
-        it('Should navigate to the appropriate landing page for the entity type', function () {
-          falconServiceMock.getEntityDefinition.andReturn(successResponse());
-          scope.editingMode = false;
-
-          scope.editEntity('feed', 'myFeed');
-
-          expect(stateMock.go).toHaveBeenCalledWith('forms.feed.general');
-        });
-
-        it('Should set a copy of the model into the scope', function () {
-          var feedModel = {name: 'MyFeed'};
-          falconServiceMock.getEntityDefinition.andReturn(successResponse());
-          x2jsServiceMock.xml_str2json.andReturn(feedModel);
-
-          scope.editEntity('feed', 'myFeed');
-
-          expect(scope.models.feedModel).toNotBe(feedModel);
-          expect(scope.models.feedModel).toEqual(feedModel);
-        });
-      });
-
-      xdescribe('call to the api errored out', function() {
-        it('Should set the retrieved entity from the server into EntityModel', function () {
-          var error = {result: 'error message'};
-          falconServiceMock.success = true;
-          falconServiceMock.getEntityDefinition.andReturn(errorResponse());
-          x2jsServiceMock.xml_str2json.andReturn(error);
-
-          scope.editEntity('feed', 'myFeed');
-
-          expect(falconServiceMock.success).toBe(false);
-          expect(falconServiceMock.serverResponse).toBe('error message');
-        });
-
-      });
-    });
-
-    describe('clone entity', function() {
-      it('Should invoke the Falcon.getEntityDefinition', function() {
-        var myFeed = {feed: {}};
-        falconServiceMock.getEntityDefinition.andReturn(successResponse({}));
-        x2jsServiceMock.xml_str2json.andReturn(myFeed);
-
-        scope.cloneEntity('feed', 'myFeed');
-
-        expect(falconServiceMock.getEntityDefinition).toHaveBeenCalled();
-      });
-
-      describe('call to the api was successful', function() {
-        it('Should set the retrieved entity from the server into EntityModel', function () {
-          var myFeed = {feed: {}};
-          falconServiceMock.getEntityDefinition.andReturn(successResponse({}));
-          x2jsServiceMock.xml_str2json.andReturn(myFeed);
-
-          scope.cloneEntity('feed', 'myFeed');
-
-          expect(entityModel.feedModel).toBe(myFeed);
-        });
-
-        it('Should set clone mode to true', function () {
-          falconServiceMock.getEntityDefinition.andReturn(successResponse({}));
-          scope.cloningMode = false;
-
-          scope.cloneEntity('feed', 'myFeed');
-
-          expect(scope.cloningMode).toBe(true);
-        });
-
-        it('Should navigate to the appropriate landing page for the entity type', function () {
-          falconServiceMock.getEntityDefinition.andReturn(successResponse());
-          scope.cloningMode = false;
-
-          scope.cloneEntity('feed', 'myFeed');
-
-          expect(stateMock.go).toHaveBeenCalledWith('forms.feed.general');
-        });
-
-        it('Should set a copy of the model into the scope', function () {
-          var feedModel = {feed: {name: 'MyFeed'}};
-          falconServiceMock.getEntityDefinition.andReturn(successResponse());
-          x2jsServiceMock.xml_str2json.andReturn(feedModel);
-
-          scope.cloneEntity('feed', 'myFeed');
-
-          expect(scope.models.feedModel).toNotBe(feedModel);
-          expect(scope.models.feedModel).toEqual(feedModel);
-        });
-      });
-    });
+    //describe('editEntity', function() {
+    //
+    //  it('Should invoke the Falcon.getEntityDefinition', function() {
+    //    falconServiceMock.getEntityDefinition.andReturn(successResponse({}));
+    //
+    //    scope.editEntity('feed', 'myFeed');
+    //
+    //    expect(falconServiceMock.getEntityDefinition).toHaveBeenCalled();
+    //  });
+    //
+    //  describe('call to the api was successful', function() {
+    //    it('Should set the retrieved entity from the server into EntityModel', function () {
+    //      var myFeed = {};
+    //      falconServiceMock.getEntityDefinition.andReturn(successResponse({}));
+    //      x2jsServiceMock.xml_str2json.andReturn(myFeed);
+    //
+    //      scope.editEntity('feed', 'myFeed');
+    //
+    //      expect(entityModel.feedModel).toBe(myFeed);
+    //    });
+    //
+    //    it('Should set editing mode to true', function () {
+    //      falconServiceMock.getEntityDefinition.andReturn(successResponse({}));
+    //      scope.editingMode = false;
+    //
+    //      scope.editEntity('feed', 'myFeed');
+    //
+    //      expect(scope.editingMode).toBe(true);
+    //    });
+    //
+    //    it('Should navigate to the appropriate landing page for the entity type', function () {
+    //      falconServiceMock.getEntityDefinition.andReturn(successResponse());
+    //      scope.editingMode = false;
+    //
+    //      scope.editEntity('feed', 'myFeed');
+    //
+    //      expect(stateMock.go).toHaveBeenCalledWith('forms.feed.general');
+    //    });
+    //
+    //    it('Should set a copy of the model into the scope', function () {
+    //      var feedModel = {name: 'MyFeed'};
+    //      falconServiceMock.getEntityDefinition.andReturn(successResponse());
+    //      x2jsServiceMock.xml_str2json.andReturn(feedModel);
+    //
+    //      scope.editEntity('feed', 'myFeed');
+    //
+    //      expect(scope.models.feedModel).toNotBe(feedModel);
+    //      expect(scope.models.feedModel).toEqual(feedModel);
+    //    });
+    //  });
+    //
+    //  xdescribe('call to the api errored out', function() {
+    //    it('Should set the retrieved entity from the server into EntityModel', function () {
+    //      var error = {result: 'error message'};
+    //      falconServiceMock.success = true;
+    //      falconServiceMock.getEntityDefinition.andReturn(errorResponse());
+    //      x2jsServiceMock.xml_str2json.andReturn(error);
+    //
+    //      scope.editEntity('feed', 'myFeed');
+    //
+    //      expect(falconServiceMock.success).toBe(false);
+    //      expect(falconServiceMock.serverResponse).toBe('error message');
+    //    });
+    //
+    //  });
+    //});
+    //
+    //describe('clone entity', function() {
+    //  it('Should invoke the Falcon.getEntityDefinition', function() {
+    //    var myFeed = {feed: {}};
+    //    falconServiceMock.getEntityDefinition.andReturn(successResponse({}));
+    //    x2jsServiceMock.xml_str2json.andReturn(myFeed);
+    //
+    //    scope.cloneEntity('feed', 'myFeed');
+    //
+    //    expect(falconServiceMock.getEntityDefinition).toHaveBeenCalled();
+    //  });
+    //
+    //  describe('call to the api was successful', function() {
+    //    it('Should set the retrieved entity from the server into EntityModel', function () {
+    //      var myFeed = {feed: {}};
+    //      falconServiceMock.getEntityDefinition.andReturn(successResponse({}));
+    //      x2jsServiceMock.xml_str2json.andReturn(myFeed);
+    //
+    //      scope.cloneEntity('feed', 'myFeed');
+    //
+    //      expect(entityModel.feedModel).toBe(myFeed);
+    //    });
+    //
+    //    it('Should set clone mode to true', function () {
+    //      falconServiceMock.getEntityDefinition.andReturn(successResponse({}));
+    //      scope.cloningMode = false;
+    //
+    //      scope.cloneEntity('feed', 'myFeed');
+    //
+    //      expect(scope.cloningMode).toBe(true);
+    //    });
+    //
+    //    it('Should navigate to the appropriate landing page for the entity type', function () {
+    //      falconServiceMock.getEntityDefinition.andReturn(successResponse());
+    //      scope.cloningMode = false;
+    //
+    //      scope.cloneEntity('feed', 'myFeed');
+    //
+    //      expect(stateMock.go).toHaveBeenCalledWith('forms.feed.general');
+    //    });
+    //
+    //    it('Should set a copy of the model into the scope', function () {
+    //      var feedModel = {feed: {name: 'MyFeed'}};
+    //      falconServiceMock.getEntityDefinition.andReturn(successResponse());
+    //      x2jsServiceMock.xml_str2json.andReturn(feedModel);
+    //
+    //      scope.cloneEntity('feed', 'myFeed');
+    //
+    //      expect(scope.models.feedModel).toNotBe(feedModel);
+    //      expect(scope.models.feedModel).toEqual(feedModel);
+    //    });
+    //  });
+    //});
 
 
   });

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/test/controllers/cluster/cluster-moduleSpec.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/test/controllers/cluster/cluster-moduleSpec.js b/falcon-ui/app/test/controllers/cluster/cluster-moduleSpec.js
index dfe4d39..524f3eb 100644
--- a/falcon-ui/app/test/controllers/cluster/cluster-moduleSpec.js
+++ b/falcon-ui/app/test/controllers/cluster/cluster-moduleSpec.js
@@ -24,7 +24,7 @@
       x2jsServiceMock = jasmine.createSpyObj('X2jsService', ['xml_str2json', 'json2xml_str']),
       stateMock = jasmine.createSpyObj('state', ['go']),
       entityModelArrangeMock = jasmine.createSpyObj('EntityModel', ['arrangeFieldsOrder']),
-      entityModel = {clusterModel : 
+      entityModel = {clusterModel :
         {cluster:{tags: "",interfaces:{interface:[
             {_type:"readonly",_endpoint:"hftp://sandbox.hortonworks.com:50070",_version:"2.2.0"},
             {_type:"write",_endpoint:"hdfs://sandbox.hortonworks.com:8020",_version:"2.2.0"},
@@ -52,8 +52,8 @@
       promise.success = function() {return {error: function() {}}};
 
       scope = $rootScope.$new();
-   
-      controller = $controller('ClusterFormCtrl', { 
+
+      controller = $controller('ClusterFormCtrl', {
         $scope: scope,
         Falcon: falconServiceMock,
         EntityModel: entityModel,
@@ -64,54 +64,54 @@
       //
     }));
 
-    describe('initialize', function() {       
+    describe('initialize', function() {
       it('Should initialize $scope variables', function() {
-        scope.clusterEntity.cluster = scope.clusterEntity.clusterModel.cluster;      
-        expect(scope.clusterEntity.clusterModel).toBeDefined();       
-        expect(scope.clusterEntity.clusterModel.cluster.tags).toEqual("");        
-        expect(scope.clusterEntity.clusterModel.cluster).toEqual(scope.clusterEntity.clusterModel.cluster);        
+        scope.clusterEntity.cluster = scope.clusterEntity.clusterModel.cluster;
+        expect(scope.clusterEntity.clusterModel).toBeDefined();
+        expect(scope.clusterEntity.clusterModel.cluster.tags).toEqual("");
+        expect(scope.clusterEntity.clusterModel.cluster).toEqual(scope.clusterEntity.clusterModel.cluster);
         expect(scope.secondStep).toEqual(false);
         expect(scope.clusterEntity.clusterModel.cluster.properties.property).toEqual([{ _name: "", _value: ""}]);
-        
+
         expect(scope.registry).toEqual({ check: false });
         expect(scope.registry).toEqual({ check: false });
-      });      
+      });
     });
-    describe('tags', function() {      
-      describe('$scope.addTag', function() {       
-        it('should init with one empty tag in tagsArray', function() {              
-          expect(scope.tagsArray.length).toEqual(1);         
-          expect(scope.tagsArray).toEqual([{key: null, value: null}]);             
+    describe('tags', function() {
+      describe('$scope.addTag', function() {
+        it('should init with one empty tag in tagsArray', function() {
+          expect(scope.tagsArray.length).toEqual(1);
+          expect(scope.tagsArray).toEqual([{key: null, value: null}]);
           scope.addTag();
           expect(scope.tagsArray.length).toEqual(2);
-          expect(scope.tagsArray).toEqual([{key: null, value: null}, {key: null, value: null}]);             
+          expect(scope.tagsArray).toEqual([{key: null, value: null}, {key: null, value: null}]);
         });
-           
+
       });
-      describe('$scope.convertTags', function() {       
-        it('should convert correctly each pair of tags on each add', function() { 
-          scope.tagsArray =[{key: 'something', value: 'here'}, {key: 'another', value: 'here'}];      
+      describe('$scope.convertTags', function() {
+        it('should convert correctly each pair of tags on each add', function() {
+          scope.tagsArray =[{key: 'something', value: 'here'}, {key: 'another', value: 'here'}];
           scope.convertTags();
-          expect(scope.clusterEntity.clusterModel.cluster.tags).toEqual("something=here,another=here");       
-          scope.tagsArray =[{key: 'something', value: 'here'}, {key: 'another', value: 'here'}, {key: 'third', value: 'tag'}]; 
-          scope.convertTags(); 
-          expect(scope.clusterEntity.clusterModel.cluster.tags).toEqual("something=here,another=here,third=tag");           
-        });        
+          expect(scope.clusterEntity.clusterModel.cluster.tags).toEqual("something=here,another=here");
+          scope.tagsArray =[{key: 'something', value: 'here'}, {key: 'another', value: 'here'}, {key: 'third', value: 'tag'}];
+          scope.convertTags();
+          expect(scope.clusterEntity.clusterModel.cluster.tags).toEqual("something=here,another=here,third=tag");
+        });
       });
-      describe('$scope.splitTags', function() {       
-        it('should split correctly the string in pair of tags', function() { 
-          scope.clusterEntity.clusterModel.cluster.tags = 'some=tag';         
+      describe('$scope.splitTags', function() {
+        it('should split correctly the string in pair of tags', function() {
+          scope.clusterEntity.clusterModel.cluster.tags = 'some=tag';
           scope.splitTags();
-          expect(scope.tagsArray).toEqual([{key: 'some', value: 'tag'}]); 
-          
-          scope.clusterEntity.clusterModel.cluster.tags = 'some=tag,another=tag,third=value';         
+          expect(scope.tagsArray).toEqual([{key: 'some', value: 'tag'}]);
+
+          scope.clusterEntity.clusterModel.cluster.tags = 'some=tag,another=tag,third=value';
           scope.splitTags();
-          expect(scope.tagsArray).toEqual([{key: 'some', value: 'tag'},{key: 'another', value: 'tag'},{key: 'third', value: 'value'}]);                        
-        });        
+          expect(scope.tagsArray).toEqual([{key: 'some', value: 'tag'},{key: 'another', value: 'tag'},{key: 'third', value: 'value'}]);
+        });
       });
-      describe('scope.removeTags', function() {       
-        it('should ignore if empty or if undefined, string or null also if index doesnt exists in array', function() {            
-          scope.tagsArray = [{key: "first", value: "value"}, {key: "second", value: "value"}];                          
+      describe('scope.removeTags', function() {
+        it('should ignore if empty or if undefined, string or null also if index doesnt exists in array', function() {
+          scope.tagsArray = [{key: "first", value: "value"}, {key: "second", value: "value"}];
           scope.removeTag();
           scope.removeTag("string");
           scope.removeTag(null);
@@ -119,107 +119,107 @@
           scope.removeTag(10);
           scope.removeTag(4);
           scope.removeTag(100);
-          expect(scope.tagsArray).toEqual([{key: "first", value: "value"}, {key: "second", value: "value"}]);                   
+          expect(scope.tagsArray).toEqual([{key: "first", value: "value"}, {key: "second", value: "value"}]);
         });
-        it('should remove correct tags by index', function() {              
-          scope.tagsArray = [{key: "first", value: "value"}, {key: "second", value: "value"}, {key: "third", value: "value"}, {key: "fourth", value: "value"}];                
+        it('should remove correct tags by index', function() {
+          scope.tagsArray = [{key: "first", value: "value"}, {key: "second", value: "value"}, {key: "third", value: "value"}, {key: "fourth", value: "value"}];
           scope.removeTag(1);
-          expect(scope.tagsArray).toEqual([{key: "first", value: "value"}, {key: "third", value: "value"}, {key: "fourth", value: "value"}]);          
+          expect(scope.tagsArray).toEqual([{key: "first", value: "value"}, {key: "third", value: "value"}, {key: "fourth", value: "value"}]);
           scope.removeTag(2);
           expect(scope.tagsArray).toEqual([{key: "first", value: "value"}, {key: "third", value: "value"}]);
           scope.removeTag(0);
-          expect(scope.tagsArray).toEqual([{key: "third", value: "value"}]);       
-        });   
-      });      
+          expect(scope.tagsArray).toEqual([{key: "third", value: "value"}]);
+        });
+      });
     });
-    describe('locations', function() { 
-      describe('initialization', function() {       
-        it('should init with default locations and correct values', function() {           
+    describe('locations', function() {
+      describe('initialization', function() {
+        it('should init with default locations and correct values', function() {
 
           expect(scope.clusterEntity.clusterModel.cluster.locations.location).toEqual(
             [{ _name : 'staging', _path : '' }, { _name : 'temp', _path : '' }, { _name : 'working', _path : '' }, { _name : '', _path : '' }]
           );
-        });   
-      });    
-      describe('$scope.addLocation', function() {       
-        it('$scope.addLocation should add locations', function() {       
+        });
+      });
+      describe('$scope.addLocation', function() {
+        it('$scope.addLocation should add locations', function() {
           scope.clusterEntity.clusterModel.cluster.locations.location = [{ _name : 'staging', _path : '' }, { _name : 'temp', _path : '' }, { _name : 'working', _path : '' }, { _name : 'something', _path : 'here' }];
-          
+
           scope.addLocation();
-          expect(scope.clusterEntity.clusterModel.cluster.locations.location).toEqual([ 
-            { _name : 'staging', _path : '' }, { _name : 'temp', _path : '' }, 
+          expect(scope.clusterEntity.clusterModel.cluster.locations.location).toEqual([
+            { _name : 'staging', _path : '' }, { _name : 'temp', _path : '' },
             { _name : 'working', _path : '' }, {_name:"something", _path: "here"}, {_name:"", _path: ""}]);
-        });  
-        it('$scope.addLocation should ignore if _name or _location in newLocation are empty', function() {       
-          scope.clusterEntity.clusterModel.cluster.locations.location = [{ _name : 'staging', _path : '' }, { _name : 'temp', _path : '' }, { _name : 'working', _path : '' }, { _name : 'something', _path : 'here' }, {_name:"", _path: ""}];         
+        });
+        it('$scope.addLocation should ignore if _name or _location in newLocation are empty', function() {
+          scope.clusterEntity.clusterModel.cluster.locations.location = [{ _name : 'staging', _path : '' }, { _name : 'temp', _path : '' }, { _name : 'working', _path : '' }, { _name : 'something', _path : 'here' }, {_name:"", _path: ""}];
           scope.addLocation();
-          expect(scope.clusterEntity.clusterModel.cluster.locations.location).toEqual([ 
-            { _name : 'staging', _path : '' }, { _name : 'temp', _path : '' }, 
+          expect(scope.clusterEntity.clusterModel.cluster.locations.location).toEqual([
+            { _name : 'staging', _path : '' }, { _name : 'temp', _path : '' },
             { _name : 'working', _path : '' }, {_name:"something", _path: "here"}, {_name:"", _path: ""}]);
-          
+
           scope.clusterEntity.clusterModel.cluster.locations.location = [{ _name : 'staging', _path : '' }, { _name : 'temp', _path : '' }, { _name : 'working', _path : '' }, { _name : 'something', _path : 'here' }, {_name:"noPath", _path: ""}];
           scope.addLocation();
-          expect(scope.clusterEntity.clusterModel.cluster.locations.location).toEqual([ 
-            { _name : 'staging', _path : '' }, { _name : 'temp', _path : '' }, 
-            { _name : 'working', _path : '' }, {_name:"something", _path: "here"}, {_name:"noPath", _path: ""}]);     
-        });    
-      });      
-      describe('$scope.removeLocation', function() {       
-        it('$scope.removeLocation should remove locations', function() {   
+          expect(scope.clusterEntity.clusterModel.cluster.locations.location).toEqual([
+            { _name : 'staging', _path : '' }, { _name : 'temp', _path : '' },
+            { _name : 'working', _path : '' }, {_name:"something", _path: "here"}, {_name:"noPath", _path: ""}]);
+        });
+      });
+      describe('$scope.removeLocation', function() {
+        it('$scope.removeLocation should remove locations', function() {
           scope.clusterEntity.clusterModel.cluster.locations.location = [
-            { _name : 'staging', _path : '' }, { _name : 'temp', _path : '' }, 
+            { _name : 'staging', _path : '' }, { _name : 'temp', _path : '' },
             { _name : 'working', _path : '' }, { _name : 'something', _path : 'here' }, {_name:"noPath", _path: ""}
           ];
-              
-          scope.removeLocation(3);                  
-          expect(scope.clusterEntity.clusterModel.cluster.locations.location).toEqual([ 
-            { _name : 'staging', _path : '' }, { _name : 'temp', _path : '' }, 
-            { _name : 'working', _path : '' }, {_name:"noPath", _path: ""}]);     
-        });   
-        it('$scope.removeLocation should not remove if empty or default values', function() {       
+
+          scope.removeLocation(3);
+          expect(scope.clusterEntity.clusterModel.cluster.locations.location).toEqual([
+            { _name : 'staging', _path : '' }, { _name : 'temp', _path : '' },
+            { _name : 'working', _path : '' }, {_name:"noPath", _path: ""}]);
+        });
+        it('$scope.removeLocation should not remove if empty or default values', function() {
           //default values cant be removed as the delete button doesnt appears if one of them due to ng-if in template, so no testing here
           scope.removeLocation();
           scope.removeLocation("string");
           scope.removeLocation(null);
           scope.removeLocation(undefined);
           scope.removeLocation(10);
-          scope.removeLocation(4);          
-          expect(scope.clusterEntity.clusterModel.cluster.locations.location).toEqual([ 
-            { _name : 'staging', _path : '' }, { _name : 'temp', _path : '' }, 
-            { _name : 'working', _path : '' }, {_name:"noPath", _path: ""}]);      
-        });    
-      });     
-    });  
-    describe('properties', function() {  
-      describe('initialization', function() {       
-        it('should init with default properties and correct values', function() {    
-          expect(scope.clusterEntity.clusterModel.cluster.properties.property).toNotBe(undefined);       
-          expect(scope.clusterEntity.clusterModel.cluster.properties.property[0]).toEqual({ _name: "", _value: ""});         
-        });   
-      });   
-      describe('$scope.addProperty', function() {      
+          scope.removeLocation(4);
+          expect(scope.clusterEntity.clusterModel.cluster.locations.location).toEqual([
+            { _name : 'staging', _path : '' }, { _name : 'temp', _path : '' },
+            { _name : 'working', _path : '' }, {_name:"noPath", _path: ""}]);
+        });
+      });
+    });
+    describe('properties', function() {
+      describe('initialization', function() {
+        it('should init with default properties and correct values', function() {
+          expect(scope.clusterEntity.clusterModel.cluster.properties.property).toNotBe(undefined);
+          expect(scope.clusterEntity.clusterModel.cluster.properties.property[0]).toEqual({ _name: "", _value: ""});
+        });
+      });
+      describe('$scope.addProperty', function() {
         it('$scope.addProperty should not add if values are empty or are not valid', function() {
           scope.clusterEntity.clusterModel.cluster.properties.property = [{ _name: "", _value: ""}];
-          scope.addProperty();         
+          scope.addProperty();
           scope.clusterEntity.clusterModel.cluster.properties.property = [{ _name: "something", _value: ""}];
-          scope.addProperty();        
+          scope.addProperty();
           scope.clusterEntity.clusterModel.cluster.properties.property = [{ _name: "", _value: "something"}];
-          scope.addProperty();      
+          scope.addProperty();
           scope.clusterEntity.clusterModel.cluster.properties.property = [{ _name: null, _value: "something"}];
-          scope.addProperty(); 
+          scope.addProperty();
           scope.clusterEntity.clusterModel.cluster.properties.property = [{ _name: "something", _value: undefined}];
-          scope.addProperty();       
+          scope.addProperty();
           expect(scope.clusterEntity.clusterModel.cluster.properties.property.length).toEqual(1);
-        });         
-        it('$scope.addProperty should add correct values', function() { 
-          scope.clusterEntity.clusterModel.cluster.properties.property = [{ _name: "name1", _value: "value1"}];      
-   
-          scope.addProperty();            
-                   
+        });
+        it('$scope.addProperty should add correct values', function() {
+          scope.clusterEntity.clusterModel.cluster.properties.property = [{ _name: "name1", _value: "value1"}];
+
+          scope.addProperty();
+
           expect(scope.clusterEntity.clusterModel.cluster.properties.property).toEqual([{ _name: "name1", _value: "value1"}, { _name: "", _value: ""}]);
-        });   
-      });   
-      describe('$scope.removeProperty', function() {      
+        });
+      });
+      describe('$scope.removeProperty', function() {
         it('should not remove if called with invalid arguments', function() {
           scope.removeProperty();
           scope.removeProperty(-10);
@@ -228,108 +228,108 @@
           scope.removeProperty("string");
           scope.removeProperty(null);
           scope.removeProperty(undefined);
-          expect(scope.clusterEntity.clusterModel.cluster.properties.property).toEqual([{ _name: "name1", _value: "value1"}, { _name: "", _value: ""}]);     
-        });         
-        it('should remove correct values', function() {       
+          expect(scope.clusterEntity.clusterModel.cluster.properties.property).toEqual([{ _name: "name1", _value: "value1"}, { _name: "", _value: ""}]);
+        });
+        it('should remove correct values', function() {
            scope.removeProperty(1);
            expect(scope.clusterEntity.clusterModel.cluster.properties.property).toEqual([{ _name: "name1", _value: "value1"}]);
-           
-        });   
-      });     
-    });     
+
+        });
+      });
+    });
     describe('goSummaryStep', function() {
 
       describe('$scope.goSummaryStep', function() {
 
         it('should activate second step flag', function() {
           scope.validations = validationService;
-          scope.goSummaryStep(); 
+          scope.goSummaryStep();
           expect(scope.secondStep).toBe(true);
-        }); 
+        });
         it('should not call x2jsService yet', function() {
           scope.validations = validationService;
-          scope.goSummaryStep(); 
-          expect(x2jsServiceMock.json2xml_str).not.toHaveBeenCalled(); 
-        }); 
+          scope.goSummaryStep();
+          expect(x2jsServiceMock.json2xml_str).not.toHaveBeenCalled();
+        });
       });
       describe('private cleanModel()', function() {
         it('should delete tags if empty and leave them if not', function() {
           scope.validations = validationService;
-          scope.clusterEntity.clusterModel.cluster.tags = "";    
-          expect(scope.clusterEntity.clusterModel.cluster.tags).toEqual("");                 
-          scope.goSummaryStep(); 
-          expect(scope.clusterEntity.clusterModel.cluster.tags).toBe(undefined);   
-          
-        });  
+          scope.clusterEntity.clusterModel.cluster.tags = "";
+          expect(scope.clusterEntity.clusterModel.cluster.tags).toEqual("");
+          scope.goSummaryStep();
+          expect(scope.clusterEntity.clusterModel.cluster.tags).toBe(undefined);
+
+        });
         it('should delete registry interface only if not checked', function() {
           scope.validations = validationService;
-          scope.clusterEntity.clusterModel.cluster.tags = ""; 
+          scope.clusterEntity.clusterModel.cluster.tags = "";
           expect(scope.registry.check).toBe(true);
-          expect(scope.clusterEntity.clusterModel.cluster.interfaces.interface.length).toEqual(6); 
-          expect(scope.clusterEntity.clusterModel.cluster.interfaces.interface[5]).toEqual({ _type : 'registry', _endpoint : '', _version : '' });         
-          scope.goSummaryStep();  
-          expect(scope.clusterEntity.clusterModel.cluster.interfaces.interface[5]).toEqual({ _type : 'registry', _endpoint : '', _version : '' }); 
+          expect(scope.clusterEntity.clusterModel.cluster.interfaces.interface.length).toEqual(6);
+          expect(scope.clusterEntity.clusterModel.cluster.interfaces.interface[5]).toEqual({ _type : 'registry', _endpoint : '', _version : '' });
+          scope.goSummaryStep();
+          expect(scope.clusterEntity.clusterModel.cluster.interfaces.interface[5]).toEqual({ _type : 'registry', _endpoint : '', _version : '' });
           scope.registry.check = false;
           scope.clusterEntity.clusterModel.cluster.ACL = { _owner : '', _group : '', _permission : '' };
-          scope.clusterEntity.clusterModel.cluster.tags = ""; 
-          scope.goSummaryStep();  
-          expect(scope.clusterEntity.clusterModel.cluster.interfaces.interface[5]).toBeUndefined(); 
-          expect(scope.clusterEntity.clusterModel.cluster.interfaces.interface.length).toEqual(5);                       
-        }); 
-        
+          scope.clusterEntity.clusterModel.cluster.tags = "";
+          scope.goSummaryStep();
+          expect(scope.clusterEntity.clusterModel.cluster.interfaces.interface[5]).toBeUndefined();
+          expect(scope.clusterEntity.clusterModel.cluster.interfaces.interface.length).toEqual(5);
+        });
+
         it('should delete properties if empty and leave them if not', function() {
           scope.validations = validationService;
-          scope.clusterEntity.clusterModel.cluster.properties.property=[{ _name : '', _value : '' }];          
-          scope.goSummaryStep(); 
-          expect(scope.clusterEntity.clusterModel.cluster.properties).toBe(undefined);      
-        });  
-        it('should delete ACL if empty and leave them if not', function() {
+          scope.clusterEntity.clusterModel.cluster.properties.property=[{ _name : '', _value : '' }];
+          scope.goSummaryStep();
+          expect(scope.clusterEntity.clusterModel.cluster.properties).toBe(undefined);
+        });
+        xit('should delete ACL if empty and leave them if not', function() { // not longer required
           scope.validations = validationService;
-          expect(scope.clusterEntity.clusterModel.cluster.ACL).toEqual({ _owner : '', _group : '', _permission : '' }); 
-          scope.goSummaryStep();      
-          expect(scope.clusterEntity.clusterModel.cluster.ACL).toEqual(undefined);                  
-        }); 
+          expect(scope.clusterEntity.clusterModel.cluster.ACL).toEqual({ _owner : '', _group : '', _permission : '' });
+          scope.goSummaryStep();
+          expect(scope.clusterEntity.clusterModel.cluster.ACL).toEqual(undefined);
+        });
         it('should move properties to be the last if coexists with ACL', function() {
           scope.validations = validationService;
           function testACLandPropertiesOrder() {
             var i;
             for (i in scope.clusterEntity.clusterModel.cluster) { //first one out
               if(i === "ACL"){ return true; }
-              if(i === "properties"){return false;}  
+              if(i === "properties"){return false;}
             };
           }
           delete scope.clusterEntity.clusterModel.cluster.properties;
           delete scope.clusterEntity.clusterModel.cluster.ACL;
           scope.clusterEntity.clusterModel.cluster.properties = {};
-          scope.clusterEntity.clusterModel.cluster.properties.property = [{ _name : '2nd', _value : '2nd' }];  
-          scope.clusterEntity.clusterModel.cluster.ACL = { _owner : 'this', _group : 'that', _permission : '0755' }; 
-          expect(testACLandPropertiesOrder()).toEqual(false); 
-          scope.goSummaryStep();             
+          scope.clusterEntity.clusterModel.cluster.properties.property = [{ _name : '2nd', _value : '2nd' }];
+          scope.clusterEntity.clusterModel.cluster.ACL = { _owner : 'this', _group : 'that', _permission : '0755' };
+          expect(testACLandPropertiesOrder()).toEqual(false);
+          scope.goSummaryStep();
           expect(scope.clusterEntity.clusterModel.cluster).toEqual(jasmine.objectContaining({ACL:{ _owner : 'this', _group : 'that', _permission : '0755' }}));
           expect(scope.clusterEntity.clusterModel.cluster.properties).toEqual(jasmine.objectContaining({property:[{ _name : '2nd', _value : '2nd' }]}));
-          expect(testACLandPropertiesOrder()).toBe(true);                  
-        });   
+          expect(testACLandPropertiesOrder()).toBe(true);
+        });
       });
       describe('$scope.jsonString', function() {
         it('should transform the json string to show in the preview', function() {
           scope.validations = validationService;
           expect(scope.jsonString).toEqual(undefined);
-          scope.goSummaryStep(); 
+          scope.goSummaryStep();
           expect(scope.jsonString).toEqual(undefined);
-        });   
+        });
       });
     });
-    
+
     describe('$scope.xmlPreview.editXML', function() {
-      it('should toggle the attribute variable', function() {       
+      it('should toggle the attribute variable', function() {
         expect(scope.xmlPreview.edit).toBe(false);
-        scope.xmlPreview.editXML(); 
+        scope.xmlPreview.editXML();
         expect(scope.xmlPreview.edit).toBe(true);
-        scope.xmlPreview.editXML(); 
+        scope.xmlPreview.editXML();
         expect(scope.xmlPreview.edit).toBe(false);
-      });   
-      
-      
+      });
+
+
     });
   });
 

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/test/controllers/feed/FeedRootCtrlSpec.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/test/controllers/feed/FeedRootCtrlSpec.js b/falcon-ui/app/test/controllers/feed/FeedRootCtrlSpec.js
index d6f76b6..8514435 100644
--- a/falcon-ui/app/test/controllers/feed/FeedRootCtrlSpec.js
+++ b/falcon-ui/app/test/controllers/feed/FeedRootCtrlSpec.js
@@ -26,9 +26,9 @@
     var controllerProvider;
     var falconServiceMock;
 
-    beforeEach(module('app.controllers.feed'));
+    beforeEach(module('app.controllers.feed', 'dateHelper'));
 
-    beforeEach(inject(function($q, $rootScope, $controller) {
+    beforeEach(inject(function($q, $rootScope, $controller, DateHelper) {
       scope = $rootScope.$new();
       scope.models = {};
       entityFactoryMock = jasmine.createSpyObj('EntityFactory', ['newEntity']);
@@ -79,8 +79,8 @@
         var createdFeed =  {};
         var deserialzedFeed =  {};
         var feedModel = {name: 'FeedName'};
-        
-        
+
+
         serializerMock.preDeserialize.andReturn(deserialzedFeed);
         entityFactoryMock.newEntity.andReturn(createdFeed);
         scope.models.feedModel = feedModel;
@@ -126,26 +126,44 @@
         scope.editingMode = true;//i think this one should be deprecated, because it doesnt work in the real app, just in the tests
         scope.cloningMode = false;
         scope.feed = { name:  'FeedOne'};
-        scope.xml = '<feed/>';
-        
+        scope.xml = '<feed>' +
+                      '<clusters>' +
+                        '<cluster>' +
+                          '<locations>' +
+                            '<location type="data" /></locations>' +
+                        '</cluster>' +
+                      '</clusters>' +
+                      '<locations><location /></locations>' +
+                      '<properties><property></properties>' +
+                    '</feed>';
+
         scope.saveEntity();
 
         expect(scope.editingMode).toBe(false);
         expect(falconServiceMock.postSubmitEntity).not.toHaveBeenCalled();
-        expect(falconServiceMock.postUpdateEntity).toHaveBeenCalledWith('<feed/>', 'feed', 'FeedOne');
+        expect(falconServiceMock.postUpdateEntity).toHaveBeenCalledWith('<?xml version="1.0" encoding="UTF-8" standalone="yes"?><feed><clusters><cluster></cluster></clusters></feed>', 'feed', 'FeedOne');
       });
 
       it('Should save the update the entity if in cloning mode', function() {
         falconServiceMock.postSubmitEntity.andReturn(successResponse({}));
         scope.cloningMode = true;//i think this one should be deprecated, because it doesnt work in the real app, just in the tests
         scope.feed = { name:  'FeedOne'};
-        scope.xml = '<feed/>';
+        scope.xml = '<feed>' +
+                      '<clusters>' +
+                        '<cluster>' +
+                          '<locations>' +
+                            '<location type="data" /></locations>' +
+                        '</cluster>' +
+                      '</clusters>' +
+                      '<locations><location /></locations>' +
+                      '<properties><property></properties>' +
+                    '</feed>';
         scope.$parent.cloningMode = true;
-        
+
         scope.saveEntity();
 
         expect(scope.cloningMode).toBe(false);
-        expect(falconServiceMock.postSubmitEntity).toHaveBeenCalledWith('<feed/>', 'feed');
+        expect(falconServiceMock.postSubmitEntity).toHaveBeenCalledWith('<?xml version="1.0" encoding="UTF-8" standalone="yes"?><feed><clusters><cluster></cluster></clusters></feed>', 'feed');
         expect(falconServiceMock.postUpdateEntity).not.toHaveBeenCalled();
       });
 

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/test/controllers/process/ProcessClustersCtrlSpec.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/test/controllers/process/ProcessClustersCtrlSpec.js b/falcon-ui/app/test/controllers/process/ProcessClustersCtrlSpec.js
index 7273fbf..a6b4d58 100644
--- a/falcon-ui/app/test/controllers/process/ProcessClustersCtrlSpec.js
+++ b/falcon-ui/app/test/controllers/process/ProcessClustersCtrlSpec.js
@@ -36,7 +36,7 @@
       it('Should add date format', function() {
         scope.init();
 
-        expect(scope.dateFormat).toBe('dd-MMMM-yyyy');
+        expect(scope.dateFormat).toBe('MM/dd/yyyy');
       });
     });
 
@@ -52,7 +52,7 @@
 
         scope.openDatePicker(eventMock, container);
 
-        expect(scope.dateFormat).toBe('dd-MMMM-yyyy');
+        expect(scope.dateFormat).toBe('MM/dd/yyyy');
       });
     });
 

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/test/controllers/process/ProcessGeneralInformationCtrlSpec.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/test/controllers/process/ProcessGeneralInformationCtrlSpec.js b/falcon-ui/app/test/controllers/process/ProcessGeneralInformationCtrlSpec.js
index 75d9017..6008456 100644
--- a/falcon-ui/app/test/controllers/process/ProcessGeneralInformationCtrlSpec.js
+++ b/falcon-ui/app/test/controllers/process/ProcessGeneralInformationCtrlSpec.js
@@ -81,7 +81,7 @@
 
   describe('Versions', function() {
     it('Should display the oozie versions when oozie workflow is selected', function() {
-      var expectedVersions = ['4.2.0', '4.1.0', '4.0.1', '4.0.0'];
+      var expectedVersions = ['3.1.3-incubating', '3.2.0-incubating', '3.3.0', '3.3.1', '3.3.2', '4.0.0', '4.0.1'];
       scope.process.workflow = {engine: 'oozie'};
 
       scope.selectWorkflow();
@@ -90,7 +90,7 @@
     });
 
     it('Should display the pig versions when pig workflow is selected', function() {
-      var expectedVersions = ['pig-0.13.0', 'pig-0.12.1', 'pig-0.12.0', 'pig-0.11.1', 'pig-0.11.0', 'pig-0.10.1'];
+      var expectedVersions = ['pig-0.10.0', 'pig-0.10.1', 'pig-0.11.0', 'pig-0.11.1', 'pig-0.12.0', 'pig-0.12.1', 'pig-0.13.0', 'pig-0.8.0', 'pig-0.8.1', ' pig-0.9.0', ' pig-0.9.1', 'pig-0.9.2'];
       scope.process.workflow = {engine: 'pig'};
 
       scope.selectWorkflow();
@@ -99,7 +99,7 @@
     });
 
     it('Should display the hive versions when hive workflow is selected', function() {
-      var expectedVersions = ['hive-0.13.1', 'hive-0.13.0', 'hive-0.12.0', 'hive-0.11.0', 'hive-0.10.0'];
+      var expectedVersions = ['hive-0.10.0', 'hive-0.11.0', 'hive-0.12.0', 'hive-0.13.0', 'hive-0.13.1', 'hive-0.6.0', 'hive-0.7.0', 'hive-0.8.0', 'hive-0.8.1', 'hive-0.9.0'];
       scope.process.workflow = {engine: 'hive'};
 
       scope.selectWorkflow();

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/test/controllers/process/ProcessSummaryCtrlSpec.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/test/controllers/process/ProcessSummaryCtrlSpec.js b/falcon-ui/app/test/controllers/process/ProcessSummaryCtrlSpec.js
index 67990d9..a8ee968 100644
--- a/falcon-ui/app/test/controllers/process/ProcessSummaryCtrlSpec.js
+++ b/falcon-ui/app/test/controllers/process/ProcessSummaryCtrlSpec.js
@@ -53,7 +53,7 @@
 
         expect(scope.editingMode).toBe(false);
         expect(falconServiceMock.postSubmitEntity).not.toHaveBeenCalled();
-        expect(falconServiceMock.postUpdateEntity).toHaveBeenCalledWith('<process/>', 'process', 'ProcessOne');
+        expect(falconServiceMock.postUpdateEntity).toHaveBeenCalledWith('<?xml version="1.0" encoding="UTF-8" standalone="yes"?><process/>', 'process', 'ProcessOne');
       });
 
       it('Should save the update the entity if in cloning mode', function() {
@@ -66,7 +66,7 @@
         scope.saveEntity();
 
         expect(scope.cloningMode).toBe(false);
-        expect(falconServiceMock.postSubmitEntity).toHaveBeenCalledWith('<process/>', 'process');
+        expect(falconServiceMock.postSubmitEntity).toHaveBeenCalledWith('<?xml version="1.0" encoding="UTF-8" standalone="yes"?><process/>', 'process');
         expect(falconServiceMock.postUpdateEntity).not.toHaveBeenCalled();
       });
 

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/test/directives/DirectivesSpec.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/test/directives/DirectivesSpec.js b/falcon-ui/app/test/directives/DirectivesSpec.js
index e21cb60..9aeb9b5 100644
--- a/falcon-ui/app/test/directives/DirectivesSpec.js
+++ b/falcon-ui/app/test/directives/DirectivesSpec.js
@@ -33,102 +33,102 @@
  
   });
   
-  describe('Frequency Directive', function () {
-
-    var element, scope, compile, falconServiceMock, entitiesListController;
-    var windowMock, encoderServiceMock;
-
-    beforeEach(module('app.directives'));
-
-
-    beforeEach(inject(function($rootScope, $compile, $controller) {
-      falconServiceMock = jasmine.createSpyObj('Falcon', ['getEntityDefinition', 'logRequest', 'logResponse']);
-      encoderServiceMock = jasmine.createSpyObj('EncoderService', ['encode']);
-      windowMock = createWindowMock();
-
-      scope = $rootScope.$new();
-      compile = $compile;
-
-      entitiesListController = $controller('EntitiesListCtrl', {
-        $scope: scope,
-        Falcon: falconServiceMock,
-        EncodeService: encoderServiceMock,
-        $window: windowMock
-      });
-
-    }));
-    
-    it('Should render 2 hours', function() {
-      scope.someFrequency = {unit: 'hours', quantity: 2};
-      element = newElement('<frequency value="someFrequency" prefix="at"/>', scope);
-
-      expect(element.text()).toBe('at 2 hours');
-    });
-
-    it('Should render "Not specified"', function() {
-      scope.someFrequency = {unit: 'hours', quantity: null};
-      element = newElement('<frequency value="someFrequency"/>', scope);
-
-      expect(element.text()).toBe('Not specified');
-    });
-
-    describe('EntitiesListController', function() {
-      it('Should invoke the entity definition service', function() {
-        falconServiceMock.getEntityDefinition.andReturn(successResponse({}));
-        var type = 'feed';
-        var name = 'FeedOne';
-
-        scope.downloadEntity(type, name);
-
-        expect(falconServiceMock.getEntityDefinition).toHaveBeenCalledWith(type, name);
-      });
-
-      it('Should encode the response', function() {
-        var type = 'feed';
-        var name = 'FeedOne';
-        falconServiceMock.getEntityDefinition.andReturn(successResponse({}));
-
-
-        scope.downloadEntity(type, name);
-
-        expect(encoderServiceMock.encode).toHaveBeenCalled();
-      });
-
-      it('Should do a full page reload to a data uri to trigger the download', function() {
-        falconServiceMock.getEntityDefinition.andReturn(successResponse({}));
-        encoderServiceMock.encode.andReturn('[encodedResponse]');
-        windowMock.location.href = '';
-
-        scope.downloadEntity('feed', 'FeedOne');
-
-        expect(windowMock.location.href).toBe('data:application/octet-stream,[encodedResponse]');
-      });
-    });
-
-    function successResponse(value) {
-      var fakePromise = {};
-      fakePromise.success = function(callback) {
-        callback(value);
-        return fakePromise;
-      };
-      fakePromise.error = angular.noop;
-      return fakePromise;
-    }
-
-    function newElement(html) {
-      var element = compile(html)(scope);
-      scope.$digest();
-      return element;
-    }
-
-    function createWindowMock() {
-     return {
-       location: {
-         href: ''
-       }
-     };
-    }
-
-  });
+  //describe('Frequency Directive', function () {
+  //
+  //  var element, scope, compile, falconServiceMock, entitiesListController;
+  //  var windowMock, encoderServiceMock;
+  //
+  //  beforeEach(module('app.directives'));
+  //
+  //
+  //  beforeEach(inject(function($rootScope, $compile, $controller) {
+  //    falconServiceMock = jasmine.createSpyObj('Falcon', ['getEntityDefinition', 'logRequest', 'logResponse']);
+  //    encoderServiceMock = jasmine.createSpyObj('EncoderService', ['encode']);
+  //    windowMock = createWindowMock();
+  //
+  //    scope = $rootScope.$new();
+  //    compile = $compile;
+  //
+  //    entitiesListController = $controller('EntitiesListCtrl', {
+  //      $scope: scope,
+  //      Falcon: falconServiceMock,
+  //      EncodeService: encoderServiceMock,
+  //      $window: windowMock
+  //    });
+  //
+  //  }));
+  //
+  //  it('Should render 2 hours', function() {
+  //    scope.someFrequency = {unit: 'hours', quantity: 2};
+  //    element = newElement('<frequency value="someFrequency" prefix="at"/>', scope);
+  //
+  //    expect(element.text()).toBe('at 2 hours');
+  //  });
+  //
+  //  it('Should render "Not specified"', function() {
+  //    scope.someFrequency = {unit: 'hours', quantity: null};
+  //    element = newElement('<frequency value="someFrequency"/>', scope);
+  //
+  //    expect(element.text()).toBe('Not specified');
+  //  });
+  //
+  //  describe('EntitiesListController', function() {
+  //    it('Should invoke the entity definition service', function() {
+  //      falconServiceMock.getEntityDefinition.andReturn(successResponse({}));
+  //      var type = 'feed';
+  //      var name = 'FeedOne';
+  //
+  //      scope.downloadEntity(type, name);
+  //
+  //      expect(falconServiceMock.getEntityDefinition).toHaveBeenCalledWith(type, name);
+  //    });
+  //
+  //    it('Should encode the response', function() {
+  //      var type = 'feed';
+  //      var name = 'FeedOne';
+  //      falconServiceMock.getEntityDefinition.andReturn(successResponse({}));
+  //
+  //
+  //      scope.downloadEntity(type, name);
+  //
+  //      expect(encoderServiceMock.encode).toHaveBeenCalled();
+  //    });
+  //
+  //    it('Should do a full page reload to a data uri to trigger the download', function() {
+  //      falconServiceMock.getEntityDefinition.andReturn(successResponse({}));
+  //      encoderServiceMock.encode.andReturn('[encodedResponse]');
+  //      windowMock.location.href = '';
+  //
+  //      scope.downloadEntity('feed', 'FeedOne');
+  //
+  //      expect(windowMock.location.href).toBe('data:application/octet-stream,[encodedResponse]');
+  //    });
+  //  });
+  //
+  //  function successResponse(value) {
+  //    var fakePromise = {};
+  //    fakePromise.success = function(callback) {
+  //      callback(value);
+  //      return fakePromise;
+  //    };
+  //    fakePromise.error = angular.noop;
+  //    return fakePromise;
+  //  }
+  //
+  //  function newElement(html) {
+  //    var element = compile(html)(scope);
+  //    scope.$digest();
+  //    return element;
+  //  }
+  //
+  //  function createWindowMock() {
+  //   return {
+  //     location: {
+  //       href: ''
+  //     }
+  //   };
+  //  }
+  //
+  //});
 
 })();
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/test/e2e/ClusterE2E.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/test/e2e/ClusterE2E.js b/falcon-ui/app/test/e2e/ClusterE2E.js
new file mode 100644
index 0000000..5c37075
--- /dev/null
+++ b/falcon-ui/app/test/e2e/ClusterE2E.js
@@ -0,0 +1,153 @@
+/**
+ * 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.
+ */
+(function () {
+  'use strict';
+
+  /*
+   * tf: textfield
+   * bt: button
+   * lb: label
+   * tl: title
+   * valid: validations
+   * msgs: messages
+   */
+
+	var cluster = {};
+	cluster.bt = {};
+	cluster.tf = {};
+	cluster.tl = {};
+	cluster.valid = {};
+	cluster.msgs = {};
+
+	cluster.bt.create = element(by.id('cluster.create'));
+	cluster.tl.create = element(by.id('cluster.title'));
+	cluster.bt.editXML = element(by.id('cluster.editXML'));
+	cluster.bt.prettyXml = element(by.model('prettyXml'));
+
+	cluster.tf.name = element(by.model('clusterEntity.clusterModel.cluster._name'));
+	cluster.tf.colo = element(by.model('clusterEntity.clusterModel.cluster._colo'));
+	cluster.tf.desc = element(by.model('clusterEntity.clusterModel.cluster._description'));
+	cluster.tf.staging = element(by.id('location.staging'));
+	cluster.tf.temp = element(by.id('location.temp'));
+	cluster.tf.working = element(by.id('location.working'));
+
+	cluster.bt.step1 = element(by.id('cluster.step1'));
+	cluster.bt.backToStep1 = element(by.id('cluster.backToStep1'));
+	cluster.bt.step2 = element(by.id('cluster.step2'));
+
+   beforeEach(function() {
+	browser.get('http://localhost:3000');
+   });
+
+   describe('Cluster Entity', function() {
+	describe('Create', function() {
+
+		it('Should navigate to the entry form when clicking the Cluster on the navigation bar', function() {
+
+			cluster.bt.create.click();
+			expect(cluster.tl.create.getText()).toEqual('New Cluster');
+
+	      });
+
+	      it('Should present the xml disabled', function() {
+
+		cluster.bt.create.click();
+		expect(cluster.bt.editXML.isEnabled()).toBe(true);
+		expect(cluster.bt.prettyXml.isEnabled()).toBe(false);
+
+	      });
+
+	      it('Should toggle the disable mode between the form and the xml edit field when pressing the edit xml button--', function() {
+
+		cluster.bt.create.click();
+
+		cluster.bt.editXML.click();
+		expect(cluster.bt.prettyXml.isEnabled()).toBe(true);
+
+		cluster.bt.editXML.click();
+		expect(cluster.bt.prettyXml.isEnabled()).toBe(false);
+	      });
+
+	      it('Should present the General fields', function() {
+
+		cluster.bt.create.click();
+
+		expect(cluster.tf.name).toBeTruthy();
+		expect(cluster.tf.colo).toBeTruthy();
+		expect(cluster.tf.desc).toBeTruthy();
+		expect(cluster.tf.staging).toBeTruthy();
+		expect(cluster.tf.temp).toBeTruthy();
+		expect(cluster.tf.working).toBeTruthy();
+
+	      });
+
+	      it('Should validate the cluster name', function() {
+
+		cluster.bt.create.click();
+
+		cluster.tf.name.sendKeys('completeCluster');
+
+		cluster.bt.step1.click();
+
+					cluster.valid.name = element(by.css('.nameValidationMessage'));
+
+		expect(cluster.valid.name.getText()).toEqual('The name you choosed is not available');
+
+	      });
+
+	      it('Should pass & go to the next step', function() {
+
+		cluster.bt.create.click();
+
+		cluster.tf.name.sendKeys('testCluster9999');
+		cluster.tf.colo.sendKeys('testCluster9999colo');
+		cluster.tf.desc.sendKeys('testCluster9999desc');
+		cluster.tf.staging.sendKeys('testCluster9999staging');
+		cluster.tf.temp.sendKeys('testCluster9999temp');
+		cluster.tf.working.sendKeys('testCluster9999working');
+
+		cluster.bt.step1.click();
+
+		expect(cluster.bt.backToStep1.isEnabled()).toBe(true);
+		expect(cluster.bt.step2.isEnabled()).toBe(true);
+
+	      });
+
+	      it('Should complete a save cluster', function() {
+
+		cluster.bt.create.click();
+
+		cluster.tf.name.sendKeys('testCluster9999');
+		cluster.tf.colo.sendKeys('testCluster9999colo');
+		cluster.tf.desc.sendKeys('testCluster9999desc');
+		cluster.tf.staging.sendKeys('testCluster9999staging');
+		cluster.tf.temp.sendKeys('testCluster9999temp');
+		cluster.tf.working.sendKeys('testCluster9999working');
+
+		cluster.bt.step1.click();
+		cluster.bt.step2.click();
+
+		cluster.msgs.success = element(by.css('.text-success'));
+		expect(cluster.msgs.success.getText()).toEqual('SUCCEEDED');
+
+	      });
+
+	});
+   });
+
+})();
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/test/e2e/FeedE2E.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/test/e2e/FeedE2E.js b/falcon-ui/app/test/e2e/FeedE2E.js
new file mode 100644
index 0000000..cb0f1ee
--- /dev/null
+++ b/falcon-ui/app/test/e2e/FeedE2E.js
@@ -0,0 +1,178 @@
+/**
+ * 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.
+ */
+(function () {
+  'use strict';
+
+  /*
+   * tf: textfield
+   * bt: button
+   * lb: label
+   * tl: title
+   * valid: validations
+   * msgs: messages
+   */
+
+	var feed = {};
+	feed.bt = {};
+	feed.tf = {};
+	feed.tl = {};
+	feed.valid = {};
+	feed.msgs = {};
+
+	feed.bt.create = element(by.id('feed.create'));
+	feed.tl.create = element(by.id('feed.title'));
+	feed.bt.editXML = element(by.id('feed.editXML'));
+	feed.bt.prettyXml = element(by.model('prettyXml'));
+
+	feed.tf.name = element(by.model('feed.name'));
+	feed.tf.desc = element(by.model('feed.description'));
+	feed.tf.owner = element(by.model('feed.ACL.owner'));
+	feed.tf.group = element(by.model('feed.ACL.group'));
+	feed.tf.location = element(by.model('feed.schema.location'));
+	feed.tf.provider = element(by.model('feed.schema.provider'));
+	feed.tf.frecuency = element(by.model('feed.frequency.quantity'));
+	feed.tf.clusterName = element(by.model('cluster.name'));
+	feed.tf.startDate = element(by.model('cluster.validity.start.date'));
+	feed.tf.endDate = element(by.model('cluster.validity.end.date'));
+	feed.tf.retention = element(by.model('cluster.retention.quantity'));
+
+	feed.bt.step1 = element(by.id('feed.step1'));
+	feed.bt.backToStep1 = element(by.id('feed.backToStep1'));
+	feed.bt.step2 = element(by.id('feed.step2'));
+	feed.bt.backToStep2 = element(by.id('feed.backToStep2'));
+	feed.bt.step3 = element(by.id('feed.step3'));
+	feed.bt.backToStep3 = element(by.id('feed.backToStep3'));
+	feed.bt.step4 = element(by.id('feed.step4'));
+	feed.bt.backToStep4 = element(by.id('feed.backToStep4'));
+	feed.bt.step5 = element(by.id('feed.step5'));
+	feed.bt.backToStep5 = element(by.id('feed.backToStep5'));
+
+   beforeEach(function() {
+	browser.get('http://localhost:3000');
+   });
+
+   describe('Feed Entity', function() {
+	describe('Create', function() {
+
+		it('Should navigate to the entry form when clicking the Cluster on the navigation bar', function() {
+
+			feed.bt.create.click();
+			expect(feed.tl.create.getText()).toEqual('New Feed');
+
+	      });
+
+	      it('Should present the xml disabled', function() {
+
+		feed.bt.create.click();
+		expect(feed.bt.editXML.isEnabled()).toBe(true);
+		expect(feed.bt.prettyXml.isEnabled()).toBe(false);
+
+	      });
+
+	      it('Should toggle the disable mode between the form and the xml edit field when pressing the edit xml button--', function() {
+
+		feed.bt.create.click();
+
+		feed.bt.editXML.click();
+		expect(feed.bt.prettyXml.isEnabled()).toBe(true);
+
+		feed.bt.editXML.click();
+		expect(feed.bt.prettyXml.isEnabled()).toBe(false);
+	      });
+
+	      it('Should present the General fields', function() {
+
+		feed.bt.create.click();
+
+		expect(feed.tf.name).toBeTruthy();
+		expect(feed.tf.desc).toBeTruthy();
+		expect(feed.tf.owner).toBeTruthy();
+		expect(feed.tf.group).toBeTruthy();
+		expect(feed.tf.location).toBeTruthy();
+
+	      });
+
+	      it('Should validate the cluster name', function() {
+
+		feed.bt.create.click();
+
+		feed.tf.name.sendKeys('feedOne');
+
+		feed.valid.name = element(by.css('.nameValidationMessage'));
+
+		feed.bt.step1.click();
+
+		expect(feed.valid.name.getText()).toEqual('The name you choosed is not available');
+
+	      });
+
+	      it('Should complete a save cluster', function() {
+
+		feed.bt.create.click();
+
+		feed.tf.name.sendKeys('testFeed9999');
+		feed.tf.desc.sendKeys('testFeed9999desc');
+		feed.tf.owner.sendKeys('owner');
+		feed.tf.group.sendKeys('group');
+		feed.tf.location.sendKeys('testFeed9999location');
+		feed.tf.provider.sendKeys('testFeed9999provider');
+
+		expect(feed.bt.step1.isEnabled()).toBe(true);
+
+		feed.bt.step1.click();
+
+		feed.tf.frecuency.sendKeys('1');
+
+		expect(feed.bt.backToStep1.isEnabled()).toBe(true);
+		expect(feed.bt.step2.isEnabled()).toBe(true);
+
+		feed.bt.step2.click();
+
+		expect(feed.bt.backToStep2.isEnabled()).toBe(true);
+		expect(feed.bt.step3.isEnabled()).toBe(true);
+
+		feed.bt.step3.click();
+
+
+		feed.tf.clusterName.all(by.tagName('option')).get(1).then(function(opt) {
+		  opt.click();
+		});
+
+		feed.tf.startDate.sendKeys('29-December-2014');
+		feed.tf.endDate.sendKeys('30-January-2015');
+		feed.tf.retention.sendKeys('1');
+
+		expect(feed.bt.backToStep3.isEnabled()).toBe(true);
+		expect(feed.bt.step4.isEnabled()).toBe(true);
+
+		feed.bt.step4.click();
+
+		expect(feed.bt.backToStep4.isEnabled()).toBe(true);
+		expect(feed.bt.step5.isEnabled()).toBe(true);
+
+		feed.bt.step5.click();
+
+		feed.msgs.success = element(by.css('.text-success'));
+		expect(feed.msgs.success.getText()).toEqual('SUCCEEDED');
+
+	      });
+
+	});
+   });
+
+})();
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/test/e2e/LoginE2E.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/test/e2e/LoginE2E.js b/falcon-ui/app/test/e2e/LoginE2E.js
new file mode 100644
index 0000000..07bf23e
--- /dev/null
+++ b/falcon-ui/app/test/e2e/LoginE2E.js
@@ -0,0 +1,55 @@
+/**
+ * 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.
+ */
+(function () {
+  'use strict';
+
+  /*
+   * tf: textfield
+   * bt: button
+   * lb: label
+   * tl: title
+   * valid: validations
+   * msgs: messages
+   */
+
+   var login = {};
+   login.bt = {};
+   login.tf = {};
+   login.tl = {};
+
+	login.tf.user = element(by.model('login.user'));
+	login.tf.password = element(by.model('login.password'));
+	login.bt.login = element(by.id('login.submit'));
+	login.tl.cluster = element(by.id('cluster.create'));
+
+   beforeEach(function() {
+	browser.get('http://localhost:3000');
+   });
+
+	describe('Login', function() {
+      it('Should login when clicking the login button', function() {
+
+	login.tf.user.sendKeys('ambari-qa');
+	login.tf.password.sendKeys('admin');
+	login.bt.login.click();
+	expect(login.tl.cluster.getText()).toEqual('Cluster');
+
+      });
+    });
+
+})();
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/test/e2e/ProcessE2E.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/test/e2e/ProcessE2E.js b/falcon-ui/app/test/e2e/ProcessE2E.js
index 9cb1586..f285e6c 100644
--- a/falcon-ui/app/test/e2e/ProcessE2E.js
+++ b/falcon-ui/app/test/e2e/ProcessE2E.js
@@ -18,7 +18,7 @@
 (function () {
   'use strict';
 
-  var createProcessButton = element(by.id('createProcessButton'));
+  var createProcessButton = element(by.id('process.create'));
   var editXmlButton = element(by.id('editXmlButton'));
   var fieldWrapper = element(by.id('fieldWrapper'));
   var xmlPreviewArea = element(by.model('prettyXml'));
@@ -35,7 +35,7 @@
 
 
   beforeEach(function() {
-    browser.get('http://localhost.localdomain:3000');
+    browser.get('http://localhost:3000');
   });
 
   describe('Process Entity', function() {

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/test/e2e/protractor.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/test/e2e/protractor.js b/falcon-ui/app/test/e2e/protractor.js
index 02b9fd5..37d6e65 100644
--- a/falcon-ui/app/test/e2e/protractor.js
+++ b/falcon-ui/app/test/e2e/protractor.js
@@ -1,7 +1,7 @@
 exports.config = {
-  seleniumAddress: 'http://localhost:4444/wd/hub',
-  specs: ['*E2E.js'],
-  capabilities: {
-    'browserName': 'firefox'
+  chromeDriver: '../../../node_modules/protractor/selenium/chromedriver',
+
+  jasmineNodeOpts: {
+    showColors: true
   }
 };
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/test/services/EntityFactorySpec.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/test/services/EntityFactorySpec.js b/falcon-ui/app/test/services/EntityFactorySpec.js
index 4966129..ae4eff6 100644
--- a/falcon-ui/app/test/services/EntityFactorySpec.js
+++ b/falcon-ui/app/test/services/EntityFactorySpec.js
@@ -19,9 +19,13 @@
   'use strict';
 
   describe('EntityFactory', function () {
-    var factory;
+    var factory, $cookieStoreMock;
 
-    beforeEach(module('app.services.entity.factory'));
+    beforeEach(module('ngCookies','app.services.entity.factory'), function ($provide) {
+      $cookieStoreMock = jasmine.createSpyObj('$cookieStore', ['get']);
+      $cookieStoreMock.get.andReturn(function () { return 'ambari-qa'; });
+      $provide.value('$cookieStore', $cookieStoreMock);
+    });
 
     beforeEach(inject(function(EntityFactory) {
       factory = EntityFactory;

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/test/services/EntityModelSpec.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/test/services/EntityModelSpec.js b/falcon-ui/app/test/services/EntityModelSpec.js
index 175a399..107a11a 100644
--- a/falcon-ui/app/test/services/EntityModelSpec.js
+++ b/falcon-ui/app/test/services/EntityModelSpec.js
@@ -20,11 +20,14 @@
 
   describe('EntityModel', function () {
 
-    var EntityModel, httpBackend, X2jsServiceMock;
+    var EntityModel, httpBackend, X2jsServiceMock, $cookieStoreMock;
 
     beforeEach(module('app.services.entity.model', function($provide) {
       X2jsServiceMock = jasmine.createSpyObj('X2jsService', ['xml_str2json']);
+      $cookieStoreMock = jasmine.createSpyObj('$cookieStore', ['get']);
+      $cookieStoreMock.get.andReturn(function () { return 'ambari-qa'; });
       $provide.value('X2jsService', X2jsServiceMock);
+      $provide.value('$cookieStore', $cookieStoreMock);
     }));
 
     beforeEach(inject(function($httpBackend, _EntityModel_) {
@@ -34,6 +37,7 @@
 
 
     it('Should set type as not recognized if the entity is not feed, cluster or process', function() {
+      //$cookieStore.get('userToken').user = 'ambari-qa';
       EntityModel.identifyType({});
 
       expect(EntityModel.type).toBe('Type not recognized');

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/test/services/EntitySerializerSpec.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/test/services/EntitySerializerSpec.js b/falcon-ui/app/test/services/EntitySerializerSpec.js
index 448fec9..5f83225 100644
--- a/falcon-ui/app/test/services/EntitySerializerSpec.js
+++ b/falcon-ui/app/test/services/EntitySerializerSpec.js
@@ -20,11 +20,10 @@
 
   describe('EntitySerializer', function () {
     var serializer;
+    beforeEach(module('app.services.entity.serializer', 'dateHelper'));
 
-    beforeEach(module('app.services.entity.serializer'));
 
-
-    beforeEach(inject(function(EntitySerializer) {
+    beforeEach(inject(function(EntitySerializer, DateHelper) {
       serializer = EntitySerializer;
     }));
 
@@ -235,7 +234,7 @@
 
         expect(feed.properties.length).toBe(6);
         expect(feed.properties[0].key).toBe('queueName');
-        expect(feed.properties[0].value).toBe('default');
+        expect(feed.properties[0].value).toBe('');
         expect(feed.properties[1].key).toBe('jobPriority');
         expect(feed.properties[1].value).toBe('MEDIUM');
       });
@@ -539,20 +538,20 @@
 
       });
 
-      it('Should transform ACL properly', function () {
-        var feed = {name: 'FeedName',
-          ACL: {owner: 'ambari-qa', group: 'users', permission: '0755'}
-        };
-
-        var xml = serializer.serialize(feed, 'feed');
-
-        expect(xml).toBe(
-            "<feed xmlns='uri:falcon:feed:0.1' name='FeedName'>" +
-            "<ACL owner='ambari-qa' group='users' permission='0755'/>" +
-            "</feed>"
-        );
-
-      });
+      //it('Should transform ACL properly', function () {
+      //  var feed = {name: 'FeedName',
+      //    ACL: {owner: 'ambari-qa', group: 'users', permission: '0755'}
+      //  };
+      //
+      //  var xml = serializer.serialize(feed, 'feed');
+      //
+      //  expect(xml).toBe(
+      //      "<feed xmlns='uri:falcon:feed:0.1' name='FeedName'>" +
+      //      "<ACL owner='ambari-qa' group='users' permission='0755'/>" +
+      //      "</feed>"
+      //  );
+      //
+      //});
 
       it('Should add an ACL element even though the properties are empty', function () {
         var feed = {name: 'FeedName',
@@ -672,34 +671,34 @@
 
       });
 
-      it('Should transform queueName, jobPriority and timeout and custom properties', function () {
-        var feed = {name: 'FeedName',
-          properties: [
-            {key: 'queueName', value: 'Queue'},
-            {key: 'jobPriority', value: 'HIGH'},
-            {key: 'timeout', value: {quantity: 7, unit: 'weeks'}}
-          ],
-          customProperties: [
-            {key: 'custom1', value: 'value1'},
-            {key: 'custom2', value: 'value2'}
-          ]
-        };
-
-        var xml = serializer.serialize(feed, 'feed');
-
-        expect(xml).toBe(
-            "<feed xmlns='uri:falcon:feed:0.1' name='FeedName'>" +
-            "<properties>" +
-            "<property name='queueName' value='Queue'></property>" +
-            "<property name='jobPriority' value='HIGH'></property>" +
-            "<property name='timeout' value='weeks(7)'></property>" +
-            "<property name='custom1' value='value1'></property>" +
-            "<property name='custom2' value='value2'></property>" +
-            "</properties>" +
-            "</feed>"
-        );
-
-      });
+      //it('Should transform queueName, jobPriority and timeout and custom properties', function () {
+      //  var feed = {name: 'FeedName',
+      //    properties: [
+      //      {key: 'queueName', value: 'Queue'},
+      //      {key: 'jobPriority', value: 'HIGH'},
+      //      {key: 'timeout', value: {quantity: 7, unit: 'weeks'}}
+      //    ],
+      //    customProperties: [
+      //      {key: 'custom1', value: 'value1'},
+      //      {key: 'custom2', value: 'value2'}
+      //    ]
+      //  };
+      //
+      //  var xml = serializer.serialize(feed, 'feed');
+      //
+      //  expect(xml).toBe(
+      //      "<feed xmlns='uri:falcon:feed:0.1' name='FeedName'>" +
+      //      "<properties>" +
+      //      "<property name='queueName' value='Queue'></property>" +
+      //      "<property name='jobPriority' value='HIGH'></property>" +
+      //      "<property name='timeout' value='weeks(7)'></property>" +
+      //      "<property name='custom1' value='value1'></property>" +
+      //      "<property name='custom2' value='value2'></property>" +
+      //      "</properties>" +
+      //      "</feed>"
+      //  );
+      //
+      //});
 
       it('Should transform not add queueName nor timeout if they were not defined', function () {
         var feed = {name: 'FeedName',

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/test/services/FalconServiceSpec.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/test/services/FalconServiceSpec.js b/falcon-ui/app/test/services/FalconServiceSpec.js
index 04f6b5a..4331d76 100644
--- a/falcon-ui/app/test/services/FalconServiceSpec.js
+++ b/falcon-ui/app/test/services/FalconServiceSpec.js
@@ -30,48 +30,48 @@
       service = Falcon;      
     }));
 
-    describe('initialize', function() {
-      it('Should set the object Falcon.responses', function() {
-        expect(service.responses).toEqual({
-          display : true,
-          queue:[], 
-          count: {pending: 0, success:0, error:0},
-          multiRequest: {cluster:0, feed:0, process:0},
-          listLoaded: {cluster:false, feed:false, process:false}   
-        });
-      });
-
-    });
-    describe('.logRequest()', function() {
-      it('Should log the pending request', function() {
-        service.logRequest();
-        expect(service.responses.count.pending).toEqual(1);
-        service.logRequest();
-        service.logRequest();
-        service.logRequest();
-        expect(service.responses.count.pending).toEqual(4);  
-      });
-
-      it('Should throw an error when the category does not exist', function() {
-        
-      });
-
-    });
-    describe('Falcon.logResponse(type, messageObject, hide)', function() {
-      it('Should log resolve pending request', function() {
-        var responseOne = {"status":"SUCCEEDED","message":"default/TEST2(FEED) suspended successfully\n","requestId":"default/b3a31c93-23e0-450d-bb46-b3e1be0525ff\n"};
-        service.logRequest();
-        service.logRequest();
-        service.logRequest();
-        expect(service.responses.count.pending).toEqual(3);
-        service.logResponse('success', responseOne, "cluster");
-        expect(service.responses.count.success).toEqual(1);
-        expect(service.responses.count.pending).toEqual(2);
-        
-        service.logResponse('success', responseOne, "cluster");
-        service.logResponse('success', responseOne, "cluster");
-        expect(service.responses.multiRequest.cluster).toEqual(-3);
-      });
-   });
+    //describe('initialize', function() {
+    //  it('Should set the object Falcon.responses', function() {
+    //    expect(service.responses).toEqual({
+    //      display : true,
+    //      queue:[],
+    //      count: {pending: 0, success:0, error:0},
+    //      multiRequest: {cluster:0, feed:0, process:0},
+    //      listLoaded: {cluster:false, feed:false, process:false}
+    //    });
+    //  });
+    //
+    //});
+    //describe('.logRequest()', function() {
+    //  it('Should log the pending request', function() {
+    //    service.logRequest();
+    //    expect(service.responses.count.pending).toEqual(1);
+    //    service.logRequest();
+    //    service.logRequest();
+    //    service.logRequest();
+    //    expect(service.responses.count.pending).toEqual(4);
+    //  });
+    //
+    //  it('Should throw an error when the category does not exist', function() {
+    //
+    //  });
+    //
+    //});
+    //describe('Falcon.logResponse(type, messageObject, hide)', function() {
+    //  it('Should log resolve pending request', function() {
+    //    var responseOne = {"status":"SUCCEEDED","message":"default/TEST2(FEED) suspended successfully\n","requestId":"default/b3a31c93-23e0-450d-bb46-b3e1be0525ff\n"};
+    //    service.logRequest();
+    //    service.logRequest();
+    //    service.logRequest();
+    //    expect(service.responses.count.pending).toEqual(3);
+    //    service.logResponse('success', responseOne, "cluster");
+    //    expect(service.responses.count.success).toEqual(1);
+    //    expect(service.responses.count.pending).toEqual(2);
+    //
+    //    service.logResponse('success', responseOne, "cluster");
+    //    service.logResponse('success', responseOne, "cluster");
+    //    expect(service.responses.multiRequest.cluster).toEqual(-3);
+    //  });
+   //});
   });
 })();
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/test/services/ValdationServiceSpec.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/test/services/ValdationServiceSpec.js b/falcon-ui/app/test/services/ValdationServiceSpec.js
index e608dc8..bd43927 100644
--- a/falcon-ui/app/test/services/ValdationServiceSpec.js
+++ b/falcon-ui/app/test/services/ValdationServiceSpec.js
@@ -40,7 +40,7 @@
     describe('patterns', function () {
       it('Should return an object with the validation patterns', function () {
         expect(validationService.patterns).toBeDefined();
-        expect(validationService.patterns.name).toEqual(/^(([a-zA-Z]([\-a-zA-Z0-9])*){1,39})$/);
+        expect(validationService.patterns.name).toEqual(/^[a-zA-Z0-9-_]{1,60}$/);
 
       });
     });


[14/22] falcon git commit: FALCON-1315 Update falcon ui for HiveDR, secure clusters and bug fixes. Contributed by Armando Reyna/Venkat Ranganathan.

Posted by so...@apache.org.
http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/fonts/glyphicons-halflings-regular.woff
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/fonts/glyphicons-halflings-regular.woff b/falcon-ui/app/css/fonts/glyphicons-halflings-regular.woff
index 8c54182..9e61285 100644
Binary files a/falcon-ui/app/css/fonts/glyphicons-halflings-regular.woff and b/falcon-ui/app/css/fonts/glyphicons-halflings-regular.woff differ

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/fonts/glyphicons-halflings-regular.woff2
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/fonts/glyphicons-halflings-regular.woff2 b/falcon-ui/app/css/fonts/glyphicons-halflings-regular.woff2
new file mode 100644
index 0000000..64539b5
Binary files /dev/null and b/falcon-ui/app/css/fonts/glyphicons-halflings-regular.woff2 differ

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/img/ajax-loader.gif
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/img/ajax-loader.gif b/falcon-ui/app/css/img/ajax-loader.gif
index c528e38..2f06bd5 100644
Binary files a/falcon-ui/app/css/img/ajax-loader.gif and b/falcon-ui/app/css/img/ajax-loader.gif differ

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/img/ajax-loader_2.gif
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/img/ajax-loader_2.gif b/falcon-ui/app/css/img/ajax-loader_2.gif
new file mode 100644
index 0000000..c528e38
Binary files /dev/null and b/falcon-ui/app/css/img/ajax-loader_2.gif differ

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/img/falcon.png
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/img/falcon.png b/falcon-ui/app/css/img/falcon.png
index be66974..f0e6934 100644
Binary files a/falcon-ui/app/css/img/falcon.png and b/falcon-ui/app/css/img/falcon.png differ

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/img/user.svg
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/img/user.svg b/falcon-ui/app/css/img/user.svg
new file mode 100644
index 0000000..60ac6c5
--- /dev/null
+++ b/falcon-ui/app/css/img/user.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="User" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="705.691px" height="705.691px" viewBox="-55.206 68.1 705.691 705.691"
+	 enable-background="new -55.206 68.1 705.691 705.691" xml:space="preserve">
+<path fill="#FFFFFF" d="M297.64,68.1c-194.871,0-352.846,157.975-352.846,352.846c0,194.872,157.975,352.846,352.846,352.846
+	c194.872,0,352.846-157.974,352.846-352.846C650.486,226.074,492.512,68.1,297.64,68.1z M513.516,618.415H81.764v-23.986
+	c0-47.973,52.674-75.676,103.764-97.695c50.923-21.924,67.233-40.417,67.233-79.971c0-23.746-15.566-15.998-22.379-59.51
+	c-2.83-18.062-16.598-0.288-19.213-41.472c0-16.407,7.508-20.484,7.508-20.484s-3.791-24.322-5.326-43.008
+	c-1.2-15.279,5.349-43.99,29.719-62.124c28.616-20.676,41.112-48.788,94.841-46.27c-24.562,13.025-19.164,26.001-11.178,34.156
+	c45.622,12.833,56.729,54.665,55.169,74.261c-1.512,18.686-5.301,43.008-5.301,43.008s7.531,4.077,7.531,20.484
+	c-2.662,41.184-16.406,23.41-19.261,41.472c-6.836,43.511-22.355,35.764-22.355,59.51c0,39.577,16.263,58.047,67.186,79.97
+	c51.114,21.996,103.813,49.699,103.813,97.672V618.415z"/>
+</svg>

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/main.less
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/main.less b/falcon-ui/app/css/main.less
index 667c365..3bb7393 100644
--- a/falcon-ui/app/css/main.less
+++ b/falcon-ui/app/css/main.less
@@ -66,13 +66,21 @@
 @import "bootstrap/less/utilities.less";
 @import "bootstrap/less/responsive-utilities.less";
 
-//entypo
-@import "fonts/entypo.less"; 
+//entypo font
+@import "fonts/entypo.less";
+//cabin font
+@import "fonts/cabin.less";
 //custom styles for the page
 @import "styles/mixins.less";
 @import "styles/common.less";
 @import "styles/nav-header.less";
-@import "styles/entities-list.less"; 
-@import "styles/form-pages.less"; 
+@import "styles/entity-summary.less";
+@import "styles/entities-list.less";
+@import "styles/form-pages.less";
 @import "styles/progress-bar.less";
-@import "styles/server-messages.less";
\ No newline at end of file
+@import "styles/server-messages.less";
+@import "styles/chart.less";
+@import "styles/dataset-form.less";
+@import "styles/popover.less";
+@import "styles/animate.less";
+@import "styles/autocomplete-tags.less";
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/styles/angular.notify.less
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/styles/angular.notify.less b/falcon-ui/app/css/styles/angular.notify.less
new file mode 100644
index 0000000..395bea0
--- /dev/null
+++ b/falcon-ui/app/css/styles/angular.notify.less
@@ -0,0 +1,84 @@
+.cg-notify-message {
+  position:fixed;
+  top:0px;
+  z-index: 9999;
+  max-width:400px;
+  text-align: center;
+
+//  background-color: #d9edf7;
+//  color: #31708f;
+  padding: 15px;
+//  border: 1px solid #bce8f1;
+  border-radius: 4px;
+
+  -webkit-transition: top 0.5s ease-out,opacity 0.2s ease-out;
+  -moz-transition: top 0.5s ease-out,opacity 0.2s ease-out;
+  -o-transition: top 0.5s ease-out,opacity 0.2s ease-out;
+  transition: top 0.5s ease-out,opacity 0.2s ease-out;
+
+  visibility:hidden;
+
+  -webkit-box-shadow: 0 6px 12px rgba(0,0,0,.175);
+  box-shadow: 0 6px 12px rgba(0,0,0,.175);
+}
+
+.cg-notify-message-center {
+  left:50%;
+}
+
+.cg-notify-message-left {
+  left:15px;
+}
+
+.cg-notify-message-right {
+  top: 100px;
+  right:245px;
+}
+
+.cg-notify-message a {
+  font-weight:bold;
+  color:inherit;
+}
+
+.cg-notify-message a:hover {
+  color:inherit;
+}
+
+.cg-notify-close {
+  -webkit-appearance: none;
+  padding: 0;
+  cursor: pointer;
+  background: 0 0;
+  border: 0;
+  font-size: 21px;
+  font-weight: 700;
+  line-height: 1;
+  color: #000;
+  text-shadow: 0 1px 0 #fff;
+  filter: alpha(opacity=20);
+  opacity: .2;
+
+  position: absolute;
+  top: 0px;
+  right: 3px;
+  line-height: 15px;
+}
+
+.cg-notify-close:hover, .cg-notify-close:focus {
+  color: #000;
+  text-decoration: none;
+  cursor: pointer;
+  filter: alpha(opacity=50);
+  opacity: .5;
+}
+
+.cg-notify-sr-only {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  padding: 0;
+  margin: -1px;
+  overflow: hidden;
+  clip: rect(0,0,0,0);
+  border: 0;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/styles/animate.less
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/styles/animate.less b/falcon-ui/app/css/styles/animate.less
new file mode 100644
index 0000000..60025f3
--- /dev/null
+++ b/falcon-ui/app/css/styles/animate.less
@@ -0,0 +1,3181 @@
+@charset "UTF-8";
+
+/*!
+Animate.css - http://daneden.me/animate
+Licensed under the MIT license - http://opensource.org/licenses/MIT
+
+Copyright (c) 2015 Daniel Eden
+*/
+
+.animated {
+  -webkit-animation-duration: 1s;
+  animation-duration: 1s;
+  -webkit-animation-fill-mode: both;
+  animation-fill-mode: both;
+}
+
+.animated.infinite {
+  -webkit-animation-iteration-count: infinite;
+  animation-iteration-count: infinite;
+}
+
+.animated.hinge {
+  -webkit-animation-duration: 2s;
+  animation-duration: 2s;
+}
+
+.animated.bounceIn,
+.animated.bounceOut {
+  -webkit-animation-duration: .75s;
+  animation-duration: .75s;
+}
+
+.animated.flipOutX,
+.animated.flipOutY {
+  -webkit-animation-duration: .75s;
+  animation-duration: .75s;
+}
+
+@-webkit-keyframes bounce {
+  0%, 20%, 53%, 80%, 100% {
+    -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+    transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+    -webkit-transform: translate3d(0,0,0);
+    transform: translate3d(0,0,0);
+  }
+
+  40%, 43% {
+    -webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
+    transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
+    -webkit-transform: translate3d(0, -30px, 0);
+    transform: translate3d(0, -30px, 0);
+  }
+
+  70% {
+    -webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
+    transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
+    -webkit-transform: translate3d(0, -15px, 0);
+    transform: translate3d(0, -15px, 0);
+  }
+
+  90% {
+    -webkit-transform: translate3d(0,-4px,0);
+    transform: translate3d(0,-4px,0);
+  }
+}
+
+@keyframes bounce {
+  0%, 20%, 53%, 80%, 100% {
+    -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+    transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+    -webkit-transform: translate3d(0,0,0);
+    transform: translate3d(0,0,0);
+  }
+
+  40%, 43% {
+    -webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
+    transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
+    -webkit-transform: translate3d(0, -30px, 0);
+    transform: translate3d(0, -30px, 0);
+  }
+
+  70% {
+    -webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
+    transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
+    -webkit-transform: translate3d(0, -15px, 0);
+    transform: translate3d(0, -15px, 0);
+  }
+
+  90% {
+    -webkit-transform: translate3d(0,-4px,0);
+    transform: translate3d(0,-4px,0);
+  }
+}
+
+.bounce {
+  -webkit-animation-name: bounce;
+  animation-name: bounce;
+  -webkit-transform-origin: center bottom;
+  transform-origin: center bottom;
+}
+
+@-webkit-keyframes flash {
+  0%, 50%, 100% {
+    opacity: 1;
+  }
+
+  25%, 75% {
+    opacity: 0;
+  }
+}
+
+@keyframes flash {
+  0%, 50%, 100% {
+    opacity: 1;
+  }
+
+  25%, 75% {
+    opacity: 0;
+  }
+}
+
+.flash {
+  -webkit-animation-name: flash;
+  animation-name: flash;
+}
+
+/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
+
+@-webkit-keyframes pulse {
+  0% {
+    -webkit-transform: scale3d(1, 1, 1);
+    transform: scale3d(1, 1, 1);
+  }
+
+  50% {
+    -webkit-transform: scale3d(1.05, 1.05, 1.05);
+    transform: scale3d(1.05, 1.05, 1.05);
+  }
+
+  100% {
+    -webkit-transform: scale3d(1, 1, 1);
+    transform: scale3d(1, 1, 1);
+  }
+}
+
+@keyframes pulse {
+  0% {
+    -webkit-transform: scale3d(1, 1, 1);
+    transform: scale3d(1, 1, 1);
+  }
+
+  50% {
+    -webkit-transform: scale3d(1.05, 1.05, 1.05);
+    transform: scale3d(1.05, 1.05, 1.05);
+  }
+
+  100% {
+    -webkit-transform: scale3d(1, 1, 1);
+    transform: scale3d(1, 1, 1);
+  }
+}
+
+.pulse {
+  -webkit-animation-name: pulse;
+  animation-name: pulse;
+}
+
+@-webkit-keyframes rubberBand {
+  0% {
+    -webkit-transform: scale3d(1, 1, 1);
+    transform: scale3d(1, 1, 1);
+  }
+
+  30% {
+    -webkit-transform: scale3d(1.25, 0.75, 1);
+    transform: scale3d(1.25, 0.75, 1);
+  }
+
+  40% {
+    -webkit-transform: scale3d(0.75, 1.25, 1);
+    transform: scale3d(0.75, 1.25, 1);
+  }
+
+  50% {
+    -webkit-transform: scale3d(1.15, 0.85, 1);
+    transform: scale3d(1.15, 0.85, 1);
+  }
+
+  65% {
+    -webkit-transform: scale3d(.95, 1.05, 1);
+    transform: scale3d(.95, 1.05, 1);
+  }
+
+  75% {
+    -webkit-transform: scale3d(1.05, .95, 1);
+    transform: scale3d(1.05, .95, 1);
+  }
+
+  100% {
+    -webkit-transform: scale3d(1, 1, 1);
+    transform: scale3d(1, 1, 1);
+  }
+}
+
+@keyframes rubberBand {
+  0% {
+    -webkit-transform: scale3d(1, 1, 1);
+    transform: scale3d(1, 1, 1);
+  }
+
+  30% {
+    -webkit-transform: scale3d(1.25, 0.75, 1);
+    transform: scale3d(1.25, 0.75, 1);
+  }
+
+  40% {
+    -webkit-transform: scale3d(0.75, 1.25, 1);
+    transform: scale3d(0.75, 1.25, 1);
+  }
+
+  50% {
+    -webkit-transform: scale3d(1.15, 0.85, 1);
+    transform: scale3d(1.15, 0.85, 1);
+  }
+
+  65% {
+    -webkit-transform: scale3d(.95, 1.05, 1);
+    transform: scale3d(.95, 1.05, 1);
+  }
+
+  75% {
+    -webkit-transform: scale3d(1.05, .95, 1);
+    transform: scale3d(1.05, .95, 1);
+  }
+
+  100% {
+    -webkit-transform: scale3d(1, 1, 1);
+    transform: scale3d(1, 1, 1);
+  }
+}
+
+.rubberBand {
+  -webkit-animation-name: rubberBand;
+  animation-name: rubberBand;
+}
+
+@-webkit-keyframes shake {
+  0%, 100% {
+    -webkit-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+
+  10%, 30%, 50%, 70%, 90% {
+    -webkit-transform: translate3d(-10px, 0, 0);
+    transform: translate3d(-10px, 0, 0);
+  }
+
+  20%, 40%, 60%, 80% {
+    -webkit-transform: translate3d(10px, 0, 0);
+    transform: translate3d(10px, 0, 0);
+  }
+}
+
+@keyframes shake {
+  0%, 100% {
+    -webkit-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+
+  10%, 30%, 50%, 70%, 90% {
+    -webkit-transform: translate3d(-10px, 0, 0);
+    transform: translate3d(-10px, 0, 0);
+  }
+
+  20%, 40%, 60%, 80% {
+    -webkit-transform: translate3d(10px, 0, 0);
+    transform: translate3d(10px, 0, 0);
+  }
+}
+
+.shake {
+  -webkit-animation-name: shake;
+  animation-name: shake;
+}
+
+@-webkit-keyframes swing {
+  20% {
+    -webkit-transform: rotate3d(0, 0, 1, 15deg);
+    transform: rotate3d(0, 0, 1, 15deg);
+  }
+
+  40% {
+    -webkit-transform: rotate3d(0, 0, 1, -10deg);
+    transform: rotate3d(0, 0, 1, -10deg);
+  }
+
+  60% {
+    -webkit-transform: rotate3d(0, 0, 1, 5deg);
+    transform: rotate3d(0, 0, 1, 5deg);
+  }
+
+  80% {
+    -webkit-transform: rotate3d(0, 0, 1, -5deg);
+    transform: rotate3d(0, 0, 1, -5deg);
+  }
+
+  100% {
+    -webkit-transform: rotate3d(0, 0, 1, 0deg);
+    transform: rotate3d(0, 0, 1, 0deg);
+  }
+}
+
+@keyframes swing {
+  20% {
+    -webkit-transform: rotate3d(0, 0, 1, 15deg);
+    transform: rotate3d(0, 0, 1, 15deg);
+  }
+
+  40% {
+    -webkit-transform: rotate3d(0, 0, 1, -10deg);
+    transform: rotate3d(0, 0, 1, -10deg);
+  }
+
+  60% {
+    -webkit-transform: rotate3d(0, 0, 1, 5deg);
+    transform: rotate3d(0, 0, 1, 5deg);
+  }
+
+  80% {
+    -webkit-transform: rotate3d(0, 0, 1, -5deg);
+    transform: rotate3d(0, 0, 1, -5deg);
+  }
+
+  100% {
+    -webkit-transform: rotate3d(0, 0, 1, 0deg);
+    transform: rotate3d(0, 0, 1, 0deg);
+  }
+}
+
+.swing {
+  -webkit-transform-origin: top center;
+  transform-origin: top center;
+  -webkit-animation-name: swing;
+  animation-name: swing;
+}
+
+@-webkit-keyframes tada {
+  0% {
+    -webkit-transform: scale3d(1, 1, 1);
+    transform: scale3d(1, 1, 1);
+  }
+
+  10%, 20% {
+    -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);
+    transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);
+  }
+
+  30%, 50%, 70%, 90% {
+    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);
+    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);
+  }
+
+  40%, 60%, 80% {
+    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);
+    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);
+  }
+
+  100% {
+    -webkit-transform: scale3d(1, 1, 1);
+    transform: scale3d(1, 1, 1);
+  }
+}
+
+@keyframes tada {
+  0% {
+    -webkit-transform: scale3d(1, 1, 1);
+    transform: scale3d(1, 1, 1);
+  }
+
+  10%, 20% {
+    -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);
+    transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);
+  }
+
+  30%, 50%, 70%, 90% {
+    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);
+    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);
+  }
+
+  40%, 60%, 80% {
+    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);
+    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);
+  }
+
+  100% {
+    -webkit-transform: scale3d(1, 1, 1);
+    transform: scale3d(1, 1, 1);
+  }
+}
+
+.tada {
+  -webkit-animation-name: tada;
+  animation-name: tada;
+}
+
+/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
+
+@-webkit-keyframes wobble {
+  0% {
+    -webkit-transform: none;
+    transform: none;
+  }
+
+  15% {
+    -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);
+    transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);
+  }
+
+  30% {
+    -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);
+    transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);
+  }
+
+  45% {
+    -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);
+    transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);
+  }
+
+  60% {
+    -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);
+    transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);
+  }
+
+  75% {
+    -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);
+    transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);
+  }
+
+  100% {
+    -webkit-transform: none;
+    transform: none;
+  }
+}
+
+@keyframes wobble {
+  0% {
+    -webkit-transform: none;
+    transform: none;
+  }
+
+  15% {
+    -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);
+    transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);
+  }
+
+  30% {
+    -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);
+    transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);
+  }
+
+  45% {
+    -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);
+    transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);
+  }
+
+  60% {
+    -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);
+    transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);
+  }
+
+  75% {
+    -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);
+    transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);
+  }
+
+  100% {
+    -webkit-transform: none;
+    transform: none;
+  }
+}
+
+.wobble {
+  -webkit-animation-name: wobble;
+  animation-name: wobble;
+}
+
+@-webkit-keyframes bounceIn {
+  0%, 20%, 40%, 60%, 80%, 100% {
+    -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+    transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+  }
+
+  0% {
+    opacity: 0;
+    -webkit-transform: scale3d(.3, .3, .3);
+    transform: scale3d(.3, .3, .3);
+  }
+
+  20% {
+    -webkit-transform: scale3d(1.1, 1.1, 1.1);
+    transform: scale3d(1.1, 1.1, 1.1);
+  }
+
+  40% {
+    -webkit-transform: scale3d(.9, .9, .9);
+    transform: scale3d(.9, .9, .9);
+  }
+
+  60% {
+    opacity: 1;
+    -webkit-transform: scale3d(1.03, 1.03, 1.03);
+    transform: scale3d(1.03, 1.03, 1.03);
+  }
+
+  80% {
+    -webkit-transform: scale3d(.97, .97, .97);
+    transform: scale3d(.97, .97, .97);
+  }
+
+  100% {
+    opacity: 1;
+    -webkit-transform: scale3d(1, 1, 1);
+    transform: scale3d(1, 1, 1);
+  }
+}
+
+@keyframes bounceIn {
+  0%, 20%, 40%, 60%, 80%, 100% {
+    -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+    transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+  }
+
+  0% {
+    opacity: 0;
+    -webkit-transform: scale3d(.3, .3, .3);
+    transform: scale3d(.3, .3, .3);
+  }
+
+  20% {
+    -webkit-transform: scale3d(1.1, 1.1, 1.1);
+    transform: scale3d(1.1, 1.1, 1.1);
+  }
+
+  40% {
+    -webkit-transform: scale3d(.9, .9, .9);
+    transform: scale3d(.9, .9, .9);
+  }
+
+  60% {
+    opacity: 1;
+    -webkit-transform: scale3d(1.03, 1.03, 1.03);
+    transform: scale3d(1.03, 1.03, 1.03);
+  }
+
+  80% {
+    -webkit-transform: scale3d(.97, .97, .97);
+    transform: scale3d(.97, .97, .97);
+  }
+
+  100% {
+    opacity: 1;
+    -webkit-transform: scale3d(1, 1, 1);
+    transform: scale3d(1, 1, 1);
+  }
+}
+
+.bounceIn {
+  -webkit-animation-name: bounceIn;
+  animation-name: bounceIn;
+}
+
+@-webkit-keyframes bounceInDown {
+  0%, 60%, 75%, 90%, 100% {
+    -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+    transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+  }
+
+  0% {
+    opacity: 0;
+    -webkit-transform: translate3d(0, -3000px, 0);
+    transform: translate3d(0, -3000px, 0);
+  }
+
+  60% {
+    opacity: 1;
+    -webkit-transform: translate3d(0, 25px, 0);
+    transform: translate3d(0, 25px, 0);
+  }
+
+  75% {
+    -webkit-transform: translate3d(0, -10px, 0);
+    transform: translate3d(0, -10px, 0);
+  }
+
+  90% {
+    -webkit-transform: translate3d(0, 5px, 0);
+    transform: translate3d(0, 5px, 0);
+  }
+
+  100% {
+    -webkit-transform: none;
+    transform: none;
+  }
+}
+
+@keyframes bounceInDown {
+  0%, 60%, 75%, 90%, 100% {
+    -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+    transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+  }
+
+  0% {
+    opacity: 0;
+    -webkit-transform: translate3d(0, -3000px, 0);
+    transform: translate3d(0, -3000px, 0);
+  }
+
+  60% {
+    opacity: 1;
+    -webkit-transform: translate3d(0, 25px, 0);
+    transform: translate3d(0, 25px, 0);
+  }
+
+  75% {
+    -webkit-transform: translate3d(0, -10px, 0);
+    transform: translate3d(0, -10px, 0);
+  }
+
+  90% {
+    -webkit-transform: translate3d(0, 5px, 0);
+    transform: translate3d(0, 5px, 0);
+  }
+
+  100% {
+    -webkit-transform: none;
+    transform: none;
+  }
+}
+
+.bounceInDown {
+  -webkit-animation-name: bounceInDown;
+  animation-name: bounceInDown;
+}
+
+@-webkit-keyframes bounceInLeft {
+  0%, 60%, 75%, 90%, 100% {
+    -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+    transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+  }
+
+  0% {
+    opacity: 0;
+    -webkit-transform: translate3d(-3000px, 0, 0);
+    transform: translate3d(-3000px, 0, 0);
+  }
+
+  60% {
+    opacity: 1;
+    -webkit-transform: translate3d(25px, 0, 0);
+    transform: translate3d(25px, 0, 0);
+  }
+
+  75% {
+    -webkit-transform: translate3d(-10px, 0, 0);
+    transform: translate3d(-10px, 0, 0);
+  }
+
+  90% {
+    -webkit-transform: translate3d(5px, 0, 0);
+    transform: translate3d(5px, 0, 0);
+  }
+
+  100% {
+    -webkit-transform: none;
+    transform: none;
+  }
+}
+
+@keyframes bounceInLeft {
+  0%, 60%, 75%, 90%, 100% {
+    -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+    transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+  }
+
+  0% {
+    opacity: 0;
+    -webkit-transform: translate3d(-3000px, 0, 0);
+    transform: translate3d(-3000px, 0, 0);
+  }
+
+  60% {
+    opacity: 1;
+    -webkit-transform: translate3d(25px, 0, 0);
+    transform: translate3d(25px, 0, 0);
+  }
+
+  75% {
+    -webkit-transform: translate3d(-10px, 0, 0);
+    transform: translate3d(-10px, 0, 0);
+  }
+
+  90% {
+    -webkit-transform: translate3d(5px, 0, 0);
+    transform: translate3d(5px, 0, 0);
+  }
+
+  100% {
+    -webkit-transform: none;
+    transform: none;
+  }
+}
+
+.bounceInLeft {
+  -webkit-animation-name: bounceInLeft;
+  animation-name: bounceInLeft;
+}
+
+@-webkit-keyframes bounceInRight {
+  0%, 60%, 75%, 90%, 100% {
+    -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+    transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+  }
+
+  0% {
+    opacity: 0;
+    -webkit-transform: translate3d(3000px, 0, 0);
+    transform: translate3d(3000px, 0, 0);
+  }
+
+  60% {
+    opacity: 1;
+    -webkit-transform: translate3d(-25px, 0, 0);
+    transform: translate3d(-25px, 0, 0);
+  }
+
+  75% {
+    -webkit-transform: translate3d(10px, 0, 0);
+    transform: translate3d(10px, 0, 0);
+  }
+
+  90% {
+    -webkit-transform: translate3d(-5px, 0, 0);
+    transform: translate3d(-5px, 0, 0);
+  }
+
+  100% {
+    -webkit-transform: none;
+    transform: none;
+  }
+}
+
+@keyframes bounceInRight {
+  0%, 60%, 75%, 90%, 100% {
+    -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+    transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+  }
+
+  0% {
+    opacity: 0;
+    -webkit-transform: translate3d(3000px, 0, 0);
+    transform: translate3d(3000px, 0, 0);
+  }
+
+  60% {
+    opacity: 1;
+    -webkit-transform: translate3d(-25px, 0, 0);
+    transform: translate3d(-25px, 0, 0);
+  }
+
+  75% {
+    -webkit-transform: translate3d(10px, 0, 0);
+    transform: translate3d(10px, 0, 0);
+  }
+
+  90% {
+    -webkit-transform: translate3d(-5px, 0, 0);
+    transform: translate3d(-5px, 0, 0);
+  }
+
+  100% {
+    -webkit-transform: none;
+    transform: none;
+  }
+}
+
+.bounceInRight {
+  -webkit-animation-name: bounceInRight;
+  animation-name: bounceInRight;
+}
+
+@-webkit-keyframes bounceInUp {
+  0%, 60%, 75%, 90%, 100% {
+    -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+    transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+  }
+
+  0% {
+    opacity: 0;
+    -webkit-transform: translate3d(0, 3000px, 0);
+    transform: translate3d(0, 3000px, 0);
+  }
+
+  60% {
+    opacity: 1;
+    -webkit-transform: translate3d(0, -20px, 0);
+    transform: translate3d(0, -20px, 0);
+  }
+
+  75% {
+    -webkit-transform: translate3d(0, 10px, 0);
+    transform: translate3d(0, 10px, 0);
+  }
+
+  90% {
+    -webkit-transform: translate3d(0, -5px, 0);
+    transform: translate3d(0, -5px, 0);
+  }
+
+  100% {
+    -webkit-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+}
+
+@keyframes bounceInUp {
+  0%, 60%, 75%, 90%, 100% {
+    -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+    transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+  }
+
+  0% {
+    opacity: 0;
+    -webkit-transform: translate3d(0, 3000px, 0);
+    transform: translate3d(0, 3000px, 0);
+  }
+
+  60% {
+    opacity: 1;
+    -webkit-transform: translate3d(0, -20px, 0);
+    transform: translate3d(0, -20px, 0);
+  }
+
+  75% {
+    -webkit-transform: translate3d(0, 10px, 0);
+    transform: translate3d(0, 10px, 0);
+  }
+
+  90% {
+    -webkit-transform: translate3d(0, -5px, 0);
+    transform: translate3d(0, -5px, 0);
+  }
+
+  100% {
+    -webkit-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+}
+
+.bounceInUp {
+  -webkit-animation-name: bounceInUp;
+  animation-name: bounceInUp;
+}
+
+@-webkit-keyframes bounceOut {
+  20% {
+    -webkit-transform: scale3d(.9, .9, .9);
+    transform: scale3d(.9, .9, .9);
+  }
+
+  50%, 55% {
+    opacity: 1;
+    -webkit-transform: scale3d(1.1, 1.1, 1.1);
+    transform: scale3d(1.1, 1.1, 1.1);
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: scale3d(.3, .3, .3);
+    transform: scale3d(.3, .3, .3);
+  }
+}
+
+@keyframes bounceOut {
+  20% {
+    -webkit-transform: scale3d(.9, .9, .9);
+    transform: scale3d(.9, .9, .9);
+  }
+
+  50%, 55% {
+    opacity: 1;
+    -webkit-transform: scale3d(1.1, 1.1, 1.1);
+    transform: scale3d(1.1, 1.1, 1.1);
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: scale3d(.3, .3, .3);
+    transform: scale3d(.3, .3, .3);
+  }
+}
+
+.bounceOut {
+  -webkit-animation-name: bounceOut;
+  animation-name: bounceOut;
+}
+
+@-webkit-keyframes bounceOutDown {
+  20% {
+    -webkit-transform: translate3d(0, 10px, 0);
+    transform: translate3d(0, 10px, 0);
+  }
+
+  40%, 45% {
+    opacity: 1;
+    -webkit-transform: translate3d(0, -20px, 0);
+    transform: translate3d(0, -20px, 0);
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: translate3d(0, 2000px, 0);
+    transform: translate3d(0, 2000px, 0);
+  }
+}
+
+@keyframes bounceOutDown {
+  20% {
+    -webkit-transform: translate3d(0, 10px, 0);
+    transform: translate3d(0, 10px, 0);
+  }
+
+  40%, 45% {
+    opacity: 1;
+    -webkit-transform: translate3d(0, -20px, 0);
+    transform: translate3d(0, -20px, 0);
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: translate3d(0, 2000px, 0);
+    transform: translate3d(0, 2000px, 0);
+  }
+}
+
+.bounceOutDown {
+  -webkit-animation-name: bounceOutDown;
+  animation-name: bounceOutDown;
+}
+
+@-webkit-keyframes bounceOutLeft {
+  20% {
+    opacity: 1;
+    -webkit-transform: translate3d(20px, 0, 0);
+    transform: translate3d(20px, 0, 0);
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: translate3d(-2000px, 0, 0);
+    transform: translate3d(-2000px, 0, 0);
+  }
+}
+
+@keyframes bounceOutLeft {
+  20% {
+    opacity: 1;
+    -webkit-transform: translate3d(20px, 0, 0);
+    transform: translate3d(20px, 0, 0);
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: translate3d(-2000px, 0, 0);
+    transform: translate3d(-2000px, 0, 0);
+  }
+}
+
+.bounceOutLeft {
+  -webkit-animation-name: bounceOutLeft;
+  animation-name: bounceOutLeft;
+}
+
+@-webkit-keyframes bounceOutRight {
+  20% {
+    opacity: 1;
+    -webkit-transform: translate3d(-20px, 0, 0);
+    transform: translate3d(-20px, 0, 0);
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: translate3d(2000px, 0, 0);
+    transform: translate3d(2000px, 0, 0);
+  }
+}
+
+@keyframes bounceOutRight {
+  20% {
+    opacity: 1;
+    -webkit-transform: translate3d(-20px, 0, 0);
+    transform: translate3d(-20px, 0, 0);
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: translate3d(2000px, 0, 0);
+    transform: translate3d(2000px, 0, 0);
+  }
+}
+
+.bounceOutRight {
+  -webkit-animation-name: bounceOutRight;
+  animation-name: bounceOutRight;
+}
+
+@-webkit-keyframes bounceOutUp {
+  20% {
+    -webkit-transform: translate3d(0, -10px, 0);
+    transform: translate3d(0, -10px, 0);
+  }
+
+  40%, 45% {
+    opacity: 1;
+    -webkit-transform: translate3d(0, 20px, 0);
+    transform: translate3d(0, 20px, 0);
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: translate3d(0, -2000px, 0);
+    transform: translate3d(0, -2000px, 0);
+  }
+}
+
+@keyframes bounceOutUp {
+  20% {
+    -webkit-transform: translate3d(0, -10px, 0);
+    transform: translate3d(0, -10px, 0);
+  }
+
+  40%, 45% {
+    opacity: 1;
+    -webkit-transform: translate3d(0, 20px, 0);
+    transform: translate3d(0, 20px, 0);
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: translate3d(0, -2000px, 0);
+    transform: translate3d(0, -2000px, 0);
+  }
+}
+
+.bounceOutUp {
+  -webkit-animation-name: bounceOutUp;
+  animation-name: bounceOutUp;
+}
+
+@-webkit-keyframes fadeIn {
+  0% {
+    opacity: 0;
+  }
+
+  100% {
+    opacity: 1;
+  }
+}
+
+@keyframes fadeIn {
+  0% {
+    opacity: 0;
+  }
+
+  100% {
+    opacity: 1;
+  }
+}
+
+.fadeIn {
+  -webkit-animation-name: fadeIn;
+  animation-name: fadeIn;
+}
+
+@-webkit-keyframes fadeInDown {
+  0% {
+    opacity: 0;
+    -webkit-transform: translate3d(0, -100%, 0);
+    transform: translate3d(0, -100%, 0);
+  }
+
+  100% {
+    opacity: 1;
+    -webkit-transform: none;
+    transform: none;
+  }
+}
+
+@keyframes fadeInDown {
+  0% {
+    opacity: 0;
+    -webkit-transform: translate3d(0, -100%, 0);
+    transform: translate3d(0, -100%, 0);
+  }
+
+  100% {
+    opacity: 1;
+    -webkit-transform: none;
+    transform: none;
+  }
+}
+
+.fadeInDown {
+  -webkit-animation-name: fadeInDown;
+  animation-name: fadeInDown;
+}
+
+@-webkit-keyframes fadeInDownBig {
+  0% {
+    opacity: 0;
+    -webkit-transform: translate3d(0, -2000px, 0);
+    transform: translate3d(0, -2000px, 0);
+  }
+
+  100% {
+    opacity: 1;
+    -webkit-transform: none;
+    transform: none;
+  }
+}
+
+@keyframes fadeInDownBig {
+  0% {
+    opacity: 0;
+    -webkit-transform: translate3d(0, -2000px, 0);
+    transform: translate3d(0, -2000px, 0);
+  }
+
+  100% {
+    opacity: 1;
+    -webkit-transform: none;
+    transform: none;
+  }
+}
+
+.fadeInDownBig {
+  -webkit-animation-name: fadeInDownBig;
+  animation-name: fadeInDownBig;
+}
+
+@-webkit-keyframes fadeInLeft {
+  0% {
+    opacity: 0;
+    -webkit-transform: translate3d(-100%, 0, 0);
+    transform: translate3d(-100%, 0, 0);
+  }
+
+  100% {
+    opacity: 1;
+    -webkit-transform: none;
+    transform: none;
+  }
+}
+
+@keyframes fadeInLeft {
+  0% {
+    opacity: 0;
+    -webkit-transform: translate3d(-100%, 0, 0);
+    transform: translate3d(-100%, 0, 0);
+  }
+
+  100% {
+    opacity: 1;
+    -webkit-transform: none;
+    transform: none;
+  }
+}
+
+.fadeInLeft {
+  -webkit-animation-name: fadeInLeft;
+  animation-name: fadeInLeft;
+}
+
+@-webkit-keyframes fadeInLeftBig {
+  0% {
+    opacity: 0;
+    -webkit-transform: translate3d(-2000px, 0, 0);
+    transform: translate3d(-2000px, 0, 0);
+  }
+
+  100% {
+    opacity: 1;
+    -webkit-transform: none;
+    transform: none;
+  }
+}
+
+@keyframes fadeInLeftBig {
+  0% {
+    opacity: 0;
+    -webkit-transform: translate3d(-2000px, 0, 0);
+    transform: translate3d(-2000px, 0, 0);
+  }
+
+  100% {
+    opacity: 1;
+    -webkit-transform: none;
+    transform: none;
+  }
+}
+
+.fadeInLeftBig {
+  -webkit-animation-name: fadeInLeftBig;
+  animation-name: fadeInLeftBig;
+}
+
+@-webkit-keyframes fadeInRight {
+  0% {
+    opacity: 0;
+    -webkit-transform: translate3d(100%, 0, 0);
+    transform: translate3d(100%, 0, 0);
+  }
+
+  100% {
+    opacity: 1;
+    -webkit-transform: none;
+    transform: none;
+  }
+}
+
+@keyframes fadeInRight {
+  0% {
+    opacity: 0;
+    -webkit-transform: translate3d(100%, 0, 0);
+    transform: translate3d(100%, 0, 0);
+  }
+
+  100% {
+    opacity: 1;
+    -webkit-transform: none;
+    transform: none;
+  }
+}
+
+.fadeInRight {
+  -webkit-animation-name: fadeInRight;
+  animation-name: fadeInRight;
+}
+
+@-webkit-keyframes fadeInRightBig {
+  0% {
+    opacity: 0;
+    -webkit-transform: translate3d(2000px, 0, 0);
+    transform: translate3d(2000px, 0, 0);
+  }
+
+  100% {
+    opacity: 1;
+    -webkit-transform: none;
+    transform: none;
+  }
+}
+
+@keyframes fadeInRightBig {
+  0% {
+    opacity: 0;
+    -webkit-transform: translate3d(2000px, 0, 0);
+    transform: translate3d(2000px, 0, 0);
+  }
+
+  100% {
+    opacity: 1;
+    -webkit-transform: none;
+    transform: none;
+  }
+}
+
+.fadeInRightBig {
+  -webkit-animation-name: fadeInRightBig;
+  animation-name: fadeInRightBig;
+}
+
+@-webkit-keyframes fadeInUp {
+  0% {
+    opacity: 0;
+    -webkit-transform: translate3d(0, 100%, 0);
+    transform: translate3d(0, 100%, 0);
+  }
+
+  100% {
+    opacity: 1;
+    -webkit-transform: none;
+    transform: none;
+  }
+}
+
+@keyframes fadeInUp {
+  0% {
+    opacity: 0;
+    -webkit-transform: translate3d(0, 100%, 0);
+    transform: translate3d(0, 100%, 0);
+  }
+
+  100% {
+    opacity: 1;
+    -webkit-transform: none;
+    transform: none;
+  }
+}
+
+.fadeInUp {
+  -webkit-animation-name: fadeInUp;
+  animation-name: fadeInUp;
+}
+
+@-webkit-keyframes fadeInUpBig {
+  0% {
+    opacity: 0;
+    -webkit-transform: translate3d(0, 2000px, 0);
+    transform: translate3d(0, 2000px, 0);
+  }
+
+  100% {
+    opacity: 1;
+    -webkit-transform: none;
+    transform: none;
+  }
+}
+
+@keyframes fadeInUpBig {
+  0% {
+    opacity: 0;
+    -webkit-transform: translate3d(0, 2000px, 0);
+    transform: translate3d(0, 2000px, 0);
+  }
+
+  100% {
+    opacity: 1;
+    -webkit-transform: none;
+    transform: none;
+  }
+}
+
+.fadeInUpBig {
+  -webkit-animation-name: fadeInUpBig;
+  animation-name: fadeInUpBig;
+}
+
+@-webkit-keyframes fadeOut {
+  0% {
+    opacity: 1;
+  }
+
+  100% {
+    opacity: 0;
+  }
+}
+
+@keyframes fadeOut {
+  0% {
+    opacity: 1;
+  }
+
+  100% {
+    opacity: 0;
+  }
+}
+
+.fadeOut {
+  -webkit-animation-name: fadeOut;
+  animation-name: fadeOut;
+}
+
+@-webkit-keyframes fadeOutDown {
+  0% {
+    opacity: 1;
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: translate3d(0, 100%, 0);
+    transform: translate3d(0, 100%, 0);
+  }
+}
+
+@keyframes fadeOutDown {
+  0% {
+    opacity: 1;
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: translate3d(0, 100%, 0);
+    transform: translate3d(0, 100%, 0);
+  }
+}
+
+.fadeOutDown {
+  -webkit-animation-name: fadeOutDown;
+  animation-name: fadeOutDown;
+}
+
+@-webkit-keyframes fadeOutDownBig {
+  0% {
+    opacity: 1;
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: translate3d(0, 2000px, 0);
+    transform: translate3d(0, 2000px, 0);
+  }
+}
+
+@keyframes fadeOutDownBig {
+  0% {
+    opacity: 1;
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: translate3d(0, 2000px, 0);
+    transform: translate3d(0, 2000px, 0);
+  }
+}
+
+.fadeOutDownBig {
+  -webkit-animation-name: fadeOutDownBig;
+  animation-name: fadeOutDownBig;
+}
+
+@-webkit-keyframes fadeOutLeft {
+  0% {
+    opacity: 1;
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: translate3d(-100%, 0, 0);
+    transform: translate3d(-100%, 0, 0);
+  }
+}
+
+@keyframes fadeOutLeft {
+  0% {
+    opacity: 1;
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: translate3d(-100%, 0, 0);
+    transform: translate3d(-100%, 0, 0);
+  }
+}
+
+.fadeOutLeft {
+  -webkit-animation-name: fadeOutLeft;
+  animation-name: fadeOutLeft;
+}
+
+@-webkit-keyframes fadeOutLeftBig {
+  0% {
+    opacity: 1;
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: translate3d(-2000px, 0, 0);
+    transform: translate3d(-2000px, 0, 0);
+  }
+}
+
+@keyframes fadeOutLeftBig {
+  0% {
+    opacity: 1;
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: translate3d(-2000px, 0, 0);
+    transform: translate3d(-2000px, 0, 0);
+  }
+}
+
+.fadeOutLeftBig {
+  -webkit-animation-name: fadeOutLeftBig;
+  animation-name: fadeOutLeftBig;
+}
+
+@-webkit-keyframes fadeOutRight {
+  0% {
+    opacity: 1;
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: translate3d(100%, 0, 0);
+    transform: translate3d(100%, 0, 0);
+  }
+}
+
+@keyframes fadeOutRight {
+  0% {
+    opacity: 1;
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: translate3d(100%, 0, 0);
+    transform: translate3d(100%, 0, 0);
+  }
+}
+
+.fadeOutRight {
+  -webkit-animation-name: fadeOutRight;
+  animation-name: fadeOutRight;
+}
+
+@-webkit-keyframes fadeOutRightBig {
+  0% {
+    opacity: 1;
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: translate3d(2000px, 0, 0);
+    transform: translate3d(2000px, 0, 0);
+  }
+}
+
+@keyframes fadeOutRightBig {
+  0% {
+    opacity: 1;
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: translate3d(2000px, 0, 0);
+    transform: translate3d(2000px, 0, 0);
+  }
+}
+
+.fadeOutRightBig {
+  -webkit-animation-name: fadeOutRightBig;
+  animation-name: fadeOutRightBig;
+}
+
+@-webkit-keyframes fadeOutUp {
+  0% {
+    opacity: 1;
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: translate3d(0, -100%, 0);
+    transform: translate3d(0, -100%, 0);
+  }
+}
+
+@keyframes fadeOutUp {
+  0% {
+    opacity: 1;
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: translate3d(0, -100%, 0);
+    transform: translate3d(0, -100%, 0);
+  }
+}
+
+.fadeOutUp {
+  -webkit-animation-name: fadeOutUp;
+  animation-name: fadeOutUp;
+}
+
+@-webkit-keyframes fadeOutUpBig {
+  0% {
+    opacity: 1;
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: translate3d(0, -2000px, 0);
+    transform: translate3d(0, -2000px, 0);
+  }
+}
+
+@keyframes fadeOutUpBig {
+  0% {
+    opacity: 1;
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: translate3d(0, -2000px, 0);
+    transform: translate3d(0, -2000px, 0);
+  }
+}
+
+.fadeOutUpBig {
+  -webkit-animation-name: fadeOutUpBig;
+  animation-name: fadeOutUpBig;
+}
+
+@-webkit-keyframes flip {
+  0% {
+    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg);
+    transform: perspective(400px) rotate3d(0, 1, 0, -360deg);
+    -webkit-animation-timing-function: ease-out;
+    animation-timing-function: ease-out;
+  }
+
+  40% {
+    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);
+    transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);
+    -webkit-animation-timing-function: ease-out;
+    animation-timing-function: ease-out;
+  }
+
+  50% {
+    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);
+    transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);
+    -webkit-animation-timing-function: ease-in;
+    animation-timing-function: ease-in;
+  }
+
+  80% {
+    -webkit-transform: perspective(400px) scale3d(.95, .95, .95);
+    transform: perspective(400px) scale3d(.95, .95, .95);
+    -webkit-animation-timing-function: ease-in;
+    animation-timing-function: ease-in;
+  }
+
+  100% {
+    -webkit-transform: perspective(400px);
+    transform: perspective(400px);
+    -webkit-animation-timing-function: ease-in;
+    animation-timing-function: ease-in;
+  }
+}
+
+@keyframes flip {
+  0% {
+    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg);
+    transform: perspective(400px) rotate3d(0, 1, 0, -360deg);
+    -webkit-animation-timing-function: ease-out;
+    animation-timing-function: ease-out;
+  }
+
+  40% {
+    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);
+    transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);
+    -webkit-animation-timing-function: ease-out;
+    animation-timing-function: ease-out;
+  }
+
+  50% {
+    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);
+    transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);
+    -webkit-animation-timing-function: ease-in;
+    animation-timing-function: ease-in;
+  }
+
+  80% {
+    -webkit-transform: perspective(400px) scale3d(.95, .95, .95);
+    transform: perspective(400px) scale3d(.95, .95, .95);
+    -webkit-animation-timing-function: ease-in;
+    animation-timing-function: ease-in;
+  }
+
+  100% {
+    -webkit-transform: perspective(400px);
+    transform: perspective(400px);
+    -webkit-animation-timing-function: ease-in;
+    animation-timing-function: ease-in;
+  }
+}
+
+.animated.flip {
+  -webkit-backface-visibility: visible;
+  backface-visibility: visible;
+  -webkit-animation-name: flip;
+  animation-name: flip;
+}
+
+@-webkit-keyframes flipInX {
+  0% {
+    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
+    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
+    -webkit-transition-timing-function: ease-in;
+    transition-timing-function: ease-in;
+    opacity: 0;
+  }
+
+  40% {
+    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
+    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
+    -webkit-transition-timing-function: ease-in;
+    transition-timing-function: ease-in;
+  }
+
+  60% {
+    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
+    transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
+    opacity: 1;
+  }
+
+  80% {
+    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
+    transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
+  }
+
+  100% {
+    -webkit-transform: perspective(400px);
+    transform: perspective(400px);
+  }
+}
+
+@keyframes flipInX {
+  0% {
+    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
+    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
+    -webkit-transition-timing-function: ease-in;
+    transition-timing-function: ease-in;
+    opacity: 0;
+  }
+
+  40% {
+    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
+    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
+    -webkit-transition-timing-function: ease-in;
+    transition-timing-function: ease-in;
+  }
+
+  60% {
+    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
+    transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
+    opacity: 1;
+  }
+
+  80% {
+    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
+    transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
+  }
+
+  100% {
+    -webkit-transform: perspective(400px);
+    transform: perspective(400px);
+  }
+}
+
+.flipInX {
+  -webkit-backface-visibility: visible !important;
+  backface-visibility: visible !important;
+  -webkit-animation-name: flipInX;
+  animation-name: flipInX;
+}
+
+@-webkit-keyframes flipInY {
+  0% {
+    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
+    transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
+    -webkit-transition-timing-function: ease-in;
+    transition-timing-function: ease-in;
+    opacity: 0;
+  }
+
+  40% {
+    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);
+    transform: perspective(400px) rotate3d(0, 1, 0, -20deg);
+    -webkit-transition-timing-function: ease-in;
+    transition-timing-function: ease-in;
+  }
+
+  60% {
+    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);
+    transform: perspective(400px) rotate3d(0, 1, 0, 10deg);
+    opacity: 1;
+  }
+
+  80% {
+    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);
+    transform: perspective(400px) rotate3d(0, 1, 0, -5deg);
+  }
+
+  100% {
+    -webkit-transform: perspective(400px);
+    transform: perspective(400px);
+  }
+}
+
+@keyframes flipInY {
+  0% {
+    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
+    transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
+    -webkit-transition-timing-function: ease-in;
+    transition-timing-function: ease-in;
+    opacity: 0;
+  }
+
+  40% {
+    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);
+    transform: perspective(400px) rotate3d(0, 1, 0, -20deg);
+    -webkit-transition-timing-function: ease-in;
+    transition-timing-function: ease-in;
+  }
+
+  60% {
+    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);
+    transform: perspective(400px) rotate3d(0, 1, 0, 10deg);
+    opacity: 1;
+  }
+
+  80% {
+    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);
+    transform: perspective(400px) rotate3d(0, 1, 0, -5deg);
+  }
+
+  100% {
+    -webkit-transform: perspective(400px);
+    transform: perspective(400px);
+  }
+}
+
+.flipInY {
+  -webkit-backface-visibility: visible !important;
+  backface-visibility: visible !important;
+  -webkit-animation-name: flipInY;
+  animation-name: flipInY;
+}
+
+@-webkit-keyframes flipOutX {
+  0% {
+    -webkit-transform: perspective(400px);
+    transform: perspective(400px);
+  }
+
+  30% {
+    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
+    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
+    opacity: 1;
+  }
+
+  100% {
+    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
+    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
+    opacity: 0;
+  }
+}
+
+@keyframes flipOutX {
+  0% {
+    -webkit-transform: perspective(400px);
+    transform: perspective(400px);
+  }
+
+  30% {
+    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
+    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
+    opacity: 1;
+  }
+
+  100% {
+    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
+    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
+    opacity: 0;
+  }
+}
+
+.flipOutX {
+  -webkit-animation-name: flipOutX;
+  animation-name: flipOutX;
+  -webkit-backface-visibility: visible !important;
+  backface-visibility: visible !important;
+}
+
+@-webkit-keyframes flipOutY {
+  0% {
+    -webkit-transform: perspective(400px);
+    transform: perspective(400px);
+  }
+
+  30% {
+    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg);
+    transform: perspective(400px) rotate3d(0, 1, 0, -15deg);
+    opacity: 1;
+  }
+
+  100% {
+    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
+    transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
+    opacity: 0;
+  }
+}
+
+@keyframes flipOutY {
+  0% {
+    -webkit-transform: perspective(400px);
+    transform: perspective(400px);
+  }
+
+  30% {
+    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg);
+    transform: perspective(400px) rotate3d(0, 1, 0, -15deg);
+    opacity: 1;
+  }
+
+  100% {
+    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
+    transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
+    opacity: 0;
+  }
+}
+
+.flipOutY {
+  -webkit-backface-visibility: visible !important;
+  backface-visibility: visible !important;
+  -webkit-animation-name: flipOutY;
+  animation-name: flipOutY;
+}
+
+@-webkit-keyframes lightSpeedIn {
+  0% {
+    -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);
+    transform: translate3d(100%, 0, 0) skewX(-30deg);
+    opacity: 0;
+  }
+
+  60% {
+    -webkit-transform: skewX(20deg);
+    transform: skewX(20deg);
+    opacity: 1;
+  }
+
+  80% {
+    -webkit-transform: skewX(-5deg);
+    transform: skewX(-5deg);
+    opacity: 1;
+  }
+
+  100% {
+    -webkit-transform: none;
+    transform: none;
+    opacity: 1;
+  }
+}
+
+@keyframes lightSpeedIn {
+  0% {
+    -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);
+    transform: translate3d(100%, 0, 0) skewX(-30deg);
+    opacity: 0;
+  }
+
+  60% {
+    -webkit-transform: skewX(20deg);
+    transform: skewX(20deg);
+    opacity: 1;
+  }
+
+  80% {
+    -webkit-transform: skewX(-5deg);
+    transform: skewX(-5deg);
+    opacity: 1;
+  }
+
+  100% {
+    -webkit-transform: none;
+    transform: none;
+    opacity: 1;
+  }
+}
+
+.lightSpeedIn {
+  -webkit-animation-name: lightSpeedIn;
+  animation-name: lightSpeedIn;
+  -webkit-animation-timing-function: ease-out;
+  animation-timing-function: ease-out;
+}
+
+@-webkit-keyframes lightSpeedOut {
+  0% {
+    opacity: 1;
+  }
+
+  100% {
+    -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);
+    transform: translate3d(100%, 0, 0) skewX(30deg);
+    opacity: 0;
+  }
+}
+
+@keyframes lightSpeedOut {
+  0% {
+    opacity: 1;
+  }
+
+  100% {
+    -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);
+    transform: translate3d(100%, 0, 0) skewX(30deg);
+    opacity: 0;
+  }
+}
+
+.lightSpeedOut {
+  -webkit-animation-name: lightSpeedOut;
+  animation-name: lightSpeedOut;
+  -webkit-animation-timing-function: ease-in;
+  animation-timing-function: ease-in;
+}
+
+@-webkit-keyframes rotateIn {
+  0% {
+    -webkit-transform-origin: center;
+    transform-origin: center;
+    -webkit-transform: rotate3d(0, 0, 1, -200deg);
+    transform: rotate3d(0, 0, 1, -200deg);
+    opacity: 0;
+  }
+
+  100% {
+    -webkit-transform-origin: center;
+    transform-origin: center;
+    -webkit-transform: none;
+    transform: none;
+    opacity: 1;
+  }
+}
+
+@keyframes rotateIn {
+  0% {
+    -webkit-transform-origin: center;
+    transform-origin: center;
+    -webkit-transform: rotate3d(0, 0, 1, -200deg);
+    transform: rotate3d(0, 0, 1, -200deg);
+    opacity: 0;
+  }
+
+  100% {
+    -webkit-transform-origin: center;
+    transform-origin: center;
+    -webkit-transform: none;
+    transform: none;
+    opacity: 1;
+  }
+}
+
+.rotateIn {
+  -webkit-animation-name: rotateIn;
+  animation-name: rotateIn;
+}
+
+@-webkit-keyframes rotateInDownLeft {
+  0% {
+    -webkit-transform-origin: left bottom;
+    transform-origin: left bottom;
+    -webkit-transform: rotate3d(0, 0, 1, -45deg);
+    transform: rotate3d(0, 0, 1, -45deg);
+    opacity: 0;
+  }
+
+  100% {
+    -webkit-transform-origin: left bottom;
+    transform-origin: left bottom;
+    -webkit-transform: none;
+    transform: none;
+    opacity: 1;
+  }
+}
+
+@keyframes rotateInDownLeft {
+  0% {
+    -webkit-transform-origin: left bottom;
+    transform-origin: left bottom;
+    -webkit-transform: rotate3d(0, 0, 1, -45deg);
+    transform: rotate3d(0, 0, 1, -45deg);
+    opacity: 0;
+  }
+
+  100% {
+    -webkit-transform-origin: left bottom;
+    transform-origin: left bottom;
+    -webkit-transform: none;
+    transform: none;
+    opacity: 1;
+  }
+}
+
+.rotateInDownLeft {
+  -webkit-animation-name: rotateInDownLeft;
+  animation-name: rotateInDownLeft;
+}
+
+@-webkit-keyframes rotateInDownRight {
+  0% {
+    -webkit-transform-origin: right bottom;
+    transform-origin: right bottom;
+    -webkit-transform: rotate3d(0, 0, 1, 45deg);
+    transform: rotate3d(0, 0, 1, 45deg);
+    opacity: 0;
+  }
+
+  100% {
+    -webkit-transform-origin: right bottom;
+    transform-origin: right bottom;
+    -webkit-transform: none;
+    transform: none;
+    opacity: 1;
+  }
+}
+
+@keyframes rotateInDownRight {
+  0% {
+    -webkit-transform-origin: right bottom;
+    transform-origin: right bottom;
+    -webkit-transform: rotate3d(0, 0, 1, 45deg);
+    transform: rotate3d(0, 0, 1, 45deg);
+    opacity: 0;
+  }
+
+  100% {
+    -webkit-transform-origin: right bottom;
+    transform-origin: right bottom;
+    -webkit-transform: none;
+    transform: none;
+    opacity: 1;
+  }
+}
+
+.rotateInDownRight {
+  -webkit-animation-name: rotateInDownRight;
+  animation-name: rotateInDownRight;
+}
+
+@-webkit-keyframes rotateInUpLeft {
+  0% {
+    -webkit-transform-origin: left bottom;
+    transform-origin: left bottom;
+    -webkit-transform: rotate3d(0, 0, 1, 45deg);
+    transform: rotate3d(0, 0, 1, 45deg);
+    opacity: 0;
+  }
+
+  100% {
+    -webkit-transform-origin: left bottom;
+    transform-origin: left bottom;
+    -webkit-transform: none;
+    transform: none;
+    opacity: 1;
+  }
+}
+
+@keyframes rotateInUpLeft {
+  0% {
+    -webkit-transform-origin: left bottom;
+    transform-origin: left bottom;
+    -webkit-transform: rotate3d(0, 0, 1, 45deg);
+    transform: rotate3d(0, 0, 1, 45deg);
+    opacity: 0;
+  }
+
+  100% {
+    -webkit-transform-origin: left bottom;
+    transform-origin: left bottom;
+    -webkit-transform: none;
+    transform: none;
+    opacity: 1;
+  }
+}
+
+.rotateInUpLeft {
+  -webkit-animation-name: rotateInUpLeft;
+  animation-name: rotateInUpLeft;
+}
+
+@-webkit-keyframes rotateInUpRight {
+  0% {
+    -webkit-transform-origin: right bottom;
+    transform-origin: right bottom;
+    -webkit-transform: rotate3d(0, 0, 1, -90deg);
+    transform: rotate3d(0, 0, 1, -90deg);
+    opacity: 0;
+  }
+
+  100% {
+    -webkit-transform-origin: right bottom;
+    transform-origin: right bottom;
+    -webkit-transform: none;
+    transform: none;
+    opacity: 1;
+  }
+}
+
+@keyframes rotateInUpRight {
+  0% {
+    -webkit-transform-origin: right bottom;
+    transform-origin: right bottom;
+    -webkit-transform: rotate3d(0, 0, 1, -90deg);
+    transform: rotate3d(0, 0, 1, -90deg);
+    opacity: 0;
+  }
+
+  100% {
+    -webkit-transform-origin: right bottom;
+    transform-origin: right bottom;
+    -webkit-transform: none;
+    transform: none;
+    opacity: 1;
+  }
+}
+
+.rotateInUpRight {
+  -webkit-animation-name: rotateInUpRight;
+  animation-name: rotateInUpRight;
+}
+
+@-webkit-keyframes rotateOut {
+  0% {
+    -webkit-transform-origin: center;
+    transform-origin: center;
+    opacity: 1;
+  }
+
+  100% {
+    -webkit-transform-origin: center;
+    transform-origin: center;
+    -webkit-transform: rotate3d(0, 0, 1, 200deg);
+    transform: rotate3d(0, 0, 1, 200deg);
+    opacity: 0;
+  }
+}
+
+@keyframes rotateOut {
+  0% {
+    -webkit-transform-origin: center;
+    transform-origin: center;
+    opacity: 1;
+  }
+
+  100% {
+    -webkit-transform-origin: center;
+    transform-origin: center;
+    -webkit-transform: rotate3d(0, 0, 1, 200deg);
+    transform: rotate3d(0, 0, 1, 200deg);
+    opacity: 0;
+  }
+}
+
+.rotateOut {
+  -webkit-animation-name: rotateOut;
+  animation-name: rotateOut;
+}
+
+@-webkit-keyframes rotateOutDownLeft {
+  0% {
+    -webkit-transform-origin: left bottom;
+    transform-origin: left bottom;
+    opacity: 1;
+  }
+
+  100% {
+    -webkit-transform-origin: left bottom;
+    transform-origin: left bottom;
+    -webkit-transform: rotate3d(0, 0, 1, 45deg);
+    transform: rotate3d(0, 0, 1, 45deg);
+    opacity: 0;
+  }
+}
+
+@keyframes rotateOutDownLeft {
+  0% {
+    -webkit-transform-origin: left bottom;
+    transform-origin: left bottom;
+    opacity: 1;
+  }
+
+  100% {
+    -webkit-transform-origin: left bottom;
+    transform-origin: left bottom;
+    -webkit-transform: rotate3d(0, 0, 1, 45deg);
+    transform: rotate3d(0, 0, 1, 45deg);
+    opacity: 0;
+  }
+}
+
+.rotateOutDownLeft {
+  -webkit-animation-name: rotateOutDownLeft;
+  animation-name: rotateOutDownLeft;
+}
+
+@-webkit-keyframes rotateOutDownRight {
+  0% {
+    -webkit-transform-origin: right bottom;
+    transform-origin: right bottom;
+    opacity: 1;
+  }
+
+  100% {
+    -webkit-transform-origin: right bottom;
+    transform-origin: right bottom;
+    -webkit-transform: rotate3d(0, 0, 1, -45deg);
+    transform: rotate3d(0, 0, 1, -45deg);
+    opacity: 0;
+  }
+}
+
+@keyframes rotateOutDownRight {
+  0% {
+    -webkit-transform-origin: right bottom;
+    transform-origin: right bottom;
+    opacity: 1;
+  }
+
+  100% {
+    -webkit-transform-origin: right bottom;
+    transform-origin: right bottom;
+    -webkit-transform: rotate3d(0, 0, 1, -45deg);
+    transform: rotate3d(0, 0, 1, -45deg);
+    opacity: 0;
+  }
+}
+
+.rotateOutDownRight {
+  -webkit-animation-name: rotateOutDownRight;
+  animation-name: rotateOutDownRight;
+}
+
+@-webkit-keyframes rotateOutUpLeft {
+  0% {
+    -webkit-transform-origin: left bottom;
+    transform-origin: left bottom;
+    opacity: 1;
+  }
+
+  100% {
+    -webkit-transform-origin: left bottom;
+    transform-origin: left bottom;
+    -webkit-transform: rotate3d(0, 0, 1, -45deg);
+    transform: rotate3d(0, 0, 1, -45deg);
+    opacity: 0;
+  }
+}
+
+@keyframes rotateOutUpLeft {
+  0% {
+    -webkit-transform-origin: left bottom;
+    transform-origin: left bottom;
+    opacity: 1;
+  }
+
+  100% {
+    -webkit-transform-origin: left bottom;
+    transform-origin: left bottom;
+    -webkit-transform: rotate3d(0, 0, 1, -45deg);
+    transform: rotate3d(0, 0, 1, -45deg);
+    opacity: 0;
+  }
+}
+
+.rotateOutUpLeft {
+  -webkit-animation-name: rotateOutUpLeft;
+  animation-name: rotateOutUpLeft;
+}
+
+@-webkit-keyframes rotateOutUpRight {
+  0% {
+    -webkit-transform-origin: right bottom;
+    transform-origin: right bottom;
+    opacity: 1;
+  }
+
+  100% {
+    -webkit-transform-origin: right bottom;
+    transform-origin: right bottom;
+    -webkit-transform: rotate3d(0, 0, 1, 90deg);
+    transform: rotate3d(0, 0, 1, 90deg);
+    opacity: 0;
+  }
+}
+
+@keyframes rotateOutUpRight {
+  0% {
+    -webkit-transform-origin: right bottom;
+    transform-origin: right bottom;
+    opacity: 1;
+  }
+
+  100% {
+    -webkit-transform-origin: right bottom;
+    transform-origin: right bottom;
+    -webkit-transform: rotate3d(0, 0, 1, 90deg);
+    transform: rotate3d(0, 0, 1, 90deg);
+    opacity: 0;
+  }
+}
+
+.rotateOutUpRight {
+  -webkit-animation-name: rotateOutUpRight;
+  animation-name: rotateOutUpRight;
+}
+
+@-webkit-keyframes hinge {
+  0% {
+    -webkit-transform-origin: top left;
+    transform-origin: top left;
+    -webkit-animation-timing-function: ease-in-out;
+    animation-timing-function: ease-in-out;
+  }
+
+  20%, 60% {
+    -webkit-transform: rotate3d(0, 0, 1, 80deg);
+    transform: rotate3d(0, 0, 1, 80deg);
+    -webkit-transform-origin: top left;
+    transform-origin: top left;
+    -webkit-animation-timing-function: ease-in-out;
+    animation-timing-function: ease-in-out;
+  }
+
+  40%, 80% {
+    -webkit-transform: rotate3d(0, 0, 1, 60deg);
+    transform: rotate3d(0, 0, 1, 60deg);
+    -webkit-transform-origin: top left;
+    transform-origin: top left;
+    -webkit-animation-timing-function: ease-in-out;
+    animation-timing-function: ease-in-out;
+    opacity: 1;
+  }
+
+  100% {
+    -webkit-transform: translate3d(0, 700px, 0);
+    transform: translate3d(0, 700px, 0);
+    opacity: 0;
+  }
+}
+
+@keyframes hinge {
+  0% {
+    -webkit-transform-origin: top left;
+    transform-origin: top left;
+    -webkit-animation-timing-function: ease-in-out;
+    animation-timing-function: ease-in-out;
+  }
+
+  20%, 60% {
+    -webkit-transform: rotate3d(0, 0, 1, 80deg);
+    transform: rotate3d(0, 0, 1, 80deg);
+    -webkit-transform-origin: top left;
+    transform-origin: top left;
+    -webkit-animation-timing-function: ease-in-out;
+    animation-timing-function: ease-in-out;
+  }
+
+  40%, 80% {
+    -webkit-transform: rotate3d(0, 0, 1, 60deg);
+    transform: rotate3d(0, 0, 1, 60deg);
+    -webkit-transform-origin: top left;
+    transform-origin: top left;
+    -webkit-animation-timing-function: ease-in-out;
+    animation-timing-function: ease-in-out;
+    opacity: 1;
+  }
+
+  100% {
+    -webkit-transform: translate3d(0, 700px, 0);
+    transform: translate3d(0, 700px, 0);
+    opacity: 0;
+  }
+}
+
+.hinge {
+  -webkit-animation-name: hinge;
+  animation-name: hinge;
+}
+
+/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
+
+@-webkit-keyframes rollIn {
+  0% {
+    opacity: 0;
+    -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);
+    transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);
+  }
+
+  100% {
+    opacity: 1;
+    -webkit-transform: none;
+    transform: none;
+  }
+}
+
+@keyframes rollIn {
+  0% {
+    opacity: 0;
+    -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);
+    transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);
+  }
+
+  100% {
+    opacity: 1;
+    -webkit-transform: none;
+    transform: none;
+  }
+}
+
+.rollIn {
+  -webkit-animation-name: rollIn;
+  animation-name: rollIn;
+}
+
+/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
+
+@-webkit-keyframes rollOut {
+  0% {
+    opacity: 1;
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);
+    transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);
+  }
+}
+
+@keyframes rollOut {
+  0% {
+    opacity: 1;
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);
+    transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);
+  }
+}
+
+.rollOut {
+  -webkit-animation-name: rollOut;
+  animation-name: rollOut;
+}
+
+@-webkit-keyframes zoomIn {
+  0% {
+    opacity: 0;
+    -webkit-transform: scale3d(.3, .3, .3);
+    transform: scale3d(.3, .3, .3);
+  }
+
+  50% {
+    opacity: 1;
+  }
+}
+
+@keyframes zoomIn {
+  0% {
+    opacity: 0;
+    -webkit-transform: scale3d(.3, .3, .3);
+    transform: scale3d(.3, .3, .3);
+  }
+
+  50% {
+    opacity: 1;
+  }
+}
+
+.zoomIn {
+  -webkit-animation-name: zoomIn;
+  animation-name: zoomIn;
+}
+
+@-webkit-keyframes zoomInDown {
+  0% {
+    opacity: 0;
+    -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);
+    transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);
+    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+  }
+
+  60% {
+    opacity: 1;
+    -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
+    transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
+    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+  }
+}
+
+@keyframes zoomInDown {
+  0% {
+    opacity: 0;
+    -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);
+    transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);
+    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+  }
+
+  60% {
+    opacity: 1;
+    -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
+    transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
+    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+  }
+}
+
+.zoomInDown {
+  -webkit-animation-name: zoomInDown;
+  animation-name: zoomInDown;
+}
+
+@-webkit-keyframes zoomInLeft {
+  0% {
+    opacity: 0;
+    -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);
+    transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);
+    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+  }
+
+  60% {
+    opacity: 1;
+    -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);
+    transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);
+    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+  }
+}
+
+@keyframes zoomInLeft {
+  0% {
+    opacity: 0;
+    -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);
+    transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);
+    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+  }
+
+  60% {
+    opacity: 1;
+    -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);
+    transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);
+    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+  }
+}
+
+.zoomInLeft {
+  -webkit-animation-name: zoomInLeft;
+  animation-name: zoomInLeft;
+}
+
+@-webkit-keyframes zoomInRight {
+  0% {
+    opacity: 0;
+    -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);
+    transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);
+    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+  }
+
+  60% {
+    opacity: 1;
+    -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);
+    transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);
+    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+  }
+}
+
+@keyframes zoomInRight {
+  0% {
+    opacity: 0;
+    -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);
+    transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);
+    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+  }
+
+  60% {
+    opacity: 1;
+    -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);
+    transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);
+    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+  }
+}
+
+.zoomInRight {
+  -webkit-animation-name: zoomInRight;
+  animation-name: zoomInRight;
+}
+
+@-webkit-keyframes zoomInUp {
+  0% {
+    opacity: 0;
+    -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);
+    transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);
+    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+  }
+
+  60% {
+    opacity: 1;
+    -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
+    transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
+    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+  }
+}
+
+@keyframes zoomInUp {
+  0% {
+    opacity: 0;
+    -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);
+    transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);
+    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+  }
+
+  60% {
+    opacity: 1;
+    -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
+    transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
+    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+  }
+}
+
+.zoomInUp {
+  -webkit-animation-name: zoomInUp;
+  animation-name: zoomInUp;
+}
+
+@-webkit-keyframes zoomOut {
+  0% {
+    opacity: 1;
+  }
+
+  50% {
+    opacity: 0;
+    -webkit-transform: scale3d(.3, .3, .3);
+    transform: scale3d(.3, .3, .3);
+  }
+
+  100% {
+    opacity: 0;
+  }
+}
+
+@keyframes zoomOut {
+  0% {
+    opacity: 1;
+  }
+
+  50% {
+    opacity: 0;
+    -webkit-transform: scale3d(.3, .3, .3);
+    transform: scale3d(.3, .3, .3);
+  }
+
+  100% {
+    opacity: 0;
+  }
+}
+
+.zoomOut {
+  -webkit-animation-name: zoomOut;
+  animation-name: zoomOut;
+}
+
+@-webkit-keyframes zoomOutDown {
+  40% {
+    opacity: 1;
+    -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
+    transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
+    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);
+    transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);
+    -webkit-transform-origin: center bottom;
+    transform-origin: center bottom;
+    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+  }
+}
+
+@keyframes zoomOutDown {
+  40% {
+    opacity: 1;
+    -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
+    transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
+    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);
+    transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);
+    -webkit-transform-origin: center bottom;
+    transform-origin: center bottom;
+    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+  }
+}
+
+.zoomOutDown {
+  -webkit-animation-name: zoomOutDown;
+  animation-name: zoomOutDown;
+}
+
+@-webkit-keyframes zoomOutLeft {
+  40% {
+    opacity: 1;
+    -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);
+    transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: scale(.1) translate3d(-2000px, 0, 0);
+    transform: scale(.1) translate3d(-2000px, 0, 0);
+    -webkit-transform-origin: left center;
+    transform-origin: left center;
+  }
+}
+
+@keyframes zoomOutLeft {
+  40% {
+    opacity: 1;
+    -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);
+    transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: scale(.1) translate3d(-2000px, 0, 0);
+    transform: scale(.1) translate3d(-2000px, 0, 0);
+    -webkit-transform-origin: left center;
+    transform-origin: left center;
+  }
+}
+
+.zoomOutLeft {
+  -webkit-animation-name: zoomOutLeft;
+  animation-name: zoomOutLeft;
+}
+
+@-webkit-keyframes zoomOutRight {
+  40% {
+    opacity: 1;
+    -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);
+    transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: scale(.1) translate3d(2000px, 0, 0);
+    transform: scale(.1) translate3d(2000px, 0, 0);
+    -webkit-transform-origin: right center;
+    transform-origin: right center;
+  }
+}
+
+@keyframes zoomOutRight {
+  40% {
+    opacity: 1;
+    -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);
+    transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: scale(.1) translate3d(2000px, 0, 0);
+    transform: scale(.1) translate3d(2000px, 0, 0);
+    -webkit-transform-origin: right center;
+    transform-origin: right center;
+  }
+}
+
+.zoomOutRight {
+  -webkit-animation-name: zoomOutRight;
+  animation-name: zoomOutRight;
+}
+
+@-webkit-keyframes zoomOutUp {
+  40% {
+    opacity: 1;
+    -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
+    transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
+    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);
+    transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);
+    -webkit-transform-origin: center bottom;
+    transform-origin: center bottom;
+    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+  }
+}
+
+@keyframes zoomOutUp {
+  40% {
+    opacity: 1;
+    -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
+    transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
+    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+  }
+
+  100% {
+    opacity: 0;
+    -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);
+    transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);
+    -webkit-transform-origin: center bottom;
+    transform-origin: center bottom;
+    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+  }
+}
+
+.zoomOutUp {
+  -webkit-animation-name: zoomOutUp;
+  animation-name: zoomOutUp;
+}
+
+@-webkit-keyframes slideInDown {
+  0% {
+    -webkit-transform: translate3d(0, -100%, 0);
+    transform: translate3d(0, -100%, 0);
+    visibility: visible;
+  }
+
+  100% {
+    -webkit-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+}
+
+@keyframes slideInDown {
+  0% {
+    -webkit-transform: translate3d(0, -100%, 0);
+    transform: translate3d(0, -100%, 0);
+    visibility: visible;
+  }
+
+  100% {
+    -webkit-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+}
+
+.slideInDown {
+  -webkit-animation-name: slideInDown;
+  animation-name: slideInDown;
+}
+
+@-webkit-keyframes slideInLeft {
+  0% {
+    -webkit-transform: translate3d(-100%, 0, 0);
+    transform: translate3d(-100%, 0, 0);
+    visibility: visible;
+  }
+
+  100% {
+    -webkit-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+}
+
+@keyframes slideInLeft {
+  0% {
+    -webkit-transform: translate3d(-100%, 0, 0);
+    transform: translate3d(-100%, 0, 0);
+    visibility: visible;
+  }
+
+  100% {
+    -webkit-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+}
+
+.slideInLeft {
+  -webkit-animation-name: slideInLeft;
+  animation-name: slideInLeft;
+}
+
+@-webkit-keyframes slideInRight {
+  0% {
+    -webkit-transform: translate3d(100%, 0, 0);
+    transform: translate3d(100%, 0, 0);
+    visibility: visible;
+  }
+
+  100% {
+    -webkit-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+}
+
+@keyframes slideInRight {
+  0% {
+    -webkit-transform: translate3d(100%, 0, 0);
+    transform: translate3d(100%, 0, 0);
+    visibility: visible;
+  }
+
+  100% {
+    -webkit-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+}
+
+.slideInRight {
+  -webkit-animation-name: slideInRight;
+  animation-name: slideInRight;
+}
+
+@-webkit-keyframes slideInUp {
+  0% {
+    -webkit-transform: translate3d(0, 100%, 0);
+    transform: translate3d(0, 100%, 0);
+    visibility: visible;
+  }
+
+  100% {
+    -webkit-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+}
+
+@keyframes slideInUp {
+  0% {
+    -webkit-transform: translate3d(0, 100%, 0);
+    transform: translate3d(0, 100%, 0);
+    visibility: visible;
+  }
+
+  100% {
+    -webkit-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+}
+
+.slideInUp {
+  -webkit-animation-name: slideInUp;
+  animation-name: slideInUp;
+}
+
+@-webkit-keyframes slideOutDown {
+  0% {
+    -webkit-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+
+  100% {
+    visibility: hidden;
+    -webkit-transform: translate3d(0, 100%, 0);
+    transform: translate3d(0, 100%, 0);
+  }
+}
+
+@keyframes slideOutDown {
+  0% {
+    -webkit-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+
+  100% {
+    visibility: hidden;
+    -webkit-transform: translate3d(0, 100%, 0);
+    transform: translate3d(0, 100%, 0);
+  }
+}
+
+.slideOutDown {
+  -webkit-animation-name: slideOutDown;
+  animation-name: slideOutDown;
+}
+
+@-webkit-keyframes slideOutLeft {
+  0% {
+    -webkit-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+
+  100% {
+    visibility: hidden;
+    -webkit-transform: translate3d(-100%, 0, 0);
+    transform: translate3d(-100%, 0, 0);
+  }
+}
+
+@keyframes slideOutLeft {
+  0% {
+    -webkit-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+
+  100% {
+    visibility: hidden;
+    -webkit-transform: translate3d(-100%, 0, 0);
+    transform: translate3d(-100%, 0, 0);
+  }
+}
+
+.slideOutLeft {
+  -webkit-animation-name: slideOutLeft;
+  animation-name: slideOutLeft;
+}
+
+@-webkit-keyframes slideOutRight {
+  0% {
+    -webkit-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+
+  100% {
+    visibility: hidden;
+    -webkit-transform: translate3d(100%, 0, 0);
+    transform: translate3d(100%, 0, 0);
+  }
+}
+
+@keyframes slideOutRight {
+  0% {
+    -webkit-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+
+  100% {
+    visibility: hidden;
+    -webkit-transform: translate3d(100%, 0, 0);
+    transform: translate3d(100%, 0, 0);
+  }
+}
+
+.slideOutRight {
+  -webkit-animation-name: slideOutRight;
+  animation-name: slideOutRight;
+}
+
+@-webkit-keyframes slideOutUp {
+  0% {
+    -webkit-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+
+  100% {
+    visibility: hidden;
+    -webkit-transform: translate3d(0, -100%, 0);
+    transform: translate3d(0, -100%, 0);
+  }
+}
+
+@keyframes slideOutUp {
+  0% {
+    -webkit-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+
+  100% {
+    visibility: hidden;
+    -webkit-transform: translate3d(0, -100%, 0);
+    transform: translate3d(0, -100%, 0);
+  }
+}
+
+.slideOutUp {
+  -webkit-animation-name: slideOutUp;
+  animation-name: slideOutUp;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/styles/autocomplete-tags.less
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/styles/autocomplete-tags.less b/falcon-ui/app/css/styles/autocomplete-tags.less
new file mode 100644
index 0000000..c2f5dc2
--- /dev/null
+++ b/falcon-ui/app/css/styles/autocomplete-tags.less
@@ -0,0 +1,70 @@
+.top-buffer{
+  padding-top:20px;
+}
+.tags-wrapper {
+  position: relative;
+}
+.tags-cloud .tag {
+  float: left;
+  padding: 4px 6px;
+  font-size: 1em;
+  margin-right: 5px;
+  margin-bottom: 5px;
+  background: #f2f2f2;
+  font-weight: 600;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  -moz-background-clip: padding;
+  -webkit-background-clip: padding-box;
+  background-clip: padding-box;
+  border: 1px solid #dddddd;
+}
+.tags-cloud .tag:hover {
+  border: 1px solid #cccccc;
+}
+.tags-cloud .tag:hover .cross {
+  opacity: 1;
+}
+.tags-cloud .tag .cross {
+  margin-left: 5px;
+  margin-right: 3px;
+  font-size: 1em;
+  color: #20a28e;
+  opacity: .7;
+  cursor: pointer;
+}
+.suggestions-list {
+  position: absolute;
+  list-style-type: none;
+  margin: 0;
+  padding: 0;
+  overflow: auto;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  -moz-background-clip: padding;
+  -webkit-background-clip: padding-box;
+  background-clip: padding-box;
+  font-size: 14px;
+}
+.suggestions-list li {
+  color: #333333;
+  font-weight: 600;
+  padding: 4px 25px;
+  font-size: 1em;
+  cursor: pointer;
+  background: #f2f2f2;
+  border-bottom: 1px solid #dddddd;
+}
+.suggestions-list li:hover {
+  background: #dddddd;
+}
+.suggestions-list li:active,
+.suggestions-list li.active {
+  color: #20a28e;
+  background: #dddddd;
+}
+.suggestions-list:focus{
+  outline:none;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/styles/chart.less
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/styles/chart.less b/falcon-ui/app/css/styles/chart.less
new file mode 100644
index 0000000..5d02fd8
--- /dev/null
+++ b/falcon-ui/app/css/styles/chart.less
@@ -0,0 +1,159 @@
+/**
+ * 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-----------------//
+.chartMenuBox {
+  padding: 5px 0 0 40px;
+  h5 {
+    margin-bottom: 5px;
+  }
+  label {
+    font-weight: 500;
+  }
+}
+
+.entityBox {
+  display: inline-block;
+  .entityTypeButtons {
+    display: inline-block;
+    background-color: @gray-light2;
+    border-radius: 7px;
+    padding: 4px;
+
+    .btn {
+      background-color: @gray-light2;
+      border-radius: 7px;
+      border: none;
+      outline: none!important;
+      line-height: 1;
+      padding-right: 15px;
+      padding-left: 15px;
+      &.active {
+        background-color: @gray-dark;
+        color: white;
+      }
+      &:focus {
+
+      }
+    }
+  }
+}
+.dayBox {
+  position: absolute;
+  padding-left: 20px;
+  display: inline-block;
+  .dateInput {
+    padding-left: 2px;
+  }
+}
+.timeBox {
+  position: relative;
+  padding-left: 20px;
+  display: inline-block;
+  .dateInput {
+    padding-left: 2px;
+  }
+}
+//------------CHART------------------------//
+
+.chart {
+  /*svg {
+    .background-opacity(red, 0.3);
+  }*/
+  height:auto;
+  display: inline-block;
+  margin: 5px;
+
+}
+.axis path,
+.axis line {
+  fill: none;
+  stroke: #d3d3d3;
+  shape-rendering: crispEdges;
+}
+
+path, line,
+svg:path, svg:line{
+  shape-rendering: geometricPrecision;
+}
+
+.axis text {
+  font-family: sans-serif;
+  font-size: 8px;
+}
+.tick {
+  //stroke-dasharray: 1, 2;
+}
+.daily {
+  .axis text {
+    display: none;
+  }
+}
+
+.column {
+  opacity:0;
+  &:hover {
+    opacity: 1;
+  }
+}
+
+text {
+  font-size: 10px;
+}
+.dateAxis {
+  fill: @gray-darker;
+}
+
+
+
+.chartSideBar {
+  max-width: 155px;
+  h3, h4, h5 {
+    font-weight: bold;
+  }
+  h5 {
+    margin-bottom: 5px; font-weight: normal;
+  }
+  hr {
+    margin:5px 0;
+    border-top: 1px solid @gray-light;
+  }
+  span {
+    font-weight: bold;
+  }
+  .table {
+    font-size: 12px;
+    table-layout:fixed;
+    padding: 5px;
+    margin-bottom:0;
+    td {
+      border: 0;
+      padding: 0 5px;
+      white-space: nowrap;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      &:first-child {
+
+      }
+      &:last-child {
+        padding-bottom:0;
+        width: 30%;
+      }
+    }
+  }
+
+}


[09/22] falcon git commit: FALCON-1315 Update falcon ui for HiveDR, secure clusters and bug fixes. Contributed by Armando Reyna/Venkat Ranganathan.

Posted by so...@apache.org.
http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/controllers/entity/entity-details.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/controllers/entity/entity-details.js b/falcon-ui/app/js/controllers/entity/entity-details.js
new file mode 100644
index 0000000..217bb9b
--- /dev/null
+++ b/falcon-ui/app/js/controllers/entity/entity-details.js
@@ -0,0 +1,169 @@
+/**
+ * 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.
+ */
+(function () {
+  'use strict';
+
+  /***
+   * @ngdoc controller
+   * @name app.controllers.feed.FeedController
+   * @requires EntityModel the entity model to copy the feed entity from
+   * @requires Falcon the falcon service to talk with the Falcon REST API
+   */
+  var clusterModule = angular.module('app.controllers.view', [ 'app.services' ]);
+
+  clusterModule.controller('EntityDetailsCtrl', [
+    "$scope", "$timeout", "$interval", "Falcon", "EntityModel", "$state", "X2jsService", 'EntitySerializer', 'InstanceFalcon',
+    function ($scope, $timeout, $interval, Falcon, EntityModel, $state, X2jsService, serializer, InstanceFalcon) {
+
+      $scope.entity = EntityModel;
+
+      var resultsPerPage = 10;
+      var visiblePages = 3;
+      $scope.entityName = $scope.entity.name;
+      $scope.entityType = $scope.entity.type;
+
+      $scope.pages = [];
+      $scope.nextPages = false;
+      $scope.mirrorTag = "_falcon_mirroring_type";
+
+      $scope.isMirror = function(tags){
+        var flag = false;
+        if(tags !== undefined && tags.indexOf($scope.mirrorTag) !== -1){
+          flag = true;
+        }
+        return flag;
+      };
+
+      if($scope.entity.type === "feed"){
+        $scope.feed = serializer.preDeserialize($scope.entity.model, "feed");
+        $scope.feed.name = $scope.entity.name;
+        $scope.feed.type = $scope.entity.type;
+        $scope.entity.start = $scope.entity.model.feed.clusters.cluster[0].validity._start;
+        $scope.entity.end = $scope.entity.model.feed.clusters.cluster[0].validity._end;
+      }else{
+        var tags = $scope.entity.model.process.tags;
+        if($scope.isMirror(tags)){
+          $scope.entityTypeLabel = "Mirror";
+        }
+        $scope.process = serializer.preDeserialize($scope.entity.model, "process");
+        $scope.process.name = $scope.entity.name;
+        $scope.process.type = $scope.entity.type;
+        $scope.entity.start = $scope.entity.model.process.clusters.cluster[0].validity._start;
+        $scope.entity.end = $scope.entity.model.process.clusters.cluster[0].validity._end;
+      }
+
+      $scope.capitalize = function(input) {
+        return input.charAt(0).toUpperCase() + input.slice(1);
+      };
+
+      $scope.dateFormatter = function (date) {
+        var dates = date.split('T')[0],
+            time = date.split('T')[1].split('Z')[0].split('.')[0];
+        return dates + ' ' + time;
+      };
+
+      $scope.refreshInstanceList = function (type, name, start, end, status, orderBy, sortOrder) {
+        $scope.instancesList = [];
+        changePagesSet(0, 0, 0, start, end, status, orderBy, sortOrder);
+      };
+
+      var consultPage = function(offset, page, defaultPage, start, end, status, orderBy, sortOrder){
+        Falcon.responses.listLoaded = false;
+        InstanceFalcon.searchInstances($scope.entityType, $scope.entityName, offset, start, end, status, orderBy, sortOrder).then(function() {
+          if (InstanceFalcon.data) {
+            $scope.pages[page] = {};
+            $scope.pages[page].index = page;
+            $scope.pages[page].data = InstanceFalcon.data.instances;
+            $scope.pages[page].show = true;
+            $scope.pages[page].enabled = true;
+            $scope.pages[page].label = "" + ((offset/resultsPerPage)+1);
+            if($scope.pages[page].data.length > resultsPerPage){
+              offset = offset + resultsPerPage;
+              $scope.nextPages = true;
+              if(page < visiblePages-1){
+                consultPage(offset, page+1, defaultPage, start, end, status, orderBy, sortOrder);
+              }else{
+                $scope.goPage(defaultPage);
+              }
+            }else{
+              $scope.nextPages = false;
+              $scope.goPage(defaultPage);
+            }
+          }
+        });
+      };
+
+      var changePagesSet = function(offset, page, defaultPage, start, end, status, orderBy, sortOrder){
+        $scope.pages = [];
+        consultPage(offset, page, defaultPage, start, end, status, orderBy, sortOrder);
+      };
+
+      $scope.goPage = function (page) {
+        $scope.pages.forEach(function(pag) {
+          pag.enabled = true;
+        });
+        $scope.pages[page].enabled = false;
+        $scope.instancesList = $scope.pages[page].data;
+        if($scope.instancesList.length > resultsPerPage){
+          $scope.instancesList.pop();
+        }
+        $scope.prevPages = parseInt($scope.pages[page].label) >  visiblePages ? true : false;
+        Falcon.responses.listLoaded = true;
+      };
+
+      $scope.changePagesSet = function(offset, page, defaultPage, start, end, status, orderBy, sortOrder){
+        changePagesSet(offset, page, defaultPage, start, end, status, orderBy, sortOrder);
+      };
+
+      $scope.instanceDetails = function (instance) {
+        EntityModel.model = instance;
+        EntityModel.type = $scope.entity.type;
+        EntityModel.name = $scope.entity.name;
+        $state.go("instanceDetails");
+      };
+
+      $scope.displayIcon = function (type, model) {
+        if(type === "FEED"){
+          $scope.entityTypeLabel = "Feed";
+          return "entypo download";
+        }else if(type === "PROCESS"){
+          var tags = model.process.tags;
+          if($scope.isMirror(tags)){
+            $scope.entityTypeLabel = "Mirror";
+            return "glyphicon glyphicon-duplicate";
+          }else{
+            $scope.entityTypeLabel = "Process";
+            return "entypo cycle";
+          }
+        }else{
+          $scope.entityTypeLabel = "Process";
+          return "entypo cycle";
+        }
+      };
+
+    }
+  ]);
+
+  clusterModule.filter('titleCase', function() {
+    return function(input) {
+      input = input || '';
+      return input.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
+    };
+  });
+
+})();

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/controllers/entity/entity-view.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/controllers/entity/entity-view.js b/falcon-ui/app/js/controllers/entity/entity-view.js
deleted file mode 100644
index d58f7f6..0000000
--- a/falcon-ui/app/js/controllers/entity/entity-view.js
+++ /dev/null
@@ -1,221 +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.
- */
-(function () {
-  'use strict';
-
-  /***
-   * @ngdoc controller
-   * @name app.controllers.feed.FeedController
-   * @requires EntityModel the entity model to copy the feed entity from
-   * @requires Falcon the falcon service to talk with the Falcon REST API
-   */
-  var clusterModule = angular.module('app.controllers.view', [ 'app.services' ]);
-
-  clusterModule.controller('EntityDetailsCtrl', [
-    "$scope", "$interval", "Falcon", "EntityModel", "$state", "X2jsService",
-    function ($scope, $interval, Falcon, EntityModel, $state, X2jsService) {
-
-      $scope.clusterEntity = EntityModel;
-      $scope.xmlPreview = { edit: false };
-      $scope.secondStep = false;
-
-      function normalizeModel() {
-        //------------INTERFACE-----------//
-        var requiredInterfaceFields = ["readonly", "write", "execute", "workflow", "messaging", "registry"],
-          requiredLocationFields = ["staging", "temp", "working", ""],
-          modelInterfaceArray = $scope.clusterEntity.clusterModel.cluster.interfaces.interface,
-          modelLocationsArray = $scope.clusterEntity.clusterModel.cluster.locations.location;
-
-        modelInterfaceArray.forEach(function (element) {
-          requiredInterfaceFields.forEach(function (requiredField) {
-            if (element._type === requiredField) { requiredInterfaceFields.splice(requiredField, 1); }
-          });
-        });
-        $scope.registry = { check: true };
-        requiredInterfaceFields.forEach(function (fieldToPush) {
-          var fieldObject = { _type: fieldToPush, _endpoint: "", _version: "" };
-          if (fieldToPush === "registry") { $scope.registry = { check: false }; }
-          modelInterfaceArray.push(fieldObject);
-        });
-        //--------------TAGS--------------//
-        if ($scope.clusterEntity.clusterModel.cluster.tags === "" ||
-            $scope.clusterEntity.clusterModel.cluster.tags === undefined) {
-          $scope.clusterEntity.clusterModel.cluster.tags = "";
-          $scope.tagsArray = [{key: null, value: null}];
-        } else {
-          $scope.splitTags();
-        }
-        //-------------ACL----------------//
-        if (!$scope.clusterEntity.clusterModel.cluster.ACL) {
-          $scope.clusterEntity.clusterModel.cluster.ACL = {
-            _owner: "", _group: "", _permission: ""
-          };
-        }
-        //------------Location------------//
-        modelLocationsArray.forEach(function(element) {
-          requiredLocationFields.forEach(function(requiredField) {
-            if(element._name === requiredField) { requiredLocationFields.splice(requiredField, 1); }
-          });
-        });
-        requiredLocationFields.forEach(function(fieldToPush) {
-          var fieldObject = {_name: fieldToPush, _path: ""};
-          modelLocationsArray.push(fieldObject);
-        });
-        //----------Properties -------------//
-        if(!$scope.clusterEntity.clusterModel.cluster.properties) {
-          $scope.clusterEntity.clusterModel.cluster.properties = { property : [{ _name: "", _value: ""}] };
-        }
-
-      }
-
-      $scope.arrangeFieldsOrder = function () {
-        var BK = $scope.clusterEntity.clusterModel.cluster,
-          orderedObj = {};
-
-        orderedObj._xmlns = 'uri:falcon:cluster:0.1';
-        orderedObj._name = BK._name;
-        orderedObj._description = BK._description;
-        orderedObj._colo = BK._colo;
-
-        if (BK.tags) { orderedObj.tags = BK.tags; }
-        if (BK.interfaces) { orderedObj.interfaces = BK.interfaces; }
-        if (BK.locations) { orderedObj.locations = BK.locations; }
-        if (BK.ACL) { orderedObj.ACL = BK.ACL; }
-        if (BK.properties) { orderedObj.properties = BK.properties; }
-
-        delete $scope.clusterEntity.clusterModel.cluster;
-        $scope.clusterEntity.clusterModel.cluster = orderedObj;
-
-      };
-      //--------------TAGS------------------------//
-
-      $scope.convertTags = function () {
-        var result = [];
-        $scope.tagsArray.forEach(function(element) {
-          if(element.key && element.value) {
-            result.push(element.key + "=" + element.value);
-          }
-        });
-        result = result.join(",");
-        $scope.clusterEntity.clusterModel.cluster.tags = result;
-      };
-      $scope.splitTags = function () {
-        $scope.tagsArray = [];
-        $scope.clusterEntity.clusterModel.cluster.tags.split(",").forEach(function (fieldToSplit) {
-          var splittedString = fieldToSplit.split("=");
-          $scope.tagsArray.push({key: splittedString[0], value: splittedString[1]});
-        });
-      };
-      $scope.addTag = function () {
-        $scope.tagsArray.push({key: null, value: null});
-      };
-      $scope.removeTag = function (index) {
-        if (!isNaN(index) && index !== undefined && index !== null) {
-          $scope.tagsArray.splice(index, 1);
-          $scope.convertTags();
-        }
-      };
-      //-------------------------------------//
-      //----------LOCATION-------------------//
-
-      $scope.addLocation = function () {
-        var lastOneIndex = $scope.clusterEntity.clusterModel.cluster.locations.location.length - 1;
-
-        if (!$scope.clusterEntity.clusterModel.cluster.locations.location[lastOneIndex]._name ||
-            !$scope.clusterEntity.clusterModel.cluster.locations.location[lastOneIndex]._path) {
-          //console.log('location empty');
-        } else {
-          $scope.clusterEntity.clusterModel.cluster.locations.location.push({_name: "", _path: ""});
-        }
-      };
-      $scope.removeLocation = function (index) {
-        if(!isNaN(index) && index !== undefined && index !== null) {
-          $scope.clusterEntity.clusterModel.cluster.locations.location.splice(index, 1);
-        }
-      };
-      //-----------PROPERTIES----------------//
-      $scope.addProperty = function () {
-        var lastOne = $scope.clusterEntity.clusterModel.cluster.properties.property.length - 1;
-        if($scope.clusterEntity.clusterModel.cluster.properties.property[lastOne]._name && $scope.clusterEntity.clusterModel.cluster.properties.property[lastOne]._value){
-          $scope.clusterEntity.clusterModel.cluster.properties.property.push({ _name: "", _value: ""});
-        // $scope.tempPropModel = { _name: "", _value: ""};
-        }
-      };
-      $scope.removeProperty = function(index) {
-        if(index !== null && $scope.clusterEntity.clusterModel.cluster.properties.property[index]) {
-          $scope.clusterEntity.clusterModel.cluster.properties.property.splice(index, 1);
-        }
-      };
-    
-      //--------------------------------------//
-      //----------XML preview-----------------//
-    
-      $scope.xmlPreview.editXML = function () {
-        $scope.xmlPreview.edit = !$scope.xmlPreview.edit;
-      };
-      $scope.showInPreview = function() {
-        var xmlStr = X2jsService.json2xml_str(angular.copy($scope.clusterEntity.clusterModel));
-        $scope.prettyXml = X2jsService.prettifyXml(xmlStr);
-        $scope.xml = xmlStr;
-      };
-      $scope.transformBack = function() {
-        try {
-          var xmlObj = X2jsService.xml_str2json($scope.prettyXml);
-          $scope.clusterEntity.clusterModel = xmlObj;
-
-          if($scope.clusterEntity.clusterModel.cluster.properties && $scope.clusterEntity.clusterModel.cluster.properties.property[0] === '') {
-            $scope.clusterEntity.clusterModel.cluster.properties.property=[];
-          }
-        }
-        catch(err) {
-          console.log('xml malformed');
-        }
-      };
-      $scope.saveModelBuffer = function () {
-        $scope.jsonString = angular.toJson($scope.clusterEntity.clusterModel);
-        //goes back to js to have x2js parse it correctly
-        $scope.jsonString = JSON.parse($scope.jsonString);
-        $scope.jsonString = X2jsService.json2xml_str($scope.jsonString);
-      };
-      function xmlPreviewCallback() {
-        if ($state.current.name !== 'forms.cluster.general' && $state.current.name !== 'forms.cluster.summary') {
-          $interval.cancel(refresher);
-        }
-        if(!$scope.xmlPreview.edit) {
-          if($scope.clusterEntity.clusterModel.cluster.tags !== undefined) { $scope.convertTags(); }
-          $scope.showInPreview();
-        }
-        else {
-          $scope.splitTags();
-          $scope.transformBack();
-        }
-      }
-      var refresher = $interval(xmlPreviewCallback, 1000);
-      
-      //xmlPreviewCallback();
-
-
-      //------------init------------//
-      normalizeModel();
-    }
-  ]);
-})();
-
-
-
-

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/controllers/entity/instance-details.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/controllers/entity/instance-details.js b/falcon-ui/app/js/controllers/entity/instance-details.js
new file mode 100644
index 0000000..0775d61
--- /dev/null
+++ b/falcon-ui/app/js/controllers/entity/instance-details.js
@@ -0,0 +1,131 @@
+/**
+ * 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.
+ */
+(function () {
+  'use strict';
+
+  /***
+   * @ngdoc controller
+   * @name app.controllers.feed.FeedController
+   * @requires EntityModel the entity model to copy the feed entity from
+   * @requires Falcon the falcon service to talk with the Falcon REST API
+   */
+  var clusterModule = angular.module('app.controllers.instance', ['app.services']);
+
+  clusterModule.controller('InstanceDetailsCtrl', [
+    "$scope", "$interval", "Falcon", "EntityModel", "$state", "X2jsService", 'EntitySerializer',
+    function ($scope, $interval, Falcon, EntityModel, $state, X2jsService) {
+
+      $scope.instance = EntityModel.model;
+      $scope.instance.type = EntityModel.type;
+      $scope.instance.name = EntityModel.name;
+
+      $scope.backToEntity = function () {
+        var type = $scope.instance.type.toLowerCase();
+        var name = $scope.instance.name;
+        Falcon.logRequest();
+        Falcon.getEntityDefinition(type, name)
+          .success(function (data) {
+            Falcon.logResponse('success', data, false, true);
+            var entityModel = X2jsService.xml_str2json(data);
+            EntityModel.type = type;
+            EntityModel.name = name;
+            EntityModel.model = entityModel;
+            $state.go('entityDetails');
+          })
+          .error(function (err) {
+            Falcon.logResponse('error', err, false, true);
+          });
+      };
+
+      $scope.resumeInstance = function () {
+        Falcon.logRequest();
+        var start = $scope.instance.instance;
+        var end = addOneMin(start);
+        Falcon.postResumeInstance($scope.instance.type, $scope.instance.name, start, end)
+          .success(function (message) {
+            Falcon.logResponse('success', message, $scope.instance.type);
+            $scope.instance.status = "RUNNING";
+          })
+          .error(function (err) {
+            Falcon.logResponse('error', err, $scope.instance.type);
+
+          });
+      };
+
+      $scope.reRunInstance = function () {
+        Falcon.logRequest();
+        var start = $scope.instance.instance;
+        var end = addOneMin(start);
+        Falcon.postReRunInstance($scope.instance.type, $scope.instance.name, start, end)
+          .success(function (message) {
+            Falcon.logResponse('success', message, $scope.instance.type);
+            $scope.instance.status = "RUNNING";
+          })
+          .error(function (err) {
+            Falcon.logResponse('error', err, $scope.instance.type);
+
+          });
+      };
+
+      $scope.suspendInstance = function () {
+        Falcon.logRequest();
+        var start = $scope.instance.instance;
+        var end = addOneMin(start);
+        Falcon.postSuspendInstance($scope.instance.type, $scope.instance.name, start, end)
+          .success(function (message) {
+            Falcon.logResponse('success', message, $scope.instance.type);
+            $scope.instance.status = "SUSPENDED";
+          })
+          .error(function (err) {
+            Falcon.logResponse('error', err, $scope.instance.type);
+
+          });
+      };
+
+      $scope.killInstance = function () {
+        Falcon.logRequest();
+        var start = $scope.instance.instance;
+        var end = addOneMin(start);
+        Falcon.postKillInstance($scope.instance.type, $scope.instance.name, start, end)
+          .success(function (message) {
+            Falcon.logResponse('success', message, $scope.instance.type);
+            $scope.instance.status = "KILLED";
+          })
+          .error(function (err) {
+            Falcon.logResponse('error', err, $scope.instance.type);
+
+          });
+      };
+
+      var addOneMin = function (time) {
+        var newtime = parseInt(time.substring(time.length - 3, time.length - 1));
+        if (newtime === 59) {
+          newtime = 0;
+        } else {
+          newtime++;
+        }
+        if (newtime < 10) {
+          newtime = "0" + newtime;
+        }
+        return time.substring(0, time.length - 3) + newtime + "Z";
+      }
+
+    }
+  ]);
+
+})();

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/controllers/feed/feed-clusters-controller.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/controllers/feed/feed-clusters-controller.js b/falcon-ui/app/js/controllers/feed/feed-clusters-controller.js
index 55a5651..64c6892 100644
--- a/falcon-ui/app/js/controllers/feed/feed-clusters-controller.js
+++ b/falcon-ui/app/js/controllers/feed/feed-clusters-controller.js
@@ -27,9 +27,15 @@
    */
   var feedModule = angular.module('app.controllers.feed');
 
-  feedModule.controller('FeedClustersController', ["$scope","clustersList", "EntityFactory",
+  feedModule.controller('FeedClustersController', [ "$scope", "clustersList", "EntityFactory", "$timeout",
+                                            function($scope, clustersList, entityFactory, $timeout) {
 
-    function($scope, clustersList, entityFactory) {
+      function focusOnElement () {
+        $timeout(function () {
+          angular.element('#clusterNameSelect').trigger('focus');
+        }, 500);
+      }
+      focusOnElement();
 
       unwrapClusters(clustersList);
 
@@ -93,18 +99,30 @@
       };
 
       function unwrapClusters(clusters) {
-        $scope.clusterList = [];
-        var typeOfData = Object.prototype.toString.call(clusters.entity);
-        if(typeOfData === "[object Array]") {
-          $scope.clusterList = clusters.entity;
-        } else if(typeOfData === "[object Object]") {
-          $scope.clusterList = [clusters.entity];
-        } else {
-          //console.log("type of data not recognized");
-        }
+	if(clusters !== undefined && clusters !== null && clusters !== "null"){
+		$scope.clusterList = [];
+          var typeOfData = Object.prototype.toString.call(clusters.entity);
+          if(typeOfData === "[object Array]") {
+            $scope.clusterList = clusters.entity;
+          } else if(typeOfData === "[object Object]") {
+            $scope.clusterList = [clusters.entity];
+          } else {
+            //console.log("type of data not recognized");
+          }
+	}
       }
 
 
+      $scope.clusterLocationsPlaceHolders = (function () {
+        var obj = {};
+        $scope.feed.storage.fileSystem.locations.forEach(function (item) {
+          obj[item.type] = item.path;
+        });
+        return obj;
+      }());
+
+
+
       $scope.selectedCluster = $scope.selectedCluster || $scope.feed.clusters[0];
       $scope.sourceCluster = $scope.sourceCluster || $scope.feed.clusters[0];
       $scope.archiveCluster = $scope.newCluster(false);

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/controllers/feed/feed-location-controller.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/controllers/feed/feed-location-controller.js b/falcon-ui/app/js/controllers/feed/feed-location-controller.js
index bbb488b..055436d 100644
--- a/falcon-ui/app/js/controllers/feed/feed-location-controller.js
+++ b/falcon-ui/app/js/controllers/feed/feed-location-controller.js
@@ -27,11 +27,24 @@
    */
   var feedModule = angular.module('app.controllers.feed');
 
-  feedModule.controller('FeedLocationController', [ "$scope",function($scope) {
+  feedModule.controller('FeedLocationController', [ "$scope", "$timeout", function ($scope, $timeout) {
+
+    function focusOnElement () {
+      $timeout(function () {
+        if ($scope.feed.storage.catalog.active) {
+          angular.element('.catalogStorageInput').trigger('focus');
+        }
+        else {
+          angular.element('.firstInput').trigger('focus');
+        }
+      }, 500);
+    }
+    focusOnElement();
 
     $scope.toggleStorage = function() {
       toggle($scope.feed.storage.fileSystem);
       toggle($scope.feed.storage.catalog);
+      focusOnElement();
     };
 
     function toggle(storage) {

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/controllers/feed/feed-properties-controller.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/controllers/feed/feed-properties-controller.js b/falcon-ui/app/js/controllers/feed/feed-properties-controller.js
index 0f10ac9..8bf6a0d 100644
--- a/falcon-ui/app/js/controllers/feed/feed-properties-controller.js
+++ b/falcon-ui/app/js/controllers/feed/feed-properties-controller.js
@@ -28,6 +28,7 @@
   var feedModule = angular.module('app.controllers.feed');
 
   feedModule.controller('FeedPropertiesController', [ "$scope",function($scope) {
+
     $scope.addCustomProperty = function () {
       $scope.feed.customProperties.push({key: null, value: null});
     };
@@ -37,6 +38,22 @@
         $scope.feed.customProperties.splice(index, 1);
       }
     };
+
+    $scope.propPlaceholders = {
+      queueName: 'default',
+      jobPriority: '',
+      parallel: 3,
+      maxMaps: 8,
+      mapBandwidthKB: 1024
+    };
+
+    /*new Entry('queueName', 'default'),
+     new Entry('jobPriority', ''),
+     new Entry('timeout', new Frequency(1, 'hours')),
+     new Entry('parallel', 3),
+     new Entry('maxMaps', 8),
+     new Entry('mapBandwidthKB', 1024)*/
+
   }]);
 
 })();

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/controllers/feed/feed-root-ctrl.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/controllers/feed/feed-root-ctrl.js b/falcon-ui/app/js/controllers/feed/feed-root-ctrl.js
index 27dad77..9282ea4 100644
--- a/falcon-ui/app/js/controllers/feed/feed-root-ctrl.js
+++ b/falcon-ui/app/js/controllers/feed/feed-root-ctrl.js
@@ -33,9 +33,11 @@
       'JsonTransformerFactory', 'EntityFactory',
       'EntitySerializer', '$interval',
       '$controller', "ValidationService",
+      "SpinnersFlag", "$rootScope",
       function($scope, $state, $timeout, Falcon,
                X2jsService, transformerFactory, entityFactory,
-               serializer, $interval, $controller, validationService) {
+               serializer, $interval, $controller,
+               validationService, SpinnersFlag, $rootScope) {
 
         $scope.entityType = 'feed';
 
@@ -55,7 +57,7 @@
           $scope.baseInit();
           var type = $scope.entityType;
           $scope[type] = $scope.loadOrCreateEntity();
-          $scope.dateFormat ='dd-MMMM-yyyy';
+          $scope.dateFormat ='MM/dd/yyyy';
         };
 
         $scope.openDatePicker = function($event, container) {
@@ -76,25 +78,35 @@
 
         $scope.saveEntity = function() {
           var type = $scope.entityType;
+          var cleanedXml = cleanXml($scope.xml);
+          SpinnersFlag.show = true;
+
           if(!$scope.$parent.cloningMode) {
             Falcon.logRequest();
-            Falcon.postUpdateEntity($scope.xml, $scope.entityType, $scope[type].name)
+
+            Falcon.postUpdateEntity('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' + cleanedXml, $scope.entityType, $scope[type].name)
               .success(function (response) {
-                Falcon.logResponse('success', response, false); 
+                $scope.skipUndo = true;
+                Falcon.logResponse('success', response, false);
                 $state.go('main');
               })
               .error(function(err) {
                 Falcon.logResponse('error', err, false);
+                SpinnersFlag.show = false;
+                angular.element('body, html').animate({scrollTop: 0}, 300);
               });
           } else {
             Falcon.logRequest();
-            Falcon.postSubmitEntity($scope.xml, $scope.entityType)
+            Falcon.postSubmitEntity('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' + cleanedXml, $scope.entityType)
               .success(function (response) {
-                Falcon.logResponse('success', response, false); 
+                $scope.skipUndo = true;
+                Falcon.logResponse('success', response, false);
                 $state.go('main');
               })
               .error(function(err) {
                 Falcon.logResponse('error', err, false);
+                SpinnersFlag.show = false;
+                angular.element('body, html').animate({scrollTop: 0}, 300);
               });
           }
 
@@ -145,34 +157,92 @@
         };
 
         var xmlPreviewWorker = $interval(xmlPreviewCallback, 1000);
-
+        $scope.skipUndo = false;
         $scope.$on('$destroy', function () {
+
+          var defaultFeed = entityFactory.newEntity('feed'),
+
+              nameIsEqual = ($scope.feed.name == null || $scope.feed.name === ""),
+              groupsIsEqual = ($scope.feed.groups == null || $scope.feed.groups === ""),
+              descriptionIsEqual = ($scope.feed.description === null || $scope.feed.description === ""),
+              ACLIsEqual = angular.equals($scope.feed.ACL, defaultFeed.ACL),
+              schemaIsEqual = angular.equals($scope.feed.schema, defaultFeed.schema);
+
           $interval.cancel(xmlPreviewWorker);
-        });
 
-        //$scope.nameValid = $scope.$parent.nameValid;
-        /*
-        * needed for validation
-        * */
+          if (!$scope.skipUndo && (!nameIsEqual || !groupsIsEqual || !descriptionIsEqual || !ACLIsEqual || !schemaIsEqual)) {
+            $scope.$parent.models.feedModel = angular.copy(X2jsService.xml_str2json($scope.xml));
+            $scope.$parent.cancel('feed', $rootScope.previousState);
+          }
+        });
         $scope.goNext = function (formInvalid, stateName) {
+
+          SpinnersFlag.show = true;
+
           if (!validationService.nameAvailable || formInvalid) {
             validationService.displayValidations.show = true;
             validationService.displayValidations.nameShow = true;
+            SpinnersFlag.show = false;
             return;
           }
           validationService.displayValidations.show = false;
           validationService.displayValidations.nameShow = false;
+
           $state.go(stateName);
+
+
         };
         $scope.goBack = function (stateName) {
+          SpinnersFlag.backShow = true;
           validationService.displayValidations.show = false;
           validationService.displayValidations.nameShow = false;
           $state.go(stateName);
         };
 
-      }]);
 
 
-  
+        function cleanXml (xml) {
+
+          var obj = X2jsService.xml_str2json(xml),
+              clusterLocationsArray = [],
+              feedLocationsArray = [];
+
+          // cluster locations
+          obj.feed.clusters.cluster[0].locations.location.forEach(function (item) {
+            if (item._path) {
+              clusterLocationsArray.push(item);
+            }
+          });
+
+          if (clusterLocationsArray.length === 0) {
+            delete obj.feed.clusters.cluster[0].locations;
+          } else {
+            obj.feed.clusters.cluster[0].locations.location = clusterLocationsArray;
+          }
+
+          // feed locations
+          obj.feed.locations.location.forEach(function (item) {
+            if (item._path) {
+              feedLocationsArray.push(item);
+            }
+          });
+
+          if (feedLocationsArray.length === 0) {
+            delete obj.feed.locations;
+          } else {
+            obj.feed.locations.location = feedLocationsArray;
+          }
+
+          //feed properties
+          if (obj.feed.properties.property.length === 1 && obj.feed.properties.property[0] === "") {
+            delete obj.feed.properties;
+          }
+
+          return X2jsService.json2xml_str(obj);
+
+        }
+
+      }]);
+
 
 })();

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/controllers/feed/feed-summary-controller.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/controllers/feed/feed-summary-controller.js b/falcon-ui/app/js/controllers/feed/feed-summary-controller.js
index 77e1dcc..249b8da 100644
--- a/falcon-ui/app/js/controllers/feed/feed-summary-controller.js
+++ b/falcon-ui/app/js/controllers/feed/feed-summary-controller.js
@@ -27,7 +27,12 @@
    */
   var feedModule = angular.module('app.controllers.feed');
 
-  feedModule.controller('FeedSummaryController', [ "$scope", "$filter", function($scope, $filter) {
+  feedModule.controller('FeedSummaryController', [ "$scope", "$filter", "$timeout",
+                                                function($scope, $filter, $timeout) {
+
+    $timeout(function () {
+      angular.element('.nextBtn').trigger('focus');
+    }, 500);
 
     if($scope.transform) {
       $scope.transform();

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/controllers/header-controller.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/controllers/header-controller.js b/falcon-ui/app/js/controllers/header-controller.js
index 5039b99..b2dcaea 100644
--- a/falcon-ui/app/js/controllers/header-controller.js
+++ b/falcon-ui/app/js/controllers/header-controller.js
@@ -25,35 +25,92 @@
   ]);
 
   navHeaderModule.controller('HeaderController', [
-    '$rootScope', '$scope', '$state', '$cookieStore', 'EntityModel', 'ValidationService',
-    function ($rootScope, $scope, $state, $cookieStore, EntityModel, validationService) {
+    '$rootScope', '$scope', '$state', '$cookieStore', '$timeout', 'EntityModel', 'ValidationService', 'Falcon',
+    function ($rootScope, $scope, $state, $cookieStore, $timeout, EntityModel, validationService, Falcon) {
+
+      $scope.fake = { focus: false }; //used in upload button to fake the focus borders
+      $scope.notifs = false;
+      $scope.responses = Falcon.responses;
+
+      $scope.isInForm = function (type) {
+        if($rootScope.currentState) {
+          var currState = $rootScope.currentState.split('.'),
+            formType = currState[1];
+          return type === formType;
+        }
+      };
 
       $scope.resetCluster = function () {
         validationService.displayValidations = {show: false, nameShow: false};
-        EntityModel.clusterModel = { cluster: { tags: "", interfaces: { interface: [
-            { _type: "readonly", _endpoint: "hftp://sandbox.hortonworks.com:50070", _version: "2.2.0"},
-            { _type: "write", _endpoint: "hdfs://sandbox.hortonworks.com:8020", _version: "2.2.0"},
-            { _type: "execute", _endpoint: "sandbox.hortonworks.com:8050", _version: "2.2.0"},
-            { _type: "workflow", _endpoint: "http://sandbox.hortonworks.com:11000/oozie/", _version: "4.0.0"},
-            { _type: "messaging", _endpoint: "tcp://sandbox.hortonworks.com:61616?daemon=true", _version: "5.1.6"}
-          ]}, locations: { location: [{ _name: "staging", _path: ""}, { _name: "temp", _path: ""}, { _name: "working", _path: ""}]},
-          ACL: { _owner: "", _group: "", _permission: ""}, properties: { property: [{ _name: "", _value: ""}]},
-          _xmlns: "uri:falcon:cluster:0.1", _name: "", _description: "", _colo: ""}};
+        angular.copy(EntityModel.defaultValues.cluster, EntityModel.clusterModel);
         $state.go("forms.cluster.general");
       };
 
       $scope.resetProcess = function () {
         validationService.displayValidations = {show: false, nameShow: false};
         $scope.cloningMode = true;
+        $scope.models.processModel = null;
         $state.go("forms.process.general");
       };
 
       $scope.resetFeed = function () {
         validationService.displayValidations = {show: false, nameShow: false};
         $scope.cloningMode = true;
+        $scope.models.feedModel = null;
         $state.go("forms.feed.general");
       };
-        
+
+      $scope.resetDataset = function () {
+        validationService.displayValidations = {show: false, nameShow: false};
+        EntityModel.datasetModel.toImportModel = undefined;
+        angular.copy(EntityModel.defaultValues.MirrorUIModel, EntityModel.datasetModel.UIModel);
+        $scope.cloningMode = true;
+        $scope.models.feedModel = null;
+        $state.go("forms.dataset.general");
+      };
+
+      $scope.userLogged = function () {
+        if($rootScope.isSecureMode()){
+          return true;
+        }else if($rootScope.userLogged()){
+		if(angular.isDefined($cookieStore.get('userToken')) && $cookieStore.get('userToken') !== null){
+			$scope.userToken = $cookieStore.get('userToken').user;
+			return true;
+		}else{
+            return false;
+		}
+	  }else{
+		  return false;
+	  }
+      };
+
+      $scope.isSecureMode = function () {
+        return $rootScope.isSecureMode();
+      };
+
+      $scope.logOut = function() {
+	$cookieStore.put('userToken', null);
+	$state.transitionTo('login');
+      };
+
+      $scope.restore = function(state) {
+        $state.go(state);
+      };
+
+      $scope.notify = function() {
+        Falcon.notify(true);
+      };
+
+      $scope.hideNotifs = function() {
+        Falcon.hideNotifs();
+      };
+
     }]);
 
+    navHeaderModule.filter('reverse', function() {
+      return function(items) {
+        return items.slice().reverse();
+      };
+    });
+
 })();
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/controllers/login.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/controllers/login.js b/falcon-ui/app/js/controllers/login.js
new file mode 100644
index 0000000..2a86676
--- /dev/null
+++ b/falcon-ui/app/js/controllers/login.js
@@ -0,0 +1,72 @@
+/**
+ * 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.
+ */
+(function () {
+  'use strict';
+
+  /***
+   * @ngdoc controller
+   * @name app.controllers.feed.FeedController
+   * @requires EntityModel the entity model to copy the feed entity from
+   * @requires Falcon the falcon service to talk with the Falcon REST API
+   */
+  var loginModule = angular.module('app.controllers.login', ['ngMessages', 'app.services']);
+
+  loginModule.controller('LoginFormCtrl', ['$scope', '$state', '$cookieStore', '$http', 'ServerAPI',
+    function ($scope, $state, $cookieStore, $http, ServerAPI) {
+    $scope.showLoginVal = {show: false, userPassInvalid: false};
+
+    //$scope.loggUser = function(form) {
+    //if(form.$valid){
+    //	$http.get('config/loginData.json').success(function(data) {
+    // 		var user = data.user;
+    //	  	var password = data.password;
+    // 		if($scope.login.user === user && $scope.login.password === password){
+    //  			var userToken = {};
+    //  			userToken.timeOutLimit = $scope.login.timeOut;
+    //  			userToken.user = $scope.login.user;
+    //  			userToken.timeOut = new Date().getTime();
+    //  			$cookieStore.put('userToken', userToken);
+    //  			$state.go('main');
+    //  		}else{
+    //			$scope.showLoginVal.show = true;
+    //			$scope.showLoginVal.userPassInvalid = true;
+    //  		}
+    // 	});
+    //}else{
+    //	$scope.showLoginVal.show = true;
+    //}
+    //};
+
+    $scope.loggUser = function (form) {
+      if (form.$valid) {
+        ServerAPI.clearUser().then(function() {
+          var userToken = {};
+          userToken.timeOutLimit = $scope.login.timeOut;
+          userToken.user = $scope.login.user;
+          userToken.timeOut = new Date().getTime();
+          $cookieStore.put('userToken', userToken);
+          $state.go('main');
+        });
+      } else {
+        $scope.showLoginVal.show = true;
+      }
+    };
+
+  }]);
+
+}());

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/controllers/process/process-clusters-ctrl.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/controllers/process/process-clusters-ctrl.js b/falcon-ui/app/js/controllers/process/process-clusters-ctrl.js
index b588c84..5605268 100644
--- a/falcon-ui/app/js/controllers/process/process-clusters-ctrl.js
+++ b/falcon-ui/app/js/controllers/process/process-clusters-ctrl.js
@@ -27,11 +27,15 @@
    */
   var feedModule = angular.module('app.controllers.process');
 
-  feedModule.controller('ProcessClustersCtrl',
-    ['$scope', 'clustersList', 'EntityFactory', function($scope, clustersList, entityFactory) {
+  feedModule.controller('ProcessClustersCtrl', ['$scope', 'clustersList', 'EntityFactory', '$timeout',
+                                              function($scope, clustersList, entityFactory, $timeout) {
+
+    $timeout(function () {
+      angular.element('.firstSelectClusterStep').trigger('focus');
+    }, 500);
 
     $scope.init = function() {
-      $scope.dateFormat = 'dd-MMMM-yyyy';
+      $scope.dateFormat = 'MM/dd/yyyy';
     };
 
     $scope.openDatePicker = function($event, container) {
@@ -60,7 +64,7 @@
       } else if(typeOfData === "[object Object]") {
         $scope.clusterList = [clusters.entity];
       } else {
-        //console.log("type of data not recognized"); 
+        //console.log("type of data not recognized");
       }
     }
 

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/controllers/process/process-general-information-ctrl.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/controllers/process/process-general-information-ctrl.js b/falcon-ui/app/js/controllers/process/process-general-information-ctrl.js
index ee5ab12..bda465d 100644
--- a/falcon-ui/app/js/controllers/process/process-general-information-ctrl.js
+++ b/falcon-ui/app/js/controllers/process/process-general-information-ctrl.js
@@ -29,9 +29,9 @@
 
   feedModule.controller('ProcessGeneralInformationCtrl', [ '$scope', function($scope) {
     var availableVerions = {
-      oozie: ['4.2.0', '4.1.0', '4.0.1', '4.0.0'],
-      pig: ['pig-0.13.0', 'pig-0.12.1', 'pig-0.12.0', 'pig-0.11.1', 'pig-0.11.0', 'pig-0.10.1'],
-      hive: ['hive-0.13.1', 'hive-0.13.0', 'hive-0.12.0', 'hive-0.11.0', 'hive-0.10.0']
+      oozie: ['3.1.3-incubating', '3.2.0-incubating', '3.3.0', '3.3.1', '3.3.2', '4.0.0', '4.0.1'],
+      pig: ['pig-0.10.0', 'pig-0.10.1', 'pig-0.11.0', 'pig-0.11.1', 'pig-0.12.0', 'pig-0.12.1', 'pig-0.13.0', 'pig-0.8.0', 'pig-0.8.1', ' pig-0.9.0', ' pig-0.9.1', 'pig-0.9.2'],
+      hive: ['hive-0.10.0', 'hive-0.11.0', 'hive-0.12.0', 'hive-0.13.0', 'hive-0.13.1', 'hive-0.6.0', 'hive-0.7.0', 'hive-0.8.0', 'hive-0.8.1', 'hive-0.9.0']
     };
     $scope.nameValid = false;
     
@@ -50,10 +50,9 @@
     };
 
     $scope.selectWorkflow = function() {
-      
       if($scope.process.workflow) {        
         var engine = $scope.process.workflow.engine;
-        $scope.process.workflow.version = null;
+        $scope.process.workflow.version = "";
         $scope.versions = availableVerions[engine];
       }
     };

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/controllers/process/process-inputs-and-outputs-ctrl.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/controllers/process/process-inputs-and-outputs-ctrl.js b/falcon-ui/app/js/controllers/process/process-inputs-and-outputs-ctrl.js
index c9b22d0..a113a49 100644
--- a/falcon-ui/app/js/controllers/process/process-inputs-and-outputs-ctrl.js
+++ b/falcon-ui/app/js/controllers/process/process-inputs-and-outputs-ctrl.js
@@ -27,50 +27,73 @@
    */
   var feedModule = angular.module('app.controllers.process');
 
-  feedModule.controller('ProcessInputsAndOutputsCtrl',
+  feedModule.controller('ProcessInputsAndOutputsCtrl', ['$scope', 'EntityFactory', 'feedsList', '$timeout',
+    function ($scope, entityFactory, feedsList, $timeout) {
 
-    ['$scope', 'EntityFactory', 'feedsList', function($scope, entityFactory, feedsList) {
+      $timeout(function () {
+        if ($scope.process.inputs.length > 0) {
+          angular.element('.firstInput').trigger('focus');
+        }
+        else if ($scope.process.outputs.length > 0) {
+          angular.element('.firstOutput').trigger('focus');
+        }
+        else {
+          angular.element('.addInputButton').trigger('focus');
+        }
+      }, 500);
 
-      $scope.init = function() {
+      $scope.init = function () {
 
       };
 
-      $scope.addInput = function() {
+      $scope.addInput = function () {
         $scope.process.inputs.push(entityFactory.newInput());
       };
 
-      $scope.removeInput = function(index) {
-        if(index >= 0) {
+      $scope.removeInput = function (index) {
+        if (index >= 0) {
           $scope.process.inputs.splice(index, 1);
         }
       };
 
-      $scope.addOutput = function() {
+      $scope.addOutput = function () {
         $scope.process.outputs.push(entityFactory.newOutput());
       };
 
-      $scope.removeOutput = function(index) {
-        if(index >= 0) {
+      $scope.removeOutput = function (index) {
+        if (index >= 0) {
           $scope.process.outputs.splice(index, 1);
         }
       };
 
-
       unwrapClusters(feedsList);
 
       function unwrapClusters(feeds) {
         $scope.feedsList = [];
         var typeOfData = Object.prototype.toString.call(feeds.entity);
-        if(typeOfData === "[object Array]") {
+        if (typeOfData === "[object Array]") {
           $scope.feedsList = feeds.entity;
-        } else if(typeOfData === "[object Object]") {
+        } else if (typeOfData === "[object Object]") {
           $scope.feedsList = [feeds.entity];
         } else {
           //console.log("type of data not recognized");
         }
       }
 
+      $scope.validateStartEndDate = function () {
+        delete $scope.invalidEndDate;
+        if (this.input.start && this.input.end) {
+          var startDate = new Date(this.input.start),
+            endDate = new Date(this.input.end);
+          if (endDate.toString !== 'Invalid Date' && startDate.toString !== 'Invalid Date') {
+            if (startDate > endDate) {
+              $scope.invalidEndDate = "ng-dirty ng-invalid";
+            }
+          }
+        }
+      };
+
       $scope.init();
 
     }]);
-})();
+}());

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/controllers/process/process-properties-controller.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/controllers/process/process-properties-controller.js b/falcon-ui/app/js/controllers/process/process-properties-controller.js
index d4e747c..5b95fcd 100644
--- a/falcon-ui/app/js/controllers/process/process-properties-controller.js
+++ b/falcon-ui/app/js/controllers/process/process-properties-controller.js
@@ -27,8 +27,10 @@
    */
   var feedModule = angular.module('app.controllers.process');
 
-  feedModule.controller('ProcessPropertiesCtrl', [ '$scope', function() {
-
+  feedModule.controller('ProcessPropertiesCtrl', [ '$scope', '$timeout', function($scope, $timeout) {
+    $timeout(function () {
+      angular.element('#timeZoneSelect > select').trigger('focus');
+    }, 500);
   }]);
 
 })();

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/controllers/process/process-root-ctrl.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/controllers/process/process-root-ctrl.js b/falcon-ui/app/js/controllers/process/process-root-ctrl.js
index ba69705..7d461ba 100644
--- a/falcon-ui/app/js/controllers/process/process-root-ctrl.js
+++ b/falcon-ui/app/js/controllers/process/process-root-ctrl.js
@@ -25,12 +25,13 @@
    * @requires EntityModel the entity model to copy the feed entity from
    * @requires Falcon the falcon entity service
    */
-  var feedModule = angular.module('app.controllers.process');
+  var processModule = angular.module('app.controllers.process');
 
-  feedModule.controller('ProcessRootCtrl', [
+  processModule.controller('ProcessRootCtrl', [
     '$scope', '$state', '$interval', '$controller', 'EntityFactory',
-    'EntitySerializer', 'X2jsService', 'ValidationService',
-    function ($scope, $state, $interval, $controller, entityFactory, serializer, X2jsService, validationService) {
+    'EntitySerializer', 'X2jsService', 'ValidationService', 'SpinnersFlag', '$rootScope',
+    function ($scope, $state, $interval, $controller, entityFactory,
+              serializer, X2jsService, validationService, SpinnersFlag, $rootScope) {
 
       $scope.entityType = 'process';
 
@@ -90,27 +91,48 @@
       };
 
       var xmlPreviewWorker = $interval(xmlPreviewCallback, 1000);
-
+      $scope.skipUndo = false;
       $scope.$on('$destroy', function() {
+
+        var defaultProcess = entityFactory.newEntity('process'),
+
+          nameIsEqual = ($scope.process.name == null || $scope.process.name === ""), // falsey as it needs also to catch undefined
+          ACLIsEqual = angular.equals($scope.process.ACL, defaultProcess.ACL),
+          workflowIsEqual = angular.equals($scope.process.workflow, defaultProcess.workflow);
+
         $interval.cancel(xmlPreviewWorker);
+
+        if (!$scope.skipUndo && (!nameIsEqual || !ACLIsEqual || !workflowIsEqual)) {
+          $scope.$parent.models.processModel = angular.copy(X2jsService.xml_str2json($scope.xml));
+          $scope.$parent.cancel('process', $rootScope.previousState);
+        }
       });
 
       //---------------------------------//
       $scope.goNext = function (formInvalid, stateName) {
+        SpinnersFlag.show = true;
         if (!validationService.nameAvailable || formInvalid) {
           validationService.displayValidations.show = true;
           validationService.displayValidations.nameShow = true;
+          SpinnersFlag.show = false;
           return;
         }
         validationService.displayValidations.show = false;
         validationService.displayValidations.nameShow = false;
         $state.go(stateName);
       };
+
       $scope.goBack = function (stateName) {
+        SpinnersFlag.backShow = true;
         validationService.displayValidations.show = false;
         validationService.displayValidations.nameShow = false;
         $state.go(stateName);
       };
+
+      $scope.goTest = function (formInvalid) {
+        console.log(formInvalid);
+      };
+
     }
   ]);
 

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/controllers/process/process-summary-ctrl.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/controllers/process/process-summary-ctrl.js b/falcon-ui/app/js/controllers/process/process-summary-ctrl.js
index d81bb62..494c249 100644
--- a/falcon-ui/app/js/controllers/process/process-summary-ctrl.js
+++ b/falcon-ui/app/js/controllers/process/process-summary-ctrl.js
@@ -27,8 +27,12 @@
    */
   var feedModule = angular.module('app.controllers.process');
 
-  feedModule.controller('ProcessSummaryCtrl', [ '$scope', '$state', '$timeout', '$filter', 'Falcon',
-                                                  function($scope, $state, $timeout, $filter, Falcon) {
+  feedModule.controller('ProcessSummaryCtrl', [ '$scope', '$state', '$timeout', '$filter', 'Falcon', 'SpinnersFlag',
+                                                  function($scope, $state, $timeout, $filter, Falcon, SpinnersFlag) {
+
+    $timeout(function () {
+      angular.element('.nextBtn').trigger('focus');
+    }, 500);
 
     $scope.init = function() {
       if($scope.transform) {
@@ -47,28 +51,36 @@
 
     $scope.saveEntity = function() {
       var type = $scope.entityType;
-      if(!$scope.$parent.cloningMode) { 
+      SpinnersFlag.show = true;
+
+      if(!$scope.$parent.cloningMode) {
         Falcon.logRequest();
-        Falcon.postUpdateEntity($scope.xml, $scope.entityType, $scope[type].name)
+        Falcon.postUpdateEntity('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'  + $scope.xml, $scope.entityType, $scope[type].name)
           .success(function (response) {
-             Falcon.logResponse('success', response, false); 
-             $state.go('main'); 
+             $scope.$parent.skipUndo = true;
+             Falcon.logResponse('success', response, false);
+             $state.go('main');
 
           })
-          .error(function (err) {   
-            Falcon.logResponse('error', err, false);          
+          .error(function (err) {
+            SpinnersFlag.show = false;
+            Falcon.logResponse('error', err, false);
+            angular.element('body, html').animate({scrollTop: 0}, 300);
           });
-      } 
+      }
       else {
         Falcon.logRequest();
-        Falcon.postSubmitEntity($scope.xml, $scope.entityType)
+        Falcon.postSubmitEntity('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' + $scope.xml, $scope.entityType)
           .success(function (response) {
-             Falcon.logResponse('success', response, false); 
-             $state.go('main'); 
- 
+             $scope.$parent.skipUndo = true;
+             Falcon.logResponse('success', response, false);
+             $state.go('main');
+
           })
-          .error(function (err) {   
-            Falcon.logResponse('error', err, false);          
+          .error(function (err) {
+            Falcon.logResponse('error', err, false);
+            SpinnersFlag.show = false;
+            angular.element('body, html').animate({scrollTop: 0}, 300);
           });
       }
 

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/controllers/root-controller.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/controllers/root-controller.js b/falcon-ui/app/js/controllers/root-controller.js
index 9a71d30..709f6b2 100644
--- a/falcon-ui/app/js/controllers/root-controller.js
+++ b/falcon-ui/app/js/controllers/root-controller.js
@@ -21,69 +21,118 @@
   var app = angular.module('app.controllers.rootCtrl', ['app.services']);
 
   app.controller('RootCtrl', [
-    "$scope", "$timeout", "Falcon", "FileApi", "EntityModel", "$state", "X2jsService", "ValidationService",
-    function ($scope, $timeout, Falcon, FileApi, EntityModel, $state, X2jsService, validationService) {
+    "$scope", "$timeout", "Falcon", "FileApi", "EntityModel",
+    "$state", "X2jsService", "ValidationService", "SpinnersFlag", "EntityFalcon",
+    function ($scope, $timeout, Falcon, FileApi,
+              EntityModel, $state, X2jsService, validationService, SpinnersFlag, EntityFalcon) {
+
+      var resultsPerPage = 10;
 
       $scope.server = Falcon;
       $scope.validations = validationService;
+      $scope.buttonSpinners = SpinnersFlag;
       $scope.models = {};
 
+      $scope.pages = [];
+      $scope.nextPages = false;
+
       $scope.handleFile = function (evt) {
         Falcon.logRequest();
         FileApi.loadFile(evt).then(function () {
-          Falcon.postSubmitEntity(FileApi.fileRaw, EntityModel.type).success(function (response) {
-            Falcon.logResponse('success', response, false);
-            $scope.refreshList(EntityModel.type);
-          }).error(function (err) {
-            Falcon.logResponse('error', err, false);
-          });
+          if (EntityModel.type === 'Type not recognized') {
+            Falcon.logResponse('error', {status: 'ERROR', message:'Invalid xml. File not uploaded'}, false);
+          } else {
+            Falcon.postSubmitEntity(FileApi.fileRaw, EntityModel.type).success(function (response) {
+              Falcon.logResponse('success', response, false);
+              $scope.refreshList($scope.tags);
+            }).error(function (err) {
+              Falcon.logResponse('error', err, false);
+            });
+          }
+
         });
       };
 
-      $scope.lists = {};
-      $scope.lists.feedList = [];
-      $scope.lists.clusterList = [];
-      $scope.lists.processList = [];
+      $scope.goPage = function(page){
+        $scope.loading = true;
+        var offset = (page-1) * resultsPerPage;
+        EntityFalcon.searchEntities($scope.entityName, $scope.entityTags, $scope.entityType, offset).then(function() {
+          if (EntityFalcon.data !== null) {
+            $scope.actualPage = page;
+            $scope.searchList = EntityFalcon.data.entity;
+            var totalPages = Math.ceil(EntityFalcon.data.totalResults/resultsPerPage);
+            $scope.pages = []
+            for(var i=0; i<totalPages; i++){
+              $scope.pages[i] = {};
+              $scope.pages[i].index = (i+1);
+              $scope.pages[i].label = ""+(i+1);
+              if(page === (i+1)){
+                $scope.pages[i].enabled = false;
+              }else{
+                $scope.pages[i].enabled = true;
+              }
+            }
+            if($scope.searchList.length === 0){
+              Falcon.warningMessage("No results matched the search criteria.");
+            }
+            $timeout(function() {
+              angular.element('#tagsInput').focus();
+            }, 0, false);
+            Falcon.responses.listLoaded = true;
+            $scope.loading = false;
+          }
+        });
+      };
 
-      $scope.refreshList = function (type) {
-        type = type.toLowerCase();
-        Falcon.responses.listLoaded[type] = false;
-        if (Falcon.responses.multiRequest[type] > 0) { return; }
+      $scope.refreshList = function (tags) {
 
-        Falcon.logRequest();
+        $scope.nameFounded = false;
+        $scope.typeFounded = false;
+        $scope.entityName = "";
+        $scope.entityType = "";
+        var tagsSt = "";
 
-        Falcon.getEntities(type)
-          .success(function (data) {
-            
-            Falcon.logResponse('success', data, false, true);
-            Falcon.responses.listLoaded[type] = true;
-            $scope.lists[type + 'List'] = [];
-
-            if (data === null) {
-              $scope.lists[type + 'List'] = [];
-            }else{
-              var typeOfData = Object.prototype.toString.call(data.entity);	
-        	  if (typeOfData === "[object Array]") {
-                $scope.lists[type + 'List'] = data.entity;
-              } else if (typeOfData === "[object Object]") {
-                $scope.lists[type + 'List'][0] = data.entity;
-              } else {
-                console.log("type of data not recognized");
-              }
+        $scope.searchList = [];
+
+        if(tags === undefined || tags.length === 0){
+          $timeout(function() {
+            angular.element('#tagsInput').focus();
+          }, 0, false);
+          return;
+        }
+
+        for(var i=0; i<tags.length; i++){
+          var tag = tags[i].text;
+          if(tag.indexOf("Name:") !== -1){
+            $scope.nameFounded = true;
+            tag = tag.substring(5);
+            $scope.entityName = tag;
+          }else if(tag.indexOf("Type:") !== -1){
+            $scope.typeFounded = true;
+            tag = tag.substring(5);
+            $scope.entityType = tag;
+          }else{
+            tag = tag.substring(4);
+            tagsSt += tag;
+            if(i < tags.length-1){
+              tagsSt += ",";
             }
-          })
-          .error(function (err) {
-            Falcon.logResponse('error', err);
-          });
-      };
+          }
+
+        }
+
+        $scope.entityTags = tagsSt;
+
+        $scope.goPage(1);
 
-      $scope.refreshLists = function () {
-        $scope.refreshList('cluster');
-        $scope.refreshList('feed');
-        $scope.refreshList('process');
       };
-      $scope.closeAlert = function (index) {
-        Falcon.removeMessage(index);
+
+      $scope.cancel = function (type, state) {
+        var cancelInfo = {
+          state: state || $state.current.name,
+          message: type + ' edition canceled '
+        };
+        Falcon.logResponse('cancel', cancelInfo, type, false);
       };
 
     }]);

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/directives/chart.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/directives/chart.js b/falcon-ui/app/js/directives/chart.js
new file mode 100644
index 0000000..f9d6983
--- /dev/null
+++ b/falcon-ui/app/js/directives/chart.js
@@ -0,0 +1,531 @@
+/**
+ * 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.
+ */
+(function () {
+  "use strict";
+
+  var d3Module = angular.module('chart-module', ['app.services.falcon']);
+
+  //  <d3-bar-chart class="chart" input="my.data" w="700" h="400" t="30" dx="[0,50]" dy="[24,0]" details="details"></d3-bar-chart>
+  d3Module.directive('chart', function() {
+    return {
+      scope: {
+        input: "=",
+        t: "@",
+        mode: "=",
+        details:"="
+      },
+      restrict: "EA",
+      link: function (scope, element) {
+
+
+        scope.$watch(function () {
+          return scope.input;
+        }, function () {
+          prepareData();
+        });
+
+        angular.element(window).on('resize', prepareData);
+
+        function prepareData () {
+
+          if (scope.input.length === 0) {
+            return;
+          }
+
+          scope.w = angular.element('.chartCol').width();
+          scope.h = 400;
+
+
+          if (scope.mode === 'daily') { scope.xDomain = 14; } else { scope.xDomain = 24; }
+
+          scope.yDomain = d3.max(scope.input, function (d) {
+            if (d.numFailedInstances >= d.numSuccessfullInstances) {
+              return d.numFailedInstances;
+            }else {
+              return d.numSuccessfullInstances;
+            }
+          });
+          scope.yMaxDataSizeDomain = d3.max(scope.input, function (d) {
+              return d.dataSizeCopied;
+          }) + 100;
+          scope.yMaxDataSizeDomain = scope.yMaxDataSizeDomain * 1.2;
+          scope.yDomain = scope.yDomain * 1.2;
+
+          d3.selectAll('svg').remove();
+
+          drawChart();
+
+        }
+
+        function drawChart() {
+
+          var x = d3.scale.linear().domain([0,scope.xDomain]).range( [0, (scope.w - (scope.t * 2) ) ]),
+              y = d3.scale.linear().domain([0, scope.yDomain]).range( [0, (scope.h - (scope.t * 2) ) ]),
+              yDataSizeScale = d3.scale.linear().domain([0, scope.yMaxDataSizeDomain]).range( [0, (scope.h - (scope.t * 2) ) ]),
+
+              xAxis = d3.svg.axis()
+                .scale(x)
+                .orient("bottom")
+                .ticks(scope.xDomain),
+
+              gridNumberRows = 11,
+
+              canvas = d3.select(element[0])
+                .append("svg")
+                .attr("width", scope.w)
+                .attr("height", scope.h),
+
+              col,
+              tip,
+
+              linePrepareTransition = d3.svg.line()
+                .x(function(d, i) {
+                  return x(i);
+                })
+                .y(function() {
+                  return (y(scope.yDomain));
+                })
+                .interpolate('cardinal'),
+
+              successLineFunc = d3.svg.line()
+                .x(function(d, i) {
+                  return x(i);
+                })
+                .y(function(d) {
+                  return (y(scope.yDomain - d.numSuccessfullInstances));
+                })
+                .interpolate('cardinal'),
+
+              failedLineFunc = d3.svg.line()
+                .x(function(d, i) {
+                  return x(i);
+                })
+                .y(function(d) {
+                  return (y(scope.yDomain - d.numFailedInstances));
+                })
+                .interpolate('cardinal'),
+
+              successAreaFunc = d3.svg.area()
+                .x(function(d, i) {
+                  return x(i);
+                })
+                .y0(y(scope.yDomain))
+                .y1(function(d) {
+                  return (y(scope.yDomain - d.numSuccessfullInstances));
+                })
+                .interpolate('cardinal'),
+
+              failedAreaFunc = d3.svg.area()
+                .x(function(d, i) {
+                  return x(i);
+                })
+                .y0(y(scope.yDomain))
+                .y1(function(d) {
+                  return (y(scope.yDomain - d.numFailedInstances));
+                })
+                .interpolate('cardinal');
+
+          //---------------X AXIS ----------------------//
+          canvas.append("g")
+            .attr("class", "x axis")
+            .attr("transform", "translate(" + scope.t + "," + (( scope.h - scope.t ) + 0.5) + ")")
+            .call(xAxis);
+
+          if (scope.mode === 'daily') {
+
+            canvas.selectAll('g.dateAxis')
+              .data(scope.input).enter()
+              .append("g").attr('class', 'dateAxis')
+              .append("text")
+              .attr({
+                "text-anchor": "middle",
+                x: function(d, i) { return x(i);},
+                y: function() { return (y(scope.yDomain)); },
+                transform: "translate(" + (x(0.5) + parseInt(scope.t, 10)) + "," + (scope.t*1.5) + ")"
+              }).html(function(d) {
+                var format = d3.time.format.utc("%d %b");
+                return format(new Date(d.startTime));
+              });
+          }
+
+          //---------------GRID-------------------------//
+
+          d3.range(0, (gridNumberRows + 1)).forEach(function (i) {
+
+            canvas.append('svg:line')
+              .attr({
+                stroke: "#d3d3d3",
+                'stroke-width': 1,
+                x1: 0,
+                x2: x(scope.xDomain),
+                y1: y((scope.yDomain/gridNumberRows) * i),
+                y2: y((scope.yDomain/gridNumberRows) * i),
+                transform: "translate(" + scope.t + "," + scope.t + ")"
+              });
+
+          });
+
+          //----------BARS DATASIZE COPIED---------------//
+
+          canvas.selectAll('rect.dataSize')
+            .data(scope.input).enter()
+            .append("svg:rect").attr('class', 'dataSize')
+            .attr({
+              x: function(d, i) { return x(i); },
+              y: function() { return yDataSizeScale(scope.yMaxDataSizeDomain); },
+              width: function() { return x(1); },
+              height: function() { return 0; },
+              stroke: "none",
+              fill: "rgba(8,8,8,0.3)",
+              transform: "translate(" + scope.t + "," + scope.t + ")"
+            })
+            .transition().duration(2000)
+            .attr({
+              height: function(d) { return yDataSizeScale(d.dataSizeCopied); },
+              y: function(d) { return yDataSizeScale(scope.yMaxDataSizeDomain - d.dataSizeCopied); }
+            });
+
+          //-------------LINES------------//
+
+          canvas.append('svg:path')
+            .attr({
+              d: linePrepareTransition(scope.input),
+              transform: "translate(" + (x(0.5) + parseInt(scope.t, 10)) + "," + scope.t + ")",
+              stroke: "green",
+              "stroke-width": 2,
+              "stroke-linecap": "round",
+              fill: "rgba(0,0,0,0)"
+            })
+            .transition().duration(1000)
+            .attr({
+              d: successLineFunc(scope.input)
+            });
+
+          canvas.append('svg:path')
+            .attr({
+              d: linePrepareTransition(scope.input),
+              transform: "translate(" + (x(0.5) + parseInt(scope.t, 10)) + "," + scope.t + ")",
+              stroke: "red",
+              "stroke-width": 2,
+              fill: 'none'
+            })
+            .transition().duration(1000).delay(500)
+            .attr({
+              d: failedLineFunc(scope.input)
+            });
+
+          //-------------AREAS------------//
+
+          canvas.append('svg:path')
+            .attr({
+              d: linePrepareTransition(scope.input),
+              transform: "translate(" + (x(0.5) + parseInt(scope.t, 10)) + "," + scope.t + ")"
+            })
+            .transition().duration(1000)
+            .attr({
+              d: successAreaFunc(scope.input),
+              stroke: "none",
+              fill: "rgba(0,255,0,0.1)"
+            });
+
+          canvas.append('svg:path')
+            .attr({
+              d: linePrepareTransition(scope.input),
+              transform: "translate(" + (x(0.5) + parseInt(scope.t, 10)) + "," + scope.t + ")"
+            })
+            .transition().duration(1000).delay(500)
+            .attr({
+              d: failedAreaFunc(scope.input),
+              stroke: "none",
+              fill: "rgba(255,0,0,0.1)"
+            });
+
+          //------------COL----------------------------//
+
+          col = canvas.selectAll('g.col')
+            .data(scope.input).enter()
+            .append("g").attr('class', 'column');
+
+          col.append('svg:line')
+            .attr({
+              stroke: "#d3d3d3",
+              'stroke-width': 1,
+              x1: function(d, i) { return x(i); },
+              x2: function(d, i) { return x(i); },
+              y1: 0,
+              y2: y(scope.yDomain),
+              transform: "translate(" + (x(0.5) + parseInt(scope.t, 10)) + "," + scope.t + ")"
+            });
+
+          col.append('svg:line')
+            .attr({
+              stroke: "#748484",
+              'stroke-width': 3,
+              x1: function(d, i) { return x(i); },
+              x2: function(d, i) { return x(i + 1); },
+              y1: function (d) { return yDataSizeScale((scope.yMaxDataSizeDomain - d.dataSizeCopied)) + 1.5; },
+              y2: function (d) { return yDataSizeScale((scope.yMaxDataSizeDomain - d.dataSizeCopied)) + 1.5; },
+              transform: "translate(" + scope.t + "," + scope.t + ")"
+            });
+
+          col.append("circle")
+            .attr({
+              r: 5,
+              fill: "green",
+              cx: function(d, i) { return x(i);},
+              cy: function(d) { return (y(scope.yDomain - d.numSuccessfullInstances)); },
+              transform: "translate(" + (x(0.5) + parseInt(scope.t, 10)) + "," + scope.t + ")"
+            });
+
+          col.append("circle")
+            .attr({
+              r: 5,
+              fill: "red",
+              cx: function(d, i) { return x(i);},
+              cy: function(d) { return (y(scope.yDomain - d.numFailedInstances)); },
+              transform: "translate(" + (x(0.5) + parseInt(scope.t, 10)) + "," + scope.t + ")"
+            });
+
+          tip = col.append("g").attr('transform', "translate(" + scope.t + ", -" + scope.t/2 + ")");
+
+          tip.append("svg:rect")
+            .attr({
+              stroke: "gray",
+              fill: "white",
+              transform: "translate(-6, -"+ scope.t + ")",
+              width: 50,
+              height: 50,
+              'stroke-width': 1,
+              x: function(d, i) { return x(i);},
+              y: function (d) {
+
+                if (y(d.numSuccessfullInstances) > yDataSizeScale(d.dataSizeCopied) && y(d.numSuccessfullInstances) > y(d.numFailedInstances)) {
+                  return (y(scope.yDomain) - y(d.numSuccessfullInstances));
+                } else if (y(d.numFailedInstances) > yDataSizeScale(d.dataSizeCopied) && y(d.numFailedInstances) > y(d.numSuccessfullInstances)) {
+                  return (y(scope.yDomain) - y(d.numFailedInstances));
+                } else {
+                  return (yDataSizeScale(scope.yMaxDataSizeDomain) - yDataSizeScale(d.dataSizeCopied));
+                }
+
+              }
+            });
+
+          tip.append("text")
+            .attr({
+              x: function(d, i) { return x(i); },
+              y: function (d) {
+
+                if (y(d.numSuccessfullInstances) > yDataSizeScale(d.dataSizeCopied) && y(d.numSuccessfullInstances) > y(d.numFailedInstances)) {
+                  return (y(scope.yDomain) - y(d.numSuccessfullInstances));
+                } else if (y(d.numFailedInstances) > yDataSizeScale(d.dataSizeCopied) && y(d.numFailedInstances) > y(d.numSuccessfullInstances)) {
+                  return (y(scope.yDomain) - y(d.numFailedInstances));
+                } else {
+                  return (yDataSizeScale(scope.yMaxDataSizeDomain) - yDataSizeScale(d.dataSizeCopied));
+                }
+
+              },
+              transform: "translate(10, -" +  (scope.t * 0.5) +")",
+              position: "relative"
+            })
+
+            .html(function(d) {
+              var tip = "<tspan x='' y='' fill='green'>" + d.numSuccessfullInstances + "</tspan>";
+              return tip;
+            });
+
+          tip.append("text")
+            .attr({
+              x: function(d, i) { return x(i); },
+              y: function (d) {
+
+                if (y(d.numSuccessfullInstances) > yDataSizeScale(d.dataSizeCopied) && y(d.numSuccessfullInstances) > y(d.numFailedInstances)) {
+                  return (y(scope.yDomain) - y(d.numSuccessfullInstances));
+                } else if (y(d.numFailedInstances) > yDataSizeScale(d.dataSizeCopied) && y(d.numFailedInstances) > y(d.numSuccessfullInstances)) {
+                  return (y(scope.yDomain) - y(d.numFailedInstances));
+                } else {
+                  return (yDataSizeScale(scope.yMaxDataSizeDomain) - yDataSizeScale(d.dataSizeCopied));
+                }
+
+              },
+              transform: "translate(10, -2)",
+              position: "relative"
+            })
+            .html(function(d) {
+              var tip = "<tspan x='' y='' fill='red'>" + d.numFailedInstances + "</tspan>";
+
+              return tip;
+            });
+
+          tip.append("text")
+            .attr({
+              x: function(d, i) { return x(i); },
+              y: function (d) {
+
+                if (y(d.numSuccessfullInstances) > yDataSizeScale(d.dataSizeCopied) && y(d.numSuccessfullInstances) > y(d.numFailedInstances)) {
+                  return (y(scope.yDomain) - y(d.numSuccessfullInstances));
+                } else if (y(d.numFailedInstances) > yDataSizeScale(d.dataSizeCopied) && y(d.numFailedInstances) > y(d.numSuccessfullInstances)) {
+                  return (y(scope.yDomain) - y(d.numFailedInstances));
+                } else {
+                  return (yDataSizeScale(scope.yMaxDataSizeDomain) - yDataSizeScale(d.dataSizeCopied));
+                }
+
+              },
+              transform: "translate(0, 13)",
+              position: "relative"
+            })
+            .html(function(d) {
+              return "<tspan x='' y='' fill='gray'>" + d.dataSizeCopied + "</tspan>";
+            });
+
+          tip.append("circle")
+            .attr({
+              r: 5,
+              fill: "green",
+              cx: function(d, i) { return x(i);},
+              cy: function (d) {
+
+                if (y(d.numSuccessfullInstances) > yDataSizeScale(d.dataSizeCopied) && y(d.numSuccessfullInstances) > y(d.numFailedInstances)) {
+                  return (y(scope.yDomain) - y(d.numSuccessfullInstances));
+                } else if (y(d.numFailedInstances) > yDataSizeScale(d.dataSizeCopied) && y(d.numFailedInstances) > y(d.numSuccessfullInstances)) {
+                  return (y(scope.yDomain) - y(d.numFailedInstances));
+                } else {
+                  return (yDataSizeScale(scope.yMaxDataSizeDomain) - yDataSizeScale(d.dataSizeCopied));
+                }
+
+              },
+              transform: "translate(3,-20)"
+            });
+
+          tip.append("circle")
+            .attr({
+              r: 5,
+              fill: "red",
+              cx: function(d, i) { return x(i);},
+              cy: function (d) {
+
+                if (y(d.numSuccessfullInstances) > yDataSizeScale(d.dataSizeCopied) && y(d.numSuccessfullInstances) > y(d.numFailedInstances)) {
+                  return (y(scope.yDomain) - y(d.numSuccessfullInstances));
+                } else if (y(d.numFailedInstances) > yDataSizeScale(d.dataSizeCopied) && y(d.numFailedInstances) > y(d.numSuccessfullInstances)) {
+                  return (y(scope.yDomain) - y(d.numFailedInstances));
+                } else {
+                  return (yDataSizeScale(scope.yMaxDataSizeDomain) - yDataSizeScale(d.dataSizeCopied));
+                }
+
+              },
+              transform: "translate(3,-6)"
+            });
+
+          //--------------CLICKABLE-----------//
+
+          col.append("rect")
+            .attr({
+              x: function(d, i) { return x(i); },
+              y: 0,
+              width: function() { return x(1); },
+              height: scope.h,
+              stroke: "none",
+              fill: "transparent",
+              transform: "translate(" + scope.t + ", 0)"
+            })
+            .on("click", function(d){ scope.details(d); });
+
+        }
+
+        prepareData();
+
+      }
+    };
+  });
+
+
+  d3Module.controller('chartCtrl', [ "$scope", "Falcon", function($scope, Falcon) {
+
+    var formatFL = d3.time.format.utc("%A %d"),
+        formatSL = d3.time.format.utc("%b %Y"),
+        formatTL = d3.time.format.utc("%H:%M");
+
+    $scope.graphData = [];
+
+    $scope.chartOptions = {
+      entity: "feed",
+      mode: "hourly",
+      day: ""
+    };
+
+    $scope.chartSidebarDate = {};
+
+    $scope.requestNewData = function () {
+
+      var type = $scope.chartOptions.entity,
+          mode = $scope.chartOptions.mode,
+          fromDate = new Date($scope.chartOptions.day),
+          fromMonth = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'],
+          from = fromDate.getFullYear() + '-' +
+            (fromMonth[fromDate.getMonth()]) + '-' +
+            (function () {
+              var date = fromDate.getDate();
+              if (date<10) {
+                return '0' + date;
+              } else {
+                return date;
+              }
+            }()),
+          to = from; //no to supported yet
+
+      if (type && mode && $scope.chartOptions.day !== '' && $scope.chartOptions.day !== undefined) {
+        Falcon.getInstancesSummary(type, mode, from, to)
+          .success(function (data) {
+            $scope.graphData = data.summary;
+          }).error(function (error) {
+            Falcon.logResponse('error', error, false);
+          });
+      }
+      $scope.chartSidebarDate = {};
+      $scope.chartSidebarModel = undefined;
+
+    };
+
+    $scope.dateFormat ='MM/dd/yyyy';
+    $scope.openDatePicker = function($event) {
+      $event.preventDefault();
+      $event.stopPropagation();
+      $scope.opened = true;
+    };
+
+    $scope.details = function (obj) {
+
+      var from = obj.startTime,
+          to = obj.endTime,
+          entityType = $scope.chartOptions.entity;
+
+      $scope.chartSidebarDate.firstLeg = formatFL(new Date(from));
+      $scope.chartSidebarDate.secondLeg = formatSL(new Date(from));
+      $scope.chartSidebarDate.timeLeg = formatTL(new Date(from));
+
+      Falcon.getTopEntities(entityType, from, to).success(function (data) {
+        $scope.chartSidebarModel = data;
+      }).error(function (error) {
+        Falcon.logResponse('error', error, false);
+      });
+
+    };
+
+  }]);
+
+
+}());

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/directives/check-name.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/directives/check-name.js b/falcon-ui/app/js/directives/check-name.js
index c6f79ab..bea0e22 100644
--- a/falcon-ui/app/js/directives/check-name.js
+++ b/falcon-ui/app/js/directives/check-name.js
@@ -18,9 +18,9 @@
 (function () {
   'use strict';
 
-  var checkNameModule = angular.module('app.directives.check-name', ['app.services']);
+  var checkNameModule = angular.module('app.directives.check-name', ['app.services.falcon', 'app.services.validation']);
 
-  checkNameModule.directive('checkName', [ "ValidationService", "$timeout", function (validationService, $timeout) {
+  checkNameModule.directive('checkName', [ "ValidationService", "$timeout", "Falcon", "EntityFalcon", function (validationService, $timeout, Falcon, EntityFalcon) {
     return {
       replace: false,
       scope: {
@@ -30,7 +30,8 @@
       link: function (scope, element) {
 
         var options = scope.checkName,
-          entities = scope.$parent.lists[options.type + 'List'],
+          //entities = scope.$parent.lists[options.type + 'List'],
+          type = options.type,
           name = element[0].value;
 
         if (!options.check) {
@@ -38,11 +39,25 @@
         }
 
         scope.$watch(function () {
-          return element[0].value.length;
+          return element[0].value;
         }, function () {
-          if (element[0].value.length === 0) {
-            element.addClass('empty');
+          if (!scope.$parent.editXmlDisabled) {
+            if (element[0].value.length === 0) {
+              element.addClass('empty');
+            }
+            getNameAvailability(function() {
+              getMessage();
+              if (element.hasClass('ng-valid') && validationService.nameAvailable) {
+                angular.element('.nameValidationMessage').addClass('hidden');
+              } else {
+                element.parent().addClass("showValidationStyle");
+                angular.element('.nameValidationMessage').removeClass('hidden');
+                element.removeClass('empty');
+              }
+            });
           }
+
+
         });
 
         function getLabels() {
@@ -51,30 +66,45 @@
                 "</div><label class='custom-danger nameValidationMessage'></label>");
         }
 
-        function getNameAvailability() {
-          var isAvailable = true;
+        function getNameAvailability(fn) {
           name = element[0].value;
-
-          angular.forEach(entities, function (item) {
-            if (item.name === name) {
-              isAvailable = false;
-            }
-          });
-          validationService.nameAvailable = isAvailable;
           if (name.length === 0) {
             angular.element('.nameInputDisplay').addClass('hidden');
-
-          } else if (!validationService.nameAvailable && name.length > 0 && element.hasClass('ng-valid')) {
-            angular.element('.nameInputDisplay').html('Name unavailable')
-              .removeClass('custom-success hidden').addClass('custom-danger');
-
-          } else if (validationService.nameAvailable && name.length > 0 && element.hasClass('ng-valid')) {
-            angular.element('.nameInputDisplay').html('Name available')
-              .removeClass('custom-danger hidden').addClass('custom-success');
-
-          } else if (element.hasClass('ng-invalid-pattern') && name.length > 0) {
-            angular.element('.nameInputDisplay').addClass('hidden');
+          }else{
+            Falcon.logRequest();
+            Falcon.getEntityDefinition(type, name).success(function (data) {
+              Falcon.logResponse('success', data, false, true);
+              validationService.nameAvailable = false;
+              if (name.length === 0) {
+                angular.element('.nameInputDisplay').addClass('hidden');
+              } else if (!validationService.nameAvailable && name.length > 0 && element.hasClass('ng-valid')) {
+                angular.element('.nameInputDisplay').html('Name unavailable')
+                    .removeClass('custom-success hidden').addClass('custom-danger');
+              } else if (validationService.nameAvailable && name.length > 0 && element.hasClass('ng-valid')) {
+                angular.element('.nameInputDisplay').html('Name available')
+                    .removeClass('custom-danger hidden').addClass('custom-success');
+              } else if (element.hasClass('ng-invalid-pattern') && name.length > 0) {
+                angular.element('.nameInputDisplay').addClass('hidden');
+              }
+              if (fn) { fn(); } //>callback
+            }).error(function (err) {
+              Falcon.logResponse('error', err, false, true);
+              validationService.nameAvailable = true;
+              if (name.length === 0) {
+                angular.element('.nameInputDisplay').addClass('hidden');
+              } else if (!validationService.nameAvailable && name.length > 0 && element.hasClass('ng-valid')) {
+                angular.element('.nameInputDisplay').html('Name unavailable')
+                    .removeClass('custom-success hidden').addClass('custom-danger');
+              } else if (validationService.nameAvailable && name.length > 0 && element.hasClass('ng-valid')) {
+                angular.element('.nameInputDisplay').html('Name available')
+                    .removeClass('custom-danger hidden').addClass('custom-success');
+              } else if (element.hasClass('ng-invalid-pattern') && name.length > 0) {
+                angular.element('.nameInputDisplay').addClass('hidden');
+              }
+              if (fn) { fn(); } //>callback
+            });
           }
+
         }
 
         function getMessage() {


[06/22] falcon git commit: FALCON-1315 Update falcon ui for HiveDR, secure clusters and bug fixes. Contributed by Armando Reyna/Venkat Ranganathan.

Posted by so...@apache.org.
http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/lib/dagre.min.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/lib/dagre.min.js b/falcon-ui/app/js/lib/dagre.min.js
new file mode 100644
index 0000000..1881a86
--- /dev/null
+++ b/falcon-ui/app/js/lib/dagre.min.js
@@ -0,0 +1,2 @@
+(function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var j=typeof require=="function"&&require;if(!h&&j)return j(g,!0);if(f)return f(g,!0);throw new Error("Cannot find module '"+g+"'")}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}var f=typeof require=="function"&&require;for(var g=0;g<d.length;g++)e(d[g]);return e})({1:[function(a,b,c){var d=typeof self!="undefined"?self:typeof window!="undefined"?window:{};d.dagre=a("./index")},{"./index":2}],2:[function(a,b,c){c.Digraph=a("graphlib").Digraph,c.Graph=a("graphlib").Graph,c.layout=a("./lib/layout"),c.version=a("./lib/version")},{"./lib/layout":3,"./lib/version":18,graphlib:24}],3:[function(a,b,c){var d=a("./util"),e=a("./rank"),f=a("./order"),g=a("graphlib").CGraph,h=a("graphlib").CDigraph;b.exports=function(){function j(a){var c=new h;a.eachNode(function(a,b){b===undefined&&(b={}),c.addNode(a,{width:b.width,height:b.height}),b.hasOwnProperty("
 rank")&&(c.node(a).prefRank=b.rank)}),a.parent&&a.nodes().forEach(function(b){c.parent(b,a.parent(b))}),a.eachEdge(function(a,b,d,e){e===undefined&&(e={});var f={e:a,minLen:e.minLen||1,width:e.width||0,height:e.height||0,points:[]};c.addEdge(null,b,d,f)});var d=a.graph()||{};return c.graph({rankDir:d.rankDir||b.rankDir,orderRestarts:d.orderRestarts}),c}function k(a){var g=i.rankSep(),h;try{return h=d.time("initLayoutGraph",j)(a),h.order()===0?h:(h.eachEdge(function(a,b,c,d){d.minLen*=2}),i.rankSep(g/2),d.time("rank.run",e.run)(h,b.rankSimplex),d.time("normalize",l)(h),d.time("order",f)(h,b.orderMaxSweeps),d.time("position",c.run)(h),d.time("undoNormalize",m)(h),d.time("fixupEdgePoints",n)(h),d.time("rank.restoreEdges",e.restoreEdges)(h),d.time("createFinalGraph",o)(h,a.isDirected()))}finally{i.rankSep(g)}}function l(a){var b=0;a.eachEdge(function(c,d,e,f){var g=a.node(d).rank,h=a.node(e).rank;if(g+1<h){for(var i=d,j=g+1,k=0;j<h;++j,++k){var l="_D"+ ++b,m={width:f.width,height:f.heig
 ht,edge:{id:c,source:d,target:e,attrs:f},rank:j,dummy:!0};k===0?m.index=0:j+1===h&&(m.index=1),a.addNode(l,m),a.addEdge(null,i,l,{}),i=l}a.addEdge(null,i,e,{}),a.delEdge(c)}})}function m(a){a.eachNode(function(b,c){if(c.dummy){if("index"in c){var d=c.edge;a.hasEdge(d.id)||a.addEdge(d.id,d.source,d.target,d.attrs);var e=a.edge(d.id).points;e[c.index]={x:c.x,y:c.y,ul:c.ul,ur:c.ur,dl:c.dl,dr:c.dr}}a.delNode(b)}})}function n(a){a.eachEdge(function(a,b,c,d){d.reversed&&d.points.reverse()})}function o(a,b){var c=b?new h:new g;c.graph(a.graph()),a.eachNode(function(a,b){c.addNode(a,b)}),a.eachNode(function(b){c.parent(b,a.parent(b))}),a.eachEdge(function(a,b,d,e){c.addEdge(e.e,b,d,e)});var d=0,e=0;return a.eachNode(function(b,c){a.children(b).length||(d=Math.max(d,c.x+c.width/2),e=Math.max(e,c.y+c.height/2))}),a.eachEdge(function(a,b,c,f){var g=Math.max.apply(Math,f.points.map(function(a){return a.x})),h=Math.max.apply(Math,f.points.map(function(a){return a.y}));d=Math.max(d,g+f.width/2),e
 =Math.max(e,h+f.height/2)}),c.graph().width=d,c.graph().height=e,c}function p(a){return function(){return arguments.length?(a.apply(null,arguments),i):a()}}var b={debugLevel:0,orderMaxSweeps:f.DEFAULT_MAX_SWEEPS,rankSimplex:!1,rankDir:"TB"},c=a("./position")(),i={};return i.orderIters=d.propertyAccessor(i,b,"orderMaxSweeps"),i.rankSimplex=d.propertyAccessor(i,b,"rankSimplex"),i.nodeSep=p(c.nodeSep),i.edgeSep=p(c.edgeSep),i.universalSep=p(c.universalSep),i.rankSep=p(c.rankSep),i.rankDir=d.propertyAccessor(i,b,"rankDir"),i.debugAlignment=p(c.debugAlignment),i.debugLevel=d.propertyAccessor(i,b,"debugLevel",function(a){d.log.level=a,c.debugLevel(a)}),i.run=d.time("Total layout",k),i._normalize=l,i}},{"./order":4,"./position":9,"./rank":10,"./util":17,graphlib:24}],4:[function(a,b,c){function k(a,b){function o(){a.eachNode(function(a,b){m[a]=b.order})}arguments.length<2&&(b=j);var c=a.graph().orderRestarts||0,h=f(a);h.forEach(function(b){b=b.filterNodes(function(b){return!a.children(b).l
 ength})});var i=0,k,l=Number.MAX_VALUE,m={};for(var p=0;p<Number(c)+1&&l!==0;++p){k=Number.MAX_VALUE,g(a,c>0),d.log(2,"Order phase start cross count: "+a.graph().orderInitCC);var q,r,s;for(q=0,r=0;r<4&&q<b&&k>0;++q,++r,++i)n(a,h,q),s=e(a),s<k&&(r=0,k=s,s<l&&(o(),l=s)),d.log(3,"Order phase start "+p+" iter "+q+" cross count: "+s)}Object.keys(m).forEach(function(b){if(!a.children||!a.children(b).length)a.node(b).order=m[b]}),a.graph().orderCC=l,d.log(2,"Order iterations: "+i),d.log(2,"Order phase best cross count: "+a.graph().orderCC)}function l(a,b){var c={};return b.forEach(function(b){c[b]=a.inEdges(b).map(function(b){return a.node(a.source(b)).order})}),c}function m(a,b){var c={};return b.forEach(function(b){c[b]=a.outEdges(b).map(function(b){return a.node(a.target(b)).order})}),c}function n(a,b,c){c%2===0?o(a,b,c):p(a,b,c)}function o(a,b){var c;for(i=1;i<b.length;++i)c=h(b[i],c,l(a,b[i].nodes()))}function p(a,b){var c;for(i=b.length-2;i>=0;--i)h(b[i],c,m(a,b[i].nodes()))}var d=a(
 "./util"),e=a("./order/crossCount"),f=a("./order/initLayerGraphs"),g=a("./order/initOrder"),h=a("./order/sortLayer");b.exports=k;var j=24;k.DEFAULT_MAX_SWEEPS=j},{"./order/crossCount":5,"./order/initLayerGraphs":6,"./order/initOrder":7,"./order/sortLayer":8,"./util":17}],5:[function(a,b,c){function e(a){var b=0,c=d.ordering(a);for(var e=1;e<c.length;++e)b+=f(a,c[e-1],c[e]);return b}function f(a,b,c){var d=[];b.forEach(function(b){var c=[];a.outEdges(b).forEach(function(b){c.push(a.node(a.target(b)).order)}),c.sort(function(a,b){return a-b}),d=d.concat(c)});var e=1;while(e<c.length)e<<=1;var f=2*e-1;e-=1;var g=[];for(var h=0;h<f;++h)g[h]=0;var i=0;return d.forEach(function(a){var b=a+e;++g[b];while(b>0)b%2&&(i+=g[b+1]),b=b-1>>1,++g[b]}),i}var d=a("../util");b.exports=e},{"../util":17}],6:[function(a,b,c){function f(a){function c(d){if(d===null){a.children(d).forEach(function(a){c(a)});return}var f=a.node(d);f.minRank="rank"in f?f.rank:Number.MAX_VALUE,f.maxRank="rank"in f?f.rank:Numb
 er.MIN_VALUE;var h=new e;return a.children(d).forEach(function(b){var d=c(b);h=e.union([h,d]),f.minRank=Math.min(f.minRank,a.node(b).minRank),f.maxRank=Math.max(f.maxRank,a.node(b).maxRank)}),"rank"in f&&h.add(f.rank),h.keys().forEach(function(a){a in b||(b[a]=[]),b[a].push(d)}),h}var b=[];c(null);var f=[];return b.forEach(function(b,c){f[c]=a.filterNodes(d(b))}),f}var d=a("graphlib").filter.nodesFromList,e=a("cp-data").Set;b.exports=f},{"cp-data":19,graphlib:24}],7:[function(a,b,c){function f(a,b){var c=[];a.eachNode(function(b,d){var e=c[d.rank];if(a.children&&a.children(b).length>0)return;e||(e=c[d.rank]=[]),e.push(b)}),c.forEach(function(c){b&&e.shuffle(c),c.forEach(function(b,c){a.node(b).order=c})});var f=d(a);a.graph().orderInitCC=f,a.graph().orderCC=Number.MAX_VALUE}var d=a("./crossCount"),e=a("../util");b.exports=f},{"../util":17,"./crossCount":5}],8:[function(a,b,c){function e(a,b,c){var e=[],f={};a.eachNode(function(a,b){e[b.order]=a;var g=c[a];g.length&&(f[a]=d.sum(g)/g.
 length)});var g=a.nodes().filter(function(a){return f[a]!==undefined});g.sort(function(b,c){return f[b]-f[c]||a.node(b).order-a.node(c).order});for(var h=0,i=0,j=g.length;i<j;++h)f[e[h]]!==undefined&&(a.node(g[i++]).order=h)}var d=a("../util");b.exports=e},{"../util":17}],9:[function(a,b,c){var d=a("./util");b.exports=function(){function c(b){b=b.filterNodes(d.filterNonSubgraphs(b));var c=d.ordering(b),e=f(b,c),i={};["u","d"].forEach(function(d){d==="d"&&c.reverse(),["l","r"].forEach(function(f){f==="r"&&m(c);var j=d+f,k=g(b,c,e,d==="u"?"predecessors":"successors");i[j]=h(b,c,k.pos,k.root,k.align),a.debugLevel>=3&&t(d+f,b,c,i[j]),f==="r"&&l(i[j]),f==="r"&&m(c)}),d==="d"&&c.reverse()}),k(b,c,i),b.eachNode(function(a){var c=[];for(var d in i){var e=i[d][a];r(d,b,a,e),c.push(e)}c.sort(function(a,b){return a-b}),q(b,a,(c[1]+c[2])/2)});var j=0,p=b.graph().rankDir==="BT"||b.graph().rankDir==="RL";c.forEach(function(c){var e=d.max(c.map(function(a){return o(b,a)}));j+=e/2,c.forEach(functio
 n(a){s(b,a,p?-j:j)}),j+=e/2+a.rankSep});var u=d.min(b.nodes().map(function(a){return q(b,a)-n(b,a)/2})),v=d.min(b.nodes().map(function(a){return s(b,a)-o(b,a)/2}));b.eachNode(function(a){q(b,a,q(b,a)-u),s(b,a,s(b,a)-v)})}function e(a,b){return a<b?a.toString().length+":"+a+"-"+b:b.toString().length+":"+b+"-"+a}function f(a,b){function k(a){var b=d[a];if(b<h||b>j)c[e(g[i],a)]=!0}var c={},d={},f,g,h,i,j;if(b.length<=2)return c;b[1].forEach(function(a,b){d[a]=b});for(var l=1;l<b.length-1;++l){f=b[l],g=b[l+1],h=0,i=0;for(var m=0;m<g.length;++m){var n=g[m];d[n]=m,j=undefined;if(a.node(n).dummy){var o=a.predecessors(n)[0];o!==undefined&&a.node(o).dummy&&(j=d[o])}j===undefined&&m===g.length-1&&(j=f.length-1);if(j!==undefined){for(;i<=m;++i)a.predecessors(g[i]).forEach(k);h=j}}}return c}function g(a,b,c,d){var f={},g={},h={};return b.forEach(function(a){a.forEach(function(a,b){g[a]=a,h[a]=a,f[a]=b})}),b.forEach(function(b){var i=-1;b.forEach(function(b){var j=a[d](b),k;j.length>0&&(j.sort(f
 unction(a,b){return f[a]-f[b]}),k=(j.length-1)/2,j.slice(Math.floor(k),Math.ceil(k)+1).forEach(function(a){h[b]===b&&!c[e(a,b)]&&i<f[a]&&(h[a]=b,h[b]=g[b]=g[a],i=f[a])}))})}),{pos:f,root:g,align:h}}function h(a,b,c,e,f){function l(a,b,c){b in h[a]?h[a][b]=Math.min(h[a][b],c):h[a][b]=c}function m(b){if(!(b in k)){k[b]=0;var d=b;do{if(c[d]>0){var h=e[j[d]];m(h),g[b]===b&&(g[b]=g[h]);var i=p(a,j[d])+p(a,d);g[b]!==g[h]?l(g[h],g[b],k[b]-k[h]-i):k[b]=Math.max(k[b],k[h]+i)}d=f[d]}while(d!==b)}}var g={},h={},i={},j={},k={};return b.forEach(function(a){a.forEach(function(b,c){g[b]=b,h[b]={},c>0&&(j[b]=a[c-1])})}),d.values(e).forEach(function(a){m(a)}),b.forEach(function(a){a.forEach(function(a){k[a]=k[e[a]];if(a===e[a]&&a===g[a]){var b=0;a in h&&Object.keys(h[a]).length>0&&(b=d.min(Object.keys(h[a]).map(function(b){return h[a][b]+(b in i?i[b]:0)}))),i[a]=b}})}),b.forEach(function(a){a.forEach(function(a){k[a]+=i[g[e[a]]]||0})}),k}function i(a,b,c){return d.min(b.map(function(a){var b=a[0];re
 turn c[b]}))}function j(a,b,c){return d.max(b.map(function(a){var b=a[a.length-1];return c[b]}))}function k(a,b,c){function h(a){c[l][a]+=g[l]}var d={},e={},f,g={},k=Number.POSITIVE_INFINITY;for(var l in c){var m=c[l];d[l]=i(a,b,m),e[l]=j(a,b,m);var n=e[l]-d[l];n<k&&(k=n,f=l)}["u","d"].forEach(function(a){["l","r"].forEach(function(b){var c=a+b;g[c]=b==="l"?d[f]-d[c]:e[f]-e[c]})});for(l in c)a.eachNode(h)}function l(a){for(var b in a)a[b]=-a[b]}function m(a){a.forEach(function(a){a.reverse()})}function n(a,b){switch(a.graph().rankDir){case"LR":return a.node(b).height;case"RL":return a.node(b).height;default:return a.node(b).width}}function o(a,b){switch(a.graph().rankDir){case"LR":return a.node(b).width;case"RL":return a.node(b).width;default:return a.node(b).height}}function p(b,c){if(a.universalSep!==null)return a.universalSep;var d=n(b,c),e=b.node(c).dummy?a.edgeSep:a.nodeSep;return(d+e)/2}function q(a,b,c){if(a.graph().rankDir==="LR"||a.graph().rankDir==="RL"){if(arguments.lengt
 h<3)return a.node(b).y;a.node(b).y=c}else{if(arguments.length<3)return a.node(b).x;a.node(b).x=c}}function r(a,b,c,d){if(b.graph().rankDir==="LR"||b.graph().rankDir==="RL"){if(arguments.length<3)return b.node(c)[a];b.node(c)[a]=d}else{if(arguments.length<3)return b.node(c)[a];b.node(c)[a]=d}}function s(a,b,c){if(a.graph().rankDir==="LR"||a.graph().rankDir==="RL"){if(arguments.length<3)return a.node(b).x;a.node(b).x=c}else{if(arguments.length<3)return a.node(b).y;a.node(b).y=c}}function t(a,b,c,d){c.forEach(function(c,e){var f,g;c.forEach(function(c){var h=d[c];if(f){var i=p(b,f)+p(b,c);h-g<i&&console.log("Position phase: sep violation. Align: "+a+". Layer: "+e+". "+"U: "+f+" V: "+c+". Actual sep: "+(h-g)+" Expected sep: "+i)}f=c,g=h})})}var a={nodeSep:50,edgeSep:10,universalSep:null,rankSep:30},b={};return b.nodeSep=d.propertyAccessor(b,a,"nodeSep"),b.edgeSep=d.propertyAccessor(b,a,"edgeSep"),b.universalSep=d.propertyAccessor(b,a,"universalSep"),b.rankSep=d.propertyAccessor(b,a,"ran
 kSep"),b.debugLevel=d.propertyAccessor(b,a,"debugLevel"),b.run=c,b}},{"./util":17}],10:[function(a,b,c){function l(a,b){n(a),d.time("constraints.apply",h.apply)(a),o(a),d.time("acyclic",e)(a);var c=a.filterNodes(d.filterNonSubgraphs(a));f(c),j(c).forEach(function(a){var d=c.filterNodes(k.nodesFromList(a));r(d,b)}),d.time("constraints.relax",h.relax(a)),d.time("reorientEdges",q)(a)}function m(a){e.undo(a)}function n(a){a.eachEdge(function(b,c,d,e){if(c===d){var f=p(a,b,c,d,e,0,!1),g=p(a,b,c,d,e,1,!0),h=p(a,b,c,d,e,2,!1);a.addEdge(null,f,c,{minLen:1,selfLoop:!0}),a.addEdge(null,f,g,{minLen:1,selfLoop:!0}),a.addEdge(null,c,h,{minLen:1,selfLoop:!0}),a.addEdge(null,g,h,{minLen:1,selfLoop:!0}),a.delEdge(b)}})}function o(a){a.eachEdge(function(b,c,d,e){if(c===d){var f=e.originalEdge,g=p(a,f.e,f.u,f.v,f.value,0,!0);a.addEdge(null,c,g,{minLen:1}),a.addEdge(null,g,d,{minLen:1}),a.delEdge(b)}})}function p(a,b,c,d,e,f,g){return a.addNode(null,{width:g?e.width:0,height:g?e.height:0,edge:{id:b,so
 urce:c,target:d,attrs:e},dummy:!0,index:f})}function q(a){a.eachEdge(function(b,c,d,e){a.node(c).rank>a.node(d).rank&&(a.delEdge(b),e.reversed=!0,a.addEdge(b,d,c,e))})}function r(a,b){var c=g(a);b&&(d.log(1,"Using network simplex for ranking"),i(a,c)),s(a)}function s(a){var b=d.min(a.nodes().map(function(b){return a.node(b).rank}));a.eachNode(function(a,c){c.rank-=b})}var d=a("./util"),e=a("./rank/acyclic"),f=a("./rank/initRank"),g=a("./rank/feasibleTree"),h=a("./rank/constraints"),i=a("./rank/simplex"),j=a("graphlib").alg.components,k=a("graphlib").filter;c.run=l,c.restoreEdges=m},{"./rank/acyclic":11,"./rank/constraints":12,"./rank/feasibleTree":13,"./rank/initRank":14,"./rank/simplex":16,"./util":17,graphlib:24}],11:[function(a,b,c){function e(a){function f(d){if(d in c)return;c[d]=b[d]=!0,a.outEdges(d).forEach(function(c){var h=a.target(c),i;d===h?console.error('Warning: found self loop "'+c+'" for node "'+d+'"'):h in b?(i=a.edge(c),a.delEdge(c),i.reversed=!0,++e,a.addEdge(c,h,d
 ,i)):f(h)}),delete b[d]}var b={},c={},e=0;return a.eachNode(function(a){f(a)}),d.log(2,"Acyclic Phase: reversed "+e+" edge(s)"),e}function f(a){a.eachEdge(function(b,c,d,e){e.reversed&&(delete e.reversed,a.delEdge(b),a.addEdge(b,d,c,e))})}var d=a("../util");b.exports=e,b.exports.undo=f},{"../util":17}],12:[function(a,b,c){function d(a){return a!=="min"&&a!=="max"&&a.indexOf("same_")!==0?(console.error("Unsupported rank type: "+a),!1):!0}function e(a,b,c,d){a.inEdges(b).forEach(function(b){var e=a.edge(b),f;e.originalEdge?f=e:f={originalEdge:{e:b,u:a.source(b),v:a.target(b),value:e},minLen:a.edge(b).minLen},e.selfLoop&&(d=!1),d?(a.addEdge(null,c,a.source(b),f),f.reversed=!0):a.addEdge(null,a.source(b),c,f)})}function f(a,b,c,d){a.outEdges(b).forEach(function(b){var e=a.edge(b),f;e.originalEdge?f=e:f={originalEdge:{e:b,u:a.source(b),v:a.target(b),value:e},minLen:a.edge(b).minLen},e.selfLoop&&(d=!1),d?(a.addEdge(null,a.target(b),c,f),f.reversed=!0):a.addEdge(null,c,a.target(b),f)})}fun
 ction g(a,b,c){c!==undefined&&a.children(b).forEach(function(b){b!==c&&!a.outEdges(c,b).length&&!a.node(b).dummy&&a.addEdge(null,c,b,{minLen:0})})}function h(a,b,c){c!==undefined&&a.children(b).forEach(function(b){b!==c&&!a.outEdges(b,c).length&&!a.node(b).dummy&&a.addEdge(null,b,c,{minLen:0})})}c.apply=function(a){function b(c){var i={};a.children(c).forEach(function(g){if(a.children(g).length){b(g);return}var h=a.node(g),j=h.prefRank;if(j!==undefined){if(!d(j))return;j in i?i.prefRank.push(g):i.prefRank=[g];var k=i[j];k===undefined&&(k=i[j]=a.addNode(null,{originalNodes:[]}),a.parent(k,c)),e(a,g,k,j==="min"),f(a,g,k,j==="max"),a.node(k).originalNodes.push({u:g,value:h,parent:c}),a.delNode(g)}}),g(a,c,i.min),h(a,c,i.max)}b(null)},c.relax=function(a){var b=[];a.eachEdge(function(a,c,d,e){var f=e.originalEdge;f&&b.push(f)}),a.eachNode(function(b,c){var d=c.originalNodes;d&&(d.forEach(function(b){b.value.rank=c.rank,a.addNode(b.u,b.value),a.parent(b.u,b.parent)}),a.delNode(b))}),b.for
 Each(function(b){a.addEdge(b.e,b.u,b.v,b.value)})}},{}],13:[function(a,b,c){function g(a){function g(d){var e=!0;return a.predecessors(d).forEach(function(f){b.has(f)&&!h(a,f,d)&&(b.has(d)&&(c.addNode(d,{}),b.remove(d),c.graph({root:d})),c.addNode(f,{}),c.addEdge(null,f,d,{reversed:!0}),b.remove(f),g(f),e=!1)}),a.successors(d).forEach(function(f){b.has(f)&&!h(a,d,f)&&(b.has(d)&&(c.addNode(d,{}),b.remove(d),c.graph({root:d})),c.addNode(f,{}),c.addEdge(null,d,f,{}),b.remove(f),g(f),e=!1)}),e}function i(){var d=Number.MAX_VALUE;b.keys().forEach(function(c){a.predecessors(c).forEach(function(e){if(!b.has(e)){var f=h(a,e,c);Math.abs(f)<Math.abs(d)&&(d=-f)}}),a.successors(c).forEach(function(e){if(!b.has(e)){var f=h(a,c,e);Math.abs(f)<Math.abs(d)&&(d=f)}})}),c.eachNode(function(b){a.node(b).rank-=d})}var b=new d(a.nodes()),c=new e;if(b.size()===1){var f=a.nodes()[0];return c.addNode(f,{}),c.graph({root:f}),c}while(b.size()){var j=c.order()?c.nodes():b.keys();for(var k=0,l=j.length;k<l&&g(
 j[k]);++k);b.size()&&i()}return c}function h(a,b,c){var d=a.node(c).rank-a.node(b).rank,e=f.max(a.outEdges(b,c).map(function(b){return a.edge(b).minLen}));return d-e}var d=a("cp-data").Set,e=a("graphlib").Digraph,f=a("../util");b.exports=g},{"../util":17,"cp-data":19,graphlib:24}],14:[function(a,b,c){function f(a){var b=e(a);b.forEach(function(b){var c=a.inEdges(b);if(c.length===0){a.node(b).rank=0;return}var e=c.map(function(b){return a.node(a.source(b)).rank+a.edge(b).minLen});a.node(b).rank=d.max(e)})}var d=a("../util"),e=a("graphlib").alg.topsort;b.exports=f},{"../util":17,graphlib:24}],15:[function(a,b,c){function d(a,b,c,d){return Math.abs(a.node(b).rank-a.node(c).rank)-d}b.exports={slack:d}},{}],16:[function(a,b,c){function f(a,b){g(a,b);for(;;){var c=k(b);if(c===null)break;var d=l(a,b,c);m(a,b,c,d)}}function g(a,b){function c(d){var e=b.successors(d);for(var f in e){var g=e[f];c(g)}d!==b.graph().root&&i(a,b,d)}h(b),b.eachEdge(function(a,b,c,d){d.cutValue=0}),c(b.graph().root
 )}function h(a){function c(d){var e=a.successors(d),f=b;for(var g in e){var h=e[g];c(h),f=Math.min(f,a.node(h).low)}a.node(d).low=f,a.node(d).lim=b++}var b=0;c(a.graph().root)}function i(a,b,c){var d=b.inEdges(c)[0],e=[],f=b.outEdges(c);for(var g in f)e.push(b.target(f[g]));var h=0,i=0,k=0,l=0,m=0,n=a.outEdges(c),o;for(var p in n){var q=a.target(n[p]);for(o in e)j(b,q,e[o])&&i++;j(b,q,c)||l++}var r=a.inEdges(c);for(var s in r){var t=a.source(r[s]);for(o in e)j(b,t,e[o])&&k++;j(b,t,c)||m++}var u=0;for(o in e){var v=b.edge(f[o]).cutValue;b.edge(f[o]).reversed?u-=v:u+=v}b.edge(d).reversed?h-=u-i+k-l+m:h+=u-i+k-l+m,b.edge(d).cutValue=h}function j(a,b,c){return a.node(c).low<=a.node(b).lim&&a.node(b).lim<=a.node(c).lim}function k(a){var b=a.edges();for(var c in b){var d=b[c],e=a.edge(d);if(e.cutValue<0)return d}return null}function l(a,b,c){var d=b.source(c),f=b.target(c),g=b.node(f).lim<b.node(d).lim?f:d,h=!b.edge(c).reversed,i=Number.POSITIVE_INFINITY,k;h?a.eachEdge(function(d,f,h,l){i
 f(d!==c&&j(b,f,g)&&!j(b,h,g)){var m=e.slack(a,f,h,l.minLen);m<i&&(i=m,k=d)}}):a.eachEdge(function(d,f,h,l){if(d!==c&&!j(b,f,g)&&j(b,h,g)){var m=e.slack(a,f,h,l.minLen);m<i&&(i=m,k=d)}});if(k===undefined){var l=[],m=[];throw a.eachNode(function(a){j(b,a,g)?m.push(a):l.push(a)}),new Error("No edge found from outside of tree to inside")}return k}function m(a,b,c,d){function h(a){var c=b.inEdges(a);for(var d in c){var e=c[d],f=b.source(e),g=b.edge(e);h(f),b.delEdge(e),g.reversed=!g.reversed,b.addEdge(e,a,f,g)}}b.delEdge(c);var e=a.source(d),f=a.target(d);h(f);var i=e,j=b.inEdges(i);while(j.length>0)i=b.source(j[0]),j=b.inEdges(i);b.graph().root=i,b.addEdge(null,e,f,{cutValue:0}),g(a,b),n(a,b)}function n(a,b){function c(d){var e=b.successors(d);e.forEach(function(b){var e=o(a,d,b);a.node(b).rank=a.node(d).rank+e,c(b)})}c(b.graph().root)}function o(a,b,c){var e=a.outEdges(b,c);if(e.length>0)return d.max(e.map(function(b){return a.edge(b).minLen}));var f=a.inEdges(b,c);if(f.length>0)return
 -d.max(f.map(function(b){return a.edge(b).minLen}))}var d=a("../util"),e=a("./rankUtil");b.exports=f},{"../util":17,"./rankUtil":15}],17:[function(a,b,c){function d(a,b){return function(){var c=(new Date).getTime();try{return b.apply(null,arguments)}finally{e(1,a+" time: "+((new Date).getTime()-c)+"ms")}}}function e(a){e.level>=a&&console.log.apply(console,Array.prototype.slice.call(arguments,1))}c.min=function(a){return Math.min.apply(Math,a)},c.max=function(a){return Math.max.apply(Math,a)},c.all=function(a,b){for(var c=0;c<a.length;++c)if(!b(a[c]))return!1;return!0},c.sum=function(a){return a.reduce(function(a,b){return a+b},0)},c.values=function(a){return Object.keys(a).map(function(b){return a[b]})},c.shuffle=function(a){for(i=a.length-1;i>0;--i){var b=Math.floor(Math.random()*(i+1)),c=a[b];a[b]=a[i],a[i]=c}},c.propertyAccessor=function(a,b,c,d){return function(e){return arguments.length?(b[c]=e,d&&d(e),a):b[c]}},c.ordering=function(a){var b=[];return a.eachNode(function(a,c){v
 ar d=b[c.rank]||(b[c.rank]=[]);d[c.order]=a}),b},c.filterNonSubgraphs=function(a){return function(b){return a.children(b).length===0}},d.enabled=!1,c.time=d,e.level=0,c.log=e},{}],18:[function(a,b,c){b.exports="0.4.5"},{}],19:[function(a,b,c){c.Set=a("./lib/Set"),c.PriorityQueue=a("./lib/PriorityQueue"),c.version=a("./lib/version")},{"./lib/PriorityQueue":20,"./lib/Set":21,"./lib/version":23}],20:[function(a,b,c){function d(){this._arr=[],this._keyIndices={}}b.exports=d,d.prototype.size=function(){return this._arr.length},d.prototype.keys=function(){return this._arr.map(function(a){return a.key})},d.prototype.has=function(a){return a in this._keyIndices},d.prototype.priority=function(a){var b=this._keyIndices[a];if(b!==undefined)return this._arr[b].priority},d.prototype.min=function(){if(this.size()===0)throw new Error("Queue underflow");return this._arr[0].key},d.prototype.add=function(a,b){var c=this._keyIndices;if(a in c)return!1;var d=this._arr,e=d.length;return c[a]=e,d.push({k
 ey:a,priority:b}),this._decrease(e),!0},d.prototype.removeMin=function(){this._swap(0,this._arr.length-1);var a=this._arr.pop();return delete this._keyIndices[a.key],this._heapify(0),a.key},d.prototype.decrease=function(a,b){var c=this._keyIndices[a];if(b>this._arr[c].priority)throw new Error("New priority is greater than current priority. Key: "+a+" Old: "+this._arr[c].priority+" New: "+b);this._arr[c].priority=b,this._decrease(c)},d.prototype._heapify=function(a){var b=this._arr,c=2*a,d=c+1,e=a;c<b.length&&(e=b[c].priority<b[e].priority?c:e,d<b.length&&(e=b[d].priority<b[e].priority?d:e),e!==a&&(this._swap(a,e),this._heapify(e)))},d.prototype._decrease=function(a){var b=this._arr,c=b[a].priority,d;while(a!==0){d=a>>1;if(b[d].priority<c)break;this._swap(a,d),a=d}},d.prototype._swap=function(a,b){var c=this._arr,d=this._keyIndices,e=c[a],f=c[b];c[a]=f,c[b]=e,d[f.key]=a,d[e.key]=b}},{}],21:[function(a,b,c){function e(a){this._size=0,this._keys={};if(a)for(var b=0,c=a.length;b<c;++b)t
 his.add(a[b])}function f(a){var b=Object.keys(a),c=b.length,d=new Array(c),e;for(e=0;e<c;++e)d[e]=a[b[e]];return d}var d=a("./util");b.exports=e,e.intersect=function(a){if(a.length===0)return new e;var b=new e(d.isArray(a[0])?a[0]:a[0].keys());for(var c=1,f=a.length;c<f;++c){var g=b.keys(),h=d.isArray(a[c])?new e(a[c]):a[c];for(var i=0,j=g.length;i<j;++i){var k=g[i];h.has(k)||b.remove(k)}}return b},e.union=function(a){var b=d.reduce(a,function(a,b){return a+(b.size?b.size():b.length)},0),c=new Array(b),f=0;for(var g=0,h=a.length;g<h;++g){var i=a[g],j=d.isArray(i)?i:i.keys();for(var k=0,l=j.length;k<l;++k)c[f++]=j[k]}return new e(c)},e.prototype.size=function(){return this._size},e.prototype.keys=function(){return f(this._keys)},e.prototype.has=function(a){return a in this._keys},e.prototype.add=function(a){return a in this._keys?!1:(this._keys[a]=a,++this._size,!0)},e.prototype.remove=function(a){return a in this._keys?(delete this._keys[a],--this._size,!0):!1}},{"./util":22}],22:[f
 unction(a,b,c){Array.isArray?c.isArray=Array.isArray:c.isArray=function(a){return Object.prototype.toString.call(a)==="[object Array]"},"function"!=typeof Array.prototype.reduce?c.reduce=function(a,b,c){"use strict";if(null===a||"undefined"==typeof a)throw new TypeError("Array.prototype.reduce called on null or undefined");if("function"!=typeof b)throw new TypeError(b+" is not a function");var d,e,f=a.length>>>0,g=!1;1<arguments.length&&(e=c,g=!0);for(d=0;f>d;++d)a.hasOwnProperty(d)&&(g?e=b(e,a[d],d,a):(e=a[d],g=!0));if(!g)throw new TypeError("Reduce of empty array with no initial value");return e}:c.reduce=function(a,b,c){return a.reduce(b,c)}},{}],23:[function(a,b,c){b.exports="1.1.3"},{}],24:[function(a,b,c){c.Graph=a("./lib/Graph"),c.Digraph=a("./lib/Digraph"),c.CGraph=a("./lib/CGraph"),c.CDigraph=a("./lib/CDigraph"),a("./lib/graph-converters"),c.alg={isAcyclic:a("./lib/alg/isAcyclic"),components:a("./lib/alg/components"),dijkstra:a("./lib/alg/dijkstra"),dijkstraAll:a("./lib/alg
 /dijkstraAll"),findCycles:a("./lib/alg/findCycles"),floydWarshall:a("./lib/alg/floydWarshall"),postorder:a("./lib/alg/postorder"),preorder:a("./lib/alg/preorder"),prim:a("./lib/alg/prim"),tarjan:a("./lib/alg/tarjan"),topsort:a("./lib/alg/topsort")},c.converter={json:a("./lib/converter/json.js")};var d=a("./lib/filter");c.filter={all:d.all,nodesFromList:d.nodesFromList},c.version=a("./lib/version")},{"./lib/CDigraph":26,"./lib/CGraph":27,"./lib/Digraph":28,"./lib/Graph":29,"./lib/alg/components":30,"./lib/alg/dijkstra":31,"./lib/alg/dijkstraAll":32,"./lib/alg/findCycles":33,"./lib/alg/floydWarshall":34,"./lib/alg/isAcyclic":35,"./lib/alg/postorder":36,"./lib/alg/preorder":37,"./lib/alg/prim":38,"./lib/alg/tarjan":39,"./lib/alg/topsort":40,"./lib/converter/json.js":42,"./lib/filter":43,"./lib/graph-converters":44,"./lib/version":46}],25:[function(a,b,c){function e(){this._value=undefined,this._nodes={},this._edges={},this._nextId=0}function f(a,b,c){(a[b]||(a[b]=new d)).add(c)}functio
 n g(a,b,c){var d=a[b];d.remove(c),d.size()===0&&delete a[b]}var d=a("cp-data").Set;b.exports=e,e.prototype.order=function(){return Object.keys(this._nodes).length},e.prototype.size=function(){return Object.keys(this._edges).length},e.prototype.graph=function(a){if(arguments.length===0)return this._value;this._value=a},e.prototype.hasNode=function(a){return a in this._nodes},e.prototype.node=function(a,b){var c=this._strictGetNode(a);if(arguments.length===1)return c.value;c.value=b},e.prototype.nodes=function(){var a=[];return this.eachNode(function(b){a.push(b)}),a},e.prototype.eachNode=function(a){for(var b in this._nodes){var c=this._nodes[b];a(c.id,c.value)}},e.prototype.hasEdge=function(a){return a in this._edges},e.prototype.edge=function(a,b){var c=this._strictGetEdge(a);if(arguments.length===1)return c.value;c.value=b},e.prototype.edges=function(){var a=[];return this.eachEdge(function(b){a.push(b)}),a},e.prototype.eachEdge=function(a){for(var b in this._edges){var c=this._ed
 ges[b];a(c.id,c.u,c.v,c.value)}},e.prototype.incidentNodes=function(a){var b=this._strictGetEdge(a);return[b.u,b.v]},e.prototype.addNode=function(a,b){if(a===undefined||a===null){do a="_"+ ++this._nextId;while(this.hasNode(a))}else if(this.hasNode(a))throw new Error("Graph already has node '"+a+"'");return this._nodes[a]={id:a,value:b},a},e.prototype.delNode=function(a){this._strictGetNode(a),this.incidentEdges(a).forEach(function(a){this.delEdge(a)},this),delete this._nodes[a]},e.prototype._addEdge=function(a,b,c,d,e,g){this._strictGetNode(b),this._strictGetNode(c);if(a===undefined||a===null){do a="_"+ ++this._nextId;while(this.hasEdge(a))}else if(this.hasEdge(a))throw new Error("Graph already has edge '"+a+"'");return this._edges[a]={id:a,u:b,v:c,value:d},f(e[c],b,a),f(g[b],c,a),a},e.prototype._delEdge=function(a,b,c){var d=this._strictGetEdge(a);g(b[d.v],d.u,a),g(c[d.u],d.v,a),delete this._edges[a]},e.prototype.copy=function(){var a=new this.constructor;return a.graph(this.graph(
 )),this.eachNode(function(b,c){a.addNode(b,c)}),this.eachEdge(function(b,c,d,e){a.addEdge(b,c,d,e)}),a._nextId=this._nextId,a},e.prototype.filterNodes=function(a){var b=new this.constructor;return b.graph(this.graph()),this.eachNode(function(c,d){a(c)&&b.addNode(c,d)}),this.eachEdge(function(a,c,d,e){b.hasNode(c)&&b.hasNode(d)&&b.addEdge(a,c,d,e)}),b},e.prototype._strictGetNode=function(a){var b=this._nodes[a];if(b===undefined)throw new Error("Node '"+a+"' is not in graph");return b},e.prototype._strictGetEdge=function(a){var b=this._edges[a];if(b===undefined)throw new Error("Edge '"+a+"' is not in graph");return b}},{"cp-data":19}],26:[function(a,b,c){var d=a("./Digraph"),e=a("./compoundify"),f=e(d);b.exports=f,f.fromDigraph=function(a){var b=new f,c=a.graph();return c!==undefined&&b.graph(c),a.eachNode(function(a,c){c===undefined?b.addNode(a):b.addNode(a,c)}),a.eachEdge(function(a,c,d,e){e===undefined?b.addEdge(null,c,d):b.addEdge(null,c,d,e)}),b},f.prototype.toString=function(){r
 eturn"CDigraph "+JSON.stringify(this,null,2)}},{"./Digraph":28,"./compoundify":41}],27:[function(a,b,c){var d=a("./Graph"),e=a("./compoundify"),f=e(d);b.exports=f,f.fromGraph=function(a){var b=new f,c=a.graph();return c!==undefined&&b.graph(c),a.eachNode(function(a,c){c===undefined?b.addNode(a):b.addNode(a,c)}),a.eachEdge(function(a,c,d,e){e===undefined?b.addEdge(null,c,d):b.addEdge(null,c,d,e)}),b},f.prototype.toString=function(){return"CGraph "+JSON.stringify(this,null,2)}},{"./Graph":29,"./compoundify":41}],28:[function(a,b,c){function g(){e.call(this),this._inEdges={},this._outEdges={}}var d=a("./util"),e=a("./BaseGraph"),f=a("cp-data").Set;b.exports=g,g.prototype=new e,g.prototype.constructor=g,g.prototype.isDirected=function(){return!0},g.prototype.successors=function(a){return this._strictGetNode(a),Object.keys(this._outEdges[a]).map(function(a){return this._nodes[a].id},this)},g.prototype.predecessors=function(a){return this._strictGetNode(a),Object.keys(this._inEdges[a]).ma
 p(function(a){return this._nodes[a].id},this)},g.prototype.neighbors=function(a){return f.union([this.successors(a),this.predecessors(a)]).keys()},g.prototype.sources=function(){var a=this;return this._filterNodes(function(b){return a.inEdges(b).length===0})},g.prototype.sinks=function(){var a=this;return this._filterNodes(function(b){return a.outEdges(b).length===0})},g.prototype.source=function(a){return this._strictGetEdge(a).u},g.prototype.target=function(a){return this._strictGetEdge(a).v},g.prototype.inEdges=function(a,b){this._strictGetNode(a);var c=f.union(d.values(this._inEdges[a])).keys();return arguments.length>1&&(this._strictGetNode(b),c=c.filter(function(a){return this.source(a)===b},this)),c},g.prototype.outEdges=function(a,b){this._strictGetNode(a);var c=f.union(d.values(this._outEdges[a])).keys();return arguments.length>1&&(this._strictGetNode(b),c=c.filter(function(a){return this.target(a)===b},this)),c},g.prototype.incidentEdges=function(a,b){return arguments.leng
 th>1?f.union([this.outEdges(a,b),this.outEdges(b,a)]).keys():f.union([this.inEdges(a),this.outEdges(a)]).keys()},g.prototype.toString=function(){return"Digraph "+JSON.stringify(this,null,2)},g.prototype.addNode=function(a,b){return a=e.prototype.addNode.call(this,a,b),this._inEdges[a]={},this._outEdges[a]={},a},g.prototype.delNode=function(a){e.prototype.delNode.call(this,a),delete this._inEdges[a],delete this._outEdges[a]},g.prototype.addEdge=function(a,b,c,d){return e.prototype._addEdge.call(this,a,b,c,d,this._inEdges,this._outEdges)},g.prototype.delEdge=function(a){e.prototype._delEdge.call(this,a,this._inEdges,this._outEdges)},g.prototype._filterNodes=function(a){var b=[];return this.eachNode(function(c){a(c)&&b.push(c)}),b}},{"./BaseGraph":25,"./util":45,"cp-data":19}],29:[function(a,b,c){function g(){e.call(this),this._incidentEdges={}}var d=a("./util"),e=a("./BaseGraph"),f=a("cp-data").Set;b.exports=g,g.prototype=new e,g.prototype.constructor=g,g.prototype.isDirected=function
 (){return!1},g.prototype.neighbors=function(a){return this._strictGetNode(a),Object.keys(this._incidentEdges[a]).map(function(a){return this._nodes[a].id},this)},g.prototype.incidentEdges=function(a,b){return this._strictGetNode(a),arguments.length>1?(this._strictGetNode(b),b in this._incidentEdges[a]?this._incidentEdges[a][b].keys():[]):f.union(d.values(this._incidentEdges[a])).keys()},g.prototype.toString=function(){return"Graph "+JSON.stringify(this,null,2)},g.prototype.addNode=function(a,b){return a=e.prototype.addNode.call(this,a,b),this._incidentEdges[a]={},a},g.prototype.delNode=function(a){e.prototype.delNode.call(this,a),delete this._incidentEdges[a]},g.prototype.addEdge=function(a,b,c,d){return e.prototype._addEdge.call(this,a,b,c,d,this._incidentEdges,this._incidentEdges)},g.prototype.delEdge=function(a){e.prototype._delEdge.call(this,a,this.
+_incidentEdges,this._incidentEdges)}},{"./BaseGraph":25,"./util":45,"cp-data":19}],30:[function(a,b,c){function e(a){function e(b,d){c.has(b)||(c.add(b),d.push(b),a.neighbors(b).forEach(function(a){e(a,d)}))}var b=[],c=new d;return a.nodes().forEach(function(a){var c=[];e(a,c),c.length>0&&b.push(c)}),b}var d=a("cp-data").Set;b.exports=e},{"cp-data":19}],31:[function(a,b,c){function e(a,b,c,e){function h(b){var d=a.incidentNodes(b),e=d[0]!==i?d[0]:d[1],h=f[e],k=c(b),l=j.distance+k;if(k<0)throw new Error("dijkstra does not allow negative edge weights. Bad edge: "+b+" Weight: "+k);l<h.distance&&(h.distance=l,h.predecessor=i,g.decrease(e,l))}var f={},g=new d;c=c||function(){return 1},e=e||(a.isDirected()?function(b){return a.outEdges(b)}:function(b){return a.incidentEdges(b)}),a.eachNode(function(a){var c=a===b?0:Number.POSITIVE_INFINITY;f[a]={distance:c},g.add(a,c)});var i,j;while(g.size()>0){i=g.removeMin(),j=f[i];if(j.distance===Number.POSITIVE_INFINITY)break;e(i).forEach(h)}return f
 }var d=a("cp-data").PriorityQueue;b.exports=e},{"cp-data":19}],32:[function(a,b,c){function e(a,b,c){var e={};return a.eachNode(function(f){e[f]=d(a,f,b,c)}),e}var d=a("./dijkstra");b.exports=e},{"./dijkstra":31}],33:[function(a,b,c){function e(a){return d(a).filter(function(a){return a.length>1})}var d=a("./tarjan");b.exports=e},{"./tarjan":39}],34:[function(a,b,c){function d(a,b,c){var d={},e=a.nodes();return b=b||function(){return 1},c=c||(a.isDirected()?function(b){return a.outEdges(b)}:function(b){return a.incidentEdges(b)}),e.forEach(function(f){d[f]={},d[f][f]={distance:0},e.forEach(function(a){f!==a&&(d[f][a]={distance:Number.POSITIVE_INFINITY})}),c(f).forEach(function(c){var e=a.incidentNodes(c),h=e[0]!==f?e[0]:e[1],i=b(c);i<d[f][h].distance&&(d[f][h]={distance:i,predecessor:f})})}),e.forEach(function(a){var b=d[a];e.forEach(function(c){var f=d[c];e.forEach(function(c){var d=f[a],e=b[c],g=f[c],h=d.distance+e.distance;h<g.distance&&(g.distance=h,g.predecessor=e.predecessor)}
 )})}),d}b.exports=d},{}],35:[function(a,b,c){function e(a){try{d(a)}catch(b){if(b instanceof d.CycleException)return!1;throw b}return!0}var d=a("./topsort");b.exports=e},{"./topsort":40}],36:[function(a,b,c){function e(a,b,c){function f(b,d){if(e.has(b))throw new Error("The input graph is not a tree: "+a);e.add(b),a.neighbors(b).forEach(function(a){a!==d&&f(a,b)}),c(b)}var e=new d;if(a.isDirected())throw new Error("This function only works for undirected graphs");f(b)}var d=a("cp-data").Set;b.exports=e},{"cp-data":19}],37:[function(a,b,c){function e(a,b,c){function f(b,d){if(e.has(b))throw new Error("The input graph is not a tree: "+a);e.add(b),c(b),a.neighbors(b).forEach(function(a){a!==d&&f(a,b)})}var e=new d;if(a.isDirected())throw new Error("This function only works for undirected graphs");f(b)}var d=a("cp-data").Set;b.exports=e},{"cp-data":19}],38:[function(a,b,c){function f(a,b){function i(c){var d=a.incidentNodes(c),e=d[0]!==h?d[0]:d[1],i=g.priority(e);if(i!==undefined){var j
 =b(c);j<i&&(f[e]=h,g.decrease(e,j))}}var c=new d,f={},g=new e,h;if(a.order()===0)return c;a.eachNode(function(a){g.add(a,Number.POSITIVE_INFINITY),c.addNode(a)}),g.decrease(a.nodes()[0],0);var j=!1;while(g.size()>0){h=g.removeMin();if(h in f)c.addEdge(null,h,f[h]);else{if(j)throw new Error("Input graph is not connected: "+a);j=!0}a.incidentEdges(h).forEach(i)}return c}var d=a("../Graph"),e=a("cp-data").PriorityQueue;b.exports=f},{"../Graph":29,"cp-data":19}],39:[function(a,b,c){function d(a){function f(h){var i=d[h]={onStack:!0,lowlink:b,index:b++};c.push(h),a.successors(h).forEach(function(a){a in d?d[a].onStack&&(i.lowlink=Math.min(i.lowlink,d[a].index)):(f(a),i.lowlink=Math.min(i.lowlink,d[a].lowlink))});if(i.lowlink===i.index){var j=[],k;do k=c.pop(),d[k].onStack=!1,j.push(k);while(h!==k);e.push(j)}}if(!a.isDirected())throw new Error("tarjan can only be applied to a directed graph. Bad input: "+a);var b=0,c=[],d={},e=[];return a.nodes().forEach(function(a){a in d||f(a)}),e}b.exp
 orts=d},{}],40:[function(a,b,c){function d(a){function f(g){if(g in c)throw new e;g in b||(c[g]=!0,b[g]=!0,a.predecessors(g).forEach(function(a){f(a)}),delete c[g],d.push(g))}if(!a.isDirected())throw new Error("topsort can only be applied to a directed graph. Bad input: "+a);var b={},c={},d=[],g=a.sinks();if(a.order()!==0&&g.length===0)throw new e;return a.sinks().forEach(function(a){f(a)}),d}function e(){}b.exports=d,d.CycleException=e,e.prototype.toString=function(){return"Graph has at least one cycle"}},{}],41:[function(a,b,c){function e(a){function b(){a.call(this),this._parents={},this._children={},this._children[null]=new d}return b.prototype=new a,b.prototype.constructor=b,b.prototype.parent=function(a,b){this._strictGetNode(a);if(arguments.length<2)return this._parents[a];if(a===b)throw new Error("Cannot make "+a+" a parent of itself");b!==null&&this._strictGetNode(b),this._children[this._parents[a]].remove(a),this._parents[a]=b,this._children[b].add(a)},b.prototype.children
 =function(a){return a!==null&&this._strictGetNode(a),this._children[a].keys()},b.prototype.addNode=function(b,c){return b=a.prototype.addNode.call(this,b,c),this._parents[b]=null,this._children[b]=new d,this._children[null].add(b),b},b.prototype.delNode=function(b){var c=this.parent(b);return this._children[b].keys().forEach(function(a){this.parent(a,c)},this),this._children[c].remove(b),delete this._parents[b],delete this._children[b],a.prototype.delNode.call(this,b)},b.prototype.copy=function(){var b=a.prototype.copy.call(this);return this.nodes().forEach(function(a){b.parent(a,this.parent(a))},this),b},b.prototype.filterNodes=function(b){function f(a){var b=c.parent(a);return b===null||d.hasNode(b)?(e[a]=b,b):b in e?e[b]:f(b)}var c=this,d=a.prototype.filterNodes.call(this,b),e={};return d.eachNode(function(a){d.parent(a,f(a))}),d},b}var d=a("cp-data").Set;b.exports=e},{"cp-data":19}],42:[function(a,b,c){function h(a){return Object.prototype.toString.call(a).slice(8,-1)}var d=a(".
 ./Graph"),e=a("../Digraph"),f=a("../CGraph"),g=a("../CDigraph");c.decode=function(a,b,c){c=c||e;if(h(a)!=="Array")throw new Error("nodes is not an Array");if(h(b)!=="Array")throw new Error("edges is not an Array");if(typeof c=="string")switch(c){case"graph":c=d;break;case"digraph":c=e;break;case"cgraph":c=f;break;case"cdigraph":c=g;break;default:throw new Error("Unrecognized graph type: "+c)}var i=new c;return a.forEach(function(a){i.addNode(a.id,a.value)}),i.parent&&a.forEach(function(a){a.children&&a.children.forEach(function(b){i.parent(b,a.id)})}),b.forEach(function(a){i.addEdge(a.id,a.u,a.v,a.value)}),i},c.encode=function(a){var b=[],c=[];a.eachNode(function(c,d){var e={id:c,value:d};if(a.children){var f=a.children(c);f.length&&(e.children=f)}b.push(e)}),a.eachEdge(function(a,b,d,e){c.push({id:a,u:b,v:d,value:e})});var h;if(a instanceof g)h="cdigraph";else if(a instanceof f)h="cgraph";else if(a instanceof e)h="digraph";else if(a instanceof d)h="graph";else throw new Error("Coul
 dn't determine type of graph: "+a);return{nodes:b,edges:c,type:h}}},{"../CDigraph":26,"../CGraph":27,"../Digraph":28,"../Graph":29}],43:[function(a,b,c){var d=a("cp-data").Set;c.all=function(){return function(){return!0}},c.nodesFromList=function(a){var b=new d(a);return function(a){return b.has(a)}}},{"cp-data":19}],44:[function(a,b,c){var d=a("./Graph"),e=a("./Digraph");d.prototype.toDigraph=d.prototype.asDirected=function(){var a=new e;return this.eachNode(function(b,c){a.addNode(b,c)}),this.eachEdge(function(b,c,d,e){a.addEdge(null,c,d,e),a.addEdge(null,d,c,e)}),a},e.prototype.toGraph=e.prototype.asUndirected=function(){var a=new d;return this.eachNode(function(b,c){a.addNode(b,c)}),this.eachEdge(function(b,c,d,e){a.addEdge(b,c,d,e)}),a}},{"./Digraph":28,"./Graph":29}],45:[function(a,b,c){c.values=function(a){var b=Object.keys(a),c=b.length,d=new Array(c),e;for(e=0;e<c;++e)d[e]=a[b[e]];return d}},{}],46:[function(a,b,c){b.exports="0.7.4"},{}]},{},[1]);
\ No newline at end of file


[08/22] falcon git commit: FALCON-1315 Update falcon ui for HiveDR, secure clusters and bug fixes. Contributed by Armando Reyna/Venkat Ranganathan.

Posted by so...@apache.org.
http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/directives/dependencies-graph.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/directives/dependencies-graph.js b/falcon-ui/app/js/directives/dependencies-graph.js
new file mode 100644
index 0000000..c8faa74
--- /dev/null
+++ b/falcon-ui/app/js/directives/dependencies-graph.js
@@ -0,0 +1,294 @@
+/**
+ * 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.
+ */
+(function () {
+  'use strict';
+
+	var entitiesListModule = angular.module('app.directives.dependencies-graph', ['app.services' ]);
+
+  entitiesListModule.controller('DependenciesGraphCtrl', ['$scope', 'Falcon', 'X2jsService', '$window', 'EncodeService', 'EntityModel',
+                                      function($scope, Falcon, X2jsService, $window, encodeService, EntityModel) {
+
+
+
+  }]);
+
+  entitiesListModule.directive('dependenciesGraph', ["$timeout", 'Falcon', '$filter', '$state', 'X2jsService', 'EntityModel',
+                                              function($timeout, Falcon, $filter, $state, X2jsService, EntityModel) {
+    return {
+      scope: {
+        type: "=",
+        name: "="
+      },
+      controller: 'DependenciesGraphCtrl',
+      restrict: "EA",
+      templateUrl: 'html/directives/dependenciesGraphDv.html',
+      link: function (scope, element) {
+
+        var loadDependencyGraph = function(entity_type, entity_name, done_callback) {
+          var nodes = {};
+          var next_node_id = 0;
+
+          var requests_in_fly = 0;
+
+          function key(type, name) {
+            return type + '/' + name;
+          }
+
+          function getOrCreateNode(type, name) {
+            var k = key(type, name);
+            if (nodes[k] !== undefined)
+              return nodes[k];
+
+            var n = {
+              "id": next_node_id++,
+              "type": type,
+              "name": name,
+              "dependency": []
+            };
+            nodes[k] = n;
+            return n;
+          }
+
+          function loadEntry(node) {
+            var type = node.type, name = node.name, k = key(type, name);
+
+            Falcon.logRequest();
+            Falcon.getEntityDependencies(type, name)
+                .success(function (data) {
+                  Falcon.logResponse('success', data, false, true);
+
+                  if (data.entity == null)
+                    return;
+
+                  if (!($.isArray(data.entity)))
+                    data.entity = new Array(data.entity);
+
+                  var l = data.entity.length;
+                  for (var i = 0; i < l; ++i) {
+                    var e = data.entity[i];
+                    var d = getOrCreateNode(e.type, e.name);
+                    var src = null, dst = null;
+                    if (d.type === "cluster") {
+                      src = node; dst = d;
+                    } else if (d.type === "process") {
+                      src = d; dst = node;
+                    } else {
+                      if (node.type === "cluster") {
+                        src = d; dst = node;
+                      } else {
+                        src = node; dst = d;
+                      }
+                    }
+                    //console.log(src.name + '->' + dst.name);
+                    src.dependency.push(dst.id);
+                  }
+
+                  done_callback(nodes);
+                })
+                .error(function (err) {
+                  Falcon.logResponse('error', err, false, true);
+                });
+          }
+
+          function load() {
+            var n = getOrCreateNode(entity_type, entity_name);
+            loadEntry(n);
+          }
+          load();
+        };
+
+        var plotDependencyGraph = function(nodes, element) {
+          var NODE_WIDTH  = 150;
+          var NODE_HEIGHT = 50;
+          var RECT_ROUND  = 10;
+          var SEPARATION  = 40;
+          var UNIVERSAL_SEP = 80;
+
+          var svg = d3.select(element).append("svg");
+
+          // Function to draw the lines of the edge
+          var LINE_FUNCTION = d3.svg.line()
+              .x(function(d) { return d.x; })
+              .y(function(d) { return d.y; })
+              .interpolate('basis');
+
+          // Mappining from id to a node
+          var node_by_id = {};
+
+          var layout = null;
+
+          /**
+           * Calculate the intersection point between the point p and the edges of the rectangle rect
+           **/
+          function intersectRect(rect, p) {
+            var cx = rect.x, cy = rect.y, dx = p.x - cx, dy = p.y - cy, w = rect.width / 2, h = rect.height / 2;
+
+            if (dx == 0)
+              return { "x": p.x, "y": rect.y + (dy > 0 ? h : -h) };
+
+            var slope = dy / dx;
+
+            var x0 = null, y0 = null;
+            if (Math.abs(slope) < rect.height / rect.width) {
+              // intersect with the left or right edges of the rect
+              x0 = rect.x + (dx > 0 ? w : -w);
+              y0 = cy + slope * (x0 - cx);
+            } else {
+              y0 = rect.y + (dy > 0 ? h : -h);
+              x0 = cx + (y0 - cy) / slope;
+            }
+
+            return { "x": x0, "y": y0 };
+          }
+
+          function drawNode(u, value) {
+            var root = svg.append('g').classed('node', true)
+                .attr('transform', 'translate(' + -value.width/2 + ',' + -value.height/2 + ')');
+
+            var node = node_by_id[u];
+
+
+
+
+            var fo = root.append('foreignObject')
+                .attr('x', value.x)
+                .attr('y', value.y)
+                .attr('width', value.width)
+                .attr('height', value.height)
+                .attr('class', 'foreignObject');
+
+
+            var txt = fo.append('xhtml:div')
+                .text(node.name)
+                .classed('node-name', true)
+                .classed('node-name-' + node.type, true);
+
+            var rect = root.append('rect')
+              .attr('width', value.width)
+              .attr('height', value.height)
+              .attr('x', value.x)
+              .attr('y', value.y)
+              .attr('rx', RECT_ROUND)
+              .attr('ry', RECT_ROUND)
+
+              .on('click', function () {
+
+                Falcon.logRequest();
+                Falcon.getEntityDefinition(node.type.toLowerCase(), node.name)
+                  .success(function (data) {
+                    Falcon.logResponse('success', data, false, true);
+                    var entityModel = X2jsService.xml_str2json(data);
+                    EntityModel.type = node.type.toLowerCase();
+                    EntityModel.name = node.name;
+                    EntityModel.model = entityModel;
+                    $state.go('entityDetails');
+                  })
+                  .error(function (err) {
+                    Falcon.logResponse('error', err, false, false);
+                  });
+
+
+              });
+
+          }
+
+          function drawEdge(e, u, v, value) {
+            var root = svg.append('g').classed('edge', true);
+
+            root.append('path')
+                .attr('marker-end', 'url(#arrowhead)')
+                .attr('d', function() {
+                  var points = value.points;
+
+                  var source = layout.node(u);
+                  var target = layout.node(v);
+
+                  var p0 = points.length === 0 ? target : points[0];
+                  var p1 = points.length === 0 ? source : points[points.length - 1];
+
+                  points.unshift(intersectRect(source, p0));
+                  points.push(intersectRect(target, p1));
+
+                  return LINE_FUNCTION(points);
+                });
+          }
+
+          function postRender() {
+            svg
+                .append('svg:defs')
+                .append('svg:marker')
+                .attr('id', 'arrowhead')
+                .attr('viewBox', '0 0 10 10')
+                .attr('refX', 8)
+                .attr('refY', 5)
+                .attr('markerUnits', 'strokewidth')
+                .attr('markerWidth', 8)
+                .attr('markerHeight', 5)
+                .attr('orient', 'auto')
+                .attr('style', 'fill: #333')
+                .append('svg:path')
+                .attr('d', 'M 0 0 L 10 5 L 0 10 z');
+          }
+
+          function plot() {
+            var g = new dagre.Digraph();
+
+            for (var key in nodes) {
+              var n = nodes[key];
+              node_by_id[n.id] = n;
+              g.addNode(n.id, { "width": NODE_WIDTH, "height": NODE_HEIGHT });
+            }
+
+            for (var key in nodes) {
+              var n = nodes[key];
+              for (var i = 0, l = n.dependency.length; i < l; ++i) {
+                var d = n.dependency[i];
+                g.addEdge(null, n.id, d);
+              }
+            }
+
+            layout = dagre.layout()
+                .universalSep(UNIVERSAL_SEP).rankSep(SEPARATION)
+                .run(g);
+            layout.eachEdge(drawEdge);
+            layout.eachNode(drawNode);
+
+            var graph = layout.graph();
+
+            svg.attr("width", graph.width);
+            svg.attr("height", graph.height);
+
+            postRender();
+          }
+          plot();
+        };
+
+        var visualizeDependencyGraph = function(type, name) {
+          loadDependencyGraph(type, name, function(nodes) {
+            plotDependencyGraph(nodes, element[0]);
+          });
+        };
+
+        //console.log(scope.type + " " + scope.name);
+        visualizeDependencyGraph(scope.type, scope.name);
+
+      }
+    };
+  }]);
+
+})();
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/directives/directives.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/directives/directives.js b/falcon-ui/app/js/directives/directives.js
index c839269..9c388ea 100644
--- a/falcon-ui/app/js/directives/directives.js
+++ b/falcon-ui/app/js/directives/directives.js
@@ -20,11 +20,16 @@
 
   var directivesModule = angular.module('app.directives', [
     'app.services',
-    'app.directives.entities-list',
+    //'app.directives.entities-list',
+    'app.directives.entities-search-list',
+    'app.directives.instances-list',
     'app.directives.server-messages',
     'app.directives.entity',
     'app.directives.check-name',
-    'app.directives.validation-message'
+    'app.directives.validation-message',
+    'chart-module',
+    'app.directives.dependencies-graph',
+    'app.directives.lineage-graph'
   ]);
 
   directivesModule.directive('navHeader', function () {
@@ -88,4 +93,90 @@
     };
   });
 
+  directivesModule.directive('simpleDate', ['$filter', function ($filter) {
+    return {
+      require: 'ngModel',
+      link: function (scope, element, attrs, ngModelController) {
+        ngModelController.$parsers.push(function (data) {
+          //convert data from view format to model format
+          return data;
+        });
+        ngModelController.$formatters.push(function (date) {
+          //convert data from model format to view format
+          if (date !== "") {
+            date = $filter('date')(date, 'MM/dd/yyyy');
+          }
+          return date;
+        });
+      }
+    };
+  }]);
+
+  directivesModule.directive('ngEnter', function () {
+    return function (scope, element, attrs) {
+      element.bind("keydown keypress", function (event) {
+        if (event.which === 13) {
+          scope.$apply(function () {
+            scope.$eval(attrs.ngEnter);
+          });
+          event.preventDefault();
+        }
+      });
+    };
+  });
+
+  directivesModule.directive('elastic', ['$timeout', function ($timeout) {
+    return {
+      restrict: 'A',
+      link: function ($scope, element) {
+        $scope.$watch(function () {
+          return element[0].value;
+        }, function () {
+          resize();
+        });
+        var resize = function () {
+          element[0].style.height = "250px";
+          return element[0].style.height = "" + element[0].scrollHeight + "px";
+        };
+        $timeout(resize, 0);
+      }
+    };
+  }
+  ]);
+
+  directivesModule.directive('autofocus', ['$timeout', function ($timeout) {
+    return {
+      restrict: 'A',
+      link: function ($scope, element) {
+        $timeout(function () {
+          element.trigger('focus');
+        }, 20);
+      }
+    };
+  }
+  ]);
+
+  directivesModule.filter('dateFormatter', function () {
+    return function (date) {
+      console.log(date);
+      var dates = date.split('T')[0],
+        time = date.split('T')[1].split('Z')[0].split('.')[0];
+      return dates + ' ' + time;
+    };
+  });
+
+  directivesModule.directive('onBlur', [function () {
+    return {
+      restrict: 'A',
+      link: function (scope, elm, attrs) {
+        elm.bind('blur', function () {
+          if (attrs.onBlur)
+            scope[attrs.onBlur]();
+          else
+            return false;
+        });
+      }
+    };
+  }]);
+
 }());
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/directives/entities-list.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/directives/entities-list.js b/falcon-ui/app/js/directives/entities-list.js
index aeced2f..065806a 100644
--- a/falcon-ui/app/js/directives/entities-list.js
+++ b/falcon-ui/app/js/directives/entities-list.js
@@ -19,10 +19,10 @@
   'use strict';
 
 	var entitiesListModule = angular.module('app.directives.entities-list', ['app.services' ]);
-	
+
   entitiesListModule.controller('EntitiesListCtrl', ['$scope', 'Falcon', 'X2jsService', '$window', 'EncodeService',
                                       function($scope, Falcon, X2jsService, $window, encodeService) {
-                                        
+
     $scope.downloadEntity = function(type, name) {
       Falcon.logRequest();
       Falcon.getEntityDefinition(type, name) .success(function (data) {
@@ -32,26 +32,26 @@
         Falcon.logResponse('error', err, false);
       });
     };
-    
+
   }]);
-	
+
 	entitiesListModule.filter('tagFilter', function () {
     return function (items) {
       var filtered = [], i;
       for (i = 0; i < items.length; i++) {
         var item = items[i];
         if(!item.list || !item.list.tag) { item.list = {tag:[""]}; }
-        filtered.push(item); 
+        filtered.push(item);
       }
       return filtered;
     };
   });
-	
+
   entitiesListModule.directive('entitiesList', ["$timeout", 'Falcon', function($timeout, Falcon) {
     return {
       scope: {
         input: "=",
-        schedule: "=",  
+        schedule: "=",
         suspend: "=",
         clone: "=",
         remove: "=",
@@ -73,6 +73,15 @@
         }, true);
 
         scope.selectedRows = [];
+        scope.checkedRow = function (name) {
+          var isInArray = false;
+          scope.selectedRows.forEach(function(item) {
+            if (name === item.name) {
+              isInArray = true;
+            }
+          });
+          return isInArray;
+        };
         scope.simpleFilter = {};
         scope.selectedDisabledButtons = {
           schedule:true,
@@ -131,10 +140,10 @@
         };
 
         scope.scopeEdit = function () {
-          scope.edit(scope.selectedRows[0].type, scope.selectedRows[0].name);       
+          scope.edit(scope.selectedRows[0].type, scope.selectedRows[0].name);
         };
         scope.scopeClone = function () {
-          scope.clone(scope.selectedRows[0].type, scope.selectedRows[0].name);        
+          scope.clone(scope.selectedRows[0].type, scope.selectedRows[0].name);
         };
         scope.goEntityDetails = function(name, type) {
           scope.entityDetails(name, type);
@@ -142,18 +151,18 @@
 
         scope.scopeRemove = function () {
           var i;
-          for(i = 0; i < scope.selectedRows.length; i++) {   
-            var multiRequestType = scope.selectedRows[i].type.toLowerCase();          
-            Falcon.responses.multiRequest[multiRequestType] += 1;          
-            scope.remove(scope.selectedRows[i].type, scope.selectedRows[i].name);          
+          for(i = 0; i < scope.selectedRows.length; i++) {
+            var multiRequestType = scope.selectedRows[i].type.toLowerCase();
+            Falcon.responses.multiRequest[multiRequestType] += 1;
+            scope.remove(scope.selectedRows[i].type, scope.selectedRows[i].name);
           }
         };
 
         scope.scopeSchedule = function () {
-          var i;      
+          var i;
           for(i = 0; i < scope.selectedRows.length; i++) {
             var multiRequestType = scope.selectedRows[i].type.toLowerCase();
-            Falcon.responses.multiRequest[multiRequestType] += 1;   
+            Falcon.responses.multiRequest[multiRequestType] += 1;
             scope.schedule(scope.selectedRows[i].type, scope.selectedRows[i].name);
           }
         };
@@ -162,7 +171,7 @@
           var i;
           for(i = 0; i < scope.selectedRows.length; i++) {
             var multiRequestType = scope.selectedRows[i].type.toLowerCase();
-            Falcon.responses.multiRequest[multiRequestType] += 1;   
+            Falcon.responses.multiRequest[multiRequestType] += 1;
             scope.suspend(scope.selectedRows[i].type, scope.selectedRows[i].name);
           }
         };
@@ -170,20 +179,20 @@
           var i;
           for(i = 0; i < scope.selectedRows.length; i++) {
             var multiRequestType = scope.selectedRows[i].type.toLowerCase();
-            Falcon.responses.multiRequest[multiRequestType] += 1;   
+            Falcon.responses.multiRequest[multiRequestType] += 1;
             scope.resume(scope.selectedRows[i].type, scope.selectedRows[i].name);
           }
         };
 
         scope.download = function() {
           var i;
-          for(i = 0; i < scope.selectedRows.length; i++) {       
+          for(i = 0; i < scope.selectedRows.length; i++) {
             scope.downloadEntity(scope.selectedRows[i].type, scope.selectedRows[i].name);
           }
         };
-   
+
       }
     };
   }]);
-   
+
 })();
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/directives/entities-search-list.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/directives/entities-search-list.js b/falcon-ui/app/js/directives/entities-search-list.js
new file mode 100644
index 0000000..3e76f63
--- /dev/null
+++ b/falcon-ui/app/js/directives/entities-search-list.js
@@ -0,0 +1,305 @@
+/**
+ * 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.
+ */
+(function () {
+  'use strict';
+
+	var entitiesListModule = angular.module('app.directives.entities-search-list', ['app.services' ]);
+
+  entitiesListModule.controller('EntitiesSearchListCtrl', ['$scope', 'Falcon', 'X2jsService', '$window', 'EncodeService',
+                                      function($scope, Falcon, X2jsService, $window, encodeService) {
+
+    $scope.downloadEntity = function(type, name) {
+      Falcon.logRequest();
+      Falcon.getEntityDefinition(type, name) .success(function (data) {
+        Falcon.logResponse('success', data, false, true);
+        $window.location.href = 'data:application/octet-stream,' + encodeService.encode(data);
+      }).error(function (err) {
+        Falcon.logResponse('error', err, false);
+      });
+    };
+
+  }]);
+
+  entitiesListModule.filter('tagFilter', function () {
+    return function (items) {
+      var filtered = [], i;
+      for (i = 0; i < items.length; i++) {
+        var item = items[i];
+        if(!item.list || !item.list.tag) { item.list = {tag:[""]}; }
+        filtered.push(item);
+      }
+      return filtered;
+    };
+  });
+
+  entitiesListModule.directive('entitiesSearchList', ["$timeout", 'Falcon', function($timeout, Falcon) {
+    return {
+      scope: {
+        input: "=",
+        schedule: "=",
+        suspend: "=",
+        clone: "=",
+        remove: "=",
+        edit: "=",
+        type: "@",
+        tags: "=",
+        focusSearch: "=",
+        entityDetails:"=",
+        entityDefinition:"=",
+        resume:"=",
+        refresh: "=",
+        pages: "=",
+        goPage: "="
+      },
+      controller: 'EntitiesSearchListCtrl',
+      restrict: "EA",
+      templateUrl: 'html/directives/entitiesSearchListDv.html',
+      link: function (scope) {
+        scope.server = Falcon;
+        scope.$watch('input', function() {
+          scope.selectedRows = [];
+          scope.checkButtonsToShow();
+
+        }, true);
+
+        scope.selectedRows = [];
+        scope.mirrorTag = "_falcon_mirroring_type";
+
+        scope.checkedRow = function (name) {
+          var isInArray = false;
+          scope.selectedRows.forEach(function(item) {
+            if (name === item.name) {
+              isInArray = true;
+            }
+          });
+          return isInArray;
+        };
+
+        var nameOrder = true;
+        scope.toggleSortOrder = function () {
+          Falcon.orderBy.enable = true;
+          if (nameOrder) {
+            Falcon.orderBy.name = 'asc';
+          } else {
+            Falcon.orderBy.name = 'desc';
+          }
+          nameOrder = !nameOrder;
+          scope.$parent.refreshList(scope.$parent.tags);
+
+        };
+
+        scope.simpleFilter = {};
+
+        scope.selectedDisabledButtons = {
+          schedule:true,
+          suspend:true,
+          resume:true
+        };
+
+        scope.checkButtonsToShow = function() {
+          var statusCount = {
+            "SUBMITTED":0,
+            "RUNNING":0,
+            "SUSPENDED":0,
+            "UNKNOWN":0
+          };
+
+          $timeout(function() {
+
+            if(scope.selectedRows.length === scope.input.length){
+              scope.selectedAll = true;
+            }else{
+              scope.selectedAll = false;
+            }
+
+            scope.selectedRows.forEach(function(entity) {
+              statusCount[entity.status] = statusCount[entity.status]+1;
+            });
+
+            if(statusCount.SUBMITTED > 0) {
+              if(statusCount.RUNNING > 0 || statusCount.SUSPENDED > 0 || statusCount.UNKNOWN > 0) {
+                scope.selectedDisabledButtons = { schedule:true, suspend:true, resume:true };
+              }
+              else {
+                scope.selectedDisabledButtons = { schedule:false, suspend:true, resume:true };
+              }
+            }
+            if(statusCount.RUNNING > 0) {
+              if(statusCount.SUBMITTED > 0 || statusCount.SUSPENDED > 0 || statusCount.UNKNOWN > 0) {
+                scope.selectedDisabledButtons = { schedule:true, suspend:true, resume:true };
+              }
+              else {
+                scope.selectedDisabledButtons = { schedule:true, suspend:false, resume:true };
+              }
+            }
+            if (statusCount.SUSPENDED > 0) {
+              if(statusCount.SUBMITTED > 0 || statusCount.RUNNING > 0 || statusCount.UNKNOWN > 0) {
+                scope.selectedDisabledButtons = { schedule:true, suspend:true, resume:true };
+              }
+              else {
+                scope.selectedDisabledButtons = { schedule:true, suspend:true, resume:false };
+              }
+            }
+            if (statusCount.UNKNOWN > 0) {
+              scope.selectedDisabledButtons = { schedule:true, suspend:true, resume:true };
+            }
+
+            if(scope.selectedRows.length === 0) {
+              scope.selectedDisabledButtons = {
+                schedule:true,
+                suspend:true,
+                resume:true
+              };
+            }
+          }, 50);
+        };
+
+        var isSelected = function(item){
+          var selected = false;
+          scope.selectedRows.forEach(function(entity) {
+            if(angular.equals(item, entity)){
+              selected = true;
+            }
+          });
+          return selected;
+        };
+
+        scope.checkAll = function () {
+          if(scope.selectedRows.length === scope.input.length){
+            angular.forEach(scope.input, function (item) {
+              scope.selectedRows.pop();
+            });
+          }else{
+            angular.forEach(scope.input, function (item) {
+              var checkbox = {name:item.name, type:item.type, status:item.status};
+              if(!isSelected(checkbox)){
+                scope.selectedRows.push(checkbox);
+              }
+            });
+          }
+        };
+
+        scope.addTag = function(text){
+          var added = false;
+          angular.forEach(scope.tags, function (scopeTag) {
+            if(scopeTag.text === text){
+              added = true;
+            }
+          });
+          if(!added){
+            var tag = {text:"Tag:"+text};
+            scope.tags.push(tag);
+            scope.focusSearch();
+          }
+        };
+
+        scope.scopeEdit = function () {
+          scope.edit(scope.selectedRows[0].type, scope.selectedRows[0].name);
+        };
+        scope.scopeClone = function () {
+          scope.clone(scope.selectedRows[0].type, scope.selectedRows[0].name);
+        };
+        scope.goEntityDefinition = function(name, type) {
+          scope.entityDefinition(name, type);
+        };
+        scope.goEntityDetails = function(name, type) {
+          scope.entityDetails(name, type);
+        };
+
+        scope.scopeRemove = function () {
+          var i;
+          for(i = 0; i < scope.selectedRows.length; i++) {
+            var multiRequestType = scope.selectedRows[i].type.toLowerCase();
+            Falcon.responses.multiRequest[multiRequestType] += 1;
+            scope.remove(scope.selectedRows[i].type, scope.selectedRows[i].name);
+          }
+        };
+
+        scope.scopeSchedule = function () {
+          var i;
+          for(i = 0; i < scope.selectedRows.length; i++) {
+            var multiRequestType = scope.selectedRows[i].type.toLowerCase();
+            Falcon.responses.multiRequest[multiRequestType] += 1;
+            scope.schedule(scope.selectedRows[i].type, scope.selectedRows[i].name);
+          }
+        };
+
+        scope.scopeSuspend = function () {
+          var i;
+          for(i = 0; i < scope.selectedRows.length; i++) {
+            var multiRequestType = scope.selectedRows[i].type.toLowerCase();
+            Falcon.responses.multiRequest[multiRequestType] += 1;
+            scope.suspend(scope.selectedRows[i].type, scope.selectedRows[i].name);
+          }
+        };
+        scope.scopeResume = function () {
+          var i;
+          for(i = 0; i < scope.selectedRows.length; i++) {
+            var multiRequestType = scope.selectedRows[i].type.toLowerCase();
+            Falcon.responses.multiRequest[multiRequestType] += 1;
+            scope.resume(scope.selectedRows[i].type, scope.selectedRows[i].name);
+          }
+        };
+
+        scope.download = function() {
+          var i;
+          for(i = 0; i < scope.selectedRows.length; i++) {
+            scope.downloadEntity(scope.selectedRows[i].type, scope.selectedRows[i].name);
+          }
+        };
+
+        scope.scopeGoPage = function (page) {
+          scope.goPage(page);
+        };
+
+        scope.isMirror = function(tags){
+          var flag = false;
+          if(tags !== undefined){
+            tags.forEach(function(tag) {
+              if(tag.indexOf(scope.mirrorTag) !== -1){
+                flag = true;
+              }
+            });
+          }
+          return flag;
+        };
+
+        scope.displayIcon = function (type, tags) {
+          if(type === "FEED"){
+            return "entypo download";
+          }else if(type === "PROCESS" && scope.isMirror(tags)){
+            return "glyphicon glyphicon-duplicate";
+          }else{
+            return "entypo cycle";
+          }
+        };
+
+        scope.displayType = function (tag) {
+          var tagKeyVal = tag.split("=");
+          if(tagKeyVal[0] === "_falcon_mirroring_type"){
+            return tagKeyVal[1];
+          }else{
+            return "";
+          }
+        };
+
+      }
+    };
+  }]);
+
+})();
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/directives/instances-list.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/directives/instances-list.js b/falcon-ui/app/js/directives/instances-list.js
new file mode 100644
index 0000000..269c7c1
--- /dev/null
+++ b/falcon-ui/app/js/directives/instances-list.js
@@ -0,0 +1,832 @@
+/**
+ * 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.
+ */
+(function () {
+  'use strict';
+
+	var entitiesListModule = angular.module('app.directives.instances-list', ['app.services' ]);
+
+  entitiesListModule.controller('InstancesListCtrl', ['$scope', 'Falcon', 'X2jsService', '$window', 'EncodeService',
+                                      function($scope, Falcon, X2jsService, $window, encodeService) {
+
+    //$scope.downloadEntity = function(logURL) {
+    //  Falcon.logRequest();
+    //  Falcon.getInstanceLog(logURL) .success(function (data) {
+    //    Falcon.logResponse('success', data, false, true);
+    //    $window.location.href = 'data:application/octet-stream,' + encodeService.encode(data);
+    //  }).error(function (err) {
+    //    Falcon.logResponse('error', err, false);
+    //  });
+    //};
+
+    $scope.downloadEntity = function(logURL) {
+      $window.location.href = logURL;
+    };
+
+  }]);
+
+  entitiesListModule.filter('tagFilter', function () {
+    return function (items) {
+      var filtered = [], i;
+      for (i = 0; i < items.length; i++) {
+        var item = items[i];
+        if(!item.list || !item.list.tag) { item.list = {tag:[""]}; }
+        filtered.push(item);
+      }
+      return filtered;
+    };
+  });
+
+  entitiesListModule.directive('instancesList', ["$timeout", 'Falcon', '$filter', function($timeout, Falcon, $filter) {
+    return {
+      scope: {
+        input: "=",
+        type: "=",
+        name: "=",
+        start: "=",
+        end: "=",
+        instanceDetails:"=",
+        refresh: "=",
+        pages: "=",
+        nextPages: "=",
+        prevPages: "=",
+        goPage: "=",
+        changePagesSet: "="
+      },
+      controller: 'InstancesListCtrl',
+      restrict: "EA",
+      templateUrl: 'html/directives/instancesListDv.html',
+      link: function (scope) {
+        scope.server = Falcon;
+        scope.$watch(function () { return scope.input; }, function() {
+          scope.selectedRows = [];
+          scope.checkButtonsToShow();
+        }, true);
+
+        var resultsPerPage = 10;
+        var visiblePages = 3;
+        scope.selectedRows = [];
+        scope.$parent.refreshInstanceList(scope.type, scope.name, scope.start, scope.end);
+
+        scope.startSortOrder = "desc";
+        scope.endSortOrder = "desc";
+        scope.statusSortOrder = "desc";
+
+        scope.checkedRow = function (name) {
+          var isInArray = false;
+          scope.selectedRows.forEach(function(item) {
+            if (name === item.instance) {
+              isInArray = true;
+            }
+          });
+          return isInArray;
+        };
+
+        scope.simpleFilter = {};
+
+        scope.selectedDisabledButtons = {
+          schedule:true,
+          suspend:true,
+          resume:true,
+          stop:true
+        };
+
+        scope.checkButtonsToShow = function() {
+          var statusCount = {
+            "SUBMITTED":0,
+            "RUNNING":0,
+            "SUSPENDED":0,
+            "UNKNOWN":0,
+            "KILLED":0,
+            "WAITING":0,
+            "FAILED":0,
+            "SUCCEEDED":0
+          };
+
+          $timeout(function() {
+
+            if(scope.selectedRows.length === scope.input.length){
+              scope.selectedAll = true;
+            }else{
+              scope.selectedAll = false;
+            }
+
+            scope.selectedRows.forEach(function(instance) {
+              statusCount[instance.status] = statusCount[instance.status]+1;
+            });
+
+            if(statusCount.SUBMITTED > 0) {
+              if(statusCount.RUNNING > 0 || statusCount.SUSPENDED > 0 || statusCount.UNKNOWN > 0 || statusCount.KILLED > 0 || statusCount.WAITING > 0 || statusCount.FAILED > 0) {
+                scope.selectedDisabledButtons = { schedule:true, suspend:true, resume:true, stop:true, rerun:true };
+              }
+              else {
+                scope.selectedDisabledButtons = { schedule:false, suspend:true, resume:true, stop:true, rerun:true };
+              }
+            }
+            if(statusCount.RUNNING > 0) {
+              if(statusCount.SUBMITTED > 0 || statusCount.SUSPENDED > 0 || statusCount.UNKNOWN > 0 || statusCount.KILLED > 0 || statusCount.WAITING > 0 || statusCount.FAILED > 0) {
+                scope.selectedDisabledButtons = { schedule:true, suspend:true, resume:true, stop:false, rerun:true };
+              }
+              else {
+                scope.selectedDisabledButtons = { schedule:true, suspend:false, resume:true, stop:false, rerun:true  };
+              }
+            }
+            if (statusCount.SUSPENDED > 0) {
+              if(statusCount.SUBMITTED > 0 || statusCount.RUNNING > 0 || statusCount.UNKNOWN > 0 || statusCount.KILLED > 0 || statusCount.WAITING > 0 || statusCount.FAILED > 0) {
+                scope.selectedDisabledButtons = { schedule:true, suspend:true, resume:true, stop:false, rerun:true };
+              }
+              else {
+                scope.selectedDisabledButtons = { schedule:true, suspend:true, resume:false, stop:false, rerun:true };
+              }
+            }
+            if (statusCount.KILLED > 0) {
+              if(statusCount.SUBMITTED > 0 || statusCount.SUSPENDED > 0 || statusCount.RUNNING > 0 || statusCount.UNKNOWN > 0 || statusCount.WAITING > 0 || statusCount.FAILED > 0) {
+                scope.selectedDisabledButtons = { schedule:true, suspend:true, resume:true, stop:true, rerun:true };
+              }
+              else {
+                scope.selectedDisabledButtons = { schedule:true, suspend:true, resume:true, stop:true, rerun:false };
+              }
+            }
+            if(statusCount.WAITING > 0) {
+              if(statusCount.SUBMITTED > 0 || statusCount.RUNNING > 0 || statusCount.SUSPENDED > 0 || statusCount.UNKNOWN > 0 || statusCount.KILLED > 0 || statusCount.FAILED > 0) {
+                scope.selectedDisabledButtons = { schedule:true, suspend:true, resume:true, stop:true, rerun:true };
+              }
+              else {
+                scope.selectedDisabledButtons = { schedule:true, suspend:true, resume:true, stop:true, rerun:true  };
+              }
+            }
+            if (statusCount.FAILED > 0) {
+              if(statusCount.SUBMITTED > 0 || statusCount.SUSPENDED > 0 || statusCount.RUNNING > 0 || statusCount.UNKNOWN > 0 || statusCount.KILLED > 0 || statusCount.WAITING > 0) {
+                scope.selectedDisabledButtons = { schedule:true, suspend:true, resume:true, stop:true, rerun:true };
+              }
+              else {
+                scope.selectedDisabledButtons = { schedule:true, suspend:true, resume:true, stop:true, rerun:false };
+              }
+            }
+            if(statusCount.SUCCEEDED > 0) {
+              if(statusCount.SUBMITTED > 0 || statusCount.RUNNING > 0 || statusCount.SUSPENDED > 0 || statusCount.UNKNOWN > 0 || statusCount.KILLED > 0 || statusCount.WAITING > 0 || statusCount.FAILED > 0) {
+                scope.selectedDisabledButtons = { schedule:true, suspend:true, resume:true, stop:true, rerun:true };
+              }
+              else {
+                scope.selectedDisabledButtons = { schedule:true, suspend:true, resume:true, stop:true, rerun:false };
+              }
+            }
+            if (statusCount.UNKNOWN > 0) {
+              scope.selectedDisabledButtons = { schedule:true, suspend:true, resume:true, stop:true, rerun:true };
+            }
+
+            if(scope.selectedRows.length === 0) {
+              scope.selectedDisabledButtons = {
+                schedule:true,
+                resume:true,
+                suspend:true,
+                stop:true,
+                rerun:true
+              };
+            }
+          }, 50);
+        };
+
+        var isSelected = function(item){
+          var selected = false;
+          scope.selectedRows.forEach(function(entity) {
+            if(angular.equals(item, entity)){
+              selected = true;
+            }
+          });
+          return selected;
+        }
+
+        scope.checkAll = function () {
+          if(scope.selectedRows.length >= scope.input.length){
+            angular.forEach(scope.input, function (item) {
+              scope.selectedRows.pop();
+            });
+          }else{
+            angular.forEach(scope.input, function (item) {
+              var checkbox = {'instance':item.instance, 'startTime':item.startTime, 'endTime':item.endTime, 'status':item.status, 'type':scope.type, 'logFile':item.logFile};
+              if(!isSelected(checkbox)){
+                scope.selectedRows.push(checkbox);
+              }
+            });
+          }
+        };
+
+        scope.goInstanceDetails = function(instance) {
+          scope.instanceDetails(instance);
+        };
+
+        var resumeInstance = function (type, name, start, end, refresh) {
+          Falcon.logRequest();
+          Falcon.postResumeInstance(type, name, start, end)
+            .success(function (message) {
+              Falcon.logResponse('success', message, type);
+              if(refresh){
+                scope.$parent.refreshInstanceList(scope.type, scope.name, scope.start, scope.end);
+              }
+            })
+            .error(function (err) {
+              Falcon.logResponse('error', err, type);
+
+            });
+        };
+
+        var suspendInstance = function (type, name, start, end, refresh) {
+          Falcon.logRequest();
+          Falcon.postSuspendInstance(type, name, start, end)
+            .success(function (message) {
+              Falcon.logResponse('success', message, type);
+              if(refresh){
+                scope.$parent.refreshInstanceList(scope.type, scope.name, scope.start, scope.end);
+              }
+            })
+            .error(function (err) {
+              Falcon.logResponse('error', err, type);
+
+            });
+        };
+
+        var reRunInstance = function (type, name, start, end, refresh) {
+          Falcon.logRequest();
+          Falcon.postReRunInstance(type, name, start, end)
+            .success(function (message) {
+              Falcon.logResponse('success', message, type);
+              if(refresh){
+                scope.$parent.refreshInstanceList(scope.type, scope.name, scope.start, scope.end);
+              }
+            })
+            .error(function (err) {
+              Falcon.logResponse('error', err, type);
+
+            });
+        };
+
+        var killInstance = function (type, name, start, end, refresh) {
+          Falcon.logRequest();
+          Falcon.postKillInstance(type, name, start, end)
+            .success(function (message) {
+              Falcon.logResponse('success', message, type);
+              if(refresh){
+                scope.$parent.refreshInstanceList(scope.type, scope.name, scope.start, scope.end);
+              }
+            })
+            .error(function (err) {
+              Falcon.logResponse('error', err, type);
+
+            });
+        };
+
+        scope.scopeResume = function () {
+          for(var i = 0; i < scope.selectedRows.length; i++) {
+            var multiRequestType = scope.selectedRows[i].type.toLowerCase();
+            Falcon.responses.multiRequest[multiRequestType] += 1;
+            var start = scope.selectedRows[i].instance;
+            var end = addOneMin(start);
+            var refresh = i === scope.selectedRows.length-1 ? true : false;
+            resumeInstance(scope.type, scope.name, start, end, refresh);
+          }
+        };
+
+        scope.scopeSuspend = function () {
+          for(var i = 0; i < scope.selectedRows.length; i++) {
+            var multiRequestType = scope.selectedRows[i].type.toLowerCase();
+            Falcon.responses.multiRequest[multiRequestType] += 1;
+            var start = scope.selectedRows[i].instance;
+            var end = addOneMin(start);
+            var refresh = i === scope.selectedRows.length-1 ? true : false;
+            suspendInstance(scope.type, scope.name, start, end, refresh);
+          }
+        };
+
+        scope.scopeRerun = function () {
+          for(var i = 0; i < scope.selectedRows.length; i++) {
+            var multiRequestType = scope.selectedRows[i].type.toLowerCase();
+            Falcon.responses.multiRequest[multiRequestType] += 1;
+            var start = scope.selectedRows[i].instance;
+            var end = addOneMin(start);
+            var refresh = i === scope.selectedRows.length-1 ? true : false;
+            reRunInstance(scope.type, scope.name, start, end, refresh);
+          }
+        };
+
+        scope.scopeKill = function () {
+          for(var i = 0; i < scope.selectedRows.length; i++) {
+            var multiRequestType = scope.selectedRows[i].type.toLowerCase();
+            Falcon.responses.multiRequest[multiRequestType] += 1;
+            var start = scope.selectedRows[i].instance;
+            var end = addOneMin(start);
+            var refresh = i === scope.selectedRows.length-1 ? true : false;
+            killInstance(scope.type, scope.name, start, end, refresh);
+          }
+        };
+
+        scope.download = function() {
+          var i;
+          for(i = 0; i < scope.selectedRows.length; i++) {
+            scope.downloadEntity(scope.selectedRows[i].logFile);
+          }
+        };
+
+        scope.scopeGoPage = function (page) {
+          scope.goPage(page);
+        };
+
+        scope.scopeNextOffset = function (page) {
+          var offset = (parseInt(scope.pages[0].label)+(visiblePages-1))*resultsPerPage;
+          scope.changePagesSet(offset, page, 0, scope.start, scope.end);
+        };
+
+        scope.scopePrevOffset = function (page) {
+          var offset = (parseInt(scope.pages[0].label)-(visiblePages+1))*resultsPerPage;
+          scope.changePagesSet(offset, page, visiblePages-1, scope.start, scope.end);
+        };
+
+        scope.validateDate = function(event, type){
+          var which = event.which || event.keyCode;
+          var charStr = String.fromCharCode(which);
+          event.preventDefault();
+          if (
+            which == 8 || which == 46 || which == 37 || which == 39 ||
+            (which >= 48 && which <= 57)
+          ) {
+            if(type == "start"){
+              if(scope.startFilter){
+                if(scope.startFilter.length == 1){
+                  //mm
+                  var prevChar = scope.startFilter.substring(scope.startFilter.length-1);
+                  prevChar = parseInt(prevChar);
+                  if(prevChar < 1){
+                    if(prevChar == 0 && charStr == 0){
+
+                    }else if(charStr <= 9){
+                      scope.startFilter += charStr + "/";
+                    }
+                  }else{
+                    if(charStr <= 2){
+                      scope.startFilter += charStr + "/";
+                    }
+                  }
+                }else if(scope.startFilter.length == 2){
+                  //mm/
+                  if(charStr <= 3){
+                    scope.startFilter += "/" + charStr;
+                  }
+                }else if(scope.startFilter.length == 3){
+                  //mm/d
+                  if(charStr <= 3){
+                    scope.startFilter += charStr;
+                  }
+                }else if(scope.startFilter.length == 4){
+                  //mm/dd
+                  var prevChar = scope.startFilter.substring(scope.startFilter.length-1);
+                  prevChar = parseInt(prevChar);
+                  if(prevChar < 3){
+                    if(prevChar == 0 && charStr == 0){
+
+                    }else if(charStr <= 9){
+                      scope.startFilter += charStr + "/";
+                    }
+                  }else{
+                    if(charStr <= 1){
+                      scope.startFilter += charStr + "/";
+                    }
+                  }
+                }else if(scope.startFilter.length == 5){
+                  //mm/dd/
+                  if(charStr <= 2){
+                    scope.startFilter += "/" + charStr;
+                  }
+                }else if(scope.startFilter.length == 6){
+                  //mm/dd/y
+                  if(charStr <= 2){
+                    scope.startFilter += charStr;
+                  }
+                }else if(scope.startFilter.length == 7){
+                  //mm/dd/yy
+                  if(charStr <= 9){
+                    scope.startFilter += charStr;
+                  }
+                }else if(scope.startFilter.length == 8){
+                  //mm/dd/yyy
+                  if(charStr <= 9){
+                    scope.startFilter += charStr;
+                  }
+                }else if(scope.startFilter.length == 9){
+                  //mm/dd/yyyy
+                  if(charStr <= 9){
+                    scope.startFilter += charStr + " ";
+                  }
+                }else if(scope.startFilter.length == 10){
+                  //mm/dd/yyyy
+                  if(charStr <= 2){
+                    scope.startFilter += " " + charStr;
+                  }
+                }else if(scope.startFilter.length == 11){
+                  //mm/dd/yyyy h
+                  if(charStr <= 2){
+                    scope.startFilter += charStr;
+                  }
+                }else if(scope.startFilter.length == 12){
+                  //mm/dd/yyyy hh
+                  var prevChar = scope.startFilter.substring(scope.startFilter.length-1);
+                  prevChar = parseInt(prevChar);
+                  if(prevChar < 2){
+                    if(charStr <= 9){
+                      scope.startFilter += charStr + ":";
+                    }
+                  }else{
+                    if(charStr <= 4){
+                      scope.startFilter += charStr + ":";
+                    }
+                  }
+                }else if(scope.startFilter.length == 13){
+                  //mm/dd/yyyy hh:
+                  if(charStr <= 5){
+                    scope.startFilter += ":" + charStr;
+                  }
+                }else if(scope.startFilter.length == 14){
+                  //mm/dd/yyyy hh:m
+                  if(charStr <= 5){
+                    scope.startFilter += charStr;
+                  }
+                }else if(scope.startFilter.length == 15){
+                  //mm/dd/yyyy hh:mm
+                  if(charStr <= 9){
+                    scope.startFilter += charStr;
+                    scope.startFilterError = false;
+                  }
+                }
+              }else{
+                //m
+                if(charStr <= 1){
+                  scope.startFilter = charStr;
+                }
+              }
+            }else{
+              if(scope.endFilter){
+                if(scope.endFilter.length == 1){
+                  //mm
+                  var prevChar = scope.endFilter.substring(scope.endFilter.length-1);
+                  prevChar = parseInt(prevChar);
+                  if(prevChar < 1){
+                    if(prevChar == 0 && charStr == 0){
+
+                    }else if(charStr <= 9){
+                      scope.endFilter += charStr + "/";
+                    }
+                  }else{
+                    if(charStr <= 2){
+                      scope.endFilter += charStr + "/";
+                    }
+                  }
+                }else if(scope.endFilter.length == 2){
+                  //mm/
+                  if(charStr <= 3){
+                    scope.endFilter += "/" + charStr;
+                  }
+                }else if(scope.endFilter.length == 3){
+                  //mm/d
+                  if(charStr <= 3){
+                    scope.endFilter += charStr;
+                  }
+                }else if(scope.endFilter.length == 4){
+                  //mm/dd
+                  var prevChar = scope.endFilter.substring(scope.endFilter.length-1);
+                  prevChar = parseInt(prevChar);
+                  if(prevChar < 3){
+                    if(prevChar == 0 && charStr == 0){
+
+                    }else if(charStr <= 9){
+                      scope.endFilter += charStr + "/";
+                    }
+                  }else{
+                    if(charStr <= 1){
+                      scope.endFilter += charStr + "/";
+                    }
+                  }
+                }else if(scope.endFilter.length == 5){
+                  //mm/dd/
+                  if(charStr <= 2){
+                    scope.endFilter += "/" + charStr;
+                  }
+                }else if(scope.endFilter.length == 6){
+                  //mm/dd/y
+                  if(charStr <= 2){
+                    scope.endFilter += charStr;
+                  }
+                }else if(scope.endFilter.length == 7){
+                  //mm/dd/yy
+                  if(charStr <= 9){
+                    scope.endFilter += charStr;
+                  }
+                }else if(scope.endFilter.length == 8){
+                  //mm/dd/yyy
+                  if(charStr <= 9){
+                    scope.endFilter += charStr;
+                  }
+                }else if(scope.endFilter.length == 9){
+                  //mm/dd/yyyy
+                  if(charStr <= 9){
+                    scope.endFilter += charStr + " ";
+                  }
+                }else if(scope.endFilter.length == 10){
+                  //mm/dd/yyyy
+                  if(charStr <= 2){
+                    scope.endFilter += " " + charStr;
+                  }
+                }else if(scope.endFilter.length == 11){
+                  //mm/dd/yyyy h
+                  if(charStr <= 2){
+                    scope.endFilter += charStr;
+                  }
+                }else if(scope.endFilter.length == 12){
+                  //mm/dd/yyyy hh
+                  var prevChar = scope.endFilter.substring(scope.endFilter.length-1);
+                  prevChar = parseInt(prevChar);
+                  if(prevChar < 2){
+                    if(charStr <= 9){
+                      scope.endFilter += charStr + ":";
+                    }
+                  }else{
+                    if(charStr <= 4){
+                      scope.endFilter += charStr + ":";
+                    }
+                  }
+                }else if(scope.endFilter.length == 13){
+                  //mm/dd/yyyy hh:
+                  if(charStr <= 5){
+                    scope.endFilter += ":" + charStr;
+                  }
+                }else if(scope.endFilter.length == 14){
+                  //mm/dd/yyyy hh:m
+                  if(charStr <= 5){
+                    scope.endFilter += charStr;
+                  }
+                }else if(scope.endFilter.length == 15){
+                  //mm/dd/yyyy hh:mm
+                  if(charStr <= 9){
+                    scope.endFilter += charStr;
+                    scope.endFilterError = false;
+                  }
+                }
+              }else{
+                //m
+                if(charStr <= 1){
+                  scope.endFilter = charStr;
+                }
+              }
+            }
+          }
+        };
+
+        var changeDateFormat = function(date){
+          var completeDate = date.split(" ");
+          var dates = completeDate[0].split("/");
+          date = dates[2] + "-" + dates[0] + "-" + dates[1] + "T" + completeDate[1] + "Z";
+          return date;
+        };
+
+        var validateDateFormat = function(date){
+          var char = date.substring(0, 1);
+          if(isNaN(char)){
+            return false;
+          }
+          char = date.substring(1, 2);
+          if(isNaN(char)){
+            return false;
+          }
+          char = date.substring(2, 3);
+          if(char != "/"){
+            return false;
+          }
+          char = date.substring(3, 4);
+          if(isNaN(char)){
+            return false;
+          }
+          char = date.substring(4, 5);
+          if(isNaN(char)){
+            return false;
+          }
+          char = date.substring(5, 6);
+          if(char != "/"){
+            return false;
+          }
+          char = date.substring(6, 7);
+          if(isNaN(char)){
+            return false;
+          }
+          char = date.substring(7, 8);
+          if(isNaN(char)){
+            return false;
+          }
+          char = date.substring(8, 9);
+          if(isNaN(char)){
+            return false;
+          }
+          char = date.substring(9, 10);
+          if(isNaN(char)){
+            return false;
+          }
+          char = date.substring(10, 11);
+          if(char != " "){
+            return false;
+          }
+          char = date.substring(11, 12);
+          if(isNaN(char)){
+            return false;
+          }
+          char = date.substring(12, 13);
+          if(isNaN(char)){
+            return false;
+          }
+          char = date.substring(13, 14);
+          if(char != ":"){
+            return false;
+          }
+          char = date.substring(14, 15);
+          if(isNaN(char)){
+            return false;
+          }
+          char = date.substring(15, 16);
+          if(isNaN(char)){
+            return false;
+          }
+          return true;
+        };
+
+        scope.filterInstances = function(orderBy){
+          var start;
+          var end;
+          var executeFilter = false;
+          scope.startFilterError = false;
+          scope.endFilterError = false;
+          scope.startAfterEndError = false;
+          scope.startAfterNominalError = false;
+          scope.startBeforeNominalError = false;
+          scope.endAfterNominalError = false;
+          scope.endBeforeNominalError = false;
+          var nominalStartDate = new Date(scope.start);
+          var nominalEndDate = new Date(scope.end);
+          if(scope.startFilter && scope.endFilter){
+            if(scope.startFilter.length == 16 && scope.endFilter.length == 16){
+              if(!validateDateFormat(scope.startFilter)){
+                executeFilter = false;
+                scope.startFilterError = true;
+              }else if(!validateDateFormat(scope.endFilter)){
+                executeFilter = false;
+                scope.endFilterError = true;
+              }else{
+                start = changeDateFormat(scope.startFilter);
+                var filterStartDate = new Date(start);
+                end = changeDateFormat(scope.endFilter);
+                var filterEndDate = new Date(end);
+                if(filterStartDate > filterEndDate){
+                  executeFilter = false;
+                  scope.startAfterEndError = true;
+                }else{
+                  if(filterStartDate < nominalStartDate){
+                    executeFilter = false;
+                    scope.startAfterNominalError = true;
+                  }else if(filterStartDate > nominalEndDate){
+                    executeFilter = false;
+                    scope.startBeforeNominalError = true;
+                  }else if(filterEndDate < nominalStartDate){
+                    executeFilter = false;
+                    scope.endAfterNominalError = true;
+                  }else if(filterEndDate > nominalEndDate){
+                    executeFilter = false;
+                    scope.endBeforeNominalError = true;
+                  }else{
+                    executeFilter = true;
+                  }
+                }
+              }
+            }else{
+              if(scope.startFilter.length != 16){
+                scope.startFilterError = true;
+              }
+              if(scope.endFilter.length != 16){
+                scope.endFilterError = true;
+              }
+            }
+          }else if(scope.startFilter){
+            scope.endFilterError = false;
+            if(scope.startFilter.length == 16){
+              if(!validateDateFormat(scope.startFilter)){
+                executeFilter = false;
+                scope.startFilterError = true;
+              }else{
+                start = changeDateFormat(scope.startFilter);
+                var filterStartDate = new Date(start);
+                if(filterStartDate < nominalStartDate){
+                  executeFilter = false;
+                  scope.startAfterNominalError = true;
+                }else if(filterStartDate > nominalEndDate){
+                  executeFilter = false;
+                  scope.startBeforeNominalError = true;
+                }else{
+                  executeFilter = true;
+                }
+              }
+            }else{
+              scope.startFilterError = true;
+            }
+          }else if(scope.endFilter){
+            scope.startFilterError = false;
+            if(scope.endFilter.length == 16){
+              if(!validateDateFormat(scope.endFilter)){
+                executeFilter = false;
+                scope.endFilterError = true;
+              }else{
+                end = changeDateFormat(scope.endFilter);
+                var filterEndDate = new Date(end);
+                if(filterEndDate < nominalStartDate){
+                  executeFilter = false;
+                  scope.endAfterNominalError = true;
+                }else if(filterEndDate > nominalEndDate){
+                  executeFilter = false;
+                  scope.endBeforeNominalError = true;
+                }else{
+                  executeFilter = true;
+                }
+              }
+            }else{
+              scope.endFilterError = true;
+            }
+          }else{
+            executeFilter = true;
+          }
+
+          if(executeFilter){
+            var sortOrder = "";
+            if(orderBy){
+              if(orderBy === "startTime"){
+                if(scope.startSortOrder === "desc"){
+                  scope.startSortOrder = "asc";
+                }else{
+                  scope.startSortOrder = "desc";
+                }
+                sortOrder = scope.startSortOrder;
+              }else if(orderBy === "endTime"){
+                if(scope.endSortOrder === "desc"){
+                  scope.endSortOrder = "asc";
+                }else{
+                  scope.endSortOrder = "desc";
+                }
+                sortOrder = scope.endSortOrder;
+              }else if(orderBy === "status"){
+                if(scope.statusSortOrder === "desc"){
+                  scope.statusSortOrder = "asc";
+                }else{
+                  scope.statusSortOrder = "desc";
+                }
+                sortOrder = scope.statusSortOrder;
+              }
+            }else{
+              orderBy = "startTime";
+              sortOrder = "desc";
+            }
+
+            if(!start){
+              start = scope.start;
+            }
+            if(!end){
+              end = scope.end;
+            }
+
+            scope.$parent.refreshInstanceList(scope.type, scope.name, start, end, scope.statusFilter, orderBy, sortOrder);
+          }
+        }
+
+        var addOneMin = function(time){
+          var newtime = parseInt(time.substring(time.length-3, time.length-1));
+          if(newtime === 59){
+            newtime = 0;
+          }else{
+            newtime++;
+          }
+          if(newtime < 10){
+            newtime = "0"+newtime;
+          }
+          return time.substring(0, time.length-3) + newtime + "Z";
+        }
+
+      }
+    };
+  }]);
+
+})();
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/directives/lineage-graph.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/directives/lineage-graph.js b/falcon-ui/app/js/directives/lineage-graph.js
new file mode 100644
index 0000000..883d2a7
--- /dev/null
+++ b/falcon-ui/app/js/directives/lineage-graph.js
@@ -0,0 +1,288 @@
+/**
+ * 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.
+ */
+(function () {
+  'use strict';
+
+	var entitiesListModule = angular.module('app.directives.lineage-graph', ['app.services' ]);
+
+  entitiesListModule.controller('LineageGraphCtrl', ['$scope', 'Falcon', 'X2jsService', '$window', 'EncodeService',
+                                      function($scope, Falcon, X2jsService, $window, encodeService) {
+  }]);
+
+  entitiesListModule.directive('lineageGraph', ["$timeout", 'Falcon', '$filter', function($timeout, Falcon, $filter) {
+    return {
+      scope: {
+        type: "=",
+        name: "=",
+        instance: "=",
+        start: "=",
+        end: "="
+      },
+      controller: 'LineageGraphCtrl',
+      restrict: "EA",
+      templateUrl: 'html/directives/lineageGraphDv.html',
+      link: function (scope, element) {
+
+        var CIRCLE_RADIUS = 12, RANK_SEPARATION = 120, LABEL_WIDTH = 120, LABEL_HEIGHT = 80, LABEL_PADDING = 20;
+        var PREFIX = '/api/graphs/lineage';
+
+        var data = {
+          queue : {},
+          nodes : {},
+          edges : {},
+          active_node_id : null
+        };
+
+        function process_queue(done_cb) {
+          var q = data.queue;
+          if (q.length === 0) {
+            done_cb();
+            return;
+          }
+
+          function filter_node(n) {
+            return n.type === 'process-instance' || n.type === 'feed-instance';
+          }
+
+          function is_nonterminal_label(e) {
+            return e._label === 'input' || e._label === 'output';
+          }
+
+          function visit_neighbor(p) {
+            var vid = p.id, depth = p.depth;
+            if (depth === 0) {
+              process_queue(done_cb);
+              return;
+            }
+
+            Falcon.logRequest();
+            Falcon.getInstanceVerticesDirection(vid, 'both')
+                .success(function (resp) {
+                  Falcon.logResponse('success', resp, false, true);
+                  for (var i = 0; i < resp.results.length; ++i) {
+                    var n = resp.results[i];
+                    if (data.nodes[n._id] !== undefined || !filter_node(n)) {
+                      continue;
+                    }
+                    data.nodes[n._id] = n;
+                    q.push({'id': n._id, 'depth': depth - 1});
+                  }
+                })
+                .error(function (err) {
+                  Falcon.logResponse('error', err, false, true);
+                })
+                .finally(function () {
+                  process_queue(done_cb);
+                });
+          }
+
+          var v = data.queue.pop();
+
+          Falcon.logRequest();
+          Falcon.getInstanceVerticesDirection(v.id, 'bothE')
+              .success(function (resp) {
+                Falcon.logResponse('success', resp, false, true);
+                var terminal_has_in_edge = false, terminal_has_out_edge = false;
+                var node = data.nodes[v.id];
+                for (var i = 0; i < resp.results.length; ++i) {
+                  var e = resp.results[i];
+                  if (is_nonterminal_label(e)) {
+                    terminal_has_in_edge = terminal_has_in_edge || e._inV === v.id;
+                    terminal_has_out_edge = terminal_has_out_edge || e._outV === v.id;
+                  }
+                  if (data.edges[e._id] !== undefined) {
+                    continue;
+                  }
+                  data.edges[e._id] = e;
+                }
+                node.is_terminal = !(terminal_has_in_edge && terminal_has_out_edge);
+              })
+              .error(function (err) {
+                Falcon.logResponse('error', err, false, true);
+              })
+              .finally(function () {
+                visit_neighbor(v);
+              });
+        }
+
+        function draw_graph() {
+          var svg = d3.select('#lineage-graph').html('').append('svg:g');
+
+          var LINE_FUNCTION = d3.svg.line()
+              .x(function(d) { return d.x; })
+              .y(function(d) { return d.y; })
+              .interpolate('basis');
+
+          function draw_node_functor(node_map) {
+            function expand_node(d) {
+              return function() {
+                data.queue.push({'id': d._id, 'depth': 1});
+                update_graph();
+              };
+            }
+
+            function show_info_functor(d) {
+              return function() {
+                svg.selectAll('.lineage-node').classed('lineage-node-active', false);
+                d3.select(this).classed('lineage-node-active', true);
+                data.active_node_id = d._id;
+                Falcon.logRequest();
+                Falcon.getInstanceVerticesProps(d._id)
+                    .success(function (resp) {
+                      Falcon.logResponse('success', resp, false, true);
+                        $('#lineage-info-panel').html(resp);
+                    })
+                    .error(function (err) {
+                      Falcon.logResponse('error', err, false, true);
+                    });
+              };
+            }
+
+            return function(id, d) {
+              var data = node_map[id];
+              var r = svg.append('g')
+                  .attr('transform', 'translate(' + d.x + ',' + d.y + ')');
+
+              var c = r.append('circle')
+                  .attr('data-node-id', id)
+                  .attr('class', 'lineage-node lineage-node-' + data.type)
+                  .attr('r', CIRCLE_RADIUS)
+                  .on('click', show_info_functor(data));
+
+              if (!data.is_terminal) {
+                c.on('dblclick', expand_node(data));
+              } else {
+                c.classed('lineage-node-terminal', true);
+              }
+
+              var name = node_map[id].name;
+              r.append('title').text(name);
+
+              var fo = r.append('foreignObject')
+                  .attr('transform', 'translate(' + (-LABEL_WIDTH / 2) + ', ' + LABEL_PADDING + ' )')
+                  .attr('width', LABEL_WIDTH)
+                  .attr('height', LABEL_HEIGHT);
+
+              fo.append('xhtml:div').text(name)
+                  .attr('class', 'lineage-node-text');
+            };
+          }
+
+          function draw_edge(layout) {
+            return function(e, u, v, value) {
+              var r = svg.append('g').attr('class', 'lineage-link');
+              r.append('path')
+                  .attr('marker-end', 'url(#arrowhead)')
+                  .attr('d', function() {
+                    var points = value.points;
+
+                    var source = layout.node(u);
+                    var target = layout.node(v);
+
+                    var p = points.length === 0 ? source : points[points.length - 1];
+
+                    var r = CIRCLE_RADIUS;
+                    var sx = p.x, sy = p.y, tx = target.x, ty = target.y;
+                    var l = Math.sqrt((tx - sx) * (tx - sx) + (ty - sy) * (ty - sy));
+                    var dx = r / l * (tx - sx), dy = r / l * (ty - sy);
+
+                    points.unshift({'x': source.x, 'y': source.y});
+                    points.push({'x': target.x - dx, 'y': target.y - dy});
+                    return LINE_FUNCTION(points);
+                  });
+            };
+          }
+
+          var node_map = {};
+          var g = new dagre.Digraph();
+          for (var k in data.nodes) {
+            var n = data.nodes[k];
+            g.addNode(n._id, { 'width': CIRCLE_RADIUS * 2 + LABEL_WIDTH, 'height': CIRCLE_RADIUS * 2 + LABEL_HEIGHT});
+            node_map[n._id] = n;
+          }
+
+          for (var k in data.edges) {
+            var e = data.edges[k];
+            var src = node_map[e._inV], dst = node_map[e._outV];
+            if (src !== undefined && dst !== undefined) {
+              g.addEdge(null, e._outV, e._inV);
+            }
+          }
+
+          var layout = dagre.layout().rankSep(RANK_SEPARATION).rankDir('LR').run(g);
+          layout.eachEdge(draw_edge(layout));
+          layout.eachNode(draw_node_functor(node_map));
+
+          function post_render() {
+            svg
+                .append('svg:defs')
+                .append('svg:marker')
+                .attr('id', 'arrowhead')
+                .attr('viewBox', '0 0 10 10')
+                .attr('refX', 8)
+                .attr('refY', 5)
+                .attr('markerUnits', 'strokeWidth')
+                .attr('markerWidth', 8)
+                .attr('markerHeight', 5)
+                .attr('orient', 'auto')
+                .attr('style', 'fill: #ccc')
+                .append('svg:path')
+                .attr('d', 'M 0 0 L 10 5 L 0 10 z');
+          }
+
+          var bb = layout.graph();
+          $('#lineage-graph').attr('width', bb.width);
+          //$('#lineage-graph').attr('width', '100%');
+          $('#lineage-graph').attr('height', bb.height);
+          post_render();
+        }
+
+        function update_graph() {
+          process_queue(function() {
+            draw_graph();
+            var id = data.active_node_id;
+            if (id !== null) {
+              d3.select('.node[data-node-id="' + id + '"]').classed('node-active', true);
+            }
+          });
+        }
+
+        var loadLineageGraph = function(entityId, instance_name) {
+          var node_name = entityId + '/' + instance_name;
+          Falcon.logRequest();
+          Falcon.getInstanceVertices(node_name)
+              .success(function (resp) {
+                Falcon.logResponse('success', resp, false, true);
+                var n = resp.results[0];
+                data.queue = [{'id': n._id, 'depth': 1}];
+                data.nodes = {};
+                data.nodes[n._id] = n;
+                update_graph();
+              })
+              .error(function (err) {
+                Falcon.logResponse('error', err, false, true);
+              });
+        };
+
+        loadLineageGraph(scope.name, scope.instance);
+
+      }
+    };
+  }]);
+
+})();
\ No newline at end of file


[05/22] falcon git commit: FALCON-1315 Update falcon ui for HiveDR, secure clusters and bug fixes. Contributed by Armando Reyna/Venkat Ranganathan.

Posted by so...@apache.org.
http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/lib/dust-full-2.0.0.min.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/lib/dust-full-2.0.0.min.js b/falcon-ui/app/js/lib/dust-full-2.0.0.min.js
new file mode 100644
index 0000000..df14526
--- /dev/null
+++ b/falcon-ui/app/js/lib/dust-full-2.0.0.min.js
@@ -0,0 +1,3209 @@
+//
+// Dust - Asynchronous Templating v0.3.0
+// http://akdubya.github.com/dustjs
+//
+// Copyright (c) 2010, Aleksander Williams
+// Released under the MIT License.
+//
+
+var dust = {};
+
+(function(dust) {
+
+  dust.cache = {};
+
+  dust.register = function(name, tmpl) {
+    if (!name) return;
+    dust.cache[name] = tmpl;
+  };
+
+  dust.render = function(name, context, callback) {
+    var chunk = new Stub(callback).head;
+    dust.load(name, chunk, Context.wrap(context)).end();
+  };
+
+  dust.stream = function(name, context) {
+    var stream = new Stream();
+    dust.nextTick(function() {
+      dust.load(name, stream.head, Context.wrap(context)).end();
+    });
+    return stream;
+  };
+
+  dust.renderSource = function(source, context, callback) {
+    return dust.compileFn(source)(context, callback);
+  };
+
+  dust.compileFn = function(source, name) {
+    var tmpl = dust.loadSource(dust.compile(source, name));
+    return function(context, callback) {
+      var master = callback ? new Stub(callback) : new Stream();
+      dust.nextTick(function() {
+        tmpl(master.head, Context.wrap(context)).end();
+      });
+      return master;
+    }
+  };
+
+  dust.load = function(name, chunk, context) {
+    var tmpl = dust.cache[name];
+    if (tmpl) {
+      return tmpl(chunk, context);
+    } else {
+      if (dust.onLoad) {
+        return chunk.map(function(chunk) {
+          dust.onLoad(name, function(err, src) {
+            if (err) return chunk.setError(err);
+            if (!dust.cache[name]) dust.loadSource(dust.compile(src, name));
+            dust.cache[name](chunk, context).end();
+          });
+        });
+      }
+      return chunk.setError(new Error("Template Not Found: " + name));
+    }
+  };
+
+  dust.loadSource = function(source, path) {
+    return eval(source);
+  };
+
+  if (Array.isArray) {
+    dust.isArray = Array.isArray;
+  } else {
+    dust.isArray = function(arr) {
+      return Object.prototype.toString.call(arr) == "[object Array]";
+    };
+  }
+
+  dust.nextTick = function(callback) {
+    setTimeout(callback, 0);
+  }
+
+  dust.isEmpty = function(value) {
+    if (dust.isArray(value) && !value.length) return true;
+    if (value === 0) return false;
+    return (!value);
+  };
+
+  dust.filter = function(string, auto, filters) {
+    if (filters) {
+      for (var i=0, len=filters.length; i<len; i++) {
+        var name = filters[i];
+        if (name === "s") {
+          auto = null;
+        } else {
+          string = dust.filters[name](string);
+        }
+      }
+    }
+    if (auto) {
+      string = dust.filters[auto](string);
+    }
+    return string;
+  };
+
+  dust.filters = {
+    h: function(value) { return dust.escapeHtml(value); },
+    j: function(value) { return dust.escapeJs(value); },
+    u: encodeURI,
+    uc: encodeURIComponent
+  }
+
+  function Context(stack, global, blocks) {
+    this.stack  = stack;
+    this.global = global;
+    this.blocks = blocks;
+  }
+
+  dust.makeBase = function(global) {
+    return new Context(new Stack(), global);
+  }
+
+  Context.wrap = function(context) {
+    if (context instanceof Context) {
+      return context;
+    }
+    return new Context(new Stack(context));
+  }
+
+  Context.prototype.get = function(key) {
+    var ctx = this.stack, value;
+
+    while(ctx) {
+      if (ctx.isObject) {
+        value = ctx.head[key];
+        if (!(value === undefined)) {
+          return value;
+        }
+      }
+      ctx = ctx.tail;
+    }
+    return this.global ? this.global[key] : undefined;
+  };
+
+  Context.prototype.getPath = function(cur, down) {
+    var ctx = this.stack,
+        len = down.length;
+
+    if (cur && len === 0) return ctx.head;
+    if (!ctx.isObject) return undefined;
+    ctx = ctx.head;
+    var i = 0;
+    while(ctx && i < len) {
+      ctx = ctx[down[i]];
+      i++;
+    }
+    return ctx;
+  };
+
+  Context.prototype.push = function(head, idx, len) {
+    return new Context(new Stack(head, this.stack, idx, len), this.global, this.blocks);
+  };
+
+  Context.prototype.rebase = function(head) {
+    return new Context(new Stack(head), this.global, this.blocks);
+  };
+
+  Context.prototype.current = function() {
+    return this.stack.head;
+  };
+
+  Context.prototype.getBlock = function(key) {
+    var blocks = this.blocks;
+
+    if (!blocks) return;
+    var len = blocks.length, fn;
+    while (len--) {
+      fn = blocks[len][key];
+      if (fn) return fn;
+    }
+  }
+
+  Context.prototype.shiftBlocks = function(locals) {
+    var blocks = this.blocks;
+
+    if (locals) {
+      if (!blocks) {
+        newBlocks = [locals];
+      } else {
+        newBlocks = blocks.concat([locals]);
+      }
+      return new Context(this.stack, this.global, newBlocks);
+    }
+    return this;
+  }
+
+  function Stack(head, tail, idx, len) {
+    this.tail = tail;
+    this.isObject = !dust.isArray(head) && head && typeof head === "object";
+    this.head = head;
+    this.index = idx;
+    this.of = len;
+  }
+
+  function Stub(callback) {
+    this.head = new Chunk(this);
+    this.callback = callback;
+    this.out = '';
+  }
+
+  Stub.prototype.flush = function() {
+    var chunk = this.head;
+
+    while (chunk) {
+      if (chunk.flushable) {
+        this.out += chunk.data;
+      } else if (chunk.error) {
+        this.callback(chunk.error);
+        this.flush = function() {};
+        return;
+      } else {
+        return;
+      }
+      chunk = chunk.next;
+      this.head = chunk;
+    }
+    this.callback(null, this.out);
+  }
+
+  function Stream() {
+    this.head = new Chunk(this);
+  }
+
+  Stream.prototype.flush = function() {
+    var chunk = this.head;
+
+    while(chunk) {
+      if (chunk.flushable) {
+        this.emit('data', chunk.data);
+      } else if (chunk.error) {
+        this.emit('error', chunk.error);
+        this.flush = function() {};
+        return;
+      } else {
+        return;
+      }
+      chunk = chunk.next;
+      this.head = chunk;
+    }
+    this.emit('end');
+  }
+
+  Stream.prototype.emit = function(type, data) {
+    var events = this.events;
+
+    if (events && events[type]) {
+      events[type](data);
+    }
+  }
+
+  Stream.prototype.on = function(type, callback) {
+    if (!this.events) {
+      this.events = {};
+    }
+    this.events[type] = callback;
+    return this;
+  }
+
+  function Chunk(root, next, taps) {
+    this.root = root;
+    this.next = next;
+    this.data = '';
+    this.flushable = false;
+    this.taps = taps;
+  }
+
+  Chunk.prototype.write = function(data) {
+    var taps  = this.taps;
+
+    if (taps) {
+      data = taps.go(data);
+    }
+    this.data += data;
+    return this;
+  }
+
+  Chunk.prototype.end = function(data) {
+    if (data) {
+      this.write(data);
+    }
+    this.flushable = true;
+    this.root.flush();
+    return this;
+  }
+
+  Chunk.prototype.map = function(callback) {
+    var cursor = new Chunk(this.root, this.next, this.taps),
+        branch = new Chunk(this.root, cursor, this.taps);
+
+    this.next = branch;
+    this.flushable = true;
+    callback(branch);
+    return cursor;
+  }
+
+  Chunk.prototype.tap = function(tap) {
+    var taps = this.taps;
+
+    if (taps) {
+      this.taps = taps.push(tap);
+    } else {
+      this.taps = new Tap(tap);
+    }
+    return this;
+  }
+
+  Chunk.prototype.untap = function() {
+    this.taps = this.taps.tail;
+    return this;
+  }
+
+  Chunk.prototype.render = function(body, context) {
+    return body(this, context);
+  }
+
+  Chunk.prototype.reference = function(elem, context, auto, filters) {
+    if (typeof elem === "function") {
+      elem = elem(this, context, null, {auto: auto, filters: filters});
+      if (elem instanceof Chunk) {
+        return elem;
+      }
+    }
+    if (!dust.isEmpty(elem)) {
+      return this.write(dust.filter(elem, auto, filters));
+    } else {
+      return this;
+    }
+  };
+
+  Chunk.prototype.section = function(elem, context, bodies, params) {
+    if (typeof elem === "function") {
+      elem = elem(this, context, bodies, params);
+      if (elem instanceof Chunk) {
+        return elem;
+      }
+    }
+
+    var body = bodies.block,
+        skip = bodies['else'];
+
+    if (params) {
+      context = context.push(params);
+    }
+
+    if (dust.isArray(elem)) {
+      if (body) {
+        var len = elem.length, chunk = this;
+        for (var i=0; i<len; i++) {
+          chunk = body(chunk, context.push(elem[i], i, len));
+        }
+        return chunk;
+      }
+    } else if (elem === true) {
+      if (body) return body(this, context);
+    } else if (elem || elem === 0) {
+      if (body) return body(this, context.push(elem));
+    } else if (skip) {
+      return skip(this, context);
+    }
+    return this;
+  };
+
+  Chunk.prototype.exists = function(elem, context, bodies) {
+    var body = bodies.block,
+        skip = bodies['else'];
+
+    if (!dust.isEmpty(elem)) {
+      if (body) return body(this, context);
+    } else if (skip) {
+      return skip(this, context);
+    }
+    return this;
+  }
+
+  Chunk.prototype.notexists = function(elem, context, bodies) {
+    var body = bodies.block,
+        skip = bodies['else'];
+
+    if (dust.isEmpty(elem)) {
+      if (body) return body(this, context);
+    } else if (skip) {
+      return skip(this, context);
+    }
+    return this;
+  }
+
+  Chunk.prototype.block = function(elem, context, bodies) {
+    var body = bodies.block;
+
+    if (elem) {
+      body = elem;
+    }
+
+    if (body) {
+      return body(this, context);
+    }
+    return this;
+  };
+
+  Chunk.prototype.partial = function(elem, context) {
+    if (typeof elem === "function") {
+      return this.capture(elem, context, function(name, chunk) {
+        dust.load(name, chunk, context).end();
+      });
+    }
+    return dust.load(elem, this, context);
+  };
+
+  Chunk.prototype.helper = function(name, context, bodies, params) {
+    return dust.helpers[name](this, context, bodies, params);
+  };
+
+  Chunk.prototype.capture = function(body, context, callback) {
+    return this.map(function(chunk) {
+      var stub = new Stub(function(err, out) {
+        if (err) {
+          chunk.setError(err);
+        } else {
+          callback(out, chunk);
+        }
+      });
+      body(stub.head, context).end();
+    });
+  };
+
+  Chunk.prototype.setError = function(err) {
+    this.error = err;
+    this.root.flush();
+    return this;
+  };
+
+  dust.helpers = {
+    sep: function(chunk, context, bodies) {
+      if (context.stack.index === context.stack.of - 1) {
+        return chunk;
+      }
+      return bodies.block(chunk, context);
+    },
+
+    idx: function(chunk, context, bodies) {
+      return bodies.block(chunk, context.push(context.stack.index));
+    }
+  }
+
+  function Tap(head, tail) {
+    this.head = head;
+    this.tail = tail;
+  }
+
+  Tap.prototype.push = function(tap) {
+    return new Tap(tap, this);
+  };
+
+  Tap.prototype.go = function(value) {
+    var tap = this;
+
+    while(tap) {
+      value = tap.head(value);
+      tap = tap.tail;
+    }
+    return value;
+  };
+
+  var HCHARS = new RegExp(/[&<>\"]/),
+      AMP    = /&/g,
+      LT     = /</g,
+      GT     = />/g,
+      QUOT   = /\"/g;
+
+  dust.escapeHtml = function(s) {
+    if (typeof s === "string") {
+      if (!HCHARS.test(s)) {
+        return s;
+      }
+      return s.replace(AMP,'&amp;').replace(LT,'&lt;').replace(GT,'&gt;').replace(QUOT,'&quot;');
+    }
+    return s;
+  };
+
+  var BS = /\\/g,
+      CR = /\r/g,
+      LS = /\u2028/g,
+      PS = /\u2029/g,
+      NL = /\n/g,
+      LF = /\f/g,
+      SQ = /'/g,
+      DQ = /"/g,
+      TB = /\t/g;
+
+  dust.escapeJs = function(s) {
+    if (typeof s === "string") {
+      return s
+          .replace(BS, '\\\\')
+          .replace(DQ, '\\"')
+          .replace(SQ, "\\'")
+          .replace(CR, '\\r')
+          .replace(LS, '\\u2028')
+          .replace(PS, '\\u2029')
+          .replace(NL, '\\n')
+          .replace(LF, '\\f')
+          .replace(TB, "\\t");
+    }
+    return s;
+  };
+
+})(dust);
+
+if (typeof exports !== "undefined") {
+  if (typeof process !== "undefined") {
+    require('./server')(dust);
+  }
+  module.exports = dust;
+}
+(function(dust) {
+
+  dust.compile = function(source, name) {
+    var ast = filterAST(dust.parse(source));
+    return compile(ast, name);
+  };
+
+  function filterAST(ast) {
+    var context = {};
+    return dust.filterNode(context, ast);
+  }
+
+  dust.filterNode = function(context, node) {
+    return dust.optimizers[node[0]](context, node);
+  }
+
+  dust.optimizers = {
+    body:      compactBuffers,
+    buffer:    noop,
+    special:   convertSpecial,
+    format:    nullify,        // TODO: convert format
+    reference: visit,
+    "#":       visit,
+    "?":       visit,
+    "^":       visit,
+    "<":       visit,
+    "+":       visit,
+    "@":       visit,
+    "%":       visit,
+    partial:   visit,
+    context:   visit,
+    params:    visit,
+    bodies:    visit,
+    param:     visit,
+    filters:   noop,
+    key:       noop,
+    path:      noop,
+    literal:   noop,
+    comment:   nullify
+  }
+
+  dust.pragmas = {
+    esc: function(compiler, context, bodies, params) {
+      var old = compiler.auto;
+      if (!context) context = 'h';
+      compiler.auto = (context === 's') ? '' : context;
+      var out = compileParts(compiler, bodies.block);
+      compiler.auto = old;
+      return out;
+    }
+  }
+
+  function visit(context, node) {
+    var out = [node[0]];
+    for (var i=1, len=node.length; i<len; i++) {
+      var res = dust.filterNode(context, node[i]);
+      if (res) out.push(res);
+    }
+    return out;
+  }
+
+// Compacts consecutive buffer nodes into a single node
+  function compactBuffers(context, node) {
+    var out = [node[0]], memo;
+    for (var i=1, len=node.length; i<len; i++) {
+      var res = dust.filterNode(context, node[i]);
+      if (res) {
+        if (res[0] === 'buffer') {
+          if (memo) {
+            memo[1] += res[1];
+          } else {
+            memo = res;
+            out.push(res);
+          }
+        } else {
+          memo = null;
+          out.push(res);
+        }
+      }
+    }
+    return out;
+  }
+
+  var specialChars = {
+    "s": " ",
+    "n": "\n",
+    "r": "\r",
+    "lb": "{",
+    "rb": "}"
+  };
+
+  function convertSpecial(context, node) { return ['buffer', specialChars[node[1]]] }
+  function noop(context, node) { return node }
+  function nullify(){}
+
+  function compile(ast, name) {
+    var context = {
+      name: name,
+      bodies: [],
+      blocks: {},
+      index: 0,
+      auto: "h"
+    }
+
+    return "(function(){dust.register("
+        + (name ? "\"" + name + "\"" : "null") + ","
+        + dust.compileNode(context, ast)
+        + ");"
+        + compileBlocks(context)
+        + compileBodies(context)
+        + "return body_0;"
+        + "})();";
+  }
+
+  function compileBlocks(context) {
+    var out = [],
+        blocks = context.blocks;
+
+    for (var name in blocks) {
+      out.push(name + ":" + blocks[name]);
+    }
+    if (out.length) {
+      context.blocks = "ctx=ctx.shiftBlocks(blocks);";
+      return "var blocks={" + out.join(',') + "};";
+    }
+    return context.blocks = "";
+  }
+
+  function compileBodies(context) {
+    var out = [],
+        bodies = context.bodies,
+        blx = context.blocks;
+
+    for (var i=0, len=bodies.length; i<len; i++) {
+      out[i] = "function body_" + i + "(chk,ctx){"
+      + blx + "return chk" + bodies[i] + ";}";
+    }
+    return out.join('');
+  }
+
+  function compileParts(context, body) {
+    var parts = '';
+    for (var i=1, len=body.length; i<len; i++) {
+      parts += dust.compileNode(context, body[i]);
+    }
+    return parts;
+  }
+
+  dust.compileNode = function(context, node) {
+    return dust.nodes[node[0]](context, node);
+  }
+
+  dust.nodes = {
+    body: function(context, node) {
+      var id = context.index++, name = "body_" + id;
+      context.bodies[id] = compileParts(context, node);
+      return name;
+    },
+
+    buffer: function(context, node) {
+      return ".write(" + escape(node[1]) + ")";
+    },
+
+    format: function(context, node) {
+      return ".write(" + escape(node[1] + node[2]) + ")";
+    },
+
+    reference: function(context, node) {
+      return ".reference(" + dust.compileNode(context, node[1])
+          + ",ctx," + dust.compileNode(context, node[2]) + ")";
+    },
+
+    "#": function(context, node) {
+      return compileSection(context, node, "section");
+    },
+
+    "?": function(context, node) {
+      return compileSection(context, node, "exists");
+    },
+
+    "^": function(context, node) {
+      return compileSection(context, node, "notexists");
+    },
+
+    "<": function(context, node) {
+      var bodies = node[4];
+      for (var i=1, len=bodies.length; i<len; i++) {
+        var param = bodies[i],
+            type = param[1][1];
+        if (type === "block") {
+          context.blocks[node[1].text] = dust.compileNode(context, param[2]);
+          return '';
+        }
+      }
+      return '';
+    },
+
+    "+": function(context, node) {
+      return ".block(ctx.getBlock("
+          + escape(node[1].text)
+          + ")," + dust.compileNode(context, node[2]) + ","
+          + dust.compileNode(context, node[4]) + ","
+          + dust.compileNode(context, node[3])
+          + ")";
+    },
+
+    "@": function(context, node) {
+      return ".helper("
+          + escape(node[1].text)
+          + "," + dust.compileNode(context, node[2]) + ","
+          + dust.compileNode(context, node[4]) + ","
+          + dust.compileNode(context, node[3])
+          + ")";
+    },
+
+    "%": function(context, node) {
+      // TODO: Move these hacks into pragma precompiler
+      var name = node[1][1];
+      if (!dust.pragmas[name]) return '';
+
+      var rawBodies = node[4];
+      var bodies = {};
+      for (var i=1, len=rawBodies.length; i<len; i++) {
+        var b = rawBodies[i];
+        bodies[b[1][1]] = b[2];
+      }
+
+      var rawParams = node[3];
+      var params = {};
+      for (var i=1, len=rawParams.length; i<len; i++) {
+        var p = rawParams[i];
+        params[p[1][1]] = p[2][1];
+      }
+
+      var ctx = node[2][1] ? node[2][1].text : null;
+
+      return dust.pragmas[name](context, ctx, bodies, params);
+    },
+
+    partial: function(context, node) {
+      return ".partial("
+          + dust.compileNode(context, node[1])
+          + "," + dust.compileNode(context, node[2]) + ")";
+    },
+
+    context: function(context, node) {
+      if (node[1]) {
+        return "ctx.rebase(" + dust.compileNode(context, node[1]) + ")";
+      }
+      return "ctx";
+    },
+
+    params: function(context, node) {
+      var out = [];
+      for (var i=1, len=node.length; i<len; i++) {
+        out.push(dust.compileNode(context, node[i]));
+      }
+      if (out.length) {
+        return "{" + out.join(',') + "}";
+      }
+      return "null";
+    },
+
+    bodies: function(context, node) {
+      var out = [];
+      for (var i=1, len=node.length; i<len; i++) {
+        out.push(dust.compileNode(context, node[i]));
+      }
+      return "{" + out.join(',') + "}";
+    },
+
+    param: function(context, node) {
+      return dust.compileNode(context, node[1]) + ":" + dust.compileNode(context, node[2]);
+    },
+
+    filters: function(context, node) {
+      var list = [];
+      for (var i=1, len=node.length; i<len; i++) {
+        var filter = node[i];
+        list.push("\"" + filter + "\"");
+      }
+      return "\"" + context.auto + "\""
+          + (list.length ? ",[" + list.join(',') + "]" : '');
+    },
+
+    key: function(context, node) {
+      return "ctx.get(\"" + node[1] + "\")";
+    },
+
+    path: function(context, node) {
+      var current = node[1],
+          keys = node[2],
+          list = [];
+
+      for (var i=0,len=keys.length; i<len; i++) {
+        list.push("\"" + keys[i] + "\"");
+      }
+      return "ctx.getPath(" + current + ",[" + list.join(',') + "])";
+    },
+
+    literal: function(context, node) {
+      return escape(node[1]);
+    }
+  }
+
+  function compileSection(context, node, cmd) {
+    return "." + cmd + "("
+        + dust.compileNode(context, node[1])
+        + "," + dust.compileNode(context, node[2]) + ","
+        + dust.compileNode(context, node[4]) + ","
+        + dust.compileNode(context, node[3])
+        + ")";
+  }
+
+  var escape = (typeof JSON === "undefined")
+      ? function(str) { return "\"" + dust.escapeJs(str) + "\"" }
+      : JSON.stringify;
+
+})(typeof exports !== 'undefined' ? exports : window.dust);
+(function(dust){
+
+  var parser = (function(){
+    /* Generated by PEG.js (http://pegjs.majda.cz/). */
+
+    var result = {
+      /*
+       * Parses the input with a generated parser. If the parsing is successfull,
+       * returns a value explicitly or implicitly specified by the grammar from
+       * which the parser was generated (see |PEG.buildParser|). If the parsing is
+       * unsuccessful, throws |PEG.parser.SyntaxError| describing the error.
+       */
+      parse: function(input) {
+        var pos = 0;
+        var reportMatchFailures = true;
+        var rightmostMatchFailuresPos = 0;
+        var rightmostMatchFailuresExpected = [];
+        var cache = {};
+
+        function padLeft(input, padding, length) {
+          var result = input;
+
+          var padLength = length - input.length;
+          for (var i = 0; i < padLength; i++) {
+            result = padding + result;
+          }
+
+          return result;
+        }
+
+        function escape(ch) {
+          var charCode = ch.charCodeAt(0);
+
+          if (charCode < 0xFF) {
+            var escapeChar = 'x';
+            var length = 2;
+          } else {
+            var escapeChar = 'u';
+            var length = 4;
+          }
+
+          return '\\' + escapeChar + padLeft(charCode.toString(16).toUpperCase(), '0', length);
+        }
+
+        function quote(s) {
+          /*
+           * ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a
+           * string literal except for the closing quote character, backslash,
+           * carriage return, line separator, paragraph separator, and line feed.
+           * Any character may appear in the form of an escape sequence.
+           */
+          return '"' + s
+                  .replace(/\\/g, '\\\\')            // backslash
+                  .replace(/"/g, '\\"')              // closing quote character
+                  .replace(/\r/g, '\\r')             // carriage return
+                  .replace(/\n/g, '\\n')             // line feed
+                  .replace(/[\x80-\uFFFF]/g, escape) // non-ASCII characters
+              + '"';
+        }
+
+        function matchFailed(failure) {
+          if (pos < rightmostMatchFailuresPos) {
+            return;
+          }
+
+          if (pos > rightmostMatchFailuresPos) {
+            rightmostMatchFailuresPos = pos;
+            rightmostMatchFailuresExpected = [];
+          }
+
+          rightmostMatchFailuresExpected.push(failure);
+        }
+
+        function parse_body() {
+          var cacheKey = "body" + '@' + pos;
+          var cachedResult = cache[cacheKey];
+          if (cachedResult) {
+            pos = cachedResult.nextPos;
+            return cachedResult.result;
+          }
+
+
+          var result1 = [];
+          var result2 = parse_part();
+          while (result2 !== null) {
+            result1.push(result2);
+            var result2 = parse_part();
+          }
+          var result0 = result1 !== null
+              ? (function(p) { return ["body"].concat(p) })(result1)
+              : null;
+
+
+
+          cache[cacheKey] = {
+            nextPos: pos,
+            result:  result0
+          };
+          return result0;
+        }
+
+        function parse_part() {
+          var cacheKey = "part" + '@' + pos;
+          var cachedResult = cache[cacheKey];
+          if (cachedResult) {
+            pos = cachedResult.nextPos;
+            return cachedResult.result;
+          }
+
+
+          var result6 = parse_comment();
+          if (result6 !== null) {
+            var result0 = result6;
+          } else {
+            var result5 = parse_section();
+            if (result5 !== null) {
+              var result0 = result5;
+            } else {
+              var result4 = parse_partial();
+              if (result4 !== null) {
+                var result0 = result4;
+              } else {
+                var result3 = parse_special();
+                if (result3 !== null) {
+                  var result0 = result3;
+                } else {
+                  var result2 = parse_reference();
+                  if (result2 !== null) {
+                    var result0 = result2;
+                  } else {
+                    var result1 = parse_buffer();
+                    if (result1 !== null) {
+                      var result0 = result1;
+                    } else {
+                      var result0 = null;;
+                    };
+                  };
+                };
+              };
+            };
+          }
+
+
+
+          cache[cacheKey] = {
+            nextPos: pos,
+            result:  result0
+          };
+          return result0;
+        }
+
+        function parse_section() {
+          var cacheKey = "section" + '@' + pos;
+          var cachedResult = cache[cacheKey];
+          if (cachedResult) {
+            pos = cachedResult.nextPos;
+            return cachedResult.result;
+          }
+
+          var savedReportMatchFailures = reportMatchFailures;
+          reportMatchFailures = false;
+          var savedPos1 = pos;
+          var result8 = parse_sec_tag_start();
+          if (result8 !== null) {
+            var result9 = parse_rd();
+            if (result9 !== null) {
+              var result10 = parse_body();
+              if (result10 !== null) {
+                var result11 = parse_bodies();
+                if (result11 !== null) {
+                  var result12 = parse_end_tag();
+                  if (result12 !== null) {
+                    var result13 = (function() {return result8[1].text === result12.text})() ? '' : null;
+                    if (result13 !== null) {
+                      var result7 = [result8, result9, result10, result11, result12, result13];
+                    } else {
+                      var result7 = null;
+                      pos = savedPos1;
+                    }
+                  } else {
+                    var result7 = null;
+                    pos = savedPos1;
+                  }
+                } else {
+                  var result7 = null;
+                  pos = savedPos1;
+                }
+              } else {
+                var result7 = null;
+                pos = savedPos1;
+              }
+            } else {
+              var result7 = null;
+              pos = savedPos1;
+            }
+          } else {
+            var result7 = null;
+            pos = savedPos1;
+          }
+          var result6 = result7 !== null
+              ? (function(t, b, e, n) { e.push(["param", ["literal", "block"], b]); t.push(e); return t })(result7[0], result7[2], result7[3], result7[4])
+              : null;
+          if (result6 !== null) {
+            var result0 = result6;
+          } else {
+            var savedPos0 = pos;
+            var result3 = parse_sec_tag_start();
+            if (result3 !== null) {
+              if (input.substr(pos, 1) === "/") {
+                var result4 = "/";
+                pos += 1;
+              } else {
+                var result4 = null;
+                if (reportMatchFailures) {
+                  matchFailed("\"/\"");
+                }
+              }
+              if (result4 !== null) {
+                var result5 = parse_rd();
+                if (result5 !== null) {
+                  var result2 = [result3, result4, result5];
+                } else {
+                  var result2 = null;
+                  pos = savedPos0;
+                }
+              } else {
+                var result2 = null;
+                pos = savedPos0;
+              }
+            } else {
+              var result2 = null;
+              pos = savedPos0;
+            }
+            var result1 = result2 !== null
+                ? (function(t) { t.push(["bodies"]); return t })(result2[0])
+                : null;
+            if (result1 !== null) {
+              var result0 = result1;
+            } else {
+              var result0 = null;;
+            };
+          }
+          reportMatchFailures = savedReportMatchFailures;
+          if (reportMatchFailures && result0 === null) {
+            matchFailed("section");
+          }
+
+          cache[cacheKey] = {
+            nextPos: pos,
+            result:  result0
+          };
+          return result0;
+        }
+
+        function parse_sec_tag_start() {
+          var cacheKey = "sec_tag_start" + '@' + pos;
+          var cachedResult = cache[cacheKey];
+          if (cachedResult) {
+            pos = cachedResult.nextPos;
+            return cachedResult.result;
+          }
+
+
+          var savedPos0 = pos;
+          var result2 = parse_ld();
+          if (result2 !== null) {
+            if (input.substr(pos).match(/^[#?^<+@%]/) !== null) {
+              var result3 = input.charAt(pos);
+              pos++;
+            } else {
+              var result3 = null;
+              if (reportMatchFailures) {
+                matchFailed("[#?^<+@%]");
+              }
+            }
+            if (result3 !== null) {
+              var result4 = parse_identifier();
+              if (result4 !== null) {
+                var result5 = parse_context();
+                if (result5 !== null) {
+                  var result6 = parse_params();
+                  if (result6 !== null) {
+                    var result1 = [result2, result3, result4, result5, result6];
+                  } else {
+                    var result1 = null;
+                    pos = savedPos0;
+                  }
+                } else {
+                  var result1 = null;
+                  pos = savedPos0;
+                }
+              } else {
+                var result1 = null;
+                pos = savedPos0;
+              }
+            } else {
+              var result1 = null;
+              pos = savedPos0;
+            }
+          } else {
+            var result1 = null;
+            pos = savedPos0;
+          }
+          var result0 = result1 !== null
+              ? (function(t, n, c, p) { return [t, n, c, p] })(result1[1], result1[2], result1[3], result1[4])
+              : null;
+
+
+
+          cache[cacheKey] = {
+            nextPos: pos,
+            result:  result0
+          };
+          return result0;
+        }
+
+        function parse_end_tag() {
+          var cacheKey = "end_tag" + '@' + pos;
+          var cachedResult = cache[cacheKey];
+          if (cachedResult) {
+            pos = cachedResult.nextPos;
+            return cachedResult.result;
+          }
+
+          var savedReportMatchFailures = reportMatchFailures;
+          reportMatchFailures = false;
+          var savedPos0 = pos;
+          var result2 = parse_ld();
+          if (result2 !== null) {
+            if (input.substr(pos, 1) === "/") {
+              var result3 = "/";
+              pos += 1;
+            } else {
+              var result3 = null;
+              if (reportMatchFailures) {
+                matchFailed("\"/\"");
+              }
+            }
+            if (result3 !== null) {
+              var result4 = parse_identifier();
+              if (result4 !== null) {
+                var result5 = parse_rd();
+                if (result5 !== null) {
+                  var result1 = [result2, result3, result4, result5];
+                } else {
+                  var result1 = null;
+                  pos = savedPos0;
+                }
+              } else {
+                var result1 = null;
+                pos = savedPos0;
+              }
+            } else {
+              var result1 = null;
+              pos = savedPos0;
+            }
+          } else {
+            var result1 = null;
+            pos = savedPos0;
+          }
+          var result0 = result1 !== null
+              ? (function(n) { return n })(result1[2])
+              : null;
+          reportMatchFailures = savedReportMatchFailures;
+          if (reportMatchFailures && result0 === null) {
+            matchFailed("end tag");
+          }
+
+          cache[cacheKey] = {
+            nextPos: pos,
+            result:  result0
+          };
+          return result0;
+        }
+
+        function parse_context() {
+          var cacheKey = "context" + '@' + pos;
+          var cachedResult = cache[cacheKey];
+          if (cachedResult) {
+            pos = cachedResult.nextPos;
+            return cachedResult.result;
+          }
+
+
+          var savedPos0 = pos;
+          if (input.substr(pos, 1) === ":") {
+            var result4 = ":";
+            pos += 1;
+          } else {
+            var result4 = null;
+            if (reportMatchFailures) {
+              matchFailed("\":\"");
+            }
+          }
+          if (result4 !== null) {
+            var result5 = parse_identifier();
+            if (result5 !== null) {
+              var result3 = [result4, result5];
+            } else {
+              var result3 = null;
+              pos = savedPos0;
+            }
+          } else {
+            var result3 = null;
+            pos = savedPos0;
+          }
+          var result2 = result3 !== null
+              ? (function(n) {return n})(result3[1])
+              : null;
+          var result1 = result2 !== null ? result2 : '';
+          var result0 = result1 !== null
+              ? (function(n) { return n ? ["context", n] : ["context"] })(result1)
+              : null;
+
+
+
+          cache[cacheKey] = {
+            nextPos: pos,
+            result:  result0
+          };
+          return result0;
+        }
+
+        function parse_params() {
+          var cacheKey = "params" + '@' + pos;
+          var cachedResult = cache[cacheKey];
+          if (cachedResult) {
+            pos = cachedResult.nextPos;
+            return cachedResult.result;
+          }
+
+          var savedReportMatchFailures = reportMatchFailures;
+          reportMatchFailures = false;
+          var result1 = [];
+          var savedPos0 = pos;
+          var result4 = parse_ws();
+          if (result4 !== null) {
+            var result5 = parse_key();
+            if (result5 !== null) {
+              if (input.substr(pos, 1) === "=") {
+                var result6 = "=";
+                pos += 1;
+              } else {
+                var result6 = null;
+                if (reportMatchFailures) {
+                  matchFailed("\"=\"");
+                }
+              }
+              if (result6 !== null) {
+                var result9 = parse_identifier();
+                if (result9 !== null) {
+                  var result7 = result9;
+                } else {
+                  var result8 = parse_inline();
+                  if (result8 !== null) {
+                    var result7 = result8;
+                  } else {
+                    var result7 = null;;
+                  };
+                }
+                if (result7 !== null) {
+                  var result3 = [result4, result5, result6, result7];
+                } else {
+                  var result3 = null;
+                  pos = savedPos0;
+                }
+              } else {
+                var result3 = null;
+                pos = savedPos0;
+              }
+            } else {
+              var result3 = null;
+              pos = savedPos0;
+            }
+          } else {
+            var result3 = null;
+            pos = savedPos0;
+          }
+          var result2 = result3 !== null
+              ? (function(k, v) {return ["param", ["literal", k], v]})(result3[1], result3[3])
+              : null;
+          while (result2 !== null) {
+            result1.push(result2);
+            var savedPos0 = pos;
+            var result4 = parse_ws();
+            if (result4 !== null) {
+              var result5 = parse_key();
+              if (result5 !== null) {
+                if (input.substr(pos, 1) === "=") {
+                  var result6 = "=";
+                  pos += 1;
+                } else {
+                  var result6 = null;
+                  if (reportMatchFailures) {
+                    matchFailed("\"=\"");
+                  }
+                }
+                if (result6 !== null) {
+                  var result9 = parse_identifier();
+                  if (result9 !== null) {
+                    var result7 = result9;
+                  } else {
+                    var result8 = parse_inline();
+                    if (result8 !== null) {
+                      var result7 = result8;
+                    } else {
+                      var result7 = null;;
+                    };
+                  }
+                  if (result7 !== null) {
+                    var result3 = [result4, result5, result6, result7];
+                  } else {
+                    var result3 = null;
+                    pos = savedPos0;
+                  }
+                } else {
+                  var result3 = null;
+                  pos = savedPos0;
+                }
+              } else {
+                var result3 = null;
+                pos = savedPos0;
+              }
+            } else {
+              var result3 = null;
+              pos = savedPos0;
+            }
+            var result2 = result3 !== null
+                ? (function(k, v) {return ["param", ["literal", k], v]})(result3[1], result3[3])
+                : null;
+          }
+          var result0 = result1 !== null
+              ? (function(p) { return ["params"].concat(p) })(result1)
+              : null;
+          reportMatchFailures = savedReportMatchFailures;
+          if (reportMatchFailures && result0 === null) {
+            matchFailed("params");
+          }
+
+          cache[cacheKey] = {
+            nextPos: pos,
+            result:  result0
+          };
+          return result0;
+        }
+
+        function parse_bodies() {
+          var cacheKey = "bodies" + '@' + pos;
+          var cachedResult = cache[cacheKey];
+          if (cachedResult) {
+            pos = cachedResult.nextPos;
+            return cachedResult.result;
+          }
+
+          var savedReportMatchFailures = reportMatchFailures;
+          reportMatchFailures = false;
+          var result1 = [];
+          var savedPos0 = pos;
+          var result4 = parse_ld();
+          if (result4 !== null) {
+            if (input.substr(pos, 1) === ":") {
+              var result5 = ":";
+              pos += 1;
+            } else {
+              var result5 = null;
+              if (reportMatchFailures) {
+                matchFailed("\":\"");
+              }
+            }
+            if (result5 !== null) {
+              var result6 = parse_key();
+              if (result6 !== null) {
+                var result7 = parse_rd();
+                if (result7 !== null) {
+                  var result8 = parse_body();
+                  if (result8 !== null) {
+                    var result3 = [result4, result5, result6, result7, result8];
+                  } else {
+                    var result3 = null;
+                    pos = savedPos0;
+                  }
+                } else {
+                  var result3 = null;
+                  pos = savedPos0;
+                }
+              } else {
+                var result3 = null;
+                pos = savedPos0;
+              }
+            } else {
+              var result3 = null;
+              pos = savedPos0;
+            }
+          } else {
+            var result3 = null;
+            pos = savedPos0;
+          }
+          var result2 = result3 !== null
+              ? (function(k, v) {return ["param", ["literal", k], v]})(result3[2], result3[4])
+              : null;
+          while (result2 !== null) {
+            result1.push(result2);
+            var savedPos0 = pos;
+            var result4 = parse_ld();
+            if (result4 !== null) {
+              if (input.substr(pos, 1) === ":") {
+                var result5 = ":";
+                pos += 1;
+              } else {
+                var result5 = null;
+                if (reportMatchFailures) {
+                  matchFailed("\":\"");
+                }
+              }
+              if (result5 !== null) {
+                var result6 = parse_key();
+                if (result6 !== null) {
+                  var result7 = parse_rd();
+                  if (result7 !== null) {
+                    var result8 = parse_body();
+                    if (result8 !== null) {
+                      var result3 = [result4, result5, result6, result7, result8];
+                    } else {
+                      var result3 = null;
+                      pos = savedPos0;
+                    }
+                  } else {
+                    var result3 = null;
+                    pos = savedPos0;
+                  }
+                } else {
+                  var result3 = null;
+                  pos = savedPos0;
+                }
+              } else {
+                var result3 = null;
+                pos = savedPos0;
+              }
+            } else {
+              var result3 = null;
+              pos = savedPos0;
+            }
+            var result2 = result3 !== null
+                ? (function(k, v) {return ["param", ["literal", k], v]})(result3[2], result3[4])
+                : null;
+          }
+          var result0 = result1 !== null
+              ? (function(p) { return ["bodies"].concat(p) })(result1)
+              : null;
+          reportMatchFailures = savedReportMatchFailures;
+          if (reportMatchFailures && result0 === null) {
+            matchFailed("bodies");
+          }
+
+          cache[cacheKey] = {
+            nextPos: pos,
+            result:  result0
+          };
+          return result0;
+        }
+
+        function parse_reference() {
+          var cacheKey = "reference" + '@' + pos;
+          var cachedResult = cache[cacheKey];
+          if (cachedResult) {
+            pos = cachedResult.nextPos;
+            return cachedResult.result;
+          }
+
+          var savedReportMatchFailures = reportMatchFailures;
+          reportMatchFailures = false;
+          var savedPos0 = pos;
+          var result2 = parse_ld();
+          if (result2 !== null) {
+            var result3 = parse_identifier();
+            if (result3 !== null) {
+              var result4 = parse_filters();
+              if (result4 !== null) {
+                var result5 = parse_rd();
+                if (result5 !== null) {
+                  var result1 = [result2, result3, result4, result5];
+                } else {
+                  var result1 = null;
+                  pos = savedPos0;
+                }
+              } else {
+                var result1 = null;
+                pos = savedPos0;
+              }
+            } else {
+              var result1 = null;
+              pos = savedPos0;
+            }
+          } else {
+            var result1 = null;
+            pos = savedPos0;
+          }
+          var result0 = result1 !== null
+              ? (function(n, f) { return ["reference", n, f] })(result1[1], result1[2])
+              : null;
+          reportMatchFailures = savedReportMatchFailures;
+          if (reportMatchFailures && result0 === null) {
+            matchFailed("reference");
+          }
+
+          cache[cacheKey] = {
+            nextPos: pos,
+            result:  result0
+          };
+          return result0;
+        }
+
+        function parse_partial() {
+          var cacheKey = "partial" + '@' + pos;
+          var cachedResult = cache[cacheKey];
+          if (cachedResult) {
+            pos = cachedResult.nextPos;
+            return cachedResult.result;
+          }
+
+          var savedReportMatchFailures = reportMatchFailures;
+          reportMatchFailures = false;
+          var savedPos0 = pos;
+          var result2 = parse_ld();
+          if (result2 !== null) {
+            if (input.substr(pos, 1) === ">") {
+              var result3 = ">";
+              pos += 1;
+            } else {
+              var result3 = null;
+              if (reportMatchFailures) {
+                matchFailed("\">\"");
+              }
+            }
+            if (result3 !== null) {
+              var result10 = parse_key();
+              var result9 = result10 !== null
+                  ? (function(k) {return ["literal", k]})(result10)
+                  : null;
+              if (result9 !== null) {
+                var result4 = result9;
+              } else {
+                var result8 = parse_inline();
+                if (result8 !== null) {
+                  var result4 = result8;
+                } else {
+                  var result4 = null;;
+                };
+              }
+              if (result4 !== null) {
+                var result5 = parse_context();
+                if (result5 !== null) {
+                  if (input.substr(pos, 1) === "/") {
+                    var result6 = "/";
+                    pos += 1;
+                  } else {
+                    var result6 = null;
+                    if (reportMatchFailures) {
+                      matchFailed("\"/\"");
+                    }
+                  }
+                  if (result6 !== null) {
+                    var result7 = parse_rd();
+                    if (result7 !== null) {
+                      var result1 = [result2, result3, result4, result5, result6, result7];
+                    } else {
+                      var result1 = null;
+                      pos = savedPos0;
+                    }
+                  } else {
+                    var result1 = null;
+                    pos = savedPos0;
+                  }
+                } else {
+                  var result1 = null;
+                  pos = savedPos0;
+                }
+              } else {
+                var result1 = null;
+                pos = savedPos0;
+              }
+            } else {
+              var result1 = null;
+              pos = savedPos0;
+            }
+          } else {
+            var result1 = null;
+            pos = savedPos0;
+          }
+          var result0 = result1 !== null
+              ? (function(n, c) { return ["partial", n, c] })(result1[2], result1[3])
+              : null;
+          reportMatchFailures = savedReportMatchFailures;
+          if (reportMatchFailures && result0 === null) {
+            matchFailed("partial");
+          }
+
+          cache[cacheKey] = {
+            nextPos: pos,
+            result:  result0
+          };
+          return result0;
+        }
+
+        function parse_filters() {
+          var cacheKey = "filters" + '@' + pos;
+          var cachedResult = cache[cacheKey];
+          if (cachedResult) {
+            pos = cachedResult.nextPos;
+            return cachedResult.result;
+          }
+
+          var savedReportMatchFailures = reportMatchFailures;
+          reportMatchFailures = false;
+          var result1 = [];
+          var savedPos0 = pos;
+          if (input.substr(pos, 1) === "|") {
+            var result4 = "|";
+            pos += 1;
+          } else {
+            var result4 = null;
+            if (reportMatchFailures) {
+              matchFailed("\"|\"");
+            }
+          }
+          if (result4 !== null) {
+            var result5 = parse_key();
+            if (result5 !== null) {
+              var result3 = [result4, result5];
+            } else {
+              var result3 = null;
+              pos = savedPos0;
+            }
+          } else {
+            var result3 = null;
+            pos = savedPos0;
+          }
+          var result2 = result3 !== null
+              ? (function(n) {return n})(result3[1])
+              : null;
+          while (result2 !== null) {
+            result1.push(result2);
+            var savedPos0 = pos;
+            if (input.substr(pos, 1) === "|") {
+              var result4 = "|";
+              pos += 1;
+            } else {
+              var result4 = null;
+              if (reportMatchFailures) {
+                matchFailed("\"|\"");
+              }
+            }
+            if (result4 !== null) {
+              var result5 = parse_key();
+              if (result5 !== null) {
+                var result3 = [result4, result5];
+              } else {
+                var result3 = null;
+                pos = savedPos0;
+              }
+            } else {
+              var result3 = null;
+              pos = savedPos0;
+            }
+            var result2 = result3 !== null
+                ? (function(n) {return n})(result3[1])
+                : null;
+          }
+          var result0 = result1 !== null
+              ? (function(f) { return ["filters"].concat(f) })(result1)
+              : null;
+          reportMatchFailures = savedReportMatchFailures;
+          if (reportMatchFailures && result0 === null) {
+            matchFailed("filters");
+          }
+
+          cache[cacheKey] = {
+            nextPos: pos,
+            result:  result0
+          };
+          return result0;
+        }
+
+        function parse_special() {
+          var cacheKey = "special" + '@' + pos;
+          var cachedResult = cache[cacheKey];
+          if (cachedResult) {
+            pos = cachedResult.nextPos;
+            return cachedResult.result;
+          }
+
+          var savedReportMatchFailures = reportMatchFailures;
+          reportMatchFailures = false;
+          var savedPos0 = pos;
+          var result2 = parse_ld();
+          if (result2 !== null) {
+            if (input.substr(pos, 1) === "~") {
+              var result3 = "~";
+              pos += 1;
+            } else {
+              var result3 = null;
+              if (reportMatchFailures) {
+                matchFailed("\"~\"");
+              }
+            }
+            if (result3 !== null) {
+              var result4 = parse_key();
+              if (result4 !== null) {
+                var result5 = parse_rd();
+                if (result5 !== null) {
+                  var result1 = [result2, result3, result4, result5];
+                } else {
+                  var result1 = null;
+                  pos = savedPos0;
+                }
+              } else {
+                var result1 = null;
+                pos = savedPos0;
+              }
+            } else {
+              var result1 = null;
+              pos = savedPos0;
+            }
+          } else {
+            var result1 = null;
+            pos = savedPos0;
+          }
+          var result0 = result1 !== null
+              ? (function(k) { return ["special", k] })(result1[2])
+              : null;
+          reportMatchFailures = savedReportMatchFailures;
+          if (reportMatchFailures && result0 === null) {
+            matchFailed("special");
+          }
+
+          cache[cacheKey] = {
+            nextPos: pos,
+            result:  result0
+          };
+          return result0;
+        }
+
+        function parse_identifier() {
+          var cacheKey = "identifier" + '@' + pos;
+          var cachedResult = cache[cacheKey];
+          if (cachedResult) {
+            pos = cachedResult.nextPos;
+            return cachedResult.result;
+          }
+
+          var savedReportMatchFailures = reportMatchFailures;
+          reportMatchFailures = false;
+          var result4 = parse_path();
+          var result3 = result4 !== null
+              ? (function(p) { return wrap(["path"].concat(p), cacheKey) })(result4)
+              : null;
+          if (result3 !== null) {
+            var result0 = result3;
+          } else {
+            var result2 = parse_key();
+            var result1 = result2 !== null
+                ? (function(k) { return wrap(["key", k], cacheKey) })(result2)
+                : null;
+            if (result1 !== null) {
+              var result0 = result1;
+            } else {
+              var result0 = null;;
+            };
+          }
+          reportMatchFailures = savedReportMatchFailures;
+          if (reportMatchFailures && result0 === null) {
+            matchFailed("identifier");
+          }
+
+          cache[cacheKey] = {
+            nextPos: pos,
+            result:  result0
+          };
+          return result0;
+        }
+
+        function parse_path() {
+          var cacheKey = "path" + '@' + pos;
+          var cachedResult = cache[cacheKey];
+          if (cachedResult) {
+            pos = cachedResult.nextPos;
+            return cachedResult.result;
+          }
+
+          var savedReportMatchFailures = reportMatchFailures;
+          reportMatchFailures = false;
+          var savedPos0 = pos;
+          var result11 = parse_key();
+          var result5 = result11 !== null ? result11 : '';
+          if (result5 !== null) {
+            var savedPos1 = pos;
+            if (input.substr(pos, 1) === ".") {
+              var result9 = ".";
+              pos += 1;
+            } else {
+              var result9 = null;
+              if (reportMatchFailures) {
+                matchFailed("\".\"");
+              }
+            }
+            if (result9 !== null) {
+              var result10 = parse_key();
+              if (result10 !== null) {
+                var result8 = [result9, result10];
+              } else {
+                var result8 = null;
+                pos = savedPos1;
+              }
+            } else {
+              var result8 = null;
+              pos = savedPos1;
+            }
+            var result7 = result8 !== null
+                ? (function(k) {return k})(result8[1])
+                : null;
+            if (result7 !== null) {
+              var result6 = [];
+              while (result7 !== null) {
+                result6.push(result7);
+                var savedPos1 = pos;
+                if (input.substr(pos, 1) === ".") {
+                  var result9 = ".";
+                  pos += 1;
+                } else {
+                  var result9 = null;
+                  if (reportMatchFailures) {
+                    matchFailed("\".\"");
+                  }
+                }
+                if (result9 !== null) {
+                  var result10 = parse_key();
+                  if (result10 !== null) {
+                    var result8 = [result9, result10];
+                  } else {
+                    var result8 = null;
+                    pos = savedPos1;
+                  }
+                } else {
+                  var result8 = null;
+                  pos = savedPos1;
+                }
+                var result7 = result8 !== null
+                    ? (function(k) {return k})(result8[1])
+                    : null;
+              }
+            } else {
+              var result6 = null;
+            }
+            if (result6 !== null) {
+              var result4 = [result5, result6];
+            } else {
+              var result4 = null;
+              pos = savedPos0;
+            }
+          } else {
+            var result4 = null;
+            pos = savedPos0;
+          }
+          var result3 = result4 !== null
+              ? (function(k, d) {
+            if (k) { d.unshift(k); return [false, d]; }
+            return [true, d];
+          })(result4[0], result4[1])
+              : null;
+          if (result3 !== null) {
+            var result0 = result3;
+          } else {
+            if (input.substr(pos, 1) === ".") {
+              var result2 = ".";
+              pos += 1;
+            } else {
+              var result2 = null;
+              if (reportMatchFailures) {
+                matchFailed("\".\"");
+              }
+            }
+            var result1 = result2 !== null
+                ? (function() { return [true, []] })()
+                : null;
+            if (result1 !== null) {
+              var result0 = result1;
+            } else {
+              var result0 = null;;
+            };
+          }
+          reportMatchFailures = savedReportMatchFailures;
+          if (reportMatchFailures && result0 === null) {
+            matchFailed("path");
+          }
+
+          cache[cacheKey] = {
+            nextPos: pos,
+            result:  result0
+          };
+          return result0;
+        }
+
+        function parse_key() {
+          var cacheKey = "key" + '@' + pos;
+          var cachedResult = cache[cacheKey];
+          if (cachedResult) {
+            pos = cachedResult.nextPos;
+            return cachedResult.result;
+          }
+
+          var savedReportMatchFailures = reportMatchFailures;
+          reportMatchFailures = false;
+          var savedPos0 = pos;
+          if (input.substr(pos).match(/^[a-zA-Z_$]/) !== null) {
+            var result2 = input.charAt(pos);
+            pos++;
+          } else {
+            var result2 = null;
+            if (reportMatchFailures) {
+              matchFailed("[a-zA-Z_$]");
+            }
+          }
+          if (result2 !== null) {
+            var result3 = [];
+            if (input.substr(pos).match(/^[0-9a-zA-Z_$]/) !== null) {
+              var result4 = input.charAt(pos);
+              pos++;
+            } else {
+              var result4 = null;
+              if (reportMatchFailures) {
+                matchFailed("[0-9a-zA-Z_$]");
+              }
+            }
+            while (result4 !== null) {
+              result3.push(result4);
+              if (input.substr(pos).match(/^[0-9a-zA-Z_$]/) !== null) {
+                var result4 = input.charAt(pos);
+                pos++;
+              } else {
+                var result4 = null;
+                if (reportMatchFailures) {
+                  matchFailed("[0-9a-zA-Z_$]");
+                }
+              }
+            }
+            if (result3 !== null) {
+              var result1 = [result2, result3];
+            } else {
+              var result1 = null;
+              pos = savedPos0;
+            }
+          } else {
+            var result1 = null;
+            pos = savedPos0;
+          }
+          var result0 = result1 !== null
+              ? (function(h, t) { return h + t.join('') })(result1[0], result1[1])
+              : null;
+          reportMatchFailures = savedReportMatchFailures;
+          if (reportMatchFailures && result0 === null) {
+            matchFailed("key");
+          }
+
+          cache[cacheKey] = {
+            nextPos: pos,
+            result:  result0
+          };
+          return result0;
+        }
+
+        function parse_inline() {
+          var cacheKey = "inline" + '@' + pos;
+          var cachedResult = cache[cacheKey];
+          if (cachedResult) {
+            pos = cachedResult.nextPos;
+            return cachedResult.result;
+          }
+
+          var savedReportMatchFailures = reportMatchFailures;
+          reportMatchFailures = false;
+          var savedPos2 = pos;
+          if (input.substr(pos, 1) === "\"") {
+            var result14 = "\"";
+            pos += 1;
+          } else {
+            var result14 = null;
+            if (reportMatchFailures) {
+              matchFailed("\"\\\"\"");
+            }
+          }
+          if (result14 !== null) {
+            if (input.substr(pos, 1) === "\"") {
+              var result15 = "\"";
+              pos += 1;
+            } else {
+              var result15 = null;
+              if (reportMatchFailures) {
+                matchFailed("\"\\\"\"");
+              }
+            }
+            if (result15 !== null) {
+              var result13 = [result14, result15];
+            } else {
+              var result13 = null;
+              pos = savedPos2;
+            }
+          } else {
+            var result13 = null;
+            pos = savedPos2;
+          }
+          var result12 = result13 !== null
+              ? (function() { return ["literal", ""] })()
+              : null;
+          if (result12 !== null) {
+            var result0 = result12;
+          } else {
+            var savedPos1 = pos;
+            if (input.substr(pos, 1) === "\"") {
+              var result9 = "\"";
+              pos += 1;
+            } else {
+              var result9 = null;
+              if (reportMatchFailures) {
+                matchFailed("\"\\\"\"");
+              }
+            }
+            if (result9 !== null) {
+              var result10 = parse_literal();
+              if (result10 !== null) {
+                if (input.substr(pos, 1) === "\"") {
+                  var result11 = "\"";
+                  pos += 1;
+                } else {
+                  var result11 = null;
+                  if (reportMatchFailures) {
+                    matchFailed("\"\\\"\"");
+                  }
+                }
+                if (result11 !== null) {
+                  var result8 = [result9, result10, result11];
+                } else {
+                  var result8 = null;
+                  pos = savedPos1;
+                }
+              } else {
+                var result8 = null;
+                pos = savedPos1;
+              }
+            } else {
+              var result8 = null;
+              pos = savedPos1;
+            }
+            var result7 = result8 !== null
+                ? (function(l) { return ["literal", l] })(result8[1])
+                : null;
+            if (result7 !== null) {
+              var result0 = result7;
+            } else {
+              var savedPos0 = pos;
+              if (input.substr(pos, 1) === "\"") {
+                var result3 = "\"";
+                pos += 1;
+              } else {
+                var result3 = null;
+                if (reportMatchFailures) {
+                  matchFailed("\"\\\"\"");
+                }
+              }
+              if (result3 !== null) {
+                var result6 = parse_inline_part();
+                if (result6 !== null) {
+                  var result4 = [];
+                  while (result6 !== null) {
+                    result4.push(result6);
+                    var result6 = parse_inline_part();
+                  }
+                } else {
+                  var result4 = null;
+                }
+                if (result4 !== null) {
+                  if (input.substr(pos, 1) === "\"") {
+                    var result5 = "\"";
+                    pos += 1;
+                  } else {
+                    var result5 = null;
+                    if (reportMatchFailures) {
+                      matchFailed("\"\\\"\"");
+                    }
+                  }
+                  if (result5 !== null) {
+                    var result2 = [result3, result4, result5];
+                  } else {
+                    var result2 = null;
+                    pos = savedPos0;
+                  }
+                } else {
+                  var result2 = null;
+                  pos = savedPos0;
+                }
+              } else {
+                var result2 = null;
+                pos = savedPos0;
+              }
+              var result1 = result2 !== null
+                  ? (function(p) { return ["body"].concat(p) })(result2[1])
+                  : null;
+              if (result1 !== null) {
+                var result0 = result1;
+              } else {
+                var result0 = null;;
+              };
+            };
+          }
+          reportMatchFailures = savedReportMatchFailures;
+          if (reportMatchFailures && result0 === null) {
+            matchFailed("inline");
+          }
+
+          cache[cacheKey] = {
+            nextPos: pos,
+            result:  result0
+          };
+          return result0;
+        }
+
+        function parse_inline_part() {
+          var cacheKey = "inline_part" + '@' + pos;
+          var cachedResult = cache[cacheKey];
+          if (cachedResult) {
+            pos = cachedResult.nextPos;
+            return cachedResult.result;
+          }
+
+
+          var result4 = parse_special();
+          if (result4 !== null) {
+            var result0 = result4;
+          } else {
+            var result3 = parse_reference();
+            if (result3 !== null) {
+              var result0 = result3;
+            } else {
+              var result2 = parse_literal();
+              var result1 = result2 !== null
+                  ? (function(l) { return ["buffer", l] })(result2)
+                  : null;
+              if (result1 !== null) {
+                var result0 = result1;
+              } else {
+                var result0 = null;;
+              };
+            };
+          }
+
+
+
+          cache[cacheKey] = {
+            nextPos: pos,
+            result:  result0
+          };
+          return result0;
+        }
+
+        function parse_buffer() {
+          var cacheKey = "buffer" + '@' + pos;
+          var cachedResult = cache[cacheKey];
+          if (cachedResult) {
+            pos = cachedResult.nextPos;
+            return cachedResult.result;
+          }
+
+          var savedReportMatchFailures = reportMatchFailures;
+          reportMatchFailures = false;
+          var savedPos4 = pos;
+          var result14 = parse_eol();
+          if (result14 !== null) {
+            var result15 = [];
+            var result16 = parse_ws();
+            while (result16 !== null) {
+              result15.push(result16);
+              var result16 = parse_ws();
+            }
+            if (result15 !== null) {
+              var result13 = [result14, result15];
+            } else {
+              var result13 = null;
+              pos = savedPos4;
+            }
+          } else {
+            var result13 = null;
+            pos = savedPos4;
+          }
+          var result12 = result13 !== null
+              ? (function(e, w) { return ["format", e, w.join('')] })(result13[0], result13[1])
+              : null;
+          if (result12 !== null) {
+            var result0 = result12;
+          } else {
+            var savedPos0 = pos;
+            var savedPos3 = pos;
+            var savedReportMatchFailuresVar2 = reportMatchFailures;
+            reportMatchFailures = false;
+            var result11 = parse_tag();
+            reportMatchFailures = savedReportMatchFailuresVar2;
+            if (result11 === null) {
+              var result5 = '';
+            } else {
+              var result5 = null;
+              pos = savedPos3;
+            }
+            if (result5 !== null) {
+              var savedPos2 = pos;
+              var savedReportMatchFailuresVar1 = reportMatchFailures;
+              reportMatchFailures = false;
+              var result10 = parse_eol();
+              reportMatchFailures = savedReportMatchFailuresVar1;
+              if (result10 === null) {
+                var result6 = '';
+              } else {
+                var result6 = null;
+                pos = savedPos2;
+              }
+              if (result6 !== null) {
+                var savedPos1 = pos;
+                var savedReportMatchFailuresVar0 = reportMatchFailures;
+                reportMatchFailures = false;
+                var result9 = parse_comment();
+                reportMatchFailures = savedReportMatchFailuresVar0;
+                if (result9 === null) {
+                  var result7 = '';
+                } else {
+                  var result7 = null;
+                  pos = savedPos1;
+                }
+                if (result7 !== null) {
+                  if (input.length > pos) {
+                    var result8 = input.charAt(pos);
+                    pos++;
+                  } else {
+                    var result8 = null;
+                    if (reportMatchFailures) {
+                      matchFailed('any character');
+                    }
+                  }
+                  if (result8 !== null) {
+                    var result4 = [result5, result6, result7, result8];
+                  } else {
+                    var result4 = null;
+                    pos = savedPos0;
+                  }
+                } else {
+                  var result4 = null;
+                  pos = savedPos0;
+                }
+              } else {
+                var result4 = null;
+                pos = savedPos0;
+              }
+            } else {
+              var result4 = null;
+              pos = savedPos0;
+            }
+            var result3 = result4 !== null
+                ? (function(c) {return c})(result4[3])
+                : null;
+            if (result3 !== null) {
+              var result2 = [];
+              while (result3 !== null) {
+                result2.push(result3);
+                var savedPos0 = pos;
+                var savedPos3 = pos;
+                var savedReportMatchFailuresVar2 = reportMatchFailures;
+                reportMatchFailures = false;
+                var result11 = parse_tag();
+                reportMatchFailures = savedReportMatchFailuresVar2;
+                if (result11 === null) {
+                  var result5 = '';
+                } else {
+                  var result5 = null;
+                  pos = savedPos3;
+                }
+                if (result5 !== null) {
+                  var savedPos2 = pos;
+                  var savedReportMatchFailuresVar1 = reportMatchFailures;
+                  reportMatchFailures = false;
+                  var result10 = parse_eol();
+                  reportMatchFailures = savedReportMatchFailuresVar1;
+                  if (result10 === null) {
+                    var result6 = '';
+                  } else {
+                    var result6 = null;
+                    pos = savedPos2;
+                  }
+                  if (result6 !== null) {
+                    var savedPos1 = pos;
+                    var savedReportMatchFailuresVar0 = reportMatchFailures;
+                    reportMatchFailures = false;
+                    var result9 = parse_comment();
+                    reportMatchFailures = savedReportMatchFailuresVar0;
+                    if (result9 === null) {
+                      var result7 = '';
+                    } else {
+                      var result7 = null;
+                      pos = savedPos1;
+                    }
+                    if (result7 !== null) {
+                      if (input.length > pos) {
+                        var result8 = input.charAt(pos);
+                        pos++;
+                      } else {
+                        var result8 = null;
+                        if (reportMatchFailures) {
+                          matchFailed('any character');
+                        }
+                      }
+                      if (result8 !== null) {
+                        var result4 = [result5, result6, result7, result8];
+                      } else {
+                        var result4 = null;
+                        pos = savedPos0;
+                      }
+                    } else {
+                      var result4 = null;
+                      pos = savedPos0;
+                    }
+                  } else {
+                    var result4 = null;
+                    pos = savedPos0;
+                  }
+                } else {
+                  var result4 = null;
+                  pos = savedPos0;
+                }
+                var result3 = result4 !== null
+                    ? (function(c) {return c})(result4[3])
+                    : null;
+              }
+            } else {
+              var result2 = null;
+            }
+            var result1 = result2 !== null
+                ? (function(b) { return ["buffer", b.join('')] })(result2)
+                : null;
+            if (result1 !== null) {
+              var result0 = result1;
+            } else {
+              var result0 = null;;
+            };
+          }
+          reportMatchFailures = savedReportMatchFailures;
+          if (reportMatchFailures && result0 === null) {
+            matchFailed("buffer");
+          }
+
+          cache[cacheKey] = {
+            nextPos: pos,
+            result:  result0
+          };
+          return result0;
+        }
+
+        function parse_literal() {
+          var cacheKey = "literal" + '@' + pos;
+          var cachedResult = cache[cacheKey];
+          if (cachedResult) {
+            pos = cachedResult.nextPos;
+            return cachedResult.result;
+          }
+
+          var savedReportMatchFailures = reportMatchFailures;
+          reportMatchFailures = false;
+          var savedPos0 = pos;
+          var savedPos2 = pos;
+          var savedReportMatchFailuresVar1 = reportMatchFailures;
+          reportMatchFailures = false;
+          var result10 = parse_tag();
+          reportMatchFailures = savedReportMatchFailuresVar1;
+          if (result10 === null) {
+            var result4 = '';
+          } else {
+            var result4 = null;
+            pos = savedPos2;
+          }
+          if (result4 !== null) {
+            var savedPos1 = pos;
+            var savedReportMatchFailuresVar0 = reportMatchFailures;
+            reportMatchFailures = false;
+            var result9 = parse_eol();
+            reportMatchFailures = savedReportMatchFailuresVar0;
+            if (result9 === null) {
+              var result5 = '';
+            } else {
+              var result5 = null;
+              pos = savedPos1;
+            }
+            if (result5 !== null) {
+              var result8 = parse_esc();
+              if (result8 !== null) {
+                var result6 = result8;
+              } else {
+                if (input.substr(pos).match(/^[^"]/) !== null) {
+                  var result7 = input.charAt(pos);
+                  pos++;
+                } else {
+                  var result7 = null;
+                  if (reportMatchFailures) {
+                    matchFailed("[^\"]");
+                  }
+                }
+                if (result7 !== null) {
+                  var result6 = result7;
+                } else {
+                  var result6 = null;;
+                };
+              }
+              if (result6 !== null) {
+                var result3 = [result4, result5, result6];
+              } else {
+                var result3 = null;
+                pos = savedPos0;
+              }
+            } else {
+              var result3 = null;
+              pos = savedPos0;
+            }
+          } else {
+            var result3 = null;
+            pos = savedPos0;
+          }
+          var result2 = result3 !== null
+              ? (function(c) {return c})(result3[2])
+              : null;
+          if (result2 !== null) {
+            var result1 = [];
+            while (result2 !== null) {
+              result1.push(result2);
+              var savedPos0 = pos;
+              var savedPos2 = pos;
+              var savedReportMatchFailuresVar1 = reportMatchFailures;
+              reportMatchFailures = false;
+              var result10 = parse_tag();
+              reportMatchFailures = savedReportMatchFailuresVar1;
+              if (result10 === null) {
+                var result4 = '';
+              } else {
+                var result4 = null;
+                pos = savedPos2;
+              }
+              if (result4 !== null) {
+                var savedPos1 = pos;
+                var savedReportMatchFailuresVar0 = reportMatchFailures;
+                reportMatchFailures = false;
+                var result9 = parse_eol();
+                reportMatchFailures = savedReportMatchFailuresVar0;
+                if (result9 === null) {
+                  var result5 = '';
+                } else {
+                  var result5 = null;
+                  pos = savedPos1;
+                }
+                if (result5 !== null) {
+                  var result8 = parse_esc();
+                  if (result8 !== null) {
+                    var result6 = result8;
+                  } else {
+                    if (input.substr(pos).match(/^[^"]/) !== null) {
+                      var result7 = input.charAt(pos);
+                      pos++;
+                    } else {
+                      var result7 = null;
+                      if (reportMatchFailures) {
+                        matchFailed("[^\"]");
+                      }
+                    }
+                    if (result7 !== null) {
+                      var result6 = result7;
+                    } else {
+                      var result6 = null;;
+                    };
+                  }
+                  if (result6 !== null) {
+                    var result3 = [result4, result5, result6];
+                  } else {
+                    var result3 = null;
+                    pos = savedPos0;
+                  }
+                } else {
+                  var result3 = null;
+                  pos = savedPos0;
+                }
+              } else {
+                var result3 = null;
+                pos = savedPos0;
+              }
+              var result2 = result3 !== null
+                  ? (function(c) {return c})(result3[2])
+                  : null;
+            }
+          } else {
+            var result1 = null;
+          }
+          var result0 = result1 !== null
+              ? (function(b) { return b.join('') })(result1)
+              : null;
+          reportMatchFailures = savedReportMatchFailures;
+          if (reportMatchFailures && result0 === null) {
+            matchFailed("literal");
+          }
+
+          cache[cacheKey] = {
+            nextPos: pos,
+            result:  result0
+          };
+          return result0;
+        }
+
+        function parse_esc() {
+          var cacheKey = "esc" + '@' + pos;
+          var cachedResult = cache[cacheKey];
+          if (cachedResult) {
+            pos = cachedResult.nextPos;
+            return cachedResult.result;
+          }
+
+
+          if (input.substr(pos, 2) === "\\\"") {
+            var result1 = "\\\"";
+            pos += 2;
+          } else {
+            var result1 = null;
+            if (reportMatchFailures) {
+              matchFailed("\"\\\\\\\"\"");
+            }
+          }
+          var result0 = result1 !== null
+              ? (function() { return '"' })()
+              : null;
+
+
+
+          cache[cacheKey] = {
+            nextPos: pos,
+            result:  result0
+          };
+          return result0;
+        }
+
+        function parse_comment() {
+          var cacheKey = "comment" + '@' + pos;
+          var cachedResult = cache[cacheKey];
+          if (cachedResult) {
+            pos = cachedResult.nextPos;
+            return cachedResult.result;
+          }
+
+          var savedReportMatchFailures = reportMatchFailures;
+          reportMatchFailures = false;
+          var savedPos0 = pos;
+          if (input.substr(pos, 2) === "{!") {
+            var result2 = "{!";
+            pos += 2;
+          } else {
+            var result2 = null;
+            if (reportMatchFailures) {
+              matchFailed("\"{!\"");
+            }
+          }
+          if (result2 !== null) {
+            var result3 = [];
+            var savedPos1 = pos;
+            var savedPos2 = pos;
+            var savedReportMatchFailuresVar0 = reportMatchFailures;
+            reportMatchFailures = false;
+            if (input.substr(pos, 2) === "!}") {
+              var result9 = "!}";
+              pos += 2;
+            } else {
+              var result9 = null;
+              if (reportMatchFailures) {
+                matchFailed("\"!}\"");
+              }
+            }
+            reportMatchFailures = savedReportMatchFailuresVar0;
+            if (result9 === null) {
+              var result7 = '';
+            } else {
+              var result7 = null;
+              pos = savedPos2;
+            }
+            if (result7 !== null) {
+              if (input.length > pos) {
+                var result8 = input.charAt(pos);
+                pos++;
+              } else {
+                var result8 = null;
+                if (reportMatchFailures) {
+                  matchFailed('any character');
+                }
+              }
+              if (result8 !== null) {
+                var result6 = [result7, result8];
+              } else {
+                var result6 = null;
+                pos = savedPos1;
+              }
+            } else {
+              var result6 = null;
+              pos = savedPos1;
+            }
+            var result5 = result6 !== null
+                ? (function(c) {return c})(result6[1])
+                : null;
+            while (result5 !== null) {
+              result3.push(result5);
+              var savedPos1 = pos;
+              var savedPos2 = pos;
+              var savedReportMatchFailuresVar0 = reportMatchFailures;
+              reportMatchFailures = false;
+              if (input.substr(pos, 2) === "!}") {
+                var result9 = "!}";
+                pos += 2;
+              } else {
+                var result9 = null;
+                if (reportMatchFailures) {
+                  matchFailed("\"!}\"");
+                }
+              }
+              reportMatchFailures = savedReportMatchFailuresVar0;
+              if (result9 === null) {
+                var result7 = '';
+              } else {
+                var result7 = null;
+                pos = savedPos2;
+              }
+              if (result7 !== null) {
+                if (input.length > pos) {
+                  var result8 = input.charAt(pos);
+                  pos++;
+                } else {
+                  var result8 = null;
+                  if (reportMatchFailures) {
+                    matchFailed('any character');
+                  }
+                }
+                if (result8 !== null) {
+                  var result6 = [result7, result8];
+                } else {
+                  var result6 = null;
+                  pos = savedPos1;
+                }
+              } else {
+                var result6 = null;
+                pos = savedPos1;
+              }
+              var result5 = result6 !== null
+                  ? (function(c) {return c})(result6[1])
+                  : null;
+            }
+            if (result3 !== null) {
+              if (input.substr(pos, 2) === "!}") {
+                var result4 = "!}";
+                pos += 2;
+              } else {
+                var result4 = null;
+                if (reportMatchFailures) {
+                  matchFailed("\"!}\"");
+                }
+              }
+              if (result4 !== null) {
+                var result1 = [result2, result3, result4];
+              } else {
+                var result1 = null;
+                pos = savedPos0;
+              }
+            } else {
+              var result1 = null;
+              pos = savedPos0;
+            }
+          } else {
+            var result1 = null;
+            pos = savedPos0;
+          }
+          var result0 = result1 !== null
+              ? (function(c) { return ["comment", c.join('')] })(result1[1])
+              : null;
+          reportMatchFailures = savedReportMatchFailures;
+          if (reportMatchFailures && result0 === null) {
+            matchFailed("comment");
+          }
+
+          cache[cacheKey] = {
+            nextPos: pos,
+            result:  result0
+          };
+          return result0;
+        }
+
+        function parse_tag() {
+          var cacheKey = "tag" + '@' + pos;
+          var cachedResult = cache[cacheKey];
+          if (cachedResult) {
+            pos = cachedResult.nextPos;
+            return cachedResult.result;
+          }
+
+
+          var savedPos0 = pos;
+          var result3 = parse_ld();
+          if (result3 !== null) {
+            if (input.substr(pos).match(/^[#?^><+%:@\/~%]/) !== null) {
+              var result4 = input.charAt(pos);
+              pos++;
+            } else {
+              var result4 = null;
+              if (reportMatchFailures) {
+                matchFailed("[#?^><+%:@\\/~%]");
+              }
+            }
+            if (result4 !== null) {
+              var savedPos1 = pos;
+              var savedPos3 = pos;
+              var savedReportMatchFailuresVar1 = reportMatchFailures;
+              reportMatchFailures = false;
+              var result12 = parse_rd();
+              reportMatchFailures = savedReportMatchFailuresVar1;
+              if (result12 === null) {
+                var result8 = '';
+              } else {
+                var result8 = null;
+                pos = savedPos3;
+              }
+              if (result8 !== null) {
+                var savedPos2 = pos;
+                var savedReportMatchFailuresVar0 = reportMatchFailures;
+                reportMatchFailures = false;
+                var result11 = parse_eol();
+                reportMatchFailures = savedReportMatchFailuresVar0;
+                if (result11 === null) {
+                  var result9 = '';
+                } else {
+                  var result9 = null;
+                  pos = savedPos2;
+                }
+                if (result9 !== null) {
+                  if (input.length > pos) {
+                    var result10 = input.charAt(pos);
+                    pos++;
+                  } else {
+                    var result10 = null;
+                    if (reportMatchFailures) {
+                      matchFailed('any character');
+                    }
+                  }
+                  if (result10 !== null) {
+                    var result7 = [result8, result9, result10];
+                  } else {
+                    var result7 = null;
+                    pos = savedPos1;
+                  }
+                } else {
+                  var result7 = null;
+                  pos = savedPos1;
+                }
+              } else {
+                var result7 = null;
+                pos = savedPos1;
+              }
+              if (result7 !== null) {
+                var result5 = [];
+                while (result7 !== null) {
+                  result5.push(result7);
+                  var savedPos1 = pos;
+                  var savedPos3 = pos;
+                  var savedReportMatchFailuresVar1 = reportMatchFailures;
+                  reportMatchFailures = false;
+                  var result12 = parse_rd();
+                  reportMatchFailures = savedReportMatchFailuresVar1;
+                  if (result12 === null) {
+                    var result8 = '';
+                  } else {
+                    var result8 = null;
+                    pos = savedPos3;
+                  }
+                  if (result8 !== null) {
+                    var savedPos2 = pos;
+                    var savedReportMatchFailuresVar0 = reportMatchFailures;
+                    reportMatchFailures = false;
+                    var result11 = parse_eol();
+                    reportMatchFailures = savedReportMatchFailuresVar0;
+                    if (result11 === null) {
+                      var result9 = '';
+                    } else {
+                      var result9 = null;
+                      pos = savedPos2;
+                    }
+                    if (result9 !== null) {
+                      if (input.length > pos) {
+                        var result10 = input.charAt(pos);
+                        pos++;
+                      } else {
+                        var result10 = null;
+                        if (reportMatchFailures) {
+                          matchFailed('any character');
+                        }
+                      }
+                      if (result10 !== null) {
+                        var result7 = [result8, result9, result10];
+                      } else {
+                        var result7 = null;
+                        pos = savedPos1;
+                      }
+              

<TRUNCATED>

[15/22] falcon git commit: FALCON-1315 Update falcon ui for HiveDR, secure clusters and bug fixes. Contributed by Armando Reyna/Venkat Ranganathan.

Posted by so...@apache.org.
http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/fonts/glyphicons-halflings-regular.svg
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/fonts/glyphicons-halflings-regular.svg b/falcon-ui/app/css/fonts/glyphicons-halflings-regular.svg
index e3e2dc7..94fb549 100644
--- a/falcon-ui/app/css/fonts/glyphicons-halflings-regular.svg
+++ b/falcon-ui/app/css/fonts/glyphicons-halflings-regular.svg
@@ -6,224 +6,283 @@
 <font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
 <font-face units-per-em="1200" ascent="960" descent="-240" />
 <missing-glyph horiz-adv-x="500" />
-<glyph />
-<glyph />
-<glyph unicode="&#xd;" />
+<glyph horiz-adv-x="0" />
+<glyph horiz-adv-x="400" />
 <glyph unicode=" " />
-<glyph unicode="*" d="M100 500v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259z" />
-<glyph unicode="+" d="M0 400v300h400v400h300v-400h400v-300h-400v-400h-300v400h-400z" />
+<glyph unicode="*" d="M600 1100q15 0 34 -1.5t30 -3.5l11 -1q10 -2 17.5 -10.5t7.5 -18.5v-224l158 158q7 7 18 8t19 -6l106 -106q7 -8 6 -19t-8 -18l-158 -158h224q10 0 18.5 -7.5t10.5 -17.5q6 -41 6 -75q0 -15 -1.5 -34t-3.5 -30l-1 -11q-2 -10 -10.5 -17.5t-18.5 -7.5h-224l158 -158 q7 -7 8 -18t-6 -19l-106 -106q-8 -7 -19 -6t-18 8l-158 158v-224q0 -10 -7.5 -18.5t-17.5 -10.5q-41 -6 -75 -6q-15 0 -34 1.5t-30 3.5l-11 1q-10 2 -17.5 10.5t-7.5 18.5v224l-158 -158q-7 -7 -18 -8t-19 6l-106 106q-7 8 -6 19t8 18l158 158h-224q-10 0 -18.5 7.5 t-10.5 17.5q-6 41 -6 75q0 15 1.5 34t3.5 30l1 11q2 10 10.5 17.5t18.5 7.5h224l-158 158q-7 7 -8 18t6 19l106 106q8 7 19 6t18 -8l158 -158v224q0 10 7.5 18.5t17.5 10.5q41 6 75 6z" />
+<glyph unicode="+" d="M450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-350h350q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-350v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v350h-350q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5 h350v350q0 21 14.5 35.5t35.5 14.5z" />
 <glyph unicode="&#xa0;" />
-<glyph unicode="&#x2000;" horiz-adv-x="652" />
-<glyph unicode="&#x2001;" horiz-adv-x="1304" />
-<glyph unicode="&#x2002;" horiz-adv-x="652" />
-<glyph unicode="&#x2003;" horiz-adv-x="1304" />
-<glyph unicode="&#x2004;" horiz-adv-x="434" />
-<glyph unicode="&#x2005;" horiz-adv-x="326" />
-<glyph unicode="&#x2006;" horiz-adv-x="217" />
-<glyph unicode="&#x2007;" horiz-adv-x="217" />
-<glyph unicode="&#x2008;" horiz-adv-x="163" />
+<glyph unicode="&#xa5;" d="M825 1100h250q10 0 12.5 -5t-5.5 -13l-364 -364q-6 -6 -11 -18h268q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-100h275q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-174q0 -11 -7.5 -18.5t-18.5 -7.5h-148q-11 0 -18.5 7.5t-7.5 18.5v174 h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h125v100h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h118q-5 12 -11 18l-364 364q-8 8 -5.5 13t12.5 5h250q25 0 43 -18l164 -164q8 -8 18 -8t18 8l164 164q18 18 43 18z" />
+<glyph unicode="&#x2000;" horiz-adv-x="650" />
+<glyph unicode="&#x2001;" horiz-adv-x="1300" />
+<glyph unicode="&#x2002;" horiz-adv-x="650" />
+<glyph unicode="&#x2003;" horiz-adv-x="1300" />
+<glyph unicode="&#x2004;" horiz-adv-x="433" />
+<glyph unicode="&#x2005;" horiz-adv-x="325" />
+<glyph unicode="&#x2006;" horiz-adv-x="216" />
+<glyph unicode="&#x2007;" horiz-adv-x="216" />
+<glyph unicode="&#x2008;" horiz-adv-x="162" />
 <glyph unicode="&#x2009;" horiz-adv-x="260" />
 <glyph unicode="&#x200a;" horiz-adv-x="72" />
 <glyph unicode="&#x202f;" horiz-adv-x="260" />
-<glyph unicode="&#x205f;" horiz-adv-x="326" />
-<glyph unicode="&#x20ac;" d="M100 500l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406l-100 -100 h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217z" />
-<glyph unicode="&#x2212;" d="M200 400h900v300h-900v-300z" />
+<glyph unicode="&#x205f;" horiz-adv-x="325" />
+<glyph unicode="&#x20ac;" d="M744 1198q242 0 354 -189q60 -104 66 -209h-181q0 45 -17.5 82.5t-43.5 61.5t-58 40.5t-60.5 24t-51.5 7.5q-19 0 -40.5 -5.5t-49.5 -20.5t-53 -38t-49 -62.5t-39 -89.5h379l-100 -100h-300q-6 -50 -6 -100h406l-100 -100h-300q9 -74 33 -132t52.5 -91t61.5 -54.5t59 -29 t47 -7.5q22 0 50.5 7.5t60.5 24.5t58 41t43.5 61t17.5 80h174q-30 -171 -128 -278q-107 -117 -274 -117q-206 0 -324 158q-36 48 -69 133t-45 204h-217l100 100h112q1 47 6 100h-218l100 100h134q20 87 51 153.5t62 103.5q117 141 297 141z" />
+<glyph unicode="&#x20bd;" d="M428 1200h350q67 0 120 -13t86 -31t57 -49.5t35 -56.5t17 -64.5t6.5 -60.5t0.5 -57v-16.5v-16.5q0 -36 -0.5 -57t-6.5 -61t-17 -65t-35 -57t-57 -50.5t-86 -31.5t-120 -13h-178l-2 -100h288q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-138v-175q0 -11 -5.5 -18 t-15.5 -7h-149q-10 0 -17.5 7.5t-7.5 17.5v175h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v100h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v475q0 10 7.5 17.5t17.5 7.5zM600 1000v-300h203q64 0 86.5 33t22.5 119q0 84 -22.5 116t-86.5 32h-203z" />
+<glyph unicode="&#x2212;" d="M250 700h800q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#x231b;" d="M1000 1200v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-50v-100q0 -91 -49.5 -165.5t-130.5 -109.5q81 -35 130.5 -109.5t49.5 -165.5v-150h50q21 0 35.5 -14.5t14.5 -35.5v-150h-800v150q0 21 14.5 35.5t35.5 14.5h50v150q0 91 49.5 165.5t130.5 109.5q-81 35 -130.5 109.5 t-49.5 165.5v100h-50q-21 0 -35.5 14.5t-14.5 35.5v150h800zM400 1000v-100q0 -60 32.5 -109.5t87.5 -73.5q28 -12 44 -37t16 -55t-16 -55t-44 -37q-55 -24 -87.5 -73.5t-32.5 -109.5v-150h400v150q0 60 -32.5 109.5t-87.5 73.5q-28 12 -44 37t-16 55t16 55t44 37 q55 24 87.5 73.5t32.5 109.5v100h-400z" />
 <glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
-<glyph unicode="&#x2601;" d="M-14 494q0 -80 56.5 -137t135.5 -57h750q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5z" />
-<glyph unicode="&#x2709;" d="M0 100l400 400l200 -200l200 200l400 -400h-1200zM0 300v600l300 -300zM0 1100l600 -603l600 603h-1200zM900 600l300 300v-600z" />
-<glyph unicode="&#x270f;" d="M-13 -13l333 112l-223 223zM187 403l214 -214l614 614l-214 214zM887 1103l214 -214l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13z" />
-<glyph unicode="&#xe001;" d="M0 1200h1200l-500 -550v-550h300v-100h-800v100h300v550z" />
-<glyph unicode="&#xe002;" d="M14 84q18 -55 86 -75.5t147 5.5q65 21 109 69t44 90v606l600 155v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q18 -55 86 -75.5t147 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7 q-79 -25 -122.5 -82t-25.5 -112z" />
-<glyph unicode="&#xe003;" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" />
-<glyph unicode="&#xe005;" d="M100 784q0 64 28 123t73 100.5t104.5 64t119 20.5t120 -38.5t104.5 -104.5q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5 t-94 124.5t-33.5 117.5z" />
-<glyph unicode="&#xe006;" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1z" />
-<glyph unicode="&#xe007;" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1zM237 700l196 -142l-73 -226l192 140l195 -141l-74 229l193 140h-235l-77 211l-78 -211h-239z" />
-<glyph unicode="&#xe008;" d="M0 0v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100l400 -257v-143h-1200z" />
-<glyph unicode="&#xe009;" d="M0 0v1100h1200v-1100h-1200zM100 100h100v100h-100v-100zM100 300h100v100h-100v-100zM100 500h100v100h-100v-100zM100 700h100v100h-100v-100zM100 900h100v100h-100v-100zM300 100h600v400h-600v-400zM300 600h600v400h-600v-400zM1000 100h100v100h-100v-100z M1000 300h100v100h-100v-100zM1000 500h100v100h-100v-100zM1000 700h100v100h-100v-100zM1000 900h100v100h-100v-100z" />
-<glyph unicode="&#xe010;" d="M0 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM0 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5zM600 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM600 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5z" />
-<glyph unicode="&#xe011;" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 450v200q0 
 21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5z" />
-<glyph unicode="&#xe012;" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5 t-14.5 -35.5v-200zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5z" />
-<glyph unicode="&#xe013;" d="M29 454l419 -420l818 820l-212 212l-607 -607l-206 207z" />
-<glyph unicode="&#xe014;" d="M106 318l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282l-212 -212l-282 282l-282 -282z" />
-<glyph unicode="&#xe015;" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233zM300 600v200h100v100h200v-100h100v-200h-100v-100h-200v100h-100z" />
-<glyph unicode="&#xe016;" d="M23 694q0 200 142 342t342 142t342 -142t142 -342q0 -141 -78 -262l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 601h400v200h-400v-200z" />
-<glyph unicode="&#xe017;" d="M23 600q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5 zM500 750q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400z" />
-<glyph unicode="&#xe018;" d="M100 1h200v300h-200v-300zM400 1v500h200v-500h-200zM700 1v800h200v-800h-200zM1000 1v1200h200v-1200h-200z" />
-<glyph unicode="&#xe019;" d="M26 601q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39l5 -2l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38 l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73zM385 601 q0 88 63 151t152 63t152 -63t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152z" />
-<glyph unicode="&#xe020;" d="M100 1025v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18zM200 100v800h900v-800q0 -41 -29.5 -71t-70.5 -30h-700q-41 0 -70.5 30 t-29.5 71zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM500 1100h300v100h-300v-100zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" />
-<glyph unicode="&#xe021;" d="M1 601l656 644l644 -644h-200v-600h-300v400h-300v-400h-300v600h-200z" />
-<glyph unicode="&#xe022;" d="M100 25v1150q0 11 7 18t18 7h475v-500h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18zM700 800v300l300 -300h-300z" />
-<glyph unicode="&#xe023;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 500v400h100 v-300h200v-100h-300z" />
-<glyph unicode="&#xe024;" d="M-100 0l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538l-41 400h-242l-40 -400h-539zM488 500h224l-27 300h-170z" />
-<glyph unicode="&#xe025;" d="M0 0v400h490l-290 300h200v500h300v-500h200l-290 -300h490v-400h-1100zM813 200h175v100h-175v-100z" />
-<glyph unicode="&#xe026;" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM188 600q0 -170 121 -291t291 -121t291 121t121 291t-121 291t-291 121 t-291 -121t-121 -291zM350 600h150v300h200v-300h150l-250 -300z" />
-<glyph unicode="&#xe027;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM350 600l250 300 l250 -300h-150v-300h-200v300h-150z" />
-<glyph unicode="&#xe028;" d="M0 25v475l200 700h800l199 -700l1 -475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18zM200 500h200l50 -200h300l50 200h200l-97 500h-606z" />
-<glyph unicode="&#xe029;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 397v401 l297 -200z" />
-<glyph unicode="&#xe030;" d="M23 600q0 -118 45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123t123 184t45.5 224.5h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123 t-123 -184t-45.5 -224.5z" />
-<glyph unicode="&#xe031;" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150zM100 0v400h400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122z" />
-<glyph unicode="&#xe032;" d="M100 0h1100v1200h-1100v-1200zM200 100v900h900v-900h-900zM300 200v100h100v-100h-100zM300 400v100h100v-100h-100zM300 600v100h100v-100h-100zM300 800v100h100v-100h-100zM500 200h500v100h-500v-100zM500 400v100h500v-100h-500zM500 600v100h500v-100h-500z M500 800v100h500v-100h-500z" />
-<glyph unicode="&#xe033;" d="M0 100v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" />
-<glyph unicode="&#xe034;" d="M100 0v1100h100v-1100h-100zM300 400q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500z" />
-<glyph unicode="&#xe035;" d="M0 275q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5 t-49.5 -227v-300zM200 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14zM800 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14z" />
-<glyph unicode="&#xe036;" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM688 459l141 141l-141 141l71 71l141 -141l141 141l71 -71l-141 -141l141 -141l-71 -71l-141 141l-141 -141z" />
-<glyph unicode="&#xe037;" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" />
-<glyph unicode="&#xe038;" d="M0 401v400h300l300 200v-800l-300 200h-300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257zM889 951l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8l81 -66l6 8q142 178 142 405q0 230 -144 408l-6 8z" />
-<glyph unicode="&#xe039;" d="M0 0h500v500h-200v100h-100v-100h-200v-500zM0 600h100v100h400v100h100v100h-100v300h-500v-600zM100 100v300h300v-300h-300zM100 800v300h300v-300h-300zM200 200v100h100v-100h-100zM200 900h100v100h-100v-100zM500 500v100h300v-300h200v-100h-100v-100h-200v100 h-100v100h100v200h-200zM600 0v100h100v-100h-100zM600 1000h100v-300h200v-300h300v200h-200v100h200v500h-600v-200zM800 800v300h300v-300h-300zM900 0v100h300v-100h-300zM900 900v100h100v-100h-100zM1100 200v100h100v-100h-100z" />
-<glyph unicode="&#xe040;" d="M0 200h100v1000h-100v-1000zM100 0v100h300v-100h-300zM200 200v1000h100v-1000h-100zM500 0v91h100v-91h-100zM500 200v1000h200v-1000h-200zM700 0v91h100v-91h-100zM800 200v1000h100v-1000h-100zM900 0v91h200v-91h-200zM1000 200v1000h200v-1000h-200z" />
-<glyph unicode="&#xe041;" d="M0 700l1 475q0 10 7.5 17.5t17.5 7.5h474l700 -700l-500 -500zM148 953q0 -42 29 -71q30 -30 71.5 -30t71.5 30q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71z" />
-<glyph unicode="&#xe042;" d="M1 700l1 475q0 11 7 18t18 7h474l700 -700l-500 -500zM148 953q0 -42 30 -71q29 -30 71 -30t71 30q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71zM701 1200h100l700 -700l-500 -500l-50 50l450 450z" />
-<glyph unicode="&#xe043;" d="M100 0v1025l175 175h925v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900z" />
-<glyph unicode="&#xe044;" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" />
-<glyph unicode="&#xe045;" d="M0 100v700h200l100 -200h600l100 200h200v-700h-200v200h-800v-200h-200zM253 829l40 -124h592l62 124l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18zM281 24l38 152q2 10 11.5 17t19.5 7h500q10 0 19.5 -7t11.5 -17l38 -152q2 -10 -3.5 -17t-15.5 -7h-600 q-10 0 -15.5 7t-3.5 17z" />
-<glyph unicode="&#xe046;" d="M0 200q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600z M356 500q0 100 72 172t172 72t172 -72t72 -172t-72 -172t-172 -72t-172 72t-72 172zM494 500q0 -44 31 -75t75 -31t75 31t31 75t-31 75t-75 31t-75 -31t-31 -75zM900 700v100h100v-100h-100z" />
-<glyph unicode="&#xe047;" d="M53 0h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66zM416 521l178 457l46 -140l116 -317h-340 z" />
-<glyph unicode="&#xe048;" d="M100 0v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21t-29 14t-49 14.5v71l471 -1q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111 t-162 -38.5h-500zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400zM400 700h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5v-379z" />
-<glyph unicode="&#xe049;" d="M200 0v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500z" />
-<glyph unicode="&#xe050;" d="M-75 200h75v800h-75l125 167l125 -167h-75v-800h75l-125 -167zM300 900v300h150h700h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49z " />
-<glyph unicode="&#xe051;" d="M33 51l167 125v-75h800v75l167 -125l-167 -125v75h-800v-75zM100 901v300h150h700h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50z" />
-<glyph unicode="&#xe052;" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 350q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM0 650q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 950q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
-<glyph unicode="&#xe053;" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 650q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM200 350q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM200 950q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
-<glyph unicode="&#xe054;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600 q-21 0 -35.5 15t-14.5 35z" />
-<glyph unicode="&#xe055;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" />
-<glyph unicode="&#xe056;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-10
 0q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z" />
-<glyph unicode="&#xe057;" d="M-101 500v100h201v75l166 -125l-166 -125v75h-201zM300 0h100v1100h-100v-1100zM500 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35 v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 650q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100 q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100z" />
-<glyph unicode="&#xe058;" d="M1 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 650 q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM801 0v1100h100v-1100 h-100zM934 550l167 -125v75h200v100h-200v75z" />
-<glyph unicode="&#xe059;" d="M0 275v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53zM900 600l300 300v-600z" />
-<glyph unicode="&#xe060;" d="M0 44v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31zM100 263l247 182l298 -131l-74 156l293 318l236 -288v500h-1000v-737zM208 750q0 56 39 95t95 39t95 -39t39 -95t-39 -95t-95 -39t-95 39t-39 95z " />
-<glyph unicode="&#xe062;" d="M148 745q0 124 60.5 231.5t165 172t226.5 64.5q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262zM342 772q0 -107 75.5 -182.5t181.5 -75.5 q107 0 182.5 75.5t75.5 182.5t-75.5 182t-182.5 75t-182 -75.5t-75 -181.5z" />
-<glyph unicode="&#xe063;" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM173 600q0 -177 125.5 -302t301.5 -125v854q-176 0 -301.5 -125 t-125.5 -302z" />
-<glyph unicode="&#xe064;" d="M117 406q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 139t-64 210zM243 414q14 -82 59.5 -136 t136.5 -80l16 98q-7 6 -18 17t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156z" />
-<glyph unicode="&#xe065;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125l200 200v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM436 341l161 50l412 412l-114 113l-405 -405zM995 1015l113 -113l113 113l-21 85l-92 28z" />
-<glyph unicode="&#xe066;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5 zM423 524q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5z" />
-<glyph unicode="&#xe067;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q61 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM342 632l283 -284l567 567l-137 137l-430 -431l-146 147z" />
-<glyph unicode="&#xe068;" d="M0 603l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296l-300 -300v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198z" />
-<glyph unicode="&#xe069;" d="M200 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
-<glyph unicode="&#xe070;" d="M0 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
-<glyph unicode="&#xe071;" d="M136 550l564 550v-487l500 487v-1100l-500 488v-488z" />
-<glyph unicode="&#xe072;" d="M200 0l900 550l-900 550v-1100z" />
-<glyph unicode="&#xe073;" d="M200 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800zM600 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
-<glyph unicode="&#xe074;" d="M200 150q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
-<glyph unicode="&#xe075;" d="M0 0v1100l500 -487v487l564 -550l-564 -550v488z" />
-<glyph unicode="&#xe076;" d="M0 0v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488z" />
-<glyph unicode="&#xe077;" d="M300 0v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438z" />
-<glyph unicode="&#xe078;" d="M100 250v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5zM100 500h1100l-550 564z" />
-<glyph unicode="&#xe079;" d="M185 599l592 -592l240 240l-353 353l353 353l-240 240z" />
-<glyph unicode="&#xe080;" d="M272 194l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1l-592 -591z" />
-<glyph unicode="&#xe081;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h200v-200h200v200h200v200h-200v200h-200v-200h-200v-200z" />
-<glyph unicode="&#xe082;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h600v200h-600v-200z" />
-<glyph unicode="&#xe083;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM246 459l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141l-141 142l-212 -213l141 -141 z" />
-<glyph unicode="&#xe084;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM270 551l276 -277l411 411l-175 174l-236 -236l-102 102z" />
-<glyph unicode="&#xe085;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM364 700h143q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5 q19 0 30 -10t11 -26q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3q-50 0 -90.5 -12t-75 -38.5t-53.5 -74.5t-19 -114zM500 300h200v100h-200 v-100z" />
-<glyph unicode="&#xe086;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM400 300h400v100h-100v300h-300v-100h100v-200h-100v-100zM500 800h200v100h-200v-100z" />
-<glyph unicode="&#xe087;" d="M0 500v200h195q31 125 98.5 199.5t206.5 100.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194zM290 500q24 -73 79.5 -127.5t130.5 -78.5v206h200v-206 q149 48 201 206h-201v200h200q-25 74 -75.5 127t-124.5 77v-204h-200v203q-75 -23 -130 -77t-79 -126h209v-200h-210z" />
-<glyph unicode="&#xe088;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM356 465l135 135 l-135 135l109 109l135 -135l135 135l109 -109l-135 -135l135 -135l-109 -109l-135 135l-135 -135z" />
-<glyph unicode="&#xe089;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM322 537l141 141 l87 -87l204 205l142 -142l-346 -345z" />
-<glyph unicode="&#xe090;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -115 62 -215l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5zM391 245q97 -59 209 -59q171 0 292.5 121.5t121.5 292.5 q0 112 -59 209z" />
-<glyph unicode="&#xe091;" d="M0 547l600 453v-300h600v-300h-600v-301z" />
-<glyph unicode="&#xe092;" d="M0 400v300h600v300l600 -453l-600 -448v301h-600z" />
-<glyph unicode="&#xe093;" d="M204 600l450 600l444 -600h-298v-600h-300v600h-296z" />
-<glyph unicode="&#xe094;" d="M104 600h296v600h300v-600h298l-449 -600z" />
-<glyph unicode="&#xe095;" d="M0 200q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453l-600 -448v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5z" />
-<glyph unicode="&#xe096;" d="M0 0v400l129 -129l294 294l142 -142l-294 -294l129 -129h-400zM635 777l142 -142l294 294l129 -129v400h-400l129 -129z" />
-<glyph unicode="&#xe097;" d="M34 176l295 295l-129 129h400v-400l-129 130l-295 -295zM600 600v400l129 -129l295 295l142 -141l-295 -295l129 -130h-400z" />
-<glyph unicode="&#xe101;" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM456 851l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5 t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5h-207q-21 0 -33 -14.5t-8 -34.5zM500 300h200v100h-200v-100z" />
-<glyph unicode="&#xe102;" d="M0 800h100v-200h400v300h200v-300h400v200h100v100h-111q1 1 1 6.5t-1.5 15t-3.5 17.5l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6 h-111v-100zM100 0h400v400h-400v-400zM200 900q-3 0 14 48t36 96l18 47l213 -191h-281zM700 0v400h400v-400h-400zM731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269z" />
-<glyph unicode="&#xe103;" d="M0 -22v143l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55z M238.5 300.5q19.5 -6.5 86.5 76.5q55 66 367 234q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5z" />
-<glyph unicode="&#xe104;" d="M111 408q0 -33 5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5 t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5q2 -12 8 -41.5t8 -43t6 -39.5 t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85z" />
-<glyph unicode="&#xe105;" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30l26 -40l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5 t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30zM120 600q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5t123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54 q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l105 105q-37 24 -75 72t-57 84l-20 36z" />
-<glyph unicode="&#xe106;" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43zM120 600q210 -282 393 -336l37 141q-107 18 -178.5 101.5t-71.5 193.5 q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68l-14 26zM780 161l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52l26 -40l-26 -40 q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5t-124 -100t-146.5 -79z" />
-<glyph unicode="&#xe107;" d="M-97.5 34q13.5 -34 50.5 -34h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 34 -48 36.5t-48 -29.5l-642 -1066q-21 -32 -7.5 -66zM155 200l445 723l445 -723h-345v100h-200v-100h-345zM500 600l100 -300l100 300v100h-200v-100z" />
-<glyph unicode="&#xe108;" d="M100 262v41q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -20 -13 -28.5t-32 0.5l-94 78h-222l-94 -78q-19 -9 -32 -0.5t-13 28.5 v64q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5z" />
-<glyph unicode="&#xe109;" d="M0 50q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100v-750zM0 900h1100v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 100v100h100v-100h-100zM100 300v100h100v-100h-100z M100 500v100h100v-100h-100zM300 100v100h100v-100h-100zM300 300v100h100v-100h-100zM300 500v100h100v-100h-100zM500 100v100h100v-100h-100zM500 300v100h100v-100h-100zM500 500v100h100v-100h-100zM700 100v100h100v-100h-100zM700 300v100h100v-100h-100zM700 500 v100h100v-100h-100zM900 100v100h100v-100h-100zM900 300v100h100v-100h-100zM900 500v100h100v-100h-100z" />
-<glyph unicode="&#xe110;" d="M0 200v200h259l600 600h241v198l300 -295l-300 -300v197h-159l-600 -600h-341zM0 800h259l122 -122l141 142l-181 180h-341v-200zM678 381l141 142l122 -123h159v198l300 -295l-300 -300v197h-241z" />
-<glyph unicode="&#xe111;" d="M0 400v600q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5z" />
-<glyph unicode="&#xe112;" d="M100 600v200h300v-250q0 -113 6 -145q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5 t-58 109.5t-31.5 116t-15 104t-3 83zM100 900v300h300v-300h-300zM800 900v300h300v-300h-300z" />
-<glyph unicode="&#xe113;" d="M-30 411l227 -227l352 353l353 -353l226 227l-578 579z" />
-<glyph unicode="&#xe114;" d="M70 797l580 -579l578 579l-226 227l-353 -353l-352 353z" />
-<glyph unicode="&#xe115;" d="M-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196zM402 1000l215 -200h381v-400h-198l299 -283l299 283h-200v600h-796z" />
-<glyph unicode="&#xe116;" d="M18 939q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15 t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43z" />
-<glyph unicode="&#xe117;" d="M0 0v800h1200v-800h-1200zM0 900v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-100h-1200z" />
-<glyph unicode="&#xe118;" d="M1 0l300 700h1200l-300 -700h-1200zM1 400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000z" />
-<glyph unicode="&#xe119;" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" />
-<glyph unicode="&#xe120;" d="M0 600l300 298v-198h600v198l300 -298l-300 -297v197h-600v-197z" />
-<glyph unicode="&#xe121;" d="M0 100v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM800 100h100v100h-100v-100z M1000 100h100v100h-100v-100z" />
-<glyph unicode="&#xe122;" d="M-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5zM100 500v250v8v8v7t0.5 7t1.5 5.5t2 5t3 4t4.5 3.5t6 1.5t7.5 0.5h200l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35 q-55 337 -55 351zM1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35z" />
-<glyph unicode="&#xe123;" d="M74 350q0 21 13.5 35.5t33.5 14.5h18l117 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94q20 0 29 -10.5t3 -29.5q-18 -36 -18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-8 -3 -23 -8.5 t-65 -20t-103 -25t-132.5 -19.5t-158.5 -9q-125 0 -245.5 20.5t-178.5 40.5l-58 20q-18 7 -31 27.5t-13 40.5zM497 110q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6t-103 6z" />
-<glyph unicode="&#xe124;" d="M21 445l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180l-155 180l-45 -233l-224 78l78 -225l-233 -44l179 -156z" />
-<glyph unicode="&#xe125;" d="M0 200h200v600h-200v-600zM300 275q0 -75 100 -75h61q124 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400z M400 300v375l150 213l100 212h50v-175l-50 -225h450v-125l-250 -375h-214l-136 100h-100z" />
-<glyph unicode="&#xe126;" d="M0 400v600h200v-600h-200zM300 525v400q0 75 100 75h61q124 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5h-50q-27 0 -51 20t-38 48l-96 198l-145 196 q-20 26 -20 63zM400 525l150 -212l100 -213h50v175l-50 225h450v125l-250 375h-214l-136 -100h-100v-375z" />
-<glyph unicode="&#xe127;" d="M8 200v600h200v-600h-200zM308 275v525q0 17 14 35.5t28 28.5l14 9l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341 q-7 0 -90 81t-83 94zM408 289l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83l-339 -236v-503z" />
-<glyph unicode="&#xe128;" d="M-101 651q0 72 54 110t139 38l302 -1l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6l365 -230q7 -4 17 -10.5t26.5 -26t16.5 -36.5v-526q0 -13 -86 -93.5t-94 -80.5h-341q-16 0 -29.5 20t-19.5 41l-130 339h-107q-84 0 -139 39t-55 111zM-1 601h222 q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l107 89v502l-343 237l-87 -83l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100zM1000 201v600h200v-600h-200z" />
-<glyph unicode="&#xe129;" d="M97 719l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53zM172 739l83 86l183 -146 q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6.5v7.5v6.5v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294l-89 -100h-503zM400 0v200h600v-200h-600z" />
-<glyph unicode="&#xe130;" d="M2 585q-16 -31 6 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85q0 -51 -0.5 -153.5t-0.5 -148.5q0 -84 38.5 -138t110.5 -54t111 55t39 139v106l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15zM77 565l236 339h503 l89 -100v-294l-340 -130q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146zM305 1104v200h600v-200h-600z" />
-<glyph unicode="&#xe131;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM298 701l2 -201h300l-2 -194l402 294l-402 298v-197h-300z" />
-<glyph unicode="&#xe132;" d="M0 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5zM200 600l402 -294l-2 194h300l2 201h-300v197z" />
-<glyph unicode="&#xe133;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600h200v-300h200v300h200l-300 400z" />
-<glyph unicode="&#xe134;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600l300 -400l300 400h-200v300h-200v-300h-200z" />
-<glyph unicode="&#xe135;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM254 780q-8 -33 5.5 -92.5t7.5 -87.5q0 -9 17 -44t16 -60 q12 0 23 -5.5t23 -15t20 -13.5q24 -12 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55t-20 -57q42 -71 87 -80q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q104 -3 221 112q30 29 47 47t34.5 49t20.5 62q-14 9 -37 9.5t-36 7.5q-14 7 -49 15t-52 19q-9 0 -39.5 -0.5 t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5t5.5 57.5 q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 39 2 44q31 -13 58 -14.5t39 3.5l11 4q7 36 -16.5 53.5t-64.5 28.5t-5
 6 23q-19 -3 -37 0 q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6q-15 -3 -45.5 0.5t-45.5 -2.5q-21 -7 -52 -26.5t-34 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -90.5t-29.5 -79.5zM518 916q3 12 16 30t16 25q10 -10 18.5 -10t14 6t14.5 14.5t16 12.5q0 -24 17 -66.5t17 -43.5 q-9 2 -31 5t-36 5t-32 8t-30 14zM692 1003h1h-1z" />
-<glyph unicode="&#xe136;" d="M0 164.5q0 21.5 15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138l145 -232l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5z" />
-<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M0 196v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 596v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5zM0 996v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM600 596h500v100h-500v-100zM800 196h300v100h-300v-100zM900 996h200v100h-200v-100z" />
-<glyph unicode="&#xe138;" d="M100 1100v100h1000v-100h-1000zM150 1000h900l-350 -500v-300l-200 -200v500z" />
-<glyph unicode="&#xe139;" d="M0 200v200h1200v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500z M500 1000h200v100h-200v-100z" />
-<glyph unicode="&#xe140;" d="M0 0v400l129 -129l200 200l142 -142l-200 -200l129 -129h-400zM0 800l129 129l200 -200l142 142l-200 200l129 129h-400v-400zM729 329l142 142l200 -200l129 129v-400h-400l129 129zM729 871l200 200l-129 129h400v-400l-129 129l-200 -200z" />
-<glyph unicode="&#xe141;" d="M0 596q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 596q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM291 655 q0 23 15.5 38.5t38.5 15.5t39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39zM400 850q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5zM514 609q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5 q22 0 38 -16t16 -39t-16 -39t-38 -16q-14 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5zM800 655q0 22 16 38t39 16t38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39z" />
-<glyph unicode="&#xe142;" d="M-40 375q-13 -95 35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -78.5 -16.5t-67.5 -51.5l-389 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23 q38 0 53 -36q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256l7 -7l69 -60 l517 511q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163z" />
-<glyph unicode="&#xe143;" d="M80 784q0 131 98.5 229.5t230.5 98.5q143 0 241 -129q103 129 246 129q129 0 226 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-197 -191 -293 -322l-17 -23l-16 23q-43 58 -100 122.5t-92 99.5t-101 100q-71 70 -104.5 105.5t-77 89.5t-61 99 t-17.5 91zM250 784q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203l12 12q64 62 97.5 97t64.5 79t31 72q0 71 -48 119.5t-105 48.5q-74 0 -132 -83l-118 -171l-114 174q-51 80 -123 80q-60 0 -109.5 -49.5t-49.5 -118.5z" />
-<glyph unicode="&#xe144;" d="M57 353q0 -95 66 -159l141 -142q68 -66 159 -66q93 0 159 66l283 283q66 66 66 159t-66 159l-141 141q-8 9 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159zM269 706q0 -93 66 -159l141 -141q7 -7 19 -17l105 105 l-212 212l389 389l247 -247l-95 -96l18 -17q47 -49 77 -100l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159z" />
-<glyph unicode="&#xe145;" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM300 300h600v700h-600v-700zM496 150q0 -43 30.5 -73.5t73.5 -30.5t73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5 t-73.5 -30.5t-30.5 -73.5z" />
-<glyph unicode="&#xe146;" d="M0 0l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207z" />
-<glyph unicode="&#xe148;" d="M295 433h139q5 -77 48.5 -126.5t117.5 -64.5v335q-6 1 -15.5 4t-11.5 3q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5 v-307l64 -14q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5zM466 889q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3v274q-61 -8 -97.5 -37.5t-36.5 -102.5 zM700 237q170 18 170 151q0 64 -44 99.5t-126 60.5v-311z" />
-<glyph unicode="&#xe149;" d="M100 600v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -28 16.5 -69.5t28 -62.5t41.5 -72h241v-100h-197q8 -50 -2.5 -115 t-31.5 -94q-41 -59 -99 -113q35 11 84 18t70 7q33 1 103 -16t103 -17q76 0 136 30l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221z" />
-<glyph unicode="&#xe150;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM602 900l298 300l298 -300h-198v-900h-200v900h-198z" />
-<glyph unicode="&#xe151;" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v200h100v-100h200v-100h-300zM700 400v100h300v-200h-99v-100h-100v100h99v100h-200zM700 700v500h300v-500h-100v100h-100v-100h-100zM801 900h100v200h-100v-200z" />
-<glyph unicode="&#xe152;" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v500h300v-500h-100v100h-100v-100h-100zM700 700v200h100v-100h200v-100h-300zM700 1100v100h300v-200h-99v-100h-100v100h99v100h-200zM801 200h100v200h-100v-200z" />
-<glyph unicode="&#xe153;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 100v400h300v-500h-100v100h-200zM800 1100v100h200v-500h-100v400h-100zM901 200h100v200h-100v-200z" />
-<glyph unicode="&#xe154;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 400v100h200v-500h-100v400h-100zM800 800v400h300v-500h-100v100h-200zM901 900h100v200h-100v-200z" />
-<glyph unicode="&#xe155;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h500v-200h-500zM700 400v200h400v-200h-400zM700 700v200h300v-200h-300zM700 1000v200h200v-200h-200z" />
-<glyph unicode="&#xe156;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h200v-200h-200zM700 400v200h300v-200h-300zM700 700v200h400v-200h-400zM700 1000v200h500v-200h-500z" />
-<glyph unicode="&#xe157;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500z" />
-<glyph unicode="&#xe158;" d="M0 400v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-163 0 -281.5 117.5t-118.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM400 300l333 250l-333 250v-500z" />
-<glyph unicode="&#xe159;" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 700l250 -333l250 333h-500z" />
-<glyph unicode="&#xe160;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 400h500l-250 333z" />
-<glyph unicode="&#xe161;" d="M0 400v300h300v200l400 -350l-400 -350v200h-300zM500 0v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400z" />
-<glyph unicode="&#xe162;" d="M217 519q8 -19 31 -19h302q-155 -438 -160 -458q-5 -21 4 -32l9 -8h9q14 0 26 15q11 13 274.5 321.5t264.5 308.5q14 19 5 36q-8 17 -31 17l-301 -1q1 4 78 219.5t79 227.5q2 15 -5 27l-9 9h-9q-15 0 -25 -16q-4 -6 -98 -111.5t-228.5 -257t-209.5 -237.5q-16 -19 -6 -41 z" />
-<glyph unicode="&#xe163;" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300zM600 400v300h300v200l400 -350l-400 -350v200h-300z " />
-<glyph unicode="&#xe164;" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98l-78 73l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5 v-300zM496 709l353 342l-149 149h500v-500l-149 149l-342 -353z" />
-<glyph unicode="&#xe165;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM406 600 q0 80 57 137t137 57t137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137z" />
-<glyph unicode="&#xe166;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 800l445 -500l450 500h-295v400h-300v-400h-300zM900 150h100v50h-100v-50z" />
-<glyph unicode="&#xe167;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 700h300v-300h300v300h295l-445 500zM900 150h100v50h-100v-50z" />
-<glyph unicode="&#xe168;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 705l305 -305l596 596l-154 155l-442 -442l-150 151zM900 150h100v50h-100v-50z" />
-<glyph unicode="&#xe169;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 988l97 -98l212 213l-97 97zM200 400l697 1l3 699l-250 -239l-149 149l-212 -212l149 -149zM900 150h100v50h-100v-50z" />
-<glyph unicode="&#xe170;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM200 612l212 -212l98 97l-213 212zM300 1200l239 -250l-149 -149l212 -212l149 148l249 -237l-1 697zM900 150h100v50h-100v-50z" />
-<glyph unicode="&#xe171;" d="M23 415l1177 784v-1079l-475 272l-310 -393v416h-392zM494 210l672 938l-672 -712v-226z" />
-<glyph unicode="&#xe172;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200z" />
-<glyph unicode="&#xe173;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120l-126 -127h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM581 306l123 123l120 -120l353 352l123 -123l-475 -476zM600 1000h100v200h-100v-200z" />
-<glyph unicode="&#xe174;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170l-298 -298h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200zM700 133l170 170l-170 170l127 127l170 -170l170 170l127 -128l-170 -169l170 -170 l-127 -127l-170 170l-170 -170z" />
-<glyph unicode="&#xe175;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300l300 -300l300 300h-200v300h-200v-300h-200zM600 1000v200h100v-200h-100z" />
-<glyph unicode="&#xe176;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200l-298 -298h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300h200v-300h200v300h200l-300 300zM600 1000v200h100v-200h-100z" />
-<glyph unicode="&#xe177;" d="M0 250q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200v-550zM0 900h1200v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 300v200h400v-200h-400z" />
-<glyph unicode="&#xe178;" d="M0 400l300 298v-198h400v-200h-400v-198zM100 800v200h100v-200h-100zM300 800v200h100v-200h-100zM500 800v200h400v198l300 -298l-300 -298v198h-400zM800 300v200h100v-200h-100zM1000 300h100v200h-100v-200z" />
-<glyph unicode="&#xe179;" d="M100 700v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300l50 100l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447zM800 597q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5 t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v1106q0 31 -18 40.5t-44 -7.5l-276 -116q-25 -17 -43.5 -51.5t-18.5 -65.5v-359z" />
-<glyph unicode="&#xe180;" d="M100 0h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5 t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56z" />
-<glyph unicode="&#xe181;" d="M0 300q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM100 100h400l200 200h105l295 98v-298h-425l-100 -100h-375zM100 300v200h300v-200h-300zM100 600v200h300v-200h-300z M100 1000h400l200 -200v-98l295 98h105v200h-425l-100 100h-375zM700 402v163l400 133v-163z" />
-<glyph unicode="&#xe182;" d="M16.5 974.5q0.5 -21.5 16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q17 18 13.5 41t-22.5 37l-192 136q-19 14 -45 12t-42 -19l-118 -118q-142 101 -268 227t-227 268l118 118q17 17 20 41.5t-11 44.5 l-139 194q-14 19 -36.5 22t-40.5 -14l-162 -162q-1 -11 -0.5 -32.5z" />
-<glyph unicode="&#xe183;" d="M0 50v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5t30 -27.5t12 -24l1 -10v-50l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-20 0 -35 14.5t-15 35.5zM0 712 q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40 t-53.5 -36.5t-31 -27.5l-9 -10v-200z" />
-<glyph unicode="&#xe184;" d="M100 0v100h1100v-100h-1100zM175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250z" />
-<glyph unicode="&#xe185;" d="M100 0h300v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400zM500 0v1000q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300zM900 0v700q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300z" />
-<glyph unicode="&#xe186;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
-<glyph unicode="&#xe187;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h100v200h100v-200h100v500h-100v-200h-100v200h-100v-500zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
-<glyph unicode="&#xe188;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v100h-200v300h200v100h-300v-500zM600 300h300v100h-200v300h200v100h-300v-500z" />
-<glyph unicode="&#xe189;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 550l300 -150v300zM600 400l300 150l-300 150v-300z" />
-<glyph unicode="&#xe190;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300v500h700v-500h-700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM575 549 q0 -65 27 -107t68 -42h130v300h-130q-38 0 -66.5 -43t-28.5 -108z" />
-<glyph unicode="&#xe191;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
-<glyph unicode="&#xe192;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v400h-200v100h-100v-500zM301 400v200h100v-200h-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
-<glyph unicode="&#xe193;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 700v100h300v-300h-99v-100h-100v100h99v200h-200zM201 300v100h100v-100h-100zM601 300v100h100v-100h-100z M700 700v100h200v-500h-100v400h-100z" />
-<glyph unicode="&#xe194;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 500v200 l100 100h300v-100h-300v-200h300v-100h-300z" />
-<glyph unicode="&#xe195;" d="M0 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 400v400h300 l100 -100v-100h-100v100h-200v-100h200v-100h-200v-100h-100zM700 400v100h100v-100h-100z" />
-<glyph unicode="&#xe197;" d="M-14 494q0 -80 56.5 -137t135.5 -57h222v300h400v-300h128q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200h200v300h200v-300h200 l-300 -300z" />
-<glyph unicode="&#xe198;" d="M-14 494q0 -80 56.5 -137t135.5 -57h8l414 414l403 -403q94 26 154.5 104.5t60.5 178.5q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200l300 300 l300 -300h-200v-300h-200v300h-200z" />
-<glyph unicode="&#xe199;" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" />
-<glyph unicode="&#xe200;" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -11.5t1 -11.5q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" />
+<glyph unicode="&#x2601;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -206.5q0 -121 -85 -207.5t-205 -86.5h-750q-79 0 -135.5 57t-56.5 137q0 69 42.5 122.5t108.5 67.5q-2 12 -2 37q0 153 108 260.5t260 107.5z" />
+<glyph unicode="&#x26fa;" d="M774 1193.5q16 -9.5 20.5 -27t-5.5 -33.5l-136 -187l467 -746h30q20 0 35 -18.5t15 -39.5v-42h-1200v42q0 21 15 39.5t35 18.5h30l468 746l-135 183q-10 16 -5.5 34t20.5 28t34 5.5t28 -20.5l111 -148l112 150q9 16 27 20.5t34 -5zM600 200h377l-182 112l-195 534v-646z " />
+<glyph unicode="&#x2709;" d="M25 1100h1150q10 0 12.5 -5t-5.5 -13l-564 -567q-8 -8 -18 -8t-18 8l-564 567q-8 8 -5.5 13t12.5 5zM18 882l264 -264q8 -8 8 -18t-8 -18l-264 -264q-8 -8 -13 -5.5t-5 12.5v550q0 10 5 12.5t13 -5.5zM918 618l264 264q8 8 13 5.5t5 -12.5v-550q0 -10 -5 -12.5t-13 5.5 l-264 264q-8 8 -8 18t8 18zM818 482l364 -364q8 -8 5.5 -13t-12.5 -5h-1150q-10 0 -12.5 5t5.5 13l364 364q8 8 18 8t18 -8l164 -164q8 -8 18 -8t18 8l164 164q8 8 18 8t18 -8z" />
+<glyph unicode="&#x270f;" d="M1011 1210q19 0 33 -13l153 -153q13 -14 13 -33t-13 -33l-99 -92l-214 214l95 96q13 14 32 14zM1013 800l-615 -614l-214 214l614 614zM317 96l-333 -112l110 335z" />
+<glyph unicode="&#xe001;" d="M700 650v-550h250q21 0 35.5 -14.5t14.5 -35.5v-50h-800v50q0 21 14.5 35.5t35.5 14.5h250v550l-500 550h1200z" />
+<glyph unicode="&#xe002;" d="M368 1017l645 163q39 15 63 0t24 -49v-831q0 -55 -41.5 -95.5t-111.5 -63.5q-79 -25 -147 -4.5t-86 75t25.5 111.5t122.5 82q72 24 138 8v521l-600 -155v-606q0 -42 -44 -90t-109 -69q-79 -26 -147 -5.5t-86 75.5t25.5 111.5t122.5 82.5q72 24 138 7v639q0 38 14.5 59 t53.5 34z" />
+<glyph unicode="&#xe003;" d="M500 1191q100 0 191 -39t156.5 -104.5t104.5 -156.5t39 -191l-1 -2l1 -5q0 -141 -78 -262l275 -274q23 -26 22.5 -44.5t-22.5 -42.5l-59 -58q-26 -20 -46.5 -20t-39.5 20l-275 274q-119 -77 -261 -77l-5 1l-2 -1q-100 0 -191 39t-156.5 104.5t-104.5 156.5t-39 191 t39 191t104.5 156.5t156.5 104.5t191 39zM500 1022q-88 0 -162 -43t-117 -117t-43 -162t43 -162t117 -117t162 -43t162 43t117 117t43 162t-43 162t-117 117t-162 43z" />
+<glyph unicode="&#xe005;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104z" />
+<glyph unicode="&#xe006;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429z" />
+<glyph unicode="&#xe007;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429zM477 700h-240l197 -142l-74 -226 l193 139l195 -140l-74 229l192 140h-234l-78 211z" />
+<glyph unicode="&#xe008;" d="M600 1200q124 0 212 -88t88 -212v-250q0 -46 -31 -98t-69 -52v-75q0 -10 6 -21.5t15 -17.5l358 -230q9 -5 15 -16.5t6 -21.5v-93q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v93q0 10 6 21.5t15 16.5l358 230q9 6 15 17.5t6 21.5v75q-38 0 -69 52 t-31 98v250q0 124 88 212t212 88z" />
+<glyph unicode="&#xe009;" d="M25 1100h1150q10 0 17.5 -7.5t7.5 -17.5v-1050q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v1050q0 10 7.5 17.5t17.5 7.5zM100 1000v-100h100v100h-100zM875 1000h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5t17.5 -7.5h550 q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM1000 1000v-100h100v100h-100zM100 800v-100h100v100h-100zM1000 800v-100h100v100h-100zM100 600v-100h100v100h-100zM1000 600v-100h100v100h-100zM875 500h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5 t17.5 -7.5h550q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM100 400v-100h100v100h-100zM1000 400v-100h100v100h-100zM100 200v-100h100v100h-100zM1000 200v-100h100v100h-100z" />
+<glyph unicode="&#xe010;" d="M50 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM50 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe011;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM850 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 700h200q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 3
 00h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5 t35.5 14.5z" />
+<glyph unicode="&#xe012;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h700q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe013;" d="M465 477l571 571q8 8 18 8t17 -8l177 -177q8 -7 8 -17t-8 -18l-783 -784q-7 -8 -17.5 -8t-17.5 8l-384 384q-8 8 -8 18t8 17l177 177q7 8 17 8t18 -8l171 -171q7 -7 18 -7t18 7z" />
+<glyph unicode="&#xe014;" d="M904 1083l178 -179q8 -8 8 -18.5t-8 -17.5l-267 -268l267 -268q8 -7 8 -17.5t-8 -18.5l-178 -178q-8 -8 -18.5 -8t-17.5 8l-268 267l-268 -267q-7 -8 -17.5 -8t-18.5 8l-178 178q-8 8 -8 18.5t8 17.5l267 268l-267 268q-8 7 -8 17.5t8 18.5l178 178q8 8 18.5 8t17.5 -8 l268 -267l268 268q7 7 17.5 7t18.5 -7z" />
+<glyph unicode="&#xe015;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM425 900h150q10 0 17.5 -7.5t7.5 -17.5v-75h75q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5 t-17.5 -7.5h-75v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-75q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v75q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe016;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM325 800h350q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-350q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe017;" d="M550 1200h100q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM800 975v166q167 -62 272 -209.5t105 -331.5q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5 t-184.5 123t-123 184.5t-45.5 224q0 184 105 331.5t272 209.5v-166q-103 -55 -165 -155t-62 -220q0 -116 57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5q0 120 -62 220t-165 155z" />
+<glyph unicode="&#xe018;" d="M1025 1200h150q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM725 800h150q10 0 17.5 -7.5t7.5 -17.5v-750q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v750 q0 10 7.5 17.5t17.5 7.5zM425 500h150q10 0 17.5 -7.5t7.5 -17.5v-450q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v450q0 10 7.5 17.5t17.5 7.5zM125 300h150q10 0 17.5 -7.5t7.5 -17.5v-250q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5 v250q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe019;" d="M600 1174q33 0 74 -5l38 -152l5 -1q49 -14 94 -39l5 -2l134 80q61 -48 104 -105l-80 -134l3 -5q25 -44 39 -93l1 -6l152 -38q5 -43 5 -73q0 -34 -5 -74l-152 -38l-1 -6q-15 -49 -39 -93l-3 -5l80 -134q-48 -61 -104 -105l-134 81l-5 -3q-44 -25 -94 -39l-5 -2l-38 -151 q-43 -5 -74 -5q-33 0 -74 5l-38 151l-5 2q-49 14 -94 39l-5 3l-134 -81q-60 48 -104 105l80 134l-3 5q-25 45 -38 93l-2 6l-151 38q-6 42 -6 74q0 33 6 73l151 38l2 6q13 48 38 93l3 5l-80 134q47 61 105 105l133 -80l5 2q45 25 94 39l5 1l38 152q43 5 74 5zM600 815 q-89 0 -152 -63t-63 -151.5t63 -151.5t152 -63t152 63t63 151.5t-63 151.5t-152 63z" />
+<glyph unicode="&#xe020;" d="M500 1300h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-75h-1100v75q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5zM500 1200v-100h300v100h-300zM1100 900v-800q0 -41 -29.5 -70.5t-70.5 -29.5h-700q-41 0 -70.5 29.5t-29.5 70.5 v800h900zM300 800v-700h100v700h-100zM500 800v-700h100v700h-100zM700 800v-700h100v700h-100zM900 800v-700h100v700h-100z" />
+<glyph unicode="&#xe021;" d="M18 618l620 608q8 7 18.5 7t17.5 -7l608 -608q8 -8 5.5 -13t-12.5 -5h-175v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v375h-300v-375q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v575h-175q-10 0 -12.5 5t5.5 13z" />
+<glyph unicode="&#xe022;" d="M600 1200v-400q0 -41 29.5 -70.5t70.5 -29.5h300v-650q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5h450zM1000 800h-250q-21 0 -35.5 14.5t-14.5 35.5v250z" />
+<glyph unicode="&#xe023;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h50q10 0 17.5 -7.5t7.5 -17.5v-275h175q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe024;" d="M1300 0h-538l-41 400h-242l-41 -400h-538l431 1200h209l-21 -300h162l-20 300h208zM515 800l-27 -300h224l-27 300h-170z" />
+<glyph unicode="&#xe025;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-450h191q20 0 25.5 -11.5t-7.5 -27.5l-327 -400q-13 -16 -32 -16t-32 16l-327 400q-13 16 -7.5 27.5t25.5 11.5h191v450q0 21 14.5 35.5t35.5 14.5zM1125 400h50q10 0 17.5 -7.5t7.5 -17.5v-350q0 -10 -7.5 -17.5t-17.5 -7.5 h-1050q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h50q10 0 17.5 -7.5t7.5 -17.5v-175h900v175q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe026;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -275q-13 -16 -32 -16t-32 16l-223 275q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z " />
+<glyph unicode="&#xe027;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM632 914l223 -275q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5l223 275q13 16 32 16 t32 -16z" />
+<glyph unicode="&#xe028;" d="M225 1200h750q10 0 19.5 -7t12.5 -17l186 -652q7 -24 7 -49v-425q0 -12 -4 -27t-9 -17q-12 -6 -37 -6h-1100q-12 0 -27 4t-17 8q-6 13 -6 38l1 425q0 25 7 49l185 652q3 10 12.5 17t19.5 7zM878 1000h-556q-10 0 -19 -7t-11 -18l-87 -450q-2 -11 4 -18t16 -7h150 q10 0 19.5 -7t11.5 -17l38 -152q2 -10 11.5 -17t19.5 -7h250q10 0 19.5 7t11.5 17l38 152q2 10 11.5 17t19.5 7h150q10 0 16 7t4 18l-87 450q-2 11 -11 18t-19 7z" />
+<glyph unicode="&#xe029;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM540 820l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
+<glyph unicode="&#xe030;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-362q0 -10 -7.5 -17.5t-17.5 -7.5h-362q-11 0 -13 5.5t5 12.5l133 133q-109 76 -238 76q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5h150q0 -117 -45.5 -224 t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117z" />
+<glyph unicode="&#xe031;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-361q0 -11 -7.5 -18.5t-18.5 -7.5h-361q-11 0 -13 5.5t5 12.5l134 134q-110 75 -239 75q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5h-150q0 117 45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117zM1027 600h150 q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5q-192 0 -348 118l-134 -134q-7 -8 -12.5 -5.5t-5.5 12.5v360q0 11 7.5 18.5t18.5 7.5h360q10 0 12.5 -5.5t-5.5 -12.5l-133 -133q110 -76 240 -76q116 0 214.5 57t155.5 155.5t57 214.5z" />
+<glyph unicode="&#xe032;" d="M125 1200h1050q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-1050q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM1075 1000h-850q-10 0 -17.5 -7.5t-7.5 -17.5v-850q0 -10 7.5 -17.5t17.5 -7.5h850q10 0 17.5 7.5t7.5 17.5v850 q0 10 -7.5 17.5t-17.5 7.5zM325 900h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 900h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 700h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 700h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 500h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 500h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-
 450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 300h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 300h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe033;" d="M900 800v200q0 83 -58.5 141.5t-141.5 58.5h-300q-82 0 -141 -59t-59 -141v-200h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h900q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-100zM400 800v150q0 21 15 35.5t35 14.5h200 q20 0 35 -14.5t15 -35.5v-150h-300z" />
+<glyph unicode="&#xe034;" d="M125 1100h50q10 0 17.5 -7.5t7.5 -17.5v-1075h-100v1075q0 10 7.5 17.5t17.5 7.5zM1075 1052q4 0 9 -2q16 -6 16 -23v-421q0 -6 -3 -12q-33 -59 -66.5 -99t-65.5 -58t-56.5 -24.5t-52.5 -6.5q-26 0 -57.5 6.5t-52.5 13.5t-60 21q-41 15 -63 22.5t-57.5 15t-65.5 7.5 q-85 0 -160 -57q-7 -5 -15 -5q-6 0 -11 3q-14 7 -14 22v438q22 55 82 98.5t119 46.5q23 2 43 0.5t43 -7t32.5 -8.5t38 -13t32.5 -11q41 -14 63.5 -21t57 -14t63.5 -7q103 0 183 87q7 8 18 8z" />
+<glyph unicode="&#xe035;" d="M600 1175q116 0 227 -49.5t192.5 -131t131 -192.5t49.5 -227v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v300q0 127 -70.5 231.5t-184.5 161.5t-245 57t-245 -57t-184.5 -161.5t-70.5 -231.5v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50 q-10 0 -17.5 7.5t-7.5 17.5v300q0 116 49.5 227t131 192.5t192.5 131t227 49.5zM220 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6zM820 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460 q0 8 6 14t14 6z" />
+<glyph unicode="&#xe036;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM900 668l120 120q7 7 17 7t17 -7l34 -34q7 -7 7 -17t-7 -17l-120 -120l120 -120q7 -7 7 -17 t-7 -17l-34 -34q-7 -7 -17 -7t-17 7l-120 119l-120 -119q-7 -7 -17 -7t-17 7l-34 34q-7 7 -7 17t7 17l119 120l-119 120q-7 7 -7 17t7 17l34 34q7 8 17 8t17 -8z" />
+<glyph unicode="&#xe037;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6 l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238q-6 8 -4.5 18t9.5 17l29 22q7 5 15 5z" />
+<glyph unicode="&#xe038;" d="M967 1004h3q11 -1 17 -10q135 -179 135 -396q0 -105 -34 -206.5t-98 -185.5q-7 -9 -17 -10h-3q-9 0 -16 6l-42 34q-8 6 -9 16t5 18q111 150 111 328q0 90 -29.5 176t-84.5 157q-6 9 -5 19t10 16l42 33q7 5 15 5zM321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5 t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238 q-6 8 -4.5 18.5t9.5 16.5l29 22q7 5 15 5z" />
+<glyph unicode="&#xe039;" d="M500 900h100v-100h-100v-100h-400v-100h-100v600h500v-300zM1200 700h-200v-100h200v-200h-300v300h-200v300h-100v200h600v-500zM100 1100v-300h300v300h-300zM800 1100v-300h300v300h-300zM300 900h-100v100h100v-100zM1000 900h-100v100h100v-100zM300 500h200v-500 h-500v500h200v100h100v-100zM800 300h200v-100h-100v-100h-200v100h-100v100h100v200h-200v100h300v-300zM100 400v-300h300v300h-300zM300 200h-100v100h100v-100zM1200 200h-100v100h100v-100zM700 0h-100v100h100v-100zM1200 0h-300v100h300v-100z" />
+<glyph unicode="&#xe040;" d="M100 200h-100v1000h100v-1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 200h-200v1000h200v-1000zM400 0h-300v100h300v-100zM600 0h-100v91h100v-91zM800 0h-100v91h100v-91zM1100 0h-200v91h200v-91z" />
+<glyph unicode="&#xe041;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
+<glyph unicode="&#xe042;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM800 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-56 56l424 426l-700 700h150zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5 t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
+<glyph unicode="&#xe043;" d="M300 1200h825q75 0 75 -75v-900q0 -25 -18 -43l-64 -64q-8 -8 -13 -5.5t-5 12.5v950q0 10 -7.5 17.5t-17.5 7.5h-700q-25 0 -43 -18l-64 -64q-8 -8 -5.5 -13t12.5 -5h700q10 0 17.5 -7.5t7.5 -17.5v-950q0 -10 -7.5 -17.5t-17.5 -7.5h-850q-10 0 -17.5 7.5t-7.5 17.5v975 q0 25 18 43l139 139q18 18 43 18z" />
+<glyph unicode="&#xe044;" d="M250 1200h800q21 0 35.5 -14.5t14.5 -35.5v-1150l-450 444l-450 -445v1151q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe045;" d="M822 1200h-444q-11 0 -19 -7.5t-9 -17.5l-78 -301q-7 -24 7 -45l57 -108q6 -9 17.5 -15t21.5 -6h450q10 0 21.5 6t17.5 15l62 108q14 21 7 45l-83 301q-1 10 -9 17.5t-19 7.5zM1175 800h-150q-10 0 -21 -6.5t-15 -15.5l-78 -156q-4 -9 -15 -15.5t-21 -6.5h-550 q-10 0 -21 6.5t-15 15.5l-78 156q-4 9 -15 15.5t-21 6.5h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-650q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h750q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5 t7.5 17.5v650q0 10 -7.5 17.5t-17.5 7.5zM850 200h-500q-10 0 -19.5 -7t-11.5 -17l-38 -152q-2 -10 3.5 -17t15.5 -7h600q10 0 15.5 7t3.5 17l-38 152q-2 10 -11.5 17t-19.5 7z" />
+<glyph unicode="&#xe046;" d="M500 1100h200q56 0 102.5 -20.5t72.5 -50t44 -59t25 -50.5l6 -20h150q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h150q2 8 6.5 21.5t24 48t45 61t72 48t102.5 21.5zM900 800v-100 h100v100h-100zM600 730q-95 0 -162.5 -67.5t-67.5 -162.5t67.5 -162.5t162.5 -67.5t162.5 67.5t67.5 162.5t-67.5 162.5t-162.5 67.5zM600 603q43 0 73 -30t30 -73t-30 -73t-73 -30t-73 30t-30 73t30 73t73 30z" />
+<glyph unicode="&#xe047;" d="M681 1199l385 -998q20 -50 60 -92q18 -19 36.5 -29.5t27.5 -11.5l10 -2v-66h-417v66q53 0 75 43.5t5 88.5l-82 222h-391q-58 -145 -92 -234q-11 -34 -6.5 -57t25.5 -37t46 -20t55 -6v-66h-365v66q56 24 84 52q12 12 25 30.5t20 31.5l7 13l399 1006h93zM416 521h340 l-162 457z" />
+<glyph unicode="&#xe04

<TRUNCATED>
http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/fonts/glyphicons-halflings-regular.ttf
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/fonts/glyphicons-halflings-regular.ttf b/falcon-ui/app/css/fonts/glyphicons-halflings-regular.ttf
index 67fa00b..1413fc6 100644
Binary files a/falcon-ui/app/css/fonts/glyphicons-halflings-regular.ttf and b/falcon-ui/app/css/fonts/glyphicons-halflings-regular.ttf differ


[02/22] falcon git commit: FALCON-1315 Update falcon ui for HiveDR, secure clusters and bug fixes. Contributed by Armando Reyna/Venkat Ranganathan.

Posted by so...@apache.org.
http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/express-data/chartData.js
----------------------------------------------------------------------
diff --git a/falcon-ui/express-data/chartData.js b/falcon-ui/express-data/chartData.js
new file mode 100644
index 0000000..46437ba
--- /dev/null
+++ b/falcon-ui/express-data/chartData.js
@@ -0,0 +1,215 @@
+/**
+ * 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.
+ */
+(function () {
+  'use strict';
+
+  var feedHours = [{"summary":[{"startTime":"2015-01-01T00:00:00+00:00","endTime":"2015-01-01T01:00:00+00:00","numFailedInstances":10,"numSuccessfullInstances":5,"dataSizeCopied":677.28},{"startTime":"2015-01-01T01:00:00+00:00","endTime":"2015-01-01T02:00:00+00:00","numFailedInstances":1,"numSuccessfullInstances":6,"dataSizeCopied":77.28},{"startTime":"2015-01-01T02:00:00+00:00","endTime":"2015-01-01T03:00:00+00:00","numFailedInstances":0,"numSuccessfullInstances":8,"dataSizeCopied":1677.13},{"startTime":"2015-01-01T03:00:00+00:00","endTime":"2015-01-01T04:00:00+00:00","numFailedInstances":0,"numSuccessfullInstances":2,"dataSizeCopied":132.14},{"startTime":"2015-01-01T04:00:00+00:00","endTime":"2015-01-01T05:00:00+00:00","numFailedInstances":9,"numSuccessfullInstances":15,"dataSizeCopied":1532.45},{"startTime":"2015-01-01T05:00:00+00:00","endTime":"2015-01-01T06:00:00+00:00","numFailedInstances":1,"numSuccessfullInstances":2,"dataSizeCopied":0.98},{"startTime":"2015-01-01T06:00:00+0
 0:00","endTime":"2015-01-01T07:00:00+00:00","numFailedInstances":10,"numSuccessfullInstances":0,"dataSizeCopied":0},{"startTime":"2015-01-01T07:00:00+00:00","endTime":"2015-01-01T08:00:00+00:00","numFailedInstances":13,"numSuccessfullInstances":5,"dataSizeCopied":2543.52},{"startTime":"2015-01-01T08:00:00+00:00","endTime":"2015-01-01T01:09:00+00:00","numFailedInstances":1,"numSuccessfullInstances":15,"dataSizeCopied":7002.28},{"startTime":"2015-01-01T09:00:00+00:00","endTime":"2015-01-01T10:00:00+00:00","numFailedInstances":11,"numSuccessfullInstances":25,"dataSizeCopied":762.02},{"startTime":"2015-01-01T10:00:00+00:00","endTime":"2015-01-01T11:00:00+00:00","numFailedInstances":14,"numSuccessfullInstances":12,"dataSizeCopied":4163.28},{"startTime":"2015-01-01T11:00:00+00:00","endTime":"2015-01-01T12:00:00+00:00","numFailedInstances":0,"numSuccessfullInstances":1,"dataSizeCopied":632.68},{"startTime":"2015-01-01T12:00:00+00:00","endTime":"2015-01-01T13:00:00+00:00","numFailedInstance
 s":0,"numSuccessfullInstances":7,"dataSizeCopied":1003.92},{"startTime":"2015-01-01T13:00:00+00:00","endTime":"2015-01-01T14:00:00+00:00","numFailedInstances":4,"numSuccessfullInstances":13,"dataSizeCopied":4198.62},{"startTime":"2015-01-01T14:00:00+00:00","endTime":"2015-01-01T15:00:00+00:00","numFailedInstances":7,"numSuccessfullInstances":11,"dataSizeCopied":8170.83},{"startTime":"2015-01-01T15:00:00+00:00","endTime":"2015-01-01T16:00:00+00:00","numFailedInstances":3,"numSuccessfullInstances":16,"dataSizeCopied":4812.93},{"startTime":"2015-01-01T16:00:00+00:00","endTime":"2015-01-01T17:00:00+00:00","numFailedInstances":1,"numSuccessfullInstances":18,"dataSizeCopied":7098.15},{"startTime":"2015-01-01T17:00:00+00:00","endTime":"2015-01-01T18:00:00+00:00","numFailedInstances":9,"numSuccessfullInstances":3,"dataSizeCopied":102.68},{"startTime":"2015-01-01T18:00:00+00:00","endTime":"2015-01-01T19:00:00+00:00","numFailedInstances":15,"numSuccessfullInstances":7,"dataSizeCopied":301.42}
 ,{"startTime":"2015-01-01T19:00:00+00:00","endTime":"2015-01-01T20:00:00+00:00","numFailedInstances":17,"numSuccessfullInstances":13,"dataSizeCopied":2431.50},{"startTime":"2015-01-01T20:00:00+00:00","endTime":"2015-01-01T21:00:00+00:00","numFailedInstances":6,"numSuccessfullInstances":5,"dataSizeCopied":97.57},{"startTime":"2015-01-01T21:00:00+00:00","endTime":"2015-01-01T22:00:00+00:00","numFailedInstances":0,"numSuccessfullInstances":5,"dataSizeCopied":154.32},{"startTime":"2015-01-01T22:00:00+00:00","endTime":"2015-01-01T23:00:00+00:00","numFailedInstances":0,"numSuccessfullInstances":0,"dataSizeCopied":0},{"startTime":"2015-01-01T23:00:00+00:00","endTime":"2015-01-02T00:00:00+00:00","numFailedInstances":0,"numSuccessfullInstances":3,"dataSizeCopied":2637.62}],"requestId":"23c44f3f-f528-4a94-bc0e-f95019729b42","message":"default\\/STATUS\\n","status":"SUCCEEDED"},{"summary":[{"startTime":"2015-01-02T00:00:00+00:00","endTime":"2015-01-02T01:00:00+00:00","numFailedInstances":98,"n
 umSuccessfullInstances":85,"dataSizeCopied":7268.55},{"startTime":"2015-01-02T01:00:00+00:00","endTime":"2015-01-02T02:00:00+00:00","numFailedInstances":36,"numSuccessfullInstances":20,"dataSizeCopied":3003.66},{"startTime":"2015-01-02T02:00:00+00:00","endTime":"2015-01-02T03:00:00+00:00","numFailedInstances":22,"numSuccessfullInstances":84,"dataSizeCopied":7418.37},{"startTime":"2015-01-02T03:00:00+00:00","endTime":"2015-01-02T04:00:00+00:00","numFailedInstances":48,"numSuccessfullInstances":80,"dataSizeCopied":2870.58},{"startTime":"2015-01-02T04:00:00+00:00","endTime":"2015-01-02T05:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":72,"dataSizeCopied":7422.98},{"startTime":"2015-01-02T05:00:00+00:00","endTime":"2015-01-02T06:00:00+00:00","numFailedInstances":99,"numSuccessfullInstances":32,"dataSizeCopied":5517.14},{"startTime":"2015-01-02T06:00:00+00:00","endTime":"2015-01-02T07:00:00+00:00","numFailedInstances":87,"numSuccessfullInstances":3,"dataSizeCopied":7707.7
 6},{"startTime":"2015-01-02T07:00:00+00:00","endTime":"2015-01-02T08:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":22,"dataSizeCopied":9756.59},{"startTime":"2015-01-02T08:00:00+00:00","endTime":"2015-01-02T01:09:00+00:00","numFailedInstances":26,"numSuccessfullInstances":61,"dataSizeCopied":262.23},{"startTime":"2015-01-02T09:00:00+00:00","endTime":"2015-01-02T10:00:00+00:00","numFailedInstances":55,"numSuccessfullInstances":53,"dataSizeCopied":4615.98},{"startTime":"2015-01-02T10:00:00+00:00","endTime":"2015-01-02T11:00:00+00:00","numFailedInstances":83,"numSuccessfullInstances":11,"dataSizeCopied":4451.74},{"startTime":"2015-01-02T11:00:00+00:00","endTime":"2015-01-02T12:00:00+00:00","numFailedInstances":13,"numSuccessfullInstances":33,"dataSizeCopied":4667.45},{"startTime":"2015-01-02T12:00:00+00:00","endTime":"2015-01-02T13:00:00+00:00","numFailedInstances":49,"numSuccessfullInstances":34,"dataSizeCopied":3429.94},{"startTime":"2015-01-02T13:00:00+00:00","endTi
 me":"2015-01-02T14:00:00+00:00","numFailedInstances":3,"numSuccessfullInstances":90,"dataSizeCopied":3440.41},{"startTime":"2015-01-02T14:00:00+00:00","endTime":"2015-01-02T15:00:00+00:00","numFailedInstances":8,"numSuccessfullInstances":34,"dataSizeCopied":1950.69},{"startTime":"2015-01-02T15:00:00+00:00","endTime":"2015-01-02T16:00:00+00:00","numFailedInstances":1,"numSuccessfullInstances":2,"dataSizeCopied":1525.85},{"startTime":"2015-01-02T16:00:00+00:00","endTime":"2015-01-02T17:00:00+00:00","numFailedInstances":27,"numSuccessfullInstances":64,"dataSizeCopied":731.08},{"startTime":"2015-01-02T17:00:00+00:00","endTime":"2015-01-02T18:00:00+00:00","numFailedInstances":18,"numSuccessfullInstances":59,"dataSizeCopied":8072.24},{"startTime":"2015-01-02T18:00:00+00:00","endTime":"2015-01-02T19:00:00+00:00","numFailedInstances":74,"numSuccessfullInstances":24,"dataSizeCopied":8123.93},{"startTime":"2015-01-02T19:00:00+00:00","endTime":"2015-01-02T20:00:00+00:00","numFailedInstances":7
 ,"numSuccessfullInstances":46,"dataSizeCopied":4957.95},{"startTime":"2015-01-02T20:00:00+00:00","endTime":"2015-01-02T21:00:00+00:00","numFailedInstances":11,"numSuccessfullInstances":70,"dataSizeCopied":6025.53},{"startTime":"2015-01-02T21:00:00+00:00","endTime":"2015-01-02T22:00:00+00:00","numFailedInstances":59,"numSuccessfullInstances":63,"dataSizeCopied":4502.26},{"startTime":"2015-01-02T22:00:00+00:00","endTime":"2015-01-02T23:00:00+00:00","numFailedInstances":61,"numSuccessfullInstances":96,"dataSizeCopied":5802.56},{"startTime":"2015-01-02T23:00:00+00:00","endTime":"2015-01-03T00:00:00+00:00","numFailedInstances":53,"numSuccessfullInstances":29,"dataSizeCopied":2949.03}],"requestId":"23c44f3f-f528-4a94-bc0e-f95019729b42","message":"default\\/STATUS\\n","status":"SUCCEEDED"},{"summary":[{"startTime":"2015-01-03T00:00:00+00:00","endTime":"2015-01-03T01:00:00+00:00","numFailedInstances":1,"numSuccessfullInstances":7,"dataSizeCopied":9072.47},{"startTime":"2015-01-03T01:00:00+0
 0:00","endTime":"2015-01-03T02:00:00+00:00","numFailedInstances":46,"numSuccessfullInstances":3,"dataSizeCopied":815.97},{"startTime":"2015-01-03T02:00:00+00:00","endTime":"2015-01-03T03:00:00+00:00","numFailedInstances":51,"numSuccessfullInstances":35,"dataSizeCopied":8629.88},{"startTime":"2015-01-03T03:00:00+00:00","endTime":"2015-01-03T04:00:00+00:00","numFailedInstances":37,"numSuccessfullInstances":16,"dataSizeCopied":6348.3},{"startTime":"2015-01-03T04:00:00+00:00","endTime":"2015-01-03T05:00:00+00:00","numFailedInstances":53,"numSuccessfullInstances":10,"dataSizeCopied":9914.63},{"startTime":"2015-01-03T05:00:00+00:00","endTime":"2015-01-03T06:00:00+00:00","numFailedInstances":13,"numSuccessfullInstances":61,"dataSizeCopied":315.61},{"startTime":"2015-01-03T06:00:00+00:00","endTime":"2015-01-03T07:00:00+00:00","numFailedInstances":78,"numSuccessfullInstances":79,"dataSizeCopied":5415.44},{"startTime":"2015-01-03T07:00:00+00:00","endTime":"2015-01-03T08:00:00+00:00","numFaile
 dInstances":85,"numSuccessfullInstances":59,"dataSizeCopied":8868.3},{"startTime":"2015-01-03T08:00:00+00:00","endTime":"2015-01-03T09:00:00+00:00","numFailedInstances":96,"numSuccessfullInstances":62,"dataSizeCopied":4119.68},{"startTime":"2015-01-03T09:00:00+00:00","endTime":"2015-01-03T10:00:00+00:00","numFailedInstances":2,"numSuccessfullInstances":10,"dataSizeCopied":7373.51},{"startTime":"2015-01-03T10:00:00+00:00","endTime":"2015-01-03T11:00:00+00:00","numFailedInstances":82,"numSuccessfullInstances":43,"dataSizeCopied":3540.7},{"startTime":"2015-01-03T11:00:00+00:00","endTime":"2015-01-03T12:00:00+00:00","numFailedInstances":3,"numSuccessfullInstances":29,"dataSizeCopied":7308.66},{"startTime":"2015-01-03T12:00:00+00:00","endTime":"2015-01-03T13:00:00+00:00","numFailedInstances":54,"numSuccessfullInstances":61,"dataSizeCopied":3916.97},{"startTime":"2015-01-03T13:00:00+00:00","endTime":"2015-01-03T14:00:00+00:00","numFailedInstances":92,"numSuccessfullInstances":43,"dataSize
 Copied":4470.67},{"startTime":"2015-01-03T14:00:00+00:00","endTime":"2015-01-03T15:00:00+00:00","numFailedInstances":6,"numSuccessfullInstances":13,"dataSizeCopied":6667.38},{"startTime":"2015-01-03T15:00:00+00:00","endTime":"2015-01-03T16:00:00+00:00","numFailedInstances":37,"numSuccessfullInstances":52,"dataSizeCopied":8070.53},{"startTime":"2015-01-03T16:00:00+00:00","endTime":"2015-01-03T17:00:00+00:00","numFailedInstances":11,"numSuccessfullInstances":68,"dataSizeCopied":1176.12},{"startTime":"2015-01-03T17:00:00+00:00","endTime":"2015-01-03T18:00:00+00:00","numFailedInstances":75,"numSuccessfullInstances":89,"dataSizeCopied":4148.9},{"startTime":"2015-01-03T18:00:00+00:00","endTime":"2015-01-03T19:00:00+00:00","numFailedInstances":77,"numSuccessfullInstances":84,"dataSizeCopied":4533.51},{"startTime":"2015-01-03T19:00:00+00:00","endTime":"2015-01-03T20:00:00+00:00","numFailedInstances":17,"numSuccessfullInstances":17,"dataSizeCopied":3710.7},{"startTime":"2015-01-03T20:00:00+0
 0:00","endTime":"2015-01-03T21:00:00+00:00","numFailedInstances":76,"numSuccessfullInstances":47,"dataSizeCopied":2555.19},{"startTime":"2015-01-03T21:00:00+00:00","endTime":"2015-01-03T22:00:00+00:00","numFailedInstances":70,"numSuccessfullInstances":37,"dataSizeCopied":2288.14},{"startTime":"2015-01-03T22:00:00+00:00","endTime":"2015-01-03T23:00:00+00:00","numFailedInstances":59,"numSuccessfullInstances":42,"dataSizeCopied":6847.27},{"startTime":"2015-01-03T23:00:00+00:00","endTime":"2015-01-04T00:00:00+00:00","numFailedInstances":55,"numSuccessfullInstances":48,"dataSizeCopied":511.32}],"requestId":"23c44f3f-f528-4a94-bc0e-f95019729b42","message":"default\\/STATUS\\n","status":"SUCCEEDED"}],
+      processHours = [{"summary":[{"startTime":"2015-01-01T00:00:00+00:00","endTime":"2015-01-01T01:00:00+00:00","numFailedInstances":1,"numSuccessfullInstances":15,"dataSizeCopied":577.28},{"startTime":"2015-01-01T01:00:00+00:00","endTime":"2015-01-01T02:00:00+00:00","numFailedInstances":11,"numSuccessfullInstances":26,"dataSizeCopied":727.28},{"startTime":"2015-01-01T02:00:00+00:00","endTime":"2015-01-01T03:00:00+00:00","numFailedInstances":0,"numSuccessfullInstances":28,"dataSizeCopied":677.13},{"startTime":"2015-01-01T03:00:00+00:00","endTime":"2015-01-01T04:00:00+00:00","numFailedInstances":3,"numSuccessfullInstances":5,"dataSizeCopied":132.14},{"startTime":"2015-01-01T04:00:00+00:00","endTime":"2015-01-01T05:00:00+00:00","numFailedInstances":6,"numSuccessfullInstances":11,"dataSizeCopied":132.45},{"startTime":"2015-01-01T05:00:00+00:00","endTime":"2015-01-01T06:00:00+00:00","numFailedInstances":13,"numSuccessfullInstances":12,"dataSizeCopied":120.98},{"startTime":"2015-01-01T0
 6:00:00+00:00","endTime":"2015-01-01T07:00:00+00:00","numFailedInstances":14,"numSuccessfullInstances":0,"dataSizeCopied":0},{"startTime":"2015-01-01T07:00:00+00:00","endTime":"2015-01-01T08:00:00+00:00","numFailedInstances":3,"numSuccessfullInstances":15,"dataSizeCopied":6543.52},{"startTime":"2015-01-01T08:00:00+00:00","endTime":"2015-01-01T01:09:00+00:00","numFailedInstances":7,"numSuccessfullInstances":5,"dataSizeCopied":702.28},{"startTime":"2015-01-01T09:00:00+00:00","endTime":"2015-01-01T10:00:00+00:00","numFailedInstances":1,"numSuccessfullInstances":0,"dataSizeCopied":0},{"startTime":"2015-01-01T10:00:00+00:00","endTime":"2015-01-01T11:00:00+00:00","numFailedInstances":4,"numSuccessfullInstances":2,"dataSizeCopied":213.28},{"startTime":"2015-01-01T11:00:00+00:00","endTime":"2015-01-01T12:00:00+00:00","numFailedInstances":10,"numSuccessfullInstances":4,"dataSizeCopied":62.68},{"startTime":"2015-01-01T12:00:00+00:00","endTime":"2015-01-01T13:00:00+00:00","numFailedInstances":
 1,"numSuccessfullInstances":3,"dataSizeCopied":1303.92},{"startTime":"2015-01-01T13:00:00+00:00","endTime":"2015-01-01T14:00:00+00:00","numFailedInstances":24,"numSuccessfullInstances":13,"dataSizeCopied":4198.62},{"startTime":"2015-01-01T14:00:00+00:00","endTime":"2015-01-01T15:00:00+00:00","numFailedInstances":17,"numSuccessfullInstances":31,"dataSizeCopied":2470.32},{"startTime":"2015-01-01T15:00:00+00:00","endTime":"2015-01-01T16:00:00+00:00","numFailedInstances":3,"numSuccessfullInstances":16,"dataSizeCopied":4812.93},{"startTime":"2015-01-01T16:00:00+00:00","endTime":"2015-01-01T17:00:00+00:00","numFailedInstances":1,"numSuccessfullInstances":18,"dataSizeCopied":7098.15},{"startTime":"2015-01-01T17:00:00+00:00","endTime":"2015-01-01T18:00:00+00:00","numFailedInstances":9,"numSuccessfullInstances":3,"dataSizeCopied":102.68},{"startTime":"2015-01-01T18:00:00+00:00","endTime":"2015-01-01T19:00:00+00:00","numFailedInstances":15,"numSuccessfullInstances":7,"dataSizeCopied":301.42},
 {"startTime":"2015-01-01T19:00:00+00:00","endTime":"2015-01-01T20:00:00+00:00","numFailedInstances":17,"numSuccessfullInstances":13,"dataSizeCopied":2431.50},{"startTime":"2015-01-01T20:00:00+00:00","endTime":"2015-01-01T21:00:00+00:00","numFailedInstances":6,"numSuccessfullInstances":5,"dataSizeCopied":97.57},{"startTime":"2015-01-01T21:00:00+00:00","endTime":"2015-01-01T22:00:00+00:00","numFailedInstances":0,"numSuccessfullInstances":5,"dataSizeCopied":154.32},{"startTime":"2015-01-01T22:00:00+00:00","endTime":"2015-01-01T23:00:00+00:00","numFailedInstances":0,"numSuccessfullInstances":0,"dataSizeCopied":0},{"startTime":"2015-01-01T23:00:00+00:00","endTime":"2015-01-02T00:00:00+00:00","numFailedInstances":0,"numSuccessfullInstances":3,"dataSizeCopied":2637.62}],"requestId":"23c44f3f-f528-4a94-bc0e-f95019729b42","message":"default\\/STATUS\\n","status":"SUCCEEDED"},{"summary":[{"startTime":"2015-01-02T00:00:00+00:00","endTime":"2015-01-02T01:00:00+00:00","numFailedInstances":98,"nu
 mSuccessfullInstances":85,"dataSizeCopied":7268.55},{"startTime":"2015-01-02T01:00:00+00:00","endTime":"2015-01-02T02:00:00+00:00","numFailedInstances":36,"numSuccessfullInstances":20,"dataSizeCopied":3003.66},{"startTime":"2015-01-02T02:00:00+00:00","endTime":"2015-01-02T03:00:00+00:00","numFailedInstances":22,"numSuccessfullInstances":84,"dataSizeCopied":7418.37},{"startTime":"2015-01-02T03:00:00+00:00","endTime":"2015-01-02T04:00:00+00:00","numFailedInstances":48,"numSuccessfullInstances":80,"dataSizeCopied":2870.58},{"startTime":"2015-01-02T04:00:00+00:00","endTime":"2015-01-02T05:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":72,"dataSizeCopied":7422.98},{"startTime":"2015-01-02T05:00:00+00:00","endTime":"2015-01-02T06:00:00+00:00","numFailedInstances":99,"numSuccessfullInstances":32,"dataSizeCopied":5517.14},{"startTime":"2015-01-02T06:00:00+00:00","endTime":"2015-01-02T07:00:00+00:00","numFailedInstances":87,"numSuccessfullInstances":3,"dataSizeCopied":7707.76
 },{"startTime":"2015-01-02T07:00:00+00:00","endTime":"2015-01-02T08:00:00+00:00","numFailedInstances":26,"numSuccessfullInstances":22,"dataSizeCopied":9756.59},{"startTime":"2015-01-02T08:00:00+00:00","endTime":"2015-01-02T01:09:00+00:00","numFailedInstances":26,"numSuccessfullInstances":61,"dataSizeCopied":262.23},{"startTime":"2015-01-02T09:00:00+00:00","endTime":"2015-01-02T10:00:00+00:00","numFailedInstances":55,"numSuccessfullInstances":53,"dataSizeCopied":4615.98},{"startTime":"2015-01-02T10:00:00+00:00","endTime":"2015-01-02T11:00:00+00:00","numFailedInstances":13,"numSuccessfullInstances":11,"dataSizeCopied":4451.74},{"startTime":"2015-01-02T11:00:00+00:00","endTime":"2015-01-02T12:00:00+00:00","numFailedInstances":15,"numSuccessfullInstances":23,"dataSizeCopied":467.45},{"startTime":"2015-01-02T12:00:00+00:00","endTime":"2015-01-02T13:00:00+00:00","numFailedInstances":19,"numSuccessfullInstances":34,"dataSizeCopied":3429.94},{"startTime":"2015-01-02T13:00:00+00:00","endTime
 ":"2015-01-02T14:00:00+00:00","numFailedInstances":3,"numSuccessfullInstances":90,"dataSizeCopied":3440.41},{"startTime":"2015-01-02T14:00:00+00:00","endTime":"2015-01-02T15:00:00+00:00","numFailedInstances":8,"numSuccessfullInstances":34,"dataSizeCopied":1950.69},{"startTime":"2015-01-02T15:00:00+00:00","endTime":"2015-01-02T16:00:00+00:00","numFailedInstances":1,"numSuccessfullInstances":2,"dataSizeCopied":1525.85},{"startTime":"2015-01-02T16:00:00+00:00","endTime":"2015-01-02T17:00:00+00:00","numFailedInstances":27,"numSuccessfullInstances":64,"dataSizeCopied":731.08},{"startTime":"2015-01-02T17:00:00+00:00","endTime":"2015-01-02T18:00:00+00:00","numFailedInstances":18,"numSuccessfullInstances":59,"dataSizeCopied":8072.24},{"startTime":"2015-01-02T18:00:00+00:00","endTime":"2015-01-02T19:00:00+00:00","numFailedInstances":74,"numSuccessfullInstances":24,"dataSizeCopied":8123.93},{"startTime":"2015-01-02T19:00:00+00:00","endTime":"2015-01-02T20:00:00+00:00","numFailedInstances":7,"
 numSuccessfullInstances":46,"dataSizeCopied":4957.95},{"startTime":"2015-01-02T20:00:00+00:00","endTime":"2015-01-02T21:00:00+00:00","numFailedInstances":11,"numSuccessfullInstances":70,"dataSizeCopied":6025.53},{"startTime":"2015-01-02T21:00:00+00:00","endTime":"2015-01-02T22:00:00+00:00","numFailedInstances":59,"numSuccessfullInstances":63,"dataSizeCopied":4502.26},{"startTime":"2015-01-02T22:00:00+00:00","endTime":"2015-01-02T23:00:00+00:00","numFailedInstances":61,"numSuccessfullInstances":96,"dataSizeCopied":5802.56},{"startTime":"2015-01-02T23:00:00+00:00","endTime":"2015-01-03T00:00:00+00:00","numFailedInstances":53,"numSuccessfullInstances":29,"dataSizeCopied":2949.03}],"requestId":"23c44f3f-f528-4a94-bc0e-f95019729b42","message":"default\\/STATUS\\n","status":"SUCCEEDED"},{"summary":[{"startTime":"2015-01-03T00:00:00+00:00","endTime":"2015-01-03T01:00:00+00:00","numFailedInstances":5,"numSuccessfullInstances":7,"dataSizeCopied":9072.47},{"startTime":"2015-01-03T01:00:00+00:
 00","endTime":"2015-01-03T02:00:00+00:00","numFailedInstances":46,"numSuccessfullInstances":3,"dataSizeCopied":815.97},{"startTime":"2015-01-03T02:00:00+00:00","endTime":"2015-01-03T03:00:00+00:00","numFailedInstances":51,"numSuccessfullInstances":35,"dataSizeCopied":8629.88},{"startTime":"2015-01-03T03:00:00+00:00","endTime":"2015-01-03T04:00:00+00:00","numFailedInstances":37,"numSuccessfullInstances":16,"dataSizeCopied":6348.3},{"startTime":"2015-01-03T04:00:00+00:00","endTime":"2015-01-03T05:00:00+00:00","numFailedInstances":61,"numSuccessfullInstances":1,"dataSizeCopied":14.63},{"startTime":"2015-01-03T05:00:00+00:00","endTime":"2015-01-03T06:00:00+00:00","numFailedInstances":13,"numSuccessfullInstances":61,"dataSizeCopied":315.61},{"startTime":"2015-01-03T06:00:00+00:00","endTime":"2015-01-03T07:00:00+00:00","numFailedInstances":78,"numSuccessfullInstances":79,"dataSizeCopied":5415.44},{"startTime":"2015-01-03T07:00:00+00:00","endTime":"2015-01-03T08:00:00+00:00","numFailedInst
 ances":85,"numSuccessfullInstances":59,"dataSizeCopied":8868.3},{"startTime":"2015-01-03T08:00:00+00:00","endTime":"2015-01-03T09:00:00+00:00","numFailedInstances":96,"numSuccessfullInstances":62,"dataSizeCopied":4119.68},{"startTime":"2015-01-03T09:00:00+00:00","endTime":"2015-01-03T10:00:00+00:00","numFailedInstances":12,"numSuccessfullInstances":13,"dataSizeCopied":733.51},{"startTime":"2015-01-03T10:00:00+00:00","endTime":"2015-01-03T11:00:00+00:00","numFailedInstances":82,"numSuccessfullInstances":43,"dataSizeCopied":3540.7},{"startTime":"2015-01-03T11:00:00+00:00","endTime":"2015-01-03T12:00:00+00:00","numFailedInstances":3,"numSuccessfullInstances":29,"dataSizeCopied":7308.66},{"startTime":"2015-01-03T12:00:00+00:00","endTime":"2015-01-03T13:00:00+00:00","numFailedInstances":24,"numSuccessfullInstances":4,"dataSizeCopied":916.97},{"startTime":"2015-01-03T13:00:00+00:00","endTime":"2015-01-03T14:00:00+00:00","numFailedInstances":92,"numSuccessfullInstances":43,"dataSizeCopied"
 :4470.67},{"startTime":"2015-01-03T14:00:00+00:00","endTime":"2015-01-03T15:00:00+00:00","numFailedInstances":6,"numSuccessfullInstances":13,"dataSizeCopied":6667.38},{"startTime":"2015-01-03T15:00:00+00:00","endTime":"2015-01-03T16:00:00+00:00","numFailedInstances":37,"numSuccessfullInstances":52,"dataSizeCopied":8070.53},{"startTime":"2015-01-03T16:00:00+00:00","endTime":"2015-01-03T17:00:00+00:00","numFailedInstances":11,"numSuccessfullInstances":68,"dataSizeCopied":1176.12},{"startTime":"2015-01-03T17:00:00+00:00","endTime":"2015-01-03T18:00:00+00:00","numFailedInstances":75,"numSuccessfullInstances":89,"dataSizeCopied":4148.9},{"startTime":"2015-01-03T18:00:00+00:00","endTime":"2015-01-03T19:00:00+00:00","numFailedInstances":77,"numSuccessfullInstances":84,"dataSizeCopied":4533.51},{"startTime":"2015-01-03T19:00:00+00:00","endTime":"2015-01-03T20:00:00+00:00","numFailedInstances":17,"numSuccessfullInstances":17,"dataSizeCopied":3710.7},{"startTime":"2015-01-03T20:00:00+00:00","
 endTime":"2015-01-03T21:00:00+00:00","numFailedInstances":76,"numSuccessfullInstances":47,"dataSizeCopied":2555.19},{"startTime":"2015-01-03T21:00:00+00:00","endTime":"2015-01-03T22:00:00+00:00","numFailedInstances":70,"numSuccessfullInstances":37,"dataSizeCopied":2288.14},{"startTime":"2015-01-03T22:00:00+00:00","endTime":"2015-01-03T23:00:00+00:00","numFailedInstances":9,"numSuccessfullInstances":2,"dataSizeCopied":687.27},{"startTime":"2015-01-03T23:00:00+00:00","endTime":"2015-01-04T00:00:00+00:00","numFailedInstances":5,"numSuccessfullInstances":44,"dataSizeCopied":591.32}],"requestId":"23c44f3f-f528-4a94-bc0e-f95019729b42","message":"default\\/STATUS\\n","status":"SUCCEEDED"}],
+      datasetHours = [{"summary":[{"startTime":"2015-01-01T00:00:00+00:00","endTime":"2015-01-01T01:00:00+00:00","numFailedInstances":1,"numSuccessfullInstances":15,"dataSizeCopied":577.28},{"startTime":"2015-01-01T01:00:00+00:00","endTime":"2015-01-01T02:00:00+00:00","numFailedInstances":11,"numSuccessfullInstances":26,"dataSizeCopied":727.28},{"startTime":"2015-01-01T02:00:00+00:00","endTime":"2015-01-01T03:00:00+00:00","numFailedInstances":0,"numSuccessfullInstances":28,"dataSizeCopied":677.13},{"startTime":"2015-01-01T03:00:00+00:00","endTime":"2015-01-01T04:00:00+00:00","numFailedInstances":3,"numSuccessfullInstances":5,"dataSizeCopied":132.14},{"startTime":"2015-01-01T04:00:00+00:00","endTime":"2015-01-01T05:00:00+00:00","numFailedInstances":6,"numSuccessfullInstances":11,"dataSizeCopied":132.45},{"startTime":"2015-01-01T05:00:00+00:00","endTime":"2015-01-01T06:00:00+00:00","numFailedInstances":13,"numSuccessfullInstances":12,"dataSizeCopied":120.98},{"startTime":"2015-01-01T0
 6:00:00+00:00","endTime":"2015-01-01T07:00:00+00:00","numFailedInstances":14,"numSuccessfullInstances":0,"dataSizeCopied":0},{"startTime":"2015-01-01T07:00:00+00:00","endTime":"2015-01-01T08:00:00+00:00","numFailedInstances":3,"numSuccessfullInstances":15,"dataSizeCopied":6543.52},{"startTime":"2015-01-01T08:00:00+00:00","endTime":"2015-01-01T01:09:00+00:00","numFailedInstances":7,"numSuccessfullInstances":5,"dataSizeCopied":702.28},{"startTime":"2015-01-01T09:00:00+00:00","endTime":"2015-01-01T10:00:00+00:00","numFailedInstances":1,"numSuccessfullInstances":0,"dataSizeCopied":0},{"startTime":"2015-01-01T10:00:00+00:00","endTime":"2015-01-01T11:00:00+00:00","numFailedInstances":4,"numSuccessfullInstances":2,"dataSizeCopied":213.28},{"startTime":"2015-01-01T11:00:00+00:00","endTime":"2015-01-01T12:00:00+00:00","numFailedInstances":10,"numSuccessfullInstances":4,"dataSizeCopied":62.68},{"startTime":"2015-01-01T12:00:00+00:00","endTime":"2015-01-01T13:00:00+00:00","numFailedInstances":
 1,"numSuccessfullInstances":3,"dataSizeCopied":1303.92},{"startTime":"2015-01-01T13:00:00+00:00","endTime":"2015-01-01T14:00:00+00:00","numFailedInstances":24,"numSuccessfullInstances":13,"dataSizeCopied":4198.62},{"startTime":"2015-01-01T14:00:00+00:00","endTime":"2015-01-01T15:00:00+00:00","numFailedInstances":17,"numSuccessfullInstances":31,"dataSizeCopied":2470.32},{"startTime":"2015-01-01T15:00:00+00:00","endTime":"2015-01-01T16:00:00+00:00","numFailedInstances":3,"numSuccessfullInstances":16,"dataSizeCopied":4812.93},{"startTime":"2015-01-01T16:00:00+00:00","endTime":"2015-01-01T17:00:00+00:00","numFailedInstances":1,"numSuccessfullInstances":18,"dataSizeCopied":7098.15},{"startTime":"2015-01-01T17:00:00+00:00","endTime":"2015-01-01T18:00:00+00:00","numFailedInstances":9,"numSuccessfullInstances":3,"dataSizeCopied":102.68},{"startTime":"2015-01-01T18:00:00+00:00","endTime":"2015-01-01T19:00:00+00:00","numFailedInstances":15,"numSuccessfullInstances":7,"dataSizeCopied":301.42},
 {"startTime":"2015-01-01T19:00:00+00:00","endTime":"2015-01-01T20:00:00+00:00","numFailedInstances":17,"numSuccessfullInstances":13,"dataSizeCopied":2431.50},{"startTime":"2015-01-01T20:00:00+00:00","endTime":"2015-01-01T21:00:00+00:00","numFailedInstances":6,"numSuccessfullInstances":5,"dataSizeCopied":97.57},{"startTime":"2015-01-01T21:00:00+00:00","endTime":"2015-01-01T22:00:00+00:00","numFailedInstances":0,"numSuccessfullInstances":5,"dataSizeCopied":154.32},{"startTime":"2015-01-01T22:00:00+00:00","endTime":"2015-01-01T23:00:00+00:00","numFailedInstances":0,"numSuccessfullInstances":0,"dataSizeCopied":0},{"startTime":"2015-01-01T23:00:00+00:00","endTime":"2015-01-02T00:00:00+00:00","numFailedInstances":0,"numSuccessfullInstances":3,"dataSizeCopied":2637.62}],"requestId":"23c44f3f-f528-4a94-bc0e-f95019729b42","message":"default\\/STATUS\\n","status":"SUCCEEDED"},{"summary":[{"startTime":"2015-01-02T00:00:00+00:00","endTime":"2015-01-02T01:00:00+00:00","numFailedInstances":98,"nu
 mSuccessfullInstances":85,"dataSizeCopied":7268.55},{"startTime":"2015-01-02T01:00:00+00:00","endTime":"2015-01-02T02:00:00+00:00","numFailedInstances":36,"numSuccessfullInstances":20,"dataSizeCopied":3003.66},{"startTime":"2015-01-02T02:00:00+00:00","endTime":"2015-01-02T03:00:00+00:00","numFailedInstances":22,"numSuccessfullInstances":84,"dataSizeCopied":7418.37},{"startTime":"2015-01-02T03:00:00+00:00","endTime":"2015-01-02T04:00:00+00:00","numFailedInstances":48,"numSuccessfullInstances":80,"dataSizeCopied":2870.58},{"startTime":"2015-01-02T04:00:00+00:00","endTime":"2015-01-02T05:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":72,"dataSizeCopied":7422.98},{"startTime":"2015-01-02T05:00:00+00:00","endTime":"2015-01-02T06:00:00+00:00","numFailedInstances":99,"numSuccessfullInstances":32,"dataSizeCopied":5517.14},{"startTime":"2015-01-02T06:00:00+00:00","endTime":"2015-01-02T07:00:00+00:00","numFailedInstances":87,"numSuccessfullInstances":3,"dataSizeCopied":7707.76
 },{"startTime":"2015-01-02T07:00:00+00:00","endTime":"2015-01-02T08:00:00+00:00","numFailedInstances":5,"numSuccessfullInstances":22,"dataSizeCopied":9756.59},{"startTime":"2015-01-02T08:00:00+00:00","endTime":"2015-01-02T01:09:00+00:00","numFailedInstances":26,"numSuccessfullInstances":61,"dataSizeCopied":262.23},{"startTime":"2015-01-02T09:00:00+00:00","endTime":"2015-01-02T10:00:00+00:00","numFailedInstances":55,"numSuccessfullInstances":53,"dataSizeCopied":4615.98},{"startTime":"2015-01-02T10:00:00+00:00","endTime":"2015-01-02T11:00:00+00:00","numFailedInstances":13,"numSuccessfullInstances":11,"dataSizeCopied":4451.74},{"startTime":"2015-01-02T11:00:00+00:00","endTime":"2015-01-02T12:00:00+00:00","numFailedInstances":15,"numSuccessfullInstances":23,"dataSizeCopied":467.45},{"startTime":"2015-01-02T12:00:00+00:00","endTime":"2015-01-02T13:00:00+00:00","numFailedInstances":19,"numSuccessfullInstances":34,"dataSizeCopied":3429.94},{"startTime":"2015-01-02T13:00:00+00:00","endTime"
 :"2015-01-02T14:00:00+00:00","numFailedInstances":3,"numSuccessfullInstances":90,"dataSizeCopied":3440.41},{"startTime":"2015-01-02T14:00:00+00:00","endTime":"2015-01-02T15:00:00+00:00","numFailedInstances":8,"numSuccessfullInstances":34,"dataSizeCopied":1950.69},{"startTime":"2015-01-02T15:00:00+00:00","endTime":"2015-01-02T16:00:00+00:00","numFailedInstances":1,"numSuccessfullInstances":2,"dataSizeCopied":1525.85},{"startTime":"2015-01-02T16:00:00+00:00","endTime":"2015-01-02T17:00:00+00:00","numFailedInstances":27,"numSuccessfullInstances":64,"dataSizeCopied":731.08},{"startTime":"2015-01-02T17:00:00+00:00","endTime":"2015-01-02T18:00:00+00:00","numFailedInstances":18,"numSuccessfullInstances":59,"dataSizeCopied":8072.24},{"startTime":"2015-01-02T18:00:00+00:00","endTime":"2015-01-02T19:00:00+00:00","numFailedInstances":74,"numSuccessfullInstances":24,"dataSizeCopied":8123.93},{"startTime":"2015-01-02T19:00:00+00:00","endTime":"2015-01-02T20:00:00+00:00","numFailedInstances":7,"n
 umSuccessfullInstances":46,"dataSizeCopied":4957.95},{"startTime":"2015-01-02T20:00:00+00:00","endTime":"2015-01-02T21:00:00+00:00","numFailedInstances":11,"numSuccessfullInstances":70,"dataSizeCopied":6025.53},{"startTime":"2015-01-02T21:00:00+00:00","endTime":"2015-01-02T22:00:00+00:00","numFailedInstances":59,"numSuccessfullInstances":63,"dataSizeCopied":4502.26},{"startTime":"2015-01-02T22:00:00+00:00","endTime":"2015-01-02T23:00:00+00:00","numFailedInstances":61,"numSuccessfullInstances":96,"dataSizeCopied":5802.56},{"startTime":"2015-01-02T23:00:00+00:00","endTime":"2015-01-03T00:00:00+00:00","numFailedInstances":53,"numSuccessfullInstances":29,"dataSizeCopied":2949.03}],"requestId":"23c44f3f-f528-4a94-bc0e-f95019729b42","message":"default\\/STATUS\\n","status":"SUCCEEDED"},{"summary":[{"startTime":"2015-01-03T00:00:00+00:00","endTime":"2015-01-03T01:00:00+00:00","numFailedInstances":5,"numSuccessfullInstances":7,"dataSizeCopied":9072.47},{"startTime":"2015-01-03T01:00:00+00:0
 0","endTime":"2015-01-03T02:00:00+00:00","numFailedInstances":46,"numSuccessfullInstances":3,"dataSizeCopied":815.97},{"startTime":"2015-01-03T02:00:00+00:00","endTime":"2015-01-03T03:00:00+00:00","numFailedInstances":51,"numSuccessfullInstances":35,"dataSizeCopied":8629.88},{"startTime":"2015-01-03T03:00:00+00:00","endTime":"2015-01-03T04:00:00+00:00","numFailedInstances":37,"numSuccessfullInstances":16,"dataSizeCopied":6348.3},{"startTime":"2015-01-03T04:00:00+00:00","endTime":"2015-01-03T05:00:00+00:00","numFailedInstances":61,"numSuccessfullInstances":1,"dataSizeCopied":14.63},{"startTime":"2015-01-03T05:00:00+00:00","endTime":"2015-01-03T06:00:00+00:00","numFailedInstances":13,"numSuccessfullInstances":61,"dataSizeCopied":315.61},{"startTime":"2015-01-03T06:00:00+00:00","endTime":"2015-01-03T07:00:00+00:00","numFailedInstances":78,"numSuccessfullInstances":79,"dataSizeCopied":5415.44},{"startTime":"2015-01-03T07:00:00+00:00","endTime":"2015-01-03T08:00:00+00:00","numFailedInsta
 nces":85,"numSuccessfullInstances":59,"dataSizeCopied":8868.3},{"startTime":"2015-01-03T08:00:00+00:00","endTime":"2015-01-03T09:00:00+00:00","numFailedInstances":96,"numSuccessfullInstances":62,"dataSizeCopied":4119.68},{"startTime":"2015-01-03T09:00:00+00:00","endTime":"2015-01-03T10:00:00+00:00","numFailedInstances":12,"numSuccessfullInstances":13,"dataSizeCopied":733.51},{"startTime":"2015-01-03T10:00:00+00:00","endTime":"2015-01-03T11:00:00+00:00","numFailedInstances":82,"numSuccessfullInstances":43,"dataSizeCopied":3540.7},{"startTime":"2015-01-03T11:00:00+00:00","endTime":"2015-01-03T12:00:00+00:00","numFailedInstances":3,"numSuccessfullInstances":29,"dataSizeCopied":7308.66},{"startTime":"2015-01-03T12:00:00+00:00","endTime":"2015-01-03T13:00:00+00:00","numFailedInstances":24,"numSuccessfullInstances":4,"dataSizeCopied":916.97},{"startTime":"2015-01-03T13:00:00+00:00","endTime":"2015-01-03T14:00:00+00:00","numFailedInstances":92,"numSuccessfullInstances":43,"dataSizeCopied":
 4470.67},{"startTime":"2015-01-03T14:00:00+00:00","endTime":"2015-01-03T15:00:00+00:00","numFailedInstances":6,"numSuccessfullInstances":13,"dataSizeCopied":6667.38},{"startTime":"2015-01-03T15:00:00+00:00","endTime":"2015-01-03T16:00:00+00:00","numFailedInstances":37,"numSuccessfullInstances":52,"dataSizeCopied":8070.53},{"startTime":"2015-01-03T16:00:00+00:00","endTime":"2015-01-03T17:00:00+00:00","numFailedInstances":11,"numSuccessfullInstances":68,"dataSizeCopied":1176.12},{"startTime":"2015-01-03T17:00:00+00:00","endTime":"2015-01-03T18:00:00+00:00","numFailedInstances":75,"numSuccessfullInstances":89,"dataSizeCopied":4148.9},{"startTime":"2015-01-03T18:00:00+00:00","endTime":"2015-01-03T19:00:00+00:00","numFailedInstances":77,"numSuccessfullInstances":84,"dataSizeCopied":4533.51},{"startTime":"2015-01-03T19:00:00+00:00","endTime":"2015-01-03T20:00:00+00:00","numFailedInstances":17,"numSuccessfullInstances":17,"dataSizeCopied":3710.7},{"startTime":"2015-01-03T20:00:00+00:00","e
 ndTime":"2015-01-03T21:00:00+00:00","numFailedInstances":76,"numSuccessfullInstances":47,"dataSizeCopied":2555.19},{"startTime":"2015-01-03T21:00:00+00:00","endTime":"2015-01-03T22:00:00+00:00","numFailedInstances":70,"numSuccessfullInstances":37,"dataSizeCopied":2288.14},{"startTime":"2015-01-03T22:00:00+00:00","endTime":"2015-01-03T23:00:00+00:00","numFailedInstances":9,"numSuccessfullInstances":2,"dataSizeCopied":687.27},{"startTime":"2015-01-03T23:00:00+00:00","endTime":"2015-01-04T00:00:00+00:00","numFailedInstances":5,"numSuccessfullInstances":44,"dataSizeCopied":591.32}],"requestId":"23c44f3f-f528-4a94-bc0e-f95019729b42","message":"default\\/STATUS\\n","status":"SUCCEEDED"}],
+
+      feedDays = [{"summary":[{"startTime":"2015-01-01T00:00:00+00:00","endTime":"2015-01-02T00:00:00+00:00","numFailedInstances":6,"numSuccessfullInstances":9,"dataSizeCopied":67.28},{"startTime":"2015-01-02T00:00:00+00:00","endTime":"2015-01-03T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-03T00:00:00+00:00","endTime":"2015-01-04T00:00:00+00:00","numFailedInstances":6,"numSuccessfullInstances":14,"dataSizeCopied":367.28},{"startTime":"2015-01-04T00:00:00+00:00","endTime":"2015-01-05T00:00:00+00:00","numFailedInstances":36,"numSuccessfullInstances":23,"dataSizeCopied":367.28},{"startTime":"2015-01-05T00:00:00+00:00","endTime":"2015-01-06T00:00:00+00:00","numFailedInstances":21,"numSuccessfullInstances":1,"dataSizeCopied":367.28},{"startTime":"2015-01-06T00:00:00+00:00","endTime":"2015-01-07T00:00:00+00:00","numFailedInstances":1,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-07T00:00:00
 +00:00","endTime":"2015-01-08T00:00:00+00:00","numFailedInstances":46,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-08T00:00:00+00:00","endTime":"2015-01-09T00:00:00+00:00","numFailedInstances":12,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-09T00:00:00+00:00","endTime":"2015-01-10T00:00:00+00:00","numFailedInstances":15,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-10T00:00:00+00:00","endTime":"2015-01-11T00:00:00+00:00","numFailedInstances":46,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-11T00:00:00+00:00","endTime":"2015-01-12T00:00:00+00:00","numFailedInstances":11,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-12T00:00:00+00:00","endTime":"2015-01-13T00:00:00+00:00","numFailedInstances":20,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-13T00:00:00+00:00","endTime":"2015-01-14T00:00:00+00:00","numFailedInsta
 nces":0,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-14T00:00:00+00:00","endTime":"2015-01-15T00:00:00+00:00","numFailedInstances":0,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-15T00:00:00+00:00","endTime":"2015-01-16T00:00:00+00:00","numFailedInstances":1,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-16T00:00:00+00:00","endTime":"2015-01-17T00:00:00+00:00","numFailedInstances":7,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-17T00:00:00+00:00","endTime":"2015-01-18T00:00:00+00:00","numFailedInstances":2,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-18T00:00:00+00:00","endTime":"2015-01-19T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-19T00:00:00+00:00","endTime":"2015-01-20T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"st
 artTime":"2015-01-20T00:00:00+00:00","endTime":"2015-01-21T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-21T00:00:00+00:00","endTime":"2015-01-22T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-22T00:00:00+00:00","endTime":"2015-01-23T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-23T00:00:00+00:00","endTime":"2015-01-24T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-24T00:00:00+00:00","endTime":"2015-01-25T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-25T00:00:00+00:00","endTime":"2015-01-26T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-26T00:00:00+00:00","endTime":"2015-01-27T00
 :00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-27T00:00:00+00:00","endTime":"2015-01-28T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-28T00:00:00+00:00","endTime":"2015-01-29T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-29T00:00:00+00:00","endTime":"2015-01-30T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-30T00:00:00+00:00","endTime":"2015-01-31T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-31T00:00:00+00:00","endTime":"2015-02-01T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-01T00:00:00+00:00","endTime":"2015-02-02T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstance
 s":4,"dataSizeCopied":367.28},{"startTime":"2015-02-02T00:00:00+00:00","endTime":"2015-02-03T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-03T00:00:00+00:00","endTime":"2015-02-04T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-04T00:00:00+00:00","endTime":"2015-02-05T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-05T00:00:00+00:00","endTime":"2015-02-06T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-06T00:00:00+00:00","endTime":"2015-02-07T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-07T00:00:00+00:00","endTime":"2015-02-08T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-08T00:00:
 00+00:00","endTime":"2015-02-09T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-09T00:00:00+00:00","endTime":"2015-02-10T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-10T00:00:00+00:00","endTime":"2015-02-11T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-11T00:00:00+00:00","endTime":"2015-02-12T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-12T00:00:00+00:00","endTime":"2015-02-13T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-13T00:00:00+00:00","endTime":"2015-02-14T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-14T00:00:00+00:00","endTime":"2015-02-15T00:00:00+00:00","numFailedIns
 tances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-15T00:00:00+00:00","endTime":"2015-02-16T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-16T00:00:00+00:00","endTime":"2015-02-17T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-17T00:00:00+00:00","endTime":"2015-02-18T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-18T00:00:00+00:00","endTime":"2015-02-19T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-19T00:00:00+00:00","endTime":"2015-02-20T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-20T00:00:00+00:00","endTime":"2015-02-21T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.2
 8},{"startTime":"2015-02-21T00:00:00+00:00","endTime":"2015-02-22T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-22T00:00:00+00:00","endTime":"2015-02-23T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-23T00:00:00+00:00","endTime":"2015-02-24T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-24T00:00:00+00:00","endTime":"2015-02-25T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-25T00:00:00+00:00","endTime":"2015-02-26T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-26T00:00:00+00:00","endTime":"2015-02-27T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-27T00:00:00+00:00","endTime":"2015-0
 2-28T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-28T00:00:00+00:00","endTime":"2015-03-01T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-01T00:00:00+00:00","endTime":"2015-03-02T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-02T00:00:00+00:00","endTime":"2015-03-03T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-03T00:00:00+00:00","endTime":"2015-03-04T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-04T00:00:00+00:00","endTime":"2015-03-05T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-05T00:00:00+00:00","endTime":"2015-03-06T00:00:00+00:00","numFailedInstances":16,"numSuccessfullI
 nstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-06T00:00:00+00:00","endTime":"2015-03-07T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-07T00:00:00+00:00","endTime":"2015-03-08T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-08T00:00:00+00:00","endTime":"2015-03-09T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-09T00:00:00+00:00","endTime":"2015-03-10T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-10T00:00:00+00:00","endTime":"2015-03-11T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-11T00:00:00+00:00","endTime":"2015-03-12T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-12
 T00:00:00+00:00","endTime":"2015-03-13T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-13T00:00:00+00:00","endTime":"2015-03-14T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-14T00:00:00+00:00","endTime":"2015-03-15T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28}],"requestId":"23c44f3f-f528-4a94-bc0e-f95019729b42","message":"default\\/STATUS\\n","status":"SUCCEEDED"}],
+      processDays = [{"summary":[{"startTime":"2015-01-01T00:00:00+00:00","endTime":"2015-01-02T00:00:00+00:00","numFailedInstances":6,"numSuccessfullInstances":9,"dataSizeCopied":67.28},{"startTime":"2015-01-02T00:00:00+00:00","endTime":"2015-01-03T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-03T00:00:00+00:00","endTime":"2015-01-04T00:00:00+00:00","numFailedInstances":6,"numSuccessfullInstances":11,"dataSizeCopied":367.28},{"startTime":"2015-01-04T00:00:00+00:00","endTime":"2015-01-05T00:00:00+00:00","numFailedInstances":36,"numSuccessfullInstances":2,"dataSizeCopied":367.28},{"startTime":"2015-01-05T00:00:00+00:00","endTime":"2015-01-06T00:00:00+00:00","numFailedInstances":21,"numSuccessfullInstances":10,"dataSizeCopied":367.28},{"startTime":"2015-01-06T00:00:00+00:00","endTime":"2015-01-07T00:00:00+00:00","numFailedInstances":1,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-07T00:00
 :00+00:00","endTime":"2015-01-08T00:00:00+00:00","numFailedInstances":46,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-08T00:00:00+00:00","endTime":"2015-01-09T00:00:00+00:00","numFailedInstances":12,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-09T00:00:00+00:00","endTime":"2015-01-10T00:00:00+00:00","numFailedInstances":15,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-10T00:00:00+00:00","endTime":"2015-01-11T00:00:00+00:00","numFailedInstances":46,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-11T00:00:00+00:00","endTime":"2015-01-12T00:00:00+00:00","numFailedInstances":11,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-12T00:00:00+00:00","endTime":"2015-01-13T00:00:00+00:00","numFailedInstances":20,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-13T00:00:00+00:00","endTime":"2015-01-14T00:00:00+00:00","numFailedIn
 stances":0,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-14T00:00:00+00:00","endTime":"2015-01-15T00:00:00+00:00","numFailedInstances":0,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-15T00:00:00+00:00","endTime":"2015-01-16T00:00:00+00:00","numFailedInstances":1,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-16T00:00:00+00:00","endTime":"2015-01-17T00:00:00+00:00","numFailedInstances":7,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-17T00:00:00+00:00","endTime":"2015-01-18T00:00:00+00:00","numFailedInstances":2,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-18T00:00:00+00:00","endTime":"2015-01-19T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-19T00:00:00+00:00","endTime":"2015-01-20T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{
 "startTime":"2015-01-20T00:00:00+00:00","endTime":"2015-01-21T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-21T00:00:00+00:00","endTime":"2015-01-22T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-22T00:00:00+00:00","endTime":"2015-01-23T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-23T00:00:00+00:00","endTime":"2015-01-24T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-24T00:00:00+00:00","endTime":"2015-01-25T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-25T00:00:00+00:00","endTime":"2015-01-26T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-26T00:00:00+00:00","endTime":"2015-01-27
 T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-27T00:00:00+00:00","endTime":"2015-01-28T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-28T00:00:00+00:00","endTime":"2015-01-29T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-29T00:00:00+00:00","endTime":"2015-01-30T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-30T00:00:00+00:00","endTime":"2015-01-31T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-31T00:00:00+00:00","endTime":"2015-02-01T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-01T00:00:00+00:00","endTime":"2015-02-02T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInsta
 nces":4,"dataSizeCopied":367.28},{"startTime":"2015-02-02T00:00:00+00:00","endTime":"2015-02-03T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-03T00:00:00+00:00","endTime":"2015-02-04T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-04T00:00:00+00:00","endTime":"2015-02-05T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-05T00:00:00+00:00","endTime":"2015-02-06T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-06T00:00:00+00:00","endTime":"2015-02-07T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-07T00:00:00+00:00","endTime":"2015-02-08T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-08T00:
 00:00+00:00","endTime":"2015-02-09T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-09T00:00:00+00:00","endTime":"2015-02-10T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-10T00:00:00+00:00","endTime":"2015-02-11T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-11T00:00:00+00:00","endTime":"2015-02-12T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-12T00:00:00+00:00","endTime":"2015-02-13T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-13T00:00:00+00:00","endTime":"2015-02-14T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-14T00:00:00+00:00","endTime":"2015-02-15T00:00:00+00:00","numFailed
 Instances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-15T00:00:00+00:00","endTime":"2015-02-16T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-16T00:00:00+00:00","endTime":"2015-02-17T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-17T00:00:00+00:00","endTime":"2015-02-18T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-18T00:00:00+00:00","endTime":"2015-02-19T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-19T00:00:00+00:00","endTime":"2015-02-20T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-20T00:00:00+00:00","endTime":"2015-02-21T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":36
 7.28},{"startTime":"2015-02-21T00:00:00+00:00","endTime":"2015-02-22T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-22T00:00:00+00:00","endTime":"2015-02-23T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-23T00:00:00+00:00","endTime":"2015-02-24T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-24T00:00:00+00:00","endTime":"2015-02-25T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-25T00:00:00+00:00","endTime":"2015-02-26T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-26T00:00:00+00:00","endTime":"2015-02-27T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-27T00:00:00+00:00","endTime":"201
 5-02-28T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-28T00:00:00+00:00","endTime":"2015-03-01T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-01T00:00:00+00:00","endTime":"2015-03-02T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-02T00:00:00+00:00","endTime":"2015-03-03T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-03T00:00:00+00:00","endTime":"2015-03-04T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-04T00:00:00+00:00","endTime":"2015-03-05T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-05T00:00:00+00:00","endTime":"2015-03-06T00:00:00+00:00","numFailedInstances":16,"numSuccessfu
 llInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-06T00:00:00+00:00","endTime":"2015-03-07T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-07T00:00:00+00:00","endTime":"2015-03-08T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-08T00:00:00+00:00","endTime":"2015-03-09T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-09T00:00:00+00:00","endTime":"2015-03-10T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-10T00:00:00+00:00","endTime":"2015-03-11T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-11T00:00:00+00:00","endTime":"2015-03-12T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03
 -12T00:00:00+00:00","endTime":"2015-03-13T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-13T00:00:00+00:00","endTime":"2015-03-14T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-14T00:00:00+00:00","endTime":"2015-03-15T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28}],"requestId":"23c44f3f-f528-4a94-bc0e-f95019729b42","message":"default\\/STATUS\\n","status":"SUCCEEDED"}],
+      datasetDays = [{"summary":[{"startTime":"2015-01-01T00:00:00+00:00","endTime":"2015-01-02T00:00:00+00:00","numFailedInstances":6,"numSuccessfullInstances":9,"dataSizeCopied":67.28},{"startTime":"2015-01-02T00:00:00+00:00","endTime":"2015-01-03T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-03T00:00:00+00:00","endTime":"2015-01-04T00:00:00+00:00","numFailedInstances":6,"numSuccessfullInstances":2,"dataSizeCopied":367.28},{"startTime":"2015-01-04T00:00:00+00:00","endTime":"2015-01-05T00:00:00+00:00","numFailedInstances":36,"numSuccessfullInstances":1,"dataSizeCopied":367.28},{"startTime":"2015-01-05T00:00:00+00:00","endTime":"2015-01-06T00:00:00+00:00","numFailedInstances":21,"numSuccessfullInstances":3,"dataSizeCopied":367.28},{"startTime":"2015-01-06T00:00:00+00:00","endTime":"2015-01-07T00:00:00+00:00","numFailedInstances":1,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-07T00:00:0
 0+00:00","endTime":"2015-01-08T00:00:00+00:00","numFailedInstances":46,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-08T00:00:00+00:00","endTime":"2015-01-09T00:00:00+00:00","numFailedInstances":12,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-09T00:00:00+00:00","endTime":"2015-01-10T00:00:00+00:00","numFailedInstances":15,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-10T00:00:00+00:00","endTime":"2015-01-11T00:00:00+00:00","numFailedInstances":46,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-11T00:00:00+00:00","endTime":"2015-01-12T00:00:00+00:00","numFailedInstances":11,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-12T00:00:00+00:00","endTime":"2015-01-13T00:00:00+00:00","numFailedInstances":20,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-13T00:00:00+00:00","endTime":"2015-01-14T00:00:00+00:00","numFailedInst
 ances":0,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-14T00:00:00+00:00","endTime":"2015-01-15T00:00:00+00:00","numFailedInstances":0,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-15T00:00:00+00:00","endTime":"2015-01-16T00:00:00+00:00","numFailedInstances":1,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-16T00:00:00+00:00","endTime":"2015-01-17T00:00:00+00:00","numFailedInstances":7,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-17T00:00:00+00:00","endTime":"2015-01-18T00:00:00+00:00","numFailedInstances":2,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-18T00:00:00+00:00","endTime":"2015-01-19T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-19T00:00:00+00:00","endTime":"2015-01-20T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"s
 tartTime":"2015-01-20T00:00:00+00:00","endTime":"2015-01-21T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-21T00:00:00+00:00","endTime":"2015-01-22T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-22T00:00:00+00:00","endTime":"2015-01-23T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-23T00:00:00+00:00","endTime":"2015-01-24T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-24T00:00:00+00:00","endTime":"2015-01-25T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-25T00:00:00+00:00","endTime":"2015-01-26T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-26T00:00:00+00:00","endTime":"2015-01-27T0
 0:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-27T00:00:00+00:00","endTime":"2015-01-28T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-28T00:00:00+00:00","endTime":"2015-01-29T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-29T00:00:00+00:00","endTime":"2015-01-30T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-30T00:00:00+00:00","endTime":"2015-01-31T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-01-31T00:00:00+00:00","endTime":"2015-02-01T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-01T00:00:00+00:00","endTime":"2015-02-02T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstanc
 es":4,"dataSizeCopied":367.28},{"startTime":"2015-02-02T00:00:00+00:00","endTime":"2015-02-03T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-03T00:00:00+00:00","endTime":"2015-02-04T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-04T00:00:00+00:00","endTime":"2015-02-05T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-05T00:00:00+00:00","endTime":"2015-02-06T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-06T00:00:00+00:00","endTime":"2015-02-07T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-07T00:00:00+00:00","endTime":"2015-02-08T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-08T00:00
 :00+00:00","endTime":"2015-02-09T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-09T00:00:00+00:00","endTime":"2015-02-10T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-10T00:00:00+00:00","endTime":"2015-02-11T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-11T00:00:00+00:00","endTime":"2015-02-12T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-12T00:00:00+00:00","endTime":"2015-02-13T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-13T00:00:00+00:00","endTime":"2015-02-14T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-14T00:00:00+00:00","endTime":"2015-02-15T00:00:00+00:00","numFailedIn
 stances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-15T00:00:00+00:00","endTime":"2015-02-16T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-16T00:00:00+00:00","endTime":"2015-02-17T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-17T00:00:00+00:00","endTime":"2015-02-18T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-18T00:00:00+00:00","endTime":"2015-02-19T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-19T00:00:00+00:00","endTime":"2015-02-20T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-20T00:00:00+00:00","endTime":"2015-02-21T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.
 28},{"startTime":"2015-02-21T00:00:00+00:00","endTime":"2015-02-22T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-22T00:00:00+00:00","endTime":"2015-02-23T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-23T00:00:00+00:00","endTime":"2015-02-24T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-24T00:00:00+00:00","endTime":"2015-02-25T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-25T00:00:00+00:00","endTime":"2015-02-26T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-26T00:00:00+00:00","endTime":"2015-02-27T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-27T00:00:00+00:00","endTime":"2015-
 02-28T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-02-28T00:00:00+00:00","endTime":"2015-03-01T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-01T00:00:00+00:00","endTime":"2015-03-02T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-02T00:00:00+00:00","endTime":"2015-03-03T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-03T00:00:00+00:00","endTime":"2015-03-04T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-04T00:00:00+00:00","endTime":"2015-03-05T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-05T00:00:00+00:00","endTime":"2015-03-06T00:00:00+00:00","numFailedInstances":16,"numSuccessfull
 Instances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-06T00:00:00+00:00","endTime":"2015-03-07T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-07T00:00:00+00:00","endTime":"2015-03-08T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-08T00:00:00+00:00","endTime":"2015-03-09T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-09T00:00:00+00:00","endTime":"2015-03-10T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-10T00:00:00+00:00","endTime":"2015-03-11T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-11T00:00:00+00:00","endTime":"2015-03-12T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-1
 2T00:00:00+00:00","endTime":"2015-03-13T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-13T00:00:00+00:00","endTime":"2015-03-14T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28},{"startTime":"2015-03-14T00:00:00+00:00","endTime":"2015-03-15T00:00:00+00:00","numFailedInstances":16,"numSuccessfullInstances":4,"dataSizeCopied":367.28}],"requestId":"23c44f3f-f528-4a94-bc0e-f95019729b42","message":"default\\/STATUS\\n","status":"SUCCEEDED"}],
+      topEntities = [{
+                      "topSuccessfulEntities": [
+                        {
+                          "name": "cleanEmails",
+                          "type": "process",
+                          "numberOfSuccessfulEntities": 15
+                        },
+                        {
+                          "name": "cleanEmails2",
+                          "type": "process",
+                          "numberOfSuccessfulEntities": 11
+                        },
+                        {
+                          "name": "cleanEmails3",
+                          "type": "process",
+                          "numberOfSuccessfulEntities": 12
+                        },
+                        {
+                          "name": "cleanEmails4",
+                          "type": "process",
+                          "numberOfSuccessfulEntities": 25
+                        },
+                        {
+                          "name": "cleanEmails5",
+                          "type": "process",
+                          "numberOfSuccessfulEntities": 1
+                        }
+
+                      ],
+                      "topFailedEntities": [
+                        {
+                          "name": "updateUserProfile1",
+                          "type": "process",
+                          "numberOfFailedEntities": 5
+                        },
+                        {
+                          "name": "updateUserProfile2",
+                          "type": "process",
+                          "numberOfFailedEntities": 8
+                        },
+                        {
+                          "name": "updateUserProfile3",
+                          "type": "process",
+                          "numberOfFailedEntities": 1
+                        },
+                        {
+                          "name": "updateUserProfile4",
+                          "type": "process",
+                          "numberOfFailedEntities": 15
+                        },
+                        {
+                          "name": "updateUserProfile5",
+                          "type": "process",
+                          "numberOfFailedEntities": 2
+                        }
+                      ],
+                      "topDataCopiedEntities": [
+                        {
+                          "name": "readEmails1",
+                          "type": "process",
+                          "dataCopied": 4025
+                        },
+                        {
+                          "name": "readEmails2",
+                          "type": "process",
+                          "dataCopied": 4025
+                        },
+                        {
+                          "name": "readEmails3",
+                          "type": "process",
+                          "dataCopied": 1086
+                        },
+                        {
+                          "name": "readEmails4",
+                          "type": "process",
+                          "dataCopied": 1057
+                        },
+                        {
+                          "name": "readEmails5",
+                          "type": "process",
+                          "dataCopied": 5021
+                        },
+
+                      ],
+                      "requestId": "default\/e15bb378-d09f-4911-9df2-5334a45153d2\n",
+                      "message": "default\/STATUS\n",
+                      "status": "SUCCEEDED"
+                    },{
+                      "topSuccessfulEntities": [
+                        {
+                          "name": "fooEmails",
+                          "type": "process",
+                          "numberOfSuccessfulEntities": 1
+                        },
+                        {
+                          "name": "barEmails",
+                          "type": "process",
+                          "numberOfSuccessfulEntities": 150
+                        },
+                        {
+                          "name": "fooCleanEmails3",
+                          "type": "process",
+                          "numberOfSuccessfulEntities": 25
+                        },
+                        {
+                          "name": "FooEmails4",
+                          "type": "process",
+                          "numberOfSuccessfulEntities": 15
+                        },
+                        {
+                          "name": "cleanEmails5",
+                          "type": "process",
+                          "numberOfSuccessfulEntities": 10
+                        }
+
+                      ],
+                      "topFailedEntities": [
+                        {
+                          "name": "fooUpdateUserProfile1",
+                          "type": "process",
+                          "numberOfFailedEntities": 21
+                        },
+                        {
+                          "name": "fooUpdateUserProfile2",
+                          "type": "process",
+                          "numberOfFailedEntities": 92
+                        },
+                        {
+                          "name": "fooUpdateUserProfile3",
+                          "type": "process",
+                          "numberOfFailedEntities": 102
+                        },
+                        {
+                          "name": "fooUpdateUserProfile4",
+                          "type": "process",
+                          "numberOfFailedEntities": 20
+                        },
+                        {
+                          "name": "fooUpdateUserProfile5",
+                          "type": "process",
+                          "numberOfFailedEntities": 12
+                        }
+                      ],
+                      "topDataCopiedEntities": [
+                        {
+                          "name": "fooReadEmails1",
+                          "type": "process",
+                          "dataCopied": 1025
+                        },
+                        {
+                          "name": "fooReadEmails2",
+                          "type": "process",
+                          "dataCopied": 2025
+                        },
+                        {
+                          "name": "fooReadEmails3",
+                          "type": "process",
+                          "dataCopied": 1403
+                        },
+                        {
+                          "name": "fooReadEmails4",
+                          "type": "process",
+                          "dataCopied": 1103
+                        },
+                        {
+                          "name": "fooReadEmails5",
+                          "type": "process",
+                          "dataCopied": 121
+                        }
+
+                      ],
+                      "requestId": "default\/e15bb378-d09f-4911-9df2-5334a45153d2\n",
+                      "message": "default\/STATUS\n",
+                      "status": "SUCCEEDED"
+                    }];
+
+
+  exports.feedHours = feedHours;
+  exports.processHours = processHours;
+  exports.datasetHours = datasetHours;
+
+  exports.feedDays = feedDays;
+  exports.processDays = processDays;
+  exports.datasetDays = datasetDays;
+
+  exports.topEntities = topEntities;
+
+}());
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/express-data/datsetData.js
----------------------------------------------------------------------
diff --git a/falcon-ui/express-data/datsetData.js b/falcon-ui/express-data/datsetData.js
new file mode 100644
index 0000000..c288bd7
--- /dev/null
+++ b/falcon-ui/express-data/datsetData.js
@@ -0,0 +1,69 @@
+/**
+ * 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.
+ */
+(function () {
+  'use strict';
+
+  function findIndexByName(name) {
+    var i;
+    for (i = 0; i < datasetsList.length; i++) {
+      if (datasetsList[i]["name"] === name) {
+        return i;
+      }
+    }
+    return false;
+  }
+
+  var clusterList = [
+      {"id":"d29dd782-038f-42d0-9ede-10ce09ff08ec","name":"cluster1"},
+      {"id":"485cb7ab-64ba-4ab9-928e-c7bc96b38f8f","name":"cluster2"},
+      {"id":"cf8d00a8-f9c4-40c7-a3f0-86daedbea2d6","name":"cluster3"},
+      {"id":"c06f5f43-c1da-4d31-b790-9d1d8b459537","name":"cluster4"},
+      {"id":"b01aa770-22fe-47c2-bd46-f76ed26c1393","name":"cluster5"},
+      {"id":"d8a32b27-1fc2-4ac9-b6db-1367c76f2519","name":"cluster7"},
+      {"id":"a6f33616-f553-4b2d-bebb-5978f81bece7","name":"cluster8"},
+      {"id":"2bfe1d86-bc62-4f3d-9c7e-d00924504a86","name":"cluster9"},
+      {"id":"a1e37af1-91b5-4f99-95a3-be3abca1e65c","name":"cluster10"},
+      {"id":"1f29031c-ddb5-44ab-aae1-8f1794f0529d","name":"cluster11"},
+      {"id":"30b77cce-0135-4d8b-ade8-5b11a860ae13","name":"cluster12"},
+      {"id":"9a126663-972a-4318-89e8-01d3d0bb4388","name":"cluster13"},
+      {"id":"86476e26-771a-4a79-9139-73e69aba0670","name":"cluster14"},
+      {"id":"86b37de5-849b-42b2-95a2-a4ff031e8668","name":"cluster15"}
+    ],
+    usersList = [
+      {"id":"d29dd782-038f-42d0-9ede-10ce09ff08ec","name":"ambari-something"},
+      {"id":"485cb7ab-64ba-4ab9-928e-c7bc96b38f8f","name":"ambari-admin"},
+      {"id":"cf8d00a8-f9c4-40c7-a3f0-86daedbea2d6","name":"ambari-user"},
+      {"id":"c06f5f43-c1da-4d31-b790-9d1d8b459537","name":"some-other-user"},
+    ],
+    datasetsList = [ { name: 'Test', tags: [ { key: 'ddd', value: 'ssd' } ], type: 'HDFS', clusters:
+    { source_cluster: { name: 'cluster1', location: [Object] },
+      target_cluster: { name: 'cluster1', location: [Object] } },
+      start: 'Mon, 02 Feb 2015 00:00:00 GMT+00:00', frequency: { every: '2', unit: 'hours' },
+      repeats: { every: '2', unit: 'days' }, allocation:
+      { max_snapshots: '2', max_number_slots: '2', max_bandwidth: '2', measure: 'Kb' },
+      run_as: 'default', permission: '*', on_error: { action: 'abort', options: 'back-off' },
+      alerts: [ { email: 's@h.com', start: true, finish: false, fail: true, abort: false } ] }
+    ];
+
+
+  exports.findIndexByName = findIndexByName;
+  exports.clusterList = clusterList;
+  exports.usersList = usersList;
+  exports.datasetsList = datasetsList;
+
+}());
\ No newline at end of file


[22/22] falcon git commit: FALCON-1315 Update falcon ui for HiveDR, secure clusters and bug fixes. Contributed by Armando Reyna/Venkat Ranganathan.

Posted by so...@apache.org.
FALCON-1315 Update falcon ui for HiveDR, secure clusters and bug fixes. Contributed by Armando Reyna/Venkat Ranganathan.


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

Branch: refs/heads/master
Commit: 86180d93210d1b5df4dcaa29c1d29248374bb177
Parents: d818200
Author: Sowmya Ramesh <sr...@hortonworks.com>
Authored: Mon Oct 12 17:03:46 2015 -0700
Committer: Sowmya Ramesh <sr...@hortonworks.com>
Committed: Mon Oct 12 17:03:46 2015 -0700

----------------------------------------------------------------------
 CHANGES.txt                                     |    2 +
 docs/src/site/twiki/InstallationSteps.twiki     |    2 +-
 falcon-ui/Gruntfile.js                          |   24 +-
 falcon-ui/README.md                             |   40 +
 falcon-ui/app/config/loginData.js               |    5 -
 falcon-ui/app/config/loginData.json             |    5 +
 falcon-ui/app/css/bootstrap/less/bootstrap.less |    1 +
 .../app/css/bootstrap/less/glyphicons.less      |   80 +-
 falcon-ui/app/css/fonts/Cabin-Bold-webfont.eot  |  Bin 0 -> 24071 bytes
 falcon-ui/app/css/fonts/Cabin-Bold-webfont.svg  | 1833 ++++++++++
 falcon-ui/app/css/fonts/Cabin-Bold-webfont.ttf  |  Bin 0 -> 58180 bytes
 falcon-ui/app/css/fonts/Cabin-Bold-webfont.woff |  Bin 0 -> 27180 bytes
 .../app/css/fonts/Cabin-Bold-webfont.woff2      |  Bin 0 -> 21264 bytes
 .../app/css/fonts/Cabin-Italic-webfont.eot      |  Bin 0 -> 27595 bytes
 .../app/css/fonts/Cabin-Italic-webfont.svg      | 1924 +++++++++++
 .../app/css/fonts/Cabin-Italic-webfont.ttf      |  Bin 0 -> 61740 bytes
 .../app/css/fonts/Cabin-Italic-webfont.woff     |  Bin 0 -> 30784 bytes
 .../app/css/fonts/Cabin-Italic-webfont.woff2    |  Bin 0 -> 24024 bytes
 .../app/css/fonts/Cabin-Regular-webfont.eot     |  Bin 0 -> 25212 bytes
 .../app/css/fonts/Cabin-Regular-webfont.svg     | 1991 +++++++++++
 .../app/css/fonts/Cabin-Regular-webfont.ttf     |  Bin 0 -> 59004 bytes
 .../app/css/fonts/Cabin-Regular-webfont.woff    |  Bin 0 -> 28160 bytes
 .../app/css/fonts/Cabin-Regular-webfont.woff2   |  Bin 0 -> 22092 bytes
 falcon-ui/app/css/fonts/cabin.less              |   53 +
 falcon-ui/app/css/fonts/entypo.less             |   20 +-
 .../css/fonts/glyphicons-halflings-regular.eot  |  Bin 20335 -> 20127 bytes
 .../css/fonts/glyphicons-halflings-regular.svg  |  485 +--
 .../css/fonts/glyphicons-halflings-regular.ttf  |  Bin 41280 -> 45404 bytes
 .../css/fonts/glyphicons-halflings-regular.woff |  Bin 23320 -> 23424 bytes
 .../fonts/glyphicons-halflings-regular.woff2    |  Bin 0 -> 18028 bytes
 falcon-ui/app/css/img/ajax-loader.gif           |  Bin 1849 -> 18533 bytes
 falcon-ui/app/css/img/ajax-loader_2.gif         |  Bin 0 -> 1849 bytes
 falcon-ui/app/css/img/falcon.png                |  Bin 12349 -> 4742 bytes
 falcon-ui/app/css/img/user.svg                  |   15 +
 falcon-ui/app/css/main.less                     |   18 +-
 falcon-ui/app/css/styles/angular.notify.less    |   84 +
 falcon-ui/app/css/styles/animate.less           | 3181 +++++++++++++++++
 falcon-ui/app/css/styles/autocomplete-tags.less |   70 +
 falcon-ui/app/css/styles/chart.less             |  159 +
 falcon-ui/app/css/styles/common.less            |  677 +++-
 falcon-ui/app/css/styles/dataset-form.less      |  494 +++
 falcon-ui/app/css/styles/entities-list.less     |   88 +-
 falcon-ui/app/css/styles/entity-summary.less    |   17 +
 falcon-ui/app/css/styles/form-pages.less        |  242 +-
 falcon-ui/app/css/styles/nav-header.less        |  183 +-
 falcon-ui/app/css/styles/popover.less           |  230 ++
 falcon-ui/app/css/styles/progress-bar.less      |  106 +-
 falcon-ui/app/css/styles/server-messages.less   |   47 +-
 falcon-ui/app/css/variables.less                |    4 +-
 falcon-ui/app/html/authenticating.html          |   37 +
 .../html/cluster/clusterFormGeneralStepTpl.html |  148 +-
 .../html/cluster/clusterFormSummaryStepTpl.html |   28 +-
 falcon-ui/app/html/cluster/clusterFormTpl.html  |   74 +-
 .../html/dataset/datasetFormGeneralStepTpl.html |  718 ++++
 .../html/dataset/datasetFormSummaryStepTpl.html |  146 +
 falcon-ui/app/html/dataset/datasetFormTpl.html  |   57 +
 .../html/directives/autocomplete-template.html  |   31 +
 .../html/directives/dependenciesGraphDv.html    |   19 +
 .../app/html/directives/entitiesListDv.html     |   61 +-
 .../html/directives/entitiesSearchListDv.html   |  128 +
 .../app/html/directives/entitySummaryDv.html    |   43 +-
 .../app/html/directives/instancesListDv.html    |  148 +
 .../app/html/directives/lineageGraphDv.html     |   36 +
 falcon-ui/app/html/directives/navDv.html        |   94 +-
 falcon-ui/app/html/directives/notify.html       |   35 +
 .../app/html/directives/serverMessagesDv.html   |   44 +-
 falcon-ui/app/html/directives/tags-input.html   |   31 +
 .../app/html/directives/timeZoneSelectDv.html   |    1 +
 falcon-ui/app/html/entityDefinitionTpl.html     |   35 +
 falcon-ui/app/html/entityDetailsTpl.html        |   68 +-
 falcon-ui/app/html/entitySummary.html           |  147 +
 .../app/html/feed/feedFormClustersStepTpl.html  |  176 +-
 .../app/html/feed/feedFormGeneralStepTpl.html   |   85 +-
 .../app/html/feed/feedFormLocationStepTpl.html  |  140 +-
 .../html/feed/feedFormPropertiesStepTpl.html    |   73 +-
 .../app/html/feed/feedFormSummaryStepTpl.html   |   28 +-
 falcon-ui/app/html/feed/feedFormTpl.html        |  128 +-
 falcon-ui/app/html/feed/feedSummary.html        |  214 ++
 falcon-ui/app/html/instanceDetails.html         |   78 +
 falcon-ui/app/html/login.html                   |   83 +
 falcon-ui/app/html/mainTpl.html                 |   66 +-
 .../process/processFormClustersStepTpl.html     |  133 +-
 .../html/process/processFormGeneralStepTpl.html |  111 +-
 .../processFormInputsAndOutputsStepTpl.html     |   94 +-
 .../process/processFormPropertiesStepTpl.html   |   38 +-
 .../html/process/processFormSummaryStepTpl.html |   33 +-
 falcon-ui/app/html/process/processFormTpl.html  |  123 +-
 falcon-ui/app/html/process/processSummary.html  |  184 +
 falcon-ui/app/index.html                        |   27 +-
 falcon-ui/app/js/app.js                         |  250 +-
 .../js/controllers/cluster/cluster-module.js    |   84 +-
 falcon-ui/app/js/controllers/controllers.js     |    7 +-
 .../app/js/controllers/dashboard-controller.js  |  153 +-
 .../controllers/dataset/dataset-controller.js   |  642 ++++
 .../js/controllers/entity/entity-definition.js  |   50 +
 .../app/js/controllers/entity/entity-details.js |  169 +
 .../app/js/controllers/entity/entity-view.js    |  221 --
 .../js/controllers/entity/instance-details.js   |  131 +
 .../feed/feed-clusters-controller.js            |   40 +-
 .../feed/feed-location-controller.js            |   15 +-
 .../feed/feed-properties-controller.js          |   17 +
 .../app/js/controllers/feed/feed-root-ctrl.js   |   98 +-
 .../controllers/feed/feed-summary-controller.js |    7 +-
 .../app/js/controllers/header-controller.js     |   81 +-
 falcon-ui/app/js/controllers/login.js           |   72 +
 .../process/process-clusters-ctrl.js            |   12 +-
 .../process/process-general-information-ctrl.js |    9 +-
 .../process/process-inputs-and-outputs-ctrl.js  |   49 +-
 .../process/process-properties-controller.js    |    6 +-
 .../js/controllers/process/process-root-ctrl.js |   32 +-
 .../controllers/process/process-summary-ctrl.js |   42 +-
 falcon-ui/app/js/controllers/root-controller.js |  141 +-
 falcon-ui/app/js/directives/chart.js            |  531 +++
 falcon-ui/app/js/directives/check-name.js       |   82 +-
 .../app/js/directives/dependencies-graph.js     |  294 ++
 falcon-ui/app/js/directives/directives.js       |   95 +-
 falcon-ui/app/js/directives/entities-list.js    |   49 +-
 .../app/js/directives/entities-search-list.js   |  305 ++
 falcon-ui/app/js/directives/instances-list.js   |  832 +++++
 falcon-ui/app/js/directives/lineage-graph.js    |  288 ++
 falcon-ui/app/js/directives/ng-tags-input.js    | 1148 +++++++
 falcon-ui/app/js/directives/server-messages.js  |    7 +-
 falcon-ui/app/js/directives/tooltip.js          |   37 +
 .../app/js/directives/validation-message.js     |  108 +-
 falcon-ui/app/js/lib/bootstrap.notify.js        |  347 ++
 falcon-ui/app/js/lib/dagre.min.js               |    2 +
 falcon-ui/app/js/lib/dust-full-2.0.0.min.js     | 3209 ++++++++++++++++++
 falcon-ui/app/js/lib/ng-mask.min.js             |    1 +
 falcon-ui/app/js/lib/popover.js                 |  463 +++
 falcon-ui/app/js/services/common/date-helper.js |   81 +
 falcon-ui/app/js/services/common/falcon-api.js  |  489 ++-
 falcon-ui/app/js/services/common/server-api.js  |   88 +
 .../js/services/common/validation-service.js    |   98 +-
 .../app/js/services/entity/entity-factory.js    |   66 +-
 .../app/js/services/entity/entity-model.js      |  439 ++-
 .../app/js/services/entity/entity-serializer.js |   90 +-
 .../app/js/services/entity/search-entity.js     |   63 +
 .../app/js/services/entity/search-instance.js   |   50 +
 falcon-ui/app/js/services/services.js           |   30 +-
 .../test/controllers/HeaderControllerSpec.js    |  105 +-
 .../app/test/controllers/MainControllerSpec.js  |  238 +-
 .../controllers/cluster/cluster-moduleSpec.js   |  314 +-
 .../test/controllers/feed/FeedRootCtrlSpec.js   |   38 +-
 .../process/ProcessClustersCtrlSpec.js          |    4 +-
 .../ProcessGeneralInformationCtrlSpec.js        |    6 +-
 .../process/ProcessSummaryCtrlSpec.js           |    4 +-
 falcon-ui/app/test/directives/DirectivesSpec.js |  194 +-
 falcon-ui/app/test/e2e/ClusterE2E.js            |  153 +
 falcon-ui/app/test/e2e/FeedE2E.js               |  178 +
 falcon-ui/app/test/e2e/LoginE2E.js              |   55 +
 falcon-ui/app/test/e2e/ProcessE2E.js            |    4 +-
 falcon-ui/app/test/e2e/protractor.js            |    8 +-
 .../app/test/services/EntityFactorySpec.js      |    8 +-
 falcon-ui/app/test/services/EntityModelSpec.js  |    6 +-
 .../app/test/services/EntitySerializerSpec.js   |   91 +-
 .../app/test/services/FalconServiceSpec.js      |   86 +-
 .../app/test/services/ValdationServiceSpec.js   |    2 +-
 falcon-ui/express-data/chartData.js             |  215 ++
 falcon-ui/express-data/datsetData.js            |   69 +
 falcon-ui/express-data/mockData.js              |  450 ++-
 falcon-ui/package.json                          |    2 +
 falcon-ui/pom.xml                               |    7 +-
 falcon-ui/server.js                             |  397 ++-
 webapp/pom.xml                                  |    3 +
 webapp/src/main/webapp/index.html               |   67 +-
 165 files changed, 27942 insertions(+), 2405 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index e6c8f28..d5c9c1d 100755
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -6,6 +6,8 @@ Trunk (Unreleased)
     FALCON-1401 MetadataMappingService fails to add an edge for a process instance(Pallavi Rao) 
 
   NEW FEATURES
+    FALCON-1315 Update falcon ui for HiveDR, secure clusters and bug fixes(Armando Reyna/Venkat Ranganathan via Sowmya Ramesh)
+
     FALCON-1102 Gather data transfer details of filesystem replication(Peeyush Bishnoi via Sowmya Ramesh)
 
     FALCON-1316 Add supporting REST API calls for new UI(Balu Vellanki via Sowmya Ramesh)

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/docs/src/site/twiki/InstallationSteps.twiki
----------------------------------------------------------------------
diff --git a/docs/src/site/twiki/InstallationSteps.twiki b/docs/src/site/twiki/InstallationSteps.twiki
index b2f9939..e8c76f7 100644
--- a/docs/src/site/twiki/InstallationSteps.twiki
+++ b/docs/src/site/twiki/InstallationSteps.twiki
@@ -6,7 +6,7 @@
 ---+++Prerequisites
 
    * JDK 1.7
-   * Maven 3.x
+   * Maven 3.2.x
 
 
 

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/Gruntfile.js
----------------------------------------------------------------------
diff --git a/falcon-ui/Gruntfile.js b/falcon-ui/Gruntfile.js
index 1fa44bb..112ad49 100644
--- a/falcon-ui/Gruntfile.js
+++ b/falcon-ui/Gruntfile.js
@@ -28,15 +28,13 @@
           dest: 'dist/',
           expand: true
         },
-
         dependencies: {
           cwd: 'app/',
           src: ['css/fonts/*', 'css/img/*'],
           dest: 'dist/',
           expand: true
         },
-
-        ambariview : {
+	ambariview : {
           cwd: 'dist',
           src: ['**/*.*'],
           dest: '../falcon-ambari-view/src/main/resources/ui/',
@@ -63,7 +61,12 @@
             'app/js/lib/angular-mocks.js',
             'app/js/lib/checklist-model.js',
             'app/js/lib/angular-animate.min.js',
-            'app/js/lib/angular-messages.min.js'
+            'app/js/lib/angular-messages.min.js',
+            'app/js/lib/ng-tags-input.js',
+            'app/js/lib/popover.js',
+            'app/js/lib/ng-mask.min.js',
+            'app/js/lib/dagre.min.js'
+            //'app/js/lib/bootstrap.notify.js'
           ],
           dest: 'dist/js/vendor.min.js'
         }
@@ -84,9 +87,9 @@
             'dist/js/main.min.js': [
 	      'app/js/controllers/**/*-module.js',
               'app/js/controllers/**/*.js',
-              'app/js/directives/*.js',
               'app/js/services/**/*.js',
               'app/js/services/services.js',
+              'app/js/directives/*.js',
               'app/js/app.js'
             ]
           }
@@ -191,10 +194,11 @@
 
       scp: {
         options: {
-          host: '127.0.0.1',
+          //host: 'sandbox.hortonworks.com',
+          host: '192.168.0.105',
+          //host: '192.168.0.106',
           username: 'root',
-          password: 'hadoop',
-          port: 2222
+          password: 'hadoop'
         },
 
         sandbox: {
@@ -203,8 +207,8 @@
               cwd: 'dist',
               src: '**',
               filter: 'isFile',
-              // path on the server
-              dest: '/usr/hdp/2.2.0.0-913/falcon/webapp/falcon/public'
+              dest: '/usr/hdp/2.2.0.0-2041/falcon-0.6.1.2.3.0.0-2357/server/webapp/falcon'
+              //dest: '/usr/hdp/2.3.0.0-1583/falcon/webapp/falcon'
             }
           ]
         }

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/README.md
----------------------------------------------------------------------
diff --git a/falcon-ui/README.md b/falcon-ui/README.md
new file mode 100644
index 0000000..fe36618
--- /dev/null
+++ b/falcon-ui/README.md
@@ -0,0 +1,40 @@
+Falcon-ui
+=========
+
+Web UI to manage feeds, clusters and processes with the falcon REST API
+
+Before starting
+===============
+
+NodeJs , npm, Grunt must be installed in the local pc.
+
+- From git root cd to /falcon-ui
+
+- npm install (this will install all the app related node modules)
+
+To test in the express server
+=============================
+
+- grunt dev
+This will launch an express server with the falcon-ui to localhost:3000
+(You can test there all UI related behaviours and express will mock all falcon REST calls)
+
+To deploy to the sandbox (v2-2)
+===============================
+
+- grunt deploy
+This will build and send to the sandbox /usr/hdp/2.2.0.0-913/falcon/webapp/falcon/public/ location the falcon webapp
+Then navigate to localhost:15000
+
+!important - It is possible that you will need to add to the url /public like http://localhost:15000/public/ or replace /usr/hdp/2.2.0.0-913/falcon/webapp/falcon/index.html in the sandbox with incubator-falcon/html5-ui/index.html
+
+To only build the app (in the /dist folder)
+===========================================
+
+grunt build
+
+To unit test Javascript
+grunt test
+
+To end to end test
+grunt testE2E

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/config/loginData.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/config/loginData.js b/falcon-ui/app/config/loginData.js
deleted file mode 100644
index ecd6701..0000000
--- a/falcon-ui/app/config/loginData.js
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "timeOut": 900000,
-  "user": "ambari-qa",
-  "password": "admin"
-}

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/config/loginData.json
----------------------------------------------------------------------
diff --git a/falcon-ui/app/config/loginData.json b/falcon-ui/app/config/loginData.json
new file mode 100644
index 0000000..e638276
--- /dev/null
+++ b/falcon-ui/app/config/loginData.json
@@ -0,0 +1,5 @@
+{
+	"timeOut": 900000,
+  "user": "ambari-qa",
+  "password": "admin"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/bootstrap/less/bootstrap.less
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/bootstrap/less/bootstrap.less b/falcon-ui/app/css/bootstrap/less/bootstrap.less
index 61b7747..de24e79 100644
--- a/falcon-ui/app/css/bootstrap/less/bootstrap.less
+++ b/falcon-ui/app/css/bootstrap/less/bootstrap.less
@@ -48,3 +48,4 @@
 // Utility classes
 @import "utilities.less";
 @import "responsive-utilities.less";
+@import "css/styles/popover.less";

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/bootstrap/less/glyphicons.less
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/bootstrap/less/glyphicons.less b/falcon-ui/app/css/bootstrap/less/glyphicons.less
index d3485dc..f69addf 100644
--- a/falcon-ui/app/css/bootstrap/less/glyphicons.less
+++ b/falcon-ui/app/css/bootstrap/less/glyphicons.less
@@ -12,9 +12,10 @@
   font-family: 'Glyphicons Halflings';
   src: url('@{icon-font-path}@{icon-font-name}.eot');
   src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),
-       url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),
-       url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),
-       url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');
+  url('@{icon-font-path}@{icon-font-name}.woff2') format('woff2'),
+  url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),
+  url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),
+  url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');
 }
 
 // Catchall baseclass
@@ -33,7 +34,8 @@
 // Individual icons
 .glyphicon-asterisk               { &:before { content: "\2a"; } }
 .glyphicon-plus                   { &:before { content: "\2b"; } }
-.glyphicon-euro                   { &:before { content: "\20ac"; } }
+.glyphicon-euro,
+.glyphicon-eur                    { &:before { content: "\20ac"; } }
 .glyphicon-minus                  { &:before { content: "\2212"; } }
 .glyphicon-cloud                  { &:before { content: "\2601"; } }
 .glyphicon-envelope               { &:before { content: "\2709"; } }
@@ -231,3 +233,73 @@
 .glyphicon-cloud-upload           { &:before { content: "\e198"; } }
 .glyphicon-tree-conifer           { &:before { content: "\e199"; } }
 .glyphicon-tree-deciduous         { &:before { content: "\e200"; } }
+.glyphicon-cd                     { &:before { content: "\e201"; } }
+.glyphicon-save-file              { &:before { content: "\e202"; } }
+.glyphicon-open-file              { &:before { content: "\e203"; } }
+.glyphicon-level-up               { &:before { content: "\e204"; } }
+.glyphicon-copy                   { &:before { content: "\e205"; } }
+.glyphicon-paste                  { &:before { content: "\e206"; } }
+// The following 2 Glyphicons are omitted for the time being because
+// they currently use Unicode codepoints that are outside the
+// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle
+// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.
+// Notably, the bug affects some older versions of the Android Browser.
+// More info: https://github.com/twbs/bootstrap/issues/10106
+// .glyphicon-door                   { &:before { content: "\1f6aa"; } }
+// .glyphicon-key                    { &:before { content: "\1f511"; } }
+.glyphicon-alert                  { &:before { content: "\e209"; } }
+.glyphicon-equalizer              { &:before { content: "\e210"; } }
+.glyphicon-king                   { &:before { content: "\e211"; } }
+.glyphicon-queen                  { &:before { content: "\e212"; } }
+.glyphicon-pawn                   { &:before { content: "\e213"; } }
+.glyphicon-bishop                 { &:before { content: "\e214"; } }
+.glyphicon-knight                 { &:before { content: "\e215"; } }
+.glyphicon-baby-formula           { &:before { content: "\e216"; } }
+.glyphicon-tent                   { &:before { content: "\26fa"; } }
+.glyphicon-blackboard             { &:before { content: "\e218"; } }
+.glyphicon-bed                    { &:before { content: "\e219"; } }
+.glyphicon-apple                  { &:before { content: "\f8ff"; } }
+.glyphicon-erase                  { &:before { content: "\e221"; } }
+.glyphicon-hourglass              { &:before { content: "\231b"; } }
+.glyphicon-lamp                   { &:before { content: "\e223"; } }
+.glyphicon-duplicate              { &:before { content: "\e224"; } }
+.glyphicon-piggy-bank             { &:before { content: "\e225"; } }
+.glyphicon-scissors               { &:before { content: "\e226"; } }
+.glyphicon-bitcoin                { &:before { content: "\e227"; } }
+.glyphicon-btc                    { &:before { content: "\e227"; } }
+.glyphicon-xbt                    { &:before { content: "\e227"; } }
+.glyphicon-yen                    { &:before { content: "\00a5"; } }
+.glyphicon-jpy                    { &:before { content: "\00a5"; } }
+.glyphicon-ruble                  { &:before { content: "\20bd"; } }
+.glyphicon-rub                    { &:before { content: "\20bd"; } }
+.glyphicon-scale                  { &:before { content: "\e230"; } }
+.glyphicon-ice-lolly              { &:before { content: "\e231"; } }
+.glyphicon-ice-lolly-tasted       { &:before { content: "\e232"; } }
+.glyphicon-education              { &:before { content: "\e233"; } }
+.glyphicon-option-horizontal      { &:before { content: "\e234"; } }
+.glyphicon-option-vertical        { &:before { content: "\e235"; } }
+.glyphicon-menu-hamburger         { &:before { content: "\e236"; } }
+.glyphicon-modal-window           { &:before { content: "\e237"; } }
+.glyphicon-oil                    { &:before { content: "\e238"; } }
+.glyphicon-grain                  { &:before { content: "\e239"; } }
+.glyphicon-sunglasses             { &:before { content: "\e240"; } }
+.glyphicon-text-size              { &:before { content: "\e241"; } }
+.glyphicon-text-color             { &:before { content: "\e242"; } }
+.glyphicon-text-background        { &:before { content: "\e243"; } }
+.glyphicon-object-align-top       { &:before { content: "\e244"; } }
+.glyphicon-object-align-bottom    { &:before { content: "\e245"; } }
+.glyphicon-object-align-horizontal{ &:before { content: "\e246"; } }
+.glyphicon-object-align-left      { &:before { content: "\e247"; } }
+.glyphicon-object-align-vertical  { &:before { content: "\e248"; } }
+.glyphicon-object-align-right     { &:before { content: "\e249"; } }
+.glyphicon-triangle-right         { &:before { content: "\e250"; } }
+.glyphicon-triangle-left          { &:before { content: "\e251"; } }
+.glyphicon-triangle-bottom        { &:before { content: "\e252"; } }
+.glyphicon-triangle-top           { &:before { content: "\e253"; } }
+.glyphicon-console                { &:before { content: "\e254"; } }
+.glyphicon-superscript            { &:before { content: "\e255"; } }
+.glyphicon-subscript              { &:before { content: "\e256"; } }
+.glyphicon-menu-left              { &:before { content: "\e257"; } }
+.glyphicon-menu-right             { &:before { content: "\e258"; } }
+.glyphicon-menu-down              { &:before { content: "\e259"; } }
+.glyphicon-menu-up                { &:before { content: "\e260"; } }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/fonts/Cabin-Bold-webfont.eot
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/fonts/Cabin-Bold-webfont.eot b/falcon-ui/app/css/fonts/Cabin-Bold-webfont.eot
new file mode 100644
index 0000000..b755bff
Binary files /dev/null and b/falcon-ui/app/css/fonts/Cabin-Bold-webfont.eot differ


[07/22] falcon git commit: FALCON-1315 Update falcon ui for HiveDR, secure clusters and bug fixes. Contributed by Armando Reyna/Venkat Ranganathan.

Posted by so...@apache.org.
http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/directives/ng-tags-input.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/directives/ng-tags-input.js b/falcon-ui/app/js/directives/ng-tags-input.js
new file mode 100644
index 0000000..1039011
--- /dev/null
+++ b/falcon-ui/app/js/directives/ng-tags-input.js
@@ -0,0 +1,1148 @@
+/*!
+ * ngTagsInput v2.3.0
+ * http://mbenford.github.io/ngTagsInput
+ *
+ * Copyright (c) 2013-2015 Michael Benford
+ * License: MIT
+ *
+ * Generated at 2015-03-24 00:49:44 -0300
+ */
+(function() {
+  'use strict';
+
+  var KEYS = {
+    backspace: 8,
+    tab: 9,
+    enter: 13,
+    escape: 27,
+    space: 32,
+    up: 38,
+    down: 40,
+    left: 37,
+    right: 39,
+    delete: 46,
+    comma: 188
+  };
+
+  var MAX_SAFE_INTEGER = 9007199254740991;
+  var SUPPORTED_INPUT_TYPES = ['text', 'email', 'url'];
+
+  var tagsInput = angular.module('ngTagsInput', []);
+
+  /**
+   * @ngdoc directive
+   * @name tagsInput
+   * @module ngTagsInput
+   *
+   * @description
+   * Renders an input box with tag editing support.
+   *
+   * @param {string} ngModel Assignable angular expression to data-bind to.
+   * @param {string=} [displayProperty=text] Property to be rendered as the tag label.
+   * @param {string=} [keyProperty=text] Property to be used as a unique identifier for the tag.
+   * @param {string=} [type=text] Type of the input element. Only 'text', 'email' and 'url' are supported values.
+   * @param {number=} tabindex Tab order of the control.
+   * @param {string=} [placeholder=Add a tag] Placeholder text for the control.
+   * @param {number=} [minLength=3] Minimum length for a new tag.
+   * @param {number=} [maxLength=MAX_SAFE_INTEGER] Maximum length allowed for a new tag.
+   * @param {number=} [minTags=0] Sets minTags validation error key if the number of tags added is less than minTags.
+   * @param {number=} [maxTags=MAX_SAFE_INTEGER] Sets maxTags validation error key if the number of tags added is greater than maxTags.
+   * @param {boolean=} [allowLeftoverText=false] Sets leftoverText validation error key if there is any leftover text in
+   *                                             the input element when the directive loses focus.
+   * @param {string=} [removeTagSymbol=×] Symbol character for the remove tag button.
+   * @param {boolean=} [addOnEnter=true] Flag indicating that a new tag will be added on pressing the ENTER key.
+   * @param {boolean=} [addOnSpace=false] Flag indicating that a new tag will be added on pressing the SPACE key.
+   * @param {boolean=} [addOnComma=true] Flag indicating that a new tag will be added on pressing the COMMA key.
+   * @param {boolean=} [addOnBlur=true] Flag indicating that a new tag will be added when the input field loses focus.
+   * @param {boolean=} [addOnPaste=false] Flag indicating that the text pasted into the input field will be split into tags.
+   * @param {string=} [pasteSplitPattern=,] Regular expression used to split the pasted text into tags.
+   * @param {boolean=} [replaceSpacesWithDashes=true] Flag indicating that spaces will be replaced with dashes.
+   * @param {string=} [allowedTagsPattern=.+] Regular expression that determines whether a new tag is valid.
+   * @param {boolean=} [enableEditingLastTag=false] Flag indicating that the last tag will be moved back into
+   *                                                the new tag input box instead of being removed when the backspace key
+   *                                                is pressed and the input box is empty.
+   * @param {boolean=} [addFromAutocompleteOnly=false] Flag indicating that only tags coming from the autocomplete list will be allowed.
+   *                                                   When this flag is true, addOnEnter, addOnComma, addOnSpace, addOnBlur and
+   *                                                   allowLeftoverText values are ignored.
+   * @param {boolean=} [spellcheck=true] Flag indicating whether the browser's spellcheck is enabled for the input field or not.
+   * @param {expression} onTagAdding Expression to evaluate that will be invoked before adding a new tag. The new tag is available as $tag. This method must return either true or false. If false, the tag will not be added.
+   * @param {expression} onTagAdded Expression to evaluate upon adding a new tag. The new tag is available as $tag.
+   * @param {expression} onInvalidTag Expression to evaluate when a tag is invalid. The invalid tag is available as $tag.
+   * @param {expression} onTagRemoving Expression to evaluate that will be invoked before removing a tag. The tag is available as $tag. This method must return either true or false. If false, the tag will not be removed.
+   * @param {expression} onTagRemoved Expression to evaluate upon removing an existing tag. The removed tag is available as $tag.
+   */
+  tagsInput.directive('tagsInput', ["$timeout","$document","$window","tagsInputConfig","tiUtil", function($timeout, $document, $window, tagsInputConfig, tiUtil) {
+    function TagList(options, events, onTagAdding, onTagRemoving) {
+      var self = {}, getTagText, setTagText, tagIsValid;
+
+      getTagText = function(tag) {
+        return tiUtil.safeToString(tag[options.displayProperty]);
+      };
+
+      setTagText = function(tag, text) {
+        tag[options.displayProperty] = text;
+      };
+
+      tagIsValid = function(tag) {
+        var tagText = getTagText(tag);
+
+        return tagText &&
+            tagText.length >= options.minLength &&
+            tagText.length <= options.maxLength &&
+            options.allowedTagsPattern.test(tagText) &&
+            !tiUtil.findInObjectArray(self.items, tag, options.keyProperty || options.displayProperty) &&
+            onTagAdding({ $tag: tag });
+      };
+
+      self.items = [];
+
+      self.addText = function(text) {
+        var tag = {};
+        setTagText(tag, text);
+        return self.add(tag);
+      };
+
+      self.add = function(tag) {
+        var tagText = getTagText(tag);
+
+        if (options.replaceSpacesWithDashes) {
+          tagText = tiUtil.replaceSpacesWithDashes(tagText);
+        }
+
+        setTagText(tag, tagText);
+
+        if (tagIsValid(tag)) {
+          self.items.push(tag);
+          events.trigger('tag-added', { $tag: tag });
+        }
+        else if (tagText) {
+          events.trigger('invalid-tag', { $tag: tag });
+        }
+
+        return tag;
+      };
+
+      self.remove = function(index) {
+        var tag = self.items[index];
+
+        if (onTagRemoving({ $tag: tag }))  {
+          self.items.splice(index, 1);
+          self.clearSelection();
+          events.trigger('tag-removed', { $tag: tag });
+          return tag;
+        }
+      };
+
+      self.select = function(index) {
+        if (index < 0) {
+          index = self.items.length - 1;
+        }
+        else if (index >= self.items.length) {
+          index = 0;
+        }
+
+        self.index = index;
+        self.selected = self.items[index];
+      };
+
+      self.selectPrior = function() {
+        self.select(--self.index);
+      };
+
+      self.selectNext = function() {
+        self.select(++self.index);
+      };
+
+      self.removeSelected = function() {
+        return self.remove(self.index);
+      };
+
+      self.clearSelection = function() {
+        self.selected = null;
+        self.index = -1;
+      };
+
+      self.clearSelection();
+
+      return self;
+    }
+
+    function validateType(type) {
+      return SUPPORTED_INPUT_TYPES.indexOf(type) !== -1;
+    }
+
+    return {
+      restrict: 'E',
+      require: 'ngModel',
+      scope: {
+        tags: '=ngModel',
+        onTagAdding: '&',
+        onTagAdded: '&',
+        onInvalidTag: '&',
+        onTagRemoving: '&',
+        onTagRemoved: '&'
+      },
+      replace: false,
+      transclude: true,
+      templateUrl: 'ngTagsInput/tags-input.html',
+      controller: ["$scope","$attrs","$element", function($scope, $attrs, $element) {
+        $scope.events = tiUtil.simplePubSub();
+
+        tagsInputConfig.load('tagsInput', $scope, $attrs, {
+          template: [String, 'ngTagsInput/tag-item.html'],
+          type: [String, 'text', validateType],
+          placeholder: [String, 'Add a tag'],
+          tabindex: [Number, null],
+          removeTagSymbol: [String, String.fromCharCode(215)],
+          replaceSpacesWithDashes: [Boolean, true],
+          minLength: [Number, 3],
+          maxLength: [Number, MAX_SAFE_INTEGER],
+          addOnEnter: [Boolean, true],
+          addOnSpace: [Boolean, false],
+          addOnComma: [Boolean, true],
+          addOnBlur: [Boolean, true],
+          addOnPaste: [Boolean, false],
+          pasteSplitPattern: [RegExp, /,/],
+          allowedTagsPattern: [RegExp, /.+/],
+          enableEditingLastTag: [Boolean, false],
+          minTags: [Number, 0],
+          maxTags: [Number, MAX_SAFE_INTEGER],
+          displayProperty: [String, 'text'],
+          keyProperty: [String, ''],
+          allowLeftoverText: [Boolean, false],
+          addFromAutocompleteOnly: [Boolean, false],
+          spellcheck: [Boolean, true]
+        });
+
+        $scope.tagList = new TagList($scope.options, $scope.events,
+            tiUtil.handleUndefinedResult($scope.onTagAdding, true),
+            tiUtil.handleUndefinedResult($scope.onTagRemoving, true));
+
+        this.registerAutocomplete = function() {
+          var input = $element.find('input');
+
+          return {
+            addTag: function(tag) {
+              return $scope.tagList.add(tag);
+            },
+            focusInput: function() {
+              input[0].focus();
+            },
+            getTags: function() {
+              return $scope.tags;
+            },
+            getCurrentTagText: function() {
+              return $scope.newTag.text;
+            },
+            getOptions: function() {
+              return $scope.options;
+            },
+            on: function(name, handler) {
+              $scope.events.on(name, handler);
+              return this;
+            }
+          };
+        };
+
+        this.registerTagItem = function() {
+          return {
+            getOptions: function() {
+              return $scope.options;
+            },
+            removeTag: function(index) {
+              if ($scope.disabled) {
+                return;
+              }
+              $scope.tagList.remove(index);
+            }
+          };
+        };
+      }],
+      link: function(scope, element, attrs, ngModelCtrl) {
+        var hotkeys = [KEYS.enter, KEYS.comma, KEYS.space, KEYS.backspace, KEYS.delete, KEYS.left, KEYS.right],
+            tagList = scope.tagList,
+            events = scope.events,
+            options = scope.options,
+            input = element.find('input'),
+            validationOptions = ['minTags', 'maxTags', 'allowLeftoverText'],
+            setElementValidity;
+
+        setElementValidity = function() {
+          ngModelCtrl.$setValidity('maxTags', scope.tags.length <= options.maxTags);
+          ngModelCtrl.$setValidity('minTags', scope.tags.length >= options.minTags);
+          ngModelCtrl.$setValidity('leftoverText', scope.hasFocus || options.allowLeftoverText ? true : !scope.newTag.text);
+        };
+
+        ngModelCtrl.$isEmpty = function(value) {
+          return !value || !value.length;
+        };
+
+        scope.newTag = {
+          text: '',
+          invalid: null,
+          setText: function(value) {
+            this.text = value;
+            events.trigger('input-change', value);
+          }
+        };
+
+        scope.track = function(tag) {
+          return tag[options.keyProperty || options.displayProperty];
+        };
+
+        scope.$watch('tags', function(value) {
+          scope.tags = tiUtil.makeObjectArray(value, options.displayProperty);
+          tagList.items = scope.tags;
+        });
+
+        scope.$watch('tags.length', function() {
+          setElementValidity();
+        });
+
+        attrs.$observe('disabled', function(value) {
+          scope.disabled = value;
+        });
+
+        scope.eventHandlers = {
+          input: {
+            change: function(text) {
+              events.trigger('input-change', text);
+            },
+            keydown: function($event) {
+              events.trigger('input-keydown', $event);
+            },
+            focus: function() {
+              if (scope.hasFocus) {
+                return;
+              }
+
+              scope.hasFocus = true;
+              events.trigger('input-focus');
+            },
+            blur: function() {
+              $timeout(function() {
+                var activeElement = $document.prop('activeElement'),
+                    lostFocusToBrowserWindow = activeElement === input[0],
+                    lostFocusToChildElement = element[0].contains(activeElement);
+
+                if (lostFocusToBrowserWindow || !lostFocusToChildElement) {
+                  scope.hasFocus = false;
+                  events.trigger('input-blur');
+                }
+              });
+            },
+            paste: function($event) {
+              $event.getTextData = function() {
+                var clipboardData = $event.clipboardData || ($event.originalEvent && $event.originalEvent.clipboardData);
+                return clipboardData ? clipboardData.getData('text/plain') : $window.clipboardData.getData('Text');
+              };
+              events.trigger('input-paste', $event);
+            }
+          },
+          host: {
+            click: function() {
+              if (scope.disabled) {
+                return;
+              }
+              input[0].focus();
+            }
+          }
+        };
+
+        events
+            .on('tag-added', scope.onTagAdded)
+            .on('invalid-tag', scope.onInvalidTag)
+            .on('tag-removed', scope.onTagRemoved)
+            .on('tag-added', function() {
+              scope.newTag.setText('');
+            })
+            .on('tag-added tag-removed', function() {
+              // Sets the element to its dirty state
+              // In Angular 1.3 this will be replaced with $setDirty.
+              ngModelCtrl.$setViewValue(scope.tags);
+            })
+            .on('invalid-tag', function() {
+              scope.newTag.invalid = true;
+            })
+            .on('option-change', function(e) {
+              if (validationOptions.indexOf(e.name) !== -1) {
+                setElementValidity();
+              }
+            })
+            .on('input-change', function() {
+              tagList.clearSelection();
+              scope.newTag.invalid = null;
+            })
+            .on('input-focus', function() {
+              element.triggerHandler('focus');
+              ngModelCtrl.$setValidity('leftoverText', true);
+            })
+            .on('input-blur', function() {
+              if (options.addOnBlur && !options.addFromAutocompleteOnly) {
+                tagList.addText(scope.newTag.text);
+              }
+              element.triggerHandler('blur');
+              setElementValidity();
+            })
+            .on('input-keydown', function(event) {
+              var key = event.keyCode,
+                  isModifier = event.shiftKey || event.altKey || event.ctrlKey || event.metaKey,
+                  addKeys = {},
+                  shouldAdd, shouldRemove, shouldSelect, shouldEditLastTag;
+
+              if (isModifier || hotkeys.indexOf(key) === -1) {
+                return;
+              }
+
+              addKeys[KEYS.enter] = options.addOnEnter;
+              addKeys[KEYS.comma] = options.addOnComma;
+              addKeys[KEYS.space] = options.addOnSpace;
+
+              shouldAdd = !options.addFromAutocompleteOnly && addKeys[key];
+              shouldRemove = (key === KEYS.backspace || key === KEYS.delete) && tagList.selected;
+              shouldEditLastTag = key === KEYS.backspace && scope.newTag.text.length === 0 && options.enableEditingLastTag;
+              shouldSelect = (key === KEYS.backspace || key === KEYS.left || key === KEYS.right) && scope.newTag.text.length === 0 && !options.enableEditingLastTag;
+
+              if (shouldAdd) {
+                tagList.addText(scope.newTag.text);
+              }
+              else if (shouldEditLastTag) {
+                var tag;
+
+                tagList.selectPrior();
+                tag = tagList.removeSelected();
+
+                if (tag) {
+                  scope.newTag.setText(tag[options.displayProperty]);
+                }
+              }
+              else if (shouldRemove) {
+                tagList.removeSelected();
+              }
+              else if (shouldSelect) {
+                if (key === KEYS.left || key === KEYS.backspace) {
+                  tagList.selectPrior();
+                }
+                else if (key === KEYS.right) {
+                  tagList.selectNext();
+                }
+              }
+
+              if (shouldAdd || shouldSelect || shouldRemove || shouldEditLastTag) {
+                event.preventDefault();
+              }
+            })
+            .on('input-paste', function(event) {
+              if (options.addOnPaste) {
+                var data = event.getTextData();
+                var tags = data.split(options.pasteSplitPattern);
+
+                if (tags.length > 1) {
+                  tags.forEach(function(tag) {
+                    tagList.addText(tag);
+                  });
+                  event.preventDefault();
+                }
+              }
+            });
+      }
+    };
+  }]);
+
+
+  /**
+   * @ngdoc directive
+   * @name tiTagItem
+   * @module ngTagsInput
+   *
+   * @description
+   * Represents a tag item. Used internally by the tagsInput directive.
+   */
+  tagsInput.directive('tiTagItem', ["tiUtil", function(tiUtil) {
+    return {
+      restrict: 'E',
+      require: '^tagsInput',
+      template: '<ng-include src="$$template"></ng-include>',
+      scope: { data: '=' },
+      link: function(scope, element, attrs, tagsInputCtrl) {
+        var tagsInput = tagsInputCtrl.registerTagItem(),
+            options = tagsInput.getOptions();
+
+        scope.$$template = options.template;
+        scope.$$removeTagSymbol = options.removeTagSymbol;
+
+        scope.$getDisplayText = function() {
+          var label = tiUtil.safeToString(scope.data[options.displayProperty]);
+          label = label.replace("Name:","").replace("Type:","").replace("Tag:","");
+          return label;
+        };
+
+        scope.getDisplayLabel = function () {
+          var label = tiUtil.safeToString(scope.data[options.displayProperty]);
+          if(label.indexOf("Name:") !== -1){
+            label = "Name:";
+          }else if(label.indexOf("Type:") !== -1){
+            label = "Type:";
+          }else if(label.indexOf("Tag:") !== -1){
+            label = "Tag:";
+          }else{
+            label = "";
+          }
+          return label;
+        };
+
+        scope.$removeTag = function() {
+          tagsInput.removeTag(scope.$index);
+        };
+
+        scope.$watch('$parent.$index', function(value) {
+          scope.$index = value;
+        });
+      }
+    };
+  }]);
+
+
+  /**
+   * @ngdoc directive
+   * @name autoComplete
+   * @module ngTagsInput
+   *
+   * @description
+   * Provides autocomplete support for the tagsInput directive.
+   *
+   * @param {expression} source Expression to evaluate upon changing the input content. The input value is available as
+   *                            $query. The result of the expression must be a promise that eventually resolves to an
+   *                            array of strings.
+   * @param {string=} [displayProperty=text] Property to be rendered as the autocomplete label.
+   * @param {number=} [debounceDelay=100] Amount of time, in milliseconds, to wait before evaluating the expression in
+   *                                      the source option after the last keystroke.
+   * @param {number=} [minLength=3] Minimum number of characters that must be entered before evaluating the expression
+   *                                 in the source option.
+   * @param {boolean=} [highlightMatchedText=true] Flag indicating that the matched text will be highlighted in the
+   *                                               suggestions list.
+   * @param {number=} [maxResultsToShow=10] Maximum number of results to be displayed at a time.
+   * @param {boolean=} [loadOnDownArrow=false] Flag indicating that the source option will be evaluated when the down arrow
+   *                                           key is pressed and the suggestion list is closed. The current input value
+   *                                           is available as $query.
+   * @param {boolean=} {loadOnEmpty=false} Flag indicating that the source option will be evaluated when the input content
+   *                                       becomes empty. The $query variable will be passed to the expression as an empty string.
+   * @param {boolean=} {loadOnFocus=false} Flag indicating that the source option will be evaluated when the input element
+   *                                       gains focus. The current input value is available as $query.
+   * @param {boolean=} [selectFirstMatch=true] Flag indicating that the first match will be automatically selected once
+   *                                           the suggestion list is shown.
+   * @param {string=} [template=] URL or id of a custom template for rendering each element of the autocomplete list.
+   */
+  tagsInput.directive('autoComplete', ["$document","$timeout","$sce","$q","tagsInputConfig","tiUtil", function($document, $timeout, $sce, $q, tagsInputConfig, tiUtil) {
+    function SuggestionList(loadFn, options, events) {
+      var self = {}, getDifference, lastPromise, getTagId;
+
+      getTagId = function() {
+        return options.tagsInput.keyProperty || options.tagsInput.displayProperty;
+      };
+
+      getDifference = function(array1, array2) {
+        return array1.filter(function(item) {
+          return !tiUtil.findInObjectArray(array2, item, getTagId(), function(a, b) {
+            if (options.tagsInput.replaceSpacesWithDashes) {
+              a = tiUtil.replaceSpacesWithDashes(a);
+              b = tiUtil.replaceSpacesWithDashes(b);
+            }
+            return tiUtil.defaultComparer(a, b);
+          });
+        });
+      };
+
+      self.reset = function() {
+        lastPromise = null;
+
+        self.items = [];
+        self.visible = false;
+        self.index = -1;
+        self.selected = null;
+        self.query = null;
+      };
+      self.show = function() {
+        if (options.selectFirstMatch) {
+          self.select(0);
+        }
+        else {
+          self.selected = null;
+        }
+        self.visible = true;
+      };
+      self.load = tiUtil.debounce(function(query, tags) {
+        self.query = query;
+
+        var promise = $q.when(loadFn({ $query: query }));
+        lastPromise = promise;
+
+        promise.then(function(items) {
+          if (promise !== lastPromise) {
+            return;
+          }
+
+          items = tiUtil.makeObjectArray(items.data || items, getTagId());
+          items = getDifference(items, tags);
+          self.items = items.slice(0, options.maxResultsToShow);
+
+          if (self.items.length > 0) {
+            self.show();
+          }
+          else {
+            self.reset();
+          }
+        });
+      }, options.debounceDelay);
+
+      self.selectNext = function() {
+        self.select(++self.index);
+      };
+      self.selectPrior = function() {
+        self.select(--self.index);
+      };
+      self.select = function(index) {
+        if (index < 0) {
+          index = self.items.length - 1;
+        }
+        else if (index >= self.items.length) {
+          index = 0;
+        }
+        self.index = index;
+        self.selected = self.items[index];
+        events.trigger('suggestion-selected', index);
+      };
+
+      self.reset();
+
+      return self;
+    }
+
+    function scrollToElement(root, index) {
+      var element = root.find('li').eq(index),
+          parent = element.parent(),
+          elementTop = element.prop('offsetTop'),
+          elementHeight = element.prop('offsetHeight'),
+          parentHeight = parent.prop('clientHeight'),
+          parentScrollTop = parent.prop('scrollTop');
+
+      if (elementTop < parentScrollTop) {
+        parent.prop('scrollTop', elementTop);
+      }
+      else if (elementTop + elementHeight > parentHeight + parentScrollTop) {
+        parent.prop('scrollTop', elementTop + elementHeight - parentHeight);
+      }
+    }
+
+    return {
+      restrict: 'E',
+      require: '^tagsInput',
+      scope: { source: '&' },
+      templateUrl: 'ngTagsInput/auto-complete.html',
+      controller: ["$scope","$element","$attrs", function($scope, $element, $attrs) {
+        $scope.events = tiUtil.simplePubSub();
+
+        tagsInputConfig.load('autoComplete', $scope, $attrs, {
+          template: [String, 'ngTagsInput/auto-complete-match.html'],
+          debounceDelay: [Number, 100],
+          minLength: [Number, 3],
+          highlightMatchedText: [Boolean, true],
+          maxResultsToShow: [Number, 10],
+          loadOnDownArrow: [Boolean, false],
+          loadOnEmpty: [Boolean, false],
+          loadOnFocus: [Boolean, false],
+          selectFirstMatch: [Boolean, true],
+          displayProperty: [String, '']
+        });
+
+        $scope.suggestionList = new SuggestionList($scope.source, $scope.options, $scope.events);
+
+        this.registerAutocompleteMatch = function() {
+          return {
+            getOptions: function() {
+              return $scope.options;
+            },
+            getQuery: function() {
+              return $scope.suggestionList.query;
+            }
+          };
+        };
+      }],
+      link: function(scope, element, attrs, tagsInputCtrl) {
+        var hotkeys = [KEYS.enter, KEYS.tab, KEYS.escape, KEYS.up, KEYS.down],
+            suggestionList = scope.suggestionList,
+            tagsInput = tagsInputCtrl.registerAutocomplete(),
+            options = scope.options,
+            events = scope.events,
+            shouldLoadSuggestions;
+
+        options.tagsInput = tagsInput.getOptions();
+
+        shouldLoadSuggestions = function(value) {
+          return value && value.length >= options.minLength || !value && options.loadOnEmpty;
+        };
+
+        scope.addSuggestionByIndex = function(index) {
+          suggestionList.select(index);
+          scope.addSuggestion();
+        };
+
+        scope.addSuggestion = function() {
+          var added = false;
+
+          if (suggestionList.selected) {
+            tagsInput.addTag(angular.copy(suggestionList.selected));
+            suggestionList.reset();
+            tagsInput.focusInput();
+
+            added = true;
+          }
+          return added;
+        };
+
+        scope.track = function(item) {
+          return item[options.tagsInput.keyProperty || options.tagsInput.displayProperty];
+        };
+
+        tagsInput
+            .on('tag-added invalid-tag input-blur', function() {
+              suggestionList.reset();
+            })
+            .on('input-change', function(value) {
+              if (shouldLoadSuggestions(value)) {
+                suggestionList.load(value, tagsInput.getTags());
+              }
+              else {
+                suggestionList.reset();
+              }
+            })
+            .on('input-focus', function() {
+              var value = tagsInput.getCurrentTagText();
+              if (options.loadOnFocus && shouldLoadSuggestions(value)) {
+                suggestionList.load(value, tagsInput.getTags());
+              }
+            })
+            .on('input-keydown', function(event) {
+              var key = event.keyCode,
+                  handled = false;
+
+              if (hotkeys.indexOf(key) === -1) {
+                return;
+              }
+
+              if (suggestionList.visible) {
+
+                if (key === KEYS.down) {
+                  suggestionList.selectNext();
+                  handled = true;
+                }
+                else if (key === KEYS.up) {
+                  suggestionList.selectPrior();
+                  handled = true;
+                }
+                else if (key === KEYS.escape) {
+                  suggestionList.reset();
+                  handled = true;
+                }
+                else if (key === KEYS.enter || key === KEYS.tab) {
+                  handled = scope.addSuggestion();
+                }
+              }
+              else {
+                if (key === KEYS.down && scope.options.loadOnDownArrow) {
+                  suggestionList.load(tagsInput.getCurrentTagText(), tagsInput.getTags());
+                  handled = true;
+                }
+              }
+
+              if (handled) {
+                event.preventDefault();
+                event.stopImmediatePropagation();
+                return false;
+              }
+            });
+
+        events.on('suggestion-selected', function(index) {
+          scrollToElement(element, index);
+        });
+      }
+    };
+  }]);
+
+
+  /**
+   * @ngdoc directive
+   * @name tiAutocompleteMatch
+   * @module ngTagsInput
+   *
+   * @description
+   * Represents an autocomplete match. Used internally by the autoComplete directive.
+   */
+  tagsInput.directive('tiAutocompleteMatch', ["$sce","tiUtil", function($sce, tiUtil) {
+    return {
+      restrict: 'E',
+      require: '^autoComplete',
+      template: '<ng-include src="$$template"></ng-include>',
+      scope: { data: '=' },
+      link: function(scope, element, attrs, autoCompleteCtrl) {
+        var autoComplete = autoCompleteCtrl.registerAutocompleteMatch(),
+            options = autoComplete.getOptions();
+
+        scope.$$template = options.template;
+        scope.$index = scope.$parent.$index;
+
+        scope.$highlight = function(text) {
+          if (options.highlightMatchedText) {
+            text = tiUtil.safeHighlight(text, autoComplete.getQuery());
+          }
+          return $sce.trustAsHtml(text);
+        };
+        scope.$getDisplayText =  function() {
+          return tiUtil.safeToString(scope.data[options.displayProperty || options.tagsInput.displayProperty]);
+        };
+      }
+    };
+  }]);
+
+
+  /**
+   * @ngdoc directive
+   * @name tiTranscludeAppend
+   * @module ngTagsInput
+   *
+   * @description
+   * Re-creates the old behavior of ng-transclude. Used internally by tagsInput directive.
+   */
+  tagsInput.directive('tiTranscludeAppend', function() {
+    return function(scope, element, attrs, ctrl, transcludeFn) {
+      transcludeFn(function(clone) {
+        element.append(clone);
+      });
+    };
+  });
+
+  /**
+   * @ngdoc directive
+   * @name tiAutosize
+   * @module ngTagsInput
+   *
+   * @description
+   * Automatically sets the input's width so its content is always visible. Used internally by tagsInput directive.
+   */
+  tagsInput.directive('tiAutosize', ["tagsInputConfig", function(tagsInputConfig) {
+    return {
+      restrict: 'A',
+      require: 'ngModel',
+      link: function(scope, element, attrs, ctrl) {
+        var threshold = tagsInputConfig.getTextAutosizeThreshold(),
+            span, resize;
+
+        span = angular.element('<span class="input"></span>');
+        span.css('display', 'none')
+            .css('visibility', 'hidden')
+            .css('width', 'auto')
+            .css('white-space', 'pre');
+
+        element.parent().append(span);
+
+        resize = function(originalValue) {
+          var value = originalValue, width;
+
+          if (angular.isString(value) && value.length === 0) {
+            value = attrs.placeholder;
+          }
+
+          if (value) {
+            span.text(value);
+            span.css('display', '');
+            width = span.prop('offsetWidth');
+            span.css('display', 'none');
+          }
+
+          element.css('width', width ? width + threshold + 'px' : '');
+
+          return originalValue;
+        };
+
+        ctrl.$parsers.unshift(resize);
+        ctrl.$formatters.unshift(resize);
+
+        attrs.$observe('placeholder', function(value) {
+          if (!ctrl.$modelValue) {
+            resize(value);
+          }
+        });
+      }
+    };
+  }]);
+
+  /**
+   * @ngdoc directive
+   * @name tiBindAttrs
+   * @module ngTagsInput
+   *
+   * @description
+   * Binds attributes to expressions. Used internally by tagsInput directive.
+   */
+  tagsInput.directive('tiBindAttrs', function() {
+    return function(scope, element, attrs) {
+      scope.$watch(attrs.tiBindAttrs, function(value) {
+        angular.forEach(value, function(value, key) {
+          attrs.$set(key, value);
+        });
+      }, true);
+    };
+  });
+
+  /**
+   * @ngdoc service
+   * @name tagsInputConfig
+   * @module ngTagsInput
+   *
+   * @description
+   * Sets global configuration settings for both tagsInput and autoComplete directives. It's also used internally to parse and
+   * initialize options from HTML attributes.
+   */
+  tagsInput.provider('tagsInputConfig', function() {
+    var globalDefaults = {},
+        interpolationStatus = {},
+        autosizeThreshold = 3;
+
+    /**
+     * @ngdoc method
+     * @name setDefaults
+     * @description Sets the default configuration option for a directive.
+     * @methodOf tagsInputConfig
+     *
+     * @param {string} directive Name of the directive to be configured. Must be either 'tagsInput' or 'autoComplete'.
+     * @param {object} defaults Object containing options and their values.
+     *
+     * @returns {object} The service itself for chaining purposes.
+     */
+    this.setDefaults = function(directive, defaults) {
+      globalDefaults[directive] = defaults;
+      return this;
+    };
+
+    /***
+     * @ngdoc method
+     * @name setActiveInterpolation
+     * @description Sets active interpolation for a set of options.
+     * @methodOf tagsInputConfig
+     *
+     * @param {string} directive Name of the directive to be configured. Must be either 'tagsInput' or 'autoComplete'.
+     * @param {object} options Object containing which options should have interpolation turned on at all times.
+     *
+     * @returns {object} The service itself for chaining purposes.
+     */
+    this.setActiveInterpolation = function(directive, options) {
+      interpolationStatus[directive] = options;
+      return this;
+    };
+
+    /***
+     * @ngdoc method
+     * @name setTextAutosizeThreshold
+     * @description Sets the threshold used by the tagsInput directive to re-size the inner input field element based on its contents.
+     * @methodOf tagsInputConfig
+     *
+     * @param {number} threshold Threshold value, in pixels.
+     *
+     * @returns {object} The service itself for chaining purposes.
+     */
+    this.setTextAutosizeThreshold = function(threshold) {
+      autosizeThreshold = threshold;
+      return this;
+    };
+
+    this.$get = ["$interpolate", function($interpolate) {
+      var converters = {};
+      converters[String] = function(value) { return value; };
+      converters[Number] = function(value) { return parseInt(value, 10); };
+      converters[Boolean] = function(value) { return value.toLowerCase() === 'true'; };
+      converters[RegExp] = function(value) { return new RegExp(value); };
+
+      return {
+        load: function(directive, scope, attrs, options) {
+          var defaultValidator = function() { return true; };
+
+          scope.options = {};
+
+          angular.forEach(options, function(value, key) {
+            var type, localDefault, validator, converter, getDefault, updateValue;
+
+            type = value[0];
+            localDefault = value[1];
+            validator = value[2] || defaultValidator;
+            converter = converters[type];
+
+            getDefault = function() {
+              var globalValue = globalDefaults[directive] && globalDefaults[directive][key];
+              return angular.isDefined(globalValue) ? globalValue : localDefault;
+            };
+
+            updateValue = function(value) {
+              scope.options[key] = value && validator(value) ? converter(value) : getDefault();
+            };
+
+            if (interpolationStatus[directive] && interpolationStatus[directive][key]) {
+              attrs.$observe(key, function(value) {
+                updateValue(value);
+                scope.events.trigger('option-change', { name: key, newValue: value });
+              });
+            }
+            else {
+              updateValue(attrs[key] && $interpolate(attrs[key])(scope.$parent));
+            }
+          });
+        },
+        getTextAutosizeThreshold: function() {
+          return autosizeThreshold;
+        }
+      };
+    }];
+  });
+
+
+  /***
+   * @ngdoc factory
+   * @name tiUtil
+   * @module ngTagsInput
+   *
+   * @description
+   * Helper methods used internally by the directive. Should not be called directly from user code.
+   */
+  tagsInput.factory('tiUtil', ["$timeout", function($timeout) {
+    var self = {};
+
+    self.debounce = function(fn, delay) {
+      var timeoutId;
+      return function() {
+        var args = arguments;
+        $timeout.cancel(timeoutId);
+        timeoutId = $timeout(function() { fn.apply(null, args); }, delay);
+      };
+    };
+
+    self.makeObjectArray = function(array, key) {
+      array = array || [];
+      if (array.length > 0 && !angular.isObject(array[0])) {
+        array.forEach(function(item, index) {
+          array[index] = {};
+          array[index][key] = item;
+        });
+      }
+      return array;
+    };
+
+    self.findInObjectArray = function(array, obj, key, comparer) {
+      var item = null;
+      comparer = comparer || self.defaultComparer;
+
+      array.some(function(element) {
+        if (comparer(element[key], obj[key])) {
+          item = element;
+          return true;
+        }
+      });
+
+      return item;
+    };
+
+    self.defaultComparer = function(a, b) {
+      // I'm aware of the internationalization issues regarding toLowerCase()
+      // but I couldn't come up with a better solution right now
+      return self.safeToString(a).toLowerCase() === self.safeToString(b).toLowerCase();
+    };
+
+    self.safeHighlight = function(str, value) {
+      if (!value) {
+        return str;
+      }
+
+      function escapeRegexChars(str) {
+        return str.replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1');
+      }
+
+      str = self.encodeHTML(str);
+      value = self.encodeHTML(value);
+
+      var expression = new RegExp('&[^;]+;|' + escapeRegexChars(value), 'gi');
+      return str.replace(expression, function(match) {
+        return match.toLowerCase() === value.toLowerCase() ? '<em>' + match + '</em>' : match;
+      });
+    };
+
+    self.safeToString = function(value) {
+      return angular.isUndefined(value) || value == null ? '' : value.toString().trim();
+    };
+
+    self.encodeHTML = function(value) {
+      return self.safeToString(value)
+          .replace(/&/g, '&amp;')
+          .replace(/</g, '&lt;')
+          .replace(/>/g, '&gt;');
+    };
+
+    self.handleUndefinedResult = function(fn, valueIfUndefined) {
+      return function() {
+        var result = fn.apply(null, arguments);
+        return angular.isUndefined(result) ? valueIfUndefined : result;
+      };
+    };
+
+    self.replaceSpacesWithDashes = function(str) {
+      return self.safeToString(str).replace(/\s/g, '-');
+    };
+
+    self.simplePubSub = function() {
+      var events = {};
+      return {
+        on: function(names, handler) {
+          names.split(' ').forEach(function(name) {
+            if (!events[name]) {
+              events[name] = [];
+            }
+            events[name].push(handler);
+          });
+          return this;
+        },
+        trigger: function(name, args) {
+          var handlers = events[name] || [];
+          handlers.every(function(handler) {
+            return self.handleUndefinedResult(handler, true)(args);
+          });
+          return this;
+        }
+      };
+    };
+
+    return self;
+  }]);
+
+  /* HTML templates */
+  tagsInput.run(["$templateCache", function($templateCache) {
+    $templateCache.put('ngTagsInput/tags-input.html',
+        "<div class=\"host\" tabindex=\"-1\" ng-click=\"eventHandlers.host.click()\" ti-transclude-append=\"\">" +
+        "<div class=\"tags\" ng-class=\"{focused: hasFocus}\"><ul class=\"tag-list\">" +
+        "<li class=\"tag-item\" ng-repeat=\"tag in tagList.items track by track(tag)\" ng-class=\"{ selected: tag == tagList.selected }\">" +
+        "<ti-tag-item data=\"tag\"></ti-tag-item></li></ul>" +
+        "<input autofocus class=\"input\" autocomplete=\"off\" ng-model=\"newTag.text\" ng-change=\"eventHandlers.input.change(newTag.text)\" ng-keydown=\"eventHandlers.input.keydown($event)\" ng-focus=\"eventHandlers.input.focus($event)\" ng-blur=\"eventHandlers.input.blur($event)\" ng-paste=\"eventHandlers.input.paste($event)\" ng-trim=\"false\" ng-class=\"{'invalid-tag': newTag.invalid}\" ng-disabled=\"disabled\" ti-bind-attrs=\"{type: options.type, placeholder: options.placeholder, tabindex: options.tabindex, spellcheck: options.spellcheck}\" ti-autosize=\"\"></div></div>"
+    );
+
+    $templateCache.put('ngTagsInput/tag-item.html',
+        "<strong ng-bind=\"getDisplayLabel()\"></strong> " +
+        "<span ng-bind=\"$getDisplayText()\"></span> " +
+        "<a class=\"remove-button\" ng-click=\"$removeTag()\" ng-bind=\"$$removeTagSymbol\"></a>"
+    );
+
+    $templateCache.put('ngTagsInput/auto-complete.html',
+        "<div class=\"autocomplete\" ng-if=\"suggestionList.visible\"><ul class=\"suggestion-list\"><li class=\"suggestion-item\" ng-repeat=\"item in suggestionList.items track by track(item)\" ng-class=\"{selected: item == suggestionList.selected}\" ng-click=\"addSuggestionByIndex($index)\" ng-mouseenter=\"suggestionList.select($index)\"><ti-autocomplete-match data=\"item\"></ti-autocomplete-match></li></ul></div>"
+    );
+
+    $templateCache.put('ngTagsInput/auto-complete-match.html',
+        "<span ng-bind-html=\"$highlight($getDisplayText())\"></span>"
+    );
+  }]);
+
+}());
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/directives/server-messages.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/directives/server-messages.js b/falcon-ui/app/js/directives/server-messages.js
index e5aa58a..6bd6ea9 100644
--- a/falcon-ui/app/js/directives/server-messages.js
+++ b/falcon-ui/app/js/directives/server-messages.js
@@ -24,7 +24,12 @@
 		return {
 			replace:false,
 			restrict: 'E',
-			templateUrl: 'html/directives/serverMessagesDv.html'
+			templateUrl: 'html/directives/serverMessagesDv.html',
+      link: function (scope, element) {
+
+        //scope.allMessages
+
+      }
 		};
 	});
 	  

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/directives/tooltip.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/directives/tooltip.js b/falcon-ui/app/js/directives/tooltip.js
new file mode 100644
index 0000000..31bb684
--- /dev/null
+++ b/falcon-ui/app/js/directives/tooltip.js
@@ -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.
+ */
+(function () {
+  'use strict';
+
+  var module = angular.module('tooltip', []);
+
+  module.directive('toogle', function () {
+    return {
+      restrict: 'A',
+      link: function(scope, element, attrs){
+        if (attrs.toggle=="tooltip"){
+          $(element).tooltip();
+        }
+        if (attrs.toggle=="popover"){
+          $(element).popover();
+        }
+      }
+    };
+  });
+
+})();
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/directives/validation-message.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/directives/validation-message.js b/falcon-ui/app/js/directives/validation-message.js
index 5bd575b..7530244 100644
--- a/falcon-ui/app/js/directives/validation-message.js
+++ b/falcon-ui/app/js/directives/validation-message.js
@@ -50,14 +50,11 @@
           element.parent().append(
             '<label ng-show="messageSwitcher.show" class="custom-danger validationMessageGral"></label>'
           );
-          //var t0 = performance.now();
           angular.forEach(element.parent().children(), function () {
             lastOne = lastOne + 1;
           });
           lastOne = lastOne - 1;
           stringLabel = $(element).parent().children()[lastOne];
-          //var t1 = performance.now();
-          //console.log("Call to doSomething took " + (t1 - t0) + " milliseconds.");
         }
 
         function checkNameInList() {
@@ -144,4 +141,109 @@
     };
   }]);
 
+  directivesModule.directive('validationOptionalMessage', [function () {
+    return {
+      replace: false,
+      scope: {
+        validationOptionalMessage: "@",
+        required: "@"
+      },
+      restrict: 'A',
+      link: function (scope, element, attrs) {
+
+        var lastOne = 0,
+          valLength = element[0].value.length,
+          required = attrs.required,
+          stringLabel,
+          valid,
+          invalidPattern,
+          messageObject = angular.fromJson(scope.validationOptionalMessage);
+
+        messageObject.patternInvalid = messageObject.patternInvalid || messageObject.empty;
+
+        function getLabelElement() {
+          lastOne = 0;
+          element.parent().append(
+            '<label ng-show="messageSwitcher.show" class="custom-danger validationMessageGral"></label>'
+          );
+          angular.forEach(element.parent().children(), function () {
+            lastOne = lastOne + 1;
+          });
+          lastOne = lastOne - 1;
+          stringLabel = $(element).parent().children()[lastOne];
+        }
+
+        function prepare() {
+
+          valLength = element[0].value.length;
+          required =  attrs.required;
+          valid = element.hasClass('ng-valid');
+          invalidPattern = element.hasClass('ng-invalid-pattern');
+
+          if (valLength === 0 && required) {
+            element.addClass('empty');
+            angular.element(stringLabel).html(messageObject.empty).addClass('hidden');
+            element.parent().removeClass("showMessage showValidationStyle validationMessageParent");
+
+          } else if (valLength === 0 && !required) {
+            element.addClass('empty');
+            element.parent().removeClass("showMessage showValidationStyle validationMessageParent");
+            angular.element(stringLabel).addClass('hidden');
+
+          } else if (invalidPattern && valLength > 0) {
+            element.removeClass('empty');
+            angular.element(stringLabel).html(messageObject.patternInvalid).removeClass('hidden');
+            element.parent().addClass("showMessage showValidationStyle validationMessageParent");
+
+          } else if (valid && valLength > 0) {
+            element.removeClass('empty');
+            angular.element(stringLabel).addClass('hidden');
+            element.parent().removeClass("showMessage showValidationStyle validationMessageParent");
+
+          } else {
+            console.log("else");
+          }
+        }
+        function addListeners() {
+
+          element.bind('keyup', prepare);
+          element.bind('blur', function () {
+            if (valLength === 0 && required) {
+              element.removeClass('empty');
+              angular.element(stringLabel).html(messageObject.empty).removeClass('hidden');
+              element.parent().addClass("showMessage showValidationStyle validationMessageParent");
+            }
+          });
+        }
+        function normalize() {
+          prepare();
+          setTimeout(function () {
+            if (valLength === 0 && required) {
+              angular.element(stringLabel).removeClass('hidden');
+              element.removeClass('empty');
+            }
+          }, 100);
+        }
+        function init() {
+          getLabelElement();
+          addListeners();
+          prepare();
+        }
+        init();
+
+        scope.$watch(function () {
+          return scope.required;
+        }, normalize);
+
+        scope.$watch(function () {
+          return element[0].value.length;
+        }, function () {
+          if (element[0].value.length === 0) {
+            element.addClass('empty');
+          }
+        });
+      }
+    };
+  }]);
+
 }());
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/lib/bootstrap.notify.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/lib/bootstrap.notify.js b/falcon-ui/app/js/lib/bootstrap.notify.js
new file mode 100644
index 0000000..3a2fc5d
--- /dev/null
+++ b/falcon-ui/app/js/lib/bootstrap.notify.js
@@ -0,0 +1,347 @@
+/*
+ * Project: Bootstrap Notify = v3.0.2
+ * Description: Turns standard Bootstrap alerts into "Growl-like" notifications.
+ * Author: Mouse0270 aka Robert McIntosh
+ * License: MIT License
+ * Website: https://github.com/mouse0270/bootstrap-growl
+ */
+(function (factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module.
+    define(['jquery'], factory);
+  } else if (typeof exports === 'object') {
+    // Node/CommonJS
+    factory(require('jquery'));
+  } else {
+    // Browser globals
+    factory(jQuery);
+  }
+}(function ($) {
+  // Create the defaults once
+  var defaults = {
+    element: 'body',
+    position: null,
+    type: "info",
+    allow_dismiss: true,
+    newest_on_top: false,
+    showProgressbar: false,
+    placement: {
+      from: "top",
+      align: "right"
+    },
+    offset: 20,
+    spacing: 10,
+    z_index: 1031,
+    delay: 5000,
+    timer: 1000,
+    url_target: '_blank',
+    mouse_over: null,
+    animate: {
+      enter: 'animated fadeInDown',
+      exit: 'animated fadeOutUp'
+    },
+    onShow: null,
+    onShown: null,
+    onClose: null,
+    onClosed: null,
+    icon_type: 'class',
+    template: '<div data-notify="container" class="col-xs-11 col-sm-4 alert alert-{0}" role="alert"><button type="button" aria-hidden="true" class="close" data-notify="dismiss">&times;</button><span data-notify="icon"></span> <span data-notify="title">{1}</span> <span data-notify="message">{2}</span><div class="progress" data-notify="progressbar"><div class="progress-bar progress-bar-{0}" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%;"></div></div><a href="{3}" target="{4}" data-notify="url"></a></div>'
+  };
+
+  String.format = function() {
+    var str = arguments[0];
+    for (var i = 1; i < arguments.length; i++) {
+      str = str.replace(RegExp("\\{" + (i - 1) + "\\}", "gm"), arguments[i]);
+    }
+    return str;
+  };
+
+  function Notify ( element, content, options ) {
+    // Setup Content of Notify
+    var content = {
+      content: {
+        message: typeof content == 'object' ? content.message : content,
+        title: content.title ? content.title : '',
+        icon: content.icon ? content.icon : '',
+        url: content.url ? content.url : '#',
+        target: content.target ? content.target : '-'
+      }
+    };
+
+    options = $.extend(true, {}, content, options);
+    this.settings = $.extend(true, {}, defaults, options);
+    this._defaults = defaults;
+    if (this.settings.content.target == "-") {
+      this.settings.content.target = this.settings.url_target;
+    }
+    this.animations = {
+      start: 'webkitAnimationStart oanimationstart MSAnimationStart animationstart',
+      end: 'webkitAnimationEnd oanimationend MSAnimationEnd animationend'
+    }
+
+    if (typeof this.settings.offset == 'number') {
+      this.settings.offset = {
+        x: this.settings.offset,
+        y: this.settings.offset
+      };
+    }
+
+    this.init();
+  };
+
+  $.extend(Notify.prototype, {
+    init: function () {
+      var self = this;
+
+      this.buildNotify();
+      if (this.settings.content.icon) {
+        this.setIcon();
+      }
+      if (this.settings.content.url != "#") {
+        this.styleURL();
+      }
+      this.placement();
+      this.bind();
+
+      this.notify = {
+        $ele: this.$ele,
+        update: function(command, update) {
+          var commands = {};
+          if (typeof command == "string") {
+            commands[command] = update;
+          }else{
+            commands = command;
+          }
+          for (var command in commands) {
+            switch (command) {
+              case "type":
+                this.$ele.removeClass('alert-' + self.settings.type);
+                this.$ele.find('[data-notify="progressbar"] > .progress-bar').removeClass('progress-bar-' + self.settings.type);
+                self.settings.type = commands[command];
+                this.$ele.addClass('alert-' + commands[command]).find('[data-notify="progressbar"] > .progress-bar').addClass('progress-bar-' + commands[command]);
+                break;
+              case "icon":
+                var $icon = this.$ele.find('[data-notify="icon"]');
+                if (self.settings.icon_type.toLowerCase() == 'class') {
+                  $icon.removeClass(self.settings.content.icon).addClass(commands[command]);
+                }else{
+                  if (!$icon.is('img')) {
+                    $icon.find('img');
+                  }
+                  $icon.attr('src', commands[command]);
+                }
+                break;
+              case "progress":
+                var newDelay = self.settings.delay - (self.settings.delay * (commands[command] / 100));
+                this.$ele.data('notify-delay', newDelay);
+                this.$ele.find('[data-notify="progressbar"] > div').attr('aria-valuenow', commands[command]).css('width', commands[command] + '%');
+                break;
+              case "url":
+                this.$ele.find('[data-notify="url"]').attr('href', commands[command]);
+                break;
+              case "target":
+                this.$ele.find('[data-notify="url"]').attr('target', commands[command]);
+                break;
+              default:
+                this.$ele.find('[data-notify="' + command +'"]').html(commands[command]);
+            };
+          }
+          var posX = this.$ele.outerHeight() + parseInt(self.settings.spacing) + parseInt(self.settings.offset.y);
+          self.reposition(posX);
+        },
+        close: function() {
+          self.close();
+        }
+      };
+    },
+    buildNotify: function () {
+      var content = this.settings.content;
+      this.$ele = $(String.format(this.settings.template, this.settings.type, content.title, content.message, content.url, content.target));
+      this.$ele.attr('data-notify-position', this.settings.placement.from + '-' + this.settings.placement.align);
+      if (!this.settings.allow_dismiss) {
+        this.$ele.find('[data-notify="dismiss"]').css('display', 'none');
+      }
+      if ((this.settings.delay <= 0 && !this.settings.showProgressbar) || !this.settings.showProgressbar) {
+        this.$ele.find('[data-notify="progressbar"]').remove();
+      }
+    },
+    setIcon: function() {
+      if (this.settings.icon_type.toLowerCase() == 'class') {
+        this.$ele.find('[data-notify="icon"]').addClass(this.settings.content.icon);
+      }else{
+        if (this.$ele.find('[data-notify="icon"]').is('img')) {
+          this.$ele.find('[data-notify="icon"]').attr('src', this.settings.content.icon);
+        }else{
+          this.$ele.find('[data-notify="icon"]').append('<img src="'+this.settings.content.icon+'" alt="Notify Icon" />');
+        }
+      }
+    },
+    styleURL: function() {
+      this.$ele.find('[data-notify="url"]').css({
+        backgroundImage: 'url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)',
+        height: '100%',
+        left: '0px',
+        position: 'absolute',
+        top: '0px',
+        width: '100%',
+        zIndex: this.settings.z_index + 1
+      });
+      this.$ele.find('[data-notify="dismiss"]').css({
+        position: 'absolute',
+        right: '10px',
+        top: '5px',
+        zIndex: this.settings.z_index + 2
+      });
+    },
+    placement: function() {
+      var self = this,
+          offsetAmt = this.settings.offset.y,
+          css = {
+            display: 'inline-block',
+            margin: '0px auto',
+            position: this.settings.position ?  this.settings.position : (this.settings.element === 'body' ? 'fixed' : 'absolute'),
+            transition: 'all .5s ease-in-out',
+            zIndex: this.settings.z_index
+          },
+          hasAnimation = false,
+          settings = this.settings;
+
+      $('[data-notify-position="' + this.settings.placement.from + '-' + this.settings.placement.align + '"]:not([data-closing="true"])').each(function() {
+        return offsetAmt = Math.max(offsetAmt, parseInt($(this).css(settings.placement.from)) +  parseInt($(this).outerHeight()) +  parseInt(settings.spacing));
+      });
+      if (this.settings.newest_on_top == true) {
+        offsetAmt = this.settings.offset.y;
+      }
+      css[this.settings.placement.from] = offsetAmt+'px';
+
+      switch (this.settings.placement.align) {
+        case "left":
+        case "right":
+          css[this.settings.placement.align] = this.settings.offset.x+'px';
+          break;
+        case "center":
+          css.left = 0;
+          css.right = 0;
+          break;
+      }
+      this.$ele.css(css).addClass(this.settings.animate.enter);
+
+      $(this.settings.element).append(this.$ele);
+
+      if (this.settings.newest_on_top == true) {
+        offsetAmt = (parseInt(offsetAmt)+parseInt(this.settings.spacing)) + this.$ele.outerHeight();
+        this.reposition(offsetAmt);
+      }
+
+      if ($.isFunction(self.settings.onShow)) {
+        self.settings.onShow.call(this.$ele);
+      }
+
+      this.$ele.one(this.animations.start, function(event) {
+        hasAnimation = true;
+      }).one(this.animations.end, function(event) {
+        if ($.isFunction(self.settings.onShown)) {
+          self.settings.onShown.call(this);
+        }
+      });
+
+      setTimeout(function() {
+        if (!hasAnimation) {
+          if ($.isFunction(self.settings.onShown)) {
+            self.settings.onShown.call(this);
+          }
+        }
+      }, 600);
+    },
+    bind: function() {
+      var self = this;
+
+      this.$ele.find('[data-notify="dismiss"]').on('click', function() {
+        self.close();
+      })
+
+      this.$ele.mouseover(function(e) {
+        $(this).data('data-hover', "true");
+      }).mouseout(function(e) {
+        $(this).data('data-hover', "false");
+      });
+      this.$ele.data('data-hover', "false");
+
+      if (this.settings.delay > 0) {
+        self.$ele.data('notify-delay', self.settings.delay);
+        var timer = setInterval(function() {
+          var delay = parseInt(self.$ele.data('notify-delay')) - self.settings.timer;
+          if ((self.$ele.data('data-hover') === 'false' && self.settings.mouse_over == "pause") || self.settings.mouse_over != "pause") {
+            var percent = ((self.settings.delay - delay) / self.settings.delay) * 100;
+            self.$ele.data('notify-delay', delay);
+            self.$ele.find('[data-notify="progressbar"] > div').attr('aria-valuenow', percent).css('width', percent + '%');
+          }
+          if (delay <= -(self.settings.timer)) {
+            clearInterval(timer);
+            self.close();
+          }
+        }, self.settings.timer);
+      }
+    },
+    close: function() {
+      var self = this,
+          $successors = null,
+          posX = parseInt(this.$ele.css(this.settings.placement.from)),
+          hasAnimation = false;
+
+      this.$ele.data('closing', 'true').addClass(this.settings.animate.exit);
+      self.reposition(posX);
+
+      if ($.isFunction(self.settings.onClose)) {
+        self.settings.onClose.call(this.$ele);
+      }
+
+      this.$ele.one(this.animations.start, function(event) {
+        hasAnimation = true;
+      }).one(this.animations.end, function(event) {
+        $(this).remove();
+        if ($.isFunction(self.settings.onClosed)) {
+          self.settings.onClosed.call(this);
+        }
+      });
+
+      setTimeout(function() {
+        if (!hasAnimation) {
+          self.$ele.remove();
+          if (self.settings.onClosed) {
+            self.settings.onClosed(self.$ele);
+          }
+        }
+      }, 600);
+    },
+    reposition: function(posX) {
+      var self = this,
+          notifies = '[data-notify-position="' + this.settings.placement.from + '-' + this.settings.placement.align + '"]:not([data-closing="true"])',
+          $elements = this.$ele.nextAll(notifies);
+      if (this.settings.newest_on_top == true) {
+        $elements = this.$ele.prevAll(notifies);
+      }
+      $elements.each(function() {
+        $(this).css(self.settings.placement.from, posX);
+        posX = (parseInt(posX)+parseInt(self.settings.spacing)) + $(this).outerHeight();
+      });
+    }
+  });
+
+  $.notify = function ( content, options ) {
+    var plugin = new Notify( this, content, options );
+    return plugin.notify;
+  };
+  $.notifyDefaults = function( options ) {
+    defaults = $.extend(true, {}, defaults, options);
+    return defaults;
+  };
+  $.notifyClose = function( command ) {
+    if (typeof command === "undefined" || command == "all") {
+      $('[data-notify]').find('[data-notify="dismiss"]').trigger('click');
+    }else{
+      $('[data-notify-position="'+command+'"]').find('[data-notify="dismiss"]').trigger('click');
+    }
+  };
+
+}));
\ No newline at end of file


[16/22] falcon git commit: FALCON-1315 Update falcon ui for HiveDR, secure clusters and bug fixes. Contributed by Armando Reyna/Venkat Ranganathan.

Posted by so...@apache.org.
http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/fonts/Cabin-Regular-webfont.woff
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/fonts/Cabin-Regular-webfont.woff b/falcon-ui/app/css/fonts/Cabin-Regular-webfont.woff
new file mode 100644
index 0000000..36c0dcc
Binary files /dev/null and b/falcon-ui/app/css/fonts/Cabin-Regular-webfont.woff differ

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/fonts/Cabin-Regular-webfont.woff2
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/fonts/Cabin-Regular-webfont.woff2 b/falcon-ui/app/css/fonts/Cabin-Regular-webfont.woff2
new file mode 100644
index 0000000..851b509
Binary files /dev/null and b/falcon-ui/app/css/fonts/Cabin-Regular-webfont.woff2 differ

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/fonts/cabin.less
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/fonts/cabin.less b/falcon-ui/app/css/fonts/cabin.less
new file mode 100644
index 0000000..4e090de
--- /dev/null
+++ b/falcon-ui/app/css/fonts/cabin.less
@@ -0,0 +1,53 @@
+/**
+ * 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.
+ */
+
+@font-face {
+  font-family: 'cabin';
+  src: url('@{icon-font-path}Cabin-Regular-webfont.eot');
+  src: url('@{icon-font-path}Cabin-Regular-webfont.eot?#iefix') format('embedded-opentype'),
+  url('@{icon-font-path}Cabin-Regular-webfont.woff2') format('woff2'),
+  url('@{icon-font-path}Cabin-Regular-webfont.woff') format('woff'),
+  url('@{icon-font-path}Cabin-Regular-webfont.ttf') format('truetype'),
+  url('@{icon-font-path}Cabin-Regular-webfont.svg#cabinregular') format('svg');
+  font-weight: normal;
+  font-style: normal;
+}
+
+@font-face {
+  font-family: 'cabin';
+  src: url('@{icon-font-path}Cabin-Bold-webfont.eot');
+  src: url('@{icon-font-path}Cabin-Bold-webfont.eot?#iefix') format('embedded-opentype'),
+  url('@{icon-font-path}Cabin-Bold-webfont.woff2') format('woff2'),
+  url('@{icon-font-path}Cabin-Bold-webfont.woff') format('woff'),
+  url('@{icon-font-path}Cabin-Bold-webfont.ttf') format('truetype'),
+  url('@{icon-font-path}Cabin-Bold-webfont.svg#cabinbold') format('svg');
+  font-weight: bold;
+  font-style: normal;
+}
+
+@font-face {
+  font-family: 'cabin';
+  src: url('@{icon-font-path}Cabin-Italic-webfont.eot');
+  src: url('@{icon-font-path}Cabin-Italic-webfont.eot?#iefix') format('embedded-opentype'),
+  url('@{icon-font-path}Cabin-Italic-webfont.woff2') format('woff2'),
+  url('@{icon-font-path}Cabin-Italic-webfont.woff') format('woff'),
+  url('@{icon-font-path}Cabin-Italic-webfont.ttf') format('truetype'),
+  url('@{icon-font-path}Cabin-Italic-webfont.svg#cabinitalic') format('svg');
+  font-weight: normal;
+  font-style: italic;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/fonts/entypo.less
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/fonts/entypo.less b/falcon-ui/app/css/fonts/entypo.less
index 5f8562d..3b90398 100644
--- a/falcon-ui/app/css/fonts/entypo.less
+++ b/falcon-ui/app/css/fonts/entypo.less
@@ -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.
+ */
+//--------glyphicons------------------------------------//
 
 @font-face {
   font-family: 'EntypoRegular';
@@ -1169,4 +1187,4 @@
 
 .entypo-social.smashing:before {
   content: '\F357';
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/fonts/glyphicons-halflings-regular.eot
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/fonts/glyphicons-halflings-regular.eot b/falcon-ui/app/css/fonts/glyphicons-halflings-regular.eot
index 4a4ca86..b93a495 100644
Binary files a/falcon-ui/app/css/fonts/glyphicons-halflings-regular.eot and b/falcon-ui/app/css/fonts/glyphicons-halflings-regular.eot differ


[04/22] falcon git commit: FALCON-1315 Update falcon ui for HiveDR, secure clusters and bug fixes. Contributed by Armando Reyna/Venkat Ranganathan.

Posted by so...@apache.org.
http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/lib/ng-mask.min.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/lib/ng-mask.min.js b/falcon-ui/app/js/lib/ng-mask.min.js
new file mode 100644
index 0000000..71c1c6d
--- /dev/null
+++ b/falcon-ui/app/js/lib/ng-mask.min.js
@@ -0,0 +1 @@
+!function(){"use strict";angular.module("ngMask",[])}(),function(){"use strict";angular.module("ngMask").directive("mask",["$log","$timeout","MaskService",function(a,b,c){return{restrict:"A",require:"ngModel",compile:function(d,e){function f(a){"number"==typeof a&&(b.cancel(g),g=b(function(){var b=a+1,c=d[0];if(c.setSelectionRange)c.focus(),c.setSelectionRange(a,b);else if(c.createTextRange){var e=c.createTextRange();e.collapse(!0),e.moveEnd("character",b),e.moveStart("character",a),e.select()}}))}if(!e.mask||!e.ngModel)return void a.info("Mask and ng-model attributes are required!");var g,h,i=c.create();return{pre:function(a,b,c){h=i.generateRegex({mask:c.mask,repeat:c.repeat||c.maskRepeat,clean:"true"===(c.clean||c.maskClean),limit:"true"===(c.limit||c.maskLimit||"true"),restrict:c.restrict||c.maskRestrict||"select",validate:"true"===(c.validate||c.maskValidate||"true"),model:c.ngModel,value:c.ngValue})},post:function(b,c,d,e){h.then(function(){function d(b){b=b||"";var c=i.getVie
 wValue(b),d=g.maskWithoutOptionals||"",h=c.withDivisors(!0),j=c.withoutDivisors(!0);try{var k=i.getRegex(h.length-1),l=i.getRegex(d.length-1),m=k.test(h)||l.test(h),n=b.length-h.length===1,o=d.length-h.length>0;if("accept"!==g.restrict)if("select"!==g.restrict||m&&!n)"reject"!==g.restrict||m||(c=i.removeWrongPositions(h),h=c.withDivisors(!0),j=c.withoutDivisors(!0));else{var p=b[b.length-1],q=h[h.length-1];p!==q&&o&&(h+=p);var r=i.getFirstWrongPosition(h);angular.isDefined(r)&&f(r)}g.limit||(h=c.withDivisors(!1),j=c.withoutDivisors(!1)),g.validate&&e.$dirty&&(l.test(h)||e.$isEmpty(e.$modelValue)?e.$setValidity("mask",!0):e.$setValidity("mask",!1)),b!==h&&(e.$setViewValue(angular.copy(h),"input"),e.$render())}catch(s){throw a.error("[mask - parseViewValue]"),s}return g.clean?j:h}var g=i.getOptions();e.$parsers.push(d),c.on("click input paste keyup",function(){d(c.val()),b.$apply()});var h=b.$watch(b.ngModel,function(a){angular.isDefined(a)&&(d(a),h())});g.value&&b.$evalAsync(function
 (){e.$setViewValue(angular.copy(g.value),"input"),e.$render()})})}}}}}])}(),function(){"use strict";angular.module("ngMask").factory("MaskService",["$q","OptionalService","UtilService",function(a,b,c){function d(){function d(a,b){var c;try{var d=t[a],e=C[d],f=h(a);e?c="("+e.source+")":(i(a)||(z.push(a),A[a]=d),c="(\\"+d+")")}catch(g){throw g}return(f||b)&&(c+="?"),new RegExp(c)}function e(a,b){var c,f;try{var g=d(a,b);c=g;var i=h(a),j=g.source;if(i&&u>a+1){var k=e(a+1,!0).elementOptionalRegex();j+=k.source}f=new RegExp(j)}catch(l){throw l}return{elementRegex:function(){return c},elementOptionalRegex:function(){return f}}}function f(c){var d=a.defer();s=c;try{var f=c.mask,g=c.repeat;g&&(f=Array(parseInt(g)+1).join(f)),w=b.getOptionals(f).fromMaskWithoutOptionals(),s.maskWithoutOptionals=t=b.removeOptionals(f),u=t.length;for(var h,i=0;u>i;i++){var l=e(i),m=l.elementRegex(),n=l.elementOptionalRegex(),o=h?h.source+n.source:n.source;o=new RegExp(o),h=h?h.source+m.source:m.source,h=new Re
 gExp(h),B.push(o)}j(),v=k(t).length,d.resolve({options:s,divisors:z,divisorElements:A,optionalIndexes:w,optionalDivisors:x,optionalDivisorsCombinations:y})}catch(p){throw d.reject(p),p}return d.promise}function g(a){var b;try{b=B[a]?B[a].source:""}catch(c){throw c}return new RegExp("^"+b+"$")}function h(a){return c.inArray(a,w)}function i(a){return c.inArray(a,z)}function j(){function a(a,b){return a-b}for(var b=z.sort(a),c=w.sort(a),d=0;d<b.length;d++)for(var e=b[d],f=1;f<=c.length;f++){var g=c[f-1];if(g>=e)break;x[e]=x[e]?x[e].concat(e-f):[e-f],A[e-f]=A[e]}}function k(a){try{if(z.length>0&&a){for(var b=Object.keys(A),d=[],e=b.length-1;e>=0;e--){var f=A[b[e]];f&&d.push(f)}d=c.uniqueArray(d);var g=new RegExp("[\\"+d.join("\\")+"]","g");return a.replace(g,"")}return a}catch(h){throw h}}function l(a,b){function d(a,b){for(var c=b,d=0;d<a.length;d++){var e=a[d];e<c.length&&c.splice(e,0,A[e])}return c}var e=a,f=z.filter(function(a){var d=Object.keys(x).map(function(a){return parseInt(a)
 });return!c.inArray(a,b)&&!c.inArray(a,d)});return angular.isArray(a)&&angular.isArray(b)?(e=d(f,e),e=d(b,e)):e}function m(a){var b=a.split(""),d=!0;if(w.length>0){for(var e=[],f=Object.keys(x),h=0;h<f.length;h++){var i=x[f[h]];e.push(i)}0===y.length&&c.lazyProduct(e,function(){y.push(Array.prototype.slice.call(arguments))});for(var h=y.length-1;h>=0;h--){var j=angular.copy(b);j=l(j,y[h]);var k=j.join(""),m=g(t.length-1);if(m.test(k)){d=!1,b=j;break}}}return d&&(b=l(b,z)),b.join("")}function n(){return s}function o(a){try{var b=k(a),c=m(b);return{withDivisors:function(a){return a?c.substr(0,u):c},withoutDivisors:function(a){return a?b.substr(0,v):b}}}catch(d){throw d}}function p(a,b){var c=[];if(!a)return 0;for(var d=0;d<a.length;d++){var e=g(d),f=a.substr(0,d+1);if(e&&!e.test(f)&&(c.push(d),b))break}return c}function q(a){return p(a,!0)[0]}function r(a){var b=p(a,!1),c=a;for(var d in b){var e=b[d],f=a.split("");f.splice(e,1),c=f.join("")}return o(c)}var s,t,u=0,v=0,w=[],x={},y=[],z
 =[],A={},B=[],C={9:/[0-9]/,8:/[0-8]/,7:/[0-7]/,6:/[0-6]/,5:/[0-5]/,4:/[0-4]/,3:/[0-3]/,2:/[0-2]/,1:/[0-1]/,0:/[0]/,"*":/./,w:/\w/,W:/\W/,d:/\d/,D:/\D/,s:/\s/,S:/\S/,b:/\b/,A:/[A-Z]/,a:/[a-z]/,Z:/[A-ZÇÀÁÂÃÈÉÊẼÌÍÎĨÒÓÔÕÙÚÛŨ]/,z:/[a-zçáàãâéèêẽíìĩîóòôõúùũüû]/,"@":/[a-zA-Z]/,"#":/[a-zA-ZçáàãâéèêẽíìĩîóòôõúùũüûÇÀÁÂÃÈÉÊẼÌÍÎĨÒÓÔÕÙÚÛŨ]/,"%":/[0-9a-zA-ZçáàãâéèêẽíìĩîóòôõúùũüûÇÀÁÂÃÈÉÊẼÌÍÎĨÒÓÔÕÙÚÛŨ]/};return{getViewValue:o,generateRegex:f,getRegex:g,getOptions:n,removeDivisors:k,getFirstWrongPosition:q,removeWrongPositions:r}}return{create:d}}])}(),function(){"use strict";angular.module("ngMask").factory("OptionalService",[function(){function a(a){var c=[];try{for(var d=/\?/g,e=[];null!=(e=d.exec(a));)c.push(e.index-1)}catch(f){throw f}return{fromMask:function(){return c},fromMaskWithoutOptionals:function(){return b(c)}}}function b(a){for(var b=[],c=0;c<a.length;c+
 +)b.push(a[c]-c);return b}function c(a){var b;try{b=a.replace(/\?/g,"")}catch(c){throw c}return b}return{removeOptionals:c,getOptionals:a}}])}(),function(){"use strict";angular.module("ngMask").factory("UtilService",[function(){function a(a,b,c){function d(h){var i=a[h],j=g[h];if(h===f)for(var k=0;j>k;++k)e[h]=i[k],b.apply(c,e);else for(var k=0;j>k;++k)e[h]=i[k],d(h+1);e.pop()}c||(c=this);for(var e=[],f=a.length-1,g=[],h=a.length;h--;)g[h]=a[h].length;d(0)}function b(a,b){var c;try{c=b.indexOf(a)>-1}catch(d){throw d}return c}function c(a){for(var b={},c=[],d=0,e=a.length;e>d;++d)b.hasOwnProperty(a[d])||(c.push(a[d]),b[a[d]]=1);return c}return{lazyProduct:a,inArray:b,uniqueArray:c}}])}();
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/lib/popover.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/lib/popover.js b/falcon-ui/app/js/lib/popover.js
new file mode 100644
index 0000000..e26c870
--- /dev/null
+++ b/falcon-ui/app/js/lib/popover.js
@@ -0,0 +1,463 @@
+(function(window, angular, undefined){
+  'use strict';
+
+  var module = angular.module('nsPopover', []);
+  var $el = angular.element;
+  var isDef = angular.isDefined;
+  var $popovers = [];
+  var globalId = 0;
+
+  module.provider('nsPopover', function () {
+    var defaults = {
+      template: '',
+      theme: 'ns-popover-list-theme',
+      plain: 'false',
+      trigger: 'click',
+      triggerPrevent: true,
+      angularEvent: '',
+      scopeEvent: '',
+      container: 'body',
+      placement: 'bottom|left',
+      timeout: 1.5,
+      hideOnInsideClick: false,
+      hideOnOutsideClick: true,
+      hideOnButtonClick: true,
+      mouseRelative: '',
+      popupDelay: 0
+    };
+
+    this.setDefaults = function(newDefaults) {
+      angular.extend(defaults, newDefaults);
+    };
+
+    this.$get = function () {
+      return {
+        getDefaults: function () {
+          return defaults;
+        }
+      };
+    };
+  });
+
+  module.directive('nsPopover', ['nsPopover','$rootScope','$timeout','$templateCache','$q','$http','$compile','$document','$parse',
+    function(nsPopover, $rootScope, $timeout, $templateCache, $q, $http, $compile, $document, $parse) {
+      return {
+        restrict: 'A',
+        scope: true,
+        link: function(scope, elm, attrs) {
+          var defaults = nsPopover.getDefaults();
+
+          var options = {
+            template: attrs.nsPopoverTemplate || defaults.template,
+            theme: attrs.nsPopoverTheme || defaults.theme,
+            plain: toBoolean(attrs.nsPopoverPlain || defaults.plain),
+            trigger: attrs.nsPopoverTrigger || defaults.trigger,
+            triggerPrevent: attrs.nsPopoverTriggerPrevent || defaults.triggerPrevent,
+            angularEvent: attrs.nsPopoverAngularEvent || defaults.angularEvent,
+            scopeEvent: attrs.nsPopoverScopeEvent || defaults.scopeEvent,
+            container: attrs.nsPopoverContainer || defaults.container,
+            placement: attrs.nsPopoverPlacement || defaults.placement,
+            timeout: attrs.nsPopoverTimeout || defaults.timeout,
+            hideOnInsideClick: toBoolean(attrs.nsPopoverHideOnInsideClick || defaults.hideOnInsideClick),
+            hideOnOutsideClick: toBoolean(attrs.nsPopoverHideOnOutsideClick || defaults.hideOnOutsideClick),
+            hideOnButtonClick: toBoolean(attrs.nsPopoverHideOnButtonClick || defaults.hideOnButtonClick),
+            mouseRelative: attrs.nsPopoverMouseRelative,
+            popupDelay: attrs.nsPopoverPopupDelay || defaults.popupDelay,
+            group: attrs.nsPopoverGroup
+          };
+
+          if (options.mouseRelative) {
+            options.mouseRelativeX = options.mouseRelative.indexOf('x') !== -1;
+            options.mouseRelativeY = options.mouseRelative.indexOf('y') !== -1;
+          }
+
+          var displayer_ = {
+            id_: undefined,
+
+            /**
+             * Set the display property of the popover to 'block' after |delay| milliseconds.
+             *
+             * @param delay {Number}  The time (in seconds) to wait before set the display property.
+             * @param e {Event}  The event which caused the popover to be shown.
+             */
+            display: function(delay, e) {
+              // Disable popover if ns-popover value is false
+              if ($parse(attrs.nsPopover)(scope) === false) {
+                return;
+              }
+
+              $timeout.cancel(displayer_.id_);
+
+              if (!isDef(delay)) {
+                delay = 0;
+              }
+
+              // hide any popovers being displayed
+              if (options.group) {
+                $rootScope.$broadcast('ns:popover:hide', options.group);
+              }
+
+              displayer_.id_ = $timeout(function() {
+                $popover.isOpen = true;
+                $popover.css('display', 'block');
+
+                // position the popover accordingly to the defined placement around the
+                // |elm|.
+                var elmRect = getBoundingClientRect(elm[0]);
+
+                // If the mouse-relative options is specified we need to adjust the
+                // element client rect to the current mouse coordinates.
+                if (options.mouseRelative) {
+                  elmRect = adjustRect(elmRect, options.mouseRelativeX, options.mouseRelativeY, e);
+                }
+
+                move($popover, placement_, align_, elmRect, $triangle);
+
+                if (options.hideOnInsideClick) {
+                  // Hide the popover without delay on the popover click events.
+                  $popover.on('click', insideClickHandler);
+                }
+                if (options.hideOnOutsideClick) {
+                  // Hide the popover without delay on outside click events.
+                  $document.on('click', outsideClickHandler);
+                }
+                if (options.hideOnButtonClick) {
+                  // Hide the popover without delay on the button click events.
+                  elm.on('click', buttonClickHandler);
+                }
+              }, delay*1000);
+            },
+
+            cancel: function() {
+              $timeout.cancel(displayer_.id_);
+            }
+          };
+
+          var hider_ = {
+            id_: undefined,
+
+            /**
+             * Set the display property of the popover to 'none' after |delay| milliseconds.
+             *
+             * @param delay {Number}  The time (in seconds) to wait before set the display property.
+             */
+            hide: function(delay) {
+              $timeout.cancel(hider_.id_);
+
+              // delay the hiding operation for 1.5s by default.
+              if (!isDef(delay)) {
+                delay = 1.5;
+              }
+
+              hider_.id_ = $timeout(function() {
+                $popover.off('click', insideClickHandler);
+                $document.off('click', outsideClickHandler);
+                elm.off('click', buttonClickHandler);
+                $popover.isOpen = false;
+                displayer_.cancel();
+                $popover.css('display', 'none');
+              }, delay*1000);
+            },
+
+            cancel: function() {
+              $timeout.cancel(hider_.id_);
+            }
+          };
+
+          var $container = $document.find(options.container);
+          if (!$container.length) {
+            $container = $document.find('body');
+          }
+
+          var $triangle;
+          var placement_;
+          var align_;
+
+          globalId += 1;
+
+          var $popover = $el('<div id="nspopover-' + globalId +'"></div>');
+          $popovers.push($popover);
+
+          var match = options.placement
+              .match(/^(top|bottom|left|right)$|((top|bottom)\|(center|left|right)+)|((left|right)\|(center|top|bottom)+)/);
+
+          if (!match) {
+            throw new Error('"' + options.placement + '" is not a valid placement or has a invalid combination of placements.');
+          }
+
+          placement_ = match[6] || match[3] || match[1];
+          align_ = match[7] || match[4] || match[2] || 'center';
+
+          $q.when(loadTemplate(options.template, options.plain)).then(function(template) {
+            template = angular.isString(template) ?
+                template :
+                template.data && angular.isString(template.data) ?
+                    template.data :
+                    '';
+
+            $popover.html(template);
+
+            if (options.theme) {
+              $popover.addClass(options.theme);
+            }
+
+            // Add classes that identifies the placement and alignment of the popver
+            // which allows the customization of the popover based on its position.
+            $popover
+                .addClass('ns-popover-' + placement_ + '-placement')
+                .addClass('ns-popover-' + align_ + '-align');
+
+            $compile($popover)(scope);
+
+            scope.$on('$destroy', function() {
+              $popover.remove();
+            });
+
+            scope.hidePopover = function() {
+              hider_.hide(0);
+            };
+
+            scope.$on('ns:popover:hide', function(ev, group) {
+              if (options.group === group) {
+                scope.hidePopover();
+              }
+            });
+
+            $popover
+                .css('position', 'absolute')
+                .css('display', 'none');
+
+            //search for the triangle element - works in ie8+
+            $triangle = $popover[0].querySelectorAll('.triangle');
+            //if the element is found, then convert it to an angular element
+            if($triangle.length){
+              $triangle = $el($triangle);
+            }
+
+            $container.append($popover);
+          });
+
+          if (options.angularEvent) {
+            $rootScope.$on(options.angularEvent, function() {
+              hider_.cancel();
+              displayer_.display(options.popupDelay);
+            });
+          } else if (options.scopeEvent) {
+            scope.$on(options.scopeEvent, function() {
+              hider_.cancel();
+              displayer_.display($popover, options.popupDelay);
+            });
+          } else {
+            elm.on(options.trigger, function(e) {
+              if (false !== options.triggerPrevent) {
+                e.preventDefault();
+              }
+              hider_.cancel();
+              displayer_.display(options.popupDelay, e);
+            });
+          }
+
+          elm
+              .on('mouseout', function() {
+                hider_.hide(options.timeout);
+              })
+              .on('mouseover', function() {
+                hider_.cancel();
+              });
+
+          $popover
+              .on('mouseout', function(e) {
+                hider_.hide(options.timeout);
+              })
+              .on('mouseover', function() {
+                hider_.cancel();
+              });
+
+          /**
+           * Move the popover to the |placement| position of the object located on the |rect|.
+           *
+           * @param popover {Object} The popover object to be moved.
+           * @param placement {String} The relative position to move the popover - top | bottom | left | right.
+           * @param align {String} The way the popover should be aligned - center | left | right.
+           * @param rect {ClientRect} The ClientRect of the object to move the popover around.
+           * @param triangle {Object} The element that contains the popover's triangle. This can be null.
+           */
+          function move(popover, placement, align, rect, triangle) {
+            var popoverRect = getBoundingClientRect(popover[0]);
+            var top, left;
+
+            var positionX = function() {
+              if (align === 'center') {
+                return Math.round(rect.left + rect.width/2 - popoverRect.width/2);
+              } else if(align === 'right') {
+                return rect.right - popoverRect.width;
+              }
+              return rect.left;
+            };
+
+            var positionY = function() {
+              if (align === 'center') {
+                return Math.round(rect.top + rect.height/2 - popoverRect.height/2);
+              } else if(align === 'bottom') {
+                return rect.bottom - popoverRect.height;
+              }
+              return rect.top;
+            };
+
+            if (placement === 'top') {
+              top = rect.top - popoverRect.height;
+              left = positionX();
+            } else if (placement === 'right') {
+              top = positionY();
+              left = rect.right;
+            } else if (placement === 'bottom') {
+              top = rect.bottom;
+              left = positionX();
+            } else if (placement === 'left') {
+              top = positionY();
+              left = rect.left - popoverRect.width;
+            }
+
+            popover
+                .css('top', top.toString() + 'px')
+                .css('left', left.toString() + 'px');
+
+            if (triangle) {
+              if (placement === 'top' || placement === 'bottom') {
+                left = rect.left + rect.width / 2 - left;
+                triangle.css('left', left.toString() + 'px');
+              } else {
+                top = rect.top + rect.height / 2 - top;
+                triangle.css('top', top.toString()  + 'px');
+              }
+            }
+          }
+
+          /**
+           * Adjust a rect accordingly to the given x and y mouse positions.
+           *
+           * @param rect {ClientRect} The rect to be adjusted.
+           */
+          function adjustRect(rect, adjustX, adjustY, ev) {
+            // if pageX or pageY is defined we need to lock the popover to the given
+            // x and y position.
+            // clone the rect, so we can manipulate its properties.
+            var localRect = {
+              bottom: rect.bottom,
+              height: rect.height,
+              left: rect.left,
+              right: rect.right,
+              top: rect.top,
+              width: rect.width
+            };
+
+            if (adjustX) {
+              localRect.left = ev.pageX;
+              localRect.right = ev.pageX;
+              localRect.width = 0;
+            }
+
+            if (adjustY) {
+              localRect.top = ev.pageY;
+              localRect.bottom = ev.pageY;
+              localRect.height = 0;
+            }
+
+            return localRect;
+          }
+
+          function getBoundingClientRect(elm) {
+            var w = window;
+            var doc = document.documentElement || document.body.parentNode || document.body;
+            var x = (isDef(w.pageXOffset)) ? w.pageXOffset : doc.scrollLeft;
+            var y = (isDef(w.pageYOffset)) ? w.pageYOffset : doc.scrollTop;
+            var rect = elm.getBoundingClientRect();
+
+            // ClientRect class is immutable, so we need to return a modified copy
+            // of it when the window has been scrolled.
+            if (x || y) {
+              return {
+                bottom:rect.bottom+y,
+                left:rect.left + x,
+                right:rect.right + x,
+                top:rect.top + y,
+                height:rect.height,
+                width:rect.width
+              };
+            }
+            return rect;
+          }
+
+          function toBoolean(value) {
+            if (value && value.length !== 0) {
+              var v = ("" + value).toLowerCase();
+              value = (v == 'true');
+            } else {
+              value = false;
+            }
+            return value;
+          }
+
+          /**
+           * Load the given template in the cache if it is not already loaded.
+           *
+           * @param template The URI of the template to be loaded.
+           * @returns {String} A promise that the template will be loaded.
+           * @remarks If the template is null or undefined a empty string will be returned.
+           */
+          function loadTemplate(template, plain) {
+            if (!template) {
+              return '';
+            }
+
+            if (angular.isString(template) && plain) {
+              return template;
+            }
+
+            return $templateCache.get(template) || $http.get(template, { cache : true });
+          }
+
+          function insideClickHandler() {
+            if ($popover.isOpen) {
+              hider_.hide(0);
+            }
+          }
+
+          function outsideClickHandler(e) {
+            if ($popover.isOpen && e.target !== elm[0]) {
+              var id = $popover[0].id;
+              if (!isInPopover(e.target)) {
+                hider_.hide(0);
+              }
+            }
+
+            function isInPopover(el) {
+              if (el.id === id) {
+                return true;
+              }
+
+              var parent = angular.element(el).parent()[0];
+
+              if (!parent) {
+                return false;
+              }
+
+              if (parent.id === id) {
+                return true;
+              }
+              else {
+                return isInPopover(parent);
+              }
+            }
+          }
+
+          function buttonClickHandler() {
+            if ($popover.isOpen) {
+              hider_.hide(0);
+            }
+          }
+        }
+      };
+    }
+  ]);
+})(window, window.angular);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/services/common/date-helper.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/services/common/date-helper.js b/falcon-ui/app/js/services/common/date-helper.js
new file mode 100644
index 0000000..b1f4b52
--- /dev/null
+++ b/falcon-ui/app/js/services/common/date-helper.js
@@ -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.
+ */
+(function () {
+  'use strict';
+
+  angular.module('dateHelper', [])
+    .factory('DateHelper', function () {
+
+      var formatDigit = function(digit){
+        if(digit<10){
+          digit = "0"+digit;
+        }
+        return digit;
+      };
+
+      var dateHelper = {};
+
+      dateHelper.importDate = function (date, tz) {
+        if (!tz || tz === 'UTC') {
+          tz = "GMT+00:00";
+        }
+        var rawDate = Date.parse(date);
+        var tzN = parseInt(tz.slice(3));
+        var tzDate = new Date (rawDate + (3600000*tzN));
+
+        return new Date(
+          tzDate.getUTCFullYear(),
+          tzDate.getUTCMonth(),
+          tzDate.getUTCDate(),
+          tzDate.getUTCHours(),
+          tzDate.getUTCMinutes(),
+          0, 0);
+
+      };
+
+      dateHelper.createISO = function (date, time, tz) {
+        var UTC = new Date(
+              Date.UTC(
+                date.getUTCFullYear(),
+                date.getUTCMonth(),
+                date.getUTCDate(),
+                time.getHours(),
+                time.getMinutes(),
+                0, 0
+              )
+            ).toUTCString() + tz.slice(3),
+            UTCRaw = Date.parse(UTC);
+
+        var dateWithSecs = new Date(UTCRaw).toISOString();
+
+        return dateWithSecs.slice(0, -8) + "Z";
+
+      };
+
+      //i.e. 2015-09-10T16:35:21.235Z
+      dateHelper.createISOString = function (date, time) {
+        var result = date.getFullYear() + "-" + formatDigit(date.getMonth()+1) + "-" + formatDigit(date.getDate())
+          + "T" + formatDigit(time.getHours()) + ":" + formatDigit(time.getMinutes()) + "Z";
+        return result;
+      };
+
+      return dateHelper;
+
+    });
+
+})();

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/services/common/falcon-api.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/services/common/falcon-api.js b/falcon-ui/app/js/services/common/falcon-api.js
index cfb1ddc..a0b1bb7 100644
--- a/falcon-ui/app/js/services/common/falcon-api.js
+++ b/falcon-ui/app/js/services/common/falcon-api.js
@@ -17,112 +17,395 @@
  */
 (function () {
   'use strict';
-  
+
   var falconModule = angular.module('app.services.falcon', ['app.services.x2js', 'ngCookies']);
 
-  falconModule.factory('Falcon', ["$http", "X2jsService", function ($http, X2jsService) {
-
-    var Falcon = {},
-        NUMBER_OF_RESULTS = 50; 
-    
-    function buildURI(uri) {
-      var paramSeparator = (uri.indexOf('?') !== -1) ? '&' : '?';
-      uri = uri + paramSeparator + 'user.name=ambari-qa';
-      return uri;
-    }
-    
-    //-------------Server RESPONSE----------------------//
-    Falcon.responses = {
-      display:true,
-      queue:[], 
-      count: {pending: 0, success:0, error:0},
-      multiRequest: {cluster:0, feed:0, process:0},
-      listLoaded: {cluster:false, feed:false, process:false}  
-    };
-    
-    Falcon.logRequest = function () {
-      Falcon.responses.count.pending = Falcon.responses.count.pending + 1;
-      
-    };
-    Falcon.logResponse = function (type, messageObject, entityType, hide) {
-      if(type === 'success') {  
-        if(!hide) {
-          var message = { success: true, status: messageObject.status, message: messageObject.message, requestId: messageObject.requestId};
-          Falcon.responses.queue.push(message);
-          Falcon.responses.count.success = Falcon.responses.count.success +1;  
-        }       
-        Falcon.responses.count.pending = Falcon.responses.count.pending -1; 
-      }
-      if(type === 'error') {
-        
-        if(messageObject.slice(0,6) !== "Cannot") {
-          var errorMessage = X2jsService.xml_str2json(messageObject),
-             message = { success: false, status: errorMessage.result.status, message: errorMessage.result.message, requestId: errorMessage.result.requestId};       
-        }     
-        else {
-          var message = { success: false, status: "No connection", message: messageObject, requestId: "no ID"};      
-        }    
-        Falcon.responses.queue.push(message);
-        Falcon.responses.count.error = Falcon.responses.count.error +1;
-        Falcon.responses.count.pending = Falcon.responses.count.pending -1;    
+  falconModule.factory('Falcon', ["$http", "X2jsService", "$location", '$rootScope', '$cookieStore', '$timeout',
+    function ($http, X2jsService, $location, $rootScope, $cookieStore, $timeout) {
+
+      var Falcon = {},
+        NUMBER_OF_ENTITIES = 10,
+        NUMBER_OF_INSTANCES = 11; // 10 + 1 for next page
+
+      function buildURI(uri) {
+        if ($rootScope.ambariView()) {
+          uri = uri.substring(2);
+          uri = $rootScope.serviceURI + uri;
+        } else {
+          if(!$rootScope.secureMode){
+            uri = add_user(uri);
+          }
+        }
+        console.log(uri);
+        return uri;
       }
-      if(entityType !== false) {
-        entityType = entityType.toLowerCase();
-        Falcon.responses.multiRequest[entityType] = Falcon.responses.multiRequest[entityType] - 1;   
+
+      function add_user(uri) {
+        var userToken = $cookieStore.get('userToken');
+        var paramSeparator = (uri.indexOf('?') !== -1) ? '&' : '?';
+        uri = uri + paramSeparator + 'user.name=' + userToken.user;
+        return uri;
       }
-       
-    };
-    Falcon.removeMessage = function (index) {
-      if(Falcon.responses.queue[index].success) { Falcon.responses.count.success = Falcon.responses.count.success -1; }
-      else { Falcon.responses.count.error = Falcon.responses.count.error -1; }    
-      Falcon.responses.queue.splice(index, 1); 
-    };
-   // serverResponse: null,
-    //    success: null
-    
-    //-------------METHODS-----------------------------//
-    Falcon.getServerVersion = function () {
-      return $http.get(buildURI('../api/admin/version'));
-    };
-    Falcon.getServerStack = function () {
-      return $http.get(buildURI('../api/admin/stack'));
-    };
-    Falcon.postValidateEntity = function (xml, type) {
-      return $http.post(buildURI('../api/entities/validate/' + type), xml, { headers: {'Content-Type': 'text/plain'} });
-    };
-    Falcon.postSubmitEntity = function (xml, type) {
-      return $http.post(buildURI('../api/entities/submit/' + type), xml, { headers: {'Content-Type': 'text/plain'} });
-    };
-    Falcon.postUpdateEntity = function (xml, type, name) {
-      return $http.post(buildURI('../api/entities/update/' + type + '/' + name), xml, { headers: {'Content-Type': 'text/plain'} });
-    };
-
-    Falcon.postScheduleEntity = function (type, name) {
-      return $http.post(buildURI('../api/entities/schedule/' + type + '/' + name));
-    };
-    Falcon.postSuspendEntity = function (type, name) {
-      return $http.post(buildURI('../api/entities/suspend/' + type + '/' + name));
-    };
-    Falcon.postResumeEntity = function (type, name) {
-      return $http.post(buildURI('../api/entities/resume/' + type + '/' + name));
-    };
-
-    Falcon.deleteEntity = function (type, name) {
-      return $http.delete(buildURI('../api/entities/delete/' + type + '/' + name));
-    };
-    
-    Falcon.getEntities = function (type) {
-    return $http.get(buildURI('../api/entities/list/' + type + '?fields=status,tags&numResults=' + NUMBER_OF_RESULTS));
-    };
-
-    Falcon.getEntityDefinition = function (type, name) {
-      return $http.get(buildURI('../api/entities/definition/' + type + '/' + name), { headers: {'Accept': 'text/plain'} });
-    };
-
-
-    //----------------------------------------------//
-    return Falcon;
-
-  }]);
+
+      //response Order
+      Falcon.orderBy = {
+        enable: false,
+        name: "asc"
+      };
+
+      //-------------Server RESPONSE----------------------//
+      Falcon.responses = {
+        display: true,
+        queue: [],
+        count: {pending: 0, success: 0, error: 0},
+        multiRequest: {cluster: 0, feed: 0, process: 0},
+        listLoaded: {cluster: false, feed: false, process: false}
+      };
+
+      Falcon.logRequest = function () {
+        Falcon.responses.count.pending = Falcon.responses.count.pending + 1;
+      };
+
+      Falcon.responses.showAll = false;
+      Falcon.responses.isVisible = false;
+
+      Falcon.hide = function () {
+        Falcon.hideTimeout = $timeout(function () {
+          $(".notifs").fadeOut(300);
+        }, 5000);
+      };
+
+      Falcon.responses.unreaded = 0;
+      Falcon.notify = function (showAll) {
+        $(".notifs").stop();
+        $timeout.cancel(Falcon.hideTimeout);
+
+        if (showAll) {
+          Falcon.responses.unreaded = 0;
+          if (Falcon.responses.isVisible) {
+            Falcon.responses.isVisible = false;
+            $(".notifs").fadeOut(300);
+          } else {
+            Falcon.responses.isVisible = true;
+            $(".notifs").hide();
+            $(".notifs").fadeIn(300);
+          }
+          Falcon.responses.showAll = true;
+        } else {
+          Falcon.responses.unreaded++;
+          Falcon.responses.isVisible = false;
+          $(".notifs").stop();
+          $(".notifs").hide();
+          $(".notifs").fadeIn(300);
+          $(".notifs").fadeOut(300);
+          $(".notifs").fadeIn(300);
+          $(".notifs").fadeOut(300);
+          $(".notifs").fadeIn(300);
+          Falcon.hide();
+          Falcon.responses.showAll = false;
+        }
+      };
+
+      Falcon.hideNotifs = function () {
+        $(".notifs").stop();
+        $timeout.cancel(Falcon.hideTimeout);
+        Falcon.responses.isVisible = false;
+        $(".notifs").fadeOut(300);
+        Falcon.responses.queue.forEach(function(notifMsg) {
+          notifMsg.readed = true;
+        });
+      };
+
+      Falcon.logResponse = function (type, messageObject, entityType, hide) {
+        if (type === 'success') {
+          if (!hide) {
+            var response = {
+              success: true,
+              type: "success",
+              status: messageObject.status,
+              message: messageObject.message,
+              requestId: messageObject.requestId,
+              readed: false
+            };
+            Falcon.responses.queue.push(response);
+            Falcon.responses.count.success = Falcon.responses.count.success + 1;
+            Falcon.notify(false);
+          }
+          Falcon.responses.count.pending = Falcon.responses.count.pending - 1;
+        }
+        if (type === 'cancel') {
+          if (!hide) {
+            var response = {
+              success: true,
+              type: "cancel",
+              status: messageObject.state,
+              state: messageObject.state,
+              message: messageObject.message,
+              model: messageObject.model,
+              readed: false
+            };
+            Falcon.responses.queue.push(response);
+            Falcon.notify(false);
+            return;
+          }
+        }
+        if (type === 'error') {
+          if (messageObject.status !== undefined) {
+            var response = {
+              success: false,
+              type: "error",
+              status: messageObject.status,
+              message: messageObject.message,
+              requestId: messageObject.requestId,
+              readed: false
+            };
+          } else {
+            if (messageObject.slice(0, 6) !== "Cannot") {
+              var errorMessage = X2jsService.xml_str2json(messageObject);
+              var response = {
+                success: false,
+                type: "error",
+                status: errorMessage.result ? errorMessage.result.status : 'error',
+                message: errorMessage.result ? errorMessage.result.message : 'Unexpected Error',
+                requestId: errorMessage.result ? errorMessage.result.requestId : 0,
+                readed: false
+              };
+            }
+            else {
+              var response = {
+                success: false,
+                type: "error",
+                status: "No connection",
+                message: messageObject,
+                requestId: "no ID",
+                readed: false
+              };
+            }
+          }
+          if (hide) {
+            Falcon.responses.count.pending = Falcon.responses.count.pending - 1;
+            return; //>> just takes out the pending request and returns from the func
+          }
+          Falcon.responses.queue.push(response);
+          Falcon.responses.count.error = Falcon.responses.count.error + 1;
+          Falcon.responses.count.pending = Falcon.responses.count.pending - 1;
+          Falcon.notify(false);
+        }
+        if (type === 'warning') {
+          if (!hide) {
+            var response = {
+              success: true,
+              type: "warning",
+              status: messageObject.status,
+              message: messageObject.message,
+              model: '',
+              readed: false
+            };
+            Falcon.responses.queue.push(response);
+            Falcon.notify(false);
+            return;
+          }
+        }
+        if (entityType && entityType !== false) {
+          entityType = entityType.toLowerCase();
+          Falcon.responses.multiRequest[entityType] = Falcon.responses.multiRequest[entityType] - 1;
+        }
+
+      };
+      Falcon.removeMessage = function (index) {
+        if (index === -1) {
+          index = Falcon.responses.queue.length - 1;
+        }
+        if (Falcon.responses.queue[index].success) {
+          Falcon.responses.count.success = Falcon.responses.count.success - 1;
+        }
+        else {
+          Falcon.responses.count.error = Falcon.responses.count.error - 1;
+        }
+        Falcon.responses.queue.splice(index, 1);
+      };
+
+
+      Falcon.errorMessage = function (message) {
+        var response = {
+          type: "error",
+          message: message,
+          readed: false
+        };
+        Falcon.responses.queue.push(response);
+        Falcon.notify(false);
+      };
+      Falcon.warningMessage = function (message) {
+        var response = {
+          type: "warning",
+          message: message,
+          readed: false
+        };
+        Falcon.responses.queue.push(response);
+        Falcon.notify(false);
+      };
+
+      //-------------METHODS-----------------------------//
+
+      Falcon.getServerConfig = function () {
+        return $http.get('../api/admin/version?user.name=falcon');
+      };
+
+      Falcon.getServerStack = function () {
+        return $http.get(buildURI('../api/admin/stack'));
+      };
+
+      Falcon.clearUser = function () {
+        return $http.get('../api/admin/clearuser?user.name=falcon');
+      };
+
+      Falcon.getCurrentUser = function () {
+        return $http.get('../api/admin/getuser');
+      };
+
+      Falcon.postValidateEntity = function (xml, type) {
+        return $http.post(buildURI('../api/entities/validate/' + type), xml, {headers: {'Content-Type': 'text/plain'}});
+      };
+      Falcon.postSubmitEntity = function (xml, type) {
+        return $http.post(buildURI('../api/entities/submit/' + type), xml, {headers: {'Content-Type': 'text/plain'}});
+      };
+      Falcon.postUpdateEntity = function (xml, type, name) {
+        return $http.post(buildURI('../api/entities/update/' + type + '/' + name), xml, {headers: {'Content-Type': 'text/plain'}});
+      };
+
+      Falcon.postScheduleEntity = function (type, name) {
+        return $http.post(buildURI('../api/entities/schedule/' + type + '/' + name));
+      };
+      Falcon.postSuspendEntity = function (type, name) {
+        return $http.post(buildURI('../api/entities/suspend/' + type + '/' + name));
+      };
+      Falcon.postResumeEntity = function (type, name) {
+        return $http.post(buildURI('../api/entities/resume/' + type + '/' + name));
+      };
+
+      Falcon.deleteEntity = function (type, name) {
+        return $http.delete(buildURI('../api/entities/delete/' + type + '/' + name));
+      };
+
+      Falcon.getEntities = function (type) {
+        return $http.get(buildURI('../api/entities/list/' + type + '?fields=status,tags&numResults=' + NUMBER_OF_ENTITIES));
+      };
+
+      Falcon.getEntityDefinition = function (type, name) {
+        return $http.get(buildURI('../api/entities/definition/' + type + '/' + name), {headers: {'Accept': 'text/plain'}});
+      };
+
+      Falcon.searchEntities = function (name, tags, entityType, offset, order) {
+        var searchUrl = "../api/entities/list/";
+        if (entityType !== undefined && entityType !== "") {
+          if (entityType === "mirror") {
+            if (tags === undefined || tags === "") {
+              tags = "_falcon_mirroring_type";
+            } else {
+              tags += ",_falcon_mirroring_type";
+            }
+            searchUrl += "process";
+          } else {
+            searchUrl += entityType;
+          }
+        } else {
+          //searchUrl += "all";
+          //searchUrl += "schedulable";
+          searchUrl += "feed,process";
+        }
+        searchUrl += "?fields=clusters,tags,status";
+        if (name !== undefined && name !== "") {
+          if (name !== "*") {
+            searchUrl += "&nameseq=" + name;
+          }
+        }
+        if (tags !== undefined && tags !== "") {
+          searchUrl += "&tagkeys=" + tags;
+        }
+        if (offset !== undefined && offset !== "") {
+          searchUrl += '&offset=' + offset + '&numResults=' + NUMBER_OF_ENTITIES;
+        }
+        if (Falcon.orderBy.enable) {
+          searchUrl += '&orderBy=name&sortOrder=' + Falcon.orderBy.name;
+        }
+        return $http.get(buildURI(searchUrl));
+      };
+
+      Falcon.searchInstances = function (type, name, offset, start, end, status, orderBy, sortOrder) {
+        //var searchUrl = "../api/instance/running/" + type + "/" + name + "?colo=*";
+        //var searchUrl = "../api/instance/list/" + type + "/" + name + "?colo=*";
+        var searchUrl = "../api/instance/logs/" + type + "/" + name + "?colo=*";
+        if (start !== undefined && start !== "") {
+          searchUrl += "&start=" + start;
+        }
+        if (end !== undefined && end !== "") {
+          searchUrl += "&end=" + end;
+        }
+        if (status !== undefined && status !== "") {
+          searchUrl += "&filterBy=STATUS:" + status;
+        }
+        if (orderBy !== undefined && orderBy !== "") {
+          searchUrl += "&orderBy=" + orderBy;
+        } else {
+          searchUrl += "&orderBy=startTime";
+        }
+        if (sortOrder !== undefined && sortOrder !== "") {
+          searchUrl += "&sortOrder=" + sortOrder;
+        }
+        searchUrl += '&offset=' + offset + '&numResults=' + NUMBER_OF_INSTANCES;
+        return $http.get(buildURI(searchUrl));
+      };
+
+      Falcon.getInstanceLog = function (logUrl) {
+        return $http.get(buildURI(logUrl), {headers: {'Accept': 'text/plain'}});
+      };
+
+      Falcon.postResumeInstance = function (entityType, entityName, start, end) {
+        return $http.post(buildURI('../api/instance/resume/' + entityType + '/' + entityName + '?colo=*&start=' + start + '&end=' + end));
+      };
+
+      Falcon.postSuspendInstance = function (entityType, entityName, start, end) {
+        return $http.post(buildURI('../api/instance/suspend/' + entityType + '/' + entityName + '?colo=*&start=' + start + '&end=' + end));
+      };
+
+      Falcon.postKillInstance = function (entityType, entityName, start, end) {
+        return $http.post(buildURI('../api/instance/kill/' + entityType + '/' + entityName + '?colo=*&start=' + start + '&end=' + end));
+      };
+
+      Falcon.postReRunInstance = function (entityType, entityName, start, end) {
+        return $http.post(buildURI('../api/instance/rerun/' + entityType + '/' + entityName + '?colo=*&start=' + start + '&end=' + end));
+      };
+
+      Falcon.getEntityDependencies = function (type, name) {
+        return $http.get(buildURI('../api/entities/dependencies/' + type + '/' + name));
+      };
+
+      Falcon.getInstanceVertices = function (value) {
+        return $http.get(buildURI('../api/metadata/lineage/vertices?key=name&value=' + value));
+      };
+
+      Falcon.getInstanceVerticesDirection = function (id, direction) {
+        return $http.get(buildURI('../api/metadata/lineage/vertices/' + id + '/' + direction));
+      };
+
+      Falcon.getInstanceVerticesProps = function (id) {
+        return $http.get(buildURI('../api/metadata/lineage/vertices/properties/' + id + '?relationships=true'));
+      };
+
+      //----------------------------------------------//
+      Falcon.getInstancesSummary = function (type, mode, from, to) {
+        return $http.get(buildURI('../api/instance/summary/' + type + '/' + mode + '?start=' + from + '&end=' + to));
+      };
+      Falcon.getTopEntities = function (entityType, from, to) {
+        return $http.get(buildURI('../api/entities/top/' + entityType + '?start=' + from + '&end=' + to));
+      };
+      //----------------------------------------------//
+      Falcon.postSubmitRecipe = function (recipe) {
+        return $http.post(buildURI('../api/entities/prepareAndSubmitRecipe'), recipe, {headers: {'Content-Type': 'text/plain'}});
+      };
+
+      return Falcon;
+
+    }]);
 
 })();

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/services/common/server-api.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/services/common/server-api.js b/falcon-ui/app/js/services/common/server-api.js
new file mode 100644
index 0000000..9224179
--- /dev/null
+++ b/falcon-ui/app/js/services/common/server-api.js
@@ -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.
+ */
+(function () {
+  'use strict';
+
+  var app = angular.module('app.services.server', ['app.services']);
+
+  app.factory('ServerAPI', [
+    "Falcon", "$q",
+    function (Falcon, $q) {
+
+      var ServerAPI = {};
+
+      ServerAPI.getServerConfig = function(){
+        var deffered = $q.defer();
+        Falcon.logRequest();
+        Falcon.getServerConfig().success(function (data) {
+          Falcon.logResponse('success', data, false, true);
+          ServerAPI.data = data;
+          deffered.resolve();
+        }).error(function (err) {
+          Falcon.logResponse('error', err);
+          deffered.resolve();
+        });
+        return deffered.promise;
+      };
+
+      ServerAPI.setOptions = function(username){
+        var deffered = $q.defer();
+        Falcon.logRequest();
+        Falcon.setOptions(username).success(function (data) {
+          Falcon.logResponse('success', data, false, true);
+          deffered.resolve();
+        }).error(function (err) {
+          Falcon.logResponse('error', err);
+          deffered.resolve();
+        });
+        return deffered.promise;
+      };
+
+      ServerAPI.clearUser = function(){
+        var deffered = $q.defer();
+        Falcon.logRequest();
+        Falcon.clearUser().success(function (data) {
+          Falcon.logResponse('success', data, false, true);
+          ServerAPI.setted = data;
+          deffered.resolve();
+        }).error(function (err) {
+          Falcon.logResponse('error', err);
+          deffered.resolve();
+        });
+        return deffered.promise;
+      };
+
+      ServerAPI.getCurrentUser = function(){
+        var deffered = $q.defer();
+        Falcon.logRequest();
+        Falcon.getCurrentUser().success(function (data) {
+          Falcon.logResponse('success', data, false, true);
+          ServerAPI.user = data;
+          deffered.resolve();
+        }).error(function (err) {
+          Falcon.logResponse('error', err);
+          deffered.resolve();
+        });
+        return deffered.promise;
+      };
+
+      return ServerAPI;
+
+    }]);
+
+}());
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/services/common/validation-service.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/services/common/validation-service.js b/falcon-ui/app/js/services/common/validation-service.js
index 461f073..ff2f4ef 100644
--- a/falcon-ui/app/js/services/common/validation-service.js
+++ b/falcon-ui/app/js/services/common/validation-service.js
@@ -24,7 +24,7 @@
     var checkMessages = {
         name: {
           patternInvalid: "The name has an invalid format.",
-          unavailable: "The name you chose is not available",
+          unavailable: "The name you choosed is not available",
           empty: "You need to specify a name"
         },
         colo: {
@@ -55,29 +55,95 @@
           empty: "You need to provide a provider",
           patternInvalid: "The provider has an invalid format. "
         },
+        acl: {
+          owner: {
+            empty: "You need to provide an owner",
+            patternInvalid: "The Owner has an invalid format. "
+          },
+          group: {
+            empty: "You need to provide a group",
+            patternInvalid: "The Group has an invalid format. "},
+          permission: {
+            empty: "You need to provide a Permission",
+            patternInvalid: "The Permission has an invalid format. "
+          }
+        },
         engine: { empty: "You need to select an engine" },
         cluster: { empty: "You need to select a cluster" },
         feed: { empty: "You need to select a feed" },
-        date: { empty: "You need to select a date" },
-        number: { empty: "You need to provide a number" },
+        date: {
+          empty: "You need to select a date",
+          startAfterEnd: "Start date must be before end date.",
+          patternInvalid: "The start Date has an invalid format. "
+        },
+        number: {
+          empty: "You need to provide a number",
+          patternInvalid: "The number needs to be one or two digits "
+        },
         option: { empty: "You need to select an option" },
-        user: { empty: "Please enter your user name." },
-        password: { empty: "Please enter your password." },
-        engineName: { patternInvalid: "The name has an invalid format." }
+        user: {
+          empty: "Please enter your user name.",
+          patternInvalid: "The User has an invalid format."
+        },
+        password: {
+          empty: "Please enter your password.",
+          patternInvalid: "The Password has an invalid format."
+        },
+        email: {
+          patternInvalid: "The email is invalid."
+        },
+        allocationNumber: {
+          empty: "You need to provide a number",
+          patternInvalid: "The number you provided is invalid "
+        },
+        permission: {
+          empty: "You need to provide a Permission",
+          patternInvalid: "The Permission has an invalid format. "
+        },
+        url: {
+          empty: "You need to provide a URL",
+          patternInvalid: "The URL has an invalid format. "
+        },
+        databases: {
+          empty: "You need to provide the databases",
+          patternInvalid: "The Databases have an invalid format. "
+        },
+        database: {
+          empty: "You need to provide the database",
+          patternInvalid: "The database has an invalid format. "
+        },
+        tables: {
+          empty: "You need to provide the tables",
+          patternInvalid: "The tables have an invalid format. "
+        },
+        s3: {
+          empty: "You need to provide a S3 URL",
+          patternInvalid: "The URL has an invalid format. It needs to start with 's3' and end with '.amazonaws.com'"
+        },
+        azure: {
+          empty: "You need to provide an Azure URL",
+          patternInvalid: "The URL has an invalid format. It needs to end with '.blob.core.windows.net'"
+        }
       },
       checkPatterns = {
-        name: new RegExp("^(([a-zA-Z]([\\-a-zA-Z0-9])*){1,39})$"),
-        id: new RegExp("^(([a-zA-Z]([\\-a-zA-Z0-9])*){1,39})$"),
+        name: new RegExp("^[a-zA-Z0-9-_]{1,60}$"),
+        id: new RegExp("^(([a-zA-Z]([\\-a-zA-Z0-9_])*){1,39})$"),
         password: new RegExp("^(([a-zA-Z]([\\-a-zA-Z0-9])*){1,39})$"),
         freeText: new RegExp("^([\\sa-zA-Z0-9]){1,40}$"),
-        alpha: new RegExp("^([a-zA-Z0-9]){1,100}$"),
-        commaSeparated: new RegExp("/^[a-zA-Z0-9,]{1,80}$"),
-        unixId: new RegExp("^([a-z_][a-z0-9-_\\.\\-]{0,30})$"),
-        unixPermissions: new RegExp("^((([0-7]){1,4})|(\\*))$"),
+        textarea: new RegExp("^([\\sa-zA-Z0-9,]){1,100}$"),
+        alpha: new RegExp("^([a-zA-Z0-9-_]){1,100}$"),
+        commaSeparated: new RegExp("^[a-zA-Z0-9,]{1,80}$"),
+        unixId: new RegExp("^([a-zA-Z_][a-zA-Z0-9-_\\.\\-]{0,30})$"),
+        unixPermissions: new RegExp("^((([x0-7]){1,5})|(\\*))$"),
         osPath: new RegExp("^[^\\0 ]+$"),
-        twoDigits: new RegExp("^([0-9]){1,2}$"),
+        twoDigits: new RegExp("^([0-9]){1,4}$"), //>> requirement change to 4 digits, just to dont change all inputs that reference this
         tableUri: new RegExp("^[^\\0]+$"),
-        versionNumbers: new RegExp("^[0-9]{1,2}\\.[0-9]{1,2}\\.[0-9]{1,2}$")
+        versionNumbers: new RegExp("^[0-9]{1,2}\\.[0-9]{1,2}\\.[0-9]{1,2}$"),
+        url: new RegExp("^[^\\0 ]+\\.[a-zA-Z0-9]{1,3}$"),
+        number: new RegExp("^([-0-9]){1,40}$"),
+        email: new RegExp("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,4}$"),
+        s3: new RegExp("^s3[a-zA-Z0-9._%+-:\\/]+\\.amazonaws.com$"),
+        azure: new RegExp("^[a-zA-Z0-9._%+-:@\\/]+\\.blob.core.windows.net$")
       };
 
     function acceptOnlyNumber(evt) {
@@ -85,10 +151,12 @@
         key = theEvent.keyCode || theEvent.which,
         BACKSPACE = 8,
         DEL = 46,
+        ENTER = 13,
         ARROW_KEYS = {left: 37, right: 39},
+        TAB = 9,
         regex = /[0-9]|\./;
 
-      if (key === BACKSPACE || key === DEL || key === ARROW_KEYS.left || key === ARROW_KEYS.right) {
+      if (key === BACKSPACE || key === DEL || key === ARROW_KEYS.left || key === ARROW_KEYS.right || key === TAB || key === ENTER) {
         return true;
       }
 

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/services/entity/entity-factory.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/services/entity/entity-factory.js b/falcon-ui/app/js/services/entity/entity-factory.js
index c64ad98..82848c0 100644
--- a/falcon-ui/app/js/services/entity/entity-factory.js
+++ b/falcon-ui/app/js/services/entity/entity-factory.js
@@ -19,7 +19,17 @@
   'use strict';
   var module = angular.module('app.services.entity.factory', []);
 
-  module.factory('EntityFactory', [function () {
+  var userName;
+
+  module.factory('EntityFactory', ["$cookieStore", function ($cookieStore) {
+
+
+    if($cookieStore.get('userToken') !== null &&$cookieStore.get('userToken') !== undefined ){
+      userName = $cookieStore.get('userToken').user;
+    }else{
+      userName = "";
+    }
+
     return {
       newFeed: function () {
         return new Feed();
@@ -88,32 +98,39 @@
     this.customProperties = [new Entry(null, null)];
     this.storage = new Storage();
     this.clusters = [new Cluster('source', true)];
-    this.timezone = null;
+    this.timezone = "";
   }
 
 
   function ACL() {
-    this.owner = null;
-    this.group = null;
-    this.permission = '*';
+    this.owner = userName;
+    this.group = 'users';
+    this.permission = '0x755';
   }
 
   function Schema() {
-    this.location = null;
-    this.provider = null;
+    this.location = undefined;
+    this.provider = undefined;
   }
 
   function feedProperties() {
     return [
-      new Entry('queueName', 'default'),
+      new Entry('queueName', ''),
       new Entry('jobPriority', ''),
-      new Entry('timeout', new Frequency(1, 'hours')),
-      new Entry('parallel', 3),
-      new Entry('maxMaps', 8),
-      new Entry('mapBandwidthKB', 1024)
+      new Entry('timeout', ''),
+      new Entry('parallel', ''),
+      new Entry('maxMaps', ''),
+      new Entry('mapBandwidthKB', '')
     ];
   }
 
+  /*new Entry('queueName', 'default'),
+    new Entry('jobPriority', ''),
+    new Entry('timeout', new Frequency(1, 'hours')),
+    new Entry('parallel', 3),
+    new Entry('maxMaps', 8),
+    new Entry('mapBandwidthKB', 1024)*/
+
   function feedCustomProperties() {
     return [
       new Entry(null, null)
@@ -139,6 +156,10 @@
     this.fileSystem = new FileSystem();
     this.catalog = new Catalog();
   }
+  function clusterStorage() {
+    this.fileSystem = new clusterFileSystem();
+    this.catalog = new Catalog();
+  }
 
   function Catalog() {
     this.active = false;
@@ -154,6 +175,10 @@
     this.active = true;
     this.locations = [new Location('data','/'), new Location('stats','/'), new Location('meta','/')];
   }
+  function clusterFileSystem() {
+    this.active = false;
+    this.locations = [ new Location('data',''), new Location('stats',''), new Location('meta','') ];
+  }
 
   function Location(type, path) {
     this.type = type;
@@ -163,13 +188,13 @@
 
   function Cluster(type, selected) {
 //    this.name = null;
-	this.name = "";
+	  this.name = "";
     this.type = type;
     this.selected = selected;
     this.retention = new Frequency(null, 'hours');
     this.retention.action = 'delete';
     this.validity = new Validity();
-    this.storage = new Storage();
+    this.storage = new clusterStorage();
   }
 
   function Validity() {
@@ -179,8 +204,8 @@
   }
 
   function DateAndTime() {
-    this.date = "";
-    this.time = currentTime();
+    this.date = new Date();
+    this.time = new Date();
     this.opened = false;
   }
 
@@ -197,7 +222,7 @@
     this.name = null;
     this.tags = [new Entry(null, null)];
     this.workflow = new Workflow();
-    this.timezone = null;
+    this.timezone = "";
     this.frequency = new Frequency(null, 'hours');
     this.parallel = 1;
     this.order = "";
@@ -205,6 +230,7 @@
     this.clusters = [new Cluster('source', true)];
     this.inputs = [];
     this.outputs = [];
+    this.ACL = new ACL();
 
     /*
     this.name = 'P';
@@ -220,8 +246,8 @@
   }
 
   function Workflow() {
-    this.name = null;
-    this.engine = null;
+    this.name = "";
+    this.engine = "";
     this.version = '';
     this.path = '/';
   }
@@ -241,7 +267,7 @@
 
   function Output() {
     this.name = null;
-    this.feed = null;
+    this.feed = "";
     this.outputInstance = null;
   }
 

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/services/entity/entity-model.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/services/entity/entity-model.js b/falcon-ui/app/js/services/entity/entity-model.js
index 3398af2..48fa617 100644
--- a/falcon-ui/app/js/services/entity/entity-model.js
+++ b/falcon-ui/app/js/services/entity/entity-model.js
@@ -17,19 +17,19 @@
  */
 (function () {
   'use strict';
-  var module = angular.module('app.services.entity.model', []);
+  var module = angular.module('app.services.entity.model', ['ngCookies']);
 
-  module.factory('EntityModel', ["X2jsService", function(X2jsService) {
+  module.factory('EntityModel', ["X2jsService", "$cookieStore", function(X2jsService, $cookieStore) {
 
-    var EntityModel = {};
+    var EntityModel = {}, userName;
 
     EntityModel.json = null;
-    EntityModel.detailsPageModel = null;  
+    EntityModel.detailsPageModel = null;
 
     EntityModel.identifyType = function(json) {
-      if(json.feed) { EntityModel.type = "feed"; }
-      else if(json.cluster) { EntityModel.type = "cluster"; }
-      else if(json.process) { EntityModel.type = "process"; }
+      if(json && json.feed) { EntityModel.type = "feed"; }
+      else if(json && json.cluster) { EntityModel.type = "cluster"; }
+      else if(json && json.process) { EntityModel.type = "process"; }
       else { EntityModel.type = 'Type not recognized'; }
     };
 
@@ -38,72 +38,160 @@
       return EntityModel.identifyType(EntityModel.json);
     };
 
-    EntityModel.clusterModel = {
-      cluster:{
-        tags: "",
-        interfaces:{
-          interface:[
-            {
-              _type:"readonly",
-              _endpoint:"hftp://sandbox.hortonworks.com:50070",
-              _version:"2.2.0"       
-            },
-            {
-              _type:"write",
-              _endpoint:"hdfs://sandbox.hortonworks.com:8020",
-              _version:"2.2.0"
-         
-            },
-            {
-              _type:"execute",
-              _endpoint:"sandbox.hortonworks.com:8050",
-              _version:"2.2.0"
-           
-            },
-            {
-              _type:"workflow",
-              _endpoint:"http://sandbox.hortonworks.com:11000/oozie/",
-              _version:"4.0.0"
-           
-            },
-            {
-              _type:"messaging",
-              _endpoint:"tcp://sandbox.hortonworks.com:61616?daemon=true",
-              _version:"5.1.6"
-            
-            }
-          ]
+    if($cookieStore.get('userToken')){
+      userName = $cookieStore.get('userToken').user;
+    } else {
+      userName = "";
+    }
+
+    EntityModel.defaultValues = {
+      cluster: {
+        cluster:{
+          tags: "",
+          interfaces:{
+            interface:[
+              {
+                _type:"readonly",
+                _endpoint:"hftp://sandbox.hortonworks.com:50070",
+                _version:"2.2.0"
+              },
+              {
+                _type:"write",
+                _endpoint:"hdfs://sandbox.hortonworks.com:8020",
+                _version:"2.2.0"
+
+              },
+              {
+                _type:"execute",
+                _endpoint:"sandbox.hortonworks.com:8050",
+                _version:"2.2.0"
+
+              },
+              {
+                _type:"workflow",
+                _endpoint:"http://sandbox.hortonworks.com:11000/oozie/",
+                _version:"4.0.0"
+
+              },
+              {
+                _type:"messaging",
+                _endpoint:"tcp://sandbox.hortonworks.com:61616?daemon=true",
+                _version:"5.1.6"
+
+              }
+            ]
+          },
+          locations:{
+            location:[
+              {_name: "staging", _path: ""},
+              {_name: "temp", _path: ""},
+              {_name: "working", _path: ""},
+              {"_name":"","_path":""} //>> to compare
+            ]
+          },
+          ACL: {
+            _owner: userName,
+            _group: "users",
+            _permission: "0x755"
+          },
+          properties: {
+            property: [
+              { _name: "", _value: ""}
+            ]
+          },
+          _xmlns:"uri:falcon:cluster:0.1",
+          _name: undefined,
+          _description: undefined,
+          _colo: undefined
+        }
+      },
+      MirrorUIModel: {
+        name: undefined,
+        tags: {
+          newTag: { value:"", key:"" },
+          tagsArray: [{ key:"_falcon_mirroring_type", value:"HDFS" }],
+          tagsString: ""
         },
-        locations:{
-          location:[
-            {_name: "staging", _path: ""},
-            {_name: "temp", _path: ""},
-            {_name: "working", _path: ""}
-          ]
+        formType: "HDFS",
+        runOn: "target",
+        source: {
+          location: "HDFS",
+          cluster: "",
+          url: "",
+          path: "",
+          hiveDatabaseType: "databases",
+          hiveDatabases: "",
+          hiveDatabase: "",
+          hiveTables: ""
         },
-        ACL: {
-          _owner: "",
-          _group: "",
-          _permission: ""
+        target: {
+          location: "HDFS",
+          cluster: "",
+          url: "",
+          path: ""
+        },
+        alerts: {
+          alert: { email: "" },
+          alertsArray: []
         },
-        properties: {
-          property: [
-            { _name: "", _value: ""}
-          ]
+        validity: {
+          start: (function () { var d = new Date(); d.setHours(0); d.setMinutes(0); d.setSeconds(0); return d; }()),
+          startTime: new Date(),
+          end: "",
+          endTime: new Date(),
+          tz: "GMT+00:00",
+          startISO: "",
+          endISO: ""
         },
-        _xmlns:"uri:falcon:cluster:0.1",       
-        _name:"",
-        _description:"",
-        _colo:""
+        frequency: {
+          number: 5,
+          unit: 'minutes'
+        },
+        allocation: {
+          hdfs:{
+            maxMaps: "5",
+            maxBandwidth: "100"
+          },
+          hive:{
+            maxMapsDistcp: "1",
+            maxMapsMirror: "5",
+            maxMapsEvents: "-1",
+            maxBandwidth: "100"
+          }
+        },
+        hiveOptions: {
+          source:{
+            stagingPath: "",
+            hiveServerToEndpoint: ""
+          },
+          target:{
+            stagingPath: "",
+            hiveServerToEndpoint: ""
+          }
+        },
+        retry: {
+          policy:"periodic",
+          delay: {
+            unit: "minutes",
+            number: 30
+          },
+          attempts: 3
+        },
+        acl: {
+          owner: userName,
+          group: "users",
+          permissions: "0x755"
+        }
       }
     };
+    EntityModel.clusterModel = {}; //>> gets copied at bottom from defaultValues
 
     EntityModel.feedModel = {
       feed: {
         tags: "",
         groups: "",
         frequency: "",
-        timezone: "",
+        /*timezone: "GMT+00:00",*/
         "late-arrival": {
           "_cut-off": ""
         },
@@ -134,9 +222,9 @@
           }]
         },
         ACL: {
-          _owner: "",
-          _group: "",
-          _permission: ""
+          _owner: userName,
+          _group: "users",
+          _permission: "0x755"
         },
         schema: {
           _location: "/none",
@@ -148,8 +236,229 @@
       }
     };
 
+    EntityModel.datasetModel = {
+      toImportModel: undefined,
+      UIModel: {},
+      HDFS: {
+        process: {
+          tags: "",
+          clusters: {
+            cluster: [{
+              validity: {
+                _start: "2015-03-13T00:00Z",
+                _end: "2016-12-30T00:00Z"
+              },
+              _name: "primaryCluster"
+            }]
+          },
+          parallel: "1",
+          order: "LAST_ONLY",
+          frequency: "minutes(5)",
+          timezone: "UTC",
+          properties: {
+            property: [
+              {
+                _name: "oozie.wf.subworkflow.classpath.inheritance",
+                _value: "true"
+              },
+              {
+                _name: "distcpMaxMaps",
+                _value: "5"
+              },
+              {
+                _name: "distcpMapBandwidth",
+                _value: "100"
+              },
+              {
+                _name: "drSourceDir",
+                _value: "/user/hrt_qa/dr/test/srcCluster/input"
+              },
+              {
+                _name: "drTargetDir",
+                _value: "/user/hrt_qa/dr/test/targetCluster/input"
+              },
+              {
+                _name: "drTargetClusterFS",
+                _value: "hdfs://240.0.0.10:8020"
+              },
+              {
+                _name: "drSourceClusterFS",
+                _value: "hdfs://240.0.0.10:8020"
+              },
+              {
+                _name: "drNotificationReceivers",
+                _value: ""
+              },
+              {
+                _name: "targetCluster",
+                _value: ""
+              },
+              {
+                _name: "sourceCluster",
+                _value: ""
+              }
+            ]
+          },
+          workflow: {
+            _name: "hdfs-dr-workflow",
+            _engine: "oozie",
+            _path: "/apps/data-mirroring/workflows/hdfs-replication-workflow.xml",
+            _lib: ""
+          },
+          retry: {
+            _policy: "periodic",
+            _delay: "minutes(30)",
+            _attempts: "3"
+          },
+          ACL: {
+            _owner: "hrt_qa",
+            _group: "users",
+            _permission: "0x755"
+          },
+          _xmlns: "uri:falcon:process:0.1",
+          _name: "hdfs-replication-adtech"
+        }
+      },
+      HIVE: {
+        process: {
+          tags: "",
+          clusters: {
+            cluster: [{
+              validity: {
+                _start: "2015-03-14T00:00Z",
+                _end: "2016-12-30T00:00Z"
+              },
+              _name: "primaryCluster"
+            }]
+          },
+          parallel: "1",
+          order: "LAST_ONLY",
+          frequency: "minutes(3)",
+          timezone: "UTC",
+          properties: {
+            property: [
+              {
+                _name: "oozie.wf.subworkflow.classpath.inheritance",
+                _value: "true"
+              },
+              {
+                _name: "distcpMaxMaps",
+                _value: "1"
+              },
+              {
+                _name: "distcpMapBandwidth",
+                _value: "100"
+              },
+              {
+                _name: "targetCluster",
+                _value: "backupCluster"
+              },
+              {
+                _name: "sourceCluster",
+                _value: "primaryCluster"
+              },
+              {
+                _name: "targetHiveServer2Uri",
+                _value: "hive2://240.0.0.11:10000"
+              },
+              {
+                _name: "sourceHiveServer2Uri",
+                _value: "hive2://240.0.0.10:10000"
+              },
+              {
+                _name: "sourceStagingPath",
+                _value: "/apps/falcon/primaryCluster/staging"
+              },
+              {
+                _name: "targetStagingPath",
+                _value: "/apps/falcon/backupCluster/staging"
+              },
+              {
+                _name: "targetNN",
+                _value: "hdfs://240.0.0.11:8020"
+              },
+              {
+                _name: "sourceNN",
+                _value: "hdfs://240.0.0.10:8020"
+              },
+              {
+                _name: "sourceServicePrincipal",
+                _value: "hive"
+              },
+              {
+                _name: "targetServicePrincipal",
+                _value: "hive"
+              },
+              {
+                _name: "targetMetastoreUri",
+                _value: "thrift://240.0.0.11:9083"
+              },
+              {
+                _name: "sourceMetastoreUri",
+                _value: "thrift://240.0.0.10:9083"
+              },
+              {
+                _name: "sourceTable",
+                _value: ""
+              },
+              {
+                _name: "sourceDatabase",
+                _value: ""
+              },
+              {
+                _name: "maxEvents",
+                _value: "-1"
+              },
+              {
+                _name: "replicationMaxMaps",
+                _value: "5"
+              },
+              {
+                _name: "clusterForJobRun",
+                _value: "primaryCluster"
+              },
+              {
+                _name: "clusterForJobRunWriteEP",
+                _value: "hdfs://240.0.0.10:8020"
+              },
+              {
+                _name: "drJobName",
+                _value: "hive-disaster-recovery-sowmya-1"
+              },
+              {
+                _name: "drNotificationReceivers",
+                _value: "NA"
+              }
+            ]
+          },
+          workflow: {
+            _name: "falcon-dr-hive-workflow",
+            _engine: "oozie",
+            _path: "/apps/data-mirroring/workflows/hive-disaster-recovery-workflow.xml",
+            _lib: ""
+          },
+          retry: {
+            _policy: "periodic",
+            _delay: "minutes(30)",
+            _attempts: "3"
+          },
+          ACL: {
+            _owner: "hrt_qa",
+            _group: "users",
+            _permission: "0x755"
+          },
+          _xmlns: "uri:falcon:process:0.1",
+          _name: "hive-disaster-recovery-sowmya-1"
+        }
+      }
+
+    };
+
+    angular.copy(EntityModel.defaultValues.cluster, EntityModel.clusterModel);
+    angular.copy(EntityModel.defaultValues.MirrorUIModel, EntityModel.datasetModel.UIModel);
+
     return EntityModel;
 
   }]);
 
-})();
\ No newline at end of file
+})();

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/services/entity/entity-serializer.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/services/entity/entity-serializer.js b/falcon-ui/app/js/services/entity/entity-serializer.js
index b7d723e..284c30f 100644
--- a/falcon-ui/app/js/services/entity/entity-serializer.js
+++ b/falcon-ui/app/js/services/entity/entity-serializer.js
@@ -20,11 +20,31 @@
   var module = angular.module('app.services.entity.serializer',
     ['app.services.json.transformer',
       'app.services',
-      'app.services.entity.factory']);
+      'app.services.entity.factory',
+      'app.services.entity.model']);
 
   module.factory('EntitySerializer',
-    ['EntityFactory', 'JsonTransformerFactory', 'X2jsService',
-    function(EntityFactory, JsonTransformerFactory, X2jsService) {
+    ['EntityFactory', 'JsonTransformerFactory', 'X2jsService', 'DateHelper', 'EntityModel',
+    function(EntityFactory, JsonTransformerFactory, X2jsService, DateHelper, EntityModel) {
+
+      var feedTz, processTz; //>> this is due the weird way feed and process forms are made// only way i found to pass tz
+                             //>> was creating this variables and duplicating import timeanddateostring functions
+
+
+      function timeAndDateToStringFeed(input) {
+        return DateHelper.createISO(input.date, input.time, feedTz);
+      }
+      function importDateFeed (input) {
+        return DateHelper.importDate(input, feedTz);
+      }
+      function timeAndDateToStringProcess(input) {
+        //return DateHelper.createISO(input.date, input.time, processTz);
+        return DateHelper.createISOString(input.date, input.time);
+      }
+      function importDateProcess (input) {
+        return DateHelper.importDate(input, processTz);
+      }
+
 
     return {
       preSerialize: function(feed, type) {
@@ -85,28 +105,7 @@
         return String("00" + n).slice(-2);
       }
 
-      function timeAndDateToString(input) {
-        if(input.date !== "") {
-          var dateComponent =
-          input.date.getFullYear() + '-' +
-          pad(input.date.getMonth()+1) + '-' +
-          pad(input.date.getDate());
-        }
-        else {
-          var dateComponent = "";
-        }
-
-        if(input.time !== "") {
-          var timeComponent =
-          pad(input.time.getHours()) + ':' +
-          pad(input.time.getMinutes());
-        }
-        else {
-          var timeComponent = "00:00";
-        }
 
-        return dateComponent + 'T' + timeComponent + 'Z';
-      }
 
       function emptyElement() {return {};}
 
@@ -128,8 +127,8 @@
         var clusterTransform = transformerFactory
           .transform('name', '_name')
           .transform('type', '_type')
-          .transform('validity.start', 'validity._start', timeAndDateToString)
-          .transform('validity.end', 'validity._end', timeAndDateToString)
+          .transform('validity.start', 'validity._start', (function () { feedTz = feed.timezone; return timeAndDateToStringFeed; }()))
+          .transform('validity.end', 'validity._end', timeAndDateToStringFeed)
           .transform('retention', 'retention._limit', frequencyToString)
           .transform('retention.action', 'retention._action')
           .transform('storage.fileSystem', 'locations.location', function(fileSystem) {
@@ -190,8 +189,8 @@
 
         var clusterTransform = transformerFactory
           .transform('name', '_name')
-          .transform('validity.start', 'validity._start', timeAndDateToString)
-          .transform('validity.end', 'validity._end', timeAndDateToString);
+          .transform('validity.start', 'validity._start', (function () { processTz = process.timezone; return timeAndDateToStringProcess; }()))
+          .transform('validity.end', 'validity._end', timeAndDateToStringProcess);
 
         var inputTransform = transformerFactory
           .transform('name', '_name')
@@ -207,6 +206,9 @@
         var transform = transformerFactory
           .transform('name', 'process._name')
           .transform('tags', 'process.tags', keyValuePairs)
+
+
+
           .transform('clusters', 'process.clusters.cluster', function(clusters) {
             return clusters.map(function(cluster) {
               return clusterTransform.apply(cluster, {});
@@ -238,7 +240,11 @@
           .transform('workflow.path', 'process.workflow._path')
           .transform('retry.policy', 'process.retry._policy')
           .transform('retry.delay', 'process.retry._delay', frequencyToString)
-          .transform('retry.attempts', 'process.retry._attempts');
+          .transform('retry.attempts', 'process.retry._attempts')
+          .transform('ACL', 'process.ACL', emptyElement)
+          .transform('ACL.owner', 'process.ACL._owner')
+          .transform('ACL.group', 'process.ACL._group')
+          .transform('ACL.permission', 'process.ACL._permission');
 
 
         return transform.apply(process, new EntityModel('process'));
@@ -246,16 +252,17 @@
       }
 
       function preDeserializeFeed(feedModel, transformerFactory) {
+
         var feed = EntityFactory.newFeed();
         feed.storage.fileSystem.active = false;
 
         var clusterTransform = transformerFactory
             .transform('_name', 'name')
             .transform('_type', 'type')
-            .transform('validity._start', 'validity.start.date', parseDate)
-            .transform('validity._start', 'validity.start.time', parseTime)
-            .transform('validity._end', 'validity.end.date', parseDate)
-            .transform('validity._end', 'validity.end.time', parseTime)
+            .transform('validity._start', 'validity.start.date', (function () { feedTz = feedModel.feed.timezone; return importDateFeed; }()))
+            .transform('validity._start', 'validity.start.time', importDateFeed)
+            .transform('validity._end', 'validity.end.date', importDateFeed)
+            .transform('validity._end', 'validity.end.time', importDateFeed)
             .transform('retention._limit', 'retention', parseFrequency)
             .transform('retention._action', 'retention.action')
             .transform('locations', 'storage.fileSystem.active', parseBoolean)
@@ -285,21 +292,21 @@
             .transform('table', 'storage.catalog.active', parseBoolean)
             .transform('table._uri', 'storage.catalog.catalogTable.uri')
             .transform('clusters.cluster', 'clusters', parseClusters(clusterTransform))
-            .transform('timezone', 'timezone')
-          ;
+            .transform('timezone', 'timezone');
 
         return transform.apply(angular.copy(feedModel.feed), feed);
       }
 
       function preDeserializeProcess(processModel, transformerFactory) {
+
         var process = EntityFactory.newProcess();
 
         var clusterTransform = transformerFactory
             .transform('_name', 'name')
-            .transform('validity._start', 'validity.start.date', parseDate)
-            .transform('validity._start', 'validity.start.time', parseTime)
-            .transform('validity._end', 'validity.end.date', parseDate)
-            .transform('validity._end', 'validity.end.time', parseTime);
+            .transform('validity._start', 'validity.start.date', (function () { processTz = processModel.process.timezone; return importDateProcess; }()))
+            .transform('validity._start', 'validity.start.time', importDateProcess)
+            .transform('validity._end', 'validity.end.date', importDateProcess)
+            .transform('validity._end', 'validity.end.time', importDateProcess);
 
         var inputTransform = transformerFactory
           .transform('_name', 'name')
@@ -328,7 +335,10 @@
           .transform('retry._delay','retry.delay', parseFrequency)
           .transform('clusters.cluster', 'clusters', parseClusters(clusterTransform))
           .transform('inputs.input', 'inputs', parseInputs(inputTransform))
-          .transform('outputs.output', 'outputs', parseOutputs(outputTransform));
+          .transform('outputs.output', 'outputs', parseOutputs(outputTransform))
+          .transform('ACL._owner','ACL.owner')
+          .transform('ACL._group','ACL.group')
+          .transform('ACL._permission','ACL.permission');
 
 
         function parseClusters(transform) {

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/services/entity/search-entity.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/services/entity/search-entity.js b/falcon-ui/app/js/services/entity/search-entity.js
new file mode 100644
index 0000000..d62541d
--- /dev/null
+++ b/falcon-ui/app/js/services/entity/search-entity.js
@@ -0,0 +1,63 @@
+/**
+ * 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.
+ */
+(function () {
+  'use strict';
+
+  var app = angular.module('app.services.entity', ['app.services']);
+
+  app.factory('EntityFalcon', [
+    "Falcon", "$q",
+    function (Falcon, $q) {
+
+      var EntityFalcon = {};
+
+      EntityFalcon.searchEntities = function(name, tags, entityType, offset){
+        var deffered = $q.defer();
+        Falcon.logRequest();
+        Falcon.searchEntities(name, tags, entityType, offset).success(function (data) {
+          Falcon.logResponse('success', data, false, true);
+          data.totalResults = parseInt(data.totalResults);
+
+          if(!data.entity){
+            data.entity = [];
+          }
+          if (data.entity.name) { //is an object
+            data.entity = [data.entity];
+          }
+          data.entity.forEach(function(entity) {
+            if(entity.tags && typeof entity.tags.tag === 'string'){
+              entity.tags.tag = [entity.tags.tag];
+            }
+            if(entity.clusters && typeof entity.clusters.cluster === 'string'){
+              entity.clusters.cluster = [entity.clusters.cluster];
+            }
+          });
+          EntityFalcon.data = data;
+          deffered.resolve();
+        }).error(function (err) {
+          Falcon.logResponse('error', err);
+          deffered.resolve();
+        });
+        return deffered.promise;
+      };
+
+      return EntityFalcon;
+
+    }]);
+
+}());
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/services/entity/search-instance.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/services/entity/search-instance.js b/falcon-ui/app/js/services/entity/search-instance.js
new file mode 100644
index 0000000..dc56cfc
--- /dev/null
+++ b/falcon-ui/app/js/services/entity/search-instance.js
@@ -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.
+ */
+(function () {
+  'use strict';
+
+  var app = angular.module('app.services.instance', ['app.services']);
+
+  app.factory('InstanceFalcon', [
+    "Falcon", "$q",
+    function (Falcon, $q) {
+
+      var InstanceFalcon = {};
+
+      InstanceFalcon.searchInstances = function(type, name, offset, start, end, status, orderBy, sortOrder){
+        var deffered = $q.defer();
+        Falcon.logRequest();
+        Falcon.searchInstances(type, name, offset, start, end, status, orderBy, sortOrder).success(function (data) {
+          Falcon.logResponse('success', data, false, true);
+          if(data.instances === undefined){
+            data.instances = [];
+          }
+          InstanceFalcon.data = data;
+          deffered.resolve();
+        }).error(function (err) {
+          Falcon.logResponse('error', err);
+          deffered.resolve();
+        });
+        return deffered.promise;
+      };
+
+      return InstanceFalcon;
+
+    }]);
+
+}());
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/services/services.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/services/services.js b/falcon-ui/app/js/services/services.js
index 98235d3..93d0482 100644
--- a/falcon-ui/app/js/services/services.js
+++ b/falcon-ui/app/js/services/services.js
@@ -17,16 +17,32 @@
  */
 (function () {
   'use strict';
-  
-  angular.module('app.services', [
-    'app.services.falcon', 
-    'app.services.fileapi', 
+
+  var services = angular.module('app.services', [
+    'app.services.falcon',
+    'app.services.fileapi',
     'app.services.json.transformer',
     'app.services.x2js',
-    'app.services.validation',   
+    'app.services.validation',
+    'app.services.entity',
     'app.services.entity.serializer',
     'app.services.entity.factory',
-    'app.services.entity.model'
+    'app.services.entity.model',
+    'app.services.instance',
+    'app.services.server'
   ]);
 
-})();
+  services.factory('SpinnersFlag', function () {
+    return {
+      show: false,
+      backShow: false
+    };
+  });
+  services.factory('SpinnersFlag', function () {
+    return {
+      show: false,
+      backShow: false
+    };
+  });
+
+}());


[19/22] falcon git commit: FALCON-1315 Update falcon ui for HiveDR, secure clusters and bug fixes. Contributed by Armando Reyna/Venkat Ranganathan.

Posted by so...@apache.org.
http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/fonts/Cabin-Italic-webfont.svg
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/fonts/Cabin-Italic-webfont.svg b/falcon-ui/app/css/fonts/Cabin-Italic-webfont.svg
new file mode 100644
index 0000000..ab20fdc
--- /dev/null
+++ b/falcon-ui/app/css/fonts/Cabin-Italic-webfont.svg
@@ -0,0 +1,1924 @@
+<?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" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
+<metadata></metadata>
+<defs>
+<font id="cabinitalic" horiz-adv-x="1052" >
+<font-face units-per-em="2048" ascent="1638" descent="-410" />
+<missing-glyph horiz-adv-x="460" />
+<glyph horiz-adv-x="0" />
+<glyph horiz-adv-x="682" />
+<glyph unicode=" "  horiz-adv-x="460" />
+<glyph unicode="&#x09;" horiz-adv-x="460" />
+<glyph unicode="&#xa0;" horiz-adv-x="460" />
+<glyph unicode="!" horiz-adv-x="489" d="M49 0l31 176h178l-31 -176h-178zM145 410l150 1126h229l-248 -1126h-131z" />
+<glyph unicode="&#x22;" horiz-adv-x="765" d="M176 922l72 614h190l-145 -614h-117zM582 922l71 614h189l-146 -614h-114z" />
+<glyph unicode="#" horiz-adv-x="1320" d="M23 -23l239 465h-221l111 187h210l119 235h-229l86 174h237l205 396h158l-207 -396h234l206 396h156l-205 -396h207l-86 -174h-213l-121 -235h236l-113 -187h-223l-240 -465h-157l241 465h-233l-242 -465h-155zM518 629h234l120 235h-231z" />
+<glyph unicode="$" horiz-adv-x="980" d="M45 244l64 223q47 -52 129.5 -85.5t193.5 -33.5q109 0 166 34t57 116q0 42 -27.5 74t-72 53.5t-98.5 41t-107.5 42t-98 51t-72 73.5t-27.5 103q0 42 12 85t42 88.5t74.5 82t115 64t157.5 36.5l12 240h176l-71 -240q90 -6 167.5 -27.5t114.5 -47.5l-53 -197 q-170 98 -293 98q-46 0 -86 -7t-76.5 -21.5t-57.5 -42t-21 -64.5q0 -38 29 -66.5t75 -48t101.5 -37.5t111 -42t101.5 -55t75 -83.5t29 -120.5q0 -24 -2.5 -47t-12.5 -57.5t-26.5 -65t-48.5 -63.5t-74 -58t-107 -44.5t-145 -26.5l-12 -234h-176l71 232q-104 6 -186 28 t-123 50z" />
+<glyph unicode="%" horiz-adv-x="1581" d="M147 963q0 108 30.5 200.5t81.5 153t115.5 94t133.5 33.5q98 0 156.5 -75t58.5 -208q0 -214 -102.5 -346.5t-255.5 -132.5q-101 0 -159.5 74.5t-58.5 206.5zM193 -25l1034 1459h153l-1032 -1459h-155zM268 985q0 -89 32 -143t85 -54q86 0 152.5 103t66.5 248 q0 90 -33 145t-84 55q-82 0 -150.5 -103.5t-68.5 -250.5zM889 258q0 108 31 200.5t82.5 153t116 95t132.5 34.5q101 0 160 -76t59 -210q0 -212 -104 -347t-258 -135q-102 0 -160.5 75.5t-58.5 209.5zM1001 270q0 -94 32 -145t91 -51q98 0 164 105.5t66 262.5q0 93 -34.5 148 t-90.5 55q-87 0 -157.5 -108t-70.5 -267z" />
+<glyph unicode="&#x26;" horiz-adv-x="1146" d="M25 268q0 133 76.5 248t234.5 234q-82 171 -82 301q0 114 62.5 205t159 137.5t204.5 46.5q119 0 177 -57.5t58 -157.5q0 -76 -32.5 -149.5t-89 -136.5t-118 -113t-134.5 -97l252 -399q57 80 122 389h172q-67 -325 -200 -514l133 -205h-199l-57 94q-88 -77 -173.5 -109 t-191.5 -32q-192 0 -283 85t-91 230zM213 297q0 -93 53 -149t164 -56q149 0 262 123l-289 426q-83 -62 -136.5 -154t-53.5 -190zM428 1051q0 -111 53 -220q22 18 63 52.5t59.5 50.5t48 43.5t42.5 46t29 44.5t21.5 52t5.5 56q0 122 -113 122q-84 0 -146.5 -66t-62.5 -181z " />
+<glyph unicode="'" horiz-adv-x="374" d="M176 922l74 614h199l-144 -614h-129z" />
+<glyph unicode="(" horiz-adv-x="528" d="M66 279q0 364 96.5 667.5t310.5 589.5h166q-92 -129 -161 -251t-130 -271.5t-93 -321.5t-32 -358q0 -343 94 -613h-163q-88 219 -88 558z" />
+<glyph unicode=")" horiz-adv-x="528" d="M-100 -279q92 129 161 251.5t129 272t91.5 321t31.5 358.5q0 352 -94 612h166q88 -227 88 -557q0 -363 -97 -667t-310 -591h-166z" />
+<glyph unicode="*" horiz-adv-x="823" d="M193 1307l71 84l234 -177l18 320h113l-97 -320l297 177l41 -86l-315 -129l172 -236l-94 -66l-129 273l-225 -279l-68 66l250 240z" />
+<glyph unicode="+" horiz-adv-x="870" d="M74 487l30 177h265l45 262h155l-45 -262h262l-30 -177h-262l-50 -278h-155l47 278h-262z" />
+<glyph unicode="," horiz-adv-x="440" d="M-20 -197l94 179l-58 18l31 176h199l-33 -176l-195 -223z" />
+<glyph unicode="-" horiz-adv-x="811" d="M98 487l31 177h571l-30 -177h-572z" />
+<glyph unicode="." horiz-adv-x="425" d="M14 0l31 176h186l-30 -176h-187z" />
+<glyph unicode="/" horiz-adv-x="1013" d="M-90 -174l973 1608h204l-972 -1608h-205z" />
+<glyph unicode="0" horiz-adv-x="1366" d="M137 535q0 192 60 366.5t158 296t225.5 193t259.5 71.5q197 0 311.5 -154.5t114.5 -428.5q0 -248 -93.5 -457t-253.5 -330t-350 -121q-209 0 -320.5 149.5t-111.5 414.5zM340 549q0 -402 260 -402q128 0 234.5 90.5t169.5 254t63 366.5q0 216 -70.5 322t-187.5 106 q-83 0 -166 -52.5t-150.5 -145t-110 -234.5t-42.5 -305z" />
+<glyph unicode="1" horiz-adv-x="702" d="M188 0l197 1118q-83 -62 -197 -90l7 182q69 22 159.5 89.5t139.5 134.5h149l-252 -1434h-203z" />
+<glyph unicode="2" horiz-adv-x="1001" d="M6 0q313 389 466 598.5t204 312t51 183.5q0 91 -45 138.5t-133 47.5q-177 0 -330 -190l6 174q17 22 48 50t82.5 64t125 60t150.5 24q80 0 139.5 -27t92 -73.5t48 -100t15.5 -114.5q0 -158 -116 -364.5t-427 -606.5h426l-31 -176h-772z" />
+<glyph unicode="3" horiz-adv-x="1044" d="M-4 80l80 180q132 -113 276 -113q64 0 121 19.5t104 58.5t75 105t28 151q0 50 -10.5 87t-36.5 69t-75.5 48.5t-121.5 16.5h-145l47 156h74q333 0 333 266q0 36 -6.5 62t-24.5 50.5t-55 37t-92 12.5q-150 0 -260 -84l-6 166q37 33 121.5 63.5t195.5 30.5q96 0 164.5 -26 t104.5 -72.5t51.5 -98t15.5 -114.5q0 -95 -45 -179t-168 -177q146 -70 146 -289q0 -100 -32.5 -188t-87.5 -150.5t-127 -107.5t-151.5 -67t-160.5 -22q-115 0 -213 39.5t-119 69.5z" />
+<glyph unicode="4" horiz-adv-x="1075" d="M0 389l778 1045h162l-154 -869h158l-33 -176h-155l-70 -389h-201l70 389h-555zM319 565h267l92 520z" />
+<glyph unicode="5" horiz-adv-x="1040" d="M18 51l78 182q50 -38 118.5 -62t131.5 -24q138 0 247 109.5t109 261.5q0 110 -73.5 159.5t-251.5 49.5h-170l203 707h587l-49 -177h-418l-98 -356q252 -5 365.5 -84t113.5 -258q0 -126 -52.5 -238t-137 -187.5t-190.5 -119t-214 -43.5q-92 0 -189.5 27t-109.5 53z" />
+<glyph unicode="6" horiz-adv-x="1089" d="M102 367q0 136 39 275t102 253.5t142.5 216t161.5 171.5t158.5 110.5t132.5 40.5l116 -78q-150 -79 -223 -131q-246 -179 -354 -494q101 129 270 129q144 0 234 -85.5t90 -250.5q0 -145 -69 -271.5t-194 -204t-276 -77.5q-330 0 -330 396zM297 358q0 -109 53.5 -163 t134.5 -54q82 0 150 53.5t103.5 133.5t35.5 164q0 83 -41 142.5t-133 59.5q-120 0 -211.5 -95.5t-91.5 -240.5z" />
+<glyph unicode="7" horiz-adv-x="962" d="M59 0l697 1257h-557l30 177h840l-805 -1434h-205z" />
+<glyph unicode="8" horiz-adv-x="1161" d="M84 326q0 268 307 444q-106 120 -106 274q0 56 13.5 111t46.5 111t82.5 98.5t129 69t178.5 26.5q94 0 160 -23t101 -65t50 -91.5t15 -113.5q0 -76 -25 -131.5t-77.5 -107.5t-161.5 -135q209 -95 209 -310q0 -69 -22 -140.5t-68 -138t-109 -118.5t-153 -83.5t-193 -31.5 q-101 0 -176.5 30t-118 82t-62.5 112.5t-20 130.5zM287 344q0 -99 51.5 -148t146.5 -49q133 0 224.5 85t91.5 210q0 93 -54.5 157t-146.5 93q-83 -17 -152 -60.5t-115 -119t-46 -168.5zM463 1071q0 -140 151 -209q125 40 188.5 119.5t63.5 163.5q0 141 -168 141 q-111 0 -173 -61t-62 -154z" />
+<glyph unicode="9" horiz-adv-x="1097" d="M156 905q0 149 69.5 276t195.5 204t281 77q75 0 131.5 -20t102 -65.5t69 -127.5t23.5 -198q0 -146 -37.5 -288.5t-98.5 -255t-139 -209.5t-158.5 -161.5t-156.5 -100.5t-135 -36l-127 78q40 21 62.5 33t67.5 38t74.5 46.5t73 53.5t74 64t67.5 74t63 87t51 99.5t41 114.5 q-50 -58 -126.5 -87.5t-158.5 -29.5q-140 0 -224.5 85t-84.5 249zM356 942q0 -83 41 -143t133 -60q120 0 213 96.5t93 239.5q0 105 -54 161t-137 56t-151 -54t-103 -133.5t-35 -162.5z" />
+<glyph unicode=":" horiz-adv-x="425" d="M14 0l31 176h186l-30 -176h-187zM141 725l33 176h184l-30 -176h-187z" />
+<glyph unicode=";" horiz-adv-x="448" d="M-20 -197l94 179l-58 18l31 176h199l-33 -178l-195 -221zM143 725l31 176h207l-31 -176h-207z" />
+<glyph unicode="&#x3c;" horiz-adv-x="802" d="M72 582l471 422h205l-472 -422l322 -422h-205z" />
+<glyph unicode="=" horiz-adv-x="960" d="M90 328l27 155h682l-27 -155h-682zM147 651l27 156h682l-27 -156h-682z" />
+<glyph unicode="&#x3e;" horiz-adv-x="804" d="M51 160l471 422l-321 422h205l321 -422l-471 -422h-205z" />
+<glyph unicode="?" horiz-adv-x="856" d="M184 0l31 176h188l-32 -176h-187zM211 1399q49 59 136 98t181 39q81 0 145 -30t102 -79t57.5 -106t19.5 -117q0 -80 -40.5 -164t-100 -156.5t-120.5 -141t-110 -142t-61 -135.5l-10 -55h-123q6 79 10 92q10 56 36.5 109.5t60.5 98t73.5 89t76.5 89.5t67 91.5t48.5 103.5 t18.5 117q0 98 -51.5 149.5t-128.5 51.5q-79 0 -152 -45t-110 -94z" />
+<glyph unicode="@" horiz-adv-x="1366" d="M51 233q0 181 73.5 349t192 287.5t272 191.5t308.5 72q182 0 281.5 -110t99.5 -300q0 -87 -21.5 -177.5t-62.5 -170.5t-110 -131t-154 -51q-34 0 -50 13.5t-16 55.5q0 54 23 119t78 185.5t90 209.5q-76 109 -205 109q-92 0 -196 -58t-187.5 -147t-139 -204.5 t-55.5 -221.5q0 -75 32.5 -123.5t101.5 -48.5q87 0 192.5 63.5t181.5 173.5q-1 -5 -7 -23.5t-10.5 -40.5t-4.5 -46q0 -50 19.5 -86.5t62.5 -36.5q51 0 130 40t132 91q-119 -177 -302 -286t-372 -109q-178 0 -277.5 108.5t-99.5 302.5zM428 311q0 85 44.5 170.5t108.5 145 t136 96.5t127 37q68 0 76 -45q-36 -107 -114.5 -224t-166.5 -195.5t-147 -78.5q-32 0 -48 26t-16 68z" />
+<glyph unicode="A" horiz-adv-x="1163" d="M-76 0l715 1434h197l208 -1434h-204l-52 387h-473l-186 -387h-205zM410 563h346l-68 598z" />
+<glyph unicode="B" horiz-adv-x="1157" d="M57 0l252 1434h312q117 0 191 -11t132.5 -42.5t84.5 -91t26 -152.5q0 -123 -42.5 -205.5t-127.5 -167.5q91 -46 128.5 -111t37.5 -180q0 -83 -18 -151t-47.5 -116.5t-72.5 -85.5t-89 -59t-100.5 -36.5t-103.5 -19.5t-102 -5h-461zM283 176h196q71 0 121.5 5.5t100 22 t79 46.5t48 81t18.5 122q0 108 -46.5 158.5t-166.5 50.5h-264zM399 838h222q36 0 63.5 3.5t62 18.5t56.5 41t37.5 75.5t15.5 117.5q0 100 -41 133t-162 33h-180z" />
+<glyph unicode="C" horiz-adv-x="1157" d="M94 582q0 186 63.5 351t171 280t252 182t302.5 67q96 0 190 -23.5t158 -60.5l-53 -180q-5 2 -54.5 23t-65.5 26t-56.5 18t-74 17t-71.5 4q-124 0 -229 -58.5t-173.5 -155.5t-106.5 -221.5t-38 -258.5q0 -204 89 -324.5t264 -120.5q30 0 62.5 4t56 9t60.5 16t53.5 16.5 t59.5 21t54 19.5l-13 -180q-77 -36 -177 -59t-193 -23q-245 0 -388 162t-143 449z" />
+<glyph unicode="D" horiz-adv-x="1376" d="M57 0l252 1434h479q246 0 388.5 -153.5t142.5 -438.5q0 -184 -61.5 -342t-167 -267t-249 -171t-304.5 -62h-480zM283 176h284q125 0 228 53t169.5 143.5t103 208.5t36.5 250q0 203 -87 314.5t-259 111.5h-285z" />
+<glyph unicode="E" d="M57 0l252 1434h801l-31 -177h-604l-74 -419h476l-31 -176h-475l-86 -486h620l-31 -176h-817z" />
+<glyph unicode="F" horiz-adv-x="997" d="M57 0l252 1434h791l-31 -177h-596l-74 -419h459l-31 -176h-458l-117 -662h-195z" />
+<glyph unicode="G" horiz-adv-x="1271" d="M96 584q0 186 63 350t169.5 279.5t251.5 182t305 66.5q99 0 203.5 -23t171.5 -59l-50 -170q-182 76 -346 76q-107 0 -198.5 -39.5t-156 -106.5t-110.5 -155.5t-68 -188t-22 -202.5q0 -208 94.5 -327.5t282.5 -119.5q120 0 211 39l64 357h-185l31 176h379l-113 -639 q-84 -45 -218 -77t-241 -32q-236 0 -377 163.5t-141 449.5z" />
+<glyph unicode="H" horiz-adv-x="1409" d="M57 0l252 1434h195l-105 -592h693l104 592h195l-254 -1434h-195l117 657h-690l-117 -657h-195z" />
+<glyph unicode="I" horiz-adv-x="522" d="M57 0l252 1434h195l-252 -1434h-195z" />
+<glyph unicode="J" horiz-adv-x="524" d="M-156 -352l4 114h19q87 0 127 53t63 179l254 1440h195l-264 -1500q-25 -139 -114.5 -212.5t-240.5 -73.5h-43z" />
+<glyph unicode="K" horiz-adv-x="1120" d="M57 0l252 1434h195l-252 -1434h-195zM449 760l587 674h211l-588 -674l336 -760h-211z" />
+<glyph unicode="L" horiz-adv-x="956" d="M57 0l252 1434h195l-221 -1258h573l-33 -176h-766z" />
+<glyph unicode="M" horiz-adv-x="1540" d="M-6 0l428 1434h176l193 -711l442 711h176l-78 -1434h-205l70 1057l-471 -717l-223 717l-303 -1057h-205z" />
+<glyph unicode="N" horiz-adv-x="1337" d="M57 0l252 1434h205l420 -1074l188 1074h197l-254 -1434h-164l-448 1133l-201 -1133h-195z" />
+<glyph unicode="O" horiz-adv-x="1454" d="M94 578q0 186 62.5 351.5t168 281.5t248.5 183.5t299 67.5q245 0 386 -160.5t141 -445.5q0 -186 -63 -352t-168.5 -282t-248 -183.5t-298.5 -67.5q-245 0 -386 161t-141 446zM309 590q0 -96 20 -175t60 -140t107.5 -94.5t156.5 -33.5q119 0 220.5 59t169 156t105.5 222.5 t38 259.5q0 130 -34.5 227t-114 156t-197.5 59q-157 0 -280.5 -100.5t-187 -258t-63.5 -337.5z" />
+<glyph unicode="P" horiz-adv-x="1101" d="M57 0l252 1434h400q69 0 120 -5t100.5 -19t83.5 -39.5t60 -64t38.5 -95.5t12.5 -132q0 -122 -34 -222.5t-88 -164.5t-123.5 -108.5t-137 -63t-131.5 -18.5h-264l-88 -502h-201zM377 676h231q85 0 147.5 31t97.5 85.5t51 117.5t16 137q0 117 -51.5 165t-192.5 48h-195z " />
+<glyph unicode="Q" horiz-adv-x="1452" d="M94 580q0 186 62.5 351t167.5 280.5t247.5 183t298.5 67.5q248 0 388.5 -162t140.5 -440q0 -165 -55.5 -316.5t-176.5 -316.5l95 -100l-129 -121l-103 111q-197 -146 -414 -146q-240 0 -381 162t-141 447zM309 586q0 -202 85 -320.5t261 -118.5q154 0 258 82l-153 172 l129 125l153 -174q37 56 58.5 94.5t46.5 98.5t37 129.5t12 152.5q0 217 -88.5 338t-265.5 121q-121 0 -223.5 -59t-169 -157t-103.5 -223.5t-37 -260.5z" />
+<glyph unicode="R" horiz-adv-x="1157" d="M57 0l252 1434h436q184 0 283.5 -75.5t99.5 -250.5q0 -167 -87.5 -297.5t-225.5 -200.5l191 -610h-207l-181 559h-262l-98 -559h-201zM389 748h246q128 0 207.5 79t79.5 230q0 111 -52 165t-170 54h-217z" />
+<glyph unicode="S" horiz-adv-x="1101" d="M12 63l66 228q58 -60 155 -102t216 -42q91 0 164 25t120 82t47 139q0 37 -8.5 67.5t-29.5 55.5t-41 42.5t-57.5 37t-63.5 31t-74 30.5q-43 17 -59.5 24t-57.5 25.5t-60.5 31t-51.5 34.5t-48.5 43t-35 48.5t-26 60t-7.5 69.5q0 58 18 119t59.5 124.5t102.5 113t156 81 t209 31.5q119 0 227.5 -30t161.5 -68l-56 -207q-73 43 -118.5 66.5t-108.5 43t-121 19.5q-53 0 -106.5 -14t-101 -41.5t-77.5 -74t-30 -105.5q0 -42 15 -73.5t49 -57t71 -43t98 -41.5q154 -60 215 -97q155 -95 173 -254q3 -23 3 -49q0 -56 -12.5 -109.5t-39 -106.5 t-73 -97.5t-108.5 -78.5t-151 -53.5t-197 -19.5q-133 0 -241 26.5t-165 65.5z" />
+<glyph unicode="T" horiz-adv-x="1071" d="M178 1257l31 177h940l-31 -177h-373l-221 -1257h-194l221 1257h-373z" />
+<glyph unicode="U" horiz-adv-x="1368" d="M133 418q0 82 19 190l145 826h195l-130 -732q-24 -137 -24 -233q0 -322 266 -322q84 0 152 31.5t113 82t80.5 125.5t56 149.5t36.5 166.5l129 732h195l-145 -826q-54 -302 -218 -469.5t-430 -167.5q-220 0 -330 116t-110 331z" />
+<glyph unicode="V" horiz-adv-x="1218" d="M154 1434h204l177 -1198l598 1198h204l-735 -1434h-217z" />
+<glyph unicode="W" horiz-adv-x="1820" d="M190 1434h205l60 -1192l522 1163h162l106 -1161l488 1190h202l-630 -1434h-197l-92 1176l-514 -1176h-203z" />
+<glyph unicode="X" horiz-adv-x="1150" d="M-80 0l555 731l-295 703h226l221 -570l430 570h211l-570 -705l326 -729h-211l-250 588l-430 -588h-213z" />
+<glyph unicode="Y" horiz-adv-x="1118" d="M160 1434h205l233 -596l434 596h205l-573 -772l-117 -662h-201l117 662z" />
+<glyph unicode="Z" horiz-adv-x="1024" d="M-84 0l883 1257h-578l31 177h899l-885 -1258h580l-31 -176h-899z" />
+<glyph unicode="[" horiz-adv-x="626" d="M-8 -276l319 1812h473l-24 -139h-303l-271 -1534h303l-24 -139h-473z" />
+<glyph unicode="\" horiz-adv-x="999" d="M217 1434h197l405 -1608h-196z" />
+<glyph unicode="]" horiz-adv-x="634" d="M-139 -276l30 172h304l258 1468h-303l30 172h473l-319 -1812h-473z" />
+<glyph unicode="^" horiz-adv-x="940" d="M248 895l39 217l456 442l301 -442l-36 -217l-303 442z" />
+<glyph unicode="_" horiz-adv-x="1046" d="M-143 -250l30 176h1033l-31 -176h-1032z" />
+<glyph unicode="`" horiz-adv-x="559" d="M346 1352l27 147l309 -194l-14 -84z" />
+<glyph unicode="a" horiz-adv-x="1105" d="M43 401q0 117 40 229.5t108.5 199.5t168 140.5t211.5 53.5q169 0 234 -127l39 107h164l-121 -711q-8 -44 -8 -80q0 -49 21 -67.5t75 -18.5l-51 -147q-36 0 -56.5 1t-49 5t-45.5 13.5t-35 25.5t-29.5 41.5t-18.5 60.5q-60 -70 -144.5 -108.5t-168.5 -38.5q-150 0 -242 119 t-92 302zM236 420q0 -124 50 -200.5t152 -76.5q60 0 116.5 28t103 80t74.5 134t28 182q0 147 -57.5 220t-151.5 73q-88 0 -161 -61.5t-113.5 -162t-40.5 -216.5z" />
+<glyph unicode="b" horiz-adv-x="1064" d="M20 0l271 1536h186l-112 -641q112 129 280 129q83 0 149.5 -34t108 -92.5t63 -134t21.5 -161.5q0 -123 -43 -238.5t-113.5 -199t-164.5 -134t-193 -50.5q-171 0 -248 147l-37 -127h-168zM274 418q0 -142 53 -208.5t144 -66.5q90 0 165.5 62t117 163t41.5 216 q0 124 -51 200t-150 76q-128 0 -224 -122.5t-96 -319.5z" />
+<glyph unicode="c" horiz-adv-x="856" d="M47 408q0 122 36.5 231.5t105.5 196t178.5 137.5t244.5 51q166 0 254 -59l-53 -166q-106 61 -221 61q-170 0 -262 -122.5t-92 -311.5q0 -285 231 -285q115 0 242 62l-6 -148q-117 -75 -275 -75q-100 0 -175.5 33t-120 92.5t-66 135t-21.5 167.5z" />
+<glyph unicode="d" horiz-adv-x="1064" d="M43 403q0 116 40 228t108.5 199t168 140.5t211.5 53.5q169 0 234 -127l113 639h186l-270 -1536h-170l8 127q-129 -147 -295 -147q-149 0 -241.5 119.5t-92.5 303.5zM236 420q0 -124 50 -200.5t152 -76.5q60 0 116.5 28t103 80t74.5 134t28 182q0 147 -57.5 220t-151.5 73 q-88 0 -161 -61.5t-113.5 -162t-40.5 -216.5z" />
+<glyph unicode="e" horiz-adv-x="937" d="M43 414q0 119 40 229t110 194.5t173.5 135.5t223.5 51q143 0 221 -69.5t78 -186.5q0 -48 -13.5 -93.5t-47.5 -91t-85.5 -78.5t-134 -54t-186.5 -21q-103 0 -180 16q0 -88 19.5 -149t56.5 -93.5t81.5 -46.5t102.5 -14q147 0 276 60l-8 -146q-167 -77 -317 -77 q-102 0 -181.5 33.5t-128.5 92.5t-74.5 137t-25.5 171zM262 575q14 -2 34 -7.5t45 -9t65 -3.5q88 0 152 17.5t97.5 47t48.5 60.5t15 65q0 58 -41.5 86.5t-106.5 28.5q-99 0 -178.5 -70t-130.5 -215z" />
+<glyph unicode="f" horiz-adv-x="620" d="M70 0l151 860h-147l45 144h127l45 253q24 133 92.5 206t204.5 73q83 0 155 -27l-51 -155q-48 18 -100 18q-62 0 -85.5 -44t-51.5 -202l-23 -122h232l-27 -144h-229l-152 -860h-186z" />
+<glyph unicode="g" horiz-adv-x="940" d="M-86 -252q0 30 9 63.5t30 71.5t63 73.5t99 59.5q-35 22 -51.5 54t-16.5 57q0 37 32.5 85t96.5 81q-100 105 -100 268q0 88 31.5 171t87.5 148t141.5 104.5t185.5 39.5q127 0 213 -74q97 58 221 58h29l-39 -123h-55q-39 0 -92 -15q39 -79 39 -180q0 -83 -32 -164.5 t-88.5 -147t-141 -106.5t-181.5 -41q-64 0 -119 19q-47 -31 -47 -68q0 -33 49.5 -51t196.5 -49q40 -9 68.5 -16.5t70.5 -21.5t71 -32t57 -43t42.5 -59.5t14.5 -75.5q0 -64 -35.5 -126t-99 -111t-160 -79t-209.5 -30q-82 0 -148.5 16.5t-109 42.5t-71 61t-40.5 69.5t-12 70.5 zM84 -225q0 -63 62 -103.5t173 -40.5q130 0 213.5 53.5t83.5 120.5q0 35 -25 60.5t-68.5 40.5t-87 24.5t-97.5 20.5t-82 20q-69 -24 -120.5 -80.5t-51.5 -115.5zM250 573q0 -96 43.5 -148t122.5 -52q110 0 179 93.5t69 217.5q0 94 -43.5 143.5t-122.5 49.5 q-112 0 -180 -89.5t-68 -214.5z" />
+<glyph unicode="h" horiz-adv-x="1036" d="M20 0l271 1536h188l-114 -641q60 69 124.5 99t145.5 30q150 0 220.5 -88t70.5 -244q0 -41 -17.5 -151t-93.5 -541h-186q75 432 91.5 536t16.5 140q0 98 -38 141t-124 43q-75 0 -132 -31.5t-107 -99.5l-129 -729h-187z" />
+<glyph unicode="i" horiz-adv-x="438" d="M20 0l177 1004h186l-176 -1004h-187zM238 1229l34 205h187l-35 -205h-186z" />
+<glyph unicode="j" horiz-adv-x="438" d="M-174 -496l6 142q80 9 110 46.5t52 157.5l203 1154h186l-215 -1223q-13 -69 -40.5 -119.5t-67.5 -79.5t-80 -44.5t-89 -22.5zM238 1229l36 205h187l-37 -205h-186z" />
+<glyph unicode="k" horiz-adv-x="876" d="M20 0l271 1536h186l-174 -985l399 453h222l-443 -463l271 -541h-220l-235 510l-90 -510h-187z" />
+<glyph unicode="l" horiz-adv-x="479" d="M49 168q0 28 236 1368h186q-87 -494 -129.5 -737t-66.5 -383t-27.5 -167t-3.5 -40q0 -49 24.5 -65.5t89.5 -16.5l-49 -147h-63q-102 0 -149.5 52t-47.5 136z" />
+<glyph unicode="m" horiz-adv-x="1640" d="M20 0l177 1004h147v-107q74 72 138.5 99.5t140.5 27.5q45 0 81.5 -8t73.5 -29t65.5 -62.5t45.5 -101.5q116 201 358 201q291 0 291 -287q0 -38 -19 -158t-100 -579h-186q115 652 115 696q0 84 -38.5 124t-121.5 40q-69 0 -120.5 -26t-81.5 -70.5t-46 -87.5t-25 -94 l-102 -582h-186q110 627 110 684q0 97 -40 136.5t-117 39.5q-158 0 -244 -131l-129 -729h-187z" />
+<glyph unicode="n" horiz-adv-x="1054" d="M20 0l177 1004h157l-6 -107q74 72 146 99.5t153 27.5q299 0 299 -322q0 -79 -112 -702h-187q111 630 111 678q0 94 -41.5 138t-130.5 44q-164 0 -250 -131l-129 -729h-187z" />
+<glyph unicode="o" d="M43 403q0 165 69.5 306.5t197 228t284.5 86.5q124 0 211 -57t127.5 -151.5t40.5 -217.5q0 -122 -41.5 -235t-113 -197.5t-175 -135t-221.5 -50.5q-124 0 -211 56.5t-127.5 150t-40.5 216.5zM233 420q0 -277 216 -277q150 0 241.5 126.5t91.5 314.5q0 276 -215 276 q-150 0 -242 -126t-92 -314z" />
+<glyph unicode="p" horiz-adv-x="1069" d="M-68 -496l265 1500h151l-6 -144q72 83 142 123.5t161 40.5q111 0 189.5 -58t115.5 -152.5t37 -213.5q0 -159 -63 -300.5t-180 -230.5t-261 -89q-178 0 -256 147l-108 -623h-187zM274 422q0 -143 54 -211t145 -68q137 0 229.5 133.5t92.5 311.5q0 124 -50 198t-147 74 q-129 0 -226.5 -121t-97.5 -317z" />
+<glyph unicode="q" horiz-adv-x="1067" d="M43 387q0 164 65.5 309t187 236.5t269.5 91.5q95 0 151.5 -40t100.5 -124l43 144h152l-264 -1500h-187l111 623q-60 -70 -140 -108.5t-149 -38.5q-112 0 -190 54.5t-114 144.5t-36 208zM238 420q0 -126 49 -201.5t149 -75.5q61 0 118 29.5t103 83t73.5 137t27.5 182.5 q0 145 -55.5 215t-147.5 70q-136 0 -226.5 -130.5t-90.5 -309.5z" />
+<glyph unicode="r" horiz-adv-x="628" d="M20 0l177 1004h161l-14 -166q87 104 165 153t159 49h28l-73 -202h-68q-55 0 -120 -40t-97 -89l-125 -709h-193z" />
+<glyph unicode="s" horiz-adv-x="796" d="M-20 68l51 178q38 -38 108.5 -70.5t159.5 -32.5q93 0 140.5 39t47.5 105q0 34 -12 59.5t-37.5 42t-45.5 25.5t-54 20q-31 10 -49.5 16.5t-46.5 19t-45 24t-36.5 30.5t-30.5 40t-18.5 50t-7.5 64q0 61 22 119.5t66 110.5t124 84t184 32q150 0 250 -66l-50 -167 q-77 88 -213 88q-87 0 -141.5 -39.5t-54.5 -112.5q0 -30 9.5 -51t36.5 -38t53.5 -28t82.5 -30q33 -12 56 -22t54.5 -31t51 -46t33.5 -64.5t14 -88.5q0 -41 -8 -82.5t-34.5 -91t-68 -86.5t-116 -62.5t-172.5 -25.5q-194 0 -303 88z" />
+<glyph unicode="t" horiz-adv-x="620" d="M72 860l41 144h131l45 247l188 19l-47 -266h227l-26 -144h-228q-108 -618 -108 -653q0 -53 30 -66.5t124 -13.5h49l-41 -147h-154q-103 0 -152 52.5t-49 133.5q0 36 117 694h-147z" />
+<glyph unicode="u" horiz-adv-x="1011" d="M70 274q0 74 116 730h187q-76 -433 -92.5 -536t-16.5 -136q0 -189 160 -189q133 0 215 115l131 746h186l-176 -1004h-170l6 111q-58 -69 -119 -100t-149 -31q-278 0 -278 294z" />
+<glyph unicode="v" horiz-adv-x="899" d="M72 1004h196l105 -801l383 801h198l-522 -1004h-190z" />
+<glyph unicode="w" horiz-adv-x="1355" d="M100 1004h205l27 -801l321 770h178l52 -770l309 801h205l-449 -1004h-188l-58 741l-321 -741h-186z" />
+<glyph unicode="x" horiz-adv-x="899" d="M-76 0l398 504l-216 500h213l136 -390l264 390h219l-416 -517l246 -487h-213l-156 391l-262 -391h-213z" />
+<glyph unicode="y" horiz-adv-x="940" d="M-27 -496l303 541l-210 959h206l138 -746l381 746h206l-825 -1500h-199z" />
+<glyph unicode="z" horiz-adv-x="880" d="M-59 0l608 860h-438l24 144h768l-608 -861h444l-26 -143h-772z" />
+<glyph unicode="{" horiz-adv-x="573" d="M47 629q84 53 128.5 123t64.5 182q8 49 18.5 152t17.5 143q26 146 130 223t323 84l-27 -141q-46 -2 -80.5 -6t-62.5 -15.5t-47.5 -23t-36.5 -36t-27 -45t-20.5 -61t-17.5 -73.5t-17 -91q-5 -28 -12 -88t-12 -88q-9 -50 -22.5 -83t-51 -74t-102.5 -82q100 -81 100 -174 q0 -47 -17.5 -107.5t-35 -136t-17.5 -160.5q0 -101 45 -141.5t166 -44.5l-24 -141q-185 6 -268 67t-83 178q0 54 42 208.5t42 232.5q0 144 -96 219z" />
+<glyph unicode="|" horiz-adv-x="460" d="M-37 -428l346 1964h170l-346 -1964h-170z" />
+<glyph unicode="}" horiz-adv-x="567" d="M-150 -276l25 141q46 2 80.5 6t63 15.5t48 22.5t36 35.5t26.5 45t21 61.5t17 73t17 91q6 37 15 101t14 92q12 68 45.5 115t128.5 106q-100 81 -100 186q0 31 17.5 88t34.5 137.5t17 167.5q0 101 -45.5 142t-165.5 45l25 141q186 -6 268 -69t82 -179q0 -54 -42 -207 t-42 -231q0 -145 94 -221q-86 -52 -128 -122.5t-62 -180.5q-8 -49 -20 -152.5t-19 -144.5q-26 -147 -131.5 -222.5t-319.5 -82.5z" />
+<glyph unicode="~" horiz-adv-x="888" d="M78 389q22 63 65 106.5t85.5 60.5t84.5 17q45 0 121 -50t107 -50q80 0 139 105l84 -19q-34 -89 -97.5 -140.5t-140.5 -51.5q-34 0 -76.5 26t-81.5 52t-65 26q-87 0 -135 -100z" />
+<glyph unicode="&#xa1;" horiz-adv-x="483" d="M-70 -512l248 1126h129l-147 -1126h-230zM195 848l30 176h181l-33 -176h-178z" />
+<glyph unicode="&#xa2;" horiz-adv-x="901" d="M84 606q0 91 21 178t64 164.5t103.5 139t143 103t178.5 54.5l16 287h142l-84 -287q90 -6 142 -21.5t91 -43.5l-45 -160q-103 67 -223 67q-98 0 -177 -66.5t-121 -171.5t-42 -224q0 -126 54.5 -206.5t154.5 -80.5q122 0 246 65l-11 -159q-105 -57 -254 -66l-12 -241h-143 l73 241q-156 25 -236.5 143t-80.5 285z" />
+<glyph unicode="&#xa3;" horiz-adv-x="958" d="M-33 0q119 138 192 293.5t132 374.5h-172l47 120h153l46 256q12 69 26.5 121t42.5 107.5t65.5 91.5t97.5 59t136 23q214 0 234 -180l-78 -78q-16 70 -42.5 101.5t-94.5 31.5q-43 0 -76.5 -15.5t-56.5 -41.5t-41 -69t-29 -87.5t-23 -108.5l-37 -211h355l-47 -120h-336 q-36 -158 -74.5 -260t-124.5 -261h494l-25 -147h-764z" />
+<glyph unicode="&#xa4;" horiz-adv-x="1193" d="M43 109l176 208q-80 133 -80 301q0 263 221 490l-104 209l80 49l104 -211q136 78 267 78q132 0 239 -80l182 213l62 -49l-178 -211q80 -128 80 -301q0 -131 -53.5 -250t-168.5 -240l107 -206l-80 -50l-106 211q-130 -77 -267 -77q-136 0 -239 77l-181 -211zM328 618 q0 -132 56.5 -215.5t162.5 -83.5q105 0 187.5 70t125.5 180.5t43 237.5q0 132 -56.5 215.5t-162.5 83.5q-105 0 -187.5 -70t-125.5 -180.5t-43 -237.5z" />
+<glyph unicode="&#xa5;" horiz-adv-x="1282" d="M164 299l59 111h281l24 135h-321l59 102h269l-330 787h194l273 -629l493 629h195l-606 -787h297l-62 -102h-266l-23 -135h308l-62 -111h-266l-53 -299h-195l51 299h-319z" />
+<glyph unicode="&#xa6;" horiz-adv-x="460" d="M-33 -430l135 764h162l-135 -764h-162zM154 631l159 905h162l-158 -905h-163z" />
+<glyph unicode="&#xa7;" horiz-adv-x="874" d="M10 -92l45 129q109 -84 226 -84q92 0 153.5 52t61.5 149q0 47 -22.5 80t-58 53t-79 37.5t-87 39t-79 50t-58 78.5t-22.5 118q0 132 63 231t185 140q-70 80 -70 178q0 49 11 98t38 100t68 90t106.5 64t147.5 25q78 0 149 -25t105 -57l-43 -129q-114 88 -223 88 q-84 0 -146.5 -60.5t-62.5 -140.5q0 -42 21.5 -74t56.5 -53.5t76.5 -41t83.5 -44t77 -56t56.5 -82.5t21.5 -118q0 -44 -9.5 -87.5t-33.5 -94.5t-75 -97.5t-124 -78.5q66 -79 66 -176q0 -51 -12 -102t-40 -102t-70 -89.5t-107.5 -63t-145.5 -24.5q-79 0 -150.5 23t-99.5 57z M242 674q0 -142 237 -225q70 24 123 94t53 149q0 39 -15.5 72t-38 54t-54 38.5t-56 25.5t-51.5 15q-17 -1 -39.5 -7t-51 -22.5t-52 -40t-39.5 -64t-16 -89.5z" />
+<glyph unicode="&#xa8;" horiz-adv-x="778" d="M377 1229l37 205h143l-35 -205h-145zM688 1229l37 205h145l-36 -205h-146z" />
+<glyph unicode="&#xa9;" horiz-adv-x="1366" d="M123 616q0 173 56.5 323.5t152.5 255t225.5 164.5t271.5 60q214 0 340.5 -146t126.5 -392q0 -173 -56 -324t-151.5 -256t-224.5 -165t-272 -60q-214 0 -341.5 147t-127.5 393zM233 614q0 -131 39 -230t125 -158.5t211 -59.5q109 0 203 38.5t162 105.5t116.5 157t72.5 195 t24 217q0 202 -94.5 325t-278.5 123q-110 0 -204 -38t-162.5 -105t-117 -157t-72.5 -195t-24 -218zM424 676q0 179 105 294t257 115q95 0 166 -38l-37 -123q-80 39 -151 39q-92 0 -146.5 -80t-54.5 -193q0 -74 31.5 -120t93.5 -46q73 0 166 41l-8 -121q-77 -41 -180 -41 q-110 0 -176 74.5t-66 198.5z" />
+<glyph unicode="&#xaa;" horiz-adv-x="673" d="M147 1030q0 55 27.5 98.5t66.5 68.5t89.5 42t89 23.5t72.5 7.5q0 45 -14 65.5t-60 20.5q-68 0 -164 -41l10 123q117 47 217 47q80 0 126 -39t46 -121q0 -41 -35 -225q-6 -34 -6 -51q0 -21 7.5 -28t25.5 -7h23l-33 -125h-70q-34 0 -65 18t-41 45q-30 -30 -80 -46.5 t-100 -16.5q-57 0 -94.5 38.5t-37.5 102.5zM313 1051q0 -47 60 -47q11 0 34.5 8.5t45.5 25.5l22 129q-19 -1 -44 -8t-52.5 -20t-46.5 -36t-19 -52z" />
+<glyph unicode="&#xab;" horiz-adv-x="1095" d="M43 582l348 422h213l-348 -422l199 -422h-213zM522 582l348 422h213l-348 -422l201 -422h-215z" />
+<glyph unicode="&#xac;" horiz-adv-x="1128" d="M150 709l22 122h848l-92 -522h-125l69 400h-722z" />
+<glyph unicode="&#xad;" horiz-adv-x="813" d="M96 471l35 193h571l-34 -193h-572z" />
+<glyph unicode="&#xae;" horiz-adv-x="1366" d="M123 616q0 173 56.5 323.5t152.5 255t225.5 164.5t271.5 60q214 0 340.5 -146t126.5 -392q0 -173 -56 -324t-151.5 -256t-224.5 -165t-272 -60q-214 0 -341.5 147t-127.5 393zM233 616q0 -133 39 -232.5t125 -159.5t211 -60q135 0 246.5 59t183.5 159t111 228t39 269 q0 132 -39.5 231.5t-125.5 159t-210 59.5q-109 0 -203 -38.5t-162.5 -105.5t-117.5 -157t-73 -195t-24 -217zM434 430l117 657h223q86 0 132 -35.5t46 -119.5q0 -135 -133 -227l84 -275h-133l-76 240h-88l-41 -240h-131zM627 784h65q123 0 123 129q0 74 -84 74h-67z" />
+<glyph unicode="&#xb0;" horiz-adv-x="636" d="M182 1212q0 136 85 235t214 99q96 0 148.5 -63.5t52.5 -163.5q0 -137 -84.5 -234.5t-214.5 -97.5q-95 0 -148 63t-53 162zM279 1214q0 -74 29 -124t83 -50q58 0 103.5 43.5t68.5 106.5t23 129q0 72 -29.5 123t-85.5 51q-81 0 -136.5 -88t-55.5 -191z" />
+<glyph unicode="&#xb1;" horiz-adv-x="946" d="M45 86l25 137h682l-25 -137h-682zM147 670l25 137h272l52 283h135l-49 -283h272l-25 -137h-272l-53 -295h-135l53 295h-275z" />
+<glyph unicode="&#xb2;" horiz-adv-x="585" d="M61 655q173 206 259 319.5t113.5 167.5t27.5 97q0 40 -19.5 62t-56.5 22q-61 0 -111.5 -39t-80.5 -82v133q30 39 95.5 75t145.5 36q91 0 131.5 -50t40.5 -120q0 -81 -57.5 -184t-204.5 -293h207l-27 -144h-463z" />
+<glyph unicode="&#xb3;" horiz-adv-x="591" d="M61 700l62 136q7 -21 53 -37.5t92 -16.5q160 0 160 142q0 96 -100 96h-105l33 113h53q146 0 146 116q0 72 -88 72q-86 0 -134 -35l-4 109q24 19 75.5 35t103.5 16q58 0 99 -15.5t62 -42.5t30 -54.5t9 -59.5q0 -60 -25.5 -109t-66.5 -80q59 -56 59 -149t-49.5 -162.5 t-122 -102t-153.5 -32.5q-63 0 -121.5 21.5t-67.5 39.5z" />
+<glyph unicode="&#xb4;" horiz-adv-x="557" d="M322 1221l14 84l379 194l-25 -147z" />
+<glyph unicode="&#xb5;" horiz-adv-x="1142" d="M-37 -496l264 1500h185l-93 -529q-14 -74 -14 -143q0 -95 39 -143t127 -48q66 0 116 27.5t105 91.5l131 744h183l-115 -656q-14 -89 -14 -131q0 -90 59 -90h37l-51 -147h-60q-146 0 -172 149q-67 -75 -129.5 -113.5t-138.5 -38.5q-57 0 -96 15t-82 63l-97 -551h-184z" />
+<glyph unicode="&#xb6;" horiz-adv-x="1171" d="M129 905q0 75 25 149.5t77 143t124.5 121t174 84t218.5 31.5h479l-25 -138h-135l-229 -1296h-111l227 1296h-161l-230 -1296h-92l88 498q-110 7 -194.5 44t-135 94.5t-75.5 125.5t-25 143z" />
+<glyph unicode="&#xb7;" horiz-adv-x="471" d="M90 436l47 266h230l-48 -266h-229z" />
+<glyph unicode="&#xb8;" horiz-adv-x="557" d="M186 -393l174 270l146 12l-217 -272z" />
+<glyph unicode="&#xb9;" horiz-adv-x="430" d="M160 655l100 566q-38 -27 -94 -35l14 123q33 6 82.5 44.5t67.5 76.5h116l-135 -775h-151z" />
+<glyph unicode="&#xba;" horiz-adv-x="714" d="M168 1139q0 138 97 242t245 104q114 0 177 -70.5t63 -177.5q0 -90 -42.5 -169t-122.5 -129t-179 -50q-113 0 -175.5 71t-62.5 179zM328 1145q0 -61 25.5 -97t74.5 -36q71 0 116.5 64t45.5 155q0 60 -26.5 96.5t-74.5 36.5q-71 0 -116 -64t-45 -155z" />
+<glyph unicode="&#xbb;" horiz-adv-x="1097" d="M6 160l350 422l-200 422h213l198 -422l-348 -422h-213zM485 160l349 422l-199 422h211l201 -422l-349 -422h-213z" />
+<glyph unicode="&#xbc;" horiz-adv-x="1355" d="M-12 -174l973 1608h204l-972 -1608h-205zM190 655l101 566q-38 -27 -94 -35l14 123q33 6 82 44.5t67 76.5h117l-135 -775h-152zM651 211l445 563h127l-80 -446h92l-21 -117h-92l-37 -211h-149l39 211h-324zM870 328h125l39 225z" />
+<glyph unicode="&#xbd;" horiz-adv-x="1372" d="M-14 -174l972 1608h205l-973 -1608h-204zM188 655l101 566q-38 -27 -94 -35l14 123q33 6 82 44.5t67 76.5h117l-135 -775h-152zM727 0q173 205 259 319.5t113 168t27 96.5q0 40 -19.5 62t-55.5 22q-61 0 -112 -39.5t-81 -81.5v133q30 39 96 75t146 36q91 0 131.5 -50 t40.5 -120q0 -81 -57.5 -184.5t-204.5 -293.5h207l-27 -143h-463z" />
+<glyph unicode="&#xbe;" horiz-adv-x="1667" d="M86 700l61 136q7 -21 53.5 -37.5t92.5 -16.5q160 0 160 142q0 96 -101 96h-104l33 113h53q145 0 145 116q0 72 -88 72q-85 0 -133 -35l-4 109q24 19 75 35t103 16q58 0 99.5 -15.5t62.5 -42.5t30 -55t9 -59q0 -60 -25.5 -109t-66.5 -80q59 -56 59 -149t-50 -162.5 t-122.5 -102t-153.5 -32.5q-63 0 -121 21.5t-67 39.5zM293 -174l973 1608h204l-972 -1608h-205zM958 211l445 563h127l-80 -446h92l-20 -117h-92l-37 -211h-150l39 211h-324zM1178 328h125l38 225z" />
+<glyph unicode="&#xbf;" horiz-adv-x="854" d="M-8 -180q0 80 40.5 164t100 156.5t120.5 141t110 142t61 135.5l10 55h123q-6 -79 -10 -92q-10 -56 -36.5 -109.5t-60.5 -98t-73.5 -89t-76.5 -89.5t-67 -91.5t-48.5 -103.5t-18.5 -117q0 -98 51.5 -149.5t128.5 -51.5q79 0 152 45t110 94l25 -137q-49 -59 -137 -98 t-183 -39q-80 0 -143.5 30t-101 79t-57 106t-19.5 117zM440 848l31 176h188l-30 -176h-189z" />
+<glyph unicode="&#xc0;" horiz-adv-x="1163" d="M-76 0l715 1434h197l208 -1434h-204l-52 387h-473l-186 -387h-205zM410 563h346l-68 598zM627 1782l26 147l310 -194l-15 -84z" />
+<glyph unicode="&#xc1;" horiz-adv-x="1163" d="M-76 0l715 1434h197l208 -1434h-204l-52 387h-473l-186 -387h-205zM410 563h346l-68 598zM604 1651l14 84l379 194l-24 -147z" />
+<glyph unicode="&#xc2;" horiz-adv-x="1163" d="M-76 0l715 1434h197l208 -1434h-204l-52 387h-473l-186 -387h-205zM410 563h346l-68 598zM508 1665l12 74l309 217l234 -217l-12 -74l-242 168z" />
+<glyph unicode="&#xc3;" horiz-adv-x="1163" d="M-76 0l715 1434h197l208 -1434h-204l-52 387h-473l-186 -387h-205zM410 563h346l-68 598zM455 1679q22 63 65 107t86 61t84 17q29 0 62.5 -16t59 -34.5t55 -34.5t51.5 -16q80 0 139 105l84 -19q-34 -89 -97.5 -140.5t-140.5 -51.5q-34 0 -76.5 26t-81.5 52t-65 26 q-87 0 -135 -100z" />
+<glyph unicode="&#xc4;" horiz-adv-x="1163" d="M-76 0l715 1434h197l208 -1434h-204l-52 387h-473l-186 -387h-205zM410 563h346l-68 598zM549 1659l37 205h143l-35 -205h-145zM860 1659l37 205h145l-36 -205h-146z" />
+<glyph unicode="&#xc5;" horiz-adv-x="1163" d="M-76 0l715 1434h197l208 -1434h-204l-52 387h-473l-186 -387h-205zM410 563h346l-68 598zM606 1763q0 83 64.5 148t163.5 65q79 0 120 -44.5t41 -110.5q0 -83 -62 -147t-163 -64q-79 0 -121.5 44.5t-42.5 108.5zM698 1767q0 -44 23 -71t59 -27q48 0 86.5 41.5t38.5 104.5 q0 43 -23.5 70.5t-58.5 27.5q-49 0 -87 -42t-38 -104z" />
+<glyph unicode="&#xc6;" horiz-adv-x="1613" d="M-106 0l882 1434h897l-33 -179h-565l-74 -417h437l-31 -176h-436l-86 -486h583l-30 -176h-803l63 369h-381l-229 -369h-194zM438 557h295l121 694z" />
+<glyph unicode="&#xc7;" horiz-adv-x="1157" d="M94 582q0 186 63.5 351t171 280t252 182t302.5 67q96 0 190 -23.5t158 -60.5l-53 -180q-5 2 -54.5 23t-65.5 26t-56.5 18t-74 17t-71.5 4q-124 0 -229 -58.5t-173.5 -155.5t-106.5 -221.5t-38 -258.5q0 -204 89 -324.5t264 -120.5q30 0 62.5 4t56 9t60.5 16t53.5 16.5 t59.5 21t54 19.5l-13 -180q-77 -36 -177 -59t-193 -23q-245 0 -388 162t-143 449zM276 -393l175 270l145 12l-217 -272z" />
+<glyph unicode="&#xc8;" d="M57 0l252 1434h801l-31 -177h-604l-74 -419h476l-31 -176h-475l-86 -486h620l-31 -176h-817zM561 1782l27 147l309 -194l-14 -84z" />
+<glyph unicode="&#xc9;" d="M57 0l252 1434h801l-31 -177h-604l-74 -419h476l-31 -176h-475l-86 -486h620l-31 -176h-817zM539 1651l14 84l379 194l-25 -147z" />
+<glyph unicode="&#xca;" d="M57 0l252 1434h801l-31 -177h-604l-74 -419h476l-31 -176h-475l-86 -486h620l-31 -176h-817zM442 1665l13 74l309 217l233 -217l-12 -74l-242 168z" />
+<glyph unicode="&#xcb;" d="M57 0l252 1434h801l-31 -177h-604l-74 -419h476l-31 -176h-475l-86 -486h620l-31 -176h-817zM483 1659l37 205h144l-35 -205h-146zM795 1659l36 205h146l-37 -205h-145z" />
+<glyph unicode="&#xcc;" horiz-adv-x="522" d="M57 0l252 1434h195l-252 -1434h-195zM299 1782l27 147l309 -194l-14 -84z" />
+<glyph unicode="&#xcd;" horiz-adv-x="522" d="M57 0l252 1434h195l-252 -1434h-195zM274 1651l15 84l379 194l-25 -147z" />
+<glyph unicode="&#xce;" horiz-adv-x="522" d="M57 0l252 1434h195l-252 -1434h-195zM178 1665l12 74l310 217l233 -217l-12 -74l-242 168z" />
+<glyph unicode="&#xcf;" horiz-adv-x="522" d="M57 0l252 1434h195l-252 -1434h-195zM219 1659l37 205h143l-34 -205h-146zM530 1659l37 205h146l-37 -205h-146z" />
+<glyph unicode="&#xd0;" horiz-adv-x="1380" d="M6 641l23 131h176l117 662h475q241 0 383.5 -152.5t142.5 -419.5q0 -194 -61 -357t-166.5 -273t-247.5 -171t-303 -61h-475l112 641h-176zM289 178h286q168 0 291.5 90t184.5 240t61 340t-88 299.5t-258 109.5h-287l-86 -485h240l-25 -131h-237z" />
+<glyph unicode="&#xd1;" horiz-adv-x="1337" d="M57 0l252 1434h205l420 -1074l188 1074h197l-254 -1434h-164l-448 1133l-201 -1133h-195zM530 1679q22 63 65 107t86.5 61t84.5 17q36 0 79 -25t82 -50.5t66 -25.5q81 0 140 105l84 -19q-34 -89 -97.5 -140.5t-140.5 -51.5q-34 0 -76.5 26t-81.5 52t-65 26 q-87 0 -135 -100z" />
+<glyph unicode="&#xd2;" horiz-adv-x="1454" d="M94 578q0 186 62.5 351.5t168 281.5t248.5 183.5t299 67.5q245 0 386 -160.5t141 -445.5q0 -186 -63 -352t-168.5 -282t-248 -183.5t-298.5 -67.5q-245 0 -386 161t-141 446zM309 590q0 -96 20 -175t60 -140t107.5 -94.5t156.5 -33.5q119 0 220.5 59t169 156t105.5 222.5 t38 259.5q0 130 -34.5 227t-114 156t-197.5 59q-157 0 -280.5 -100.5t-187 -258t-63.5 -337.5zM762 1782l26 147l310 -194l-15 -84z" />
+<glyph unicode="&#xd3;" horiz-adv-x="1454" d="M94 578q0 186 62.5 351.5t168 281.5t248.5 183.5t299 67.5q245 0 386 -160.5t141 -445.5q0 -186 -63 -352t-168.5 -282t-248 -183.5t-298.5 -67.5q-245 0 -386 161t-141 446zM309 590q0 -96 20 -175t60 -140t107.5 -94.5t156.5 -33.5q119 0 220.5 59t169 156t105.5 222.5 t38 259.5q0 130 -34.5 227t-114 156t-197.5 59q-157 0 -280.5 -100.5t-187 -258t-63.5 -337.5zM739 1651l15 84l379 194l-25 -147z" />
+<glyph unicode="&#xd4;" horiz-adv-x="1454" d="M94 578q0 186 62.5 351.5t168 281.5t248.5 183.5t299 67.5q245 0 386 -160.5t141 -445.5q0 -186 -63 -352t-168.5 -282t-248 -183.5t-298.5 -67.5q-245 0 -386 161t-141 446zM309 590q0 -96 20 -175t60 -140t107.5 -94.5t156.5 -33.5q119 0 220.5 59t169 156t105.5 222.5 t38 259.5q0 130 -34.5 227t-114 156t-197.5 59q-157 0 -280.5 -100.5t-187 -258t-63.5 -337.5zM643 1665l12 74l310 217l233 -217l-12 -74l-242 168z" />
+<glyph unicode="&#xd5;" horiz-adv-x="1454" d="M94 578q0 186 62.5 351.5t168 281.5t248.5 183.5t299 67.5q245 0 386 -160.5t141 -445.5q0 -186 -63 -352t-168.5 -282t-248 -183.5t-298.5 -67.5q-245 0 -386 161t-141 446zM309 590q0 -96 20 -175t60 -140t107.5 -94.5t156.5 -33.5q119 0 220.5 59t169 156t105.5 222.5 t38 259.5q0 130 -34.5 227t-114 156t-197.5 59q-157 0 -280.5 -100.5t-187 -258t-63.5 -337.5zM590 1679q22 63 65 107t86 61t84 17q45 0 121 -50.5t107 -50.5q80 0 139 105l84 -19q-34 -89 -97.5 -140.5t-140.5 -51.5q-34 0 -76.5 26t-81.5 52t-65 26q-87 0 -135 -100z" />
+<glyph unicode="&#xd6;" horiz-adv-x="1454" d="M94 578q0 186 62.5 351.5t168 281.5t248.5 183.5t299 67.5q245 0 386 -160.5t141 -445.5q0 -186 -63 -352t-168.5 -282t-248 -183.5t-298.5 -67.5q-245 0 -386 161t-141 446zM309 590q0 -96 20 -175t60 -140t107.5 -94.5t156.5 -33.5q119 0 220.5 59t169 156t105.5 222.5 t38 259.5q0 130 -34.5 227t-114 156t-197.5 59q-157 0 -280.5 -100.5t-187 -258t-63.5 -337.5zM684 1659l37 205h143l-35 -205h-145zM995 1659l37 205h146l-37 -205h-146z" />
+<glyph unicode="&#xd7;" horiz-adv-x="845" d="M74 317l262 250l-174 250l94 74l172 -252l262 252l68 -74l-262 -250l174 -250l-95 -73l-174 252l-260 -252z" />
+<glyph unicode="&#xd8;" horiz-adv-x="1456" d="M25 -61l178 215q-107 170 -107 417q0 192 62.5 359.5t169 283t250 182t301.5 66.5q162 0 292 -86l70 90h195l-150 -182q115 -169 115 -424q0 -191 -62.5 -357.5t-169 -281.5t-250.5 -180.5t-303 -65.5q-170 0 -301 88l-94 -124h-196zM315 588q0 -140 33 -269l688 904 q-93 57 -190 57q-123 0 -225 -58t-168 -155t-102 -220.5t-36 -258.5zM453 215q92 -59 196 -59q124 0 226.5 58t169 156.5t103 227t36.5 270.5q0 165 -41 254z" />
+<glyph unicode="&#xd9;" horiz-adv-x="1368" d="M133 418q0 82 19 190l145 826h195l-130 -732q-24 -137 -24 -233q0 -322 266 -322q84 0 152 31.5t113 82t80.5 125.5t56 149.5t36.5 166.5l129 732h195l-145 -826q-54 -302 -218 -469.5t-430 -167.5q-220 0 -330 116t-110 331zM719 1782l26 147l310 -194l-15 -84z" />
+<glyph unicode="&#xda;" horiz-adv-x="1368" d="M133 418q0 82 19 190l145 826h195l-130 -732q-24 -137 -24 -233q0 -322 266 -322q84 0 152 31.5t113 82t80.5 125.5t56 149.5t36.5 166.5l129 732h195l-145 -826q-54 -302 -218 -469.5t-430 -167.5q-220 0 -330 116t-110 331zM696 1651l15 84l379 194l-25 -147z" />
+<glyph unicode="&#xdb;" horiz-adv-x="1368" d="M133 418q0 82 19 190l145 826h195l-130 -732q-24 -137 -24 -233q0 -322 266 -322q84 0 152 31.5t113 82t80.5 125.5t56 149.5t36.5 166.5l129 732h195l-145 -826q-54 -302 -218 -469.5t-430 -167.5q-220 0 -330 116t-110 331zM600 1665l12 74l310 217l233 -217l-12 -74 l-242 168z" />
+<glyph unicode="&#xdc;" horiz-adv-x="1368" d="M133 418q0 82 19 190l145 826h195l-130 -732q-24 -137 -24 -233q0 -322 266 -322q84 0 152 31.5t113 82t80.5 125.5t56 149.5t36.5 166.5l129 732h195l-145 -826q-54 -302 -218 -469.5t-430 -167.5q-220 0 -330 116t-110 331zM641 1659l37 205h143l-35 -205h-145z M952 1659l37 205h146l-37 -205h-146z" />
+<glyph unicode="&#xdd;" horiz-adv-x="1118" d="M160 1434h205l233 -596l434 596h205l-573 -772l-117 -662h-201l117 662zM580 1651l14 84l379 194l-25 -147z" />
+<glyph unicode="&#xde;" horiz-adv-x="1075" d="M57 0l252 1434h201l-49 -287h112q105 0 179.5 -6.5t138.5 -23.5t102 -47t59 -77.5t21 -113.5q0 -166 -61.5 -265t-198.5 -145.5t-369 -46.5h-112l-74 -422h-201zM352 535h176q184 0 265 80.5t81 230.5q0 99 -61.5 141.5t-196.5 42.5h-176z" />
+<glyph unicode="&#xdf;" horiz-adv-x="1044" d="M12 -279l207 1178h-133l37 125h119l24 139q15 82 60 153.5t105 118.5t129 74t134 27q52 0 103 -18t96 -53t72.5 -94t27.5 -132q0 -80 -27.5 -153.5t-67 -124t-79 -91t-67 -69.5t-27.5 -45t23 -43.5t56.5 -63t66.5 -79t56 -104.5t23 -126q0 -92 -40 -164.5t-107.5 -116.5 t-150 -67t-173.5 -23q-19 0 -35 1t-33 2.5t-28 2.5l20 123q189 3 279 53t90 183q0 56 -23 109t-55 93t-64.5 75t-55.5 67.5t-23 58.5q0 27 29 60.5t70 72.5t82 86t70 116.5t29 148.5q0 94 -47 138t-114 44q-85 0 -144 -65t-77 -164l-256 -1453h-181z" />
+<glyph unicode="&#xe0;" horiz-adv-x="1105" d="M43 401q0 117 40 229.5t108.5 199.5t168 140.5t211.5 53.5q169 0 234 -127l39 107h164l-121 -711q-8 -44 -8 -80q0 -49 21 -67.5t75 -18.5l-51 -147q-36 0 -56.5 1t-49 5t-45.5 13.5t-35 25.5t-29.5 41.5t-18.5 60.5q-60 -70 -144.5 -108.5t-168.5 -38.5q-150 0 -242 119 t-92 302zM236 420q0 -124 50 -200.5t152 -76.5q60 0 116.5 28t103 80t74.5 134t28 182q0 147 -57.5 220t-151.5 73q-88 0 -161 -61.5t-113.5 -162t-40.5 -216.5zM586 1352l26 147l310 -194l-15 -84z" />
+<glyph unicode="&#xe1;" horiz-adv-x="1105" d="M43 401q0 117 40 229.5t108.5 199.5t168 140.5t211.5 53.5q169 0 234 -127l39 107h164l-121 -711q-8 -44 -8 -80q0 -49 21 -67.5t75 -18.5l-51 -147q-36 0 -56.5 1t-49 5t-45.5 13.5t-35 25.5t-29.5 41.5t-18.5 60.5q-60 -70 -144.5 -108.5t-168.5 -38.5q-150 0 -242 119 t-92 302zM236 420q0 -124 50 -200.5t152 -76.5q60 0 116.5 28t103 80t74.5 134t28 182q0 147 -57.5 220t-151.5 73q-88 0 -161 -61.5t-113.5 -162t-40.5 -216.5zM563 1221l15 84l378 194l-24 -147z" />
+<glyph unicode="&#xe2;" horiz-adv-x="1105" d="M43 401q0 117 40 229.5t108.5 199.5t168 140.5t211.5 53.5q169 0 234 -127l39 107h164l-121 -711q-8 -44 -8 -80q0 -49 21 -67.5t75 -18.5l-51 -147q-36 0 -56.5 1t-49 5t-45.5 13.5t-35 25.5t-29.5 41.5t-18.5 60.5q-60 -70 -144.5 -108.5t-168.5 -38.5q-150 0 -242 119 t-92 302zM236 420q0 -124 50 -200.5t152 -76.5q60 0 116.5 28t103 80t74.5 134t28 182q0 147 -57.5 220t-151.5 73q-88 0 -161 -61.5t-113.5 -162t-40.5 -216.5zM467 1235l12 74l309 217l234 -217l-12 -74l-242 168z" />
+<glyph unicode="&#xe3;" horiz-adv-x="1105" d="M43 401q0 117 40 229.5t108.5 199.5t168 140.5t211.5 53.5q169 0 234 -127l39 107h164l-121 -711q-8 -44 -8 -80q0 -49 21 -67.5t75 -18.5l-51 -147q-36 0 -56.5 1t-49 5t-45.5 13.5t-35 25.5t-29.5 41.5t-18.5 60.5q-60 -70 -144.5 -108.5t-168.5 -38.5q-150 0 -242 119 t-92 302zM236 420q0 -124 50 -200.5t152 -76.5q60 0 116.5 28t103 80t74.5 134t28 182q0 147 -57.5 220t-151.5 73q-88 0 -161 -61.5t-113.5 -162t-40.5 -216.5zM406 1249q22 63 65 107t86 61t84 17q36 0 79 -25t82 -50.5t66 -25.5q81 0 140 105l84 -19 q-34 -89 -97.5 -140.5t-140.5 -51.5q-34 0 -76.5 26t-81.5 52t-65 26q-87 0 -135 -100z" />
+<glyph unicode="&#xe4;" horiz-adv-x="1105" d="M43 401q0 117 40 229.5t108.5 199.5t168 140.5t211.5 53.5q169 0 234 -127l39 107h164l-121 -711q-8 -44 -8 -80q0 -49 21 -67.5t75 -18.5l-51 -147q-36 0 -56.5 1t-49 5t-45.5 13.5t-35 25.5t-29.5 41.5t-18.5 60.5q-60 -70 -144.5 -108.5t-168.5 -38.5q-150 0 -242 119 t-92 302zM236 420q0 -124 50 -200.5t152 -76.5q60 0 116.5 28t103 80t74.5 134t28 182q0 147 -57.5 220t-151.5 73q-88 0 -161 -61.5t-113.5 -162t-40.5 -216.5zM508 1229l37 205h143l-35 -205h-145zM819 1229l37 205h145l-36 -205h-146z" />
+<glyph unicode="&#xe5;" horiz-adv-x="1105" d="M43 401q0 117 40 229.5t108.5 199.5t168 140.5t211.5 53.5q169 0 234 -127l39 107h164l-121 -711q-8 -44 -8 -80q0 -49 21 -67.5t75 -18.5l-51 -147q-36 0 -56.5 1t-49 5t-45.5 13.5t-35 25.5t-29.5 41.5t-18.5 60.5q-60 -70 -144.5 -108.5t-168.5 -38.5q-150 0 -242 119 t-92 302zM236 420q0 -124 50 -200.5t152 -76.5q60 0 116.5 28t103 80t74.5 134t28 182q0 147 -57.5 220t-151.5 73q-88 0 -161 -61.5t-113.5 -162t-40.5 -216.5zM565 1333q0 83 64.5 148t163.5 65q79 0 120 -44.5t41 -110.5q0 -83 -62 -147t-163 -64q-79 0 -121.5 44.5 t-42.5 108.5zM657 1337q0 -44 23 -71t59 -27q48 0 86.5 41t38.5 104q0 43 -23.5 71t-58.5 28q-49 0 -87 -42t-38 -104z" />
+<glyph unicode="&#xe6;" horiz-adv-x="1490" d="M-16 190q0 73 22.5 134.5t59 105t89.5 77.5t106.5 55t117.5 35.5t115.5 21.5t107.5 10q0 128 -33 179.5t-129 51.5q-104 0 -243 -59l8 143q174 80 317 80q34 0 65 -5.5t65 -22t58 -42.5t40 -71.5t16 -104.5q37 87 101 144t133 79.5t147 22.5q137 0 215 -84t78 -238 q0 -81 -39 -200h-608q-9 -79 -9 -96q0 -135 64 -207t170 -72q110 0 272 76v-142q-166 -81 -317 -81q-138 0 -220.5 55t-109.5 176q-71 -118 -178.5 -179t-237.5 -61q-120 0 -181.5 58t-61.5 161zM180 229q0 -102 115 -102q42 0 84.5 15t83.5 46t72.5 87.5t44.5 130.5 q13 90 14 96q-53 0 -107.5 -8.5t-110.5 -29.5t-99 -51t-70 -78t-27 -106zM827 629h433q8 41 8 84q-3 147 -158 147q-197 0 -283 -231z" />
+<glyph unicode="&#xe7;" horiz-adv-x="856" d="M47 408q0 122 36.5 231.5t105.5 196t178.5 137.5t244.5 51q166 0 254 -59l-53 -166q-106 61 -221 61q-170 0 -262 -122.5t-92 -311.5q0 -285 231 -285q115 0 242 62l-6 -148q-117 -75 -275 -75q-100 0 -175.5 33t-120 92.5t-66 135t-21.5 167.5zM180 -393l174 270l146 12 l-217 -272z" />
+<glyph unicode="&#xe8;" horiz-adv-x="937" d="M43 414q0 119 40 229t110 194.5t173.5 135.5t223.5 51q143 0 221 -69.5t78 -186.5q0 -48 -13.5 -93.5t-47.5 -91t-85.5 -78.5t-134 -54t-186.5 -21q-103 0 -180 16q0 -88 19.5 -149t56.5 -93.5t81.5 -46.5t102.5 -14q147 0 276 60l-8 -146q-167 -77 -317 -77 q-102 0 -181.5 33.5t-128.5 92.5t-74.5 137t-25.5 171zM262 575q14 -2 34 -7.5t45 -9t65 -3.5q88 0 152 17.5t97.5 47t48.5 60.5t15 65q0 58 -41.5 86.5t-106.5 28.5q-99 0 -178.5 -70t-130.5 -215zM446 1352l27 147l309 -194l-14 -84z" />
+<glyph unicode="&#xe9;" horiz-adv-x="937" d="M43 414q0 119 40 229t110 194.5t173.5 135.5t223.5 51q143 0 221 -69.5t78 -186.5q0 -48 -13.5 -93.5t-47.5 -91t-85.5 -78.5t-134 -54t-186.5 -21q-103 0 -180 16q0 -88 19.5 -149t56.5 -93.5t81.5 -46.5t102.5 -14q147 0 276 60l-8 -146q-167 -77 -317 -77 q-102 0 -181.5 33.5t-128.5 92.5t-74.5 137t-25.5 171zM262 575q14 -2 34 -7.5t45 -9t65 -3.5q88 0 152 17.5t97.5 47t48.5 60.5t15 65q0 58 -41.5 86.5t-106.5 28.5q-99 0 -178.5 -70t-130.5 -215zM424 1221l14 84l379 194l-24 -147z" />
+<glyph unicode="&#xea;" horiz-adv-x="937" d="M43 414q0 119 40 229t110 194.5t173.5 135.5t223.5 51q143 0 221 -69.5t78 -186.5q0 -48 -13.5 -93.5t-47.5 -91t-85.5 -78.5t-134 -54t-186.5 -21q-103 0 -180 16q0 -88 19.5 -149t56.5 -93.5t81.5 -46.5t102.5 -14q147 0 276 60l-8 -146q-167 -77 -317 -77 q-102 0 -181.5 33.5t-128.5 92.5t-74.5 137t-25.5 171zM262 575q14 -2 34 -7.5t45 -9t65 -3.5q88 0 152 17.5t97.5 47t48.5 60.5t15 65q0 58 -41.5 86.5t-106.5 28.5q-99 0 -178.5 -70t-130.5 -215zM326 1235l12 74l309 217l234 -217l-13 -74l-241 168z" />
+<glyph unicode="&#xeb;" horiz-adv-x="937" d="M43 414q0 119 40 229t110 194.5t173.5 135.5t223.5 51q143 0 221 -69.5t78 -186.5q0 -48 -13.5 -93.5t-47.5 -91t-85.5 -78.5t-134 -54t-186.5 -21q-103 0 -180 16q0 -88 19.5 -149t56.5 -93.5t81.5 -46.5t102.5 -14q147 0 276 60l-8 -146q-167 -77 -317 -77 q-102 0 -181.5 33.5t-128.5 92.5t-74.5 137t-25.5 171zM262 575q14 -2 34 -7.5t45 -9t65 -3.5q88 0 152 17.5t97.5 47t48.5 60.5t15 65q0 58 -41.5 86.5t-106.5 28.5q-99 0 -178.5 -70t-130.5 -215zM367 1229l36 205h144l-35 -205h-145zM678 1229l37 205h145l-37 -205h-145z " />
+<glyph unicode="&#xec;" horiz-adv-x="438" d="M20 0l177 1004h186l-176 -1004h-187zM180 1352l27 147l309 -194l-14 -84z" />
+<glyph unicode="&#xed;" horiz-adv-x="438" d="M20 0l177 1004h186l-176 -1004h-187zM156 1221l14 84l379 194l-25 -147z" />
+<glyph unicode="&#xee;" horiz-adv-x="438" d="M20 0l177 1004h186l-176 -1004h-187zM59 1235l13 74l309 217l233 -217l-12 -74l-242 168z" />
+<glyph unicode="&#xef;" horiz-adv-x="438" d="M20 0l177 1004h186l-176 -1004h-187zM100 1229l37 205h144l-35 -205h-146zM412 1229l37 205h145l-37 -205h-145z" />
+<glyph unicode="&#xf0;" horiz-adv-x="997" d="M20 340q0 67 20 140t61.5 143t97.5 125.5t134.5 89.5t166.5 34q137 0 217 -112q0 112 -19 224.5t-61 162.5q-147 -109 -279 -127l-41 113q124 19 250 106q-88 111 -202 111l79 86q135 0 254 -113q92 86 129 131l93 -24q-56 -68 -158 -173q69 -88 107 -240.5t38 -316.5 q0 -167 -36.5 -298t-92.5 -209.5t-131 -129.5t-144.5 -69.5t-140.5 -18.5q-153 0 -247.5 102t-94.5 263zM219 371q0 -99 46 -162.5t132 -63.5q108 0 189.5 100t81.5 242q0 98 -44.5 156.5t-127.5 58.5q-119 0 -198 -100t-79 -231z" />
+<glyph unicode="&#xf1;" horiz-adv-x="1054" d="M20 0l177 1004h157l-6 -107q74 72 146 99.5t153 27.5q299 0 299 -322q0 -79 -112 -702h-187q111 630 111 678q0 94 -41.5 138t-130.5 44q-164 0 -250 -131l-129 -729h-187zM315 1249q22 63 65 107t86.5 61t84.5 17q36 0 79 -25t82 -50.5t66 -25.5q81 0 140 105l83 -19 q-34 -89 -97.5 -140.5t-139.5 -51.5q-34 0 -76.5 26t-81.5 52t-65 26q-87 0 -135 -100z" />
+<glyph unicode="&#xf2;" d="M43 403q0 165 69.5 306.5t197 228t284.5 86.5q124 0 211 -57t127.5 -151.5t40.5 -217.5q0 -122 -41.5 -235t-113 -197.5t-175 -135t-221.5 -50.5q-124 0 -211 56.5t-127.5 150t-40.5 216.5zM233 420q0 -277 216 -277q150 0 241.5 126.5t91.5 314.5q0 276 -215 276 q-150 0 -242 -126t-92 -314zM485 1352l27 147l309 -194l-14 -84z" />
+<glyph unicode="&#xf3;" d="M43 403q0 165 69.5 306.5t197 228t284.5 86.5q124 0 211 -57t127.5 -151.5t40.5 -217.5q0 -122 -41.5 -235t-113 -197.5t-175 -135t-221.5 -50.5q-124 0 -211 56.5t-127.5 150t-40.5 216.5zM233 420q0 -277 216 -277q150 0 241.5 126.5t91.5 314.5q0 276 -215 276 q-150 0 -242 -126t-92 -314zM461 1221l14 84l379 194l-25 -147z" />
+<glyph unicode="&#xf4;" d="M43 403q0 165 69.5 306.5t197 228t284.5 86.5q124 0 211 -57t127.5 -151.5t40.5 -217.5q0 -122 -41.5 -235t-113 -197.5t-175 -135t-221.5 -50.5q-124 0 -211 56.5t-127.5 150t-40.5 216.5zM233 420q0 -277 216 -277q150 0 241.5 126.5t91.5 314.5q0 276 -215 276 q-150 0 -242 -126t-92 -314zM367 1235l12 74l309 217l234 -217l-13 -74l-241 168z" />
+<glyph unicode="&#xf5;" d="M43 403q0 165 69.5 306.5t197 228t284.5 86.5q124 0 211 -57t127.5 -151.5t40.5 -217.5q0 -122 -41.5 -235t-113 -197.5t-175 -135t-221.5 -50.5q-124 0 -211 56.5t-127.5 150t-40.5 216.5zM233 420q0 -277 216 -277q150 0 241.5 126.5t91.5 314.5q0 276 -215 276 q-150 0 -242 -126t-92 -314zM311 1249q22 63 65 107t86.5 61t84.5 17q36 0 79 -25t82 -50.5t66 -25.5q80 0 139 105l84 -19q-34 -89 -97.5 -140.5t-139.5 -51.5q-34 0 -76.5 26t-81.5 52t-65 26q-88 0 -136 -100z" />
+<glyph unicode="&#xf6;" d="M43 403q0 165 69.5 306.5t197 228t284.5 86.5q124 0 211 -57t127.5 -151.5t40.5 -217.5q0 -122 -41.5 -235t-113 -197.5t-175 -135t-221.5 -50.5q-124 0 -211 56.5t-127.5 150t-40.5 216.5zM233 420q0 -277 216 -277q150 0 241.5 126.5t91.5 314.5q0 276 -215 276 q-150 0 -242 -126t-92 -314zM408 1229l36 205h144l-35 -205h-145zM719 1229l37 205h145l-37 -205h-145z" />
+<glyph unicode="&#xf7;" horiz-adv-x="1126" d="M119 502l26 151h848l-26 -151h-848zM360 41l35 192h185l-33 -192h-187zM512 901l35 193h184l-33 -193h-186z" />
+<glyph unicode="&#xf8;" horiz-adv-x="1079" d="M47 414q0 97 26.5 189t77 170t119 137t158 92.5t188.5 33.5q69 0 140 -24l49 82h156l-89 -136q63 -66 96 -159t33 -195q0 -122 -41.5 -234.5t-115 -198t-181 -136.5t-231.5 -51q-69 0 -145 22l-47 -78h-152l84 135q-61 63 -93 155.5t-32 195.5zM244 422q0 -105 28 -217 l394 674q-53 14 -76 14q-100 0 -180.5 -67t-123 -174t-42.5 -230zM377 139q56 -12 82 -12q101 0 181 68.5t123.5 184t43.5 255.5q0 142 -33 180z" />
+<glyph unicode="&#xf9;" horiz-adv-x="1011" d="M70 274q0 74 116 730h187q-76 -433 -92.5 -536t-16.5 -136q0 -189 160 -189q133 0 215 115l131 746h186l-176 -1004h-170l6 111q-58 -69 -119 -100t-149 -31q-278 0 -278 294zM485 1352l27 147l309 -194l-14 -84z" />
+<glyph unicode="&#xfa;" horiz-adv-x="1011" d="M70 274q0 74 116 730h187q-76 -433 -92.5 -536t-16.5 -136q0 -189 160 -189q133 0 215 115l131 746h186l-176 -1004h-170l6 111q-58 -69 -119 -100t-149 -31q-278 0 -278 294zM463 1221l14 84l379 194l-25 -147z" />
+<glyph unicode="&#xfb;" horiz-adv-x="1011" d="M70 274q0 74 116 730h187q-76 -433 -92.5 -536t-16.5 -136q0 -189 160 -189q133 0 215 115l131 746h186l-176 -1004h-170l6 111q-58 -69 -119 -100t-149 -31q-278 0 -278 294zM367 1235l12 74l309 217l234 -217l-13 -74l-241 168z" />
+<glyph unicode="&#xfc;" horiz-adv-x="1011" d="M70 274q0 74 116 730h187q-76 -433 -92.5 -536t-16.5 -136q0 -189 160 -189q133 0 215 115l131 746h186l-176 -1004h-170l6 111q-58 -69 -119 -100t-149 -31q-278 0 -278 294zM410 1229l36 205h144l-35 -205h-145zM721 1229l37 205h145l-37 -205h-145z" />
+<glyph unicode="&#xfd;" horiz-adv-x="940" d="M-27 -496l303 541l-210 959h206l138 -746l381 746h206l-825 -1500h-199zM397 1221l15 84l379 194l-25 -147z" />
+<glyph unicode="&#xfe;" horiz-adv-x="1097" d="M-68 -494l359 2030h186l-112 -639q127 127 288 127q174 0 269.5 -120t95.5 -302q0 -120 -40 -232t-110.5 -198.5t-176.5 -139t-230 -52.5q-169 0 -236 135l-106 -609h-187zM270 399q0 -123 49.5 -197.5t153.5 -74.5q106 0 188 64t124 168t42 227q0 126 -57.5 200 t-167.5 74q-70 0 -126.5 -26t-94 -70t-63.5 -104t-37 -125t-11 -136z" />
+<glyph unicode="&#xff;" horiz-adv-x="940" d="M-27 -496l303 541l-210 959h206l138 -746l381 746h206l-825 -1500h-199zM340 1229l37 205h143l-35 -205h-145zM651 1229l37 205h146l-37 -205h-146z" />
+<glyph unicode="&#x152;" horiz-adv-x="1996" d="M96 567q0 194 62 362t167.5 284t247.5 182.5t299 66.5q117 0 212 -45.5t186 -152.5l30 168h754l-31 -175h-563l-74 -419h433l-31 -176h-432l-86 -486h579l-30 -176h-770l28 170q-130 -107 -241.5 -153t-227.5 -46q-233 0 -372.5 162t-139.5 434zM305 580 q0 -195 84.5 -314t249.5 -119q100 0 186.5 38t150 105t108.5 156.5t67.5 193t22.5 214.5q0 195 -85 313.5t-249 118.5q-124 0 -227 -58.5t-169.5 -157t-102.5 -225t-36 -265.5z" />
+<glyph unicode="&#x153;" horiz-adv-x="1683" d="M45 410q0 167 69 306.5t199 223.5t295 84q112 0 200 -53.5t116 -155.5q69 102 170 155.5t204 53.5q152 0 242 -90t90 -248q0 -42 -4.5 -75t-9 -47.5t-13 -35.5t-10.5 -26h-620q-10 -68 -10 -111q0 -79 21.5 -134.5t58 -82t72.5 -37t77 -10.5q71 0 152.5 21.5t146.5 54.5 l-12 -158q-137 -65 -301 -65q-158 0 -243.5 54.5t-115.5 164.5q-65 -105 -172 -162t-227 -57q-178 0 -276.5 120.5t-98.5 309.5zM233 410q0 -126 56.5 -196.5t163.5 -70.5q79 0 144 38t107 101t64.5 142.5t22.5 165.5q0 123 -54 196.5t-157 73.5q-162 0 -254.5 -124.5 t-92.5 -325.5zM999 629h437q4 36 4 51q0 85 -43 132.5t-127 47.5q-96 0 -162.5 -54.5t-108.5 -176.5z" />
+<glyph unicode="&#x178;" horiz-adv-x="1118" d="M160 1434h205l233 -596l434 596h205l-573 -772l-117 -662h-201l117 662zM526 1659l37 205h144l-35 -205h-146zM838 1659l36 205h146l-37 -205h-145z" />
+<glyph unicode="&#x2c6;" horiz-adv-x="823" d="M358 1235l13 74l309 217l233 -217l-12 -74l-242 168z" />
+<glyph unicode="&#x2dc;" horiz-adv-x="974" d="M381 1249q22 63 65 107t86 61t84 17q29 0 62.5 -16t59 -34.5t55 -34.5t51.5 -16q80 0 139 105l84 -19q-34 -89 -97.5 -140.5t-140.5 -51.5q-34 0 -76.5 26t-81.5 52t-65 26q-87 0 -135 -100z" />
+<glyph unicode="&#x2000;" horiz-adv-x="988" />
+<glyph unicode="&#x2001;" horiz-adv-x="1976" />
+<glyph unicode="&#x2002;" horiz-adv-x="988" />
+<glyph unicode="&#x2003;" horiz-adv-x="1976" />
+<glyph unicode="&#x2004;" horiz-adv-x="658" />
+<glyph unicode="&#x2005;" horiz-adv-x="494" />
+<glyph unicode="&#x2006;" horiz-adv-x="329" />
+<glyph unicode="&#x2007;" horiz-adv-x="329" />
+<glyph unicode="&#x2008;" horiz-adv-x="247" />
+<glyph unicode="&#x2009;" horiz-adv-x="395" />
+<glyph unicode="&#x200a;" horiz-adv-x="109" />
+<glyph unicode="&#x2010;" horiz-adv-x="811" d="M98 487l31 177h571l-30 -177h-572z" />
+<glyph unicode="&#x2011;" horiz-adv-x="811" d="M98 487l31 177h571l-30 -177h-572z" />
+<glyph unicode="&#x2012;" horiz-adv-x="811" d="M98 487l31 177h571l-30 -177h-572z" />
+<glyph unicode="&#x2013;" horiz-adv-x="954" d="M98 487l31 177h715l-31 -177h-715z" />
+<glyph unicode="&#x2014;" horiz-adv-x="1124" d="M98 487l31 177h885l-31 -177h-885z" />
+<glyph unicode="&#x2018;" horiz-adv-x="380" d="M184 1137l31 176l195 223l41 -27l-97 -178l60 -18l-31 -176h-199z" />
+<glyph unicode="&#x2019;" horiz-adv-x="346" d="M184 1163l95 178l-58 19l31 176h199l-33 -176l-195 -223z" />
+<glyph unicode="&#x201a;" horiz-adv-x="440" d="M-20 -197l94 179l-58 18l31 176h199l-33 -176l-195 -223z" />
+<glyph unicode="&#x201c;" horiz-adv-x="768" d="M184 1137l31 176l195 223l41 -27l-97 -178l60 -18l-31 -176h-199zM571 1137l31 176l195 223l41 -27l-97 -178l60 -18l-31 -176h-199z" />
+<glyph unicode="&#x201d;" horiz-adv-x="733" d="M184 1163l95 178l-58 19l31 176h199l-33 -176l-195 -223zM571 1163l95 178l-58 19l31 176h199l-33 -176l-195 -223z" />
+<glyph unicode="&#x201e;" horiz-adv-x="864" d="M-20 -197l94 179l-58 18l31 176h199l-33 -176l-195 -223zM403 -197l95 179l-58 18l31 176h199l-33 -176l-195 -223z" />
+<glyph unicode="&#x2022;" horiz-adv-x="587" d="M82 535q0 103 75 180.5t169 77.5q72 0 119 -55t47 -134q0 -103 -75 -180.5t-169 -77.5q-72 0 -119 55t-47 134z" />
+<glyph unicode="&#x2026;" horiz-adv-x="1296" d="M14 0l31 176h186l-30 -176h-187zM449 0l32 176h185l-31 -176h-186zM885 0l30 176h187l-31 -176h-186z" />
+<glyph unicode="&#x202f;" horiz-adv-x="395" />
+<glyph unicode="&#x2039;" horiz-adv-x="632" d="M35 582l362 422h224l-363 -422l215 -422h-223z" />
+<glyph unicode="&#x203a;" horiz-adv-x="634" d="M6 160l363 422l-213 422h223l213 -422l-363 -422h-223z" />
+<glyph unicode="&#x205f;" horiz-adv-x="494" />
+<glyph unicode="&#x20ac;" horiz-adv-x="1318" d="M41 440l72 142h180q4 57 16 135l8 49h-163l67 131h137q93 235 269.5 368.5t388.5 133.5q187 0 315 -70l-59 -201q-153 78 -291 78q-262 0 -397 -309h471l-70 -131h-444l-9 -49q-14 -74 -16 -135h447l-72 -142h-356q32 -110 99 -161.5t175 -51.5q137 0 317 78l-12 -201 q-147 -69 -340 -69q-187 0 -311.5 106t-159.5 299h-262z" />
+<glyph unicode="&#x2122;" horiz-adv-x="1374" d="M193 1331l18 103h489l-30 -103h-181l-114 -641h-111l113 641h-184zM586 690l219 744h65l121 -367l248 367h68l-43 -744h-117l43 549l-221 -332h-15l-100 334l-156 -551h-112z" />
+<glyph unicode="&#x25fc;" horiz-adv-x="1003" d="M0 0v1004h1004v-1004h-1004z" />
+<hkern u1="&#x22;" u2="&#x201e;" k="221" />
+<hkern u1="&#x22;" u2="&#x201a;" k="221" />
+<hkern u1="&#x22;" u2="&#x2e;" k="213" />
+<hkern u1="&#x22;" u2="&#x2c;" k="221" />
+<hkern u1="&#x26;" u2="&#x2019;" k="98" />
+<hkern u1="&#x26;" u2="&#xdf;" k="16" />
+<hkern u1="&#x26;" u2="w" k="20" />
+<hkern u1="&#x26;" u2="v" k="23" />
+<hkern u1="&#x26;" u2="t" k="25" />
+<hkern u1="&#x26;" u2="f" k="18" />
+<hkern u1="&#x26;" u2="W" k="43" />
+<hkern u1="&#x26;" u2="V" k="57" />
+<hkern u1="&#x26;" u2="T" k="104" />
+<hkern u1="&#x27;" u2="&#x2e;" k="188" />
+<hkern u1="&#x27;" u2="&#x2c;" k="188" />
+<hkern u1="&#x28;" u2="&#xf0;" k="51" />
+<hkern u1="&#x28;" u2="&#xe6;" k="45" />
+<hkern u1="&#x28;" u2="&#xdf;" k="31" />
+<hkern u1="&#x28;" u2="w" k="59" />
+<hkern u1="&#x28;" u2="v" k="51" />
+<hkern u1="&#x28;" u2="t" k="47" />
+<hkern u1="&#x28;" u2="g" k="59" />
+<hkern u1="&#x28;" u2="f" k="27" />
+<hkern u1="&#x28;" u2="M" k="29" />
+<hkern u1="&#x28;" u2="J" k="-10" />
+<hkern u1="&#x28;" u2="&#x38;" k="33" />
+<hkern u1="&#x28;" u2="&#x36;" k="53" />
+<hkern u1="&#x28;" u2="&#x34;" k="41" />
+<hkern u1="&#x28;" u2="&#x31;" k="16" />
+<hkern u1="&#x28;" u2="&#x30;" k="49" />
+<hkern u1="&#x2a;" u2="&#xf0;" k="61" />
+<hkern u1="&#x2a;" u2="&#xef;" k="-55" />
+<hkern u1="&#x2a;" u2="&#xee;" k="-96" />
+<hkern u1="&#x2a;" u2="&#xe6;" k="51" />
+<hkern u1="&#x2a;" u2="&#xc6;" k="113" />
+<hkern u1="&#x2a;" u2="g" k="37" />
+<hkern u1="&#x2a;" u2="M" k="35" />
+<hkern u1="&#x2b;" u2="&#x39;" k="18" />
+<hkern u1="&#x2b;" u2="&#x37;" k="72" />
+<hkern u1="&#x2b;" u2="&#x32;" k="72" />
+<hkern u1="&#x2b;" u2="&#x31;" k="49" />
+<hkern u1="&#x2c;" u2="&#x201d;" k="221" />
+<hkern u1="&#x2c;" u2="&#x201c;" k="221" />
+<hkern u1="&#x2c;" u2="&#x2019;" k="174" />
+<hkern u1="&#x2c;" u2="&#x2018;" k="190" />
+<hkern u1="&#x2c;" u2="&#x39;" k="31" />
+<hkern u1="&#x2c;" u2="&#x34;" k="18" />
+<hkern u1="&#x2c;" u2="&#x31;" k="31" />
+<hkern u1="&#x2c;" u2="&#x30;" k="33" />
+<hkern u1="&#x2c;" u2="&#x27;" k="188" />
+<hkern u1="&#x2c;" u2="&#x22;" k="221" />
+<hkern u1="&#x2d;" u2="&#x37;" k="29" />
+<hkern u1="&#x2d;" u2="&#x32;" k="39" />
+<hkern u1="&#x2d;" u2="&#x31;" k="18" />
+<hkern u1="&#x2e;" u2="&#x201d;" k="213" />
+<hkern u1="&#x2e;" u2="&#x201c;" k="213" />
+<hkern u1="&#x2e;" u2="&#x2019;" k="174" />
+<hkern u1="&#x2e;" u2="&#x2018;" k="190" />
+<hkern u1="&#x2e;" u2="&#xf0;" k="16" />
+<hkern u1="&#x2e;" u2="&#xdf;" k="27" />
+<hkern u1="&#x2e;" u2="w" k="55" />
+<hkern u1="&#x2e;" u2="v" k="68" />
+<hkern u1="&#x2e;" u2="t" k="39" />
+<hkern u1="&#x2e;" u2="l" k="18" />
+<hkern u1="&#x2e;" u2="f" k="31" />
+<hkern u1="&#x2e;" u2="W" k="76" />
+<hkern u1="&#x2e;" u2="V" k="98" />
+<hkern u1="&#x2e;" u2="T" k="113" />
+<hkern u1="&#x2e;" u2="&#x39;" k="31" />
+<hkern u1="&#x2e;" u2="&#x34;" k="18" />
+<hkern u1="&#x2e;" u2="&#x31;" k="31" />
+<hkern u1="&#x2e;" u2="&#x30;" k="33" />
+<hkern u1="&#x2e;" u2="&#x27;" k="188" />
+<hkern u1="&#x2e;" u2="&#x22;" k="213" />
+<hkern u1="&#x2f;" u2="&#xf0;" k="37" />
+<hkern u1="&#x2f;" u2="&#xe6;" k="76" />
+<hkern u1="&#x2f;" u2="&#xc6;" k="104" />
+<hkern u1="&#x2f;" u2="x" k="20" />
+<hkern u1="&#x2f;" u2="w" k="20" />
+<hkern u1="&#x2f;" u2="g" k="74" />
+<hkern u1="&#x2f;" u2="M" k="33" />
+<hkern u1="&#x2f;" u2="&#x36;" k="37" />
+<hkern u1="&#x2f;" u2="&#x34;" k="74" />
+<hkern u1="&#x2f;" u2="&#x2f;" k="115" />
+<hkern u1="&#x30;" u2="&#xb0;" k="23" />
+<hkern u1="&#x30;" u2="&#x7d;" k="31" />
+<hkern u1="&#x30;" u2="]" k="41" />
+<hkern u1="&#x30;" u2="\" k="25" />
+<hkern u1="&#x30;" u2="Z" k="23" />
+<hkern u1="&#x30;" u2="Y" k="68" />
+<hkern u1="&#x30;" u2="X" k="27" />
+<hkern u1="&#x30;" u2="W" k="25" />
+<hkern u1="&#x30;" u2="V" k="27" />
+<hkern u1="&#x30;" u2="T" k="66" />
+<hkern u1="&#x30;" u2="&#x37;" k="23" />
+<hkern u1="&#x30;" u2="&#x2f;" k="18" />
+<hkern u1="&#x30;" u2="&#x29;" k="53" />
+<hkern u1="&#x31;" u2="&#x29;" k="18" />
+<hkern u1="&#x32;" u2="Y" k="25" />
+<hkern u1="&#x32;" u2="T" k="20" />
+<hkern u1="&#x32;" u2="&#x34;" k="16" />
+<hkern u1="&#x32;" u2="&#x2b;" k="23" />
+<hkern u1="&#x33;" u2="Y" k="33" />
+<hkern u1="&#x33;" u2="W" k="16" />
+<hkern u1="&#x33;" u2="T" k="27" />
+<hkern u1="&#x33;" u2="&#x29;" k="35" />
+<hkern u1="&#x34;" u2="&#xb0;" k="29" />
+<hkern u1="&#x34;" u2="\" k="18" />
+<hkern u1="&#x34;" u2="Y" k="37" />
+<hkern u1="&#x34;" u2="W" k="29" />
+<hkern u1="&#x34;" u2="V" k="23" />
+<hkern u1="&#x34;" u2="T" k="43" />
+<hkern u1="&#x34;" u2="&#x29;" k="39" />
+<hkern u1="&#x35;" u2="&#x29;" k="16" />
+<hkern u1="&#x36;" u2="&#xb0;" k="25" />
+<hkern u1="&#x36;" u2="\" k="25" />
+<hkern u1="&#x36;" u2="Y" k="35" />
+<hkern u1="&#x36;" u2="W" k="31" />
+<hkern u1="&#x36;" u2="V" k="27" />
+<hkern u1="&#x36;" u2="T" k="43" />
+<hkern u1="&#x36;" u2="&#x31;" k="16" />
+<hkern u1="&#x36;" u2="&#x29;" k="29" />
+<hkern u1="&#x37;" u2="&#xb7;" k="23" />
+<hkern u1="&#x37;" u2="&#x7d;" k="-35" />
+<hkern u1="&#x37;" u2="z" k="20" />
+<hkern u1="&#x37;" u2="x" k="16" />
+<hkern u1="&#x37;" u2="u" k="45" />
+<hkern u1="&#x37;" u2="s" k="63" />
+<hkern u1="&#x37;" u2="g" k="68" />
+<hkern u1="&#x37;" u2="]" k="-18" />
+<hkern u1="&#x37;" u2="Y" k="-35" />
+<hkern u1="&#x37;" u2="V" k="-43" />
+<hkern u1="&#x37;" u2="M" k="33" />
+<hkern u1="&#x37;" u2="A" k="92" />
+<hkern u1="&#x37;" u2="&#x36;" k="33" />
+<hkern u1="&#x37;" u2="&#x34;" k="63" />
+<hkern u1="&#x37;" u2="&#x2f;" k="109" />
+<hkern u1="&#x37;" u2="&#x2e;" k="68" />
+<hkern u1="&#x37;" u2="&#x2d;" k="16" />
+<hkern u1="&#x37;" u2="&#x2c;" k="70" />
+<hkern u1="&#x37;" u2="&#x2b;" k="63" />
+<hkern u1="&#x37;" u2="&#x23;" k="37" />
+<hkern u1="&#x38;" u2="Y" k="35" />
+<hkern u1="&#x38;" u2="W" k="18" />
+<hkern u1="&#x38;" u2="T" k="31" />
+<hkern u1="&#x38;" u2="&#x29;" k="37" />
+<hkern u1="&#x39;" u2="&#x7d;" k="18" />
+<hkern u1="&#x39;" u2="]" k="23" />
+<hkern u1="&#x39;" u2="Z" k="25" />
+<hkern u1="&#x39;" u2="Y" k="29" />
+<hkern u1="&#x39;" u2="X" k="27" />
+<hkern u1="&#x39;" u2="T" k="27" />
+<hkern u1="&#x39;" u2="A" k="35" />
+<hkern u1="&#x39;" u2="&#x2f;" k="45" />
+<hkern u1="&#x39;" u2="&#x2e;" k="16" />
+<hkern u1="&#x39;" u2="&#x2c;" k="16" />
+<hkern u1="&#x39;" u2="&#x29;" k="45" />
+<hkern u1="&#x3d;" u2="&#x37;" k="16" />
+<hkern u1="&#x40;" u2="&#x2019;" k="70" />
+<hkern u1="&#x40;" u2="Z" k="27" />
+<hkern u1="&#x40;" u2="Y" k="111" />
+<hkern u1="&#x40;" u2="X" k="29" />
+<hkern u1="&#x40;" u2="W" k="57" />
+<hkern u1="&#x40;" u2="V" k="66" />
+<hkern u1="&#x40;" u2="T" k="127" />
+<hkern u1="A" u2="&#xf0;" k="10" />
+<hkern u1="A" u2="&#xdf;" k="18" />
+<hkern u1="A" u2="&#x39;" k="23" />
+<hkern u1="A" u2="&#x31;" k="31" />
+<hkern u1="A" u2="&#x30;" k="20" />
+<hkern u1="B" u2="&#x2122;" k="37" />
+<hkern u1="B" u2="&#xdf;" k="18" />
+<hkern u1="B" u2="&#xc6;" k="12" />
+<hkern u1="B" u2="&#x7d;" k="37" />
+<hkern u1="B" u2="x" k="23" />
+<hkern u1="B" u2="w" k="25" />
+<hkern u1="B" u2="v" k="25" />
+<hkern u1="B" u2="t" k="20" />
+<hkern u1="B" u2="l" k="10" />
+<hkern u1="B" u2="g" k="12" />
+<hkern u1="B" u2="f" k="20" />
+<hkern u1="B" u2="]" k="61" />
+<hkern u1="B" u2="\" k="35" />
+<hkern u1="B" u2="X" k="10" />
+<hkern u1="B" u2="W" k="27" />
+<hkern u1="B" u2="V" k="29" />
+<hkern u1="B" u2="T" k="68" />
+<hkern u1="B" u2="&#x3f;" k="39" />
+<hkern u1="B" u2="&#x37;" k="25" />
+<hkern u1="B" u2="&#x32;" k="16" />
+<hkern u1="B" u2="&#x2a;" k="27" />
+<hkern u1="B" u2="&#x29;" k="45" />
+<hkern u1="C" u2="&#xf0;" k="16" />
+<hkern u1="C" u2="&#xee;" k="-47" />
+<hkern u1="C" u2="&#x34;" k="115" />
+<hkern u1="D" u2="&#xe6;" k="14" />
+<hkern u1="D" u2="&#xdf;" k="10" />
+<hkern u1="D" u2="&#x37;" k="37" />
+<hkern u1="D" u2="&#x33;" k="16" />
+<hkern u1="D" u2="&#x32;" k="23" />
+<hkern u1="E" u2="&#xf0;" k="20" />
+<hkern u1="E" u2="&#xee;" k="-20" />
+<hkern u1="E" u2="&#x34;" k="72" />
+<hkern u1="F" u2="&#x2122;" k="-29" />
+<hkern u1="F" u2="&#xf0;" k="43" />
+<hkern u1="F" u2="&#xef;" k="-23" />
+<hkern u1="F" u2="&#xee;" k="-66" />
+<hkern u1="F" u2="&#xe6;" k="68" />
+<hkern u1="F" u2="&#xc6;" k="166" />
+<hkern u1="F" u2="&#x7d;" k="-27" />
+<hkern u1="F" u2="x" k="18" />
+<hkern u1="F" u2="w" k="14" />
+<hkern u1="F" u2="g" k="51" />
+<hkern u1="F" u2="f" k="16" />
+<hkern u1="F" u2="]" k="-12" />
+<hkern u1="F" u2="M" k="23" />
+<hkern u1="F" u2="&#x40;" k="72" />
+<hkern u1="F" u2="&#x3b;" k="29" />
+<hkern u1="F" u2="&#x3a;" k="27" />
+<hkern u1="F" u2="&#x36;" k="23" />
+<hkern u1="F" u2="&#x34;" k="63" />
+<hkern u1="F" u2="&#x2f;" k="119" />
+<hkern u1="F" u2="&#x2c;" k="150" />
+<hkern u1="F" u2="&#x2a;" k="-16" />
+<hkern u1="F" u2="&#x26;" k="12" />
+<hkern u1="G" u2="&#xdf;" k="16" />
+<hkern u1="G" u2="w" k="27" />
+<hkern u1="G" u2="v" k="25" />
+<hkern u1="G" u2="t" k="16" />
+<hkern u1="G" u2="l" k="10" />
+<hkern u1="G" u2="g" k="10" />
+<hkern u1="G" u2="f" k="16" />
+<hkern u1="G" u2="&#x29;" k="16" />
+<hkern u1="K" u2="&#x2122;" k="-43" />
+<hkern u1="K" u2="&#xf0;" k="47" />
+<hkern u1="K" u2="&#xef;" k="-47" />
+<hkern u1="K" u2="&#xee;" k="-20" />
+<hkern u1="K" u2="&#xe6;" k="14" />
+<hkern u1="K" u2="&#xdf;" k="23" />
+<hkern u1="K" u2="&#xae;" k="39" />
+<hkern u1="K" u2="&#x7d;" k="-55" />
+<hkern u1="K" u2="w" k="80" />
+<hkern u1="K" u2="v" k="80" />
+<hkern u1="K" u2="t" k="39" />
+<hkern u1="K" u2="g" k="41" />
+<hkern u1="K" u2="f" k="18" />
+<hkern u1="K" u2="]" k="-51" />
+<hkern u1="K" u2="&#x36;" k="16" />
+<hkern u1="K" u2="&#x34;" k="29" />
+<hkern u1="K" u2="&#x30;" k="20" />
+<hkern u1="K" u2="&#x26;" k="10" />
+<hkern u1="L" u2="&#x2122;" k="188" />
+<hkern u1="L" u2="&#x201d;" k="188" />
+<hkern u1="L" u2="&#x2019;" k="174" />
+<hkern u1="L" u2="&#xf0;" k="14" />
+<hkern u1="L" u2="&#xdf;" k="23" />
+<hkern u1="L" u2="&#xb7;" k="143" />
+<hkern u1="L" u2="&#xae;" k="98" />
+<hkern u1="L" u2="&#x7d;" k="29" />
+<hkern u1="L" u2="w" k="80" />
+<hkern u1="L" u2="v" k="86" />
+<hkern u1="L" u2="t" k="35" />
+<hkern u1="L" u2="l" k="12" />
+<hkern u1="L" u2="g" k="16" />
+<hkern u1="L" u2="f" k="27" />
+<hkern u1="L" u2="]" k="31" />
+<hkern u1="L" u2="\" k="147" />
+<hkern u1="L" u2="W" k="129" />
+<hkern u1="L" u2="V" k="188" />
+<hkern u1="L" u2="T" k="135" />
+<hkern u1="L" u2="&#x3f;" k="47" />
+<hkern u1="L" u2="&#x39;" k="51" />
+<hkern u1="L" u2="&#x34;" k="156" />
+<hkern u1="L" u2="&#x31;" k="47" />
+<hkern u1="L" u2="&#x30;" k="53" />
+<hkern u1="L" u2="&#x2a;" k="188" />
+<hkern u1="M" u2="&#x2122;" k="43" />
+<hkern u1="M" u2="&#xf0;" k="18" />
+<hkern u1="M" u2="&#xe6;" k="12" />
+<hkern u1="M" u2="&#xdf;" k="27" />
+<hkern u1="M" u2="&#xae;" k="20" />
+<hkern u1="M" u2="x" k="10" />
+<hkern u1="M" u2="w" k="37" />
+<hkern u1="M" u2="v" k="33" />
+<hkern u1="M" u2="t" k="29" />
+<hkern u1="M" u2="l" k="20" />
+<hkern u1="M" u2="g" k="25" />
+<hkern u1="M" u2="f" k="27" />
+<hkern u1="M" u2="\" k="35" />
+<hkern u1="M" u2="W" k="39" />
+<hkern u1="M" u2="V" k="35" />
+<hkern u1="M" u2="T" k="55" />
+<hkern u1="M" u2="&#x3f;" k="27" />
+<hkern u1="M" u2="&#x31;" k="23" />
+<hkern u1="M" u2="&#x2a;" k="41" />
+<hkern u1="M" u2="&#x29;" k="29" />
+<hkern u1="P" u2="&#xf0;" k="27" />
+<hkern u1="P" u2="&#xee;" k="-10" />
+<hkern u1="P" u2="&#xe6;" k="23" />
+<hkern u1="P" u2="&#xc6;" k="131" />
+<hkern u1="P" u2="&#x7d;" k="16" />
+<hkern u1="P" u2="g" k="12" />
+<hkern u1="P" u2="]" k="18" />
+<hkern u1="P" u2="X" k="20" />
+<hkern u1="P" u2="M" k="12" />
+<hkern u1="P" u2="&#x40;" k="18" />
+<hkern u1="P" u2="&#x34;" k="20" />
+<hkern u1="P" u2="&#x33;" k="20" />
+<hkern u1="P" u2="&#x2f;" k="92" />
+<hkern u1="P" u2="&#x2c;" k="174" />
+<hkern u1="P" u2="&#x29;" k="33" />
+<hkern u1="R" u2="&#xf0;" k="31" />
+<hkern u1="R" u2="&#xe6;" k="16" />
+<hkern u1="R" u2="&#xdf;" k="14" />
+<hkern u1="R" u2="&#x7d;" k="18" />
+<hkern u1="R" u2="w" k="14" />
+<hkern u1="R" u2="v" k="12" />
+<hkern u1="R" u2="t" k="12" />
+<hkern u1="R" u2="l" k="16" />
+<hkern u1="R" u2="g" k="23" />
+<hkern u1="R" u2="f" k="14" />
+<hkern u1="R" u2="]" k="37" />
+<hkern u1="R" u2="W" k="10" />
+<hkern u1="R" u2="T" k="35" />
+<hkern u1="R" u2="&#x3f;" k="20" />
+<hkern u1="R" u2="&#x34;" k="39" />
+<hkern u1="S" u2="&#xdf;" k="14" />
+<hkern u1="T" u2="&#xfe;" k="137" />
+<hkern u1="T" u2="&#xf0;" k="51" />
+<hkern u1="T" u2="&#xef;" k="2" />
+<hkern u1="T" u2="&#xee;" k="-41" />
+<hkern u1="T" u2="&#xe6;" k="160" />
+<hkern u1="T" u2="&#xdf;" k="43" />
+<hkern u1="T" u2="&#xc6;" k="129" />
+<hkern u1="T" u2="&#xae;" k="47" />
+<hkern u1="T" u2="x" k="152" />
+<hkern u1="T" u2="w" k="143" />
+<hkern u1="T" u2="v" k="150" />
+<hkern u1="T" u2="t" k="37" />
+<hkern u1="T" u2="s" k="156" />
+<hkern u1="T" u2="l" k="12" />
+<hkern u1="T" u2="g" k="152" />
+<hkern u1="T" u2="f" k="39" />
+<hkern u1="T" u2="M" k="45" />
+<hkern u1="T" u2="&#x40;" k="133" />
+<hkern u1="T" u2="&#x3b;" k="94" />
+<hkern u1="T" u2="&#x3a;" k="94" />
+<hkern u1="T" u2="&#x38;" k="16" />
+<hkern u1="T" u2="&#x36;" k="82" />
+<hkern u1="T" u2="&#x35;" k="16" />
+<hkern u1="T" u2="&#x34;" k="96" />
+<hkern u1="T" u2="&#x30;" k="37" />
+<hkern u1="T" u2="&#x2f;" k="113" />
+<hkern u1="T" u2="&#x2c;" k="117" />
+<hkern u1="T" u2="&#x26;" k="23" />
+<hkern u1="U" u2="&#xf0;" k="23" />
+<hkern u1="U" u2="&#xe6;" k="27" />
+<hkern u1="U" u2="&#xdf;" k="14" />
+<hkern u1="V" u2="&#x2122;" k="-45" />
+<hkern u1="V" u2="&#xf0;" k="57" />
+<hkern u1="V" u2="&#xef;" k="-39" />
+<hkern u1="V" u2="&#xee;" k="-53" />
+<hkern u1="V" u2="&#xe6;" k="84" />
+<hkern u1="V" u2="&#xdf;" k="18" />
+<hkern u1="V" u2="&#xc6;" k="115" />
+<hkern u1="V" u2="&#xae;" k="18" />
+<hkern u1="V" u2="&#x7d;" k="-51" />
+<hkern u1="V" u2="x" k="29" />
+<hkern u1="V" u2="w" k="27" />
+<hkern u1="V" u2="v" k="18" />
+<hkern u1="V" u2="t" k="20" />
+<hkern u1="V" u2="g" k="84" />
+<hkern u1="V" u2="f" k="16" />
+<hkern u1="V" u2="]" k="-39" />
+<hkern u1="V" u2="M" k="29" />
+<hkern u1="V" u2="&#x40;" k="84" />
+<hkern u1="V" u2="&#x3b;" k="16" />
+<hkern u1="V" u2="&#x3a;" k="16" />
+<hkern u1="V" u2="&#x36;" k="39" />
+<hkern u1="V" u2="&#x34;" k="70" />
+<hkern u1="V" u2="&#x2f;" k="109" />
+<hkern u1="V" u2="&#x2c;" k="96" />
+<hkern u1="V" u2="&#x2a;" k="-31" />
+<hkern u1="V" u2="&#x26;" k="16" />
+<hkern u1="W" u2="&#x2122;" k="-45" />
+<hkern u1="W" u2="&#xf0;" k="49" />
+<hkern u1="W" u2="&#xef;" k="-35" />
+<hkern u1="W" u2="&#xee;" k="-55" />
+<hkern u1="W" u2="&#xe6;" k="66" />
+<hkern u1="W" u2="&#xdf;" k="12" />
+<hkern u1="W" u2="&#xc6;" k="76" />
+<hkern u1="W" u2="&#x7d;" k="-47" />
+<hkern u1="W" u2="x" k="18" />
+<hkern u1="W" u2="w" k="16" />
+<hkern u1="W" u2="v" k="10" />
+<hkern u1="W" u2="t" k="14" />
+<hkern u1="W" u2="g" k="63" />
+<hkern u1="W" u2="f" k="12" />
+<hkern u1="W" u2="]" k="-33" />
+<hkern u1="W" u2="M" k="18" />
+<hkern u1="W" u2="&#x40;" k="59" />
+<hkern u1="W" u2="&#x36;" k="23" />
+<hkern u1="W" u2="&#x34;" k="37" />
+<hkern u1="W" u2="&#x2f;" k="82" />
+<hkern u1="W" u2="&#x2c;" k="70" />
+<hkern u1="W" u2="&#x2a;" k="-29" />
+<hkern u1="W" u2="&#x26;" k="10" />
+<hkern u1="X" u2="&#x2122;" k="-35" />
+<hkern u1="X" u2="&#xf0;" k="47" />
+<hkern u1="X" u2="&#xef;" k="-37" />
+<hkern u1="X" u2="&#xee;" k="-18" />
+<hkern u1="X" u2="&#xe6;" k="16" />
+<hkern u1="X" u2="&#xdf;" k="25" />
+<hkern u1="X" u2="&#xae;" k="41" />
+<hkern u1="X" u2="&#x7d;" k="-49" />
+<hkern u1="X" u2="w" k="76" />
+<hkern u1="X" u2="v" k="74" />
+<hkern u1="X" u2="t" k="37" />
+<hkern u1="X" u2="g" k="41" />
+<hkern u1="X" u2="f" k="23" />
+<hkern u1="X" u2="]" k="-35" />
+<hkern u1="X" u2="&#x36;" k="18" />
+<hkern u1="X" u2="&#x34;" k="29" />
+<hkern u1="X" u2="&#x30;" k="23" />
+<hkern u1="Y" u2="&#xf0;" k="57" />
+<hkern u1="Y" u2="&#xef;" k="-37" />
+<hkern u1="Y" u2="&#xee;" k="-27" />
+<hkern u1="Y" u2="&#xe6;" k="139" />
+<hkern u1="Y" u2="&#xdf;" k="33" />
+<hkern u1="Y" u2="&#x40;" k="127" />
+<hkern u1="Y" u2="&#x38;" k="20" />
+<hkern u1="Y" u2="&#x36;" k="80" />
+<hkern u1="Y" u2="&#x34;" k="102" />
+<hkern u1="Y" u2="&#x30;" k="41" />
+<hkern u1="Z" u2="&#xf0;" k="43" />
+<hkern u1="Z" u2="&#xef;" k="-47" />
+<hkern u1="Z" u2="&#xee;" k="-37" />
+<hkern u1="Z" u2="&#xe6;" k="20" />
+<hkern u1="Z" u2="&#xdf;" k="16" />
+<hkern u1="Z" u2="&#x40;" k="16" />
+<hkern u1="Z" u2="&#x36;" k="23" />
+<hkern u1="Z" u2="&#x34;" k="106" />
+<hkern u1="Z" u2="&#x30;" k="20" />
+<hkern u1="[" u2="&#xfe;" k="18" />
+<hkern u1="[" u2="&#xf0;" k="47" />
+<hkern u1="[" u2="&#xef;" k="-59" />
+<hkern u1="[" u2="&#xee;" k="-55" />
+<hkern u1="[" u2="&#xe6;" k="68" />
+<hkern u1="[" u2="&#xdf;" k="16" />
+<hkern u1="[" u2="&#xc6;" k="45" />
+<hkern u1="[" u2="z" k="72" />
+<hkern u1="[" u2="x" k="68" />
+<hkern u1="[" u2="w" k="78" />
+<hkern u1="[" u2="v" k="74" />
+<hkern u1="[" u2="t" k="61" />
+<hkern u1="[" u2="s" k="70" />
+<hkern u1="[" u2="X" k="-39" />
+<hkern u1="[" u2="W" k="-27" />
+<hkern u1="[" u2="V" k="-63" />
+<hkern u1="[" u2="M" k="20" />
+<hkern u1="[" u2="J" k="-68" />
+<hkern u1="[" u2="&#x36;" k="53" />
+<hkern u1="[" u2="&#x34;" k="59" />
+<hkern u1="[" u2="&#x30;" k="35" />
+<hkern u1="\" u2="&#x2019;" k="111" />
+<hkern u1="\" u2="w" k="39" />
+<hkern u1="\" u2="v" k="57" />
+<hkern u1="\" u2="W" k="92" />
+<hkern u1="\" u2="V" k="113" />
+<hkern u1="\" u2="T" k="119" />
+<hkern u1="\" u2="J" k="-20" />
+<hkern u1="\" u2="&#x39;" k="29" />
+<hkern u1="\" u2="&#x31;" k="31" />
+<hkern u1="\" u2="&#x30;" k="33" />
+<hkern u1="a" u2="&#xf0;" k="8" />
+<hkern u1="a" u2="&#xdf;" k="8" />
+<hkern u1="a" u2="Y" k="141" />
+<hkern u1="a" u2="W" k="88" />
+<hkern u1="a" u2="V" k="90" />
+<hkern u1="a" u2="U" k="53" />
+<hkern u1="a" u2="T" k="170" />
+<hkern u1="a" u2="S" k="23" />
+<hkern u1="a" u2="M" k="20" />
+<hkern u1="a" u2="&#x31;" k="31" />
+<hkern u1="b" u2="&#x201d;" k="188" />
+<hkern u1="b" u2="&#xdf;" k="12" />
+<hkern u1="b" u2="Z" k="37" />
+<hkern u1="b" u2="Y" k="162" />
+<hkern u1="b" u2="X" k="47" />
+<hkern u1="b" u2="W" k="86" />
+<hkern u1="b" u2="V" k="102" />
+<hkern u1="b" u2="U" k="35" />
+<hkern u1="b" u2="T" k="162" />
+<hkern u1="b" u2="S" k="31" />
+<hkern u1="b" u2="M" k="25" />
+<hkern u1="b" u2="&#x37;" k="37" />
+<hkern u1="b" u2="&#x32;" k="27" />
+<hkern u1="b" u2="&#x31;" k="35" />
+<hkern u1="c" u2="&#xf0;" k="12" />
+<hkern u1="c" u2="Y" k="92" />
+<hkern u1="c" u2="W" k="35" />
+<hkern u1="c" u2="V" k="39" />
+<hkern u1="c" u2="U" k="18" />
+<hkern u1="c" u2="T" k="176" />
+<hkern u1="c" u2="S" k="25" />
+<hkern u1="c" u2="&#x34;" k="25" />
+<hkern u1="d" u2="Z" k="16" />
+<hkern u1="d" u2="Y" k="16" />
+<hkern u1="d" u2="X" k="16" />
+<hkern u1="d" u2="W" k="18" />
+<hkern u1="d" u2="V" k="12" />
+<hkern u1="d" u2="U" k="31" />
+<hkern u1="d" u2="T" k="25" />
+<hkern u1="d" u2="S" k="18" />
+<hkern u1="d" u2="M" k="27" />
+<hkern u1="d" u2="&#x26;" k="23" />
+<hkern u1="e" u2="Z" k="12" />
+<hkern u1="e" u2="Y" k="158" />
+<hkern u1="e" u2="X" k="20" />
+<hkern u1="e" u2="W" k="82" />
+<hkern u1="e" u2="V" k="92" />
+<hkern u1="e" u2="U" k="35" />
+<hkern u1="e" u2="T" k="162" />
+<hkern u1="e" u2="S" k="23" />
+<hkern u1="e" u2="M" k="20" />
+<hkern u1="e" u2="&#x37;" k="20" />
+<hkern u1="e" u2="&#x31;" k="33" />
+<hkern u1="f" u2="&#x2122;" k="-29" />
+<hkern u1="f" u2="&#xf0;" k="39" />
+<hkern u1="f" u2="&#xe6;" k="10" />
+<hkern u1="f" u2="&#x7d;" k="-20" />
+<hkern u1="f" u2="Z" k="20" />
+<hkern u1="f" u2="V" k="-10" />
+<hkern u1="f" u2="U" k="16" />
+<hkern u1="f" u2="M" k="39" />
+<hkern u1="f" u2="&#x40;" k="18" />
+<hkern u1="f" u2="&#x2f;" k="18" />
+<hkern u1="f" u2="&#x2c;" k="63" />
+<hkern u1="f" u2="&#x26;" k="35" />
+<hkern u1="g" u2="&#x7d;" k="-49" />
+<hkern u1="g" u2="j" k="-14" />
+<hkern u1="g" u2="]" k="-39" />
+<hkern u1="g" u2="Z" k="35" />
+<hkern u1="g" u2="Y" k="68" />
+<hkern u1="g" u2="X" k="41" />
+<hkern u1="g" u2="W" k="29" />
+<hkern u1="g" u2="V" k="29" />
+<hkern u1="g" u2="U" k="20" />
+<hkern u1="g" u2="T" k="168" />
+<hkern u1="g" u2="M" k="29" />
+<hkern u1="g" u2="J" k="-66" />
+<hkern u1="g" u2="&#x3f;" k="72" />
+<hkern u1="g" u2="&#x37;" k="59" />
+<hkern u1="g" u2="&#x33;" k="16" />
+<hkern u1="g" u2="&#x2f;" k="-10" />
+<hkern u1="g" u2="&#x26;" k="25" />
+<hkern u1="k" u2="&#xf0;" k="35" />
+<hkern u1="k" u2="g" k="16" />
+<hkern u1="k" u2="]" k="37" />
+<hkern u1="k" u2="Y" k="53" />
+<hkern u1="k" u2="W" k="20" />
+<hkern u1="k" u2="V" k="23" />
+<hkern u1="k" u2="U" k="18" />
+<hkern u1="k" u2="T" k="164" />
+<hkern u1="k" u2="M" k="10" />
+<hkern u1="k" u2="&#x3f;" k="35" />
+<hkern u1="k" u2="&#x26;" k="35" />
+<hkern u1="l" u2="&#x2122;" k="20" />
+<hkern u1="l" u2="&#xf0;" k="8" />
+<hkern u1="l" u2="&#xdf;" k="8" />
+<hkern u1="l" u2="&#xb7;" k="20" />
+<hkern u1="l" u2="w" k="18" />
+<hkern u1="l" u2="v" k="14" />
+<hkern u1="l" u2="t" k="10" />
+<hkern u1="l" u2="f" k="8" />
+<hkern u1="l" u2="Y" k="35" />
+<hkern u1="l" u2="W" k="39" />
+<hkern u1="l" u2="V" k="29" />
+<hkern u1="l" u2="U" k="53" />
+<hkern u1="l" u2="T" k="45" />
+<hkern u1="l" u2="S" k="18" />
+<hkern u1="l" u2="M" k="18" />
+<hkern u1="l" u2="&#x2a;" k="27" />
+<hkern u1="l" u2="&#x26;" k="27" />
+<hkern u1="o" u2="&#x201d;" k="193" />
+<hkern u1="p" u2="&#x201d;" k="193" />
+<hkern u1="r" u2="&#xf0;" k="53" />
+<hkern u1="r" u2="&#xe6;" k="12" />
+<hkern u1="r" u2="&#x7d;" k="45" />
+<hkern u1="r" u2="g" k="8" />
+<hkern u1="r" u2="]" k="70" />
+<hkern u1="r" u2="Z" k="94" />
+<hkern u1="r" u2="Y" k="45" />
+<hkern u1="r" u2="X" k="72" />
+<hkern u1="r" u2="W" k="20" />
+<hkern u1="r" u2="V" k="20" />
+<hkern u1="r" u2="U" k="20" />
+<hkern u1="r" u2="T" k="166" />
+<hkern u1="r" u2="M" k="41" />
+<hkern u1="r" u2="&#x40;" k="35" />
+<hkern u1="r" u2="&#x3f;" k="100" />
+<hkern u1="r" u2="&#x37;" k="104" />
+<hkern u1="r" u2="&#x34;" k="20" />
+<hkern u1="r" u2="&#x33;" k="43" />
+<hkern u1="r" u2="&#x2f;" k="55" />
+<hkern u1="r" u2="&#x2c;" k="74" />
+<hkern u1="r" u2="&#x29;" k="41" />
+<hkern u1="r" u2="&#x26;" k="35" />
+<hkern u1="s" u2="]" k="59" />
+<hkern u1="s" u2="Z" k="16" />
+<hkern u1="s" u2="Y" k="129" />
+<hkern u1="s" u2="X" k="23" />
+<hkern u1="s" u2="W" k="72" />
+<hkern u1="s" u2="V" k="84" />
+<hkern u1="s" u2="U" k="37" />
+<hkern u1="s" u2="T" k="160" />
+<hkern u1="s" u2="S" k="18" />
+<hkern u1="s" u2="M" k="18" />
+<hkern u1="s" u2="&#x37;" k="23" />
+<hkern u1="s" u2="&#x31;" k="20" />
+<hkern u1="t" u2="&#x2122;" k="16" />
+<hkern u1="t" u2="&#xf0;" k="10" />
+<hkern u1="t" u2="&#x7d;" k="16" />
+<hkern u1="t" u2="]" k="49" />
+<hkern u1="t" u2="Y" k="61" />
+<hkern u1="t" u2="X" k="14" />
+<hkern u1="t" u2="W" k="27" />
+<hkern u1="t" u2="V" k="29" />
+<hkern u1="t" u2="U" k="20" />
+<hkern u1="t" u2="T" k="92" />
+<hkern u1="t" u2="M" k="16" />
+<hkern u1="t" u2="&#x3f;" k="47" />
+<hkern u1="t" u2="&#x34;" k="23" />
+<hkern u1="t" u2="&#x26;" k="23" />
+<hkern u1="v" u2="&#xf0;" k="18" />
+<hkern u1="v" u2="&#xe6;" k="10" />
+<hkern u1="v" u2="&#x7d;" k="49" />
+<hkern u1="v" u2="]" k="74" />
+<hkern u1="v" u2="Z" k="90" />
+<hkern u1="v" u2="Y" k="63" />
+<hkern u1="v" u2="X" k="80" />
+<hkern u1="v" u2="W" k="27" />
+<hkern u1="v" u2="V" k="29" />
+<hkern u1="v" u2="U" k="23" />
+<hkern u1="v" u2="T" k="160" />
+<hkern u1="v" u2="M" k="39" />
+<hkern u1="v" u2="&#x40;" k="18" />
+<hkern u1="v" u2="&#x3f;" k="86" />
+<hkern u1="v" u2="&#x37;" k="96" />
+<hkern u1="v" u2="&#x33;" k="35" />
+<hkern u1="v" u2="&#x32;" k="23" />
+<hkern u1="v" u2="&#x2f;" k="47" />
+<hkern u1="v" u2="&#x2c;" k="68" />
+<hkern u1="v" u2="&#x29;" k="49" />
+<hkern u1="v" u2="&#x26;" k="33" />
+<hkern u1="w" u2="&#xf0;" k="12" />
+<hkern u1="w" u2="&#xe6;" k="8" />
+<hkern u1="w" u2="&#x7d;" k="49" />
+<hkern u1="w" u2="]" k="70" />
+<hkern u1="w" u2="\" k="16" />
+<hkern u1="w" u2="Z" k="74" />
+<hkern u1="w" u2="Y" k="72" />
+<hkern u1="w" u2="X" k="74" />
+<hkern u1="w" u2="W" k="31" />
+<hkern u1="w" u2="V" k="33" />
+<hkern u1="w" u2="U" k="23" />
+<hkern u1="w" u2="T" k="150" />
+<hkern u1="w" u2="M" k="37" />
+<hkern u1="w" u2="&#x3f;" k="80" />
+<hkern u1="w" u2="&#x37;" k="84" />
+<hkern u1="w" u2="&#x33;" k="23" />
+<hkern u1="w" u2="&#x32;" k="23" />
+<hkern u1="w" u2="&#x2f;" k="29" />
+<hkern u1="w" u2="&#x2c;" k="51" />
+<hkern u1="w" u2="&#x29;" k="53" />
+<hkern u1="w" u2="&#x26;" k="31" />
+<hkern u1="x" u2="&#xf0;" k="31" />
+<hkern u1="x" u2="&#x7d;" k="20" />
+<hkern u1="x" u2="g" k="10" />
+<hkern u1="x" u2="]" k="45" />
+<hkern u1="x" u2="Y" k="63" />
+<hkern u1="x" u2="W" k="29" />
+<hkern u1="x" u2="V" k="29" />
+<hkern u1="x" u2="U" k="25" />
+<hkern u1="x" u2="T" k="164" />
+<hkern u1="x" u2="M" k="16" />
+<hkern u1="x" u2="&#x3f;" k="49" />
+<hkern u1="x" u2="&#x26;" k="33" />
+<hkern u1="y" u2="&#xf0;" k="23" />
+<hkern u1="y" u2="&#xe6;" k="10" />
+<hkern u1="y" u2="Z" k="94" />
+<hkern u1="y" u2="Y" k="61" />
+<hkern u1="y" u2="X" k="84" />
+<hkern u1="y" u2="W" k="27" />
+<hkern u1="y" u2="V" k="27" />
+<hkern u1="y" u2="U" k="23" />
+<hkern u1="y" u2="T" k="164" />
+<hkern u1="y" u2="M" k="41" />
+<hkern u1="y" u2="&#x40;" k="20" />
+<hkern u1="y" u2="&#x37;" k="100" />
+<hkern u1="y" u2="&#x33;" k="39" />
+<hkern u1="y" u2="&#x32;" k="25" />
+<hkern u1="z" u2="&#xf0;" k="18" />
+<hkern u1="z" u2="Y" k="76" />
+<hkern u1="z" u2="W" k="37" />
+<hkern u1="z" u2="V" k="39" />
+<hkern u1="z" u2="U" k="33" />
+<hkern u1="z" u2="T" k="162" />
+<hkern u1="z" u2="M" k="20" />
+<hkern u1="z" u2="&#x34;" k="33" />
+<hkern u1="&#x7b;" u2="&#xfe;" k="18" />
+<hkern u1="&#x7b;" u2="&#xf0;" k="35" />
+<hkern u1="&#x7b;" u2="&#xef;" k="-57" />
+<hkern u1="&#x7b;" u2="&#xee;" k="-49" />
+<hkern u1="&#x7b;" u2="&#xe6;" k="47" />
+<hkern u1="&#x7b;" u2="x" k="23" />
+<hkern u1="&#x7b;" u2="w" k="57" />
+<hkern u1="&#x7b;" u2="v" k="51" />
+<hkern u1="&#x7b;" u2="t" k="37" />
+<hkern u1="&#x7b;" u2="s" k="49" />
+<hkern u1="&#x7b;" u2="X" k="-35" />
+<hkern u1="&#x7b;" u2="W" k="-20" />
+<hkern u1="&#x7b;" u2="V" k="-61" />
+<hkern u1="&#x7b;" u2="J" k="-63" />
+<hkern u1="&#x7b;" u2="&#x36;" k="37" />
+<hkern u1="&#x7b;" u2="&#x34;" k="31" />
+<hkern u1="&#x7b;" u2="&#x30;" k="25" />
+<hkern u1="&#xa1;" u2="&#xf0;" k="16" />
+<hkern u1="&#xa1;" u2="W" k="37" />
+<hkern u1="&#xa1;" u2="V" k="43" />
+<hkern u1="&#xa1;" u2="T" k="123" />
+<hkern u1="&#xae;" u2="&#x2019;" k="27" />
+<hkern u1="&#xae;" u2="&#xc6;" k="31" />
+<hkern u1="&#xae;" u2="X" k="51" />
+<hkern u1="&#xae;" u2="W" k="29" />
+<hkern u1="&#xae;" u2="V" k="33" />
+<hkern u1="&#xae;" u2="T" k="76" />
+<hkern u1="&#xb0;" u2="&#x36;" k="16" />
+<hkern u1="&#xb0;" u2="&#x34;" k="57" />
+<hkern u1="&#xb7;" u2="&#x37;" k="35" />
+<hkern u1="&#xb7;" u2="&#x32;" k="41" />
+<hkern u1="&#xb7;" u2="&#x31;" k="23" />
+<hkern u1="&#xbf;" u2="&#xf0;" k="35" />
+<hkern u1="&#xbf;" u2="&#xe6;" k="31" />
+<hkern u1="&#xbf;" u2="&#xc6;" k="29" />
+<hkern u1="&#xbf;" u2="x" k="18" />
+<hkern u1="&#xbf;" u2="w" k="18" />
+<hkern u1="&#xbf;" u2="l" k="23" />
+<hkern u1="&#xbf;" u2="j" k="-10" />
+<hkern u1="&#xbf;" u2="g" k="27" />
+<hkern u1="&#xbf;" u2="X" k="51" />
+<hkern u1="&#xbf;" u2="W" k="39" />
+<hkern u1="&#xbf;" u2="V" k="43" />
+<hkern u1="&#xbf;" u2="T" k="119" />
+<hkern u1="&#xbf;" u2="M" k="20" />
+<hkern u1="&#xbf;" u2="J" k="6" />
+<hkern u1="&#xde;" u2="&#xc6;" k="74" />
+<hkern u1="&#xde;" u2="&#x7d;" k="51" />
+<hkern u1="&#xde;" u2="]" k="80" />
+<hkern u1="&#xde;" u2="\" k="20" />
+<hkern u1="&#xde;" u2="X" k="66" />
+<hkern u1="&#xde;" u2="W" k="10" />
+<hkern u1="&#xde;" u2="V" k="12" />
+<hkern u1="&#xde;" u2="T" k="115" />
+<hkern u1="&#xde;" u2="&#x3f;" k="63" />
+<hkern u1="&#xde;" u2="&#x2f;" k="61" />
+<hkern u1="&#xde;" u2="&#x2c;" k="166" />
+<hkern u1="&#xde;" u2="&#x29;" k="57" />
+<hkern u1="&#xdf;" u2="&#x2122;" k="39" />
+<hkern u1="&#xdf;" u2="y" k="25" />
+<hkern u1="&#xdf;" u2="w" k="23" />
+<hkern u1="&#xdf;" u2="v" k="23" />
+<hkern u1="&#xdf;" u2="t" k="12" />
+<hkern u1="&#xdf;" u2="f" k="10" />
+<hkern u1="&#xdf;" u2="]" k="16" />
+<hkern u1="&#xdf;" u2="&#x2a;" k="39" />
+<hkern u1="&#xdf;" u2="&#x29;" k="29" />
+<hkern u1="&#xe3;" u2="]" k="-2" />
+<hkern u1="&#xec;" u2="&#x2122;" k="-33" />
+<hkern u1="&#xec;" u2="&#x2a;" k="-31" />
+<hkern u1="&#xed;" u2="&#x2122;" k="-23" />
+<hkern u1="&#xed;" u2="&#x2a;" k="-23" />
+<hkern u1="&#xee;" u2="&#x2122;" k="-141" />
+<hkern u1="&#xee;" u2="&#x201d;" k="-12" />
+<hkern u1="&#xee;" u2="&#x201c;" k="-29" />
+<hkern u1="&#xee;" u2="&#x2019;" k="-12" />
+<hkern u1="&#xee;" u2="&#x2018;" k="-29" />
+<hkern u1="&#xee;" u2="&#x7d;" k="-20" />
+<hkern u1="&#xee;" u2="]" k="-51" />
+<hkern u1="&#xee;" u2="&#x3f;" k="-18" />
+<hkern u1="&#xee;" u2="&#x2a;" k="-102" />
+<hkern u1="&#xee;" u2="&#x27;" k="-12" />
+<hkern u1="&#xee;" u2="&#x22;" k="-16" />
+<hkern u1="&#xef;" u2="&#x2122;" k="-70" />
+<hkern u1="&#xef;" u2="&#x7d;" k="-61" />
+<hkern u1="&#xef;" u2="]" k="-51" />
+<hkern u1="&#xef;" u2="&#x2a;" k="-61" />
+<hkern u1="&#xf0;" u2="&#x2122;" k="45" />
+<hkern u1="&#xf0;" u2="&#x7d;" k="27" />
+<hkern u1="&#xf0;" u2="z" k="10" />
+<hkern u1="&#xf0;" u2="y" k="10" />
+<hkern u1="&#xf0;" u2="x" k="12" />
+<hkern u1="&#xf0;" u2="w" k="8" />
+<hkern u1="&#xf0;" u2="v" k="8" />
+<hkern u1="&#xf0;" u2="]" k="37" />
+<hkern u1="&#xf0;" u2="\" k="29" />
+<hkern u1="&#xf0;" u2="&#x3f;" k="33" />
+<hkern u1="&#xf0;" u2="&#x2c;" k="20" />
+<hkern u1="&#xf0;" u2="&#x2a;" k="49" />
+<hkern u1="&#xf0;" u2="&#x29;" k="53" />
+<hkern u1="&#xf0;" u2="&#x26;" k="18" />
+<hkern u1="&#xf1;" u2="]" k="49" />
+<hkern u1="&#xf2;" u2="&#x201d;" k="193" />
+<hkern u1="&#xf3;" u2="&#x201d;" k="193" />
+<hkern u1="&#xf4;" u2="&#x201d;" k="193" />
+<hkern u1="&#xf5;" u2="&#x201d;" k="193" />
+<hkern u1="&#xf6;" u2="&#x201d;" k="193" />
+<hkern u1="&#xf8;" u2="&#x201d;" k="193" />
+<hkern u1="&#xfb;" u2="]" k="53" />
+<hkern u1="&#xfe;" u2="&#x201d;" k="188" />
+<hkern u1="&#x2018;" u2="&#xff;" k="47" />
+<hkern u1="&#x2018;" u2="&#xfd;" k="63" />
+<hkern u1="&#x2018;" u2="&#xee;" k="-18" />
+<hkern u1="&#x2018;" u2="&#x2e;" k="190" />
+<hkern u1="&#x2018;" u2="&#x2c;" k="190" />
+<hkern u1="&#x2019;" u2="&#xfe;" k="76" />
+<hkern u1="&#x2019;" u2="&#xee;" k="-47" />
+<hkern u1="&#x2019;" u2="&#x40;" k="98" />
+<hkern u1="&#x2019;" u2="&#x2f;" k="98" />
+<hkern u1="&#x2019;" u2="&#x2e;" k="174" />
+<hkern u1="&#x2019;" u2="&#x2c;" k="174" />
+<hkern u1="&#x2019;" u2="&#x2a;" k="-23" />
+<hkern u1="&#x2019;" u2="&#x26;" k="27" />
+<hkern u1="&#x201a;" u2="&#x22;" k="221" />
+<hkern u1="&#x201c;" u2="&#xff;" k="47" />
+<hkern u1="&#x201c;" u2="&#xfd;" k="63" />
+<hkern u1="&#x201c;" u2="&#xee;" k="-18" />
+<hkern u1="&#x201c;" u2="&#x2e;" k="213" />
+<hkern u1="&#x201c;" u2="&#x2c;" k="221" />
+<hkern u1="&#x201d;" u2="&#x153;" k="197" />
+<hkern u1="&#x201d;" u2="&#xfe;" k="76" />
+<hkern u1="&#x201d;" u2="&#xf8;" k="197" />
+<hkern u1="&#x201d;" u2="&#xf6;" k="197" />
+<hkern u1="&#x201d;" u2="&#xf5;" k="197" />
+<hkern u1="&#x201d;" u2="&#xf4;" k="197" />
+<hkern u1="&#x201d;" u2="&#xf3;" k="197" />
+<hkern u1="&#x201d;" u2="&#xf2;" k="197" />
+<hkern u1="&#x201d;" u2="&#xee;" k="-47" />
+<hkern u1="&#x201d;" u2="&#xeb;" k="197" />
+<hkern u1="&#x201d;" u2="&#xea;" k="197" />
+<hkern u1="&#x201d;" u2="&#xe9;" k="197" />
+<hkern u1="&#x201d;" u2="&#xe8;" k="197" />
+<hkern u1="&#x201d;" u2="&#xe7;" k="197" />
+<hkern u1="&#x201d;" u2="&#xe5;" k="197" />
+<hkern u1="&#x201d;" u2="&#xe4;" k="197" />
+<hkern u1="&#x201d;" u2="&#xe3;" k="197" />
+<hkern u1="&#x201d;" u2="&#xe2;" k="197" />
+<hkern u1="&#x201d;" u2="&#xe1;" k="197" />
+<hkern u1="&#x201d;" u2="&#xe0;" k="197" />
+<hkern u1="&#x201d;" u2="q" k="197" />
+<hkern u1="&#x201d;" u2="o" k="197" />
+<hkern u1="&#x201d;" u2="e" k="197" />
+<hkern u1="&#x201d;" u2="d" k="197" />
+<hkern u1="&#x201d;" u2="c" k="197" />
+<hkern u1="&#x201d;" u2="a" k="197" />
+<hkern u1="&#x201d;" u2="&#x2e;" k="213" />
+<hkern u1="&#x201d;" u2="&#x2c;" k="221" />
+<hkern u1="&#x201e;" u2="&#x22;" k="291" />
+<hkern u1="&#x2122;" u2="&#xe6;" k="20" />
+<hkern u1="&#x2122;" u2="&#xc6;" k="59" />
+<hkern u1="&#x2122;" u2="X" k="20" />
+<hkern g1="asterisk" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	k="96" />
+<hkern g1="asterisk" 	g2="m,n,p,r,

<TRUNCATED>
http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/fonts/Cabin-Italic-webfont.ttf
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/fonts/Cabin-Italic-webfont.ttf b/falcon-ui/app/css/fonts/Cabin-Italic-webfont.ttf
new file mode 100644
index 0000000..cae108f
Binary files /dev/null and b/falcon-ui/app/css/fonts/Cabin-Italic-webfont.ttf differ


[10/22] falcon git commit: FALCON-1315 Update falcon ui for HiveDR, secure clusters and bug fixes. Contributed by Armando Reyna/Venkat Ranganathan.

Posted by so...@apache.org.
http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/process/processFormTpl.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/process/processFormTpl.html b/falcon-ui/app/html/process/processFormTpl.html
index 7bf423e..00d2c66 100644
--- a/falcon-ui/app/html/process/processFormTpl.html
+++ b/falcon-ui/app/html/process/processFormTpl.html
@@ -17,79 +17,90 @@
  * limitations under the License.
  */
 -->
-<div class="col-sm-24 entityForm">
-  <div class="col-sm-22 col-sm-offset-2">
+<div class="col-xs-22 col-xs-offset-1 entityForm" id="processFormTmpl">
+  <div class="col-xs-24">
     <div class="row">
-      <h3 id="formTitle" class="col-sm-24">
-        New Process
+
+      <h3 id="formTitle" class="col-xs-24">
+        <span class="entypo cycle icon-lg"></span> New Process
       </h3>
-      <div class="col-sm-15 detailsBox">
 
-        <div class="processProgressBox" ng-class="{
-          general:isActive('forms.process.general'),
-          properties:isActive('forms.process.properties'),
-          clusters:isActive('forms.process.clusters'),
-          inputsAndOutputs: isActive('forms.process.io'),
-          summary:isActive('forms.process.summary')
-          }">
-          <div class="progressBar col-md-24">
-            <div>
-              <span>
-                <div class="fir">1<span class="entypo check"></span></div>
-                <h6>General</h6>
-              </span>
-              <span>
-                <div class="sec">2<span class="entypo check"></span></div>
-                <h6>Properties</h6>
-              </span>
-              <span>
-                <div class="thi">3<span class="entypo check"></span></div>
-                <h6>Clusters</h6>
-              </span>
-              <span>
-                <div class="fou">4<span class="entypo check"></span></div>
-                <h6>Inputs & Outputs</h6>
-              </span>
-              <span>
-                <div class="fif">5<span class="entypo check"></span></div>
-                <h6>Summary</h6>
-              </span>
+      <div ng-class="{'col-xs-12' : propsOpen, 'col-xs-20' : !propsOpen}">
+        <div class="detailsBox">
+          <div class="processProgressBox" ng-class="{
+            general:isActive('forms.process.general'),
+            properties:isActive('forms.process.properties'),
+            clusters:isActive('forms.process.clusters'),
+            inputsAndOutputs: isActive('forms.process.io'),
+            summary:isActive('forms.process.summary')
+            }">
+            <div class="progressBar col-xs-24">
+              <div>
+                <span>
+                  <div class="fir">1<span class="entypo check"></span></div>
+                  <h6>General</h6>
+                </span>
+                <span>
+                  <div class="sec">2<span class="entypo check"></span></div>
+                  <h6>Properties</h6>
+                </span>
+                <span>
+                  <div class="thi">3<span class="entypo check"></span></div>
+                  <h6>Clusters</h6>
+                </span>
+                <span>
+                  <div class="fou">4<span class="entypo check"></span></div>
+                  <h6>Inputs & Outputs</h6>
+                </span>
+                <span>
+                  <div class="fif">5<span class="entypo check"></span></div>
+                  <h6>Summary</h6>
+                </span>
+              </div>
             </div>
           </div>
-        </div>
-       
-        <div class="row">
-          <div class="col-sm-offset-1 col-sm-22">
-            <fieldset id="fieldWrapper" ng-disabled="!editXmlDisabled">
-              <div ui-view class="formViewContainer"></div>
-            </fieldset>
+
+          <div class="row">
+            <div class="col-xs-offset-1 col-xs-22">
+              <fieldset id="fieldWrapper" ng-disabled="!editXmlDisabled">
+                <div ui-view class="formViewContainer"></div>
+              </fieldset>
+            </div>
           </div>
         </div>
-        
       </div>
 
-      <div class="col-sm-8 detailsBox col-sm-offset-1">
-        <div class="row">
+      <div ng-class="{'col-xs-12' : propsOpen, 'col-xs-4' : !propsOpen}">
+        <div class="detailsBox">
+          <div class="row">
 
-          <h5 class="col-xs-13 col-xs-offset-1 noSpecial">XML Preview</h5>  
-          <div class="col-xs-9">
-            <div id="editXmlButton" class="btn btn-default btn-xs pull-right" ng-click="toggleEditXml()" ng-class="{'btn-warning':!editXmlDisabled}">
-              Edit XML
+            <div class="col-xs-13 col-xs-offset-1 noSpecial">
+              <h5><i class="pointer glyphicon" ng-click="propsOpen = !propsOpen" ng-class="propsOpen ? 'glyphicon-minus-sign':'glyphicon-plus-sign'"></i> XML Preview</h5>
+            </div>
+
+            <div ng-if="propsOpen" class="col-xs-9">
+              <button type="button"
+                      id="editXmlButton"
+                      class="btn btn-default btn-xs pull-right"
+                      ng-click="toggleEditXml()"
+                      ng-class="{'btn-warning':!editXmlDisabled}">
+                <div ng-if="editXmlDisabled">Edit XML</div>
+                <div ng-if="!editXmlDisabled">Finish</div>
+              </button>
             </div>
-          </div>
 
-          <div class="col-sm-24">
-            <div class="row">
-              <div class="col-sm-22 col-sm-offset-1">
-                <textarea ng-model="prettyXml" rows="35" class="form-control" ng-disabled="editXmlDisabled">
-                </textarea>
+            <div ng-show="propsOpen" class="col-xs-24">
+              <div class="row">
+                <div class="col-xs-22 col-xs-offset-1" >
+                  <textarea ng-model="prettyXml" class="form-control prettyXml" elastic ng-disabled="editXmlDisabled"></textarea>
+                </div>
               </div>
             </div>
+
           </div>
-          
         </div>
       </div>
-      
+
     </div>
   </div>
 </div>

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/process/processSummary.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/process/processSummary.html b/falcon-ui/app/html/process/processSummary.html
new file mode 100644
index 0000000..e9eb4a4
--- /dev/null
+++ b/falcon-ui/app/html/process/processSummary.html
@@ -0,0 +1,184 @@
+<!--
+/**
+ * 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="summaryBox" id="processFormSummary">
+  <div class="row">
+    <h5 class="col-sm-24">{{entityTypeLabel}}</h5>
+
+    <label class="col-sm-24">Name</label>
+    <label class="col-sm-24 light">{{process.name}}</label>
+
+    <label class="col-sm-24">Tags</label>
+
+    <div class="col-sm-24">
+      <div ng-repeat="tag in process.tags | filter:{key: '!!'}">
+        {{tag.key}} = {{tag.value}}
+      </div>
+      <div ng-show="!hasTags()">No tags selected</div>
+    </div>
+
+    <h5 class="col-sm-24">Access Control List</h5>
+
+    <div class="row">
+      <div class="col-sm-8">
+        <label class="col-sm-24">Owner</label>
+        <label class="col-sm-24 light">{{process.ACL.owner}}</label>
+      </div>
+      <div class="col-sm-8">
+        <label class="col-sm-24">Group</label>
+        <label class="col-sm-24 light">{{process.ACL.group}}</label>
+      </div>
+      <div class="col-sm-8">
+        <label class="col-sm-24">Permissions</label>
+        <label class="col-sm-24 light">{{process.ACL.permission}}</label>
+      </div>
+    </div>
+
+    <h5 class="col-sm-24">Workflow</h5>
+
+    <div class="row">
+      <div class="col-sm-8">
+        <label class="col-sm-24">Name</label>
+        <label class="col-sm-24 light">{{process.workflow.name}}</label>
+      </div>
+      <div class="col-sm-8">
+        <label class="col-sm-24">Engine</label>
+        <label class="col-sm-24 light">{{process.workflow.engine}}</label>
+      </div>
+      <div class="col-sm-8">
+        <label class="col-sm-24">Version</label>
+        <label class="col-sm-24 light">{{process.workflow.version}}</label>
+      </div>
+    </div>
+    <label class="col-sm-24">Path</label>
+    <label class="col-sm-24 light">{{process.workflow.path}}</label>
+
+
+    <h5 class="col-sm-24">Timing</h5>
+    <label class="col-sm-24" ng-if="process.timezone">Timezone</label>
+    <label class="col-sm-24 light">{{process.timezone}}</label>
+
+    <div class="row">
+      <div class="col-sm-8">
+        <label class="col-sm-24">Frequency</label>
+        <label class="col-sm-24 light">Every {{process.frequency.quantity}} {{process.frequency.unit}}</label>
+      </div>
+      <div class="col-sm-8">
+        <label class="col-sm-24">Max. parallel instances</label>
+        <label class="col-sm-24 light">{{process.parallel}}</label>
+      </div>
+      <div class="col-sm-8">
+        <label class="col-sm-24">Order</label>
+        <label class="col-sm-24 light">{{process.order}}</label>
+      </div>
+    </div>
+
+    <h5 class="col-sm-24">Retry</h5>
+
+    <div class="row">
+      <div class="col-sm-8">
+        <label class="col-sm-24">Policy</label>
+        <label class="col-sm-24 light">{{process.retry.policy}}</label>
+      </div>
+      <div class="col-sm-8">
+        <label class="col-sm-24">Attempts</label>
+        <label class="col-sm-24 light">{{process.retry.attempts}}</label>
+      </div>
+      <div class="col-sm-8">
+        <label class="col-sm-24">Delay</label>
+        <label class="col-sm-24 light">Up to {{process.retry.delay.quantity}} {{process.retry.delay.unit}}</label>
+      </div>
+    </div>
+
+
+  </div>
+</div>
+
+<div class="summaryBox">
+  <div class="row">
+    <h5 class="col-sm-24">Clusters</h5>
+
+    <div ng-repeat="cluster in process.clusters">
+      <div class="row col-sm-offset-1 col-sm-22 detailsBox">
+        <label class="col-sm-24">Name</label>
+        <label class="col-sm-24 light">{{cluster.name}}</label>
+
+        <h5 class="col-sm-24">Validity</h5>
+
+        <div class="row">
+          <div class="col-sm-12">
+            <label class="col-sm-24">Start</label>
+            <label class="col-sm-24 light">{{dateFormatter(entity.start)}} Z</label>
+          </div>
+          <div class="col-sm-12">
+            <label class="col-sm-24">End</label>
+            <label class="col-sm-24 light">{{dateFormatter(entity.end)}} Z</label>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
+
+<div class="summaryBox">
+  <div class="row">
+    <h5 class="col-sm-24">Inputs</h5>
+
+    <div ng-repeat="input in process.inputs">
+      <div class="row col-sm-offset-1 col-sm-22 detailsBox">
+        <label class="col-sm-24">Name</label>
+        <label class="col-sm-24 light">{{input.name}}</label>
+        <label class="col-sm-24">Feed</label>
+        <label class="col-sm-24 light">{{input.feed}}</label>
+
+        <h5 class="col-sm-24">Instance</h5>
+
+        <div class="row">
+          <div class="col-sm-12">
+            <label class="col-sm-24">Start</label>
+            <label class="col-sm-24 light">{{input.start}}</label>
+          </div>
+          <div class="col-sm-12">
+            <label class="col-sm-24">End</label>
+            <label class="col-sm-24 light">{{input.end}}</label>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
+
+<div class="summaryBox">
+  <div class="row">
+    <h5 class="col-sm-24">Outputs</h5>
+
+    <div ng-repeat="output in process.outputs">
+      <div class="row col-sm-offset-1 col-sm-22 detailsBox">
+        <label class="col-sm-24">Name</label>
+        <label class="col-sm-24 light">{{output.name}}</label>
+        <label class="col-sm-24">Feed</label>
+        <label class="col-sm-24 light">{{output.feed}}</label>
+
+        <h5 class="col-sm-24">Instance</h5>
+        <label class="col-sm-24">Instance</label>
+        <label class="col-sm-24 light">{{output.outputInstance}}</label>
+      </div>
+    </div>
+  </div>
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/index.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/index.html b/falcon-ui/app/index.html
index 2552194..13fbe35 100644
--- a/falcon-ui/app/index.html
+++ b/falcon-ui/app/index.html
@@ -27,19 +27,18 @@
     <link rel="icon" type="image/x-icon"
       href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAKL2lDQ1BJQ0MgUHJvZmlsZQAASMedlndUVNcWh8+9d3qhzTDSGXqTLjCA9C4gHQRRGGYGGMoAwwxNbIioQEQREQFFkKCAAaOhSKyIYiEoqGAPSBBQYjCKqKhkRtZKfHl57+Xl98e939pn73P32XuftS4AJE8fLi8FlgIgmSfgB3o401eFR9Cx/QAGeIABpgAwWempvkHuwUAkLzcXerrICfyL3gwBSPy+ZejpT6eD/0/SrFS+AADIX8TmbE46S8T5Ik7KFKSK7TMipsYkihlGiZkvSlDEcmKOW+Sln30W2VHM7GQeW8TinFPZyWwx94h4e4aQI2LER8QFGVxOpohvi1gzSZjMFfFbcWwyh5kOAIoktgs4rHgRm4iYxA8OdBHxcgBwpLgvOOYLFnCyBOJDuaSkZvO5cfECui5Lj25qbc2ge3IykzgCgaE/k5XI5LPpLinJqUxeNgCLZ/4sGXFt6aIiW5paW1oamhmZflGo/7r4NyXu7SK9CvjcM4jW94ftr/xS6gBgzIpqs+sPW8x+ADq2AiB3/w+b5iEAJEV9a7/xxXlo4nmJFwhSbYyNMzMzjbgclpG4oL/rfzr8DX3xPSPxdr+Xh+7KiWUKkwR0cd1YKUkpQj49PZXJ4tAN/zzE/zjwr/NYGsiJ5fA5PFFEqGjKuLw4Ubt5bK6Am8Kjc3n/qYn/MOxPWpxrkSj1nwA1yghI3aAC5Oc+gKIQARJ5UNz13/vmgw8F4psXpjqxOPefBf37rnCJ+JHOjfsc5xIYTGcJ+RmLa+JrCdCAACQBFcgDFaABdIEhMANWwBY4AjewAviBYBAO1gIWiAfJgA8yQS7YDApAEdgF9oJKUAPqQSNoASdABzgNLoDL4Dq4Ce6AB2AEjIPnYAa8AfMQBGEhMkSB5CFVSAsygMwgBmQ
 PuUE+UCAUDkVDcRAPEkK50BaoCCqFKqFaqBH6FjoFXYCuQgPQPWgUmoJ+hd7DCEyCqbAyrA0bwwzYCfaGg+E1cBycBufA+fBOuAKug4/B7fAF+Dp8Bx6Bn8OzCECICA1RQwwRBuKC+CERSCzCRzYghUg5Uoe0IF1IL3ILGUGmkXcoDIqCoqMMUbYoT1QIioVKQ21AFaMqUUdR7age1C3UKGoG9QlNRiuhDdA2aC/0KnQcOhNdgC5HN6Db0JfQd9Dj6DcYDIaG0cFYYTwx4ZgEzDpMMeYAphVzHjOAGcPMYrFYeawB1g7rh2ViBdgC7H7sMew57CB2HPsWR8Sp4sxw7rgIHA+XhyvHNeHO4gZxE7h5vBReC2+D98Oz8dn4Enw9vgt/Az+OnydIE3QIdoRgQgJhM6GC0EK4RHhIeEUkEtWJ1sQAIpe4iVhBPE68QhwlviPJkPRJLqRIkpC0k3SEdJ50j/SKTCZrkx3JEWQBeSe5kXyR/Jj8VoIiYSThJcGW2ChRJdEuMSjxQhIvqSXpJLlWMkeyXPKk5A3JaSm8lLaUixRTaoNUldQpqWGpWWmKtKm0n3SydLF0k/RV6UkZrIy2jJsMWyZf5rDMRZkxCkLRoLhQWJQtlHrKJco4FUPVoXpRE6hF1G+o/dQZWRnZZbKhslmyVbJnZEdoCE2b5kVLopXQTtCGaO+XKC9xWsJZsmNJy5LBJXNyinKOchy5QrlWuTty7+Xp8m7yifK75TvkHymgFPQVAhQyFQ4qXFKYVqQq2iqyFAsVTyjeV4KV9JUCldYpHVbqU5pVVlH2UE5V3q98UXlahabiqJKgUqZyVmVKlaJqr8pVLVM9p/qMLkt3oifRK+g99Bk1JTVPNaFarVq/2ry6jnqIep56q/ojDYIGQyNWo0yjW2NGU1XTVzNXs1nzvhZei6EVr7VPq1drTltHO0x7m3aH9qSOnI6XTo5Os85DXbKug26abp3ubT2MHkMvUe+A3k19
 WN9CP16/Sv+GAWxgacA1OGAwsBS91Hopb2nd0mFDkqGTYYZhs+GoEc3IxyjPqMPohbGmcYTxbuNe408mFiZJJvUmD0xlTFeY5pl2mf5qpm/GMqsyu21ONnc332jeaf5ymcEyzrKDy+5aUCx8LbZZdFt8tLSy5Fu2WE5ZaVpFW1VbDTOoDH9GMeOKNdra2Xqj9WnrdzaWNgKbEza/2BraJto22U4u11nOWV6/fMxO3Y5pV2s3Yk+3j7Y/ZD/ioObAdKhzeOKo4ch2bHCccNJzSnA65vTC2cSZ79zmPOdi47Le5bwr4urhWuja7ybjFuJW6fbYXd09zr3ZfcbDwmOdx3lPtKe3527PYS9lL5ZXo9fMCqsV61f0eJO8g7wrvZ/46Pvwfbp8Yd8Vvnt8H67UWslb2eEH/Lz89vg98tfxT/P/PgAT4B9QFfA00DQwN7A3iBIUFdQU9CbYObgk+EGIbogwpDtUMjQytDF0Lsw1rDRsZJXxqvWrrocrhHPDOyOwEaERDRGzq91W7109HmkRWRA5tEZnTdaaq2sV1iatPRMlGcWMOhmNjg6Lbor+wPRj1jFnY7xiqmNmWC6sfaznbEd2GXuKY8cp5UzE2sWWxk7G2cXtiZuKd4gvj5/munAruS8TPBNqEuYS/RKPJC4khSW1JuOSo5NP8WR4ibyeFJWUrJSBVIPUgtSRNJu0vWkzfG9+QzqUvia9U0AV/Uz1CXWFW4WjGfYZVRlvM0MzT2ZJZ/Gy+rL1s3dkT+S453y9DrWOta47Vy13c+7oeqf1tRugDTEbujdqbMzfOL7JY9PRzYTNiZt/yDPJK817vSVsS1e+cv6m/LGtHlubCyQK+AXD22y31WxHbedu799hvmP/jk+F7MJrRSZF5UUfilnF174y/ariq4WdsTv7SyxLDu7C7OLtGtrtsPtoqXRpTunYHt897WX0ssKy13uj9l4tX1Zes4+wT7hvpMKnonO/5v5d+z9UxlfeqXKua
 q1Wqt5RPXeAfWDwoOPBlhrlmqKa94e4h+7WetS212nXlR/GHM44/LQ+tL73a8bXjQ0KDUUNH4/wjowcDTza02jV2Nik1FTSDDcLm6eORR67+Y3rN50thi21rbTWouPguPD4s2+jvx064X2i+yTjZMt3Wt9Vt1HaCtuh9uz2mY74jpHO8M6BUytOdXfZdrV9b/T9kdNqp6vOyJ4pOUs4m3924VzOudnzqeenL8RdGOuO6n5wcdXF2z0BPf2XvC9duex++WKvU++5K3ZXTl+1uXrqGuNax3XL6+19Fn1tP1j80NZv2d9+w+pG503rm10DywfODjoMXrjleuvyba/b1++svDMwFDJ0dzhyeOQu++7kvaR7L+9n3J9/sOkh+mHhI6lH5Y+VHtf9qPdj64jlyJlR19G+J0FPHoyxxp7/lP7Th/H8p+Sn5ROqE42TZpOnp9ynbj5b/Wz8eerz+emCn6V/rn6h++K7Xxx/6ZtZNTP+kv9y4dfiV/Kvjrxe9rp71n/28ZvkN/NzhW/l3x59x3jX+z7s/cR85gfsh4qPeh+7Pnl/eriQvLDwG/eE8/s3BCkeAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QoRBwcQl9gdLAAAFKZJREFUeNrtWnl8VuWVft57vy8LoCCrhCVBAgkJYO04rVinFbVacUck7IshZF9YYlgCWQgge8hGQhLZNwHHilW72epo1bZCHQgJSdg3WXREyPZ99z3P/HFvAlqt1VHAmXl/v/vL78td3vc87znPec65F/j/8X97qKs9Yb/EMpgmXf4uf/2XpWP4RdfcmvKcy0tt7V8Z9b8HgPCk1ajImwwA+EHaJpflaeiroAYrqH8D4AZAAPWEvGIp/Wrl8ugL9n1lqMib9P0FIDyhGBUFMc0gPKKglkAh5PLErCXhBWAAMJRSfQCA5CGh+cD+/MjaAQnF2Os843sFQHBCEW
 oL4hAev2oglHpdKXQgsQtQ60Xkrcqi2A+/MEwSVvc3FZMBToLIzH2Fcc9eeT40Kh9VpYnXNwC3PbMaexZPRmhc4UoFJCmo8g+r/2vyx7+bLZ/xkMQSVORH27E/vRQfLL0c9/1i84OhjBoB/mgQvyfUb6tWxb133XtASGyucWBVioRE5+8DGKQo4VWrU44CQFhMEfYXx33pvQOnlfcSU87sWxxVDwB9o3J7GoY5g4qdQfQA8CMFfABhelVp8svXHQD9IpepyvJp7Bu14ryieudAWcojABAanYeqkqS/u77PpFxVU5bCsISSO5Shtiuo7gAglF/6+7jHvr/s6YsAcP+snb6nLp5PJXC6qb6x0jBkFYiBVBhUUzrl3d4xK3GwOPnaAhA8cYmqXZPKPhOXfqqUsaL6uakZ/WJylbfJYO2aJATHF8Dfx99UUAagoAyFD5ZN8PaZtGKTUhgF4Ncg74RSN0AZZYryMKB+I+QAZaj2IAMB9WZ1acrPAKD35GUdDQt/JLmuds30JX3GL0LNurSvtWbj2zK+54hM1K5JZe8JS97WZEr1c1Mz+k7KNcQC3f72NLWFCdi7IlK37RPO1l0DVasuPe0NUGpaU10dGi5dXOxt8vzWU3epXryeNU0N9S96GurGWh7P0976unu9jY2fNNRfHAIAvZJXwrT4Sc1z0/oTbAyesGRczbo0hKeUXH0P6DV2IQ5vmIle4xZmQKmbDq+bkdJ70nKlRLP2uVQnHa66hSLLDMP4OZRqrZypRaS6ojA2pNvw7P4CvRCG8lFwbTm1NX1t0Jj5/Y9snL3vJwDedubqO34Z6j2XcGJLBvpELoMGcKh8GgInLr6pTbubdMWKqE+vSQj0Gr9oAEWWHNkw8xdB4xapT+vr+PGObIREr+jiaWj8jWm4BkKp9QDeh+J5EAYAAVVHGCqCWp+gwmsH16SuUerrLeuWCctwaO00hKeUJlTkRhWEJ5ehYuV3J54+MwJH5SgA6Dk
 y583PnwsYlXNj4Mh5ZT3GPtvlfzJHWFLZowPiV7X6quv6J5XeF5ZcNvaqe0DgqJwyuF2ZR9fNONFjxCIc32oTUZeR89SZLXMIAD3HLMSxjTO/fPGJJdiXH42whNIQAO0Mhc4EHleKTysoCBApovYY4AVqNijArDjR8SR2Df1MPTEgqfRPe/Oi7uwXX4zKwq9Wj65vTHqjcgDxmjB9A4Xy3vF1M04EjV2IIxsus3Dbzh3YOaXc3JsbqW/o2P6fY2Vl9SaMpwHcrICDJH5JSpBSqtBU8AMA5bJt7h90DkgsOaopiZUFsbtsCS03OOyunPriu8sCx7ZmaWqdcnxzeikAHNkw05Gy5QCA6pVxUErdFJa8+taK3Oi/rxOSr2Bsw8CAxELsy499xWLdCK2xQESqQb4sxOsU+pHynkXebllys1jSV4tMIaW1AfVSeHxxiVNDmLZv85+y4Rt7AAj0GDGvk3K5VrTEauJq7M+fjMqCSPRPKr8NSuYQXFt/ts2u5mt+GvMy3ix+GABQsTIa/aeUdoGg476VURV2tihCRUGcBeAVAK+ExxYNVwpTNPBQVWHcK+GJ5YDhMWi6zlXmReUCyA2LK5oNMCc8vsiPoisAAJZFXK0RllByJRH9y4Ck1bXhSaUtRt+aWvq5CrG818CU8mUDU8o/GTil/O+IITQ6z/4bWxgTGlfIfnH5A1vujS1ouW70oHSExxTZXhdXmBYaV8h+0QUDr2qDIyzOXtCt8Rvd4Yklvw1PLGZ4QtGPv5ily6YPSCk7OjCljANSyhmWVPrTFkkcs8KpI/IUAIROXnlfaEw+Q2Ly4myQV365/I4rtAGLyd8DAP1iCr57w0PiChAWV2AAQFhswcNh8UUMiy862QXpyq79SxUAdHmiSPVPWr1iQHIZBySXXXD+sn9C6UMAEJ5Self/pHJfx/hHr/AChkbnnQKAkJj8r8xWoTH5TgX59Yz/xiSoYBj7ixKkX1xBPoFdpLy1vzCu
 2xnkcEDyaqMiL4oDkkqf6dTDVUfAf+/KSYqU/wQEFF22ryDqV/1TyqYbUD7K4ICB09a0o2acXQGuTKUItGA+ABwoTvzKeK4qtvsDlasSvnsA+kzOV1VFcRISk/+yaEkg+V5lUcK/hcWvMgGAWrqFJ5acJtl6X97kVhV5k2PCE0umAbiLAs++/OioPtHFvorI3Js76XUI2tFjtQYlxJ5BxpNETWlS4XftyV8bgOCJy1GzOpF9o/O2Q/RDJPZUFSfe0S+2wNxfGKvD41dNAHDQUNZt+/InZ4SnlN4BzIQClioKFPUcAPD1NX9FSoFT+t4tYrWlsGfgzgZQGE6i+mpw2NdKg30il6OmfCr6TFoxg5Y1jAqXaspSfhgSm29UrkrQ4QnFawn+tKIgxgcA+ieXPbcvd9LT4fGr8kiCgLeiIHZx/8SSjgq8l8QCO2XL/XD75aKhHj6vFo8HBQDevO4AqCmfiuDIFb0heqECAGX+EAAOrEqU8Piilyly5/6iuPa2JC1bD2G5IxkSQYLgDtgVUKlBQlHvdX6HKk0fUi5ASwoIKKDqagDwT4fALZFLnfC0fg0t0IKi6rIpNXYaKtpC8qH9nZo6OHo8jtS3782PeiM8rvAZW5ESJJf2inxOgfyFkNhbEH/O9gDeoJTVSwmrIfIDUACF+usKgEPl09ErcukD1Lq3gDi4dnq8owOmKnCEAI8iawpD44o6kVKovd77bWmKp0GCJKqK4nf7+TUOVkI/Cg83P1tEINpzp1bqDyICEYEGjesGgL6Ry22P93gzKAICafbOF4SRWEbKu1VF8bsAwDSMPxCsrCxOOBEaW+JLMIQkQL7t7PYkglCgT4uqJiGaQ9jUWAT7Wigt6roBwOPxuABAUwYJiUPr0hYDAIV/IgmAUQAQGl/4AMhwaD5rG+uZQGf3IdzrGHuv/T+pAYCQ6BU3Otf0M0JCTrIFEN3+ugHgyIYZ3lvGLhohloamTWyhMflzSLQlcahyV
 dI++2GqhCDE/eFGO73hcWdDQWC3A0B722CEAMCBkimfOrve5WDmcBHyPzQIKnXndcUBQv2oFg1fl88aZ/ezQYGCJNvStfBHFAmkyP7KlVnOyw/eCggBgYDVfaILO5Bw2U4DT0sIiAZFI2RS7sOmy5VNLSDlAQAIGrfo+gCg0eMJBAzUrn/m7b6TV8YTdl636HrD1sYy1Yn1d+3ipqANya7NHgDijAErQEGgICQl8DIABIUUSvahdWm/g8KnlmXhlqeX3XZkfdp14gHaaq0MtcVZ8RyIBii7a1fHX3SYLAJCkNgDAPB6O0I0IFpBNKpXJ1WRdDvG2qh0f6u5tXAaoALltp+vPmG4TPccEvDW1yVf8xAIGrOgeZGBWnvXhSYUdqSwCwkA6iUACI7Ju8NWeoRX0fEI9bOW+OflEsohQJCCkCG773B8oLIZmMPvbBt/eOPMPCp4LJHxANB/3IprB8CRjbPsDRU57u/jf1wam4Y1WyWWtRUADOHwZqMOFiftdUwdiM8jQN3CiCCgLd3H8Z63QYFzLAcAH9M1SWsLgaPnx+5bP+Xah4CCaji8adZ+EQmlsndbUZ2yw0Pf1uLaLXEt/aiI5qNXXK4bMM/Yd1IIQine5zQy/+ikQlJ0u96RS+85ujl9gzJdf2toalzmNGHNawqA28dd7fTRw5UQimhobNvK6+x2SMu2trQM6a+EUAIoIQwvgsXvxjMQCoSECCAyAgBcbv/dDgCaJOi1ygEgoEPHu7SIf8DI7GnHNqfrawpA30EPjHUYW1MIUs4eXxmre8YW+UDYxTaILakNWgIp9FIEFMIQHVabP9GiyHmKkEJSxKdvVG7vA6VJnxCopohBEVLroF7jnx29Z1VCXWv/Vo81NDYu/VnyZr+uT2WpruMWXn0Auo6ch7dSBl0RDQSAOgDw0U0mKYbj/meviBmBgoICoQgRuc1pf/8VoBvKbl1rj9d5e6FSNWhoUGlbCa4HgGObZr/kdrlzK0
 5U/vn09gxePHfq6gNwesucK1xb6mxes4sVNjb5NGcAUrpfqe+dQ5EARIIAQENW2REgSoQgJBEAhsxM26XISxBqkKTWRtDo+dsA4Oz2rCkCnu0SkZF86dV89J645Np1hET4V5vx2VysKJKg2KF9GQD57AEMtic03wV4GSHRvr0nLnmgMExRGa65mmJqUmmCXm0Nv2XMosEA8PHOnPu04P7uoxcMPLgm9doBYJjmYSe1CQBoBWlJc3LF5z9XpkASEAkAgINrpp0neYg2CygSEMubZqfcmSsUYDnSUIEUj9X4OgC0ezzVPL8966Emj8fvmvYED65J3WJXgOhyV+4rhr/LbTsyBUJB36ilHZwQULSHnd4oCJ645EEAME3XaoiYjhcAwsG9Ji7pap9z3y1CJUKK0NBa0C0ia98nLy7RAcOy1LntmX/u/i0S4dcCoM+E5Y7TGyeF0v5sRY2P+LTytmQGIbyadzjK8QJJ8zIPEJZlTQCA2rXPLBKloEGlQWoS9Hp2AsDRTbPeNl2u1XYY2Oe8Wod3i8h66dSODHZ/Kgsn1s+8NgDUrJ0Kpy+QRxJNTY3GgVWxTQCPOHEN5bV+bCth9aGQhoBoPkgZwss88e+QlkqJFA4KHvdscEBElnliy5xoH9N8WyiqmUo92vtIj5HZy05sz0BARPa1CwEAaNWqzToK4QL/1U75rNBCaBKW19vP9hJzd3MrsKUlqKVN8LhFfQHAz+eGWAK2JiKVFhGPZf3+1LYM7bonDie2ZdzlNl1/0iLKbpNR6puapnYbkb3w1La56D4iW10TAIInLkXV6uQzSqm9mhxnKzmfV1rYXikbFK+3yE6NzRxACAlNnQsAB9YknYHCC6QoJ40qLbpn0JgFT1ivF+Hm4Vnq9POZP/Fxu3fYKVMsEWF9U+OMgIjMRSe2zmXn4XONqw5A7Zrpzga7xmuv924AGD44qARQsNO9BI5K+T3atr3pIgDPFRygAGrLsu65b+EuFwD
 c2KrdeCcjEk4qtSzvCwDw4fMZ7DEqx/xwW+ZTbh/fJ5Rh+AihhJC6Js8zHYfNWX/2+Wy5JiHgtMn2GC7j47DYfL9FEyNA4AMRwhKNdz76y5C9xfEXSbzfXCE4h0nSt7Zi73gAqChLvGSYrgwRKi2AUMHSgu4j570IANrj0Y/NegFnn8988dTOHMPX7d5EEUNE0NTkGdth6Jy/5T1fbQJAtxHZVw+AW8YvRMfHMmAarlENFy/dDABu01UkQlAAj6cpGgB83b4Z1FS27ndqQMKyvN6lzc86vjk92zTMKmkOBZJer/VY4KicYad2ZGPv8SqETFyM4KcyeXZH9phuXbv2cLldiw3TRL2n6db0zWutmyMyHz+5da4t278mQX5jIgmeMB+1a2cDAHqMnIfjW+agy/AMj9babRjGmTPPZ92slEJARNZ5EelwxUwEoHzcPncf2zT7DQCImPmC683aD7xaRAMw7ZJBoWfnTp3+XJh4Pmj0AhzZNAsBI7JxyjEUAALHLHjs/KefDnKbZprL5drtY5hRp7bN3X1VAPii0W1E1rgmj2edUgpul6vfqW2ZVb1Gzp9Q521aA6XYMh8Jl2mePrUtI6BvxCJUb0tDzzGLejQ21h0TinY8UyllnD+3I7vT5+cJGPcs2p47h8pXl322aIvINk5vmyvXBoB7ooDXS9HxyfTzlmV1aOXn/+KpbRlPAEDA8IyTWusA2B9A0gFB+fr6P3hs8+zXuk8owIm1Ceg1dknnS/WfntEiopw60mW69p/ZkRXe6cnZ5rmd87/1nsC39/rpdfs7oNat2jwMw0C9xzO45Q2sr9/DohQ0SUf9KQ3Ao735AKAazwMADm9IPduq9Y3dTdNQIqIEpMfyhHUaNvcvzcb3HLvoOgUAQHDCEhzdMONdH5dPIUXadonI/HGHYXPVsQ0z97hN12KSqqUjRNLr8QYHjp4/5PjWTHQbvQgPvkocXZ968v0F2aZhut4nqQjAo63bOwxN
 ryGJYxvS0H3kvOsTgNqCVASNWajObs9MMAzzhGVZ6z7akc02Q9JwaltGmmkYv7pCHiuCqG9q3AAATY0X1asP2hEZlprGj3bOu93fzy8FUKAmvJYV3H5oel1o5NLeJ7bMgfnAt9Mo/U5eQHYYNtf8aEe2bvv4LHZse0PIwXUzq/1/MRUNry1Hp2Fzq72Wt88VDUTl7+uXdnpbxuIWkhuRA69uwLnt83Hv9DWt/3b4UL6lrYlaCwzDgK+v7/Rzz2cuu24BaB7dxy1sU9/QMPrj7dklPUcvwLFNdou907C57zdZ3h8299YMpVRQ1+7tKw7VXPC8tryFxbuOexan189oeV67oekrSUnyWF64Xe6Pb2rdaujRjelvtGShiGyc3Db3+gCg66gcnN6cbi/8ydn4ZOf8z3nJnDLLa0UC0CRNt8t14KMXckKDxy5RtRtS/+FXYT3HLPjRhbq6DK31YB+321+0TLvBz/fl41vnVgNAj1ELcXzzzGvvAV86Bo0D3lmPbiPnjbtUX79OnE5SK1//hWd2ZM76h1pjVA5OOsACwI1D026EmP3a+rd60ivicbvcG49vmlmF6310Gz1fAcAdc9b6tB+afqD1o2ls/cgzDBiVfR8AdInI+spn9ByZY7Qflu5y/XzKZ16a9Bi9EN+b0fmpDBMAbo7IfKTtE7MutHl0BruNyhnwvTPkm46eoxd85neX4ZlPdBw294OQyLw2V2P+/waCldfgs3UggwAAAABJRU5ErkJggg=="/>
   </head>
-  <body ng-cloak ng-controller="RootCtrl">  
-  
-  <section class="container-fluid">
-    <header class="row" nav-header></header>
-    <server-messages></server-messages>
-  </section>
-  
-  <section class="container-fluid">
-    <div class="row mainUIView" ui-view></div>
-  </section>
-  
-  <script src="js/vendor.min.js"></script>
-  <script src="js/main.min.js"></script>
-  
+  <body ng-cloak ng-controller="RootCtrl" id="body">
+
+    <section class="container-fluid">
+      <header class="row" nav-header id="mainHeader"></header>
+    </section>
+
+    <section class="container-fluid">
+      <div class="row mainUIView" ui-view id="mainUIView"></div>
+    </section>
+
+    <script src="js/vendor.min.js"></script>
+    <script src="js/main.min.js"></script>
+
   </body>
 </html>

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/app.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/app.js b/falcon-ui/app/js/app.js
index 1705cb4..5ae7eb6 100644
--- a/falcon-ui/app/js/app.js
+++ b/falcon-ui/app/js/app.js
@@ -19,15 +19,25 @@
   'use strict';
 
   var app = angular.module('app', [
-    'ui.bootstrap', 'ui.router', 'ngCookies', 'ngAnimate', 'ngMessages', 'checklist-model', 'app.controllers', 'app.directives', 'app.services'
+    'ui.bootstrap',
+    'ui.router',
+    'ngCookies',
+    'ngAnimate',
+    'ngMessages',
+    'checklist-model',
+    'app.controllers',
+    'app.directives',
+    'app.services',
+    'ngTagsInput',
+    'nsPopover', 'ngAnimate', 'ngMask', 'dateHelper'
   ]);
 
   app.config(["$stateProvider", "$urlRouterProvider", "$httpProvider", function ($stateProvider, $urlRouterProvider, $httpProvider) {
-  	
-  	$httpProvider.defaults.headers.common['X-CSRF-Token'] = $('meta[name=csrf-token]').attr('content');
-  	
-  	$httpProvider.defaults.headers.common["X-Requested-By"] = 'X-Requested-By';
-  	
+
+    $httpProvider.defaults.headers.common['X-CSRF-Token'] = $('meta[name=csrf-token]').attr('content');
+
+    $httpProvider.defaults.headers.common["X-Requested-By"] = 'X-Requested-By';
+
     $urlRouterProvider.otherwise("/");
 
     $stateProvider
@@ -36,9 +46,16 @@
         templateUrl: 'html/mainTpl.html',
         controller: 'DashboardCtrl'
       })
-      .state('entityDetails', {
-        controller: 'EntityDetailsCtrl',
-        templateUrl: 'html/entityDetailsTpl.html'
+      .state('authenticating', {
+        templateUrl: 'html/authenticating.html'
+      })
+      .state('login', {
+        controller: 'LoginFormCtrl',
+        templateUrl: 'html/login.html'
+      })
+      .state('entityDefinition', {
+        controller: 'EntityDefinitionCtrl',
+        templateUrl: 'html/entityDefinitionTpl.html'
       })
       .state('forms', {
         templateUrl: 'html/formsTpl.html'
@@ -73,9 +90,9 @@
         templateUrl: 'html/feed/feedFormClustersStepTpl.html',
         controller: 'FeedClustersController',
         resolve: {
-          clustersList: ['Falcon', function(Falcon) {
+          clustersList: ['Falcon', function (Falcon) {
             return Falcon.getEntities('cluster').then(
-              function(response) {
+              function (response) {
                 return response.data;
               });
           }]
@@ -101,9 +118,9 @@
         templateUrl: 'html/process/processFormClustersStepTpl.html',
         controller: 'ProcessClustersCtrl',
         resolve: {
-          clustersList: ['Falcon', function(Falcon) {
+          clustersList: ['Falcon', function (Falcon) {
             return Falcon.getEntities('cluster').then(
-              function(response) {
+              function (response) {
                 return response.data;
               });
           }]
@@ -113,9 +130,9 @@
         templateUrl: 'html/process/processFormInputsAndOutputsStepTpl.html',
         controller: 'ProcessInputsAndOutputsCtrl',
         resolve: {
-          feedsList: ['Falcon', function(Falcon) {
+          feedsList: ['Falcon', function (Falcon) {
             return Falcon.getEntities('feed').then(
-              function(response) {
+              function (response) {
                 return response.data;
               });
           }]
@@ -124,18 +141,201 @@
       .state('forms.process.summary', {
         templateUrl: 'html/process/processFormSummaryStepTpl.html',
         controller: 'ProcessSummaryCtrl'
-      });
-    
+      })
+      .state('entityDetails', {
+        views: {
+          '': {
+            controller: 'EntityDetailsCtrl',
+            templateUrl: 'html/entityDetailsTpl.html'
+          },
+          'feedSummary@entityDetails': {
+            templateUrl: 'html/feed/feedSummary.html'
+          },
+          'processSummary@entityDetails': {
+            templateUrl: 'html/process/processSummary.html'
+          }
+        }
+      })
+      .state('forms.dataset', {
+        controller: 'DatasetCtrl',
+        templateUrl: 'html/dataset/datasetFormTpl.html',
+        resolve: {
+          clustersList: ['Falcon', function (Falcon) {
+            return Falcon.getEntities('cluster').then(
+              function (response) {
+                return response.data.entity;
+              });
+          }]
+        }
+      })
+      .state('forms.dataset.general', {
+        templateUrl: 'html/dataset/datasetFormGeneralStepTpl.html'
+      })
+      .state('forms.dataset.summary', {
+        templateUrl: 'html/dataset/datasetFormSummaryStepTpl.html'
+      })
+      .state('instanceDetails', {
+        templateUrl: 'html/instanceDetails.html',
+        controller: 'InstanceDetailsCtrl'
+      })
+    ;
+
   }]);
 
-  app.run(['$rootScope', 
-           function ($rootScope) {	
-    
-    $rootScope.$on('$stateChangeError',
-      function(event, toState, toParams, fromState, fromParams, error){
-        console.log('Manual log of stateChangeError: ' + error);
+  app.run(['$rootScope', '$state', '$location', '$http', '$stateParams', '$cookieStore', 'SpinnersFlag', 'ServerAPI', '$timeout', '$interval',
+    function ($rootScope, $state, $location, $http, $stateParams, $cookieStore, SpinnersFlag, ServerAPI, $timeout, $interval) {
+
+      if(!$rootScope.secureModeDefined){
+        $rootScope.secureMode = false;
+        ServerAPI.clearUser().then(function() {
+          ServerAPI.getServerConfig().then(function() {
+            if (ServerAPI.data) {
+              ServerAPI.data.properties.forEach(function(property) {
+                if(property.key == 'authentication'){
+                  if(property.value == 'kerberos'){
+                    $rootScope.secureMode = true;
+                  }
+                }
+              });
+            }
+            $rootScope.secureModeDefined = true;
+          });
+        });
+      }
+
+      var location = $location.absUrl();
+      var index = location.indexOf("views/");
+      if (index !== -1) {
+        index = index + 6;
+        var path = location.substring(index);
+        var servicePaths = path.split("/");
+        $rootScope.serviceURI = '/api/v1/views/' + servicePaths[0] + '/versions/' + servicePaths[1] + '/instances/' + servicePaths[2] + '/resources/proxy';
+      }
+
+      $rootScope.ambariView = function () {
+        var location_call = $location.absUrl();
+        var index_call = location_call.indexOf("views/");
+        if (index_call !== -1) {
+          return true;
+        } else {
+          return false;
+        }
+      };
+
+      $rootScope.isSecureMode = function () {
+        if(!$rootScope.secureModeDefined){
+          return false;
+        }else if ($rootScope.secureMode) {
+          return true;
+        }else {
+          return false;
+        }
+      };
+
+      $rootScope.userLogged = function () {
+        if($rootScope.ambariView()){
+          return true;
+        } else {
+          if (angular.isDefined($cookieStore.get('userToken')) && $cookieStore.get('userToken') !== null) {
+            return true;
+          } else {
+            return false;
+          }
+        }
+      };
+
+      //$rootScope.$on('$stateChangeSuccess', function (ev, to, toParams, from, fromParams) {
+      $rootScope.$on('$stateChangeSuccess', function (ev, to, toParams, from) {
+        SpinnersFlag.show = false;
+        SpinnersFlag.backShow = false;
+
+        $rootScope.previousState = from.name;
+        $rootScope.currentState = to.name;
       });
-		
-  }]);
+
+      $rootScope.$on('$stateChangeError',
+        //function(event, toState, toParams, fromState, fromParams, error){
+        function (event, toState, toParams, fromState, error) {
+          console.log('Manual log of stateChangeError: ' + error);
+        });
+
+      var checkRedirect = function(event, toState){
+        if (toState.name !== 'login') {
+          if ($rootScope.ambariView()) {
+
+            if (angular.isDefined($cookieStore.get('userToken')) && $cookieStore.get('userToken') !== null) {
+
+            } else {
+              event.preventDefault();
+              $http.get($rootScope.serviceURI).success(function (data) {
+                var userToken = {};
+                userToken.user = data;
+                $cookieStore.put('userToken', userToken);
+                $state.transitionTo('main');
+              });
+            }
+
+          }else if ($rootScope.secureMode) {
+
+            ServerAPI.getCurrentUser().then(function() {
+              var userToken = {};
+              userToken.user = ServerAPI.user;
+              $cookieStore.put('userToken', userToken);
+              $state.transitionTo('main');
+            });
+
+          }else if ($rootScope.userLogged()) {
+
+            var userToken = $cookieStore.get('userToken');
+            var timeOut = new Date().getTime();
+            timeOut = timeOut - userToken.timeOut;
+            if (timeOut > userToken.timeOutLimit) {
+              $cookieStore.put('userToken', null);
+              event.preventDefault();
+              $state.transitionTo('login');
+            } else {
+              userToken.timeOut = new Date().getTime();
+              $cookieStore.put('userToken', userToken);
+            }
+
+          } else {
+            event.preventDefault();
+            $state.transitionTo('login');
+          }
+        }
+      };
+
+      $rootScope.$on('$stateChangeStart',
+        function (event, toState) {
+          if ($rootScope.userLogged()) {
+            var userToken = $cookieStore.get('userToken');
+            var timeOut = new Date().getTime();
+            timeOut = timeOut - userToken.timeOut;
+            if (timeOut > userToken.timeOutLimit) {
+              $cookieStore.put('userToken', null);
+              event.preventDefault();
+              $state.transitionTo('login');
+            } else {
+              userToken.timeOut = new Date().getTime();
+              $cookieStore.put('userToken', userToken);
+            }
+          }else{
+            var interval;
+            if(!$rootScope.secureModeDefined){
+              if (toState.name !== 'authenticating') {
+                event.preventDefault();
+                $state.transitionTo('authenticating');
+              }
+              interval = $interval(function() {
+                if($rootScope.secureModeDefined){
+                  $interval.cancel(interval);
+                  checkRedirect(event, toState);
+                }
+              }, 1000);
+            }
+          }
+        });
+
+    }]);
 
 })();
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/controllers/cluster/cluster-module.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/controllers/cluster/cluster-module.js b/falcon-ui/app/js/controllers/cluster/cluster-module.js
index d00a937..d0fdf86 100644
--- a/falcon-ui/app/js/controllers/cluster/cluster-module.js
+++ b/falcon-ui/app/js/controllers/cluster/cluster-module.js
@@ -26,9 +26,10 @@
    */
   var clusterModule = angular.module('app.controllers.cluster', [ 'app.services' ]);
 
-  clusterModule.controller('ClusterFormCtrl', [
-    "$scope", "$interval", "Falcon", "EntityModel", "$state", "X2jsService", "ValidationService",
-    function ($scope, $interval, Falcon, EntityModel, $state, X2jsService, validationService) {
+  clusterModule.controller('ClusterFormCtrl', [ "$scope", "$interval", "Falcon", "EntityModel", "$state",
+                                                "X2jsService", "ValidationService", "SpinnersFlag", "$timeout", "$rootScope", "$cookieStore",
+                                              function ($scope, $interval, Falcon, EntityModel, $state,
+                                                        X2jsService, validationService, SpinnersFlag, $timeout, $rootScope, $cookieStore) {
 
       $scope.clusterEntity = EntityModel;
       $scope.xmlPreview = { edit: false };
@@ -62,9 +63,11 @@
         }
         //-------------ACL----------------//
         if (!$scope.clusterEntity.clusterModel.cluster.ACL) {
-          $scope.clusterEntity.clusterModel.cluster.ACL = {
+          angular.copy(EntityModel.defaultValues.cluster.cluster.ACL, $scope.clusterEntity.clusterModel.cluster.ACL);
+          $scope.clusterEntity.clusterModel.cluster.ACL._owner = $cookieStore.get('userToken').user;
+          /*$scope.clusterEntity.clusterModel.cluster.ACL = {
             _owner: "", _group: "", _permission: ""
-          };
+          };*/
         }
         //------------Location------------//
         modelLocationsArray.forEach(function(element) {
@@ -117,20 +120,27 @@
           $scope.removeLocation(lastLocationIndex);
         }
         //deletes ACL if empty
-        if ($scope.clusterEntity.clusterModel.cluster.ACL &&
+        /*if ($scope.clusterEntity.clusterModel.cluster.ACL &&
             $scope.clusterEntity.clusterModel.cluster.ACL._owner === "") {
           delete $scope.clusterEntity.clusterModel.cluster.ACL;
-        }
+        }*/
         //deletes tags if empty
-        if ($scope.clusterEntity.clusterModel.cluster.tags.length === 0) {
+        if (!$scope.clusterEntity.clusterModel.cluster.tags) {
           delete $scope.clusterEntity.clusterModel.cluster.tags;
         }
         //moves properties to be the last element if acl exists
         $scope.arrangeFieldsOrder();
       }
-      $scope.arrangeFieldsOrder = function () {
-        var BK = $scope.clusterEntity.clusterModel.cluster,
-          orderedObj = {};
+      $scope.arrangeFieldsOrder = function (xmlObj) {
+
+        var BK,
+            orderedObj = {};
+
+        if (xmlObj) {
+          BK = xmlObj.cluster;
+        } else {
+          BK = $scope.clusterEntity.clusterModel.cluster;
+        }
 
         orderedObj._xmlns = 'uri:falcon:cluster:0.1';
         orderedObj._name = BK._name;
@@ -161,10 +171,13 @@
       };
       $scope.splitTags = function () {
         $scope.tagsArray = [];
-        $scope.clusterEntity.clusterModel.cluster.tags.split(",").forEach(function (fieldToSplit) {
-          var splittedString = fieldToSplit.split("=");
-          $scope.tagsArray.push({key: splittedString[0], value: splittedString[1]});
-        });
+        if ($scope.clusterEntity.clusterModel.cluster.tags) {
+          $scope.clusterEntity.clusterModel.cluster.tags.split(",").forEach(function (fieldToSplit) {
+            var splittedString = fieldToSplit.split("=");
+            $scope.tagsArray.push({key: splittedString[0], value: splittedString[1]});
+          });
+        }
+
       };
       $scope.addTag = function () {
         $scope.tagsArray.push({key: null, value: null});
@@ -208,17 +221,23 @@
       };
       //--------------------------------------//
       $scope.goSummaryStep = function (formInvalid) {
+        SpinnersFlag.show = true;
         if (!$scope.validations.nameAvailable || formInvalid) {
           validationService.displayValidations.show = true;
           validationService.displayValidations.nameShow = true;
+          SpinnersFlag.show = false;
           return;
         }
         cleanModel();
         $scope.secondStep = true;
         $state.go("forms.cluster.summary");
+        $timeout(function () {
+          angular.element('.nextBtn').trigger('focus');
+        }, 500);
 
       };
       $scope.goGeneralStep = function () {
+        SpinnersFlag.backShow = true;
         $scope.secondStep = false;
         validationService.displayValidations.show = false;
         validationService.displayValidations.nameShow = false;
@@ -239,19 +258,23 @@
         }
       };
       $scope.saveCluster = function () {
+        SpinnersFlag.show = true;
         $scope.saveModelBuffer();
         Falcon.logRequest();
         Falcon.postSubmitEntity($scope.jsonString, "cluster").success(function (response) {
+           $scope.skipUndo = true;
            Falcon.logResponse('success', response, false);
            $state.go('main');
          }).error(function (err) {
+           SpinnersFlag.show = false;
            Falcon.logResponse('error', err, false);
+           angular.element('body, html').animate({scrollTop: 0}, 300);
          });
       };
-    
+
       //--------------------------------------//
       //----------XML preview-----------------//
-    
+
       $scope.xmlPreview.editXML = function () {
         $scope.xmlPreview.edit = !$scope.xmlPreview.edit;
       };
@@ -261,9 +284,15 @@
         $scope.xml = xmlStr;
       };
       $scope.transformBack = function() {
+
         try {
           var xmlObj = X2jsService.xml_str2json($scope.prettyXml);
-          $scope.clusterEntity.clusterModel = xmlObj;
+
+          if (!xmlObj.cluster.ACL || !xmlObj.cluster.ACL._owner || !xmlObj.cluster.ACL._group || !xmlObj.cluster.ACL._permission) {
+            xmlObj.cluster.ACL = angular.copy(EntityModel.defaultValues.cluster.cluster.ACL);
+          }
+
+          $scope.arrangeFieldsOrder(xmlObj);
 
           if($scope.clusterEntity.clusterModel.cluster.properties && $scope.clusterEntity.clusterModel.cluster.properties.property[0] === '') {
             $scope.clusterEntity.clusterModel.cluster.properties.property=[];
@@ -272,6 +301,7 @@
         catch(err) {
           console.log('xml malformed');
         }
+
       };
       $scope.saveModelBuffer = function () {
         $scope.jsonString = angular.toJson($scope.clusterEntity.clusterModel);
@@ -294,6 +324,24 @@
       }
       var refresher = $interval(xmlPreviewCallback, 1000);
 
+      $scope.skipUndo = false;
+      $scope.$on('$destroy', function () {
+        var model = angular.copy($scope.clusterEntity.clusterModel.cluster),
+            defaultModel = angular.toJson(EntityModel.defaultValues.cluster.cluster);
+
+        model.interfaces.interface.forEach(function (item, index) {
+          if (item._type === "registry" && item._endpoint === "" && item._version === "") {
+            model.interfaces.interface.splice(index, 1);
+          }
+        });
+
+        model = angular.toJson(model);
+
+        if (!$scope.skipUndo && !angular.equals(model, defaultModel)) {
+          $interval.cancel(refresher);
+          $scope.$parent.cancel('cluster', $rootScope.previousState);
+        }
+      });
 
       //------------init------------//
       normalizeModel();

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/controllers/controllers.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/controllers/controllers.js b/falcon-ui/app/js/controllers/controllers.js
index 9fa878e..4867851 100644
--- a/falcon-ui/app/js/controllers/controllers.js
+++ b/falcon-ui/app/js/controllers/controllers.js
@@ -17,8 +17,9 @@
  */
 (function () {
   'use strict';
-  
+
   angular.module('app.controllers', [
+                                      'app.controllers.login',
                                       'app.controllers.navHeader',
                                       'app.controllers.rootCtrl',
                                       'app.controllers.dashboardCtrl',
@@ -26,7 +27,9 @@
                                       'app.controllers.cluster',
                                       'app.controllers.feed',
                                       'app.controllers.process',
-                                      'app.controllers.entity'   
+                                      'app.controllers.entity',
+                                      'app.controllers.instance',
+                                      'app.controllers.dataset'
                                     ]);
 
 })();

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/controllers/dashboard-controller.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/controllers/dashboard-controller.js b/falcon-ui/app/js/controllers/dashboard-controller.js
index bd60736..7a8d1b4 100644
--- a/falcon-ui/app/js/controllers/dashboard-controller.js
+++ b/falcon-ui/app/js/controllers/dashboard-controller.js
@@ -21,79 +21,103 @@
   var dashboardCtrlModule = angular.module('app.controllers.dashboardCtrl', ['app.services']);
 
   dashboardCtrlModule.controller('DashboardCtrl', [ "$scope", "Falcon", "EntityModel", "FileApi", "$state", "X2jsService",
-    function ($scope, Falcon, EntityModel, FileApi, $state, X2jsService) {
-      
-      $scope.$parent.refreshLists();
+      "$timeout", function ($scope, Falcon, EntityModel, FileApi, $state, X2jsService, $timeout) {
+
+      $scope.$parent.refreshList();
+
+      $timeout(function() {
+        angular.element('#nsPopover').trigger('click');
+      }, 1000);
+
+      $scope.focusSearch = function () {
+        $scope.$parent.refreshList($scope.tags);
+      };
 
       $scope.deleteEntity = function (type, name) {
         type = type.toLowerCase(); //new sandbox returns uppercase type
         Falcon.logRequest();
         Falcon.deleteEntity(type, name)
-          .success(function (data) {          
-            Falcon.logResponse('success', data, type);           
-            $scope.$parent.refreshList(type);              
+          .success(function (data) {
+            Falcon.logResponse('success', data, type);
+            $scope.$parent.refreshList($scope.tags);
           })
           .error(function (err) {
-            
+
             Falcon.logResponse('error', err, type);
           });
       };
       $scope.cloneEntity = function (type, name) {
         type = type.toLowerCase(); //new sandbox returns uppercase type
-        
+
         Falcon.logRequest();
         Falcon.getEntityDefinition(type, name)
           .success(function (data) {
             Falcon.logResponse('success', data, false, true);
             var modelName = type + "Model",
                 entityModel = X2jsService.xml_str2json(data);
-                
-            EntityModel[modelName] = entityModel;
-            EntityModel[modelName][type]._name = "";
-            $scope.models[modelName] = angular.copy(entityModel);
-            $scope.cloningMode = true; // dont know utility of this
-            $scope.$parent.cloningMode = true;
-            $state.go('forms.' + type + ".general");
+
+            if (entityModel.process && entityModel.process.tags && entityModel.process.tags.search('_falcon_mirroring_type') !== -1) {
+
+              entityModel.process.name = "";
+              EntityModel.datasetModel.toImportModel = entityModel;
+              $scope.$parent.cloningMode = true;
+              $state.go('forms.dataset.general');
+
+            } else {
+              EntityModel[modelName] = entityModel;
+              EntityModel[modelName][type]._name = "";
+              $scope.models[modelName] = angular.copy(entityModel);
+              $scope.cloningMode = true; // dont know utility of this
+              $scope.$parent.cloningMode = true;
+              $state.go('forms.' + type + ".general");
+            }
           })
           .error(function (err) {
             Falcon.logResponse('error', err, false, true);
           });
       };
-      $scope.editEntity = function (type, name) {        
+      $scope.editEntity = function (type, name) {
         type = type.toLowerCase(); //new sandbox returns uppercase type
-        
+
         Falcon.logRequest();
         Falcon.getEntityDefinition(type, name)
           .success(function (data) {
             Falcon.logResponse('success', data, false, true);
             var entityModel = X2jsService.xml_str2json(data);
             var modelName = type + "Model";
-            EntityModel[modelName] = entityModel;
-            $scope.models[modelName] = angular.copy(entityModel);
-            $scope.editingMode = true;// dont know utility of this
-            $scope.$parent.cloningMode = false;
-            $state.go('forms.' + type + ".general");
+
+            if (entityModel.process && entityModel.process.tags.search('_falcon_mirroring_type') !== -1) {
+
+              EntityModel.datasetModel.toImportModel = entityModel;
+              $scope.$parent.cloningMode = false;
+              $state.go('forms.dataset.general');
+
+            } else {
+              EntityModel[modelName] = entityModel;
+              $scope.models[modelName] = angular.copy(entityModel);
+              $scope.editingMode = true;// dont know utility of this
+              $scope.$parent.cloningMode = false;
+              $state.go('forms.' + type + ".general");
+            }
           })
           .error(function (err) {
             Falcon.logResponse('error', err, false, true);
           });
       };
       //-----------------------------------------//
-      $scope.entityDetails = function (name, type) {
+      $scope.entityDefinition = function (name, type) {
+
     	  type = type.toLowerCase(); //new sandbox returns uppercase type
-    	  
+
     	  Falcon.logRequest();
           Falcon.getEntityDefinition(type, name)
             .success(function (data) {
               Falcon.logResponse('success', data, false, true);
               var entityModel = X2jsService.xml_str2json(data);
-              var modelName = type + "Model";
-              EntityModel[modelName] = entityModel;
-              $scope.models[modelName] = angular.copy(entityModel);
-              $scope.editingMode = true;// dont know utility of this
-              $scope.$parent.cloningMode = false;
-              //$state.go('forms.' + type + ".general");
-              $state.go('entityDetails');
+              EntityModel.type = type;
+              EntityModel.name = name;
+              EntityModel.model = entityModel;
+              $state.go('entityDefinition');
             })
             .error(function (err) {
               Falcon.logResponse('error', err, false, true);
@@ -104,7 +128,7 @@
         Falcon.logRequest();
         Falcon.postResumeEntity(type, name).success(function (data) {
           Falcon.logResponse('success', data, type);
-          $scope.$parent.refreshList(type);      
+          $scope.$parent.refreshList($scope.tags);
         })
         .error(function (err) {
           Falcon.logResponse('error', err, type);
@@ -114,7 +138,7 @@
         Falcon.logRequest();
         Falcon.postScheduleEntity(type, name).success(function (data) {
           Falcon.logResponse('success', data, type);
-          $scope.$parent.refreshList(type);      
+          $scope.$parent.refreshList($scope.tags);
         })
         .error(function (err) {
           Falcon.logResponse('error', err, type);
@@ -125,19 +149,72 @@
         Falcon.logRequest();
         Falcon.postSuspendEntity(type, name)
           .success(function (message) {
-            Falcon.logResponse('success', message, type);           
-            $scope.$parent.refreshList(type);      
+            Falcon.logResponse('success', message, type);
+              $scope.$parent.refreshList($scope.tags);
           })
           .error(function (err) {
             Falcon.logResponse('error', err, type);
-            
+
           });
       };
+
+      $scope.loadTags = function(query) {
+        var tags = new Array();
+        if(!$scope.$parent.nameFounded){
+          tags.push({ text: 'Name:' + query });
+        }
+        if(!$scope.$parent.typeFounded){
+          var queryAux = query.toUpperCase();
+          if(queryAux === "F" || queryAux === "FE" || queryAux === "FEE" || queryAux === "FEED"){
+            tags.push({ text: 'Type:feed'});
+          }
+          if(queryAux === "P" || queryAux === "PR" || queryAux === "PRO" || queryAux === "PROC" || queryAux === "PROCE"
+              || queryAux === "PROCES" || queryAux === "PROCESS"){
+            tags.push({ text: 'Type:process'});
+          }
+          if(queryAux === "M" || queryAux === "MI" || queryAux === "MIR" || queryAux === "MIRR" || queryAux === "MIRRO"
+              || queryAux === "MIRROR"){
+            tags.push({ text: 'Type:mirror'});
+          }
+        }
+        if(query !== "*"){
+          tags.push({ text: 'Tag:' + query });
+        }
+        return tags;
+      };
+
       $scope.relationsEntity = function (type, name) {
         console.log("relations " + type + " - " + name);
       };
-      
-      
+
+      $scope.displayResults = function () {
+        $scope.$parent.refreshList($scope.tags);
+      };
+
+      $scope.entityDetails = function (name, type) {
+
+        type = type.toLowerCase(); //new sandbox returns uppercase type
+
+        Falcon.logRequest();
+        Falcon.getEntityDefinition(type, name)
+            .success(function (data) {
+              Falcon.logResponse('success', data, false, true);
+              var entityModel = X2jsService.xml_str2json(data);
+              EntityModel.type = type;
+              EntityModel.name = name;
+              EntityModel.model = entityModel;
+              $state.go('entityDetails');
+            })
+            .error(function (err) {
+              Falcon.logResponse('error', err, false, true);
+            });
+      };
+
+      $scope.clearTags = function(){
+        $scope.tags = [];
+        $scope.$parent.refreshList($scope.tags);
+      };
+
     }]);
 
 })();
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/controllers/dataset/dataset-controller.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/controllers/dataset/dataset-controller.js b/falcon-ui/app/js/controllers/dataset/dataset-controller.js
new file mode 100644
index 0000000..a28cd77
--- /dev/null
+++ b/falcon-ui/app/js/controllers/dataset/dataset-controller.js
@@ -0,0 +1,642 @@
+/**
+ * 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.
+ */
+(function () {
+  'use strict';
+
+  var datasetModule = angular.module('app.controllers.dataset', [ 'app.services' ]);
+
+  datasetModule.controller('DatasetCtrl', [
+    "$scope", "$interval", "Falcon", "EntityModel", "$state", "X2jsService", "DateHelper",
+    "ValidationService", "SpinnersFlag", "$timeout", "$rootScope", "clustersList", "$cookieStore",
+    function ($scope, $interval, Falcon, EntityModel, $state, X2jsService, DateHelper,
+              validationService, SpinnersFlag, $timeout, $rootScope, clustersList, $cookieStore) {
+
+
+      $scope.skipUndo = false;
+      $scope.$on('$destroy', function () {
+
+        if (!$scope.skipUndo && !angular.equals($scope.UIModel, EntityModel.defaultValues.MirrorUIModel)) {
+          $scope.$parent.cancel('dataset', $rootScope.previousState);
+        }
+      });
+
+      $scope.isActive = function (route) {
+        return route === $state.current.name;
+      };
+
+      $scope.isCompleted = function (route) {
+        return $state.get(route).data && $state.get(route).data.completed;
+      };
+
+      $scope.clone = $scope.$parent.cloningMode;
+
+      if (!clustersList) {
+        $scope.clustersList = [];
+      } else if (clustersList.type) { // is an object
+        $scope.clustersList = [clustersList];
+      } else {
+        $scope.clustersList = clustersList;
+      }
+
+      $scope.switchModel = function (type) {
+        $scope.model = EntityModel.datasetModel[type].process;
+        $scope.UIModel.formType = type;
+        $scope.completeModel = EntityModel.datasetModel[type];
+        switchTag(type);
+        checkClusters();
+      };
+      $scope.model = EntityModel.datasetModel.HDFS.process;
+      $scope.UIModel = EntityModel.datasetModel.UIModel;
+      $scope.completeModel = EntityModel.datasetModel.HDFS;
+
+      $scope.UIModel.acl.owner = $cookieStore.get('userToken').user;
+
+      //-------------------------//
+      function checkClusters() {
+        if ($scope.UIModel.source.cluster && $scope.UIModel.formType === 'HIVE') {
+          $scope.getSourceDefinition();
+        }
+        if ($scope.UIModel.target.cluster && $scope.UIModel.formType === 'HIVE') {
+          $scope.getTargetDefinition();
+        }
+      }
+      $scope.checkFromSource = function () {
+        if ($scope.UIModel.source.location !== "HDFS") {
+          $scope.UIModel.target.location = "HDFS";
+          $scope.UIModel.runOn = 'target';
+        }
+      };
+      $scope.checkFromTarget = function () {
+        if ($scope.UIModel.target.location !== "HDFS") {
+          $scope.UIModel.source.location = "HDFS";
+          $scope.UIModel.runOn = 'source';
+        }
+      };
+      //----------------TAGS---------------------//
+      $scope.addTag = function () {
+        if ($scope.UIModel.tags.newTag.value === "_falcon_mirroring_type") {
+          return;
+        }
+        $scope.UIModel.tags.tagsArray.push($scope.UIModel.tags.newTag);
+        $scope.UIModel.tags.newTag = {value: "", key: ""};
+        $scope.convertTags();
+      };
+      $scope.removeTag = function (index) {
+        $scope.UIModel.tags.tagsArray.splice(index, 1);
+        $scope.convertTags();
+      };
+      function switchTag (type) {
+        $scope.UIModel.tags.tagsArray.forEach(function (item) {
+          if (item.key === "_falcon_mirroring_type") {
+            item.value = type;
+          }
+        });
+      }
+      $scope.convertTags = function () {
+        var result = [];
+        $scope.UIModel.tags.tagsArray.forEach(function (element) {
+          if (element.key && element.value) {
+            result.push(element.key + "=" + element.value);
+          }
+        });
+        result = result.join(",");
+        $scope.UIModel.tags.tagsString = result;
+      };
+      $scope.splitTags = function () {
+        $scope.UIModel.tags.tagsArray = [];
+        $scope.UIModel.tags.tagsString.split(",").forEach(function (fieldToSplit) {
+          var splittedString = fieldToSplit.split("=");
+          $scope.UIModel.tags.tagsArray.push({key: splittedString[0], value: splittedString[1]});
+        });
+      };
+      //----------- Alerts -----------//
+      $scope.addAlert = function () {
+        $scope.UIModel.alerts.alertsArray.push($scope.UIModel.alerts.alert.email);
+        $scope.UIModel.alerts.alert = {email: ""};
+      };
+      $scope.removeAlert = function (index) {
+        $scope.UIModel.alerts.alertsArray.splice(index, 1);
+      };
+      //----------------- DATE INPUTS -------------------//
+      $scope.dateFormat = 'MM/dd/yyyy';
+
+      $scope.openStartDatePicker = function ($event) {
+        $event.preventDefault();
+        $event.stopPropagation();
+        $scope.startOpened = true;
+      };
+      $scope.openEndDatePicker = function ($event) {
+        $event.preventDefault();
+        $event.stopPropagation();
+        $scope.endOpened = true;
+      };
+
+      $scope.constructDate = function () {
+
+        if ($scope.UIModel.validity.start && $scope.UIModel.validity.end && $scope.UIModel.validity.startTime && $scope.UIModel.validity.endTime) {
+          $scope.UIModel.validity.startISO = DateHelper.createISO($scope.UIModel.validity.start, $scope.UIModel.validity.startTime, $scope.UIModel.validity.tz);
+          $scope.UIModel.validity.endISO = DateHelper.createISO($scope.UIModel.validity.end, $scope.UIModel.validity.endTime, $scope.UIModel.validity.tz);
+        }
+
+      };
+      $scope.$watch(function () {
+        return $scope.UIModel.validity.tz;
+      }, function () {
+        return $scope.constructDate();
+      });
+
+      //-------------------------------------//
+
+      $scope.goNext = function (formInvalid, stateName) {
+        $state.current.data = $state.current.data || {};
+        $state.current.data.completed = !formInvalid;
+
+        SpinnersFlag.show = true;
+        if (!validationService.nameAvailable || formInvalid) {
+          validationService.displayValidations.show = true;
+          validationService.displayValidations.nameShow = true;
+          SpinnersFlag.show = false;
+          angular.element('body, html').animate({scrollTop: 0}, 500);
+          return;
+        }
+        validationService.displayValidations.show = false;
+        validationService.displayValidations.nameShow = false;
+        $scope.convertTags();
+        createXML();
+        $state.go(stateName);
+        angular.element('body, html').animate({scrollTop: 0}, 500);
+      };
+
+      $scope.goBack = function (stateName) {
+        SpinnersFlag.backShow = true;
+        validationService.displayValidations.show = false;
+        validationService.displayValidations.nameShow = false;
+        $state.go(stateName);
+        angular.element('body, html').animate({scrollTop: 0}, 500);
+      };
+
+      $scope.sourceClusterModel = {};
+      $scope.targetClusterModel = {};
+
+      $scope.getSourceDefinition = function () { // only fills general step info, rest of operations performed in createXml
+        Falcon.getEntityDefinition("cluster", $scope.UIModel.source.cluster)
+          .success(function (data) {
+            $scope.sourceClusterModel = X2jsService.xml_str2json(data);
+            if (!EntityModel.datasetModel.UIModel.hiveOptions.source.stagingPath && EntityModel.datasetModel.UIModel.formType === 'HIVE') {
+              EntityModel.datasetModel.UIModel.hiveOptions.source.stagingPath = findLocation($scope.sourceClusterModel.cluster.locations.location, 'staging');
+            }
+            if (!EntityModel.datasetModel.UIModel.hiveOptions.source.hiveServerToEndpoint && EntityModel.datasetModel.UIModel.formType === 'HIVE') {
+              EntityModel.datasetModel.UIModel.hiveOptions.source.hiveServerToEndpoint = replaceHive(findInterface($scope.sourceClusterModel.cluster.interfaces.interface, 'registry'));
+            }
+
+          })
+          .error(function (err) {
+            $scope.UIModel.source.cluster = "";
+            Falcon.logResponse('error', err, false, true);
+          });
+      };
+      $scope.getTargetDefinition = function () {
+        Falcon.getEntityDefinition("cluster", $scope.UIModel.target.cluster)
+          .success(function (data) {
+            $scope.targetClusterModel = X2jsService.xml_str2json(data);
+            if (!EntityModel.datasetModel.UIModel.hiveOptions.target.stagingPath && EntityModel.datasetModel.UIModel.formType === 'HIVE') {
+              EntityModel.datasetModel.UIModel.hiveOptions.target.stagingPath = findLocation($scope.targetClusterModel.cluster.locations.location, 'staging');
+            }
+            if (!EntityModel.datasetModel.UIModel.hiveOptions.target.hiveServerToEndpoint && EntityModel.datasetModel.UIModel.formType === 'HIVE') {
+              EntityModel.datasetModel.UIModel.hiveOptions.target.hiveServerToEndpoint = replaceHive(findInterface($scope.targetClusterModel.cluster.interfaces.interface, 'registry'));
+            }
+          })
+          .error(function (err) {
+            $scope.UIModel.target.cluster = "";
+            Falcon.logResponse('error', err, false, true);
+          });
+      };
+
+      function findLocation (array, locationString) {
+        var loc = "";
+        array.forEach(function (item) {
+          if (item._name === locationString) {
+            loc = item._path;
+          }
+        });
+        return loc;
+      }
+      function findInterface(array, interfaceString) {
+        var inter = "";
+        array.forEach(function (item) {
+          if (item._type === interfaceString) {
+            inter = item._endpoint;
+          }
+        });
+        return inter;
+      }
+
+      function replaceHive(string) {
+        if (string) {
+          var splitted = string.split(':');
+          var uri = 'hive2' + ':' + splitted[1] + ':10000';
+          return uri;
+        }
+      }
+
+      function createXML() {
+        $scope.model._name = $scope.UIModel.name;
+        $scope.model.tags = $scope.UIModel.tags.tagsString;
+        $scope.model.retry._policy = $scope.UIModel.retry.policy;
+        $scope.model.retry._delay = $scope.UIModel.retry.delay.unit + '(' + $scope.UIModel.retry.delay.number + ')';
+        $scope.model.retry._attempts = $scope.UIModel.retry.attempts;
+        $scope.model.ACL._owner = $scope.UIModel.acl.owner;
+        $scope.model.ACL._group = $scope.UIModel.acl.group;
+        $scope.model.ACL._permission = $scope.UIModel.acl.permissions;
+        $scope.model.frequency = $scope.UIModel.frequency.unit + '(' + $scope.UIModel.frequency.number + ')';
+        $scope.model.clusters.cluster[0].validity._start = $scope.UIModel.validity.startISO;
+        $scope.model.clusters.cluster[0].validity._end = $scope.UIModel.validity.endISO;
+        $scope.model.timezone = $scope.UIModel.validity.tz;
+        if ($scope.UIModel.formType === 'HDFS') {
+
+          if ($scope.UIModel.runOn === "source") {
+            $scope.model.clusters.cluster[0]._name = $scope.UIModel.source.cluster;
+          } else {
+            $scope.model.clusters.cluster[0]._name = $scope.UIModel.target.cluster;
+          }
+
+          $scope.model.workflow._name = $scope.UIModel.name + '-WF';
+
+          $scope.model.properties.property.forEach(function (item) {
+            if (item._name === 'distcpMaxMaps') {
+              item._value = $scope.UIModel.allocation.hdfs.maxMaps;
+            }
+            if (item._name === 'distcpMapBandwidth') {
+              item._value = $scope.UIModel.allocation.hdfs.maxBandwidth;
+            }
+            if (item._name === 'drSourceDir') {
+              item._value = $scope.UIModel.source.path;
+            }
+            if (item._name === 'drTargetDir') {
+              item._value = $scope.UIModel.target.path;
+            }
+            if (item._name === 'drSourceClusterFS') {
+              if ($scope.UIModel.source.location === 'HDFS') {
+                item._value = findInterface($scope.sourceClusterModel.cluster.interfaces.interface, 'write');
+              } else {
+                item._value = $scope.UIModel.source.url;
+              }
+            }
+            if (item._name === 'drTargetClusterFS') {
+              if ($scope.UIModel.target.location === 'HDFS') {
+                item._value = findInterface($scope.targetClusterModel.cluster.interfaces.interface, 'write');
+              } else {
+                item._value = $scope.UIModel.target.url;
+              }
+            }
+            if (item._name === 'drNotificationReceivers') {
+              item._value = (function () {
+                if ($scope.UIModel.alerts.alertsArray.length === 0) {
+                  return "NA";
+                } else {
+                  return $scope.UIModel.alerts.alertsArray.join();
+                }
+              }());
+            }
+            if (item._name === 'sourceCluster') {
+              if ($scope.UIModel.source.location === 'HDFS') { item._value = $scope.UIModel.source.cluster; }
+              else { item._value = ""; }
+            }
+            if (item._name === 'targetCluster') {
+              if ($scope.UIModel.target.location === 'HDFS') { item._value = $scope.UIModel.target.cluster; }
+              else { item._value = ""; }
+            }
+          });
+
+        } else if ($scope.UIModel.formType === 'HIVE') {
+
+          $scope.model.clusters.cluster[0]._name = $scope.UIModel.source.cluster;
+          $scope.model.properties.property.forEach(function (item) {
+            if (item._name === 'distcpMaxMaps') {
+              item._value = $scope.UIModel.allocation.hive.maxMapsDistcp;
+            }
+            if (item._name === 'distcpMapBandwidth') {
+              item._value = $scope.UIModel.allocation.hive.maxBandwidth;
+            }
+            if (item._name === 'sourceCluster') {
+              item._value = $scope.UIModel.source.cluster;
+            }
+            if (item._name === 'targetCluster') {
+              item._value = $scope.UIModel.target.cluster;
+            }
+            if (item._name === 'sourceHiveServer2Uri') {
+              item._value = $scope.UIModel.hiveOptions.source.hiveServerToEndpoint;
+            }
+            if (item._name === 'targetHiveServer2Uri') {
+              item._value = $scope.UIModel.hiveOptions.target.hiveServerToEndpoint;
+            }
+            if (item._name === 'sourceStagingPath') {
+              item._value = $scope.UIModel.hiveOptions.source.stagingPath;
+            }
+            if (item._name === 'targetStagingPath') {
+              item._value = $scope.UIModel.hiveOptions.target.stagingPath;
+            }
+            if (item._name === 'sourceNN') {
+              item._value = findInterface($scope.sourceClusterModel.cluster.interfaces.interface, 'write');
+            }
+            if (item._name === 'targetNN') {
+              item._value = findInterface($scope.targetClusterModel.cluster.interfaces.interface, 'write');
+            }
+            if (item._name === 'sourceMetastoreUri') {
+              item._value = findInterface($scope.sourceClusterModel.cluster.interfaces.interface, 'registry');
+            }
+            if (item._name === 'targetMetastoreUri') {
+              item._value = findInterface($scope.targetClusterModel.cluster.interfaces.interface, 'registry');
+            }
+            if (item._name === 'sourceTable') {
+              if ($scope.UIModel.source.hiveDatabaseType === "databases") {
+                item._value = "*";
+              } else {
+                item._value = $scope.UIModel.source.hiveTables;
+              }
+            }
+            if (item._name === 'sourceDatabase') {
+              if ($scope.UIModel.source.hiveDatabaseType === "databases") {
+                item._value = $scope.UIModel.source.hiveDatabases;
+              } else {
+                item._value = $scope.UIModel.source.hiveDatabase;
+              }
+            }
+            if (item._name === 'maxEvents') {
+              item._value = $scope.UIModel.allocation.hive.maxMapsEvents;
+            }
+            if (item._name === 'replicationMaxMaps') {
+              item._value = $scope.UIModel.allocation.hive.maxMapsMirror;
+            }
+            if (item._name === 'clusterForJobRun') {
+              if ($scope.UIModel.runOn === "source") {
+                item._value = $scope.UIModel.source.cluster;
+              } else {
+                item._value = $scope.UIModel.target.cluster;
+              }
+            }
+            if (item._name === 'clusterForJobRunWriteEP') {
+              if ($scope.UIModel.runOn === "source") {
+                item._value = findInterface($scope.sourceClusterModel.cluster.interfaces.interface, 'write');
+              } else {
+                item._value = findInterface($scope.targetClusterModel.cluster.interfaces.interface, 'write');
+              }
+            }
+            if (item._name === 'drJobName') {
+              item._value = $scope.UIModel.name;
+            }
+            if (item._name === 'drNotificationReceivers') {
+              item._value = (function () {
+                if ($scope.UIModel.alerts.alertsArray.length === 0) {
+                  return "NA";
+                } else {
+                  return $scope.UIModel.alerts.alertsArray.join();
+                }
+              }());
+            }
+
+          });
+
+        } else {
+          console.log('error in form type');
+        }
+
+        $scope.xmlString = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' + X2jsService.json2xml_str($scope.completeModel);
+
+      }
+
+      $scope.save = function () {
+        SpinnersFlag.show = true;
+
+        if(!$scope.$parent.cloningMode) {
+          Falcon.postUpdateEntity($scope.xmlString, 'process', $scope.model._name)
+            .success(function (response) {
+              $scope.skipUndo = true;
+              Falcon.logResponse('success', response, false);
+              $state.go('main');
+
+            })
+            .error(function (err) {
+              SpinnersFlag.show = false;
+              Falcon.logResponse('error', err, false);
+              angular.element('body, html').animate({scrollTop: 0}, 300);
+            });
+        } else {
+          Falcon.postSubmitEntity($scope.xmlString, 'process')
+            .success(function (response) {
+              $scope.skipUndo = true;
+              Falcon.logResponse('success', response, false);
+              $state.go('main');
+            })
+            .error(function (err) {
+              Falcon.logResponse('error', err, false);
+              SpinnersFlag.show = false;
+              angular.element('body, html').animate({scrollTop: 0}, 300);
+            });
+        }
+
+      };
+
+      function identifyLocationType (val) {
+        if (validationService.patterns.s3.test(val)) {
+          return "s3";
+        } else if (validationService.patterns.azure.test(val)) {
+          return "azure";
+        } else {
+          return "HDFS";
+        }
+      }
+
+      function importModel(model) {
+
+        var mirrorType;
+
+        if (model.process.tags.search('_falcon_mirroring_type=HDFS') !== -1) {
+          mirrorType = 'HDFS';
+        } else {
+          mirrorType = 'HIVE';
+        }
+        $scope.switchModel(mirrorType);
+        EntityModel.datasetModel.UIModel.formType = mirrorType;
+        EntityModel.datasetModel.UIModel.name = (function () { if (!$scope.clone) { return model.process._name; } else { return ""; } }());
+        EntityModel.datasetModel.UIModel.retry.policy = model.process.retry._policy;
+        EntityModel.datasetModel.UIModel.retry.attempts = model.process.retry._attempts;
+        EntityModel.datasetModel.UIModel.retry.delay.number = (function () {
+          return parseInt(model.process.retry._delay.split('(')[1]);
+        }());
+        EntityModel.datasetModel.UIModel.retry.delay.unit = (function () {
+          return model.process.retry._delay.split('(')[0];
+        }());
+        EntityModel.datasetModel.UIModel.frequency.number = (function () {
+          return parseInt(model.process.frequency.split('(')[1]);
+        }());
+        EntityModel.datasetModel.UIModel.frequency.unit = (function () {
+          return model.process.frequency.split('(')[0];
+        }());
+        EntityModel.datasetModel.UIModel.acl.owner = model.process.ACL._owner;
+        EntityModel.datasetModel.UIModel.acl.group = model.process.ACL._group;
+        EntityModel.datasetModel.UIModel.acl.permissions = model.process.ACL._permission;
+
+        EntityModel.datasetModel.UIModel.validity.startISO = model.process.clusters.cluster[0].validity._start;
+        EntityModel.datasetModel.UIModel.validity.endISO = model.process.clusters.cluster[0].validity._end;
+        EntityModel.datasetModel.UIModel.validity.tz = model.process.timezone;
+        EntityModel.datasetModel.UIModel.validity.start = DateHelper.importDate (model.process.clusters.cluster[0].validity._start, model.process.timezone);
+        EntityModel.datasetModel.UIModel.validity.startTime = DateHelper.importDate (model.process.clusters.cluster[0].validity._start, model.process.timezone);
+        EntityModel.datasetModel.UIModel.validity.end = DateHelper.importDate (model.process.clusters.cluster[0].validity._end, model.process.timezone);
+        EntityModel.datasetModel.UIModel.validity.endTime = DateHelper.importDate (model.process.clusters.cluster[0].validity._end, model.process.timezone);
+
+        EntityModel.datasetModel.UIModel.tags.tagsString = model.process.tags;
+        EntityModel.datasetModel.UIModel.tags.tagsArray = (function () {
+          var array = [];
+          model.process.tags.split(',').forEach(function (fieldToSplit) {
+            var splittedString = fieldToSplit.split("=");
+            array.push({key: splittedString[0], value: splittedString[1]});
+          });
+          return array;
+        }());
+
+        if (mirrorType === 'HDFS') {
+          model.process.properties.property.forEach(function (item) {
+            if (item._name === 'distcpMaxMaps') {
+              EntityModel.datasetModel.UIModel.allocation.hdfs.maxMaps = item._value;
+            }
+            if (item._name === 'distcpMapBandwidth') {
+              EntityModel.datasetModel.UIModel.allocation.hdfs.maxBandwidth = item._value;
+            }
+            if (item._name === 'drSourceDir') {
+              EntityModel.datasetModel.UIModel.source.path = item._value;
+            }
+            if (item._name === 'drTargetDir') {
+              EntityModel.datasetModel.UIModel.target.path = item._value;
+            }
+            if (item._name === 'drNotificationReceivers') {
+              EntityModel.datasetModel.UIModel.alerts.alertsArray = (function () {
+                if (item._value !== "NA") {
+                  return item._value.split(',');
+                } else {
+                  return [];
+                }
+              }());
+            }
+            if (item._name === 'targetCluster') {
+              EntityModel.datasetModel.UIModel.target.cluster = item._value;
+            }
+            if (item._name === 'sourceCluster') {
+              EntityModel.datasetModel.UIModel.source.cluster = item._value;
+            }
+            if (item._name === 'drSourceClusterFS') {
+              EntityModel.datasetModel.UIModel.source.url = item._value;
+            }
+            if (item._name === 'drTargetClusterFS') {
+              EntityModel.datasetModel.UIModel.target.url = item._value;
+            }
+          });
+
+          if (EntityModel.datasetModel.UIModel.source.cluster === model.process.clusters.cluster[0]._name) {
+            EntityModel.datasetModel.UIModel.runOn = "source";
+          }
+          if (EntityModel.datasetModel.UIModel.target.cluster === model.process.clusters.cluster[0]._name) {
+            EntityModel.datasetModel.UIModel.runOn = "target";
+          }
+
+          EntityModel.datasetModel.UIModel.source.location = identifyLocationType(EntityModel.datasetModel.UIModel.source.url);
+          EntityModel.datasetModel.UIModel.target.location = identifyLocationType(EntityModel.datasetModel.UIModel.target.url);
+
+        } else if (mirrorType === 'HIVE') {
+
+          model.process.properties.property.forEach(function (item) {
+            if (item._name === 'distcpMaxMaps') {
+              EntityModel.datasetModel.UIModel.allocation.hive.maxMapsDistcp = item._value;
+            }
+            if (item._name === 'distcpMapBandwidth') {
+              EntityModel.datasetModel.UIModel.allocation.hive.maxBandwidth = item._value;
+            }
+            if (item._name === 'sourceCluster') {
+              EntityModel.datasetModel.UIModel.source.cluster = item._value;
+            }
+            if (item._name === 'targetCluster') {
+              EntityModel.datasetModel.UIModel.target.cluster = item._value;
+            }
+            if (item._name === 'sourceStagingPath') {
+              EntityModel.datasetModel.UIModel.hiveOptions.source.stagingPath = item._value;
+            }
+            if (item._name === 'targetStagingPath') {
+              EntityModel.datasetModel.UIModel.hiveOptions.target.stagingPath = item._value;
+              if (item._value === "*") {
+                EntityModel.datasetModel.UIModel.source.hiveDatabaseType = "databases";
+              } else {
+                EntityModel.datasetModel.UIModel.source.hiveDatabaseType = "tables";
+              }
+            }
+            if (item._name === 'sourceHiveServer2Uri') {
+              EntityModel.datasetModel.UIModel.hiveOptions.source.hiveServerToEndpoint = item._value;
+            }
+            if (item._name === 'targetHiveServer2Uri') {
+              EntityModel.datasetModel.UIModel.hiveOptions.target.hiveServerToEndpoint = item._value;
+            }
+            if (item._name === 'sourceTable') {
+              EntityModel.datasetModel.UIModel.source.hiveTables = item._value;
+              if (EntityModel.datasetModel.UIModel.source.hiveDatabaseType === "databases") {
+                EntityModel.datasetModel.UIModel.source.hiveTables = "*";
+              }
+              else {
+                EntityModel.datasetModel.UIModel.source.hiveTables = item._value;
+              }
+            }
+            if (item._name === 'sourceDatabase') {
+              if (EntityModel.datasetModel.UIModel.source.hiveDatabaseType === "databases") {
+                EntityModel.datasetModel.UIModel.source.hiveDatabases = item._value;
+              } else {
+                EntityModel.datasetModel.UIModel.source.hiveDatabase = item._value;
+              }
+            }
+            if (item._name === 'maxEvents') {
+              EntityModel.datasetModel.UIModel.allocation.hive.maxMapsEvents = item._value;
+            }
+            if (item._name === 'replicationMaxMaps') {
+              EntityModel.datasetModel.UIModel.allocation.hive.maxMapsMirror = item._value;
+            }
+            if (item._name === 'clusterForJobRun') {
+              if (EntityModel.datasetModel.UIModel.source.cluster === item._value) {
+                EntityModel.datasetModel.UIModel.runOn = "source";
+              } else {
+                EntityModel.datasetModel.UIModel.runOn = "target";
+              }
+            }
+            if (item._name === 'drNotificationReceivers') {
+              EntityModel.datasetModel.UIModel.alerts.alertsArray = (function () {
+                if (item._value !== "NA") {
+                  return item._value.split(',');
+                } else {
+                  return [];
+                }
+              }());
+            }
+
+          });
+        }
+
+        if(EntityModel.datasetModel.UIModel.source.cluster) { $scope.getSourceDefinition(); }
+        if(EntityModel.datasetModel.UIModel.target.cluster) { $scope.getTargetDefinition(); }
+
+      }
+      if (EntityModel.datasetModel.toImportModel) {
+        importModel(EntityModel.datasetModel.toImportModel);
+      }
+    }]);
+}());

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/js/controllers/entity/entity-definition.js
----------------------------------------------------------------------
diff --git a/falcon-ui/app/js/controllers/entity/entity-definition.js b/falcon-ui/app/js/controllers/entity/entity-definition.js
new file mode 100644
index 0000000..5afe400
--- /dev/null
+++ b/falcon-ui/app/js/controllers/entity/entity-definition.js
@@ -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.
+ */
+(function () {
+  'use strict';
+
+  /***
+   * @ngdoc controller
+   * @name app.controllers.feed.FeedController
+   * @requires EntityModel the entity model to copy the feed entity from
+   * @requires Falcon the falcon service to talk with the Falcon REST API
+   */
+  var clusterModule = angular.module('app.controllers.view', [ 'app.services' ]);
+
+  clusterModule.controller('EntityDefinitionCtrl', [
+    "$scope", "$interval", "Falcon", "EntityModel", "$state", "X2jsService",
+    function ($scope, $interval, Falcon, EntityModel, $state, X2jsService) {
+
+      $scope.entity = EntityModel;
+      $scope.xmlPreview = { edit: false };
+
+      var xmlStr = X2jsService.json2xml_str(angular.copy($scope.entity.model));
+      $scope.prettyXml = X2jsService.prettifyXml(xmlStr);
+      $scope.xml = xmlStr;
+
+    }
+  ]);
+
+  clusterModule.filter('titleCase', function() {
+    return function(input) {
+      input = input || '';
+      return input.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
+    };
+  });
+
+})();


[20/22] falcon git commit: FALCON-1315 Update falcon ui for HiveDR, secure clusters and bug fixes. Contributed by Armando Reyna/Venkat Ranganathan.

Posted by so...@apache.org.
http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/fonts/Cabin-Bold-webfont.woff
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/fonts/Cabin-Bold-webfont.woff b/falcon-ui/app/css/fonts/Cabin-Bold-webfont.woff
new file mode 100644
index 0000000..4495788
Binary files /dev/null and b/falcon-ui/app/css/fonts/Cabin-Bold-webfont.woff differ

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/fonts/Cabin-Bold-webfont.woff2
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/fonts/Cabin-Bold-webfont.woff2 b/falcon-ui/app/css/fonts/Cabin-Bold-webfont.woff2
new file mode 100644
index 0000000..df93573
Binary files /dev/null and b/falcon-ui/app/css/fonts/Cabin-Bold-webfont.woff2 differ

http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/fonts/Cabin-Italic-webfont.eot
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/fonts/Cabin-Italic-webfont.eot b/falcon-ui/app/css/fonts/Cabin-Italic-webfont.eot
new file mode 100644
index 0000000..e7de28e
Binary files /dev/null and b/falcon-ui/app/css/fonts/Cabin-Italic-webfont.eot differ


[21/22] falcon git commit: FALCON-1315 Update falcon ui for HiveDR, secure clusters and bug fixes. Contributed by Armando Reyna/Venkat Ranganathan.

Posted by so...@apache.org.
http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/fonts/Cabin-Bold-webfont.svg
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/fonts/Cabin-Bold-webfont.svg b/falcon-ui/app/css/fonts/Cabin-Bold-webfont.svg
new file mode 100644
index 0000000..655b2af
--- /dev/null
+++ b/falcon-ui/app/css/fonts/Cabin-Bold-webfont.svg
@@ -0,0 +1,1833 @@
+<?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" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
+<metadata></metadata>
+<defs>
+<font id="cabinbold" horiz-adv-x="1280" >
+<font-face units-per-em="2048" ascent="1638" descent="-410" />
+<missing-glyph horiz-adv-x="460" />
+<glyph horiz-adv-x="0" />
+<glyph horiz-adv-x="682" />
+<glyph unicode=" "  horiz-adv-x="460" />
+<glyph unicode="&#x09;" horiz-adv-x="460" />
+<glyph unicode="&#xa0;" horiz-adv-x="460" />
+<glyph unicode="!" horiz-adv-x="512" d="M129 0v254h254v-254h-254zM129 1536h254l-41 -1126h-172z" />
+<glyph unicode="&#x22;" horiz-adv-x="811" d="M74 1536h254l-41 -614h-172zM483 1536h254l-41 -614h-172z" />
+<glyph unicode="#" horiz-adv-x="1454" d="M63 432l95 213h229l76 203h-248l66 201h258l151 385h193l-148 -385h234l147 385h193l-148 -385h228l-70 -201h-234l-75 -203h256l-99 -213h-239l-172 -455h-197l172 455h-229l-176 -455h-193l172 455h-242zM580 645h233l80 203h-234z" />
+<glyph unicode="$" horiz-adv-x="1073" d="M82 969q0 43 11.5 84t39.5 82.5t69.5 73.5t107 55.5t147.5 31.5l-33 236h219l-33 -236q96 -6 188 -29.5t138 -49.5l-23 -232q-209 107 -352 107q-229 0 -229 -99q0 -40 37 -68.5t96 -47.5t130 -37.5t142.5 -45t130.5 -63t96 -99.5t37 -147q0 -39 -8.5 -75.5t-34 -79 t-67 -75t-114 -58t-167.5 -33.5l33 -230h-219l33 228q-116 6 -211.5 28.5t-147.5 53.5l35 260q58 -55 158.5 -92t226.5 -37q104 0 156.5 25t52.5 83q0 43 -35.5 75.5t-92.5 54t-126 42t-137.5 45.5t-125.5 58t-92.5 87t-35.5 124z" />
+<glyph unicode="%" horiz-adv-x="1724" d="M70 1057q0 174 90.5 279.5t226.5 105.5q135 0 221 -101t86 -268q0 -176 -87 -281.5t-230 -105.5q-138 0 -222.5 101.5t-84.5 269.5zM233 1057q0 -112 40 -165.5t106 -53.5q70 0 111.5 57t41.5 178q0 110 -42.5 165.5t-104.5 55.5q-63 0 -107.5 -59.5t-44.5 -177.5z M301 -25l864 1459h213l-864 -1459h-213zM1032 352q0 173 90.5 279t227.5 106q135 0 221 -100.5t86 -267.5q0 -176 -87.5 -281.5t-230.5 -105.5q-138 0 -222.5 101t-84.5 269zM1196 352q0 -113 39.5 -166t105.5 -53q70 0 112 57.5t42 178.5q0 110 -42.5 165.5t-104.5 55.5 q-63 0 -107.5 -60t-44.5 -178z" />
+<glyph unicode="&#x26;" horiz-adv-x="1284" d="M66 344q0 129 66.5 226t182.5 182q-153 190 -153 350q0 103 59.5 181.5t153.5 117.5t203 39q154 0 239.5 -80t85.5 -213q0 -44 -10 -83t-34.5 -75.5t-45.5 -62.5t-62.5 -60.5t-65 -52t-73.5 -53.5l287 -328q16 88 21 289h243q0 -284 -100 -475l215 -246h-295l-63 70 q-149 -119 -377 -119q-120 0 -213.5 32t-150 88t-85 125t-28.5 148zM330 367q0 -43 11.5 -80t37.5 -70.5t77 -52.5t122 -19q133 0 213 70l-355 399q-106 -114 -106 -247zM412 1092q0 -49 22.5 -96.5t71.5 -110.5q85 61 129.5 114.5t44.5 118.5q0 119 -115 119 q-68 0 -110.5 -37.5t-42.5 -107.5z" />
+<glyph unicode="'" horiz-adv-x="401" d="M74 1536h254l-41 -614h-172z" />
+<glyph unicode="(" horiz-adv-x="567" d="M84 629q0 306 52 516t155 391h231q-231 -406 -231 -907q0 -502 231 -908h-231q-103 181 -155 391.5t-52 516.5z" />
+<glyph unicode=")" horiz-adv-x="567" d="M45 -279q231 406 231 908q0 501 -231 907h231q103 -181 155 -391t52 -516t-52 -516.5t-155 -391.5h-231z" />
+<glyph unicode="*" horiz-adv-x="913" d="M63 1264l97 168l272 -220l-72 322h193l-74 -322l275 220l96 -168l-326 -103l246 -184l-137 -133l-172 280l-176 -286l-138 133l248 186z" />
+<glyph unicode="+" horiz-adv-x="937" d="M90 471v193h283v262h192v-262h283v-193h-283v-262h-192v262h-283z" />
+<glyph unicode="," horiz-adv-x="475" d="M111 0v266h254v-266l-201 -225l-53 28l67 177z" />
+<glyph unicode="-" horiz-adv-x="856" d="M111 471v193h634v-193h-634z" />
+<glyph unicode="." horiz-adv-x="475" d="M111 0v266h254v-266h-254z" />
+<glyph unicode="/" horiz-adv-x="1128" d="M39 -174l747 1608h275l-748 -1608h-274z" />
+<glyph unicode="0" horiz-adv-x="1445" d="M121 694q0 167 47.5 311t129.5 244t195 156.5t242 56.5q256 0 423 -205.5t167 -527.5q0 -169 -44 -310t-123.5 -240t-194 -153.5t-252.5 -54.5q-266 0 -428 199t-162 524zM383 694q0 -245 91 -366t241 -121q160 0 256 128.5t96 393.5q0 123 -28 221t-75 158t-106.5 91.5 t-126.5 31.5t-128 -33t-111 -97t-79.5 -169t-29.5 -238z" />
+<glyph unicode="1" horiz-adv-x="755" d="M92 1210q68 14 152 83.5t112 140.5h201v-1434h-262v1063q-87 -58 -180 -74z" />
+<glyph unicode="2" horiz-adv-x="1083" d="M90 0q190 276 312.5 468.5t177 302.5t71.5 165.5t17 101.5q0 97 -52.5 151t-146.5 54q-187 0 -330 -219l-33 236q16 30 49.5 62.5t83.5 65t125 53.5t158 21q87 0 156 -24t112.5 -62t72.5 -89.5t40.5 -103t11.5 -106.5q0 -139 -87 -330.5t-287 -492.5h426v-254h-877z" />
+<glyph unicode="3" horiz-adv-x="1103" d="M74 82l63 242q45 -42 134.5 -71.5t177.5 -29.5q122 0 199 49t77 160q0 53 -11 93.5t-38 77t-81 56t-132 19.5h-184l22 203h94q147 0 210 52t63 136q0 80 -51.5 126t-159.5 46q-75 0 -144 -17.5t-108 -52.5l-41 197q36 36 125 65t198 29q106 0 187.5 -25.5t129 -64 t77.5 -91.5t40.5 -101t10.5 -99q0 -186 -137 -286q188 -113 188 -351q0 -115 -44 -207t-118.5 -149t-167 -87t-194.5 -30q-122 0 -240 39.5t-145 71.5z" />
+<glyph unicode="4" horiz-adv-x="1189" d="M20 389l660 1045h219v-832h174v-213h-174v-389h-262v389h-617zM377 602h260v430z" />
+<glyph unicode="5" horiz-adv-x="1099" d="M100 88l62 238q53 -46 134.5 -76.5t170.5 -30.5q56 0 103.5 13t87 40.5t62.5 76t23 114.5q0 48 -14 84t-50 68t-108 48.5t-178 16.5h-219l90 754h658l-27 -254h-434l-35 -281q298 -3 434.5 -104.5t136.5 -321.5q0 -97 -29 -179.5t-79 -141t-116.5 -99.5t-142 -60.5 t-155.5 -19.5q-125 0 -246.5 42.5t-128.5 72.5z" />
+<glyph unicode="6" horiz-adv-x="1150" d="M119 518q0 153 45 299.5t115 255t153 192t162.5 126.5t138.5 43l172 -103q-47 0 -128 -51.5t-162 -128.5t-145 -178.5t-75 -190.5q63 80 238 80q190 0 311 -107t121 -306q0 -128 -60 -236t-175.5 -175t-264.5 -67q-97 0 -175.5 30.5t-140.5 93.5t-96 170.5t-34 252.5z M373 416q0 -98 68 -154.5t151 -56.5q103 0 167 73t64 175q0 75 -53.5 135.5t-153.5 60.5q-108 0 -175.5 -59.5t-67.5 -173.5z" />
+<glyph unicode="7" horiz-adv-x="1044" d="M88 1180v254h942l-598 -1434h-274l491 1180h-561z" />
+<glyph unicode="8" horiz-adv-x="1232" d="M115 379q0 232 221 393q-72 58 -106.5 146t-34.5 182q0 58 13 109t44.5 98.5t79.5 81t123 53.5t170 20q112 0 195 -27t129.5 -74.5t68.5 -104.5t22 -126q0 -193 -176 -339q114 -53 184 -151t70 -222q0 -63 -18.5 -125t-60 -120.5t-101 -103t-148 -71.5t-194.5 -27 q-121 0 -215.5 34t-151 92t-85.5 129.5t-29 152.5zM365 399q0 -104 64 -161.5t177 -57.5q120 0 187 62.5t67 167.5q0 109 -67.5 177.5t-169.5 92.5q-105 -17 -181.5 -90.5t-76.5 -190.5zM424 1075q0 -155 180 -205q195 53 195 215q0 75 -44 123.5t-141 48.5 q-99 0 -144.5 -50.5t-45.5 -131.5z" />
+<glyph unicode="9" horiz-adv-x="1155" d="M86 979q0 132 60 241t175.5 175.5t264.5 66.5q97 0 176 -30.5t141 -93.5t96.5 -170t34.5 -250q0 -153 -39 -297.5t-103.5 -254.5t-145 -194t-166 -128t-162.5 -44l-166 102q39 0 101.5 27.5t131.5 80t131 118t104.5 151t47.5 170.5q-35 -39 -119.5 -58.5t-130.5 -19.5 q-195 0 -313.5 105.5t-118.5 302.5zM342 989q0 -84 50 -144.5t151 -60.5q107 0 175 60t68 172q0 59 -20 102.5t-53 66.5t-68.5 33.5t-73.5 10.5q-106 0 -167.5 -72.5t-61.5 -167.5z" />
+<glyph unicode=":" horiz-adv-x="475" d="M111 0v266h254v-266h-254zM111 635v266h254v-266h-254z" />
+<glyph unicode=";" horiz-adv-x="505" d="M115 0v266h254v-266l-201 -225l-53 28l67 177zM115 635v266h280v-266h-280z" />
+<glyph unicode="&#x3c;" horiz-adv-x="913" d="M59 582l435 422h301l-435 -422l435 -422h-301z" />
+<glyph unicode="=" horiz-adv-x="1011" d="M127 307v193h758v-193h-758zM127 635v192h758v-192h-758z" />
+<glyph unicode="&#x3e;" horiz-adv-x="913" d="M119 160l434 422l-434 422h301l434 -422l-434 -422h-301z" />
+<glyph unicode="?" horiz-adv-x="905" d="M59 1391q49 72 137 108.5t191 36.5q105 0 190 -37.5t135.5 -96t77.5 -125t27 -130.5q0 -68 -32.5 -139.5t-79.5 -135t-93.5 -129t-79 -146t-32.5 -161.5v-26h-172q-6 92 -6 108q0 71 26.5 141t64 128t75 114t64 119.5t26.5 124.5q0 94 -57 142t-150 48q-83 0 -147.5 -37 t-106.5 -96zM287 0v254h254v-254h-254z" />
+<glyph unicode="@" horiz-adv-x="1462" d="M92 348q0 131 40 252.5t112.5 217t168.5 167t212 110t239 38.5q239 0 374.5 -140.5t135.5 -380.5q0 -150 -51 -286q-39 -61 -116 -97t-136 -36q-76 0 -76 108q0 50 15.5 114.5t46.5 171t51 189.5q-105 109 -250 109q-124 0 -245.5 -84t-198 -218.5t-76.5 -273.5 q0 -46 10 -84.5t31.5 -71.5t60.5 -52t92 -19q88 0 194.5 65.5t166.5 171.5q0 -5 -3 -31t-3 -32q0 -66 27 -118t85 -52q60 0 141.5 39.5t131.5 91.5q-98 -178 -279.5 -286.5t-392.5 -108.5q-235 0 -371.5 139.5t-136.5 386.5zM502 348q0 82 37 161t92 132.5t117 86t112 32.5 q95 0 111 -45q-19 -107 -83.5 -224t-147 -195.5t-148.5 -78.5q-45 0 -67.5 37t-22.5 94z" />
+<glyph unicode="A" d="M6 0l510 1434h248l510 -1434h-273l-122 346h-478l-122 -346h-273zM492 600h296l-149 420z" />
+<glyph unicode="B" horiz-adv-x="1282" d="M158 0v1434h387q108 0 185 -8t150 -31t117 -63t70.5 -107t26.5 -160q0 -198 -121 -299q128 -48 189 -129.5t61 -214.5q0 -96 -30.5 -171t-80 -121.5t-118 -76.5t-137.5 -41.5t-146 -11.5h-553zM420 223h258q134 0 204 48.5t70 164.5q0 215 -260 215h-272v-428zM420 858 h256q31 0 59 7.5t55.5 25t43.5 52t16 83.5q0 106 -50 145t-149 39h-231v-352z" />
+<glyph unicode="C" horiz-adv-x="1247" d="M72 717q0 222 91 392t251 261.5t364 91.5q111 0 220 -22.5t188 -61.5l-29 -250q-103 41 -189.5 61.5t-189.5 20.5q-203 0 -311.5 -135t-108.5 -358t108.5 -358.5t311.5 -135.5q103 0 189.5 20.5t189.5 61.5l29 -250q-79 -39 -188 -61.5t-220 -22.5q-152 0 -283 53.5 t-224 150t-146 236.5t-53 306z" />
+<glyph unicode="D" horiz-adv-x="1474" d="M158 0v1434h536q153 0 283 -49t224 -139.5t147 -226.5t53 -302t-53 -302t-147 -226.5t-224 -139.5t-283 -49h-536zM420 252h274q206 0 313 123t107 342t-107 342t-313 123h-274v-930z" />
+<glyph unicode="E" horiz-adv-x="1163" d="M158 0v1434h917v-254h-649v-306h504v-253h-504v-367h670v-254h-938z" />
+<glyph unicode="F" horiz-adv-x="1075" d="M158 0v1434h882v-254h-620v-306h479v-253h-479v-621h-262z" />
+<glyph unicode="G" horiz-adv-x="1359" d="M72 719q0 166 52.5 305t146.5 235t226.5 149.5t288.5 53.5q108 0 231.5 -23.5t199.5 -60.5l-29 -250q-87 35 -195 58.5t-200 23.5q-109 0 -193.5 -36.5t-136.5 -102.5t-78.5 -154t-26.5 -194q0 -227 115 -363.5t332 -136.5q81 0 196 23v256h-157v217h420v-639 q-78 -44 -223.5 -76.5t-268.5 -32.5q-149 0 -278 53.5t-222.5 150t-146.5 237t-53 307.5z" />
+<glyph unicode="H" horiz-adv-x="1515" d="M158 0v1434h262v-560h676v560h262v-1434h-262v621h-676v-621h-262z" />
+<glyph unicode="I" horiz-adv-x="577" d="M158 0v1434h262v-1434h-262z" />
+<glyph unicode="J" horiz-adv-x="577" d="M-6 -156h55q60 0 84.5 38.5t24.5 125.5v1426h262v-1483q0 -151 -87.5 -227t-244.5 -76h-74z" />
+<glyph unicode="K" horiz-adv-x="1271" d="M158 0v1434h262v-1434h-262zM471 758l500 676h295l-500 -676l500 -758h-295z" />
+<glyph unicode="L" horiz-adv-x="1024" d="M158 0v1434h262v-1180h590v-254h-852z" />
+<glyph unicode="M" horiz-adv-x="1705" d="M90 0l199 1434h215l350 -654l348 654h215l199 -1434h-273l-122 961l-367 -660l-369 657l-123 -958h-272z" />
+<glyph unicode="N" horiz-adv-x="1447" d="M158 0v1434h258l612 -926v926h262v-1434h-215l-655 983v-983h-262z" />
+<glyph unicode="O" horiz-adv-x="1556" d="M72 717q0 222 91 392t251 261.5t364 91.5t364.5 -91.5t251.5 -261.5t91 -392q0 -166 -53 -306t-146.5 -236.5t-224 -150t-283.5 -53.5q-152 0 -283 53.5t-224 150t-146 236.5t-53 306zM358 717q0 -223 108.5 -358.5t311.5 -135.5t311.5 135.5t108.5 358.5t-108.5 358 t-311.5 135t-311.5 -135t-108.5 -358z" />
+<glyph unicode="P" horiz-adv-x="1220" d="M158 0v1434h405q107 0 184.5 -6.5t151 -24t122 -49.5t86 -82t54.5 -123t17 -170q0 -99 -22.5 -180t-62.5 -135t-89.5 -93t-108 -60t-111.5 -30.5t-108 -9.5h-256v-471h-262zM420 717h221q145 0 207.5 58t62.5 202q0 128 -58.5 182.5t-217.5 54.5h-215v-497z" />
+<glyph unicode="Q" horiz-adv-x="1556" d="M72 717q0 222 91 392t251 261.5t364 91.5t364.5 -91.5t251.5 -261.5t91 -392q0 -259 -127 -451l127 -104l-152 -182l-141 116q-172 -125 -414 -125q-152 0 -283 53.5t-224 150t-146 236.5t-53 306zM358 717q0 -223 108.5 -358.5t311.5 -135.5q119 0 205 47l-172 146 l152 182l180 -152q55 113 55 271q0 223 -108.5 358t-311.5 135t-311.5 -135t-108.5 -358z" />
+<glyph unicode="R" horiz-adv-x="1282" d="M158 0v1434h524q86 0 158 -13t135 -43.5t107 -77.5t69 -118t25 -162q0 -153 -64 -249.5t-180 -168.5l323 -602h-272l-297 532h-266v-532h-262zM420 778h192q87 0 145.5 16t89 47.5t42.5 69.5t12 90q0 71 -22 115.5t-84.5 71t-171.5 26.5h-203v-436z" />
+<glyph unicode="S" horiz-adv-x="1187" d="M78 1032q0 60 16 118t55 115.5t97 100.5t148 69.5t202 26.5q137 0 265.5 -34t191.5 -76l-27 -269q-237 129 -420 129q-47 0 -89 -6.5t-83 -22.5t-65.5 -47t-24.5 -75q0 -33 16.5 -61.5t39.5 -47.5t65.5 -38.5t76.5 -31t91 -28.5q186 -57 269 -102q200 -107 223 -306 q3 -28 3 -57q0 -39 -5 -75t-20.5 -79t-40.5 -79.5t-68 -71.5t-99.5 -59t-139 -39t-182.5 -15q-153 0 -280.5 30.5t-194.5 74.5l31 299q66 -64 183.5 -108t267.5 -44q256 0 256 156q0 41 -20.5 76.5t-42 57t-78 48t-83 36t-102.5 35.5q-5 2 -8 3q-169 58 -236 96 q-160 89 -184 242q-4 28 -4 59z" />
+<glyph unicode="T" horiz-adv-x="1134" d="M31 1180v254h1073v-254h-406v-1180h-262v1180h-405z" />
+<glyph unicode="U" horiz-adv-x="1470" d="M141 614v820h262v-732q0 -86 8 -152.5t29.5 -130t58 -105t96 -66.5t140.5 -25t140.5 25t96 66.5t58 105t29.5 130t8 152.5v732h262v-820q0 -301 -150 -472t-444 -171t-444 171t-150 472z" />
+<glyph unicode="V" horiz-adv-x="1345" d="M0 1434h272l402 -1088l395 1088h270l-503 -1434h-320z" />
+<glyph unicode="W" horiz-adv-x="1972" d="M20 1434h273l287 -1018l319 1018h182l332 -992l275 992h272l-420 -1434h-231l-320 956l-317 -956h-248z" />
+<glyph unicode="X" horiz-adv-x="1284" d="M-2 0l506 715l-484 719h304l331 -504l303 504h302l-472 -691l500 -743h-303l-348 526l-338 -526h-301z" />
+<glyph unicode="Y" horiz-adv-x="1224" d="M-14 1434h278l348 -566l349 566h278l-496 -799v-635h-262v635z" />
+<glyph unicode="Z" horiz-adv-x="1122" d="M16 0l660 1180h-567v254h999l-659 -1180h567v-254h-1000z" />
+<glyph unicode="[" horiz-adv-x="686" d="M137 -279v1815h527v-223h-295v-1368h295v-224h-527z" />
+<glyph unicode="\" horiz-adv-x="1128" d="M68 1434h274l748 -1608h-275z" />
+<glyph unicode="]" horiz-adv-x="696" d="M33 -25h295v1307h-295v254h526v-1815h-526v254z" />
+<glyph unicode="^" horiz-adv-x="1046" d="M100 819v301l422 434l422 -434v-301l-422 434z" />
+<glyph unicode="_" horiz-adv-x="1142" d="M-2 -74h1147v-192h-1147v192z" />
+<glyph unicode="`" horiz-adv-x="620" d="M119 1323v213l383 -186v-152z" />
+<glyph unicode="a" horiz-adv-x="1019" d="M43 287q0 60 22 111t58 87t86 65t101.5 47.5t109 31t105.5 18t93 6.5q-5 89 -46 128.5t-138 39.5q-120 0 -280 -78l-23 207q188 90 373 90q179 0 274.5 -98t95.5 -313v-277q0 -78 8.5 -112t25 -43t57.5 -9h32l-22 -208h-92q-166 0 -230 118q-50 -56 -134.5 -87 t-178.5 -31q-128 0 -212.5 82.5t-84.5 224.5zM309 297q0 -63 32.5 -93t104.5 -30q38 0 88 19.5t87 54.5v233q-77 -3 -145 -22.5t-117.5 -62t-49.5 -99.5z" />
+<glyph unicode="b" horiz-adv-x="1169" d="M117 0v1536h254v-563q103 67 239 67q120 0 216.5 -42.5t158 -115.5t94.5 -168t33 -204t-33 -204t-94.5 -168t-158 -115.5t-216.5 -42.5q-80 0 -137 18.5t-115 58.5l-4 -57h-237zM358 510q0 -149 58.5 -235.5t177.5 -86.5q121 0 189.5 88.5t68.5 233.5t-68.5 233 t-189.5 88q-119 0 -177.5 -86t-58.5 -235z" />
+<glyph unicode="c" horiz-adv-x="917" d="M57 510q0 109 32.5 204t93 168.5t156.5 115.5t216 42q112 0 180.5 -19.5t126.5 -55.5l-22 -217q-127 83 -265 83q-121 0 -189.5 -88t-68.5 -233t68.5 -233.5t189.5 -88.5q137 0 265 84l22 -217q-58 -36 -126.5 -55.5t-180.5 -19.5q-120 0 -216 42t-156.5 115.5t-93 168.5 t-32.5 204z" />
+<glyph unicode="d" horiz-adv-x="1169" d="M57 510q0 109 33 204t94.5 168t158 115.5t216.5 42.5q137 0 240 -67v563h254v-1536h-240l-4 57q-58 -40 -114.5 -58.5t-135.5 -18.5q-120 0 -216.5 42.5t-158 115.5t-94.5 168t-33 204zM317 510q0 -145 68.5 -233.5t189.5 -88.5q119 0 177.5 86.5t58.5 235.5t-58.5 235 t-177.5 86q-121 0 -189.5 -88t-68.5 -233z" />
+<glyph unicode="e" horiz-adv-x="1054" d="M57 510q0 86 20.5 164.5t62 145t100 116t138 77t171.5 27.5q196 0 323 -122t127 -322q0 -61 -16 -139h-661q14 -91 62 -153.5t110 -89t133 -26.5q70 0 160 24.5t155 59.5l12 -215q-146 -77 -342 -77q-135 0 -242.5 42t-175 115.5t-102.5 168.5t-35 204zM328 629h413 q0 37 -10 71t-30.5 64t-57.5 48.5t-86 18.5q-94 0 -151.5 -54.5t-77.5 -147.5z" />
+<glyph unicode="f" horiz-adv-x="696" d="M35 815l22 209h123v244q0 109 64.5 188.5t181.5 79.5q95 0 231 -12l-22 -211q-45 10 -109 10q-56 0 -74 -32.5t-18 -127.5v-139h225v-209h-225v-815h-254v815h-145z" />
+<glyph unicode="g" horiz-adv-x="1026" d="M49 -209q0 141 168 229q-92 59 -92 148q0 90 102 139q-76 55 -116.5 141.5t-40.5 188.5q0 111 47 201.5t142.5 146t225.5 55.5q139 0 234 -61q80 45 219 45h66l-17 -160h-92q-34 0 -57 -2q61 -94 61 -225q0 -111 -46.5 -201.5t-142 -146.5t-225.5 -56q-44 0 -108 11 q-23 -10 -23 -33q0 -34 57.5 -50.5t198.5 -33.5q39 -5 69 -10t75.5 -16t79 -25t71 -38t61.5 -53.5t40 -72.5t16 -94q0 -152 -128.5 -241t-361.5 -89q-123 0 -218 25.5t-151.5 69t-85 96.5t-28.5 112zM260 -184q0 -68 68.5 -108t191.5 -40q122 0 199.5 37.5t77.5 101.5 q0 28 -17 50t-41 35t-64.5 23t-71.5 14.5t-79 9.5q-56 6 -123 18q-65 -22 -103 -54.5t-38 -86.5zM297 637q0 -101 48 -159t140 -58q90 0 138.5 58.5t48.5 158.5t-48.5 158.5t-138.5 58.5q-92 0 -140 -58t-48 -159z" />
+<glyph unicode="h" horiz-adv-x="1128" d="M117 0v1536h254v-565q104 69 213 69q436 0 436 -489v-551h-254v551q0 144 -48.5 212t-154.5 68q-117 0 -192 -88v-743h-254z" />
+<glyph unicode="i" horiz-adv-x="491" d="M119 0v1024h254v-1024h-254zM119 1180v254h254v-254h-254z" />
+<glyph unicode="j" horiz-adv-x="491" d="M-4 -287q33 0 47.5 0.5t32 6t23.5 14.5t12 29t7 45.5t1 68.5v1147h254v-1251q0 -118 -66 -193.5t-196 -75.5h-93zM119 1180v254h254v-254h-254z" />
+<glyph unicode="k" horiz-adv-x="993" d="M117 0v1536h254v-932l325 420h287l-375 -492l375 -532h-287l-325 455v-455h-254z" />
+<glyph unicode="l" horiz-adv-x="538" d="M119 248v1288h254v-1184q0 -32 1 -54.5t4.5 -40.5t6.5 -29t12.5 -19.5t15.5 -12t22 -5.5t26.5 -2.5t34.5 -0.5l-23 -208h-92q-130 0 -196 75t-66 193z" />
+<glyph unicode="m" horiz-adv-x="1773" d="M119 0v1024h209l14 -80q116 96 262 96q94 0 178 -39.5t136 -115.5q31 58 122 106.5t217 48.5q135 0 228 -63t136.5 -171.5t43.5 -254.5v-551h-254v551q0 145 -43.5 212.5t-146.5 67.5q-61 0 -102.5 -15.5t-62.5 -45t-29.5 -62t-8.5 -75.5v-633h-252v551q0 161 -47 220.5 t-158 59.5q-118 0 -188 -83v-748h-254z" />
+<glyph unicode="n" horiz-adv-x="1130" d="M119 0v1024h237l4 -61q46 34 107 55.5t119 21.5q436 0 436 -489v-551h-254v551q0 144 -48.5 212t-154.5 68q-117 0 -192 -88v-743h-254z" />
+<glyph unicode="o" horiz-adv-x="1150" d="M57 510q0 145 60 264.5t179.5 192.5t278.5 73q120 0 219 -42.5t164 -115t100.5 -168.5t35.5 -204t-35.5 -204t-100.5 -168.5t-164 -115t-219 -42.5q-159 0 -278.5 73t-179.5 192.5t-60 264.5zM317 510q0 -145 68.5 -233.5t189.5 -88.5t190 88.5t69 233.5t-69 233t-190 88 t-189.5 -88t-68.5 -233z" />
+<glyph unicode="p" horiz-adv-x="1171" d="M119 -496v1520h221l20 -59q57 38 114.5 56.5t137.5 18.5q120 0 216.5 -42.5t158 -115.5t94.5 -168t33 -204t-33 -204t-94.5 -168t-158 -115.5t-216.5 -42.5q-76 0 -130.5 16.5t-108.5 52.5v-545h-254zM360 510q0 -149 58.5 -235.5t177.5 -86.5q121 0 189.5 88.5 t68.5 233.5t-68.5 233t-189.5 88q-119 0 -177.5 -86t-58.5 -235z" />
+<glyph unicode="q" horiz-adv-x="1171" d="M57 510q0 109 33 204t94.5 168t158 115.5t216.5 42.5q80 0 137.5 -18.5t114.5 -56.5l20 59h222v-1520h-254v545q-104 -69 -240 -69q-120 0 -216.5 42.5t-158 115.5t-94.5 168t-33 204zM317 510q0 -145 68.5 -233.5t189.5 -88.5q119 0 177.5 86.5t58.5 235.5t-58.5 235 t-177.5 86q-121 0 -189.5 -88t-68.5 -233z" />
+<glyph unicode="r" horiz-adv-x="700" d="M119 0v1024h237l6 -109q48 50 120.5 87.5t152.5 37.5h67l-49 -239h-94q-61 0 -112.5 -29.5t-73.5 -73.5v-698h-254z" />
+<glyph unicode="s" horiz-adv-x="866" d="M63 55l23 217q51 -39 142 -70.5t173 -31.5q84 0 120 33.5t36 79.5q0 25 -11 45.5t-25.5 33.5t-43.5 26.5t-49 20.5t-59 19q-31 9 -48 14.5t-46.5 16t-46 19t-40.5 22.5t-38.5 28.5t-30.5 34t-24.5 41.5t-14.5 50.5t-6 60.5q0 58 19 112t59.5 103.5t117 79.5t179.5 30 q95 0 186 -22.5t135 -52.5l-22 -217q-42 42 -122.5 76t-158.5 34q-73 0 -121.5 -27.5t-48.5 -85.5q0 -16 3.5 -29.5t11.5 -25t16 -20t24 -17t27.5 -13.5t33.5 -12t35.5 -11t40 -11.5t41.5 -11.5q47 -14 82.5 -27.5t75 -38.5t64.5 -56.5t42 -80.5t17 -110q0 -301 -401 -301 q-113 0 -206 21.5t-141 53.5z" />
+<glyph unicode="t" horiz-adv-x="704" d="M33 815l22 209h123v225l254 27v-252h225v-209h-225v-463q0 -43 1 -67t8 -44.5t15 -29t28.5 -15t41.5 -7.5t62 -1h69l-22 -208h-182q-135 0 -205 79t-70 189v567h-145z" />
+<glyph unicode="u" horiz-adv-x="1130" d="M109 473v551h253v-551q0 -144 48.5 -212t154.5 -68q120 0 193 86v745h254v-1024h-238l-4 61q-46 -35 -107.5 -58t-119.5 -23q-434 0 -434 493z" />
+<glyph unicode="v" horiz-adv-x="1015" d="M6 1024h250l252 -709l252 709h250l-394 -1024h-217z" />
+<glyph unicode="w" horiz-adv-x="1486" d="M20 1024h248l176 -715l193 695h213l190 -695l179 715h247l-299 -1024h-213l-211 668l-211 -668h-213z" />
+<glyph unicode="x" horiz-adv-x="1005" d="M20 0l330 512l-330 512h304l186 -289l172 289h303l-332 -512l332 -512h-303l-186 289l-172 -289h-304z" />
+<glyph unicode="y" horiz-adv-x="1099" d="M2 1024h283l262 -659l266 659h283l-641 -1520h-254l227 564z" />
+<glyph unicode="z" horiz-adv-x="966" d="M43 0l453 799h-433v225h863l-453 -799h430v-225h-860z" />
+<glyph unicode="{" horiz-adv-x="653" d="M29 629q94 51 131 113t37 178q0 47 -7.5 143.5t-7.5 134.5q0 171 101.5 254.5t345.5 83.5v-223q-65 0 -103.5 -2.5t-68.5 -17.5t-43 -28t-21 -54.5t-9 -75.5t-1 -111q0 -26 3 -83t3 -85q0 -77 -21.5 -133t-82.5 -94q61 -37 82.5 -87.5t21.5 -123.5q0 -26 -3 -87t-3 -95 q0 -78 1 -112t9 -76t21 -55t43 -28t68.5 -17.5t103.5 -2.5v-224q-240 0 -343.5 82t-103.5 256q0 37 7.5 135t7.5 146q0 111 -36 175t-132 114z" />
+<glyph unicode="|" horiz-adv-x="479" d="M137 -430v1966h205v-1966h-205z" />
+<glyph unicode="}" horiz-adv-x="653" d="M25 -55q65 0 103.5 2.5t68 17.5t42.5 28t21 55.5t9 76t1 111.5q0 34 -3 95t-3 87q0 73 22 123.5t83 87.5q-61 38 -83 94.5t-22 132.5q0 28 3 85t3 83q0 78 -1 111t-9 75.5t-21 55t-42.5 27.5t-68 17.5t-103.5 2.5v223q244 0 345 -83.5t101 -254.5q0 -38 -7 -134.5 t-7 -143.5q0 -116 37 -178t131 -113q-96 -50 -132 -114t-36 -175q0 -48 7 -146t7 -135q0 -174 -103 -256t-343 -82v224z" />
+<glyph unicode="~" horiz-adv-x="954" d="M94 391q10 97 87 153t169 56q52 0 96 -21.5t79.5 -43t66.5 -21.5q44 0 77 30.5t40 65.5l155 -41q-13 -84 -78 -146.5t-163 -62.5q-47 0 -96 21.5t-91 43t-74 21.5q-41 0 -66 -29.5t-32 -66.5z" />
+<glyph unicode="&#xa1;" horiz-adv-x="471" d="M109 -512l41 1126h172l40 -1126h-253zM109 770v254h253v-254h-253z" />
+<glyph unicode="&#xa2;" horiz-adv-x="974" d="M70 713q0 134 47 245.5t144.5 187.5t232.5 93l-37 293h196l-35 -291q149 -7 256 -74l-22 -217q-128 84 -264 84q-121 0 -189.5 -88t-68.5 -233t68.5 -233.5t189.5 -88.5q136 0 264 84l22 -217q-103 -67 -251 -76l30 -248h-196l32 252q-134 18 -230.5 94t-142.5 187.5 t-46 245.5z" />
+<glyph unicode="&#xa3;" horiz-adv-x="1075" d="M63 0q112 134 167.5 291t74.5 348h-182l41 172h151v213q0 68 6 120.5t27.5 112t57.5 98.5t101.5 65t154.5 26q250 0 303 -209l-99 -125q-14 42 -23.5 65.5t-28 50t-45.5 38.5t-64 12q-34 0 -60 -10t-42 -31.5t-26 -45.5t-14.5 -61.5t-6 -68.5t-1.5 -78v-172h375l-41 -172 h-342q-15 -236 -98 -426h497v-213h-883z" />
+<glyph unicode="&#xa4;" horiz-adv-x="1286" d="M113 141l147 199q-66 72 -100.5 168.5t-34.5 204.5q0 226 137 372l-149 199l123 102l151 -202q115 59 256 59q143 0 256 -61l154 204l123 -102l-150 -201q66 -71 100.5 -167t34.5 -203t-35.5 -204t-101.5 -169l152 -199l-123 -102l-154 203q-111 -60 -256 -60t-256 60 l-151 -203zM385 713q0 -145 68.5 -233.5t189.5 -88.5t189.5 88.5t68.5 233.5t-68.5 233t-189.5 88t-189.5 -88t-68.5 -233z" />
+<glyph unicode="&#xa5;" horiz-adv-x="1445" d="M55 1434h273l395 -566l395 566h273l-500 -744h299l-53 -141h-283v-125h336l-53 -141h-283v-283h-262v283h-338l49 141h289v125h-338l49 141h252z" />
+<glyph unicode="&#xa6;" horiz-adv-x="458" d="M139 389h180v-819h-180v819zM139 582v954h180v-954h-180z" />
+<glyph unicode="&#xa7;" horiz-adv-x="942" d="M80 680q0 228 174 301q-88 70 -88 213q0 49 10 95t35.5 92t64 79.5t101 54.5t141.5 21q82 0 170 -26t123 -58l-18 -215q-60 43 -133.5 72.5t-131.5 29.5q-184 0 -184 -118q0 -46 28.5 -79.5t74.5 -55t101 -42.5t110 -49t101 -65t74.5 -100.5t28.5 -147.5 q0 -229 -176 -301q88 -73 88 -213q0 -49 -10 -95t-35 -92t-63 -79.5t-100.5 -54.5t-141.5 -21q-82 0 -170 26t-123 58l19 215q60 -43 133 -72.5t131 -29.5q184 0 184 118q0 46 -28.5 79.5t-74.5 55t-101 42.5t-110 49t-101 65t-74.5 100.5t-28.5 147.5zM274 725 q0 -150 269 -219q37 0 83 43.5t46 87.5q0 28 -10.5 52t-23.5 41t-39.5 33t-44.5 25t-52.5 20t-49.5 15t-49 13q-39 0 -84 -34t-45 -77z" />
+<glyph unicode="&#xa8;" horiz-adv-x="864" d="M178 1217v217h199v-217h-199zM487 1217v217h199v-217h-199z" />
+<glyph unicode="&#xa9;" horiz-adv-x="1435" d="M82 748q0 150 48 276t132 212.5t202 134.5t255 48t254.5 -48t201.5 -134.5t131.5 -212.5t47.5 -276q0 -198 -81.5 -351.5t-226 -237t-327.5 -83.5q-137 0 -255 48.5t-202 135.5t-132 213t-48 275zM240 748q0 -115 30 -211t88.5 -168t150.5 -112t210 -40q155 0 264.5 70.5 t161 188.5t51.5 272q0 115 -30 210.5t-88.5 167t-150 111t-208.5 39.5q-233 0 -356 -145.5t-123 -382.5zM399 743q0 160 93.5 258.5t242.5 98.5q110 0 209 -47l-20 -174q-110 47 -189 47q-71 0 -110 -48.5t-39 -134.5q0 -83 39 -132.5t110 -49.5q85 0 189 51l20 -172 q-88 -51 -209 -51q-148 0 -242 98t-94 256z" />
+<glyph unicode="&#xaa;" horiz-adv-x="739" d="M61 1077q0 58 40.5 101.5t100.5 65.5t105.5 32t79.5 12q-3 0 -9 9t-24 18.5t-49 9.5q-41 0 -102.5 -14t-79.5 -17l-10 166q129 39 252 39q93 0 164 -46t71 -122v-219q0 -30 9 -39.5t24 -9.5h33l-9 -174q-94 0 -154 12.5t-81 28.5q-44 -41 -193 -41q-68 0 -118 47.5 t-50 140.5zM287 1081q0 -27 20.5 -43t52.5 -16q9 0 29 4v127q-49 -10 -75.5 -26t-26.5 -46z" />
+<glyph unicode="&#xab;" horiz-adv-x="1243" d="M23 582l311 422h301l-311 -422l311 -422h-301zM555 582l311 422h301l-311 -422l311 -422h-301z" />
+<glyph unicode="&#xac;" horiz-adv-x="1204" d="M123 639v192h942v-522h-193v330h-749z" />
+<glyph unicode="&#xad;" horiz-adv-x="856" d="M111 471v193h634v-193h-634z" />
+<glyph unicode="&#xae;" horiz-adv-x="1435" d="M82 748q0 150 48 276t132 212.5t202 134.5t255 48t254.5 -48t201.5 -134.5t131.5 -212.5t47.5 -276q0 -198 -81.5 -351.5t-226 -237t-327.5 -83.5q-137 0 -255 48.5t-202 135.5t-132 213t-48 275zM242 748q0 -153 51.5 -270.5t161 -188t264.5 -70.5t264 70.5t160 187.5 t51 271q0 115 -30 210.5t-87.5 166t-149 110t-208.5 39.5q-231 0 -354 -145t-123 -381zM461 416v686h260q115 0 179.5 -51t64.5 -174q0 -57 -28.5 -105.5t-68.5 -73.5l152 -282h-191l-127 229h-61v-229h-180zM641 811h49q54 0 72 18t18 52q0 35 -16.5 51t-69.5 16h-53v-137z " />
+<glyph unicode="&#xb0;" horiz-adv-x="665" d="M61 1266q0 118 73.5 199t197.5 81q125 0 198.5 -80.5t73.5 -199.5q0 -118 -73.5 -198.5t-198.5 -80.5q-124 0 -197.5 80.5t-73.5 198.5zM201 1266q0 -79 35 -126.5t96 -47.5q63 0 97 47t34 127t-34 128t-97 48q-61 0 -96 -48.5t-35 -127.5z" />
+<glyph unicode="&#xb1;" horiz-adv-x="997" d="M119 61v193h758v-193h-758zM119 635v192h282v263h193v-263h283v-192h-283v-262h-193v262h-282z" />
+<glyph unicode="&#xb2;" horiz-adv-x="632" d="M35 655q140 192 215 315.5t89.5 164t14.5 73.5q0 88 -73 88q-37 0 -72 -18t-59 -45t-37.5 -46.5t-20.5 -33.5l-24 178q28 50 92 82.5t155 32.5q62 0 108 -19t70 -50.5t35 -65t11 -68.5q0 -135 -166 -385h192v-203h-530z" />
+<glyph unicode="&#xb3;" horiz-adv-x="624" d="M35 700l49 185q21 -15 64.5 -30t91.5 -15q66 0 101.5 12t35.5 33q0 56 -19 86t-71 30h-135l14 148h70q30 0 52 7.5t32.5 19t15 20.5t4.5 16q0 76 -129 76q-68 0 -96 -26l-27 133q24 22 77.5 36.5t102.5 14.5q78 0 133.5 -22t82 -57.5t37.5 -69t11 -68.5q0 -37 -8.5 -72 t-17.5 -52t-14 -20q6 -14 26 -42.5t32.5 -62t12.5 -79.5q0 -124 -91 -193t-218 -69q-66 0 -136.5 22t-82.5 39z" />
+<glyph unicode="&#xb4;" horiz-adv-x="620" d="M119 1198v152l383 186v-213z" />
+<glyph unicode="&#xb5;" horiz-adv-x="1247" d="M141 -496v1520h254v-551q0 -144 48.5 -212t154.5 -68q120 0 193 86v745h253v-672q0 -78 8.5 -112t25 -43t57.5 -9h32l-22 -208h-92q-156 0 -222 106q-45 -43 -115 -72.5t-138 -29.5q-104 0 -183 28v-508h-254z" />
+<glyph unicode="&#xb6;" d="M68 954q0 92 37 176.5t107.5 153t185 109.5t257.5 41h533v-220h-141v-1214h-181v1214h-127v-1214h-141v469q-127 7 -230.5 51.5t-167.5 112.5t-98 150.5t-34 170.5z" />
+<glyph unicode="&#xb7;" horiz-adv-x="475" d="M111 436v266h254v-266h-254z" />
+<glyph unicode="&#xb8;" horiz-adv-x="620" d="M264 -397l144 272l213 19l-205 -273z" />
+<glyph unicode="&#xb9;" horiz-adv-x="452" d="M57 1157v152q38 0 75.5 39.5t45.5 81.5h156v-775h-197v519z" />
+<glyph unicode="&#xba;" horiz-adv-x="772" d="M57 1194q0 125 89.5 215t238.5 90q150 0 239 -90t89 -215t-89 -215t-239 -90q-149 0 -238.5 90t-89.5 215zM272 1194q0 -60 31 -103.5t82 -43.5t82 43.5t31 103.5t-31 103.5t-82 43.5t-82 -43.5t-31 -103.5z" />
+<glyph unicode="&#xbb;" horiz-adv-x="1243" d="M76 160l311 422l-311 422h301l311 -422l-311 -422h-301zM608 160l312 422l-312 422h301l312 -422l-312 -422h-301z" />
+<glyph unicode="&#xbc;" horiz-adv-x="1507" d="M88 1157v152q38 0 75.5 39.5t45.5 81.5h156v-775h-197v519zM121 -174l747 1608h275l-748 -1608h-274zM784 211l383 563h172v-418h101v-145h-101v-211h-196v211h-359zM1032 356h111v156z" />
+<glyph unicode="&#xbd;" horiz-adv-x="1501" d="M82 1157v152q38 0 75.5 39.5t45.5 81.5h155v-775h-196v519zM115 -174l747 1608h275l-748 -1608h-274zM899 0q140 192 215.5 315.5t90 164t14.5 73.5q0 88 -74 88q-37 0 -72 -18t-59 -45t-37.5 -46.5t-20.5 -33.5l-24 178q28 50 92.5 82.5t155.5 32.5q62 0 107.5 -19 t69.5 -50.5t35 -65t11 -68.5q0 -135 -166 -385h193v-203h-531z" />
+<glyph unicode="&#xbe;" horiz-adv-x="1851" d="M63 700l50 185q21 -15 64 -30t91 -15q66 0 102 12t36 33q0 55 -19.5 85.5t-71.5 30.5h-135l15 148h69q39 0 64.5 13.5t33 26.5t7.5 23q0 76 -129 76q-69 0 -97 -26l-26 133q24 22 77.5 36.5t102.5 14.5q78 0 133.5 -22t82 -57.5t37.5 -69t11 -68.5q0 -37 -9 -72t-18 -52 t-14 -20q6 -15 26 -43t33 -61.5t13 -79.5q0 -124 -91 -193t-218 -69q-66 0 -137 22t-83 39zM457 -174l747 1608h275l-748 -1608h-274zM1126 211l383 563h172v-418h101v-145h-101v-211h-196v211h-359zM1374 356h111v156z" />
+<glyph unicode="&#xbf;" horiz-adv-x="897" d="M94 -123q0 68 33 139.5t79.5 135t93 129t79.5 146t33 161.5v26h172q6 -92 6 -108q0 -71 -26.5 -141t-64 -128t-75 -114t-64 -119.5t-26.5 -124.5q0 -94 57 -142t150 -48q83 0 147.5 37t106.5 96l57 -189q-49 -72 -137 -108.5t-191 -36.5q-105 0 -190 37.5t-135.5 96 t-77.5 125t-27 130.5zM371 770v254h254v-254h-254z" />
+<glyph unicode="&#xc0;" d="M6 0l510 1434h248l510 -1434h-273l-122 346h-478l-122 -346h-273zM449 1733v213l382 -187v-151zM492 600h296l-149 420z" />
+<glyph unicode="&#xc1;" d="M6 0l510 1434h248l510 -1434h-273l-122 346h-478l-122 -346h-273zM449 1608v151l382 187v-213zM492 600h296l-149 420z" />
+<glyph unicode="&#xc2;" d="M6 0l510 1434h248l510 -1434h-273l-122 346h-478l-122 -346h-273zM338 1608v151l301 187l301 -187v-151l-301 145zM492 600h296l-149 420z" />
+<glyph unicode="&#xc3;" d="M6 0l510 1434h248l510 -1434h-273l-122 346h-478l-122 -346h-273zM254 1667q10 97 87 153t169 56q52 0 96 -21.5t79.5 -43t66.5 -21.5q44 0 76.5 30.5t39.5 65.5l156 -41q-13 -83 -78.5 -146t-163.5 -63q-47 0 -95.5 21.5t-90.5 43t-74 21.5q-41 0 -66 -29.5t-32 -66.5z M492 600h296l-149 420z" />
+<glyph unicode="&#xc4;" d="M6 0l510 1434h248l510 -1434h-273l-122 346h-478l-122 -346h-273zM385 1626v217h199v-217h-199zM492 600h296l-149 420zM694 1626v217h199v-217h-199z" />
+<glyph unicode="&#xc5;" d="M6 0l510 1434h248l510 -1434h-273l-122 346h-478l-122 -346h-273zM426 1772q0 77 58.5 130.5t154.5 53.5q97 0 155 -53t58 -131t-58 -130.5t-155 -52.5q-96 0 -154.5 53t-58.5 130zM492 600h296l-149 420zM549 1772q0 -38 25.5 -61t64.5 -23t64.5 23t25.5 61 q0 36 -25.5 59.5t-64.5 23.5t-64.5 -23.5t-25.5 -59.5z" />
+<glyph unicode="&#xc6;" horiz-adv-x="1775" d="M-23 0l699 1434h1012v-254h-607v-306h467v-253h-467v-367h625v-254h-893v346h-397l-166 -346h-273zM537 600h276v574z" />
+<glyph unicode="&#xc7;" horiz-adv-x="1249" d="M72 717q0 222 91 392t251 261.5t364 91.5q111 0 220 -22.5t188 -61.5l-29 -250q-103 41 -189.5 61.5t-189.5 20.5q-203 0 -311.5 -135t-108.5 -358t108.5 -358.5t311.5 -135.5q103 0 189.5 20.5t189.5 61.5l29 -250q-79 -39 -188 -61.5t-220 -22.5q-152 0 -283 53.5 t-224 150t-146 236.5t-53 306zM444 -397l144 272l213 19l-205 -273z" />
+<glyph unicode="&#xc8;" horiz-adv-x="1163" d="M158 0v1434h917v-254h-649v-306h504v-253h-504v-367h670v-254h-938zM369 1733v213l383 -187v-151z" />
+<glyph unicode="&#xc9;" horiz-adv-x="1163" d="M158 0v1434h917v-254h-649v-306h504v-253h-504v-367h670v-254h-938zM369 1608v151l383 187v-213z" />
+<glyph unicode="&#xca;" horiz-adv-x="1163" d="M158 0v1434h917v-254h-649v-306h504v-253h-504v-367h670v-254h-938zM258 1608v151l301 187l301 -187v-151l-301 145z" />
+<glyph unicode="&#xcb;" horiz-adv-x="1163" d="M158 0v1434h917v-254h-649v-306h504v-253h-504v-367h670v-254h-938zM305 1626v217h199v-217h-199zM614 1626v217h199v-217h-199z" />
+<glyph unicode="&#xcc;" horiz-adv-x="577" d="M98 1733v213l383 -187v-151zM158 0v1434h262v-1434h-262z" />
+<glyph unicode="&#xcd;" horiz-adv-x="577" d="M98 1608v151l383 187v-213zM158 0v1434h262v-1434h-262z" />
+<glyph unicode="&#xce;" horiz-adv-x="577" d="M-12 1608v151l301 187l301 -187v-151l-301 145zM158 0v1434h262v-1434h-262z" />
+<glyph unicode="&#xcf;" horiz-adv-x="577" d="M35 1626v217h198v-217h-198zM158 0v1434h262v-1434h-262zM344 1626v217h199v-217h-199z" />
+<glyph unicode="&#xd0;" horiz-adv-x="1497" d="M-8 612v193h188v629h537q153 0 283 -49t224 -140t146.5 -226.5t52.5 -301.5t-52.5 -301.5t-146.5 -226.5t-224 -140t-283 -49h-537v612h-188zM442 252h275q206 0 313 123t107 342t-107 342t-313 123h-275v-377h250v-193h-250v-360z" />
+<glyph unicode="&#xd1;" horiz-adv-x="1447" d="M158 0v1434h258l612 -926v926h262v-1434h-215l-655 983v-983h-262zM338 1667q10 97 87 153t169 56q52 0 96 -21.5t79.5 -43t66.5 -21.5q44 0 76.5 30.5t39.5 65.5l156 -41q-13 -83 -78.5 -146t-163.5 -63q-47 0 -95.5 21.5t-90.5 43t-74 21.5q-41 0 -66 -29.5t-32 -66.5z " />
+<glyph unicode="&#xd2;" horiz-adv-x="1556" d="M72 717q0 222 91 392t251 261.5t364 91.5t364.5 -91.5t251.5 -261.5t91 -392q0 -166 -53 -306t-146.5 -236.5t-224 -150t-283.5 -53.5q-152 0 -283 53.5t-224 150t-146 236.5t-53 306zM358 717q0 -223 108.5 -358.5t311.5 -135.5t311.5 135.5t108.5 358.5t-108.5 358 t-311.5 135t-311.5 -135t-108.5 -358zM586 1733v213l383 -187v-151z" />
+<glyph unicode="&#xd3;" horiz-adv-x="1556" d="M72 717q0 222 91 392t251 261.5t364 91.5t364.5 -91.5t251.5 -261.5t91 -392q0 -166 -53 -306t-146.5 -236.5t-224 -150t-283.5 -53.5q-152 0 -283 53.5t-224 150t-146 236.5t-53 306zM358 717q0 -223 108.5 -358.5t311.5 -135.5t311.5 135.5t108.5 358.5t-108.5 358 t-311.5 135t-311.5 -135t-108.5 -358zM586 1608v151l383 187v-213z" />
+<glyph unicode="&#xd4;" horiz-adv-x="1556" d="M72 717q0 222 91 392t251 261.5t364 91.5t364.5 -91.5t251.5 -261.5t91 -392q0 -166 -53 -306t-146.5 -236.5t-224 -150t-283.5 -53.5q-152 0 -283 53.5t-224 150t-146 236.5t-53 306zM358 717q0 -223 108.5 -358.5t311.5 -135.5t311.5 135.5t108.5 358.5t-108.5 358 t-311.5 135t-311.5 -135t-108.5 -358zM477 1608v151l301 187l301 -187v-151l-301 145z" />
+<glyph unicode="&#xd5;" horiz-adv-x="1556" d="M72 717q0 222 91 392t251 261.5t364 91.5t364.5 -91.5t251.5 -261.5t91 -392q0 -166 -53 -306t-146.5 -236.5t-224 -150t-283.5 -53.5q-152 0 -283 53.5t-224 150t-146 236.5t-53 306zM358 717q0 -223 108.5 -358.5t311.5 -135.5t311.5 135.5t108.5 358.5t-108.5 358 t-311.5 135t-311.5 -135t-108.5 -358zM393 1667q10 97 87 153t169 56q53 0 96.5 -21.5t79 -43t66.5 -21.5q44 0 77 30.5t40 65.5l155 -41q-13 -84 -78 -146.5t-163 -62.5q-47 0 -95.5 21.5t-90.5 43t-74 21.5q-42 0 -67 -29.5t-32 -66.5z" />
+<glyph unicode="&#xd6;" horiz-adv-x="1556" d="M72 717q0 222 91 392t251 261.5t364 91.5t364.5 -91.5t251.5 -261.5t91 -392q0 -166 -53 -306t-146.5 -236.5t-224 -150t-283.5 -53.5q-152 0 -283 53.5t-224 150t-146 236.5t-53 306zM358 717q0 -223 108.5 -358.5t311.5 -135.5t311.5 135.5t108.5 358.5t-108.5 358 t-311.5 135t-311.5 -135t-108.5 -358zM524 1626v217h199v-217h-199zM834 1626v217h198v-217h-198z" />
+<glyph unicode="&#xd7;" horiz-adv-x="917" d="M115 348l219 219l-219 219l125 125l219 -219l219 219l125 -125l-219 -219l219 -219l-125 -125l-219 219l-219 -219z" />
+<glyph unicode="&#xd8;" horiz-adv-x="1556" d="M72 717q0 222 91 392t251 261.5t364 91.5q176 0 320 -69l51 73h274l-141 -206q97 -98 150 -237.5t53 -305.5t-53 -306t-146.5 -236.5t-224 -150t-283.5 -53.5q-178 0 -329 74l-74 -108h-275l166 241q-194 207 -194 539zM358 717q0 -181 70 -303l522 764q-78 32 -172 32 q-203 0 -311.5 -135t-108.5 -358zM596 258q78 -35 182 -35q203 0 311.5 135.5t108.5 358.5q0 186 -76 311z" />
+<glyph unicode="&#xd9;" horiz-adv-x="1470" d="M141 614v820h262v-732q0 -86 8 -152.5t29.5 -130t58 -105t96 -66.5t140.5 -25t140.5 25t96 66.5t58 105t29.5 130t8 152.5v732h262v-820q0 -301 -150 -472t-444 -171t-444 171t-150 472zM543 1733v213l383 -187v-151z" />
+<glyph unicode="&#xda;" horiz-adv-x="1470" d="M141 614v820h262v-732q0 -86 8 -152.5t29.5 -130t58 -105t96 -66.5t140.5 -25t140.5 25t96 66.5t58 105t29.5 130t8 152.5v732h262v-820q0 -301 -150 -472t-444 -171t-444 171t-150 472zM543 1608v151l383 187v-213z" />
+<glyph unicode="&#xdb;" horiz-adv-x="1470" d="M141 614v820h262v-732q0 -86 8 -152.5t29.5 -130t58 -105t96 -66.5t140.5 -25t140.5 25t96 66.5t58 105t29.5 130t8 152.5v732h262v-820q0 -301 -150 -472t-444 -171t-444 171t-150 472zM434 1608v151l301 187l301 -187v-151l-301 145z" />
+<glyph unicode="&#xdc;" horiz-adv-x="1470" d="M141 614v820h262v-732q0 -86 8 -152.5t29.5 -130t58 -105t96 -66.5t140.5 -25t140.5 25t96 66.5t58 105t29.5 130t8 152.5v732h262v-820q0 -301 -150 -472t-444 -171t-444 171t-150 472zM481 1626v217h199v-217h-199zM791 1626v217h198v-217h-198z" />
+<glyph unicode="&#xdd;" horiz-adv-x="1224" d="M-14 1434h278l348 -566l349 566h278l-496 -799v-635h-262v635zM420 1608v151l383 187v-213z" />
+<glyph unicode="&#xde;" horiz-adv-x="1155" d="M158 0v1434h262v-269h94q104 0 179.5 -5t148 -19t120.5 -40t85.5 -66.5t55 -99.5t17.5 -138q0 -223 -146.5 -312.5t-459.5 -89.5h-94v-395h-262zM420 592h162q149 0 210.5 48t61.5 144q0 98 -59 139.5t-213 41.5h-162v-373z" />
+<glyph unicode="&#xdf;" horiz-adv-x="1157" d="M35 815l22 209h123v113q0 89 37 165.5t96 126.5t131.5 78.5t145.5 28.5q51 0 104.5 -13t107.5 -43.5t96 -73.5t68.5 -109.5t26.5 -145.5q0 -62 -16 -120.5t-38.5 -99.5t-45.5 -75.5t-39 -61t-16 -42.5q0 -22 28.5 -50t69 -62t81 -77t69 -111t28.5 -147q0 -91 -36 -157.5 t-100 -104.5t-142.5 -56t-173.5 -18q-61 0 -123 11v190q61 0 96.5 1t76 5.5t62 13t41.5 23.5t27.5 38t7.5 56q0 60 -29 113.5t-70 92t-82.5 73.5t-70.5 74t-29 77q0 37 28.5 82.5t62 84.5t62 102.5t28.5 132.5q0 94 -47 137t-115 43q-74 0 -116 -47.5t-42 -124.5v-1426h-250 v1094h-145z" />
+<glyph unicode="&#xe0;" horiz-adv-x="1019" d="M43 287q0 60 22 111t58 87t86 65t101.5 47.5t109 31t105.5 18t93 6.5q-5 89 -46 128.5t-138 39.5q-120 0 -280 -78l-23 207q188 90 373 90q179 0 274.5 -98t95.5 -313v-277q0 -78 8.5 -112t25 -43t57.5 -9h32l-22 -208h-92q-166 0 -230 118q-50 -56 -134.5 -87 t-178.5 -31q-128 0 -212.5 82.5t-84.5 224.5zM309 297q0 -63 32.5 -93t104.5 -30q38 0 88 19.5t87 54.5v233q-77 -3 -145 -22.5t-117.5 -62t-49.5 -99.5zM319 1323v213l383 -186v-152z" />
+<glyph unicode="&#xe1;" horiz-adv-x="1019" d="M43 287q0 60 22 111t58 87t86 65t101.5 47.5t109 31t105.5 18t93 6.5q-5 89 -46 128.5t-138 39.5q-120 0 -280 -78l-23 207q188 90 373 90q179 0 274.5 -98t95.5 -313v-277q0 -78 8.5 -112t25 -43t57.5 -9h32l-22 -208h-92q-166 0 -230 118q-50 -56 -134.5 -87 t-178.5 -31q-128 0 -212.5 82.5t-84.5 224.5zM309 297q0 -63 32.5 -93t104.5 -30q38 0 88 19.5t87 54.5v233q-77 -3 -145 -22.5t-117.5 -62t-49.5 -99.5zM319 1198v152l383 186v-213z" />
+<glyph unicode="&#xe2;" horiz-adv-x="1019" d="M43 287q0 60 22 111t58 87t86 65t101.5 47.5t109 31t105.5 18t93 6.5q-5 89 -46 128.5t-138 39.5q-120 0 -280 -78l-23 207q188 90 373 90q179 0 274.5 -98t95.5 -313v-277q0 -78 8.5 -112t25 -43t57.5 -9h32l-22 -208h-92q-166 0 -230 118q-50 -56 -134.5 -87 t-178.5 -31q-128 0 -212.5 82.5t-84.5 224.5zM211 1198v152l301 186l301 -186v-152l-301 145zM309 297q0 -63 32.5 -93t104.5 -30q38 0 88 19.5t87 54.5v233q-77 -3 -145 -22.5t-117.5 -62t-49.5 -99.5z" />
+<glyph unicode="&#xe3;" horiz-adv-x="1019" d="M43 287q0 60 22 111t58 87t86 65t101.5 47.5t109 31t105.5 18t93 6.5q-5 89 -46 128.5t-138 39.5q-120 0 -280 -78l-23 207q188 90 373 90q179 0 274.5 -98t95.5 -313v-277q0 -78 8.5 -112t25 -43t57.5 -9h32l-22 -208h-92q-166 0 -230 118q-50 -56 -134.5 -87 t-178.5 -31q-128 0 -212.5 82.5t-84.5 224.5zM121 1257q10 97 87 153t169 56q41 0 78 -13.5t59.5 -29.5t50 -29.5t53.5 -13.5q44 0 77 31t40 66l156 -41q-13 -83 -78.5 -146t-163.5 -63q-47 0 -95.5 21.5t-90.5 43t-74 21.5q-41 0 -66 -29.5t-32 -66.5zM309 297 q0 -63 32.5 -93t104.5 -30q38 0 88 19.5t87 54.5v233q-77 -3 -145 -22.5t-117.5 -62t-49.5 -99.5z" />
+<glyph unicode="&#xe4;" horiz-adv-x="1019" d="M43 287q0 60 22 111t58 87t86 65t101.5 47.5t109 31t105.5 18t93 6.5q-5 89 -46 128.5t-138 39.5q-120 0 -280 -78l-23 207q188 90 373 90q179 0 274.5 -98t95.5 -313v-277q0 -78 8.5 -112t25 -43t57.5 -9h32l-22 -208h-92q-166 0 -230 118q-50 -56 -134.5 -87 t-178.5 -31q-128 0 -212.5 82.5t-84.5 224.5zM258 1217v217h199v-217h-199zM309 297q0 -63 32.5 -93t104.5 -30q38 0 88 19.5t87 54.5v233q-77 -3 -145 -22.5t-117.5 -62t-49.5 -99.5zM567 1217v217h199v-217h-199z" />
+<glyph unicode="&#xe5;" horiz-adv-x="1019" d="M43 287q0 60 22 111t58 87t86 65t101.5 47.5t109 31t105.5 18t93 6.5q-5 89 -46 128.5t-138 39.5q-120 0 -280 -78l-23 207q188 90 373 90q179 0 274.5 -98t95.5 -313v-277q0 -78 8.5 -112t25 -43t57.5 -9h32l-22 -208h-92q-166 0 -230 118q-50 -56 -134.5 -87 t-178.5 -31q-128 0 -212.5 82.5t-84.5 224.5zM299 1362q0 77 58.5 130.5t154.5 53.5q97 0 155 -53t58 -131q0 -77 -58 -129.5t-155 -52.5q-96 0 -154.5 52.5t-58.5 129.5zM309 297q0 -63 32.5 -93t104.5 -30q38 0 88 19.5t87 54.5v233q-77 -3 -145 -22.5t-117.5 -62 t-49.5 -99.5zM422 1362q0 -38 25.5 -61t64.5 -23t64.5 23t25.5 61q0 37 -25.5 60.5t-64.5 23.5t-64.5 -23.5t-25.5 -60.5z" />
+<glyph unicode="&#xe6;" horiz-adv-x="1626" d="M41 260q0 65 21.5 119.5t56.5 92.5t85.5 68t101 47.5t110 30t106.5 18t96 7.5q-5 96 -46 137t-140 41q-120 0 -280 -78l-23 207q188 90 371 90q124 0 199 -40.5t110 -141.5q26 70 127 126t227 56q180 0 293 -120.5t113 -319.5q0 -60 -17 -143h-649q21 -135 102 -202 t191 -67q70 0 160 24.5t155 59.5l13 -215q-146 -77 -340 -77q-151 0 -256 51.5t-154 140.5q-75 -96 -169.5 -149.5t-227.5 -53.5q-160 0 -248 78t-88 213zM307 283q0 -53 35.5 -85t87.5 -32q77 0 142 67t65 181q0 34 -2 57q-55 -1 -109.5 -12t-105 -32t-82 -58.5 t-31.5 -85.5zM909 629h432q0 37 -9.5 71t-30 64.5t-58.5 48.5t-88 18q-93 0 -160 -56t-86 -146z" />
+<glyph unicode="&#xe7;" horiz-adv-x="919" d="M57 510q0 109 32.5 204t93 168.5t156.5 115.5t216 42q112 0 180.5 -19.5t126.5 -55.5l-22 -217q-127 83 -265 83q-121 0 -189.5 -88t-68.5 -233t68.5 -233.5t189.5 -88.5q137 0 265 84l22 -217q-58 -36 -126.5 -55.5t-180.5 -19.5q-120 0 -216 42t-156.5 115.5t-93 168.5 t-32.5 204zM340 -397l143 272l213 19l-204 -273z" />
+<glyph unicode="&#xe8;" horiz-adv-x="1054" d="M57 510q0 86 20.5 164.5t62 145t100 116t138 77t171.5 27.5q196 0 323 -122t127 -322q0 -61 -16 -139h-661q14 -91 62 -153.5t110 -89t133 -26.5q70 0 160 24.5t155 59.5l12 -215q-146 -77 -342 -77q-135 0 -242.5 42t-175 115.5t-102.5 168.5t-35 204zM328 629h413 q0 37 -10 71t-30.5 64t-57.5 48.5t-86 18.5q-94 0 -151.5 -54.5t-77.5 -147.5zM336 1323v213l383 -186v-152z" />
+<glyph unicode="&#xe9;" horiz-adv-x="1054" d="M57 510q0 86 20.5 164.5t62 145t100 116t138 77t171.5 27.5q196 0 323 -122t127 -322q0 -61 -16 -139h-661q14 -91 62 -153.5t110 -89t133 -26.5q70 0 160 24.5t155 59.5l12 -215q-146 -77 -342 -77q-135 0 -242.5 42t-175 115.5t-102.5 168.5t-35 204zM328 629h413 q0 37 -10 71t-30.5 64t-57.5 48.5t-86 18.5q-94 0 -151.5 -54.5t-77.5 -147.5zM336 1198v152l383 186v-213z" />
+<glyph unicode="&#xea;" horiz-adv-x="1054" d="M57 510q0 86 20.5 164.5t62 145t100 116t138 77t171.5 27.5q196 0 323 -122t127 -322q0 -61 -16 -139h-661q14 -91 62 -153.5t110 -89t133 -26.5q70 0 160 24.5t155 59.5l12 -215q-146 -77 -342 -77q-135 0 -242.5 42t-175 115.5t-102.5 168.5t-35 204zM225 1198v152 l301 186l301 -186v-152l-301 145zM328 629h413q0 37 -10 71t-30.5 64t-57.5 48.5t-86 18.5q-94 0 -151.5 -54.5t-77.5 -147.5z" />
+<glyph unicode="&#xeb;" horiz-adv-x="1054" d="M57 510q0 86 20.5 164.5t62 145t100 116t138 77t171.5 27.5q196 0 323 -122t127 -322q0 -61 -16 -139h-661q14 -91 62 -153.5t110 -89t133 -26.5q70 0 160 24.5t155 59.5l12 -215q-146 -77 -342 -77q-135 0 -242.5 42t-175 115.5t-102.5 168.5t-35 204zM272 1217v217h199 v-217h-199zM328 629h413q0 37 -10 71t-30.5 64t-57.5 48.5t-86 18.5q-94 0 -151.5 -54.5t-77.5 -147.5zM582 1217v217h198v-217h-198z" />
+<glyph unicode="&#xec;" horiz-adv-x="491" d="M55 1323v213l383 -186v-152zM119 0v1024h254v-1024h-254z" />
+<glyph unicode="&#xed;" horiz-adv-x="491" d="M55 1198v152l383 186v-213zM119 0v1024h254v-1024h-254z" />
+<glyph unicode="&#xee;" horiz-adv-x="491" d="M-55 1198v152l301 186l301 -186v-152l-301 145zM119 0v1024h254v-1024h-254z" />
+<glyph unicode="&#xef;" horiz-adv-x="491" d="M-8 1217v217h198v-217h-198zM119 0v1024h254v-1024h-254zM301 1217v217h199v-217h-199z" />
+<glyph unicode="&#xf0;" horiz-adv-x="1026" d="M33 420q0 67 17 131.5t53 123t86 102t122 69.5t156 26q139 0 240 -79q-7 69 -49.5 173.5t-90.5 135.5q-137 -103 -280 -117l-80 150q105 0 246 90q-120 99 -242 102l84 109q153 -3 297 -107q76 69 115 127l137 -33q-76 -118 -142 -192q121 -130 193 -313.5t72 -389.5 q0 -126 -29 -224.5t-75.5 -159.5t-110 -100.5t-126 -55t-130.5 -15.5q-198 0 -330.5 126.5t-132.5 320.5zM274 451q0 -113 58.5 -192t167.5 -79q92 0 156.5 61t64.5 183q0 119 -58 184.5t-169 65.5q-104 0 -162 -68.5t-58 -154.5z" />
+<glyph unicode="&#xf1;" horiz-adv-x="1130" d="M119 0v1024h237l4 -61q46 34 107 55.5t119 21.5q436 0 436 -489v-551h-254v551q0 144 -48.5 212t-154.5 68q-117 0 -192 -88v-743h-254zM180 1257q10 97 87 153t169 56q52 0 96 -21.5t79.5 -43t66.5 -21.5q44 0 77 31t40 66l155 -41q-13 -84 -78 -146.5t-163 -62.5 q-47 0 -95.5 21.5t-90.5 43t-74 21.5q-42 0 -67 -29.5t-32 -66.5z" />
+<glyph unicode="&#xf2;" horiz-adv-x="1150" d="M57 510q0 145 60 264.5t179.5 192.5t278.5 73q120 0 219 -42.5t164 -115t100.5 -168.5t35.5 -204t-35.5 -204t-100.5 -168.5t-164 -115t-219 -42.5q-159 0 -278.5 73t-179.5 192.5t-60 264.5zM317 510q0 -145 68.5 -233.5t189.5 -88.5t190 88.5t69 233.5t-69 233t-190 88 t-189.5 -88t-68.5 -233zM383 1323v213l383 -186v-152z" />
+<glyph unicode="&#xf3;" horiz-adv-x="1150" d="M57 510q0 145 60 264.5t179.5 192.5t278.5 73q120 0 219 -42.5t164 -115t100.5 -168.5t35.5 -204t-35.5 -204t-100.5 -168.5t-164 -115t-219 -42.5q-159 0 -278.5 73t-179.5 192.5t-60 264.5zM317 510q0 -145 68.5 -233.5t189.5 -88.5t190 88.5t69 233.5t-69 233t-190 88 t-189.5 -88t-68.5 -233zM383 1198v152l383 186v-213z" />
+<glyph unicode="&#xf4;" horiz-adv-x="1150" d="M57 510q0 145 60 264.5t179.5 192.5t278.5 73q120 0 219 -42.5t164 -115t100.5 -168.5t35.5 -204t-35.5 -204t-100.5 -168.5t-164 -115t-219 -42.5q-159 0 -278.5 73t-179.5 192.5t-60 264.5zM274 1198v152l301 186l302 -186v-152l-302 145zM317 510q0 -145 68.5 -233.5 t189.5 -88.5t190 88.5t69 233.5t-69 233t-190 88t-189.5 -88t-68.5 -233z" />
+<glyph unicode="&#xf5;" horiz-adv-x="1150" d="M57 510q0 145 60 264.5t179.5 192.5t278.5 73q120 0 219 -42.5t164 -115t100.5 -168.5t35.5 -204t-35.5 -204t-100.5 -168.5t-164 -115t-219 -42.5q-159 0 -278.5 73t-179.5 192.5t-60 264.5zM190 1257q10 97 87 153t169 56q53 0 96.5 -21.5t79 -43t66.5 -21.5 q44 0 77 31t40 66l156 -41q-13 -83 -78.5 -146t-163.5 -63q-47 0 -95.5 21.5t-90.5 43t-74 21.5q-42 0 -67 -29.5t-32 -66.5zM317 510q0 -145 68.5 -233.5t189.5 -88.5t190 88.5t69 233.5t-69 233t-190 88t-189.5 -88t-68.5 -233z" />
+<glyph unicode="&#xf6;" horiz-adv-x="1150" d="M57 510q0 145 60 264.5t179.5 192.5t278.5 73q120 0 219 -42.5t164 -115t100.5 -168.5t35.5 -204t-35.5 -204t-100.5 -168.5t-164 -115t-219 -42.5q-159 0 -278.5 73t-179.5 192.5t-60 264.5zM317 510q0 -145 68.5 -233.5t189.5 -88.5t190 88.5t69 233.5t-69 233t-190 88 t-189.5 -88t-68.5 -233zM322 1217v217h198v-217h-198zM631 1217v217h198v-217h-198z" />
+<glyph unicode="&#xf7;" horiz-adv-x="1148" d="M102 471v193h942v-193h-942zM438 41v266h254v-266h-254zM438 827v267h254v-267h-254z" />
+<glyph unicode="&#xf8;" horiz-adv-x="1150" d="M57 510q0 145 60 264.5t179.5 192.5t278.5 73q69 0 138 -16l32 70h224l-76 -154q96 -73 148.5 -186t52.5 -244q0 -108 -35.5 -204t-100.5 -168.5t-164 -115t-219 -42.5q-71 0 -143 16l-33 -70h-217l74 154q-96 71 -147.5 184.5t-51.5 245.5zM317 510q0 -120 48 -205 l251 522q-24 4 -41 4q-121 0 -189.5 -88t-68.5 -233zM528 193q35 -5 47 -5q121 0 190 88.5t69 233.5q0 116 -50 205z" />
+<glyph unicode="&#xf9;" horiz-adv-x="1130" d="M109 473v551h253v-551q0 -144 48.5 -212t154.5 -68q120 0 193 86v745h254v-1024h-238l-4 61q-46 -35 -107.5 -58t-119.5 -23q-434 0 -434 493zM373 1323v213l383 -186v-152z" />
+<glyph unicode="&#xfa;" horiz-adv-x="1130" d="M109 473v551h253v-551q0 -144 48.5 -212t154.5 -68q120 0 193 86v745h254v-1024h-238l-4 61q-46 -35 -107.5 -58t-119.5 -23q-434 0 -434 493zM373 1198v152l383 186v-213z" />
+<glyph unicode="&#xfb;" horiz-adv-x="1130" d="M109 473v551h253v-551q0 -144 48.5 -212t154.5 -68q120 0 193 86v745h254v-1024h-238l-4 61q-46 -35 -107.5 -58t-119.5 -23q-434 0 -434 493zM264 1198v152l301 186l301 -186v-152l-301 145z" />
+<glyph unicode="&#xfc;" horiz-adv-x="1130" d="M109 473v551h253v-551q0 -144 48.5 -212t154.5 -68q120 0 193 86v745h254v-1024h-238l-4 61q-46 -35 -107.5 -58t-119.5 -23q-434 0 -434 493zM311 1217v217h199v-217h-199zM621 1217v217h198v-217h-198z" />
+<glyph unicode="&#xfd;" horiz-adv-x="1099" d="M2 1024h283l262 -659l266 659h283l-641 -1520h-254l227 564zM358 1198v152l383 186v-213z" />
+<glyph unicode="&#xfe;" horiz-adv-x="1169" d="M117 -496v2032h254v-563q103 67 239 67q120 0 216.5 -42.5t158 -115.5t94.5 -168t33 -204t-33 -204t-94.5 -168t-158 -115.5t-216.5 -42.5q-76 0 -130.5 16.5t-108.5 52.5v-545h-254zM358 510q0 -149 58.5 -235.5t177.5 -86.5q121 0 189.5 88.5t68.5 233.5t-68.5 233 t-189.5 88q-119 0 -177.5 -86t-58.5 -235z" />
+<glyph unicode="&#xff;" horiz-adv-x="1099" d="M2 1024h283l262 -659l266 659h283l-641 -1520h-254l227 564zM295 1217v217h199v-217h-199zM604 1217v217h199v-217h-199z" />
+<glyph unicode="&#x152;" horiz-adv-x="2177" d="M72 717q0 222 91 392t251 261.5t364 91.5q250 0 436 -141v113h875v-254h-606v-306h467v-253h-467v-367h624v-254h-893v113q-188 -142 -436 -142q-152 0 -283 53.5t-224 150t-146 236.5t-53 306zM358 717q0 -223 108.5 -358.5t311.5 -135.5t311.5 135.5t108.5 358.5 t-108.5 358t-311.5 135t-311.5 -135t-108.5 -358z" />
+<glyph unicode="&#x153;" horiz-adv-x="1832" d="M57 510q0 145 60 264.5t179.5 192.5t278.5 73q241 0 386 -161q138 161 366 161q196 0 323.5 -122t127.5 -322q0 -56 -17 -139h-661q14 -91 62 -153.5t110 -89t133 -26.5q70 0 160 24.5t155 59.5l13 -215q-146 -77 -342 -77q-277 0 -426 165q-68 -78 -167.5 -121.5 t-222.5 -43.5q-159 0 -278.5 73t-179.5 192.5t-60 264.5zM317 510q0 -145 68.5 -233.5t189.5 -88.5t190 88.5t69 233.5t-69 233t-190 88t-189.5 -88t-68.5 -233zM1106 629h414q0 80 -45.5 141t-139.5 61t-151.5 -54.5t-77.5 -147.5z" />
+<glyph unicode="&#x178;" horiz-adv-x="1224" d="M-14 1434h278l348 -566l349 566h278l-496 -799v-635h-262v635zM358 1626v217h199v-217h-199zM668 1626v217h198v-217h-198z" />
+<glyph unicode="&#x2c6;" horiz-adv-x="913" d="M156 1198v152l301 186l301 -186v-152l-301 145z" />
+<glyph unicode="&#x2dc;" horiz-adv-x="1081" d="M156 1257q10 97 87 153t169 56q41 0 78 -13.5t59.5 -29.5t50 -29.5t53.5 -13.5q44 0 77 31t40 66l156 -41q-13 -83 -78.5 -146t-163.5 -63q-47 0 -95.5 21.5t-90.5 43t-74 21.5q-41 0 -66 -29.5t-32 -66.5z" />
+<glyph unicode="&#x2000;" horiz-adv-x="978" />
+<glyph unicode="&#x2001;" horiz-adv-x="1956" />
+<glyph unicode="&#x2002;" horiz-adv-x="978" />
+<glyph unicode="&#x2003;" horiz-adv-x="1956" />
+<glyph unicode="&#x2004;" horiz-adv-x="652" />
+<glyph unicode="&#x2005;" horiz-adv-x="489" />
+<glyph unicode="&#x2006;" horiz-adv-x="326" />
+<glyph unicode="&#x2007;" horiz-adv-x="326" />
+<glyph unicode="&#x2008;" horiz-adv-x="244" />
+<glyph unicode="&#x2009;" horiz-adv-x="391" />
+<glyph unicode="&#x200a;" horiz-adv-x="108" />
+<glyph unicode="&#x2010;" horiz-adv-x="856" d="M111 471v193h634v-193h-634z" />
+<glyph unicode="&#x2011;" horiz-adv-x="856" d="M111 471v193h634v-193h-634z" />
+<glyph unicode="&#x2012;" horiz-adv-x="856" d="M111 471v193h634v-193h-634z" />
+<glyph unicode="&#x2013;" horiz-adv-x="1015" d="M111 471v193h794v-193h-794z" />
+<glyph unicode="&#x2014;" horiz-adv-x="1204" d="M111 471v193h983v-193h-983z" />
+<glyph unicode="&#x2018;" horiz-adv-x="430" d="M88 1044v267l201 225l53 -29l-68 -176l68 -20v-267h-254z" />
+<glyph unicode="&#x2019;" horiz-adv-x="393" d="M84 1073l68 176l-68 21v266h254v-266l-201 -226z" />
+<glyph unicode="&#x201a;" horiz-adv-x="475" d="M111 0v266h254v-266l-201 -225l-53 28l67 177z" />
+<glyph unicode="&#x201c;" horiz-adv-x="860" d="M88 1044v267l201 225l53 -29l-68 -176l68 -20v-267h-254zM518 1044v267l201 225l53 -29l-67 -176l67 -20v-267h-254z" />
+<glyph unicode="&#x201d;" horiz-adv-x="823" d="M84 1073l68 176l-68 21v266h254v-266l-201 -226zM514 1073l68 176l-68 21v266h254v-266l-201 -226z" />
+<glyph unicode="&#x201e;" horiz-adv-x="946" d="M111 0v266h254v-266l-201 -225l-53 28l67 177zM582 0v266h254v-266l-201 -225l-53 28l67 177z" />
+<glyph unicode="&#x2022;" horiz-adv-x="610" d="M82 569q0 92 65.5 158t157.5 66t157.5 -66t65.5 -158t-65.5 -157.5t-157.5 -65.5t-157.5 65.5t-65.5 157.5z" />
+<glyph unicode="&#x2026;" horiz-adv-x="1441" d="M111 0v266h254v-266h-254zM594 0v266h254v-266h-254zM1077 0v266h254v-266h-254z" />
+<glyph unicode="&#x202f;" horiz-adv-x="391" />
+<glyph unicode="&#x2039;" horiz-adv-x="710" d="M23 582l311 422h301l-311 -422l311 -422h-301z" />
+<glyph unicode="&#x203a;" horiz-adv-x="710" d="M76 160l311 422l-311 422h301l311 -422l-311 -422h-301z" />
+<glyph unicode="&#x205f;" horiz-adv-x="489" />
+<glyph unicode="&#x20ac;" horiz-adv-x="1439" d="M66 428l61 176h188q-6 52 -6 113v28h-184l57 166h150q55 225 225 356.5t404 131.5q215 0 370 -76l-28 -231q-97 41 -174.5 61.5t-167.5 20.5q-140 0 -229.5 -69t-127.5 -194h514l-61 -166h-479v-28q0 -66 8 -113h493l-61 -176h-375q97 -168 318 -168q90 0 167.5 20.5 t174.5 61.5l28 -231q-155 -76 -370 -76q-207 0 -367.5 104.5t-233.5 288.5h-294z" />
+<glyph unicode="&#x2122;" horiz-adv-x="1513" d="M66 1274v160h575l-20 -160h-193v-584h-164v584h-198zM627 690l100 744h102l187 -304l184 304h105l100 -744h-170l-53 434l-156 -254h-22l-154 254l-55 -434h-168z" />
+<glyph unicode="&#x25fc;" horiz-adv-x="1024" d="M0 0v1024h1024v-1024h-1024z" />
+<hkern u1="&#x22;" u2="&#xee;" k="-35" />
+<hkern u1="&#x26;" u2="&#x2019;" k="94" />
+<hkern u1="&#x26;" u2="&#xf0;" k="10" />
+<hkern u1="&#x26;" u2="w" k="37" />
+<hkern u1="&#x26;" u2="v" k="47" />
+<hkern u1="&#x26;" u2="t" k="37" />
+<hkern u1="&#x26;" u2="l" k="18" />
+<hkern u1="&#x26;" u2="g" k="14" />
+<hkern u1="&#x26;" u2="W" k="68" />
+<hkern u1="&#x26;" u2="V" k="94" />
+<hkern u1="&#x26;" u2="T" k="109" />
+<hkern u1="&#x27;" u2="&#xee;" k="-35" />
+<hkern u1="&#x28;" u2="&#xf0;" k="41" />
+<hkern u1="&#x28;" u2="w" k="45" />
+<hkern u1="&#x28;" u2="v" k="43" />
+<hkern u1="&#x28;" u2="t" k="47" />
+<hkern u1="&#x28;" u2="g" k="37" />
+<hkern u1="&#x28;" u2="M" k="31" />
+<hkern u1="&#x28;" u2="J" k="-16" />
+<hkern u1="&#x28;" u2="&#x39;" k="18" />
+<hkern u1="&#x28;" u2="&#x38;" k="31" />
+<hkern u1="&#x28;" u2="&#x36;" k="51" />
+<hkern u1="&#x28;" u2="&#x34;" k="33" />
+<hkern u1="&#x28;" u2="&#x31;" k="20" />
+<hkern u1="&#x28;" u2="&#x30;" k="47" />
+<hkern u1="&#x2a;" u2="&#xf0;" k="41" />
+<hkern u1="&#x2a;" u2="&#xef;" k="-66" />
+<hkern u1="&#x2a;" u2="&#xee;" k="-113" />
+<hkern u1="&#x2a;" u2="&#xc6;" k="109" />
+<hkern u1="&#x2a;" u2="g" k="37" />
+<hkern u1="&#x2a;" u2="W" k="-20" />
+<hkern u1="&#x2a;" u2="V" k="-37" />
+<hkern u1="&#x2a;" u2="T" k="-29" />
+<hkern u1="&#x2a;" u2="M" k="39" />
+<hkern u1="&#x2b;" u2="&#x37;" k="72" />
+<hkern u1="&#x2b;" u2="&#x33;" k="23" />
+<hkern u1="&#x2b;" u2="&#x32;" k="68" />
+<hkern u1="&#x2b;" u2="&#x31;" k="51" />
+<hkern u1="&#x2c;" u2="&#x39;" k="31" />
+<hkern u1="&#x2c;" u2="&#x31;" k="37" />
+<hkern u1="&#x2c;" u2="&#x30;" k="18" />
+<hkern u1="&#x2d;" u2="&#x37;" k="37" />
+<hkern u1="&#x2d;" u2="&#x32;" k="23" />
+<hkern u1="&#x2d;" u2="&#x31;" k="27" />
+<hkern u1="&#x2e;" u2="w" k="37" />
+<hkern u1="&#x2e;" u2="v" k="53" />
+<hkern u1="&#x2e;" u2="t" k="29" />
+<hkern u1="&#x2e;" u2="W" k="57" />
+<hkern u1="&#x2e;" u2="V" k="76" />
+<hkern u1="&#x2e;" u2="T" k="80" />
+<hkern u1="&#x2e;" u2="&#x39;" k="31" />
+<hkern u1="&#x2e;" u2="&#x31;" k="37" />
+<hkern u1="&#x2e;" u2="&#x30;" k="18" />
+<hkern u1="&#x2f;" u2="&#xf0;" k="29" />
+<hkern u1="&#x2f;" u2="&#xee;" k="-20" />
+<hkern u1="&#x2f;" u2="&#xc6;" k="106" />
+<hkern u1="&#x2f;" u2="g" k="74" />
+<hkern u1="&#x2f;" u2="V" k="-10" />
+<hkern u1="&#x2f;" u2="M" k="41" />
+<hkern u1="&#x2f;" u2="&#x36;" k="53" />
+<hkern u1="&#x2f;" u2="&#x34;" k="76" />
+<hkern u1="&#x2f;" u2="&#x30;" k="18" />
+<hkern u1="&#x2f;" u2="&#x2f;" k="115" />
+<hkern u1="&#x30;" u2="&#x7d;" k="25" />
+<hkern u1="&#x30;" u2="]" k="27" />
+<hkern u1="&#x30;" u2="\" k="16" />
+<hkern u1="&#x30;" u2="Z" k="23" />
+<hkern u1="&#x30;" u2="Y" k="47" />
+<hkern u1="&#x30;" u2="X" k="23" />
+<hkern u1="&#x30;" u2="V" k="16" />
+<hkern u1="&#x30;" u2="T" k="20" />
+<hkern u1="&#x30;" u2="A" k="18" />
+<hkern u1="&#x30;" u2="&#x2f;" k="27" />
+<hkern u1="&#x30;" u2="&#x2e;" k="23" />
+<hkern u1="&#x30;" u2="&#x2c;" k="23" />
+<hkern u1="&#x30;" u2="&#x29;" k="47" />
+<hkern u1="&#x31;" u2="&#x2b;" k="16" />
+<hkern u1="&#x31;" u2="&#x29;" k="18" />
+<hkern u1="&#x32;" u2="&#xb7;" k="20" />
+<hkern u1="&#x32;" u2="&#x2d;" k="25" />
+<hkern u1="&#x32;" u2="&#x2b;" k="27" />
+<hkern u1="&#x33;" u2="Y" k="16" />
+<hkern u1="&#x33;" u2="&#x29;" k="31" />
+<hkern u1="&#x34;" u2="&#xb0;" k="23" />
+<hkern u1="&#x34;" u2="z" k="18" />
+<hkern u1="&#x34;" u2="\" k="18" />
+<hkern u1="&#x34;" u2="Y" k="31" />
+<hkern u1="&#x34;" u2="W" k="23" />
+<hkern u1="&#x34;" u2="V" k="23" />
+<hkern u1="&#x34;" u2="T" k="33" />
+<hkern u1="&#x34;" u2="&#x31;" k="16" />
+<hkern u1="&#x34;" u2="&#x29;" k="37" />
+<hkern u1="&#x35;" u2="y" k="16" />
+<hkern u1="&#x36;" u2="y" k="23" />
+<hkern u1="&#x36;" u2="Y" k="27" />
+<hkern u1="&#x36;" u2="W" k="16" />
+<hkern u1="&#x36;" u2="V" k="18" />
+<hkern u1="&#x36;" u2="T" k="33" />
+<hkern u1="&#x36;" u2="&#x29;" k="27" />
+<hkern u1="&#x37;" u2="&#xb7;" k="35" />
+<hkern u1="&#x37;" u2="&#x7d;" k="-43" />
+<hkern u1="&#x37;" u2="z" k="20" />
+<hkern u1="&#x37;" u2="u" k="41" />
+<hkern u1="&#x37;" u2="s" k="61" />
+<hkern u1="&#x37;" u2="g" k="66" />
+<hkern u1="&#x37;" u2="a" k="61" />
+<hkern u1="&#x37;" u2="]" k="-29" />
+<hkern u1="&#x37;" u2="Y" k="-74" />
+<hkern u1="&#x37;" u2="X" k="-43" />
+<hkern u1="&#x37;" u2="W" k="-53" />
+<hkern u1="&#x37;" u2="V" k="-61" />
+<hkern u1="&#x37;" u2="T" k="-43" />
+<hkern u1="&#x37;" u2="M" k="41" />
+<hkern u1="&#x37;" u2="A" k="90" />
+<hkern u1="&#x37;" u2="&#x3d;" k="25" />
+<hkern u1="&#x37;" u2="&#x36;" k="45" />
+<hkern u1="&#x37;" u2="&#x34;" k="68" />
+<hkern u1="&#x37;" u2="&#x30;" k="18" />
+<hkern u1="&#x37;" u2="&#x2f;" k="109" />
+<hkern u1="&#x37;" u2="&#x2e;" k="72" />
+<hkern u1="&#x37;" u2="&#x2d;" k="33" />
+<hkern u1="&#x37;" u2="&#x2c;" k="72" />
+<hkern u1="&#x37;" u2="&#x2b;" k="72" />
+<hkern u1="&#x37;" u2="&#x23;" k="51" />
+<hkern u1="&#x38;" u2="Y" k="18" />
+<hkern u1="&#x38;" u2="&#x29;" k="33" />
+<hkern u1="&#x39;" u2="M" k="20" />
+<hkern u1="&#x39;" u2="A" k="49" />
+<hkern u1="&#x39;" u2="&#x2f;" k="61" />
+<hkern u1="&#x39;" u2="&#x2e;" k="35" />
+<hkern u1="&#x39;" u2="&#x2c;" k="35" />
+<hkern u1="&#x39;" u2="&#x29;" k="37" />
+<hkern u1="&#x3d;" u2="&#x37;" k="31" />
+<hkern u1="&#x40;" u2="&#x2019;" k="39" />
+<hkern u1="&#x40;" u2="Z" k="33" />
+<hkern u1="&#x40;" u2="Y" k="90" />
+<hkern u1="&#x40;" u2="X" k="29" />
+<hkern u1="&#x40;" u2="W" k="43" />
+<hkern u1="&#x40;" u2="V" k="53" />
+<hkern u1="&#x40;" u2="T" k="88" />
+<hkern u1="A" u2="&#xf0;" k="10" />
+<hkern u1="A" u2="&#x39;" k="16" />
+<hkern u1="A" u2="&#x31;" k="29" />
+<hkern u1="B" u2="&#x2122;" k="20" />
+<hkern u1="B" u2="&#xc6;" k="16" />
+<hkern u1="B" u2="&#x7d;" k="35" />
+<hkern u1="B" u2="x" k="39" />
+<hkern u1="B" u2="w" k="29" />
+<hkern u1="B" u2="v" k="37" />
+<hkern u1="B" u2="t" k="31" />
+<hkern u1="B" u2="l" k="12" />
+<hkern u1="B" u2="g" k="14" />
+<hkern u1="B" u2="]" k="45" />
+<hkern u1="B" u2="\" k="33" />
+<hkern u1="B" u2="X" k="37" />
+<hkern u1="B" u2="W" k="25" />
+<hkern u1="B" u2="V" k="31" />
+<hkern u1="B" u2="T" k="43" />
+<hkern u1="B" u2="&#x3f;" k="25" />
+<hkern u1="B" u2="&#x37;" k="16" />
+<hkern u1="B" u2="&#x29;" k="43" />
+<hkern u1="C" u2="&#xee;" k="-45" />
+<hkern u1="D" u2="&#xf0;" k="10" />
+<hkern u1="D" u2="&#x37;" k="18" />
+<hkern u1="E" u2="&#xee;" k="-23" />
+<hkern u1="E" u2="&#x34;" k="59" />
+<hkern u1="F" u2="&#x2122;" k="-29" />
+<hkern u1="F" u2="&#xf0;" k="45" />
+<hkern u1="F" u2="&#xef;" k="-29" />
+<hkern u1="F" u2="&#xee;" k="-76" />
+<hkern u1="F" u2="&#xc6;" k="176" />
+<hkern u1="F" u2="&#x7d;" k="-12" />
+<hkern u1="F" u2="x" k="14" />
+<hkern u1="F" u2="t" k="23" />
+<hkern u1="F" u2="l" k="10" />
+<hkern u1="F" u2="g" k="68" />
+<hkern u1="F" u2="M" k="33" />
+<hkern u1="F" u2="&#x40;" k="61" />
+<hkern u1="F" u2="&#x3b;" k="27" />
+<hkern u1="F" u2="&#x3a;" k="25" />
+<hkern u1="F" u2="&#x36;" k="20" />
+<hkern u1="F" u2="&#x34;" k="59" />
+<hkern u1="F" u2="&#x2f;" k="104" />
+<hkern u1="F" u2="&#x2c;" k="131" />
+<hkern u1="F" u2="&#x2a;" k="-25" />
+<hkern u1="F" u2="&#x26;" k="14" />
+<hkern u1="G" u2="x" k="10" />
+<hkern u1="G" u2="w" k="18" />
+<hkern u1="G" u2="v" k="23" />
+<hkern u1="G" u2="t" k="18" />
+<hkern u1="G" u2="l" k="14" />
+<hkern u1="G" u2="g" k="12" />
+<hkern u1="J" u2="&#xf0;" k="20" />
+<hkern u1="J" u2="x" k="10" />
+<hkern u1="J" u2="w" k="18" />
+<hkern u1="J" u2="v" k="16" />
+<hkern u1="J" u2="t" k="27" />
+<hkern u1="J" u2="l" k="20" />
+<hkern u1="J" u2="g" k="31" />
+<hkern u1="J" u2="M" k="10" />
+<hkern u1="J" u2="&#x29;" k="18" />
+<hkern u1="K" u2="&#x2122;" k="-55" />
+<hkern u1="K" u2="&#xf0;" k="31" />
+<hkern u1="K" u2="&#xef;" k="-57" />
+<hkern u1="K" u2="&#xee;" k="-57" />
+<hkern u1="K" u2="&#xae;" k="39" />
+<hkern u1="K" u2="&#x7d;" k="-55" />
+<hkern u1="K" u2="w" k="88" />
+<hkern u1="K" u2="v" k="88" />
+<hkern u1="K" u2="t" k="72" />
+<hkern u1="K" u2="g" k="41" />
+<hkern u1="K" u2="]" k="-51" />
+<hkern u1="K" u2="&#x26;" k="20" />
+<hkern u1="L" u2="&#x2122;" k="164" />
+<hkern u1="L" u2="&#xb7;" k="92" />
+<hkern u1="L" u2="&#xae;" k="47" />
+<hkern u1="L" u2="w" k="80" />
+<hkern u1="L" u2="v" k="98" />
+<hkern u1="L" u2="t" k="37" />
+<hkern u1="L" u2="l" k="10" />
+<hkern u1="L" u2="g" k="14" />
+<hkern u1="L" u2="]" k="-25" />
+<hkern u1="L" u2="\" k="125" />
+<hkern u1="L" u2="W" k="109" />
+<hkern u1="L" u2="V" k="158" />
+<hkern u1="L" u2="T" k="125" />
+<hkern u1="L" u2="&#x3f;" k="35" />
+<hkern u1="L" u2="&#x39;" k="37" />
+<hkern u1="L" u2="&#x34;" k="74" />
+<hkern u1="L" u2="&#x31;" k="35" />
+<hkern u1="L" u2="&#x2a;" k="164" />
+<hkern u1="M" u2="&#x2122;" k="41" />
+<hkern u1="M" u2="&#xf0;" k="14" />
+<hkern u1="M" u2="&#xae;" k="16" />
+<hkern u1="M" u2="w" k="43" />
+<hkern u1="M" u2="v" k="47" />
+<hkern u1="M" u2="t" k="41" />
+<hkern u1="M" u2="l" k="25" />
+<hkern u1="M" u2="g" k="29" />
+<hkern u1="M" u2="\" k="35" />
+<hkern u1="M" u2="W" k="39" />
+<hkern u1="M" u2="V" k="41" />
+<hkern u1="M" u2="T" k="47" />
+<hkern u1="M" u2="J" k="10" />
+<hkern u1="M" u2="&#x3f;" k="25" />
+<hkern u1="M" u2="&#x31;" k="23" />
+<hkern u1="M" u2="&#x2a;" k="39" />
+<hkern u1="M" u2="&#x29;" k="27" />
+<hkern u1="P" u2="&#xf0;" k="31" />
+<hkern u1="P" u2="&#xee;" k="-43" />
+<hkern u1="P" u2="&#xc6;" k="133" />
+<hkern u1="P" u2="l" k="10" />
+<hkern u1="P" u2="g" k="18" />
+<hkern u1="P" u2="X" k="39" />
+<hkern u1="P" u2="M" k="23" />
+<hkern u1="P" u2="&#x40;" k="29" />
+<hkern u1="P" u2="&#x34;" k="27" />
+<hkern u1="P" u2="&#x2f;" k="88" />
+<hkern u1="P" u2="&#x2c;" k="162" />
+<hkern u1="P" u2="&#x29;" k="27" />
+<hkern u1="P" u2="&#x26;" k="10" />
+<hkern u1="R" u2="&#xf0;" k="27" />
+<hkern u1="R" u2="w" k="16" />
+<hkern u1="R" u2="v" k="16" />
+<hkern u1="R" u2="t" k="20" />
+<hkern u1="R" u2="l" k="20" />
+<hkern u1="R" u2="g" k="29" />
+<hkern u1="R" u2="]" k="-10" />
+<hkern u1="R" u2="V" k="10" />
+<hkern u1="R" u2="T" k="14" />
+<hkern u1="R" u2="&#x34;" k="43" />
+<hkern u1="T" u2="&#x2122;" k="-33" />
+<hkern u1="T" u2="&#xfe;" k="94" />
+<hkern u1="T" u2="&#xf1;" k="158" />
+<hkern u1="T" u2="&#xf0;" k="66" />
+<hkern u1="T" u2="&#xef;" k="-33" />
+<hkern u1="T" u2="&#xee;" k="-78" />
+<hkern u1="T" u2="&#xe3;" k="96" />
+<hkern u1="T" u2="&#xc6;" k="145" />
+<hkern u1="T" u2="&#xae;" k="25" />
+<hkern u1="T" u2="&#x7d;" k="-16" />
+<hkern u1="T" u2="x" k="170" />
+<hkern u1="T" u2="w" k="156" />
+<hkern u1="T" u2="v" k="160" />
+<hkern u1="T" u2="t" k="49" />
+<hkern u1="T" u2="l" k="10" />
+<hkern u1="T" u2="g" k="145" />
+<hkern u1="T" u2="T" k="-12" />
+<hkern u1="T" u2="M" k="47" />
+<hkern u1="T" u2="&#x40;" k="113" />
+<hkern u1="T" u2="&#x3b;" k="72" />
+<hkern u1="T" u2="&#x3a;" k="70" />
+<hkern u1="T" u2="&#x36;" k="63" />
+<hkern u1="T" u2="&#x34;" k="86" />
+<hkern u1="T" u2="&#x30;" k="20" />
+<hkern u1="T" u2="&#x2f;" k="98" />
+<hkern u1="T" u2="&#x2c;" k="80" />
+<hkern u1="T" u2="&#x2a;" k="-29" />
+<hkern u1="T" u2="&#x26;" k="18" />
+<hkern u1="U" u2="&#xf0;" k="20" />
+<hkern u1="V" u2="&#x2122;" k="-55" />
+<hkern u1="V" u2="&#xf0;" k="59" />
+<hkern u1="V" u2="&#xef;" k="-57" />
+<hkern u1="V" u2="&#xee;" k="-82" />
+<hkern u1="V" u2="&#xc6;" k="113" />
+<hkern u1="V" u2="&#xae;" k="20" />
+<hkern u1="V" u2="&#x7d;" k="-47" />
+<hkern u1="V" u2="x" k="23" />
+<hkern u1="V" u2="w" k="27" />
+<hkern u1="V" u2="v" k="23" />
+<hkern u1="V" u2="t" k="33" />
+<hkern u1="V" u2="g" k="88" />
+<hkern u1="V" u2="]" k="-43" />
+<hkern u1="V" u2="M" k="43" />
+<hkern u1="V" u2="&#x40;" k="82" />
+<hkern u1="V" u2="&#x3f;" k="-10" />
+<hkern u1="V" u2="&#x3b;" k="20" />
+<hkern u1="V" u2="&#x3a;" k="18" />
+<hkern u1="V" u2="&#x36;" k="47" />
+<hkern u1="V" u2="&#x34;" k="68" />
+<hkern u1="V" u2="&#x30;" k="18" />
+<hkern u1="V" u2="&#x2f;" k="102" />
+<hkern u1="V" u2="&#x2c;" k="74" />
+<hkern u1="V" u2="&#x2a;" k="-29" />
+<hkern u1="V" u2="&#x26;" k="23" />
+<hkern u1="W" u2="&#x2122;" k="-49" />
+<hkern u1="W" u2="&#xf0;" k="51" />
+<hkern u1="W" u2="&#xef;" k="-51" />
+<hkern u1="W" u2="&#xee;" k="-80" />
+<hkern u1="W" u2="&#xc6;" k="96" />
+<hkern u1="W" u2="&#x7d;" k="-45" />
+<hkern u1="W" u2="x" k="14" />
+<hkern u1="W" u2="w" k="18" />
+<hkern u1="W" u2="v" k="16" />
+<hkern u1="W" u2="t" k="27" />
+<hkern u1="W" u2="g" k="84" />
+<hkern u1="W" u2="]" k="-33" />
+<hkern u1="W" u2="M" k="37" />
+<hkern u1="W" u2="&#x40;" k="68" />
+<hkern u1="W" u2="&#x36;" k="31" />
+<hkern u1="W" u2="&#x34;" k="49" />
+<hkern u1="W" u2="&#x2f;" k="84" />
+<hkern u1="W" u2="&#x2c;" k="59" />
+<hkern u1="W" u2="&#x2a;" k="-31" />
+<hkern u1="W" u2="&#x26;" k="18" />
+<hkern u1="X" u2="&#x2122;" k="-37" />
+<hkern u1="X" u2="&#xf0;" k="27" />
+<hkern u1="X" u2="&#xef;" k="-37" />
+<hkern u1="X" u2="&#xee;" k="-43" />
+<hkern u1="X" u2="&#xae;" k="41" />
+<hkern u1="X" u2="&#x7d;" k="-27" />
+<hkern u1="X" u2="w" k="84" />
+<hkern u1="X" u2="v" k="88" />
+<hkern u1="X" u2="t" k="68" />
+<hkern u1="X" u2="g" k="35" />
+<hkern u1="X" u2="]" k="-57" />
+<hkern u1="X" u2="&#x26;" k="16" />
+<hkern u1="Y" u2="&#xfe;" k="47" />
+<hkern u1="Y" u2="&#xf0;" k="68" />
+<hkern u1="Y" u2="&#xef;" k="-78" />
+<hkern u1="Y" u2="&#xee;" k="-84" />
+<hkern u1="Y" u2="&#xec;" k="-14" />
+<hkern u1="Y" u2="&#x40;" k="121" />
+<hkern u1="Y" u2="&#x38;" k="18" />
+<hkern u1="Y" u2="&#x36;" k="78" />
+<hkern u1="Y" u2="&#x34;" k="104" />
+<hkern u1="Y" u2="&#x30;" k="47" />
+<hkern u1="Z" u2="&#xf0;" k="23" />
+<hkern u1="Z" u2="&#xef;" k="-49" />
+<hkern u1="Z" u2="&#xee;" k="-59" />
+<hkern u1="Z" u2="&#x34;" k="100" />
+<hkern u1="Z" u2="&#x30;" k="18" />
+<hkern u1="[" u2="&#xf0;" k="31" />
+<hkern u1="[" u2="&#xef;" k="-41" />
+<hkern u1="[" u2="&#xee;" k="-88" />
+<hkern u1="[" u2="&#xc6;" k="-53" />
+<hkern u1="[" u2="w" k="68" />
+<hkern u1="[" u2="v" k="70" />
+<hkern u1="[" u2="t" k="39" />
+<hkern u1="[" u2="j" k="-29" />
+<hkern u1="[" u2="X" k="-37" />
+<hkern u1="[" u2="W" k="-35" />
+<hkern u1="[" u2="V" k="-51" />
+<hkern u1="[" u2="T" k="-20" />
+<hkern u1="[" u2="J" k="-53" />
+<hkern u1="[" u2="&#x36;" k="39" />
+<hkern u1="[" u2="&#x34;" k="45" />
+<hkern u1="[" u2="&#x30;" k="33" />
+<hkern u1="\" u2="&#x2019;" k="78" />
+<hkern u1="\" u2="w" k="51" />
+<hkern u1="\" u2="v" k="70" />
+<hkern u1="\" u2="t" k="27" />
+<hkern u1="\" u2="W" k="82" />
+<hkern u1="\" u2="V" k="102" />
+<hkern u1="\" u2="T" k="98" />
+<hkern u1="\" u2="J" k="-41" />
+<hkern u1="\" u2="&#x39;" k="18" />
+<hkern u1="\" u2="&#x31;" k="25" />
+<hkern u1="\" u2="&#x30;" k="23" />
+<hkern u1="a" u2="Y" k="184" />
+<hkern u1="a" u2="W" k="92" />
+<hkern u1="a" u2="V" k="113" />
+<hkern u1="a" u2="U" k="59" />
+<hkern u1="a" u2="T" k="154" />
+<hkern u1="a" u2="S" k="16" />
+<hkern u1="a" u2="M" k="18" />
+<hkern u1="a" u2="J" k="35" />
+<hkern u1="a" u2="E" k="35" />
+<hkern u1="a" u2="&#x31;" k="39" />
+<hkern u1="b" u2="Z" k="61" />
+<hkern u1="b" u2="Y" k="174" />
+<hkern u1="b" u2="X" k="76" />
+<hkern u1="b" u2="W" k="90" />
+<hkern u1="b" u2="V" k="111" />
+<hkern u1="b" u2="U" k="37" />
+<hkern u1="b" u2="T" k="156" />
+<hkern u1="b" u2="S" k="31" />
+<hkern u1="b" u2="M" k="37" />
+<hkern u1="b" u2="J" k="39" />
+<hkern u1="b" u2="E" k="39" />
+<hkern u1="b" u2="&#x37;" k="53" />
+<hkern u1="b" u2="&#x32;" k="35" />
+<hkern u1="b" u2="&#x31;" k="35" />
+<hkern u1="c" u2="Y" k="86" />
+<hkern u1="c" u2="W" k="35" />
+<hkern u1="c" u2="V" k="41" />
+<hkern u1="c" u2="U" k="23" />
+<hkern u1="c" u2="T" k="117" />
+<hkern u1="c" u2="S" k="27" />
+<hkern u1="c" u2="M" k="10" />
+<hkern u1="c" u2="J" k="16" />
+<hkern u1="c" u2="E" k="16" />
+<hkern u1="c" u2="&#x34;" k="37" />
+<hkern u1="d" u2="Z" k="23" />
+<hkern u1="d" u2="Y" k="10" />
+<hkern u1="d" u2="W" k="18" />
+<hkern u1="d" u2="V" k="12" />
+<hkern u1="d" u2="U" k="35" />
+<hkern u1="d" u2="T" k="20" />
+<hkern u1="d" u2="S" k="20" />
+<hkern u1="d" u2="M" k="35" />
+<hkern u1="d" u2="J" k="29" />
+<hkern u1="d" u2="E" k="29" />
+<hkern u1="d" u2="&#x26;" k="25" />
+<hkern u1="e" u2="Z" k="27" />
+<hkern u1="e" u2="Y" k="170" />
+<hkern u1="e" u2="X" k="20" />
+<hkern u1="e" u2="W" k="90" />
+<hkern u1="e" u2="V" k="90" />
+<hkern u1="e" u2="U" k="33" />
+<hkern u1="e" u2="T" k="104" />
+<hkern u1="e" u2="S" k="25" />
+<hkern u1="e" u2="M" k="27" />
+<hkern u1="e" u2="J" k="33" />
+<hkern u1="e" u2="E" k="33" />
+<hkern u1="e" u2="&#x37;" k="39" />
+<hkern u1="e" u2="&#x31;" k="35" />
+<hkern u1="f" u2="&#x2122;" k="-14" />
+<hkern u1="f" u2="&#xf0;" k="27" />
+<hkern u1="f" u2="&#xee;" k="-25" />
+<hkern u1="f" u2="Z" k="23" />
+<hkern u1="f" u2="Y" k="-20" />
+<hkern u1="f" u2="U" k="18" />
+<hkern u1="f" u2="M" k="55" />
+<hkern u1="f" u2="J" k="25" />
+<hkern u1="f" u2="E" k="25" />
+<hkern u1="f" u2="&#x40;" k="25" />
+<hkern u1="f" u2="&#x34;" k="16" />
+<hkern u1="f" u2="&#x2f;" k="31" />
+<hkern u1="f" u2="&#x2c;" k="47" />
+<hkern u1="f" u2="&#x26;" k="41" />
+<hkern u1="g" u2="&#xf0;" k="8" />
+<hkern u1="g" u2="&#x7d;" k="-29" />
+<hkern u1="g" u2="j" k="-47" />
+<hkern u1="g" u2="]" k="-20" />
+<hkern u1="g" u2="Z" k="16" />
+<hkern u1="g" u2="Y" k="39" />
+<hkern u1="g" u2="W" k="29" />
+<hkern u1="g" u2="V" k="18" />
+<hkern u1="g" u2="U" k="23" />
+<hkern u1="g" u2="T" k="80" />
+<hkern u1="g" u2="M" k="27" />
+<hkern u1="g" u2="J" k="-57" />
+<hkern u1="g" u2="E" k="25" />
+<hkern u1="g" u2="&#x3f;" k="68" />
+<hkern u1="g" u2="&#x37;" k="20" />
+<hkern u1="g" u2="&#x2f;" k="-23" />
+<hkern u1="g" u2="&#x26;" k="25" />
+<hkern u1="k" u2="&#xf0;" k="29" />
+<hkern u1="k" u2="g" k="25" />
+<hkern u1="k" u2="]" k="-14" />
+<hkern u1="k" u2="Y" k="78" />
+<hkern u1="k" u2="W" k="18" />
+<hkern u1="k" u2="V" k="23" />
+<hkern u1="k" u2="U" k="18" />
+<hkern u1="k" u2="T" k="182" />
+<hkern u1="k" u2="J" k="14" />
+<hkern u1="k" u2="E" k="14" />
+<hkern u1="k" u2="&#x3f;" k="37" />
+<hkern u1="k" u2="&#x26;" k="39" />
+<hkern u1="l" u2="w" k="10" />
+<hkern u1="l" u2="v" k="10" />
+<hkern u1="l" u2="t" k="10" />
+<hkern u1="l" u2="g" k="8" />
+<hkern u1="l" u2="Y" k="29" />
+<hkern u1="l" u2="W" k="37" />
+<hkern u1="l" u2="V" k="31" />
+<hkern u1="l" u2="U" k="53" />
+<hkern u1="l" u2="T" k="41" />
+<hkern u1="l" u2="S" k="18" />
+<hkern u1="l" u2="M" k="23" />
+<hkern u1="l" u2="J" k="39" />
+<hkern u1="l" u2="E" k="39" />
+<hkern u1="l" u2="&#x2a;" k="18" />
+<hkern u1="l" u2="&#x26;" k="27" />
+<hkern u1="r" u2="&#xf0;" k="33" />
+<hkern u1="r" u2="&#x7d;" k="51" />
+<hkern u1="r" u2="g" k="8" />
+<hkern u1="r" u2="]" k="68" />
+<hkern u1="r" u2="Z" k="84" />
+<hkern u1="r" u2="Y" k="66" />
+<hkern u1="r" u2="X" k="94" />
+<hkern u1="r" u2="W" k="20" />
+<hkern u1="r" u2="V" k="25" />
+<hkern u1="r" u2="U" k="20" />
+<hkern u1="r" u2="T" k="152" />
+<hkern u1="r" u2="M" k="55" />
+<hkern u1="r" u2="J" k="27" />
+<hkern u1="r" u2="E" k="27" />
+<hkern u1="r" u2="&#x40;" k="43" />
+<hkern u1="r" u2="&#x3f;" k="94" />
+<hkern u1="r" u2="&#x37;" k="92" />
+<hkern u1="r" u2="&#x34;" k="31" />
+<hkern u1="r" u2="&#x33;" k="39" />
+<hkern u1="r" u2="&#x2f;" k="63" />
+<hkern u1="r" u2="&#x2c;" k="59" />
+<hkern u1="r" u2="&#x29;" k="43" />
+<hkern u1="r" u2="&#x26;" k="37" />
+<hkern u1="s" u2="Z" k="25" />
+<hkern u1="s" u2="Y" k="90" />
+<hkern u1="s" u2="X" k="23" />
+<hkern u1="s" u2="W" k="61" />
+<hkern u1="s" u2="V" k="72" />
+<hkern u1="s" u2="U" k="35" />
+<hkern u1="s" u2="T" k="96" />
+<hkern u1="s" u2="S" k="16" />
+<hkern u1="s" u2="M" k="25" />
+<hkern u1="s" u2="J" k="31" />
+<hkern u1="s" u2="E" k="31" />
+<hkern u1="s" u2="&#x37;" k="29" />
+<hkern u1="t" u2="&#x2122;" k="20" />
+<hkern u1="t" u2="\" k="18" />
+<hkern u1="t" u2="Z" k="18" />
+<hkern u1="t" u2="Y" k="90" />
+<hkern u1="t" u2="W" k="35" />
+<hkern u1="t" u2="V" k="41" />
+<hkern u1="t" u2="U" k="25" />
+<hkern u1="t" u2="T" k="88" />
+<hkern u1="t" u2="M" k="20" />
+<hkern u1="t" u2="J" k="23" />
+<hkern u1="t" u2="E" k="23" />
+<hkern u1="t" u2="&#x3f;" k="45" />
+<hkern u1="t" u2="&#x34;" k="41" />
+<hkern u1="t" u2="&#x26;" k="20" />
+<hkern u1="v" u2="&#xf0;" k="23" />
+<hkern u1="v" u2="&#x7d;" k="53" />
+<hkern u1="v" u2="g" k="12" />
+<hkern u1="v" u2="]" k="74" />
+<hkern u1="v" u2="Z" k="86" />
+<hkern u1="v" u2="Y" k="82" />
+<hkern u1="v" u2="X" k="96" />
+<hkern u1="v" u2="W" k="27" />
+<hkern u1="v" u2="V" k="31" />
+<hkern u1="v" u2="U" k="23" />
+<hkern u1="v" u2="T" k="168" />
+<hkern u1="v" u2="M" k="57" />
+<hkern u1="v" u2="J" k="27" />
+<hkern u1="v" u2="E" k="27" />
+<hkern u1="v" u2="&#x40;" k="35" />
+<hkern u1="v" u2="&#x3f;" k="94" />
+<hkern u1="v" u2="&#x37;" k="96" />
+<hkern u1="v" u2="&#x33;" k="41" />
+<hkern u1="v" u2="&#x2f;" k="70" />
+<hkern u1="v" u2="&#x2c;" k="53" />
+<hkern u1="v" u2="&#x29;" k="43" />
+<hkern u1="v" u2="&#x26;" k="33" />
+<hkern u1="w" u2="&#xf0;" k="14" />
+<hkern u1="w" u2="&#x7d;" k="51" />
+<hkern u1="w" u2="g" k="8" />
+<hkern u1="w" u2="]" k="68" />
+<hkern u1="w" u2="Z" k="76" />
+<hkern u1="w" u2="Y" k="92" />
+<hkern u1="w" u2="X" k="90" />
+<hkern u1="w" u2="W" k="31" />
+<hkern u1="w" u2="V" k="37" />
+<hkern u1="w" u2="U" k="23" />
+<hkern u1="w" u2="T" k="164" />
+<hkern u1="w" u2="M" k="53" />
+<hkern u1="w" u2="J" k="29" />
+<hkern u1="w" u2="E" k="29" />
+<hkern u1="w" u2="&#x40;" k="23" />
+<hkern u1="w" u2="&#x3f;" k="86" />
+<hkern u1="w" u2="&#x37;" k="86" />
+<hkern u1="w" u2="&#x33;" k="29" />
+<hkern u1="w" u2="&#x2f;" k="51" />
+<hkern u1="w" u2="&#x2c;" k="37" />
+<hkern u1="w" u2="&#x29;" k="45" />
+<hkern u1="w" u2="&#x26;" k="33" />
+<hkern u1="x" u2="&#x2122;" k="16" />
+<hkern u1="x" u2="&#xf0;" k="20" />
+<hkern u1="x" u2="g" k="16" />
+<hkern u1="x" u2="Y" k="86" />
+<hkern u1="x" u2="W" k="27" />
+<hkern u1="x" u2="V" k="33" />
+<hkern u1="x" u2="U" k="25" />
+<hkern u1="x" u2="T" k="178" />
+<hkern u1="x" u2="S" k="10" />
+<hkern u1="x" u2="M" k="16" />
+<hkern u1="x" u2="J" k="20" />
+<hkern u1="x" u2="E" k="20" />
+<hkern u1="x" u2="&#x3f;" k="53" />
+<hkern u1="x" u2="&#x26;" k="33" />
+<hkern u1="y" u2="&#xf0;" k="29" />
+<hkern u1="y" u2="Z" k="90" />
+<hkern u1="y" u2="Y" k="82" />
+<hkern u1="y" u2="X" k="98" />
+<hkern u1="y" u2="W" k="27" />
+<hkern u1="y" u2="V" k="31" />
+<hkern u1="y" u2="U" k="23" />
+<hkern u1="y" u2="T" k="168" />
+<hkern u1="y" u2="M" k="59" />
+<hkern u1="y" u2="J" k="27" />
+<hkern u1="y" u2="E" k="27" />
+<hkern u1="y" u2="&#x40;" k="43" />
+<hkern u1="y" u2="&#x37;" k="98" />
+<hkern u1="y" u2="&#x34;" k="18" />
+<hkern u1="y" u2="&#x33;" k="47" />
+<hkern u1="z" u2="Y" k="66" />
+<hkern u1="z" u2="W" k="29" />
+<hkern u1="z" u2="V" k="31" />
+<hkern u1="z" u2="U" k="33" />
+<hkern u1="z" u2="T" k="98" />
+<hkern u1="z" u2="M" k="23" />
+<hkern u1="z" u2="J" k="29" />
+<hkern u1="z" u2="E" k="29" />
+<hkern u1="z" u2="&#x34;" k="59" />
+<hkern u1="&#x7b;" u2="&#xf0;" k="25" />
+<hkern u1="&#x7b;" u2="&#xef;" k="-39" />
+<hkern u1="&#x7b;" u2="&#xee;" k="-86" />
+<hkern u1="&#x7b;" u2="&#xe3;" k="25" />
+<hkern u1="&#x7b;" u2="&#xc6;" k="-53" />
+<hkern u1="&#x7b;" u2="w" k="51" />
+<hkern u1="&#x7b;" u2="v" k="53" />
+<hkern u1="&#x7b;" u2="t" k="29" />
+<hkern u1="&#x7b;" u2="j" k="-27" />
+<hkern u1="&#x7b;" u2="g" k="16" />
+<hkern u1="&#x7b;" u2="X" k="-33" />
+<hkern u1="&#x7b;" u2="W" k="-33" />
+<hkern u1="&#x7b;" u2="V" k="-49" />
+<hkern u1="&#x7b;" u2="T" k="-16" />
+<hkern u1="&#x7b;" u2="J" k="-49" />
+<hkern u1="&#x7b;" u2="&#x36;" k="31" />
+<hkern u1="&#x7b;" u2="&#x34;" k="27" />
+<hkern u1="&#x7b;" u2="&#x30;" k="27" />
+<hkern u1="&#xa1;" u2="V" k="25" />
+<hkern u1="&#xa1;" u2="T" k="104" />
+<hkern u1="&#xae;" u2="&#xc6;" k="41" />
+<hkern u1="&#xae;" u2="X" k="41" />
+<hkern u1="&#xae;" u2="W" k="16" />
+<hkern u1="&#xae;" u2="V" k="23" />
+<hkern u1="&#xae;" u2="T" k="29" />
+<hkern u1="&#xae;" u2="M" k="18" />
+<hkern u1="&#xb0;" u2="&#x36;" k="35" />
+<hkern u1="&#xb0;" u2="&#x34;" k="55" />
+<hkern u1="&#xb7;" u2="&#x37;" k="39" />
+<hkern u1="&#xb7;" u2="&#x32;" k="25" />
+<hkern u1="&#xb7;" u2="&#x31;" k="29" />
+<hkern u1="&#xbb;" u2="&#xd0;" k="-33" />
+<hkern u1="&#xbf;" u2="&#xf0;" k="41" />
+<hkern u1="&#xbf;" u2="&#xc6;" k="49" />
+<hkern u1="&#xbf;" u2="x" k="35" />
+<hkern u1="&#xbf;" u2="w" k="25" />
+<hkern u1="&#xbf;" u2="v" k="25" />
+<hkern u1="&#xbf;" u2="t" k="29" />
+<hkern u1="&#xbf;" u2="l" k="39" />
+<hkern u1="&#xbf;" u2="j" k="-10" />
+<hkern u1="&#xbf;" u2="g" k="41" />
+<hkern u1="&#xbf;" u2="X" k="57" />
+<hkern u1="&#xbf;" u2="W" k="53" />
+<hkern u1="&#xbf;" u2="V" k="61" />
+<hkern u1="&#xbf;" u2="T" k="129" />
+<hkern u1="&#xbf;" u2="M" k="29" />
+<hkern u1="&#xbf;" u2="J" k="-10" />
+<hkern u1="&#xde;" u2="&#xc6;" k="106" />
+<hkern u1="&#xde;" u2="&#x7d;" k="53" />
+<hkern u1="&#xde;" u2="x" k="10" />
+<hkern u1="&#xde;" u2="a" k="16" />
+<hkern u1="&#xde;" u2="]" k="70" />
+<hkern u1="&#xde;" u2="\" k="16" />
+<hkern u1="&#xde;" u2="X" k="115" />
+<hkern u1="&#xde;" u2="V" k="14" />
+<hkern u1="&#xde;" u2="T" k="43" />
+<hkern u1="&#xde;" u2="M" k="12" />
+<hkern u1="&#xde;" u2="&#x3f;" k="47" />
+<hkern u1="&#xde;" u2="&#x2f;" k="66" />
+<hkern u1="&#xde;" u2="&#x2c;" k="88" />
+<hkern u1="&#xde;" u2="&#x29;" k="51" />
+<hkern u1="&#xdf;" u2="&#x2122;" k="29" />
+<hkern u1="&#xdf;" u2="z" k="8" />
+<hkern u1="&#xdf;" u2="y" k="16" />
+<hkern u1="&#xdf;" u2="x" k="8" />
+<hkern u1="&#xdf;" u2="w" k="14" />
+<hkern u1="&#xdf;" u2="v" k="16" />
+<hkern u1="&#xdf;" u2="t" k="16" />
+<hkern u1="&#xdf;" u2="f" k="14" />
+<hkern u1="&#xdf;" u2="\" k="16" />
+<hkern u1="&#xdf;" u2="&#x2a;" k="29" />
+<hkern u1="&#xdf;" u2="&#x29;" k="35" />
+<hkern u1="&#xdf;" u2="&#x26;" k="12" />
+<hkern u1="&#xe3;" u2="\" k="72" />
+<hkern u1="&#xee;" u2="&#x2122;" k="-113" />
+<hkern u1="&#xee;" u2="&#x201d;" k="-37" />
+<hkern u1="&#xee;" u2="&#x201c;" k="-33" />
+<hkern u1="&#xee;" u2="&#x2019;" k="-37" />
+<hkern u1="&#xee;" u2="&#x2018;" k="-33" />
+<hkern u1="&#xee;" u2="&#x7d;" k="-86" />
+<hkern u1="&#xee;" u2="]" k="-78" />
+<hkern u1="&#xee;" u2="\" k="-20" />
+<hkern u1="&#xee;" u2="&#x3f;" k="-70" />
+<hkern u1="&#xee;" u2="&#x2a;" k="-113" />
+<hkern u1="&#xee;" u2="&#x27;" k="-35" />
+<hkern u1="&#xee;" u2="&#x22;" k="-35" />
+<hkern u1="&#xef;" u2="&#x2122;" k="-66" />
+<hkern u1="&#xef;" u2="&#x7d;" k="-39" />
+<hkern u1="&#xef;" u2="]" k="-31" />
+<hkern u1="&#xef;" u2="&#x3f;" k="-14" />
+<hkern u1="&#xef;" u2="&#x2a;" k="-66" />
+<hkern u1="&#xf0;" u2="&#x2122;" k="23" />
+<hkern u1="&#xf0;" u2="x" k="10" />
+<hkern u1="&#xf0;" u2="]" k="20" />
+<hkern u1="&#xf0;" u2="&#x3f;" k="16" />
+<hkern u1="&#xf0;" u2="&#x2a;" k="29" />
+<hkern u1="&#xf0;" u2="&#x29;" k="39" />
+<hkern u1="&#xf0;" u2="&#x26;" k="18" />
+<hkern u1="&#x2018;" u2="&#xee;" k="-33" />
+<hkern u1="&#x2019;" u2="&#x2122;" k="-14" />
+<hkern u1="&#x2019;" u2="&#xef;" k="-12" />
+<hkern u1="&#x2019;" u2="&#xee;" k="-74" />
+<hkern u1="&#x2019;" u2="&#xae;" k="16" />
+<hkern u1="&#x2019;" u2="&#x40;" k="82" />
+<hkern u1="&#x2019;" u2="&#x2f;" k="92" />
+<hkern u1="&#x2019;" u2="&#x2a;" k="-10" />
+<hkern u1="&#x2019;" u2="&#x26;" k="23" />
+<hkern u1="&#x201c;" u2="&#xee;" k="-33" />
+<hkern u1="&#x201d;" u2="&#xef;" k="-12" />
+<hkern u1="&#x201d;" u2="&#xee;" k="-74" />
+<hkern u1="&#x203a;" u2="&#xd0;" k="-33" />
+<hkern u1="&#x2122;" u2="&#xd0;" k="-23" />
+<hkern u1="&#x2122;" u2="&#xc6;" k="57" />
+<hkern g1="asterisk" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	k="90" />
+<hkern g1="asterisk" 	g2="Y,Yacute,Ydieresis" 	k="-14" />
+<hkern g1="asterisk" 	g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring,ae" 	k="35" />
+<hkern g1="asterisk" 	g2="m,n,p,r,ntilde,thorn" 	k="23" />
+<hkern g1="asterisk" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="45" />
+<hkern g1="asterisk" 	g2="s" 	k="35" />
+<hkern g1="asterisk" 	g2="u,ugrave,uacute,ucircumflex,udieresis" 	k="16" />
+<hkern g1="at" 	g2="quotedbl,quotesingle" 	k="16" />
+<hkern g1="backslash" 	g2="Y,Yacute,Ydieresis" 	k="115" />
+<hkern g1="backslash" 	g2="u,ugrave,uacute,ucircumflex,udieresis" 	k="18" />
+<hkern g1="backslash" 	g2="quotedbl,quotesingle" 	k="72" />
+<hkern g1="backslash" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="39" />
+<hkern g1="backslash" 	g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" 	k="45" />
+<hkern g1="backslash" 	g2="y,yacute,ydieresis" 	k="76" />
+<hkern g1="braceleft" 	g2="Y,Yacute,Ydieresis" 	k="-57" />
+<hkern g1="braceleft" 	g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring,ae" 	k="39" />
+<hkern g1="braceleft" 	g2="m,n,p,r,ntilde,thorn" 	k="18" />
+<hkern g1="braceleft" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="59" />
+<hkern g1="braceleft" 	g2="s" 	k="27" />
+<hkern g1="braceleft" 	g2="u,ugrave,uacute,ucircumflex,udieresis" 	k="55" />
+<hkern g1="braceleft" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="43" />
+<hkern g1="braceleft" 	g2="y,yacute,ydieresis" 	k="53" />
+<hkern g1="bracketleft" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	k="-16" />
+<hkern g1="bracketleft" 	g2="Y,Yacute,Ydieresis" 	k="-57" />
+<hkern g1="bracketleft" 	g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring,ae" 	k="49" />
+<hkern g1="bracketleft" 	g2="m,n,p,r,ntilde,thorn" 	k="23" />
+<hkern g1="bracketleft" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="72" />
+<hkern g1="bracketleft" 	g2="s" 	k="43" />
+<hkern g1="bracketleft" 	g2="u,ugrave,uacute,ucircumflex,udieresis" 	k="68" />
+<hkern g1="bracketleft" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="49" />
+<hkern g1="bracketleft" 	g2="y,yacute,ydieresis" 	k="70" />
+<hkern g1="exclamdown" 	g2="Y,Yacute,Ydieresis" 	k="61" />
+<hkern g1="four" 	g2="quotedbl,quotesingle" 	k="27" />
+<hkern g1="guillemotleft,guilsinglleft" 	g2="Y,Yacute,Ydieresis" 	k="61" />
+<hkern g1="guillemotleft,guilsinglleft" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="18" />
+<hkern g1="guillemotleft,guilsinglleft" 	g2="T" 	k="117" />
+<hkern g1="guillemotleft,guilsinglleft" 	g2="V" 	k="20" />
+<hkern g1="guillemotright,guilsinglright" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	k="18" />
+<hkern g1="guillemotright,guilsinglright" 	g2="Y,Yacute,Ydieresis" 	k="119" />
+<hkern g1="guillemotright,guilsinglright" 	g2="quotedbl,quotesingle" 	k="29" />
+<hkern g1="guillemotright,guilsinglright" 	g2="y,yacute,ydieresis" 	k="20" />
+<hkern g1="guillemotright,guilsinglright" 	g2="T" 	k="115" />
+<hkern g1="guillemotright,guilsinglright" 	g2="V" 	k="68" />
+<hkern g1="guillemotright,guilsinglright" 	g2="AE" 	k="27" />
+<hkern g1="guillemotright,guilsinglright" 	g2="S" 	k="27" />
+<hkern g1="guillemotright,guilsinglright" 	g2="W" 	k="53" />
+<hkern g1="guillemotright,guilsinglright" 	g2="X" 	k="61" />
+<hkern g1="guillemotright,guilsinglright" 	g2="Z" 	k="63" />
+<hkern g1="guillemotright,guilsinglright" 	g2="quoteright,quotedblright" 	k="45" />
+<hkern g1="guillemotright,guilsinglright" 	g2="x" 	k="43" />
+<hkern g1="guillemotright,guilsinglright" 	g2="z" 	k="29" />
+<hkern g1="hyphen,endash,emdash" 	g2="Y,Yacute,Ydieresis" 	k="72" />
+<hkern g1="hyphen,endash,emdash" 	g2="quotedbl,quotesingle" 	k="55" />
+<hkern g1="hyphen,endash,emdash" 	g2="T" 	k="78" />
+<hkern g1="hyphen,endash,emdash" 	g2="V" 	k="35" />
+<hkern g1="hyphen,endash,emdash" 	g2="W" 	k="18" />
+<hkern g1="hyphen,endash,emdash" 	g2="X" 	k="27" />
+<hkern g1="hyphen,endash,emdash" 	g2="Z" 	k="35" />
+<hkern g1="hyphen,endash,emdash" 	g2="quoteright,quotedblright" 	k="20" />
+<hkern g1="hyphen,endash,emdash" 	g2="x" 	k="20" />
+<hkern g1="parenleft" 	g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring,ae" 	k="47" />
+<hkern g1="parenleft" 	g2="m,n,p,r,ntilde,thorn" 	k="43" />
+<hkern g1="parenleft" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="61" />
+<hkern g1="parenleft" 	g2="s" 	k="41" />
+<hkern g1="parenleft" 	g2="u,ugrave,uacute,ucircumflex,udieresis" 	k="55" />
+<hkern g1="parenleft" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="51" />
+<hkern g1="parenleft" 	g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" 	k="25" />
+<hkern g1="parenleft" 	g2="y,yacute,ydieresis" 	k="41" />
+<hkern g1="parenleft" 	g2="S" 	k="20" />
+<hkern g1="parenleft" 	g2="z" 	k="16" />
+<hkern g1="parenleft" 	g2="E,Egrave,Eacute,Ecircumflex,Edieresis" 	k="23" />
+<hkern g1="parenleft" 	g2="B,D,F,H,I,K,L,N,P,R,Igrave,Iacute,Icircumflex,Idieresis,Eth,Ntilde,Thorn" 	k="23" />
+<hkern g1="parenleft" 	g2="f,germandbls" 	k="31" />
+<hkern g1="period" 	g2="Y,Yacute,Ydieresis" 	k="88" />
+<hkern g1="period" 	g2="quotedbl,quotesingle" 	k="205" />
+<hkern g1="period" 	g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" 	k="18" />
+<hkern g1="period" 	g2="y,yacute,ydieresis" 	k="63" />
+<hkern g1="period" 	g2="quoteright,quotedblright" 	k="236" />
+<hkern g1="period" 	g2="f,germandbls" 	k="27" />
+<hkern g1="period" 	g2="quoteleft,quotedblleft" 	k="229" />
+<hkern g1="questiondown" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	k="57" />
+<hkern g1="questiondown" 	g2="Y,Yacute,Ydieresis" 	k="88" />
+<hkern g1="questiondown" 	g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring,ae" 	k="45" />
+<hkern g1="questiondown" 	g2="m,n,p,r,ntilde,thorn" 	k="41" />
+<hkern g1="questiondown" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="47" />
+<hkern g1="questiondown" 	g2="s" 	k="37" />
+<hkern g1="questiondown" 	g2="u,ugrave,uacute,ucircumflex,udieresis" 	k="43" />
+<hkern g1="questiondown" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="23" />
+<hkern g1="questiondown" 	g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" 	k="43" />
+<hkern g1="questiondown" 	g2="y,yacute,ydieresis" 	k="25" />
+<hkern g1="questiondown" 	g2="S" 	k="18" />
+<hkern g1="questiondown" 	g2="Z" 	k="70" />
+<hkern g1="questiondown" 	g2="z" 	k="35" />
+<hkern g1="questiondown" 	g2="E,Egrave,Eacute,Ecircumflex,Edieresis" 	k="27" />
+<hkern g1="questiondown" 	g2="B,D,F,H,I,K,L,N,P,R,Igrave,Iacute,Icircumflex,Idieresis,Eth,Ntilde,Thorn" 	k="27" />
+<hkern g1="questiondown" 	g2="f,germandbls" 	k="25" />
+<hkern g1="questiondown" 	g2="b,h,k" 	k="31" />
+<hkern g1="questiondown" 	g2="i,j,igrave,iacute,icircumflex,idieresis" 	k="39" />
+<hkern g1="quoteleft,quotedblleft" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	k="94" />
+<hkern g1="quoteleft,quotedblleft" 	g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring,ae" 	k="33" />
+<hkern g1="quoteleft,quotedblleft" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="63" />
+<hkern g1="quoteleft,quotedblleft" 	g2="s" 	k="39" />
+<hkern g1="quoteleft,quotedblleft" 	g2="AE" 	k="119" />
+<hkern g1="quoteleft,quotedblleft" 	g2="M" 	k="39" />
+<hkern g1="quoteleft,quotedblleft" 	g2="comma" 	k="229" />
+<hkern g1="quoteleft,quotedblleft" 	g2="eth" 	k="37" />
+<hkern g1="quoteleft,quotedblleft" 	g2="g" 	k="47" />
+<hkern g1="quoteleft,quotedblleft" 	g2="period,ellipsis" 	k="229" />
+<hkern g1="quoteright,quotedblright" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	k="106" />
+<hkern g1="quoteright,quotedblright" 	g2="Y,Yacute,Ydieresis" 	k="-23" />
+<hkern g1="quoteright,quotedblright" 	g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring,ae" 	k="61" />
+<hkern g1="quoteright,quotedblright" 	g2="m,n,p,r,ntilde,t

<TRUNCATED>
http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/fonts/Cabin-Bold-webfont.ttf
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/fonts/Cabin-Bold-webfont.ttf b/falcon-ui/app/css/fonts/Cabin-Bold-webfont.ttf
new file mode 100644
index 0000000..59c3ecb
Binary files /dev/null and b/falcon-ui/app/css/fonts/Cabin-Bold-webfont.ttf differ


[17/22] falcon git commit: FALCON-1315 Update falcon ui for HiveDR, secure clusters and bug fixes. Contributed by Armando Reyna/Venkat Ranganathan.

Posted by so...@apache.org.
http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/fonts/Cabin-Regular-webfont.svg
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/fonts/Cabin-Regular-webfont.svg b/falcon-ui/app/css/fonts/Cabin-Regular-webfont.svg
new file mode 100644
index 0000000..5dbabd2
--- /dev/null
+++ b/falcon-ui/app/css/fonts/Cabin-Regular-webfont.svg
@@ -0,0 +1,1991 @@
+<?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" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
+<metadata></metadata>
+<defs>
+<font id="cabinregular" horiz-adv-x="1261" >
+<font-face units-per-em="2048" ascent="1638" descent="-410" />
+<missing-glyph horiz-adv-x="460" />
+<glyph horiz-adv-x="0" />
+<glyph horiz-adv-x="682" />
+<glyph unicode=" "  horiz-adv-x="460" />
+<glyph unicode="&#x09;" horiz-adv-x="460" />
+<glyph unicode="&#xa0;" horiz-adv-x="460" />
+<glyph unicode="!" horiz-adv-x="495" d="M121 1536h254l-62 -1126h-131zM162 0v176h172v-176h-172z" />
+<glyph unicode="&#x22;" horiz-adv-x="823" d="M82 1536h192l-41 -614h-110zM553 1536h188l-41 -614h-106z" />
+<glyph unicode="#" horiz-adv-x="1441" d="M68 442l82 187h235l92 235h-258l60 174h264l151 396h166l-153 -396h272l154 396h163l-151 -396h231l-59 -174h-238l-92 -235h262l-84 -187h-250l-176 -465h-166l179 465h-273l-178 -465h-164l176 465h-245zM551 629h270l92 235h-270z" />
+<glyph unicode="$" horiz-adv-x="1052" d="M86 975q0 42 11 81t39 79t70 71.5t109 54.5t152 31l-35 240h184l-32 -240q103 -6 193.5 -27.5t135.5 -47.5l-18 -197q-209 98 -342 98q-105 0 -176.5 -28t-71.5 -91q0 -40 29 -70t76.5 -48t108 -37.5t123.5 -36t123.5 -44.5t108 -62.5t76.5 -91.5t29 -130q0 -38 -8 -72.5 t-33 -76t-66.5 -73t-115.5 -56.5t-172 -33l30 -234h-182l35 232q-119 6 -214.5 28t-146.5 50l25 223q65 -52 162.5 -85.5t218.5 -33.5q107 0 166 29t59 100q0 49 -36 85.5t-93.5 60t-126.5 44t-138.5 45.5t-127 56.5t-93.5 84.5t-36 122z" />
+<glyph unicode="%" horiz-adv-x="1720" d="M72 1055q0 180 89 284.5t220 104.5t215 -98t84 -273q0 -184 -86 -287.5t-223 -103.5q-134 0 -216.5 98.5t-82.5 274.5zM186 1055q0 -118 55 -192.5t132 -74.5q83 0 138.5 78.5t55.5 206.5q0 116 -56 191t-132 75q-80 0 -136.5 -79t-56.5 -205zM332 -25l862 1459h152 l-861 -1459h-153zM1034 350q0 179 91 285t223 106q133 0 218 -100t85 -274q0 -184 -86.5 -289t-227.5 -105q-136 0 -219.5 100t-83.5 277zM1137 350q0 -130 53 -203t143 -73q96 0 150.5 77t54.5 216q0 128 -56 203t-143 75t-144.5 -80t-57.5 -215z" />
+<glyph unicode="&#x26;" horiz-adv-x="1251" d="M74 332q0 120 61.5 221t196.5 197q-154 188 -154 348q0 156 115.5 249t284.5 93q145 0 218.5 -71.5t73.5 -186.5q0 -245 -335 -453l389 -399q38 48 56.5 165t23.5 224h165q-11 -321 -133 -514l178 -205h-188l-90 94q-91 -78 -178.5 -109.5t-206.5 -31.5q-124 0 -218 29.5 t-149.5 82t-82.5 119.5t-27 148zM252 346q0 -112 76.5 -183t226.5 -71q184 0 289 123l-426 426q-75 -53 -120.5 -130t-45.5 -165zM344 1094q0 -124 113 -263q16 12 50 39t47 37.5t39.5 32.5t37 33t28.5 30.5t25 33t16 32.5t12 37t3 39q0 73 -43.5 113t-118.5 40 q-88 0 -148.5 -53t-60.5 -151z" />
+<glyph unicode="'" horiz-adv-x="372" d="M84 1536h205l-37 -614h-131z" />
+<glyph unicode="(" horiz-adv-x="534" d="M86 629q0 306 60 516.5t178 390.5h161q-252 -409 -252 -907q0 -499 252 -908h-161q-118 179 -178 390.5t-60 517.5z" />
+<glyph unicode=")" horiz-adv-x="534" d="M49 -279q252 409 252 908q0 498 -252 907h162q118 -180 178 -390.5t60 -516.5t-60 -517.5t-178 -390.5h-162z" />
+<glyph unicode="*" horiz-adv-x="872" d="M68 1307l47 84l303 -177l-27 320h94l-32 -320l305 177l47 -86l-324 -129l232 -236l-68 -66l-209 273l-205 -279l-65 66l221 240z" />
+<glyph unicode="+" horiz-adv-x="948" d="M94 487v177h297v262h164v-262h297v-177h-297v-278h-164v278h-297z" />
+<glyph unicode="," horiz-adv-x="442" d="M117 -197l71 179l-69 18v176h205v-176l-160 -223z" />
+<glyph unicode="-" horiz-adv-x="868" d="M117 487v177h635v-177h-635z" />
+<glyph unicode="." horiz-adv-x="417" d="M117 0v176h184v-176h-184z" />
+<glyph unicode="/" horiz-adv-x="1089" d="M39 -174l774 1608h205l-774 -1608h-205z" />
+<glyph unicode="0" horiz-adv-x="1462" d="M129 692q0 171 48 316t130.5 244t195 154.5t240.5 55.5q167 0 301 -90.5t211.5 -258t77.5 -382.5q0 -347 -168.5 -553.5t-445.5 -206.5q-264 0 -427 196.5t-163 524.5zM336 692q0 -268 105 -406.5t282 -138.5q187 0 297 147t110 437q0 264 -111.5 409.5t-279.5 145.5 q-81 0 -152.5 -38t-128 -109.5t-89.5 -187t-33 -259.5z" />
+<glyph unicode="1" horiz-adv-x="727" d="M70 1210q85 28 170.5 91t130.5 133h149v-1434h-205v1153q-115 -94 -213 -125z" />
+<glyph unicode="2" horiz-adv-x="1073" d="M102 1264q8 16 26.5 37.5t55 50.5t81 53t109.5 40.5t136 16.5q87 0 156.5 -24t113.5 -62.5t73.5 -90.5t41.5 -105.5t12 -110.5q0 -144 -100.5 -348.5t-339.5 -544.5h496v-176h-848q195 278 319.5 470t182 304t76 169.5t18.5 105.5q0 110 -67.5 170.5t-182.5 60.5 q-62 0 -116 -17.5t-95.5 -49.5t-68.5 -59.5t-54 -63.5z" />
+<glyph unicode="3" horiz-adv-x="1120" d="M82 80l47 180q109 -60 181 -86.5t163 -26.5q56 0 106 13.5t97 44.5t74.5 90t27.5 141q0 44 -8 80t-30.5 71.5t-59.5 60t-98.5 39.5t-143.5 15h-149l20 156h76q185 0 263.5 60t78.5 176q0 99 -61.5 145.5t-182.5 46.5q-176 0 -276 -84l-35 166q34 34 119 64t213 30 q103 0 182.5 -23.5t126 -60t76.5 -87t40.5 -98t10.5 -99.5q0 -87 -41 -157t-145 -142q68 -23 116 -62.5t73.5 -89t36.5 -99.5t11 -106q0 -114 -44 -205t-117.5 -147t-165.5 -85.5t-193 -29.5q-125 0 -241.5 39t-147.5 70z" />
+<glyph unicode="4" horiz-adv-x="1144" d="M29 389l659 1045h162v-869h174v-176h-174v-389h-205v389h-616zM332 565h313v520z" />
+<glyph unicode="5" horiz-adv-x="1107" d="M104 51l48 182q67 -39 148 -62.5t149 -23.5q141 0 240 93t99 235q0 130 -101 191t-331 61h-174l86 707h652l-19 -177h-477l-41 -356q332 -3 475 -102.5t143 -315.5q0 -114 -46 -211.5t-122.5 -162.5t-175.5 -101.5t-206 -36.5q-99 0 -211 27t-136 53z" />
+<glyph unicode="6" horiz-adv-x="1163" d="M127 492q0 130 29.5 256t78.5 227t113 188t132 145.5t136 91.5t125 34l133 -78q-50 -23 -87 -42t-86 -50t-86.5 -64t-79.5 -81t-74 -102.5t-61.5 -127.5t-49.5 -158q96 129 289 129q89 0 166.5 -25.5t138 -75t95 -130t34.5 -183.5q0 -132 -60 -239.5t-174.5 -171.5 t-263.5 -64q-97 0 -175.5 28.5t-141 88t-97 162.5t-34.5 242zM332 412q0 -133 78 -202t190 -69q88 0 152 44.5t93 110.5t29 142q0 46 -11.5 87t-37.5 81t-78.5 64t-125.5 24q-121 0 -205 -78t-84 -204z" />
+<glyph unicode="7" horiz-adv-x="1028" d="M80 1257v177h928l-621 -1434h-205l543 1257h-645z" />
+<glyph unicode="8" horiz-adv-x="1247" d="M121 387q0 237 274 383q-105 82 -147.5 163t-42.5 173q0 69 21 128.5t67.5 112t133 83t204.5 30.5q113 0 196.5 -28t129 -76t66.5 -102.5t21 -116.5q0 -76 -24.5 -131t-72.5 -101t-142 -112q165 -57 242 -149.5t77 -237.5q0 -60 -18.5 -120t-60 -117t-100.5 -101 t-146.5 -70.5t-192.5 -26.5q-101 0 -184 24.5t-137.5 65t-92.5 95t-54.5 112.5t-16.5 119zM334 387q0 -119 73 -179.5t207 -60.5q129 0 216.5 73.5t87.5 187.5q0 105 -82 179t-209 105q-135 -26 -214 -102.5t-79 -202.5zM383 1094q0 -69 62 -131t165 -101q119 35 179.5 104 t60.5 150q0 80 -60 125t-169 45q-111 0 -174.5 -51t-63.5 -141z" />
+<glyph unicode="9" horiz-adv-x="1167" d="M92 985q0 205 137 341t361 136q73 0 136 -15t121.5 -52.5t100 -95t66 -148t24.5 -205.5q0 -175 -42 -332t-108 -266.5t-146.5 -190t-158 -119t-141.5 -38.5l-149 78q48 22 88.5 43t91 53.5t91.5 66.5t83.5 82t73.5 100.5t55 120.5t35 144q-40 -55 -118 -86t-167 -31 q-204 0 -319 104t-115 310zM291 995q0 -45 11.5 -86.5t38 -81.5t79 -64t125.5 -24q121 0 205 79.5t84 207.5t-79 197t-190 69q-88 0 -152 -44.5t-93 -110.5t-29 -142z" />
+<glyph unicode=":" horiz-adv-x="417" d="M117 0v176h184v-176h-184zM117 725v176h184v-176h-184z" />
+<glyph unicode=";" horiz-adv-x="442" d="M117 -197l71 179l-69 18v176h205v-178l-160 -221zM119 725v176h205v-176h-205z" />
+<glyph unicode="&#x3c;" horiz-adv-x="829" d="M68 582l442 422h195l-443 -422l443 -422h-195z" />
+<glyph unicode="=" horiz-adv-x="1028" d="M135 328v155h758v-155h-758zM135 651v156h758v-156h-758z" />
+<glyph unicode="&#x3e;" horiz-adv-x="827" d="M123 160l442 422l-442 422h194l443 -422l-443 -422h-194z" />
+<glyph unicode="?" horiz-adv-x="903" d="M61 1399q38 59 127.5 98t198.5 39q100 0 183.5 -36t135 -93t79.5 -123t28 -131q0 -72 -36 -149.5t-87.5 -144.5t-103 -132.5t-87.5 -134t-36 -127.5v-55h-121q-6 82 -6 92q0 59 22.5 118t57 104.5t74 98t74 99t57 106.5t22.5 121q0 83 -40 142t-97.5 84.5t-124.5 25.5 q-92 0 -168.5 -46.5t-99.5 -92.5zM313 0v176h187v-176h-187z" />
+<glyph unicode="@" horiz-adv-x="1478" d="M100 348q0 131 40 252.5t112.5 217t168.5 167t212 110t239 38.5q239 0 374.5 -140.5t135.5 -380.5q0 -150 -51 -286q-39 -61 -116 -97t-136 -36q-26 0 -42.5 10.5t-23 30.5t-8 33.5t-1.5 33.5q0 50 15 114.5t46.5 171.5t50.5 189q-105 109 -250 109q-124 0 -245.5 -84 t-198 -218.5t-76.5 -273.5q0 -98 46.5 -162.5t148.5 -64.5q88 0 194 65t166 172q0 -5 -3 -31t-3 -32q0 -66 27.5 -118t85.5 -52q60 0 140.5 39.5t131.5 91.5q-98 -178 -279.5 -286.5t-392.5 -108.5q-235 0 -371.5 139.5t-136.5 386.5zM510 348q0 82 37 161t92 132.5t117 86 t112 32.5q95 0 111 -45q-19 -107 -83.5 -224t-147 -195.5t-148.5 -78.5q-45 0 -67.5 37t-22.5 94z" />
+<glyph unicode="A" d="M14 0l514 1434h205l514 -1434h-205l-137 387h-549l-137 -387h-205zM418 563h426l-213 598z" />
+<glyph unicode="B" horiz-adv-x="1222" d="M164 0v1434h323q109 0 186.5 -7.5t148.5 -30t113.5 -61.5t67.5 -103t25 -153q0 -106 -20.5 -171t-96.5 -144q133 -52 186.5 -133.5t53.5 -204.5q0 -106 -30 -185t-76 -124t-114.5 -72.5t-132.5 -36t-143 -8.5h-491zM358 176h201q65 0 111.5 3t94 11t78.5 24.5t56 41.5 t37 63t12 89q0 75 -22.5 127t-64.5 78.5t-89.5 37.5t-109.5 11h-304v-486zM358 838h242q42 0 69 3t60 15.5t52 35.5t32.5 67t13.5 106q0 44 -9.5 77t-29.5 54t-43 34t-58.5 19.5t-67 8.5t-76.5 2h-185v-422z" />
+<glyph unicode="C" d="M80 717q0 223 93 393.5t255.5 261t368.5 90.5q105 0 212.5 -23.5t184.5 -60.5l-20 -180q-10 3 -55.5 19t-61.5 21.5t-57 17.5t-67 16.5t-63.5 9t-72.5 4.5q-160 0 -276 -77t-172 -204t-56 -288q0 -120 33 -223t95.5 -180.5t160 -122t219.5 -44.5q30 0 58.5 2t60 8.5 t51.5 10.5t55.5 15t48 15t52.5 18.5t47 16.5l20 -180q-81 -37 -186 -59.5t-209 -22.5q-155 0 -287.5 53t-228 149t-149.5 236t-54 308z" />
+<glyph unicode="D" horiz-adv-x="1488" d="M164 0v1434h530q156 0 287 -49t225.5 -139.5t147.5 -226t53 -302.5t-53 -302.5t-147.5 -226t-225.5 -139.5t-287 -49h-530zM358 176h336q241 0 370.5 146.5t129.5 394.5q0 247 -129.5 393.5t-370.5 146.5h-336v-1081z" />
+<glyph unicode="E" horiz-adv-x="1134" d="M164 0v1434h874v-177h-680v-419h541v-176h-541v-486h699v-176h-893z" />
+<glyph unicode="F" horiz-adv-x="1071" d="M164 0v1434h874v-177h-680v-419h525v-176h-525v-662h-194z" />
+<glyph unicode="G" horiz-adv-x="1376" d="M80 719q0 223 92.5 392.5t255.5 260t371 90.5q106 0 224.5 -23t201.5 -59l-19 -170q-221 76 -401 76q-128 0 -227 -44t-160.5 -122t-93 -180t-31.5 -223q0 -125 33 -228t99 -180t171 -119.5t242 -42.5q143 0 239 39v357h-225v176h420v-639q-86 -45 -227.5 -77t-262.5 -32 q-148 0 -277 53t-223 149t-148 237t-54 309z" />
+<glyph unicode="H" horiz-adv-x="1527" d="M164 0v1434h194v-592h811v592h195v-1434h-195v657h-811v-657h-194z" />
+<glyph unicode="I" horiz-adv-x="522" d="M164 0v1434h194v-1434h-194z" />
+<glyph unicode="J" horiz-adv-x="522" d="M-35 -238h8q113 0 152 52.5t39 179.5v1440h194v-1500q0 -286 -340 -286h-32z" />
+<glyph unicode="K" horiz-adv-x="1181" d="M164 0v1434h194v-1434h-194zM438 760l531 674h205l-531 -674l531 -760h-205z" />
+<glyph unicode="L" horiz-adv-x="1026" d="M164 0v1434h194v-1258h658v-176h-852z" />
+<glyph unicode="M" horiz-adv-x="1662" d="M98 0l193 1434h166l377 -711l372 711h168l191 -1434h-205l-135 1083l-389 -743l-398 743l-135 -1083h-205z" />
+<glyph unicode="N" horiz-adv-x="1441" d="M164 0v1434h211l706 -1074v1074h197v-1434h-166l-754 1133v-1133h-194z" />
+<glyph unicode="O" horiz-adv-x="1572" d="M80 717q0 224 91 394t251 260.5t364 90.5q153 0 283.5 -53t224 -148.5t146.5 -235.5t53 -308t-53 -308t-146.5 -236t-224 -149t-283.5 -53t-283.5 53t-223.5 149t-146 236t-53 308zM293 717q0 -120 31.5 -223t91.5 -181t155 -122t215 -44t215 44.5t155.5 122t92 180.5 t31.5 223q0 162 -54 288.5t-167.5 203.5t-272.5 77q-120 0 -215 -44t-155 -122t-91.5 -180.5t-31.5 -222.5z" />
+<glyph unicode="P" horiz-adv-x="1171" d="M164 0v1434h459q88 0 155 -9t134.5 -37.5t111 -76.5t71 -130t27.5 -194q0 -107 -28 -193t-72.5 -139.5t-104 -89t-118 -49.5t-119.5 -14h-311v-502h-205zM369 676h274q145 0 211 76.5t66 226.5q0 155 -73.5 218t-260.5 63h-217v-584z" />
+<glyph unicode="Q" horiz-adv-x="1572" d="M80 717q0 224 91 394t251 260.5t364 90.5q153 0 283.5 -53t224 -148.5t146.5 -235.5t53 -308q0 -262 -152 -490l123 -100l-102 -121l-133 111q-203 -146 -443 -146q-153 0 -283.5 53t-223.5 149t-146 236t-53 308zM293 717q0 -121 31 -224t90.5 -180.5t155 -121.5 t216.5 -44q199 0 310 82l-211 172l102 125l215 -190q61 95 79.5 184t18.5 197q0 120 -34 223.5t-98 180.5t-162 121t-220 44q-161 0 -274 -76.5t-166 -203t-53 -289.5z" />
+<glyph unicode="R" horiz-adv-x="1234" d="M164 0v1434h465q117 0 204.5 -21t154.5 -68t101.5 -130t34.5 -201q0 -132 -69 -239t-193 -165l334 -610h-209l-317 559h-301v-559h-205zM369 748h309q34 0 66.5 8t65 28t57 49.5t40 76t15.5 104.5q0 126 -75 194t-220 68h-258v-528z" />
+<glyph unicode="S" horiz-adv-x="1196" d="M82 1049q0 57 15.5 112t53.5 110.5t95 97t148 67.5t204 26q130 0 256 -30t195 -68l-21 -207q-126 64 -220.5 96.5t-191.5 32.5q-79 0 -149 -20.5t-121 -70t-51 -120.5q0 -39 16.5 -71t41.5 -55t69 -44.5t83 -36t99 -32.5q194 -60 270 -95q183 -86 235 -228 q24 -64 24 -142q0 -53 -10 -100.5t-45 -105t-93 -98t-164 -68.5t-248 -28q-148 0 -272 26.5t-197 65.5l27 228q82 -61 197.5 -102.5t249.5 -41.5q69 0 128 12.5t108.5 37.5t77.5 69t28 103q0 40 -12 73t-39 59.5t-56 47t-77 41t-86.5 34t-100.5 33.5q-194 62 -270 101 q-158 83 -189 216q-8 35 -8 75z" />
+<glyph unicode="T" horiz-adv-x="1091" d="M31 1257v177h1030v-177h-418v-1257h-194v1257h-418z" />
+<glyph unicode="U" horiz-adv-x="1482" d="M147 608v826h195v-732q0 -93 8.5 -167t34.5 -149.5t68.5 -125.5t115.5 -81.5t172 -31.5t172 31.5t116 82t69 126t34.5 149t8.5 166.5v732h194v-826q0 -302 -149 -469.5t-445 -167.5t-445 167.5t-149 469.5z" />
+<glyph unicode="V" horiz-adv-x="1318" d="M8 1434h205l449 -1211l444 1211h205l-549 -1434h-205z" />
+<glyph unicode="W" horiz-adv-x="1988" d="M29 1434h204l318 -1213l358 1184h176l363 -1182l315 1211h205l-420 -1434h-215l-338 1176l-350 -1176h-215z" />
+<glyph unicode="X" horiz-adv-x="1226" d="M18 0l482 715l-482 719h226l368 -560l398 560h204l-512 -695l515 -739h-205l-414 586l-375 -586h-205z" />
+<glyph unicode="Y" horiz-adv-x="1161" d="M-6 1434h205l381 -596l381 596h204l-483 -772v-662h-203v662z" />
+<glyph unicode="Z" horiz-adv-x="1124" d="M18 0l770 1257h-677v177h999l-772 -1258h680v-176h-1000z" />
+<glyph unicode="[" horiz-adv-x="669" d="M143 -276v1812h527v-139h-357v-1534h357v-139h-527z" />
+<glyph unicode="\" horiz-adv-x="1075" d="M72 1434h190l774 -1608h-190z" />
+<glyph unicode="]" horiz-adv-x="681" d="M12 -104h357v1468h-357v172h527v-1812h-527v172z" />
+<glyph unicode="^" horiz-adv-x="1046" d="M100 895v217l422 442l422 -442v-217l-422 442z" />
+<glyph unicode="_" horiz-adv-x="1159" d="M6 -74h1147v-176h-1147v176z" />
+<glyph unicode="`" horiz-adv-x="620" d="M119 1352v147l383 -194v-84z" />
+<glyph unicode="a" horiz-adv-x="983" d="M49 270q0 81 38.5 145t98.5 103t142 64.5t159.5 35.5t161.5 11q0 135 -52.5 183t-166.5 48q-135 0 -264 -90l-27 150q62 47 152.5 75.5t187.5 28.5q130 0 206 -45t112.5 -149.5t36.5 -286.5v-205q0 -120 20 -165.5t94 -45.5h19l-29 -147h-14q-65 0 -109 9t-72 30 t-43.5 44.5t-33.5 63.5q-127 -147 -308 -147q-138 0 -223.5 81.5t-85.5 208.5zM238 281q0 -79 41.5 -116.5t113.5 -37.5q73 0 142.5 36.5t113.5 98.5v240q-221 -8 -316 -58.5t-95 -162.5z" />
+<glyph unicode="b" horiz-adv-x="1136" d="M123 0v1536h184v-641q58 70 143 99.5t168 29.5q136 0 241 -74t158.5 -191.5t53.5 -256.5q0 -144 -60 -264t-164.5 -189t-230.5 -69q-75 0 -165.5 39t-143.5 108l-20 -127h-164zM297 502q0 -176 88.5 -267.5t210.5 -91.5q129 0 208 103.5t79 255.5q0 156 -78.5 257 t-208.5 101q-57 0 -109 -22.5t-95 -65t-69 -113t-26 -157.5z" />
+<glyph unicode="c" horiz-adv-x="929" d="M68 504q0 111 31 205t91.5 164.5t156.5 110.5t218 40q204 0 309 -59l-28 -166q-125 61 -260 61q-164 0 -247 -92.5t-83 -263.5q0 -169 83.5 -266t246.5 -97q135 0 262 62l24 -148q-113 -75 -305 -75q-122 0 -218.5 42t-157 115t-92 166.5t-31.5 200.5z" />
+<glyph unicode="d" horiz-adv-x="1136" d="M66 502q0 138 54.5 256t160 192t241.5 74q202 0 307 -127v639h185v-1536h-164l-21 127q-53 -69 -142.5 -108t-164.5 -39q-126 0 -231 69t-165 189t-60 264zM254 502q0 -153 77.5 -256t205.5 -103q58 0 111.5 20.5t99.5 61t74 111t28 160.5q0 87 -28 158.5t-73.5 115 t-100 67t-111.5 23.5q-130 0 -206.5 -100.5t-76.5 -257.5z" />
+<glyph unicode="e" horiz-adv-x="1048" d="M63 510q0 142 57 257.5t170.5 186t264.5 70.5q192 0 312 -113t120 -311q0 -51 -8 -98h-727q35 -359 377 -359q157 0 289 60l24 -146q-172 -77 -336 -77q-129 0 -233.5 42t-171.5 115t-102.5 168.5t-35.5 204.5zM268 629h529q0 109 -61.5 170t-184.5 61q-119 0 -186.5 -59 t-96.5 -172z" />
+<glyph unicode="f" horiz-adv-x="677" d="M20 860l25 144h150v253q0 126 60.5 202.5t172.5 76.5q126 0 209 -27l-29 -155q-58 18 -123 18q-70 0 -88 -44t-18 -202v-122h270v-144h-270v-860h-184v860h-175z" />
+<glyph unicode="g" horiz-adv-x="1019" d="M53 -209q0 26 6 52t23 59.5t55 64t94 49.5q-102 49 -102 127q0 35 27.5 77.5t91.5 72.5q-174 127 -174 328q0 173 108.5 288t300.5 115q137 0 256 -74q107 58 244 58h16l-22 -123h-47q-54 0 -119 -15q92 -109 92 -239q0 -104 -45.5 -193.5t-139.5 -148t-220 -58.5 q-76 0 -144 19q-49 -27 -49 -62q0 -36 58.5 -54.5t252.5 -51.5q48 -8 86 -16.5t89.5 -23.5t89.5 -36t73 -49t53.5 -67.5t18.5 -86.5q0 -130 -133.5 -222.5t-370.5 -92.5q-100 0 -182 19t-134 49.5t-87.5 70.5t-50.5 81t-15 83zM229 -205q0 -71 80 -117.5t221 -46.5 q145 0 227.5 48t82.5 112q0 107 -269 156q-3 0 -83.5 10.5t-98.5 13.5q-69 -22 -114.5 -72t-45.5 -104zM250 627q0 -117 66 -185.5t173 -68.5q112 0 175 73.5t63 186.5q0 116 -66.5 180t-175.5 64q-112 0 -173.5 -69t-61.5 -181z" />
+<glyph unicode="h" horiz-adv-x="1110" d="M123 0v1536h186v-641q103 129 291 129q395 0 395 -487v-537h-184v537q0 179 -53.5 251t-186.5 72q-179 0 -262 -131v-729h-186z" />
+<glyph unicode="i" horiz-adv-x="434" d="M125 0v1004h184v-1004h-184zM125 1229v205h184v-205h-184z" />
+<glyph unicode="j" horiz-adv-x="434" d="M-25 -354q92 9 121 46.5t29 157.5v1154h184v-1223q0 -68 -24 -119.5t-64 -80.5t-79.5 -44t-84.5 -22l-61 -11zM125 1229v205h184v-205h-184z" />
+<glyph unicode="k" horiz-adv-x="917" d="M123 0v1536h184v-985l369 453h225l-414 -463l424 -541h-225l-379 510v-510h-184z" />
+<glyph unicode="l" horiz-adv-x="483" d="M123 221v1315h184v-1208q0 -130 28.5 -165.5t133.5 -35.5l-27 -147h-59q-135 0 -197.5 69t-62.5 172z" />
+<glyph unicode="m" horiz-adv-x="1796" d="M125 0v1004h143l21 -107q83 73 150 100t151 27q48 0 90.5 -8t88 -29t87 -62.5t74.5 -101.5q106 201 366 201q385 0 385 -432v-592h-184v590q0 142 -55.5 206t-179.5 64q-267 0 -267 -278v-582h-184v553q0 90 -17 151.5t-49.5 94.5t-73.5 47t-96 14q-89 0 -159 -33 t-107 -98v-729h-184z" />
+<glyph unicode="n" horiz-adv-x="1144" d="M125 0v1004h143l21 -107q143 127 332 127q409 0 409 -471v-553h-184v553q0 162 -60.5 234.5t-201.5 72.5q-91 0 -164.5 -33t-110.5 -98v-729h-184z" />
+<glyph unicode="o" horiz-adv-x="1126" d="M66 502q0 109 34 204t96 166t157 111.5t210 40.5q152 0 266.5 -70t173 -187.5t58.5 -264.5t-58.5 -264.5t-173 -187.5t-266.5 -70q-115 0 -210 40.5t-157 111.5t-96 166t-34 204zM254 502q0 -170 80.5 -264.5t228.5 -94.5t228.5 94.5t80.5 264.5t-80.5 264t-228.5 94 t-228.5 -94t-80.5 -264z" />
+<glyph unicode="p" horiz-adv-x="1140" d="M125 -496v1500h143l21 -144q70 84 146 124t192 40q102 0 187.5 -43t141.5 -115.5t86.5 -166.5t30.5 -197q0 -149 -49 -265.5t-152 -186.5t-247 -70q-76 0 -169.5 39.5t-146.5 107.5v-623h-184zM299 502q0 -91 26.5 -162t71 -112.5t97.5 -63t110 -21.5q128 0 204.5 103 t76.5 256q0 157 -76 257.5t-205 100.5q-57 0 -110 -22.5t-97.5 -65t-71 -113t-26.5 -157.5z" />
+<glyph unicode="q" horiz-adv-x="1140" d="M68 502q0 103 30.5 197t86.5 166.5t141.5 115.5t187.5 43q116 0 192 -40t146 -124l20 144h144v-1500h-185v623q-53 -68 -146 -107.5t-169 -39.5q-144 0 -247 70t-152 186.5t-49 265.5zM256 502q0 -153 76.5 -256t204.5 -103q57 0 110 21.5t97.5 63t71 112.5t26.5 162 q0 87 -26.5 157.5t-71 113t-97.5 65t-110 22.5q-129 0 -205 -100.5t-76 -257.5z" />
+<glyph unicode="r" horiz-adv-x="657" d="M125 0v1004h151l23 -166q94 106 172 154t168 48h16l-41 -202h-63q-62 0 -132 -40.5t-97 -88.5v-709h-197z" />
+<glyph unicode="s" horiz-adv-x="847" d="M66 68l22 178q41 -38 125.5 -70.5t187.5 -32.5q97 0 149 32.5t52 92.5q0 30 -13.5 55t-32.5 41.5t-49.5 31t-52.5 22t-53 16.5q-39 11 -61 17.5t-60.5 20.5t-61 27.5t-51 36t-44 48t-26.5 61.5t-11 78q0 60 21 112.5t64 95.5t118 68t174 25q142 0 272 -66l-22 -167 q-106 88 -246 88q-90 0 -142.5 -34t-52.5 -102q0 -28 10.5 -49t25 -35.5t49.5 -29.5t63 -24.5t86 -26.5q28 -8 47.5 -14.5t52 -20.5t55.5 -29t49.5 -38.5t43 -50.5t28 -65t11.5 -81t-10 -82.5t-37 -80t-68.5 -70t-110.5 -48t-157 -18.5q-119 0 -208 27.5t-136 60.5z" />
+<glyph unicode="t" horiz-adv-x="690" d="M37 860l16 144h156v247l184 19v-266h264v-144h-264v-528q0 -54 1 -82.5t10 -55.5t19.5 -37.5t38 -19t57 -9.5t85.5 -1h47l-14 -147h-166q-133 0 -197.5 69t-64.5 170v641h-172z" />
+<glyph unicode="u" horiz-adv-x="1073" d="M115 420v584h184v-533q0 -164 55.5 -246t177.5 -82q73 0 135 29t97 86v746h184v-1004h-164l-20 111q-48 -67 -115 -99t-164 -32q-180 0 -275 109t-95 331z" />
+<glyph unicode="v" horiz-adv-x="1007" d="M18 1004h205l281 -801l278 801h207l-381 -1004h-207z" />
+<glyph unicode="w" horiz-adv-x="1484" d="M25 1004h217l192 -801l213 770h191l215 -770l192 801h217l-303 -1004h-207l-209 741l-211 -741h-206z" />
+<glyph unicode="x" horiz-adv-x="970" d="M23 0l350 500l-342 504h207l251 -398l232 398h215l-330 -488l342 -516h-207l-254 395l-258 -395h-206z" />
+<glyph unicode="y" horiz-adv-x="1034" d="M14 1004h205l313 -746l283 746h205l-614 -1500h-205l231 541z" />
+<glyph unicode="z" horiz-adv-x="964" d="M45 0l535 860h-514v144h847l-534 -861h524v-143h-858z" />
+<glyph unicode="{" horiz-adv-x="612" d="M39 629q79 53 113 123t34 182q0 50 -8 153t-8 142q0 96 39 160t137.5 103t261.5 44v-141q-53 -2 -92 -6.5t-69.5 -15.5t-51 -22.5t-35.5 -35.5t-22.5 -45.5t-12 -61t-5.5 -73.5t-1 -91q0 -27 3.5 -87t3.5 -89q0 -76 -32 -128t-138 -111q74 -40 112.5 -77.5t48 -67 t9.5 -76.5q0 -28 -3.5 -92.5t-3.5 -100.5q0 -57 1 -91t5.5 -73.5t12 -61t22.5 -45t35.5 -35.5t51 -23t69.5 -15t92 -6v-141q-236 7 -337 82t-101 223q0 39 8 142.5t8 154.5q0 109 -32.5 180t-114.5 123z" />
+<glyph unicode="|" horiz-adv-x="468" d="M143 -428v1964h183v-1964h-183z" />
+<glyph unicode="}" horiz-adv-x="612" d="M4 -135q53 2 92 6t69.5 15t51 23t35.5 35.5t22.5 45t12 61t5.5 73.5t1 91q0 36 -3 100.5t-3 92.5q0 47 9.5 76.5t48 67t112.5 77.5q-106 59 -138 111t-32 128q0 29 3 89t3 87q0 57 -1 91t-5.5 73.5t-12 61t-22.5 45.5t-35.5 35.5t-51 22.5t-69.5 15.5t-92 6.5v141 q163 -5 261.5 -44t137.5 -103t39 -160q0 -39 -8 -142t-8 -153q0 -112 34 -182t113 -123q-82 -52 -114.5 -123t-32.5 -180q0 -51 8 -154.5t8 -142.5q0 -148 -101 -223t-337 -82v141z" />
+<glyph unicode="~" horiz-adv-x="931" d="M111 389q23 92 85 138t126 46q44 0 147.5 -50t138.5 -50q47 0 80.5 26.5t61.5 78.5l69 -19q-23 -89 -82.5 -140.5t-136.5 -51.5q-39 0 -138.5 52t-131.5 52q-108 0 -146 -100z" />
+<glyph unicode="&#xa1;" horiz-adv-x="458" d="M102 -512l62 1126h131l61 -1126h-254zM143 848v176h172v-176h-172z" />
+<glyph unicode="&#xa2;" horiz-adv-x="976" d="M70 711q0 135 49 247t155 190t256 97l-38 287h139l-37 -287q106 -6 168 -21.5t110 -43.5l-16 -160q-128 67 -260 67q-145 0 -227 -107t-82 -269q0 -161 82 -267t227 -106q136 0 260 65l16 -159q-101 -57 -274 -66l33 -241h-139l34 241q-113 15 -201 63.5t-143 120.5 t-83.5 160.5t-28.5 188.5z" />
+<glyph unicode="&#xa3;" horiz-adv-x="1024" d="M70 0q100 138 149 294t72 374h-195l23 120h180v256q0 68 6 120.5t26.5 108t54.5 91.5t95 59t144 23q125 0 192.5 -47t97.5 -133l-59 -78q-18 36 -30 55t-33.5 39.5t-51 29.5t-71.5 9q-51 0 -88 -15.5t-59.5 -41.5t-35.5 -68.5t-17.5 -88t-4.5 -108.5v-211h403l-24 -120 h-387q-11 -163 -35 -264.5t-94 -256.5h573v-147h-831z" />
+<glyph unicode="&#xa4;" horiz-adv-x="1282" d="M125 713q0 225 164 395l-160 209l57 49l160 -211q155 78 295 78q144 0 293 -80l164 213l57 -49l-160 -211q162 -170 162 -393t-164 -398l162 -206l-59 -50l-162 211q-143 -77 -293 -77t-293 77l-162 -211l-57 50l158 208q-162 170 -162 396zM309 713q0 -171 87.5 -282.5 t244.5 -111.5t244.5 111.5t87.5 282.5t-87.5 282t-244.5 111t-244.5 -111t-87.5 -282z" />
+<glyph unicode="&#xa5;" horiz-adv-x="1380" d="M61 1434h191l440 -629l441 629h190l-530 -787h344l-45 -102h-301v-135h346l-45 -111h-301v-299h-197v299h-365l43 111h322v135h-365l43 102h320z" />
+<glyph unicode="&#xa6;" horiz-adv-x="475" d="M147 334h181v-764h-181v764zM147 631v905h181v-905h-181z" />
+<glyph unicode="&#xa7;" horiz-adv-x="933" d="M76 676q0 238 223 305q-81 58 -106 109t-25 112q0 67 18 124.5t56 106t105.5 76t158.5 27.5q89 0 170 -24.5t131 -57.5l-27 -129q-142 88 -266 88q-90 0 -144.5 -51t-54.5 -125q0 -52 30 -89t78 -60.5t105.5 -45t115.5 -49.5t106 -65t78 -101t30 -149q0 -38 -9.5 -75.5 t-32 -78t-66.5 -77t-105 -62.5q35 -27 58.5 -52.5t36 -45.5t18.5 -47.5t7 -46t1 -52.5q0 -57 -18 -109.5t-56 -100t-107.5 -75.5t-162.5 -28q-88 0 -170.5 23t-122.5 57l27 129q139 -84 268 -84q96 0 153.5 42.5t57.5 127.5q0 52 -24 90t-63.5 59t-89.5 40.5t-102.5 34 t-102.5 41t-89.5 60t-63.5 92t-24 136.5zM215 700q0 -92 89 -151.5t243 -99.5q73 20 116.5 79.5t43.5 135.5q0 167 -289 233q-17 -1 -40 -6t-52.5 -19.5t-53.5 -35t-40.5 -56.5t-16.5 -80z" />
+<glyph unicode="&#xa8;" horiz-adv-x="864" d="M178 1229v205h144v-205h-144zM543 1229v205h143v-205h-143z" />
+<glyph unicode="&#xa9;" horiz-adv-x="1474" d="M100 748q0 150 48 276.5t132 212.5t202 134t255 48t254.5 -48t201.5 -134t131.5 -212t47.5 -277q0 -150 -47.5 -276t-131.5 -212.5t-201.5 -135t-254.5 -48.5t-255 48.5t-202 135t-132 212.5t-48 276zM207 748q0 -125 33.5 -230t97.5 -184t166.5 -123.5t232.5 -44.5 t231.5 44.5t166 123.5t98 184t33.5 230q0 124 -33.5 229t-98 183.5t-166 122.5t-231.5 44t-232.5 -44t-166.5 -122.5t-97.5 -183t-33.5 -229.5zM432 743q0 155 90.5 248.5t233.5 93.5q100 0 184 -38l-14 -123q-93 39 -170 39q-91 0 -139 -60.5t-48 -159.5q0 -97 48.5 -158 t138.5 -61q80 0 170 41l14 -121q-77 -41 -184 -41q-143 0 -233.5 93t-90.5 247z" />
+<glyph unicode="&#xaa;" horiz-adv-x="714" d="M68 1063q0 47 25.5 84t62.5 59t86.5 36.5t90 20.5t79.5 7q-2 44 -27 65t-82 21q-70 0 -170 -41l-12 123q105 47 223 47q223 0 223 -221v-164q0 -61 9.5 -73.5t44.5 -12.5h20l-14 -125h-56q-98 0 -137 63q-63 -63 -188 -63q-76 0 -127 46.5t-51 127.5zM229 1069 q0 -34 19.5 -49.5t62.5 -15.5q58 0 103 34v129q-72 -2 -128.5 -27t-56.5 -71z" />
+<glyph unicode="&#xab;" horiz-adv-x="1153" d="M31 582l301 422h205l-301 -422l301 -422h-205zM563 582l301 422h207l-303 -422l303 -422h-207z" />
+<glyph unicode="&#xac;" horiz-adv-x="1220" d="M135 709v122h942v-522h-112v400h-830z" />
+<glyph unicode="&#xad;" horiz-adv-x="868" d="M117 471v193h635v-193h-635z" />
+<glyph unicode="&#xae;" horiz-adv-x="1474" d="M100 748q0 150 48 276.5t132 212.5t202 134t255 48t254.5 -48t201.5 -134t131.5 -212t47.5 -277q0 -150 -47.5 -276t-131.5 -212.5t-201.5 -135t-254.5 -48.5t-255 48.5t-202 135t-132 212.5t-48 276zM205 748q0 -125 33.5 -230t98.5 -184.5t167.5 -124.5t232.5 -45 q129 0 231.5 45t167.5 124.5t98.5 185t33.5 229.5t-33.5 229t-98.5 184t-167 123.5t-232 44.5t-232.5 -44.5t-167.5 -123.5t-98.5 -184t-33.5 -229zM500 430v657h241q111 0 168.5 -45.5t57.5 -158.5q0 -105 -111 -178l145 -275h-129l-133 240h-112v-240h-127zM627 784h82 q125 0 125 103q0 49 -27 74.5t-94 25.5h-86v-203z" />
+<glyph unicode="&#xb0;" horiz-adv-x="681" d="M70 1266q0 121 73 200.5t197 79.5q125 0 198.5 -79.5t73.5 -200.5t-73 -200t-199 -79q-124 0 -197 79t-73 200zM160 1266q0 -92 48.5 -159t131.5 -67q87 0 133.5 66.5t46.5 159.5q0 92 -47 159.5t-133 67.5q-84 0 -132 -67.5t-48 -159.5z" />
+<glyph unicode="&#xb1;" horiz-adv-x="1019" d="M131 86v137h758v-137h-758zM131 670v137h313v283h131v-283h314v-137h-314v-295h-131v295h-313z" />
+<glyph unicode="&#xb2;" horiz-adv-x="622" d="M51 655q110 149 181 253t103 163t42 89t10 54q0 51 -31 80t-86 29q-104 0 -190 -121l-19 133q22 39 85.5 75t154.5 36q63 0 109.5 -19.5t71.5 -51t36.5 -66.5t11.5 -72q0 -75 -50.5 -176t-166.5 -262h246v-144h-508z" />
+<glyph unicode="&#xb3;" horiz-adv-x="634" d="M39 700l37 136q27 -22 78 -38t102 -16q70 0 115 25.5t45 81.5q0 61 -32.5 96t-119.5 35h-106l12 113h55q158 0 158 98q0 41 -30 65.5t-93 24.5q-102 0 -145 -35l-23 109q21 20 72.5 35.5t114.5 15.5q62 0 109.5 -14t74.5 -35t44.5 -50t23.5 -55t6 -53q0 -107 -80 -154 q110 -63 110 -190q0 -81 -45 -141t-112.5 -87.5t-147.5 -27.5q-71 0 -140 21.5t-83 39.5z" />
+<glyph unicode="&#xb4;" horiz-adv-x="620" d="M119 1221v84l383 194v-147z" />
+<glyph unicode="&#xb5;" horiz-adv-x="1210" d="M150 -496v1500h182v-529q0 -170 54 -252t196 -82q77 0 128 27t109 92v744h178v-656q0 -113 20 -167t77 -54h45l-33 -147h-53q-162 0 -219 149q-68 -79 -126.5 -115.5t-148.5 -36.5q-65 0 -113 15t-116 63v-551h-180z" />
+<glyph unicode="&#xb6;" horiz-adv-x="1273" d="M68 971q0 69 22 134.5t69 125.5t115 105t166.5 71.5t216.5 26.5h531v-138h-154v-1296h-98v1296h-207v-1296h-84v498q-146 8 -260 52t-181.5 111.5t-101.5 146t-34 163.5z" />
+<glyph unicode="&#xb7;" horiz-adv-x="487" d="M117 436v266h254v-266h-254z" />
+<glyph unicode="&#xb8;" horiz-adv-x="620" d="M295 -393l139 270l135 12l-180 -272z" />
+<glyph unicode="&#xb9;" horiz-adv-x="442" d="M47 1309q39 6 88 44t66 77h116v-775h-153v566q-64 -29 -105 -35z" />
+<glyph unicode="&#xba;" horiz-adv-x="757" d="M68 1188q0 125 84 211t227 86t227 -86t84 -211t-84 -212t-227 -87t-227 87t-84 212zM225 1188q0 -78 41 -127t113 -49t112.5 49t40.5 127t-40.5 127t-112.5 49t-113 -49t-41 -127z" />
+<glyph unicode="&#xbb;" horiz-adv-x="1153" d="M84 160l303 422l-303 422h207l301 -422l-301 -422h-207zM616 160l302 422l-302 422h205l301 -422l-301 -422h-205z" />
+<glyph unicode="&#xbc;" horiz-adv-x="1468" d="M80 1309q39 6 87.5 44t65.5 77h117v-775h-153v566q-64 -29 -105 -35zM125 -174l774 1608h205l-774 -1608h-205zM788 211l383 563h127v-446h101v-117h-101v-211h-151v211h-359zM995 328h152v225z" />
+<glyph unicode="&#xbd;" horiz-adv-x="1492" d="M74 1309q39 6 87.5 44t65.5 77h117v-775h-154v566q-65 -29 -104 -35zM119 -174l774 1608h205l-774 -1608h-205zM913 0q110 149 181 253t103 163t42 89t10 54q0 51 -30.5 80t-85.5 29q-105 0 -191 -121l-18 133q22 40 85 75.5t154 35.5q63 0 110 -19.5t72 -51t36.5 -66.5 t11.5 -72q0 -75 -50.5 -177t-166.5 -262h245v-143h-508z" />
+<glyph unicode="&#xbe;" horiz-adv-x="1812" d="M66 700l36 136q27 -22 78.5 -38t102.5 -16q70 0 114.5 25.5t44.5 81.5q0 61 -32 96t-119 35h-107l13 113h55q158 0 158 98q0 41 -30 65.5t-93 24.5q-103 0 -146 -35l-22 109q21 20 72.5 35.5t113.5 15.5t109.5 -14t74.5 -35t44.5 -50t23.5 -55t6 -53q0 -107 -80 -154 q111 -63 111 -190q0 -81 -45 -141t-112.5 -87.5t-147.5 -27.5q-71 0 -140 21.5t-83 39.5zM471 -174l774 1608h205l-774 -1608h-205zM1130 211l383 563h127v-446h101v-117h-101v-211h-151v211h-359zM1337 328h152v225z" />
+<glyph unicode="&#xbf;" horiz-adv-x="919" d="M127 -129q0 72 36 149.5t87.5 144.5t103 132.5t87.5 134t36 127.5v55h121q6 -83 6 -92q0 -59 -22.5 -118t-57 -104.5t-74 -98t-74 -99t-57 -106.5t-22.5 -121q0 -83 40 -142t97.5 -84.5t124.5 -25.5q92 0 168.5 46.5t99.5 92.5l52 -137q-38 -59 -127.5 -98t-198.5 -39 q-100 0 -183.5 36t-135 93t-79.5 123t-28 131zM440 848v176h187v-176h-187z" />
+<glyph unicode="&#xc0;" d="M14 0l514 1434h205l514 -1434h-205l-137 387h-549l-137 -387h-205zM418 563h426l-213 598zM440 1782v147l383 -194v-84z" />
+<glyph unicode="&#xc1;" d="M14 0l514 1434h205l514 -1434h-205l-137 387h-549l-137 -387h-205zM418 563h426l-213 598zM440 1651v84l383 194v-147z" />
+<glyph unicode="&#xc2;" d="M14 0l514 1434h205l514 -1434h-205l-137 387h-549l-137 -387h-205zM332 1665v74l301 217l301 -217v-74l-301 168zM418 563h426l-213 598z" />
+<glyph unicode="&#xc3;" d="M14 0l514 1434h205l514 -1434h-205l-137 387h-549l-137 -387h-205zM279 1679q23 93 85 139t125 46q43 0 148 -50.5t139 -50.5q47 0 80.5 26.5t61.5 78.5l69 -19q-23 -89 -82.5 -140.5t-136.5 -51.5q-39 0 -138.5 52t-131.5 52q-108 0 -146 -100zM418 563h426l-213 598z " />
+<glyph unicode="&#xc4;" d="M14 0l514 1434h205l514 -1434h-205l-137 387h-549l-137 -387h-205zM379 1659v205h143v-205h-143zM418 563h426l-213 598zM743 1659v205h144v-205h-144z" />
+<glyph unicode="&#xc5;" d="M14 0l514 1434h205l514 -1434h-205l-137 387h-549l-137 -387h-205zM418 563h426l-213 598zM420 1792q0 75 57 129.5t156 54.5q100 0 156.5 -54t56.5 -130t-55.5 -129t-157.5 -53q-101 0 -157 53.5t-56 128.5zM510 1792q0 -55 36.5 -89t86.5 -34t86.5 34t36.5 89 q0 53 -36 87t-87 34t-87 -34t-36 -87z" />
+<glyph unicode="&#xc6;" horiz-adv-x="1771" d="M-14 0l700 1434h989v-179h-639v-417h494v-176h-494v-486h660v-176h-893v369h-438l-189 -369h-190zM453 557h350v694z" />
+<glyph unicode="&#xc7;" d="M80 717q0 223 93 393.5t255.5 261t368.5 90.5q105 0 212.5 -23.5t184.5 -60.5l-20 -180q-10 3 -55.5 19t-61.5 21.5t-57 17.5t-67 16.5t-63.5 9t-72.5 4.5q-160 0 -276 -77t-172 -204t-56 -288q0 -120 33 -223t95.5 -180.5t160 -122t219.5 -44.5q30 0 58.5 2t60 8.5 t51.5 10.5t55.5 15t48 15t52.5 18.5t47 16.5l20 -180q-81 -37 -186 -59.5t-209 -22.5q-155 0 -287.5 53t-228 149t-149.5 236t-54 308zM494 -393l139 270l135 12l-180 -272z" />
+<glyph unicode="&#xc8;" horiz-adv-x="1134" d="M164 0v1434h874v-177h-680v-419h541v-176h-541v-486h699v-176h-893zM375 1782v147l383 -194v-84z" />
+<glyph unicode="&#xc9;" horiz-adv-x="1134" d="M164 0v1434h874v-177h-680v-419h541v-176h-541v-486h699v-176h-893zM375 1651v84l383 194v-147z" />
+<glyph unicode="&#xca;" horiz-adv-x="1134" d="M164 0v1434h874v-177h-680v-419h541v-176h-541v-486h699v-176h-893zM264 1665v74l301 217l301 -217v-74l-301 168z" />
+<glyph unicode="&#xcb;" horiz-adv-x="1134" d="M164 0v1434h874v-177h-680v-419h541v-176h-541v-486h699v-176h-893zM311 1659v205h144v-205h-144zM676 1659v205h143v-205h-143z" />
+<glyph unicode="&#xcc;" horiz-adv-x="522" d="M72 1782v147l383 -194v-84zM164 0v1434h194v-1434h-194z" />
+<glyph unicode="&#xcd;" horiz-adv-x="522" d="M72 1651v84l383 194v-147zM164 0v1434h194v-1434h-194z" />
+<glyph unicode="&#xce;" horiz-adv-x="522" d="M-39 1665v74l301 217l301 -217v-74l-301 168zM164 0v1434h194v-1434h-194z" />
+<glyph unicode="&#xcf;" horiz-adv-x="522" d="M8 1659v205h144v-205h-144zM164 0v1434h194v-1434h-194zM373 1659v205h143v-205h-143z" />
+<glyph unicode="&#xd0;" horiz-adv-x="1495" d="M-16 641v131h198v662h525q207 0 365.5 -84t249.5 -247.5t91 -385.5t-91 -385.5t-249.5 -247.5t-365.5 -84h-525v641h-198zM367 178h340q242 0 369.5 144.5t127.5 394.5q0 251 -127.5 395.5t-369.5 144.5h-340v-485h272v-131h-272v-463z" />
+<glyph unicode="&#xd1;" horiz-adv-x="1441" d="M164 0v1434h211l706 -1074v1074h197v-1434h-166l-754 1133v-1133h-194zM367 1679q23 93 85 139t126 46q44 0 148 -50.5t138 -50.5q47 0 80.5 26.5t61.5 78.5l69 -19q-23 -89 -82.5 -140.5t-136.5 -51.5q-39 0 -138.5 52t-131.5 52q-108 0 -146 -100z" />
+<glyph unicode="&#xd2;" horiz-adv-x="1572" d="M80 717q0 224 91 394t251 260.5t364 90.5q153 0 283.5 -53t224 -148.5t146.5 -235.5t53 -308t-53 -308t-146.5 -236t-224 -149t-283.5 -53t-283.5 53t-223.5 149t-146 236t-53 308zM293 717q0 -120 31.5 -223t91.5 -181t155 -122t215 -44t215 44.5t155.5 122t92 180.5 t31.5 223q0 162 -54 288.5t-167.5 203.5t-272.5 77q-120 0 -215 -44t-155 -122t-91.5 -180.5t-31.5 -222.5zM594 1782v147l383 -194v-84z" />
+<glyph unicode="&#xd3;" horiz-adv-x="1572" d="M80 717q0 224 91 394t251 260.5t364 90.5q153 0 283.5 -53t224 -148.5t146.5 -235.5t53 -308t-53 -308t-146.5 -236t-224 -149t-283.5 -53t-283.5 53t-223.5 149t-146 236t-53 308zM293 717q0 -120 31.5 -223t91.5 -181t155 -122t215 -44t215 44.5t155.5 122t92 180.5 t31.5 223q0 162 -54 288.5t-167.5 203.5t-272.5 77q-120 0 -215 -44t-155 -122t-91.5 -180.5t-31.5 -222.5zM594 1651v84l383 194v-147z" />
+<glyph unicode="&#xd4;" horiz-adv-x="1572" d="M80 717q0 224 91 394t251 260.5t364 90.5q153 0 283.5 -53t224 -148.5t146.5 -235.5t53 -308t-53 -308t-146.5 -236t-224 -149t-283.5 -53t-283.5 53t-223.5 149t-146 236t-53 308zM293 717q0 -120 31.5 -223t91.5 -181t155 -122t215 -44t215 44.5t155.5 122t92 180.5 t31.5 223q0 162 -54 288.5t-167.5 203.5t-272.5 77q-120 0 -215 -44t-155 -122t-91.5 -180.5t-31.5 -222.5zM485 1665v74l301 217l301 -217v-74l-301 168z" />
+<glyph unicode="&#xd5;" horiz-adv-x="1572" d="M80 717q0 224 91 394t251 260.5t364 90.5q153 0 283.5 -53t224 -148.5t146.5 -235.5t53 -308t-53 -308t-146.5 -236t-224 -149t-283.5 -53t-283.5 53t-223.5 149t-146 236t-53 308zM293 717q0 -120 31.5 -223t91.5 -181t155 -122t215 -44t215 44.5t155.5 122t92 180.5 t31.5 223q0 162 -54 288.5t-167.5 203.5t-272.5 77q-120 0 -215 -44t-155 -122t-91.5 -180.5t-31.5 -222.5zM432 1679q23 93 85 139t126 46q43 0 148 -50.5t139 -50.5q47 0 80 26t61 79l70 -19q-23 -89 -82.5 -140.5t-136.5 -51.5q-39 0 -139 52t-132 52q-107 0 -145 -100z " />
+<glyph unicode="&#xd6;" horiz-adv-x="1572" d="M80 717q0 224 91 394t251 260.5t364 90.5q153 0 283.5 -53t224 -148.5t146.5 -235.5t53 -308t-53 -308t-146.5 -236t-224 -149t-283.5 -53t-283.5 53t-223.5 149t-146 236t-53 308zM293 717q0 -120 31.5 -223t91.5 -181t155 -122t215 -44t215 44.5t155.5 122t92 180.5 t31.5 223q0 162 -54 288.5t-167.5 203.5t-272.5 77q-120 0 -215 -44t-155 -122t-91.5 -180.5t-31.5 -222.5zM532 1659v205h144v-205h-144zM897 1659v205h143v-205h-143z" />
+<glyph unicode="&#xd7;" horiz-adv-x="899" d="M125 317l252 250l-252 250l74 74l250 -252l251 252l74 -74l-254 -250l254 -250l-74 -73l-251 252l-250 -252z" />
+<glyph unicode="&#xd8;" horiz-adv-x="1570" d="M80 717q0 224 91 394t251 260.5t364 90.5q177 0 353 -86l63 90h189l-125 -182q227 -227 227 -569q0 -166 -53 -305t-147 -234.5t-225 -148t-284 -52.5q-183 0 -360 88l-86 -124h-191l150 215q-217 234 -217 563zM301 715q0 -100 25 -193t88 -203l616 904q-135 57 -246 57 q-119 0 -212 -43t-151.5 -120t-89 -179t-30.5 -223zM532 215q136 -59 254 -59q158 0 269.5 75.5t164 201t52.5 288.5q0 255 -119 401z" />
+<glyph unicode="&#xd9;" horiz-adv-x="1486" d="M150 608v826h194v-732q0 -93 8.5 -167t34.5 -149.5t68.5 -125.5t115.5 -81.5t172 -31.5t172 31.5t116 82t69 126t34.5 149t8.5 166.5v732h194v-826q0 -302 -149 -469.5t-445 -167.5t-444.5 167.5t-148.5 469.5zM551 1782v147l383 -194v-84z" />
+<glyph unicode="&#xda;" horiz-adv-x="1486" d="M150 608v826h194v-732q0 -93 8.5 -167t34.5 -149.5t68.5 -125.5t115.5 -81.5t172 -31.5t172 31.5t116 82t69 126t34.5 149t8.5 166.5v732h194v-826q0 -302 -149 -469.5t-445 -167.5t-444.5 167.5t-148.5 469.5zM551 1651v84l383 194v-147z" />
+<glyph unicode="&#xdb;" horiz-adv-x="1486" d="M150 608v826h194v-732q0 -93 8.5 -167t34.5 -149.5t68.5 -125.5t115.5 -81.5t172 -31.5t172 31.5t116 82t69 126t34.5 149t8.5 166.5v732h194v-826q0 -302 -149 -469.5t-445 -167.5t-444.5 167.5t-148.5 469.5zM442 1665v74l301 217l301 -217v-74l-301 168z" />
+<glyph unicode="&#xdc;" horiz-adv-x="1486" d="M150 608v826h194v-732q0 -93 8.5 -167t34.5 -149.5t68.5 -125.5t115.5 -81.5t172 -31.5t172 31.5t116 82t69 126t34.5 149t8.5 166.5v732h194v-826q0 -302 -149 -469.5t-445 -167.5t-444.5 167.5t-148.5 469.5zM489 1659v205h144v-205h-144zM854 1659v205h143v-205h-143z " />
+<glyph unicode="&#xdd;" horiz-adv-x="1161" d="M-6 1434h205l381 -596l381 596h204l-483 -772v-662h-203v662zM414 1651v84l383 194v-147z" />
+<glyph unicode="&#xde;" horiz-adv-x="1167" d="M164 0v1434h205v-287h139q137 0 230 -8t172 -29.5t123.5 -60t68.5 -99t24 -147.5q0 -210 -142 -295.5t-476 -85.5h-139v-422h-205zM369 535h213q180 0 265 63.5t85 189.5q0 130 -83 186t-267 56h-213v-495z" />
+<glyph unicode="&#xdf;" horiz-adv-x="1140" d="M33 899l14 125h137v139q0 82 35.5 153.5t93 118.5t128.5 74t143 27q64 0 130.5 -21.5t126 -62.5t97 -111t37.5 -157q0 -69 -24 -133t-58.5 -108.5t-69 -80t-58.5 -62t-24 -40.5q0 -15 27 -39.5t67.5 -51.5t88 -67.5t88 -84t67.5 -104.5t27 -126q0 -79 -38 -141 t-102.5 -100t-145 -57.5t-171.5 -19.5q-23 0 -39.5 1t-33.5 2.5t-29 2.5v123q95 2 161.5 10.5t121 30t81.5 60t27 96.5q0 55 -26 107.5t-65 90.5t-84 75.5t-84 65.5t-65 57.5t-26 53.5q0 23 25 54t60 65.5t70.5 76t60.5 101t25 125.5q0 64 -22.5 111.5t-59.5 73.5t-78 38.5 t-85 12.5q-105 0 -164.5 -65t-59.5 -164v-1453h-176v1178h-151z" />
+<glyph unicode="&#xe0;" horiz-adv-x="983" d="M49 270q0 81 38.5 145t98.5 103t142 64.5t159.5 35.5t161.5 11q0 135 -52.5 183t-166.5 48q-135 0 -264 -90l-27 150q62 47 152.5 75.5t187.5 28.5q130 0 206 -45t112.5 -149.5t36.5 -286.5v-205q0 -120 20 -165.5t94 -45.5h19l-29 -147h-14q-65 0 -109 9t-72 30 t-43.5 44.5t-33.5 63.5q-127 -147 -308 -147q-138 0 -223.5 81.5t-85.5 208.5zM238 281q0 -79 41.5 -116.5t113.5 -37.5q73 0 142.5 36.5t113.5 98.5v240q-221 -8 -316 -58.5t-95 -162.5zM299 1352v147l383 -194v-84z" />
+<glyph unicode="&#xe1;" horiz-adv-x="983" d="M49 270q0 81 38.5 145t98.5 103t142 64.5t159.5 35.5t161.5 11q0 135 -52.5 183t-166.5 48q-135 0 -264 -90l-27 150q62 47 152.5 75.5t187.5 28.5q130 0 206 -45t112.5 -149.5t36.5 -286.5v-205q0 -120 20 -165.5t94 -45.5h19l-29 -147h-14q-65 0 -109 9t-72 30 t-43.5 44.5t-33.5 63.5q-127 -147 -308 -147q-138 0 -223.5 81.5t-85.5 208.5zM238 281q0 -79 41.5 -116.5t113.5 -37.5q73 0 142.5 36.5t113.5 98.5v240q-221 -8 -316 -58.5t-95 -162.5zM299 1221v84l383 194v-147z" />
+<glyph unicode="&#xe2;" horiz-adv-x="983" d="M49 270q0 81 38.5 145t98.5 103t142 64.5t159.5 35.5t161.5 11q0 135 -52.5 183t-166.5 48q-135 0 -264 -90l-27 150q62 47 152.5 75.5t187.5 28.5q130 0 206 -45t112.5 -149.5t36.5 -286.5v-205q0 -120 20 -165.5t94 -45.5h19l-29 -147h-14q-65 0 -109 9t-72 30 t-43.5 44.5t-33.5 63.5q-127 -147 -308 -147q-138 0 -223.5 81.5t-85.5 208.5zM190 1235v74l302 217l301 -217v-74l-301 168zM238 281q0 -79 41.5 -116.5t113.5 -37.5q73 0 142.5 36.5t113.5 98.5v240q-221 -8 -316 -58.5t-95 -162.5z" />
+<glyph unicode="&#xe3;" horiz-adv-x="983" d="M49 270q0 81 38.5 145t98.5 103t142 64.5t159.5 35.5t161.5 11q0 135 -52.5 183t-166.5 48q-135 0 -264 -90l-27 150q62 47 152.5 75.5t187.5 28.5q130 0 206 -45t112.5 -149.5t36.5 -286.5v-205q0 -120 20 -165.5t94 -45.5h19l-29 -147h-14q-65 0 -109 9t-72 30 t-43.5 44.5t-33.5 63.5q-127 -147 -308 -147q-138 0 -223.5 81.5t-85.5 208.5zM129 1249q23 93 85 139t126 46q44 0 148 -50.5t139 -50.5q47 0 80 26t61 79l70 -19q-23 -89 -83 -140.5t-137 -51.5q-39 0 -138.5 52t-131.5 52q-107 0 -145 -100zM238 281q0 -79 41.5 -116.5 t113.5 -37.5q73 0 142.5 36.5t113.5 98.5v240q-221 -8 -316 -58.5t-95 -162.5z" />
+<glyph unicode="&#xe4;" horiz-adv-x="983" d="M49 270q0 81 38.5 145t98.5 103t142 64.5t159.5 35.5t161.5 11q0 135 -52.5 183t-166.5 48q-135 0 -264 -90l-27 150q62 47 152.5 75.5t187.5 28.5q130 0 206 -45t112.5 -149.5t36.5 -286.5v-205q0 -120 20 -165.5t94 -45.5h19l-29 -147h-14q-65 0 -109 9t-72 30 t-43.5 44.5t-33.5 63.5q-127 -147 -308 -147q-138 0 -223.5 81.5t-85.5 208.5zM238 281q0 -79 41.5 -116.5t113.5 -37.5q73 0 142.5 36.5t113.5 98.5v240q-221 -8 -316 -58.5t-95 -162.5zM238 1229v205h143v-205h-143zM602 1229v205h143v-205h-143z" />
+<glyph unicode="&#xe5;" horiz-adv-x="983" d="M49 270q0 81 38.5 145t98.5 103t142 64.5t159.5 35.5t161.5 11q0 135 -52.5 183t-166.5 48q-135 0 -264 -90l-27 150q62 47 152.5 75.5t187.5 28.5q130 0 206 -45t112.5 -149.5t36.5 -286.5v-205q0 -120 20 -165.5t94 -45.5h19l-29 -147h-14q-65 0 -109 9t-72 30 t-43.5 44.5t-33.5 63.5q-127 -147 -308 -147q-138 0 -223.5 81.5t-85.5 208.5zM238 281q0 -79 41.5 -116.5t113.5 -37.5q73 0 142.5 36.5t113.5 98.5v240q-221 -8 -316 -58.5t-95 -162.5zM279 1362q0 75 57 129.5t156 54.5q100 0 156.5 -54t56.5 -130t-55.5 -129t-157.5 -53 q-101 0 -157 53.5t-56 128.5zM369 1362q0 -55 36.5 -89t86.5 -34q49 0 85.5 34t36.5 89q0 53 -35.5 87t-86.5 34t-87 -34t-36 -87z" />
+<glyph unicode="&#xe6;" horiz-adv-x="1634" d="M45 242q0 65 21.5 119t57 92t86.5 68t104.5 48.5t117 31.5t117.5 19t113 9q-19 125 -73.5 178t-168.5 53t-250 -59l-16 143q174 80 319 80q32 0 66.5 -5.5t78 -22t78.5 -42.5t63.5 -71.5t39.5 -104.5q28 87 91 144t136 79.5t156 22.5q178 0 284.5 -108t106.5 -302 q0 -46 -8 -112h-688q0 -183 92 -279t245 -96q47 0 94 11t78 23t103 42l35 -142q-88 -40 -164.5 -60.5t-169.5 -20.5q-306 0 -412 231q-53 -117 -166.5 -178.5t-259.5 -61.5q-151 0 -229 72t-78 199zM233 258q0 -68 43.5 -99.5t116.5 -31.5q41 0 80.5 9t78 30t67 52t46 79.5 t17.5 108.5q0 59 -4 96q-76 0 -150.5 -13t-142.5 -40t-110 -76.5t-42 -114.5zM893 629h504q0 231 -223 231q-220 0 -281 -231z" />
+<glyph unicode="&#xe7;" horiz-adv-x="929" d="M68 504q0 111 31 205t91.5 164.5t156.5 110.5t218 40q204 0 309 -59l-28 -166q-125 61 -260 61q-164 0 -247 -92.5t-83 -263.5q0 -169 83.5 -266t246.5 -97q135 0 262 62l24 -148q-113 -75 -305 -75q-122 0 -218.5 42t-157 115t-92 166.5t-31.5 200.5zM393 -393l139 270 l136 12l-181 -272z" />
+<glyph unicode="&#xe8;" horiz-adv-x="1048" d="M63 510q0 142 57 257.5t170.5 186t264.5 70.5q192 0 312 -113t120 -311q0 -51 -8 -98h-727q35 -359 377 -359q157 0 289 60l24 -146q-172 -77 -336 -77q-129 0 -233.5 42t-171.5 115t-102.5 168.5t-35.5 204.5zM268 629h529q0 109 -61.5 170t-184.5 61q-119 0 -186.5 -59 t-96.5 -172zM332 1352v147l383 -194v-84z" />
+<glyph unicode="&#xe9;" horiz-adv-x="1048" d="M63 510q0 142 57 257.5t170.5 186t264.5 70.5q192 0 312 -113t120 -311q0 -51 -8 -98h-727q35 -359 377 -359q157 0 289 60l24 -146q-172 -77 -336 -77q-129 0 -233.5 42t-171.5 115t-102.5 168.5t-35.5 204.5zM268 629h529q0 109 -61.5 170t-184.5 61q-119 0 -186.5 -59 t-96.5 -172zM332 1221v84l383 194v-147z" />
+<glyph unicode="&#xea;" horiz-adv-x="1048" d="M63 510q0 142 57 257.5t170.5 186t264.5 70.5q192 0 312 -113t120 -311q0 -51 -8 -98h-727q35 -359 377 -359q157 0 289 60l24 -146q-172 -77 -336 -77q-129 0 -233.5 42t-171.5 115t-102.5 168.5t-35.5 204.5zM221 1235v74l301 217l301 -217v-74l-301 168zM268 629h529 q0 109 -61.5 170t-184.5 61q-119 0 -186.5 -59t-96.5 -172z" />
+<glyph unicode="&#xeb;" horiz-adv-x="1048" d="M63 510q0 142 57 257.5t170.5 186t264.5 70.5q192 0 312 -113t120 -311q0 -51 -8 -98h-727q35 -359 377 -359q157 0 289 60l24 -146q-172 -77 -336 -77q-129 0 -233.5 42t-171.5 115t-102.5 168.5t-35.5 204.5zM268 629h529q0 109 -61.5 170t-184.5 61q-119 0 -186.5 -59 t-96.5 -172zM268 1229v205h144v-205h-144zM633 1229v205h143v-205h-143z" />
+<glyph unicode="&#xec;" horiz-adv-x="434" d="M27 1352v147l383 -194v-84zM125 0v1004h184v-1004h-184z" />
+<glyph unicode="&#xed;" horiz-adv-x="434" d="M27 1221v84l383 194v-147zM125 0v1004h184v-1004h-184z" />
+<glyph unicode="&#xee;" horiz-adv-x="434" d="M-84 1235v74l301 217l301 -217v-74l-301 168zM125 0v1004h184v-1004h-184z" />
+<glyph unicode="&#xef;" horiz-adv-x="434" d="M-37 1229v205h143v-205h-143zM125 0v1004h184v-1004h-184zM328 1229v205h143v-205h-143z" />
+<glyph unicode="&#xf0;" horiz-adv-x="1058" d="M57 412q0 64 15.5 127.5t50 124t84 106.5t122.5 74t160 28q94 0 165 -33.5t112 -78.5q-13 100 -63 217.5t-113 169.5q-154 -110 -289 -127l-61 113q129 18 262 106q-123 111 -248 111l65 86q146 0 306 -113q63 56 120 131l95 -24q-43 -63 -142 -173 q132 -122 212.5 -321.5t80.5 -409.5q0 -126 -31 -225.5t-80 -159t-114.5 -98.5t-128 -53.5t-127.5 -14.5q-194 0 -323.5 124.5t-129.5 312.5zM262 430q0 -121 70.5 -203t185.5 -82q109 0 177.5 79t68.5 202t-66.5 199.5t-177.5 76.5q-117 0 -187.5 -80.5t-70.5 -191.5z" />
+<glyph unicode="&#xf1;" horiz-adv-x="1144" d="M125 0v1004h143l21 -107q143 127 332 127q409 0 409 -471v-553h-184v553q0 162 -60.5 234.5t-201.5 72.5q-91 0 -164.5 -33t-110.5 -98v-729h-184zM217 1249q23 93 85 139t126 46q44 0 148 -50.5t139 -50.5q47 0 80 26t61 79l70 -19q-23 -89 -82.5 -140.5t-136.5 -51.5 q-39 0 -139 52t-132 52q-107 0 -145 -100z" />
+<glyph unicode="&#xf2;" horiz-adv-x="1126" d="M66 502q0 109 34 204t96 166t157 111.5t210 40.5q152 0 266.5 -70t173 -187.5t58.5 -264.5t-58.5 -264.5t-173 -187.5t-266.5 -70q-115 0 -210 40.5t-157 111.5t-96 166t-34 204zM254 502q0 -170 80.5 -264.5t228.5 -94.5t228.5 94.5t80.5 264.5t-80.5 264t-228.5 94 t-228.5 -94t-80.5 -264zM371 1352v147l383 -194v-84z" />
+<glyph unicode="&#xf3;" horiz-adv-x="1126" d="M66 502q0 109 34 204t96 166t157 111.5t210 40.5q152 0 266.5 -70t173 -187.5t58.5 -264.5t-58.5 -264.5t-173 -187.5t-266.5 -70q-115 0 -210 40.5t-157 111.5t-96 166t-34 204zM254 502q0 -170 80.5 -264.5t228.5 -94.5t228.5 94.5t80.5 264.5t-80.5 264t-228.5 94 t-228.5 -94t-80.5 -264zM371 1221v84l383 194v-147z" />
+<glyph unicode="&#xf4;" horiz-adv-x="1126" d="M66 502q0 109 34 204t96 166t157 111.5t210 40.5q152 0 266.5 -70t173 -187.5t58.5 -264.5t-58.5 -264.5t-173 -187.5t-266.5 -70q-115 0 -210 40.5t-157 111.5t-96 166t-34 204zM254 502q0 -170 80.5 -264.5t228.5 -94.5t228.5 94.5t80.5 264.5t-80.5 264t-228.5 94 t-228.5 -94t-80.5 -264zM262 1235v74l301 217l301 -217v-74l-301 168z" />
+<glyph unicode="&#xf5;" horiz-adv-x="1126" d="M66 502q0 109 34 204t96 166t157 111.5t210 40.5q152 0 266.5 -70t173 -187.5t58.5 -264.5t-58.5 -264.5t-173 -187.5t-266.5 -70q-115 0 -210 40.5t-157 111.5t-96 166t-34 204zM209 1249q23 93 85 139t126 46q44 0 148 -50.5t139 -50.5q47 0 80 26t61 79l70 -19 q-23 -89 -83 -140.5t-137 -51.5q-39 0 -138.5 52t-131.5 52q-107 0 -145 -100zM254 502q0 -170 80.5 -264.5t228.5 -94.5t228.5 94.5t80.5 264.5t-80.5 264t-228.5 94t-228.5 -94t-80.5 -264z" />
+<glyph unicode="&#xf6;" horiz-adv-x="1126" d="M66 502q0 109 34 204t96 166t157 111.5t210 40.5q152 0 266.5 -70t173 -187.5t58.5 -264.5t-58.5 -264.5t-173 -187.5t-266.5 -70q-115 0 -210 40.5t-157 111.5t-96 166t-34 204zM254 502q0 -170 80.5 -264.5t228.5 -94.5t228.5 94.5t80.5 264.5t-80.5 264t-228.5 94 t-228.5 -94t-80.5 -264zM309 1229v205h144v-205h-144zM674 1229v205h143v-205h-143z" />
+<glyph unicode="&#xf7;" horiz-adv-x="1212" d="M135 502v151h942v-151h-942zM506 41v192h182v-192h-182zM506 901v193h182v-193h-182z" />
+<glyph unicode="&#xf8;" horiz-adv-x="1167" d="M68 510q0 145 60 263.5t179 190.5t277 72q73 0 172 -24l39 82h151l-69 -136q227 -172 227 -450q0 -145 -60 -263t-179.5 -189.5t-278.5 -71.5q-72 0 -176 22l-39 -78h-146l66 135q-223 166 -223 447zM266 508q0 -71 20 -139.5t74 -163.5l330 674q-82 14 -108 14 q-148 0 -232 -108.5t-84 -276.5zM475 139q86 -12 113 -12q149 0 233 108t84 273q0 89 -23 180t-73 127z" />
+<glyph unicode="&#xf9;" horiz-adv-x="1073" d="M115 420v584h184v-533q0 -164 55.5 -246t177.5 -82q73 0 135 29t97 86v746h184v-1004h-164l-20 111q-48 -67 -115 -99t-164 -32q-180 0 -275 109t-95 331zM379 1352v147l383 -194v-84z" />
+<glyph unicode="&#xfa;" horiz-adv-x="1073" d="M115 420v584h184v-533q0 -164 55.5 -246t177.5 -82q73 0 135 29t97 86v746h184v-1004h-164l-20 111q-48 -67 -115 -99t-164 -32q-180 0 -275 109t-95 331zM379 1221v84l383 194v-147z" />
+<glyph unicode="&#xfb;" horiz-adv-x="1073" d="M115 420v584h184v-533q0 -164 55.5 -246t177.5 -82q73 0 135 29t97 86v746h184v-1004h-164l-20 111q-48 -67 -115 -99t-164 -32q-180 0 -275 109t-95 331zM270 1235v74l301 217l301 -217v-74l-301 168z" />
+<glyph unicode="&#xfc;" horiz-adv-x="1073" d="M115 420v584h184v-533q0 -164 55.5 -246t177.5 -82q73 0 135 29t97 86v746h184v-1004h-164l-20 111q-48 -67 -115 -99t-164 -32q-180 0 -275 109t-95 331zM317 1229v205h144v-205h-144zM682 1229v205h143v-205h-143z" />
+<glyph unicode="&#xfd;" horiz-adv-x="1034" d="M14 1004h205l313 -746l283 746h205l-614 -1500h-205l231 541zM324 1221v84l383 194v-147z" />
+<glyph unicode="&#xfe;" horiz-adv-x="1187" d="M123 -494v2030h184v-639q127 127 324 127q113 0 206.5 -41.5t155 -113t95.5 -166.5t34 -201t-33.5 -200t-95.5 -166t-159 -114t-216 -42q-209 0 -311 135v-609h-184zM293 502q0 -80 17.5 -146.5t53 -118.5t96.5 -81t142 -29q159 0 246.5 104t87.5 271q0 164 -86.5 261 t-247.5 97q-159 0 -234 -96.5t-75 -261.5z" />
+<glyph unicode="&#xff;" horiz-adv-x="1034" d="M14 1004h205l313 -746l283 746h205l-614 -1500h-205l231 541zM260 1229v205h143v-205h-143zM625 1229v205h143v-205h-143z" />
+<glyph unicode="&#x152;" horiz-adv-x="2193" d="M82 717q0 168 52 308t143.5 235.5t219.5 148.5t277 53q128 0 245 -45t259 -153v168h821v-175h-635v-419h488v-176h-488v-486h654v-176h-840v170q-142 -108 -259.5 -153.5t-244.5 -45.5q-149 0 -277 53t-219.5 149t-143.5 236t-52 308zM287 717q0 -122 30.5 -225 t89.5 -180.5t153 -121t214 -43.5q119 0 213 43.5t153 121t89.5 180.5t30.5 225t-30.5 225t-89.5 180t-153 120.5t-213 43.5q-120 0 -214 -43.5t-153 -120.5t-89.5 -180t-30.5 -225z" />
+<glyph unicode="&#x153;" horiz-adv-x="1847" d="M66 512q0 146 59 261t176.5 183t276.5 68q123 0 235.5 -54t155.5 -155q55 101 163 155t218 54q197 0 316.5 -111.5t119.5 -306.5q0 -57 -8 -104h-703q0 -92 23 -162t57 -109.5t80 -64t85 -32t79 -7.5q169 0 317 76l21 -158q-141 -65 -314 -65q-189 0 -294 54t-152 165 q-44 -103 -158 -161t-250 -58q-153 0 -269 72t-175 191.5t-59 268.5zM254 502q0 -171 81.5 -265t239.5 -94q153 0 232.5 101.5t79.5 263.5q0 158 -81.5 255t-227.5 97q-158 0 -241 -93.5t-83 -264.5zM1079 629h518q-9 110 -75 170.5t-174 60.5q-110 0 -176.5 -54.5 t-92.5 -176.5z" />
+<glyph unicode="&#x178;" horiz-adv-x="1161" d="M-6 1434h205l381 -596l381 596h204l-483 -772v-662h-203v662zM352 1659v205h144v-205h-144zM717 1659v205h143v-205h-143z" />
+<glyph unicode="&#x2c6;" horiz-adv-x="913" d="M156 1235v74l301 217l301 -217v-74l-301 168z" />
+<glyph unicode="&#x2dc;" horiz-adv-x="1081" d="M188 1249q23 93 85 139t126 46q44 0 148.5 -50.5t138.5 -50.5q47 0 80 26t61 79l70 -19q-23 -89 -82.5 -140.5t-136.5 -51.5q-39 0 -138.5 52t-131.5 52q-108 0 -146 -100z" />
+<glyph unicode="&#x2000;" horiz-adv-x="988" />
+<glyph unicode="&#x2001;" horiz-adv-x="1976" />
+<glyph unicode="&#x2002;" horiz-adv-x="988" />
+<glyph unicode="&#x2003;" horiz-adv-x="1976" />
+<glyph unicode="&#x2004;" horiz-adv-x="658" />
+<glyph unicode="&#x2005;" horiz-adv-x="494" />
+<glyph unicode="&#x2006;" horiz-adv-x="329" />
+<glyph unicode="&#x2007;" horiz-adv-x="329" />
+<glyph unicode="&#x2008;" horiz-adv-x="247" />
+<glyph unicode="&#x2009;" horiz-adv-x="395" />
+<glyph unicode="&#x200a;" horiz-adv-x="109" />
+<glyph unicode="&#x2010;" horiz-adv-x="868" d="M117 487v177h635v-177h-635z" />
+<glyph unicode="&#x2011;" horiz-adv-x="868" d="M117 487v177h635v-177h-635z" />
+<glyph unicode="&#x2012;" horiz-adv-x="868" d="M117 487v177h635v-177h-635z" />
+<glyph unicode="&#x2013;" horiz-adv-x="1028" d="M117 487v177h794v-177h-794z" />
+<glyph unicode="&#x2014;" horiz-adv-x="1216" d="M117 487v177h983v-177h-983z" />
+<glyph unicode="&#x2018;" horiz-adv-x="380" d="M88 1137v176l160 223l47 -27l-72 -178l70 -18v-176h-205z" />
+<glyph unicode="&#x2019;" horiz-adv-x="346" d="M86 1163l72 178l-70 19v176h205v-176l-160 -223z" />
+<glyph unicode="&#x201a;" horiz-adv-x="442" d="M117 -197l71 179l-69 18v176h205v-176l-160 -223z" />
+<glyph unicode="&#x201c;" horiz-adv-x="811" d="M88 1137v176l160 223l47 -27l-72 -178l70 -18v-176h-205zM518 1137v176l160 223l47 -27l-72 -178l70 -18v-176h-205z" />
+<glyph unicode="&#x201d;" horiz-adv-x="776" d="M86 1163l72 178l-70 19v176h205v-176l-160 -223zM516 1163l72 178l-70 19v176h205v-176l-160 -223z" />
+<glyph unicode="&#x201e;" horiz-adv-x="913" d="M117 -197l71 179l-69 18v176h205v-176l-160 -223zM588 -197l71 179l-69 18v176h205v-176l-160 -223z" />
+<glyph unicode="&#x2022;" horiz-adv-x="626" d="M90 569q0 92 65.5 158t157.5 66t158 -66t66 -158t-66 -157.5t-158 -65.5t-157.5 65.5t-65.5 157.5z" />
+<glyph unicode="&#x2026;" horiz-adv-x="1384" d="M117 0v176h184v-176h-184zM600 0v176h184v-176h-184zM1083 0v176h185v-176h-185z" />
+<glyph unicode="&#x202f;" horiz-adv-x="395" />
+<glyph unicode="&#x2039;" horiz-adv-x="659" d="M29 582l325 422h224l-326 -422l326 -422h-224z" />
+<glyph unicode="&#x203a;" horiz-adv-x="661" d="M84 160l326 422l-326 422h223l326 -422l-326 -422h-223z" />
+<glyph unicode="&#x205f;" horiz-adv-x="494" />
+<glyph unicode="&#x20ac;" horiz-adv-x="1439" d="M68 440l49 142h202q-8 76 -8 135v49h-182l45 131h156q58 235 228 368.5t405 133.5q208 0 360 -70l-25 -201q-184 78 -335 78q-301 0 -394 -309h529l-49 -131h-500v-49q0 -69 10 -135h498l-49 -142h-406q63 -110 151 -161.5t210 -51.5q151 0 335 78l25 -201 q-150 -69 -360 -69q-208 0 -368.5 106.5t-238.5 298.5h-288z" />
+<glyph unicode="&#x2122;" horiz-adv-x="1488" d="M63 1331v103h531l-12 -103h-205v-641h-105v641h-209zM627 690l96 744h59l215 -367l213 367h60l98 -744h-111l-63 549l-193 -332h-12l-188 334l-68 -551h-106z" />
+<glyph unicode="&#x25fc;" horiz-adv-x="1003" d="M0 0v1004h1004v-1004h-1004z" />
+<hkern u1="&#x22;" u2="&#xee;" k="-59" />
+<hkern u1="&#x26;" u2="&#x2019;" k="94" />
+<hkern u1="&#x26;" u2="&#xdf;" k="27" />
+<hkern u1="&#x26;" u2="w" k="18" />
+<hkern u1="&#x26;" u2="v" k="27" />
+<hkern u1="&#x26;" u2="t" k="43" />
+<hkern u1="&#x26;" u2="l" k="10" />
+<hkern u1="&#x26;" u2="f" k="29" />
+<hkern u1="&#x26;" u2="W" k="47" />
+<hkern u1="&#x26;" u2="V" k="80" />
+<hkern u1="&#x26;" u2="T" k="111" />
+<hkern u1="&#x27;" u2="&#xee;" k="-59" />
+<hkern u1="&#x28;" u2="&#xf0;" k="49" />
+<hkern u1="&#x28;" u2="&#xdf;" k="41" />
+<hkern u1="&#x28;" u2="w" k="49" />
+<hkern u1="&#x28;" u2="v" k="51" />
+<hkern u1="&#x28;" u2="t" k="51" />
+<hkern u1="&#x28;" u2="s" k="47" />
+<hkern u1="&#x28;" u2="g" k="49" />
+<hkern u1="&#x28;" u2="f" k="35" />
+<hkern u1="&#x28;" u2="M" k="35" />
+<hkern u1="&#x28;" u2="J" k="-45" />
+<hkern u1="&#x28;" u2="&#x39;" k="23" />
+<hkern u1="&#x28;" u2="&#x38;" k="39" />
+<hkern u1="&#x28;" u2="&#x36;" k="55" />
+<hkern u1="&#x28;" u2="&#x34;" k="45" />
+<hkern u1="&#x28;" u2="&#x30;" k="53" />
+<hkern u1="&#x2a;" u2="&#xf0;" k="49" />
+<hkern u1="&#x2a;" u2="&#xef;" k="-88" />
+<hkern u1="&#x2a;" u2="&#xee;" k="-133" />
+<hkern u1="&#x2a;" u2="&#xed;" k="-25" />
+<hkern u1="&#x2a;" u2="&#xec;" k="-33" />
+<hkern u1="&#x2a;" u2="&#xc6;" k="109" />
+<hkern u1="&#x2a;" u2="g" k="37" />
+<hkern u1="&#x2a;" u2="W" k="-18" />
+<hkern u1="&#x2a;" u2="V" k="-33" />
+<hkern u1="&#x2a;" u2="T" k="-23" />
+<hkern u1="&#x2a;" u2="M" k="37" />
+<hkern u1="&#x2b;" u2="&#x37;" k="82" />
+<hkern u1="&#x2b;" u2="&#x33;" k="37" />
+<hkern u1="&#x2b;" u2="&#x32;" k="78" />
+<hkern u1="&#x2b;" u2="&#x31;" k="55" />
+<hkern u1="&#x2c;" u2="&#x31;" k="29" />
+<hkern u1="&#x2c;" u2="&#x30;" k="35" />
+<hkern u1="&#x2d;" u2="&#x37;" k="43" />
+<hkern u1="&#x2d;" u2="&#x33;" k="27" />
+<hkern u1="&#x2d;" u2="&#x32;" k="35" />
+<hkern u1="&#x2d;" u2="&#x31;" k="31" />
+<hkern u1="&#x2e;" u2="&#xdf;" k="27" />
+<hkern u1="&#x2e;" u2="w" k="41" />
+<hkern u1="&#x2e;" u2="v" k="59" />
+<hkern u1="&#x2e;" u2="t" k="35" />
+<hkern u1="&#x2e;" u2="f" k="31" />
+<hkern u1="&#x2e;" u2="W" k="61" />
+<hkern u1="&#x2e;" u2="V" k="88" />
+<hkern u1="&#x2e;" u2="T" k="86" />
+<hkern u1="&#x2e;" u2="&#x31;" k="29" />
+<hkern u1="&#x2e;" u2="&#x30;" k="35" />
+<hkern u1="&#x2f;" u2="&#xf0;" k="45" />
+<hkern u1="&#x2f;" u2="&#xef;" k="-29" />
+<hkern u1="&#x2f;" u2="&#xee;" k="-27" />
+<hkern u1="&#x2f;" u2="&#xc6;" k="111" />
+<hkern u1="&#x2f;" u2="s" k="72" />
+<hkern u1="&#x2f;" u2="g" k="78" />
+<hkern u1="&#x2f;" u2="M" k="39" />
+<hkern u1="&#x2f;" u2="&#x36;" k="57" />
+<hkern u1="&#x2f;" u2="&#x34;" k="80" />
+<hkern u1="&#x2f;" u2="&#x30;" k="20" />
+<hkern u1="&#x2f;" u2="&#x2f;" k="121" />
+<hkern u1="&#x30;" u2="&#x7d;" k="33" />
+<hkern u1="&#x30;" u2="]" k="39" />
+<hkern u1="&#x30;" u2="\" k="16" />
+<hkern u1="&#x30;" u2="Z" k="31" />
+<hkern u1="&#x30;" u2="Y" k="47" />
+<hkern u1="&#x30;" u2="X" k="20" />
+<hkern u1="&#x30;" u2="V" k="20" />
+<hkern u1="&#x30;" u2="T" k="41" />
+<hkern u1="&#x30;" u2="A" k="20" />
+<hkern u1="&#x30;" u2="&#x37;" k="23" />
+<hkern u1="&#x30;" u2="&#x2f;" k="27" />
+<hkern u1="&#x30;" u2="&#x2e;" k="37" />
+<hkern u1="&#x30;" u2="&#x2c;" k="37" />
+<hkern u1="&#x30;" u2="&#x29;" k="53" />
+<hkern u1="&#x31;" u2="&#x2b;" k="16" />
+<hkern u1="&#x31;" u2="&#x29;" k="23" />
+<hkern u1="&#x32;" u2="&#xb7;" k="29" />
+<hkern u1="&#x32;" u2="&#x2d;" k="29" />
+<hkern u1="&#x32;" u2="&#x2b;" k="35" />
+<hkern u1="&#x33;" u2="&#x29;" k="35" />
+<hkern u1="&#x34;" u2="&#xb0;" k="23" />
+<hkern u1="&#x34;" u2="z" k="18" />
+<hkern u1="&#x34;" u2="\" k="18" />
+<hkern u1="&#x34;" u2="Z" k="16" />
+<hkern u1="&#x34;" u2="Y" k="29" />
+<hkern u1="&#x34;" u2="W" k="23" />
+<hkern u1="&#x34;" u2="V" k="25" />
+<hkern u1="&#x34;" u2="T" k="37" />
+<hkern u1="&#x34;" u2="&#x2e;" k="31" />
+<hkern u1="&#x34;" u2="&#x2c;" k="33" />
+<hkern u1="&#x34;" u2="&#x29;" k="43" />
+<hkern u1="&#x36;" u2="&#xb0;" k="23" />
+<hkern u1="&#x36;" u2="y" k="18" />
+<hkern u1="&#x36;" u2="\" k="25" />
+<hkern u1="&#x36;" u2="Y" k="43" />
+<hkern u1="&#x36;" u2="W" k="25" />
+<hkern u1="&#x36;" u2="V" k="33" />
+<hkern u1="&#x36;" u2="T" k="51" />
+<hkern u1="&#x36;" u2="&#x37;" k="16" />
+<hkern u1="&#x36;" u2="&#x31;" k="16" />
+<hkern u1="&#x36;" u2="&#x29;" k="35" />
+<hkern u1="&#x37;" u2="&#xb7;" k="37" />
+<hkern u1="&#x37;" u2="&#x7d;" k="-57" />
+<hkern u1="&#x37;" u2="z" k="23" />
+<hkern u1="&#x37;" u2="u" k="47" />
+<hkern u1="&#x37;" u2="s" k="66" />
+<hkern u1="&#x37;" u2="g" k="70" />
+<hkern u1="&#x37;" u2="a" k="68" />
+<hkern u1="&#x37;" u2="]" k="-51" />
+<hkern u1="&#x37;" u2="Y" k="-68" />
+<hkern u1="&#x37;" u2="X" k="-45" />
+<hkern u1="&#x37;" u2="W" k="-39" />
+<hkern u1="&#x37;" u2="V" k="-61" />
+<hkern u1="&#x37;" u2="T" k="-35" />
+<hkern u1="&#x37;" u2="M" k="41" />
+<hkern u1="&#x37;" u2="A" k="94" />
+<hkern u1="&#x37;" u2="&#x36;" k="49" />
+<hkern u1="&#x37;" u2="&#x34;" k="72" />
+<hkern u1="&#x37;" u2="&#x30;" k="18" />
+<hkern u1="&#x37;" u2="&#x2f;" k="115" />
+<hkern u1="&#x37;" u2="&#x2e;" k="80" />
+<hkern u1="&#x37;" u2="&#x2d;" k="35" />
+<hkern u1="&#x37;" u2="&#x2c;" k="80" />
+<hkern u1="&#x37;" u2="&#x2b;" k="74" />
+<hkern u1="&#x37;" u2="&#x23;" k="57" />
+<hkern u1="&#x38;" u2="Y" k="20" />
+<hkern u1="&#x38;" u2="T" k="16" />
+<hkern u1="&#x38;" u2="&#x29;" k="37" />
+<hkern u1="&#x39;" u2="Z" k="20" />
+<hkern u1="&#x39;" u2="M" k="20" />
+<hkern u1="&#x39;" u2="A" k="49" />
+<hkern u1="&#x39;" u2="&#x2f;" k="63" />
+<hkern u1="&#x39;" u2="&#x2e;" k="45" />
+<hkern u1="&#x39;" u2="&#x2c;" k="45" />
+<hkern u1="&#x39;" u2="&#x29;" k="41" />
+<hkern u1="&#x3d;" u2="&#x37;" k="37" />
+<hkern u1="&#x3d;" u2="&#x32;" k="20" />
+<hkern u1="&#x40;" u2="&#x2019;" k="41" />
+<hkern u1="&#x40;" u2="Z" k="41" />
+<hkern u1="&#x40;" u2="Y" k="92" />
+<hkern u1="&#x40;" u2="X" k="33" />
+<hkern u1="&#x40;" u2="W" k="41" />
+<hkern u1="&#x40;" u2="V" k="59" />
+<hkern u1="&#x40;" u2="T" k="109" />
+<hkern u1="A" u2="&#xf0;" k="12" />
+<hkern u1="A" u2="&#xdf;" k="29" />
+<hkern u1="A" u2="&#x39;" k="29" />
+<hkern u1="A" u2="&#x31;" k="35" />
+<hkern u1="B" u2="&#x2122;" k="25" />
+<hkern u1="B" u2="&#xdf;" k="29" />
+<hkern u1="B" u2="&#xc6;" k="16" />
+<hkern u1="B" u2="&#x7d;" k="51" />
+<hkern u1="B" u2="x" k="45" />
+<hkern u1="B" u2="w" k="27" />
+<hkern u1="B" u2="v" k="35" />
+<hkern u1="B" u2="t" k="35" />
+<hkern u1="B" u2="l" k="12" />
+<hkern u1="B" u2="g" k="14" />
+<hkern u1="B" u2="f" k="29" />
+<hkern u1="B" u2="]" k="59" />
+<hkern u1="B" u2="\" k="31" />
+<hkern u1="B" u2="X" k="31" />
+<hkern u1="B" u2="W" k="23" />
+<hkern u1="B" u2="V" k="33" />
+<hkern u1="B" u2="T" k="57" />
+<hkern u1="B" u2="&#x3f;" k="33" />
+<hkern u1="B" u2="&#x37;" k="27" />
+<hkern u1="B" u2="&#x32;" k="18" />
+<hkern u1="B" u2="&#x2a;" k="18" />
+<hkern u1="B" u2="&#x29;" k="51" />
+<hkern u1="C" u2="&#xf0;" k="14" />
+<hkern u1="C" u2="&#xef;" k="-25" />
+<hkern u1="C" u2="&#xee;" k="-63" />
+<hkern u1="C" u2="&#xdf;" k="12" />
+<hkern u1="C" u2="&#x34;" k="100" />
+<hkern u1="D" u2="&#xf0;" k="14" />
+<hkern u1="D" u2="&#xdf;" k="12" />
+<hkern u1="D" u2="&#x37;" k="33" />
+<hkern u1="D" u2="&#x33;" k="16" />
+<hkern u1="E" u2="&#xf0;" k="20" />
+<hkern u1="E" u2="&#xee;" k="-43" />
+<hkern u1="E" u2="&#xdf;" k="27" />
+<hkern u1="E" u2="&#x34;" k="74" />
+<hkern u1="F" u2="&#x2122;" k="-33" />
+<hkern u1="F" u2="&#xf0;" k="70" />
+<hkern u1="F" u2="&#xef;" k="-57" />
+<hkern u1="F" u2="&#xee;" k="-106" />
+<hkern u1="F" u2="&#xe3;" k="102" />
+<hkern u1="F" u2="&#xdf;" k="31" />
+<hkern u1="F" u2="&#xc6;" k="207" />
+<hkern u1="F" u2="&#x7d;" k="-39" />
+<hkern u1="F" u2="x" k="35" />
+<hkern u1="F" u2="w" k="16" />
+<hkern u1="F" u2="v" k="18" />
+<hkern u1="F" u2="t" k="18" />
+<hkern u1="F" u2="g" k="82" />
+<hkern u1="F" u2="f" k="25" />
+<hkern u1="F" u2="]" k="-33" />
+<hkern u1="F" u2="T" k="-10" />
+<hkern u1="F" u2="M" k="35" />
+<hkern u1="F" u2="&#x40;" k="70" />
+<hkern u1="F" u2="&#x3b;" k="27" />
+<hkern u1="F" u2="&#x3a;" k="27" />
+<hkern u1="F" u2="&#x36;" k="27" />
+<hkern u1="F" u2="&#x34;" k="68" />
+<hkern u1="F" u2="&#x2f;" k="117" />
+<hkern u1="F" u2="&#x2c;" k="143" />
+<hkern u1="F" u2="&#x2a;" k="-23" />
+<hkern u1="F" u2="&#x26;" k="23" />
+<hkern u1="G" u2="&#xdf;" k="25" />
+<hkern u1="G" u2="w" k="18" />
+<hkern u1="G" u2="v" k="25" />
+<hkern u1="G" u2="t" k="25" />
+<hkern u1="G" u2="l" k="12" />
+<hkern u1="G" u2="g" k="12" />
+<hkern u1="G" u2="f" k="20" />
+<hkern u1="G" u2="T" k="10" />
+<hkern u1="G" u2="&#x29;" k="16" />
+<hkern u1="J" u2="&#xf0;" k="27" />
+<hkern u1="J" u2="&#xdf;" k="25" />
+<hkern u1="J" u2="w" k="16" />
+<hkern u1="J" u2="v" k="18" />
+<hkern u1="J" u2="t" k="18" />
+<hkern u1="J" u2="l" k="20" />
+<hkern u1="J" u2="g" k="31" />
+<hkern u1="J" u2="f" k="18" />
+<hkern u1="J" u2="M" k="10" />
+<hkern u1="J" u2="&#x29;" k="20" />
+<hkern u1="K" u2="&#x2122;" k="-55" />
+<hkern u1="K" u2="&#xf0;" k="35" />
+<hkern u1="K" u2="&#xef;" k="-84" />
+<hkern u1="K" u2="&#xee;" k="-49" />
+<hkern u1="K" u2="&#xec;" k="-20" />
+<hkern u1="K" u2="&#xdf;" k="23" />
+<hkern u1="K" u2="&#xae;" k="37" />
+<hkern u1="K" u2="&#x7d;" k="-68" />
+<hkern u1="K" u2="w" k="92" />
+<hkern u1="K" u2="v" k="113" />
+<hkern u1="K" u2="t" k="55" />
+<hkern u1="K" u2="g" k="37" />
+<hkern u1="K" u2="f" k="20" />
+<hkern u1="K" u2="]" k="-68" />
+<hkern u1="K" u2="&#x2a;" k="-18" />
+<hkern u1="K" u2="&#x26;" k="18" />
+<hkern u1="L" u2="&#x2122;" k="184" />
+<hkern u1="L" u2="&#xdf;" k="27" />
+<hkern u1="L" u2="&#xb7;" k="119" />
+<hkern u1="L" u2="&#xae;" k="74" />
+<hkern u1="L" u2="&#x7d;" k="31" />
+<hkern u1="L" u2="w" k="90" />
+<hkern u1="L" u2="v" k="117" />
+<hkern u1="L" u2="t" k="49" />
+<hkern u1="L" u2="g" k="14" />
+<hkern u1="L" u2="f" k="31" />
+<hkern u1="L" u2="]" k="33" />
+<hkern u1="L" u2="\" k="141" />
+<hkern u1="L" u2="W" k="109" />
+<hkern u1="L" u2="V" k="209" />
+<hkern u1="L" u2="T" k="137" />
+<hkern u1="L" u2="&#x3f;" k="51" />
+<hkern u1="L" u2="&#x39;" k="59" />
+<hkern u1="L" u2="&#x34;" k="127" />
+<hkern u1="L" u2="&#x31;" k="41" />
+<hkern u1="L" u2="&#x30;" k="27" />
+<hkern u1="L" u2="&#x2a;" k="184" />
+<hkern u1="M" u2="&#x2122;" k="39" />
+<hkern u1="M" u2="&#xf0;" k="18" />
+<hkern u1="M" u2="&#xdf;" k="37" />
+<hkern u1="M" u2="w" k="41" />
+<hkern u1="M" u2="v" k="45" />
+<hkern u1="M" u2="t" k="41" />
+<hkern u1="M" u2="l" k="23" />
+<hkern u1="M" u2="g" k="27" />
+<hkern u1="M" u2="f" k="33" />
+<hkern u1="M" u2="\" k="35" />
+<hkern u1="M" u2="W" k="37" />
+<hkern u1="M" u2="V" k="41" />
+<hkern u1="M" u2="T" k="51" />
+<hkern u1="M" u2="J" k="10" />
+<hkern u1="M" u2="&#x3f;" k="29" />
+<hkern u1="M" u2="&#x31;" k="18" />
+<hkern u1="M" u2="&#x2a;" k="37" />
+<hkern u1="M" u2="&#x29;" k="29" />
+<hkern u1="P" u2="&#xf0;" k="45" />
+<hkern u1="P" u2="&#xef;" k="-8" />
+<hkern u1="P" u2="&#xee;" k="-51" />
+<hkern u1="P" u2="&#xc6;" k="141" />
+<hkern u1="P" u2="l" k="10" />
+<hkern u1="P" u2="g" k="20" />
+<hkern u1="P" u2="X" k="29" />
+<hkern u1="P" u2="M" k="20" />
+<hkern u1="P" u2="&#x40;" k="31" />
+<hkern u1="P" u2="&#x34;" k="29" />
+<hkern u1="P" u2="&#x33;" k="16" />
+<hkern u1="P" u2="&#x2f;" k="94" />
+<hkern u1="P" u2="&#x2c;" k="166" />
+<hkern u1="P" u2="&#x29;" k="31" />
+<hkern u1="P" u2="&#x26;" k="12" />
+<hkern u1="R" u2="&#xf0;" k="29" />
+<hkern u1="R" u2="&#xdf;" k="18" />
+<hkern u1="R" u2="&#x7d;" k="18" />
+<hkern u1="R" u2="w" k="12" />
+<hkern u1="R" u2="v" k="16" />
+<hkern u1="R" u2="t" k="16" />
+<hkern u1="R" u2="l" k="16" />
+<hkern u1="R" u2="g" k="27" />
+<hkern u1="R" u2="f" k="14" />
+<hkern u1="R" u2="]" k="33" />
+<hkern u1="R" u2="V" k="10" />
+<hkern u1="R" u2="T" k="27" />
+<hkern u1="R" u2="&#x34;" k="45" />
+<hkern u1="S" u2="&#xdf;" k="25" />
+<hkern u1="T" u2="&#x2122;" k="-33" />
+<hkern u1="T" u2="&#xfe;" k="98" />
+<hkern u1="T" u2="&#xf0;" k="84" />
+<hkern u1="T" u2="&#xef;" k="-61" />
+<hkern u1="T" u2="&#xee;" k="-106" />
+<hkern u1="T" u2="&#xed;" k="4" />
+<hkern u1="T" u2="&#xec;" k="4" />
+<hkern u1="T" u2="&#xe3;" k="109" />
+<hkern u1="T" u2="&#xdf;" k="59" />
+<hkern u1="T" u2="&#xc6;" k="150" />
+<hkern u1="T" u2="&#xae;" k="49" />
+<hkern u1="T" u2="&#x7d;" k="-43" />
+<hkern u1="T" u2="x" k="176" />
+<hkern u1="T" u2="w" k="152" />
+<hkern u1="T" u2="v" k="170" />
+<hkern u1="T" u2="t" k="53" />
+<hkern u1="T" u2="s" k="121" />
+<hkern u1="T" u2="l" k="12" />
+<hkern u1="T" u2="g" k="166" />
+<hkern u1="T" u2="f" k="51" />
+<hkern u1="T" u2="]" k="-37" />
+<hkern u1="T" u2="M" k="53" />
+<hkern u1="T" u2="&#x40;" k="121" />
+<hkern u1="T" u2="&#x3b;" k="70" />
+<hkern u1="T" u2="&#x3a;" k="70" />
+<hkern u1="T" u2="&#x38;" k="16" />
+<hkern u1="T" u2="&#x36;" k="78" />
+<hkern u1="T" u2="&#x34;" k="92" />
+<hkern u1="T" u2="&#x30;" k="43" />
+<hkern u1="T" u2="&#x2f;" k="104" />
+<hkern u1="T" u2="&#x2c;" k="88" />
+<hkern u1="T" u2="&#x2a;" k="-25" />
+<hkern u1="T" u2="&#x26;" k="31" />
+<hkern u1="U" u2="&#xf0;" k="29" />
+<hkern u1="U" u2="&#xee;" k="10" />
+<hkern u1="U" u2="&#xdf;" k="16" />
+<hkern u1="V" u2="&#x2122;" k="-53" />
+<hkern u1="V" u2="&#xf0;" k="82" />
+<hkern u1="V" u2="&#xef;" k="-82" />
+<hkern u1="V" u2="&#xee;" k="-90" />
+<hkern u1="V" u2="&#xec;" k="-18" />
+<hkern u1="V" u2="&#xdf;" k="29" />
+<hkern u1="V" u2="&#xc6;" k="123" />
+<hkern u1="V" u2="&#xae;" k="23" />
+<hkern u1="V" u2="&#x7d;" k="-59" />
+<hkern u1="V" u2="x" k="27" />
+<hkern u1="V" u2="w" k="31" />
+<hkern u1="V" u2="v" k="29" />
+<hkern u1="V" u2="t" k="35" />
+<hkern u1="V" u2="s" k="80" />
+<hkern u1="V" u2="g" k="109" />
+<hkern u1="V" u2="f" k="25" />
+<hkern u1="V" u2="]" k="-59" />
+<hkern u1="V" u2="M" k="43" />
+<hkern u1="V" u2="&#x40;" k="88" />
+<hkern u1="V" u2="&#x3b;" k="16" />
+<hkern u1="V" u2="&#x36;" k="53" />
+<hkern u1="V" u2="&#x34;" k="74" />
+<hkern u1="V" u2="&#x30;" k="20" />
+<hkern u1="V" u2="&#x2f;" k="113" />
+<hkern u1="V" u2="&#x2c;" k="88" />
+<hkern u1="V" u2="&#x2a;" k="-33" />
+<hkern u1="V" u2="&#x26;" k="27" />
+<hkern u1="W" u2="&#x2122;" k="-47" />
+<hkern u1="W" u2="&#xf0;" k="70" />
+<hkern u1="W" u2="&#xef;" k="-74" />
+<hkern u1="W" u2="&#xee;" k="-90" />
+<hkern u1="W" u2="&#xec;" k="-8" />
+<hkern u1="W" u2="&#xdf;" k="23" />
+<hkern u1="W" u2="&#xc6;" k="96" />
+<hkern u1="W" u2="&#x7d;" k="-57" />
+<hkern u1="W" u2="x" k="14" />
+<hkern u1="W" u2="w" k="18" />
+<hkern u1="W" u2="v" k="18" />
+<hkern u1="W" u2="t" k="27" />
+<hkern u1="W" u2="g" k="82" />
+<hkern u1="W" u2="f" k="18" />
+<hkern u1="W" u2="]" k="-53" />
+<hkern u1="W" u2="M" k="35" />
+<hkern u1="W" u2="&#x40;" k="68" />
+<hkern u1="W" u2="&#x36;" k="31" />
+<hkern u1="W" u2="&#x34;" k="47" />
+<hkern u1="W" u2="&#x2f;" k="84" />
+<hkern u1="W" u2="&#x2c;" k="63" />
+<hkern u1="W" u2="&#x2a;" k="-35" />
+<hkern u1="W" u2="&#x26;" k="18" />
+<hkern u1="X" u2="&#x2122;" k="-49" />
+<hkern u1="X" u2="&#xf0;" k="35" />
+<hkern u1="X" u2="&#xef;" k="-78" />
+<hkern u1="X" u2="&#xee;" k="-47" />
+<hkern u1="X" u2="&#xec;" k="-14" />
+<hkern u1="X" u2="&#xdf;" k="27" />
+<hkern u1="X" u2="&#xae;" k="37" />
+<hkern u1="X" u2="&#x7d;" k="-63" />
+<hkern u1="X" u2="w" k="88" />
+<hkern u1="X" u2="v" k="100" />
+<hkern u1="X" u2="t" k="57" />
+<hkern u1="X" u2="g" k="37" />
+<hkern u1="X" u2="f" k="23" />
+<hkern u1="X" u2="]" k="-63" />
+<hkern u1="X" u2="&#x26;" k="20" />
+<hkern u1="Y" u2="&#xfe;" k="63" />
+<hkern u1="Y" u2="&#xf0;" k="82" />
+<hkern u1="Y" u2="&#xef;" k="-96" />
+<hkern u1="Y" u2="&#xee;" k="-78" />
+<hkern u1="Y" u2="&#xec;" k="-33" />
+<hkern u1="Y" u2="&#xdf;" k="53" />
+<hkern u1="Y" u2="&#x40;" k="119" />
+<hkern u1="Y" u2="&#x38;" k="20" />
+<hkern u1="Y" u2="&#x36;" k="78" />
+<hkern u1="Y" u2="&#x34;" k="102" />
+<hkern u1="Y" u2="&#x30;" k="47" />
+<hkern u1="Z" u2="&#xf0;" k="43" />
+<hkern u1="Z" u2="&#xef;" k="-76" />
+<hkern u1="Z" u2="&#xee;" k="-59" />
+<hkern u1="Z" u2="&#xec;" k="-12" />
+<hkern u1="Z" u2="&#xdf;" k="35" />
+<hkern u1="Z" u2="&#x36;" k="18" />
+<hkern u1="Z" u2="&#x34;" k="117" />
+<hkern u1="Z" u2="&#x30;" k="27" />
+<hkern u1="[" u2="&#xfe;" k="8" />
+<hkern u1="[" u2="&#xf0;" k="51" />
+<hkern u1="[" u2="&#xef;" k="-92" />
+<hkern u1="[" u2="&#xee;" k="-70" />
+<hkern u1="[" u2="&#xec;" k="-31" />
+<hkern u1="[" u2="&#xe3;" k="57" />
+<hkern u1="[" u2="&#xdf;" k="25" />
+<hkern u1="[" u2="&#xc6;" k="27" />
+<hkern u1="[" u2="z" k="76" />
+<hkern u1="[" u2="x" k="61" />
+<hkern u1="[" u2="w" k="78" />
+<hkern u1="[" u2="v" k="82" />
+<hkern u1="[" u2="t" k="66" />
+<hkern u1="[" u2="s" k="78" />
+<hkern u1="[" u2="p" k="68" />
+<hkern u1="[" u2="j" k="-14" />
+<hkern u1="[" u2="X" k="-57" />
+<hkern u1="[" u2="W" k="-55" />
+<hkern u1="[" u2="V" k="-63" />
+<hkern u1="[" u2="T" k="-45" />
+<hkern u1="[" u2="M" k="25" />
+<hkern u1="[" u2="J" k="-100" />
+<hkern u1="[" u2="&#x38;" k="16" />
+<hkern u1="[" u2="&#x36;" k="55" />
+<hkern u1="[" u2="&#x34;" k="57" />
+<hkern u1="[" u2="&#x30;" k="49" />
+<hkern u1="\" u2="&#x2019;" k="86" />
+<hkern u1="\" u2="w" k="51" />
+<hkern u1="\" u2="v" k="70" />
+<hkern u1="\" u2="t" k="33" />
+<hkern u1="\" u2="W" k="82" />
+<hkern u1="\" u2="V" k="113" />
+<hkern u1="\" u2="T" k="104" />
+<hkern u1="\" u2="J" k="-33" />
+<hkern u1="\" u2="&#x39;" k="29" />
+<hkern u1="\" u2="&#x31;" k="31" />
+<hkern u1="\" u2="&#x30;" k="25" />
+<hkern u1="a" u2="&#xdf;" k="14" />
+<hkern u1="a" u2="Y" k="186" />
+<hkern u1="a" u2="W" k="94" />
+<hkern u1="a" u2="V" k="129" />
+<hkern u1="a" u2="U" k="59" />
+<hkern u1="a" u2="T" k="170" />
+<hkern u1="a" u2="S" k="12" />
+<hkern u1="a" u2="M" k="16" />
+<hkern u1="a" u2="J" k="33" />
+<hkern u1="a" u2="E" k="33" />
+<hkern u1="a" u2="&#x39;" k="18" />
+<hkern u1="a" u2="&#x31;" k="45" />
+<hkern u1="b" u2="&#xdf;" k="16" />
+<hkern u1="b" u2="Z" k="59" />
+<hkern u1="b" u2="Y" k="182" />
+<hkern u1="b" u2="X" k="80" />
+<hkern u1="b" u2="W" k="90" />
+<hkern u1="b" u2="V" k="129" />
+<hkern u1="b" u2="U" k="37" />
+<hkern u1="b" u2="T" k="174" />
+<hkern u1="b" u2="S" k="39" />
+<hkern u1="b" u2="M" k="35" />
+<hkern u1="b" u2="J" k="39" />
+<hkern u1="b" u2="E" k="39" />
+<hkern u1="b" u2="&#x37;" k="61" />
+<hkern u1="b" u2="&#x32;" k="49" />
+<hkern u1="b" u2="&#x31;" k="43" />
+<hkern u1="c" u2="&#xf0;" k="10" />
+<hkern u1="c" u2="Y" k="78" />
+<hkern u1="c" u2="W" k="31" />
+<hkern u1="c" u2="V" k="41" />
+<hkern u1="c" u2="U" k="27" />
+<hkern u1="c" u2="T" k="135" />
+<hkern u1="c" u2="S" k="25" />
+<hkern u1="c" u2="M" k="10" />
+<hkern u1="c" u2="J" k="18" />
+<hkern u1="c" u2="E" k="18" />
+<hkern u1="c" u2="&#x37;" k="23" />
+<hkern u1="c" u2="&#x34;" k="51" />
+<hkern u1="d" u2="Z" k="23" />
+<hkern u1="d" u2="Y" k="10" />
+<hkern u1="d" u2="W" k="16" />
+<hkern u1="d" u2="V" k="12" />
+<hkern u1="d" u2="U" k="33" />
+<hkern u1="d" u2="T" k="23" />
+<hkern u1="d" u2="S" k="20" />
+<hkern u1="d" u2="M" k="33" />
+<hkern u1="d" u2="J" k="29" />
+<hkern u1="d" u2="E" k="29" />
+<hkern u1="d" u2="&#x26;" k="25" />
+<hkern u1="e" u2="Z" k="27" />
+<hkern u1="e" u2="Y" k="168" />
+<hkern u1="e" u2="X" k="27" />
+<hkern u1="e" u2="W" k="88" />
+<hkern u1="e" u2="V" k="96" />
+<hkern u1="e" u2="U" k="33" />
+<hkern u1="e" u2="T" k="141" />
+<hkern u1="e" u2="S" k="31" />
+<hkern u1="e" u2="M" k="27" />
+<hkern u1="e" u2="J" k="31" />
+<hkern u1="e" u2="E" k="31" />
+<hkern u1="e" u2="&#x37;" k="53" />
+<hkern u1="e" u2="&#x32;" k="23" />
+<hkern u1="e" u2="&#x31;" k="43" />
+<hkern u1="f" u2="&#xf0;" k="66" />
+<hkern u1="f" u2="&#x7d;" k="-16" />
+<hkern u1="f" u2="g" k="8" />
+<hkern u1="f" u2="Z" k="27" />
+<hkern u1="f" u2="U" k="18" />
+<hkern u1="f" u2="M" k="55" />
+<hkern u1="f" u2="J" k="25" />
+<hkern u1="f" u2="E" k="25" />
+<hkern u1="f" u2="&#x40;" k="35" />
+<hkern u1="f" u2="&#x34;" k="25" />
+<hkern u1="f" u2="&#x2f;" k="45" />
+<hkern u1="f" u2="&#x2c;" k="55" />
+<hkern u1="f" u2="&#x26;" k="43" />
+<hkern u1="g" u2="&#xf0;" k="12" />
+<hkern u1="g" u2="&#x7d;" k="-59" />
+<hkern u1="g" u2="j" k="-39" />
+<hkern u1="g" u2="]" k="-51" />
+<hkern u1="g" u2="Z" k="23" />
+<hkern u1="g" u2="Y" k="37" />
+<hkern u1="g" u2="X" k="12" />
+<hkern u1="g" u2="W" k="12" />
+<hkern u1="g" u2="V" k="18" />
+<hkern u1="g" u2="U" k="20" />
+<hkern u1="g" u2="T" k="98" />
+<hkern u1="g" u2="M" k="29" />
+<hkern u1="g" u2="J" k="-92" />
+<hkern u1="g" u2="E" k="23" />
+<hkern u1="g" u2="&#x3f;" k="80" />
+<hkern u1="g" u2="&#x37;" k="63" />
+<hkern u1="g" u2="&#x2f;" k="-29" />
+<hkern u1="g" u2="&#x29;" k="-10" />
+<hkern u1="g" u2="&#x26;" k="25" />
+<hkern u1="k" u2="&#xf0;" k="53" />
+<hkern u1="k" u2="g" k="37" />
+<hkern u1="k" u2="]" k="35" />
+<hkern u1="k" u2="Y" k="80" />
+<hkern u1="k" u2="W" k="10" />
+<hkern u1="k" u2="V" k="23" />
+<hkern u1="k" u2="U" k="10" />
+<hkern u1="k" u2="T" k="184" />
+<hkern u1="k" u2="&#x3f;" k="39" />
+<hkern u1="k" u2="&#x26;" k="29" />
+<hkern u1="l" u2="w" k="10" />
+<hkern u1="l" u2="v" k="14" />
+<hkern u1="l" u2="t" k="10" />
+<hkern u1="l" u2="Y" k="31" />
+<hkern u1="l" u2="W" k="39" />
+<hkern u1="l" u2="V" k="35" />
+<hkern u1="l" u2="U" k="57" />
+<hkern u1="l" u2="T" k="45" />
+<hkern u1="l" u2="M" k="16" />
+<hkern u1="l" u2="J" k="33" />
+<hkern u1="l" u2="E" k="33" />
+<hkern u1="l" u2="&#x2a;" k="20" />
+<hkern u1="l" u2="&#x26;" k="25" />
+<hkern u1="r" u2="&#xf0;" k="78" />
+<hkern u1="r" u2="&#x7d;" k="57" />
+<hkern u1="r" u2="g" k="12" />
+<hkern u1="r" u2="]" k="80" />
+<hkern u1="r" u2="Z" k="59" />
+<hkern u1="r" u2="Y" k="63" />
+<hkern u1="r" u2="X" k="86" />
+<hkern u1="r" u2="W" k="18" />
+<hkern u1="r" u2="V" k="27" />
+<hkern u1="r" u2="U" k="18" />
+<hkern u1="r" u2="T" k="190" />
+<hkern u1="r" u2="M" k="53" />
+<hkern u1="r" u2="J" k="27" />
+<hkern u1="r" u2="E" k="27" />
+<hkern u1="r" u2="&#x40;" k="49" />
+<hkern u1="r" u2="&#x3f;" k="111" />
+<hkern u1="r" u2="&#x37;" k="115" />
+<hkern u1="r" u2="&#x34;" k="37" />
+<hkern u1="r" u2="&#x33;" k="51" />
+<hkern u1="r" u2="&#x2f;" k="63" />
+<hkern u1="r" u2="&#x2c;" k="59" />
+<hkern u1="r" u2="&#x29;" k="49" />
+<hkern u1="r" u2="&#x26;" k="39" />
+<hkern u1="s" u2="Z" k="23" />
+<hkern u1="s" u2="Y" k="96" />
+<hkern u1="s" u2="X" k="25" />
+<hkern u1="s" u2="W" k="66" />
+<hkern u1="s" u2="V" k="82" />
+<hkern u1="s" u2="U" k="37" />
+<hkern u1="s" u2="T" k="111" />
+<hkern u1="s" u2="S" k="16" />
+<hkern u1="s" u2="M" k="23" />
+<hkern u1="s" u2="J" k="31" />
+<hkern u1="s" u2="E" k="31" />
+<hkern u1="s" u2="&#x37;" k="45" />
+<hkern u1="t" u2="&#xf0;" k="10" />
+<hkern u1="t" u2="&#x7d;" k="29" />
+<hkern u1="t" u2="]" k="53" />
+<hkern u1="t" u2="Y" k="92" />
+<hkern u1="t" u2="W" k="27" />
+<hkern u1="t" u2="V" k="39" />
+<hkern u1="t" u2="U" k="20" />
+<hkern u1="t" u2="T" k="96" />
+<hkern u1="t" u2="M" k="16" />
+<hkern u1="t" u2="J" k="16" />
+<hkern u1="t" u2="E" k="16" />
+<hkern u1="t" u2="&#x3f;" k="55" />
+<hkern u1="t" u2="&#x37;" k="20" />
+<hkern u1="t" u2="&#x34;" k="45" />
+<hkern u1="t" u2="&#x26;" k="20" />
+<hkern u1="v" u2="&#xf0;" k="37" />
+<hkern u1="v" u2="&#x7d;" k="59" />
+<hkern u1="v" u2="g" k="12" />
+<hkern u1="v" u2="]" k="86" />
+<hkern u1="v" u2="Z" k="66" />
+<hkern u1="v" u2="Y" k="94" />
+<hkern u1="v" u2="X" k="98" />
+<hkern u1="v" u2="W" k="29" />
+<hkern u1="v" u2="V" k="39" />
+<hkern u1="v" u2="U" k="23" />
+<hkern u1="v" u2="T" k="176" />
+<hkern u1="v" u2="M" k="55" />
+<hkern u1="v" u2="J" k="29" />
+<hkern u1="v" u2="E" k="29" />
+<hkern u1="v" u2="&#x40;" k="33" />
+<hkern u1="v" u2="&#x3f;" k="102" />
+<hkern u1="v" u2="&#x37;" k="115" />
+<hkern u1="v" u2="&#x33;" k="51" />
+<hkern u1="v" u2="&#x2f;" k="68" />
+<hkern u1="v" u2="&#x2c;" k="59" />
+<hkern u1="v" u2="&#x29;" k="51" />
+<hkern u1="v" u2="&#x26;" k="37" />
+<hkern u1="w" u2="&#xf0;" k="20" />
+<hkern u1="w" u2="&#x7d;" k="55" />
+<hkern u1="w" u2="]" k="78" />
+<hkern u1="w" u2="Z" k="57" />
+<hkern u1="w" u2="Y" k="92" />
+<hkern u1="w" u2="X" k="88" />
+<hkern u1="w" u2="W" k="29" />
+<hkern u1="w" u2="V" k="41" />
+<hkern u1="w" u2="U" k="20" />
+<hkern u1="w" u2="T" k="160" />
+<hkern u1="w" u2="M" k="49" />
+<hkern u1="w" u2="J" k="27" />
+<hkern u1="w" u2="E" k="27" />
+<hkern u1="w" u2="&#x40;" k="18" />
+<hkern u1="w" u2="&#x3f;" k="92" />
+<hkern u1="w" u2="&#x37;" k="100" />
+<hkern u1="w" u2="&#x33;" k="33" />
+<hkern u1="w" u2="&#x2f;" k="51" />
+<hkern u1="w" u2="&#x2c;" k="43" />
+<hkern u1="w" u2="&#x29;" k="49" />
+<hkern u1="w" u2="&#x26;" k="33" />
+<hkern u1="x" u2="&#x2122;" k="16" />
+<hkern u1="x" u2="&#xf0;" k="33" />
+<hkern u1="x" u2="&#x7d;" k="39" />
+<hkern u1="x" u2="g" k="18" />
+<hkern u1="x" u2="]" k="53" />
+<hkern u1="x" u2="\" k="18" />
+<hkern u1="x" u2="Y" k="98" />
+<hkern u1="x" u2="W" k="29" />
+<hkern u1="x" u2="V" k="41" />
+<hkern u1="x" u2="U" k="25" />
+<hkern u1="x" u2="T" k="182" />
+<hkern u1="x" u2="S" k="16" />
+<hkern u1="x" u2="M" k="12" />
+<hkern u1="x" u2="J" k="18" />
+<hkern u1="x" u2="E" k="18" />
+<hkern u1="x" u2="&#x3f;" k="59" />
+<hkern u1="x" u2="&#x26;" k="37" />
+<hkern u1="y" u2="&#xf0;" k="41" />
+<hkern u1="y" u2="Z" k="63" />
+<hkern u1="y" u2="Y" k="92" />
+<hkern u1="y" u2="X" k="98" />
+<hkern u1="y" u2="W" k="29" />
+<hkern u1="y" u2="V" k="37" />
+<hkern u1="y" u2="U" k="23" />
+<hkern u1="y" u2="T" k="180" />
+<hkern u1="y" u2="M" k="55" />
+<hkern u1="y" u2="J" k="27" />
+<hkern u1="y" u2="E" k="27" />
+<hkern u1="y" u2="&#x40;" k="37" />
+<hkern u1="y" u2="&#x37;" k="119" />
+<hkern u1="y" u2="&#x33;" k="53" />
+<hkern u1="y" u2="&#x32;" k="59" />
+<hkern u1="z" u2="&#xf0;" k="18" />
+<hkern u1="z" u2="Y" k="59" />
+<hkern u1="z" u2="W" k="27" />
+<hkern u1="z" u2="V" k="33" />
+<hkern u1="z" u2="U" k="35" />
+<hkern u1="z" u2="T" k="109" />
+<hkern u1="z" u2="M" k="23" />
+<hkern u1="z" u2="J" k="29" />
+<hkern u1="z" u2="E" k="29" />
+<hkern u1="z" u2="&#x37;" k="25" />
+<hkern u1="z" u2="&#x34;" k="63" />
+<hkern u1="&#x7b;" u2="&#xfe;" k="14" />
+<hkern u1="&#x7b;" u2="&#xf0;" k="45" />
+<hkern u1="&#x7b;" u2="&#xef;" k="-90" />
+<hkern u1="&#x7b;" u2="&#xee;" k="-68" />
+<hkern u1="&#x7b;" u2="&#xec;" k="-25" />
+<hkern u1="&#x7b;" u2="&#xdf;" k="18" />
+<hkern u1="&#x7b;" u2="x" k="37" />
+<hkern u1="&#x7b;" u2="w" k="57" />
+<hkern u1="&#x7b;" u2="v" k="59" />
+<hkern u1="&#x7b;" u2="t" k="51" />
+<hkern u1="&#x7b;" u2="X" k="-57" />
+<hkern u1="&#x7b;" u2="W" k="-51" />
+<hkern u1="&#x7b;" u2="V" k="-59" />
+<hkern u1="&#x7b;" u2="T" k="-43" />
+<hkern u1="&#x7b;" u2="M" k="18" />
+<hkern u1="&#x7b;" u2="J" k="-96" />
+<hkern u1="&#x7b;" u2="&#x36;" k="43" />
+<hkern u1="&#x7b;" u2="&#x34;" k="37" />
+<hkern u1="&#x7b;" u2="&#x30;" k="37" />
+<hkern u1="&#xa1;" u2="W" k="25" />
+<hkern u1="&#xa1;" u2="V" k="41" />
+<hkern u1="&#xa1;" u2="T" k="115" />
+<hkern u1="&#xae;" u2="&#xc6;" k="41" />
+<hkern u1="&#xae;" u2="X" k="41" />
+<hkern u1="&#xae;" u2="W" k="16" />
+<hkern u1="&#xae;" u2="V" k="27" />
+<hkern u1="&#xae;" u2="T" k="53" />
+<hkern u1="&#xae;" u2="M" k="18" />
+<hkern u1="&#xb0;" u2="&#x36;" k="35" />
+<hkern u1="&#xb0;" u2="&#x34;" k="55" />
+<hkern u1="&#xb7;" u2="&#x37;" k="43" />
+<hkern u1="&#xb7;" u2="&#x33;" k="20" />
+<hkern u1="&#xb7;" u2="&#x32;" k="35" />
+<hkern u1="&#xb7;" u2="&#x31;" k="33" />
+<hkern u1="&#xbf;" u2="&#xf0;" k="33" />
+<hkern u1="&#xbf;" u2="&#xc6;" k="43" />
+<hkern u1="&#xbf;" u2="x" k="16" />
+<hkern u1="&#xbf;" u2="l" k="18" />
+<hkern u1="&#xbf;" u2="j" k="-41" />
+<hkern u1="&#xbf;" u2="g" k="27" />
+<hkern u1="&#xbf;" u2="X" k="51" />
+<hkern u1="&#xbf;" u2="W" k="31" />
+<hkern u1="&#xbf;" u2="V" k="47" />
+<hkern u1="&#xbf;" u2="T" k="131" />
+<hkern u1="&#xbf;" u2="M" k="37" />
+<hkern u1="&#xbf;" u2="J" k="-39" />
+<hkern u1="&#xde;" u2="&#xc6;" k="113" />
+<hkern u1="&#xde;" u2="&#x7d;" k="61" />
+<hkern u1="&#xde;" u2="x" k="12" />
+<hkern u1="&#xde;" u2="a" k="18" />
+<hkern u1="&#xde;" u2="]" k="86" />
+<hkern u1="&#xde;" u2="\" k="18" />
+<hkern u1="&#xde;" u2="X" k="104" />
+<hkern u1="&#xde;" u2="V" k="16" />
+<hkern u1="&#xde;" u2="T" k="111" />
+<hkern u1="&#xde;" u2="M" k="10" />
+<hkern u1="&#xde;" u2="&#x3f;" k="68" />
+<hkern u1="&#xde;" u2="&#x2f;" k="72" />
+<hkern u1="&#xde;" u2="&#x2c;" k="162" />
+<hkern u1="&#xde;" u2="&#x29;" k="57" />
+<hkern u1="&#xdf;" u2="&#x2122;" k="29" />
+<hkern u1="&#xdf;" u2="y" k="23" />
+<hkern u1="&#xdf;" u2="x" k="10" />
+<hkern u1="&#xdf;" u2="w" k="16" />
+<hkern u1="&#xdf;" u2="v" k="23" />
+<hkern u1="&#xdf;" u2="t" k="18" />
+<hkern u1="&#xdf;" u2="f" k="12" />
+<hkern u1="&#xdf;" u2="&#x2a;" k="31" />
+<hkern u1="&#xdf;" u2="&#x29;" k="35" />
+<hkern u1="&#xe2;" u2="&#x7d;" k="16" />
+<hkern u1="&#xe2;" u2="]" k="20" />
+<hkern u1="&#xe3;" u2="&#x201d;" k="125" />
+<hkern u1="&#xe3;" u2="&#x2019;" k="125" />
+<hkern u1="&#xe3;" u2="&#x7d;" k="16" />
+<hkern u1="&#xe3;" u2="\" k="74" />
+<hkern u1="&#xe4;" u2="&#x7d;" k="16" />
+<hkern u1="&#xe4;" u2="]" k="23" />
+<hkern u1="&#xec;" u2="&#x2122;" k="-57" />
+<hkern u1="&#xec;" u2="&#x2a;" k="-61" />
+<hkern u1="&#xed;" u2="&#x2122;" k="-37" />
+<hkern u1="&#xed;" u2="&#x7d;" k="-29" />
+<hkern u1="&#xed;" u2="]" k="-18" />
+<hkern u1="&#xed;" u2="&#x2a;" k="-37" />
+<hkern u1="&#xee;" u2="&#x2122;" k="-166" />
+<hkern u1="&#xee;" u2="&#x201d;" k="-49" />
+<hkern u1="&#xee;" u2="&#x201c;" k="-76" />
+<hkern u1="&#xee;" u2="&#x2019;" k="-49" />
+<hkern u1="&#xee;" u2="&#x2018;" k="-76" />
+<hkern u1="&#xee;" u2="&#x7d;" k="-68" />
+<hkern u1="&#xee;" u2="]" k="-90" />
+<hkern u1="&#xee;" u2="\" k="-27" />
+<hkern u1="&#xee;" u2="&#x3f;" k="-80" />
+<hkern u1="&#xee;" u2="&#x2a;" k="-156" />
+<hkern u1="&#xee;" u2="&#x27;" k="-59" />
+<hkern u1="&#xee;" u2="&#x22;" k="-59" />
+<hkern u1="&#xef;" u2="&#x2122;" k="-98" />
+<hkern u1="&#xef;" u2="&#x7d;" k="-90" />
+<hkern u1="&#xef;" u2="]" k="-80" />
+<hkern u1="&#xef;" u2="\" k="-29" />
+<hkern u1="&#xef;" u2="&#x3f;" k="-55" />
+<hkern u1="&#xef;" u2="&#x2a;" k="-88" />
+<hkern u1="&#xf0;" u2="&#x2122;" k="31" />
+<hkern u1="&#xf0;" u2="&#x7d;" k="27" />
+<hkern u1="&#xf0;" u2="x" k="16" />
+<hkern u1="&#xf0;" u2="]" k="33" />
+<hkern u1="&#xf0;" u2="\" k="20" />
+<hkern u1="&#xf0;" u2="&#x3f;" k="29" />
+<hkern u1="&#xf0;" u2="&#x2c;" k="18" />
+<hkern u1="&#xf0;" u2="&#x2a;" k="33" />
+<hkern u1="&#xf0;" u2="&#x29;" k="49" />
+<hkern u1="&#xf0;" u2="&#x26;" k="18" />
+<hkern u1="&#x2018;" u2="&#xee;" k="-76" />
+<hkern u1="&#x2019;" u2="&#x2122;" k="-18" />
+<hkern u1="&#x2019;" u2="&#xfe;" k="66" />
+<hkern u1="&#x2019;" u2="&#xef;" k="-57" />
+<hkern u1="&#x2019;" u2="&#xee;" k="-90" />
+<hkern u1="&#x2019;" u2="&#xea;" k="168" />
+<hkern u1="&#x2019;" u2="&#xe2;" k="141" />
+<hkern u1="&#x2019;" u2="&#xae;" k="23" />
+<hkern u1="&#x2019;" u2="&#x40;" k="94" />
+<hkern u1="&#x2019;" u2="&#x2f;" k="96" />
+<hkern u1="&#x2019;" u2="&#x2a;" k="-10" />
+<hkern u1="&#x2019;" u2="&#x26;" k="35" />
+<hkern u1="&#x201c;" u2="&#xee;" k="-76" />
+<hkern u1="&#x201d;" u2="&#xfe;" k="66" />
+<hkern u1="&#x201d;" u2="&#xef;" k="-57" />
+<hkern u1="&#x201d;" u2="&#xee;" k="-90" />
+<hkern u1="&#x201d;" u2="&#xea;" k="168" />
+<hkern u1="&#x201d;" u2="&#xe2;" k="141" />
+<hkern u1="&#x203a;" u2="&#xd0;" k="-12" />
+<hkern u1="&#x2122;" u2="&#xee;" k="-23" />
+<hkern u1="&#x2122;" u2="&#xd0;" k="-20" />
+<hkern u1="&#x2122;" u2="&#xc6;" k="57" />
+<hkern g1="asterisk" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	k="90" />
+<hkern g1="asterisk" 	g2="Y,Yacute,Ydieresis" 	k="-29" />
+<hkern g1="asterisk" 	g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring,ae" 	k="39" />
+<hkern g1="asterisk" 	g2="m,n,p,r,ntilde,thorn" 	k="25" />
+<hkern g1="asterisk" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="45" />
+<hkern g1="asterisk" 	g2="s" 	k="33" />
+<hkern g1="asterisk" 	g2="u,ugrave,uacute,ucircumflex,udieresis" 	k="20" />
+<hkern g1="at" 	g2="quotedbl,quotesingle" 	k="18" />
+<hkern g1="backslash" 	g2="Y,Yacute,Ydieresis" 	k="113" />
+<hkern g1="backslash" 	g2="quotedbl,quotesingle" 	k="74" />
+<hkern g1="backslash" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="41" />
+<hkern g1="backslash" 	g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" 	k="45" />
+<hkern g1="backslash" 	g2="y,yacute,ydieresis" 	k="76" />
+<hkern g1="braceleft" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	k="25" />
+<hkern g1="braceleft" 	g2="Y,Yacute,Ydieresis" 	k="-70" />
+<hkern g1="braceleft" 	g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring,ae" 	k="55" />
+<hkern g1="braceleft" 	g2="m,n,p,r,ntilde,thorn" 	k="59" />
+<hkern g1="braceleft" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="70" />
+<hkern g1="braceleft" 	g2="s" 	k="55" />
+<hkern g1="braceleft" 	g2="u,ugrave,uacute,ucircumflex,udieresis" 	k="63" />
+<hkern g1="braceleft" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="51" />
+<hkern g1="braceleft" 	g2="y,yacute,ydieresis" 	k="59" />
+<hkern g1="braceleft" 	g2="z" 	k="49" />
+<hkern g1="bracketleft" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	k="59" />
+<hkern g1="bracketleft" 	g2="Y,Yacute,Ydieresis" 	k="-74" />
+<hkern g1="bracketleft" 	g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring,ae" 	k="78" />
+<hkern g1="bracketleft" 	g2="m,n,p,r,ntilde,thorn" 	k="86" />
+<hkern g1="bracketleft" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="88" />
+<hkern g1="bracketleft" 	g2="u,ugrave,uacute,ucircumflex,udieresis" 	k="84" />
+<hkern g1="bracketleft" 	g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" 	k="61" />
+<hkern g1="bracketleft" 	g2="y,yacute,ydieresis" 	k="82" />
+<hkern g1="exclamdown" 	g2="Y,Yacute,Ydieresis" 	k="66" />
+<hkern g1="four" 	g2="quotedbl,quotesingle" 	k="25" />
+<hkern g1="guillemotleft,guilsinglleft" 	g2="Y,Yacute,Ydieresis" 	k="61" />
+<hkern g1="guillemotleft,guilsinglleft" 	g2="c,d,e,o,q,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" 	k="18" />
+<hkern g1="guillemotleft,guilsinglleft" 	g2="T" 	k="121" />
+<hkern g1="guillemotleft,guilsinglleft" 	g2="V" 	k="23" />
+<hkern g1="guillemotleft,guilsinglleft" 	g2="quoteright,quotedblright" 	k="55" />
+<hkern g1="guillemotright,guilsinglright" 	g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" 	k="18" />
+<hkern g1="guillemotright,guilsinglright" 	g2="Y,Yacute,Ydieresis" 	k="119" />
+<hkern g1="guillemotright

<TRUNCATED>
http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/css/fonts/Cabin-Regular-webfont.ttf
----------------------------------------------------------------------
diff --git a/falcon-ui/app/css/fonts/Cabin-Regular-webfont.ttf b/falcon-ui/app/css/fonts/Cabin-Regular-webfont.ttf
new file mode 100644
index 0000000..489f5c1
Binary files /dev/null and b/falcon-ui/app/css/fonts/Cabin-Regular-webfont.ttf differ