diff --git a/apps/pom.xml b/apps/pom.xml
index 7e211a2..b130de6 100644
--- a/apps/pom.xml
+++ b/apps/pom.xml
@@ -5,7 +5,7 @@
   <parent>
     <groupId>com.datatorrent</groupId>
     <artifactId>malhar-all</artifactId>
-    <version>1.0.2-SNAPSHOT</version>
+    <version>1.0.2</version>
   </parent>
 
   <artifactId>malhar-apps</artifactId>
@@ -20,12 +20,6 @@
   <dependencies>
     <dependency>
       <groupId>${project.groupId}</groupId>
-      <artifactId>dt-engine</artifactId>
-      <version>${dt.framework.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
       <artifactId>malhar-library</artifactId>
       <version>${project.version}</version>
       <type>jar</type>
diff --git a/benchmark/pom.xml b/benchmark/pom.xml
index 95c4d3d..292bf53 100644
--- a/benchmark/pom.xml
+++ b/benchmark/pom.xml
@@ -5,7 +5,7 @@
   <parent>
     <groupId>com.datatorrent</groupId>
     <artifactId>malhar-all</artifactId>
-    <version>1.0.2-SNAPSHOT</version>
+    <version>1.0.2</version>
   </parent>
 
   <artifactId>malhar-benchmark</artifactId>
@@ -20,12 +20,6 @@
   <dependencies>
     <dependency>
       <groupId>${project.groupId}</groupId>
-      <artifactId>dt-engine</artifactId>
-      <version>${dt.framework.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
       <artifactId>malhar-library</artifactId>
       <version>${project.version}</version>
       <type>jar</type>
diff --git a/benchmark/src/main/java/com/datatorrent/benchmark/UniqueValueCountBenchmarkApplication.java b/benchmark/src/main/java/com/datatorrent/benchmark/UniqueValueCountBenchmarkApplication.java
index 2212b84..c341073 100644
--- a/benchmark/src/main/java/com/datatorrent/benchmark/UniqueValueCountBenchmarkApplication.java
+++ b/benchmark/src/main/java/com/datatorrent/benchmark/UniqueValueCountBenchmarkApplication.java
@@ -31,6 +31,8 @@
  * PartitionableUniqueCount operator initially partitioned into three partitions to
  * test unifier functionality, and output of the operator is sent to verifier to verify
  * that it generates correct result.
+ *
+ * @since 1.0.2
  */
 @ApplicationAnnotation(name="UniqueCountBenchmark")
 public class UniqueValueCountBenchmarkApplication implements StreamingApplication
diff --git a/contrib/pom.xml b/contrib/pom.xml
index 0486bea..dd31d90 100644
--- a/contrib/pom.xml
+++ b/contrib/pom.xml
@@ -5,7 +5,7 @@
   <parent>
     <groupId>com.datatorrent</groupId>
     <artifactId>malhar-all</artifactId>
-    <version>1.0.2-SNAPSHOT</version>
+    <version>1.0.2</version>
   </parent>
 
   <artifactId>malhar-contrib</artifactId>
@@ -53,38 +53,6 @@
   <dependencies>
     <dependency>
       <groupId>${project.groupId}</groupId>
-      <artifactId>dt-engine</artifactId>
-      <version>${dt.framework.version}</version>
-      <scope>runtime</scope>
-      <exclusions>
-        <exclusion>
-          <artifactId>jackson-core-asl</artifactId>
-          <groupId>org.codehaus.jackson</groupId>
-        </exclusion>
-        <exclusion>
-          <artifactId>jackson-jaxrs</artifactId>
-          <groupId>org.codehaus.jackson</groupId>
-        </exclusion>
-        <exclusion>
-          <artifactId>jackson-mapper-asl</artifactId>
-          <groupId>org.codehaus.jackson</groupId>
-        </exclusion>
-        <exclusion>
-          <artifactId>jackson-xc</artifactId>
-          <groupId>org.codehaus.jackson</groupId>
-        </exclusion>
-        <exclusion>
-          <artifactId>jetty</artifactId>
-          <groupId>org.mortbay.jetty</groupId>
-        </exclusion>
-        <exclusion>
-          <artifactId>jetty-util</artifactId>
-          <groupId>org.mortbay.jetty</groupId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
       <artifactId>malhar-library</artifactId>
       <version>${project.version}</version>
       <scope>test</scope>
@@ -212,8 +180,8 @@
     </dependency>
     <dependency>
       <groupId>org.apache.hbase</groupId>
-      <artifactId>hbase</artifactId>
-      <version>0.94.5</version>
+      <artifactId>hbase-client</artifactId>
+      <version>0.98.2-hadoop2</version>
       <type>jar</type>
       <optional>true</optional>
       <exclusions>
@@ -252,6 +220,48 @@
       </exclusions>
     </dependency>
     <dependency>
+      <groupId>org.apache.hbase</groupId>
+      <artifactId>hbase-server</artifactId>
+      <version>0.98.2-hadoop2</version>
+      <type>jar</type>
+      <optional>true</optional>
+      <exclusions>
+        <exclusion>
+          <groupId>org.slf4j</groupId>
+          <artifactId>slf4j-log4j12</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.apache.zookeeper</groupId>
+          <artifactId>zookeeper</artifactId>
+        </exclusion>
+        <exclusion>
+          <artifactId>jackson-core-asl</artifactId>
+          <groupId>org.codehaus.jackson</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>jackson-jaxrs</artifactId>
+          <groupId>org.codehaus.jackson</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>jackson-mapper-asl</artifactId>
+          <groupId>org.codehaus.jackson</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>jackson-xc</artifactId>
+          <groupId>org.codehaus.jackson</groupId>
+        </exclusion>
+        <!-- Needed for running local server for tests -->
+        <!--exclusion>
+          <artifactId>jetty</artifactId>
+          <groupId>org.mortbay.jetty</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>jetty-util</artifactId>
+          <groupId>org.mortbay.jetty</groupId>
+        </exclusion-->
+      </exclusions>
+    </dependency>
+    <dependency>
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-compress</artifactId>
       <version>1.5</version>
@@ -333,7 +343,7 @@
       <optional>true</optional>
     </dependency>
     <dependency>
-      <!-- required by twitter -->
+      <!-- required by twitter  -->
       <groupId>org.twitter4j</groupId>
       <artifactId>twitter4j-stream</artifactId>
       <version>2.2.6</version>
@@ -350,5 +360,11 @@
       <version>2.0.2</version>
       <optional>true</optional>
     </dependency>
+    <dependency>
+      <groupId>net.sf.supercsv</groupId>
+      <artifactId>super-csv</artifactId>
+      <version>2.2.0</version>
+      <optional>true</optional>
+    </dependency>
   </dependencies>
 </project>
diff --git a/contrib/src/main/java/com/datatorrent/contrib/cassandra/AbstractCassandraInputOperator.java b/contrib/src/main/java/com/datatorrent/contrib/cassandra/AbstractCassandraInputOperator.java
index 45085bf..3876446 100644
--- a/contrib/src/main/java/com/datatorrent/contrib/cassandra/AbstractCassandraInputOperator.java
+++ b/contrib/src/main/java/com/datatorrent/contrib/cassandra/AbstractCassandraInputOperator.java
@@ -34,6 +34,8 @@
  * <p>
  * This is an abstract class. Sub-classes need to implement {@link #queryToRetrieveData()} and {@link #getTuple(Row)}.
  * </p>
+ *
+ * @since 1.0.2
  */
 @ShipContainingJars(classes = {com.datastax.driver.core.Cluster.class})
 
diff --git a/contrib/src/main/java/com/datatorrent/contrib/cassandra/AbstractCassandraTransactionableOutputOperator.java b/contrib/src/main/java/com/datatorrent/contrib/cassandra/AbstractCassandraTransactionableOutputOperator.java
index 4951d6d..3851424 100644
--- a/contrib/src/main/java/com/datatorrent/contrib/cassandra/AbstractCassandraTransactionableOutputOperator.java
+++ b/contrib/src/main/java/com/datatorrent/contrib/cassandra/AbstractCassandraTransactionableOutputOperator.java
@@ -41,6 +41,7 @@
  * </p>
  *
  * @param <T>type of tuple</T>
+ * @since 1.0.2
  */
 @ShipContainingJars(classes = {com.datastax.driver.core.Cluster.class, com.codahale.metrics.Metric.class})
 public abstract class AbstractCassandraTransactionableOutputOperator<T> extends AbstractBatchTransactionableStoreOutputOperator<T, CassandraTransactionalStore> {
diff --git a/contrib/src/main/java/com/datatorrent/contrib/cassandra/AbstractCassandraTransactionableOutputOperatorPS.java b/contrib/src/main/java/com/datatorrent/contrib/cassandra/AbstractCassandraTransactionableOutputOperatorPS.java
index b6e4872..4989709 100644
--- a/contrib/src/main/java/com/datatorrent/contrib/cassandra/AbstractCassandraTransactionableOutputOperatorPS.java
+++ b/contrib/src/main/java/com/datatorrent/contrib/cassandra/AbstractCassandraTransactionableOutputOperatorPS.java
@@ -44,9 +44,9 @@
  * </p>
  *
  * @param <T>type of tuple</T>
+ * @since 1.0.2
  */
 @ShipContainingJars(classes = {com.datastax.driver.core.Cluster.class, com.codahale.metrics.Metric.class})
-
 public abstract class AbstractCassandraTransactionableOutputOperatorPS<T> extends AbstractCassandraTransactionableOutputOperator<T>{
 
 	private transient PreparedStatement updateCommand;
@@ -58,7 +58,7 @@
 	 */
 	@Nonnull
 	protected abstract PreparedStatement getUpdateCommand();
-	 
+
 	@Override
 	public void setup(Context.OperatorContext context)
 	{
diff --git a/contrib/src/main/java/com/datatorrent/contrib/cassandra/CassandraStore.java b/contrib/src/main/java/com/datatorrent/contrib/cassandra/CassandraStore.java
index c1a9440..428d721 100644
--- a/contrib/src/main/java/com/datatorrent/contrib/cassandra/CassandraStore.java
+++ b/contrib/src/main/java/com/datatorrent/contrib/cassandra/CassandraStore.java
@@ -30,6 +30,7 @@
 /**
  * A {@link Connectable} that uses cassandra to connect to stores.
  *
+ * @since 1.0.2
  */
 @ShipContainingJars(classes = {com.datastax.driver.core.Cluster.class})
 public class CassandraStore implements Connectable
diff --git a/contrib/src/main/java/com/datatorrent/contrib/cassandra/CassandraTransactionalStore.java b/contrib/src/main/java/com/datatorrent/contrib/cassandra/CassandraTransactionalStore.java
index f06ff00..371d3d6 100644
--- a/contrib/src/main/java/com/datatorrent/contrib/cassandra/CassandraTransactionalStore.java
+++ b/contrib/src/main/java/com/datatorrent/contrib/cassandra/CassandraTransactionalStore.java
@@ -26,6 +26,7 @@
 /**
  * <p>CassandraTransactionalStore class which inherits CassandraStore class and provides transaction support to the operators.</p>
  *
+ * @since 1.0.2
  */
 @ShipContainingJars(classes = {com.datastax.driver.core.Cluster.class})
 public class CassandraTransactionalStore extends CassandraStore implements TransactionableStore {
diff --git a/contrib/src/main/java/com/datatorrent/contrib/hbase/AbstractHBaseNonTransactionalAppendOutputOperator.java b/contrib/src/main/java/com/datatorrent/contrib/hbase/AbstractHBaseNonTransactionalAppendOutputOperator.java
new file mode 100644
index 0000000..efebeee
--- /dev/null
+++ b/contrib/src/main/java/com/datatorrent/contrib/hbase/AbstractHBaseNonTransactionalAppendOutputOperator.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2014 DataTorrent, Inc. ALL Rights Reserved.
+ *
+ * Licensed 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.
+ */
+package com.datatorrent.contrib.hbase;
+
+import com.datatorrent.api.annotation.ShipContainingJars;
+import com.datatorrent.common.util.DTThrowable;
+import com.datatorrent.lib.db.AbstractStoreOutputOperator;
+import org.apache.hadoop.hbase.client.Append;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+
+/**
+ * Operator for storing tuples in HBase columns.<br>
+ * 
+ * <br>
+ * This class provides a HBase output operator that can be used to store tuples
+ * in columns in a HBase table. It should be extended by the end-operator
+ * developer. The extending class should implement operationAppend method and
+ * provide a HBase Append metric object that specifies where and what to store
+ * for the tuple in the table.<br>
+ * 
+ * <br>
+ * This class offers non-transactional append where the columns are append as
+ * the tuples come in without waiting for the end window
+ * 
+ * @param <T>
+ *            The tuple type
+ * @since 1.0.2
+ */
+@ShipContainingJars(classes = { org.apache.hadoop.hbase.client.HTable.class,
+		org.apache.hadoop.hbase.util.BloomFilterFactory.class,
+		com.google.protobuf.AbstractMessageLite.class,
+		org.apache.hadoop.hbase.BaseConfigurable.class,
+		org.apache.hadoop.hbase.protobuf.generated.AccessControlProtos.class,
+		org.apache.hadoop.hbase.ipc.BadAuthException.class,
+		org.cloudera.htrace.HTraceConfiguration.class })
+public abstract class AbstractHBaseNonTransactionalAppendOutputOperator<T>
+		extends AbstractStoreOutputOperator<T, HBaseStore> {
+	private static final transient Logger logger = LoggerFactory
+			.getLogger(AbstractHBaseNonTransactionalAppendOutputOperator.class);
+
+	public AbstractHBaseNonTransactionalAppendOutputOperator() {
+		store = new HBaseStore();
+	}
+
+	@Override
+	public void processTuple(T tuple) {
+		Append append = operationAppend(tuple);
+		try {
+			store.getTable().append(append);
+		} catch (IOException e) {
+			logger.error("Could not append tuple", e);
+			DTThrowable.rethrow(e);
+		}
+
+	}
+
+	/**
+	 * Return the HBase Append metric to store the tuple. The implementor should
+	 * return a HBase Append metric that specifies where and what to store for
+	 * the tuple in the table.
+	 * 
+	 * @param t
+	 *            The tuple
+	 * @return The HBase Append metric
+	 */
+	public abstract Append operationAppend(T t);
+}
diff --git a/contrib/src/main/java/com/datatorrent/contrib/hbase/AbstractHBaseNonTransactionalPutOutputOperator.java b/contrib/src/main/java/com/datatorrent/contrib/hbase/AbstractHBaseNonTransactionalPutOutputOperator.java
new file mode 100644
index 0000000..758cc56
--- /dev/null
+++ b/contrib/src/main/java/com/datatorrent/contrib/hbase/AbstractHBaseNonTransactionalPutOutputOperator.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2014 DataTorrent, Inc. ALL Rights Reserved.
+ *
+ * Licensed 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.
+ */
+package com.datatorrent.contrib.hbase;
+
+import com.datatorrent.api.annotation.ShipContainingJars;
+import com.datatorrent.common.util.DTThrowable;
+import com.datatorrent.lib.db.AbstractStoreOutputOperator;
+import org.apache.hadoop.hbase.client.HTable;
+import org.apache.hadoop.hbase.client.Put;
+import org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.InterruptedIOException;
+
+/**
+ * Operator for storing tuples in HBase rows.<br>
+ * 
+ * <br>
+ * This class provides a HBase output operator that can be used to store tuples
+ * in rows in a HBase table. It should be extended by the end-operator
+ * developer. The extending class should implement operationPut method and
+ * provide a HBase Put metric object that specifies where and what to store for
+ * the tuple in the table.<br>
+ * 
+ * <br>
+ * This class offers non-transactional put where tuples are put as they come in
+ * 
+ * @param <T>
+ *            The tuple type
+ * @since 1.0.2
+ */
+@ShipContainingJars(classes = { org.apache.hadoop.hbase.client.HTable.class,
+		org.apache.hadoop.hbase.util.BloomFilterFactory.class,
+		com.google.protobuf.AbstractMessageLite.class,
+		org.apache.hadoop.hbase.BaseConfigurable.class,
+		org.apache.hadoop.hbase.protobuf.generated.AccessControlProtos.class,
+		org.apache.hadoop.hbase.ipc.BadAuthException.class,
+		org.cloudera.htrace.HTraceConfiguration.class })
+public abstract class AbstractHBaseNonTransactionalPutOutputOperator<T> extends
+		AbstractStoreOutputOperator<T, HBaseStore> {
+	private static final transient Logger logger = LoggerFactory
+			.getLogger(AbstractHBaseNonTransactionalPutOutputOperator.class);
+
+	public AbstractHBaseNonTransactionalPutOutputOperator() {
+		store = new HBaseStore();
+	}
+
+	@Override
+	public void processTuple(T tuple) {
+		HTable table = store.getTable();
+		Put put = operationPut(tuple);
+		try {
+			table.put(put);
+		} catch (RetriesExhaustedWithDetailsException e) {
+			logger.error("Could not output tuple", e);
+			DTThrowable.rethrow(e);
+		} catch (InterruptedIOException e) {
+			logger.error("Could not output tuple", e);
+			DTThrowable.rethrow(e);
+		}
+
+	}
+
+	public abstract Put operationPut(T t);
+
+}
diff --git a/contrib/src/main/java/com/datatorrent/contrib/hbase/AbstractHBaseTransactionalAppendOutputOperator.java b/contrib/src/main/java/com/datatorrent/contrib/hbase/AbstractHBaseTransactionalAppendOutputOperator.java
new file mode 100644
index 0000000..0729d8e
--- /dev/null
+++ b/contrib/src/main/java/com/datatorrent/contrib/hbase/AbstractHBaseTransactionalAppendOutputOperator.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) 2014 DataTorrent, Inc. ALL Rights Reserved.
+ *
+ * Licensed 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.
+ */
+package com.datatorrent.contrib.hbase;
+
+import com.datatorrent.api.annotation.ShipContainingJars;
+import com.datatorrent.common.util.DTThrowable;
+import com.datatorrent.lib.db.AbstractAggregateTransactionableStoreOutputOperator;
+import org.apache.hadoop.hbase.client.Append;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Operator for storing tuples in HBase columns.<br>
+ * 
+ * <br>
+ * This class provides a HBase output operator that can be used to store tuples
+ * in columns in a HBase table. It should be extended by the end-operator
+ * developer. The extending class should implement operationAppend method and
+ * provide a HBase Append metric object that specifies where and what to store
+ * for the tuple in the table.<br>
+ * 
+ * <br>
+ * This class provides batch append where tuples are collected till the end
+ * window and they are appended on end window
+ * 
+ * Note that since HBase doesn't support transactions this store cannot
+ * guarantee each tuple is written only once to HBase in case the operator is
+ * restarted from an earlier checkpoint. It only tries to minimize the number of
+ * duplicates limiting it to the tuples that were processed in the window when
+ * the operator shutdown.
+ * 
+ * @param <T>
+ *            The tuple type
+ * @since 1.0.2
+ */
+@ShipContainingJars(classes = { org.apache.hadoop.hbase.client.HTable.class,
+		org.apache.hadoop.hbase.util.BloomFilterFactory.class,
+		com.google.protobuf.AbstractMessageLite.class,
+		org.apache.hadoop.hbase.BaseConfigurable.class,
+		org.apache.hadoop.hbase.protobuf.generated.AccessControlProtos.class,
+		org.apache.hadoop.hbase.ipc.BadAuthException.class,
+		org.cloudera.htrace.HTraceConfiguration.class })
+public abstract class AbstractHBaseTransactionalAppendOutputOperator<T>
+		extends
+		AbstractAggregateTransactionableStoreOutputOperator<T, HBaseTransactionalStore> {
+	private static final transient Logger logger = LoggerFactory
+			.getLogger(AbstractHBaseTransactionalAppendOutputOperator.class);
+	private transient List<T> tuples;
+
+	public AbstractHBaseTransactionalAppendOutputOperator() {
+		store = new HBaseTransactionalStore();
+		tuples = new ArrayList<T>();
+	}
+
+	@Override
+	public void storeAggregate() {
+
+		Iterator<T> it = tuples.iterator();
+		while (it.hasNext()) {
+			T t = it.next();
+			try {
+				Append append = operationAppend(t);
+				store.getTable().append(append);
+			} catch (IOException e) {
+				logger.error("Could not append tuple", e);
+				DTThrowable.rethrow(e);
+			}
+			it.remove();
+		}
+	}
+
+	/**
+	 * Return the HBase Append metric to store the tuple. The implementor should
+	 * return a HBase Append metric that specifies where and what to store for
+	 * the tuple in the table.
+	 * 
+	 * @param t
+	 *            The tuple
+	 * @return The HBase Append metric
+	 */
+	public abstract Append operationAppend(T t);
+
+	@Override
+	public void processTuple(T tuple) {
+		tuples.add(tuple);
+	}
+
+}
diff --git a/contrib/src/main/java/com/datatorrent/contrib/hbase/AbstractHBaseTransactionalPutOutputOperator.java b/contrib/src/main/java/com/datatorrent/contrib/hbase/AbstractHBaseTransactionalPutOutputOperator.java
new file mode 100644
index 0000000..fcf7b44
--- /dev/null
+++ b/contrib/src/main/java/com/datatorrent/contrib/hbase/AbstractHBaseTransactionalPutOutputOperator.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2014 DataTorrent, Inc. ALL Rights Reserved.
+ *
+ * Licensed 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.
+ */
+package com.datatorrent.contrib.hbase;
+
+import com.datatorrent.api.annotation.ShipContainingJars;
+import com.datatorrent.common.util.DTThrowable;
+import com.datatorrent.lib.db.AbstractAggregateTransactionableStoreOutputOperator;
+import org.apache.hadoop.hbase.client.HTable;
+import org.apache.hadoop.hbase.client.Put;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Operator for storing tuples in HBase rows.<br>
+ * 
+ * <br>
+ * This class provides a HBase output operator that can be used to store tuples
+ * in rows in a HBase table. It should be extended by the end-operator
+ * developer. The extending class should implement operationPut method and
+ * provide a HBase Put metric object that specifies where and what to store for
+ * the tuple in the table.<br>
+ * 
+ * <br>
+ * This class provides a batch put where tuples are collected till the end
+ * window and they are put on end window
+ * 
+ * Note that since HBase doesn't support transactions this store cannot
+ * guarantee each tuple is written only once to HBase in case the operator is
+ * restarted from an earlier checkpoint. It only tries to minimize the number of
+ * duplicates limiting it to the tuples that were processed in the window when
+ * the operator shutdown.
+ * 
+ * @param <T>
+ *            The tuple type
+ * @since 1.0.2
+ */
+@ShipContainingJars(classes = { org.apache.hadoop.hbase.client.HTable.class,
+		org.apache.hadoop.hbase.util.BloomFilterFactory.class,
+		com.google.protobuf.AbstractMessageLite.class,
+		org.apache.hadoop.hbase.BaseConfigurable.class,
+		org.apache.hadoop.hbase.protobuf.generated.AccessControlProtos.class,
+		org.apache.hadoop.hbase.ipc.BadAuthException.class,
+		org.cloudera.htrace.HTraceConfiguration.class })
+public abstract class AbstractHBaseTransactionalPutOutputOperator<T>
+		extends
+		AbstractAggregateTransactionableStoreOutputOperator<T, HBaseTransactionalStore> {
+	private static final transient Logger logger = LoggerFactory
+			.getLogger(AbstractHBaseTransactionalPutOutputOperator.class);
+	private transient List<T> tuples;
+
+	public AbstractHBaseTransactionalPutOutputOperator() {
+		store = new HBaseTransactionalStore();
+		tuples = new ArrayList<T>();
+	}
+
+	@Override
+	public void storeAggregate() {
+
+		Iterator<T> it = tuples.iterator();
+		while (it.hasNext()) {
+			T t = it.next();
+			try {
+				HTable table = store.getTable();
+				Put put = operationPut(t);
+				table.put(put);
+			} catch (IOException e) {
+				logger.error("Could not output tuple", e);
+				DTThrowable.rethrow(e);
+			}
+			it.remove();
+		}
+	}
+
+	public abstract Put operationPut(T t) throws IOException;
+
+	@Override
+	public void processTuple(T tuple) {
+		tuples.add(tuple);
+	}
+
+}
diff --git a/contrib/src/main/java/com/datatorrent/contrib/hbase/HBaseNameValueCsvPutOperator.java b/contrib/src/main/java/com/datatorrent/contrib/hbase/HBaseNameValueCsvPutOperator.java
new file mode 100644
index 0000000..1ed1eb4
--- /dev/null
+++ b/contrib/src/main/java/com/datatorrent/contrib/hbase/HBaseNameValueCsvPutOperator.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright (c) 2014 DataTorrent, Inc. ALL Rights Reserved.
+ *
+ * Licensed 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.
+ */
+package com.datatorrent.contrib.hbase;
+
+import com.datatorrent.api.Context.OperatorContext;
+import com.datatorrent.common.util.DTThrowable;
+import com.datatorrent.lib.util.ReusableStringReader;
+import org.apache.hadoop.hbase.client.Put;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.supercsv.io.CsvListReader;
+import org.supercsv.io.ICsvListReader;
+import org.supercsv.prefs.CsvPreference;
+
+import javax.validation.constraints.NotNull;
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * accepts a string of key value pairs containing the data to be inserted.These
+ * are mapped to corresponding rows,columnfamilies and columns using a property
+ * file and inserted into hbase Eg: input string will be of the form
+ * name=xyz,st=patrickhenry,ct=fremont,sa=california the properties will contain
+ * properties of form
+ * name=row,sa=address.street,ct=address.city,sa=address.state with the above
+ * the mapping a row xyz is created. the value patrickhenry is inserted into
+ * columnfamily address and column street of row xyz. other values are inserted
+ * similarly.
+ *
+ * @since 1.0.2
+ */
+public class HBaseNameValueCsvPutOperator extends HBasePutOperator<String> {
+
+	private class ColDef {
+		String colFam;
+		String colName;
+	}
+
+	private static final transient Logger logger = LoggerFactory.getLogger(HBaseNameValueCsvPutOperator.class);
+	@NotNull
+	private String mapping;
+	private transient String rowKey;
+	private transient Map<String, ColDef> colMap = new HashMap<String, ColDef>();
+	private transient Map<String, String> linemap = new HashMap<String, String>();
+	private transient ICsvListReader lineListReader = null;
+	private transient ReusableStringReader lineSr=new ReusableStringReader();
+	private transient ArrayList<String> csvLineList = new ArrayList<String>();
+	
+	public void setMapping(String mapping) {
+		this.mapping = mapping;
+	}
+
+	@Override
+	public Put operationPut(String t) {
+		return parseLine(t);
+	}
+
+	public void parseMapping() {
+		ICsvListReader listReader = null;
+		StringReader sr=null;
+		ArrayList<String> csvList = new ArrayList<String>();
+		try {
+			sr=new StringReader(mapping);
+			listReader = new CsvListReader(sr,CsvPreference.STANDARD_PREFERENCE);
+			csvList = (ArrayList<String>) listReader.read();
+		} catch (IOException e) {
+			logger.error("Cannot read the mapping string", e);
+			DTThrowable.rethrow(e);
+		} finally {
+			try {
+				sr.close();
+				listReader.close();
+			} catch (IOException e) {
+				logger.error("Error closing Csv reader", e);
+				DTThrowable.rethrow(e);
+			}
+		}
+		for (String pair : csvList) {
+			ColDef c = new ColDef();
+			if (pair.indexOf('.') != -1) {
+				c.colName = pair.substring(pair.indexOf('.') + 1);
+				c.colFam = pair.substring(pair.indexOf('=') + 1,pair.indexOf('.'));
+				colMap.put(pair.substring(0, pair.indexOf('=')), c);
+			} else {
+				rowKey = pair.substring(0, pair.indexOf('='));
+			}
+		}
+	}
+
+	public Put parseLine(String s) {
+		Put put = null;
+		try {
+			lineSr.open(s);
+			csvLineList = (ArrayList<String>) lineListReader.read();
+		} catch (IOException e) {
+			logger.error("Cannot read the property string", e);
+			DTThrowable.rethrow(e);
+		} 
+		for (String pair : csvLineList) {
+			String key = pair.substring(0, pair.indexOf('='));
+			String value = pair.substring(pair.indexOf('=') + 1);
+
+			if (key.equals(rowKey)) {
+				put = new Put(value.getBytes());
+				for (Map.Entry<String, String> entry : linemap.entrySet()) {
+					ColDef c = colMap.get(entry.getKey());
+					put.add(c.colFam.getBytes(), c.colName.getBytes(), entry.getValue().getBytes());
+				}
+			} else {
+				if (put != null) {
+					ColDef c = colMap.get(key);
+					put.add(c.colFam.getBytes(), c.colName.getBytes(),value.getBytes());
+				} else {
+					linemap.put(key, value);
+				}
+			}
+		}
+		csvLineList.clear();
+		linemap.clear();
+		return put;
+	}
+
+	@Override
+	public void setup(OperatorContext context) {
+		super.setup(context);
+		parseMapping();
+		lineListReader = new CsvListReader(lineSr,CsvPreference.STANDARD_PREFERENCE);
+	}
+
+	@Override
+	public HBaseStatePersistenceStrategy getPersistenceStrategy() {
+		return new HBaseRowStatePersistence();
+	}
+	
+	@Override
+	public void teardown() {
+		super.teardown();
+		try {
+			lineSr.close();
+			lineListReader.close();
+		} catch (IOException e) {
+			logger.error("Cannot close the readers", e);
+			DTThrowable.rethrow(e);
+		}
+	}
+
+}
diff --git a/contrib/src/main/java/com/datatorrent/contrib/hbase/HBaseStore.java b/contrib/src/main/java/com/datatorrent/contrib/hbase/HBaseStore.java
new file mode 100644
index 0000000..adca58f
--- /dev/null
+++ b/contrib/src/main/java/com/datatorrent/contrib/hbase/HBaseStore.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright (c) 2014 DataTorrent, Inc. ALL Rights Reserved.
+ *
+ * Licensed 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.
+ */
+package com.datatorrent.contrib.hbase;
+
+import com.datatorrent.lib.db.Connectable;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hbase.HBaseConfiguration;
+import org.apache.hadoop.hbase.client.HTable;
+
+import java.io.IOException;
+/**
+ * A {@link Connectable} that uses hbase to connect to stores.
+ *
+ * @since 1.0.2
+ */
+public class HBaseStore implements Connectable {
+
+	private String zookeeperQuorum;
+	private int zookeeperClientPort;
+	protected String tableName;
+
+	protected transient HTable table;
+
+	/**
+	 * Get the zookeeper quorum location.
+	 * 
+	 * @return The zookeeper quorum location
+	 */
+	public String getZookeeperQuorum() {
+		return zookeeperQuorum;
+	}
+
+	/**
+	 * Set the zookeeper quorum location.
+	 * 
+	 * @param zookeeperQuorum
+	 *            The zookeeper quorum location
+	 */
+	public void setZookeeperQuorum(String zookeeperQuorum) {
+		this.zookeeperQuorum = zookeeperQuorum;
+	}
+
+	/**
+	 * Get the zookeeper client port.
+	 * 
+	 * @return The zookeeper client port
+	 */
+	public int getZookeeperClientPort() {
+		return zookeeperClientPort;
+	}
+
+	/**
+	 * Set the zookeeper client port.
+	 * 
+	 * @param zookeeperClientPort
+	 *            The zookeeper client port
+	 */
+	public void setZookeeperClientPort(int zookeeperClientPort) {
+		this.zookeeperClientPort = zookeeperClientPort;
+	}
+
+	/**
+	 * Get the HBase table name.
+	 * 
+	 * @return The HBase table name
+	 */
+	public String getTableName() {
+		return tableName;
+	}
+
+	/**
+	 * Set the HBase table name.
+	 * 
+	 * @param tableName
+	 *            The HBase table name
+	 */
+	public void setTableName(String tableName) {
+		this.tableName = tableName;
+	}
+
+	/**
+	 * Get the HBase table .
+	 * 
+	 * @return The HBase table
+	 */
+	public HTable getTable() {
+		return table;
+	}
+
+	/**
+	 * Set the HBase table.
+	 * 
+	 * @param table
+	 *            The HBase table
+	 */
+	public void setTable(HTable table) {
+		this.table = table;
+	}
+
+	/**
+	 * Get the configuration.
+	 * 
+	 * @return The configuration
+	 */
+	public Configuration getConfiguration() {
+		return configuration;
+	}
+
+	/**
+	 * Set the configuration.
+	 * 
+	 * @param configuration
+	 *            The configuration
+	 */
+	public void setConfiguration(Configuration configuration) {
+		this.configuration = configuration;
+	}
+
+	protected transient Configuration configuration;
+
+	@Override
+	public void connect() throws IOException {
+		configuration = HBaseConfiguration.create();
+		configuration.set("hbase.zookeeper.quorum", zookeeperQuorum);
+		configuration.set("hbase.zookeeper.property.clientPort", ""
+				+ zookeeperClientPort);
+		table = new HTable(configuration, tableName);
+
+	}
+
+	@Override
+	public void disconnect() throws IOException {
+		// not applicable for hbase
+
+	}
+
+	@Override
+	public boolean connected() {
+		// not applicable to hbase
+		return false;
+	}
+
+}
diff --git a/contrib/src/main/java/com/datatorrent/contrib/hbase/HBaseTransactionalStore.java b/contrib/src/main/java/com/datatorrent/contrib/hbase/HBaseTransactionalStore.java
new file mode 100644
index 0000000..ad5915d
--- /dev/null
+++ b/contrib/src/main/java/com/datatorrent/contrib/hbase/HBaseTransactionalStore.java
@@ -0,0 +1,205 @@
+/*
+ * Copyright (c) 2014 DataTorrent, Inc. ALL Rights Reserved.
+ *
+ * Licensed 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.
+ */
+package com.datatorrent.contrib.hbase;
+
+import com.datatorrent.common.util.DTThrowable;
+import com.datatorrent.lib.db.TransactionableStore;
+import org.apache.hadoop.hbase.HColumnDescriptor;
+import org.apache.hadoop.hbase.HTableDescriptor;
+import org.apache.hadoop.hbase.KeyValue;
+import org.apache.hadoop.hbase.client.*;
+import org.apache.hadoop.hbase.util.Bytes;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.InterruptedIOException;
+/**
+ * <p>HBaseTransactionalStore class.</p>
+ * Note that since HBase doesn't support transactions this store cannot guarantee each tuple is written only once to
+ * HBase in case the operator is restarted from an earlier checkpoint. It only tries to minimize the number of
+ * duplicates limiting it to the tuples that were processed in the window when the operator shutdown.
+ *
+ * @since 1.0.2
+ */
+public class HBaseTransactionalStore extends HBaseStore implements
+		TransactionableStore {
+	private static final transient Logger logger = LoggerFactory
+			.getLogger(HBaseTransactionalStore.class);
+	private static final String DEFAULT_ROW_NAME = "HBaseOperator_row";
+	private static final String DEFAULT_COLUMN_FAMILY_NAME = "HBaseOutputOperator_cf";
+	private static final String DEFAULT_LAST_WINDOW_PREFIX_COLUMN_NAME = "last_window";
+	private transient String rowName;
+	private transient String columnFamilyName;
+
+	private transient byte[] rowBytes;
+	private transient byte[] columnFamilyBytes;
+
+	private transient String lastWindowColumnName;
+	private transient byte[] lastWindowColumnBytes;
+
+	public HBaseTransactionalStore() {
+		rowName = DEFAULT_ROW_NAME;
+		columnFamilyName = DEFAULT_COLUMN_FAMILY_NAME;
+		lastWindowColumnName = DEFAULT_LAST_WINDOW_PREFIX_COLUMN_NAME;
+		constructKeys();
+	}
+
+	private void constructKeys() {
+		rowBytes = Bytes.toBytes(rowName);
+		columnFamilyBytes = Bytes.toBytes(columnFamilyName);
+	}
+
+	/**
+	 * Get the row name in the table.
+	 * 
+	 * @return The row name
+	 */
+	public String getRowName() {
+		return rowName;
+	}
+
+	/**
+	 * Set the row name in the table.
+	 * 
+	 * @param rowName
+	 *            The row name
+	 */
+	public void setRowName(String rowName) {
+		this.rowName = rowName;
+		constructKeys();
+	}
+
+	/**
+	 * Get the column family name in the table.
+	 * 
+	 * @return The column family name
+	 */
+	public String getColumnFamilyName() {
+		return columnFamilyName;
+	}
+
+	/**
+	 * Set the column family name in the table.
+	 * 
+	 * @param columnFamilyName
+	 *            The column family name
+	 */
+	public void setColumnFamilyName(String columnFamilyName) {
+		this.columnFamilyName = columnFamilyName;
+		constructKeys();
+	}
+
+	@Override
+	public void connect() throws IOException {
+		super.connect();
+		HTableDescriptor tdesc = table.getTableDescriptor();
+		if (!tdesc.hasFamily(columnFamilyBytes)) {
+			HBaseAdmin admin = new HBaseAdmin(table.getConfiguration());
+			admin.disableTable(table.getTableName());
+			try {
+				HColumnDescriptor cdesc = new HColumnDescriptor(
+						columnFamilyBytes);
+				admin.addColumn(table.getTableName(), cdesc);
+			} finally {
+				admin.enableTable(table.getTableName());
+				admin.close();
+			}
+		}
+	}
+
+	@Override
+	public void beginTransaction() {
+		// HBase does support transactions so this method left empty
+
+	}
+
+	@Override
+	public void commitTransaction() {
+		// HBase does support transactions so this method left empty
+
+	}
+
+	@Override
+	public void rollbackTransaction() {
+		// HBase does support transactions so this method left empty
+
+	}
+
+	@Override
+	public boolean isInTransaction() {
+		// HBase does support transactions so this method left empty
+		return false;
+	}
+
+	@Override
+	public long getCommittedWindowId(String appId, int operatorId) {
+
+		byte[] value = null;
+		try {
+			String columnKey = appId + "_" + operatorId + "_"
+					+ lastWindowColumnName;
+			lastWindowColumnBytes = Bytes.toBytes(columnKey);
+			Get get = new Get(rowBytes);
+			get.addColumn(columnFamilyBytes, lastWindowColumnBytes);
+			Result result = null;
+			result = table.get(get);
+
+			for (KeyValue kv : result.raw()) {
+				if (kv.matchingQualifier(lastWindowColumnBytes)) {
+					value = kv.getValue();
+					break;
+				}
+			}
+		} catch (IOException ex) {
+			logger.error("Could not load window id ", ex);
+			DTThrowable.rethrow(ex);
+		}
+		if (value != null) {
+			long longval = Bytes.toLong(value);
+			return longval;
+		} else
+			return -1;
+
+	}
+
+	@Override
+	public void storeCommittedWindowId(String appId, int operatorId,
+			long windowId) {
+		byte[] WindowIdBytes = Bytes.toBytes(windowId);
+		String columnKey = appId + "_" + operatorId + "_"
+				+ lastWindowColumnName;
+		lastWindowColumnBytes = Bytes.toBytes(columnKey);
+		Put put = new Put(rowBytes);
+		put.add(columnFamilyBytes, lastWindowColumnBytes, WindowIdBytes);
+		try {
+			table.put(put);
+		} catch (RetriesExhaustedWithDetailsException e) {
+			logger.error("Could not store window id ", e);
+			DTThrowable.rethrow(e);
+		} catch (InterruptedIOException e) {
+			logger.error("Could not store window id ", e);
+			DTThrowable.rethrow(e);
+		}
+
+	}
+
+	@Override
+	public void removeCommittedWindowId(String appId, int operatorId) {
+		// Not applicable to hbase
+	}
+
+}
diff --git a/contrib/src/main/java/com/datatorrent/contrib/twitter/TwitterSampleInput.java b/contrib/src/main/java/com/datatorrent/contrib/twitter/TwitterSampleInput.java
index d84bcba..beae76e 100644
--- a/contrib/src/main/java/com/datatorrent/contrib/twitter/TwitterSampleInput.java
+++ b/contrib/src/main/java/com/datatorrent/contrib/twitter/TwitterSampleInput.java
@@ -17,15 +17,15 @@
 
 import java.util.concurrent.ArrayBlockingQueue;
 
-import twitter4j.*;
-import twitter4j.conf.ConfigurationBuilder;
-
 import javax.validation.constraints.Min;
 import javax.validation.constraints.NotNull;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import twitter4j.*;
+import twitter4j.conf.ConfigurationBuilder;
+
 import com.datatorrent.api.ActivationListener;
 import com.datatorrent.api.Context.OperatorContext;
 import com.datatorrent.api.DefaultOutputPort;
@@ -51,10 +51,10 @@
   public final transient DefaultOutputPort<Status> status = new DefaultOutputPort<Status>();
   public final transient DefaultOutputPort<String> text = new DefaultOutputPort<String>();
   public final transient DefaultOutputPort<String> url = new DefaultOutputPort<String>();
+  public final transient DefaultOutputPort<String> hashtag = new DefaultOutputPort<String>();
 
   /* the following 3 ports are not implemented so far */
   public final transient DefaultOutputPort<?> userMention = null;
-  public final transient DefaultOutputPort<?> hashtag = null;
   public final transient DefaultOutputPort<?> media = null;
   /**
    * Enable debugging.
@@ -70,9 +70,9 @@
   /**
    * The state which we would like to save for this operator.
    */
-  private int multiplier = 1;
+  private int feedMultiplier = 1;
   @Min(0)
-  private int multiplierVariance = 0;
+  private int feedMultiplierVariance = 0;
 
   /* Following twitter access credentials should be set before using this operator. */
   @NotNull
@@ -91,16 +91,16 @@
   {
     operatorThread = Thread.currentThread();
 
-    if (multiplier != 1) {
-      logger.info("Load set to be {}% of the entire twitter feed", multiplier);
+    if (feedMultiplier != 1) {
+      logger.info("Load set to be {}% of the entire twitter feed", feedMultiplier);
     }
 
     ConfigurationBuilder cb = new ConfigurationBuilder();
     cb.setDebugEnabled(debug).
-      setOAuthConsumerKey(consumerKey).
-      setOAuthConsumerSecret(consumerSecret).
-      setOAuthAccessToken(accessToken).
-      setOAuthAccessTokenSecret(accessTokenSecret);
+            setOAuthConsumerKey(consumerKey).
+            setOAuthConsumerSecret(consumerSecret).
+            setOAuthAccessToken(accessToken).
+            setOAuthAccessTokenSecret(accessTokenSecret);
 
     ts = new TwitterStreamFactory(cb.build()).getInstance();
   }
@@ -114,19 +114,19 @@
   @Override
   public void onStatus(Status status)
   {
-    int randomMultiplier = multiplier;
+    int randomMultiplier = feedMultiplier;
 
-    if (multiplierVariance > 0) {
-      int min = multiplier - multiplierVariance;
+    if (feedMultiplierVariance > 0) {
+      int min = feedMultiplier - feedMultiplierVariance;
       if (min < 0) {
         min = 0;
       }
 
-      int max = multiplier + multiplierVariance;
-      randomMultiplier = min + (int) (Math.random() * ((max - min) + 1));
+      int max = feedMultiplier + feedMultiplierVariance;
+      randomMultiplier = min + (int)(Math.random() * ((max - min) + 1));
     }
     try {
-      for (int i = randomMultiplier; i-- > 0; ) {
+      for (int i = randomMultiplier; i-- > 0;) {
         statuses.put(status);
         count++;
       }
@@ -186,10 +186,10 @@
   {
     ConfigurationBuilder cb = new ConfigurationBuilder();
     cb.setDebugEnabled(debug).
-      setOAuthConsumerKey(consumerKey).
-      setOAuthConsumerSecret(consumerSecret).
-      setOAuthAccessToken(accessToken).
-      setOAuthAccessTokenSecret(accessTokenSecret);
+            setOAuthConsumerKey(consumerKey).
+            setOAuthConsumerSecret(consumerSecret).
+            setOAuthAccessToken(accessToken).
+            setOAuthAccessTokenSecret(accessTokenSecret);
 
     ts = new TwitterStreamFactory(cb.build()).getInstance();
     ts.addListener(TwitterSampleInput.this);
@@ -220,18 +220,28 @@
 
   public void setFeedMultiplier(int multiplier)
   {
-    this.multiplier = multiplier;
+    this.feedMultiplier = multiplier;
+  }
+
+  public int getFeedMultiplier()
+  {
+    return this.feedMultiplier;
   }
 
   public void setFeedMultiplierVariance(int multiplierVariance)
   {
-    this.multiplierVariance = multiplierVariance;
+    this.feedMultiplierVariance = multiplierVariance;
+  }
+
+  public int getFeedMultiplierVariance()
+  {
+    return this.feedMultiplierVariance;
   }
 
   @Override
   public void emitTuples()
   {
-    for (int size = statuses.size(); size-- > 0; ) {
+    for (int size = statuses.size(); size-- > 0;) {
       Status s = statuses.poll();
       if (status.isConnected()) {
         status.emit(s);
@@ -249,7 +259,15 @@
           }
         }
       }
-      // do the same thing for all the other output ports.
+
+      if (hashtag.isConnected()) {
+        HashtagEntity[] hashtagEntities = s.getHashtagEntities();
+        if (hashtagEntities != null) {
+          for (HashtagEntity he : hashtagEntities) {
+            hashtag.emit(he.getText());
+          }
+        }
+      }
     }
   }
 
@@ -309,8 +327,8 @@
   {
     int hash = 7;
     hash = 11 * hash + (this.debug ? 1 : 0);
-    hash = 11 * hash + this.multiplier;
-    hash = 11 * hash + this.multiplierVariance;
+    hash = 11 * hash + this.feedMultiplier;
+    hash = 11 * hash + this.feedMultiplierVariance;
     hash = 11 * hash + (this.consumerKey != null ? this.consumerKey.hashCode() : 0);
     hash = 11 * hash + (this.consumerSecret != null ? this.consumerSecret.hashCode() : 0);
     hash = 11 * hash + (this.accessToken != null ? this.accessToken.hashCode() : 0);
@@ -332,10 +350,10 @@
     if (this.debug != other.debug) {
       return false;
     }
-    if (this.multiplier != other.multiplier) {
+    if (this.feedMultiplier != other.feedMultiplier) {
       return false;
     }
-    if (this.multiplierVariance != other.multiplierVariance) {
+    if (this.feedMultiplierVariance != other.feedMultiplierVariance) {
       return false;
     }
     if ((this.consumerKey == null) ? (other.consumerKey != null) : !this.consumerKey.equals(other.consumerKey)) {
@@ -356,7 +374,7 @@
   @Override
   public String toString()
   {
-    return "TwitterSampleInput{debug=" + debug + ", multiplier=" + multiplier + ", multiplierVariance=" + multiplierVariance + ", consumerKey=" + consumerKey + ", consumerSecret=" + consumerSecret + ", accessToken=" + accessToken + ", accessTokenSecret=" + accessTokenSecret + '}';
+    return "TwitterSampleInput{debug=" + debug + ", feedMultiplier=" + feedMultiplier + ", feedMultiplierVariance=" + feedMultiplierVariance + ", consumerKey=" + consumerKey + ", consumerSecret=" + consumerSecret + ", accessToken=" + accessToken + ", accessTokenSecret=" + accessTokenSecret + '}';
   }
 
   private static final Logger logger = LoggerFactory.getLogger(TwitterSampleInput.class);
diff --git a/contrib/src/test/java/com/datatorrent/contrib/hbase/HBaseNameValueCsvPutOperatorTest.java b/contrib/src/test/java/com/datatorrent/contrib/hbase/HBaseNameValueCsvPutOperatorTest.java
new file mode 100644
index 0000000..92bab15
--- /dev/null
+++ b/contrib/src/test/java/com/datatorrent/contrib/hbase/HBaseNameValueCsvPutOperatorTest.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2014 DataTorrent, Inc. ALL Rights Reserved.
+ *
+ * Licensed 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.
+ */
+package com.datatorrent.contrib.hbase;
+
+import java.io.IOException;
+
+import junit.framework.Assert;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.datatorrent.api.AttributeMap;
+import com.datatorrent.api.AttributeMap.Attribute;
+import com.datatorrent.api.Context.OperatorContext;
+
+public class HBaseNameValueCsvPutOperatorTest {
+	private static final Logger logger = LoggerFactory
+			.getLogger(HBaseNameValueCsvPutOperatorTest.class);
+
+	@Test
+	public void testPut() throws Exception {
+		try {
+      HBaseTestHelper.startLocalCluster();
+			HBaseTestHelper.clearHBase();
+			HBaseNameValueCsvPutOperator propPutOperator = new HBaseNameValueCsvPutOperator();
+
+			propPutOperator.setTableName("table1");
+			propPutOperator.setZookeeperQuorum("127.0.0.1");
+			propPutOperator.setZookeeperClientPort(2181);
+			String s = "name=milind,st=patrick,ct=fremont,sa=cali";
+			String s1 = "st=tasman,ct=sancla,name=milinda,sa=cali";
+			propPutOperator.setMapping("name=row,st=colfam0.street,ct=colfam0.city,sa=colfam0.state");
+			propPutOperator.setup(new OperatorContext() {
+
+				@Override
+				public <T> T getValue(Attribute<T> key) {
+					return null;
+				}
+
+				@Override
+				public AttributeMap getAttributes() {
+					return null;
+				}
+
+				@Override
+				public int getId() {
+					// TODO Auto-generated method stub
+					return 0;
+				}
+
+				@Override
+				public void setCounters(Object counters) {
+					// TODO Auto-generated method stub
+					
+				}
+			});
+			propPutOperator.beginWindow(0);
+			propPutOperator.inputPort.process(s);
+			propPutOperator.inputPort.process(s1);
+			propPutOperator.endWindow();
+			HBaseTuple tuple;
+
+			tuple = HBaseTestHelper
+					.getHBaseTuple("milind", "colfam0", "street");
+
+			Assert.assertNotNull("Tuple", tuple);
+			Assert.assertEquals("Tuple row", tuple.getRow(), "milind");
+			Assert.assertEquals("Tuple column family", tuple.getColFamily(),
+					"colfam0");
+			Assert.assertEquals("Tuple column name", tuple.getColName(),
+					"street");
+			Assert.assertEquals("Tuple column value", tuple.getColValue(),
+					"patrick");
+		} catch (IOException e) {
+
+			logger.error(e.getMessage());
+		}
+	}
+	
+}
diff --git a/contrib/src/test/java/com/datatorrent/contrib/hbase/HBaseTestHelper.java b/contrib/src/test/java/com/datatorrent/contrib/hbase/HBaseTestHelper.java
index f33cb9e..9bdfe48 100644
--- a/contrib/src/test/java/com/datatorrent/contrib/hbase/HBaseTestHelper.java
+++ b/contrib/src/test/java/com/datatorrent/contrib/hbase/HBaseTestHelper.java
@@ -17,24 +17,26 @@
 
 import java.io.File;
 import java.io.IOException;
-import java.math.BigDecimal;
 import java.net.InetSocketAddress;
 import java.util.List;
+
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.EmptyWatcher;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.HColumnDescriptor;
 import org.apache.hadoop.hbase.HTableDescriptor;
 import org.apache.hadoop.hbase.KeyValue;
 import org.apache.hadoop.hbase.LocalHBaseCluster;
-import org.apache.hadoop.hbase.client.*;
+import org.apache.hadoop.hbase.client.Get;
+import org.apache.hadoop.hbase.client.HBaseAdmin;
+import org.apache.hadoop.hbase.client.HTable;
+import org.apache.hadoop.hbase.client.Put;
+import org.apache.hadoop.hbase.client.Result;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.apache.zookeeper.ZooKeeper;
-import org.apache.zookeeper.server.NIOServerCnxn;
 import org.apache.zookeeper.server.NIOServerCnxnFactory;
-//import org.apache.zookeeper.server.NIOServerCnxnFactory;
 import org.apache.zookeeper.server.ZooKeeperServer;
 
+//import org.apache.hadoop.hbase.EmptyWatcher;
+
 /**
  *
  */
@@ -59,7 +61,7 @@
     ZooKeeperServer zooKeeper = new ZooKeeperServer(zooFile, zooFile, 2000);
 
     NIOServerCnxnFactory serverFactory = new NIOServerCnxnFactory();
-    serverFactory.configure(new InetSocketAddress(2182),10);
+    serverFactory.configure(new InetSocketAddress(2181),10);
     serverFactory.startup(zooKeeper);
   }
 
@@ -148,3 +150,4 @@
   }
 
 }
+
diff --git a/contrib/src/test/java/com/datatorrent/contrib/hbase/HBaseTransactionalAppendOperatorTest.java b/contrib/src/test/java/com/datatorrent/contrib/hbase/HBaseTransactionalAppendOperatorTest.java
new file mode 100644
index 0000000..7f6ffbb
--- /dev/null
+++ b/contrib/src/test/java/com/datatorrent/contrib/hbase/HBaseTransactionalAppendOperatorTest.java
@@ -0,0 +1,99 @@
+
+/*
+ * Copyright (c) 2013 DataTorrent, Inc. ALL Rights Reserved.
+ *
+ * Licensed 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.
+ */
+package com.datatorrent.contrib.hbase;
+
+import com.datatorrent.api.DAG;
+import com.datatorrent.api.LocalMode;
+import junit.framework.Assert;
+import org.apache.hadoop.hbase.client.Append;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Test for transactional append operator
+ */
+public class HBaseTransactionalAppendOperatorTest {
+	private static final Logger logger = LoggerFactory
+			.getLogger(HBaseTransactionalAppendOperatorTest.class);
+
+	public HBaseTransactionalAppendOperatorTest() {
+	}
+
+	@Test
+	public void testAppend() {
+		try {
+      HBaseTestHelper.startLocalCluster();
+			HBaseTestHelper.clearHBase();
+			LocalMode lma = LocalMode.newInstance();
+			DAG dag = lma.getDAG();
+
+			dag.setAttribute(DAG.APPLICATION_NAME, "HBaseAppendOperatorTest");
+			HBaseColTupleGenerator ctg = dag.addOperator("coltuplegenerator",
+					HBaseColTupleGenerator.class);
+			TestHBaseAppendOperator thop = dag.addOperator("testhbaseput",
+					TestHBaseAppendOperator.class);
+			dag.addStream("ss", ctg.outputPort, thop.input);
+
+			thop.getStore().setTableName("table1");
+			thop.getStore().setZookeeperQuorum("127.0.0.1");
+			thop.getStore().setZookeeperClientPort(2181);
+
+			final LocalMode.Controller lc = lma.getController();
+			lc.setHeartbeatMonitoringEnabled(false);
+			lc.run(30000);
+
+			
+			HBaseTuple tuple = HBaseTestHelper.getHBaseTuple("row0", "colfam0",
+					"col-0");
+			Assert.assertNotNull("Tuple", tuple);
+			Assert.assertEquals("Tuple row", tuple.getRow(), "row0");
+			Assert.assertEquals("Tuple column family", tuple.getColFamily(),
+					"colfam0");
+			Assert.assertEquals("Tuple column name", tuple.getColName(),
+					"col-0");
+			Assert.assertEquals("Tuple column value", tuple.getColValue(),
+					"val-0-0");
+			tuple = HBaseTestHelper.getHBaseTuple("row0", "colfam0", "col-499");
+			Assert.assertNotNull("Tuple", tuple);
+			Assert.assertEquals("Tuple row", tuple.getRow(), "row0");
+			Assert.assertEquals("Tuple column family", tuple.getColFamily(),
+					"colfam0");
+			Assert.assertEquals("Tuple column name", tuple.getColName(),
+					"col-499");
+			Assert.assertEquals("Tuple column value", tuple.getColValue(),
+					"val-0-499");
+		} catch (Exception ex) {
+			logger.error(ex.getMessage());
+			assert false;
+		}
+	}
+
+	@SuppressWarnings("serial")
+	public static class TestHBaseAppendOperator extends
+			AbstractHBaseTransactionalAppendOutputOperator<HBaseTuple> {
+
+		@Override
+		public Append operationAppend(HBaseTuple t) {
+			Append append = new Append(t.getRow().getBytes());
+			append.add(t.getColFamily().getBytes(), t.getColName().getBytes(),
+					t.getColValue().getBytes());
+			return append;
+		}
+
+	}
+}
diff --git a/contrib/src/test/java/com/datatorrent/contrib/hbase/HBaseTransactionalPutOperatorTest.java b/contrib/src/test/java/com/datatorrent/contrib/hbase/HBaseTransactionalPutOperatorTest.java
new file mode 100644
index 0000000..6b5d5e0
--- /dev/null
+++ b/contrib/src/test/java/com/datatorrent/contrib/hbase/HBaseTransactionalPutOperatorTest.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2013 DataTorrent, Inc. ALL Rights Reserved.
+ *
+ * Licensed 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.
+ */
+package com.datatorrent.contrib.hbase;
+
+import com.datatorrent.api.DAG;
+import com.datatorrent.api.LocalMode;
+import junit.framework.Assert;
+import org.apache.hadoop.hbase.client.Put;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+
+/**
+ *
+ */
+public class HBaseTransactionalPutOperatorTest {
+	private static final Logger logger = LoggerFactory
+			.getLogger(HBaseTransactionalPutOperatorTest.class);
+
+	public HBaseTransactionalPutOperatorTest() {
+	}
+
+	@Test
+	public void testPut() {
+		try {
+      HBaseTestHelper.startLocalCluster();
+			HBaseTestHelper.clearHBase();
+			LocalMode lma = LocalMode.newInstance();
+			DAG dag = lma.getDAG();
+
+			dag.setAttribute(DAG.APPLICATION_NAME, "HBasePutOperatorTest");
+			HBaseRowTupleGenerator rtg = dag.addOperator("tuplegenerator",
+					HBaseRowTupleGenerator.class);
+			TestHBasePutOperator thop = dag.addOperator("testhbaseput",
+					TestHBasePutOperator.class);
+			dag.addStream("ss", rtg.outputPort, thop.input);
+
+			thop.getStore().setTableName("table1");
+			thop.getStore().setZookeeperQuorum("127.0.0.1");
+			thop.getStore().setZookeeperClientPort(2181);
+
+			LocalMode.Controller lc = lma.getController();
+			lc.setHeartbeatMonitoringEnabled(false);
+			lc.run(30000);
+
+			HBaseTuple tuple = HBaseTestHelper.getHBaseTuple("row0", "colfam0",
+					"col-0");
+			Assert.assertNotNull("Tuple", tuple);
+			Assert.assertEquals("Tuple row", tuple.getRow(), "row0");
+			Assert.assertEquals("Tuple column family", tuple.getColFamily(),
+					"colfam0");
+			Assert.assertEquals("Tuple column name", tuple.getColName(),
+					"col-0");
+			Assert.assertEquals("Tuple column value", tuple.getColValue(),
+					"val-0-0");
+			tuple = HBaseTestHelper.getHBaseTuple("row499", "colfam0", "col-0");
+			Assert.assertNotNull("Tuple", tuple);
+			Assert.assertEquals("Tuple row", tuple.getRow(), "row499");
+			Assert.assertEquals("Tuple column family", tuple.getColFamily(),
+					"colfam0");
+			Assert.assertEquals("Tuple column name", tuple.getColName(),
+					"col-0");
+			Assert.assertEquals("Tuple column value", tuple.getColValue(),
+					"val-499-0");
+		} catch (Exception ex) {
+			ex.printStackTrace();
+			logger.error(ex.getMessage());
+			assert false;
+		}
+	}
+
+	@SuppressWarnings("serial")
+	public static class TestHBasePutOperator extends
+			AbstractHBaseTransactionalPutOutputOperator<HBaseTuple> {
+
+		@Override
+		public Put operationPut(HBaseTuple t) throws IOException {
+			Put put = new Put(t.getRow().getBytes());
+			put.add(t.getColFamily().getBytes(), t.getColName().getBytes(), t
+					.getColValue().getBytes());
+			return put;
+		}
+
+	}
+}
diff --git a/demos/pom.xml b/demos/pom.xml
index 22e7aae..7c8e466 100644
--- a/demos/pom.xml
+++ b/demos/pom.xml
@@ -5,7 +5,7 @@
   <parent>
     <groupId>com.datatorrent</groupId>
     <artifactId>malhar-all</artifactId>
-    <version>1.0.2-SNAPSHOT</version>
+    <version>1.0.2</version>
   </parent>
 
   <artifactId>malhar-demos</artifactId>
@@ -16,21 +16,9 @@
     <maven.deploy.skip>false</maven.deploy.skip>
     <skipTests>true</skipTests>
   </properties>
-
+  
   <dependencies>
     <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>dt-engine</artifactId>
-      <version>${dt.framework.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>malhar-library</artifactId>
-      <version>${project.version}</version>
-      <type>jar</type>
-    </dependency>
-    <dependency>
       <!-- required by twitter demo -->
       <groupId>org.twitter4j</groupId>
       <artifactId>twitter4j-core</artifactId>
@@ -69,7 +57,7 @@
       <version>1.1</version>
     </dependency>
     <dependency>
-      <groupId> org.apache.hadoop</groupId>
+      <groupId>org.apache.hadoop</groupId>
       <artifactId>hadoop-mapreduce-client-core</artifactId>
       <version>${hadoop.version}</version>
     </dependency>
diff --git a/demos/src/main/java/com/datatorrent/demos/machinedata/data/AverageData.java b/demos/src/main/java/com/datatorrent/demos/machinedata/data/AverageData.java
index 226b03c..c9f5a33 100644
--- a/demos/src/main/java/com/datatorrent/demos/machinedata/data/AverageData.java
+++ b/demos/src/main/java/com/datatorrent/demos/machinedata/data/AverageData.java
@@ -15,6 +15,7 @@
  */
 package com.datatorrent.demos.machinedata.data;
 
+
 /**
  * This class stores the value of sum and the count of values summed.
  * <p>
@@ -26,7 +27,9 @@
 public class AverageData
 {
 
-  private double sum;
+  private long cpu;
+  private long hdd;
+  private long ram;
   private long count;
 
   /**
@@ -34,40 +37,51 @@
    */
   public AverageData()
   {
-    sum = 0;
-    count = 0;
+
   }
 
   /**
    * This constructor takes the value of sum and count and initialize the local attributes to corresponding values
    * 
-   * @param sum
-   *          the value of sum
    * @param count
    *          the value of count
    */
-  public AverageData(double sum, long count)
+  public AverageData(long cpu,long hdd,long ram, long count)
   {
-    this.sum = sum;
+    this.cpu = cpu;
+    this.ram = ram;
+    this.hdd = hdd;
     this.count = count;
   }
 
-  /**
-   * This returns the value of sum
-   * @return
-   */
-  public double getSum()
+  public long getCpu()
   {
-    return sum;
+    return cpu;
   }
 
-  /**
-   * This method sets the value of sum
-   * @param sum
-   */
-  public void setSum(double sum)
+  public void setCpu(long cpu)
   {
-    this.sum = sum;
+    this.cpu = cpu;
+  }
+
+  public long getHdd()
+  {
+    return hdd;
+  }
+
+  public void setHdd(long hdd)
+  {
+    this.hdd = hdd;
+  }
+
+  public long getRam()
+  {
+    return ram;
+  }
+
+  public void setRam(long ram)
+  {
+    this.ram = ram;
   }
 
   /**
diff --git a/demos/src/main/java/com/datatorrent/demos/machinedata/data/MachineInfo.java b/demos/src/main/java/com/datatorrent/demos/machinedata/data/MachineInfo.java
index 70885d9..f2648b7 100644
--- a/demos/src/main/java/com/datatorrent/demos/machinedata/data/MachineInfo.java
+++ b/demos/src/main/java/com/datatorrent/demos/machinedata/data/MachineInfo.java
@@ -102,7 +102,7 @@
   /**
    * This method sets the CPU% usage
    * 
-   * @param hdd
+   * @param cpu
    *          the CPU% usage
    */
   public void setCpu(int cpu)
@@ -123,7 +123,7 @@
   /**
    * This method sets the RAM% usage
    * 
-   * @param hdd
+   * @param ram
    *          the RAM% usage
    */
   public void setRam(int ram)
diff --git a/demos/src/main/java/com/datatorrent/demos/machinedata/operator/MachineInfoAveragingOperator.java b/demos/src/main/java/com/datatorrent/demos/machinedata/operator/MachineInfoAveragingOperator.java
index d1c1ab8..d4385f2 100644
--- a/demos/src/main/java/com/datatorrent/demos/machinedata/operator/MachineInfoAveragingOperator.java
+++ b/demos/src/main/java/com/datatorrent/demos/machinedata/operator/MachineInfoAveragingOperator.java
@@ -18,22 +18,22 @@
 import com.datatorrent.api.BaseOperator;
 import com.datatorrent.api.DefaultInputPort;
 import com.datatorrent.api.DefaultOutputPort;
+
 import com.datatorrent.demos.machinedata.data.MachineInfo;
 import com.datatorrent.demos.machinedata.data.MachineKey;
 import com.datatorrent.demos.machinedata.data.AverageData;
 import com.datatorrent.demos.machinedata.data.ResourceType;
 import com.datatorrent.lib.util.KeyHashValPair;
 import com.datatorrent.lib.util.KeyValPair;
+
 import com.google.common.collect.Maps;
 
 import java.math.BigDecimal;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 /**
@@ -46,7 +46,12 @@
 public class MachineInfoAveragingOperator extends BaseOperator
 {
 
-  private Map<MachineKey, List<Map<String, AverageData>>> dataMap = new HashMap<MachineKey, List<Map<String, AverageData>>>();
+  public static final String CPU = "cpu";
+  public static final String RAM = "ram";
+  public static final String HDD = "hdd";
+  public static final String DAY = "day";
+
+  private transient Map<MachineKey, AverageData> dataMap = new HashMap<MachineKey, AverageData>();
 
   public final transient DefaultOutputPort<KeyValPair<MachineKey, Map<String, String>>> outputPort = new DefaultOutputPort<KeyValPair<MachineKey, Map<String, String>>>();
 
@@ -55,15 +60,16 @@
   private int threshold = 95;
 
   private boolean genAlert;
-  private transient DateFormat dateFormat = new SimpleDateFormat();
+  //private transient DateFormat dateFormat = new SimpleDateFormat();
 
   /**
    * Buffer all the tuples as is till end window gets called
    */
-  public final transient DefaultInputPort<KeyHashValPair<MachineKey, Map<String, AverageData>>> inputPort = new DefaultInputPort<KeyHashValPair<MachineKey, Map<String, AverageData>>>() {
+  public final transient DefaultInputPort<KeyHashValPair<MachineKey, AverageData>> inputPort = new DefaultInputPort<KeyHashValPair<MachineKey, AverageData>>()
+  {
 
     @Override
-    public void process(KeyHashValPair<MachineKey, Map<String, AverageData>> tuple)
+    public void process(KeyHashValPair<MachineKey, AverageData> tuple)
     {
       addTuple(tuple);
     }
@@ -71,6 +77,7 @@
 
   /**
    * This method returns the threshold value
+   *
    * @return
    */
   public int getThreshold()
@@ -79,7 +86,8 @@
   }
 
   /**
-   * This method sets the threshold value. If the average usage for any Resource is above this for a given key, then the alert is sent 
+   * This method sets the threshold value. If the average usage for any Resource is above this for a given key, then the alert is sent
+   *
    * @param threshold the threshold value
    */
   public void setThreshold(int threshold)
@@ -89,69 +97,52 @@
 
   /**
    * This adds the given tuple to the dataMap
+   *
    * @param tuple input tuple
    */
-  private void addTuple(KeyHashValPair<MachineKey, Map<String, AverageData>> tuple)
+  private void addTuple(KeyHashValPair<MachineKey, AverageData> tuple)
   {
     MachineKey key = tuple.getKey();
-    List<Map<String, AverageData>> list = dataMap.get(key);
-    if (list == null) {
-      list = new ArrayList<Map<String, AverageData>>();
-      dataMap.put(key, list);
-    }
-    list.add(tuple.getValue());
+    dataMap.put(key, tuple.getValue());
   }
 
   @Override
   public void endWindow()
   {
-    for (Map.Entry<MachineKey, List<Map<String, AverageData>>> entry : dataMap.entrySet()) {
+    for (Map.Entry<MachineKey, AverageData> entry : dataMap.entrySet()) {
       MachineKey key = entry.getKey();
-      List<Map<String, AverageData>> list = entry.getValue();
-
-      Map<ResourceType, AverageData> averageResultMap = Maps.newHashMap();
-
-      for (Map<String, AverageData> map : list) {
-        prepareAverageResult(map, ResourceType.CPU, averageResultMap);
-        prepareAverageResult(map, ResourceType.RAM, averageResultMap);
-        prepareAverageResult(map, ResourceType.HDD, averageResultMap);
-      }
+      AverageData averageResultMap = entry.getValue();
       Map<String, String> averageResult = Maps.newHashMap();
-
-      for (Map.Entry<ResourceType, AverageData> dataEntry : averageResultMap.entrySet()) {
-        ResourceType resourceType = dataEntry.getKey();
-        double average = dataEntry.getValue().getSum() / dataEntry.getValue().getCount();
-        averageResult.put(resourceType.toString(), average+"");
-
-        if (average > threshold) {
-          BigDecimal bd = new BigDecimal(average);
-          bd = bd.setScale(2, BigDecimal.ROUND_HALF_UP);
-          String stime = key.getDay()+key.getTimeKey();
-          String skey = getKeyInfo(key);
-
-          smtpAlert.emit(resourceType.toString().toUpperCase() + " alert at " + stime + " " + resourceType + " usage breached current usage: " + bd.doubleValue() + "% threshold: " + threshold + "%\n\n" + skey);
-        }
-      }
-      averageResult.put("day", key.getDay().toString());
+      long count = averageResultMap.getCount();
+      double average = averageResultMap.getCpu() / count;
+      averageResult.put(CPU, average + "");
+      emitAlert(average, CPU, key);
+      average = averageResultMap.getHdd() / count;
+      averageResult.put(HDD, average + "");
+      emitAlert(average, HDD, key);
+      average = averageResultMap.getRam() / count;
+      averageResult.put(RAM, average + "");
+      emitAlert(average, RAM, key);
+      averageResult.put(DAY, key.getDay().toString());
       outputPort.emit(new KeyValPair<MachineKey, Map<String, String>>(key, averageResult));
     }
     dataMap.clear();
   }
 
-  private void prepareAverageResult(Map<String, AverageData> map, ResourceType valueKey, Map<ResourceType, AverageData> averageResultMap)
+  private void emitAlert(double average, String resourceType, MachineKey key)
   {
-    AverageData average = averageResultMap.get(valueKey);
-    if (average == null) {
-      average = new AverageData(map.get(valueKey.toString()).getSum(), map.get(valueKey.toString()).getCount());
-      averageResultMap.put(valueKey, average);
-    } else {
-      average.setSum(average.getSum() + map.get(valueKey.toString()).getSum());
-      average.setCount(average.getCount() + map.get(valueKey.toString()).getCount());
+    if (average > threshold) {
+      BigDecimal bd = new BigDecimal(average);
+      bd = bd.setScale(2, BigDecimal.ROUND_HALF_UP);
+      String stime = key.getDay() + key.getTimeKey();
+      String skey = getKeyInfo(key);
+      smtpAlert.emit(resourceType.toUpperCase() + " alert at " + stime + " " + resourceType + " usage breached current usage: " + bd.doubleValue() + "% threshold: " + threshold + "%\n\n" + skey);
     }
   }
 
   /**
    * This method is used to artificially generate alerts
+   *
    * @param genAlert
    */
   public void setGenAlert(boolean genAlert)
@@ -165,7 +156,7 @@
     DateFormat dayDateFormat = new SimpleDateFormat("dd");
     String day = dayDateFormat.format(date);
 
-    MachineKey alertKey = new MachineKey(timeKey,day);
+    MachineKey alertKey = new MachineKey(timeKey, day);
     alertKey.setCustomer(1);
     alertKey.setProduct(5);
     alertKey.setOs(10);
@@ -186,6 +177,7 @@
 
   /**
    * This method returns the String for a given MachineKey instance
+   *
    * @param key MachineKey instance that needs to be converted to string
    * @return
    */
diff --git a/demos/src/main/java/com/datatorrent/demos/machinedata/operator/MachineInfoAveragingPrerequisitesOperator.java b/demos/src/main/java/com/datatorrent/demos/machinedata/operator/MachineInfoAveragingPrerequisitesOperator.java
index 64bdaaa..e6ef490 100644
--- a/demos/src/main/java/com/datatorrent/demos/machinedata/operator/MachineInfoAveragingPrerequisitesOperator.java
+++ b/demos/src/main/java/com/datatorrent/demos/machinedata/operator/MachineInfoAveragingPrerequisitesOperator.java
@@ -18,9 +18,11 @@
 import com.datatorrent.api.BaseOperator;
 import com.datatorrent.api.DefaultInputPort;
 import com.datatorrent.api.DefaultOutputPort;
+
 import com.datatorrent.demos.machinedata.data.MachineKey;
 import com.datatorrent.demos.machinedata.data.MachineInfo;
 import com.datatorrent.demos.machinedata.data.AverageData;
+import com.datatorrent.lib.math.Average;
 import com.datatorrent.lib.util.KeyHashValPair;
 
 import org.apache.commons.lang.mutable.MutableDouble;
@@ -39,44 +41,36 @@
 {
 
   // Aggregate sum of all values seen for a key.
-  private Map<MachineKey, Map<String, MutableDouble>> sums = new HashMap<MachineKey, Map<String, MutableDouble>>();
+  private Map<MachineKey, AverageData> sums = new HashMap<MachineKey, AverageData>();
 
-  // Count of number of values seen for key.
-  private Map<MachineKey, MutableLong> counts = new HashMap<MachineKey, MutableLong>();
-
-  public final transient DefaultOutputPort<KeyHashValPair<MachineKey, Map<String, AverageData>>> outputPort = new DefaultOutputPort<KeyHashValPair<MachineKey, Map<String, AverageData>>>(){
-    public Unifier<KeyHashValPair<MachineKey,Map<String,AverageData>>> getUnifier() {
+  public final transient DefaultOutputPort<KeyHashValPair<MachineKey, AverageData>> outputPort = new DefaultOutputPort<KeyHashValPair<MachineKey, AverageData>>()
+  {
+    public Unifier<KeyHashValPair<MachineKey, AverageData>> getUnifier()
+    {
       MachineInfoAveragingUnifier unifier = new MachineInfoAveragingUnifier();
       return unifier;
-    };
+    }
+
+    ;
   };
 
-  public transient DefaultInputPort<MachineInfo> inputPort = new DefaultInputPort<MachineInfo>() {
+  public transient DefaultInputPort<MachineInfo> inputPort = new DefaultInputPort<MachineInfo>()
+  {
 
     @Override
     public void process(MachineInfo tuple)
     {
       MachineKey key = tuple.getMachineKey();
-
-      Map<String, MutableDouble> sumsMap = sums.get(key);
-      if (sumsMap == null) {
-        sumsMap = new HashMap<String, MutableDouble>();
-        sumsMap.put("cpu", new MutableDouble(tuple.getCpu()));
-        sumsMap.put("ram", new MutableDouble(tuple.getRam()));
-        sumsMap.put("hdd", new MutableDouble(tuple.getHdd()));
-        sums.put(key, sumsMap);
-      } else {
-        sumsMap.get("cpu").add(tuple.getCpu());
-        sumsMap.get("ram").add(tuple.getRam());
-        sumsMap.get("hdd").add(tuple.getHdd());
+      AverageData averageData = sums.get(key);
+      if (averageData == null) {
+        averageData = new AverageData(tuple.getCpu(), tuple.getHdd(), tuple.getRam(), 1);
+        sums.put(key, averageData);
       }
-
-      MutableLong count = counts.get(key);
-      if (count == null) {
-        count = new MutableLong(1);
-        counts.put(key, count);
-      } else {
-        count.increment();
+      else {
+        averageData.setCpu(averageData.getCpu() + tuple.getCpu());
+        averageData.setRam(averageData.getRam() + tuple.getRam());
+        averageData.setHdd(averageData.getHdd() + tuple.getHdd());
+        averageData.setCount(averageData.getCount() + 1);
       }
     }
   };
@@ -85,22 +79,12 @@
   public void endWindow()
   {
 
-    for (Map.Entry<MachineKey, Map<String, MutableDouble>> entry : sums.entrySet()) {
-
-      Map<String, MutableDouble> sumMap = entry.getValue();
-      long count = counts.get(entry.getKey()).longValue();
-
-      Map<String, AverageData> avg = new HashMap<String, AverageData>();
-      avg.put("cpu", new AverageData(sumMap.get("cpu").doubleValue(), count));
-      avg.put("ram", new AverageData(sumMap.get("ram").doubleValue(), count));
-      avg.put("hdd", new AverageData(sumMap.get("hdd").doubleValue(), count));
-
+    for (Map.Entry<MachineKey, AverageData> entry : sums.entrySet()) {
       if (outputPort.isConnected()) {
-        outputPort.emit(new KeyHashValPair<MachineKey, Map<String, AverageData>>(entry.getKey(), avg));
+        outputPort.emit(new KeyHashValPair<MachineKey, AverageData>(entry.getKey(), entry.getValue()));
       }
     }
     sums.clear();
-    counts.clear();
   }
 
 }
diff --git a/demos/src/main/java/com/datatorrent/demos/machinedata/operator/MachineInfoAveragingUnifier.java b/demos/src/main/java/com/datatorrent/demos/machinedata/operator/MachineInfoAveragingUnifier.java
index 31ea98b..48e1d97 100644
--- a/demos/src/main/java/com/datatorrent/demos/machinedata/operator/MachineInfoAveragingUnifier.java
+++ b/demos/src/main/java/com/datatorrent/demos/machinedata/operator/MachineInfoAveragingUnifier.java
@@ -6,22 +6,22 @@
 import com.datatorrent.api.DefaultOutputPort;
 import com.datatorrent.api.Context.OperatorContext;
 import com.datatorrent.api.Operator.Unifier;
+
 import com.datatorrent.demos.machinedata.data.AverageData;
 import com.datatorrent.demos.machinedata.data.MachineKey;
 import com.datatorrent.lib.util.KeyHashValPair;
 
-
 /**
  * This class calculates the partial sum and count for a given key
  * <p>MachineInfoAveragingUnifier class.</p>
  *
  * @since 0.9.0
  */
-public class MachineInfoAveragingUnifier implements Unifier<KeyHashValPair<MachineKey, Map<String, AverageData>>>
+public class MachineInfoAveragingUnifier implements Unifier<KeyHashValPair<MachineKey, AverageData>>
 {
 
-  private Map<MachineKey, Map<String, AverageData>> sums = new HashMap<MachineKey, Map<String, AverageData>>();
-  public final transient DefaultOutputPort<KeyHashValPair<MachineKey, Map<String, AverageData>>> outputPort = new DefaultOutputPort<KeyHashValPair<MachineKey, Map<String, AverageData>>>();
+  private Map<MachineKey, AverageData> sums = new HashMap<MachineKey, AverageData>();
+  public final transient DefaultOutputPort<KeyHashValPair<MachineKey, AverageData>> outputPort = new DefaultOutputPort<KeyHashValPair<MachineKey, AverageData>>();
 
   @Override
   public void beginWindow(long arg0)
@@ -33,11 +33,11 @@
   @Override
   public void endWindow()
   {
-    for (Map.Entry<MachineKey, Map<String, AverageData>> entry : sums.entrySet()) {
-      outputPort.emit(new KeyHashValPair<MachineKey, Map<String, AverageData>>(entry.getKey(), entry.getValue()));
+    for (Map.Entry<MachineKey, AverageData> entry : sums.entrySet()) {
+      outputPort.emit(new KeyHashValPair<MachineKey, AverageData>(entry.getKey(), entry.getValue()));
     }
     sums.clear();
-  
+
   }
 
   @Override
@@ -55,40 +55,20 @@
   }
 
   @Override
-  public void process(KeyHashValPair<MachineKey, Map<String, AverageData>> arg0)
+  public void process(KeyHashValPair<MachineKey, AverageData> arg0)
   {
     MachineKey tupleKey = arg0.getKey();
-    Map<String, AverageData> sumsMap = sums.get(tupleKey);
-    Map<String, AverageData> tupleValue = arg0.getValue();
-    if (sumsMap == null) {
+    AverageData averageData = sums.get(tupleKey);
+    AverageData tupleValue = arg0.getValue();
+    if (averageData == null) {
       sums.put(tupleKey, tupleValue);
-    } else {
-      updateSum("cpu", sumsMap, tupleValue);
-      updateSum("ram", sumsMap, tupleValue);
-      updateSum("hdd", sumsMap, tupleValue);
     }
-
-  }
-
-  /**
-   * This method updates the sum and count for a given Resource key
-   * @param resourceKey the resource key whose sum and count needs to be updated
-   * @param sumsMap the map that stores the sum and count values
-   * @param tupleMap the new tuple map that is added
-   */
-  private void updateSum(String resourceKey, Map<String, AverageData> sumsMap, Map<String, AverageData> tupleMap)
-  {
-    AverageData sumsAverageData = sumsMap.get(resourceKey);
-    AverageData tupleAverageData = tupleMap.get(resourceKey);
-    if (tupleAverageData != null) {
-      if (sumsAverageData != null) {
-        sumsAverageData.setCount(sumsAverageData.getCount() + tupleAverageData.getCount());
-        sumsAverageData.setSum(sumsAverageData.getSum() + tupleAverageData.getSum());
-      } else {
-        sumsMap.put(resourceKey, tupleAverageData);
-      }
+    else {
+      averageData.setCpu(averageData.getCpu() + tupleValue.getCpu());
+      averageData.setRam(averageData.getRam() + tupleValue.getRam());
+      averageData.setHdd(averageData.getHdd() + tupleValue.getHdd());
+      averageData.setCount(averageData.getCount() + tupleValue.getCount());
     }
-
   }
 
 }
diff --git a/demos/src/main/java/com/datatorrent/demos/mobile/Application.java b/demos/src/main/java/com/datatorrent/demos/mobile/Application.java
index 3beb270..5c2f6bf 100644
--- a/demos/src/main/java/com/datatorrent/demos/mobile/Application.java
+++ b/demos/src/main/java/com/datatorrent/demos/mobile/Application.java
@@ -15,14 +15,12 @@
  */
 package com.datatorrent.demos.mobile;
 
-import com.datatorrent.api.AttributeMap;
+import com.datatorrent.api.*;
 import com.datatorrent.api.Context.OperatorContext;
 import com.datatorrent.api.Context.PortContext;
-import com.datatorrent.api.DAG;
 import com.datatorrent.api.DAG.Locality;
 import com.datatorrent.api.annotation.ApplicationAnnotation;
-import com.datatorrent.api.DAGContext;
-import com.datatorrent.api.StreamingApplication;
+
 import com.datatorrent.lib.io.ConsoleOutputOperator;
 import com.datatorrent.lib.io.PubSubWebSocketInputOperator;
 import com.datatorrent.lib.io.PubSubWebSocketOutputOperator;
@@ -36,6 +34,7 @@
 import org.slf4j.LoggerFactory;
 
 import java.net.URI;
+import java.util.Arrays;
 import java.util.Random;
 
 /**
@@ -159,8 +158,14 @@
     movementGen.setRange(20);
     movementGen.setThreshold(80);
     dag.setAttribute(movementGen, OperatorContext.INITIAL_PARTITION_COUNT, 2);
-    dag.setAttribute(movementGen, OperatorContext.PARTITION_TPS_MIN, 10000);
-    dag.setAttribute(movementGen, OperatorContext.PARTITION_TPS_MAX, 30000);
+    //dag.setAttribute(movementGen, OperatorContext.PARTITION_TPS_MIN, 10000);
+    //dag.setAttribute(movementGen, OperatorContext.PARTITION_TPS_MAX, 30000);
+    ThroughputBasedPartitioner<PhoneMovementGenerator> partitioner = new ThroughputBasedPartitioner<PhoneMovementGenerator>();
+    partitioner.setCooldownMillis(90000);
+    partitioner.setMaximumThroughput(30000);
+    partitioner.setMinimumThroughput(10000);
+    dag.setAttribute(movementGen,OperatorContext.STATS_LISTENERS, Arrays.asList(new StatsListener[]{partitioner}));
+    dag.setAttribute(movementGen,OperatorContext.PARTITIONER, partitioner);
     dag.setInputPortAttribute(movementGen.data, PortContext.QUEUE_CAPACITY, 32 * 1024);
 
     // default partitioning: first connected stream to movementGen will be partitioned
@@ -202,7 +207,7 @@
       movementGen.phone_register.add(5556101);
       ConsoleOutputOperator out = dag.addOperator("phoneLocationQueryResult", new ConsoleOutputOperator());
       out.setStringFormat("phoneLocationQueryResult" + ": %s");
-      dag.addStream("consoledata", movementGen.locationQueryResult, out.input).setLocality(Locality.CONTAINER_LOCAL);
+      dag.addStream("consoledata", movementGen.locationQueryResult, out.input);
     }
   }
 
diff --git a/demos/src/main/java/com/datatorrent/demos/mobile/ThroughputBasedPartitioner.java b/demos/src/main/java/com/datatorrent/demos/mobile/ThroughputBasedPartitioner.java
new file mode 100644
index 0000000..fb756af
--- /dev/null
+++ b/demos/src/main/java/com/datatorrent/demos/mobile/ThroughputBasedPartitioner.java
@@ -0,0 +1,197 @@
+/*
+ * Copyright (c) 2014 DataTorrent, Inc. ALL Rights Reserved.
+ *
+ * Licensed 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.
+ */
+package com.datatorrent.demos.mobile;
+
+import java.io.Serializable;
+import java.util.*;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.collect.Sets;
+
+import com.datatorrent.api.DefaultPartition;
+import com.datatorrent.api.Operator;
+import com.datatorrent.api.Partitioner;
+import com.datatorrent.api.StatsListener;
+
+/**
+ * This does the partition of the operator based on the throughput.
+ * The max and min throughput can be controlled by the properties
+ *
+ * </br>
+ * <b>maximumEvents:</b> The maximum throughput above which the operator will be repartitioned</br>
+ * <b>minimumEvents:</b> The minimum throughput below which the operators will be merged</br>
+ * <b>cooldownMillis:</b> The time for the operators to stabilize before next partitioning if required</br>
+ * <b></b></br>
+ *
+ * @since 1.0.2
+ */
+public class ThroughputBasedPartitioner<T extends Operator> implements StatsListener, Partitioner<T>, Serializable
+{
+  private long maximumEvents;
+  private long minimumEvents;
+  private long cooldownMillis = 2000;
+  private long nextMillis;
+  private long partitionNextMillis;
+
+  @Override
+  public Response processStats(BatchedOperatorStats stats)
+  {
+    Response response = new Response();
+    response.repartitionRequired = false;
+    if (!partitionedInstanceStatus.containsKey(stats.getOperatorId())) {
+      return response;
+    }
+    partitionedInstanceStatus.put(stats.getOperatorId(), stats);
+    if (System.currentTimeMillis() > nextMillis) {
+      if (stats.getTuplesProcessedPSMA() < minimumEvents || stats.getTuplesProcessedPSMA() > maximumEvents) {
+        response.repartitionRequired = true;
+        logger.debug("setting repartition to true");
+      }
+      nextMillis = System.currentTimeMillis() + cooldownMillis;
+    }
+    return response;
+  }
+
+  @Override
+  public Collection<Partition<T>> definePartitions(Collection<Partition<T>> partitions, int incrementalCapacity)
+  {
+    if (partitionedInstanceStatus == null || partitionedInstanceStatus.isEmpty()) {
+      // first call
+      // trying to give initial stability before sending the repartition call
+      if (partitionedInstanceStatus == null) {
+        partitionedInstanceStatus = new HashMap<Integer, BatchedOperatorStats>();
+      }
+      partitionNextMillis = System.currentTimeMillis() + 2 * cooldownMillis;
+      nextMillis = partitionNextMillis;
+      return null;
+    }
+    else {
+      // repartition call
+      logger.debug("repartition call for phone movement operator");
+      if (System.currentTimeMillis() < partitionNextMillis) {
+        return partitions;
+      }
+      BatchedOperatorStats stats;
+      List<Partition<T>> newPartitions = new ArrayList<Partition<T>>();
+      HashMap<Integer, Partition<T>> lowLoadPartitions = new HashMap<Integer, Partition<T>>();
+      for (Partition<T> p : partitions) {
+        int load = 0;
+        stats = p.getStats();
+        if (stats.getTuplesProcessedPSMA() > maximumEvents) {
+          load = 1;
+        }
+        else if (stats.getTuplesProcessedPSMA() < minimumEvents) {
+          load = -1;
+        }
+        if (load < 0) {
+          // combine neighboring underutilized partitions
+          PartitionKeys pks = p.getPartitionKeys().values().iterator().next(); // one port partitioned
+          for (int partitionKey : pks.partitions) {
+            // look for the sibling partition by excluding leading bit
+            int reducedMask = pks.mask >>> 1;
+            String lookupKey = Integer.valueOf(reducedMask) + "-" + Integer.valueOf(partitionKey & reducedMask);
+            logger.debug("pks {} lookupKey {}", pks, lookupKey);
+            Partition<T> siblingPartition = lowLoadPartitions.remove(partitionKey & reducedMask);
+            if (siblingPartition == null) {
+              lowLoadPartitions.put(partitionKey & reducedMask, p);
+            }
+            else {
+              // both of the partitions are low load, combine
+              PartitionKeys newPks = new PartitionKeys(reducedMask, Sets.newHashSet(partitionKey & reducedMask));
+              // put new value so the map gets marked as modified
+              Operator.InputPort<?> port = siblingPartition.getPartitionKeys().keySet().iterator().next();
+              siblingPartition.getPartitionKeys().put(port, newPks);
+              // add as new partition
+              newPartitions.add(siblingPartition);
+              //LOG.debug("partition keys after merge {}", siblingPartition.getPartitionKeys());
+            }
+          }
+        }
+        else if (load > 0) {
+          // split bottlenecks
+          Map<Operator.InputPort<?>, PartitionKeys> keys = p.getPartitionKeys();
+          Map.Entry<Operator.InputPort<?>, PartitionKeys> e = keys.entrySet().iterator().next();
+
+          final int newMask;
+          final Set<Integer> newKeys;
+
+          if (e.getValue().partitions.size() == 1) {
+            // split single key
+            newMask = (e.getValue().mask << 1) | 1;
+            int key = e.getValue().partitions.iterator().next();
+            int key2 = (newMask ^ e.getValue().mask) | key;
+            newKeys = Sets.newHashSet(key, key2);
+          }
+          else {
+            // assign keys to separate partitions
+            newMask = e.getValue().mask;
+            newKeys = e.getValue().partitions;
+          }
+
+          for (int key : newKeys) {
+            Partition<T> newPartition = new DefaultPartition<T>(p.getPartitionedInstance());
+            newPartition.getPartitionKeys().put(e.getKey(), new PartitionKeys(newMask, Sets.newHashSet(key)));
+            newPartitions.add(newPartition);
+          }
+        }
+        else {
+          // leave unchanged
+          newPartitions.add(p);
+        }
+      }
+      // put back low load partitions that could not be combined
+      newPartitions.addAll(lowLoadPartitions.values());
+      partitionNextMillis = System.currentTimeMillis() + cooldownMillis;
+      return newPartitions;
+
+    }
+  }
+
+  @Override
+  public void partitioned(Map<Integer, Partition<T>> partitions)
+  {
+    logger.debug("Partitioned Map: {}", partitions);
+    partitionedInstanceStatus.clear();
+    for (Map.Entry<Integer, Partition<T>> entry : partitions.entrySet()) {
+      if (partitionedInstanceStatus.containsKey(entry.getKey())) {
+      }
+      else {
+        partitionedInstanceStatus.put(entry.getKey(), null);
+      }
+    }
+  }
+
+  public void setMaximumThroughput(long maxEvents)
+  {
+    maximumEvents = maxEvents;
+  }
+
+  public void setMinimumThroughput(long minEvents)
+  {
+    minimumEvents = minEvents;
+  }
+
+  public void setCooldownMillis(long millis)
+  {
+    cooldownMillis = millis;
+  }
+
+  private transient HashMap<Integer, BatchedOperatorStats> partitionedInstanceStatus = new HashMap<Integer, BatchedOperatorStats>();
+
+  private static final Logger logger = LoggerFactory.getLogger(ThroughputBasedPartitioner.class);
+}
diff --git a/demos/src/main/java/com/datatorrent/demos/pi/Application.java b/demos/src/main/java/com/datatorrent/demos/pi/Application.java
index c85fce8..c9199bf 100644
--- a/demos/src/main/java/com/datatorrent/demos/pi/Application.java
+++ b/demos/src/main/java/com/datatorrent/demos/pi/Application.java
@@ -71,7 +71,7 @@
  *
  * @since 0.3.2
  */
-@ApplicationAnnotation(name="PiCalculatorUsingCustomOperatorDemo")
+@ApplicationAnnotation(name="PiDemo")
 public class Application implements StreamingApplication
 {
   private final Locality locality = null;
diff --git a/demos/src/main/java/com/datatorrent/demos/pi/ApplicationWithScript.java b/demos/src/main/java/com/datatorrent/demos/pi/ApplicationWithScript.java
index 0cd96f4..ad92fb2 100644
--- a/demos/src/main/java/com/datatorrent/demos/pi/ApplicationWithScript.java
+++ b/demos/src/main/java/com/datatorrent/demos/pi/ApplicationWithScript.java
@@ -75,7 +75,7 @@
  *
  * @since 0.3.2
  */
-@ApplicationAnnotation(name="PiCalculatorUsingScriptOperatorDemo")
+@ApplicationAnnotation(name="PiJavaScriptDemo")
 public class ApplicationWithScript implements StreamingApplication
 {
 
diff --git a/demos/src/main/java/com/datatorrent/demos/pi/Calculator.java b/demos/src/main/java/com/datatorrent/demos/pi/Calculator.java
index bcb5c11..dfe535f 100644
--- a/demos/src/main/java/com/datatorrent/demos/pi/Calculator.java
+++ b/demos/src/main/java/com/datatorrent/demos/pi/Calculator.java
@@ -37,7 +37,7 @@
  *
  * @since 0.3.2
  */
-@ApplicationAnnotation(name="PiCalculatorUsingLibraryOperatorsDemo")
+@ApplicationAnnotation(name="PiLibraryDemo")
 public class Calculator implements StreamingApplication
 {
   private final Locality locality = null;
diff --git a/demos/src/main/java/com/datatorrent/demos/twitter/TwitterDumpHBaseApplication.java b/demos/src/main/java/com/datatorrent/demos/twitter/TwitterDumpHBaseApplication.java
index fd3bf40..f29688c 100644
--- a/demos/src/main/java/com/datatorrent/demos/twitter/TwitterDumpHBaseApplication.java
+++ b/demos/src/main/java/com/datatorrent/demos/twitter/TwitterDumpHBaseApplication.java
@@ -36,9 +36,9 @@
 /**
  * An application which connects to Twitter Sample Input and stores all the
  * tweets with their usernames in a hbase database. Please review the docs
- * for TwitterTopCounterApplication to setup your twitter credentials. 
+ * for TwitterTopCounterApplication to setup your twitter credentials.
  *
- * You need to create the HBase table to run this demo. Table name can be 
+ * You need to create the HBase table to run this demo. Table name can be
  * configured but columnfamily must be 'cf' to make this demo simple and complied
  * with the mysql based demo.
  * create 'tablename', 'cf'
diff --git a/demos/src/main/java/com/datatorrent/demos/twitter/TwitterStatusHashtagExtractor.java b/demos/src/main/java/com/datatorrent/demos/twitter/TwitterStatusHashtagExtractor.java
new file mode 100644
index 0000000..0dcb25b
--- /dev/null
+++ b/demos/src/main/java/com/datatorrent/demos/twitter/TwitterStatusHashtagExtractor.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2014 DataTorrent, Inc. ALL Rights Reserved.
+ *
+ * Licensed 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.
+ */
+package com.datatorrent.demos.twitter;
+
+import twitter4j.HashtagEntity;
+import twitter4j.Status;
+
+import com.datatorrent.api.BaseOperator;
+import com.datatorrent.api.DefaultInputPort;
+import com.datatorrent.api.DefaultOutputPort;
+
+/**
+ * <p>TwitterStatusHashtagExtractor class.</p>
+ *
+ * @since 1.0.2
+ */
+public class TwitterStatusHashtagExtractor extends BaseOperator
+{
+  public final transient DefaultOutputPort<String> hashtags = new DefaultOutputPort<String>();
+  public final transient DefaultInputPort<Status> input = new DefaultInputPort<Status>()
+  {
+    @Override
+    public void process(Status status)
+    {
+      HashtagEntity[] entities = status.getHashtagEntities();
+      if (entities != null) {
+        for (HashtagEntity he : entities) {
+          if (he != null) {
+            hashtags.emit(he.getText());
+          }
+        }
+      }
+    }
+
+  };
+}
diff --git a/demos/src/main/java/com/datatorrent/demos/twitter/TwitterTrendingHashtagsApplication.java b/demos/src/main/java/com/datatorrent/demos/twitter/TwitterTrendingHashtagsApplication.java
new file mode 100644
index 0000000..13fa0e4
--- /dev/null
+++ b/demos/src/main/java/com/datatorrent/demos/twitter/TwitterTrendingHashtagsApplication.java
@@ -0,0 +1,195 @@
+/*
+ * Copyright (c) 2014 DataTorrent, Inc. ALL Rights Reserved.
+ *
+ * Licensed 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.
+ */
+package com.datatorrent.demos.twitter;
+
+import java.net.URI;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.hadoop.conf.Configuration;
+
+import com.datatorrent.lib.algo.UniqueCounter;
+import com.datatorrent.lib.io.ConsoleOutputOperator;
+import com.datatorrent.lib.io.PubSubWebSocketOutputOperator;
+
+import com.datatorrent.contrib.twitter.TwitterSampleInput;
+
+import com.datatorrent.api.DAG;
+import com.datatorrent.api.DAG.Locality;
+import com.datatorrent.api.Operator.InputPort;
+import com.datatorrent.api.StreamingApplication;
+import com.datatorrent.api.annotation.ApplicationAnnotation;
+
+import com.datatorrent.demos.rollingtopwords.WindowedTopCounter;
+
+/**
+ * Twitter Demo Application: <br>
+ * This demo application samples random public status from twitter, send to Hashtag
+ * extractor. <br>
+ * Top 10 Hashtag(s) mentioned in tweets in last 5 mins are displayed on every
+ * window count (500ms).<br>
+ * <br>
+ *
+ * Real Time Calculation :<br>
+ * This application calculates top 10 Hashtag mentioned in tweets in last 5
+ * minutes across a 1% random tweet sampling on a rolling window basis.<br>
+ * <br>
+ * Before running this application, you need to have a <a href="https://dev.twitter.com/apps">Twitter API account</a>
+ * and configure the authentication. For launch from CLI, those go into ~/.dt/dt-site.xml:
+ * <pre>
+ * {@code
+ * <?xml version="1.0" encoding="UTF-8"?>
+ * <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
+ * <configuration>
+ *
+ *   <property> <name>dt.operator.TweetSampler.prop.consumerKey</name>
+ *   <value>TBD</value> </property>
+ *
+ *   <property> <name>dt.operator.TweetSampler.prop.consumerSecret</name>
+ *   <value>TBD</value> </property>
+ *
+ *   <property> <name>dt.operator.TweetSampler.prop.accessToken</name>
+ *   <value>TBD</value> </property>
+ *
+ *   <property> <name>dt.operator.TweetSampler.prop.accessTokenSecret</name>
+ *   <value>TBD</value> </property>
+ * </configuration>
+ * }
+ * </pre>
+ * Custom Attributes: <br>
+ * <b>topCounts operator : <b>
+ * <ul>
+ * <li>Top Count : 10, number of top unique Hashtag to be reported.</li>
+ * <li>Sliding window count : 600, report over last 5 min (600 * .5 / 60 mins)</li>
+ * <li>window slide value : 1</li>
+ * </ul>
+ * <p>
+ * Running Java Test or Main app in IDE:
+ *
+ * <pre>
+ * LocalMode.runApp(new Application(), 600000); // 10 min run
+ * </pre>
+ *
+ * Run Success : <br>
+ * For successful deployment and run, user should see similar output on console as below:
+ *
+ * <pre>
+ * topHashtags: {"string": "{\"gameinsight\":\"12\",\"android\":\"8\",\"WotaJKT48alay\":\"12\",\"TernyataJKT48CyberItuForoumSampah\":\"8\",\"NHL15Subban\":\"30\",\"JKT48CYBERKeracunanCUKRIK\":\"8\",\"verifydjzoodel\":\"59\",\"androidgames\":\"9\",\"مع_الله\":\"10\",\"Jct48cyberTAIBABI\":\"10\"}"}
+ * topHashtags: {"string": "{\"gameinsight\":\"12\",\"android\":\"8\",\"WotaJKT48alay\":\"12\",\"TernyataJKT48CyberItuForoumSampah\":\"8\",\"NHL15Subban\":\"30\",\"JKT48CYBERKeracunanCUKRIK\":\"8\",\"verifydjzoodel\":\"59\",\"androidgames\":\"9\",\"مع_الله\":\"10\",\"Jct48cyberTAIBABI\":\"10\"}"}
+ * topHashtags: {"string": "{\"gameinsight\":\"12\",\"android\":\"8\",\"WotaJKT48alay\":\"12\",\"TernyataJKT48CyberItuForoumSampah\":\"8\",\"NHL15Subban\":\"30\",\"JKT48CYBERKeracunanCUKRIK\":\"8\",\"verifydjzoodel\":\"59\",\"androidgames\":\"9\",\"مع_الله\":\"10\",\"Jct48cyberTAIBABI\":\"10\"}"}
+ * topHashtags: {"string": "{\"gameinsight\":\"12\",\"android\":\"8\",\"WotaJKT48alay\":\"12\",\"TernyataJKT48CyberItuForoumSampah\":\"8\",\"NHL15Subban\":\"30\",\"JKT48CYBERKeracunanCUKRIK\":\"8\",\"verifydjzoodel\":\"59\",\"androidgames\":\"9\",\"مع_الله\":\"10\",\"Jct48cyberTAIBABI\":\"10\"}"}
+ * topHashtags: {"string": "{\"gameinsight\":\"12\",\"android\":\"8\",\"WotaJKT48alay\":\"12\",\"TernyataJKT48CyberItuForoumSampah\":\"8\",\"NHL15Subban\":\"30\",\"JKT48CYBERKeracunanCUKRIK\":\"8\",\"verifydjzoodel\":\"59\",\"androidgames\":\"9\",\"مع_الله\":\"10\",\"Jct48cyberTAIBABI\":\"10\"}"}
+ * topHashtags: {"string": "{\"gameinsight\":\"12\",\"android\":\"8\",\"WotaJKT48alay\":\"12\",\"TernyataJKT48CyberItuForoumSampah\":\"8\",\"NHL15Subban\":\"30\",\"JKT48CYBERKeracunanCUKRIK\":\"8\",\"verifydjzoodel\":\"59\",\"androidgames\":\"9\",\"مع_الله\":\"10\",\"Jct48cyberTAIBABI\":\"10\"}"}
+ * topHashtags: {"string": "{\"gameinsight\":\"12\",\"android\":\"8\",\"WotaJKT48alay\":\"12\",\"TernyataJKT48CyberItuForoumSampah\":\"8\",\"NHL15Subban\":\"30\",\"JKT48CYBERKeracunanCUKRIK\":\"8\",\"verifydjzoodel\":\"59\",\"androidgames\":\"9\",\"مع_الله\":\"10\",\"Jct48cyberTAIBABI\":\"10\"}"}
+ * topHashtags: {"string": "{\"gameinsight\":\"12\",\"android\":\"8\",\"WotaJKT48alay\":\"12\",\"TernyataJKT48CyberItuForoumSampah\":\"8\",\"NHL15Subban\":\"30\",\"JKT48CYBERKeracunanCUKRIK\":\"8\",\"verifydjzoodel\":\"59\",\"androidgames\":\"9\",\"مع_الله\":\"10\",\"Jct48cyberTAIBABI\":\"10\"}"}
+ * topHashtags: {"string": "{\"gameinsight\":\"12\",\"android\":\"8\",\"WotaJKT48alay\":\"12\",\"TernyataJKT48CyberItuForoumSampah\":\"8\",\"NHL15Subban\":\"30\",\"JKT48CYBERKeracunanCUKRIK\":\"8\",\"verifydjzoodel\":\"59\",\"androidgames\":\"9\",\"مع_الله\":\"10\",\"Jct48cyberTAIBABI\":\"10\"}"}
+ * topHashtags: {"string": "{\"gameinsight\":\"12\",\"android\":\"8\",\"WotaJKT48alay\":\"12\",\"TernyataJKT48CyberItuForoumSampah\":\"8\",\"NHL15Subban\":\"30\",\"JKT48CYBERKeracunanCUKRIK\":\"8\",\"verifydjzoodel\":\"59\",\"androidgames\":\"9\",\"مع_الله\":\"10\",\"Jct48cyberTAIBABI\":\"10\"}"}
+ * 2013-06-17 14:38:55,201 [main] INFO  stram.StramLocalCluster run - Application finished.
+ * 2013-06-17 14:38:55,201 [container-2] INFO  stram.StramChild processHeartbeatResponse - Received shutdown request
+ * </pre>
+ *
+ * Scaling Options : <br>
+ * User can scale application by setting intial partition size > 1 on count
+ * unique operator. <br>
+ * <br>
+ *
+ * Application DAG : <br>
+ * <img src="doc-files/Application.gif" width=600px > <br>
+ * <br>
+ *
+ * Streaming Window Size : 500ms(default) <br>
+ * Operator Details : <br>
+ * <ul>
+ * <li><b>The twitterFeed operator : </b> This operator samples random public
+ * statues from twitter and emits to application. <br>
+ * Class : com.datatorrent.demos.twitter.TwitterSampleInput <br>
+ * StateFull : No, window count 1 <br>
+ * </li>
+ * <li><b>The HashtagExtractor operator : </b> This operator extracts Hashtag from
+ * random sampled statues from twitter. <br>
+ * Class : {@link com.datatorrent.demos.twitter.TwitterStatusHashtagExtractor} <br>
+ * StateFull : No, window count 1 <br>
+ * </li>
+ * <li><b>The uniqueCounter operator : </b> This operator aggregates count for each
+ * Hashtag extracted from random samples. <br>
+ * Class : {@link com.datatorrent.lib.algo.UniqueCounter} <br>
+ * StateFull : No, window count 1 <br>
+ * </li>
+ * <li><b> The topCounts operator : </b> This operator caluculates top Hashtag in last 1
+ * min sliding window count 1. <br>
+ * Class : com.datatorrent.lib.algo.WindowedTopCounter <br>
+ * StateFull : Yes, sliding window count 120 (1 min) <br>
+ * </li>
+ * <li><b>The operator Console: </b> This operator just outputs the input tuples
+ * to the console (or stdout). <br>
+ * </li>
+ * </ul>
+ *
+ * @since 1.0.2
+ */
+@ApplicationAnnotation(name="TwitterTrendingDemo")
+public class TwitterTrendingHashtagsApplication implements StreamingApplication
+{
+  private final Locality locality = null;
+
+  private InputPort<Object> consoleOutput(DAG dag, String operatorName)
+  {
+    String gatewayAddress = dag.getValue(DAG.GATEWAY_CONNECT_ADDRESS);
+    if (!StringUtils.isEmpty(gatewayAddress)) {
+      URI uri = URI.create("ws://" + gatewayAddress + "/pubsub");
+      String topic = "demos.twitter." + operatorName;
+      //LOG.info("WebSocket with gateway at: {}", gatewayAddress);
+      PubSubWebSocketOutputOperator<Object> wsOut = dag.addOperator(operatorName, new PubSubWebSocketOutputOperator<Object>());
+      wsOut.setUri(uri);
+      wsOut.setTopic(topic);
+      return wsOut.input;
+    }
+    ConsoleOutputOperator operator = dag.addOperator(operatorName, new ConsoleOutputOperator());
+    operator.setStringFormat(operatorName + ": %s");
+    return operator.input;
+  }
+
+  @Override
+  public void populateDAG(DAG dag, Configuration conf)
+  {
+    dag.setAttribute(DAG.APPLICATION_NAME, "TwitterTrendingHashtagsApplication");
+
+    // Setup the operator to get the data from twitter sample stream injected into the system.
+    TwitterSampleInput twitterFeed = new TwitterSampleInput();
+    twitterFeed = dag.addOperator("TweetSampler", twitterFeed);
+
+    //  Setup the operator to get the Hashtags extracted from the twitter statuses
+    TwitterStatusHashtagExtractor HashtagExtractor = dag.addOperator("HashtagExtractor", TwitterStatusHashtagExtractor.class);
+
+    // Setup a node to count the unique Hashtags within a window.
+    UniqueCounter<String> uniqueCounter = dag.addOperator("UniqueHashtagCounter", new UniqueCounter<String>());
+
+    // Get the aggregated Hashtag counts and count them over last 5 mins.
+    WindowedTopCounter<String> topCounts = dag.addOperator("TopCounter", new WindowedTopCounter<String>());
+    topCounts.setTopCount(10);
+    topCounts.setSlidingWindowWidth(600, 1);
+
+    // Feed the statuses from feed into the input of the Hashtag extractor.
+    dag.addStream("TweetStream", twitterFeed.status, HashtagExtractor.input).setLocality(Locality.CONTAINER_LOCAL);
+    //  Start counting the Hashtags coming out of Hashtag extractor
+    dag.addStream("TwittedHashtags", HashtagExtractor.hashtags, uniqueCounter.data).setLocality(locality);
+    // Count unique Hashtags
+    dag.addStream("UniqueHashtagCounts", uniqueCounter.count, topCounts.input).setLocality(locality);
+    // Count top 10
+    dag.addStream("TopHashtags", topCounts.output, consoleOutput(dag, "topHashtags")).setLocality(locality);
+
+  }
+
+}
diff --git a/demos/src/main/java/com/datatorrent/demos/uniquecountdemo/Application.java b/demos/src/main/java/com/datatorrent/demos/uniquecountdemo/Application.java
index 775f411..9bfe29b 100644
--- a/demos/src/main/java/com/datatorrent/demos/uniquecountdemo/Application.java
+++ b/demos/src/main/java/com/datatorrent/demos/uniquecountdemo/Application.java
@@ -32,6 +32,8 @@
  * PartitionableUniqueCount operator initially partitioned into three partitions to
  * test unifier functionality, and output of the operator is sent to verifier to verify
  * that it generates correct result.
+ *
+ * @since 1.0.2
  */
 @ApplicationAnnotation(name="UniqueValueCountDemo")
 public class Application implements StreamingApplication
diff --git a/demos/src/main/java/com/datatorrent/demos/uniquecountdemo/CountVerifier.java b/demos/src/main/java/com/datatorrent/demos/uniquecountdemo/CountVerifier.java
index 4c98b55..b04d6ec 100644
--- a/demos/src/main/java/com/datatorrent/demos/uniquecountdemo/CountVerifier.java
+++ b/demos/src/main/java/com/datatorrent/demos/uniquecountdemo/CountVerifier.java
@@ -28,6 +28,11 @@
 /*
 Compare results and print non-matching values to console.
  */
+/**
+ * <p>CountVerifier class.</p>
+ *
+ * @since 1.0.2
+ */
 public class CountVerifier<K> implements Operator
 {
   HashMap<K, Integer> map1 = new HashMap<K, Integer>();
diff --git a/demos/src/main/java/com/datatorrent/demos/uniquecountdemo/RandomDataGenerator.java b/demos/src/main/java/com/datatorrent/demos/uniquecountdemo/RandomDataGenerator.java
index fc5f053..98f2879 100644
--- a/demos/src/main/java/com/datatorrent/demos/uniquecountdemo/RandomDataGenerator.java
+++ b/demos/src/main/java/com/datatorrent/demos/uniquecountdemo/RandomDataGenerator.java
@@ -26,6 +26,8 @@
 /**
  * Generate random Key value pairs.
  * key is string and value is int, it emits the pair as KeyValPair on outPort,
+ *
+ * @since 1.0.2
  */
 public class RandomDataGenerator implements InputOperator
 {
diff --git a/demos/src/main/java/com/datatorrent/demos/uniquecountdemo/RandomKeyValues.java b/demos/src/main/java/com/datatorrent/demos/uniquecountdemo/RandomKeyValues.java
index 2cb5c39..75a9a80 100644
--- a/demos/src/main/java/com/datatorrent/demos/uniquecountdemo/RandomKeyValues.java
+++ b/demos/src/main/java/com/datatorrent/demos/uniquecountdemo/RandomKeyValues.java
@@ -29,6 +29,7 @@
  * Input port operator for generating random values on keys. <br>
  * Key(s)   : key + integer in range between 0 and numKeys <br>
  * Value(s) : integer in range of 0 to numValuesPerKeys <br>
+ *
  * @since 0.9.3
  */
 public class RandomKeyValues implements InputOperator
diff --git a/demos/src/main/java/com/datatorrent/demos/uniquecountdemo/RandomKeysGenerator.java b/demos/src/main/java/com/datatorrent/demos/uniquecountdemo/RandomKeysGenerator.java
index 4911607..16e34bf 100644
--- a/demos/src/main/java/com/datatorrent/demos/uniquecountdemo/RandomKeysGenerator.java
+++ b/demos/src/main/java/com/datatorrent/demos/uniquecountdemo/RandomKeysGenerator.java
@@ -27,6 +27,11 @@
 /*
     Generate random keys.
  */
+/**
+ * <p>RandomKeysGenerator class.</p>
+ *
+ * @since 1.0.2
+ */
 public class RandomKeysGenerator implements InputOperator
 {
 
diff --git a/demos/src/main/java/com/datatorrent/demos/uniquecountdemo/UniqueKeyValCountDemo.java b/demos/src/main/java/com/datatorrent/demos/uniquecountdemo/UniqueKeyValCountDemo.java
index 4cf5179..9b442e6 100644
--- a/demos/src/main/java/com/datatorrent/demos/uniquecountdemo/UniqueKeyValCountDemo.java
+++ b/demos/src/main/java/com/datatorrent/demos/uniquecountdemo/UniqueKeyValCountDemo.java
@@ -24,6 +24,11 @@
 import com.datatorrent.lib.util.KeyValPair;
 import org.apache.hadoop.conf.Configuration;
 
+/**
+ * <p>UniqueKeyValCountDemo class.</p>
+ *
+ * @since 1.0.2
+ */
 @ApplicationAnnotation(name="UniqueKeyValueCountDemo")
 public class UniqueKeyValCountDemo implements StreamingApplication
 {
diff --git a/library/pom.xml b/library/pom.xml
index c6d1ca2..22ca16b 100644
--- a/library/pom.xml
+++ b/library/pom.xml
@@ -6,7 +6,7 @@
   <parent>
     <groupId>com.datatorrent</groupId>
     <artifactId>malhar-all</artifactId>
-    <version>1.0.2-SNAPSHOT</version>
+    <version>1.0.2</version>
   </parent>
 
   <artifactId>malhar-library</artifactId>
@@ -109,37 +109,6 @@
       <version>1.5.0</version>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>dt-api</artifactId>
-      <version>${dt.framework.version}</version>
-      <exclusions>
-        <exclusion>
-          <groupId>org.mortbay.jetty</groupId>
-          <artifactId>jetty</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.mortbay.jetty</groupId>
-          <artifactId>jetty-util</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.codehaus.jackson</groupId>
-          <artifactId>jackson-core-asl</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.codehaus.jackson</groupId>
-          <artifactId>jackson-mapper-asl</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.codehaus.jackson</groupId>
-          <artifactId>jackson-jaxrs</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.codehaus.jackson</groupId>
-          <artifactId>jackson-xc</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
       <groupId>com.sun.jersey</groupId>
       <artifactId>jersey-client</artifactId>
       <version>${jersey.version}</version>
diff --git a/library/src/main/java/com/datatorrent/lib/algo/PartitionableUniqueCount.java b/library/src/main/java/com/datatorrent/lib/algo/PartitionableUniqueCount.java
index c716928..dcac587 100644
--- a/library/src/main/java/com/datatorrent/lib/algo/PartitionableUniqueCount.java
+++ b/library/src/main/java/com/datatorrent/lib/algo/PartitionableUniqueCount.java
@@ -25,6 +25,11 @@
 import java.util.HashMap;
 import java.util.Map;
 
+/**
+ * <p>PartitionableUniqueCount class.</p>
+ *
+ * @since 1.0.2
+ */
 public class PartitionableUniqueCount<K> extends BaseUniqueKeyCounter<K>
 {
 
diff --git a/library/src/main/java/com/datatorrent/lib/bucket/BucketManager.java b/library/src/main/java/com/datatorrent/lib/bucket/BucketManager.java
index dfecf1d..4d40003 100644
--- a/library/src/main/java/com/datatorrent/lib/bucket/BucketManager.java
+++ b/library/src/main/java/com/datatorrent/lib/bucket/BucketManager.java
@@ -21,8 +21,9 @@
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import com.datatorrent.api.Context;
-import java.io.Serializable;
+import org.apache.commons.lang.mutable.MutableLong;
+
+import com.datatorrent.lib.counters.BasicCounters;
 
 /**
  * <p>
@@ -116,7 +117,7 @@
    * Adds the event to the un-written section of the bucket corresponding to the bucket key.
    *
    * @param bucketKey key of the bucket.
-   * @param event new event.
+   * @param event     new event.
    */
   void newEvent(long bucketKey, T event);
 
@@ -142,22 +143,23 @@
    */
   BucketManager<T> cloneWithProperties();
 
-  void setBucketCounters(@Nonnull BucketCounters stats);
+  void setBucketCounters(@Nonnull BasicCounters<MutableLong> stats);
 
   /**
    * Collects the un-written events of all the old managers and distributes the data to the new managers.<br/>
    * The partition to which an event belongs to depends on the event key.
    * <pre><code>partition = eventKey.hashCode() & partitionMask</code></pre>
    *
-   * @param oldManagers {@link BucketManager}s of all old partitions.
+   * @param oldManagers             {@link BucketManager}s of all old partitions.
    * @param partitionKeysToManagers mapping of partition keys to {@link BucketManager}s of new partitions.
-   * @param partitionMask partition mask to find which partition an event belongs to.
+   * @param partitionMask           partition mask to find which partition an event belongs to.
    */
   void definePartitions(List<BucketManager<T>> oldManagers, Map<Integer, BucketManager<T>> partitionKeysToManagers,
-          int partitionMask);
+                        int partitionMask);
 
   /**
    * Callback interface for {@link BucketManager} for load and off-load operations.
+   *
    * @param <T> Type of the values which can be bucketed.
    */
   public static interface Listener<T extends Bucketable>
@@ -179,58 +181,10 @@
 
   }
 
-  public static class BucketCounters implements Context.Counters, Serializable
+  public static enum CounterKeys
   {
-    protected int numBucketsInMemory;
-    protected int numEvictedBuckets;
-    protected int numDeletedBuckets;
-    protected long numEventsCommittedPerWindow;
-    protected long numEventsInMemory;
-    protected long numIgnoredEvents;
-    protected long low;
-    protected long high;
 
-    public int getNumBucketsInMemory()
-    {
-      return numBucketsInMemory;
-    }
-
-    public int getNumEvictedBuckets()
-    {
-      return numEvictedBuckets;
-    }
-
-    public int getNumDeletedBuckets()
-    {
-      return numDeletedBuckets;
-    }
-
-    public long getNumEventsCommittedPerWindow()
-    {
-      return numEventsCommittedPerWindow;
-    }
-
-    public long getNumEventsInMemory()
-    {
-      return numEventsInMemory;
-    }
-
-    public long getNumIgnoredEvents()
-    {
-      return numIgnoredEvents;
-    }
-
-    public long getLow()
-    {
-      return low;
-    }
-
-    public long getHigh()
-    {
-      return high;
-    }
-
-    private static final long serialVersionUID = 201405191248L;
+    BUCKETS_IN_MEMORY, EVICTED_BUCKETS, DELETED_BUCKETS, EVENTS_COMMITTED_LAST_WINDOW,
+    EVENTS_IN_MEMORY
   }
-
 }
diff --git a/library/src/main/java/com/datatorrent/lib/bucket/BucketManagerImpl.java b/library/src/main/java/com/datatorrent/lib/bucket/BucketManagerImpl.java
index bcb4e12..3bcc5e5 100644
--- a/library/src/main/java/com/datatorrent/lib/bucket/BucketManagerImpl.java
+++ b/library/src/main/java/com/datatorrent/lib/bucket/BucketManagerImpl.java
@@ -28,6 +28,7 @@
 import javax.annotation.Nonnull;
 import javax.validation.constraints.Min;
 
+import org.apache.commons.lang.mutable.MutableLong;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -37,6 +38,7 @@
 import com.google.common.collect.Sets;
 
 import com.datatorrent.common.util.DTThrowable;
+import com.datatorrent.lib.counters.BasicCounters;
 
 /**
  * A {@link BucketManager} implementation.
@@ -105,7 +107,13 @@
   private transient final Lock lock;
   @Nonnull
   private transient final MinMaxPriorityQueue<Bucket<T>> bucketHeap;
-  protected transient BucketCounters bucketCounters;
+
+  protected transient boolean count;
+  protected transient MutableLong numBucketsInMemory;
+  protected transient MutableLong numEvictedBuckets;
+  protected transient MutableLong numDeletedBuckets;
+  protected transient MutableLong numEventsCommittedLastWindow;
+  protected transient MutableLong numEventsInMemory;
 
   public BucketManagerImpl()
   {
@@ -181,10 +189,23 @@
     this.writeEventKeysOnly = writeEventKeysOnly;
   }
 
-  @Nonnull
-  public void setBucketCounters(@Nonnull BucketCounters bucketCounters)
+  @Override
+  public void setBucketCounters(@Nonnull BasicCounters<MutableLong> bucketCounters)
   {
-    this.bucketCounters = bucketCounters;
+    try {
+      numBucketsInMemory = bucketCounters.findCounter(CounterKeys.BUCKETS_IN_MEMORY);
+      numEvictedBuckets = bucketCounters.findCounter(CounterKeys.EVICTED_BUCKETS);
+      numDeletedBuckets = bucketCounters.findCounter(CounterKeys.DELETED_BUCKETS);
+      numEventsCommittedLastWindow = bucketCounters.findCounter(CounterKeys.EVENTS_COMMITTED_LAST_WINDOW);
+      numEventsInMemory = bucketCounters.findCounter(CounterKeys.EVENTS_IN_MEMORY);
+      count = true;
+    }
+    catch (IllegalAccessException e) {
+      throw new RuntimeException(e);
+    }
+    catch (InstantiationException e) {
+      throw new RuntimeException(e);
+    }
   }
 
   @Override
@@ -227,9 +248,9 @@
 
               listener.bucketOffLoaded(oldBucket.bucketKey);
               bucketStore.deleteBucket(bucketIdx);
-              if (bucketCounters != null) {
-                bucketCounters.numDeletedBuckets++;
-                bucketCounters.numBucketsInMemory--;
+              if (count) {
+                numDeletedBuckets.increment();
+                numBucketsInMemory.decrement();
                 numEventsRemoved += oldBucket.countOfUnwrittenEvents() + oldBucket.countOfWrittenEvents();
               }
               logger.debug("deleted bucket {} {}", oldBucket.bucketKey, bucketIdx);
@@ -261,9 +282,9 @@
                 evictionCandidates.remove(lruIdx);
                 buckets[lruIdx] = null;
                 listener.bucketOffLoaded(lruBucket.bucketKey);
-                if (bucketCounters != null) {
-                  bucketCounters.numEvictedBuckets++;
-                  bucketCounters.numBucketsInMemory--;
+                if (count) {
+                  numEvictedBuckets.increment();
+                  numBucketsInMemory.decrement();
                   numEventsRemoved += lruBucket.countOfUnwrittenEvents() + lruBucket.countOfWrittenEvents();
                 }
                 logger.debug("evicted bucket {} {}", lruBucket.bucketKey, lruIdx);
@@ -278,12 +299,9 @@
             bucket.setWrittenEvents(bucketDataInStore);
             evictionCandidates.add(bucketIdx);
             listener.bucketLoaded(bucket);
-            if (bucketCounters != null) {
-              synchronized (bucketCounters) {
-                bucketCounters.numBucketsInMemory++;
-                bucketCounters.numEventsInMemory -= numEventsRemoved;
-                bucketCounters.numEventsInMemory += bucketDataInStore.size();
-              }
+            if (count) {
+              numBucketsInMemory.increment();
+              numEventsInMemory.add(bucketDataInStore.size() - numEventsRemoved);
             }
             bucketHeap.clear();
           }
@@ -359,10 +377,8 @@
     }
 
     bucket.addNewEvent(event.getEventKey(), writeEventKeysOnly ? null : event);
-    if (bucketCounters != null) {
-      synchronized (bucketCounters) {
-        bucketCounters.numEventsInMemory++;
-      }
+    if (count) {
+      numEventsInMemory.increment();
     }
   }
 
@@ -383,8 +399,8 @@
       bucket.transferDataFromMemoryToStore();
       evictionCandidates.add(entry.getKey());
     }
-    if (bucketCounters != null) {
-      bucketCounters.numEventsCommittedPerWindow = eventsCount;
+    if (count) {
+      numEventsCommittedLastWindow.setValue(eventsCount);
     }
     try {
       if (!dataToStore.isEmpty()) {
@@ -476,7 +492,8 @@
       return false;
     }
 
-    BucketManagerImpl that = (BucketManagerImpl) o;
+    @SuppressWarnings("unchecked")
+    BucketManagerImpl<T> that = (BucketManagerImpl<T>) o;
 
     if (committedWindow != that.committedWindow) {
       return false;
diff --git a/library/src/main/java/com/datatorrent/lib/bucket/TimeBasedBucketManagerImpl.java b/library/src/main/java/com/datatorrent/lib/bucket/TimeBasedBucketManagerImpl.java
index 047bada..0d69b60 100644
--- a/library/src/main/java/com/datatorrent/lib/bucket/TimeBasedBucketManagerImpl.java
+++ b/library/src/main/java/com/datatorrent/lib/bucket/TimeBasedBucketManagerImpl.java
@@ -23,11 +23,14 @@
 import javax.annotation.Nonnull;
 import javax.validation.constraints.Min;
 
+import org.apache.commons.lang.mutable.MutableLong;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Preconditions;
 
+import com.datatorrent.lib.counters.BasicCounters;
+
 /**
  * A {@link BucketManager} that creates buckets based on time.<br/>
  *
@@ -51,6 +54,10 @@
   private transient Timer bucketSlidingTimer;
   private final transient Lock lock;
 
+  private transient MutableLong low;
+  private transient MutableLong high;
+  private transient MutableLong numIgnoredEvents;
+
   public TimeBasedBucketManagerImpl()
   {
     super();
@@ -101,7 +108,8 @@
     recomputeNumBuckets();
   }
 
-  private void recomputeNumBuckets(){
+  private void recomputeNumBuckets()
+  {
     Calendar calendar = Calendar.getInstance();
     long now = calendar.getTimeInMillis();
     calendar.add(Calendar.DATE, -daysSpan);
@@ -116,6 +124,23 @@
   }
 
   @Override
+  public void setBucketCounters(@Nonnull BasicCounters<MutableLong> bucketCounters)
+  {
+    super.setBucketCounters(bucketCounters);
+    try {
+      low = bucketCounters.findCounter(CounterKeys.LOW);
+      high = bucketCounters.findCounter(CounterKeys.HIGH);
+      numIgnoredEvents = bucketCounters.findCounter(CounterKeys.IGNORED_EVENTS);
+    }
+    catch (IllegalAccessException e) {
+      throw new RuntimeException(e);
+    }
+    catch (InstantiationException e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  @Override
   public void startService(Listener<T> listener)
   {
     bucketSlidingTimer = new Timer();
@@ -132,9 +157,9 @@
         synchronized (lock) {
           time = (expiryTime += bucketSpanInMillis);
           endOBucketsInMillis += bucketSpanInMillis;
-          if (bucketCounters != null) {
-            bucketCounters.high = endOBucketsInMillis;
-            bucketCounters.low = expiryTime;
+          if (count) {
+            high.setValue(endOBucketsInMillis);
+            low.setValue(expiryTime);
           }
         }
         try {
@@ -154,8 +179,8 @@
   {
     long eventTime = event.getTime();
     if (eventTime < expiryTime) {
-      if (bucketCounters != null) {
-        bucketCounters.numIgnoredEvents++;
+      if (count) {
+        numIgnoredEvents.increment();
       }
       return -1;
     }
@@ -166,9 +191,9 @@
         long move = ((eventTime - endOBucketsInMillis) / bucketSpanInMillis + 1) * bucketSpanInMillis;
         expiryTime += move;
         endOBucketsInMillis += move;
-        if (bucketCounters != null) {
-          bucketCounters.high = endOBucketsInMillis;
-          bucketCounters.low = expiryTime;
+        if (count) {
+          high.setValue(endOBucketsInMillis);
+          low.setValue(expiryTime);
         }
       }
     }
@@ -195,7 +220,8 @@
       return false;
     }
 
-    TimeBasedBucketManagerImpl that = (TimeBasedBucketManagerImpl) o;
+    @SuppressWarnings("unchecked")
+    TimeBasedBucketManagerImpl<T> that = (TimeBasedBucketManagerImpl<T>) o;
 
     if (bucketSpanInMillis != that.bucketSpanInMillis) {
       return false;
@@ -234,11 +260,7 @@
     }
 
     bucket.addNewEvent(event.getEventKey(), writeEventKeysOnly ? null : event);
-    if (bucketCounters != null) {
-      synchronized (bucketCounters) {
-        bucketCounters.numEventsInMemory++;
-      }
-    }
+    numEventsInMemory.increment();
 
     Long max = maxTimesPerBuckets[bucketIdx];
     if (max == null || event.getTime() > max) {
@@ -265,6 +287,11 @@
   {
   }
 
+  public static enum CounterKeys
+  {
+    LOW, HIGH, IGNORED_EVENTS
+  }
+
   private static transient final Logger logger = LoggerFactory.getLogger(TimeBasedBucketManagerImpl.class);
 
 }
diff --git a/library/src/main/java/com/datatorrent/lib/counters/BasicCounters.java b/library/src/main/java/com/datatorrent/lib/counters/BasicCounters.java
new file mode 100644
index 0000000..9af5f79
--- /dev/null
+++ b/library/src/main/java/com/datatorrent/lib/counters/BasicCounters.java
@@ -0,0 +1,198 @@
+/*
+ * Copyright (c) 2014 DataTorrent, Inc. ALL Rights Reserved.
+ *
+ * Licensed 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.
+ */
+package com.datatorrent.lib.counters;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.Map;
+
+import javax.annotation.Nonnull;
+
+import org.apache.commons.lang.mutable.Mutable;
+import org.codehaus.jackson.JsonGenerator;
+import org.codehaus.jackson.map.JsonSerializer;
+import org.codehaus.jackson.map.SerializerProvider;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Maps;
+
+import com.datatorrent.api.Context;
+import com.datatorrent.lib.util.NumberAggregate;
+
+/**
+ * Implementation of basic number counters.
+ *
+ * @param <T> type of counter
+ * @since 1.0.2
+ */
+@JsonSerialize(using = BasicCounters.Serializer.class)
+public class BasicCounters<T extends Number & Mutable> implements Serializable
+{
+  private final Map<Enum<?>, T> cache;
+  private final Class<T> counterType;
+
+  private BasicCounters()
+  {
+    //for kryo
+    cache = null;
+    counterType = null;
+  }
+
+  /**
+   * @param counterType type of counter
+   */
+  public BasicCounters(@Nonnull Class<T> counterType)
+  {
+    cache = Maps.newIdentityHashMap();
+    this.counterType = counterType;
+  }
+
+  /**
+   * Returns the counter associated with the key. Creates it if it doesn't exist.
+   */
+  @SuppressWarnings("unchecked")
+  public synchronized T findCounter(Enum<?> counterKey) throws IllegalAccessException, InstantiationException
+  {
+    T counter = cache.get(counterKey);
+    if (counter == null) {
+      counter = counterType.newInstance();
+      cache.put(counterKey, counter);
+    }
+    return counter;
+  }
+
+  /**
+   * Returns the counter if it exists; null otherwise
+   *
+   * @param counterKey
+   * @return
+   */
+  public synchronized T getCounter(Enum<?> counterKey)
+  {
+    return cache.get(counterKey);
+  }
+
+  /**
+   * Sets the value of a counter.
+   *
+   * @param counterKey counter key.
+   * @param value      new value.
+   */
+  public synchronized void setCounter(Enum<?> counterKey, T value)
+  {
+    cache.put(counterKey, value);
+  }
+
+  /**
+   * Returns an immutable copy of all the counters.
+   *
+   * @return
+   */
+  public synchronized ImmutableMap<Enum<?>, T> getCopy()
+  {
+    return ImmutableMap.copyOf(cache);
+  }
+
+  public static class Serializer extends JsonSerializer<BasicCounters<?>> implements Serializable
+  {
+
+    @Override
+    public void serialize(BasicCounters<?> value, JsonGenerator jgen, SerializerProvider provider)
+      throws IOException
+    {
+      jgen.writeObject(value.getCopy());
+    }
+
+    private static final long serialVersionUID = 201406230131L;
+
+  }
+
+  /**
+   * Aggregates the {@link BasicCounters} of physical partitions into {@link NumberAggregate.LongAggregate}.
+   *
+   * @param <T> type of counter
+   */
+  public static class LongAggregator<T extends Number & Mutable> implements Context.CountersAggregator, Serializable
+  {
+    @Override
+    public Object aggregate(Collection<?> objects)
+    {
+      Map<String, NumberAggregate.LongAggregate> aggregates = Maps.newHashMap();
+      for (Object counter : objects) {
+        if (counter instanceof BasicCounters) {
+          @SuppressWarnings("unchecked")
+          BasicCounters<T> physical = (BasicCounters<T>) counter;
+          ImmutableMap<Enum<?>, T> copy = physical.getCopy();
+
+          for (Map.Entry<Enum<?>, T> entry : copy.entrySet()) {
+
+            NumberAggregate.LongAggregate aggregate = aggregates.get(entry.getKey().name());
+
+            if (aggregate == null) {
+              aggregate = new NumberAggregate.LongAggregate();
+
+              aggregates.put(entry.getKey().name(), aggregate);
+            }
+            aggregate.addNumber(entry.getValue().longValue());
+          }
+        }
+      }
+      return ImmutableMap.copyOf(aggregates);
+    }
+
+    private static final long serialVersionUID = 201406222203L;
+  }
+
+  /**
+   * Aggregates the {@link BasicCounters} of physical partitions into {@link NumberAggregate.DoubleAggregate}.
+   *
+   * @param <T> type of counter
+   */
+  public static class DoubleAggregator<T extends Number & Mutable> implements Context.CountersAggregator, Serializable
+  {
+    @Override
+    public Object aggregate(Collection<?> objects)
+    {
+      Map<String, NumberAggregate.DoubleAggregate> aggregates = Maps.newHashMap();
+      for (Object counter : objects) {
+        if (counter instanceof BasicCounters) {
+          @SuppressWarnings("unchecked")
+          BasicCounters<T> physical = (BasicCounters<T>) counter;
+          ImmutableMap<Enum<?>, T> copy = physical.getCopy();
+
+          for (Map.Entry<Enum<?>, T> entry : copy.entrySet()) {
+
+            NumberAggregate.DoubleAggregate aggregate = aggregates.get(entry.getKey().name());
+
+            if (aggregate == null) {
+              aggregate = new NumberAggregate.DoubleAggregate();
+
+              aggregates.put(entry.getKey().name(), aggregate);
+            }
+            aggregate.addNumber(entry.getValue().doubleValue());
+          }
+        }
+      }
+      return ImmutableMap.copyOf(aggregates);
+    }
+
+    private static final long serialVersionUID = 201407011713L;
+  }
+
+  private static final long serialVersionUID = 201406230033L;
+}
diff --git a/library/src/main/java/com/datatorrent/lib/counters/package-info.java b/library/src/main/java/com/datatorrent/lib/counters/package-info.java
new file mode 100644
index 0000000..26ebfd3
--- /dev/null
+++ b/library/src/main/java/com/datatorrent/lib/counters/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright (c) 2014 DataTorrent, Inc. ALL Rights Reserved.
+ *
+ * Licensed 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.
+ */
+
+/**
+ * Basic counters and aggregates implementations.
+ */
+package com.datatorrent.lib.counters;
\ No newline at end of file
diff --git a/library/src/main/java/com/datatorrent/lib/db/AbstractBatchTransactionableStoreOutputOperator.java b/library/src/main/java/com/datatorrent/lib/db/AbstractBatchTransactionableStoreOutputOperator.java
index 658eed9..d2b780a 100644
--- a/library/src/main/java/com/datatorrent/lib/db/AbstractBatchTransactionableStoreOutputOperator.java
+++ b/library/src/main/java/com/datatorrent/lib/db/AbstractBatchTransactionableStoreOutputOperator.java
@@ -25,8 +25,8 @@
  *
  * @param <T> The tuple type.
  * @param <S> The store type.
+ * @since 1.0.2
  */
-
 public abstract class AbstractBatchTransactionableStoreOutputOperator<T, S extends TransactionableStore> extends AbstractTransactionableStoreOutputOperator<T, S>{
 	protected final List<T> tuples;
 
diff --git a/library/src/main/java/com/datatorrent/lib/dedup/Deduper.java b/library/src/main/java/com/datatorrent/lib/dedup/Deduper.java
index 6e67015..be6281b 100644
--- a/library/src/main/java/com/datatorrent/lib/dedup/Deduper.java
+++ b/library/src/main/java/com/datatorrent/lib/dedup/Deduper.java
@@ -22,6 +22,7 @@
 
 import javax.annotation.Nonnull;
 
+import org.apache.commons.lang.mutable.MutableLong;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -38,6 +39,8 @@
 import com.datatorrent.lib.bucket.Bucket;
 import com.datatorrent.lib.bucket.BucketManager;
 import com.datatorrent.lib.bucket.Bucketable;
+import com.datatorrent.lib.bucket.TimeBasedBucketManagerImpl;
+import com.datatorrent.lib.counters.BasicCounters;
 
 /**
  * <p>
@@ -67,12 +70,12 @@
  * Based on the assumption that duplicate events fall in the same bucket.
  * </p>
  *
- * @param <INPUT> type of input tuple
+ * @param <INPUT>  type of input tuple
  * @param <OUTPUT> type of output tuple
  * @since 0.9.4
  */
 public abstract class Deduper<INPUT extends Bucketable, OUTPUT>
-        implements Operator, BucketManager.Listener<INPUT>, IdleTimeHandler, Partitioner<Deduper<INPUT, OUTPUT>>
+  implements Operator, BucketManager.Listener<INPUT>, IdleTimeHandler, Partitioner<Deduper<INPUT, OUTPUT>>
 {
   @InputPortFieldAnnotation(name = "input", optional = true)
   public final transient DefaultInputPort<INPUT> input = new DefaultInputPort<INPUT>()
@@ -88,7 +91,7 @@
       Bucket<INPUT> bucket = bucketManager.getBucket(bucketKey);
 
       if (bucket != null && bucket.containsEvent(tuple)) {
-        counters.numDuplicateEvents++;
+        numDuplicateEvents.increment();
         return;
       } //ignore event
 
@@ -132,7 +135,8 @@
   protected transient final BlockingQueue<Bucket<INPUT>> fetchedBuckets;
   private transient long sleepTimeMillis;
   private transient OperatorContext context;
-  protected transient Counters counters;
+  protected transient BasicCounters<MutableLong> counters;
+  protected transient MutableLong numDuplicateEvents;
   private transient long currentWindow;
 
   public Deduper()
@@ -150,8 +154,17 @@
     this.context = context;
     this.currentWindow = context.getValue(Context.OperatorContext.ACTIVATION_WINDOW_ID);
     sleepTimeMillis = context.getValue(OperatorContext.SPIN_MILLIS);
-    counters = new Counters();
+    counters = new BasicCounters<MutableLong>(MutableLong.class);
     bucketManager.setBucketCounters(counters);
+    try {
+      numDuplicateEvents = counters.findCounter(CounterKeys.DUPLICATE_EVENTS);
+    }
+    catch (IllegalAccessException e) {
+      throw new RuntimeException(e);
+    }
+    catch (InstantiationException e) {
+      throw new RuntimeException(e);
+    }
     bucketManager.startService(this);
     logger.debug("bucket keys at startup {}", waitingEvents.keySet());
     for (long bucketKey : waitingEvents.keySet()) {
@@ -213,7 +226,7 @@
               output.emit(convert(event));
             }
             else {
-              counters.numDuplicateEvents++;
+              numDuplicateEvents.increment();
             }
           }
         }
@@ -316,7 +329,7 @@
 
       //distribute waiting events
       for (long bucketKey : allWaitingEvents.keySet()) {
-        for (Iterator<INPUT> iterator = allWaitingEvents.get(bucketKey).iterator(); iterator.hasNext();) {
+        for (Iterator<INPUT> iterator = allWaitingEvents.get(bucketKey).iterator(); iterator.hasNext(); ) {
           INPUT event = iterator.next();
           int partitionKey = event.getEventKey().hashCode() & lPartitionMask;
 
@@ -370,7 +383,7 @@
       return false;
     }
 
-    Deduper<?, ?> deduper = (Deduper<?, ?>)o;
+    Deduper<?, ?> deduper = (Deduper<?, ?>) o;
 
     if (partitionMask != deduper.partitionMask) {
       return false;
@@ -400,16 +413,9 @@
     return "Deduper{" + "partitionKeys=" + partitionKeys + ", partitionMask=" + partitionMask + '}';
   }
 
-  public static class Counters extends BucketManager.BucketCounters
+  public static enum CounterKeys
   {
-    protected long numDuplicateEvents;
-
-    public long getNumDuplicateEvents()
-    {
-      return numDuplicateEvents;
-    }
-
-    private static final long serialVersionUID = 201405061055L;
+    DUPLICATE_EVENTS
   }
 
   public static class CountersListener implements StatsListener, Serializable
@@ -421,11 +427,19 @@
       if (lastWindowedStats != null) {
         for (Stats.OperatorStats os : lastWindowedStats) {
           if (os.counters != null) {
-            if (os.counters instanceof Counters) {
-              Counters cs = (Counters)os.counters;
-              logger.debug("bucketStats {} {} {} {} {} {} {} {} {} {}", batchedOperatorStats.getOperatorId(), cs.getNumBucketsInMemory(),
-                           cs.getNumDeletedBuckets(), cs.getNumEvictedBuckets(), cs.getNumEventsInMemory(), cs.getNumEventsCommittedPerWindow(),
-                           cs.getNumIgnoredEvents(), cs.getNumDuplicateEvents(), cs.getLow(), cs.getHigh());
+            if (os.counters instanceof BasicCounters) {
+              @SuppressWarnings("unchecked")
+              BasicCounters<MutableLong> cs = (BasicCounters<MutableLong>) os.counters;
+              logger.debug("operatorId:{} buckets:[in-memory:{} deleted:{} evicted:{}] events:[in-memory:{} committed-last-window:{} " +
+                  "ignored:{} duplicates:{}] low:{} high:{}", batchedOperatorStats.getOperatorId(),
+                cs.getCounter(BucketManager.CounterKeys.BUCKETS_IN_MEMORY),
+                cs.getCounter(BucketManager.CounterKeys.DELETED_BUCKETS),
+                cs.getCounter(BucketManager.CounterKeys.EVICTED_BUCKETS),
+                cs.getCounter(BucketManager.CounterKeys.EVENTS_IN_MEMORY),
+                cs.getCounter(BucketManager.CounterKeys.EVENTS_COMMITTED_LAST_WINDOW),
+                cs.getCounter(TimeBasedBucketManagerImpl.CounterKeys.IGNORED_EVENTS), cs.getCounter(CounterKeys.DUPLICATE_EVENTS),
+                cs.getCounter(TimeBasedBucketManagerImpl.CounterKeys.LOW),
+                cs.getCounter(TimeBasedBucketManagerImpl.CounterKeys.HIGH));
             }
           }
         }
diff --git a/library/src/main/java/com/datatorrent/lib/io/AbstractHttpGetMultiValuedMapOperator.java b/library/src/main/java/com/datatorrent/lib/io/AbstractHttpGetMultiValuedMapOperator.java
index 2b5a92e..9ff1b3f 100644
--- a/library/src/main/java/com/datatorrent/lib/io/AbstractHttpGetMultiValuedMapOperator.java
+++ b/library/src/main/java/com/datatorrent/lib/io/AbstractHttpGetMultiValuedMapOperator.java
@@ -24,6 +24,7 @@
  *
  * @param <INPUT>
  * @param <OUTPUT>
+ * @since 1.0.2
  */
 public abstract class AbstractHttpGetMultiValuedMapOperator<INPUT, OUTPUT> extends AbstractHttpGetOperator<INPUT, OUTPUT>
 {
diff --git a/library/src/main/java/com/datatorrent/lib/io/AbstractHttpGetOperator.java b/library/src/main/java/com/datatorrent/lib/io/AbstractHttpGetOperator.java
index d288a42..ec1faf7 100644
--- a/library/src/main/java/com/datatorrent/lib/io/AbstractHttpGetOperator.java
+++ b/library/src/main/java/com/datatorrent/lib/io/AbstractHttpGetOperator.java
@@ -29,6 +29,7 @@
  *
  * @param <INPUT> tuple type of input port
  * @param <OUTPUT> tuple type of output port
+ * @since 1.0.2
  */
 public abstract class AbstractHttpGetOperator<INPUT, OUTPUT> extends AbstractHttpOperator<INPUT>
 {
diff --git a/library/src/main/java/com/datatorrent/lib/io/AbstractHttpOperator.java b/library/src/main/java/com/datatorrent/lib/io/AbstractHttpOperator.java
index 26d1d08..258ef7f 100644
--- a/library/src/main/java/com/datatorrent/lib/io/AbstractHttpOperator.java
+++ b/library/src/main/java/com/datatorrent/lib/io/AbstractHttpOperator.java
@@ -31,7 +31,9 @@
 /**
  * Abstract http operator that creates client at setup and destroy at teardown
  * and provides the process tuple method to be implemented to process each incoming tuple
+ *
  * @param <T>
+ * @since 1.0.2
  */
 @ShipContainingJars(classes = {com.sun.jersey.api.client.ClientHandler.class})
 public abstract class AbstractHttpOperator<T> extends BaseOperator
diff --git a/library/src/main/java/com/datatorrent/lib/io/HttpGetMapOperator.java b/library/src/main/java/com/datatorrent/lib/io/HttpGetMapOperator.java
index 1420940..8b8bd27 100644
--- a/library/src/main/java/com/datatorrent/lib/io/HttpGetMapOperator.java
+++ b/library/src/main/java/com/datatorrent/lib/io/HttpGetMapOperator.java
@@ -29,6 +29,7 @@
  *
  * @param <K> Type of key in input map tuple
  * @param <V> Type of value in input map tuple
+ * @since 1.0.2
  */
 public class HttpGetMapOperator<K, V> extends AbstractHttpGetOperator<Map<K, V>, String>
 {
diff --git a/library/src/main/java/com/datatorrent/lib/io/fs/AbstractFSDirectoryInputOperator.java b/library/src/main/java/com/datatorrent/lib/io/fs/AbstractFSDirectoryInputOperator.java
index e47df5c..0d64922 100644
--- a/library/src/main/java/com/datatorrent/lib/io/fs/AbstractFSDirectoryInputOperator.java
+++ b/library/src/main/java/com/datatorrent/lib/io/fs/AbstractFSDirectoryInputOperator.java
@@ -60,6 +60,7 @@
  * This class supports retrying of failed files by putting them into failed list, and retrying them after pending
  * files are processed. Retrying is disabled when maxRetryCount is set to zero.
  *
+ * @since 1.0.2
  */
 public abstract class AbstractFSDirectoryInputOperator<T> implements InputOperator, Partitioner<AbstractFSDirectoryInputOperator<T>>, StatsListener
 {
diff --git a/library/src/main/java/com/datatorrent/lib/io/fs/AbstractHdfsFileOutputOperator.java b/library/src/main/java/com/datatorrent/lib/io/fs/AbstractHdfsFileOutputOperator.java
index 3f114e9..aaf7ef5 100644
--- a/library/src/main/java/com/datatorrent/lib/io/fs/AbstractHdfsFileOutputOperator.java
+++ b/library/src/main/java/com/datatorrent/lib/io/fs/AbstractHdfsFileOutputOperator.java
@@ -35,6 +35,7 @@
  * Contains base implementations for setup, teardown, open file and close file.
  *
  * @param <INPUT> incoming tuple type
+ * @since 1.0.2
  */
 public abstract class AbstractHdfsFileOutputOperator<INPUT> extends BaseOperator
 {
diff --git a/library/src/main/java/com/datatorrent/lib/io/fs/AbstractHdfsTupleFileOutputOperator.java b/library/src/main/java/com/datatorrent/lib/io/fs/AbstractHdfsTupleFileOutputOperator.java
deleted file mode 100644
index f98d990..0000000
--- a/library/src/main/java/com/datatorrent/lib/io/fs/AbstractHdfsTupleFileOutputOperator.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (c) 2014 DataTorrent, Inc. ALL Rights Reserved.
- *
- * Licensed 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.
- */
-package com.datatorrent.lib.io.fs;
-
-import com.datatorrent.api.Context;
-import com.datatorrent.api.DefaultOutputPort;
-import com.datatorrent.api.annotation.OutputPortFieldAnnotation;
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.fs.FileSystem;
-import org.apache.hadoop.fs.Path;
-
-import java.io.IOException;
-
-/**
- * Hdfs file output operator that writes the data from the tuple to the file supplied in the tuple.
- *
- * If output port is connected, it sends the output to the output port.
- * @param <INPUT> type of incoming tuple
- * @param <OUTPUT> type of outgoing tuple
- */
-@Deprecated
-public abstract class AbstractHdfsTupleFileOutputOperator<INPUT, OUTPUT> extends AbstractHdfsFileOutputOperator<INPUT>
-{
-  /**
-   *
-   * @param context
-   */
-  @Override
-  public void setup(Context.OperatorContext context)
-  {
-    try {
-      fs = FileSystem.newInstance(new Path(filePath).toUri(), new Configuration());
-    }
-    catch (IOException ex) {
-      throw new RuntimeException(ex);
-    }
-  }
-
-  @Override
-  protected void processTuple(INPUT tuple)
-  {
-    try {
-      Path filepath = new Path(filePath + "/" + getFileName(tuple));
-      openFile(filepath);
-      byte[] tupleBytes = getBytesForTuple(tuple);
-      boolean written = false;
-      if (bufferedOutput != null) {
-        bufferedOutput.write(tupleBytes);
-        written = true;
-      }
-      else if (fsOutput != null) {
-        fsOutput.write(tupleBytes);
-        written = true;
-      }
-      if (written) {
-        totalBytesWritten += tupleBytes.length;
-      }
-      closeFile();
-      if (output.isConnected()) {
-        output.emit(getOutputTuple(tuple));
-      }
-    }
-    catch (IOException ex) {
-      throw new RuntimeException(ex);
-    }
-
-  }
-
-  protected abstract String getFileName(INPUT t);
-
-  protected abstract OUTPUT getOutputTuple(INPUT t);
-
-  @OutputPortFieldAnnotation(name = "output", optional = true)
-  public final transient DefaultOutputPort<OUTPUT> output = new DefaultOutputPort<OUTPUT>();
-  private static final long serialVersionUID = 201405151751L;
-}
diff --git a/library/src/main/java/com/datatorrent/lib/io/fs/HdfsExactlyOnceOutputOperator.java b/library/src/main/java/com/datatorrent/lib/io/fs/HdfsExactlyOnceOutputOperator.java
index 740deee..ecec396 100644
--- a/library/src/main/java/com/datatorrent/lib/io/fs/HdfsExactlyOnceOutputOperator.java
+++ b/library/src/main/java/com/datatorrent/lib/io/fs/HdfsExactlyOnceOutputOperator.java
@@ -34,6 +34,7 @@
  * then the operator doesn't process anything during that window. If it doesn't, then the operator deletes
  * the <window_id>.tmp file if it exists, creates new and starts writing to it.
  *
+ * @since 1.0.2
  */
 public class HdfsExactlyOnceOutputOperator extends AbstractHdfsFileOutputOperator<String>
 {
diff --git a/library/src/main/java/com/datatorrent/lib/io/fs/HdfsFileDataOutputOperator.java b/library/src/main/java/com/datatorrent/lib/io/fs/HdfsFileDataOutputOperator.java
deleted file mode 100644
index 78513d4..0000000
--- a/library/src/main/java/com/datatorrent/lib/io/fs/HdfsFileDataOutputOperator.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (c) 2014 DataTorrent, Inc. ALL Rights Reserved.
- *
- * Licensed 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.
- */
-package com.datatorrent.lib.io.fs;
-
-import com.datatorrent.lib.io.fs.HdfsFileDataOutputOperator.FileData;
-import com.datatorrent.lib.io.fs.HdfsFileDataOutputOperator.FileData.FileInfo;
-
-/**
- * Hdfs output operator that takes {@link FileData} input tuple and writes data to the file specified in the tuple.
- */
-@Deprecated
-public class HdfsFileDataOutputOperator extends AbstractHdfsTupleFileOutputOperator<FileData, FileData.FileInfo>
-{
-  @Override
-  protected String getFileName(FileData t)
-  {
-    return t.info.name;
-  }
-
-  @Override
-  protected FileInfo getOutputTuple(FileData t)
-  {
-    return t.info;
-  }
-
-  @Override
-  protected byte[] getBytesForTuple(FileData t)
-  {
-    return t.data.getBytes();
-  }
-
-  public static class FileData
-  {
-    public static class FileInfo
-    {
-      public String name;
-    }
-
-    public FileInfo info = new FileInfo();
-    public String data;
-  }
-
-  private static final long serialVersionUID = 201405151847L;
-}
diff --git a/library/src/main/java/com/datatorrent/lib/statistics/DimensionsComputation.java b/library/src/main/java/com/datatorrent/lib/statistics/DimensionsComputation.java
index 809e160..e47c1a6 100644
--- a/library/src/main/java/com/datatorrent/lib/statistics/DimensionsComputation.java
+++ b/library/src/main/java/com/datatorrent/lib/statistics/DimensionsComputation.java
@@ -36,7 +36,10 @@
 import com.datatorrent.api.annotation.ShipContainingJars;
 
 /**
+ * <p>DimensionsComputation class.</p>
+ *
  * @param <EVENT> - Type of the tuple whose attributes are used to define dimensions.
+ * @since 1.0.2
  */
 @ShipContainingJars(classes = {TCustomHashMap.class, HashingStrategy.class})
 public class DimensionsComputation<EVENT, AGGREGATE extends DimensionsComputation.AggregateEvent> implements Operator
diff --git a/library/src/main/java/com/datatorrent/lib/util/NumberAggregate.java b/library/src/main/java/com/datatorrent/lib/util/NumberAggregate.java
new file mode 100644
index 0000000..1d433dd
--- /dev/null
+++ b/library/src/main/java/com/datatorrent/lib/util/NumberAggregate.java
@@ -0,0 +1,202 @@
+/*
+ * Copyright (c) 2014 DataTorrent, Inc. ALL Rights Reserved.
+ *
+ * Licensed 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.
+ */
+package com.datatorrent.lib.util;
+
+/**
+ * Utility class that gives aggregate information (i.e. min, max, avg, sum) with a set of numbers.
+ *
+ * @since 1.0.2
+ */
+public interface NumberAggregate
+{
+  /**
+   * Gets the minimum of the given numbers.
+   *
+   * @return The min
+   */
+  public Number getMin();
+
+  /**
+   * Gets the maximum of the given numbers
+   *
+   * @return The max
+   */
+  public Number getMax();
+
+  /**
+   * Gets the sum of the given numbers
+   *
+   * @return The sum
+   */
+  public Number getSum();
+
+  /**
+   * Gets the average of the given numbers
+   *
+   * @return The avg
+   */
+  public Number getAvg();
+
+  /**
+   * Add a long to the number set
+   *
+   * @param num the number
+   */
+  public void addNumber(Number num);
+
+  /**
+   * This is the aggregate class for Long.
+   */
+  public static class LongAggregate implements NumberAggregate
+  {
+    private int count = 0;
+    private long min = Long.MAX_VALUE;
+    private long max = Long.MIN_VALUE;
+    private long sum = 0;
+    private boolean ignoreSum = false;
+    private boolean ignoreAvg = false;
+
+    /**
+     * Creates a LongAggregate, with sum and average both valid.
+     */
+    public LongAggregate()
+    {
+    }
+
+    /**
+     * Creates a LongAggregate
+     *
+     * @param ignoreSum whether or not sum is valid for the numbers.
+     * @param ignoreAvg whether or not average is valid for the numbers.
+     */
+    public LongAggregate(boolean ignoreSum, boolean ignoreAvg)
+    {
+      this.ignoreSum = ignoreSum;
+      this.ignoreAvg = ignoreAvg;
+    }
+
+    @Override
+    public void addNumber(Number num)
+    {
+      long longVal = num.longValue();
+      if (min > longVal) {
+        min = longVal;
+      }
+      if (max < longVal) {
+        max = longVal;
+      }
+      sum += longVal;
+      count++;
+    }
+
+    @Override
+    public Number getMin()
+    {
+      return (count == 0) ? null : min;
+    }
+
+    @Override
+    public Number getMax()
+    {
+      return (count == 0) ? null : max;
+    }
+
+    @Override
+    public Number getAvg()
+    {
+      return (count == 0 || ignoreAvg) ? null : (sum / count);
+    }
+
+    @Override
+    public Number getSum()
+    {
+      return ignoreSum ? null : sum;
+    }
+
+  }
+
+  /**
+   * This is the aggregate class for Double.
+   */
+  public static class DoubleAggregate implements NumberAggregate
+  {
+    private int count = 0;
+    private double min = Double.MAX_VALUE;
+    private double max = Double.MIN_VALUE;
+    private double sum = 0;
+    private boolean ignoreSum = false;
+    private boolean ignoreAvg = false;
+
+    /**
+     * Creates a DoubleAggregate, with sum and average both valid.
+     */
+    public DoubleAggregate()
+    {
+    }
+
+    /**
+     * Creates a DoubleAggregate
+     *
+     * @param ignoreSum whether or not sum is valid for the numbers.
+     * @param ignoreAvg whether or not average is valid for the numbers.
+     */
+    public DoubleAggregate(boolean ignoreSum, boolean ignoreAvg)
+    {
+      this.ignoreSum = ignoreSum;
+      this.ignoreAvg = ignoreAvg;
+    }
+
+    @Override
+    public void addNumber(Number num)
+    {
+      double doubleVal = num.doubleValue();
+      if (min > doubleVal) {
+        min = doubleVal;
+      }
+      if (max < doubleVal) {
+        max = doubleVal;
+      }
+      sum += doubleVal;
+      count++;
+    }
+
+    @Override
+    public Number getMin()
+    {
+      return (count == 0) ? null : min;
+    }
+
+    @Override
+    public Number getMax()
+    {
+      return (count == 0) ? null : max;
+    }
+
+    @Override
+    public Number getAvg()
+    {
+      return (count == 0 || ignoreAvg) ? null : (sum / count);
+    }
+
+    @Override
+    public Number getSum()
+    {
+      return ignoreSum ? null : sum;
+    }
+
+  }
+
+}
diff --git a/library/src/main/java/com/datatorrent/lib/util/ReusableStringReader.java b/library/src/main/java/com/datatorrent/lib/util/ReusableStringReader.java
new file mode 100644
index 0000000..34547dc
--- /dev/null
+++ b/library/src/main/java/com/datatorrent/lib/util/ReusableStringReader.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2014 DataTorrent, Inc. ALL Rights Reserved.
+ *
+ * Licensed 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.
+ */
+package com.datatorrent.lib.util;
+
+import java.io.IOException;
+import java.io.Reader;
+
+/**
+ * <p>ReusableStringReader class.</p>
+ *
+ * @since 1.0.2
+ */
+public class ReusableStringReader extends Reader
+{
+  private String str;
+  private int length;
+  private int next = 0;
+
+  @Override
+  public int read(char[] cbuf, int off, int len) throws IOException
+  {
+    ensureOpen();
+    if ((off < 0) || (off > cbuf.length) || (len < 0) || ((off + len) > cbuf.length) || ((off + len) < 0)) {
+      throw new IndexOutOfBoundsException();
+    } else if (len == 0) {
+      return 0;
+    }
+    if (next >= length)
+      return -1;
+    int n = Math.min(length - next, len);
+    str.getChars(next, next + n, cbuf, off);
+    next += n;
+    return n;
+  }
+
+  /**
+   * Reads a single character.
+   *
+   * @return The character read, or -1 if the end of the stream has been reached
+   * @throws IOException If an I/O error occurs
+   */
+  public int read() throws IOException
+  {
+    ensureOpen();
+    if (next >= length)
+      return -1;
+    return str.charAt(next++);
+  }
+
+  public boolean ready() throws IOException
+  {
+    ensureOpen();
+    return true;
+  }
+
+  @Override
+  public void close() throws IOException
+  {
+    str = null;
+  }
+
+  /**
+   * Check to make sure that the stream has not been closed
+   */
+  private void ensureOpen() throws IOException
+  {
+    if (str == null) {
+      throw new IOException("Stream closed");
+    }
+  }
+
+  public void open(String str) throws IOException
+  {
+    this.str = str;
+    this.length = this.str.length();
+    this.next = 0;
+  }
+
+}
diff --git a/library/src/main/java/com/datatorrent/lib/xml/XmlDOMOperator.java b/library/src/main/java/com/datatorrent/lib/xml/XmlDOMOperator.java
index f71b47a..08753b0 100644
--- a/library/src/main/java/com/datatorrent/lib/xml/XmlDOMOperator.java
+++ b/library/src/main/java/com/datatorrent/lib/xml/XmlDOMOperator.java
@@ -13,6 +13,8 @@
 
 /**
  * Created by Pramod Immaneni <pramod@datatorrent.com> on 6/12/14.
+ *
+ * @since 1.0.2
  */
 public abstract class XmlDOMOperator<T> extends BaseOperator
 {
diff --git a/library/src/test/java/com/datatorrent/lib/counters/BasicCountersTest.java b/library/src/test/java/com/datatorrent/lib/counters/BasicCountersTest.java
new file mode 100644
index 0000000..8241edc
--- /dev/null
+++ b/library/src/test/java/com/datatorrent/lib/counters/BasicCountersTest.java
@@ -0,0 +1,63 @@
+package com.datatorrent.lib.counters;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang.mutable.MutableDouble;
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.google.common.collect.Lists;
+
+import com.datatorrent.lib.util.NumberAggregate;
+
+/**
+ * Tests for {@link BasicCounters}
+ */
+public class BasicCountersTest
+{
+  private static enum CounterKeys
+  {
+    A
+  }
+
+  @Test
+  public void testBasicCounters() throws InstantiationException, IllegalAccessException
+  {
+    BasicCounters<MutableDouble> doubleBasicCounters = new BasicCounters<MutableDouble>(MutableDouble.class);
+    MutableDouble counterA = doubleBasicCounters.findCounter(CounterKeys.A);
+
+    counterA.increment();
+
+    MutableDouble counterAInCounters = doubleBasicCounters.getCounter(CounterKeys.A);
+    Assert.assertNotNull("null", doubleBasicCounters.getCounter(CounterKeys.A));
+    Assert.assertTrue("equality", counterAInCounters == counterA);
+    Assert.assertEquals(counterA.doubleValue(), 1.0, 0);
+  }
+
+  @Test
+  public void testBasicCountersAggregator() throws InstantiationException, IllegalAccessException
+  {
+    List<Object> physicalCounters = Lists.newArrayList();
+
+    for (int i = 0; i < 5; i++) {
+      BasicCounters<MutableDouble> doubleBasicCounters = new BasicCounters<MutableDouble>(MutableDouble.class);
+      MutableDouble counterA = doubleBasicCounters.findCounter(CounterKeys.A);
+      counterA.increment();
+
+      physicalCounters.add(doubleBasicCounters);
+    }
+
+    BasicCounters.DoubleAggregator<MutableDouble> aggregator = new BasicCounters.DoubleAggregator<MutableDouble>();
+    @SuppressWarnings("unchecked")
+    Map<String, NumberAggregate.DoubleAggregate> aggregateMap = (Map<String, NumberAggregate.DoubleAggregate>) aggregator.aggregate(physicalCounters);
+
+    Assert.assertNotNull("null", aggregateMap.get(CounterKeys.A.name()));
+    NumberAggregate.DoubleAggregate aggregate = aggregateMap.get(CounterKeys.A.name());
+
+    Assert.assertEquals(aggregate.getSum().doubleValue(), 5.0, 0);
+    Assert.assertEquals(aggregate.getMin().doubleValue(), 1.0, 0);
+    Assert.assertEquals(aggregate.getMax().doubleValue(), 1.0, 0);
+    Assert.assertEquals(aggregate.getAvg().doubleValue(), 1.0, 0);
+  }
+}
diff --git a/library/src/test/java/com/datatorrent/lib/helper/OperatorContextTestHelper.java b/library/src/test/java/com/datatorrent/lib/helper/OperatorContextTestHelper.java
index ff32fbe..d6dd65f 100644
--- a/library/src/test/java/com/datatorrent/lib/helper/OperatorContextTestHelper.java
+++ b/library/src/test/java/com/datatorrent/lib/helper/OperatorContextTestHelper.java
@@ -66,7 +66,7 @@
     }
 
     @Override
-    public void setCounters(Counters counters)
+    public void setCounters(Object counters)
     {
       /* intentionally no-op */
     }
@@ -88,7 +88,7 @@
     }
 
     @Override
-    public void setCounters(Counters counters)
+    public void setCounters(Object counters)
     {
       throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
     }
diff --git a/library/src/test/java/com/datatorrent/lib/io/fs/HdfsExactlyOnceOutputOperatorTest.java b/library/src/test/java/com/datatorrent/lib/io/fs/HdfsExactlyOnceOutputOperatorTest.java
index 34e3d6b..408e5d5 100644
--- a/library/src/test/java/com/datatorrent/lib/io/fs/HdfsExactlyOnceOutputOperatorTest.java
+++ b/library/src/test/java/com/datatorrent/lib/io/fs/HdfsExactlyOnceOutputOperatorTest.java
@@ -26,7 +26,6 @@
 
 import com.datatorrent.api.AttributeMap;
 import com.datatorrent.api.AttributeMap.Attribute;
-import com.datatorrent.api.Context.Counters;
 import com.datatorrent.api.Context.OperatorContext;
 
 /**
@@ -167,7 +166,7 @@
     }
 
     @Override
-    public void setCounters(Counters stats)
+    public void setCounters(Object stats)
     {
     }
 
diff --git a/library/src/test/java/com/datatorrent/lib/io/fs/HdfsFileDataOutputOperatorTest.java b/library/src/test/java/com/datatorrent/lib/io/fs/HdfsFileDataOutputOperatorTest.java
deleted file mode 100644
index fe76853..0000000
--- a/library/src/test/java/com/datatorrent/lib/io/fs/HdfsFileDataOutputOperatorTest.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (c) 2014 DataTorrent, Inc. ALL Rights Reserved.
- *
- * Licensed 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.
- */
-package com.datatorrent.lib.io.fs;
-
-import com.datatorrent.lib.helper.OperatorContextTestHelper;
-import com.datatorrent.lib.io.fs.HdfsFileDataOutputOperator.FileData;
-import org.junit.Assert;
-import org.junit.Test;
-
-import java.io.*;
-
-/**
- * Functional test for {@link HdfsFileDataOutputOperator}
- */
-@Deprecated
-public class HdfsFileDataOutputOperatorTest
-{
-  @Test
-  public void testFileOutputOperator()
-  {
-    HdfsFileDataOutputOperator oper = new HdfsFileDataOutputOperator();
-    oper.setFilePath("target");
-    oper.setAppend(false);
-    oper.setup(new OperatorContextTestHelper.TestIdOperatorContext(0));
-    oper.beginWindow(0);
-    FileData fileData1 = new FileData();
-    fileData1.info.name = "file1";
-    fileData1.data = "data1";
-
-    oper.input.process(fileData1);
-
-    FileData fileData2 = new FileData();
-    fileData2.info.name = "file2";
-    fileData2.data = "data2";
-    oper.input.process(fileData2);
-
-    FileData fileData3 = new FileData();
-    fileData3.info.name = "file1";
-    fileData3.data = "data2";
-
-    oper.input.process(fileData3);
-
-    oper.endWindow();
-    oper.teardown();
-    Assert.assertEquals("The number of lines in file target/file-0-0", 1, readFile("target/file1", "data2"));
-    Assert.assertEquals("The number of lines in file target/file-0-1", 1, readFile("target/file2", "data2"));
-    Assert.assertEquals("Checking the file target/file-0-0", true, checkFile("target/file1"));
-    Assert.assertEquals("Checking the file target/file-0-1", true, checkFile("target/file2"));
-
-  }
-
-  private int readFile(String path, final String val)
-  {
-    BufferedReader br = null;
-    try {
-      FileInputStream fstream = new FileInputStream(path);
-      DataInputStream in = new DataInputStream(fstream);
-      br = new BufferedReader(new InputStreamReader(in));
-      String strLine;
-      int count = 0;
-      while ((strLine = br.readLine()) != null) {
-        Assert.assertEquals("Comparing the values", val, strLine);
-        count++;
-      }
-      return count;
-    }
-    catch (Exception e) {
-      return -1;
-    }
-    finally {
-      if (br != null) {
-        try {
-          br.close();
-        }
-        catch (IOException e) {
-        }
-      }
-    }
-  }
-
-  private boolean checkFile(String path)
-  {
-    File file = new File(path);
-    if (file.exists()) {
-      file.delete();
-      return true;
-    }
-    return false;
-  }
-
-}
diff --git a/pom.xml b/pom.xml
index 21f068e..8df1c93 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,11 +4,11 @@
   <parent>
     <groupId>com.datatorrent</groupId>
     <artifactId>dt-framework</artifactId>
-    <version>1.0.1-RC1</version>
+    <version>1.0.2</version>
   </parent>
 
   <artifactId>malhar-all</artifactId>
-  <version>1.0.2-SNAPSHOT</version>
+  <version>1.0.2</version>
   <packaging>pom</packaging>
   <name>Malhar Open Source</name>
   <url>https://www.datatorrent.com/</url>
@@ -26,7 +26,7 @@
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     <netbeans.hint.license>malhar-inc</netbeans.hint.license>
     <maven.deploy.skip>false</maven.deploy.skip>
-    <dt.framework.version>1.0.1-RC1</dt.framework.version>
+    <dt.framework.version>1.0.2</dt.framework.version>
     <!-- the following properties match the properties defined in core/pom.xml -->
     <jackson.version>1.9.2</jackson.version>
     <jersey.version>1.9</jersey.version>
@@ -41,4 +41,20 @@
     <module>benchmark</module>
     <module>apps</module>
   </modules>
+
+  <dependencies>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>dt-api</artifactId>
+      <version>${dt.framework.version}</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>dt-engine</artifactId>
+      <version>${dt.framework.version}</version>
+      <scope>provided</scope>
+    </dependency>
+  </dependencies>
+
 </project>
diff --git a/samples/pom.xml b/samples/pom.xml
index 326a737..a572d24 100644
--- a/samples/pom.xml
+++ b/samples/pom.xml
@@ -6,7 +6,7 @@
   <parent>
     <groupId>com.datatorrent</groupId>
     <artifactId>malhar-all</artifactId>
-    <version>1.0.2-SNAPSHOT</version>
+    <version>1.0.2</version>
   </parent>
 
   <artifactId>malhar-samples</artifactId>
diff --git a/web/demos/README.md b/web/demos/README.md
index f66ba06..d72e8c2 100644
--- a/web/demos/README.md
+++ b/web/demos/README.md
@@ -2,7 +2,8 @@
 ===============
 
 Web Application for DataTorrent Demos:
-- Twitter
+- Twitter URLs
+- Twitter Hashtags
 - Mobile
 - Machine Generated Data
 - Ads Dimensions
@@ -42,7 +43,8 @@
  See ```dist_start.sh``` and ```dev_start.sh```.
 
  Applications are automatically discovered by name (to show stats like "Events/sec"). See the following settings in ```config.js```:
- - settings.twitter.appName
+ - settings.twitterUrls.appName
+ - settings.twitterHashtags.appName
  - settings.mobile.appName
  - settings.machine.appName
  - settings.dimensions.appName
diff --git a/web/demos/app/index.html b/web/demos/app/index.html
index 0d1ea40..8604ed5 100644
--- a/web/demos/app/index.html
+++ b/web/demos/app/index.html
@@ -38,7 +38,8 @@
             <a class="brand" href="/"></a>
             <div class="nav-collapse collapse">
                 <ul class="nav">
-                    <li><a href="#twitter">Twitter</a></li>
+                    <li><a href="#twitterUrls">Twitter URLs</a></li>
+                    <li><a href="#twitterHashtags">Twitter Hashtags</a></li>
                     <li><a href="#mobile">Mobile</a></li>
                     <li><a href="#machine">Machine</a></li>
                     <li><a href="#dimensions">Ads</a></li>
diff --git a/web/demos/app/scripts/app.js b/web/demos/app/scripts/app.js
index 79e3ae0..ec7caf0 100644
--- a/web/demos/app/scripts/app.js
+++ b/web/demos/app/scripts/app.js
@@ -38,9 +38,13 @@
       .when('/', {
         templateUrl: 'views/welcome.html'
       })
-      .when('/twitter', {
+      .when('/twitterUrls', {
         templateUrl: 'views/twitter.html',
-        controller: 'TwitterController'
+        controller: 'TwitterUrlsController'
+      })
+      .when('/twitterHashtags', {
+        templateUrl: 'views/twitter.html',
+        controller: 'TwitterHashtagsController'
       })
       .when('/mobile', {
         templateUrl: 'views/mobile.html',
diff --git a/web/demos/app/scripts/controllers/twitter.js b/web/demos/app/scripts/controllers/twitter.js
index 8b36c21..37cceb6 100644
--- a/web/demos/app/scripts/controllers/twitter.js
+++ b/web/demos/app/scripts/controllers/twitter.js
@@ -19,14 +19,40 @@
 'use strict';
 
 angular.module('twitter')
-    .controller('TwitterController', ['$scope', 'rest', function ($scope, rest) {
-        rest.getApp(settings.twitter.appName).then(function (app) {
+    .controller('TwitterUrlsController', ['$scope', 'rest', function ($scope, rest) {
+        rest.getApp(settings.twitterUrls.appName).then(function (app) {
             $scope.app = app;
             $scope.appURL = settings.appsURL + app.id;
         });
+
+        $scope.topic = settings.twitterUrls.topic;
+        $scope.pageTitle = 'Twitter Top URLs';
+        $scope.entity = 'URLs';
+        $scope.gridTitle = 'Twitter Top URLs';
+        $scope.chartTitle = 'Top 10 URLs Chart';
+        $scope.colName = 'URL';
+        $scope.formatter = function(url) {
+            return '<a class="svg-link" xlink:href="' + url + '">' + url + '</a>';
+        };
+    }])
+    .controller('TwitterHashtagsController', ['$scope', 'rest', function ($scope, rest) {
+        rest.getApp(settings.twitterHashtags.appName).then(function (app) {
+          $scope.app = app;
+          $scope.appURL = settings.appsURL + app.id;
+        });
+
+        $scope.topic = settings.twitterHashtags.topic;
+        $scope.pageTitle = 'Twitter Top Hashtags';
+        $scope.entity = 'hashtags';
+        $scope.gridTitle = 'Twitter Top Hashtags';
+        $scope.chartTitle = 'Top 10 Hashtags Chart';
+        $scope.colName = 'Hashtag';
+        $scope.formatter = function(Hashtag) {
+            return '<a class="svg-link" xlink:href="https://twitter.com/search?q=%23' + encodeURIComponent(Hashtag) + '">' + Hashtag + '</a>';
+        };
     }])
     .controller('TwitterGridControlller', ['$scope', 'socket', function ($scope, socket) {
-        socket.subscribe(settings.twitter.topic, function(data) {
+        socket.subscribe($scope.topic, function(data) {
             var list = [];
             jQuery.each(data.data, function(key, value) {
                 list.push( { name: key, value: parseInt(value, 10) } );
@@ -34,19 +60,21 @@
             list = _.sortBy(list, function(item) {
                 return -item.value;
             });
-            $scope.myData = list;
+            $scope.topTen = list;
             $scope.$apply();
         }, $scope);
 
         $scope.gridOptions = {
-            data: 'myData',
+            data: 'topTen',
             enableColumnResize: true,
-            columnDefs: [{ field: "name", displayName: 'URL', width: '75%', sortable: false },
-                { field: "value", displayName: 'Count', width: '25%', sortable: false }]
+          columnDefs: [
+            { field: "name", displayName: $scope.colName, width: '75%', sortable: false },
+            { field: "value", displayName: 'Count', width: '25%', sortable: false }
+          ]
         };
     }])
     .controller('TwitterBarChartController', ['$scope', 'socket', function($scope, socket) {
-        socket.subscribe(settings.twitter.topic, function(data) {
+        socket.subscribe($scope.topic, function(data) {
             var list = [];
             jQuery.each(data.data, function(key, value) {
                 list.push( { name: key, value: parseInt(value, 10) } );
@@ -57,6 +85,9 @@
             //var max = _.max(list, function(item) {item.value});
             var max = list[0].value;
             _.each(list, function(item) {
+                if ($scope.formatter) {
+                    item.name = $scope.formatter(item.name);
+                }
                 item.name += ' - ' + item.value;
                 item.score = item.value / max * 100;
             });
diff --git a/web/demos/app/scripts/directives/barChart.js b/web/demos/app/scripts/directives/barChart.js
index 20d74a5..ca4358e 100644
--- a/web/demos/app/scripts/directives/barChart.js
+++ b/web/demos/app/scripts/directives/barChart.js
@@ -92,7 +92,7 @@
                         .attr("fill", "#fff")
                         .attr("y", function(d, i){return i * 35 + 22;})
                         .attr("x", 15)
-                        .text(function(d){return d[scope.label];});
+                        .html(function(d){return d[scope.label];});
 
                 };
             }
diff --git a/web/demos/app/styles/main.css b/web/demos/app/styles/main.css
index 5bc81c1..78dc25f 100644
--- a/web/demos/app/styles/main.css
+++ b/web/demos/app/styles/main.css
@@ -227,4 +227,7 @@
 }
 button.clearFraudsBtn {
   float:right;
+}
+a.svg-link {
+    text-decoration: underline;
 }
\ No newline at end of file
diff --git a/web/demos/app/views/dimensions.html b/web/demos/app/views/dimensions.html
index ea29596..8cda47b 100644
--- a/web/demos/app/views/dimensions.html
+++ b/web/demos/app/views/dimensions.html
@@ -160,6 +160,6 @@
     <hr>
 
     <footer>
-        <p>&copy; DataTorrent 2013</p>
+        <p>&copy; DataTorrent 2014</p>
     </footer>
 </div><!--/.fluid-container-->
\ No newline at end of file
diff --git a/web/demos/app/views/fraud.html b/web/demos/app/views/fraud.html
index 8afb4a4..57ac920 100644
--- a/web/demos/app/views/fraud.html
+++ b/web/demos/app/views/fraud.html
@@ -47,7 +47,7 @@
 	<hr>
 
 	<footer>
-		<p>&copy; DataTorrent 2013</p>
+		<p>&copy; DataTorrent 2014</p>
 	</footer>
 </div><!--/.fluid-container-->
 <div id="txn-modal" class="modal hide fade" role="dialog" style="display:none;">
diff --git a/web/demos/app/views/machine.html b/web/demos/app/views/machine.html
index 3e840ff..68b62ae 100644
--- a/web/demos/app/views/machine.html
+++ b/web/demos/app/views/machine.html
@@ -168,6 +168,6 @@
     <hr>
 
     <footer>
-        <p>&copy; DataTorrent 2013</p>
+        <p>&copy; DataTorrent 2014</p>
     </footer>
 </div><!--/.fluid-container-->
\ No newline at end of file
diff --git a/web/demos/app/views/mobile.html b/web/demos/app/views/mobile.html
index ce583ab..9477c3a 100644
--- a/web/demos/app/views/mobile.html
+++ b/web/demos/app/views/mobile.html
@@ -45,6 +45,6 @@
     <hr>
 
     <footer>
-        <p>&copy; DataTorrent 2013</p>
+        <p>&copy; DataTorrent 2014</p>
     </footer>
 </div><!--/.fluid-container-->
\ No newline at end of file
diff --git a/web/demos/app/views/twitter.html b/web/demos/app/views/twitter.html
index 3ba9051..e1897cd 100644
--- a/web/demos/app/views/twitter.html
+++ b/web/demos/app/views/twitter.html
@@ -2,14 +2,14 @@
     <div class="row-fluid">
         <div class="span12">
             <h2 class="app-title">
-                Twitter Top URLs
+                {{pageTitle}}
                 <a ng-show="appURL" href="{{appURL}}" class="btn btn-primary btn-view-console" target="_blank">View Console</a>
             </h2>
         </div>
     </div>
     <div class="row-fluid">
         <p class="well span7">
-            This demo application processes tweets and computes most frequently cited URLs during the last 5 minutes. The results are continuously updated every 0.5 sec. For demo purposes, we used live (1% sample) developer version of the Twitter feed, and scale it up by 100x to produce the true load.  The application process load equivalent to full firehose.
+            This demo application processes tweets and computes most frequently cited {{entity}} during the last 5 minutes. The results are continuously updated every 0.5 sec. For demo purposes, we used live (1% sample) developer version of the Twitter feed, and scale it up by 100x to produce the true load.  The application process load equivalent to full firehose.
         </p>
         <div class="span5">
             <span widgets-stat="" app="app"></span>
@@ -17,13 +17,13 @@
     </div>
     <div class="row-fluid">
         <div class="span4">
-            <h4>Top 10 URLs</h4>
+            <h4>{{gridTitle}}</h4>
             <div ng-controller="TwitterGridControlller">
                 <div class="twitter-grid" ng-grid="gridOptions"></div>
             </div>
         </div><!--/span-->
         <div class="span4">
-            <h4>Top 10 URLs Chart</h4>
+            <h4>{{chartTitle}}</h4>
             <div ng-controller="TwitterBarChartController">
                 <span widgets-bar-chart="" class="bar-chart" data="twitterBarChartData" label="name" on-click="d3OnClick(item)"></span>
             </div>
@@ -33,6 +33,6 @@
     <hr>
 
     <footer>
-        <p>&copy; DataTorrent 2013</p>
+        <p>&copy; DataTorrent 2014</p>
     </footer>
 </div><!--/.fluid-container-->
\ No newline at end of file
diff --git a/web/demos/config.js b/web/demos/config.js
index ec62902..1db5085 100644
--- a/web/demos/config.js
+++ b/web/demos/config.js
@@ -26,7 +26,8 @@
 config.settings = {};
 var settings = config.settings;
 
-settings.twitter = {};
+settings.twitterUrls = {};
+settings.twitterHashtags = {};
 settings.mobile = {};
 settings.mobile.topic = {};
 settings.machine = {};
@@ -38,8 +39,10 @@
 settings.webSocketURL = 'ws://' + config.gateway.host + ':' + config.gateway.port + '/pubsub';
 settings.appsURL = 'http://' + config.gateway.host + ':' + config.gateway.port + '/static/#ops/apps/';
 
-settings.twitter.appName = process.env.APP_NAME_TWITTER || 'TwitterDemo';
-settings.twitter.topic = 'demos.twitter.topURLs';
+settings.twitterUrls.appName = process.env.APP_NAME_TWITTER_URLS || 'TwitterDemo';
+settings.twitterUrls.topic = 'demos.twitter.topURLs';
+settings.twitterHashtags.appName = process.env.APP_NAME_TWITTER_HASHTAGS || 'TwitterTrendingDemo';
+settings.twitterHashtags.topic = 'demos.twitter.topHashtags';
 settings.mobile.topic.out = 'demos.mobile.phoneLocationQueryResult';
 settings.mobile.topic.in = 'demos.mobile.phoneLocationQuery';
 settings.mobile.appName = process.env.APP_NAME_MOBILE || 'MobileDemo';
diff --git a/web/demos/package/README.md b/web/demos/package/README.md
index cd3eee0..2020823 100644
--- a/web/demos/package/README.md
+++ b/web/demos/package/README.md
@@ -2,7 +2,8 @@
 ===============
 
 Web Application for DataTorrent Demos:
-- Twitter
+- Twitter URLs
+- Twitter Hashtags
 - Mobile
 - Machine Generated Data
 - Ads Dimensions
@@ -22,7 +23,8 @@
  Please use ```config.js``` or environment variables (```start.sh```) for configuration (DT Gateway, Redis, MongoDB, etc.).
 
  Applications are automatically discovered by name (to show stats like "Events/sec"). See the following settings in ```config.js```:
- - settings.twitter.appName
+ - settings.twitterUrls.appName
+ - settings.twitterHashtags.appName
  - settings.mobile.appName
  - settings.machine.appName
  - settings.dimensions.appName
@@ -30,7 +32,7 @@
 
 ## Architecture and Development
 
-See web application source code  [webapps](https://github.com/DataTorrent/Malhar/tree/master/webapps)
+See web application source code  [web demos](https://github.com/DataTorrent/Malhar/tree/master/web/demos)
 
 ## Tips
 
diff --git a/web/demos/package/app/index.html b/web/demos/package/app/index.html
index 5c53afa..e3b6356 100644
--- a/web/demos/package/app/index.html
+++ b/web/demos/package/app/index.html
@@ -13,7 +13,7 @@
 
     <link rel="stylesheet" href="styles/5e6512ec.vendor.css">
 
-    <link rel="stylesheet" href="styles/f3706ec2.main.css">
+    <link rel="stylesheet" href="styles/00ae7995.main.css">
 </head>
 <body ng-app="app">
 <!--[if lt IE 9]>
@@ -31,7 +31,8 @@
             <a class="brand" href="/"></a>
             <div class="nav-collapse collapse">
                 <ul class="nav">
-                    <li><a href="#twitter">Twitter</a></li>
+                    <li><a href="#twitterUrls">Twitter URLs</a></li>
+                    <li><a href="#twitterHashtags">Twitter Hashtags</a></li>
                     <li><a href="#mobile">Mobile</a></li>
                     <li><a href="#machine">Machine</a></li>
                     <li><a href="#dimensions">Ads</a></li>
@@ -46,11 +47,11 @@
 
 <script src="settings.js"></script>
 
-<script src="scripts/43b68137.plugins.js"></script>
+<script src="scripts/d63799f1.plugins.js"></script>
 
-<script src="scripts/095af978.modules.js"></script>
+<script src="scripts/9f21e177.modules.js"></script>
 
-<script src="scripts/6277abef.scripts.js"></script>
+<script src="scripts/5f986af9.scripts.js"></script>
 
 <script type="text/javascript" src="https://www.google.com/jsapi"></script>
 <script type="text/javascript">
diff --git a/web/demos/package/app/scripts/095af978.modules.js b/web/demos/package/app/scripts/095af978.modules.js
deleted file mode 100644
index c460cfd..0000000
--- a/web/demos/package/app/scripts/095af978.modules.js
+++ /dev/null
@@ -1,11 +0,0 @@
-function Gauge(a,b){this.element=a;var c=this;this.configure=function(a){this.config=a,this.config.size=.9*this.config.size,this.config.raduis=.97*this.config.size/2,this.config.cx=this.config.size/2,this.config.cy=this.config.size/2,this.config.min=void 0!=a.min?a.min:0,this.config.max=void 0!=a.max?a.max:100,this.config.range=this.config.max-this.config.min,this.config.majorTicks=a.majorTicks||5,this.config.minorTicks=a.minorTicks||2,this.config.greenColor=a.greenColor||"#109618",this.config.yellowColor=a.yellowColor||"#FF9900",this.config.redColor=a.redColor||"#DC3912",this.config.transitionDuration=a.transitionDuration||500},this.render=function(){this.body=d3.select(this.element).append("svg:svg").attr("class","gauge").attr("width",this.config.size).attr("height",this.config.size),this.body.append("svg:circle").attr("cx",this.config.cx).attr("cy",this.config.cy).attr("r",this.config.raduis).style("fill","#ccc").style("stroke","#000").style("stroke-width","0.5px"),this.body.append("svg:circle").attr("cx",this.config.cx).attr("cy",this.config.cy).attr("r",.9*this.config.raduis).style("fill","#fff").style("stroke","#e0e0e0").style("stroke-width","2px");for(var a in this.config.greenZones)this.drawBand(this.config.greenZones[a].from,this.config.greenZones[a].to,c.config.greenColor);for(var a in this.config.yellowZones)this.drawBand(this.config.yellowZones[a].from,this.config.yellowZones[a].to,c.config.yellowColor);for(var a in this.config.redZones)this.drawBand(this.config.redZones[a].from,this.config.redZones[a].to,c.config.redColor);if(void 0!=this.config.label){var b=Math.round(this.config.size/9);this.body.append("svg:text").attr("x",this.config.cx).attr("y",this.config.cy/2+b/2).attr("dy",b/2).attr("text-anchor","middle").text(this.config.label).style("font-size",b+"px").style("fill","#333").style("stroke-width","0px")}for(var b=Math.round(this.config.size/16),d=this.config.range/(this.config.majorTicks-1),e=this.config.min;e<=this.config.max;e+=d){for(var f=d/this.config.minorTicks,g=e+f;g<Math.min(e+d,this.config.max);g+=f){var h=this.valueToPoint(g,.75),i=this.valueToPoint(g,.85);this.body.append("svg:line").attr("x1",h.x).attr("y1",h.y).attr("x2",i.x).attr("y2",i.y).style("stroke","#666").style("stroke-width","1px")}var h=this.valueToPoint(e,.7),i=this.valueToPoint(e,.85);if(this.body.append("svg:line").attr("x1",h.x).attr("y1",h.y).attr("x2",i.x).attr("y2",i.y).style("stroke","#333").style("stroke-width","2px"),e==this.config.min||e==this.config.max){var j=this.valueToPoint(e,.63);this.body.append("svg:text").attr("x",j.x).attr("y",j.y).attr("dy",b/3).attr("text-anchor",e==this.config.min?"start":"end").text(e).style("font-size",b+"px").style("fill","#333").style("stroke-width","0px")}}var k=this.body.append("svg:g").attr("class","pointerContainer"),l=(this.config.min+this.config.max)/2,m=this.buildPointerPath(l),n=d3.svg.line().x(function(a){return a.x}).y(function(a){return a.y}).interpolate("basis");k.selectAll("path").data([m]).enter().append("svg:path").attr("d",n).style("fill","#dc3912").style("stroke","#c63310").style("fill-opacity",.7),k.append("svg:circle").attr("cx",this.config.cx).attr("cy",this.config.cy).attr("r",.12*this.config.raduis).style("fill","#4684EE").style("stroke","#666").style("opacity",1);var b=Math.round(this.config.size/10);k.selectAll("text").data([l]).enter().append("svg:text").attr("x",this.config.cx).attr("y",this.config.size-this.config.cy/4-b).attr("dy",b/2).attr("text-anchor","middle").style("font-size",b+"px").style("fill","#000").style("stroke-width","0px"),this.redraw(this.config.min,0)},this.buildPointerPath=function(a){function b(a,b){var d=c.valueToPoint(a,b);return d.x-=c.config.cx,d.y-=c.config.cy,d}var d=this.config.range/13,e=b(a,.85),f=b(a-d,.12),g=b(a+d,.12),h=a-this.config.range*(1/.75)/2,i=b(h,.28),j=b(h-d,.12),k=b(h+d,.12);return[e,f,k,i,j,g,e]},this.drawBand=function(a,b,d){0>=b-a||this.body.append("svg:path").style("fill",d).attr("d",d3.svg.arc().startAngle(this.valueToRadians(a)).endAngle(this.valueToRadians(b)).innerRadius(.65*this.config.raduis).outerRadius(.85*this.config.raduis)).attr("transform",function(){return"translate("+c.config.cx+", "+c.config.cy+") rotate(270)"})},this.redraw=function(a,b){var d=this.body.select(".pointerContainer");d.selectAll("text").text(Math.round(a));var e=d.selectAll("path");e.transition().duration(void 0!=b?b:this.config.transitionDuration).attrTween("transform",function(){var b=a;a>c.config.max?b=c.config.max+.02*c.config.range:a<c.config.min&&(b=c.config.min-.02*c.config.range);var d=c.valueToDegrees(b)-90,e=c._currentRotation||d;return c._currentRotation=d,function(a){var b=e+(d-e)*a;return"translate("+c.config.cx+", "+c.config.cy+") rotate("+b+")"}})},this.valueToDegrees=function(a){return a/this.config.range*270-(this.config.min/this.config.range*270+45)},this.valueToRadians=function(a){return this.valueToDegrees(a)*Math.PI/180},this.valueToPoint=function(a,b){return{x:this.config.cx-this.config.raduis*b*Math.cos(this.valueToRadians(a)),y:this.config.cy-this.config.raduis*b*Math.sin(this.valueToRadians(a))}},this.configure(b)}(function(){var a=this,b=a._,c={},d=Array.prototype,e=Object.prototype,f=Function.prototype,g=d.push,h=d.slice,i=d.concat,j=e.toString,k=e.hasOwnProperty,l=d.forEach,m=d.map,n=d.reduce,o=d.reduceRight,p=d.filter,q=d.every,r=d.some,s=d.indexOf,t=d.lastIndexOf,u=Array.isArray,v=Object.keys,w=f.bind,x=function(a){return a instanceof x?a:this instanceof x?void(this._wrapped=a):new x(a)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=x),exports._=x):a._=x,x.VERSION="1.5.2";var y=x.each=x.forEach=function(a,b,d){if(null!=a)if(l&&a.forEach===l)a.forEach(b,d);else if(a.length===+a.length){for(var e=0,f=a.length;f>e;e++)if(b.call(d,a[e],e,a)===c)return}else for(var g=x.keys(a),e=0,f=g.length;f>e;e++)if(b.call(d,a[g[e]],g[e],a)===c)return};x.map=x.collect=function(a,b,c){var d=[];return null==a?d:m&&a.map===m?a.map(b,c):(y(a,function(a,e,f){d.push(b.call(c,a,e,f))}),d)};var z="Reduce of empty array with no initial value";x.reduce=x.foldl=x.inject=function(a,b,c,d){var e=arguments.length>2;if(null==a&&(a=[]),n&&a.reduce===n)return d&&(b=x.bind(b,d)),e?a.reduce(b,c):a.reduce(b);if(y(a,function(a,f,g){e?c=b.call(d,c,a,f,g):(c=a,e=!0)}),!e)throw new TypeError(z);return c},x.reduceRight=x.foldr=function(a,b,c,d){var e=arguments.length>2;if(null==a&&(a=[]),o&&a.reduceRight===o)return d&&(b=x.bind(b,d)),e?a.reduceRight(b,c):a.reduceRight(b);var f=a.length;if(f!==+f){var g=x.keys(a);f=g.length}if(y(a,function(h,i,j){i=g?g[--f]:--f,e?c=b.call(d,c,a[i],i,j):(c=a[i],e=!0)}),!e)throw new TypeError(z);return c},x.find=x.detect=function(a,b,c){var d;return A(a,function(a,e,f){return b.call(c,a,e,f)?(d=a,!0):void 0}),d},x.filter=x.select=function(a,b,c){var d=[];return null==a?d:p&&a.filter===p?a.filter(b,c):(y(a,function(a,e,f){b.call(c,a,e,f)&&d.push(a)}),d)},x.reject=function(a,b,c){return x.filter(a,function(a,d,e){return!b.call(c,a,d,e)},c)},x.every=x.all=function(a,b,d){b||(b=x.identity);var e=!0;return null==a?e:q&&a.every===q?a.every(b,d):(y(a,function(a,f,g){return(e=e&&b.call(d,a,f,g))?void 0:c}),!!e)};var A=x.some=x.any=function(a,b,d){b||(b=x.identity);var e=!1;return null==a?e:r&&a.some===r?a.some(b,d):(y(a,function(a,f,g){return e||(e=b.call(d,a,f,g))?c:void 0}),!!e)};x.contains=x.include=function(a,b){return null==a?!1:s&&a.indexOf===s?-1!=a.indexOf(b):A(a,function(a){return a===b})},x.invoke=function(a,b){var c=h.call(arguments,2),d=x.isFunction(b);return x.map(a,function(a){return(d?b:a[b]).apply(a,c)})},x.pluck=function(a,b){return x.map(a,function(a){return a[b]})},x.where=function(a,b,c){return x.isEmpty(b)?c?void 0:[]:x[c?"find":"filter"](a,function(a){for(var c in b)if(b[c]!==a[c])return!1;return!0})},x.findWhere=function(a,b){return x.where(a,b,!0)},x.max=function(a,b,c){if(!b&&x.isArray(a)&&a[0]===+a[0]&&a.length<65535)return Math.max.apply(Math,a);if(!b&&x.isEmpty(a))return-1/0;var d={computed:-1/0,value:-1/0};return y(a,function(a,e,f){var g=b?b.call(c,a,e,f):a;g>d.computed&&(d={value:a,computed:g})}),d.value},x.min=function(a,b,c){if(!b&&x.isArray(a)&&a[0]===+a[0]&&a.length<65535)return Math.min.apply(Math,a);if(!b&&x.isEmpty(a))return 1/0;var d={computed:1/0,value:1/0};return y(a,function(a,e,f){var g=b?b.call(c,a,e,f):a;g<d.computed&&(d={value:a,computed:g})}),d.value},x.shuffle=function(a){var b,c=0,d=[];return y(a,function(a){b=x.random(c++),d[c-1]=d[b],d[b]=a}),d},x.sample=function(a,b,c){return arguments.length<2||c?a[x.random(a.length-1)]:x.shuffle(a).slice(0,Math.max(0,b))};var B=function(a){return x.isFunction(a)?a:function(b){return b[a]}};x.sortBy=function(a,b,c){var d=B(b);return x.pluck(x.map(a,function(a,b,e){return{value:a,index:b,criteria:d.call(c,a,b,e)}}).sort(function(a,b){var c=a.criteria,d=b.criteria;if(c!==d){if(c>d||void 0===c)return 1;if(d>c||void 0===d)return-1}return a.index-b.index}),"value")};var C=function(a){return function(b,c,d){var e={},f=null==c?x.identity:B(c);return y(b,function(c,g){var h=f.call(d,c,g,b);a(e,h,c)}),e}};x.groupBy=C(function(a,b,c){(x.has(a,b)?a[b]:a[b]=[]).push(c)}),x.indexBy=C(function(a,b,c){a[b]=c}),x.countBy=C(function(a,b){x.has(a,b)?a[b]++:a[b]=1}),x.sortedIndex=function(a,b,c,d){c=null==c?x.identity:B(c);for(var e=c.call(d,b),f=0,g=a.length;g>f;){var h=f+g>>>1;c.call(d,a[h])<e?f=h+1:g=h}return f},x.toArray=function(a){return a?x.isArray(a)?h.call(a):a.length===+a.length?x.map(a,x.identity):x.values(a):[]},x.size=function(a){return null==a?0:a.length===+a.length?a.length:x.keys(a).length},x.first=x.head=x.take=function(a,b,c){return null==a?void 0:null==b||c?a[0]:h.call(a,0,b)},x.initial=function(a,b,c){return h.call(a,0,a.length-(null==b||c?1:b))},x.last=function(a,b,c){return null==a?void 0:null==b||c?a[a.length-1]:h.call(a,Math.max(a.length-b,0))},x.rest=x.tail=x.drop=function(a,b,c){return h.call(a,null==b||c?1:b)},x.compact=function(a){return x.filter(a,x.identity)};var D=function(a,b,c){return b&&x.every(a,x.isArray)?i.apply(c,a):(y(a,function(a){x.isArray(a)||x.isArguments(a)?b?g.apply(c,a):D(a,b,c):c.push(a)}),c)};x.flatten=function(a,b){return D(a,b,[])},x.without=function(a){return x.difference(a,h.call(arguments,1))},x.uniq=x.unique=function(a,b,c,d){x.isFunction(b)&&(d=c,c=b,b=!1);var e=c?x.map(a,c,d):a,f=[],g=[];return y(e,function(c,d){(b?d&&g[g.length-1]===c:x.contains(g,c))||(g.push(c),f.push(a[d]))}),f},x.union=function(){return x.uniq(x.flatten(arguments,!0))},x.intersection=function(a){var b=h.call(arguments,1);return x.filter(x.uniq(a),function(a){return x.every(b,function(b){return x.indexOf(b,a)>=0})})},x.difference=function(a){var b=i.apply(d,h.call(arguments,1));return x.filter(a,function(a){return!x.contains(b,a)})},x.zip=function(){for(var a=x.max(x.pluck(arguments,"length").concat(0)),b=new Array(a),c=0;a>c;c++)b[c]=x.pluck(arguments,""+c);return b},x.object=function(a,b){if(null==a)return{};for(var c={},d=0,e=a.length;e>d;d++)b?c[a[d]]=b[d]:c[a[d][0]]=a[d][1];return c},x.indexOf=function(a,b,c){if(null==a)return-1;var d=0,e=a.length;if(c){if("number"!=typeof c)return d=x.sortedIndex(a,b),a[d]===b?d:-1;d=0>c?Math.max(0,e+c):c}if(s&&a.indexOf===s)return a.indexOf(b,c);for(;e>d;d++)if(a[d]===b)return d;return-1},x.lastIndexOf=function(a,b,c){if(null==a)return-1;var d=null!=c;if(t&&a.lastIndexOf===t)return d?a.lastIndexOf(b,c):a.lastIndexOf(b);for(var e=d?c:a.length;e--;)if(a[e]===b)return e;return-1},x.range=function(a,b,c){arguments.length<=1&&(b=a||0,a=0),c=arguments[2]||1;for(var d=Math.max(Math.ceil((b-a)/c),0),e=0,f=new Array(d);d>e;)f[e++]=a,a+=c;return f};var E=function(){};x.bind=function(a,b){var c,d;if(w&&a.bind===w)return w.apply(a,h.call(arguments,1));if(!x.isFunction(a))throw new TypeError;return c=h.call(arguments,2),d=function(){if(!(this instanceof d))return a.apply(b,c.concat(h.call(arguments)));E.prototype=a.prototype;var e=new E;E.prototype=null;var f=a.apply(e,c.concat(h.call(arguments)));return Object(f)===f?f:e}},x.partial=function(a){var b=h.call(arguments,1);return function(){return a.apply(this,b.concat(h.call(arguments)))}},x.bindAll=function(a){var b=h.call(arguments,1);if(0===b.length)throw new Error("bindAll must be passed function names");return y(b,function(b){a[b]=x.bind(a[b],a)}),a},x.memoize=function(a,b){var c={};return b||(b=x.identity),function(){var d=b.apply(this,arguments);return x.has(c,d)?c[d]:c[d]=a.apply(this,arguments)}},x.delay=function(a,b){var c=h.call(arguments,2);return setTimeout(function(){return a.apply(null,c)},b)},x.defer=function(a){return x.delay.apply(x,[a,1].concat(h.call(arguments,1)))},x.throttle=function(a,b,c){var d,e,f,g=null,h=0;c||(c={});var i=function(){h=c.leading===!1?0:new Date,g=null,f=a.apply(d,e)};return function(){var j=new Date;h||c.leading!==!1||(h=j);var k=b-(j-h);return d=this,e=arguments,0>=k?(clearTimeout(g),g=null,h=j,f=a.apply(d,e)):g||c.trailing===!1||(g=setTimeout(i,k)),f}},x.debounce=function(a,b,c){var d,e,f,g,h;return function(){f=this,e=arguments,g=new Date;var i=function(){var j=new Date-g;b>j?d=setTimeout(i,b-j):(d=null,c||(h=a.apply(f,e)))},j=c&&!d;return d||(d=setTimeout(i,b)),j&&(h=a.apply(f,e)),h}},x.once=function(a){var b,c=!1;return function(){return c?b:(c=!0,b=a.apply(this,arguments),a=null,b)}},x.wrap=function(a,b){return function(){var c=[a];return g.apply(c,arguments),b.apply(this,c)}},x.compose=function(){var a=arguments;return function(){for(var b=arguments,c=a.length-1;c>=0;c--)b=[a[c].apply(this,b)];return b[0]}},x.after=function(a,b){return function(){return--a<1?b.apply(this,arguments):void 0}},x.keys=v||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var b=[];for(var c in a)x.has(a,c)&&b.push(c);return b},x.values=function(a){for(var b=x.keys(a),c=b.length,d=new Array(c),e=0;c>e;e++)d[e]=a[b[e]];return d},x.pairs=function(a){for(var b=x.keys(a),c=b.length,d=new Array(c),e=0;c>e;e++)d[e]=[b[e],a[b[e]]];return d},x.invert=function(a){for(var b={},c=x.keys(a),d=0,e=c.length;e>d;d++)b[a[c[d]]]=c[d];return b},x.functions=x.methods=function(a){var b=[];for(var c in a)x.isFunction(a[c])&&b.push(c);return b.sort()},x.extend=function(a){return y(h.call(arguments,1),function(b){if(b)for(var c in b)a[c]=b[c]}),a},x.pick=function(a){var b={},c=i.apply(d,h.call(arguments,1));return y(c,function(c){c in a&&(b[c]=a[c])}),b},x.omit=function(a){var b={},c=i.apply(d,h.call(arguments,1));for(var e in a)x.contains(c,e)||(b[e]=a[e]);return b},x.defaults=function(a){return y(h.call(arguments,1),function(b){if(b)for(var c in b)void 0===a[c]&&(a[c]=b[c])}),a},x.clone=function(a){return x.isObject(a)?x.isArray(a)?a.slice():x.extend({},a):a},x.tap=function(a,b){return b(a),a};var F=function(a,b,c,d){if(a===b)return 0!==a||1/a==1/b;if(null==a||null==b)return a===b;a instanceof x&&(a=a._wrapped),b instanceof x&&(b=b._wrapped);var e=j.call(a);if(e!=j.call(b))return!1;switch(e){case"[object String]":return a==String(b);case"[object Number]":return a!=+a?b!=+b:0==a?1/a==1/b:a==+b;case"[object Date]":case"[object Boolean]":return+a==+b;case"[object RegExp]":return a.source==b.source&&a.global==b.global&&a.multiline==b.multiline&&a.ignoreCase==b.ignoreCase}if("object"!=typeof a||"object"!=typeof b)return!1;for(var f=c.length;f--;)if(c[f]==a)return d[f]==b;var g=a.constructor,h=b.constructor;if(g!==h&&!(x.isFunction(g)&&g instanceof g&&x.isFunction(h)&&h instanceof h))return!1;c.push(a),d.push(b);var i=0,k=!0;if("[object Array]"==e){if(i=a.length,k=i==b.length)for(;i--&&(k=F(a[i],b[i],c,d)););}else{for(var l in a)if(x.has(a,l)&&(i++,!(k=x.has(b,l)&&F(a[l],b[l],c,d))))break;if(k){for(l in b)if(x.has(b,l)&&!i--)break;k=!i}}return c.pop(),d.pop(),k};x.isEqual=function(a,b){return F(a,b,[],[])},x.isEmpty=function(a){if(null==a)return!0;if(x.isArray(a)||x.isString(a))return 0===a.length;for(var b in a)if(x.has(a,b))return!1;return!0},x.isElement=function(a){return!(!a||1!==a.nodeType)},x.isArray=u||function(a){return"[object Array]"==j.call(a)},x.isObject=function(a){return a===Object(a)},y(["Arguments","Function","String","Number","Date","RegExp"],function(a){x["is"+a]=function(b){return j.call(b)=="[object "+a+"]"}}),x.isArguments(arguments)||(x.isArguments=function(a){return!(!a||!x.has(a,"callee"))}),"function"!=typeof/./&&(x.isFunction=function(a){return"function"==typeof a}),x.isFinite=function(a){return isFinite(a)&&!isNaN(parseFloat(a))},x.isNaN=function(a){return x.isNumber(a)&&a!=+a},x.isBoolean=function(a){return a===!0||a===!1||"[object Boolean]"==j.call(a)},x.isNull=function(a){return null===a},x.isUndefined=function(a){return void 0===a},x.has=function(a,b){return k.call(a,b)},x.noConflict=function(){return a._=b,this},x.identity=function(a){return a},x.times=function(a,b,c){for(var d=Array(Math.max(0,a)),e=0;a>e;e++)d[e]=b.call(c,e);return d},x.random=function(a,b){return null==b&&(b=a,a=0),a+Math.floor(Math.random()*(b-a+1))};var G={escape:{"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;"}};G.unescape=x.invert(G.escape);var H={escape:new RegExp("["+x.keys(G.escape).join("")+"]","g"),unescape:new RegExp("("+x.keys(G.unescape).join("|")+")","g")};x.each(["escape","unescape"],function(a){x[a]=function(b){return null==b?"":(""+b).replace(H[a],function(b){return G[a][b]})}}),x.result=function(a,b){if(null==a)return void 0;var c=a[b];return x.isFunction(c)?c.call(a):c},x.mixin=function(a){y(x.functions(a),function(b){var c=x[b]=a[b];x.prototype[b]=function(){var a=[this._wrapped];return g.apply(a,arguments),M.call(this,c.apply(x,a))}})};var I=0;x.uniqueId=function(a){var b=++I+"";return a?a+b:b},x.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var J=/(.)^/,K={"'":"'","\\":"\\","\r":"r","\n":"n","	":"t","\u2028":"u2028","\u2029":"u2029"},L=/\\|'|\r|\n|\t|\u2028|\u2029/g;x.template=function(a,b,c){var d;c=x.defaults({},c,x.templateSettings);var e=new RegExp([(c.escape||J).source,(c.interpolate||J).source,(c.evaluate||J).source].join("|")+"|$","g"),f=0,g="__p+='";a.replace(e,function(b,c,d,e,h){return g+=a.slice(f,h).replace(L,function(a){return"\\"+K[a]}),c&&(g+="'+\n((__t=("+c+"))==null?'':_.escape(__t))+\n'"),d&&(g+="'+\n((__t=("+d+"))==null?'':__t)+\n'"),e&&(g+="';\n"+e+"\n__p+='"),f=h+b.length,b}),g+="';\n",c.variable||(g="with(obj||{}){\n"+g+"}\n"),g="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+g+"return __p;\n";try{d=new Function(c.variable||"obj","_",g)}catch(h){throw h.source=g,h}if(b)return d(b,x);var i=function(a){return d.call(this,a,x)};return i.source="function("+(c.variable||"obj")+"){\n"+g+"}",i},x.chain=function(a){return x(a).chain()};var M=function(a){return this._chain?x(a).chain():a};x.mixin(x),y(["pop","push","reverse","shift","sort","splice","unshift"],function(a){var b=d[a];x.prototype[a]=function(){var c=this._wrapped;return b.apply(c,arguments),"shift"!=a&&"splice"!=a||0!==c.length||delete c[0],M.call(this,c)}}),y(["concat","join","slice"],function(a){var b=d[a];x.prototype[a]=function(){return M.call(this,b.apply(this._wrapped,arguments))}}),x.extend(x.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this),function(a,b){"use strict";function c(){function a(a,c){return b.extend(new(b.extend(function(){},{prototype:a})),c)}function c(a,b){var c=b.caseInsensitiveMatch,d={originalPath:a,regexp:a},e=d.keys=[];return a=a.replace(/([().])/g,"\\$1").replace(/(\/)?:(\w+)([\?\*])?/g,function(a,b,c,d){var f="?"===d?d:null,g="*"===d?d:null;return e.push({name:c,optional:!!f}),b=b||"",""+(f?"":b)+"(?:"+(f?b:"")+(g&&"(.+?)"||"([^/]+)")+(f||"")+")"+(f||"")}).replace(/([\/$\*])/g,"\\$1"),d.regexp=new RegExp("^"+a+"$",c?"i":""),d}var d={};this.when=function(a,e){if(d[a]=b.extend({reloadOnSearch:!0},e,a&&c(a,e)),a){var f="/"==a[a.length-1]?a.substr(0,a.length-1):a+"/";d[f]=b.extend({redirectTo:a},c(f,e))}return this},this.otherwise=function(a){return this.when(null,a),this},this.$get=["$rootScope","$location","$routeParams","$q","$injector","$http","$templateCache","$sce",function(c,e,f,g,h,i,j,k){function l(a,b){var c=b.keys,d={};if(!b.regexp)return null;var e=b.regexp.exec(a);if(!e)return null;for(var f=1,g=e.length;g>f;++f){var h=c[f-1],i="string"==typeof e[f]?decodeURIComponent(e[f]):e[f];h&&i&&(d[h.name]=i)}return d}function m(){var a=n(),d=q.current;a&&d&&a.$$route===d.$$route&&b.equals(a.pathParams,d.pathParams)&&!a.reloadOnSearch&&!p?(d.params=a.params,b.copy(d.params,f),c.$broadcast("$routeUpdate",d)):(a||d)&&(p=!1,c.$broadcast("$routeChangeStart",a,d),q.current=a,a&&a.redirectTo&&(b.isString(a.redirectTo)?e.path(o(a.redirectTo,a.params)).search(a.params).replace():e.url(a.redirectTo(a.pathParams,e.path(),e.search())).replace()),g.when(a).then(function(){if(a){var c,d,e=b.extend({},a.resolve);return b.forEach(e,function(a,c){e[c]=b.isString(a)?h.get(a):h.invoke(a)}),b.isDefined(c=a.template)?b.isFunction(c)&&(c=c(a.params)):b.isDefined(d=a.templateUrl)&&(b.isFunction(d)&&(d=d(a.params)),d=k.getTrustedResourceUrl(d),b.isDefined(d)&&(a.loadedTemplateUrl=d,c=i.get(d,{cache:j}).then(function(a){return a.data}))),b.isDefined(c)&&(e.$template=c),g.all(e)}}).then(function(e){a==q.current&&(a&&(a.locals=e,b.copy(a.params,f)),c.$broadcast("$routeChangeSuccess",a,d))},function(b){a==q.current&&c.$broadcast("$routeChangeError",a,d,b)}))}function n(){var c,f;return b.forEach(d,function(d){!f&&(c=l(e.path(),d))&&(f=a(d,{params:b.extend({},e.search(),c),pathParams:c}),f.$$route=d)}),f||d[null]&&a(d[null],{params:{},pathParams:{}})}function o(a,c){var d=[];return b.forEach((a||"").split(":"),function(a,b){if(0===b)d.push(a);else{var e=a.match(/(\w+)(.*)/),f=e[1];d.push(c[f]),d.push(e[2]||""),delete c[f]}}),d.join("")}var p=!1,q={routes:d,reload:function(){p=!0,c.$evalAsync(m)}};return c.$on("$locationChangeSuccess",m),q}]}function d(){this.$get=function(){return{}}}function e(a,c,d){return{restrict:"ECA",terminal:!0,priority:400,transclude:"element",link:function(e,f,g,h,i){function j(){n&&(n.remove(),n=null),l&&(l.$destroy(),l=null),m&&(d.leave(m,function(){n=null}),n=m,m=null)}function k(){var g=a.current&&a.current.locals,h=g&&g.$template;if(b.isDefined(h)){var k=e.$new(),n=a.current,q=i(k,function(a){d.enter(a,null,m||f,function(){!b.isDefined(o)||o&&!e.$eval(o)||c()}),j()});m=q,l=n.scope=k,l.$emit("$viewContentLoaded"),l.$eval(p)}else j()}var l,m,n,o=g.autoscroll,p=g.onload||"";e.$on("$routeChangeSuccess",k),k()}}}function f(a,b,c){return{restrict:"ECA",priority:-400,link:function(d,e){var f=c.current,g=f.locals;e.html(g.$template);var h=a(e.contents());if(f.controller){g.$scope=d;var i=b(f.controller,g);f.controllerAs&&(d[f.controllerAs]=i),e.data("$ngControllerController",i),e.children().data("$ngControllerController",i)}h(d)}}}var g=b.module("ngRoute",["ng"]).provider("$route",c);g.provider("$routeParams",d),g.directive("ngView",e),g.directive("ngView",f),e.$inject=["$route","$anchorScroll","$animate"],f.$inject=["$compile","$controller","$route"]}(window,window.angular),function(a,b,c){"use strict";function d(a){return null!=a&&""!==a&&"hasOwnProperty"!==a&&h.test("."+a)}function e(a,b){if(!d(b))throw g("badmember",'Dotted member path "@{0}" is invalid.',b);for(var e=b.split("."),f=0,h=e.length;h>f&&a!==c;f++){var i=e[f];a=null!==a?a[i]:c}return a}function f(a,c){c=c||{},b.forEach(c,function(a,b){delete c[b]});for(var d in a)!a.hasOwnProperty(d)||"$"===d.charAt(0)&&"$"===d.charAt(1)||(c[d]=a[d]);return c}var g=b.$$minErr("$resource"),h=/^(\.[a-zA-Z_$][0-9a-zA-Z_$]*)+$/;b.module("ngResource",["ng"]).factory("$resource",["$http","$q",function(a,d){function h(a){return i(a,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function i(a,b){return encodeURIComponent(a).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,b?"%20":"+")}function j(a,b){this.template=a,this.defaults=b||{},this.urlParams={}}function k(h,i,r){function s(a,b){var c={};return b=o({},i,b),n(b,function(b,d){q(b)&&(b=b()),c[d]=b&&b.charAt&&"@"==b.charAt(0)?e(a,b.substr(1)):b}),c}function t(a){return a.resource}function u(a){f(a||{},this)}var v=new j(h);return r=o({},l,r),n(r,function(e,h){var i=/^(POST|PUT|PATCH)$/i.test(e.method);u[h]=function(h,j,k,l){var r,w,x,y={};switch(arguments.length){case 4:x=l,w=k;case 3:case 2:if(!q(j)){y=h,r=j,w=k;break}if(q(h)){w=h,x=j;break}w=j,x=k;case 1:q(h)?w=h:i?r=h:y=h;break;case 0:break;default:throw g("badargs","Expected up to 4 arguments [params, data, success, error], got {0} arguments",arguments.length)}var z=this instanceof u,A=z?r:e.isArray?[]:new u(r),B={},C=e.interceptor&&e.interceptor.response||t,D=e.interceptor&&e.interceptor.responseError||c;n(e,function(a,b){"params"!=b&&"isArray"!=b&&"interceptor"!=b&&(B[b]=p(a))}),i&&(B.data=r),v.setUrlParams(B,o({},s(r,e.params||{}),y),e.url);var E=a(B).then(function(a){var c=a.data,d=A.$promise;if(c){if(b.isArray(c)!==!!e.isArray)throw g("badcfg","Error in resource configuration. Expected response to contain an {0} but got an {1}",e.isArray?"array":"object",b.isArray(c)?"array":"object");e.isArray?(A.length=0,n(c,function(a){A.push(new u(a))})):(f(c,A),A.$promise=d)}return A.$resolved=!0,a.resource=A,a},function(a){return A.$resolved=!0,(x||m)(a),d.reject(a)});return E=E.then(function(a){var b=C(a);return(w||m)(b,a.headers),b},D),z?E:(A.$promise=E,A.$resolved=!1,A)},u.prototype["$"+h]=function(a,b,c){q(a)&&(c=b,b=a,a={});var d=u[h].call(this,a,this,b,c);return d.$promise||d}}),u.bind=function(a){return k(h,o({},i,a),r)},u}var l={get:{method:"GET"},save:{method:"POST"},query:{method:"GET",isArray:!0},remove:{method:"DELETE"},"delete":{method:"DELETE"}},m=b.noop,n=b.forEach,o=b.extend,p=b.copy,q=b.isFunction;return j.prototype={setUrlParams:function(a,c,d){var e,f,i=this,j=d||i.template,k=i.urlParams={};n(j.split(/\W/),function(a){if("hasOwnProperty"===a)throw g("badname","hasOwnProperty is not a valid parameter name.");!new RegExp("^\\d+$").test(a)&&a&&new RegExp("(^|[^\\\\]):"+a+"(\\W|$)").test(j)&&(k[a]=!0)}),j=j.replace(/\\:/g,":"),c=c||{},n(i.urlParams,function(a,d){e=c.hasOwnProperty(d)?c[d]:i.defaults[d],b.isDefined(e)&&null!==e?(f=h(e),j=j.replace(new RegExp(":"+d+"(\\W|$)","g"),function(a,b){return f+b})):j=j.replace(new RegExp("(/?):"+d+"(\\W|$)","g"),function(a,b,c){return"/"==c.charAt(0)?c:b+c})}),j=j.replace(/\/+$/,"")||"/",j=j.replace(/\/\.(?=\w+($|\?))/,"."),a.url=j.replace(/\/\\\./,"/."),n(c,function(b,c){i.urlParams[c]||(a.params=a.params||{},a.params[c]=b)})}},k}])}(window,window.angular),function(a,b,c){"use strict";b.module("ngCookies",["ng"]).factory("$cookies",["$rootScope","$browser",function(a,d){function e(){var a,e,f,i;for(a in h)k(g[a])&&d.cookies(a,c);for(a in g)e=g[a],b.isString(e)||(e=""+e,g[a]=e),e!==h[a]&&(d.cookies(a,e),i=!0);if(i){i=!1,f=d.cookies();for(a in g)g[a]!==f[a]&&(k(f[a])?delete g[a]:g[a]=f[a],i=!0)}}var f,g={},h={},i=!1,j=b.copy,k=b.isUndefined;return d.addPollFn(function(){var b=d.cookies();f!=b&&(f=b,j(b,h),j(b,g),i&&a.$apply())})(),i=!0,a.$watch(e),g}]).factory("$cookieStore",["$cookies",function(a){return{get:function(c){var d=a[c];return d?b.fromJson(d):d},put:function(c,d){a[c]=b.toJson(d)},remove:function(b){delete a[b]}}}])}(window,window.angular),function(a,b){"use strict";function c(){this.$get=["$$sanitizeUri",function(a){return function(b){var c=[];return f(b,i(c,function(b,c){return!/^unsafe/.test(a(b,c))})),c.join("")}}]}function d(a){var c=[],d=i(c,b.noop);return d.chars(a),c.join("")}function e(a){var b,c={},d=a.split(",");for(b=0;b<d.length;b++)c[d[b]]=!0;return c}function f(a,c){function d(a,d,f,h){if(d=b.lowercase(d),x[d])for(;s.last()&&y[s.last()];)e("",s.last());w[d]&&s.last()==d&&e("",d),h=t[d]||!!h,h||s.push(d);var i={};f.replace(m,function(a,b,c,d,e){var f=c||d||e||"";i[b]=g(f)}),c.start&&c.start(d,i,h)}function e(a,d){var e,f=0;if(d=b.lowercase(d))for(f=s.length-1;f>=0&&s[f]!=d;f--);if(f>=0){for(e=s.length-1;e>=f;e--)c.end&&c.end(s[e]);s.length=f}}var f,h,i,s=[],u=a;for(s.last=function(){return s[s.length-1]};a;){if(h=!0,s.last()&&z[s.last()])a=a.replace(new RegExp("(.*)<\\s*\\/\\s*"+s.last()+"[^>]*>","i"),function(a,b){return b=b.replace(p,"$1").replace(r,"$1"),c.chars&&c.chars(g(b)),""}),e("",s.last());else if(0===a.indexOf("<!--")?(f=a.indexOf("--",4),f>=0&&a.lastIndexOf("-->",f)===f&&(c.comment&&c.comment(a.substring(4,f)),a=a.substring(f+3),h=!1)):q.test(a)?(i=a.match(q),i&&(a=a.replace(i[0],""),h=!1)):o.test(a)?(i=a.match(l),i&&(a=a.substring(i[0].length),i[0].replace(l,e),h=!1)):n.test(a)&&(i=a.match(k),i&&(a=a.substring(i[0].length),i[0].replace(k,d),h=!1)),h){f=a.indexOf("<");var v=0>f?a:a.substring(0,f);a=0>f?"":a.substring(f),c.chars&&c.chars(g(v))}if(a==u)throw j("badparse","The sanitizer was unable to parse the following block of html: {0}",a);u=a}e()}function g(a){if(!a)return"";var b=E.exec(a),c=b[1],d=b[3],e=b[2];return e&&(D.innerHTML=e.replace(/</g,"&lt;"),e="textContent"in D?D.textContent:D.innerText),c+e+d}function h(a){return a.replace(/&/g,"&amp;").replace(s,function(a){return"&#"+a.charCodeAt(0)+";"}).replace(/</g,"&lt;").replace(/>/g,"&gt;")}function i(a,c){var d=!1,e=b.bind(a,a.push);return{start:function(a,f,g){a=b.lowercase(a),!d&&z[a]&&(d=a),d||A[a]!==!0||(e("<"),e(a),b.forEach(f,function(d,f){var g=b.lowercase(f),i="img"===a&&"src"===g||"background"===g;C[g]!==!0||B[g]===!0&&!c(d,i)||(e(" "),e(f),e('="'),e(h(d)),e('"'))}),e(g?"/>":">"))},end:function(a){a=b.lowercase(a),d||A[a]!==!0||(e("</"),e(a),e(">")),a==d&&(d=!1)},chars:function(a){d||e(h(a))}}}var j=b.$$minErr("$sanitize"),k=/^<\s*([\w:-]+)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*>/,l=/^<\s*\/\s*([\w:-]+)[^>]*>/,m=/([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g,n=/^</,o=/^<\s*\//,p=/<!--(.*?)-->/g,q=/<!DOCTYPE([^>]*?)>/i,r=/<!\[CDATA\[(.*?)]]>/g,s=/([^\#-~| |!])/g,t=e("area,br,col,hr,img,wbr"),u=e("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"),v=e("rp,rt"),w=b.extend({},v,u),x=b.extend({},u,e("address,article,aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,script,section,table,ul")),y=b.extend({},v,e("a,abbr,acronym,b,bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s,samp,small,span,strike,strong,sub,sup,time,tt,u,var")),z=e("script,style"),A=b.extend({},t,x,y,w),B=e("background,cite,href,longdesc,src,usemap"),C=b.extend({},B,e("abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,scope,scrolling,shape,size,span,start,summary,target,title,type,valign,value,vspace,width")),D=document.createElement("pre"),E=/^(\s*)([\s\S]*?)(\s*)$/;b.module("ngSanitize",[]).provider("$sanitize",c),b.module("ngSanitize").filter("linky",["$sanitize",function(a){var c=/((ftp|https?):\/\/|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>]/,e=/^mailto:/;return function(f,g){function h(a){a&&n.push(d(a))}function i(a,c){n.push("<a "),b.isDefined(g)&&(n.push('target="'),n.push(g),n.push('" ')),n.push('href="'),n.push(a),n.push('">'),h(c),n.push("</a>")}if(!f)return f;for(var j,k,l,m=f,n=[];j=m.match(c);)k=j[0],j[2]==j[3]&&(k="mailto:"+k),l=j.index,h(m.substr(0,l)),i(k,j[0].replace(e,"")),m=m.substring(l+j[0].length);return h(m),a(n.join(""))}}])}(window,window.angular),function(){var a=angular.module("restangular",[]);a.provider("Restangular",function(){var a={};a.init=function(a,b){function c(a,b,c,d){var e={};return _.each(_.keys(d),function(f){var g=d[f];g.params=_.extend({},g.params,a.defaultRequestParams[g.method.toLowerCase()]),_.isEmpty(g.params)&&delete g.params,e[f]=a.isSafe(g.method)?function(){return b(_.extend(g,{url:c}))}:function(a){return b(_.extend(g,{url:c,data:a}))}}),e}a.configuration=b;var d=["get","head","options","trace","getlist"];b.isSafe=function(a){return _.contains(d,a.toLowerCase())
-};var e=/^https?:\/\//i;b.isAbsoluteUrl=function(a){return a&&e.test(a)},b.baseUrl=_.isUndefined(b.baseUrl)?"":b.baseUrl,a.setBaseUrl=function(a){return b.baseUrl=/\/$/.test(a)?a.substring(0,a.length-1):a,this},b.extraFields=b.extraFields||[],a.setExtraFields=function(a){return b.extraFields=a,this},b.defaultHttpFields=b.defaultHttpFields||{},a.setDefaultHttpFields=function(a){return b.defaultHttpFields=a,this},b.withHttpValues=function(a,c){return _.defaults(c,a,b.defaultHttpFields)},b.encodeIds=_.isUndefined(b.encodeIds)?!0:b.encodeIds,a.setEncodeIds=function(a){b.encodeIds=a},b.defaultRequestParams=b.defaultRequestParams||{get:{},post:{},put:{},remove:{},common:{}},a.setDefaultRequestParams=function(a,c){var d=[],e=c||a;return _.isUndefined(c)?d.push("common"):_.isArray(a)?d=a:d.push(a),_.each(d,function(a){b.defaultRequestParams[a]=e}),this},a.requestParams=b.defaultRequestParams,b.defaultHeaders=b.defaultHeaders||{},a.setDefaultHeaders=function(c){return b.defaultHeaders=c,a.defaultHeaders=b.defaultHeaders,this},a.defaultHeaders=b.defaultHeaders,b.methodOverriders=b.methodOverriders||[],a.setMethodOverriders=function(a){var c=_.extend([],a);return b.isOverridenMethod("delete",c)&&c.push("remove"),b.methodOverriders=c,this},b.isOverridenMethod=function(a,c){var d=c||b.methodOverriders;return!_.isUndefined(_.find(d,function(b){return b.toLowerCase()===a.toLowerCase()}))},b.urlCreator=b.urlCreator||"path",a.setUrlCreator=function(a){if(!_.has(b.urlCreatorFactory,a))throw new Error("URL Path selected isn't valid");return b.urlCreator=a,this},b.restangularFields=b.restangularFields||{id:"id",route:"route",parentResource:"parentResource",restangularCollection:"restangularCollection",cannonicalId:"__cannonicalId",etag:"restangularEtag",selfLink:"href",get:"get",getList:"getList",put:"put",post:"post",remove:"remove",head:"head",trace:"trace",options:"options",patch:"patch",getRestangularUrl:"getRestangularUrl",getRequestedUrl:"getRequestedUrl",putElement:"putElement",addRestangularMethod:"addRestangularMethod",getParentList:"getParentList",clone:"clone",ids:"ids",httpConfig:"_$httpConfig",reqParams:"reqParams"},a.setRestangularFields=function(a){return b.restangularFields=_.extend(b.restangularFields,a),this},b.setFieldToElem=function(a,b,c){var d=a.split("."),e=b;return _.each(_.initial(d),function(a){e[a]={},e=e[a]}),e[_.last(d)]=c,this},b.getFieldFromElem=function(a,b){var c=a.split("."),d=angular.copy(b);return _.each(c,function(a){d&&(d=d[a])}),d},b.setIdToElem=function(a,c){return b.setFieldToElem(b.restangularFields.id,a,c),this},b.getIdFromElem=function(a){return b.getFieldFromElem(b.restangularFields.id,a)},b.isValidId=function(a){return""!==a&&!_.isUndefined(a)&&!_.isNull(a)},b.setUrlToElem=function(a,c){return b.setFieldToElem(b.restangularFields.selfLink,a,c),this},b.getUrlFromElem=function(a){return b.getFieldFromElem(b.restangularFields.selfLink,a)},b.useCannonicalId=_.isUndefined(b.useCannonicalId)?!1:b.useCannonicalId,a.setUseCannonicalId=function(a){return b.useCannonicalId=a,this},b.getCannonicalIdFromElem=function(a){var c=a[b.restangularFields.cannonicalId],d=b.isValidId(c)?c:b.getIdFromElem(a);return d},b.responseExtractor=b.responseExtractor||function(a){return a},a.setResponseExtractor=function(a){return b.responseExtractor=a,this},a.setResponseInterceptor=a.setResponseExtractor,b.fullRequestInterceptor=b.fullRequestInterceptor||function(a,b,c,d,e,f,g){return{element:a,headers:e,params:f,httpConfig:g}},a.setRequestInterceptor=function(a){return b.fullRequestInterceptor=function(b,c,d,e,f,g,h){return{headers:f,params:g,element:a(b,c,d,e),httpConfig:h}},this},a.setFullRequestInterceptor=function(a){return b.fullRequestInterceptor=a,this},b.errorInterceptor=b.errorInterceptor||function(){},a.setErrorInterceptor=function(a){return b.errorInterceptor=a,this},b.onBeforeElemRestangularized=b.onBeforeElemRestangularized||function(a){return a},a.setOnBeforeElemRestangularized=function(a){return b.onBeforeElemRestangularized=a,this},b.onElemRestangularized=b.onElemRestangularized||function(a){return a},a.setOnElemRestangularized=function(a){return b.onElemRestangularized=a,this},a.setListTypeIsArray=function(){},b.shouldSaveParent=b.shouldSaveParent||function(){return!0},a.setParentless=function(a){return _.isArray(a)?b.shouldSaveParent=function(b){return!_.contains(a,b)}:_.isBoolean(a)&&(b.shouldSaveParent=function(){return!a}),this},b.suffix=_.isUndefined(b.suffix)?null:b.suffix,a.setRequestSuffix=function(a){return b.suffix=a,this},b.transformers=b.transformers||{},a.addElementTransformer=function(a,c,d){var e=null,f=null;2===arguments.length?f=c:(f=d,e=c);var g=b.transformers[a];g||(g=b.transformers[a]=[]),g.push(function(a,b){return _.isNull(e)||a==e?f(b):b})},a.extendCollection=function(b,c){return a.addElementTransformer(b,!0,c)},a.extendModel=function(b,c){return a.addElementTransformer(b,!1,c)},b.transformElem=function(a,c,d,e){var f=b.transformers[d],g=a;return f&&_.each(f,function(a){g=a(c,g)}),b.onElemRestangularized(g,c,d,e)},b.fullResponse=_.isUndefined(b.fullResponse)?!1:b.fullResponse,a.setFullResponse=function(a){return b.fullResponse=a,this},b.urlCreatorFactory={};var f=function(){};f.prototype.setConfig=function(a){return this.config=a,this},f.prototype.parentsArray=function(a){for(var b=[];a;)b.push(a),a=a[this.config.restangularFields.parentResource];return b.reverse()},f.prototype.resource=function(a,d,e,f,g,h,i,j){var k=_.defaults(g||{},this.config.defaultRequestParams.common),l=_.defaults(f||{},this.config.defaultHeaders);i&&(b.isSafe(j)?l["If-None-Match"]=i:l["If-Match"]=i);var m=this.base(a);if(h){var n="";/\/$/.test(m)||(n+="/"),n+=h,m+=n}return this.config.suffix&&-1===m.indexOf(this.config.suffix,m.length-this.config.suffix.length)&&(m+=this.config.suffix),a[this.config.restangularFields.httpConfig]=void 0,c(this.config,d,m,{getList:this.config.withHttpValues(e,{method:"GET",params:k,headers:l}),get:this.config.withHttpValues(e,{method:"GET",params:k,headers:l}),put:this.config.withHttpValues(e,{method:"PUT",params:k,headers:l}),post:this.config.withHttpValues(e,{method:"POST",params:k,headers:l}),remove:this.config.withHttpValues(e,{method:"DELETE",params:k,headers:l}),head:this.config.withHttpValues(e,{method:"HEAD",params:k,headers:l}),trace:this.config.withHttpValues(e,{method:"TRACE",params:k,headers:l}),options:this.config.withHttpValues(e,{method:"OPTIONS",params:k,headers:l}),patch:this.config.withHttpValues(e,{method:"PATCH",params:k,headers:l})})};var g=function(){};g.prototype=new f,g.prototype.base=function(a){var c=this;return _.reduce(this.parentsArray(a),function(a,d){var e,f=c.config.getUrlFromElem(d);if(f){if(c.config.isAbsoluteUrl(f))return f;e=f}else if(e=d[c.config.restangularFields.route],d[c.config.restangularFields.restangularCollection]){var g=d[c.config.restangularFields.ids];g&&(e+="/"+g.join(","))}else{var h;h=c.config.useCannonicalId?c.config.getCannonicalIdFromElem(d):c.config.getIdFromElem(d),b.isValidId(h)&&(e+="/"+(c.config.encodeIds?encodeURIComponent(h):h))}return a+"/"+e},this.config.baseUrl)},g.prototype.fetchUrl=function(a,b){var c=this.base(a);return b&&(c+="/"+b),c},g.prototype.fetchRequestedUrl=function(a,c){function d(a){var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c);return b.sort()}function e(a,b,c){for(var e=d(a),f=0;f<e.length;f++)b.call(c,a[e[f]],e[f]);return e}function f(a,b){return encodeURIComponent(a).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,b?"%20":"+")}var g=this.fetchUrl(a,c),h=a[b.restangularFields.reqParams];if(!h)return g;var i=[];return e(h,function(a,b){null!=a&&void 0!=a&&(angular.isArray(a)||(a=[a]),angular.forEach(a,function(a){angular.isObject(a)&&(a=angular.toJson(a)),i.push(f(b)+"="+f(a))}))}),g+(-1===g.indexOf("?")?"?":"&")+i.join("&")},b.urlCreatorFactory.path=g};var b={};a.init(this,b),this.$get=["$http","$q",function(c,d){function e(f){function g(a,b,c,d){if(b[f.restangularFields.route]=c,b[f.restangularFields.getRestangularUrl]=_.bind(N.fetchUrl,N,b),b[f.restangularFields.getRequestedUrl]=_.bind(N.fetchRequestedUrl,N,b),b[f.restangularFields.addRestangularMethod]=_.bind(K,b),b[f.restangularFields.clone]=_.bind(s,b,b),b[f.restangularFields.reqParams]=_.isEmpty(d)?null:d,b.withHttpConfig=_.bind(z,b),b.one=_.bind(h,b,b),b.all=_.bind(i,b,b),b.several=_.bind(j,b,b),b.oneUrl=_.bind(k,b,b),b.allUrl=_.bind(l,b,b),a&&f.shouldSaveParent(c)){var e=f.getIdFromElem(a),g=f.getUrlFromElem(a),m=_.union(_.values(_.pick(f.restangularFields,["route","parentResource"])),f.extraFields),n=_.pick(a,m);f.isValidId(e)&&f.setIdToElem(n,e),f.isValidId(g)&&f.setUrlToElem(n,g),b[f.restangularFields.parentResource]=n}else b[f.restangularFields.parentResource]=null;return b}function h(a,b,c){var d={};return f.setIdToElem(d,c),t(a,d,b)}function i(a,b){return u(a,[],b,!0)}function j(a,b){var c=[];return c[f.restangularFields.ids]=Array.prototype.splice.call(arguments,2),u(a,c,b,!0)}function k(a,b,c){var d={};return f.setUrlToElem(d,c),t(a,d,b)}function l(a,b,c){var d={};return f.setUrlToElem(d,c),u(a,d,b,!0)}function m(a,b){return a.call=_.bind(n,a),a.get=_.bind(o,a),a[f.restangularFields.restangularCollection]=b,b&&(a.push=_.bind(n,a,"push")),a}function n(a){var b=d.defer(),c=arguments;return this.then(function(d){var e=Array.prototype.slice.call(c,1),f=d[a];f.apply(d,e),b.resolve(d)}),m(b.promise,this[f.restangularFields.restangularCollection])}function o(a){var b=d.defer();return this.then(function(c){b.resolve(c[a])}),m(b.promise,this[f.restangularFields.restangularCollection])}function p(a,b,c){return f.fullResponse?a.resolve(_.extend(b,{data:c})):void a.resolve(c)}function q(a){return _.isArray(a)?_.without(a,_.values(_.omit(f.restangularFields,"id"))):_.omit(a,_.values(_.omit(f.restangularFields,"id")))}function r(a){a.customOperation=_.bind(J,a),_.each(["put","post","get","delete"],function(b){_.each(["do","custom"],function(c){var d,e="delete"===b?"remove":b,f=c+b.toUpperCase();d="put"!==e&&"post"!==e?J:function(a,b,c,d,e){return _.bind(J,this)(a,c,d,e,b)},a[f]=_.bind(d,a,e)})}),a.customGETLIST=_.bind(y,a),a.doGETLIST=a.customGETLIST}function s(a){var b=angular.copy(a);return t(b[f.restangularFields.parentResource],b,b[f.restangularFields.route])}function t(a,b,c,d,e){var h=f.onBeforeElemRestangularized(b,!1,c),i=g(a,h,c,e);return f.useCannonicalId&&(i[f.restangularFields.cannonicalId]=f.getIdFromElem(i)),d&&(i[f.restangularFields.getParentList]=function(){return d}),i[f.restangularFields.restangularCollection]=!1,i[f.restangularFields.get]=_.bind(B,i),i[f.restangularFields.getList]=_.bind(y,i),i[f.restangularFields.put]=_.bind(D,i),i[f.restangularFields.post]=_.bind(E,i),i[f.restangularFields.remove]=_.bind(C,i),i[f.restangularFields.head]=_.bind(F,i),i[f.restangularFields.trace]=_.bind(G,i),i[f.restangularFields.options]=_.bind(H,i),i[f.restangularFields.patch]=_.bind(I,i),r(i),f.transformElem(i,!1,c,M)}function u(a,b,c,d){var e=f.onBeforeElemRestangularized(b,!0,c),h=g(a,e,c,d);return h[f.restangularFields.restangularCollection]=!0,h[f.restangularFields.post]=_.bind(E,h,null),h[f.restangularFields.head]=_.bind(F,h),h[f.restangularFields.trace]=_.bind(G,h),h[f.restangularFields.putElement]=_.bind(w,h),h[f.restangularFields.options]=_.bind(H,h),h[f.restangularFields.patch]=_.bind(I,h),h[f.restangularFields.get]=_.bind(v,h),h[f.restangularFields.getList]=_.bind(y,h,null),r(h),f.transformElem(h,!0,c,M)}function v(a,b,c){return this.customGET(a.toString(),b,c)}function w(a,b,c){var e=this,f=this[a],g=d.defer();return f.put(b,c).then(function(b){var c=s(e);c[a]=b,g.resolve(c)},function(a){g.reject(a)}),m(g.promise,!0)}function x(a,b,c,d,e,g){var h=f.responseExtractor(a,b,c,d,e,g),i=e.headers("ETag");return h&&i&&(h[f.restangularFields.etag]=i),h}function y(a,b,e){var g=this,h=d.defer(),i="getList",j=N.fetchUrl(this,a),k=a||g[f.restangularFields.route],l=f.fullRequestInterceptor(null,i,k,j,e||{},b||{},this[f.restangularFields.httpConfig]||{});return N.resource(this,c,l.httpConfig,l.headers,l.params,a,this[f.restangularFields.etag],i).getList().then(function(b){var c=b.data,d=b.config.params,e=x(c,i,k,j,b,h),l=_.map(e,function(b){return g[f.restangularFields.restangularCollection]?t(g[f.restangularFields.parentResource],b,g[f.restangularFields.route],e):t(g,b,a,e)});l=_.extend(e,l),g[f.restangularFields.restangularCollection]?p(h,b,u(g[f.restangularFields.parentResource],l,g[f.restangularFields.route],d)):p(h,b,u(g,l,a,d))},function(a){f.errorInterceptor(a)!==!1&&h.reject(a)}),m(h.promise,!0)}function z(a){return this[f.restangularFields.httpConfig]=a,this}function A(a,b,e,g,h){var i=this,j=d.defer(),k=e||{},l=b||this[f.restangularFields.route],n=N.fetchUrl(this,b),o=g||this,r=o[f.restangularFields.etag];_.isObject(o)&&(o=q(o));var s=f.fullRequestInterceptor(o,a,l,n,h||{},k||{},this[f.restangularFields.httpConfig]||{}),u=function(c){var d=c.data,e=c.config.params,g=x(d,a,l,n,c,j);g?"post"!==a||i[f.restangularFields.restangularCollection]?p(j,c,t(i[f.restangularFields.parentResource],g,i[f.restangularFields.route],e)):p(j,c,t(i,g,b,e)):p(j,c,void 0)},v=function(a){f.errorInterceptor(a)!==!1&&j.reject(a)},w=a,y=_.extend({},s.headers),z=f.isOverridenMethod(a);return z&&(w="post",y=_.extend(y,{"X-HTTP-Method-Override":"remove"===a?"DELETE":a})),f.isSafe(a)?z?N.resource(this,c,s.httpConfig,y,s.params,b,r,w)[w]({}).then(u,v):N.resource(this,c,s.httpConfig,y,s.params,b,r,w)[w]().then(u,v):N.resource(this,c,s.httpConfig,y,s.params,b,r,w)[w](s.element).then(u,v),m(j.promise)}function B(a,b){return _.bind(A,this)("get",void 0,a,void 0,b)}function C(a,b){return _.bind(A,this)("remove",void 0,a,void 0,b)}function D(a,b){return _.bind(A,this)("put",void 0,a,void 0,b)}function E(a,b,c,d){return _.bind(A,this)("post",a,c,b,d)}function F(a,b){return _.bind(A,this)("head",void 0,a,void 0,b)}function G(a,b){return _.bind(A,this)("trace",void 0,a,void 0,b)}function H(a,b){return _.bind(A,this)("options",void 0,a,void 0,b)}function I(a,b,c){return _.bind(A,this)("patch",void 0,b,a,c)}function J(a,b,c,d,e){return _.bind(A,this)(a,b,c,e,d)}function K(a,b,c,d,e,g){var h;h="getList"===b?_.bind(y,this,c):_.bind(J,this,b,c);var i=function(a,b,c){var f=_.defaults({params:a,headers:b,elem:c},{params:d,headers:e,elem:g});return h(f.params,f.headers,f.elem)};this[a]=f.isSafe(b)?i:function(a,b,c){return i(b,c,a)}}function L(c){var d=angular.copy(b);return a.init(d,d),c(d),e(d)}var M={},N=new f.urlCreatorFactory[f.urlCreator];return N.setConfig(f),a.init(M,f),M.copy=_.bind(s,M),M.withConfig=_.bind(L,M),M.one=_.bind(h,M,null),M.all=_.bind(i,M,null),M.several=_.bind(j,M,null),M.oneUrl=_.bind(k,M,null),M.allUrl=_.bind(l,M,null),M.restangularizeElement=_.bind(t,M),M.restangularizeCollection=_.bind(u,M),M}return e(b)}]})}(),function(a,b){"use strict";var c=6,d=4,e="asc",f="desc",g="_ng_field_",h="_ng_depth_",i="_ng_hidden_",j="_ng_column_",k=/CUSTOM_FILTERS/g,l=/COL_FIELD/g,m=/DISPLAY_CELL_TEMPLATE/g,n=/EDITABLE_CELL_TEMPLATE/g,o=/CELL_EDITABLE_CONDITION/g,p=/<.+>/;a.ngGrid={},a.ngGrid.i18n={};var q=(angular.module("ngGrid.services",[]),angular.module("ngGrid.directives",[])),r=angular.module("ngGrid.filters",[]);angular.module("ngGrid",["ngGrid.services","ngGrid.directives","ngGrid.filters"]);var s=function(a,b,d,e){if(void 0===a.selectionProvider.selectedItems)return!0;var f,g=d.which||d.keyCode,h=!1,i=!1,j=void 0===a.selectionProvider.lastClickedRow?1:a.selectionProvider.lastClickedRow.rowIndex,k=a.columns.filter(function(a){return a.visible}),l=a.columns.filter(function(a){return a.pinned});if(a.col&&(f=k.indexOf(a.col)),37!==g&&38!==g&&39!==g&&40!==g&&(e.config.noTabInterference||9!==g)&&13!==g)return!0;if(a.enableCellSelection){9===g&&d.preventDefault();var m=a.showSelectionCheckbox?1===a.col.index:0===a.col.index,n=1===a.$index||0===a.$index,o=a.$index===a.renderedColumns.length-1||a.$index===a.renderedColumns.length-2,p=k.indexOf(a.col)===k.length-1,q=l.indexOf(a.col)===l.length-1;if(37===g||9===g&&d.shiftKey){var r=0;m||(f-=1),n?m&&9===g&&d.shiftKey?(r=e.$canvas.width(),f=k.length-1,i=!0):r=e.$viewport.scrollLeft()-a.col.width:l.length>0&&(r=e.$viewport.scrollLeft()-k[f].width),e.$viewport.scrollLeft(r)}else(39===g||9===g&&!d.shiftKey)&&(o?p&&9===g&&!d.shiftKey?(e.$viewport.scrollLeft(0),f=a.showSelectionCheckbox?1:0,h=!0):e.$viewport.scrollLeft(e.$viewport.scrollLeft()+a.col.width):q&&e.$viewport.scrollLeft(0),p||(f+=1))}var s;s=a.configGroups.length>0?e.rowFactory.parsedData.filter(function(a){return!a.isAggRow}):e.filteredRows;var t=0;if(0!==j&&(38===g||13===g&&d.shiftKey||9===g&&d.shiftKey&&i)?t=-1:j!==s.length-1&&(40===g||13===g&&!d.shiftKey||9===g&&h)&&(t=1),t){var u=s[j+t];u.beforeSelectionChange(u,d)&&(u.continueSelection(d),a.$emit("ngGridEventDigestGridParent"),a.selectionProvider.lastClickedRow.renderedRowIndex>=a.renderedRows.length-c-2?e.$viewport.scrollTop(e.$viewport.scrollTop()+a.rowHeight):a.selectionProvider.lastClickedRow.renderedRowIndex<=c+2&&e.$viewport.scrollTop(e.$viewport.scrollTop()-a.rowHeight))}return a.enableCellSelection&&setTimeout(function(){a.domAccessProvider.focusCellElement(a,a.renderedColumns.indexOf(k[f]))},3),!1};String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}),Array.prototype.indexOf||(Array.prototype.indexOf=function(a){var b=this.length>>>0,c=Number(arguments[1])||0;for(c=0>c?Math.ceil(c):Math.floor(c),0>c&&(c+=b);b>c;c++)if(c in this&&this[c]===a)return c;return-1}),Array.prototype.filter||(Array.prototype.filter=function(a){var b=Object(this),c=b.length>>>0;if("function"!=typeof a)throw new TypeError;for(var d=[],e=arguments[1],f=0;c>f;f++)if(f in b){var g=b[f];a.call(e,g,f,b)&&d.push(g)}return d}),r.filter("checkmark",function(){return function(a){return a?"✔":"✘"}}),r.filter("ngColumns",function(){return function(a){return a.filter(function(a){return!a.isAggCol})}}),angular.module("ngGrid.services").factory("$domUtilityService",["$utilityService","$window",function(a,c){var d={},e={},f=function(){var a=b("<div></div>");a.appendTo("body"),a.height(100).width(100).css("position","absolute").css("overflow","scroll"),a.append('<div style="height: 400px; width: 400px;"></div>'),d.ScrollH=a.height()-a[0].clientHeight,d.ScrollW=a.width()-a[0].clientWidth,a.empty(),a.attr("style",""),a.append('<span style="font-family: Verdana, Helvetica, Sans-Serif; font-size: 14px;"><strong>M</strong></span>'),d.LetterW=a.children().first().width(),a.remove()};return d.eventStorage={},d.AssignGridContainers=function(a,c,e){e.$root=b(c),e.$topPanel=e.$root.find(".ngTopPanel"),e.$groupPanel=e.$root.find(".ngGroupPanel"),e.$headerContainer=e.$topPanel.find(".ngHeaderContainer"),a.$headerContainer=e.$headerContainer,e.$headerScroller=e.$topPanel.find(".ngHeaderScroller"),e.$headers=e.$headerScroller.children(),e.$viewport=e.$root.find(".ngViewport"),e.$canvas=e.$viewport.find(".ngCanvas"),e.$footerPanel=e.$root.find(".ngFooterPanel");var f=a.$watch(function(){return e.$viewport.scrollLeft()},function(a){return e.$headerContainer.scrollLeft(a)});a.$on("$destroy",function(){b(e.$root.parent()).off("resize.nggrid"),e.$root=null,e.$topPanel=null,e.$headerContainer=null,e.$headers=null,e.$canvas=null,e.$footerPanel=null,f()}),d.UpdateGridLayout(a,e)},d.getRealWidth=function(a){var c=0,d={visibility:"hidden",display:"block"},e=a.parents().andSelf().not(":visible");return b.swap(e[0],d,function(){c=a.outerWidth()}),c},d.UpdateGridLayout=function(a,b){if(b.$root){var c=b.$viewport.scrollTop();b.elementDims.rootMaxW=b.$root.width(),b.$root.is(":hidden")&&(b.elementDims.rootMaxW=d.getRealWidth(b.$root)),b.elementDims.rootMaxH=b.$root.height(),b.refreshDomSizes(),a.adjustScrollTop(c,!0)}},d.numberOfGrids=0,d.setStyleText=function(a,b){var d=a.styleSheet,e=a.gridId,f=c.document;d||(d=f.getElementById(e)),d||(d=f.createElement("style"),d.type="text/css",d.id=e,(f.head||f.getElementsByTagName("head")[0]).appendChild(d)),d.styleSheet&&!d.sheet?d.styleSheet.cssText=b:d.innerHTML=b,a.styleSheet=d,a.styleText=b},d.BuildStyles=function(a,b,c){var e,f=b.config.rowHeight,g=b.gridId,h=a.columns,i=0,j=a.totalRowWidth();e="."+g+" .ngCanvas { width: "+j+"px; }."+g+" .ngRow { width: "+j+"px; }."+g+" .ngCanvas { width: "+j+"px; }."+g+" .ngHeaderScroller { width: "+(j+d.ScrollH)+"px}";for(var k=0;k<h.length;k++){var l=h[k];l.visible!==!1&&(e+="."+g+" .col"+k+" { width: "+l.width+"px; left: "+i+"px; height: "+f+"px }."+g+" .colt"+k+" { width: "+l.width+"px; }",i+=l.width)}d.setStyleText(b,e),a.adjustScrollLeft(b.$viewport.scrollLeft()),c&&d.digest(a)},d.setColLeft=function(a,b,c){if(c.styleText){var f=e[a.index];f||(f=e[a.index]=new RegExp(".col"+a.index+" { width: [0-9]+px; left: [0-9]+px"));var g=c.styleText.replace(f,".col"+a.index+" { width: "+a.width+"px; left: "+b+"px");d.setStyleText(c,g)}},d.setColLeft.immediate=1,d.RebuildGrid=function(a,b){d.UpdateGridLayout(a,b),(null==b.config.maintainColumnRatios||b.config.maintainColumnRatios)&&b.configureColumnWidths(),a.adjustScrollLeft(b.$viewport.scrollLeft()),d.BuildStyles(a,b,!0)},d.digest=function(a){a.$root.$$phase||a.$digest()},d.ScrollH=17,d.ScrollW=17,d.LetterW=10,f(),d}]),angular.module("ngGrid.services").factory("$sortService",["$parse",function(a){var b={};return b.colSortFnCache={},b.isCustomSort=!1,b.guessSortFn=function(a){var c=typeof a;switch(c){case"number":return b.sortNumber;case"boolean":return b.sortBool;case"string":return a.match(/^[-+]?[£$¤]?[\d,.]+%?$/)?b.sortNumberStr:b.sortAlpha;default:return"[object Date]"===Object.prototype.toString.call(a)?b.sortDate:b.basicSort}},b.basicSort=function(a,b){return a===b?0:b>a?-1:1},b.sortNumber=function(a,b){return a-b},b.sortNumberStr=function(a,b){var c,d,e=!1,f=!1;return c=parseFloat(a.replace(/[^0-9.-]/g,"")),isNaN(c)&&(e=!0),d=parseFloat(b.replace(/[^0-9.-]/g,"")),isNaN(d)&&(f=!0),e&&f?0:e?1:f?-1:c-d},b.sortAlpha=function(a,b){var c=a.toLowerCase(),d=b.toLowerCase();return c===d?0:d>c?-1:1},b.sortDate=function(a,b){var c=a.getTime(),d=b.getTime();return c===d?0:d>c?-1:1},b.sortBool=function(a,b){return a&&b?0:a||b?a?1:-1:0},b.sortData=function(c,d){if(d&&c){var f,g,h=c.fields.length,i=c.fields,j=d.slice(0);d.sort(function(d,k){for(var l,m,n=0,o=0;0===n&&h>o;){f=c.columns[o],g=c.directions[o],m=b.getSortFn(f,j);var p=a(i[o])(d),q=a(i[o])(k);b.isCustomSort?(l=m(p,q),n=g===e?l:0-l):!p&&0!==p||!q&&0!==q?q||p?p?q||(n=-1):n=1:n=0:(l=m(p,q),n=g===e?l:0-l),o++}return n})}},b.Sort=function(a,c){b.isSorting||(b.isSorting=!0,b.sortData(a,c),b.isSorting=!1)},b.getSortFn=function(c,d){var e,f;if(b.colSortFnCache[c.field])e=b.colSortFnCache[c.field];else if(void 0!==c.sortingAlgorithm)e=c.sortingAlgorithm,b.colSortFnCache[c.field]=c.sortingAlgorithm,b.isCustomSort=!0;else{if(f=d[0],!f)return e;e=b.guessSortFn(a(c.field)(f)),e?b.colSortFnCache[c.field]=e:e=b.sortAlpha}return e},b}]),angular.module("ngGrid.services").factory("$utilityService",["$parse",function(c){var d=/function (.{1,})\(/,e={visualLength:function(a){var c=document.getElementById("testDataLength");c||(c=document.createElement("SPAN"),c.id="testDataLength",c.style.visibility="hidden",document.body.appendChild(c));var d=b(a);b(c).css({font:d.css("font"),"font-size":d.css("font-size"),"font-family":d.css("font-family")}),c.innerHTML=d.text();var e=c.offsetWidth;return document.body.removeChild(c),e},forIn:function(a,b){for(var c in a)a.hasOwnProperty(c)&&b(a[c],c)},evalProperty:function(a,b){return c("entity."+b)({entity:a})},endsWith:function(a,b){return a&&b&&"string"==typeof a?-1!==a.indexOf(b,a.length-b.length):!1},isNullOrUndefined:function(a){return void 0===a||null===a?!0:!1},getElementsByClassName:function(a){if(document.getElementsByClassName)return document.getElementsByClassName(a);for(var b=[],c=new RegExp("\\b"+a+"\\b"),d=document.getElementsByTagName("*"),e=0;e<d.length;e++){var f=d[e].className;c.test(f)&&b.push(d[e])}return b},newId:function(){var a=(new Date).getTime();return function(){return a+=1}}(),seti18n:function(b,c){var d=a.ngGrid.i18n[c];for(var e in d)b.i18n[e]=d[e]},getInstanceType:function(a){var b=d.exec(a.constructor.toString());if(b&&b.length>1){var c=b[1].replace(/^\s+|\s+$/g,"");return c}return""}};return e}]);var t=function(a,b,c,d){this.rowIndex=0,this.offsetTop=this.rowIndex*c,this.entity=a,this.label=a.gLabel,this.field=a.gField,this.depth=a.gDepth,this.parent=a.parent,this.children=a.children,this.aggChildren=a.aggChildren,this.aggIndex=a.aggIndex,this.collapsed=d,this.groupInitState=d,this.rowFactory=b,this.rowHeight=c,this.isAggRow=!0,this.offsetLeft=25*a.gDepth,this.aggLabelFilter=a.aggLabelFilter};t.prototype.toggleExpand=function(){this.collapsed=this.collapsed?!1:!0,this.orig&&(this.orig.collapsed=this.collapsed),this.notifyChildren()},t.prototype.setExpand=function(a){this.collapsed=a,this.notifyChildren()},t.prototype.notifyChildren=function(){for(var a=Math.max(this.rowFactory.aggCache.length,this.children.length),b=0;a>b;b++)if(this.aggChildren[b]&&(this.aggChildren[b].entity[i]=this.collapsed,this.collapsed&&this.aggChildren[b].setExpand(this.collapsed)),this.children[b]&&(this.children[b][i]=this.collapsed),b>this.aggIndex&&this.rowFactory.aggCache[b]){var c=this.rowFactory.aggCache[b],d=30*this.children.length;c.offsetTop=this.collapsed?c.offsetTop-d:c.offsetTop+d}this.rowFactory.renderedChange()},t.prototype.aggClass=function(){return this.collapsed?"ngAggArrowCollapsed":"ngAggArrowExpanded"},t.prototype.totalChildren=function(){if(this.aggChildren.length>0){var a=0,b=function(c){c.aggChildren.length>0?angular.forEach(c.aggChildren,function(a){b(a)}):a+=c.children.length};return b(this),a}return this.children.length},t.prototype.copy=function(){var a=new t(this.entity,this.rowFactory,this.rowHeight,this.groupInitState);return a.orig=this,a};var u=function(a,c,d,g,h,i){var j=this,l=a.colDef,m=500,n=0,o=null;j.colDef=a.colDef,j.width=l.width,j.groupIndex=0,j.isGroupedBy=!1,j.minWidth=l.minWidth?l.minWidth:50,j.maxWidth=l.maxWidth?l.maxWidth:9e3,j.enableCellEdit=void 0!==l.enableCellEdit?l.enableCellEdit:a.enableCellEdit||a.enableCellEditOnFocus,j.cellEditableCondition=l.cellEditableCondition||a.cellEditableCondition||"true",j.headerRowHeight=a.headerRowHeight,j.displayName=void 0===l.displayName?l.field:l.displayName,j.index=a.index,j.isAggCol=a.isAggCol,j.cellClass=l.cellClass,j.sortPriority=void 0,j.cellFilter=l.cellFilter?l.cellFilter:"",j.field=l.field,j.aggLabelFilter=l.aggLabelFilter||l.cellFilter,j.visible=i.isNullOrUndefined(l.visible)||l.visible,j.sortable=!1,j.resizable=!1,j.pinnable=!1,j.pinned=a.enablePinning&&l.pinned,j.originalIndex=null==a.originalIndex?j.index:a.originalIndex,j.groupable=i.isNullOrUndefined(l.groupable)||l.groupable,a.enableSort&&(j.sortable=i.isNullOrUndefined(l.sortable)||l.sortable),a.enableResize&&(j.resizable=i.isNullOrUndefined(l.resizable)||l.resizable),a.enablePinning&&(j.pinnable=i.isNullOrUndefined(l.pinnable)||l.pinnable),j.sortDirection=void 0,j.sortingAlgorithm=l.sortFn,j.headerClass=l.headerClass,j.cursor=j.sortable?"pointer":"default",j.headerCellTemplate=l.headerCellTemplate||h.get("headerCellTemplate.html"),j.cellTemplate=l.cellTemplate||h.get("cellTemplate.html").replace(k,j.cellFilter?"|"+j.cellFilter:""),j.enableCellEdit&&(j.cellEditTemplate=l.cellEditTemplate||h.get("cellEditTemplate.html"),j.editableCellTemplate=l.editableCellTemplate||h.get("editableCellTemplate.html")),l.cellTemplate&&!p.test(l.cellTemplate)&&(j.cellTemplate=h.get(l.cellTemplate)||b.ajax({type:"GET",url:l.cellTemplate,async:!1}).responseText),j.enableCellEdit&&l.editableCellTemplate&&!p.test(l.editableCellTemplate)&&(j.editableCellTemplate=h.get(l.editableCellTemplate)||b.ajax({type:"GET",url:l.editableCellTemplate,async:!1}).responseText),l.headerCellTemplate&&!p.test(l.headerCellTemplate)&&(j.headerCellTemplate=h.get(l.headerCellTemplate)||b.ajax({type:"GET",url:l.headerCellTemplate,async:!1}).responseText),j.colIndex=function(){var a=j.pinned?"pinned ":"";return a+="col"+j.index+" colt"+j.index,j.cellClass&&(a+=" "+j.cellClass),a},j.groupedByClass=function(){return j.isGroupedBy?"ngGroupedByIcon":"ngGroupIcon"},j.toggleVisible=function(){j.visible=!j.visible},j.showSortButtonUp=function(){return j.sortable?j.sortDirection===f:j.sortable},j.showSortButtonDown=function(){return j.sortable?j.sortDirection===e:j.sortable},j.noSortVisible=function(){return!j.sortDirection},j.sort=function(b){if(!j.sortable)return!0;var c=j.sortDirection===e?f:e;return j.sortDirection=c,a.sortCallback(j,b),!1},j.gripClick=function(){n++,1===n?o=setTimeout(function(){n=0},m):(clearTimeout(o),a.resizeOnDataCallback(j),n=0)},j.gripOnMouseDown=function(a){return c.isColumnResizing=!0,a.ctrlKey&&!j.pinned?(j.toggleVisible(),g.BuildStyles(c,d),!0):(a.target.parentElement.style.cursor="col-resize",j.startMousePosition=a.clientX,j.origWidth=j.width,b(document).mousemove(j.onMouseMove),b(document).mouseup(j.gripOnMouseUp),!1)},j.onMouseMove=function(a){var b=a.clientX-j.startMousePosition,e=b+j.origWidth;return j.width=e<j.minWidth?j.minWidth:e>j.maxWidth?j.maxWidth:e,c.hasUserChangedGridColumnWidths=!0,g.BuildStyles(c,d),!1},j.gripOnMouseUp=function(a){return b(document).off("mousemove",j.onMouseMove),b(document).off("mouseup",j.gripOnMouseUp),a.target.parentElement.style.cursor="default",g.digest(c),c.isColumnResizing=!1,!1},j.copy=function(){var b=new u(a,c,d,g,h,i);return b.isClone=!0,b.orig=j,b},j.setVars=function(a){j.orig=a,j.width=a.width,j.groupIndex=a.groupIndex,j.isGroupedBy=a.isGroupedBy,j.displayName=a.displayName,j.index=a.index,j.isAggCol=a.isAggCol,j.cellClass=a.cellClass,j.cellFilter=a.cellFilter,j.field=a.field,j.aggLabelFilter=a.aggLabelFilter,j.visible=a.visible,j.sortable=a.sortable,j.resizable=a.resizable,j.pinnable=a.pinnable,j.pinned=a.pinned,j.originalIndex=a.originalIndex,j.sortDirection=a.sortDirection,j.sortingAlgorithm=a.sortingAlgorithm,j.headerClass=a.headerClass,j.headerCellTemplate=a.headerCellTemplate,j.cellTemplate=a.cellTemplate,j.cellEditTemplate=a.cellEditTemplate}},v=function(a){this.outerHeight=null,this.outerWidth=null,b.extend(this,a)},w=function(a){this.previousColumn=null,this.grid=a};w.prototype.changeUserSelect=function(a,b){a.css({"-webkit-touch-callout":b,"-webkit-user-select":b,"-khtml-user-select":b,"-moz-user-select":"none"===b?"-moz-none":b,"-ms-user-select":b,"user-select":b})},w.prototype.focusCellElement=function(a,b){if(a.selectionProvider.lastClickedRow){var c=void 0!==b?b:this.previousColumn,d=a.selectionProvider.lastClickedRow.clone?a.selectionProvider.lastClickedRow.clone.elm:a.selectionProvider.lastClickedRow.elm;if(void 0!==c&&d){var e=angular.element(d[0].children).filter(function(){return 8!==this.nodeType}),f=Math.max(Math.min(a.renderedColumns.length-1,c),0);this.grid.config.showSelectionCheckbox&&angular.element(e[f]).scope()&&0===angular.element(e[f]).scope().col.index&&(f=1),e[f]&&e[f].children[1].children[0].focus(),this.previousColumn=c}}},w.prototype.selectionHandlers=function(a,b){function c(c){if(16===c.keyCode)return f.changeUserSelect(b,"none",c),!0;if(!e){e=!0;var d=s(a,b,c,f.grid);return e=!1,d}return!0}function d(a){return 16===a.keyCode&&f.changeUserSelect(b,"text",a),!0}var e=!1,f=this;b.bind("keydown",c),b.bind("keyup",d),b.on("$destroy",function(){b.off("keydown",c),b.off("keyup",d)})};var x=function(c,d,e,f){var g=this;g.colToMove=void 0,g.groupToMove=void 0,g.assignEvents=function(){c.config.jqueryUIDraggable&&!c.config.enablePinning?(c.$groupPanel.droppable({addClasses:!1,drop:function(a){g.onGroupDrop(a)}}),c.$groupPanel.on("$destroy",function(){c.$groupPanel=null})):(c.$groupPanel.on("mousedown",g.onGroupMouseDown).on("dragover",g.dragOver).on("drop",g.onGroupDrop),c.$topPanel.on("mousedown",".ngHeaderScroller",g.onHeaderMouseDown).on("dragover",".ngHeaderScroller",g.dragOver),c.$groupPanel.on("$destroy",function(){c.$groupPanel&&c.$groupPanel.off("mousedown"),c.$groupPanel=null}),c.config.enableColumnReordering&&c.$topPanel.on("drop",".ngHeaderScroller",g.onHeaderDrop),c.$topPanel.on("$destroy",function(){c.$topPanel&&c.$topPanel.off("mousedown"),c.config.enableColumnReordering&&c.$topPanel&&c.$topPanel.off("drop"),c.$topPanel=null
-})),d.$on("$destroy",d.$watch("renderedColumns",function(){f(g.setDraggables)}))},g.dragStart=function(a){a.dataTransfer.setData("text","")},g.dragOver=function(a){a.preventDefault()},g.setDraggables=function(){if(c.config.jqueryUIDraggable)c.$root&&c.$root.find(".ngHeaderSortColumn").draggable({helper:"clone",appendTo:"body",stack:"div",addClasses:!1,start:function(a){g.onHeaderMouseDown(a)}}).droppable({drop:function(a){g.onHeaderDrop(a)}});else{var a=c.$root.find(".ngHeaderSortColumn");if(angular.forEach(a,function(a){a.className&&-1!==a.className.indexOf("ngHeaderSortColumn")&&(a.setAttribute("draggable","true"),a.addEventListener&&(a.addEventListener("dragstart",g.dragStart),angular.element(a).on("$destroy",function(){angular.element(a).off("dragstart",g.dragStart),a.removeEventListener("dragstart",g.dragStart)})))}),-1!==navigator.userAgent.indexOf("MSIE")){var b=c.$root.find(".ngHeaderSortColumn");b.bind("selectstart",function(){return this.dragDrop(),!1}),angular.element(b).on("$destroy",function(){b.off("selectstart")})}}},g.onGroupMouseDown=function(a){var d=b(a.target);if("ngRemoveGroup"!==d[0].className){var e=angular.element(d).scope();e&&(c.config.jqueryUIDraggable||(d.attr("draggable","true"),this.addEventListener&&(this.addEventListener("dragstart",g.dragStart),angular.element(this).on("$destroy",function(){this.removeEventListener("dragstart",g.dragStart)})),-1!==navigator.userAgent.indexOf("MSIE")&&(d.bind("selectstart",function(){return this.dragDrop(),!1}),d.on("$destroy",function(){d.off("selectstart")}))),g.groupToMove={header:d,groupName:e.group,index:e.$index})}else g.groupToMove=void 0},g.onGroupDrop=function(a){a.stopPropagation();var e,f;g.groupToMove?(e=b(a.target).closest(".ngGroupElement"),"ngGroupPanel"===e.context.className?(d.configGroups.splice(g.groupToMove.index,1),d.configGroups.push(g.groupToMove.groupName)):(f=angular.element(e).scope(),f&&g.groupToMove.index!==f.$index&&(d.configGroups.splice(g.groupToMove.index,1),d.configGroups.splice(f.$index,0,g.groupToMove.groupName))),g.groupToMove=void 0,c.fixGroupIndexes()):g.colToMove&&(-1===d.configGroups.indexOf(g.colToMove.col)&&(e=b(a.target).closest(".ngGroupElement"),"ngGroupPanel"===e.context.className||"ngGroupPanelDescription ng-binding"===e.context.className?d.groupBy(g.colToMove.col):(f=angular.element(e).scope(),f&&d.removeGroup(f.$index))),g.colToMove=void 0),d.$$phase||d.$apply()},g.onHeaderMouseDown=function(a){var c=b(a.target).closest(".ngHeaderSortColumn"),d=angular.element(c).scope();d&&(g.colToMove={header:c,col:d.col})},g.onHeaderDrop=function(a){if(g.colToMove&&!g.colToMove.col.pinned){var f=b(a.target).closest(".ngHeaderSortColumn"),h=angular.element(f).scope();if(h){if(g.colToMove.col===h.col||h.col.pinned)return;d.columns.splice(g.colToMove.col.index,1),d.columns.splice(h.col.index,0,g.colToMove.col),c.fixColumnIndexes(),g.colToMove=void 0,e.digest(d)}}},g.assignGridEventHandlers=function(){-1===c.config.tabIndex?(c.$viewport.attr("tabIndex",e.numberOfGrids),e.numberOfGrids++):c.$viewport.attr("tabIndex",c.config.tabIndex);var f,g=function(){clearTimeout(f),f=setTimeout(function(){e.RebuildGrid(d,c)},100)};b(a).on("resize.nggrid",g);var h,i=function(){clearTimeout(h),h=setTimeout(function(){e.RebuildGrid(d,c)},100)};b(c.$root.parent()).on("resize.nggrid",i),d.$on("$destroy",function(){b(a).off("resize.nggrid",g)})},g.assignGridEventHandlers(),g.assignEvents()},y=function(a,b){a.maxRows=function(){var c=Math.max(a.totalServerItems,b.data.length);return c},a.$on("$destroy",a.$watch("totalServerItems",function(){a.currentMaxPages=a.maxPages()})),a.multiSelect=b.config.enableRowSelection&&b.config.multiSelect,a.selectedItemCount=b.selectedItemCount,a.maxPages=function(){return 0===a.maxRows()?1:Math.ceil(a.maxRows()/a.pagingOptions.pageSize)},a.pageForward=function(){var b=a.pagingOptions.currentPage;a.totalServerItems>0?a.pagingOptions.currentPage=Math.min(b+1,a.maxPages()):a.pagingOptions.currentPage++},a.pageBackward=function(){var b=a.pagingOptions.currentPage;a.pagingOptions.currentPage=Math.max(b-1,1)},a.pageToFirst=function(){a.pagingOptions.currentPage=1},a.pageToLast=function(){var b=a.maxPages();a.pagingOptions.currentPage=b},a.cantPageForward=function(){var c=a.pagingOptions.currentPage,d=a.maxPages();return a.totalServerItems>0?c>=d:b.data.length<1},a.cantPageToLast=function(){return a.totalServerItems>0?a.cantPageForward():!0},a.cantPageBackward=function(){var b=a.pagingOptions.currentPage;return 1>=b}},z=function(e,f,g,h,j,k,l,m,n,o,q){var r={aggregateTemplate:void 0,afterSelectionChange:function(){},beforeSelectionChange:function(){return!0},checkboxCellTemplate:void 0,checkboxHeaderTemplate:void 0,columnDefs:void 0,data:[],dataUpdated:function(){},enableCellEdit:!1,enableCellEditOnFocus:!1,enableCellSelection:!1,enableColumnResize:!1,enableColumnReordering:!1,enableColumnHeavyVirt:!1,enablePaging:!1,enablePinning:!1,enableRowSelection:!0,enableSorting:!0,enableHighlighting:!1,excludeProperties:[],filterOptions:{filterText:"",useExternalFilter:!1},footerRowHeight:55,footerTemplate:void 0,forceSyncScrolling:!0,groups:[],groupsCollapsedByDefault:!0,headerRowHeight:30,headerRowTemplate:void 0,jqueryUIDraggable:!1,jqueryUITheme:!1,keepLastSelected:!0,maintainColumnRatios:void 0,menuTemplate:void 0,multiSelect:!0,pagingOptions:{pageSizes:[250,500,1e3],pageSize:250,currentPage:1},pinSelectionCheckbox:!1,plugins:[],primaryKey:void 0,rowHeight:30,rowTemplate:void 0,selectedItems:[],selectWithCheckboxOnly:!1,showColumnMenu:!1,showFilter:!1,showFooter:!1,showGroupPanel:!1,showSelectionCheckbox:!1,sortInfo:{fields:[],columns:[],directions:[]},tabIndex:-1,totalServerItems:0,useExternalSorting:!1,i18n:"en",virtualizationThreshold:50,noTabInterference:!1},s=this;s.maxCanvasHt=0,s.config=b.extend(r,a.ngGrid.config,f),s.config.showSelectionCheckbox=s.config.showSelectionCheckbox&&s.config.enableColumnHeavyVirt===!1,s.config.enablePinning=s.config.enablePinning&&s.config.enableColumnHeavyVirt===!1,s.config.selectWithCheckboxOnly=s.config.selectWithCheckboxOnly&&s.config.showSelectionCheckbox!==!1,s.config.pinSelectionCheckbox=s.config.enablePinning,"string"==typeof f.columnDefs&&(s.config.columnDefs=e.$eval(f.columnDefs)),s.rowCache=[],s.rowMap=[],s.gridId="ng"+l.newId(),s.$root=null,s.$groupPanel=null,s.$topPanel=null,s.$headerContainer=null,s.$headerScroller=null,s.$headers=null,s.$viewport=null,s.$canvas=null,s.rootDim=s.config.gridDim,s.data=[],s.lateBindColumns=!1,s.filteredRows=[],s.initTemplates=function(){var a=["rowTemplate","aggregateTemplate","headerRowTemplate","checkboxCellTemplate","checkboxHeaderTemplate","menuTemplate","footerTemplate"],b=[];return angular.forEach(a,function(a){b.push(s.getTemplate(a))}),q.all(b)},s.getTemplate=function(a){var b=s.config[a],c=s.gridId+a+".html",d=q.defer();if(b&&!p.test(b))o.get(b,{cache:k}).success(function(a){k.put(c,a),d.resolve()}).error(function(){d.reject("Could not load template: "+b)});else if(b)k.put(c,b),d.resolve();else{var e=a+".html";k.put(c,k.get(e)),d.resolve()}return d.promise},"object"==typeof s.config.data&&(s.data=s.config.data),s.calcMaxCanvasHeight=function(){var a;return a=s.config.groups.length>0?s.rowFactory.parsedData.filter(function(a){return!a[i]}).length*s.config.rowHeight:s.filteredRows.length*s.config.rowHeight},s.elementDims={scrollW:0,scrollH:0,rowIndexCellW:25,rowSelectedCellW:25,rootMaxW:0,rootMaxH:0},s.setRenderedRows=function(a){e.renderedRows.length=a.length;for(var b=0;b<a.length;b++)!e.renderedRows[b]||a[b].isAggRow||e.renderedRows[b].isAggRow?(e.renderedRows[b]=a[b].copy(),e.renderedRows[b].collapsed=a[b].collapsed,a[b].isAggRow||e.renderedRows[b].setVars(a[b])):e.renderedRows[b].setVars(a[b]),e.renderedRows[b].rowIndex=a[b].rowIndex,e.renderedRows[b].offsetTop=a[b].offsetTop,e.renderedRows[b].selected=a[b].selected,a[b].renderedRowIndex=b;s.refreshDomSizes(),e.$emit("ngGridEventRows",a)},s.minRowsToRender=function(){var a=e.viewportDimHeight()||1;return Math.floor(a/s.config.rowHeight)},s.refreshDomSizes=function(){var a=new v;a.outerWidth=s.elementDims.rootMaxW,a.outerHeight=s.elementDims.rootMaxH,s.rootDim=a,s.maxCanvasHt=s.calcMaxCanvasHeight()},s.buildColumnDefsFromData=function(){s.config.columnDefs=[];var a=s.data[0];return a?void l.forIn(a,function(a,b){-1===s.config.excludeProperties.indexOf(b)&&s.config.columnDefs.push({field:b})}):void(s.lateBoundColumns=!0)},s.buildColumns=function(){var a=s.config.columnDefs,b=[];if(a||(s.buildColumnDefsFromData(),a=s.config.columnDefs),s.config.showSelectionCheckbox&&b.push(new u({colDef:{field:"✔",width:s.elementDims.rowSelectedCellW,sortable:!1,resizable:!1,groupable:!1,headerCellTemplate:k.get(e.gridId+"checkboxHeaderTemplate.html"),cellTemplate:k.get(e.gridId+"checkboxCellTemplate.html"),pinned:s.config.pinSelectionCheckbox},index:0,headerRowHeight:s.config.headerRowHeight,sortCallback:s.sortData,resizeOnDataCallback:s.resizeOnData,enableResize:s.config.enableColumnResize,enableSort:s.config.enableSorting,enablePinning:s.config.enablePinning},e,s,h,k,l)),a.length>0){var c=s.config.showSelectionCheckbox?1:0,d=e.configGroups.length;e.configGroups.length=0,angular.forEach(a,function(a,f){f+=c;var g=new u({colDef:a,index:f+d,originalIndex:f,headerRowHeight:s.config.headerRowHeight,sortCallback:s.sortData,resizeOnDataCallback:s.resizeOnData,enableResize:s.config.enableColumnResize,enableSort:s.config.enableSorting,enablePinning:s.config.enablePinning,enableCellEdit:s.config.enableCellEdit||s.config.enableCellEditOnFocus,cellEditableCondition:s.config.cellEditableCondition},e,s,h,k,l),i=s.config.groups.indexOf(a.field);-1!==i&&(g.isGroupedBy=!0,e.configGroups.splice(i,0,g),g.groupIndex=e.configGroups.length),b.push(g)}),e.columns=b,s.config.groups.length>0&&s.rowFactory.getGrouping(s.config.groups)}},s.configureColumnWidths=function(){var a=[],b=[],c=0,d=0,f={};if(angular.forEach(e.columns,function(a,b){if(!l.isNullOrUndefined(a.originalIndex)){var c=a.originalIndex;s.config.showSelectionCheckbox&&(0===a.originalIndex&&a.visible&&(d+=25),c--),f[c]=b}}),angular.forEach(s.config.columnDefs,function(g,h){var i=e.columns[f[h]];g.index=h;var j,k=!1;if(l.isNullOrUndefined(g.width)?g.width="*":(k=isNaN(g.width)?l.endsWith(g.width,"%"):!1,j=k?g.width:parseInt(g.width,10)),isNaN(j)&&!e.hasUserChangedGridColumnWidths){if(j=g.width,"auto"===j){i.width=i.minWidth,d+=i.width;var m=i;return void e.$on("$destroy",e.$on("ngGridEventData",function(){s.resizeOnData(m)}))}if(-1!==j.indexOf("*"))return i.visible!==!1&&(c+=j.length),void a.push(g);if(k)return void b.push(g);throw'unable to parse column width, use percentage ("10%","20%", etc...) or "*" to use remaining width of grid'}i.visible!==!1&&(d+=i.width=parseInt(i.width,10))}),b.length>0){s.config.maintainColumnRatios=s.config.maintainColumnRatios!==!1;var g=0,i=0;angular.forEach(b,function(a){var b=e.columns[f[a.index]],c=parseFloat(a.width)/100;g+=c,b.visible||(i+=c)});var j=g-i;angular.forEach(b,function(a){var b=e.columns[f[a.index]],c=parseFloat(a.width)/100;c/=i>0?j:g;var h=s.rootDim.outerWidth*g;b.width=h*c,d+=b.width})}if(a.length>0){s.config.maintainColumnRatios=s.config.maintainColumnRatios!==!1;var k=s.rootDim.outerWidth-d;s.maxCanvasHt>e.viewportDimHeight()&&(k-=h.ScrollW);var m=Math.floor(k/c);angular.forEach(a,function(b,c){var g=e.columns[f[b.index]];g.width=m*b.width.length,g.visible!==!1&&(d+=g.width);var i=c===a.length-1;if(i&&d<s.rootDim.outerWidth){var j=s.rootDim.outerWidth-d;s.maxCanvasHt>e.viewportDimHeight()&&(j-=h.ScrollW),g.width+=j}})}},s.init=function(){return s.initTemplates().then(function(){e.selectionProvider=new E(s,e,n),e.domAccessProvider=new w(s),s.rowFactory=new C(s,e,h,k,l),s.searchProvider=new D(e,s,j),s.styleProvider=new F(e,s),e.$on("$destroy",e.$watch("configGroups",function(a){var b=[];angular.forEach(a,function(a){b.push(a.field||a)}),s.config.groups=b,s.rowFactory.filteredRowsChanged(),e.$emit("ngGridEventGroups",a)},!0)),e.$on("$destroy",e.$watch("columns",function(a){e.isColumnResizing||h.RebuildGrid(e,s),e.$emit("ngGridEventColumns",a)},!0)),e.$on("$destroy",e.$watch(function(){return f.i18n},function(a){l.seti18n(e,a)})),s.maxCanvasHt=s.calcMaxCanvasHeight(),s.config.sortInfo.fields&&s.config.sortInfo.fields.length>0&&e.$on("$destroy",e.$watch(function(){return s.config.sortInfo},function(){g.isSorting||(s.sortColumnsInit(),e.$emit("ngGridEventSorted",s.config.sortInfo))},!0))})},s.resizeOnData=function(a){var c=a.minWidth,d=l.getElementsByClassName("col"+a.index);angular.forEach(d,function(a,d){var e;if(0===d){var f=b(a).find(".ngHeaderText");e=l.visualLength(f)+10}else{var g=b(a).find(".ngCellText");e=l.visualLength(g)+10}e>c&&(c=e)}),a.width=a.longest=Math.min(a.maxWidth,c+7),h.BuildStyles(e,s,!0)},s.lastSortedColumns=[],s.sortData=function(a,c){if(c&&c.shiftKey&&s.config.sortInfo){var d=s.config.sortInfo.columns.indexOf(a);-1===d?(1===s.config.sortInfo.columns.length&&(s.config.sortInfo.columns[0].sortPriority=1),s.config.sortInfo.columns.push(a),a.sortPriority=s.config.sortInfo.columns.length,s.config.sortInfo.fields.push(a.field),s.config.sortInfo.directions.push(a.sortDirection),s.lastSortedColumns.push(a)):s.config.sortInfo.directions[d]=a.sortDirection}else if(!s.config.useExternalSorting||s.config.useExternalSorting&&s.config.sortInfo){var f=b.isArray(a);s.config.sortInfo.columns.length=0,s.config.sortInfo.fields.length=0,s.config.sortInfo.directions.length=0;var g=function(a){s.config.sortInfo.columns.push(a),s.config.sortInfo.fields.push(a.field),s.config.sortInfo.directions.push(a.sortDirection),s.lastSortedColumns.push(a)};f?angular.forEach(a,function(a,b){a.sortPriority=b+1,g(a)}):(s.clearSortingData(a),a.sortPriority=void 0,g(a)),s.sortActual(),s.searchProvider.evalFilter(),e.$emit("ngGridEventSorted",s.config.sortInfo)}},s.sortColumnsInit=function(){s.config.sortInfo.columns?s.config.sortInfo.columns.length=0:s.config.sortInfo.columns=[];var a=[];angular.forEach(e.columns,function(b){var c=s.config.sortInfo.fields.indexOf(b.field);-1!==c&&(b.sortDirection=s.config.sortInfo.directions[c]||"asc",a[c]=b)}),s.sortData(1===a.length?a[0]:a)},s.sortActual=function(){if(!s.config.useExternalSorting){var a=s.data.slice(0);angular.forEach(a,function(a,b){var c=s.rowMap[b];if(void 0!==c){var d=s.rowCache[c];void 0!==d&&(a.preSortSelected=d.selected,a.preSortIndex=b)}}),g.Sort(s.config.sortInfo,a),angular.forEach(a,function(a,b){s.rowCache[b].entity=a,s.rowCache[b].selected=a.preSortSelected,s.rowMap[a.preSortIndex]=b,delete a.preSortSelected,delete a.preSortIndex})}},s.clearSortingData=function(a){a?(angular.forEach(s.lastSortedColumns,function(b){a.index!==b.index&&(b.sortDirection="",b.sortPriority=null)}),s.lastSortedColumns[0]=a,s.lastSortedColumns.length=1):(angular.forEach(s.lastSortedColumns,function(a){a.sortDirection="",a.sortPriority=null}),s.lastSortedColumns=[])},s.fixColumnIndexes=function(){for(var a=0;a<e.columns.length;a++)e.columns[a].index=a},s.fixGroupIndexes=function(){angular.forEach(e.configGroups,function(a,b){a.groupIndex=b+1})},e.elementsNeedMeasuring=!0,e.columns=[],e.renderedRows=[],e.renderedColumns=[],e.headerRow=null,e.rowHeight=s.config.rowHeight,e.jqueryUITheme=s.config.jqueryUITheme,e.showSelectionCheckbox=s.config.showSelectionCheckbox,e.enableCellSelection=s.config.enableCellSelection,e.enableCellEditOnFocus=s.config.enableCellEditOnFocus,e.footer=null,e.selectedItems=s.config.selectedItems,e.multiSelect=s.config.multiSelect,e.showFooter=s.config.showFooter,e.footerRowHeight=e.showFooter?s.config.footerRowHeight:0,e.showColumnMenu=s.config.showColumnMenu,e.forceSyncScrolling=s.config.forceSyncScrolling,e.showMenu=!1,e.configGroups=[],e.gridId=s.gridId,e.enablePaging=s.config.enablePaging,e.pagingOptions=s.config.pagingOptions,e.i18n={},l.seti18n(e,s.config.i18n),e.adjustScrollLeft=function(a){for(var b=0,c=0,d=e.columns.length,f=[],g=!s.config.enableColumnHeavyVirt,i=0,j=function(a){g?f.push(a):e.renderedColumns[i]?e.renderedColumns[i].setVars(a):e.renderedColumns[i]=a.copy(),i++},k=0;d>k;k++){var l=e.columns[k];if(l.visible!==!1){var m=l.width+b;if(l.pinned){j(l);var n=k>0?a+c:a;h.setColLeft(l,n,s),c+=l.width}else m>=a&&b<=a+s.rootDim.outerWidth&&j(l);b+=l.width}}g&&(e.renderedColumns=f)},s.prevScrollTop=0,s.prevScrollIndex=0,e.adjustScrollTop=function(a,b){if(s.prevScrollTop!==a||b){a>0&&s.$viewport[0].scrollHeight-a<=s.$viewport.outerHeight()&&e.$emit("ngGridEventScroll");var f,g=Math.floor(a/s.config.rowHeight);if(s.filteredRows.length>s.config.virtualizationThreshold){if(s.prevScrollTop<a&&g<s.prevScrollIndex+d)return;if(s.prevScrollTop>a&&g>s.prevScrollIndex-d)return;f=new A(Math.max(0,g-c),g+s.minRowsToRender()+c)}else{var h=e.configGroups.length>0?s.rowFactory.parsedData.length:s.filteredRows.length;f=new A(0,Math.max(h,s.minRowsToRender()+c))}s.prevScrollTop=a,s.rowFactory.UpdateViewableRange(f),s.prevScrollIndex=g}},e.toggleShowMenu=function(){e.showMenu=!e.showMenu},e.toggleSelectAll=function(a,b){e.selectionProvider.toggleSelectAll(a,!1,b)},e.totalFilteredItemsLength=function(){return s.filteredRows.length},e.showGroupPanel=function(){return s.config.showGroupPanel},e.topPanelHeight=function(){return s.config.showGroupPanel===!0?s.config.headerRowHeight+32:s.config.headerRowHeight},e.viewportDimHeight=function(){return Math.max(0,s.rootDim.outerHeight-e.topPanelHeight()-e.footerRowHeight-2)},e.groupBy=function(a){if(!(s.data.length<1)&&a.groupable&&a.field){a.sortDirection||a.sort({shiftKey:e.configGroups.length>0?!0:!1});var b=e.configGroups.indexOf(a);-1===b?(a.isGroupedBy=!0,e.configGroups.push(a),a.groupIndex=e.configGroups.length):e.removeGroup(b),s.$viewport.scrollTop(0),h.digest(e)}},e.removeGroup=function(a){var b=e.columns.filter(function(b){return b.groupIndex===a+1})[0];b.isGroupedBy=!1,b.groupIndex=0,e.columns[a].isAggCol&&(e.columns.splice(a,1),e.configGroups.splice(a,1),s.fixGroupIndexes()),0===e.configGroups.length&&(s.fixColumnIndexes(),h.digest(e)),e.adjustScrollLeft(0)},e.togglePin=function(a){for(var b=a.index,c=0,d=0;d<e.columns.length&&e.columns[d].pinned;d++)c++;a.pinned&&(c=Math.max(a.originalIndex,c-1)),a.pinned=!a.pinned,e.columns.splice(b,1),e.columns.splice(c,0,a),s.fixColumnIndexes(),h.BuildStyles(e,s,!0),s.$viewport.scrollLeft(s.$viewport.scrollLeft()-a.width)},e.totalRowWidth=function(){for(var a=0,b=e.columns,c=0;c<b.length;c++)b[c].visible!==!1&&(a+=b[c].width);return a},e.headerScrollerDim=function(){var a=e.viewportDimHeight(),b=s.maxCanvasHt,c=b>a,d=new v;return d.autoFitHeight=!0,d.outerWidth=e.totalRowWidth(),c?d.outerWidth+=s.elementDims.scrollW:b-a<=s.elementDims.scrollH&&(d.outerWidth+=s.elementDims.scrollW),d}},A=function(a,b){this.topRow=a,this.bottomRow=b},B=function(a,b,c,d,e){this.entity=a,this.config=b,this.selectionProvider=c,this.rowIndex=d,this.utils=e,this.selected=c.getSelection(a),this.cursor=this.config.enableRowSelection&&!this.config.selectWithCheckboxOnly?"pointer":"default",this.beforeSelectionChange=b.beforeSelectionChangeCallback,this.afterSelectionChange=b.afterSelectionChangeCallback,this.offsetTop=this.rowIndex*b.rowHeight,this.rowDisplayIndex=0};B.prototype.setSelection=function(a){this.selectionProvider.setSelection(this,a),this.selectionProvider.lastClickedRow=this},B.prototype.continueSelection=function(a){this.selectionProvider.ChangeSelection(this,a)},B.prototype.ensureEntity=function(a){this.entity!==a&&(this.entity=a,this.selected=this.selectionProvider.getSelection(this.entity))},B.prototype.toggleSelected=function(a){if(!this.config.enableRowSelection&&!this.config.enableCellSelection)return!0;var b=a.target||a;return"checkbox"===b.type&&"ngSelectionCell ng-scope"!==b.parentElement.className?!0:this.config.selectWithCheckboxOnly&&"checkbox"!==b.type?(this.selectionProvider.lastClickedRow=this,!0):(this.beforeSelectionChange(this,a)&&this.continueSelection(a),!1)},B.prototype.alternatingRowClass=function(){var a=this.rowIndex%2===0,b={ngRow:!0,selected:this.selected,even:a,odd:!a,"ui-state-default":this.config.jqueryUITheme&&a,"ui-state-active":this.config.jqueryUITheme&&!a};return b},B.prototype.getProperty=function(a){return this.utils.evalProperty(this.entity,a)},B.prototype.copy=function(){return this.clone=new B(this.entity,this.config,this.selectionProvider,this.rowIndex,this.utils),this.clone.isClone=!0,this.clone.elm=this.elm,this.clone.orig=this,this.clone},B.prototype.setVars=function(a){a.clone=this,this.entity=a.entity,this.selected=a.selected,this.orig=a};var C=function(a,b,d,e,f){var k=this;k.aggCache={},k.parentCache=[],k.dataChanged=!0,k.parsedData=[],k.rowConfig={},k.selectionProvider=b.selectionProvider,k.rowHeight=30,k.numberOfAggregates=0,k.groupedData=void 0,k.rowHeight=a.config.rowHeight,k.rowConfig={enableRowSelection:a.config.enableRowSelection,rowClasses:a.config.rowClasses,selectedItems:b.selectedItems,selectWithCheckboxOnly:a.config.selectWithCheckboxOnly,beforeSelectionChangeCallback:a.config.beforeSelectionChange,afterSelectionChangeCallback:a.config.afterSelectionChange,jqueryUITheme:a.config.jqueryUITheme,enableCellSelection:a.config.enableCellSelection,rowHeight:a.config.rowHeight},k.renderedRange=new A(0,a.minRowsToRender()+c),k.buildEntityRow=function(a,b){return new B(a,k.rowConfig,k.selectionProvider,b,f)},k.buildAggregateRow=function(b,c){var d=k.aggCache[b.aggIndex];return d||(d=new t(b,k,k.rowConfig.rowHeight,a.config.groupsCollapsedByDefault),k.aggCache[b.aggIndex]=d),d.rowIndex=c,d.offsetTop=c*k.rowConfig.rowHeight,d},k.UpdateViewableRange=function(a){k.renderedRange=a,k.renderedChange()},k.filteredRowsChanged=function(){a.lateBoundColumns&&a.filteredRows.length>0&&(a.config.columnDefs=void 0,a.buildColumns(),a.lateBoundColumns=!1,b.$evalAsync(function(){b.adjustScrollLeft(0)})),k.dataChanged=!0,a.config.groups.length>0&&k.getGrouping(a.config.groups),k.UpdateViewableRange(k.renderedRange)},k.renderedChange=function(){if(!k.groupedData||a.config.groups.length<1)return k.renderedChangeNoGroups(),void a.refreshDomSizes();k.wasGrouped=!0,k.parentCache=[];var b=0,c=k.parsedData.filter(function(a){return a.isAggRow?a.parent&&a.parent.collapsed?!1:!0:(a[i]||(a.rowIndex=b++),!a[i])});k.totalRows=c.length;for(var d=[],e=k.renderedRange.topRow;e<k.renderedRange.bottomRow;e++)c[e]&&(c[e].offsetTop=e*a.config.rowHeight,d.push(c[e]));a.setRenderedRows(d)},k.renderedChangeNoGroups=function(){for(var b=[],c=k.renderedRange.topRow;c<k.renderedRange.bottomRow;c++)a.filteredRows[c]&&(a.filteredRows[c].rowIndex=c,a.filteredRows[c].offsetTop=c*a.config.rowHeight,b.push(a.filteredRows[c]));a.setRenderedRows(b)},k.fixRowCache=function(){var b=a.data.length,c=b-a.rowCache.length;if(0>c)a.rowCache.length=a.rowMap.length=b;else for(var d=a.rowCache.length;b>d;d++)a.rowCache[d]=a.rowFactory.buildEntityRow(a.data[d],d)},k.parseGroupData=function(a){if(a.values)for(var b=0;b<a.values.length;b++)k.parentCache[k.parentCache.length-1].children.push(a.values[b]),k.parsedData.push(a.values[b]);else for(var c in a)if(c!==g&&c!==h&&c!==j&&a.hasOwnProperty(c)){var d=k.buildAggregateRow({gField:a[g],gLabel:c,gDepth:a[h],isAggRow:!0,_ng_hidden_:!1,children:[],aggChildren:[],aggIndex:k.numberOfAggregates,aggLabelFilter:a[j].aggLabelFilter},0);k.numberOfAggregates++,d.parent=k.parentCache[d.depth-1],d.parent&&(d.parent.collapsed=!1,d.parent.aggChildren.push(d)),k.parsedData.push(d),k.parentCache[d.depth]=d,k.parseGroupData(a[c])}},k.getGrouping=function(c){function l(a,b){return a.filter(function(a){return a.field===b})}k.aggCache=[],k.numberOfAggregates=0,k.groupedData={};for(var m=a.filteredRows,n=c.length,o=b.columns,p=0;p<m.length;p++){var q=m[p].entity;if(!q)return;m[p][i]=a.config.groupsCollapsedByDefault;for(var r=k.groupedData,s=0;s<c.length;s++){var t=c[s],v=l(o,t)[0],w=f.evalProperty(q,t);w=w?w.toString():"null",r[w]||(r[w]={}),r[g]||(r[g]=t),r[h]||(r[h]=s),r[j]||(r[j]=v),r=r[w]}r.values||(r.values=[]),r.values.push(m[p])}if(o.length>0)for(var x=0;x<c.length;x++)!o[x].isAggCol&&n>=x&&o.splice(0,0,new u({colDef:{field:"",width:25,sortable:!1,resizable:!1,headerCellTemplate:'<div class="ngAggHeader"></div>',pinned:a.config.pinSelectionCheckbox},enablePinning:a.config.enablePinning,isAggCol:!0,headerRowHeight:a.config.headerRowHeight},b,a,d,e,f));a.fixColumnIndexes(),b.adjustScrollLeft(0),k.parsedData.length=0,k.parseGroupData(k.groupedData),k.fixRowCache()},a.config.groups.length>0&&a.filteredRows.length>0&&k.getGrouping(a.config.groups)},D=function(a,c,d){var e=this,f=[];e.extFilter=c.config.filterOptions.useExternalFilter,a.showFilter=c.config.showFilter,a.filterText="",e.fieldMap={};var g=function(a){var b={};for(var c in a)a.hasOwnProperty(c)&&(b[c.toLowerCase()]=a[c]);return b},h=function(a,b,c){var e;for(var f in b)if(b.hasOwnProperty(f)){var i=c[f.toLowerCase()];if(!i)continue;var j=b[f];if("object"!=typeof j||j instanceof Date){var k=null,l=null;if(i&&i.cellFilter&&(l=i.cellFilter.split(":"),k=d(l[0])),null!==j&&void 0!==j){if("function"==typeof k){var m=k(j,l[1].slice(1,-1)).toString();e=a.regex.test(m)}else e=a.regex.test(j.toString());if(e)return!0}}else{var n=g(i);if(e=h(a,j,n))return!0}}return!1},i=function(a,b){var c,f=e.fieldMap[a.columnDisplay];if(!f)return!1;var g=f.cellFilter.split(":"),h=f.cellFilter?d(g[0]):null,i=b[a.column]||b[f.field.split(".")[0]];if(null===i||void 0===i)return!1;if("function"==typeof h){var j=h("object"==typeof i?k(i,f.field):i,g[1]).toString();c=a.regex.test(j)}else c=a.regex.test("object"==typeof i?k(i,f.field).toString():i.toString());return c?!0:!1},j=function(a){for(var b=0,c=f.length;c>b;b++){var d,g=f[b];if(d=g.column?i(g,a):h(g,a,e.fieldMap),!d)return!1}return!0};e.evalFilter=function(){c.filteredRows=0===f.length?c.rowCache:c.rowCache.filter(function(a){return j(a.entity)});for(var a=0;a<c.filteredRows.length;a++)c.filteredRows[a].rowIndex=a;c.rowFactory.filteredRowsChanged()};var k=function(a,b){if("object"!=typeof a||"string"!=typeof b)return a;var c=b.split("."),d=a;if(c.length>1){for(var e=1,f=c.length;f>e;e++)if(d=d[c[e]],!d)return a;return d}return a},l=function(a,b){try{return new RegExp(a,b)}catch(c){return new RegExp(a.replace(/(\^|\$|\(|\)|<|>|\[|\]|\{|\}|\\|\||\.|\*|\+|\?)/g,"\\$1"))}},m=function(a){f=[];var c;if(c=b.trim(a))for(var d=c.split(";"),e=0;e<d.length;e++){var g=d[e].split(":");if(g.length>1){var h=b.trim(g[0]),i=b.trim(g[1]);h&&i&&f.push({column:h,columnDisplay:h.replace(/\s+/g,"").toLowerCase(),regex:l(i,"i")})}else{var j=b.trim(g[0]);j&&f.push({column:"",regex:l(j,"i")})}}};e.extFilter||a.$on("$destroy",a.$watch("columns",function(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.field)if(c.field.match(/\./g)){for(var d=c.field.split("."),f=e.fieldMap,g=0;g<d.length-1;g++)f[d[g]]=f[d[g]]||{},f=f[d[g]];f[d[d.length-1]]=c}else e.fieldMap[c.field.toLowerCase()]=c;c.displayName&&(e.fieldMap[c.displayName.toLowerCase().replace(/\s+/g,"")]=c)}})),a.$on("$destroy",a.$watch(function(){return c.config.filterOptions.filterText},function(b){a.filterText=b})),a.$on("$destroy",a.$watch("filterText",function(b){e.extFilter||(a.$emit("ngGridEventFilter",b),m(b),e.evalFilter())}))},E=function(a,b,c){var d=this;d.multi=a.config.multiSelect,d.selectedItems=a.config.selectedItems,d.selectedIndex=a.config.selectedIndex,d.lastClickedRow=void 0,d.ignoreSelectedItemChanges=!1,d.pKeyParser=c(a.config.primaryKey),d.ChangeSelection=function(c,e){var f=e.which||e.keyCode,g=40===f||38===f;if(e&&e.shiftKey&&!e.keyCode&&d.multi&&a.config.enableRowSelection){if(d.lastClickedRow){var h;h=b.configGroups.length>0?a.rowFactory.parsedData.filter(function(a){return!a.isAggRow}):a.filteredRows;var i=c.rowIndex,j=d.lastClickedRowIndex;if(i===j)return!1;j>i?(i^=j,j=i^j,i^=j,i--):j++;for(var k=[];i>=j;j++)k.push(h[j]);if(k[k.length-1].beforeSelectionChange(k,e)){for(var l=0;l<k.length;l++){var m=k[l],n=m.selected;m.selected=!n,m.clone&&(m.clone.selected=m.selected);var o=d.selectedItems.indexOf(m.entity);-1===o?d.selectedItems.push(m.entity):d.selectedItems.splice(o,1)}k[k.length-1].afterSelectionChange(k,e)}return d.lastClickedRow=c,d.lastClickedRowIndex=c.rowIndex,!0}}else d.multi?(!e.keyCode||g&&!a.config.selectWithCheckboxOnly)&&d.setSelection(c,!c.selected):d.lastClickedRow===c?d.setSelection(d.lastClickedRow,a.config.keepLastSelected?!0:!c.selected):(d.lastClickedRow&&d.setSelection(d.lastClickedRow,!1),d.setSelection(c,!c.selected));return d.lastClickedRow=c,d.lastClickedRowIndex=c.rowIndex,!0},d.getSelection=function(a){return-1!==d.getSelectionIndex(a)},d.getSelectionIndex=function(b){var c=-1;if(a.config.primaryKey){var e=d.pKeyParser(b);angular.forEach(d.selectedItems,function(a,b){e===d.pKeyParser(a)&&(c=b)})}else c=d.selectedItems.indexOf(b);return c},d.setSelection=function(b,c){if(a.config.enableRowSelection){if(c)-1===d.getSelectionIndex(b.entity)&&(!d.multi&&d.selectedItems.length>0&&d.toggleSelectAll(!1,!0),d.selectedItems.push(b.entity));else{var e=d.getSelectionIndex(b.entity);-1!==e&&d.selectedItems.splice(e,1)}b.selected=c,b.orig&&(b.orig.selected=c),b.clone&&(b.clone.selected=c),b.afterSelectionChange(b)}},d.toggleSelectAll=function(b,c,e){var f=e?a.filteredRows:a.rowCache;if(c||a.config.beforeSelectionChange(f,b)){var g=d.selectedItems.length;g>0&&(d.selectedItems.length=0);for(var h=0;h<f.length;h++)f[h].selected=b,f[h].clone&&(f[h].clone.selected=b),b&&d.selectedItems.push(f[h].entity);c||a.config.afterSelectionChange(f,b)}}},F=function(a,b){a.headerCellStyle=function(a){return{height:a.headerRowHeight+"px"}},a.rowStyle=function(b){var c={top:b.offsetTop+"px",height:a.rowHeight+"px"};return b.isAggRow&&(c.left=b.offsetLeft),c},a.canvasStyle=function(){return{height:b.maxCanvasHt+"px"}},a.headerScrollerStyle=function(){return{height:b.config.headerRowHeight+"px"}},a.topPanelStyle=function(){return{width:b.rootDim.outerWidth+"px",height:a.topPanelHeight()+"px"}},a.headerStyle=function(){return{width:b.rootDim.outerWidth+"px",height:b.config.headerRowHeight+"px"}},a.groupPanelStyle=function(){return{width:b.rootDim.outerWidth+"px",height:"32px"}},a.viewportStyle=function(){return{width:b.rootDim.outerWidth+"px",height:a.viewportDimHeight()+"px"}},a.footerStyle=function(){return{width:b.rootDim.outerWidth+"px",height:a.footerRowHeight+"px"}}};q.directive("ngCellHasFocus",["$domUtilityService",function(a){var b=function(b){b.isFocused=!0,a.digest(b),b.$broadcast("ngGridEventStartCellEdit"),b.$emit("ngGridEventStartCellEdit"),b.$on("$destroy",b.$on("ngGridEventEndCellEdit",function(){b.isFocused=!1,a.digest(b)}))};return function(a,c){function d(){return a.enableCellEditOnFocus?j=!0:c.focus(),!0}function e(d){a.enableCellEditOnFocus&&(d.preventDefault(),j=!1,b(a,c))}function f(){return i=!0,a.enableCellEditOnFocus&&!j&&b(a,c),!0}function g(){return i=!1,!0}function h(d){return a.enableCellEditOnFocus||(i&&37!==d.keyCode&&38!==d.keyCode&&39!==d.keyCode&&40!==d.keyCode&&9!==d.keyCode&&!d.shiftKey&&13!==d.keyCode&&b(a,c),i&&d.shiftKey&&d.keyCode>=65&&d.keyCode<=90&&b(a,c),27===d.keyCode&&c.focus()),!0}var i=!1,j=!1;a.editCell=function(){a.enableCellEditOnFocus||setTimeout(function(){b(a,c)},0)},c.bind("mousedown",d),c.bind("click",e),c.bind("focus",f),c.bind("blur",g),c.bind("keydown",h),c.on("$destroy",function(){c.off("mousedown",d),c.off("click",e),c.off("focus",f),c.off("blur",g),c.off("keydown",h)})}}]),q.directive("ngCellText",function(){return function(a,b){function c(a){a.preventDefault()}function d(a){a.preventDefault()}b.bind("mouseover",c),b.bind("mouseleave",d),b.on("$destroy",function(){b.off("mouseover",c),b.off("mouseleave",d)})}}),q.directive("ngCell",["$compile","$domUtilityService",function(a,c){var d={scope:!1,compile:function(){return{pre:function(c,d){var e,f=c.col.cellTemplate.replace(l,"row.entity."+c.col.field);c.col.enableCellEdit?(e=c.col.cellEditTemplate,e=e.replace(o,c.col.cellEditableCondition),e=e.replace(m,f),e=e.replace(n,c.col.editableCellTemplate.replace(l,"row.entity."+c.col.field))):e=f;var g=b(e);d.append(g),a(g)(c),c.enableCellSelection&&-1===g[0].className.indexOf("ngSelectionCell")&&(g[0].setAttribute("tabindex",0),g.addClass("ngCellElement"))
-},post:function(a,b){a.enableCellSelection&&a.domAccessProvider.selectionHandlers(a,b),a.$on("$destroy",a.$on("ngGridEventDigestCell",function(){c.digest(a)}))}}}};return d}]),q.directive("ngEditCellIf",[function(){return{transclude:"element",priority:1e3,terminal:!0,restrict:"A",compile:function(a,b,c){return function(a,b,d){var e,f;a.$on("$destroy",a.$watch(d.ngEditCellIf,function(d){e&&(e.remove(),e=void 0),f&&(f.$destroy(),f=void 0),d&&(f=a.$new(),c(f,function(a){e=a,b.after(a)}))}))}}}}]),q.directive("ngGridFooter",["$compile","$templateCache",function(a,b){var c={scope:!1,compile:function(){return{pre:function(c,d){0===d.children().length&&d.append(a(b.get(c.gridId+"footerTemplate.html"))(c))}}}};return c}]),q.directive("ngGridMenu",["$compile","$templateCache",function(a,b){var c={scope:!1,compile:function(){return{pre:function(c,d){0===d.children().length&&d.append(a(b.get(c.gridId+"menuTemplate.html"))(c))}}}};return c}]),q.directive("ngGrid",["$compile","$filter","$templateCache","$sortService","$domUtilityService","$utilityService","$timeout","$parse","$http","$q",function(a,c,d,e,f,g,h,i,j,k){var l={scope:!0,compile:function(){return{pre:function(l,m,n){var o=b(m),p=l.$eval(n.ngGrid);p.gridDim=new v({outerHeight:b(o).height(),outerWidth:b(o).width()});var q=new z(l,p,e,f,c,d,g,h,i,j,k);return l.$on("$destroy",function(){p.gridDim=null,p.selectRow=null,p.selectItem=null,p.selectAll=null,p.selectVisible=null,p.groupBy=null,p.sortBy=null,p.gridId=null,p.ngGrid=null,p.$gridScope=null,p.$gridServices=null,l.domAccessProvider.grid=null,angular.element(q.styleSheet).remove(),q.styleSheet=null}),q.init().then(function(){if("string"==typeof p.columnDefs?l.$on("$destroy",l.$parent.$watch(p.columnDefs,function(a){return a?(q.lateBoundColumns=!1,l.columns=[],q.config.columnDefs=a,q.buildColumns(),q.eventProvider.assignEvents(),void f.RebuildGrid(l,q)):(q.refreshDomSizes(),void q.buildColumns())},!0)):q.buildColumns(),"string"==typeof p.totalServerItems?l.$on("$destroy",l.$parent.$watch(p.totalServerItems,function(a){l.totalServerItems=angular.isDefined(a)?a:0})):l.totalServerItems=0,"string"==typeof p.data){var c=function(a){q.data=b.extend([],a),q.rowFactory.fixRowCache(),angular.forEach(q.data,function(a,b){var c=q.rowMap[b]||b;q.rowCache[c]&&q.rowCache[c].ensureEntity(a),q.rowMap[c]=b}),q.searchProvider.evalFilter(),q.configureColumnWidths(),q.refreshDomSizes(),q.config.sortInfo.fields.length>0&&(q.sortColumnsInit(),l.$emit("ngGridEventSorted",q.config.sortInfo)),l.$emit("ngGridEventData",q.gridId)};l.$on("$destroy",l.$parent.$watch(p.data,c)),l.$on("$destroy",l.$parent.$watch(p.data+".length",function(){c(l.$eval(p.data)),l.adjustScrollTop(q.$viewport.scrollTop(),!0)}))}return q.footerController=new y(l,q),m.addClass("ngGrid").addClass(q.gridId.toString()),p.enableHighlighting||m.addClass("unselectable"),p.jqueryUITheme&&m.addClass("ui-widget"),m.append(a(d.get("gridTemplate.html"))(l)),f.AssignGridContainers(l,m,q),q.eventProvider=new x(q,l,f,h),p.selectRow=function(a,b){q.rowCache[a]&&(q.rowCache[a].clone&&q.rowCache[a].clone.setSelection(b?!0:!1),q.rowCache[a].setSelection(b?!0:!1))},p.selectItem=function(a,b){p.selectRow(q.rowMap[a],b)},p.selectAll=function(a){l.toggleSelectAll(a)},p.selectVisible=function(a){l.toggleSelectAll(a,!0)},p.groupBy=function(a){if(a)l.groupBy(l.columns.filter(function(b){return b.field===a})[0]);else{var c=b.extend(!0,[],l.configGroups);angular.forEach(c,l.groupBy)}},p.sortBy=function(a){var b=l.columns.filter(function(b){return b.field===a})[0];b&&b.sort()},p.gridId=q.gridId,p.ngGrid=q,p.$gridScope=l,p.$gridServices={SortService:e,DomUtilityService:f,UtilityService:g},l.$on("$destroy",l.$on("ngGridEventDigestGrid",function(){f.digest(l.$parent)})),l.$on("$destroy",l.$on("ngGridEventDigestGridParent",function(){f.digest(l.$parent)})),l.$evalAsync(function(){l.adjustScrollLeft(0)}),angular.forEach(p.plugins,function(a){"function"==typeof a&&(a=new a);var b=l.$new();a.init(b,q,p.$gridServices),p.plugins[g.getInstanceType(a)]=a,l.$on("$destroy",function(){b.$destroy()})}),"function"==typeof p.init&&p.init(q,l),null})}}}};return l}]),q.directive("ngHeaderCell",["$compile",function(a){var b={scope:!1,compile:function(){return{pre:function(b,c){c.append(a(b.col.headerCellTemplate)(b))}}}};return b}]),q.directive("ngHeaderRow",["$compile","$templateCache",function(a,b){var c={scope:!1,compile:function(){return{pre:function(c,d){0===d.children().length&&d.append(a(b.get(c.gridId+"headerRowTemplate.html"))(c))}}}};return c}]),q.directive("ngInput",[function(){return{require:"ngModel",link:function(a,b,c,d){function e(c){switch(c.keyCode){case 37:case 38:case 39:case 40:c.stopPropagation();break;case 27:a.$$phase||a.$apply(function(){d.$setViewValue(h),b.blur()});break;case 13:(a.enableCellEditOnFocus&&a.totalFilteredItemsLength()-1>a.row.rowIndex&&a.row.rowIndex>0||a.col.enableCellEdit)&&b.blur()}return!0}function f(a){a.stopPropagation()}function g(a){a.stopPropagation()}var h,i=a.$watch("ngModel",function(){h=d.$modelValue,i()});b.bind("keydown",e),b.bind("click",f),b.bind("mousedown",g),b.on("$destroy",function(){b.off("keydown",e),b.off("click",f),b.off("mousedown",g)}),a.$on("$destroy",a.$on("ngGridEventStartCellEdit",function(){b.focus(),b.select()})),angular.element(b).bind("blur",function(){a.$emit("ngGridEventEndCellEdit")})}}}]),q.directive("ngRow",["$compile","$domUtilityService","$templateCache",function(a,b,c){var d={scope:!1,compile:function(){return{pre:function(d,e){if(d.row.elm=e,d.row.clone&&(d.row.clone.elm=e),d.row.isAggRow){var f=c.get(d.gridId+"aggregateTemplate.html");f=d.row.aggLabelFilter?f.replace(k,"| "+d.row.aggLabelFilter):f.replace(k,""),e.append(a(f)(d))}else e.append(a(c.get(d.gridId+"rowTemplate.html"))(d));d.$on("$destroy",d.$on("ngGridEventDigestRow",function(){b.digest(d)}))}}}};return d}]),q.directive("ngViewport",[function(){return function(a,b){function c(b){var c=b.target.scrollLeft,d=b.target.scrollTop;return a.$headerContainer&&a.$headerContainer.scrollLeft(c),a.adjustScrollLeft(c),a.adjustScrollTop(d),a.forceSyncScrolling?i():(clearTimeout(g),g=setTimeout(i,150)),f=c,h=d,e=!1,!0}function d(){return e=!0,b.focus&&b.focus(),!0}var e,f,g,h=0,i=function(){a.$root.$$phase||a.$digest()};b.bind("scroll",c),b.bind("mousewheel DOMMouseScroll",d),b.on("$destroy",function(){b.off("scroll",c),b.off("mousewheel DOMMouseScroll",d)}),a.enableCellSelection||a.domAccessProvider.selectionHandlers(a,b)}}]),a.ngGrid.i18n.da={ngAggregateLabel:"artikler",ngGroupPanelDescription:"Grupér rækker udfra en kolonne ved at trække dens overskift hertil.",ngSearchPlaceHolder:"Søg...",ngMenuText:"Vælg kolonner:",ngShowingItemsLabel:"Viste rækker:",ngTotalItemsLabel:"Rækker totalt:",ngSelectedItemsLabel:"Valgte rækker:",ngPageSizeLabel:"Side størrelse:",ngPagerFirstTitle:"Første side",ngPagerNextTitle:"Næste side",ngPagerPrevTitle:"Forrige side",ngPagerLastTitle:"Sidste side"},a.ngGrid.i18n.de={ngAggregateLabel:"eintrag",ngGroupPanelDescription:"Ziehen Sie eine Spaltenüberschrift hierhin um nach dieser Spalte zu gruppieren.",ngSearchPlaceHolder:"Suche...",ngMenuText:"Spalten auswählen:",ngShowingItemsLabel:"Zeige Einträge:",ngTotalItemsLabel:"Einträge gesamt:",ngSelectedItemsLabel:"Ausgewählte Einträge:",ngPageSizeLabel:"Einträge pro Seite:",ngPagerFirstTitle:"Erste Seite",ngPagerNextTitle:"Nächste Seite",ngPagerPrevTitle:"Vorherige Seite",ngPagerLastTitle:"Letzte Seite"},a.ngGrid.i18n.en={ngAggregateLabel:"items",ngGroupPanelDescription:"Drag a column header here and drop it to group by that column.",ngSearchPlaceHolder:"Search...",ngMenuText:"Choose Columns:",ngShowingItemsLabel:"Showing Items:",ngTotalItemsLabel:"Total Items:",ngSelectedItemsLabel:"Selected Items:",ngPageSizeLabel:"Page Size:",ngPagerFirstTitle:"First Page",ngPagerNextTitle:"Next Page",ngPagerPrevTitle:"Previous Page",ngPagerLastTitle:"Last Page"},a.ngGrid.i18n.es={ngAggregateLabel:"Artículos",ngGroupPanelDescription:"Arrastre un encabezado de columna aquí y soltarlo para agrupar por esa columna.",ngSearchPlaceHolder:"Buscar...",ngMenuText:"Elegir columnas:",ngShowingItemsLabel:"Artículos Mostrando:",ngTotalItemsLabel:"Artículos Totales:",ngSelectedItemsLabel:"Artículos Seleccionados:",ngPageSizeLabel:"Tamaño de Página:",ngPagerFirstTitle:"Primera Página",ngPagerNextTitle:"Página Siguiente",ngPagerPrevTitle:"Página Anterior",ngPagerLastTitle:"Última Página"},a.ngGrid.i18n.fa={ngAggregateLabel:"موردها",ngGroupPanelDescription:"یک عنوان ستون اینجا را بردار و به گروهی از آن ستون بیانداز.",ngSearchPlaceHolder:"جستجو...",ngMenuText:"انتخاب ستون‌ها:",ngShowingItemsLabel:"نمایش موردها:",ngTotalItemsLabel:"همهٔ موردها:",ngSelectedItemsLabel:"موردهای انتخاب‌شده:",ngPageSizeLabel:"اندازهٔ صفحه:",ngPagerFirstTitle:"صفحهٔ اول",ngPagerNextTitle:"صفحهٔ بعد",ngPagerPrevTitle:"صفحهٔ قبل",ngPagerLastTitle:"آخرین صفحه"},a.ngGrid.i18n.fr={ngAggregateLabel:"articles",ngGroupPanelDescription:"Faites glisser un en-tête de colonne ici et déposez-le vers un groupe par cette colonne.",ngSearchPlaceHolder:"Recherche...",ngMenuText:"Choisir des colonnes:",ngShowingItemsLabel:"Articles Affichage des:",ngTotalItemsLabel:"Nombre total d'articles:",ngSelectedItemsLabel:"Éléments Articles:",ngPageSizeLabel:"Taille de page:",ngPagerFirstTitle:"Première page",ngPagerNextTitle:"Page Suivante",ngPagerPrevTitle:"Page précédente",ngPagerLastTitle:"Dernière page"},a.ngGrid.i18n.nl={ngAggregateLabel:"items",ngGroupPanelDescription:"Sleep hier een kolomkop om op te groeperen.",ngSearchPlaceHolder:"Zoeken...",ngMenuText:"Kies kolommen:",ngShowingItemsLabel:"Toon items:",ngTotalItemsLabel:"Totaal items:",ngSelectedItemsLabel:"Geselecteerde items:",ngPageSizeLabel:"Pagina grootte:, ",ngPagerFirstTitle:"Eerste pagina",ngPagerNextTitle:"Volgende pagina",ngPagerPrevTitle:"Vorige pagina",ngPagerLastTitle:"Laatste pagina"},a.ngGrid.i18n["pt-br"]={ngAggregateLabel:"itens",ngGroupPanelDescription:"Arraste e solte uma coluna aqui para agrupar por essa coluna",ngSearchPlaceHolder:"Procurar...",ngMenuText:"Selecione as colunas:",ngShowingItemsLabel:"Mostrando os Itens:",ngTotalItemsLabel:"Total de Itens:",ngSelectedItemsLabel:"Items Selecionados:",ngPageSizeLabel:"Tamanho da Página:",ngPagerFirstTitle:"Primeira Página",ngPagerNextTitle:"Próxima Página",ngPagerPrevTitle:"Página Anterior",ngPagerLastTitle:"Última Página"},a.ngGrid.i18n["zh-cn"]={ngAggregateLabel:"条目",ngGroupPanelDescription:"拖曳表头到此处以进行分组",ngSearchPlaceHolder:"搜索...",ngMenuText:"数据分组与选择列：",ngShowingItemsLabel:"当前显示条目：",ngTotalItemsLabel:"条目总数：",ngSelectedItemsLabel:"选中条目：",ngPageSizeLabel:"每页显示数：",ngPagerFirstTitle:"回到首页",ngPagerNextTitle:"下一页",ngPagerPrevTitle:"上一页",ngPagerLastTitle:"前往尾页"},a.ngGrid.i18n["zh-tw"]={ngAggregateLabel:"筆",ngGroupPanelDescription:"拖拉表頭到此處以進行分組",ngSearchPlaceHolder:"搜尋...",ngMenuText:"選擇欄位：",ngShowingItemsLabel:"目前顯示筆數：",ngTotalItemsLabel:"總筆數：",ngSelectedItemsLabel:"選取筆數：",ngPageSizeLabel:"每頁顯示：",ngPagerFirstTitle:"第一頁",ngPagerNextTitle:"下一頁",ngPagerPrevTitle:"上一頁",ngPagerLastTitle:"最後頁"},angular.module("ngGrid").run(["$templateCache",function(a){a.put("aggregateTemplate.html",'<div ng-click="row.toggleExpand()" ng-style="rowStyle(row)" class="ngAggregate">\r\n    <span class="ngAggregateText">{{row.label CUSTOM_FILTERS}} ({{row.totalChildren()}} {{AggItemsLabel}})</span>\r\n    <div class="{{row.aggClass()}}"></div>\r\n</div>\r\n'),a.put("cellEditTemplate.html",'<div ng-cell-has-focus ng-dblclick="CELL_EDITABLE_CONDITION && editCell()">\r\n	<div ng-edit-cell-if="!(isFocused && CELL_EDITABLE_CONDITION)">	\r\n		DISPLAY_CELL_TEMPLATE\r\n	</div>\r\n	<div ng-edit-cell-if="isFocused && CELL_EDITABLE_CONDITION">\r\n		EDITABLE_CELL_TEMPLATE\r\n	</div>\r\n</div>\r\n'),a.put("cellTemplate.html",'<div class="ngCellText" ng-class="col.colIndex()"><span ng-cell-text>{{COL_FIELD CUSTOM_FILTERS}}</span></div>'),a.put("checkboxCellTemplate.html",'<div class="ngSelectionCell"><input tabindex="-1" class="ngSelectionCheckbox" type="checkbox" ng-checked="row.selected" /></div>'),a.put("checkboxHeaderTemplate.html",'<input class="ngSelectionHeader" type="checkbox" ng-show="multiSelect" ng-model="allSelected" ng-change="toggleSelectAll(allSelected, true)"/>'),a.put("editableCellTemplate.html",'<input ng-class="\'colt\' + col.index" ng-input="COL_FIELD" ng-model="COL_FIELD" />'),a.put("footerTemplate.html",'<div ng-show="showFooter" class="ngFooterPanel" ng-class="{\'ui-widget-content\': jqueryUITheme, \'ui-corner-bottom\': jqueryUITheme}" ng-style="footerStyle()">\r\n    <div class="ngTotalSelectContainer" >\r\n        <div class="ngFooterTotalItems" ng-class="{\'ngNoMultiSelect\': !multiSelect}" >\r\n            <span class="ngLabel">{{i18n.ngTotalItemsLabel}} {{maxRows()}}</span><span ng-show="filterText.length > 0" class="ngLabel">({{i18n.ngShowingItemsLabel}} {{totalFilteredItemsLength()}})</span>\r\n        </div>\r\n        <div class="ngFooterSelectedItems" ng-show="multiSelect">\r\n            <span class="ngLabel">{{i18n.ngSelectedItemsLabel}} {{selectedItems.length}}</span>\r\n        </div>\r\n    </div>\r\n    <div class="ngPagerContainer" style="float: right; margin-top: 10px;" ng-show="enablePaging" ng-class="{\'ngNoMultiSelect\': !multiSelect}">\r\n        <div style="float:left; margin-right: 10px;" class="ngRowCountPicker">\r\n            <span style="float: left; margin-top: 3px;" class="ngLabel">{{i18n.ngPageSizeLabel}}</span>\r\n            <select style="float: left;height: 27px; width: 100px" ng-model="pagingOptions.pageSize" >\r\n                <option ng-repeat="size in pagingOptions.pageSizes">{{size}}</option>\r\n            </select>\r\n        </div>\r\n        <div style="float:left; margin-right: 10px; line-height:25px;" class="ngPagerControl" style="float: left; min-width: 135px;">\r\n            <button type="button" class="ngPagerButton" ng-click="pageToFirst()" ng-disabled="cantPageBackward()" title="{{i18n.ngPagerFirstTitle}}"><div class="ngPagerFirstTriangle"><div class="ngPagerFirstBar"></div></div></button>\r\n            <button type="button" class="ngPagerButton" ng-click="pageBackward()" ng-disabled="cantPageBackward()" title="{{i18n.ngPagerPrevTitle}}"><div class="ngPagerFirstTriangle ngPagerPrevTriangle"></div></button>\r\n            <input class="ngPagerCurrent" min="1" max="{{currentMaxPages}}" type="number" style="width:50px; height: 24px; margin-top: 1px; padding: 0 4px;" ng-model="pagingOptions.currentPage"/>\r\n            <span class="ngGridMaxPagesNumber" ng-show="maxPages() > 0">/ {{maxPages()}}</span>\r\n            <button type="button" class="ngPagerButton" ng-click="pageForward()" ng-disabled="cantPageForward()" title="{{i18n.ngPagerNextTitle}}"><div class="ngPagerLastTriangle ngPagerNextTriangle"></div></button>\r\n            <button type="button" class="ngPagerButton" ng-click="pageToLast()" ng-disabled="cantPageToLast()" title="{{i18n.ngPagerLastTitle}}"><div class="ngPagerLastTriangle"><div class="ngPagerLastBar"></div></div></button>\r\n        </div>\r\n    </div>\r\n</div>\r\n'),a.put("gridTemplate.html",'<div class="ngTopPanel" ng-class="{\'ui-widget-header\':jqueryUITheme, \'ui-corner-top\': jqueryUITheme}" ng-style="topPanelStyle()">\r\n    <div class="ngGroupPanel" ng-show="showGroupPanel()" ng-style="groupPanelStyle()">\r\n        <div class="ngGroupPanelDescription" ng-show="configGroups.length == 0">{{i18n.ngGroupPanelDescription}}</div>\r\n        <ul ng-show="configGroups.length > 0" class="ngGroupList">\r\n            <li class="ngGroupItem" ng-repeat="group in configGroups">\r\n                <span class="ngGroupElement">\r\n                    <span class="ngGroupName">{{group.displayName}}\r\n                        <span ng-click="removeGroup($index)" class="ngRemoveGroup">x</span>\r\n                    </span>\r\n                    <span ng-hide="$last" class="ngGroupArrow"></span>\r\n                </span>\r\n            </li>\r\n        </ul>\r\n    </div>\r\n    <div class="ngHeaderContainer" ng-style="headerStyle()">\r\n        <div ng-header-row class="ngHeaderScroller" ng-style="headerScrollerStyle()"></div>\r\n    </div>\r\n    <div ng-grid-menu></div>\r\n</div>\r\n<div class="ngViewport" unselectable="on" ng-viewport ng-class="{\'ui-widget-content\': jqueryUITheme}" ng-style="viewportStyle()">\r\n    <div class="ngCanvas" ng-style="canvasStyle()">\r\n        <div ng-style="rowStyle(row)" ng-repeat="row in renderedRows" ng-click="row.toggleSelected($event)" ng-class="row.alternatingRowClass()" ng-row></div>\r\n    </div>\r\n</div>\r\n<div ng-grid-footer></div>\r\n'),a.put("headerCellTemplate.html",'<div class="ngHeaderSortColumn {{col.headerClass}}" ng-style="{\'cursor\': col.cursor}" ng-class="{ \'ngSorted\': !col.noSortVisible() }">\r\n    <div ng-click="col.sort($event)" ng-class="\'colt\' + col.index" class="ngHeaderText">{{col.displayName}}</div>\r\n    <div class="ngSortButtonDown" ng-click="col.sort($event)" ng-show="col.showSortButtonDown()"></div>\r\n    <div class="ngSortButtonUp" ng-click="col.sort($event)" ng-show="col.showSortButtonUp()"></div>\r\n    <div class="ngSortPriority">{{col.sortPriority}}</div>\r\n    <div ng-class="{ ngPinnedIcon: col.pinned, ngUnPinnedIcon: !col.pinned }" ng-click="togglePin(col)" ng-show="col.pinnable"></div>\r\n</div>\r\n<div ng-show="col.resizable" class="ngHeaderGrip" ng-click="col.gripClick($event)" ng-mousedown="col.gripOnMouseDown($event)"></div>\r\n'),a.put("headerRowTemplate.html",'<div ng-style="{ height: col.headerRowHeight }" ng-repeat="col in renderedColumns" ng-class="col.colIndex()" class="ngHeaderCell">\r\n	<div class="ngVerticalBar" ng-style="{height: col.headerRowHeight}" ng-class="{ ngVerticalBarVisible: !$last }">&nbsp;</div>\r\n	<div ng-header-cell></div>\r\n</div>'),a.put("menuTemplate.html",'<div ng-show="showColumnMenu || showFilter"  class="ngHeaderButton" ng-click="toggleShowMenu()">\r\n    <div class="ngHeaderButtonArrow"></div>\r\n</div>\r\n<div ng-show="showMenu" class="ngColMenu">\r\n    <div ng-show="showFilter">\r\n        <input placeholder="{{i18n.ngSearchPlaceHolder}}" type="text" ng-model="filterText"/>\r\n    </div>\r\n    <div ng-show="showColumnMenu">\r\n        <span class="ngMenuText">{{i18n.ngMenuText}}</span>\r\n        <ul class="ngColList">\r\n            <li class="ngColListItem" ng-repeat="col in columns | ngColumns">\r\n                <label><input ng-disabled="col.pinned" type="checkbox" class="ngColListCheckbox" ng-model="col.visible"/>{{col.displayName}}</label>\r\n				<a title="Group By" ng-class="col.groupedByClass()" ng-show="col.groupable && col.visible" ng-click="groupBy(col)"></a>\r\n				<span class="ngGroupingNumber" ng-show="col.groupIndex > 0">{{col.groupIndex}}</span>          \r\n            </li>\r\n        </ul>\r\n    </div>\r\n</div>'),a.put("rowTemplate.html",'<div ng-style="{ \'cursor\': row.cursor }" ng-repeat="col in renderedColumns" ng-class="col.colIndex()" class="ngCell {{col.cellClass}}">\r\n	<div class="ngVerticalBar" ng-style="{height: rowHeight}" ng-class="{ ngVerticalBarVisible: !$last }">&nbsp;</div>\r\n	<div ng-cell></div>\r\n</div>')}])}(window,jQuery),d3=function(){function a(a){return null!=a&&!isNaN(a)}function b(a){return a.length}function c(a){for(var b=1;a*b%1;)b*=10;return b}function d(a,b){try{for(var c in b)Object.defineProperty(a.prototype,c,{value:b[c],enumerable:!1})}catch(d){a.prototype=b}}function e(){}function f(){}function g(a,b,c){return function(){var d=c.apply(b,arguments);return d===b?a:d}}function h(a,b){if(b in a)return b;b=b.charAt(0).toUpperCase()+b.substring(1);for(var c=0,d=lh.length;d>c;++c){var e=lh[c]+b;if(e in a)return e}}function i(){}function j(){}function k(a){function b(){for(var b,d=c,e=-1,f=d.length;++e<f;)(b=d[e].on)&&b.apply(this,arguments);return a}var c=[],d=new e;return b.on=function(b,e){var f,g=d.get(b);return arguments.length<2?g&&g.on:(g&&(g.on=null,c=c.slice(0,f=c.indexOf(g)).concat(c.slice(f+1)),d.remove(b)),e&&c.push(d.set(b,{on:e})),a)},b}function l(){Wg.event.preventDefault()}function m(){for(var a,b=Wg.event;a=b.sourceEvent;)b=a;return b}function n(a){for(var b=new j,c=0,d=arguments.length;++c<d;)b[arguments[c]]=k(b);return b.of=function(c,d){return function(e){try{var f=e.sourceEvent=Wg.event;e.target=a,Wg.event=e,b[e.type].apply(c,d)}finally{Wg.event=f}}},b}function o(a){return nh(a,sh),a}function p(a){return"function"==typeof a?a:function(){return oh(a,this)}}function q(a){return"function"==typeof a?a:function(){return ph(a,this)}}function r(a,b){function c(){this.removeAttribute(a)}function d(){this.removeAttributeNS(a.space,a.local)}function e(){this.setAttribute(a,b)}function f(){this.setAttributeNS(a.space,a.local,b)}function g(){var c=b.apply(this,arguments);null==c?this.removeAttribute(a):this.setAttribute(a,c)}function h(){var c=b.apply(this,arguments);null==c?this.removeAttributeNS(a.space,a.local):this.setAttributeNS(a.space,a.local,c)}return a=Wg.ns.qualify(a),null==b?a.local?d:c:"function"==typeof b?a.local?h:g:a.local?f:e}function s(a){return a.trim().replace(/\s+/g," ")}function t(a){return new RegExp("(?:^|\\s+)"+Wg.requote(a)+"(?:\\s+|$)","g")}function u(a){return a.trim().split(/^|\s+/)}function v(a,b){function c(){for(var c=-1;++c<e;)a[c](this,b)}function d(){for(var c=-1,d=b.apply(this,arguments);++c<e;)a[c](this,d)}a=u(a).map(w);var e=a.length;return"function"==typeof b?d:c}function w(a){var b=t(a);return function(c,d){if(e=c.classList)return d?e.add(a):e.remove(a);var e=c.getAttribute("class")||"";d?(b.lastIndex=0,b.test(e)||c.setAttribute("class",s(e+" "+a))):c.setAttribute("class",s(e.replace(b," ")))}}function x(a,b,c){function d(){this.style.removeProperty(a)}function e(){this.style.setProperty(a,b,c)}function f(){var d=b.apply(this,arguments);null==d?this.style.removeProperty(a):this.style.setProperty(a,d,c)}return null==b?d:"function"==typeof b?f:e}function y(a,b){function c(){delete this[a]}function d(){this[a]=b}function e(){var c=b.apply(this,arguments);null==c?delete this[a]:this[a]=c}return null==b?c:"function"==typeof b?e:d}function z(a){return"function"==typeof a?a:(a=Wg.ns.qualify(a)).local?function(){return this.ownerDocument.createElementNS(a.space,a.local)}:function(){return this.ownerDocument.createElementNS(this.namespaceURI,a)}}function A(a){return{__data__:a}}function B(a){return function(){return rh(this,a)}}function C(a){return arguments.length||(a=Wg.ascending),function(b,c){return b&&c?a(b.__data__,c.__data__):!b-!c}}function D(a,b){for(var c=0,d=a.length;d>c;c++)for(var e,f=a[c],g=0,h=f.length;h>g;g++)(e=f[g])&&b(e,g,c);return a}function E(a){return nh(a,uh),a}function F(a){var b,c;return function(d,e,f){var g,h=a[f].update,i=h.length;for(f!=c&&(c=f,b=0),e>=b&&(b=e+1);!(g=h[b])&&++b<i;);return g}}function G(){var a=this.__transition__;a&&++a.active}function H(a,b,c){function d(){var b=this[g];b&&(this.removeEventListener(a,b,b.$),delete this[g])}function e(){var e=j(b,Yg(arguments));d.call(this),this.addEventListener(a,this[g]=e,e.$=c),e._=b}function f(){var b,c=new RegExp("^__on([^.]+)"+Wg.requote(a)+"$");for(var d in this)if(b=d.match(c)){var e=this[d];this.removeEventListener(b[1],e,e.$),delete this[d]}}var g="__on"+a,h=a.indexOf("."),j=I;h>0&&(a=a.substring(0,h));var k=wh.get(a);return k&&(a=k,j=J),h?b?e:d:b?i:f}function I(a,b){return function(c){var d=Wg.event;Wg.event=c,b[0]=this.__data__;try{a.apply(this,b)}finally{Wg.event=d}}}function J(a,b){var c=I(a,b);return function(a){var b=this,d=a.relatedTarget;d&&(d===b||8&d.compareDocumentPosition(b))||c.call(b,a)}}function K(){var a=".dragsuppress-"+ ++yh,b="click"+a,c=Wg.select(_g).on("touchmove"+a,l).on("dragstart"+a,l).on("selectstart"+a,l);if(xh){var d=$g.style,e=d[xh];d[xh]="none"}return function(f){function g(){c.on(b,null)}c.on(a,null),xh&&(d[xh]=e),f&&(c.on(b,function(){l(),g()},!0),setTimeout(g,0))}}function L(a,b){b.changedTouches&&(b=b.changedTouches[0]);var c=a.ownerSVGElement||a;if(c.createSVGPoint){var d=c.createSVGPoint();if(0>zh&&(_g.scrollX||_g.scrollY)){c=Wg.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var e=c[0][0].getScreenCTM();zh=!(e.f||e.e),c.remove()}return zh?(d.x=b.pageX,d.y=b.pageY):(d.x=b.clientX,d.y=b.clientY),d=d.matrixTransform(a.getScreenCTM().inverse()),[d.x,d.y]}var f=a.getBoundingClientRect();return[b.clientX-f.left-a.clientLeft,b.clientY-f.top-a.clientTop]}function M(a){return a>0?1:0>a?-1:0}function N(a){return a>1?0:-1>a?Ah:Math.acos(a)}function O(a){return a>1?Ch:-1>a?-Ch:Math.asin(a)}function P(a){return((a=Math.exp(a))-1/a)/2}function Q(a){return((a=Math.exp(a))+1/a)/2}function R(a){return((a=Math.exp(2*a))-1)/(a+1)}function S(a){return(a=Math.sin(a/2))*a}function T(){}function U(a,b,c){return new V(a,b,c)}function V(a,b,c){this.h=a,this.s=b,this.l=c}function W(a,b,c){function d(a){return a>360?a-=360:0>a&&(a+=360),60>a?f+(g-f)*a/60:180>a?g:240>a?f+(g-f)*(240-a)/60:f}function e(a){return Math.round(255*d(a))}var f,g;return a=isNaN(a)?0:(a%=360)<0?a+360:a,b=isNaN(b)?0:0>b?0:b>1?1:b,c=0>c?0:c>1?1:c,g=.5>=c?c*(1+b):c+b-c*b,f=2*c-g,hb(e(a+120),e(a),e(a-120))}function X(a,b,c){return new Y(a,b,c)}function Y(a,b,c){this.h=a,this.c=b,this.l=c}function Z(a,b,c){return isNaN(a)&&(a=0),isNaN(b)&&(b=0),$(c,Math.cos(a*=Fh)*b,Math.sin(a)*b)}function $(a,b,c){return new _(a,b,c)}function _(a,b,c){this.l=a,this.a=b,this.b=c}function ab(a,b,c){var d=(a+16)/116,e=d+b/500,f=d-c/200;return e=cb(e)*Qh,d=cb(d)*Rh,f=cb(f)*Sh,hb(eb(3.2404542*e-1.5371385*d-.4985314*f),eb(-.969266*e+1.8760108*d+.041556*f),eb(.0556434*e-.2040259*d+1.0572252*f))}function bb(a,b,c){return a>0?X(Math.atan2(c,b)*Gh,Math.sqrt(b*b+c*c),a):X(0/0,0/0,a)}function cb(a){return a>.206893034?a*a*a:(a-4/29)/7.787037}function db(a){return a>.008856?Math.pow(a,1/3):7.787037*a+4/29}function eb(a){return Math.round(255*(.00304>=a?12.92*a:1.055*Math.pow(a,1/2.4)-.055))}function fb(a){return hb(a>>16,a>>8&255,255&a)}function gb(a){return fb(a)+""}function hb(a,b,c){return new ib(a,b,c)}function ib(a,b,c){this.r=a,this.g=b,this.b=c}function jb(a){return 16>a?"0"+Math.max(0,a).toString(16):Math.min(255,a).toString(16)}function kb(a,b,c){var d,e,f,g=0,h=0,i=0;if(d=/([a-z]+)\((.*)\)/i.exec(a))switch(e=d[2].split(","),d[1]){case"hsl":return c(parseFloat(e[0]),parseFloat(e[1])/100,parseFloat(e[2])/100);case"rgb":return b(ob(e[0]),ob(e[1]),ob(e[2]))}return(f=Vh.get(a))?b(f.r,f.g,f.b):(null!=a&&"#"===a.charAt(0)&&(4===a.length?(g=a.charAt(1),g+=g,h=a.charAt(2),h+=h,i=a.charAt(3),i+=i):7===a.length&&(g=a.substring(1,3),h=a.substring(3,5),i=a.substring(5,7)),g=parseInt(g,16),h=parseInt(h,16),i=parseInt(i,16)),b(g,h,i))}function lb(a,b,c){var d,e,f=Math.min(a/=255,b/=255,c/=255),g=Math.max(a,b,c),h=g-f,i=(g+f)/2;return h?(e=.5>i?h/(g+f):h/(2-g-f),d=a==g?(b-c)/h+(c>b?6:0):b==g?(c-a)/h+2:(a-b)/h+4,d*=60):(d=0/0,e=i>0&&1>i?0:d),U(d,e,i)}function mb(a,b,c){a=nb(a),b=nb(b),c=nb(c);var d=db((.4124564*a+.3575761*b+.1804375*c)/Qh),e=db((.2126729*a+.7151522*b+.072175*c)/Rh),f=db((.0193339*a+.119192*b+.9503041*c)/Sh);return $(116*e-16,500*(d-e),200*(e-f))}function nb(a){return(a/=255)<=.04045?a/12.92:Math.pow((a+.055)/1.055,2.4)}function ob(a){var b=parseFloat(a);return"%"===a.charAt(a.length-1)?Math.round(2.55*b):b}function pb(a){return"function"==typeof a?a:function(){return a}}function qb(a){return a}function rb(a){return function(b,c,d){return 2===arguments.length&&"function"==typeof c&&(d=c,c=null),sb(b,c,a,d)}}function sb(a,b,c,d){function e(){var a,b=i.status;if(!b&&i.responseText||b>=200&&300>b||304===b){try{a=c.call(f,i)}catch(d){return void g.error.call(f,d)}g.load.call(f,a)}else g.error.call(f,i)}var f={},g=Wg.dispatch("beforesend","progress","load","error"),h={},i=new XMLHttpRequest,j=null;return!_g.XDomainRequest||"withCredentials"in i||!/^(http(s)?:)?\/\//.test(a)||(i=new XDomainRequest),"onload"in i?i.onload=i.onerror=e:i.onreadystatechange=function(){i.readyState>3&&e()},i.onprogress=function(a){var b=Wg.event;Wg.event=a;try{g.progress.call(f,i)}finally{Wg.event=b}},f.header=function(a,b){return a=(a+"").toLowerCase(),arguments.length<2?h[a]:(null==b?delete h[a]:h[a]=b+"",f)},f.mimeType=function(a){return arguments.length?(b=null==a?null:a+"",f):b},f.responseType=function(a){return arguments.length?(j=a,f):j},f.response=function(a){return c=a,f},["get","post"].forEach(function(a){f[a]=function(){return f.send.apply(f,[a].concat(Yg(arguments)))}}),f.send=function(c,d,e){if(2===arguments.length&&"function"==typeof d&&(e=d,d=null),i.open(c,a,!0),null==b||"accept"in h||(h.accept=b+",*/*"),i.setRequestHeader)for(var k in h)i.setRequestHeader(k,h[k]);return null!=b&&i.overrideMimeType&&i.overrideMimeType(b),null!=j&&(i.responseType=j),null!=e&&f.on("error",e).on("load",function(a){e(null,a)}),g.beforesend.call(f,i),i.send(null==d?null:d),f},f.abort=function(){return i.abort(),f},Wg.rebind(f,g,"on"),null==d?f:f.get(tb(d))}function tb(a){return 1===a.length?function(b,c){a(null==b?c:null)}:a}function ub(){var a=vb(),b=wb()-a;b>24?(isFinite(b)&&(clearTimeout(Zh),Zh=setTimeout(ub,b)),Yh=0):(Yh=1,_h(ub))}function vb(){var a=Date.now();for($h=Wh;$h;)a>=$h.t&&($h.f=$h.c(a-$h.t)),$h=$h.n;return a}function wb(){for(var a,b=Wh,c=1/0;b;)b.f?b=a?a.n=b.n:Wh=b.n:(b.t<c&&(c=b.t),b=(a=b).n);return Xh=a,c}function xb(a,b){var c=Math.pow(10,3*ih(8-b));return{scale:b>8?function(a){return a/c}:function(a){return a*c},symbol:a}}function yb(a,b){return b-(a?Math.ceil(Math.log(a)/Math.LN10):1)}function zb(a){return a+""}function Ab(){}function Bb(a,b,c){var d=c.s=a+b,e=d-a,f=d-e;c.t=a-f+(b-e)}function Cb(a,b){a&&li.hasOwnProperty(a.type)&&li[a.type](a,b)}function Db(a,b,c){var d,e=-1,f=a.length-c;for(b.lineStart();++e<f;)d=a[e],b.point(d[0],d[1],d[2]);b.lineEnd()}function Eb(a,b){var c=-1,d=a.length;for(b.polygonStart();++c<d;)Db(a[c],b,1);b.polygonEnd()}function Fb(){function a(a,b){a*=Fh,b=b*Fh/2+Ah/4;var c=a-d,g=Math.cos(b),h=Math.sin(b),i=f*h,j=e*g+i*Math.cos(c),k=i*Math.sin(c);ni.add(Math.atan2(k,j)),d=a,e=g,f=h}var b,c,d,e,f;oi.point=function(g,h){oi.point=a,d=(b=g)*Fh,e=Math.cos(h=(c=h)*Fh/2+Ah/4),f=Math.sin(h)},oi.lineEnd=function(){a(b,c)}}function Gb(a){var b=a[0],c=a[1],d=Math.cos(c);return[d*Math.cos(b),d*Math.sin(b),Math.sin(c)]}function Hb(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]}function Ib(a,b){return[a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0]]}function Jb(a,b){a[0]+=b[0],a[1]+=b[1],a[2]+=b[2]}function Kb(a,b){return[a[0]*b,a[1]*b,a[2]*b]}function Lb(a){var b=Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]);a[0]/=b,a[1]/=b,a[2]/=b}function Mb(a){return[Math.atan2(a[1],a[0]),O(a[2])]}function Nb(a,b){return ih(a[0]-b[0])<Dh&&ih(a[1]-b[1])<Dh}function Ob(a,b){a*=Fh;var c=Math.cos(b*=Fh);Pb(c*Math.cos(a),c*Math.sin(a),Math.sin(b))}function Pb(a,b,c){++pi,ri+=(a-ri)/pi,si+=(b-si)/pi,ti+=(c-ti)/pi}function Qb(){function a(a,e){a*=Fh;var f=Math.cos(e*=Fh),g=f*Math.cos(a),h=f*Math.sin(a),i=Math.sin(e),j=Math.atan2(Math.sqrt((j=c*i-d*h)*j+(j=d*g-b*i)*j+(j=b*h-c*g)*j),b*g+c*h+d*i);qi+=j,ui+=j*(b+(b=g)),vi+=j*(c+(c=h)),wi+=j*(d+(d=i)),Pb(b,c,d)}var b,c,d;Ai.point=function(e,f){e*=Fh;var g=Math.cos(f*=Fh);b=g*Math.cos(e),c=g*Math.sin(e),d=Math.sin(f),Ai.point=a,Pb(b,c,d)}}function Rb(){Ai.point=Ob}function Sb(){function a(a,b){a*=Fh;var c=Math.cos(b*=Fh),g=c*Math.cos(a),h=c*Math.sin(a),i=Math.sin(b),j=e*i-f*h,k=f*g-d*i,l=d*h-e*g,m=Math.sqrt(j*j+k*k+l*l),n=d*g+e*h+f*i,o=m&&-N(n)/m,p=Math.atan2(m,n);xi+=o*j,yi+=o*k,zi+=o*l,qi+=p,ui+=p*(d+(d=g)),vi+=p*(e+(e=h)),wi+=p*(f+(f=i)),Pb(d,e,f)}var b,c,d,e,f;Ai.point=function(g,h){b=g,c=h,Ai.point=a,g*=Fh;var i=Math.cos(h*=Fh);d=i*Math.cos(g),e=i*Math.sin(g),f=Math.sin(h),Pb(d,e,f)},Ai.lineEnd=function(){a(b,c),Ai.lineEnd=Rb,Ai.point=Ob}}function Tb(){return!0}function Ub(a,b,c,d,e){var f=[],g=[];if(a.forEach(function(a){if(!((b=a.length-1)<=0)){var b,c=a[0],d=a[b];if(Nb(c,d)){e.lineStart();for(var h=0;b>h;++h)e.point((c=a[h])[0],c[1]);return void e.lineEnd()}var i=new Wb(c,a,null,!0),j=new Wb(c,null,i,!1);i.o=j,f.push(i),g.push(j),i=new Wb(d,a,null,!1),j=new Wb(d,null,i,!0),i.o=j,f.push(i),g.push(j)
-}}),g.sort(b),Vb(f),Vb(g),f.length){for(var h=0,i=c,j=g.length;j>h;++h)g[h].e=i=!i;for(var k,l,m=f[0];;){for(var n=m,o=!0;n.v;)if((n=n.n)===m)return;k=n.z,e.lineStart();do{if(n.v=n.o.v=!0,n.e){if(o)for(var h=0,j=k.length;j>h;++h)e.point((l=k[h])[0],l[1]);else d(n.x,n.n.x,1,e);n=n.n}else{if(o){k=n.p.z;for(var h=k.length-1;h>=0;--h)e.point((l=k[h])[0],l[1])}else d(n.x,n.p.x,-1,e);n=n.p}n=n.o,k=n.z,o=!o}while(!n.v);e.lineEnd()}}}function Vb(a){if(b=a.length){for(var b,c,d=0,e=a[0];++d<b;)e.n=c=a[d],c.p=e,e=c;e.n=c=a[0],c.p=e}}function Wb(a,b,c,d){this.x=a,this.z=b,this.o=c,this.e=d,this.v=!1,this.n=this.p=null}function Xb(a,b,c,d){return function(e,f){function g(b,c){var d=e(b,c);a(b=d[0],c=d[1])&&f.point(b,c)}function h(a,b){var c=e(a,b);q.point(c[0],c[1])}function i(){s.point=h,q.lineStart()}function j(){s.point=g,q.lineEnd()}function k(a,b){p.push([a,b]);var c=e(a,b);u.point(c[0],c[1])}function l(){u.lineStart(),p=[]}function m(){k(p[0][0],p[0][1]),u.lineEnd();var a,b=u.clean(),c=t.buffer(),d=c.length;if(p.pop(),o.push(p),p=null,d){if(1&b){a=c[0];var e,d=a.length-1,g=-1;for(f.lineStart();++g<d;)f.point((e=a[g])[0],e[1]);return void f.lineEnd()}d>1&&2&b&&c.push(c.pop().concat(c.shift())),n.push(c.filter(Yb))}}var n,o,p,q=b(f),r=e.invert(d[0],d[1]),s={point:g,lineStart:i,lineEnd:j,polygonStart:function(){s.point=k,s.lineStart=l,s.lineEnd=m,n=[],o=[],f.polygonStart()},polygonEnd:function(){s.point=g,s.lineStart=i,s.lineEnd=j,n=Wg.merge(n);var a=_b(r,o);n.length?Ub(n,$b,a,c,f):a&&(f.lineStart(),c(null,null,1,f),f.lineEnd()),f.polygonEnd(),n=o=null},sphere:function(){f.polygonStart(),f.lineStart(),c(null,null,1,f),f.lineEnd(),f.polygonEnd()}},t=Zb(),u=b(t);return s}}function Yb(a){return a.length>1}function Zb(){var a,b=[];return{lineStart:function(){b.push(a=[])},point:function(b,c){a.push([b,c])},lineEnd:i,buffer:function(){var c=b;return b=[],a=null,c},rejoin:function(){b.length>1&&b.push(b.pop().concat(b.shift()))}}}function $b(a,b){return((a=a.x)[0]<0?a[1]-Ch-Dh:Ch-a[1])-((b=b.x)[0]<0?b[1]-Ch-Dh:Ch-b[1])}function _b(a,b){var c=a[0],d=a[1],e=[Math.sin(c),-Math.cos(c),0],f=0,g=0;ni.reset();for(var h=0,i=b.length;i>h;++h){var j=b[h],k=j.length;if(k)for(var l=j[0],m=l[0],n=l[1]/2+Ah/4,o=Math.sin(n),p=Math.cos(n),q=1;;){q===k&&(q=0),a=j[q];var r=a[0],s=a[1]/2+Ah/4,t=Math.sin(s),u=Math.cos(s),v=r-m,w=ih(v)>Ah,x=o*t;if(ni.add(Math.atan2(x*Math.sin(v),p*u+x*Math.cos(v))),f+=w?v+(v>=0?Bh:-Bh):v,w^m>=c^r>=c){var y=Ib(Gb(l),Gb(a));Lb(y);var z=Ib(e,y);Lb(z);var A=(w^v>=0?-1:1)*O(z[2]);(d>A||d===A&&(y[0]||y[1]))&&(g+=w^v>=0?1:-1)}if(!q++)break;m=r,o=t,p=u,l=a}}return(-Dh>f||Dh>f&&0>ni)^1&g}function ac(a){var b,c=0/0,d=0/0,e=0/0;return{lineStart:function(){a.lineStart(),b=1},point:function(f,g){var h=f>0?Ah:-Ah,i=ih(f-c);ih(i-Ah)<Dh?(a.point(c,d=(d+g)/2>0?Ch:-Ch),a.point(e,d),a.lineEnd(),a.lineStart(),a.point(h,d),a.point(f,d),b=0):e!==h&&i>=Ah&&(ih(c-e)<Dh&&(c-=e*Dh),ih(f-h)<Dh&&(f-=h*Dh),d=bc(c,d,f,g),a.point(e,d),a.lineEnd(),a.lineStart(),a.point(h,d),b=0),a.point(c=f,d=g),e=h},lineEnd:function(){a.lineEnd(),c=d=0/0},clean:function(){return 2-b}}}function bc(a,b,c,d){var e,f,g=Math.sin(a-c);return ih(g)>Dh?Math.atan((Math.sin(b)*(f=Math.cos(d))*Math.sin(c)-Math.sin(d)*(e=Math.cos(b))*Math.sin(a))/(e*f*g)):(b+d)/2}function cc(a,b,c,d){var e;if(null==a)e=c*Ch,d.point(-Ah,e),d.point(0,e),d.point(Ah,e),d.point(Ah,0),d.point(Ah,-e),d.point(0,-e),d.point(-Ah,-e),d.point(-Ah,0),d.point(-Ah,e);else if(ih(a[0]-b[0])>Dh){var f=a[0]<b[0]?Ah:-Ah;e=c*f/2,d.point(-f,e),d.point(0,e),d.point(f,e)}else d.point(b[0],b[1])}function dc(a){function b(a,b){return Math.cos(a)*Math.cos(b)>f}function c(a){var c,f,i,j,k;return{lineStart:function(){j=i=!1,k=1},point:function(l,m){var n,o=[l,m],p=b(l,m),q=g?p?0:e(l,m):p?e(l+(0>l?Ah:-Ah),m):0;if(!c&&(j=i=p)&&a.lineStart(),p!==i&&(n=d(c,o),(Nb(c,n)||Nb(o,n))&&(o[0]+=Dh,o[1]+=Dh,p=b(o[0],o[1]))),p!==i)k=0,p?(a.lineStart(),n=d(o,c),a.point(n[0],n[1])):(n=d(c,o),a.point(n[0],n[1]),a.lineEnd()),c=n;else if(h&&c&&g^p){var r;q&f||!(r=d(o,c,!0))||(k=0,g?(a.lineStart(),a.point(r[0][0],r[0][1]),a.point(r[1][0],r[1][1]),a.lineEnd()):(a.point(r[1][0],r[1][1]),a.lineEnd(),a.lineStart(),a.point(r[0][0],r[0][1])))}!p||c&&Nb(c,o)||a.point(o[0],o[1]),c=o,i=p,f=q},lineEnd:function(){i&&a.lineEnd(),c=null},clean:function(){return k|(j&&i)<<1}}}function d(a,b,c){var d=Gb(a),e=Gb(b),g=[1,0,0],h=Ib(d,e),i=Hb(h,h),j=h[0],k=i-j*j;if(!k)return!c&&a;var l=f*i/k,m=-f*j/k,n=Ib(g,h),o=Kb(g,l),p=Kb(h,m);Jb(o,p);var q=n,r=Hb(o,q),s=Hb(q,q),t=r*r-s*(Hb(o,o)-1);if(!(0>t)){var u=Math.sqrt(t),v=Kb(q,(-r-u)/s);if(Jb(v,o),v=Mb(v),!c)return v;var w,x=a[0],y=b[0],z=a[1],A=b[1];x>y&&(w=x,x=y,y=w);var B=y-x,C=ih(B-Ah)<Dh,D=C||Dh>B;if(!C&&z>A&&(w=z,z=A,A=w),D?C?z+A>0^v[1]<(ih(v[0]-x)<Dh?z:A):z<=v[1]&&v[1]<=A:B>Ah^(x<=v[0]&&v[0]<=y)){var E=Kb(q,(-r+u)/s);return Jb(E,o),[v,Mb(E)]}}}function e(b,c){var d=g?a:Ah-a,e=0;return-d>b?e|=1:b>d&&(e|=2),-d>c?e|=4:c>d&&(e|=8),e}var f=Math.cos(a),g=f>0,h=ih(f)>Dh,i=Fc(a,6*Fh);return Xb(b,c,i,g?[0,-a]:[-Ah,a-Ah])}function ec(a,b,c,d){return function(e){var f,g=e.a,h=e.b,i=g.x,j=g.y,k=h.x,l=h.y,m=0,n=1,o=k-i,p=l-j;if(f=a-i,o||!(f>0)){if(f/=o,0>o){if(m>f)return;n>f&&(n=f)}else if(o>0){if(f>n)return;f>m&&(m=f)}if(f=c-i,o||!(0>f)){if(f/=o,0>o){if(f>n)return;f>m&&(m=f)}else if(o>0){if(m>f)return;n>f&&(n=f)}if(f=b-j,p||!(f>0)){if(f/=p,0>p){if(m>f)return;n>f&&(n=f)}else if(p>0){if(f>n)return;f>m&&(m=f)}if(f=d-j,p||!(0>f)){if(f/=p,0>p){if(f>n)return;f>m&&(m=f)}else if(p>0){if(m>f)return;n>f&&(n=f)}return m>0&&(e.a={x:i+m*o,y:j+m*p}),1>n&&(e.b={x:i+n*o,y:j+n*p}),e}}}}}}function fc(a,b,c,d){function e(d,e){return ih(d[0]-a)<Dh?e>0?0:3:ih(d[0]-c)<Dh?e>0?2:1:ih(d[1]-b)<Dh?e>0?1:0:e>0?3:2}function f(a,b){return g(a.x,b.x)}function g(a,b){var c=e(a,1),d=e(b,1);return c!==d?c-d:0===c?b[1]-a[1]:1===c?a[0]-b[0]:2===c?a[1]-b[1]:b[0]-a[0]}return function(h){function i(a){for(var b=0,c=r.length,d=a[1],e=0;c>e;++e)for(var f,g=1,h=r[e],i=h.length,k=h[0];i>g;++g)f=h[g],k[1]<=d?f[1]>d&&j(k,f,a)>0&&++b:f[1]<=d&&j(k,f,a)<0&&--b,k=f;return 0!==b}function j(a,b,c){return(b[0]-a[0])*(c[1]-a[1])-(c[0]-a[0])*(b[1]-a[1])}function k(f,h,i,j){var k=0,l=0;if(null==f||(k=e(f,i))!==(l=e(h,i))||g(f,h)<0^i>0){do j.point(0===k||3===k?a:c,k>1?d:b);while((k=(k+i+4)%4)!==l)}else j.point(h[0],h[1])}function l(e,f){return e>=a&&c>=e&&f>=b&&d>=f}function m(a,b){l(a,b)&&h.point(a,b)}function n(){E.point=p,r&&r.push(s=[]),z=!0,y=!1,w=x=0/0}function o(){q&&(p(t,u),v&&y&&C.rejoin(),q.push(C.buffer())),E.point=m,y&&h.lineEnd()}function p(a,b){a=Math.max(-Ci,Math.min(Ci,a)),b=Math.max(-Ci,Math.min(Ci,b));var c=l(a,b);if(r&&s.push([a,b]),z)t=a,u=b,v=c,z=!1,c&&(h.lineStart(),h.point(a,b));else if(c&&y)h.point(a,b);else{var d={a:{x:w,y:x},b:{x:a,y:b}};D(d)?(y||(h.lineStart(),h.point(d.a.x,d.a.y)),h.point(d.b.x,d.b.y),c||h.lineEnd(),A=!1):c&&(h.lineStart(),h.point(a,b),A=!1)}w=a,x=b,y=c}var q,r,s,t,u,v,w,x,y,z,A,B=h,C=Zb(),D=ec(a,b,c,d),E={point:m,lineStart:n,lineEnd:o,polygonStart:function(){h=C,q=[],r=[],A=!0},polygonEnd:function(){h=B,q=Wg.merge(q);var b=i([a,d]),c=A&&b,e=q.length;(c||e)&&(h.polygonStart(),c&&(h.lineStart(),k(null,null,1,h),h.lineEnd()),e&&Ub(q,f,b,k,h),h.polygonEnd()),q=r=s=null}};return E}}function gc(a,b){function c(c,d){return c=a(c,d),b(c[0],c[1])}return a.invert&&b.invert&&(c.invert=function(c,d){return c=b.invert(c,d),c&&a.invert(c[0],c[1])}),c}function hc(a){var b=0,c=Ah/3,d=xc(a),e=d(b,c);return e.parallels=function(a){return arguments.length?d(b=a[0]*Ah/180,c=a[1]*Ah/180):[b/Ah*180,c/Ah*180]},e}function ic(a,b){function c(a,b){var c=Math.sqrt(f-2*e*Math.sin(b))/e;return[c*Math.sin(a*=e),g-c*Math.cos(a)]}var d=Math.sin(a),e=(d+Math.sin(b))/2,f=1+d*(2*e-d),g=Math.sqrt(f)/e;return c.invert=function(a,b){var c=g-b;return[Math.atan2(a,c)/e,O((f-(a*a+c*c)*e*e)/(2*e))]},c}function jc(){function a(a,b){Ei+=e*a-d*b,d=a,e=b}var b,c,d,e;Ji.point=function(f,g){Ji.point=a,b=d=f,c=e=g},Ji.lineEnd=function(){a(b,c)}}function kc(a,b){Fi>a&&(Fi=a),a>Hi&&(Hi=a),Gi>b&&(Gi=b),b>Ii&&(Ii=b)}function lc(){function a(a,b){g.push("M",a,",",b,f)}function b(a,b){g.push("M",a,",",b),h.point=c}function c(a,b){g.push("L",a,",",b)}function d(){h.point=a}function e(){g.push("Z")}var f=mc(4.5),g=[],h={point:a,lineStart:function(){h.point=b},lineEnd:d,polygonStart:function(){h.lineEnd=e},polygonEnd:function(){h.lineEnd=d,h.point=a},pointRadius:function(a){return f=mc(a),h},result:function(){if(g.length){var a=g.join("");return g=[],a}}};return h}function mc(a){return"m0,"+a+"a"+a+","+a+" 0 1,1 0,"+-2*a+"a"+a+","+a+" 0 1,1 0,"+2*a+"z"}function nc(a,b){ri+=a,si+=b,++ti}function oc(){function a(a,d){var e=a-b,f=d-c,g=Math.sqrt(e*e+f*f);ui+=g*(b+a)/2,vi+=g*(c+d)/2,wi+=g,nc(b=a,c=d)}var b,c;Li.point=function(d,e){Li.point=a,nc(b=d,c=e)}}function pc(){Li.point=nc}function qc(){function a(a,b){var c=a-d,f=b-e,g=Math.sqrt(c*c+f*f);ui+=g*(d+a)/2,vi+=g*(e+b)/2,wi+=g,g=e*a-d*b,xi+=g*(d+a),yi+=g*(e+b),zi+=3*g,nc(d=a,e=b)}var b,c,d,e;Li.point=function(f,g){Li.point=a,nc(b=d=f,c=e=g)},Li.lineEnd=function(){a(b,c)}}function rc(a){function b(b,c){a.moveTo(b,c),a.arc(b,c,g,0,Bh)}function c(b,c){a.moveTo(b,c),h.point=d}function d(b,c){a.lineTo(b,c)}function e(){h.point=b}function f(){a.closePath()}var g=4.5,h={point:b,lineStart:function(){h.point=c},lineEnd:e,polygonStart:function(){h.lineEnd=f},polygonEnd:function(){h.lineEnd=e,h.point=b},pointRadius:function(a){return g=a,h},result:i};return h}function sc(a){function b(a){return(h?d:c)(a)}function c(b){return vc(b,function(c,d){c=a(c,d),b.point(c[0],c[1])})}function d(b){function c(c,d){c=a(c,d),b.point(c[0],c[1])}function d(){t=0/0,y.point=f,b.lineStart()}function f(c,d){var f=Gb([c,d]),g=a(c,d);e(t,u,s,v,w,x,t=g[0],u=g[1],s=c,v=f[0],w=f[1],x=f[2],h,b),b.point(t,u)}function g(){y.point=c,b.lineEnd()}function i(){d(),y.point=j,y.lineEnd=k}function j(a,b){f(l=a,m=b),n=t,o=u,p=v,q=w,r=x,y.point=f}function k(){e(t,u,s,v,w,x,n,o,l,p,q,r,h,b),y.lineEnd=g,g()}var l,m,n,o,p,q,r,s,t,u,v,w,x,y={point:c,lineStart:d,lineEnd:g,polygonStart:function(){b.polygonStart(),y.lineStart=i},polygonEnd:function(){b.polygonEnd(),y.lineStart=d}};return y}function e(b,c,d,h,i,j,k,l,m,n,o,p,q,r){var s=k-b,t=l-c,u=s*s+t*t;if(u>4*f&&q--){var v=h+n,w=i+o,x=j+p,y=Math.sqrt(v*v+w*w+x*x),z=Math.asin(x/=y),A=ih(ih(x)-1)<Dh||ih(d-m)<Dh?(d+m)/2:Math.atan2(w,v),B=a(A,z),C=B[0],D=B[1],E=C-b,F=D-c,G=t*E-s*F;(G*G/u>f||ih((s*E+t*F)/u-.5)>.3||g>h*n+i*o+j*p)&&(e(b,c,d,h,i,j,C,D,A,v/=y,w/=y,x,q,r),r.point(C,D),e(C,D,A,v,w,x,k,l,m,n,o,p,q,r))}}var f=.5,g=Math.cos(30*Fh),h=16;return b.precision=function(a){return arguments.length?(h=(f=a*a)>0&&16,b):Math.sqrt(f)},b}function tc(a){var b=sc(function(b,c){return a([b*Gh,c*Gh])});return function(a){return yc(b(a))}}function uc(a){this.stream=a}function vc(a,b){return{point:b,sphere:function(){a.sphere()},lineStart:function(){a.lineStart()},lineEnd:function(){a.lineEnd()},polygonStart:function(){a.polygonStart()},polygonEnd:function(){a.polygonEnd()}}}function wc(a){return xc(function(){return a})()}function xc(a){function b(a){return a=h(a[0]*Fh,a[1]*Fh),[a[0]*m+i,j-a[1]*m]}function c(a){return a=h.invert((a[0]-i)/m,(j-a[1])/m),a&&[a[0]*Gh,a[1]*Gh]}function d(){h=gc(g=Bc(r,s,t),f);var a=f(p,q);return i=n-a[0]*m,j=o+a[1]*m,e()}function e(){return k&&(k.valid=!1,k=null),b}var f,g,h,i,j,k,l=sc(function(a,b){return a=f(a,b),[a[0]*m+i,j-a[1]*m]}),m=150,n=480,o=250,p=0,q=0,r=0,s=0,t=0,u=Bi,v=qb,w=null,x=null;return b.stream=function(a){return k&&(k.valid=!1),k=yc(u(g,l(v(a)))),k.valid=!0,k},b.clipAngle=function(a){return arguments.length?(u=null==a?(w=a,Bi):dc((w=+a)*Fh),e()):w},b.clipExtent=function(a){return arguments.length?(x=a,v=a?fc(a[0][0],a[0][1],a[1][0],a[1][1]):qb,e()):x},b.scale=function(a){return arguments.length?(m=+a,d()):m},b.translate=function(a){return arguments.length?(n=+a[0],o=+a[1],d()):[n,o]},b.center=function(a){return arguments.length?(p=a[0]%360*Fh,q=a[1]%360*Fh,d()):[p*Gh,q*Gh]},b.rotate=function(a){return arguments.length?(r=a[0]%360*Fh,s=a[1]%360*Fh,t=a.length>2?a[2]%360*Fh:0,d()):[r*Gh,s*Gh,t*Gh]},Wg.rebind(b,l,"precision"),function(){return f=a.apply(this,arguments),b.invert=f.invert&&c,d()}}function yc(a){return vc(a,function(b,c){a.point(b*Fh,c*Fh)})}function zc(a,b){return[a,b]}function Ac(a,b){return[a>Ah?a-Bh:-Ah>a?a+Bh:a,b]}function Bc(a,b,c){return a?b||c?gc(Dc(a),Ec(b,c)):Dc(a):b||c?Ec(b,c):Ac}function Cc(a){return function(b,c){return b+=a,[b>Ah?b-Bh:-Ah>b?b+Bh:b,c]}}function Dc(a){var b=Cc(a);return b.invert=Cc(-a),b}function Ec(a,b){function c(a,b){var c=Math.cos(b),h=Math.cos(a)*c,i=Math.sin(a)*c,j=Math.sin(b),k=j*d+h*e;return[Math.atan2(i*f-k*g,h*d-j*e),O(k*f+i*g)]}var d=Math.cos(a),e=Math.sin(a),f=Math.cos(b),g=Math.sin(b);return c.invert=function(a,b){var c=Math.cos(b),h=Math.cos(a)*c,i=Math.sin(a)*c,j=Math.sin(b),k=j*f-i*g;return[Math.atan2(i*f+j*g,h*d+k*e),O(k*d-h*e)]},c}function Fc(a,b){var c=Math.cos(a),d=Math.sin(a);return function(e,f,g,h){var i=g*b;null!=e?(e=Gc(c,e),f=Gc(c,f),(g>0?f>e:e>f)&&(e+=g*Bh)):(e=a+g*Bh,f=a-.5*i);for(var j,k=e;g>0?k>f:f>k;k-=i)h.point((j=Mb([c,-d*Math.cos(k),-d*Math.sin(k)]))[0],j[1])}}function Gc(a,b){var c=Gb(b);c[0]-=a,Lb(c);var d=N(-c[1]);return((-c[2]<0?-d:d)+2*Math.PI-Dh)%(2*Math.PI)}function Hc(a,b,c){var d=Wg.range(a,b-Dh,c).concat(b);return function(a){return d.map(function(b){return[a,b]})}}function Ic(a,b,c){var d=Wg.range(a,b-Dh,c).concat(b);return function(a){return d.map(function(b){return[b,a]})}}function Jc(a){return a.source}function Kc(a){return a.target}function Lc(a,b,c,d){var e=Math.cos(b),f=Math.sin(b),g=Math.cos(d),h=Math.sin(d),i=e*Math.cos(a),j=e*Math.sin(a),k=g*Math.cos(c),l=g*Math.sin(c),m=2*Math.asin(Math.sqrt(S(d-b)+e*g*S(c-a))),n=1/Math.sin(m),o=m?function(a){var b=Math.sin(a*=m)*n,c=Math.sin(m-a)*n,d=c*i+b*k,e=c*j+b*l,g=c*f+b*h;return[Math.atan2(e,d)*Gh,Math.atan2(g,Math.sqrt(d*d+e*e))*Gh]}:function(){return[a*Gh,b*Gh]};return o.distance=m,o}function Mc(){function a(a,e){var f=Math.sin(e*=Fh),g=Math.cos(e),h=ih((a*=Fh)-b),i=Math.cos(h);Mi+=Math.atan2(Math.sqrt((h=g*Math.sin(h))*h+(h=d*f-c*g*i)*h),c*f+d*g*i),b=a,c=f,d=g}var b,c,d;Ni.point=function(e,f){b=e*Fh,c=Math.sin(f*=Fh),d=Math.cos(f),Ni.point=a},Ni.lineEnd=function(){Ni.point=Ni.lineEnd=i}}function Nc(a,b){function c(b,c){var d=Math.cos(b),e=Math.cos(c),f=a(d*e);return[f*e*Math.sin(b),f*Math.sin(c)]}return c.invert=function(a,c){var d=Math.sqrt(a*a+c*c),e=b(d),f=Math.sin(e),g=Math.cos(e);return[Math.atan2(a*f,d*g),Math.asin(d&&c*f/d)]},c}function Oc(a,b){function c(a,b){var c=ih(ih(b)-Ch)<Dh?0:g/Math.pow(e(b),f);return[c*Math.sin(f*a),g-c*Math.cos(f*a)]}var d=Math.cos(a),e=function(a){return Math.tan(Ah/4+a/2)},f=a===b?Math.sin(a):Math.log(d/Math.cos(b))/Math.log(e(b)/e(a)),g=d*Math.pow(e(a),f)/f;return f?(c.invert=function(a,b){var c=g-b,d=M(f)*Math.sqrt(a*a+c*c);return[Math.atan2(a,c)/f,2*Math.atan(Math.pow(g/d,1/f))-Ch]},c):Qc}function Pc(a,b){function c(a,b){var c=f-b;return[c*Math.sin(e*a),f-c*Math.cos(e*a)]}var d=Math.cos(a),e=a===b?Math.sin(a):(d-Math.cos(b))/(b-a),f=d/e+a;return ih(e)<Dh?zc:(c.invert=function(a,b){var c=f-b;return[Math.atan2(a,c)/e,f-M(e)*Math.sqrt(a*a+c*c)]},c)}function Qc(a,b){return[a,Math.log(Math.tan(Ah/4+b/2))]}function Rc(a){var b,c=wc(a),d=c.scale,e=c.translate,f=c.clipExtent;return c.scale=function(){var a=d.apply(c,arguments);return a===c?b?c.clipExtent(null):c:a},c.translate=function(){var a=e.apply(c,arguments);return a===c?b?c.clipExtent(null):c:a},c.clipExtent=function(a){var g=f.apply(c,arguments);if(g===c){if(b=null==a){var h=Ah*d(),i=e();f([[i[0]-h,i[1]-h],[i[0]+h,i[1]+h]])}}else b&&(g=null);return g},c.clipExtent(null)}function Sc(a,b){return[Math.log(Math.tan(Ah/4+b/2)),-a]}function Tc(a){return a[0]}function Uc(a){return a[1]}function Vc(a,b,c,d){var e,f,g,h,i,j,k;return e=d[a],f=e[0],g=e[1],e=d[b],h=e[0],i=e[1],e=d[c],j=e[0],k=e[1],(k-g)*(h-f)-(i-g)*(j-f)>0}function Wc(a,b,c){return(c[0]-b[0])*(a[1]-b[1])<(c[1]-b[1])*(a[0]-b[0])}function Xc(a,b,c,d){var e=a[0],f=c[0],g=b[0]-e,h=d[0]-f,i=a[1],j=c[1],k=b[1]-i,l=d[1]-j,m=(h*(i-j)-l*(e-f))/(l*g-h*k);return[e+m*g,i+m*k]}function Yc(a){var b=a[0],c=a[a.length-1];return!(b[0]-c[0]||b[1]-c[1])}function Zc(){sd(this),this.edge=this.site=this.circle=null}function $c(a){var b=Zi.pop()||new Zc;return b.site=a,b}function _c(a){jd(a),Wi.remove(a),Zi.push(a),sd(a)}function ad(a){var b=a.circle,c=b.x,d=b.cy,e={x:c,y:d},f=a.P,g=a.N,h=[a];_c(a);for(var i=f;i.circle&&ih(c-i.circle.x)<Dh&&ih(d-i.circle.cy)<Dh;)f=i.P,h.unshift(i),_c(i),i=f;h.unshift(i),jd(i);for(var j=g;j.circle&&ih(c-j.circle.x)<Dh&&ih(d-j.circle.cy)<Dh;)g=j.N,h.push(j),_c(j),j=g;h.push(j),jd(j);var k,l=h.length;for(k=1;l>k;++k)j=h[k],i=h[k-1],pd(j.edge,i.site,j.site,e);i=h[0],j=h[l-1],j.edge=nd(i.site,j.site,null,e),id(i),id(j)}function bd(a){for(var b,c,d,e,f=a.x,g=a.y,h=Wi._;h;)if(d=cd(h,g)-f,d>Dh)h=h.L;else{if(e=f-dd(h,g),!(e>Dh)){d>-Dh?(b=h.P,c=h):e>-Dh?(b=h,c=h.N):b=c=h;break}if(!h.R){b=h;break}h=h.R}var i=$c(a);if(Wi.insert(b,i),b||c){if(b===c)return jd(b),c=$c(b.site),Wi.insert(i,c),i.edge=c.edge=nd(b.site,i.site),id(b),void id(c);if(!c)return void(i.edge=nd(b.site,i.site));jd(b),jd(c);var j=b.site,k=j.x,l=j.y,m=a.x-k,n=a.y-l,o=c.site,p=o.x-k,q=o.y-l,r=2*(m*q-n*p),s=m*m+n*n,t=p*p+q*q,u={x:(q*s-n*t)/r+k,y:(m*t-p*s)/r+l};pd(c.edge,j,o,u),i.edge=nd(j,a,null,u),c.edge=nd(a,o,null,u),id(b),id(c)}}function cd(a,b){var c=a.site,d=c.x,e=c.y,f=e-b;if(!f)return d;var g=a.P;if(!g)return-1/0;c=g.site;var h=c.x,i=c.y,j=i-b;if(!j)return h;var k=h-d,l=1/f-1/j,m=k/j;return l?(-m+Math.sqrt(m*m-2*l*(k*k/(-2*j)-i+j/2+e-f/2)))/l+d:(d+h)/2}function dd(a,b){var c=a.N;if(c)return cd(c,b);var d=a.site;return d.y===b?d.x:1/0}function ed(a){this.site=a,this.edges=[]}function fd(a){for(var b,c,d,e,f,g,h,i,j,k,l=a[0][0],m=a[1][0],n=a[0][1],o=a[1][1],p=Vi,q=p.length;q--;)if(f=p[q],f&&f.prepare())for(h=f.edges,i=h.length,g=0;i>g;)k=h[g].end(),d=k.x,e=k.y,j=h[++g%i].start(),b=j.x,c=j.y,(ih(d-b)>Dh||ih(e-c)>Dh)&&(h.splice(g,0,new qd(od(f.site,k,ih(d-l)<Dh&&o-e>Dh?{x:l,y:ih(b-l)<Dh?c:o}:ih(e-o)<Dh&&m-d>Dh?{x:ih(c-o)<Dh?b:m,y:o}:ih(d-m)<Dh&&e-n>Dh?{x:m,y:ih(b-m)<Dh?c:n}:ih(e-n)<Dh&&d-l>Dh?{x:ih(c-n)<Dh?b:l,y:n}:null),f.site,null)),++i)}function gd(a,b){return b.angle-a.angle}function hd(){sd(this),this.x=this.y=this.arc=this.site=this.cy=null}function id(a){var b=a.P,c=a.N;if(b&&c){var d=b.site,e=a.site,f=c.site;if(d!==f){var g=e.x,h=e.y,i=d.x-g,j=d.y-h,k=f.x-g,l=f.y-h,m=2*(i*l-j*k);if(!(m>=-Eh)){var n=i*i+j*j,o=k*k+l*l,p=(l*n-j*o)/m,q=(i*o-k*n)/m,l=q+h,r=$i.pop()||new hd;r.arc=a,r.site=e,r.x=p+g,r.y=l+Math.sqrt(p*p+q*q),r.cy=l,a.circle=r;for(var s=null,t=Yi._;t;)if(r.y<t.y||r.y===t.y&&r.x<=t.x){if(!t.L){s=t.P;break}t=t.L}else{if(!t.R){s=t;break}t=t.R}Yi.insert(s,r),s||(Xi=r)}}}}function jd(a){var b=a.circle;b&&(b.P||(Xi=b.N),Yi.remove(b),$i.push(b),sd(b),a.circle=null)}function kd(a){for(var b,c=Ui,d=ec(a[0][0],a[0][1],a[1][0],a[1][1]),e=c.length;e--;)b=c[e],(!ld(b,a)||!d(b)||ih(b.a.x-b.b.x)<Dh&&ih(b.a.y-b.b.y)<Dh)&&(b.a=b.b=null,c.splice(e,1))}function ld(a,b){var c=a.b;if(c)return!0;var d,e,f=a.a,g=b[0][0],h=b[1][0],i=b[0][1],j=b[1][1],k=a.l,l=a.r,m=k.x,n=k.y,o=l.x,p=l.y,q=(m+o)/2,r=(n+p)/2;if(p===n){if(g>q||q>=h)return;if(m>o){if(f){if(f.y>=j)return}else f={x:q,y:i};c={x:q,y:j}}else{if(f){if(f.y<i)return}else f={x:q,y:j};c={x:q,y:i}}}else if(d=(m-o)/(p-n),e=r-d*q,-1>d||d>1)if(m>o){if(f){if(f.y>=j)return}else f={x:(i-e)/d,y:i};c={x:(j-e)/d,y:j}}else{if(f){if(f.y<i)return}else f={x:(j-e)/d,y:j};c={x:(i-e)/d,y:i}}else if(p>n){if(f){if(f.x>=h)return}else f={x:g,y:d*g+e};c={x:h,y:d*h+e}}else{if(f){if(f.x<g)return}else f={x:h,y:d*h+e};c={x:g,y:d*g+e}}return a.a=f,a.b=c,!0}function md(a,b){this.l=a,this.r=b,this.a=this.b=null}function nd(a,b,c,d){var e=new md(a,b);return Ui.push(e),c&&pd(e,a,b,c),d&&pd(e,b,a,d),Vi[a.i].edges.push(new qd(e,a,b)),Vi[b.i].edges.push(new qd(e,b,a)),e}function od(a,b,c){var d=new md(a,null);return d.a=b,d.b=c,Ui.push(d),d}function pd(a,b,c,d){a.a||a.b?a.l===c?a.b=d:a.a=d:(a.a=d,a.l=b,a.r=c)}function qd(a,b,c){var d=a.a,e=a.b;this.edge=a,this.site=b,this.angle=c?Math.atan2(c.y-b.y,c.x-b.x):a.l===b?Math.atan2(e.x-d.x,d.y-e.y):Math.atan2(d.x-e.x,e.y-d.y)}function rd(){this._=null}function sd(a){a.U=a.C=a.L=a.R=a.P=a.N=null}function td(a,b){var c=b,d=b.R,e=c.U;e?e.L===c?e.L=d:e.R=d:a._=d,d.U=e,c.U=d,c.R=d.L,c.R&&(c.R.U=c),d.L=c}function ud(a,b){var c=b,d=b.L,e=c.U;e?e.L===c?e.L=d:e.R=d:a._=d,d.U=e,c.U=d,c.L=d.R,c.L&&(c.L.U=c),d.R=c}function vd(a){for(;a.L;)a=a.L;return a}function wd(a,b){var c,d,e,f=a.sort(xd).pop();for(Ui=[],Vi=new Array(a.length),Wi=new rd,Yi=new rd;;)if(e=Xi,f&&(!e||f.y<e.y||f.y===e.y&&f.x<e.x))(f.x!==c||f.y!==d)&&(Vi[f.i]=new ed(f),bd(f),c=f.x,d=f.y),f=a.pop();else{if(!e)break;ad(e.arc)}b&&(kd(b),fd(b));var g={cells:Vi,edges:Ui};return Wi=Yi=Ui=Vi=null,g}function xd(a,b){return b.y-a.y||b.x-a.x}function yd(a,b,c){return(a.x-c.x)*(b.y-a.y)-(a.x-b.x)*(c.y-a.y)}function zd(a){return a.x}function Ad(a){return a.y}function Bd(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function Cd(a,b,c,d,e,f){if(!a(b,c,d,e,f)){var g=.5*(c+e),h=.5*(d+f),i=b.nodes;i[0]&&Cd(a,i[0],c,d,g,h),i[1]&&Cd(a,i[1],g,d,e,h),i[2]&&Cd(a,i[2],c,h,g,f),i[3]&&Cd(a,i[3],g,h,e,f)}}function Dd(a,b){a=Wg.rgb(a),b=Wg.rgb(b);var c=a.r,d=a.g,e=a.b,f=b.r-c,g=b.g-d,h=b.b-e;return function(a){return"#"+jb(Math.round(c+f*a))+jb(Math.round(d+g*a))+jb(Math.round(e+h*a))}}function Ed(a,b){var c,d={},e={};for(c in a)c in b?d[c]=Hd(a[c],b[c]):e[c]=a[c];for(c in b)c in a||(e[c]=b[c]);return function(a){for(c in d)e[c]=d[c](a);return e}}function Fd(a,b){return b-=a=+a,function(c){return a+b*c}}function Gd(a,b){var c,d,e,f,g,h=0,i=0,j=[],k=[];for(a+="",b+="",aj.lastIndex=0,d=0;c=aj.exec(b);++d)c.index&&j.push(b.substring(h,i=c.index)),k.push({i:j.length,x:c[0]}),j.push(null),h=aj.lastIndex;for(h<b.length&&j.push(b.substring(h)),d=0,f=k.length;(c=aj.exec(a))&&f>d;++d)if(g=k[d],g.x==c[0]){if(g.i)if(null==j[g.i+1])for(j[g.i-1]+=g.x,j.splice(g.i,1),e=d+1;f>e;++e)k[e].i--;else for(j[g.i-1]+=g.x+j[g.i+1],j.splice(g.i,2),e=d+1;f>e;++e)k[e].i-=2;else if(null==j[g.i+1])j[g.i]=g.x;else for(j[g.i]=g.x+j[g.i+1],j.splice(g.i+1,1),e=d+1;f>e;++e)k[e].i--;k.splice(d,1),f--,d--}else g.x=Fd(parseFloat(c[0]),parseFloat(g.x));for(;f>d;)g=k.pop(),null==j[g.i+1]?j[g.i]=g.x:(j[g.i]=g.x+j[g.i+1],j.splice(g.i+1,1)),f--;return 1===j.length?null==j[0]?(g=k[0].x,function(a){return g(a)+""}):function(){return b}:function(a){for(d=0;f>d;++d)j[(g=k[d]).i]=g.x(a);return j.join("")}}function Hd(a,b){for(var c,d=Wg.interpolators.length;--d>=0&&!(c=Wg.interpolators[d](a,b)););return c}function Id(a,b){var c,d=[],e=[],f=a.length,g=b.length,h=Math.min(a.length,b.length);for(c=0;h>c;++c)d.push(Hd(a[c],b[c]));for(;f>c;++c)e[c]=a[c];for(;g>c;++c)e[c]=b[c];return function(a){for(c=0;h>c;++c)e[c]=d[c](a);return e}}function Jd(a){return function(b){return 0>=b?0:b>=1?1:a(b)}}function Kd(a){return function(b){return 1-a(1-b)}}function Ld(a){return function(b){return.5*(.5>b?a(2*b):2-a(2-2*b))}}function Md(a){return a*a}function Nd(a){return a*a*a}function Od(a){if(0>=a)return 0;if(a>=1)return 1;var b=a*a,c=b*a;return 4*(.5>a?c:3*(a-b)+c-.75)}function Pd(a){return function(b){return Math.pow(b,a)}}function Qd(a){return 1-Math.cos(a*Ch)}function Rd(a){return Math.pow(2,10*(a-1))}function Sd(a){return 1-Math.sqrt(1-a*a)}function Td(a,b){var c;return arguments.length<2&&(b=.45),arguments.length?c=b/Bh*Math.asin(1/a):(a=1,c=b/4),function(d){return 1+a*Math.pow(2,-10*d)*Math.sin((d-c)*Bh/b)}}function Ud(a){return a||(a=1.70158),function(b){return b*b*((a+1)*b-a)}}function Vd(a){return 1/2.75>a?7.5625*a*a:2/2.75>a?7.5625*(a-=1.5/2.75)*a+.75:2.5/2.75>a?7.5625*(a-=2.25/2.75)*a+.9375:7.5625*(a-=2.625/2.75)*a+.984375}function Wd(a,b){a=Wg.hcl(a),b=Wg.hcl(b);var c=a.h,d=a.c,e=a.l,f=b.h-c,g=b.c-d,h=b.l-e;return isNaN(g)&&(g=0,d=isNaN(d)?b.c:d),isNaN(f)?(f=0,c=isNaN(c)?b.h:c):f>180?f-=360:-180>f&&(f+=360),function(a){return Z(c+f*a,d+g*a,e+h*a)+""}}function Xd(a,b){a=Wg.hsl(a),b=Wg.hsl(b);var c=a.h,d=a.s,e=a.l,f=b.h-c,g=b.s-d,h=b.l-e;return isNaN(g)&&(g=0,d=isNaN(d)?b.s:d),isNaN(f)?(f=0,c=isNaN(c)?b.h:c):f>180?f-=360:-180>f&&(f+=360),function(a){return W(c+f*a,d+g*a,e+h*a)+""}}function Yd(a,b){a=Wg.lab(a),b=Wg.lab(b);var c=a.l,d=a.a,e=a.b,f=b.l-c,g=b.a-d,h=b.b-e;return function(a){return ab(c+f*a,d+g*a,e+h*a)+""}}function Zd(a,b){return b-=a,function(c){return Math.round(a+b*c)}}function $d(a){var b=[a.a,a.b],c=[a.c,a.d],d=ae(b),e=_d(b,c),f=ae(be(c,b,-e))||0;b[0]*c[1]<c[0]*b[1]&&(b[0]*=-1,b[1]*=-1,d*=-1,e*=-1),this.rotate=(d?Math.atan2(b[1],b[0]):Math.atan2(-c[0],c[1]))*Gh,this.translate=[a.e,a.f],this.scale=[d,f],this.skew=f?Math.atan2(e,f)*Gh:0}function _d(a,b){return a[0]*b[0]+a[1]*b[1]}function ae(a){var b=Math.sqrt(_d(a,a));return b&&(a[0]/=b,a[1]/=b),b}function be(a,b,c){return a[0]+=c*b[0],a[1]+=c*b[1],a}function ce(a,b){var c,d=[],e=[],f=Wg.transform(a),g=Wg.transform(b),h=f.translate,i=g.translate,j=f.rotate,k=g.rotate,l=f.skew,m=g.skew,n=f.scale,o=g.scale;return h[0]!=i[0]||h[1]!=i[1]?(d.push("translate(",null,",",null,")"),e.push({i:1,x:Fd(h[0],i[0])},{i:3,x:Fd(h[1],i[1])})):d.push(i[0]||i[1]?"translate("+i+")":""),j!=k?(j-k>180?k+=360:k-j>180&&(j+=360),e.push({i:d.push(d.pop()+"rotate(",null,")")-2,x:Fd(j,k)})):k&&d.push(d.pop()+"rotate("+k+")"),l!=m?e.push({i:d.push(d.pop()+"skewX(",null,")")-2,x:Fd(l,m)}):m&&d.push(d.pop()+"skewX("+m+")"),n[0]!=o[0]||n[1]!=o[1]?(c=d.push(d.pop()+"scale(",null,",",null,")"),e.push({i:c-4,x:Fd(n[0],o[0])},{i:c-2,x:Fd(n[1],o[1])})):(1!=o[0]||1!=o[1])&&d.push(d.pop()+"scale("+o+")"),c=e.length,function(a){for(var b,f=-1;++f<c;)d[(b=e[f]).i]=b.x(a);return d.join("")}}function de(a,b){return b=b-(a=+a)?1/(b-a):0,function(c){return(c-a)*b}}function ee(a,b){return b=b-(a=+a)?1/(b-a):0,function(c){return Math.max(0,Math.min(1,(c-a)*b))}}function fe(a){for(var b=a.source,c=a.target,d=he(b,c),e=[b];b!==d;)b=b.parent,e.push(b);for(var f=e.length;c!==d;)e.splice(f,0,c),c=c.parent;return e}function ge(a){for(var b=[],c=a.parent;null!=c;)b.push(a),a=c,c=c.parent;return b.push(a),b}function he(a,b){if(a===b)return a;for(var c=ge(a),d=ge(b),e=c.pop(),f=d.pop(),g=null;e===f;)g=e,e=c.pop(),f=d.pop();return g}function ie(a){a.fixed|=2}function je(a){a.fixed&=-7}function ke(a){a.fixed|=4,a.px=a.x,a.py=a.y}function le(a){a.fixed&=-5}function me(a,b,c){var d=0,e=0;if(a.charge=0,!a.leaf)for(var f,g=a.nodes,h=g.length,i=-1;++i<h;)f=g[i],null!=f&&(me(f,b,c),a.charge+=f.charge,d+=f.charge*f.cx,e+=f.charge*f.cy);if(a.point){a.leaf||(a.point.x+=Math.random()-.5,a.point.y+=Math.random()-.5);var j=b*c[a.point.index];a.charge+=a.pointCharge=j,d+=j*a.point.x,e+=j*a.point.y}a.cx=d/a.charge,a.cy=e/a.charge}function ne(a,b){return Wg.rebind(a,b,"sort","children","value"),a.nodes=a,a.links=re,a}function oe(a){return a.children}function pe(a){return a.value}function qe(a,b){return b.value-a.value}function re(a){return Wg.merge(a.map(function(a){return(a.children||[]).map(function(b){return{source:a,target:b}})}))}function se(a){return a.x}function te(a){return a.y}function ue(a,b,c){a.y0=b,a.y=c}function ve(a){return Wg.range(a.length)}function we(a){for(var b=-1,c=a[0].length,d=[];++b<c;)d[b]=0;return d}function xe(a){for(var b,c=1,d=0,e=a[0][1],f=a.length;f>c;++c)(b=a[c][1])>e&&(d=c,e=b);return d}function ye(a){return a.reduce(ze,0)}function ze(a,b){return a+b[1]}function Ae(a,b){return Be(a,Math.ceil(Math.log(b.length)/Math.LN2+1))}function Be(a,b){for(var c=-1,d=+a[0],e=(a[1]-d)/b,f=[];++c<=b;)f[c]=e*c+d;return f}function Ce(a){return[Wg.min(a),Wg.max(a)]}function De(a,b){return a.parent==b.parent?1:2}function Ee(a){var b=a.children;return b&&b.length?b[0]:a._tree.thread}function Fe(a){var b,c=a.children;return c&&(b=c.length)?c[b-1]:a._tree.thread}function Ge(a,b){var c=a.children;if(c&&(e=c.length))for(var d,e,f=-1;++f<e;)b(d=Ge(c[f],b),a)>0&&(a=d);return a}function He(a,b){return a.x-b.x}function Ie(a,b){return b.x-a.x}function Je(a,b){return a.depth-b.depth}function Ke(a,b){function c(a,d){var e=a.children;if(e&&(g=e.length))for(var f,g,h=null,i=-1;++i<g;)f=e[i],c(f,h),h=f;b(a,d)}c(a,null)}function Le(a){for(var b,c=0,d=0,e=a.children,f=e.length;--f>=0;)b=e[f]._tree,b.prelim+=c,b.mod+=c,c+=b.shift+(d+=b.change)}function Me(a,b,c){a=a._tree,b=b._tree;var d=c/(b.number-a.number);a.change+=d,b.change-=d,b.shift+=c,b.prelim+=c,b.mod+=c}function Ne(a,b,c){return a._tree.ancestor.parent==b.parent?a._tree.ancestor:c}function Oe(a,b){return a.value-b.value}function Pe(a,b){var c=a._pack_next;a._pack_next=b,b._pack_prev=a,b._pack_next=c,c._pack_prev=b}function Qe(a,b){a._pack_next=b,b._pack_prev=a}function Re(a,b){var c=b.x-a.x,d=b.y-a.y,e=a.r+b.r;return.999*e*e>c*c+d*d}function Se(a){function b(a){k=Math.min(a.x-a.r,k),l=Math.max(a.x+a.r,l),m=Math.min(a.y-a.r,m),n=Math.max(a.y+a.r,n)}if((c=a.children)&&(j=c.length)){var c,d,e,f,g,h,i,j,k=1/0,l=-1/0,m=1/0,n=-1/0;if(c.forEach(Te),d=c[0],d.x=-d.r,d.y=0,b(d),j>1&&(e=c[1],e.x=e.r,e.y=0,b(e),j>2))for(f=c[2],We(d,e,f),b(f),Pe(d,f),d._pack_prev=f,Pe(f,e),e=d._pack_next,g=3;j>g;g++){We(d,e,f=c[g]);var o=0,p=1,q=1;for(h=e._pack_next;h!==e;h=h._pack_next,p++)if(Re(h,f)){o=1;break}if(1==o)for(i=d._pack_prev;i!==h._pack_prev&&!Re(i,f);i=i._pack_prev,q++);o?(q>p||p==q&&e.r<d.r?Qe(d,e=h):Qe(d=i,e),g--):(Pe(d,f),e=f,b(f))}var r=(k+l)/2,s=(m+n)/2,t=0;for(g=0;j>g;g++)f=c[g],f.x-=r,f.y-=s,t=Math.max(t,f.r+Math.sqrt(f.x*f.x+f.y*f.y));a.r=t,c.forEach(Ue)}}function Te(a){a._pack_next=a._pack_prev=a}function Ue(a){delete a._pack_next,delete a._pack_prev}function Ve(a,b,c,d){var e=a.children;if(a.x=b+=d*a.x,a.y=c+=d*a.y,a.r*=d,e)for(var f=-1,g=e.length;++f<g;)Ve(e[f],b,c,d)}function We(a,b,c){var d=a.r+c.r,e=b.x-a.x,f=b.y-a.y;if(d&&(e||f)){var g=b.r+c.r,h=e*e+f*f;g*=g,d*=d;var i=.5+(d-g)/(2*h),j=Math.sqrt(Math.max(0,2*g*(d+h)-(d-=h)*d-g*g))/(2*h);c.x=a.x+i*e+j*f,c.y=a.y+i*f-j*e}else c.x=a.x+d,c.y=a.y}function Xe(a){return 1+Wg.max(a,function(a){return a.y})}function Ye(a){return a.reduce(function(a,b){return a+b.x},0)/a.length}function Ze(a){var b=a.children;return b&&b.length?Ze(b[0]):a}function $e(a){var b,c=a.children;return c&&(b=c.length)?$e(c[b-1]):a}function _e(a){return{x:a.x,y:a.y,dx:a.dx,dy:a.dy}}function af(a,b){var c=a.x+b[3],d=a.y+b[0],e=a.dx-b[1]-b[3],f=a.dy-b[0]-b[2];return 0>e&&(c+=e/2,e=0),0>f&&(d+=f/2,f=0),{x:c,y:d,dx:e,dy:f}}function bf(a){var b=a[0],c=a[a.length-1];return c>b?[b,c]:[c,b]}function cf(a){return a.rangeExtent?a.rangeExtent():bf(a.range())}function df(a,b,c,d){var e=c(a[0],a[1]),f=d(b[0],b[1]);return function(a){return f(e(a))}}function ef(a,b){var c,d=0,e=a.length-1,f=a[d],g=a[e];return f>g&&(c=d,d=e,e=c,c=f,f=g,g=c),a[d]=b.floor(f),a[e]=b.ceil(g),a}function ff(a){return a?{floor:function(b){return Math.floor(b/a)*a},ceil:function(b){return Math.ceil(b/a)*a}}:kj}function gf(a,b,c,d){var e=[],f=[],g=0,h=Math.min(a.length,b.length)-1;for(a[h]<a[0]&&(a=a.slice().reverse(),b=b.slice().reverse());++g<=h;)e.push(c(a[g-1],a[g])),f.push(d(b[g-1],b[g]));return function(b){var c=Wg.bisect(a,b,1,h)-1;return f[c](e[c](b))}}function hf(a,b,c,d){function e(){var e=Math.min(a.length,b.length)>2?gf:df,i=d?ee:de;return g=e(a,b,i,c),h=e(b,a,i,Hd),f}function f(a){return g(a)}var g,h;return f.invert=function(a){return h(a)},f.domain=function(b){return arguments.length?(a=b.map(Number),e()):a},f.range=function(a){return arguments.length?(b=a,e()):b},f.rangeRound=function(a){return f.range(a).interpolate(Zd)},f.clamp=function(a){return arguments.length?(d=a,e()):d},f.interpolate=function(a){return arguments.length?(c=a,e()):c},f.ticks=function(b){return mf(a,b)},f.tickFormat=function(b,c){return nf(a,b,c)},f.nice=function(b){return kf(a,b),e()},f.copy=function(){return hf(a,b,c,d)},e()}function jf(a,b){return Wg.rebind(a,b,"range","rangeRound","interpolate","clamp")}function kf(a,b){return ef(a,ff(lf(a,b)[2]))}function lf(a,b){null==b&&(b=10);var c=bf(a),d=c[1]-c[0],e=Math.pow(10,Math.floor(Math.log(d/b)/Math.LN10)),f=b/d*e;return.15>=f?e*=10:.35>=f?e*=5:.75>=f&&(e*=2),c[0]=Math.ceil(c[0]/e)*e,c[1]=Math.floor(c[1]/e)*e+.5*e,c[2]=e,c}function mf(a,b){return Wg.range.apply(Wg,lf(a,b))
-}function nf(a,b,c){var d=lf(a,b);return Wg.format(c?c.replace(fi,function(a,b,c,e,f,g,h,i,j,k){return[b,c,e,f,g,h,i,j||"."+pf(k,d),k].join("")}):",."+of(d[2])+"f")}function of(a){return-Math.floor(Math.log(a)/Math.LN10+.01)}function pf(a,b){var c=of(b[2]);return a in lj?Math.abs(c-of(Math.max(Math.abs(b[0]),Math.abs(b[1]))))+ +("e"!==a):c-2*("%"===a)}function qf(a,b,c,d){function e(a){return(c?Math.log(0>a?0:a):-Math.log(a>0?0:-a))/Math.log(b)}function f(a){return c?Math.pow(b,a):-Math.pow(b,-a)}function g(b){return a(e(b))}return g.invert=function(b){return f(a.invert(b))},g.domain=function(b){return arguments.length?(c=b[0]>=0,a.domain((d=b.map(Number)).map(e)),g):d},g.base=function(c){return arguments.length?(b=+c,a.domain(d.map(e)),g):b},g.nice=function(){var b=ef(d.map(e),c?Math:nj);return a.domain(b),d=b.map(f),g},g.ticks=function(){var a=bf(d),g=[],h=a[0],i=a[1],j=Math.floor(e(h)),k=Math.ceil(e(i)),l=b%1?2:b;if(isFinite(k-j)){if(c){for(;k>j;j++)for(var m=1;l>m;m++)g.push(f(j)*m);g.push(f(j))}else for(g.push(f(j));j++<k;)for(var m=l-1;m>0;m--)g.push(f(j)*m);for(j=0;g[j]<h;j++);for(k=g.length;g[k-1]>i;k--);g=g.slice(j,k)}return g},g.tickFormat=function(a,b){if(!arguments.length)return mj;arguments.length<2?b=mj:"function"!=typeof b&&(b=Wg.format(b));var d,h=Math.max(.1,a/g.ticks().length),i=c?(d=1e-12,Math.ceil):(d=-1e-12,Math.floor);return function(a){return a/f(i(e(a)+d))<=h?b(a):""}},g.copy=function(){return qf(a.copy(),b,c,d)},jf(g,a)}function rf(a,b,c){function d(b){return a(e(b))}var e=sf(b),f=sf(1/b);return d.invert=function(b){return f(a.invert(b))},d.domain=function(b){return arguments.length?(a.domain((c=b.map(Number)).map(e)),d):c},d.ticks=function(a){return mf(c,a)},d.tickFormat=function(a,b){return nf(c,a,b)},d.nice=function(a){return d.domain(kf(c,a))},d.exponent=function(g){return arguments.length?(e=sf(b=g),f=sf(1/b),a.domain(c.map(e)),d):b},d.copy=function(){return rf(a.copy(),b,c)},jf(d,a)}function sf(a){return function(b){return 0>b?-Math.pow(-b,a):Math.pow(b,a)}}function tf(a,b){function c(c){return g[((f.get(c)||"range"===b.t&&f.set(c,a.push(c)))-1)%g.length]}function d(b,c){return Wg.range(a.length).map(function(a){return b+c*a})}var f,g,h;return c.domain=function(d){if(!arguments.length)return a;a=[],f=new e;for(var g,h=-1,i=d.length;++h<i;)f.has(g=d[h])||f.set(g,a.push(g));return c[b.t].apply(c,b.a)},c.range=function(a){return arguments.length?(g=a,h=0,b={t:"range",a:arguments},c):g},c.rangePoints=function(e,f){arguments.length<2&&(f=0);var i=e[0],j=e[1],k=(j-i)/(Math.max(1,a.length-1)+f);return g=d(a.length<2?(i+j)/2:i+k*f/2,k),h=0,b={t:"rangePoints",a:arguments},c},c.rangeBands=function(e,f,i){arguments.length<2&&(f=0),arguments.length<3&&(i=f);var j=e[1]<e[0],k=e[j-0],l=e[1-j],m=(l-k)/(a.length-f+2*i);return g=d(k+m*i,m),j&&g.reverse(),h=m*(1-f),b={t:"rangeBands",a:arguments},c},c.rangeRoundBands=function(e,f,i){arguments.length<2&&(f=0),arguments.length<3&&(i=f);var j=e[1]<e[0],k=e[j-0],l=e[1-j],m=Math.floor((l-k)/(a.length-f+2*i)),n=l-k-(a.length-f)*m;return g=d(k+Math.round(n/2),m),j&&g.reverse(),h=Math.round(m*(1-f)),b={t:"rangeRoundBands",a:arguments},c},c.rangeBand=function(){return h},c.rangeExtent=function(){return bf(b.a[0])},c.copy=function(){return tf(a,b)},c.domain(a)}function uf(a,b){function c(){var c=0,f=b.length;for(e=[];++c<f;)e[c-1]=Wg.quantile(a,c/f);return d}function d(a){return isNaN(a=+a)?void 0:b[Wg.bisect(e,a)]}var e;return d.domain=function(b){return arguments.length?(a=b.filter(function(a){return!isNaN(a)}).sort(Wg.ascending),c()):a},d.range=function(a){return arguments.length?(b=a,c()):b},d.quantiles=function(){return e},d.invertExtent=function(c){return c=b.indexOf(c),0>c?[0/0,0/0]:[c>0?e[c-1]:a[0],c<e.length?e[c]:a[a.length-1]]},d.copy=function(){return uf(a,b)},c()}function vf(a,b,c){function d(b){return c[Math.max(0,Math.min(g,Math.floor(f*(b-a))))]}function e(){return f=c.length/(b-a),g=c.length-1,d}var f,g;return d.domain=function(c){return arguments.length?(a=+c[0],b=+c[c.length-1],e()):[a,b]},d.range=function(a){return arguments.length?(c=a,e()):c},d.invertExtent=function(b){return b=c.indexOf(b),b=0>b?0/0:b/f+a,[b,b+1/f]},d.copy=function(){return vf(a,b,c)},e()}function wf(a,b){function c(c){return c>=c?b[Wg.bisect(a,c)]:void 0}return c.domain=function(b){return arguments.length?(a=b,c):a},c.range=function(a){return arguments.length?(b=a,c):b},c.invertExtent=function(c){return c=b.indexOf(c),[a[c-1],a[c]]},c.copy=function(){return wf(a,b)},c}function xf(a){function b(a){return+a}return b.invert=b,b.domain=b.range=function(c){return arguments.length?(a=c.map(b),b):a},b.ticks=function(b){return mf(a,b)},b.tickFormat=function(b,c){return nf(a,b,c)},b.copy=function(){return xf(a)},b}function yf(a){return a.innerRadius}function zf(a){return a.outerRadius}function Af(a){return a.startAngle}function Bf(a){return a.endAngle}function Cf(a){function b(b){function g(){j.push("M",f(a(k),h))}for(var i,j=[],k=[],l=-1,m=b.length,n=pb(c),o=pb(d);++l<m;)e.call(this,i=b[l],l)?k.push([+n.call(this,i,l),+o.call(this,i,l)]):k.length&&(g(),k=[]);return k.length&&g(),j.length?j.join(""):null}var c=Tc,d=Uc,e=Tb,f=Df,g=f.key,h=.7;return b.x=function(a){return arguments.length?(c=a,b):c},b.y=function(a){return arguments.length?(d=a,b):d},b.defined=function(a){return arguments.length?(e=a,b):e},b.interpolate=function(a){return arguments.length?(g="function"==typeof a?f=a:(f=uj.get(a)||Df).key,b):g},b.tension=function(a){return arguments.length?(h=a,b):h},b}function Df(a){return a.join("L")}function Ef(a){return Df(a)+"Z"}function Ff(a){for(var b=0,c=a.length,d=a[0],e=[d[0],",",d[1]];++b<c;)e.push("H",(d[0]+(d=a[b])[0])/2,"V",d[1]);return c>1&&e.push("H",d[0]),e.join("")}function Gf(a){for(var b=0,c=a.length,d=a[0],e=[d[0],",",d[1]];++b<c;)e.push("V",(d=a[b])[1],"H",d[0]);return e.join("")}function Hf(a){for(var b=0,c=a.length,d=a[0],e=[d[0],",",d[1]];++b<c;)e.push("H",(d=a[b])[0],"V",d[1]);return e.join("")}function If(a,b){return a.length<4?Df(a):a[1]+Lf(a.slice(1,a.length-1),Mf(a,b))}function Jf(a,b){return a.length<3?Df(a):a[0]+Lf((a.push(a[0]),a),Mf([a[a.length-2]].concat(a,[a[1]]),b))}function Kf(a,b){return a.length<3?Df(a):a[0]+Lf(a,Mf(a,b))}function Lf(a,b){if(b.length<1||a.length!=b.length&&a.length!=b.length+2)return Df(a);var c=a.length!=b.length,d="",e=a[0],f=a[1],g=b[0],h=g,i=1;if(c&&(d+="Q"+(f[0]-2*g[0]/3)+","+(f[1]-2*g[1]/3)+","+f[0]+","+f[1],e=a[1],i=2),b.length>1){h=b[1],f=a[i],i++,d+="C"+(e[0]+g[0])+","+(e[1]+g[1])+","+(f[0]-h[0])+","+(f[1]-h[1])+","+f[0]+","+f[1];for(var j=2;j<b.length;j++,i++)f=a[i],h=b[j],d+="S"+(f[0]-h[0])+","+(f[1]-h[1])+","+f[0]+","+f[1]}if(c){var k=a[i];d+="Q"+(f[0]+2*h[0]/3)+","+(f[1]+2*h[1]/3)+","+k[0]+","+k[1]}return d}function Mf(a,b){for(var c,d=[],e=(1-b)/2,f=a[0],g=a[1],h=1,i=a.length;++h<i;)c=f,f=g,g=a[h],d.push([e*(g[0]-c[0]),e*(g[1]-c[1])]);return d}function Nf(a){if(a.length<3)return Df(a);var b=1,c=a.length,d=a[0],e=d[0],f=d[1],g=[e,e,e,(d=a[1])[0]],h=[f,f,f,d[1]],i=[e,",",f,"L",Rf(xj,g),",",Rf(xj,h)];for(a.push(a[c-1]);++b<=c;)d=a[b],g.shift(),g.push(d[0]),h.shift(),h.push(d[1]),Sf(i,g,h);return a.pop(),i.push("L",d),i.join("")}function Of(a){if(a.length<4)return Df(a);for(var b,c=[],d=-1,e=a.length,f=[0],g=[0];++d<3;)b=a[d],f.push(b[0]),g.push(b[1]);for(c.push(Rf(xj,f)+","+Rf(xj,g)),--d;++d<e;)b=a[d],f.shift(),f.push(b[0]),g.shift(),g.push(b[1]),Sf(c,f,g);return c.join("")}function Pf(a){for(var b,c,d=-1,e=a.length,f=e+4,g=[],h=[];++d<4;)c=a[d%e],g.push(c[0]),h.push(c[1]);for(b=[Rf(xj,g),",",Rf(xj,h)],--d;++d<f;)c=a[d%e],g.shift(),g.push(c[0]),h.shift(),h.push(c[1]),Sf(b,g,h);return b.join("")}function Qf(a,b){var c=a.length-1;if(c)for(var d,e,f=a[0][0],g=a[0][1],h=a[c][0]-f,i=a[c][1]-g,j=-1;++j<=c;)d=a[j],e=j/c,d[0]=b*d[0]+(1-b)*(f+e*h),d[1]=b*d[1]+(1-b)*(g+e*i);return Nf(a)}function Rf(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+a[3]*b[3]}function Sf(a,b,c){a.push("C",Rf(vj,b),",",Rf(vj,c),",",Rf(wj,b),",",Rf(wj,c),",",Rf(xj,b),",",Rf(xj,c))}function Tf(a,b){return(b[1]-a[1])/(b[0]-a[0])}function Uf(a){for(var b=0,c=a.length-1,d=[],e=a[0],f=a[1],g=d[0]=Tf(e,f);++b<c;)d[b]=(g+(g=Tf(e=f,f=a[b+1])))/2;return d[b]=g,d}function Vf(a){for(var b,c,d,e,f=[],g=Uf(a),h=-1,i=a.length-1;++h<i;)b=Tf(a[h],a[h+1]),ih(b)<Dh?g[h]=g[h+1]=0:(c=g[h]/b,d=g[h+1]/b,e=c*c+d*d,e>9&&(e=3*b/Math.sqrt(e),g[h]=e*c,g[h+1]=e*d));for(h=-1;++h<=i;)e=(a[Math.min(i,h+1)][0]-a[Math.max(0,h-1)][0])/(6*(1+g[h]*g[h])),f.push([e||0,g[h]*e||0]);return f}function Wf(a){return a.length<3?Df(a):a[0]+Lf(a,Vf(a))}function Xf(a){for(var b,c,d,e=-1,f=a.length;++e<f;)b=a[e],c=b[0],d=b[1]+sj,b[0]=c*Math.cos(d),b[1]=c*Math.sin(d);return a}function Yf(a){function b(b){function i(){p.push("M",h(a(r),l),k,j(a(q.reverse()),l),"Z")}for(var m,n,o,p=[],q=[],r=[],s=-1,t=b.length,u=pb(c),v=pb(e),w=c===d?function(){return n}:pb(d),x=e===f?function(){return o}:pb(f);++s<t;)g.call(this,m=b[s],s)?(q.push([n=+u.call(this,m,s),o=+v.call(this,m,s)]),r.push([+w.call(this,m,s),+x.call(this,m,s)])):q.length&&(i(),q=[],r=[]);return q.length&&i(),p.length?p.join(""):null}var c=Tc,d=Tc,e=0,f=Uc,g=Tb,h=Df,i=h.key,j=h,k="L",l=.7;return b.x=function(a){return arguments.length?(c=d=a,b):d},b.x0=function(a){return arguments.length?(c=a,b):c},b.x1=function(a){return arguments.length?(d=a,b):d},b.y=function(a){return arguments.length?(e=f=a,b):f},b.y0=function(a){return arguments.length?(e=a,b):e},b.y1=function(a){return arguments.length?(f=a,b):f},b.defined=function(a){return arguments.length?(g=a,b):g},b.interpolate=function(a){return arguments.length?(i="function"==typeof a?h=a:(h=uj.get(a)||Df).key,j=h.reverse||h,k=h.closed?"M":"L",b):i},b.tension=function(a){return arguments.length?(l=a,b):l},b}function Zf(a){return a.radius}function $f(a){return[a.x,a.y]}function _f(a){return function(){var b=a.apply(this,arguments),c=b[0],d=b[1]+sj;return[c*Math.cos(d),c*Math.sin(d)]}}function ag(){return 64}function bg(){return"circle"}function cg(a){var b=Math.sqrt(a/Ah);return"M0,"+b+"A"+b+","+b+" 0 1,1 0,"+-b+"A"+b+","+b+" 0 1,1 0,"+b+"Z"}function dg(a,b){return nh(a,Dj),a.id=b,a}function eg(a,b,c,d){var e=a.id;return D(a,"function"==typeof c?function(a,f,g){a.__transition__[e].tween.set(b,d(c.call(a,a.__data__,f,g)))}:(c=d(c),function(a){a.__transition__[e].tween.set(b,c)}))}function fg(a){return null==a&&(a=""),function(){this.textContent=a}}function gg(a,b,c,d){var f=a.__transition__||(a.__transition__={active:0,count:0}),g=f[c];if(!g){var h=d.time;g=f[c]={tween:new e,time:h,ease:d.ease,delay:d.delay,duration:d.duration},++f.count,Wg.timer(function(d){function e(d){return f.active>c?j():(f.active=c,g.event&&g.event.start.call(a,k,b),g.tween.forEach(function(c,d){(d=d.call(a,k,b))&&p.push(d)}),void Wg.timer(function(){return o.c=i(d||1)?Tb:i,1},0,h))}function i(d){if(f.active!==c)return j();for(var e=d/n,h=l(e),i=p.length;i>0;)p[--i].call(a,h);return e>=1?(g.event&&g.event.end.call(a,k,b),j()):void 0}function j(){return--f.count?delete f[c]:delete a.__transition__,1}var k=a.__data__,l=g.ease,m=g.delay,n=g.duration,o=$h,p=[];return o.t=m+h,d>=m?e(d-m):void(o.c=e)},0,h)}}function hg(a,b){a.attr("transform",function(a){return"translate("+b(a)+",0)"})}function ig(a,b){a.attr("transform",function(a){return"translate(0,"+b(a)+")"})}function jg(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function kg(a,b,c){function d(b){var c=a(b),d=f(c,1);return d-b>b-c?c:d}function e(c){return b(c=a(new Kj(c-1)),1),c}function f(a,c){return b(a=new Kj(+a),c),a}function g(a,d,f){var g=e(a),h=[];if(f>1)for(;d>g;)c(g)%f||h.push(new Date(+g)),b(g,1);else for(;d>g;)h.push(new Date(+g)),b(g,1);return h}function h(a,b,c){try{Kj=jg;var d=new jg;return d._=a,g(d,b,c)}finally{Kj=Date}}a.floor=a,a.round=d,a.ceil=e,a.offset=f,a.range=g;var i=a.utc=lg(a);return i.floor=i,i.round=lg(d),i.ceil=lg(e),i.offset=lg(f),i.range=h,a}function lg(a){return function(b,c){try{Kj=jg;var d=new jg;return d._=b,a(d,c)._}finally{Kj=Date}}}function mg(a){function b(b){for(var d,e,f,g=[],h=-1,i=0;++h<c;)37===a.charCodeAt(h)&&(g.push(a.substring(i,h)),null!=(e=bk[d=a.charAt(++h)])&&(d=a.charAt(++h)),(f=ck[d])&&(d=f(b,null==e?"e"===d?" ":"0":e)),g.push(d),i=h+1);return g.push(a.substring(i,h)),g.join("")}var c=a.length;return b.parse=function(b){var c={y:1900,m:0,d:1,H:0,M:0,S:0,L:0,Z:null},d=ng(c,a,b,0);if(d!=b.length)return null;"p"in c&&(c.H=c.H%12+12*c.p);var e=null!=c.Z&&Kj!==jg,f=new(e?jg:Kj);return"j"in c?f.setFullYear(c.y,0,c.j):"w"in c&&("W"in c||"U"in c)?(f.setFullYear(c.y,0,1),f.setFullYear(c.y,0,"W"in c?(c.w+6)%7+7*c.W-(f.getDay()+5)%7:c.w+7*c.U-(f.getDay()+6)%7)):f.setFullYear(c.y,c.m,c.d),f.setHours(c.H+Math.floor(c.Z/100),c.M+c.Z%100,c.S,c.L),e?f._:f},b.toString=function(){return a},b}function ng(a,b,c,d){for(var e,f,g,h=0,i=b.length,j=c.length;i>h;){if(d>=j)return-1;if(e=b.charCodeAt(h++),37===e){if(g=b.charAt(h++),f=dk[g in bk?b.charAt(h++):g],!f||(d=f(a,c,d))<0)return-1}else if(e!=c.charCodeAt(d++))return-1}return d}function og(a){return new RegExp("^(?:"+a.map(Wg.requote).join("|")+")","i")}function pg(a){for(var b=new e,c=-1,d=a.length;++c<d;)b.set(a[c].toLowerCase(),c);return b}function qg(a,b,c){var d=0>a?"-":"",e=(d?-a:a)+"",f=e.length;return d+(c>f?new Array(c-f+1).join(b)+e:e)}function rg(a,b,c){Wj.lastIndex=0;var d=Wj.exec(b.substring(c));return d?(a.w=Xj.get(d[0].toLowerCase()),c+d[0].length):-1}function sg(a,b,c){Uj.lastIndex=0;var d=Uj.exec(b.substring(c));return d?(a.w=Vj.get(d[0].toLowerCase()),c+d[0].length):-1}function tg(a,b,c){ek.lastIndex=0;var d=ek.exec(b.substring(c,c+1));return d?(a.w=+d[0],c+d[0].length):-1}function ug(a,b,c){ek.lastIndex=0;var d=ek.exec(b.substring(c));return d?(a.U=+d[0],c+d[0].length):-1}function vg(a,b,c){ek.lastIndex=0;var d=ek.exec(b.substring(c));return d?(a.W=+d[0],c+d[0].length):-1}function wg(a,b,c){$j.lastIndex=0;var d=$j.exec(b.substring(c));return d?(a.m=_j.get(d[0].toLowerCase()),c+d[0].length):-1}function xg(a,b,c){Yj.lastIndex=0;var d=Yj.exec(b.substring(c));return d?(a.m=Zj.get(d[0].toLowerCase()),c+d[0].length):-1}function yg(a,b,c){return ng(a,ck.c.toString(),b,c)}function zg(a,b,c){return ng(a,ck.x.toString(),b,c)}function Ag(a,b,c){return ng(a,ck.X.toString(),b,c)}function Bg(a,b,c){ek.lastIndex=0;var d=ek.exec(b.substring(c,c+4));return d?(a.y=+d[0],c+d[0].length):-1}function Cg(a,b,c){ek.lastIndex=0;var d=ek.exec(b.substring(c,c+2));return d?(a.y=Eg(+d[0]),c+d[0].length):-1}function Dg(a,b,c){return/^[+-]\d{4}$/.test(b=b.substring(c,c+5))?(a.Z=+b,c+5):-1}function Eg(a){return a+(a>68?1900:2e3)}function Fg(a,b,c){ek.lastIndex=0;var d=ek.exec(b.substring(c,c+2));return d?(a.m=d[0]-1,c+d[0].length):-1}function Gg(a,b,c){ek.lastIndex=0;var d=ek.exec(b.substring(c,c+2));return d?(a.d=+d[0],c+d[0].length):-1}function Hg(a,b,c){ek.lastIndex=0;var d=ek.exec(b.substring(c,c+3));return d?(a.j=+d[0],c+d[0].length):-1}function Ig(a,b,c){ek.lastIndex=0;var d=ek.exec(b.substring(c,c+2));return d?(a.H=+d[0],c+d[0].length):-1}function Jg(a,b,c){ek.lastIndex=0;var d=ek.exec(b.substring(c,c+2));return d?(a.M=+d[0],c+d[0].length):-1}function Kg(a,b,c){ek.lastIndex=0;var d=ek.exec(b.substring(c,c+2));return d?(a.S=+d[0],c+d[0].length):-1}function Lg(a,b,c){ek.lastIndex=0;var d=ek.exec(b.substring(c,c+3));return d?(a.L=+d[0],c+d[0].length):-1}function Mg(a,b,c){var d=fk.get(b.substring(c,c+=2).toLowerCase());return null==d?-1:(a.p=d,c)}function Ng(a){var b=a.getTimezoneOffset(),c=b>0?"-":"+",d=~~(ih(b)/60),e=ih(b)%60;return c+qg(d,"0",2)+qg(e,"0",2)}function Og(a,b,c){ak.lastIndex=0;var d=ak.exec(b.substring(c,c+1));return d?c+d[0].length:-1}function Pg(a){function b(a){try{Kj=jg;var b=new Kj;return b._=a,c(b)}finally{Kj=Date}}var c=mg(a);return b.parse=function(a){try{Kj=jg;var b=c.parse(a);return b&&b._}finally{Kj=Date}},b.toString=c.toString,b}function Qg(a){return a.toISOString()}function Rg(a,b,c){function d(b){return a(b)}function e(a,c){var d=a[1]-a[0],e=d/c,f=Wg.bisect(hk,e);return f==hk.length?[b.year,lf(a.map(function(a){return a/31536e6}),c)[2]]:f?b[e/hk[f-1]<hk[f]/e?f-1:f]:[lk,lf(a,c)[2]]}return d.invert=function(b){return Sg(a.invert(b))},d.domain=function(b){return arguments.length?(a.domain(b),d):a.domain().map(Sg)},d.nice=function(a,b){function c(c){return!isNaN(c)&&!a.range(c,Sg(+c+1),b).length}var f=d.domain(),g=bf(f),h=null==a?e(g,10):"number"==typeof a&&e(g,a);return h&&(a=h[0],b=h[1]),d.domain(ef(f,b>1?{floor:function(b){for(;c(b=a.floor(b));)b=Sg(b-1);return b},ceil:function(b){for(;c(b=a.ceil(b));)b=Sg(+b+1);return b}}:a))},d.ticks=function(a,b){var c=bf(d.domain()),f=null==a?e(c,10):"number"==typeof a?e(c,a):!a.range&&[{range:a},b];return f&&(a=f[0],b=f[1]),a.range(c[0],Sg(+c[1]+1),1>b?1:b)},d.tickFormat=function(){return c},d.copy=function(){return Rg(a.copy(),b,c)},jf(d,a)}function Sg(a){return new Date(a)}function Tg(a){return function(b){for(var c=a.length-1,d=a[c];!d[1](b);)d=a[--c];return d[0](b)}}function Ug(a){return JSON.parse(a.responseText)}function Vg(a){var b=Zg.createRange();return b.selectNode(Zg.body),b.createContextualFragment(a.responseText)}var Wg={version:"3.3.13"};Date.now||(Date.now=function(){return+new Date});var Xg=[].slice,Yg=function(a){return Xg.call(a)},Zg=document,$g=Zg.documentElement,_g=window;try{Yg($g.childNodes)[0].nodeType}catch(ah){Yg=function(a){for(var b=a.length,c=new Array(b);b--;)c[b]=a[b];return c}}try{Zg.createElement("div").style.setProperty("opacity",0,"")}catch(bh){var ch=_g.Element.prototype,dh=ch.setAttribute,eh=ch.setAttributeNS,fh=_g.CSSStyleDeclaration.prototype,gh=fh.setProperty;ch.setAttribute=function(a,b){dh.call(this,a,b+"")},ch.setAttributeNS=function(a,b,c){eh.call(this,a,b,c+"")},fh.setProperty=function(a,b,c){gh.call(this,a,b+"",c)}}Wg.ascending=function(a,b){return b>a?-1:a>b?1:a>=b?0:0/0},Wg.descending=function(a,b){return a>b?-1:b>a?1:b>=a?0:0/0},Wg.min=function(a,b){var c,d,e=-1,f=a.length;if(1===arguments.length){for(;++e<f&&!(null!=(c=a[e])&&c>=c);)c=void 0;for(;++e<f;)null!=(d=a[e])&&c>d&&(c=d)}else{for(;++e<f&&!(null!=(c=b.call(a,a[e],e))&&c>=c);)c=void 0;for(;++e<f;)null!=(d=b.call(a,a[e],e))&&c>d&&(c=d)}return c},Wg.max=function(a,b){var c,d,e=-1,f=a.length;if(1===arguments.length){for(;++e<f&&!(null!=(c=a[e])&&c>=c);)c=void 0;for(;++e<f;)null!=(d=a[e])&&d>c&&(c=d)}else{for(;++e<f&&!(null!=(c=b.call(a,a[e],e))&&c>=c);)c=void 0;for(;++e<f;)null!=(d=b.call(a,a[e],e))&&d>c&&(c=d)}return c},Wg.extent=function(a,b){var c,d,e,f=-1,g=a.length;if(1===arguments.length){for(;++f<g&&!(null!=(c=e=a[f])&&c>=c);)c=e=void 0;for(;++f<g;)null!=(d=a[f])&&(c>d&&(c=d),d>e&&(e=d))}else{for(;++f<g&&!(null!=(c=e=b.call(a,a[f],f))&&c>=c);)c=void 0;for(;++f<g;)null!=(d=b.call(a,a[f],f))&&(c>d&&(c=d),d>e&&(e=d))}return[c,e]},Wg.sum=function(a,b){var c,d=0,e=a.length,f=-1;if(1===arguments.length)for(;++f<e;)isNaN(c=+a[f])||(d+=c);else for(;++f<e;)isNaN(c=+b.call(a,a[f],f))||(d+=c);return d},Wg.mean=function(b,c){var d,e=b.length,f=0,g=-1,h=0;if(1===arguments.length)for(;++g<e;)a(d=b[g])&&(f+=(d-f)/++h);else for(;++g<e;)a(d=c.call(b,b[g],g))&&(f+=(d-f)/++h);return h?f:void 0},Wg.quantile=function(a,b){var c=(a.length-1)*b+1,d=Math.floor(c),e=+a[d-1],f=c-d;return f?e+f*(a[d]-e):e},Wg.median=function(b,c){return arguments.length>1&&(b=b.map(c)),b=b.filter(a),b.length?Wg.quantile(b.sort(Wg.ascending),.5):void 0},Wg.bisector=function(a){return{left:function(b,c,d,e){for(arguments.length<3&&(d=0),arguments.length<4&&(e=b.length);e>d;){var f=d+e>>>1;a.call(b,b[f],f)<c?d=f+1:e=f}return d},right:function(b,c,d,e){for(arguments.length<3&&(d=0),arguments.length<4&&(e=b.length);e>d;){var f=d+e>>>1;c<a.call(b,b[f],f)?e=f:d=f+1}return d}}};var hh=Wg.bisector(function(a){return a});Wg.bisectLeft=hh.left,Wg.bisect=Wg.bisectRight=hh.right,Wg.shuffle=function(a){for(var b,c,d=a.length;d;)c=Math.random()*d--|0,b=a[d],a[d]=a[c],a[c]=b;return a},Wg.permute=function(a,b){for(var c=b.length,d=new Array(c);c--;)d[c]=a[b[c]];return d},Wg.pairs=function(a){for(var b,c=0,d=a.length-1,e=a[0],f=new Array(0>d?0:d);d>c;)f[c]=[b=e,e=a[++c]];return f},Wg.zip=function(){if(!(e=arguments.length))return[];for(var a=-1,c=Wg.min(arguments,b),d=new Array(c);++a<c;)for(var e,f=-1,g=d[a]=new Array(e);++f<e;)g[f]=arguments[f][a];return d},Wg.transpose=function(a){return Wg.zip.apply(Wg,a)},Wg.keys=function(a){var b=[];for(var c in a)b.push(c);return b},Wg.values=function(a){var b=[];for(var c in a)b.push(a[c]);return b},Wg.entries=function(a){var b=[];for(var c in a)b.push({key:c,value:a[c]});return b},Wg.merge=function(a){for(var b,c,d,e=a.length,f=-1,g=0;++f<e;)g+=a[f].length;for(c=new Array(g);--e>=0;)for(d=a[e],b=d.length;--b>=0;)c[--g]=d[b];return c};var ih=Math.abs;Wg.range=function(a,b,d){if(arguments.length<3&&(d=1,arguments.length<2&&(b=a,a=0)),(b-a)/d===1/0)throw new Error("infinite range");var e,f=[],g=c(ih(d)),h=-1;if(a*=g,b*=g,d*=g,0>d)for(;(e=a+d*++h)>b;)f.push(e/g);else for(;(e=a+d*++h)<b;)f.push(e/g);return f},Wg.map=function(a){var b=new e;if(a instanceof e)a.forEach(function(a,c){b.set(a,c)});else for(var c in a)b.set(c,a[c]);return b},d(e,{has:function(a){return jh+a in this},get:function(a){return this[jh+a]},set:function(a,b){return this[jh+a]=b},remove:function(a){return a=jh+a,a in this&&delete this[a]},keys:function(){var a=[];return this.forEach(function(b){a.push(b)}),a},values:function(){var a=[];return this.forEach(function(b,c){a.push(c)}),a},entries:function(){var a=[];return this.forEach(function(b,c){a.push({key:b,value:c})}),a},forEach:function(a){for(var b in this)b.charCodeAt(0)===kh&&a.call(this,b.substring(1),this[b])}});var jh="\x00",kh=jh.charCodeAt(0);Wg.nest=function(){function a(b,h,i){if(i>=g.length)return d?d.call(f,h):c?h.sort(c):h;for(var j,k,l,m,n=-1,o=h.length,p=g[i++],q=new e;++n<o;)(m=q.get(j=p(k=h[n])))?m.push(k):q.set(j,[k]);return b?(k=b(),l=function(c,d){k.set(c,a(b,d,i))}):(k={},l=function(c,d){k[c]=a(b,d,i)}),q.forEach(l),k}function b(a,c){if(c>=g.length)return a;var d=[],e=h[c++];return a.forEach(function(a,e){d.push({key:a,values:b(e,c)})}),e?d.sort(function(a,b){return e(a.key,b.key)}):d}var c,d,f={},g=[],h=[];return f.map=function(b,c){return a(c,b,0)},f.entries=function(c){return b(a(Wg.map,c,0),0)},f.key=function(a){return g.push(a),f},f.sortKeys=function(a){return h[g.length-1]=a,f},f.sortValues=function(a){return c=a,f},f.rollup=function(a){return d=a,f},f},Wg.set=function(a){var b=new f;if(a)for(var c=0,d=a.length;d>c;++c)b.add(a[c]);return b},d(f,{has:function(a){return jh+a in this},add:function(a){return this[jh+a]=!0,a},remove:function(a){return a=jh+a,a in this&&delete this[a]},values:function(){var a=[];return this.forEach(function(b){a.push(b)}),a},forEach:function(a){for(var b in this)b.charCodeAt(0)===kh&&a.call(this,b.substring(1))}}),Wg.behavior={},Wg.rebind=function(a,b){for(var c,d=1,e=arguments.length;++d<e;)a[c=arguments[d]]=g(a,b,b[c]);return a};var lh=["webkit","ms","moz","Moz","o","O"];Wg.dispatch=function(){for(var a=new j,b=-1,c=arguments.length;++b<c;)a[arguments[b]]=k(a);return a},j.prototype.on=function(a,b){var c=a.indexOf("."),d="";if(c>=0&&(d=a.substring(c+1),a=a.substring(0,c)),a)return arguments.length<2?this[a].on(d):this[a].on(d,b);if(2===arguments.length){if(null==b)for(a in this)this.hasOwnProperty(a)&&this[a].on(d,null);return this}},Wg.event=null,Wg.requote=function(a){return a.replace(mh,"\\$&")};var mh=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,nh={}.__proto__?function(a,b){a.__proto__=b}:function(a,b){for(var c in b)a[c]=b[c]},oh=function(a,b){return b.querySelector(a)},ph=function(a,b){return b.querySelectorAll(a)},qh=$g[h($g,"matchesSelector")],rh=function(a,b){return qh.call(a,b)};"function"==typeof Sizzle&&(oh=function(a,b){return Sizzle(a,b)[0]||null},ph=function(a,b){return Sizzle.uniqueSort(Sizzle(a,b))},rh=Sizzle.matchesSelector),Wg.selection=function(){return vh};var sh=Wg.selection.prototype=[];sh.select=function(a){var b,c,d,e,f=[];a=p(a);for(var g=-1,h=this.length;++g<h;){f.push(b=[]),b.parentNode=(d=this[g]).parentNode;for(var i=-1,j=d.length;++i<j;)(e=d[i])?(b.push(c=a.call(e,e.__data__,i,g)),c&&"__data__"in e&&(c.__data__=e.__data__)):b.push(null)}return o(f)},sh.selectAll=function(a){var b,c,d=[];a=q(a);for(var e=-1,f=this.length;++e<f;)for(var g=this[e],h=-1,i=g.length;++h<i;)(c=g[h])&&(d.push(b=Yg(a.call(c,c.__data__,h,e))),b.parentNode=c);return o(d)};var th={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};Wg.ns={prefix:th,qualify:function(a){var b=a.indexOf(":"),c=a;return b>=0&&(c=a.substring(0,b),a=a.substring(b+1)),th.hasOwnProperty(c)?{space:th[c],local:a}:a}},sh.attr=function(a,b){if(arguments.length<2){if("string"==typeof a){var c=this.node();return a=Wg.ns.qualify(a),a.local?c.getAttributeNS(a.space,a.local):c.getAttribute(a)}for(b in a)this.each(r(b,a[b]));return this}return this.each(r(a,b))},sh.classed=function(a,b){if(arguments.length<2){if("string"==typeof a){var c=this.node(),d=(a=u(a)).length,e=-1;if(b=c.classList){for(;++e<d;)if(!b.contains(a[e]))return!1}else for(b=c.getAttribute("class");++e<d;)if(!t(a[e]).test(b))return!1;return!0}for(b in a)this.each(v(b,a[b]));return this}return this.each(v(a,b))},sh.style=function(a,b,c){var d=arguments.length;if(3>d){if("string"!=typeof a){2>d&&(b="");for(c in a)this.each(x(c,a[c],b));return this}if(2>d)return _g.getComputedStyle(this.node(),null).getPropertyValue(a);c=""}return this.each(x(a,b,c))},sh.property=function(a,b){if(arguments.length<2){if("string"==typeof a)return this.node()[a];for(b in a)this.each(y(b,a[b]));return this}return this.each(y(a,b))},sh.text=function(a){return arguments.length?this.each("function"==typeof a?function(){var b=a.apply(this,arguments);this.textContent=null==b?"":b}:null==a?function(){this.textContent=""}:function(){this.textContent=a}):this.node().textContent},sh.html=function(a){return arguments.length?this.each("function"==typeof a?function(){var b=a.apply(this,arguments);this.innerHTML=null==b?"":b}:null==a?function(){this.innerHTML=""}:function(){this.innerHTML=a}):this.node().innerHTML},sh.append=function(a){return a=z(a),this.select(function(){return this.appendChild(a.apply(this,arguments))})},sh.insert=function(a,b){return a=z(a),b=p(b),this.select(function(){return this.insertBefore(a.apply(this,arguments),b.apply(this,arguments)||null)})},sh.remove=function(){return this.each(function(){var a=this.parentNode;a&&a.removeChild(this)})},sh.data=function(a,b){function c(a,c){var d,f,g,h=a.length,l=c.length,m=Math.min(h,l),n=new Array(l),o=new Array(l),p=new Array(h);if(b){var q,r=new e,s=new e,t=[];for(d=-1;++d<h;)q=b.call(f=a[d],f.__data__,d),r.has(q)?p[d]=f:r.set(q,f),t.push(q);for(d=-1;++d<l;)q=b.call(c,g=c[d],d),(f=r.get(q))?(n[d]=f,f.__data__=g):s.has(q)||(o[d]=A(g)),s.set(q,g),r.remove(q);for(d=-1;++d<h;)r.has(t[d])&&(p[d]=a[d])}else{for(d=-1;++d<m;)f=a[d],g=c[d],f?(f.__data__=g,n[d]=f):o[d]=A(g);for(;l>d;++d)o[d]=A(c[d]);for(;h>d;++d)p[d]=a[d]}o.update=n,o.parentNode=n.parentNode=p.parentNode=a.parentNode,i.push(o),j.push(n),k.push(p)}var d,f,g=-1,h=this.length;if(!arguments.length){for(a=new Array(h=(d=this[0]).length);++g<h;)(f=d[g])&&(a[g]=f.__data__);return a}var i=E([]),j=o([]),k=o([]);if("function"==typeof a)for(;++g<h;)c(d=this[g],a.call(d,d.parentNode.__data__,g));else for(;++g<h;)c(d=this[g],a);return j.enter=function(){return i},j.exit=function(){return k},j},sh.datum=function(a){return arguments.length?this.property("__data__",a):this.property("__data__")},sh.filter=function(a){var b,c,d,e=[];"function"!=typeof a&&(a=B(a));for(var f=0,g=this.length;g>f;f++){e.push(b=[]),b.parentNode=(c=this[f]).parentNode;for(var h=0,i=c.length;i>h;h++)(d=c[h])&&a.call(d,d.__data__,h,f)&&b.push(d)}return o(e)},sh.order=function(){for(var a=-1,b=this.length;++a<b;)for(var c,d=this[a],e=d.length-1,f=d[e];--e>=0;)(c=d[e])&&(f&&f!==c.nextSibling&&f.parentNode.insertBefore(c,f),f=c);return this},sh.sort=function(a){a=C.apply(this,arguments);for(var b=-1,c=this.length;++b<c;)this[b].sort(a);return this.order()},sh.each=function(a){return D(this,function(b,c,d){a.call(b,b.__data__,c,d)})},sh.call=function(a){var b=Yg(arguments);return a.apply(b[0]=this,b),this},sh.empty=function(){return!this.node()},sh.node=function(){for(var a=0,b=this.length;b>a;a++)for(var c=this[a],d=0,e=c.length;e>d;d++){var f=c[d];if(f)return f}return null},sh.size=function(){var a=0;return this.each(function(){++a}),a};var uh=[];Wg.selection.enter=E,Wg.selection.enter.prototype=uh,uh.append=sh.append,uh.empty=sh.empty,uh.node=sh.node,uh.call=sh.call,uh.size=sh.size,uh.select=function(a){for(var b,c,d,e,f,g=[],h=-1,i=this.length;++h<i;){d=(e=this[h]).update,g.push(b=[]),b.parentNode=e.parentNode;for(var j=-1,k=e.length;++j<k;)(f=e[j])?(b.push(d[j]=c=a.call(e.parentNode,f.__data__,j,h)),c.__data__=f.__data__):b.push(null)}return o(g)},uh.insert=function(a,b){return arguments.length<2&&(b=F(this)),sh.insert.call(this,a,b)},sh.transition=function(){for(var a,b,c=zj||++Ej,d=[],e=Aj||{time:Date.now(),ease:Od,delay:0,duration:250},f=-1,g=this.length;++f<g;){d.push(a=[]);for(var h=this[f],i=-1,j=h.length;++i<j;)(b=h[i])&&gg(b,i,c,e),a.push(b)}return dg(d,c)},sh.interrupt=function(){return this.each(G)},Wg.select=function(a){var b=["string"==typeof a?oh(a,Zg):a];return b.parentNode=$g,o([b])},Wg.selectAll=function(a){var b=Yg("string"==typeof a?ph(a,Zg):a);return b.parentNode=$g,o([b])};var vh=Wg.select($g);sh.on=function(a,b,c){var d=arguments.length;if(3>d){if("string"!=typeof a){2>d&&(b=!1);for(c in a)this.each(H(c,a[c],b));return this}if(2>d)return(d=this.node()["__on"+a])&&d._;c=!1}return this.each(H(a,b,c))};var wh=Wg.map({mouseenter:"mouseover",mouseleave:"mouseout"});wh.forEach(function(a){"on"+a in Zg&&wh.remove(a)});var xh="onselectstart"in Zg?null:h($g.style,"userSelect"),yh=0;Wg.mouse=function(a){return L(a,m())};var zh=/WebKit/.test(_g.navigator.userAgent)?-1:0;Wg.touches=function(a,b){return arguments.length<2&&(b=m().touches),b?Yg(b).map(function(b){var c=L(a,b);return c.identifier=b.identifier,c}):[]},Wg.behavior.drag=function(){function a(){this.on("mousedown.drag",g).on("touchstart.drag",h)}function b(){return Wg.event.changedTouches[0].identifier}function c(a,b){return Wg.touches(a).filter(function(a){return a.identifier===b})[0]}function d(a,b,c,d){return function(){function g(){var a=b(k,n),c=a[0]-p[0],d=a[1]-p[1];q|=c|d,p=a,l({type:"drag",x:a[0]+i[0],y:a[1]+i[1],dx:c,dy:d})}function h(){r.on(c+"."+o,null).on(d+"."+o,null),s(q&&Wg.event.target===m),l({type:"dragend"})}var i,j=this,k=j.parentNode,l=e.of(j,arguments),m=Wg.event.target,n=a(),o=null==n?"drag":"drag-"+n,p=b(k,n),q=0,r=Wg.select(_g).on(c+"."+o,g).on(d+"."+o,h),s=K();f?(i=f.apply(j,arguments),i=[i.x-p[0],i.y-p[1]]):i=[0,0],l({type:"dragstart"})}}var e=n(a,"drag","dragstart","dragend"),f=null,g=d(i,Wg.mouse,"mousemove","mouseup"),h=d(b,c,"touchmove","touchend");return a.origin=function(b){return arguments.length?(f=b,a):f},Wg.rebind(a,e,"on")};var Ah=Math.PI,Bh=2*Ah,Ch=Ah/2,Dh=1e-6,Eh=Dh*Dh,Fh=Ah/180,Gh=180/Ah,Hh=Math.SQRT2,Ih=2,Jh=4;Wg.interpolateZoom=function(a,b){function c(a){var b=a*s;if(r){var c=Q(p),g=f/(Ih*m)*(c*R(Hh*b+p)-P(p));return[d+g*j,e+g*k,f*c/Q(Hh*b+p)]}return[d+a*j,e+a*k,f*Math.exp(Hh*b)]}var d=a[0],e=a[1],f=a[2],g=b[0],h=b[1],i=b[2],j=g-d,k=h-e,l=j*j+k*k,m=Math.sqrt(l),n=(i*i-f*f+Jh*l)/(2*f*Ih*m),o=(i*i-f*f-Jh*l)/(2*i*Ih*m),p=Math.log(Math.sqrt(n*n+1)-n),q=Math.log(Math.sqrt(o*o+1)-o),r=q-p,s=(r||Math.log(i/f))/Hh;return c.duration=1e3*s,c},Wg.behavior.zoom=function(){function a(a){a.on(B,j).on(Mh+".zoom",m).on(C,o).on("dblclick.zoom",p).on(E,k)}function b(a){return[(a[0]-y.x)/y.k,(a[1]-y.y)/y.k]}function c(a){return[a[0]*y.k+y.x,a[1]*y.k+y.y]}function d(a){y.k=Math.max(A[0],Math.min(A[1],a))}function e(a,b){b=c(b),y.x+=a[0]-b[0],y.y+=a[1]-b[1]}function f(){v&&v.domain(u.range().map(function(a){return(a-y.x)/y.k}).map(u.invert)),x&&x.domain(w.range().map(function(a){return(a-y.y)/y.k}).map(w.invert))
-}function g(a){a({type:"zoomstart"})}function h(a){f(),a({type:"zoom",scale:y.k,translate:[y.x,y.y]})}function i(a){a({type:"zoomend"})}function j(){function a(){k=1,e(Wg.mouse(d),m),h(f)}function c(){l.on(C,_g===d?o:null).on(D,null),n(k&&Wg.event.target===j),i(f)}var d=this,f=F.of(d,arguments),j=Wg.event.target,k=0,l=Wg.select(_g).on(C,a).on(D,c),m=b(Wg.mouse(d)),n=K();G.call(d),g(f)}function k(){function a(){var a=Wg.touches(o);return n=y.k,a.forEach(function(a){a.identifier in q&&(q[a.identifier]=b(a))}),a}function c(){for(var b=Wg.event.changedTouches,c=0,f=b.length;f>c;++c)q[b[c].identifier]=null;var g=a(),i=Date.now();if(1===g.length){if(500>i-t){var j=g[0],k=q[j.identifier];d(2*y.k),e(j,k),l(),h(p)}t=i}else if(g.length>1){var j=g[0],m=g[1],n=j[0]-m[0],o=j[1]-m[1];r=n*n+o*o}}function f(){for(var a,b,c,f,g=Wg.touches(o),i=0,j=g.length;j>i;++i,f=null)if(c=g[i],f=q[c.identifier]){if(b)break;a=c,b=f}if(f){var k=(k=c[0]-a[0])*k+(k=c[1]-a[1])*k,l=r&&Math.sqrt(k/r);a=[(a[0]+c[0])/2,(a[1]+c[1])/2],b=[(b[0]+f[0])/2,(b[1]+f[1])/2],d(l*n)}t=null,e(a,b),h(p)}function m(){if(Wg.event.touches.length){for(var b=Wg.event.changedTouches,c=0,d=b.length;d>c;++c)delete q[b[c].identifier];for(var e in q)return void a()}w.on(u,null).on(v,null),x.on(B,j).on(E,k),z(),i(p)}var n,o=this,p=F.of(o,arguments),q={},r=0,s=Wg.event.changedTouches[0].identifier,u="touchmove.zoom-"+s,v="touchend.zoom-"+s,w=Wg.select(_g).on(u,f).on(v,m),x=Wg.select(o).on(B,null).on(E,c),z=K();G.call(o),c(),g(p)}function m(){var a=F.of(this,arguments);s?clearTimeout(s):(G.call(this),g(a)),s=setTimeout(function(){s=null,i(a)},50),l();var c=r||Wg.mouse(this);q||(q=b(c)),d(Math.pow(2,.002*Kh())*y.k),e(c,q),h(a)}function o(){q=null}function p(){var a=F.of(this,arguments),c=Wg.mouse(this),f=b(c),j=Math.log(y.k)/Math.LN2;g(a),d(Math.pow(2,Wg.event.shiftKey?Math.ceil(j)-1:Math.floor(j)+1)),e(c,f),h(a),i(a)}var q,r,s,t,u,v,w,x,y={x:0,y:0,k:1},z=[960,500],A=Lh,B="mousedown.zoom",C="mousemove.zoom",D="mouseup.zoom",E="touchstart.zoom",F=n(a,"zoomstart","zoom","zoomend");return a.event=function(a){a.each(function(){var a=F.of(this,arguments),b=y;zj?Wg.select(this).transition().each("start.zoom",function(){y=this.__chart__||{x:0,y:0,k:1},g(a)}).tween("zoom:zoom",function(){var c=z[0],d=z[1],e=c/2,f=d/2,g=Wg.interpolateZoom([(e-y.x)/y.k,(f-y.y)/y.k,c/y.k],[(e-b.x)/b.k,(f-b.y)/b.k,c/b.k]);return function(b){var d=g(b),i=c/d[2];this.__chart__=y={x:e-d[0]*i,y:f-d[1]*i,k:i},h(a)}}).each("end.zoom",function(){i(a)}):(this.__chart__=y,g(a),h(a),i(a))})},a.translate=function(b){return arguments.length?(y={x:+b[0],y:+b[1],k:y.k},f(),a):[y.x,y.y]},a.scale=function(b){return arguments.length?(y={x:y.x,y:y.y,k:+b},f(),a):y.k},a.scaleExtent=function(b){return arguments.length?(A=null==b?Lh:[+b[0],+b[1]],a):A},a.center=function(b){return arguments.length?(r=b&&[+b[0],+b[1]],a):r},a.size=function(b){return arguments.length?(z=b&&[+b[0],+b[1]],a):z},a.x=function(b){return arguments.length?(v=b,u=b.copy(),y={x:0,y:0,k:1},a):v},a.y=function(b){return arguments.length?(x=b,w=b.copy(),y={x:0,y:0,k:1},a):x},Wg.rebind(a,F,"on")};var Kh,Lh=[0,1/0],Mh="onwheel"in Zg?(Kh=function(){return-Wg.event.deltaY*(Wg.event.deltaMode?120:1)},"wheel"):"onmousewheel"in Zg?(Kh=function(){return Wg.event.wheelDelta},"mousewheel"):(Kh=function(){return-Wg.event.detail},"MozMousePixelScroll");T.prototype.toString=function(){return this.rgb()+""},Wg.hsl=function(a,b,c){return 1===arguments.length?a instanceof V?U(a.h,a.s,a.l):kb(""+a,lb,U):U(+a,+b,+c)};var Nh=V.prototype=new T;Nh.brighter=function(a){return a=Math.pow(.7,arguments.length?a:1),U(this.h,this.s,this.l/a)},Nh.darker=function(a){return a=Math.pow(.7,arguments.length?a:1),U(this.h,this.s,a*this.l)},Nh.rgb=function(){return W(this.h,this.s,this.l)},Wg.hcl=function(a,b,c){return 1===arguments.length?a instanceof Y?X(a.h,a.c,a.l):a instanceof _?bb(a.l,a.a,a.b):bb((a=mb((a=Wg.rgb(a)).r,a.g,a.b)).l,a.a,a.b):X(+a,+b,+c)};var Oh=Y.prototype=new T;Oh.brighter=function(a){return X(this.h,this.c,Math.min(100,this.l+Ph*(arguments.length?a:1)))},Oh.darker=function(a){return X(this.h,this.c,Math.max(0,this.l-Ph*(arguments.length?a:1)))},Oh.rgb=function(){return Z(this.h,this.c,this.l).rgb()},Wg.lab=function(a,b,c){return 1===arguments.length?a instanceof _?$(a.l,a.a,a.b):a instanceof Y?Z(a.l,a.c,a.h):mb((a=Wg.rgb(a)).r,a.g,a.b):$(+a,+b,+c)};var Ph=18,Qh=.95047,Rh=1,Sh=1.08883,Th=_.prototype=new T;Th.brighter=function(a){return $(Math.min(100,this.l+Ph*(arguments.length?a:1)),this.a,this.b)},Th.darker=function(a){return $(Math.max(0,this.l-Ph*(arguments.length?a:1)),this.a,this.b)},Th.rgb=function(){return ab(this.l,this.a,this.b)},Wg.rgb=function(a,b,c){return 1===arguments.length?a instanceof ib?hb(a.r,a.g,a.b):kb(""+a,hb,W):hb(~~a,~~b,~~c)};var Uh=ib.prototype=new T;Uh.brighter=function(a){a=Math.pow(.7,arguments.length?a:1);var b=this.r,c=this.g,d=this.b,e=30;return b||c||d?(b&&e>b&&(b=e),c&&e>c&&(c=e),d&&e>d&&(d=e),hb(Math.min(255,~~(b/a)),Math.min(255,~~(c/a)),Math.min(255,~~(d/a)))):hb(e,e,e)},Uh.darker=function(a){return a=Math.pow(.7,arguments.length?a:1),hb(~~(a*this.r),~~(a*this.g),~~(a*this.b))},Uh.hsl=function(){return lb(this.r,this.g,this.b)},Uh.toString=function(){return"#"+jb(this.r)+jb(this.g)+jb(this.b)};var Vh=Wg.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});Vh.forEach(function(a,b){Vh.set(a,fb(b))}),Wg.functor=pb,Wg.xhr=rb(qb),Wg.dsv=function(a,b){function c(a,c,f){arguments.length<3&&(f=c,c=null);var g=sb(a,b,null==c?d:e(c),f);return g.row=function(a){return arguments.length?g.response(null==(c=a)?d:e(a)):c},g}function d(a){return c.parse(a.responseText)}function e(a){return function(b){return c.parse(b.responseText,a)}}function g(b){return b.map(h).join(a)}function h(a){return i.test(a)?'"'+a.replace(/\"/g,'""')+'"':a}var i=new RegExp('["'+a+"\n]"),j=a.charCodeAt(0);return c.parse=function(a,b){var d;return c.parseRows(a,function(a,c){if(d)return d(a,c-1);var e=new Function("d","return {"+a.map(function(a,b){return JSON.stringify(a)+": d["+b+"]"}).join(",")+"}");d=b?function(a,c){return b(e(a),c)}:e})},c.parseRows=function(a,b){function c(){if(k>=i)return g;if(e)return e=!1,f;var b=k;if(34===a.charCodeAt(b)){for(var c=b;c++<i;)if(34===a.charCodeAt(c)){if(34!==a.charCodeAt(c+1))break;++c}k=c+2;var d=a.charCodeAt(c+1);return 13===d?(e=!0,10===a.charCodeAt(c+2)&&++k):10===d&&(e=!0),a.substring(b+1,c).replace(/""/g,'"')}for(;i>k;){var d=a.charCodeAt(k++),h=1;if(10===d)e=!0;else if(13===d)e=!0,10===a.charCodeAt(k)&&(++k,++h);else if(d!==j)continue;return a.substring(b,k-h)}return a.substring(b)}for(var d,e,f={},g={},h=[],i=a.length,k=0,l=0;(d=c())!==g;){for(var m=[];d!==f&&d!==g;)m.push(d),d=c();(!b||(m=b(m,l++)))&&h.push(m)}return h},c.format=function(b){if(Array.isArray(b[0]))return c.formatRows(b);var d=new f,e=[];return b.forEach(function(a){for(var b in a)d.has(b)||e.push(d.add(b))}),[e.map(h).join(a)].concat(b.map(function(b){return e.map(function(a){return h(b[a])}).join(a)})).join("\n")},c.formatRows=function(a){return a.map(g).join("\n")},c},Wg.csv=Wg.dsv(",","text/csv"),Wg.tsv=Wg.dsv("	","text/tab-separated-values");var Wh,Xh,Yh,Zh,$h,_h=_g[h(_g,"requestAnimationFrame")]||function(a){setTimeout(a,17)};Wg.timer=function(a,b,c){var d=arguments.length;2>d&&(b=0),3>d&&(c=Date.now());var e=c+b,f={c:a,t:e,f:!1,n:null};Xh?Xh.n=f:Wh=f,Xh=f,Yh||(Zh=clearTimeout(Zh),Yh=1,_h(ub))},Wg.timer.flush=function(){vb(),wb()};var ai=".",bi=",",ci=[3,3],di="$",ei=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"].map(xb);Wg.formatPrefix=function(a,b){var c=0;return a&&(0>a&&(a*=-1),b&&(a=Wg.round(a,yb(a,b))),c=1+Math.floor(1e-12+Math.log(a)/Math.LN10),c=Math.max(-24,Math.min(24,3*Math.floor((0>=c?c+1:c-1)/3)))),ei[8+c/3]},Wg.round=function(a,b){return b?Math.round(a*(b=Math.pow(10,b)))/b:Math.round(a)},Wg.format=function(a){var b=fi.exec(a),c=b[1]||" ",d=b[2]||">",e=b[3]||"",f=b[4]||"",g=b[5],h=+b[6],i=b[7],j=b[8],k=b[9],l=1,m="",n=!1;switch(j&&(j=+j.substring(1)),(g||"0"===c&&"="===d)&&(g=c="0",d="=",i&&(h-=Math.floor((h-1)/4))),k){case"n":i=!0,k="g";break;case"%":l=100,m="%",k="f";break;case"p":l=100,m="%",k="r";break;case"b":case"o":case"x":case"X":"#"===f&&(f="0"+k.toLowerCase());case"c":case"d":n=!0,j=0;break;case"s":l=-1,k="r"}"#"===f?f="":"$"===f&&(f=di),"r"!=k||j||(k="g"),null!=j&&("g"==k?j=Math.max(1,Math.min(21,j)):("e"==k||"f"==k)&&(j=Math.max(0,Math.min(20,j)))),k=gi.get(k)||zb;var o=g&&i;return function(a){if(n&&a%1)return"";var b=0>a||0===a&&0>1/a?(a=-a,"-"):e;if(0>l){var p=Wg.formatPrefix(a,j);a=p.scale(a),m=p.symbol}else a*=l;a=k(a,j);var q=a.lastIndexOf("."),r=0>q?a:a.substring(0,q),s=0>q?"":ai+a.substring(q+1);!g&&i&&(r=hi(r));var t=f.length+r.length+s.length+(o?0:b.length),u=h>t?new Array(t=h-t+1).join(c):"";return o&&(r=hi(u+r)),b+=f,a=r+s,("<"===d?b+a+u:">"===d?u+b+a:"^"===d?u.substring(0,t>>=1)+b+a+u.substring(t):b+(o?a:u+a))+m}};var fi=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,gi=Wg.map({b:function(a){return a.toString(2)},c:function(a){return String.fromCharCode(a)},o:function(a){return a.toString(8)},x:function(a){return a.toString(16)},X:function(a){return a.toString(16).toUpperCase()},g:function(a,b){return a.toPrecision(b)},e:function(a,b){return a.toExponential(b)},f:function(a,b){return a.toFixed(b)},r:function(a,b){return(a=Wg.round(a,yb(a,b))).toFixed(Math.max(0,Math.min(20,yb(a*(1+1e-15),b))))}}),hi=qb;if(ci){var ii=ci.length;hi=function(a){for(var b=a.length,c=[],d=0,e=ci[0];b>0&&e>0;)c.push(a.substring(b-=e,b+e)),e=ci[d=(d+1)%ii];return c.reverse().join(bi)}}Wg.geo={},Ab.prototype={s:0,t:0,add:function(a){Bb(a,this.t,ji),Bb(ji.s,this.s,this),this.s?this.t+=ji.t:this.s=ji.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var ji=new Ab;Wg.geo.stream=function(a,b){a&&ki.hasOwnProperty(a.type)?ki[a.type](a,b):Cb(a,b)};var ki={Feature:function(a,b){Cb(a.geometry,b)},FeatureCollection:function(a,b){for(var c=a.features,d=-1,e=c.length;++d<e;)Cb(c[d].geometry,b)}},li={Sphere:function(a,b){b.sphere()},Point:function(a,b){a=a.coordinates,b.point(a[0],a[1],a[2])},MultiPoint:function(a,b){for(var c=a.coordinates,d=-1,e=c.length;++d<e;)a=c[d],b.point(a[0],a[1],a[2])},LineString:function(a,b){Db(a.coordinates,b,0)},MultiLineString:function(a,b){for(var c=a.coordinates,d=-1,e=c.length;++d<e;)Db(c[d],b,0)},Polygon:function(a,b){Eb(a.coordinates,b)},MultiPolygon:function(a,b){for(var c=a.coordinates,d=-1,e=c.length;++d<e;)Eb(c[d],b)},GeometryCollection:function(a,b){for(var c=a.geometries,d=-1,e=c.length;++d<e;)Cb(c[d],b)}};Wg.geo.area=function(a){return mi=0,Wg.geo.stream(a,oi),mi};var mi,ni=new Ab,oi={sphere:function(){mi+=4*Ah},point:i,lineStart:i,lineEnd:i,polygonStart:function(){ni.reset(),oi.lineStart=Fb},polygonEnd:function(){var a=2*ni;mi+=0>a?4*Ah+a:a,oi.lineStart=oi.lineEnd=oi.point=i}};Wg.geo.bounds=function(){function a(a,b){t.push(u=[k=a,m=a]),l>b&&(l=b),b>n&&(n=b)}function b(b,c){var d=Gb([b*Fh,c*Fh]);if(r){var e=Ib(r,d),f=[e[1],-e[0],0],g=Ib(f,e);Lb(g),g=Mb(g);var i=b-o,j=i>0?1:-1,p=g[0]*Gh*j,q=ih(i)>180;if(q^(p>j*o&&j*b>p)){var s=g[1]*Gh;s>n&&(n=s)}else if(p=(p+360)%360-180,q^(p>j*o&&j*b>p)){var s=-g[1]*Gh;l>s&&(l=s)}else l>c&&(l=c),c>n&&(n=c);q?o>b?h(k,b)>h(k,m)&&(m=b):h(b,m)>h(k,m)&&(k=b):m>=k?(k>b&&(k=b),b>m&&(m=b)):b>o?h(k,b)>h(k,m)&&(m=b):h(b,m)>h(k,m)&&(k=b)}else a(b,c);r=d,o=b}function c(){v.point=b}function d(){u[0]=k,u[1]=m,v.point=a,r=null}function e(a,c){if(r){var d=a-o;s+=ih(d)>180?d+(d>0?360:-360):d}else p=a,q=c;oi.point(a,c),b(a,c)}function f(){oi.lineStart()}function g(){e(p,q),oi.lineEnd(),ih(s)>Dh&&(k=-(m=180)),u[0]=k,u[1]=m,r=null}function h(a,b){return(b-=a)<0?b+360:b}function i(a,b){return a[0]-b[0]}function j(a,b){return b[0]<=b[1]?b[0]<=a&&a<=b[1]:a<b[0]||b[1]<a}var k,l,m,n,o,p,q,r,s,t,u,v={point:a,lineStart:c,lineEnd:d,polygonStart:function(){v.point=e,v.lineStart=f,v.lineEnd=g,s=0,oi.polygonStart()},polygonEnd:function(){oi.polygonEnd(),v.point=a,v.lineStart=c,v.lineEnd=d,0>ni?(k=-(m=180),l=-(n=90)):s>Dh?n=90:-Dh>s&&(l=-90),u[0]=k,u[1]=m}};return function(a){n=m=-(k=l=1/0),t=[],Wg.geo.stream(a,v);var b=t.length;if(b){t.sort(i);for(var c,d=1,e=t[0],f=[e];b>d;++d)c=t[d],j(c[0],e)||j(c[1],e)?(h(e[0],c[1])>h(e[0],e[1])&&(e[1]=c[1]),h(c[0],e[1])>h(e[0],e[1])&&(e[0]=c[0])):f.push(e=c);for(var g,c,o=-1/0,b=f.length-1,d=0,e=f[b];b>=d;e=c,++d)c=f[d],(g=h(e[1],c[0]))>o&&(o=g,k=c[0],m=e[1])}return t=u=null,1/0===k||1/0===l?[[0/0,0/0],[0/0,0/0]]:[[k,l],[m,n]]}}(),Wg.geo.centroid=function(a){pi=qi=ri=si=ti=ui=vi=wi=xi=yi=zi=0,Wg.geo.stream(a,Ai);var b=xi,c=yi,d=zi,e=b*b+c*c+d*d;return Eh>e&&(b=ui,c=vi,d=wi,Dh>qi&&(b=ri,c=si,d=ti),e=b*b+c*c+d*d,Eh>e)?[0/0,0/0]:[Math.atan2(c,b)*Gh,O(d/Math.sqrt(e))*Gh]};var pi,qi,ri,si,ti,ui,vi,wi,xi,yi,zi,Ai={sphere:i,point:Ob,lineStart:Qb,lineEnd:Rb,polygonStart:function(){Ai.lineStart=Sb},polygonEnd:function(){Ai.lineStart=Qb}},Bi=Xb(Tb,ac,cc,[-Ah,-Ah/2]),Ci=1e9;Wg.geo.clipExtent=function(){var a,b,c,d,e,f,g={stream:function(a){return e&&(e.valid=!1),e=f(a),e.valid=!0,e},extent:function(h){return arguments.length?(f=fc(a=+h[0][0],b=+h[0][1],c=+h[1][0],d=+h[1][1]),e&&(e.valid=!1,e=null),g):[[a,b],[c,d]]}};return g.extent([[0,0],[960,500]])},(Wg.geo.conicEqualArea=function(){return hc(ic)}).raw=ic,Wg.geo.albers=function(){return Wg.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},Wg.geo.albersUsa=function(){function a(a){var f=a[0],g=a[1];return b=null,c(f,g),b||(d(f,g),b)||e(f,g),b}var b,c,d,e,f=Wg.geo.albers(),g=Wg.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),h=Wg.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),i={point:function(a,c){b=[a,c]}};return a.invert=function(a){var b=f.scale(),c=f.translate(),d=(a[0]-c[0])/b,e=(a[1]-c[1])/b;return(e>=.12&&.234>e&&d>=-.425&&-.214>d?g:e>=.166&&.234>e&&d>=-.214&&-.115>d?h:f).invert(a)},a.stream=function(a){var b=f.stream(a),c=g.stream(a),d=h.stream(a);return{point:function(a,e){b.point(a,e),c.point(a,e),d.point(a,e)},sphere:function(){b.sphere(),c.sphere(),d.sphere()},lineStart:function(){b.lineStart(),c.lineStart(),d.lineStart()},lineEnd:function(){b.lineEnd(),c.lineEnd(),d.lineEnd()},polygonStart:function(){b.polygonStart(),c.polygonStart(),d.polygonStart()},polygonEnd:function(){b.polygonEnd(),c.polygonEnd(),d.polygonEnd()}}},a.precision=function(b){return arguments.length?(f.precision(b),g.precision(b),h.precision(b),a):f.precision()},a.scale=function(b){return arguments.length?(f.scale(b),g.scale(.35*b),h.scale(b),a.translate(f.translate())):f.scale()},a.translate=function(b){if(!arguments.length)return f.translate();var j=f.scale(),k=+b[0],l=+b[1];return c=f.translate(b).clipExtent([[k-.455*j,l-.238*j],[k+.455*j,l+.238*j]]).stream(i).point,d=g.translate([k-.307*j,l+.201*j]).clipExtent([[k-.425*j+Dh,l+.12*j+Dh],[k-.214*j-Dh,l+.234*j-Dh]]).stream(i).point,e=h.translate([k-.205*j,l+.212*j]).clipExtent([[k-.214*j+Dh,l+.166*j+Dh],[k-.115*j-Dh,l+.234*j-Dh]]).stream(i).point,a},a.scale(1070)};var Di,Ei,Fi,Gi,Hi,Ii,Ji={point:i,lineStart:i,lineEnd:i,polygonStart:function(){Ei=0,Ji.lineStart=jc},polygonEnd:function(){Ji.lineStart=Ji.lineEnd=Ji.point=i,Di+=ih(Ei/2)}},Ki={point:kc,lineStart:i,lineEnd:i,polygonStart:i,polygonEnd:i},Li={point:nc,lineStart:oc,lineEnd:pc,polygonStart:function(){Li.lineStart=qc},polygonEnd:function(){Li.point=nc,Li.lineStart=oc,Li.lineEnd=pc}};Wg.geo.path=function(){function a(a){return a&&("function"==typeof h&&f.pointRadius(+h.apply(this,arguments)),g&&g.valid||(g=e(f)),Wg.geo.stream(a,g)),f.result()}function b(){return g=null,a}var c,d,e,f,g,h=4.5;return a.area=function(a){return Di=0,Wg.geo.stream(a,e(Ji)),Di},a.centroid=function(a){return ri=si=ti=ui=vi=wi=xi=yi=zi=0,Wg.geo.stream(a,e(Li)),zi?[xi/zi,yi/zi]:wi?[ui/wi,vi/wi]:ti?[ri/ti,si/ti]:[0/0,0/0]},a.bounds=function(a){return Hi=Ii=-(Fi=Gi=1/0),Wg.geo.stream(a,e(Ki)),[[Fi,Gi],[Hi,Ii]]},a.projection=function(a){return arguments.length?(e=(c=a)?a.stream||tc(a):qb,b()):c},a.context=function(a){return arguments.length?(f=null==(d=a)?new lc:new rc(a),"function"!=typeof h&&f.pointRadius(h),b()):d},a.pointRadius=function(b){return arguments.length?(h="function"==typeof b?b:(f.pointRadius(+b),+b),a):h},a.projection(Wg.geo.albersUsa()).context(null)},Wg.geo.transform=function(a){return{stream:function(b){var c=new uc(b);for(var d in a)c[d]=a[d];return c}}},uc.prototype={point:function(a,b){this.stream.point(a,b)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},Wg.geo.projection=wc,Wg.geo.projectionMutator=xc,(Wg.geo.equirectangular=function(){return wc(zc)}).raw=zc.invert=zc,Wg.geo.rotation=function(a){function b(b){return b=a(b[0]*Fh,b[1]*Fh),b[0]*=Gh,b[1]*=Gh,b}return a=Bc(a[0]%360*Fh,a[1]*Fh,a.length>2?a[2]*Fh:0),b.invert=function(b){return b=a.invert(b[0]*Fh,b[1]*Fh),b[0]*=Gh,b[1]*=Gh,b},b},Ac.invert=zc,Wg.geo.circle=function(){function a(){var a="function"==typeof d?d.apply(this,arguments):d,b=Bc(-a[0]*Fh,-a[1]*Fh,0).invert,e=[];return c(null,null,1,{point:function(a,c){e.push(a=b(a,c)),a[0]*=Gh,a[1]*=Gh}}),{type:"Polygon",coordinates:[e]}}var b,c,d=[0,0],e=6;return a.origin=function(b){return arguments.length?(d=b,a):d},a.angle=function(d){return arguments.length?(c=Fc((b=+d)*Fh,e*Fh),a):b},a.precision=function(d){return arguments.length?(c=Fc(b*Fh,(e=+d)*Fh),a):e},a.angle(90)},Wg.geo.distance=function(a,b){var c,d=(b[0]-a[0])*Fh,e=a[1]*Fh,f=b[1]*Fh,g=Math.sin(d),h=Math.cos(d),i=Math.sin(e),j=Math.cos(e),k=Math.sin(f),l=Math.cos(f);return Math.atan2(Math.sqrt((c=l*g)*c+(c=j*k-i*l*h)*c),i*k+j*l*h)},Wg.geo.graticule=function(){function a(){return{type:"MultiLineString",coordinates:b()}}function b(){return Wg.range(Math.ceil(f/q)*q,e,q).map(m).concat(Wg.range(Math.ceil(j/r)*r,i,r).map(n)).concat(Wg.range(Math.ceil(d/o)*o,c,o).filter(function(a){return ih(a%q)>Dh}).map(k)).concat(Wg.range(Math.ceil(h/p)*p,g,p).filter(function(a){return ih(a%r)>Dh}).map(l))}var c,d,e,f,g,h,i,j,k,l,m,n,o=10,p=o,q=90,r=360,s=2.5;return a.lines=function(){return b().map(function(a){return{type:"LineString",coordinates:a}})},a.outline=function(){return{type:"Polygon",coordinates:[m(f).concat(n(i).slice(1),m(e).reverse().slice(1),n(j).reverse().slice(1))]}},a.extent=function(b){return arguments.length?a.majorExtent(b).minorExtent(b):a.minorExtent()},a.majorExtent=function(b){return arguments.length?(f=+b[0][0],e=+b[1][0],j=+b[0][1],i=+b[1][1],f>e&&(b=f,f=e,e=b),j>i&&(b=j,j=i,i=b),a.precision(s)):[[f,j],[e,i]]},a.minorExtent=function(b){return arguments.length?(d=+b[0][0],c=+b[1][0],h=+b[0][1],g=+b[1][1],d>c&&(b=d,d=c,c=b),h>g&&(b=h,h=g,g=b),a.precision(s)):[[d,h],[c,g]]},a.step=function(b){return arguments.length?a.majorStep(b).minorStep(b):a.minorStep()},a.majorStep=function(b){return arguments.length?(q=+b[0],r=+b[1],a):[q,r]},a.minorStep=function(b){return arguments.length?(o=+b[0],p=+b[1],a):[o,p]},a.precision=function(b){return arguments.length?(s=+b,k=Hc(h,g,90),l=Ic(d,c,s),m=Hc(j,i,90),n=Ic(f,e,s),a):s},a.majorExtent([[-180,-90+Dh],[180,90-Dh]]).minorExtent([[-180,-80-Dh],[180,80+Dh]])},Wg.geo.greatArc=function(){function a(){return{type:"LineString",coordinates:[b||d.apply(this,arguments),c||e.apply(this,arguments)]}}var b,c,d=Jc,e=Kc;return a.distance=function(){return Wg.geo.distance(b||d.apply(this,arguments),c||e.apply(this,arguments))},a.source=function(c){return arguments.length?(d=c,b="function"==typeof c?null:c,a):d},a.target=function(b){return arguments.length?(e=b,c="function"==typeof b?null:b,a):e},a.precision=function(){return arguments.length?a:0},a},Wg.geo.interpolate=function(a,b){return Lc(a[0]*Fh,a[1]*Fh,b[0]*Fh,b[1]*Fh)},Wg.geo.length=function(a){return Mi=0,Wg.geo.stream(a,Ni),Mi};var Mi,Ni={sphere:i,point:i,lineStart:Mc,lineEnd:i,polygonStart:i,polygonEnd:i},Oi=Nc(function(a){return Math.sqrt(2/(1+a))},function(a){return 2*Math.asin(a/2)});(Wg.geo.azimuthalEqualArea=function(){return wc(Oi)}).raw=Oi;var Pi=Nc(function(a){var b=Math.acos(a);return b&&b/Math.sin(b)},qb);(Wg.geo.azimuthalEquidistant=function(){return wc(Pi)}).raw=Pi,(Wg.geo.conicConformal=function(){return hc(Oc)}).raw=Oc,(Wg.geo.conicEquidistant=function(){return hc(Pc)}).raw=Pc;var Qi=Nc(function(a){return 1/a},Math.atan);(Wg.geo.gnomonic=function(){return wc(Qi)}).raw=Qi,Qc.invert=function(a,b){return[a,2*Math.atan(Math.exp(b))-Ch]},(Wg.geo.mercator=function(){return Rc(Qc)}).raw=Qc;var Ri=Nc(function(){return 1},Math.asin);(Wg.geo.orthographic=function(){return wc(Ri)}).raw=Ri;var Si=Nc(function(a){return 1/(1+a)},function(a){return 2*Math.atan(a)});(Wg.geo.stereographic=function(){return wc(Si)}).raw=Si,Sc.invert=function(a,b){return[-b,2*Math.atan(Math.exp(a))-Ch]},(Wg.geo.transverseMercator=function(){var a=Rc(Sc),b=a.center,c=a.rotate;return a.center=function(a){return a?b([-a[1],a[0]]):(a=b(),[-a[1],a[0]])},a.rotate=function(a){return a?c([a[0],a[1],a.length>2?a[2]+90:90]):(a=c(),[a[0],a[1],a[2]-90])},a.rotate([0,0])}).raw=Sc,Wg.geom={},Wg.geom.hull=function(a){function b(a){if(a.length<3)return[];var b,e,f,g,h,i,j,k,l,m,n,o,p=pb(c),q=pb(d),r=a.length,s=r-1,t=[],u=[],v=0;if(p===Tc&&d===Uc)b=a;else for(f=0,b=[];r>f;++f)b.push([+p.call(this,e=a[f],f),+q.call(this,e,f)]);for(f=1;r>f;++f)(b[f][1]<b[v][1]||b[f][1]==b[v][1]&&b[f][0]<b[v][0])&&(v=f);for(f=0;r>f;++f)f!==v&&(i=b[f][1]-b[v][1],h=b[f][0]-b[v][0],t.push({angle:Math.atan2(i,h),index:f}));for(t.sort(function(a,b){return a.angle-b.angle}),n=t[0].angle,m=t[0].index,l=0,f=1;s>f;++f){if(g=t[f].index,n==t[f].angle){if(h=b[m][0]-b[v][0],i=b[m][1]-b[v][1],j=b[g][0]-b[v][0],k=b[g][1]-b[v][1],h*h+i*i>=j*j+k*k){t[f].index=-1;continue}t[l].index=-1}n=t[f].angle,l=f,m=g}for(u.push(v),f=0,g=0;2>f;++g)t[g].index>-1&&(u.push(t[g].index),f++);for(o=u.length;s>g;++g)if(!(t[g].index<0)){for(;!Vc(u[o-2],u[o-1],t[g].index,b);)--o;u[o++]=t[g].index}var w=[];for(f=o-1;f>=0;--f)w.push(a[u[f]]);return w}var c=Tc,d=Uc;return arguments.length?b(a):(b.x=function(a){return arguments.length?(c=a,b):c},b.y=function(a){return arguments.length?(d=a,b):d},b)},Wg.geom.polygon=function(a){return nh(a,Ti),a};var Ti=Wg.geom.polygon.prototype=[];Ti.area=function(){for(var a,b=-1,c=this.length,d=this[c-1],e=0;++b<c;)a=d,d=this[b],e+=a[1]*d[0]-a[0]*d[1];return.5*e},Ti.centroid=function(a){var b,c,d=-1,e=this.length,f=0,g=0,h=this[e-1];for(arguments.length||(a=-1/(6*this.area()));++d<e;)b=h,h=this[d],c=b[0]*h[1]-h[0]*b[1],f+=(b[0]+h[0])*c,g+=(b[1]+h[1])*c;return[f*a,g*a]},Ti.clip=function(a){for(var b,c,d,e,f,g,h=Yc(a),i=-1,j=this.length-Yc(this),k=this[j-1];++i<j;){for(b=a.slice(),a.length=0,e=this[i],f=b[(d=b.length-h)-1],c=-1;++c<d;)g=b[c],Wc(g,k,e)?(Wc(f,k,e)||a.push(Xc(f,g,k,e)),a.push(g)):Wc(f,k,e)&&a.push(Xc(f,g,k,e)),f=g;h&&a.push(a[0]),k=e}return a};var Ui,Vi,Wi,Xi,Yi,Zi=[],$i=[];ed.prototype.prepare=function(){for(var a,b=this.edges,c=b.length;c--;)a=b[c].edge,a.b&&a.a||b.splice(c,1);return b.sort(gd),b.length},qd.prototype={start:function(){return this.edge.l===this.site?this.edge.a:this.edge.b},end:function(){return this.edge.l===this.site?this.edge.b:this.edge.a}},rd.prototype={insert:function(a,b){var c,d,e;if(a){if(b.P=a,b.N=a.N,a.N&&(a.N.P=b),a.N=b,a.R){for(a=a.R;a.L;)a=a.L;a.L=b}else a.R=b;c=a}else this._?(a=vd(this._),b.P=null,b.N=a,a.P=a.L=b,c=a):(b.P=b.N=null,this._=b,c=null);for(b.L=b.R=null,b.U=c,b.C=!0,a=b;c&&c.C;)d=c.U,c===d.L?(e=d.R,e&&e.C?(c.C=e.C=!1,d.C=!0,a=d):(a===c.R&&(td(this,c),a=c,c=a.U),c.C=!1,d.C=!0,ud(this,d))):(e=d.L,e&&e.C?(c.C=e.C=!1,d.C=!0,a=d):(a===c.L&&(ud(this,c),a=c,c=a.U),c.C=!1,d.C=!0,td(this,d))),c=a.U;this._.C=!1},remove:function(a){a.N&&(a.N.P=a.P),a.P&&(a.P.N=a.N),a.N=a.P=null;var b,c,d,e=a.U,f=a.L,g=a.R;if(c=f?g?vd(g):f:g,e?e.L===a?e.L=c:e.R=c:this._=c,f&&g?(d=c.C,c.C=a.C,c.L=f,f.U=c,c!==g?(e=c.U,c.U=a.U,a=c.R,e.L=a,c.R=g,g.U=c):(c.U=e,e=c,a=c.R)):(d=a.C,a=c),a&&(a.U=e),!d){if(a&&a.C)return void(a.C=!1);do{if(a===this._)break;if(a===e.L){if(b=e.R,b.C&&(b.C=!1,e.C=!0,td(this,e),b=e.R),b.L&&b.L.C||b.R&&b.R.C){b.R&&b.R.C||(b.L.C=!1,b.C=!0,ud(this,b),b=e.R),b.C=e.C,e.C=b.R.C=!1,td(this,e),a=this._;break}}else if(b=e.L,b.C&&(b.C=!1,e.C=!0,ud(this,e),b=e.L),b.L&&b.L.C||b.R&&b.R.C){b.L&&b.L.C||(b.R.C=!1,b.C=!0,td(this,b),b=e.L),b.C=e.C,e.C=b.L.C=!1,ud(this,e),a=this._;break}b.C=!0,a=e,e=e.U}while(!a.C);a&&(a.C=!1)}}},Wg.geom.voronoi=function(a){function b(a){var b=new Array(a.length),d=h[0][0],e=h[0][1],f=h[1][0],g=h[1][1];return wd(c(a),h).cells.forEach(function(c,h){var i=c.edges,j=c.site,k=b[h]=i.length?i.map(function(a){var b=a.start();return[b.x,b.y]}):j.x>=d&&j.x<=f&&j.y>=e&&j.y<=g?[[d,g],[f,g],[f,e],[d,e]]:[];k.point=a[h]}),b}function c(a){return a.map(function(a,b){return{x:Math.round(f(a,b)/Dh)*Dh,y:Math.round(g(a,b)/Dh)*Dh,i:b}})}var d=Tc,e=Uc,f=d,g=e,h=_i;return a?b(a):(b.links=function(a){return wd(c(a)).edges.filter(function(a){return a.l&&a.r}).map(function(b){return{source:a[b.l.i],target:a[b.r.i]}})},b.triangles=function(a){var b=[];return wd(c(a)).cells.forEach(function(c,d){for(var e,f,g=c.site,h=c.edges.sort(gd),i=-1,j=h.length,k=h[j-1].edge,l=k.l===g?k.r:k.l;++i<j;)e=k,f=l,k=h[i].edge,l=k.l===g?k.r:k.l,d<f.i&&d<l.i&&yd(g,f,l)<0&&b.push([a[d],a[f.i],a[l.i]])}),b},b.x=function(a){return arguments.length?(f=pb(d=a),b):d},b.y=function(a){return arguments.length?(g=pb(e=a),b):e},b.clipExtent=function(a){return arguments.length?(h=null==a?_i:a,b):h===_i?null:h},b.size=function(a){return arguments.length?b.clipExtent(a&&[[0,0],a]):h===_i?null:h&&h[1]},b)};var _i=[[-1e6,-1e6],[1e6,1e6]];Wg.geom.delaunay=function(a){return Wg.geom.voronoi().triangles(a)},Wg.geom.quadtree=function(a,b,c,d,e){function f(a){function f(a,b,c,d,e,f,g,h){if(!isNaN(c)&&!isNaN(d))if(a.leaf){var i=a.x,k=a.y;if(null!=i)if(ih(i-c)+ih(k-d)<.01)j(a,b,c,d,e,f,g,h);else{var l=a.point;a.x=a.y=a.point=null,j(a,l,i,k,e,f,g,h),j(a,b,c,d,e,f,g,h)}else a.x=c,a.y=d,a.point=b}else j(a,b,c,d,e,f,g,h)}function j(a,b,c,d,e,g,h,i){var j=.5*(e+h),k=.5*(g+i),l=c>=j,m=d>=k,n=(m<<1)+l;a.leaf=!1,a=a.nodes[n]||(a.nodes[n]=Bd()),l?e=j:h=j,m?g=k:i=k,f(a,b,c,d,e,g,h,i)}var k,l,m,n,o,p,q,r,s,t=pb(h),u=pb(i);if(null!=b)p=b,q=c,r=d,s=e;else if(r=s=-(p=q=1/0),l=[],m=[],o=a.length,g)for(n=0;o>n;++n)k=a[n],k.x<p&&(p=k.x),k.y<q&&(q=k.y),k.x>r&&(r=k.x),k.y>s&&(s=k.y),l.push(k.x),m.push(k.y);else for(n=0;o>n;++n){var v=+t(k=a[n],n),w=+u(k,n);p>v&&(p=v),q>w&&(q=w),v>r&&(r=v),w>s&&(s=w),l.push(v),m.push(w)}var x=r-p,y=s-q;x>y?s=q+x:r=p+y;var z=Bd();if(z.add=function(a){f(z,a,+t(a,++n),+u(a,n),p,q,r,s)},z.visit=function(a){Cd(a,z,p,q,r,s)},n=-1,null==b){for(;++n<o;)f(z,a[n],l[n],m[n],p,q,r,s);--n}else a.forEach(z.add);return l=m=a=k=null,z}var g,h=Tc,i=Uc;return(g=arguments.length)?(h=zd,i=Ad,3===g&&(e=c,d=b,c=b=0),f(a)):(f.x=function(a){return arguments.length?(h=a,f):h},f.y=function(a){return arguments.length?(i=a,f):i},f.extent=function(a){return arguments.length?(null==a?b=c=d=e=null:(b=+a[0][0],c=+a[0][1],d=+a[1][0],e=+a[1][1]),f):null==b?null:[[b,c],[d,e]]},f.size=function(a){return arguments.length?(null==a?b=c=d=e=null:(b=c=0,d=+a[0],e=+a[1]),f):null==b?null:[d-b,e-c]},f)},Wg.interpolateRgb=Dd,Wg.interpolateObject=Ed,Wg.interpolateNumber=Fd,Wg.interpolateString=Gd;var aj=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;Wg.interpolate=Hd,Wg.interpolators=[function(a,b){var c=typeof b;return("string"===c?Vh.has(b)||/^(#|rgb\(|hsl\()/.test(b)?Dd:Gd:b instanceof T?Dd:"object"===c?Array.isArray(b)?Id:Ed:Fd)(a,b)}],Wg.interpolateArray=Id;var bj=function(){return qb},cj=Wg.map({linear:bj,poly:Pd,quad:function(){return Md},cubic:function(){return Nd},sin:function(){return Qd},exp:function(){return Rd},circle:function(){return Sd},elastic:Td,back:Ud,bounce:function(){return Vd}}),dj=Wg.map({"in":qb,out:Kd,"in-out":Ld,"out-in":function(a){return Ld(Kd(a))}});Wg.ease=function(a){var b=a.indexOf("-"),c=b>=0?a.substring(0,b):a,d=b>=0?a.substring(b+1):"in";return c=cj.get(c)||bj,d=dj.get(d)||qb,Jd(d(c.apply(null,Xg.call(arguments,1))))},Wg.interpolateHcl=Wd,Wg.interpolateHsl=Xd,Wg.interpolateLab=Yd,Wg.interpolateRound=Zd,Wg.transform=function(a){var b=Zg.createElementNS(Wg.ns.prefix.svg,"g");return(Wg.transform=function(a){if(null!=a){b.setAttribute("transform",a);var c=b.transform.baseVal.consolidate()}return new $d(c?c.matrix:ej)})(a)},$d.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var ej={a:1,b:0,c:0,d:1,e:0,f:0};Wg.interpolateTransform=ce,Wg.layout={},Wg.layout.bundle=function(){return function(a){for(var b=[],c=-1,d=a.length;++c<d;)b.push(fe(a[c]));return b}},Wg.layout.chord=function(){function a(){var a,j,l,m,n,o={},p=[],q=Wg.range(f),r=[];for(c=[],d=[],a=0,m=-1;++m<f;){for(j=0,n=-1;++n<f;)j+=e[m][n];p.push(j),r.push(Wg.range(f)),a+=j}for(g&&q.sort(function(a,b){return g(p[a],p[b])}),h&&r.forEach(function(a,b){a.sort(function(a,c){return h(e[b][a],e[b][c])})}),a=(Bh-k*f)/a,j=0,m=-1;++m<f;){for(l=j,n=-1;++n<f;){var s=q[m],t=r[s][n],u=e[s][t],v=j,w=j+=u*a;o[s+"-"+t]={index:s,subindex:t,startAngle:v,endAngle:w,value:u}}d[s]={index:s,startAngle:l,endAngle:j,value:(j-l)/a},j+=k}for(m=-1;++m<f;)for(n=m-1;++n<f;){var x=o[m+"-"+n],y=o[n+"-"+m];(x.value||y.value)&&c.push(x.value<y.value?{source:y,target:x}:{source:x,target:y})}i&&b()}function b(){c.sort(function(a,b){return i((a.source.value+a.target.value)/2,(b.source.value+b.target.value)/2)
-})}var c,d,e,f,g,h,i,j={},k=0;return j.matrix=function(a){return arguments.length?(f=(e=a)&&e.length,c=d=null,j):e},j.padding=function(a){return arguments.length?(k=a,c=d=null,j):k},j.sortGroups=function(a){return arguments.length?(g=a,c=d=null,j):g},j.sortSubgroups=function(a){return arguments.length?(h=a,c=null,j):h},j.sortChords=function(a){return arguments.length?(i=a,c&&b(),j):i},j.chords=function(){return c||a(),c},j.groups=function(){return d||a(),d},j},Wg.layout.force=function(){function a(a){return function(b,c,d,e){if(b.point!==a){var f=b.cx-a.x,g=b.cy-a.y,h=1/Math.sqrt(f*f+g*g);if(p>(e-c)*h){var i=b.charge*h*h;return a.px-=f*i,a.py-=g*i,!0}if(b.point&&isFinite(h)){var i=b.pointCharge*h*h;a.px-=f*i,a.py-=g*i}}return!b.charge}}function b(a){a.px=Wg.event.x,a.py=Wg.event.y,h.resume()}var c,d,e,f,g,h={},i=Wg.dispatch("start","tick","end"),j=[1,1],k=.9,l=fj,m=gj,n=-30,o=.1,p=.8,q=[],r=[];return h.tick=function(){if((d*=.99)<.005)return i.end({type:"end",alpha:d=0}),!0;var b,c,h,l,m,p,s,t,u,v=q.length,w=r.length;for(c=0;w>c;++c)h=r[c],l=h.source,m=h.target,t=m.x-l.x,u=m.y-l.y,(p=t*t+u*u)&&(p=d*f[c]*((p=Math.sqrt(p))-e[c])/p,t*=p,u*=p,m.x-=t*(s=l.weight/(m.weight+l.weight)),m.y-=u*s,l.x+=t*(s=1-s),l.y+=u*s);if((s=d*o)&&(t=j[0]/2,u=j[1]/2,c=-1,s))for(;++c<v;)h=q[c],h.x+=(t-h.x)*s,h.y+=(u-h.y)*s;if(n)for(me(b=Wg.geom.quadtree(q),d,g),c=-1;++c<v;)(h=q[c]).fixed||b.visit(a(h));for(c=-1;++c<v;)h=q[c],h.fixed?(h.x=h.px,h.y=h.py):(h.x-=(h.px-(h.px=h.x))*k,h.y-=(h.py-(h.py=h.y))*k);i.tick({type:"tick",alpha:d})},h.nodes=function(a){return arguments.length?(q=a,h):q},h.links=function(a){return arguments.length?(r=a,h):r},h.size=function(a){return arguments.length?(j=a,h):j},h.linkDistance=function(a){return arguments.length?(l="function"==typeof a?a:+a,h):l},h.distance=h.linkDistance,h.linkStrength=function(a){return arguments.length?(m="function"==typeof a?a:+a,h):m},h.friction=function(a){return arguments.length?(k=+a,h):k},h.charge=function(a){return arguments.length?(n="function"==typeof a?a:+a,h):n},h.gravity=function(a){return arguments.length?(o=+a,h):o},h.theta=function(a){return arguments.length?(p=+a,h):p},h.alpha=function(a){return arguments.length?(a=+a,d?d=a>0?a:0:a>0&&(i.start({type:"start",alpha:d=a}),Wg.timer(h.tick)),h):d},h.start=function(){function a(a,d){if(!c){for(c=new Array(i),h=0;i>h;++h)c[h]=[];for(h=0;j>h;++h){var e=r[h];c[e.source.index].push(e.target),c[e.target.index].push(e.source)}}for(var f,g=c[b],h=-1,j=g.length;++h<j;)if(!isNaN(f=g[h][a]))return f;return Math.random()*d}var b,c,d,i=q.length,k=r.length,o=j[0],p=j[1];for(b=0;i>b;++b)(d=q[b]).index=b,d.weight=0;for(b=0;k>b;++b)d=r[b],"number"==typeof d.source&&(d.source=q[d.source]),"number"==typeof d.target&&(d.target=q[d.target]),++d.source.weight,++d.target.weight;for(b=0;i>b;++b)d=q[b],isNaN(d.x)&&(d.x=a("x",o)),isNaN(d.y)&&(d.y=a("y",p)),isNaN(d.px)&&(d.px=d.x),isNaN(d.py)&&(d.py=d.y);if(e=[],"function"==typeof l)for(b=0;k>b;++b)e[b]=+l.call(this,r[b],b);else for(b=0;k>b;++b)e[b]=l;if(f=[],"function"==typeof m)for(b=0;k>b;++b)f[b]=+m.call(this,r[b],b);else for(b=0;k>b;++b)f[b]=m;if(g=[],"function"==typeof n)for(b=0;i>b;++b)g[b]=+n.call(this,q[b],b);else for(b=0;i>b;++b)g[b]=n;return h.resume()},h.resume=function(){return h.alpha(.1)},h.stop=function(){return h.alpha(0)},h.drag=function(){return c||(c=Wg.behavior.drag().origin(qb).on("dragstart.force",ie).on("drag.force",b).on("dragend.force",je)),arguments.length?void this.on("mouseover.force",ke).on("mouseout.force",le).call(c):c},Wg.rebind(h,i,"on")};var fj=20,gj=1;Wg.layout.hierarchy=function(){function a(b,g,h){var i=e.call(c,b,g);if(b.depth=g,h.push(b),i&&(j=i.length)){for(var j,k,l=-1,m=b.children=new Array(j),n=0,o=g+1;++l<j;)k=m[l]=a(i[l],o,h),k.parent=b,n+=k.value;d&&m.sort(d),f&&(b.value=n)}else delete b.children,f&&(b.value=+f.call(c,b,g)||0);return b}function b(a,d){var e=a.children,g=0;if(e&&(h=e.length))for(var h,i=-1,j=d+1;++i<h;)g+=b(e[i],j);else f&&(g=+f.call(c,a,d)||0);return f&&(a.value=g),g}function c(b){var c=[];return a(b,0,c),c}var d=qe,e=oe,f=pe;return c.sort=function(a){return arguments.length?(d=a,c):d},c.children=function(a){return arguments.length?(e=a,c):e},c.value=function(a){return arguments.length?(f=a,c):f},c.revalue=function(a){return b(a,0),a},c},Wg.layout.partition=function(){function a(b,c,d,e){var f=b.children;if(b.x=c,b.y=b.depth*e,b.dx=d,b.dy=e,f&&(g=f.length)){var g,h,i,j=-1;for(d=b.value?d/b.value:0;++j<g;)a(h=f[j],c,i=h.value*d,e),c+=i}}function b(a){var c=a.children,d=0;if(c&&(e=c.length))for(var e,f=-1;++f<e;)d=Math.max(d,b(c[f]));return 1+d}function c(c,f){var g=d.call(this,c,f);return a(g[0],0,e[0],e[1]/b(g[0])),g}var d=Wg.layout.hierarchy(),e=[1,1];return c.size=function(a){return arguments.length?(e=a,c):e},ne(c,d)},Wg.layout.pie=function(){function a(f){var g=f.map(function(c,d){return+b.call(a,c,d)}),h=+("function"==typeof d?d.apply(this,arguments):d),i=(("function"==typeof e?e.apply(this,arguments):e)-h)/Wg.sum(g),j=Wg.range(f.length);null!=c&&j.sort(c===hj?function(a,b){return g[b]-g[a]}:function(a,b){return c(f[a],f[b])});var k=[];return j.forEach(function(a){var b;k[a]={data:f[a],value:b=g[a],startAngle:h,endAngle:h+=b*i}}),k}var b=Number,c=hj,d=0,e=Bh;return a.value=function(c){return arguments.length?(b=c,a):b},a.sort=function(b){return arguments.length?(c=b,a):c},a.startAngle=function(b){return arguments.length?(d=b,a):d},a.endAngle=function(b){return arguments.length?(e=b,a):e},a};var hj={};Wg.layout.stack=function(){function a(h,i){var j=h.map(function(c,d){return b.call(a,c,d)}),k=j.map(function(b){return b.map(function(b,c){return[f.call(a,b,c),g.call(a,b,c)]})}),l=c.call(a,k,i);j=Wg.permute(j,l),k=Wg.permute(k,l);var m,n,o,p=d.call(a,k,i),q=j.length,r=j[0].length;for(n=0;r>n;++n)for(e.call(a,j[0][n],o=p[n],k[0][n][1]),m=1;q>m;++m)e.call(a,j[m][n],o+=k[m-1][n][1],k[m][n][1]);return h}var b=qb,c=ve,d=we,e=ue,f=se,g=te;return a.values=function(c){return arguments.length?(b=c,a):b},a.order=function(b){return arguments.length?(c="function"==typeof b?b:ij.get(b)||ve,a):c},a.offset=function(b){return arguments.length?(d="function"==typeof b?b:jj.get(b)||we,a):d},a.x=function(b){return arguments.length?(f=b,a):f},a.y=function(b){return arguments.length?(g=b,a):g},a.out=function(b){return arguments.length?(e=b,a):e},a};var ij=Wg.map({"inside-out":function(a){var b,c,d=a.length,e=a.map(xe),f=a.map(ye),g=Wg.range(d).sort(function(a,b){return e[a]-e[b]}),h=0,i=0,j=[],k=[];for(b=0;d>b;++b)c=g[b],i>h?(h+=f[c],j.push(c)):(i+=f[c],k.push(c));return k.reverse().concat(j)},reverse:function(a){return Wg.range(a.length).reverse()},"default":ve}),jj=Wg.map({silhouette:function(a){var b,c,d,e=a.length,f=a[0].length,g=[],h=0,i=[];for(c=0;f>c;++c){for(b=0,d=0;e>b;b++)d+=a[b][c][1];d>h&&(h=d),g.push(d)}for(c=0;f>c;++c)i[c]=(h-g[c])/2;return i},wiggle:function(a){var b,c,d,e,f,g,h,i,j,k=a.length,l=a[0],m=l.length,n=[];for(n[0]=i=j=0,c=1;m>c;++c){for(b=0,e=0;k>b;++b)e+=a[b][c][1];for(b=0,f=0,h=l[c][0]-l[c-1][0];k>b;++b){for(d=0,g=(a[b][c][1]-a[b][c-1][1])/(2*h);b>d;++d)g+=(a[d][c][1]-a[d][c-1][1])/h;f+=g*a[b][c][1]}n[c]=i-=e?f/e*h:0,j>i&&(j=i)}for(c=0;m>c;++c)n[c]-=j;return n},expand:function(a){var b,c,d,e=a.length,f=a[0].length,g=1/e,h=[];for(c=0;f>c;++c){for(b=0,d=0;e>b;b++)d+=a[b][c][1];if(d)for(b=0;e>b;b++)a[b][c][1]/=d;else for(b=0;e>b;b++)a[b][c][1]=g}for(c=0;f>c;++c)h[c]=0;return h},zero:we});Wg.layout.histogram=function(){function a(a,f){for(var g,h,i=[],j=a.map(c,this),k=d.call(this,j,f),l=e.call(this,k,j,f),f=-1,m=j.length,n=l.length-1,o=b?1:1/m;++f<n;)g=i[f]=[],g.dx=l[f+1]-(g.x=l[f]),g.y=0;if(n>0)for(f=-1;++f<m;)h=j[f],h>=k[0]&&h<=k[1]&&(g=i[Wg.bisect(l,h,1,n)-1],g.y+=o,g.push(a[f]));return i}var b=!0,c=Number,d=Ce,e=Ae;return a.value=function(b){return arguments.length?(c=b,a):c},a.range=function(b){return arguments.length?(d=pb(b),a):d},a.bins=function(b){return arguments.length?(e="number"==typeof b?function(a){return Be(a,b)}:pb(b),a):e},a.frequency=function(c){return arguments.length?(b=!!c,a):b},a},Wg.layout.tree=function(){function a(a,f){function g(a,b){var d=a.children,e=a._tree;if(d&&(f=d.length)){for(var f,h,j,k=d[0],l=k,m=-1;++m<f;)j=d[m],g(j,h),l=i(j,h,l),h=j;Le(a);var n=.5*(k._tree.prelim+j._tree.prelim);b?(e.prelim=b._tree.prelim+c(a,b),e.mod=e.prelim-n):e.prelim=n}else b&&(e.prelim=b._tree.prelim+c(a,b))}function h(a,b){a.x=a._tree.prelim+b;var c=a.children;if(c&&(d=c.length)){var d,e=-1;for(b+=a._tree.mod;++e<d;)h(c[e],b)}}function i(a,b,d){if(b){for(var e,f=a,g=a,h=b,i=a.parent.children[0],j=f._tree.mod,k=g._tree.mod,l=h._tree.mod,m=i._tree.mod;h=Fe(h),f=Ee(f),h&&f;)i=Ee(i),g=Fe(g),g._tree.ancestor=a,e=h._tree.prelim+l-f._tree.prelim-j+c(h,f),e>0&&(Me(Ne(h,a,d),a,e),j+=e,k+=e),l+=h._tree.mod,j+=f._tree.mod,m+=i._tree.mod,k+=g._tree.mod;h&&!Fe(g)&&(g._tree.thread=h,g._tree.mod+=l-k),f&&!Ee(i)&&(i._tree.thread=f,i._tree.mod+=j-m,d=a)}return d}var j=b.call(this,a,f),k=j[0];Ke(k,function(a,b){a._tree={ancestor:a,prelim:0,mod:0,change:0,shift:0,number:b?b._tree.number+1:0}}),g(k),h(k,-k._tree.prelim);var l=Ge(k,Ie),m=Ge(k,He),n=Ge(k,Je),o=l.x-c(l,m)/2,p=m.x+c(m,l)/2,q=n.depth||1;return Ke(k,e?function(a){a.x*=d[0],a.y=a.depth*d[1],delete a._tree}:function(a){a.x=(a.x-o)/(p-o)*d[0],a.y=a.depth/q*d[1],delete a._tree}),j}var b=Wg.layout.hierarchy().sort(null).value(null),c=De,d=[1,1],e=!1;return a.separation=function(b){return arguments.length?(c=b,a):c},a.size=function(b){return arguments.length?(e=null==(d=b),a):e?null:d},a.nodeSize=function(b){return arguments.length?(e=null!=(d=b),a):e?d:null},ne(a,b)},Wg.layout.pack=function(){function a(a,f){var g=c.call(this,a,f),h=g[0],i=e[0],j=e[1],k=null==b?Math.sqrt:"function"==typeof b?b:function(){return b};if(h.x=h.y=0,Ke(h,function(a){a.r=+k(a.value)}),Ke(h,Se),d){var l=d*(b?1:Math.max(2*h.r/i,2*h.r/j))/2;Ke(h,function(a){a.r+=l}),Ke(h,Se),Ke(h,function(a){a.r-=l})}return Ve(h,i/2,j/2,b?1:1/Math.max(2*h.r/i,2*h.r/j)),g}var b,c=Wg.layout.hierarchy().sort(Oe),d=0,e=[1,1];return a.size=function(b){return arguments.length?(e=b,a):e},a.radius=function(c){return arguments.length?(b=null==c||"function"==typeof c?c:+c,a):b},a.padding=function(b){return arguments.length?(d=+b,a):d},ne(a,c)},Wg.layout.cluster=function(){function a(a,f){var g,h=b.call(this,a,f),i=h[0],j=0;Ke(i,function(a){var b=a.children;b&&b.length?(a.x=Ye(b),a.y=Xe(b)):(a.x=g?j+=c(a,g):0,a.y=0,g=a)});var k=Ze(i),l=$e(i),m=k.x-c(k,l)/2,n=l.x+c(l,k)/2;return Ke(i,e?function(a){a.x=(a.x-i.x)*d[0],a.y=(i.y-a.y)*d[1]}:function(a){a.x=(a.x-m)/(n-m)*d[0],a.y=(1-(i.y?a.y/i.y:1))*d[1]}),h}var b=Wg.layout.hierarchy().sort(null).value(null),c=De,d=[1,1],e=!1;return a.separation=function(b){return arguments.length?(c=b,a):c},a.size=function(b){return arguments.length?(e=null==(d=b),a):e?null:d},a.nodeSize=function(b){return arguments.length?(e=null!=(d=b),a):e?d:null},ne(a,b)},Wg.layout.treemap=function(){function a(a,b){for(var c,d,e=-1,f=a.length;++e<f;)d=(c=a[e]).value*(0>b?0:b),c.area=isNaN(d)||0>=d?0:d}function b(c){var f=c.children;if(f&&f.length){var g,h,i,j=l(c),k=[],m=f.slice(),o=1/0,p="slice"===n?j.dx:"dice"===n?j.dy:"slice-dice"===n?1&c.depth?j.dy:j.dx:Math.min(j.dx,j.dy);for(a(m,j.dx*j.dy/c.value),k.area=0;(i=m.length)>0;)k.push(g=m[i-1]),k.area+=g.area,"squarify"!==n||(h=d(k,p))<=o?(m.pop(),o=h):(k.area-=k.pop().area,e(k,p,j,!1),p=Math.min(j.dx,j.dy),k.length=k.area=0,o=1/0);k.length&&(e(k,p,j,!0),k.length=k.area=0),f.forEach(b)}}function c(b){var d=b.children;if(d&&d.length){var f,g=l(b),h=d.slice(),i=[];for(a(h,g.dx*g.dy/b.value),i.area=0;f=h.pop();)i.push(f),i.area+=f.area,null!=f.z&&(e(i,f.z?g.dx:g.dy,g,!h.length),i.length=i.area=0);d.forEach(c)}}function d(a,b){for(var c,d=a.area,e=0,f=1/0,g=-1,h=a.length;++g<h;)(c=a[g].area)&&(f>c&&(f=c),c>e&&(e=c));return d*=d,b*=b,d?Math.max(b*e*o/d,d/(b*f*o)):1/0}function e(a,b,c,d){var e,f=-1,g=a.length,h=c.x,j=c.y,k=b?i(a.area/b):0;if(b==c.dx){for((d||k>c.dy)&&(k=c.dy);++f<g;)e=a[f],e.x=h,e.y=j,e.dy=k,h+=e.dx=Math.min(c.x+c.dx-h,k?i(e.area/k):0);e.z=!0,e.dx+=c.x+c.dx-h,c.y+=k,c.dy-=k}else{for((d||k>c.dx)&&(k=c.dx);++f<g;)e=a[f],e.x=h,e.y=j,e.dx=k,j+=e.dy=Math.min(c.y+c.dy-j,k?i(e.area/k):0);e.z=!1,e.dy+=c.y+c.dy-j,c.x+=k,c.dx-=k}}function f(d){var e=g||h(d),f=e[0];return f.x=0,f.y=0,f.dx=j[0],f.dy=j[1],g&&h.revalue(f),a([f],f.dx*f.dy/f.value),(g?c:b)(f),m&&(g=e),e}var g,h=Wg.layout.hierarchy(),i=Math.round,j=[1,1],k=null,l=_e,m=!1,n="squarify",o=.5*(1+Math.sqrt(5));return f.size=function(a){return arguments.length?(j=a,f):j},f.padding=function(a){function b(b){var c=a.call(f,b,b.depth);return null==c?_e(b):af(b,"number"==typeof c?[c,c,c,c]:c)}function c(b){return af(b,a)}if(!arguments.length)return k;var d;return l=null==(k=a)?_e:"function"==(d=typeof a)?b:"number"===d?(a=[a,a,a,a],c):c,f},f.round=function(a){return arguments.length?(i=a?Math.round:Number,f):i!=Number},f.sticky=function(a){return arguments.length?(m=a,g=null,f):m},f.ratio=function(a){return arguments.length?(o=a,f):o},f.mode=function(a){return arguments.length?(n=a+"",f):n},ne(f,h)},Wg.random={normal:function(a,b){var c=arguments.length;return 2>c&&(b=1),1>c&&(a=0),function(){var c,d,e;do c=2*Math.random()-1,d=2*Math.random()-1,e=c*c+d*d;while(!e||e>1);return a+b*c*Math.sqrt(-2*Math.log(e)/e)}},logNormal:function(){var a=Wg.random.normal.apply(Wg,arguments);return function(){return Math.exp(a())}},bates:function(a){var b=Wg.random.irwinHall(a);return function(){return b()/a}},irwinHall:function(a){return function(){for(var b=0,c=0;a>c;c++)b+=Math.random();return b}}},Wg.scale={};var kj={floor:qb,ceil:qb};Wg.scale.linear=function(){return hf([0,1],[0,1],Hd,!1)};var lj={s:1,g:1,p:1,r:1,e:1};Wg.scale.log=function(){return qf(Wg.scale.linear().domain([0,1]),10,!0,[1,10])};var mj=Wg.format(".0e"),nj={floor:function(a){return-Math.ceil(-a)},ceil:function(a){return-Math.floor(-a)}};Wg.scale.pow=function(){return rf(Wg.scale.linear(),1,[0,1])},Wg.scale.sqrt=function(){return Wg.scale.pow().exponent(.5)},Wg.scale.ordinal=function(){return tf([],{t:"range",a:[[]]})},Wg.scale.category10=function(){return Wg.scale.ordinal().range(oj)},Wg.scale.category20=function(){return Wg.scale.ordinal().range(pj)},Wg.scale.category20b=function(){return Wg.scale.ordinal().range(qj)},Wg.scale.category20c=function(){return Wg.scale.ordinal().range(rj)};var oj=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(gb),pj=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(gb),qj=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(gb),rj=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(gb);Wg.scale.quantile=function(){return uf([],[])},Wg.scale.quantize=function(){return vf(0,1,[0,1])},Wg.scale.threshold=function(){return wf([.5],[0,1])},Wg.scale.identity=function(){return xf([0,1])},Wg.svg={},Wg.svg.arc=function(){function a(){var a=b.apply(this,arguments),f=c.apply(this,arguments),g=d.apply(this,arguments)+sj,h=e.apply(this,arguments)+sj,i=(g>h&&(i=g,g=h,h=i),h-g),j=Ah>i?"0":"1",k=Math.cos(g),l=Math.sin(g),m=Math.cos(h),n=Math.sin(h);return i>=tj?a?"M0,"+f+"A"+f+","+f+" 0 1,1 0,"+-f+"A"+f+","+f+" 0 1,1 0,"+f+"M0,"+a+"A"+a+","+a+" 0 1,0 0,"+-a+"A"+a+","+a+" 0 1,0 0,"+a+"Z":"M0,"+f+"A"+f+","+f+" 0 1,1 0,"+-f+"A"+f+","+f+" 0 1,1 0,"+f+"Z":a?"M"+f*k+","+f*l+"A"+f+","+f+" 0 "+j+",1 "+f*m+","+f*n+"L"+a*m+","+a*n+"A"+a+","+a+" 0 "+j+",0 "+a*k+","+a*l+"Z":"M"+f*k+","+f*l+"A"+f+","+f+" 0 "+j+",1 "+f*m+","+f*n+"L0,0Z"}var b=yf,c=zf,d=Af,e=Bf;return a.innerRadius=function(c){return arguments.length?(b=pb(c),a):b},a.outerRadius=function(b){return arguments.length?(c=pb(b),a):c},a.startAngle=function(b){return arguments.length?(d=pb(b),a):d},a.endAngle=function(b){return arguments.length?(e=pb(b),a):e},a.centroid=function(){var a=(b.apply(this,arguments)+c.apply(this,arguments))/2,f=(d.apply(this,arguments)+e.apply(this,arguments))/2+sj;return[Math.cos(f)*a,Math.sin(f)*a]},a};var sj=-Ch,tj=Bh-Dh;Wg.svg.line=function(){return Cf(qb)};var uj=Wg.map({linear:Df,"linear-closed":Ef,step:Ff,"step-before":Gf,"step-after":Hf,basis:Nf,"basis-open":Of,"basis-closed":Pf,bundle:Qf,cardinal:Kf,"cardinal-open":If,"cardinal-closed":Jf,monotone:Wf});uj.forEach(function(a,b){b.key=a,b.closed=/-closed$/.test(a)});var vj=[0,2/3,1/3,0],wj=[0,1/3,2/3,0],xj=[0,1/6,2/3,1/6];Wg.svg.line.radial=function(){var a=Cf(Xf);return a.radius=a.x,delete a.x,a.angle=a.y,delete a.y,a},Gf.reverse=Hf,Hf.reverse=Gf,Wg.svg.area=function(){return Yf(qb)},Wg.svg.area.radial=function(){var a=Yf(Xf);return a.radius=a.x,delete a.x,a.innerRadius=a.x0,delete a.x0,a.outerRadius=a.x1,delete a.x1,a.angle=a.y,delete a.y,a.startAngle=a.y0,delete a.y0,a.endAngle=a.y1,delete a.y1,a},Wg.svg.chord=function(){function a(a,h){var i=b(this,f,a,h),j=b(this,g,a,h);return"M"+i.p0+d(i.r,i.p1,i.a1-i.a0)+(c(i,j)?e(i.r,i.p1,i.r,i.p0):e(i.r,i.p1,j.r,j.p0)+d(j.r,j.p1,j.a1-j.a0)+e(j.r,j.p1,i.r,i.p0))+"Z"}function b(a,b,c,d){var e=b.call(a,c,d),f=h.call(a,e,d),g=i.call(a,e,d)+sj,k=j.call(a,e,d)+sj;return{r:f,a0:g,a1:k,p0:[f*Math.cos(g),f*Math.sin(g)],p1:[f*Math.cos(k),f*Math.sin(k)]}}function c(a,b){return a.a0==b.a0&&a.a1==b.a1}function d(a,b,c){return"A"+a+","+a+" 0 "+ +(c>Ah)+",1 "+b}function e(a,b,c,d){return"Q 0,0 "+d}var f=Jc,g=Kc,h=Zf,i=Af,j=Bf;return a.radius=function(b){return arguments.length?(h=pb(b),a):h},a.source=function(b){return arguments.length?(f=pb(b),a):f},a.target=function(b){return arguments.length?(g=pb(b),a):g},a.startAngle=function(b){return arguments.length?(i=pb(b),a):i},a.endAngle=function(b){return arguments.length?(j=pb(b),a):j},a},Wg.svg.diagonal=function(){function a(a,e){var f=b.call(this,a,e),g=c.call(this,a,e),h=(f.y+g.y)/2,i=[f,{x:f.x,y:h},{x:g.x,y:h},g];return i=i.map(d),"M"+i[0]+"C"+i[1]+" "+i[2]+" "+i[3]}var b=Jc,c=Kc,d=$f;return a.source=function(c){return arguments.length?(b=pb(c),a):b},a.target=function(b){return arguments.length?(c=pb(b),a):c},a.projection=function(b){return arguments.length?(d=b,a):d},a},Wg.svg.diagonal.radial=function(){var a=Wg.svg.diagonal(),b=$f,c=a.projection;return a.projection=function(a){return arguments.length?c(_f(b=a)):b},a},Wg.svg.symbol=function(){function a(a,d){return(yj.get(b.call(this,a,d))||cg)(c.call(this,a,d))}var b=bg,c=ag;return a.type=function(c){return arguments.length?(b=pb(c),a):b},a.size=function(b){return arguments.length?(c=pb(b),a):c},a};var yj=Wg.map({circle:cg,cross:function(a){var b=Math.sqrt(a/5)/2;return"M"+-3*b+","+-b+"H"+-b+"V"+-3*b+"H"+b+"V"+-b+"H"+3*b+"V"+b+"H"+b+"V"+3*b+"H"+-b+"V"+b+"H"+-3*b+"Z"},diamond:function(a){var b=Math.sqrt(a/(2*Cj)),c=b*Cj;return"M0,"+-b+"L"+c+",0 0,"+b+" "+-c+",0Z"},square:function(a){var b=Math.sqrt(a)/2;return"M"+-b+","+-b+"L"+b+","+-b+" "+b+","+b+" "+-b+","+b+"Z"},"triangle-down":function(a){var b=Math.sqrt(a/Bj),c=b*Bj/2;return"M0,"+c+"L"+b+","+-c+" "+-b+","+-c+"Z"},"triangle-up":function(a){var b=Math.sqrt(a/Bj),c=b*Bj/2;return"M0,"+-c+"L"+b+","+c+" "+-b+","+c+"Z"}});Wg.svg.symbolTypes=yj.keys();var zj,Aj,Bj=Math.sqrt(3),Cj=Math.tan(30*Fh),Dj=[],Ej=0;Dj.call=sh.call,Dj.empty=sh.empty,Dj.node=sh.node,Dj.size=sh.size,Wg.transition=function(a){return arguments.length?zj?a.transition():a:vh.transition()},Wg.transition.prototype=Dj,Dj.select=function(a){var b,c,d,e=this.id,f=[];a=p(a);for(var g=-1,h=this.length;++g<h;){f.push(b=[]);for(var i=this[g],j=-1,k=i.length;++j<k;)(d=i[j])&&(c=a.call(d,d.__data__,j,g))?("__data__"in d&&(c.__data__=d.__data__),gg(c,j,e,d.__transition__[e]),b.push(c)):b.push(null)}return dg(f,e)},Dj.selectAll=function(a){var b,c,d,e,f,g=this.id,h=[];a=q(a);for(var i=-1,j=this.length;++i<j;)for(var k=this[i],l=-1,m=k.length;++l<m;)if(d=k[l]){f=d.__transition__[g],c=a.call(d,d.__data__,l,i),h.push(b=[]);for(var n=-1,o=c.length;++n<o;)(e=c[n])&&gg(e,n,g,f),b.push(e)}return dg(h,g)},Dj.filter=function(a){var b,c,d,e=[];"function"!=typeof a&&(a=B(a));for(var f=0,g=this.length;g>f;f++){e.push(b=[]);for(var c=this[f],h=0,i=c.length;i>h;h++)(d=c[h])&&a.call(d,d.__data__,h,f)&&b.push(d)}return dg(e,this.id)},Dj.tween=function(a,b){var c=this.id;return arguments.length<2?this.node().__transition__[c].tween.get(a):D(this,null==b?function(b){b.__transition__[c].tween.remove(a)}:function(d){d.__transition__[c].tween.set(a,b)})},Dj.attr=function(a,b){function c(){this.removeAttribute(h)}function d(){this.removeAttributeNS(h.space,h.local)}function e(a){return null==a?c:(a+="",function(){var b,c=this.getAttribute(h);return c!==a&&(b=g(c,a),function(a){this.setAttribute(h,b(a))})})}function f(a){return null==a?d:(a+="",function(){var b,c=this.getAttributeNS(h.space,h.local);return c!==a&&(b=g(c,a),function(a){this.setAttributeNS(h.space,h.local,b(a))})})}if(arguments.length<2){for(b in a)this.attr(b,a[b]);return this}var g="transform"==a?ce:Hd,h=Wg.ns.qualify(a);return eg(this,"attr."+a,b,h.local?f:e)},Dj.attrTween=function(a,b){function c(a,c){var d=b.call(this,a,c,this.getAttribute(e));return d&&function(a){this.setAttribute(e,d(a))}}function d(a,c){var d=b.call(this,a,c,this.getAttributeNS(e.space,e.local));return d&&function(a){this.setAttributeNS(e.space,e.local,d(a))}}var e=Wg.ns.qualify(a);return this.tween("attr."+a,e.local?d:c)},Dj.style=function(a,b,c){function d(){this.style.removeProperty(a)}function e(b){return null==b?d:(b+="",function(){var d,e=_g.getComputedStyle(this,null).getPropertyValue(a);return e!==b&&(d=Hd(e,b),function(b){this.style.setProperty(a,d(b),c)})})}var f=arguments.length;if(3>f){if("string"!=typeof a){2>f&&(b="");for(c in a)this.style(c,a[c],b);return this}c=""}return eg(this,"style."+a,b,e)},Dj.styleTween=function(a,b,c){function d(d,e){var f=b.call(this,d,e,_g.getComputedStyle(this,null).getPropertyValue(a));return f&&function(b){this.style.setProperty(a,f(b),c)}}return arguments.length<3&&(c=""),this.tween("style."+a,d)},Dj.text=function(a){return eg(this,"text",a,fg)},Dj.remove=function(){return this.each("end.transition",function(){var a;this.__transition__.count<2&&(a=this.parentNode)&&a.removeChild(this)})},Dj.ease=function(a){var b=this.id;return arguments.length<1?this.node().__transition__[b].ease:("function"!=typeof a&&(a=Wg.ease.apply(Wg,arguments)),D(this,function(c){c.__transition__[b].ease=a}))},Dj.delay=function(a){var b=this.id;return D(this,"function"==typeof a?function(c,d,e){c.__transition__[b].delay=+a.call(c,c.__data__,d,e)}:(a=+a,function(c){c.__transition__[b].delay=a}))},Dj.duration=function(a){var b=this.id;return D(this,"function"==typeof a?function(c,d,e){c.__transition__[b].duration=Math.max(1,a.call(c,c.__data__,d,e))}:(a=Math.max(1,a),function(c){c.__transition__[b].duration=a}))},Dj.each=function(a,b){var c=this.id;if(arguments.length<2){var d=Aj,e=zj;zj=c,D(this,function(b,d,e){Aj=b.__transition__[c],a.call(b,b.__data__,d,e)}),Aj=d,zj=e}else D(this,function(d){var e=d.__transition__[c];(e.event||(e.event=Wg.dispatch("start","end"))).on(a,b)});return this},Dj.transition=function(){for(var a,b,c,d,e=this.id,f=++Ej,g=[],h=0,i=this.length;i>h;h++){g.push(a=[]);for(var b=this[h],j=0,k=b.length;k>j;j++)(c=b[j])&&(d=Object.create(c.__transition__[e]),d.delay+=d.duration,gg(c,j,f,d)),a.push(c)}return dg(g,f)},Wg.svg.axis=function(){function a(a){a.each(function(){var a,j=Wg.select(this),k=this.__chart__||c,l=this.__chart__=c.copy(),m=null==i?l.ticks?l.ticks.apply(l,h):l.domain():i,n=null==b?l.tickFormat?l.tickFormat.apply(l,h):qb:b,o=j.selectAll(".tick").data(m,l),p=o.enter().insert("g",".domain").attr("class","tick").style("opacity",Dh),q=Wg.transition(o.exit()).style("opacity",Dh).remove(),r=Wg.transition(o).style("opacity",1),s=cf(l),t=j.selectAll(".domain").data([0]),u=(t.enter().append("path").attr("class","domain"),Wg.transition(t));p.append("line"),p.append("text");var v=p.select("line"),w=r.select("line"),x=o.select("text").text(n),y=p.select("text"),z=r.select("text");switch(d){case"bottom":a=hg,v.attr("y2",e),y.attr("y",Math.max(e,0)+g),w.attr("x2",0).attr("y2",e),z.attr("x",0).attr("y",Math.max(e,0)+g),x.attr("dy",".71em").style("text-anchor","middle"),u.attr("d","M"+s[0]+","+f+"V0H"+s[1]+"V"+f);break;case"top":a=hg,v.attr("y2",-e),y.attr("y",-(Math.max(e,0)+g)),w.attr("x2",0).attr("y2",-e),z.attr("x",0).attr("y",-(Math.max(e,0)+g)),x.attr("dy","0em").style("text-anchor","middle"),u.attr("d","M"+s[0]+","+-f+"V0H"+s[1]+"V"+-f);break;case"left":a=ig,v.attr("x2",-e),y.attr("x",-(Math.max(e,0)+g)),w.attr("x2",-e).attr("y2",0),z.attr("x",-(Math.max(e,0)+g)).attr("y",0),x.attr("dy",".32em").style("text-anchor","end"),u.attr("d","M"+-f+","+s[0]+"H0V"+s[1]+"H"+-f);break;case"right":a=ig,v.attr("x2",e),y.attr("x",Math.max(e,0)+g),w.attr("x2",e).attr("y2",0),z.attr("x",Math.max(e,0)+g).attr("y",0),x.attr("dy",".32em").style("text-anchor","start"),u.attr("d","M"+f+","+s[0]+"H0V"+s[1]+"H"+f)}if(l.rangeBand){var A=l,B=A.rangeBand()/2;k=l=function(a){return A(a)+B}}else k.rangeBand?k=l:q.call(a,l);p.call(a,k),r.call(a,l)})}var b,c=Wg.scale.linear(),d=Fj,e=6,f=6,g=3,h=[10],i=null;return a.scale=function(b){return arguments.length?(c=b,a):c},a.orient=function(b){return arguments.length?(d=b in Gj?b+"":Fj,a):d},a.ticks=function(){return arguments.length?(h=arguments,a):h},a.tickValues=function(b){return arguments.length?(i=b,a):i},a.tickFormat=function(c){return arguments.length?(b=c,a):b},a.tickSize=function(b){var c=arguments.length;return c?(e=+b,f=+arguments[c-1],a):e},a.innerTickSize=function(b){return arguments.length?(e=+b,a):e},a.outerTickSize=function(b){return arguments.length?(f=+b,a):f},a.tickPadding=function(b){return arguments.length?(g=+b,a):g},a.tickSubdivide=function(){return arguments.length&&a},a};var Fj="bottom",Gj={top:1,right:1,bottom:1,left:1};Wg.svg.brush=function(){function a(f){f.each(function(){var f=Wg.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",e).on("touchstart.brush",e),g=f.selectAll(".background").data([0]);g.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),f.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var h=f.selectAll(".resize").data(q,qb);h.exit().remove(),h.enter().append("g").attr("class",function(a){return"resize "+a}).style("cursor",function(a){return Hj[a]}).append("rect").attr("x",function(a){return/[ew]$/.test(a)?-3:null}).attr("y",function(a){return/^[ns]/.test(a)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),h.style("display",a.empty()?"none":null);var k,l=Wg.transition(f),m=Wg.transition(g);i&&(k=cf(i),m.attr("x",k[0]).attr("width",k[1]-k[0]),c(l)),j&&(k=cf(j),m.attr("y",k[0]).attr("height",k[1]-k[0]),d(l)),b(l)})}function b(a){a.selectAll(".resize").attr("transform",function(a){return"translate("+k[+/e$/.test(a)]+","+m[+/^s/.test(a)]+")"})}function c(a){a.select(".extent").attr("x",k[0]),a.selectAll(".extent,.n>rect,.s>rect").attr("width",k[1]-k[0])}function d(a){a.select(".extent").attr("y",m[0]),a.selectAll(".extent,.e>rect,.w>rect").attr("height",m[1]-m[0])}function e(){function e(){32==Wg.event.keyCode&&(C||(t=null,E[0]-=k[1],E[1]-=m[1],C=2),l())}function n(){32==Wg.event.keyCode&&2==C&&(E[0]+=k[1],E[1]+=m[1],C=0,l())}function q(){var a=Wg.mouse(v),e=!1;u&&(a[0]+=u[0],a[1]+=u[1]),C||(Wg.event.altKey?(t||(t=[(k[0]+k[1])/2,(m[0]+m[1])/2]),E[0]=k[+(a[0]<t[0])],E[1]=m[+(a[1]<t[1])]):t=null),A&&r(a,i,0)&&(c(y),e=!0),B&&r(a,j,1)&&(d(y),e=!0),e&&(b(y),x({type:"brush",mode:C?"move":"resize"}))}function r(a,b,c){var d,e,h=cf(b),i=h[0],j=h[1],l=E[c],n=c?m:k,q=n[1]-n[0];return C&&(i-=l,j-=q+l),d=(c?p:o)?Math.max(i,Math.min(j,a[c])):a[c],C?e=(d+=l)+q:(t&&(l=Math.max(i,Math.min(j,2*t[c]-d))),d>l?(e=d,d=l):e=l),n[0]!=d||n[1]!=e?(c?g=null:f=null,n[0]=d,n[1]=e,!0):void 0}function s(){q(),y.style("pointer-events","all").selectAll(".resize").style("display",a.empty()?"none":null),Wg.select("body").style("cursor",null),F.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),D(),x({type:"brushend"})}var t,u,v=this,w=Wg.select(Wg.event.target),x=h.of(v,arguments),y=Wg.select(v),z=w.datum(),A=!/^(n|s)$/.test(z)&&i,B=!/^(e|w)$/.test(z)&&j,C=w.classed("extent"),D=K(),E=Wg.mouse(v),F=Wg.select(_g).on("keydown.brush",e).on("keyup.brush",n);if(Wg.event.changedTouches?F.on("touchmove.brush",q).on("touchend.brush",s):F.on("mousemove.brush",q).on("mouseup.brush",s),y.interrupt().selectAll("*").interrupt(),C)E[0]=k[0]-E[0],E[1]=m[0]-E[1];else if(z){var G=+/w$/.test(z),H=+/^n/.test(z);u=[k[1-G]-E[0],m[1-H]-E[1]],E[0]=k[G],E[1]=m[H]}else Wg.event.altKey&&(t=E.slice());y.style("pointer-events","none").selectAll(".resize").style("display",null),Wg.select("body").style("cursor",w.style("cursor")),x({type:"brushstart"}),q()}var f,g,h=n(a,"brushstart","brush","brushend"),i=null,j=null,k=[0,0],m=[0,0],o=!0,p=!0,q=Ij[0];return a.event=function(a){a.each(function(){var a=h.of(this,arguments),b={x:k,y:m,i:f,j:g},c=this.__chart__||b;this.__chart__=b,zj?Wg.select(this).transition().each("start.brush",function(){f=c.i,g=c.j,k=c.x,m=c.y,a({type:"brushstart"})}).tween("brush:brush",function(){var c=Id(k,b.x),d=Id(m,b.y);return f=g=null,function(e){k=b.x=c(e),m=b.y=d(e),a({type:"brush",mode:"resize"})}}).each("end.brush",function(){f=b.i,g=b.j,a({type:"brush",mode:"resize"}),a({type:"brushend"})}):(a({type:"brushstart"}),a({type:"brush",mode:"resize"}),a({type:"brushend"}))})},a.x=function(b){return arguments.length?(i=b,q=Ij[!i<<1|!j],a):i},a.y=function(b){return arguments.length?(j=b,q=Ij[!i<<1|!j],a):j},a.clamp=function(b){return arguments.length?(i&&j?(o=!!b[0],p=!!b[1]):i?o=!!b:j&&(p=!!b),a):i&&j?[o,p]:i?o:j?p:null},a.extent=function(b){var c,d,e,h,l;return arguments.length?(i&&(c=b[0],d=b[1],j&&(c=c[0],d=d[0]),f=[c,d],i.invert&&(c=i(c),d=i(d)),c>d&&(l=c,c=d,d=l),(c!=k[0]||d!=k[1])&&(k=[c,d])),j&&(e=b[0],h=b[1],i&&(e=e[1],h=h[1]),g=[e,h],j.invert&&(e=j(e),h=j(h)),e>h&&(l=e,e=h,h=l),(e!=m[0]||h!=m[1])&&(m=[e,h])),a):(i&&(f?(c=f[0],d=f[1]):(c=k[0],d=k[1],i.invert&&(c=i.invert(c),d=i.invert(d)),c>d&&(l=c,c=d,d=l))),j&&(g?(e=g[0],h=g[1]):(e=m[0],h=m[1],j.invert&&(e=j.invert(e),h=j.invert(h)),e>h&&(l=e,e=h,h=l))),i&&j?[[c,e],[d,h]]:i?[c,d]:j&&[e,h])},a.clear=function(){return a.empty()||(k=[0,0],m=[0,0],f=g=null),a},a.empty=function(){return!!i&&k[0]==k[1]||!!j&&m[0]==m[1]},Wg.rebind(a,h,"on")};var Hj={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Ij=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Jj=Wg.time={},Kj=Date,Lj=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];jg.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){Mj.setUTCDate.apply(this._,arguments)},setDay:function(){Mj.setUTCDay.apply(this._,arguments)},setFullYear:function(){Mj.setUTCFullYear.apply(this._,arguments)},setHours:function(){Mj.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){Mj.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){Mj.setUTCMinutes.apply(this._,arguments)},setMonth:function(){Mj.setUTCMonth.apply(this._,arguments)},setSeconds:function(){Mj.setUTCSeconds.apply(this._,arguments)
-},setTime:function(){Mj.setTime.apply(this._,arguments)}};var Mj=Date.prototype,Nj="%a %b %e %X %Y",Oj="%m/%d/%Y",Pj="%H:%M:%S",Qj=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],Rj=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],Sj=["January","February","March","April","May","June","July","August","September","October","November","December"],Tj=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];Jj.year=kg(function(a){return a=Jj.day(a),a.setMonth(0,1),a},function(a,b){a.setFullYear(a.getFullYear()+b)},function(a){return a.getFullYear()}),Jj.years=Jj.year.range,Jj.years.utc=Jj.year.utc.range,Jj.day=kg(function(a){var b=new Kj(2e3,0);return b.setFullYear(a.getFullYear(),a.getMonth(),a.getDate()),b},function(a,b){a.setDate(a.getDate()+b)},function(a){return a.getDate()-1}),Jj.days=Jj.day.range,Jj.days.utc=Jj.day.utc.range,Jj.dayOfYear=function(a){var b=Jj.year(a);return Math.floor((a-b-6e4*(a.getTimezoneOffset()-b.getTimezoneOffset()))/864e5)},Lj.forEach(function(a,b){a=a.toLowerCase(),b=7-b;var c=Jj[a]=kg(function(a){return(a=Jj.day(a)).setDate(a.getDate()-(a.getDay()+b)%7),a},function(a,b){a.setDate(a.getDate()+7*Math.floor(b))},function(a){var c=Jj.year(a).getDay();return Math.floor((Jj.dayOfYear(a)+(c+b)%7)/7)-(c!==b)});Jj[a+"s"]=c.range,Jj[a+"s"].utc=c.utc.range,Jj[a+"OfYear"]=function(a){var c=Jj.year(a).getDay();return Math.floor((Jj.dayOfYear(a)+(c+b)%7)/7)}}),Jj.week=Jj.sunday,Jj.weeks=Jj.sunday.range,Jj.weeks.utc=Jj.sunday.utc.range,Jj.weekOfYear=Jj.sundayOfYear,Jj.format=mg;var Uj=og(Qj),Vj=pg(Qj),Wj=og(Rj),Xj=pg(Rj),Yj=og(Sj),Zj=pg(Sj),$j=og(Tj),_j=pg(Tj),ak=/^%/,bk={"-":"",_:" ",0:"0"},ck={a:function(a){return Rj[a.getDay()]},A:function(a){return Qj[a.getDay()]},b:function(a){return Tj[a.getMonth()]},B:function(a){return Sj[a.getMonth()]},c:mg(Nj),d:function(a,b){return qg(a.getDate(),b,2)},e:function(a,b){return qg(a.getDate(),b,2)},H:function(a,b){return qg(a.getHours(),b,2)},I:function(a,b){return qg(a.getHours()%12||12,b,2)},j:function(a,b){return qg(1+Jj.dayOfYear(a),b,3)},L:function(a,b){return qg(a.getMilliseconds(),b,3)},m:function(a,b){return qg(a.getMonth()+1,b,2)},M:function(a,b){return qg(a.getMinutes(),b,2)},p:function(a){return a.getHours()>=12?"PM":"AM"},S:function(a,b){return qg(a.getSeconds(),b,2)},U:function(a,b){return qg(Jj.sundayOfYear(a),b,2)},w:function(a){return a.getDay()},W:function(a,b){return qg(Jj.mondayOfYear(a),b,2)},x:mg(Oj),X:mg(Pj),y:function(a,b){return qg(a.getFullYear()%100,b,2)},Y:function(a,b){return qg(a.getFullYear()%1e4,b,4)},Z:Ng,"%":function(){return"%"}},dk={a:rg,A:sg,b:wg,B:xg,c:yg,d:Gg,e:Gg,H:Ig,I:Ig,j:Hg,L:Lg,m:Fg,M:Jg,p:Mg,S:Kg,U:ug,w:tg,W:vg,x:zg,X:Ag,y:Cg,Y:Bg,Z:Dg,"%":Og},ek=/^\s*\d+/,fk=Wg.map({am:0,pm:1});mg.utc=Pg;var gk=Pg("%Y-%m-%dT%H:%M:%S.%LZ");mg.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?Qg:gk,Qg.parse=function(a){var b=new Date(a);return isNaN(b)?null:b},Qg.toString=gk.toString,Jj.second=kg(function(a){return new Kj(1e3*Math.floor(a/1e3))},function(a,b){a.setTime(a.getTime()+1e3*Math.floor(b))},function(a){return a.getSeconds()}),Jj.seconds=Jj.second.range,Jj.seconds.utc=Jj.second.utc.range,Jj.minute=kg(function(a){return new Kj(6e4*Math.floor(a/6e4))},function(a,b){a.setTime(a.getTime()+6e4*Math.floor(b))},function(a){return a.getMinutes()}),Jj.minutes=Jj.minute.range,Jj.minutes.utc=Jj.minute.utc.range,Jj.hour=kg(function(a){var b=a.getTimezoneOffset()/60;return new Kj(36e5*(Math.floor(a/36e5-b)+b))},function(a,b){a.setTime(a.getTime()+36e5*Math.floor(b))},function(a){return a.getHours()}),Jj.hours=Jj.hour.range,Jj.hours.utc=Jj.hour.utc.range,Jj.month=kg(function(a){return a=Jj.day(a),a.setDate(1),a},function(a,b){a.setMonth(a.getMonth()+b)},function(a){return a.getMonth()}),Jj.months=Jj.month.range,Jj.months.utc=Jj.month.utc.range;var hk=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],ik=[[Jj.second,1],[Jj.second,5],[Jj.second,15],[Jj.second,30],[Jj.minute,1],[Jj.minute,5],[Jj.minute,15],[Jj.minute,30],[Jj.hour,1],[Jj.hour,3],[Jj.hour,6],[Jj.hour,12],[Jj.day,1],[Jj.day,2],[Jj.week,1],[Jj.month,1],[Jj.month,3],[Jj.year,1]],jk=[[mg("%Y"),Tb],[mg("%B"),function(a){return a.getMonth()}],[mg("%b %d"),function(a){return 1!=a.getDate()}],[mg("%a %d"),function(a){return a.getDay()&&1!=a.getDate()}],[mg("%I %p"),function(a){return a.getHours()}],[mg("%I:%M"),function(a){return a.getMinutes()}],[mg(":%S"),function(a){return a.getSeconds()}],[mg(".%L"),function(a){return a.getMilliseconds()}]],kk=Tg(jk);ik.year=Jj.year,Jj.scale=function(){return Rg(Wg.scale.linear(),ik,kk)};var lk={range:function(a,b,c){return Wg.range(+a,+b,c).map(Sg)},floor:qb,ceil:qb},mk=ik.map(function(a){return[a[0].utc,a[1]]}),nk=[[Pg("%Y"),Tb],[Pg("%B"),function(a){return a.getUTCMonth()}],[Pg("%b %d"),function(a){return 1!=a.getUTCDate()}],[Pg("%a %d"),function(a){return a.getUTCDay()&&1!=a.getUTCDate()}],[Pg("%I %p"),function(a){return a.getUTCHours()}],[Pg("%I:%M"),function(a){return a.getUTCMinutes()}],[Pg(":%S"),function(a){return a.getUTCSeconds()}],[Pg(".%L"),function(a){return a.getUTCMilliseconds()}]],ok=Tg(nk);return mk.year=Jj.year.utc,Jj.scale.utc=function(){return Rg(Wg.scale.linear(),mk,ok)},Wg.text=rb(function(a){return a.responseText}),Wg.json=function(a,b){return sb(a,"application/json",Ug,b)},Wg.html=function(a,b){return sb(a,"text/html",Vg,b)},Wg.xml=rb(function(a){return a.responseXML}),Wg}(),function(a,b){"object"==typeof exports?module.exports=b(require("./punycode"),require("./IPv6"),require("./SecondLevelDomains")):"function"==typeof define&&define.amd?define(["./punycode","./IPv6","./SecondLevelDomains"],b):a.URI=b(a.punycode,a.IPv6,a.SecondLevelDomains,a)}(this,function(a,b,c,d){"use strict";function e(a,b){return this instanceof e?(void 0===a&&(a="undefined"!=typeof location?location.href+"":""),this.href(a),void 0!==b?this.absoluteTo(b):this):new e(a,b)}function f(a){return a.replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1")}function g(a){return void 0===a?"Undefined":String(Object.prototype.toString.call(a)).slice(8,-1)}function h(a){return"Array"===g(a)}function i(a,b){var c,d,e={};if(h(b))for(c=0,d=b.length;d>c;c++)e[b[c]]=!0;else e[b]=!0;for(c=0,d=a.length;d>c;c++)void 0!==e[a[c]]&&(a.splice(c,1),d--,c--);return a}function j(a,b){var c,d;if(h(b)){for(c=0,d=b.length;d>c;c++)if(!j(a,b[c]))return!1;return!0}var e=g(b);for(c=0,d=a.length;d>c;c++)if("RegExp"===e){if("string"==typeof a[c]&&a[c].match(b))return!0}else if(a[c]===b)return!0;return!1}function k(a,b){if(!h(a)||!h(b))return!1;if(a.length!==b.length)return!1;a.sort(),b.sort();for(var c=0,d=a.length;d>c;c++)if(a[c]!==b[c])return!1;return!0}function l(a){return escape(a)}function m(a){return encodeURIComponent(a).replace(/[!'()*]/g,l).replace(/\*/g,"%2A")}var n=d&&d.URI,o=e.prototype,p=Object.prototype.hasOwnProperty;e._parts=function(){return{protocol:null,username:null,password:null,hostname:null,urn:null,port:null,path:null,query:null,fragment:null,duplicateQueryParameters:e.duplicateQueryParameters,escapeQuerySpace:e.escapeQuerySpace}},e.duplicateQueryParameters=!1,e.escapeQuerySpace=!0,e.protocol_expression=/^[a-z][a-z0-9-+-]*$/i,e.idn_expression=/[^a-z0-9\.-]/i,e.punycode_expression=/(xn--)/i,e.ip4_expression=/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/,e.ip6_expression=/^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/,e.find_uri_expression=/\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/gi,e.defaultPorts={http:"80",https:"443",ftp:"21",gopher:"70",ws:"80",wss:"443"},e.invalid_hostname_characters=/[^a-zA-Z0-9\.-]/,e.domAttributes={a:"href",blockquote:"cite",link:"href",base:"href",script:"src",form:"action",img:"src",area:"href",iframe:"src",embed:"src",source:"src",track:"src",input:"src"},e.getDomAttribute=function(a){if(!a||!a.nodeName)return void 0;var b=a.nodeName.toLowerCase();return"input"===b&&"image"!==a.type?void 0:e.domAttributes[b]},e.encode=m,e.decode=decodeURIComponent,e.iso8859=function(){e.encode=escape,e.decode=unescape},e.unicode=function(){e.encode=m,e.decode=decodeURIComponent},e.characters={pathname:{encode:{expression:/%(24|26|2B|2C|3B|3D|3A|40)/gi,map:{"%24":"$","%26":"&","%2B":"+","%2C":",","%3B":";","%3D":"=","%3A":":","%40":"@"}},decode:{expression:/[\/\?#]/g,map:{"/":"%2F","?":"%3F","#":"%23"}}},reserved:{encode:{expression:/%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/gi,map:{"%3A":":","%2F":"/","%3F":"?","%23":"#","%5B":"[","%5D":"]","%40":"@","%21":"!","%24":"$","%26":"&","%27":"'","%28":"(","%29":")","%2A":"*","%2B":"+","%2C":",","%3B":";","%3D":"="}}}},e.encodeQuery=function(a,b){var c=e.encode(a+"");return b?c.replace(/%20/g,"+"):c},e.decodeQuery=function(a,b){a+="";try{return e.decode(b?a.replace(/\+/g,"%20"):a)}catch(c){return a}},e.recodePath=function(a){for(var b=(a+"").split("/"),c=0,d=b.length;d>c;c++)b[c]=e.encodePathSegment(e.decode(b[c]));return b.join("/")},e.decodePath=function(a){for(var b=(a+"").split("/"),c=0,d=b.length;d>c;c++)b[c]=e.decodePathSegment(b[c]);return b.join("/")};var q,r={encode:"encode",decode:"decode"},s=function(a,b){return function(c){return e[b](c+"").replace(e.characters[a][b].expression,function(c){return e.characters[a][b].map[c]})}};for(q in r)e[q+"PathSegment"]=s("pathname",r[q]);e.encodeReserved=s("reserved","encode"),e.parse=function(a,b){var c;return b||(b={}),c=a.indexOf("#"),c>-1&&(b.fragment=a.substring(c+1)||null,a=a.substring(0,c)),c=a.indexOf("?"),c>-1&&(b.query=a.substring(c+1)||null,a=a.substring(0,c)),"//"===a.substring(0,2)?(b.protocol=null,a=a.substring(2),a=e.parseAuthority(a,b)):(c=a.indexOf(":"),c>-1&&(b.protocol=a.substring(0,c)||null,b.protocol&&!b.protocol.match(e.protocol_expression)?b.protocol=void 0:"file"===b.protocol?a=a.substring(c+3):"//"===a.substring(c+1,c+3)?(a=a.substring(c+3),a=e.parseAuthority(a,b)):(a=a.substring(c+1),b.urn=!0))),b.path=a,b},e.parseHost=function(a,b){var c,d,e=a.indexOf("/");return-1===e&&(e=a.length),"["===a.charAt(0)?(c=a.indexOf("]"),b.hostname=a.substring(1,c)||null,b.port=a.substring(c+2,e)||null):a.indexOf(":")!==a.lastIndexOf(":")?(b.hostname=a.substring(0,e)||null,b.port=null):(d=a.substring(0,e).split(":"),b.hostname=d[0]||null,b.port=d[1]||null),b.hostname&&"/"!==a.substring(e).charAt(0)&&(e++,a="/"+a),a.substring(e)||"/"},e.parseAuthority=function(a,b){return a=e.parseUserinfo(a,b),e.parseHost(a,b)},e.parseUserinfo=function(a,b){var c,d=a.indexOf("/"),f=d>-1?a.lastIndexOf("@",d):a.indexOf("@");return f>-1&&(-1===d||d>f)?(c=a.substring(0,f).split(":"),b.username=c[0]?e.decode(c[0]):null,c.shift(),b.password=c[0]?e.decode(c.join(":")):null,a=a.substring(f+1)):(b.username=null,b.password=null),a},e.parseQuery=function(a,b){if(!a)return{};if(a=a.replace(/&+/g,"&").replace(/^\?*&*|&+$/g,""),!a)return{};for(var c,d,f,g={},h=a.split("&"),i=h.length,j=0;i>j;j++)c=h[j].split("="),d=e.decodeQuery(c.shift(),b),f=c.length?e.decodeQuery(c.join("="),b):null,g[d]?("string"==typeof g[d]&&(g[d]=[g[d]]),g[d].push(f)):g[d]=f;return g},e.build=function(a){var b="";return a.protocol&&(b+=a.protocol+":"),a.urn||!b&&!a.hostname||(b+="//"),b+=e.buildAuthority(a)||"","string"==typeof a.path&&("/"!==a.path.charAt(0)&&"string"==typeof a.hostname&&(b+="/"),b+=a.path),"string"==typeof a.query&&a.query&&(b+="?"+a.query),"string"==typeof a.fragment&&a.fragment&&(b+="#"+a.fragment),b},e.buildHost=function(a){var b="";return a.hostname?(e.ip6_expression.test(a.hostname)?b+=a.port?"["+a.hostname+"]:"+a.port:a.hostname:(b+=a.hostname,a.port&&(b+=":"+a.port)),b):""},e.buildAuthority=function(a){return e.buildUserinfo(a)+e.buildHost(a)},e.buildUserinfo=function(a){var b="";return a.username&&(b+=e.encode(a.username),a.password&&(b+=":"+e.encode(a.password)),b+="@"),b},e.buildQuery=function(a,b,c){var d,f,g,i,j="";for(f in a)if(p.call(a,f)&&f)if(h(a[f]))for(d={},g=0,i=a[f].length;i>g;g++)void 0!==a[f][g]&&void 0===d[a[f][g]+""]&&(j+="&"+e.buildQueryParameter(f,a[f][g],c),b!==!0&&(d[a[f][g]+""]=!0));else void 0!==a[f]&&(j+="&"+e.buildQueryParameter(f,a[f],c));return j.substring(1)},e.buildQueryParameter=function(a,b,c){return e.encodeQuery(a,c)+(null!==b?"="+e.encodeQuery(b,c):"")},e.addQuery=function(a,b,c){if("object"==typeof b)for(var d in b)p.call(b,d)&&e.addQuery(a,d,b[d]);else{if("string"!=typeof b)throw new TypeError("URI.addQuery() accepts an object, string as the name parameter");if(void 0===a[b])return void(a[b]=c);"string"==typeof a[b]&&(a[b]=[a[b]]),h(c)||(c=[c]),a[b]=a[b].concat(c)}},e.removeQuery=function(a,b,c){var d,f,g;if(h(b))for(d=0,f=b.length;f>d;d++)a[b[d]]=void 0;else if("object"==typeof b)for(g in b)p.call(b,g)&&e.removeQuery(a,g,b[g]);else{if("string"!=typeof b)throw new TypeError("URI.addQuery() accepts an object, string as the first parameter");void 0!==c?a[b]===c?a[b]=void 0:h(a[b])&&(a[b]=i(a[b],c)):a[b]=void 0}},e.hasQuery=function(a,b,c,d){if("object"==typeof b){for(var f in b)if(p.call(b,f)&&!e.hasQuery(a,f,b[f]))return!1;return!0}if("string"!=typeof b)throw new TypeError("URI.hasQuery() accepts an object, string as the name parameter");switch(g(c)){case"Undefined":return b in a;case"Boolean":var i=Boolean(h(a[b])?a[b].length:a[b]);return c===i;case"Function":return!!c(a[b],b,a);case"Array":if(!h(a[b]))return!1;var l=d?j:k;return l(a[b],c);case"RegExp":return h(a[b])?d?j(a[b],c):!1:Boolean(a[b]&&a[b].match(c));case"Number":c=String(c);case"String":return h(a[b])?d?j(a[b],c):!1:a[b]===c;default:throw new TypeError("URI.hasQuery() accepts undefined, boolean, string, number, RegExp, Function as the value parameter")}},e.commonPath=function(a,b){var c,d=Math.min(a.length,b.length);for(c=0;d>c;c++)if(a.charAt(c)!==b.charAt(c)){c--;break}return 1>c?a.charAt(0)===b.charAt(0)&&"/"===a.charAt(0)?"/":"":(("/"!==a.charAt(c)||"/"!==b.charAt(c))&&(c=a.substring(0,c).lastIndexOf("/")),a.substring(0,c+1))},e.withinString=function(a,b){return a.replace(e.find_uri_expression,b)},e.ensureValidHostname=function(b){if(b.match(e.invalid_hostname_characters)){if(!a)throw new TypeError("Hostname '"+b+"' contains characters other than [A-Z0-9.-] and Punycode.js is not available");if(a.toASCII(b).match(e.invalid_hostname_characters))throw new TypeError("Hostname '"+b+"' contains characters other than [A-Z0-9.-]")}},e.noConflict=function(a){if(a){var c={URI:this.noConflict()};return URITemplate&&"function"==typeof URITemplate.noConflict&&(c.URITemplate=URITemplate.noConflict()),b&&"function"==typeof b.noConflict&&(c.IPv6=b.noConflict()),SecondLevelDomains&&"function"==typeof SecondLevelDomains.noConflict&&(c.SecondLevelDomains=SecondLevelDomains.noConflict()),c}return d.URI===this&&(d.URI=n),this},o.build=function(a){return a===!0?this._deferred_build=!0:(void 0===a||this._deferred_build)&&(this._string=e.build(this._parts),this._deferred_build=!1),this},o.clone=function(){return new e(this)},o.valueOf=o.toString=function(){return this.build(!1)._string},r={protocol:"protocol",username:"username",password:"password",hostname:"hostname",port:"port"},s=function(a){return function(b,c){return void 0===b?this._parts[a]||"":(this._parts[a]=b||null,this.build(!c),this)}};for(q in r)o[q]=s(r[q]);r={query:"?",fragment:"#"},s=function(a,b){return function(c,d){return void 0===c?this._parts[a]||"":(null!==c&&(c+="",c.charAt(0)===b&&(c=c.substring(1))),this._parts[a]=c,this.build(!d),this)}};for(q in r)o[q]=s(q,r[q]);r={search:["?","query"],hash:["#","fragment"]},s=function(a,b){return function(c,d){var e=this[a](c,d);return"string"==typeof e&&e.length?b+e:e}};for(q in r)o[q]=s(r[q][1],r[q][0]);o.pathname=function(a,b){if(void 0===a||a===!0){var c=this._parts.path||(this._parts.hostname?"/":"");return a?e.decodePath(c):c}return this._parts.path=a?e.recodePath(a):"/",this.build(!b),this},o.path=o.pathname,o.href=function(a,b){var c;if(void 0===a)return this.toString();this._string="",this._parts=e._parts();var d=a instanceof e,f="object"==typeof a&&(a.hostname||a.path||a.pathname);if(a.nodeName){var g=e.getDomAttribute(a);a=a[g]||"",f=!1}if(!d&&f&&void 0!==a.pathname&&(a=a.toString()),"string"==typeof a)this._parts=e.parse(a,this._parts);else{if(!d&&!f)throw new TypeError("invalid input");var h=d?a._parts:a;for(c in h)p.call(this._parts,c)&&(this._parts[c]=h[c])}return this.build(!b),this},o.is=function(a){var b=!1,d=!1,f=!1,g=!1,h=!1,i=!1,j=!1,k=!this._parts.urn;switch(this._parts.hostname&&(k=!1,d=e.ip4_expression.test(this._parts.hostname),f=e.ip6_expression.test(this._parts.hostname),b=d||f,g=!b,h=g&&c&&c.has(this._parts.hostname),i=g&&e.idn_expression.test(this._parts.hostname),j=g&&e.punycode_expression.test(this._parts.hostname)),a.toLowerCase()){case"relative":return k;case"absolute":return!k;case"domain":case"name":return g;case"sld":return h;case"ip":return b;case"ip4":case"ipv4":case"inet4":return d;case"ip6":case"ipv6":case"inet6":return f;case"idn":return i;case"url":return!this._parts.urn;case"urn":return!!this._parts.urn;case"punycode":return j}return null};var t=o.protocol,u=o.port,v=o.hostname;o.protocol=function(a,b){if(void 0!==a&&a&&(a=a.replace(/:(\/\/)?$/,""),a.match(/[^a-zA-z0-9\.+-]/)))throw new TypeError("Protocol '"+a+"' contains characters other than [A-Z0-9.+-]");return t.call(this,a,b)},o.scheme=o.protocol,o.port=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0!==a&&(0===a&&(a=null),a&&(a+="",":"===a.charAt(0)&&(a=a.substring(1)),a.match(/[^0-9]/))))throw new TypeError("Port '"+a+"' contains characters other than [0-9]");return u.call(this,a,b)},o.hostname=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0!==a){var c={};e.parseHost(a,c),a=c.hostname}return v.call(this,a,b)},o.host=function(a,b){return this._parts.urn?void 0===a?"":this:void 0===a?this._parts.hostname?e.buildHost(this._parts):"":(e.parseHost(a,this._parts),this.build(!b),this)},o.authority=function(a,b){return this._parts.urn?void 0===a?"":this:void 0===a?this._parts.hostname?e.buildAuthority(this._parts):"":(e.parseAuthority(a,this._parts),this.build(!b),this)},o.userinfo=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a){if(!this._parts.username)return"";var c=e.buildUserinfo(this._parts);return c.substring(0,c.length-1)}return"@"!==a[a.length-1]&&(a+="@"),e.parseUserinfo(a,this._parts),this.build(!b),this},o.resource=function(a,b){var c;return void 0===a?this.path()+this.search()+this.hash():(c=e.parse(a),this._parts.path=c.path,this._parts.query=c.query,this._parts.fragment=c.fragment,this.build(!b),this)},o.subdomain=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a){if(!this._parts.hostname||this.is("IP"))return"";var c=this._parts.hostname.length-this.domain().length-1;return this._parts.hostname.substring(0,c)||""}var d=this._parts.hostname.length-this.domain().length,g=this._parts.hostname.substring(0,d),h=new RegExp("^"+f(g));return a&&"."!==a.charAt(a.length-1)&&(a+="."),a&&e.ensureValidHostname(a),this._parts.hostname=this._parts.hostname.replace(h,a),this.build(!b),this},o.domain=function(a,b){if(this._parts.urn)return void 0===a?"":this;if("boolean"==typeof a&&(b=a,a=void 0),void 0===a){if(!this._parts.hostname||this.is("IP"))return"";var c=this._parts.hostname.match(/\./g);if(c&&c.length<2)return this._parts.hostname;var d=this._parts.hostname.length-this.tld(b).length-1;return d=this._parts.hostname.lastIndexOf(".",d-1)+1,this._parts.hostname.substring(d)||""}if(!a)throw new TypeError("cannot set domain empty");if(e.ensureValidHostname(a),!this._parts.hostname||this.is("IP"))this._parts.hostname=a;else{var g=new RegExp(f(this.domain())+"$");this._parts.hostname=this._parts.hostname.replace(g,a)}return this.build(!b),this},o.tld=function(a,b){if(this._parts.urn)return void 0===a?"":this;if("boolean"==typeof a&&(b=a,a=void 0),void 0===a){if(!this._parts.hostname||this.is("IP"))return"";var d=this._parts.hostname.lastIndexOf("."),e=this._parts.hostname.substring(d+1);return b!==!0&&c&&c.list[e.toLowerCase()]?c.get(this._parts.hostname)||e:e}var g;if(!a)throw new TypeError("cannot set TLD empty");if(a.match(/[^a-zA-Z0-9-]/)){if(!c||!c.is(a))throw new TypeError("TLD '"+a+"' contains characters other than [A-Z0-9]");g=new RegExp(f(this.tld())+"$"),this._parts.hostname=this._parts.hostname.replace(g,a)}else{if(!this._parts.hostname||this.is("IP"))throw new ReferenceError("cannot set TLD on non-domain host");g=new RegExp(f(this.tld())+"$"),this._parts.hostname=this._parts.hostname.replace(g,a)}return this.build(!b),this},o.directory=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a||a===!0){if(!this._parts.path&&!this._parts.hostname)return"";if("/"===this._parts.path)return"/";var c=this._parts.path.length-this.filename().length-1,d=this._parts.path.substring(0,c)||(this._parts.hostname?"/":"");return a?e.decodePath(d):d}var g=this._parts.path.length-this.filename().length,h=this._parts.path.substring(0,g),i=new RegExp("^"+f(h));return this.is("relative")||(a||(a="/"),"/"!==a.charAt(0)&&(a="/"+a)),a&&"/"!==a.charAt(a.length-1)&&(a+="/"),a=e.recodePath(a),this._parts.path=this._parts.path.replace(i,a),this.build(!b),this},o.filename=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a||a===!0){if(!this._parts.path||"/"===this._parts.path)return"";var c=this._parts.path.lastIndexOf("/"),d=this._parts.path.substring(c+1);return a?e.decodePathSegment(d):d}var g=!1;"/"===a.charAt(0)&&(a=a.substring(1)),a.match(/\.?\//)&&(g=!0);var h=new RegExp(f(this.filename())+"$");return a=e.recodePath(a),this._parts.path=this._parts.path.replace(h,a),g?this.normalizePath(b):this.build(!b),this},o.suffix=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a||a===!0){if(!this._parts.path||"/"===this._parts.path)return"";var c,d,g=this.filename(),h=g.lastIndexOf(".");return-1===h?"":(c=g.substring(h+1),d=/^[a-z0-9%]+$/i.test(c)?c:"",a?e.decodePathSegment(d):d)}"."===a.charAt(0)&&(a=a.substring(1));var i,j=this.suffix();if(j)i=new RegExp(a?f(j)+"$":f("."+j)+"$");else{if(!a)return this;this._parts.path+="."+e.recodePath(a)}return i&&(a=e.recodePath(a),this._parts.path=this._parts.path.replace(i,a)),this.build(!b),this},o.segment=function(a,b,c){var d=this._parts.urn?":":"/",e=this.path(),f="/"===e.substring(0,1),g=e.split(d);if(void 0!==a&&"number"!=typeof a&&(c=b,b=a,a=void 0),void 0!==a&&"number"!=typeof a)throw new Error("Bad segment '"+a+"', must be 0-based integer");if(f&&g.shift(),0>a&&(a=Math.max(g.length+a,0)),void 0===b)return void 0===a?g:g[a];if(null===a||void 0===g[a])if(h(b)){g=[];for(var i=0,j=b.length;j>i;i++)(b[i].length||g.length&&g[g.length-1].length)&&(g.length&&!g[g.length-1].length&&g.pop(),g.push(b[i]))}else(b||"string"==typeof b)&&(""===g[g.length-1]?g[g.length-1]=b:g.push(b));else b||"string"==typeof b&&b.length?g[a]=b:g.splice(a,1);return f&&g.unshift(""),this.path(g.join(d),c)},o.segmentCoded=function(a,b,c){var d,f,g;if("number"!=typeof a&&(c=b,b=a,a=void 0),void 0===b){if(d=this.segment(a,b,c),h(d))for(f=0,g=d.length;g>f;f++)d[f]=e.decode(d[f]);else d=void 0!==d?e.decode(d):void 0;return d}if(h(b))for(f=0,g=b.length;g>f;f++)b[f]=e.decode(b[f]);else b="string"==typeof b?e.encode(b):b;return this.segment(a,b,c)};var w=o.query;return o.query=function(a,b){if(a===!0)return e.parseQuery(this._parts.query,this._parts.escapeQuerySpace);if("function"==typeof a){var c=e.parseQuery(this._parts.query,this._parts.escapeQuerySpace),d=a.call(this,c);return this._parts.query=e.buildQuery(d||c,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace),this.build(!b),this}return void 0!==a&&"string"!=typeof a?(this._parts.query=e.buildQuery(a,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace),this.build(!b),this):w.call(this,a,b)},o.setQuery=function(a,b,c){var d=e.parseQuery(this._parts.query,this._parts.escapeQuerySpace);if("object"==typeof a)for(var f in a)p.call(a,f)&&(d[f]=a[f]);else{if("string"!=typeof a)throw new TypeError("URI.addQuery() accepts an object, string as the name parameter");d[a]=void 0!==b?b:null}return this._parts.query=e.buildQuery(d,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace),"string"!=typeof a&&(c=b),this.build(!c),this},o.addQuery=function(a,b,c){var d=e.parseQuery(this._parts.query,this._parts.escapeQuerySpace);return e.addQuery(d,a,void 0===b?null:b),this._parts.query=e.buildQuery(d,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace),"string"!=typeof a&&(c=b),this.build(!c),this},o.removeQuery=function(a,b,c){var d=e.parseQuery(this._parts.query,this._parts.escapeQuerySpace);return e.removeQuery(d,a,b),this._parts.query=e.buildQuery(d,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace),"string"!=typeof a&&(c=b),this.build(!c),this},o.hasQuery=function(a,b,c){var d=e.parseQuery(this._parts.query,this._parts.escapeQuerySpace);return e.hasQuery(d,a,b,c)},o.setSearch=o.setQuery,o.addSearch=o.addQuery,o.removeSearch=o.removeQuery,o.hasSearch=o.hasQuery,o.normalize=function(){return this._parts.urn?this.normalizeProtocol(!1).normalizeQuery(!1).normalizeFragment(!1).build():this.normalizeProtocol(!1).normalizeHostname(!1).normalizePort(!1).normalizePath(!1).normalizeQuery(!1).normalizeFragment(!1).build()},o.normalizeProtocol=function(a){return"string"==typeof this._parts.protocol&&(this._parts.protocol=this._parts.protocol.toLowerCase(),this.build(!a)),this},o.normalizeHostname=function(c){return this._parts.hostname&&(this.is("IDN")&&a?this._parts.hostname=a.toASCII(this._parts.hostname):this.is("IPv6")&&b&&(this._parts.hostname=b.best(this._parts.hostname)),this._parts.hostname=this._parts.hostname.toLowerCase(),this.build(!c)),this},o.normalizePort=function(a){return"string"==typeof this._parts.protocol&&this._parts.port===e.defaultPorts[this._parts.protocol]&&(this._parts.port=null,this.build(!a)),this},o.normalizePath=function(a){if(this._parts.urn)return this;if(!this._parts.path||"/"===this._parts.path)return this;var b,c,d,f=this._parts.path;for("/"!==f.charAt(0)&&(b=!0,f="/"+f),f=f.replace(/(\/(\.\/)+)|(\/\.$)/g,"/").replace(/\/{2,}/g,"/");;){if(c=f.indexOf("/../"),-1===c)break;if(0===c){f=f.substring(3);break}d=f.substring(0,c).lastIndexOf("/"),-1===d&&(d=c),f=f.substring(0,d)+f.substring(c+3)}return b&&this.is("relative")&&(f=f.substring(1)),f=e.recodePath(f),this._parts.path=f,this.build(!a),this},o.normalizePathname=o.normalizePath,o.normalizeQuery=function(a){return"string"==typeof this._parts.query&&(this._parts.query.length?this.query(e.parseQuery(this._parts.query,this._parts.escapeQuerySpace)):this._parts.query=null,this.build(!a)),this},o.normalizeFragment=function(a){return this._parts.fragment||(this._parts.fragment=null,this.build(!a)),this},o.normalizeSearch=o.normalizeQuery,o.normalizeHash=o.normalizeFragment,o.iso8859=function(){var a=e.encode,b=e.decode;return e.encode=escape,e.decode=decodeURIComponent,this.normalize(),e.encode=a,e.decode=b,this},o.unicode=function(){var a=e.encode,b=e.decode;return e.encode=m,e.decode=unescape,this.normalize(),e.encode=a,e.decode=b,this},o.readable=function(){var b=this.clone();b.username("").password("").normalize();var c="";if(b._parts.protocol&&(c+=b._parts.protocol+"://"),b._parts.hostname&&(b.is("punycode")&&a?(c+=a.toUnicode(b._parts.hostname),b._parts.port&&(c+=":"+b._parts.port)):c+=b.host()),b._parts.hostname&&b._parts.path&&"/"!==b._parts.path.charAt(0)&&(c+="/"),c+=b.path(!0),b._parts.query){for(var d="",f=0,g=b._parts.query.split("&"),h=g.length;h>f;f++){var i=(g[f]||"").split("=");d+="&"+e.decodeQuery(i[0],this._parts.escapeQuerySpace).replace(/&/g,"%26"),void 0!==i[1]&&(d+="="+e.decodeQuery(i[1],this._parts.escapeQuerySpace).replace(/&/g,"%26"))}c+="?"+d.substring(1)}return c+=e.decodeQuery(b.hash(),!0)},o.absoluteTo=function(a){var b,c,d,f=this.clone(),g=["protocol","username","password","hostname","port"];if(this._parts.urn)throw new Error("URNs do not have any generally defined hierarchical components");if(a instanceof e||(a=new e(a)),f._parts.protocol||(f._parts.protocol=a._parts.protocol),this._parts.hostname)return f;for(c=0;d=g[c];c++)f._parts[d]=a._parts[d];for(g=["query","path"],c=0;d=g[c];c++)!f._parts[d]&&a._parts[d]&&(f._parts[d]=a._parts[d]);return"/"!==f.path().charAt(0)&&(b=a.directory(),f._parts.path=(b?b+"/":"")+f._parts.path,f.normalizePath()),f.build(),f},o.relativeTo=function(a){var b,c,d,f,g,h=this.clone().normalize();if(h._parts.urn)throw new Error("URNs do not have any generally defined hierarchical components");if(a=new e(a).normalize(),b=h._parts,c=a._parts,f=h.path(),g=a.path(),"/"!==f.charAt(0))throw new Error("URI is already relative");if("/"!==g.charAt(0))throw new Error("Cannot calculate a URI relative to another relative URI");if(b.protocol===c.protocol&&(b.protocol=null),b.username!==c.username||b.password!==c.password)return h.build();if(null!==b.protocol||null!==b.username||null!==b.password)return h.build();if(b.hostname!==c.hostname||b.port!==c.port)return h.build();if(b.hostname=null,b.port=null,f===g)return b.path="",h.build();if(d=e.commonPath(h.path(),a.path()),!d)return h.build();var i=c.path.substring(d.length).replace(/[^\/]*$/,"").replace(/.*?\//g,"../");return b.path=i+b.path.substring(d.length),h.build()},o.equals=function(a){var b,c,d,f=this.clone(),g=new e(a),i={},j={},l={};if(f.normalize(),g.normalize(),f.toString()===g.toString())return!0;if(b=f.query(),c=g.query(),f.query(""),g.query(""),f.toString()!==g.toString())return!1;if(b.length!==c.length)return!1;i=e.parseQuery(b,this._parts.escapeQuerySpace),j=e.parseQuery(c,this._parts.escapeQuerySpace);for(d in i)if(p.call(i,d)){if(h(i[d])){if(!k(i[d],j[d]))return!1}else if(i[d]!==j[d])return!1;l[d]=!0}for(d in j)if(p.call(j,d)&&!l[d])return!1;return!0},o.duplicateQueryParameters=function(a){return this._parts.duplicateQueryParameters=!!a,this},o.escapeQuerySpace=function(a){return this._parts.escapeQuerySpace=!!a,this},e}),function(){function a(a,b,c){null!=a&&("number"==typeof a?this.fromNumber(a,b,c):null==b&&"string"!=typeof a?this.fromString(a,256):this.fromString(a,b))}function b(){return new a(null)}function c(a,b,c,d,e,f){for(;--f>=0;){var g=b*this[a++]+c[d]+e;e=Math.floor(g/67108864),c[d++]=67108863&g}return e}function d(a,b,c,d,e,f){for(var g=32767&b,h=b>>15;--f>=0;){var i=32767&this[a],j=this[a++]>>15,k=h*i+j*g;i=g*i+((32767&k)<<15)+c[d]+(1073741823&e),e=(i>>>30)+(k>>>15)+h*j+(e>>>30),c[d++]=1073741823&i}return e}function e(a,b,c,d,e,f){for(var g=16383&b,h=b>>14;--f>=0;){var i=16383&this[a],j=this[a++]>>14,k=h*i+j*g;i=g*i+((16383&k)<<14)+c[d]+e,e=(i>>28)+(k>>14)+h*j,c[d++]=268435455&i}return e}function f(a){return fc.charAt(a)}function g(a,b){var c=gc[a.charCodeAt(b)];return null==c?-1:c}function h(a){for(var b=this.t-1;b>=0;--b)a[b]=this[b];a.t=this.t,a.s=this.s}function i(a){this.t=1,this.s=0>a?-1:0,a>0?this[0]=a:-1>a?this[0]=a+DV:this.t=0}function j(a){var c=b();return c.fromInt(a),c
-}function k(b,c){var d;if(16==c)d=4;else if(8==c)d=3;else if(256==c)d=8;else if(2==c)d=1;else if(32==c)d=5;else{if(4!=c)return void this.fromRadix(b,c);d=2}this.t=0,this.s=0;for(var e=b.length,f=!1,h=0;--e>=0;){var i=8==d?255&b[e]:g(b,e);0>i?"-"==b.charAt(e)&&(f=!0):(f=!1,0==h?this[this.t++]=i:h+d>this.DB?(this[this.t-1]|=(i&(1<<this.DB-h)-1)<<h,this[this.t++]=i>>this.DB-h):this[this.t-1]|=i<<h,h+=d,h>=this.DB&&(h-=this.DB))}8==d&&0!=(128&b[0])&&(this.s=-1,h>0&&(this[this.t-1]|=(1<<this.DB-h)-1<<h)),this.clamp(),f&&a.ZERO.subTo(this,this)}function l(){for(var a=this.s&this.DM;this.t>0&&this[this.t-1]==a;)--this.t}function m(a){if(this.s<0)return"-"+this.negate().toString(a);var b;if(16==a)b=4;else if(8==a)b=3;else if(2==a)b=1;else if(32==a)b=5;else{if(4!=a)return this.toRadix(a);b=2}var c,d=(1<<b)-1,e=!1,g="",h=this.t,i=this.DB-h*this.DB%b;if(h-->0)for(i<this.DB&&(c=this[h]>>i)>0&&(e=!0,g=f(c));h>=0;)b>i?(c=(this[h]&(1<<i)-1)<<b-i,c|=this[--h]>>(i+=this.DB-b)):(c=this[h]>>(i-=b)&d,0>=i&&(i+=this.DB,--h)),c>0&&(e=!0),e&&(g+=f(c));return e?g:"0"}function n(){var c=b();return a.ZERO.subTo(this,c),c}function o(){return this.s<0?this.negate():this}function p(a){var b=this.s-a.s;if(0!=b)return b;var c=this.t;if(b=c-a.t,0!=b)return this.s<0?-b:b;for(;--c>=0;)if(0!=(b=this[c]-a[c]))return b;return 0}function q(a){var b,c=1;return 0!=(b=a>>>16)&&(a=b,c+=16),0!=(b=a>>8)&&(a=b,c+=8),0!=(b=a>>4)&&(a=b,c+=4),0!=(b=a>>2)&&(a=b,c+=2),0!=(b=a>>1)&&(a=b,c+=1),c}function r(){return this.t<=0?0:this.DB*(this.t-1)+q(this[this.t-1]^this.s&this.DM)}function s(a,b){var c;for(c=this.t-1;c>=0;--c)b[c+a]=this[c];for(c=a-1;c>=0;--c)b[c]=0;b.t=this.t+a,b.s=this.s}function t(a,b){for(var c=a;c<this.t;++c)b[c-a]=this[c];b.t=Math.max(this.t-a,0),b.s=this.s}function u(a,b){var c,d=a%this.DB,e=this.DB-d,f=(1<<e)-1,g=Math.floor(a/this.DB),h=this.s<<d&this.DM;for(c=this.t-1;c>=0;--c)b[c+g+1]=this[c]>>e|h,h=(this[c]&f)<<d;for(c=g-1;c>=0;--c)b[c]=0;b[g]=h,b.t=this.t+g+1,b.s=this.s,b.clamp()}function v(a,b){b.s=this.s;var c=Math.floor(a/this.DB);if(c>=this.t)return void(b.t=0);var d=a%this.DB,e=this.DB-d,f=(1<<d)-1;b[0]=this[c]>>d;for(var g=c+1;g<this.t;++g)b[g-c-1]|=(this[g]&f)<<e,b[g-c]=this[g]>>d;d>0&&(b[this.t-c-1]|=(this.s&f)<<e),b.t=this.t-c,b.clamp()}function w(a,b){for(var c=0,d=0,e=Math.min(a.t,this.t);e>c;)d+=this[c]-a[c],b[c++]=d&this.DM,d>>=this.DB;if(a.t<this.t){for(d-=a.s;c<this.t;)d+=this[c],b[c++]=d&this.DM,d>>=this.DB;d+=this.s}else{for(d+=this.s;c<a.t;)d-=a[c],b[c++]=d&this.DM,d>>=this.DB;d-=a.s}b.s=0>d?-1:0,-1>d?b[c++]=this.DV+d:d>0&&(b[c++]=d),b.t=c,b.clamp()}function x(b,c){var d=this.abs(),e=b.abs(),f=d.t;for(c.t=f+e.t;--f>=0;)c[f]=0;for(f=0;f<e.t;++f)c[f+d.t]=d.am(0,e[f],c,f,0,d.t);c.s=0,c.clamp(),this.s!=b.s&&a.ZERO.subTo(c,c)}function y(a){for(var b=this.abs(),c=a.t=2*b.t;--c>=0;)a[c]=0;for(c=0;c<b.t-1;++c){var d=b.am(c,b[c],a,2*c,0,1);(a[c+b.t]+=b.am(c+1,2*b[c],a,2*c+1,d,b.t-c-1))>=b.DV&&(a[c+b.t]-=b.DV,a[c+b.t+1]=1)}a.t>0&&(a[a.t-1]+=b.am(c,b[c],a,2*c,0,1)),a.s=0,a.clamp()}function z(c,d,e){var f=c.abs();if(!(f.t<=0)){var g=this.abs();if(g.t<f.t)return null!=d&&d.fromInt(0),void(null!=e&&this.copyTo(e));null==e&&(e=b());var h=b(),i=this.s,j=c.s,k=this.DB-q(f[f.t-1]);k>0?(f.lShiftTo(k,h),g.lShiftTo(k,e)):(f.copyTo(h),g.copyTo(e));var l=h.t,m=h[l-1];if(0!=m){var n=m*(1<<this.F1)+(l>1?h[l-2]>>this.F2:0),o=this.FV/n,p=(1<<this.F1)/n,r=1<<this.F2,s=e.t,t=s-l,u=null==d?b():d;for(h.dlShiftTo(t,u),e.compareTo(u)>=0&&(e[e.t++]=1,e.subTo(u,e)),a.ONE.dlShiftTo(l,u),u.subTo(h,h);h.t<l;)h[h.t++]=0;for(;--t>=0;){var v=e[--s]==m?this.DM:Math.floor(e[s]*o+(e[s-1]+r)*p);if((e[s]+=h.am(0,v,e,t,0,l))<v)for(h.dlShiftTo(t,u),e.subTo(u,e);e[s]<--v;)e.subTo(u,e)}null!=d&&(e.drShiftTo(l,d),i!=j&&a.ZERO.subTo(d,d)),e.t=l,e.clamp(),k>0&&e.rShiftTo(k,e),0>i&&a.ZERO.subTo(e,e)}}}function A(c){var d=b();return this.abs().divRemTo(c,null,d),this.s<0&&d.compareTo(a.ZERO)>0&&c.subTo(d,d),d}function B(a){this.m=a}function C(a){return a.s<0||a.compareTo(this.m)>=0?a.mod(this.m):a}function D(a){return a}function E(a){a.divRemTo(this.m,null,a)}function F(a,b,c){a.multiplyTo(b,c),this.reduce(c)}function G(a,b){a.squareTo(b),this.reduce(b)}function H(){if(this.t<1)return 0;var a=this[0];if(0==(1&a))return 0;var b=3&a;return b=b*(2-(15&a)*b)&15,b=b*(2-(255&a)*b)&255,b=b*(2-((65535&a)*b&65535))&65535,b=b*(2-a*b%this.DV)%this.DV,b>0?this.DV-b:-b}function I(a){this.m=a,this.mp=a.invDigit(),this.mpl=32767&this.mp,this.mph=this.mp>>15,this.um=(1<<a.DB-15)-1,this.mt2=2*a.t}function J(c){var d=b();return c.abs().dlShiftTo(this.m.t,d),d.divRemTo(this.m,null,d),c.s<0&&d.compareTo(a.ZERO)>0&&this.m.subTo(d,d),d}function K(a){var c=b();return a.copyTo(c),this.reduce(c),c}function L(a){for(;a.t<=this.mt2;)a[a.t++]=0;for(var b=0;b<this.m.t;++b){var c=32767&a[b],d=c*this.mpl+((c*this.mph+(a[b]>>15)*this.mpl&this.um)<<15)&a.DM;for(c=b+this.m.t,a[c]+=this.m.am(0,d,a,b,0,this.m.t);a[c]>=a.DV;)a[c]-=a.DV,a[++c]++}a.clamp(),a.drShiftTo(this.m.t,a),a.compareTo(this.m)>=0&&a.subTo(this.m,a)}function M(a,b){a.squareTo(b),this.reduce(b)}function N(a,b,c){a.multiplyTo(b,c),this.reduce(c)}function O(){return 0==(this.t>0?1&this[0]:this.s)}function P(c,d){if(c>4294967295||1>c)return a.ONE;var e=b(),f=b(),g=d.convert(this),h=q(c)-1;for(g.copyTo(e);--h>=0;)if(d.sqrTo(e,f),(c&1<<h)>0)d.mulTo(f,g,e);else{var i=e;e=f,f=i}return d.revert(e)}function Q(a,b){var c;return c=256>a||b.isEven()?new B(b):new I(b),this.exp(a,c)}function R(){var a=b();return this.copyTo(a),a}function S(){if(this.s<0){if(1==this.t)return this[0]-this.DV;if(0==this.t)return-1}else{if(1==this.t)return this[0];if(0==this.t)return 0}return(this[1]&(1<<32-this.DB)-1)<<this.DB|this[0]}function T(){return 0==this.t?this.s:this[0]<<24>>24}function U(){return 0==this.t?this.s:this[0]<<16>>16}function V(a){return Math.floor(Math.LN2*this.DB/Math.log(a))}function W(){return this.s<0?-1:this.t<=0||1==this.t&&this[0]<=0?0:1}function X(a){if(null==a&&(a=10),0==this.signum()||2>a||a>36)return"0";var c=this.chunkSize(a),d=Math.pow(a,c),e=j(d),f=b(),g=b(),h="";for(this.divRemTo(e,f,g);f.signum()>0;)h=(d+g.intValue()).toString(a).substr(1)+h,f.divRemTo(e,f,g);return g.intValue().toString(a)+h}function Y(b,c){this.fromInt(0),null==c&&(c=10);for(var d=this.chunkSize(c),e=Math.pow(c,d),f=!1,h=0,i=0,j=0;j<b.length;++j){var k=g(b,j);0>k?"-"==b.charAt(j)&&0==this.signum()&&(f=!0):(i=c*i+k,++h>=d&&(this.dMultiply(e),this.dAddOffset(i,0),h=0,i=0))}h>0&&(this.dMultiply(Math.pow(c,h)),this.dAddOffset(i,0)),f&&a.ZERO.subTo(this,this)}function Z(b,c,d){if("number"==typeof c)if(2>b)this.fromInt(1);else for(this.fromNumber(b,d),this.testBit(b-1)||this.bitwiseTo(a.ONE.shiftLeft(b-1),fb,this),this.isEven()&&this.dAddOffset(1,0);!this.isProbablePrime(c);)this.dAddOffset(2,0),this.bitLength()>b&&this.subTo(a.ONE.shiftLeft(b-1),this);else{var e=new Array,f=7&b;e.length=(b>>3)+1,c.nextBytes(e),f>0?e[0]&=(1<<f)-1:e[0]=0,this.fromString(e,256)}}function $(){var a=this.t,b=new Array;b[0]=this.s;var c,d=this.DB-a*this.DB%8,e=0;if(a-->0)for(d<this.DB&&(c=this[a]>>d)!=(this.s&this.DM)>>d&&(b[e++]=c|this.s<<this.DB-d);a>=0;)8>d?(c=(this[a]&(1<<d)-1)<<8-d,c|=this[--a]>>(d+=this.DB-8)):(c=this[a]>>(d-=8)&255,0>=d&&(d+=this.DB,--a)),0!=(128&c)&&(c|=-256),0==e&&(128&this.s)!=(128&c)&&++e,(e>0||c!=this.s)&&(b[e++]=c);return b}function _(a){return 0==this.compareTo(a)}function ab(a){return this.compareTo(a)<0?this:a}function bb(a){return this.compareTo(a)>0?this:a}function cb(a,b,c){var d,e,f=Math.min(a.t,this.t);for(d=0;f>d;++d)c[d]=b(this[d],a[d]);if(a.t<this.t){for(e=a.s&this.DM,d=f;d<this.t;++d)c[d]=b(this[d],e);c.t=this.t}else{for(e=this.s&this.DM,d=f;d<a.t;++d)c[d]=b(e,a[d]);c.t=a.t}c.s=b(this.s,a.s),c.clamp()}function db(a,b){return a&b}function eb(a){var c=b();return this.bitwiseTo(a,db,c),c}function fb(a,b){return a|b}function gb(a){var c=b();return this.bitwiseTo(a,fb,c),c}function hb(a,b){return a^b}function ib(a){var c=b();return this.bitwiseTo(a,hb,c),c}function jb(a,b){return a&~b}function kb(a){var c=b();return this.bitwiseTo(a,jb,c),c}function lb(){for(var a=b(),c=0;c<this.t;++c)a[c]=this.DM&~this[c];return a.t=this.t,a.s=~this.s,a}function mb(a){var c=b();return 0>a?this.rShiftTo(-a,c):this.lShiftTo(a,c),c}function nb(a){var c=b();return 0>a?this.lShiftTo(-a,c):this.rShiftTo(a,c),c}function ob(a){if(0==a)return-1;var b=0;return 0==(65535&a)&&(a>>=16,b+=16),0==(255&a)&&(a>>=8,b+=8),0==(15&a)&&(a>>=4,b+=4),0==(3&a)&&(a>>=2,b+=2),0==(1&a)&&++b,b}function pb(){for(var a=0;a<this.t;++a)if(0!=this[a])return a*this.DB+ob(this[a]);return this.s<0?this.t*this.DB:-1}function qb(a){for(var b=0;0!=a;)a&=a-1,++b;return b}function rb(){for(var a=0,b=this.s&this.DM,c=0;c<this.t;++c)a+=qb(this[c]^b);return a}function sb(a){var b=Math.floor(a/this.DB);return b>=this.t?0!=this.s:0!=(this[b]&1<<a%this.DB)}function tb(b,c){var d=a.ONE.shiftLeft(b);return this.bitwiseTo(d,c,d),d}function ub(a){return this.changeBit(a,fb)}function vb(a){return this.changeBit(a,jb)}function wb(a){return this.changeBit(a,hb)}function xb(a,b){for(var c=0,d=0,e=Math.min(a.t,this.t);e>c;)d+=this[c]+a[c],b[c++]=d&this.DM,d>>=this.DB;if(a.t<this.t){for(d+=a.s;c<this.t;)d+=this[c],b[c++]=d&this.DM,d>>=this.DB;d+=this.s}else{for(d+=this.s;c<a.t;)d+=a[c],b[c++]=d&this.DM,d>>=this.DB;d+=a.s}b.s=0>d?-1:0,d>0?b[c++]=d:-1>d&&(b[c++]=this.DV+d),b.t=c,b.clamp()}function yb(a){var c=b();return this.addTo(a,c),c}function zb(a){var c=b();return this.subTo(a,c),c}function Ab(a){var c=b();return this.multiplyTo(a,c),c}function Bb(){var a=b();return this.squareTo(a),a}function Cb(a){var c=b();return this.divRemTo(a,c,null),c}function Db(a){var c=b();return this.divRemTo(a,null,c),c}function Eb(a){var c=b(),d=b();return this.divRemTo(a,c,d),new Array(c,d)}function Fb(a){this[this.t]=this.am(0,a-1,this,0,0,this.t),++this.t,this.clamp()}function Gb(a,b){if(0!=a){for(;this.t<=b;)this[this.t++]=0;for(this[b]+=a;this[b]>=this.DV;)this[b]-=this.DV,++b>=this.t&&(this[this.t++]=0),++this[b]}}function Hb(){}function Ib(a){return a}function Jb(a,b,c){a.multiplyTo(b,c)}function Kb(a,b){a.squareTo(b)}function Lb(a){return this.exp(a,new Hb)}function Mb(a,b,c){var d=Math.min(this.t+a.t,b);for(c.s=0,c.t=d;d>0;)c[--d]=0;var e;for(e=c.t-this.t;e>d;++d)c[d+this.t]=this.am(0,a[d],c,d,0,this.t);for(e=Math.min(a.t,b);e>d;++d)this.am(0,a[d],c,d,0,b-d);c.clamp()}function Nb(a,b,c){--b;var d=c.t=this.t+a.t-b;for(c.s=0;--d>=0;)c[d]=0;for(d=Math.max(b-this.t,0);d<a.t;++d)c[this.t+d-b]=this.am(b-d,a[d],c,0,0,this.t+d-b);c.clamp(),c.drShiftTo(1,c)}function Ob(c){this.r2=b(),this.q3=b(),a.ONE.dlShiftTo(2*c.t,this.r2),this.mu=this.r2.divide(c),this.m=c}function Pb(a){if(a.s<0||a.t>2*this.m.t)return a.mod(this.m);if(a.compareTo(this.m)<0)return a;var c=b();return a.copyTo(c),this.reduce(c),c}function Qb(a){return a}function Rb(a){for(a.drShiftTo(this.m.t-1,this.r2),a.t>this.m.t+1&&(a.t=this.m.t+1,a.clamp()),this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3),this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);a.compareTo(this.r2)<0;)a.dAddOffset(1,this.m.t+1);for(a.subTo(this.r2,a);a.compareTo(this.m)>=0;)a.subTo(this.m,a)}function Sb(a,b){a.squareTo(b),this.reduce(b)}function Tb(a,b,c){a.multiplyTo(b,c),this.reduce(c)}function Ub(a,c){var d,e,f=a.bitLength(),g=j(1);if(0>=f)return g;d=18>f?1:48>f?3:144>f?4:768>f?5:6,e=8>f?new B(c):c.isEven()?new Ob(c):new I(c);var h=new Array,i=3,k=d-1,l=(1<<d)-1;if(h[1]=e.convert(this),d>1){var m=b();for(e.sqrTo(h[1],m);l>=i;)h[i]=b(),e.mulTo(m,h[i-2],h[i]),i+=2}var n,o,p=a.t-1,r=!0,s=b();for(f=q(a[p])-1;p>=0;){for(f>=k?n=a[p]>>f-k&l:(n=(a[p]&(1<<f+1)-1)<<k-f,p>0&&(n|=a[p-1]>>this.DB+f-k)),i=d;0==(1&n);)n>>=1,--i;if((f-=i)<0&&(f+=this.DB,--p),r)h[n].copyTo(g),r=!1;else{for(;i>1;)e.sqrTo(g,s),e.sqrTo(s,g),i-=2;i>0?e.sqrTo(g,s):(o=g,g=s,s=o),e.mulTo(s,h[n],g)}for(;p>=0&&0==(a[p]&1<<f);)e.sqrTo(g,s),o=g,g=s,s=o,--f<0&&(f=this.DB-1,--p)}return e.revert(g)}function Vb(a){var b=this.s<0?this.negate():this.clone(),c=a.s<0?a.negate():a.clone();if(b.compareTo(c)<0){var d=b;b=c,c=d}var e=b.getLowestSetBit(),f=c.getLowestSetBit();if(0>f)return b;for(f>e&&(f=e),f>0&&(b.rShiftTo(f,b),c.rShiftTo(f,c));b.signum()>0;)(e=b.getLowestSetBit())>0&&b.rShiftTo(e,b),(e=c.getLowestSetBit())>0&&c.rShiftTo(e,c),b.compareTo(c)>=0?(b.subTo(c,b),b.rShiftTo(1,b)):(c.subTo(b,c),c.rShiftTo(1,c));return f>0&&c.lShiftTo(f,c),c}function Wb(a){if(0>=a)return 0;var b=this.DV%a,c=this.s<0?a-1:0;if(this.t>0)if(0==b)c=this[0]%a;else for(var d=this.t-1;d>=0;--d)c=(b*c+this[d])%a;return c}function Xb(b){var c=b.isEven();if(this.isEven()&&c||0==b.signum())return a.ZERO;for(var d=b.clone(),e=this.clone(),f=j(1),g=j(0),h=j(0),i=j(1);0!=d.signum();){for(;d.isEven();)d.rShiftTo(1,d),c?(f.isEven()&&g.isEven()||(f.addTo(this,f),g.subTo(b,g)),f.rShiftTo(1,f)):g.isEven()||g.subTo(b,g),g.rShiftTo(1,g);for(;e.isEven();)e.rShiftTo(1,e),c?(h.isEven()&&i.isEven()||(h.addTo(this,h),i.subTo(b,i)),h.rShiftTo(1,h)):i.isEven()||i.subTo(b,i),i.rShiftTo(1,i);d.compareTo(e)>=0?(d.subTo(e,d),c&&f.subTo(h,f),g.subTo(i,g)):(e.subTo(d,e),c&&h.subTo(f,h),i.subTo(g,i))}return 0!=e.compareTo(a.ONE)?a.ZERO:i.compareTo(b)>=0?i.subtract(b):i.signum()<0?(i.addTo(b,i),i.signum()<0?i.add(b):i):i}function Yb(a){var b,c=this.abs();if(1==c.t&&c[0]<=hc[hc.length-1]){for(b=0;b<hc.length;++b)if(c[0]==hc[b])return!0;return!1}if(c.isEven())return!1;for(b=1;b<hc.length;){for(var d=hc[b],e=b+1;e<hc.length&&ic>d;)d*=hc[e++];for(d=c.modInt(d);e>b;)if(d%hc[b++]==0)return!1}return c.millerRabin(a)}function Zb(c){var d=this.subtract(a.ONE),e=d.getLowestSetBit();if(0>=e)return!1;var f=d.shiftRight(e);c=c+1>>1,c>hc.length&&(c=hc.length);for(var g=b(),h=0;c>h;++h){g.fromInt(hc[Math.floor(Math.random()*hc.length)]);var i=g.modPow(f,this);if(0!=i.compareTo(a.ONE)&&0!=i.compareTo(d)){for(var j=1;j++<e&&0!=i.compareTo(d);)if(i=i.modPowInt(2,this),0==i.compareTo(a.ONE))return!1;if(0!=i.compareTo(d))return!1}}return!0}var $b,_b=0xdeadbeefcafe,ac=15715070==(16777215&_b),bc="undefined"!=typeof navigator;bc&&ac&&"Microsoft Internet Explorer"==navigator.appName?(a.prototype.am=d,$b=30):bc&&ac&&"Netscape"!=navigator.appName?(a.prototype.am=c,$b=26):(a.prototype.am=e,$b=28),a.prototype.DB=$b,a.prototype.DM=(1<<$b)-1,a.prototype.DV=1<<$b;var cc=52;a.prototype.FV=Math.pow(2,cc),a.prototype.F1=cc-$b,a.prototype.F2=2*$b-cc;var dc,ec,fc="0123456789abcdefghijklmnopqrstuvwxyz",gc=new Array;for(dc="0".charCodeAt(0),ec=0;9>=ec;++ec)gc[dc++]=ec;for(dc="a".charCodeAt(0),ec=10;36>ec;++ec)gc[dc++]=ec;for(dc="A".charCodeAt(0),ec=10;36>ec;++ec)gc[dc++]=ec;B.prototype.convert=C,B.prototype.revert=D,B.prototype.reduce=E,B.prototype.mulTo=F,B.prototype.sqrTo=G,I.prototype.convert=J,I.prototype.revert=K,I.prototype.reduce=L,I.prototype.mulTo=N,I.prototype.sqrTo=M,a.prototype.copyTo=h,a.prototype.fromInt=i,a.prototype.fromString=k,a.prototype.clamp=l,a.prototype.dlShiftTo=s,a.prototype.drShiftTo=t,a.prototype.lShiftTo=u,a.prototype.rShiftTo=v,a.prototype.subTo=w,a.prototype.multiplyTo=x,a.prototype.squareTo=y,a.prototype.divRemTo=z,a.prototype.invDigit=H,a.prototype.isEven=O,a.prototype.exp=P,a.prototype.toString=m,a.prototype.negate=n,a.prototype.abs=o,a.prototype.compareTo=p,a.prototype.bitLength=r,a.prototype.mod=A,a.prototype.modPowInt=Q,a.ZERO=j(0),a.ONE=j(1),Hb.prototype.convert=Ib,Hb.prototype.revert=Ib,Hb.prototype.mulTo=Jb,Hb.prototype.sqrTo=Kb,Ob.prototype.convert=Pb,Ob.prototype.revert=Qb,Ob.prototype.reduce=Rb,Ob.prototype.mulTo=Tb,Ob.prototype.sqrTo=Sb;var hc=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997],ic=(1<<26)/hc[hc.length-1];a.prototype.chunkSize=V,a.prototype.toRadix=X,a.prototype.fromRadix=Y,a.prototype.fromNumber=Z,a.prototype.bitwiseTo=cb,a.prototype.changeBit=tb,a.prototype.addTo=xb,a.prototype.dMultiply=Fb,a.prototype.dAddOffset=Gb,a.prototype.multiplyLowerTo=Mb,a.prototype.multiplyUpperTo=Nb,a.prototype.modInt=Wb,a.prototype.millerRabin=Zb,a.prototype.clone=R,a.prototype.intValue=S,a.prototype.byteValue=T,a.prototype.shortValue=U,a.prototype.signum=W,a.prototype.toByteArray=$,a.prototype.equals=_,a.prototype.min=ab,a.prototype.max=bb,a.prototype.and=eb,a.prototype.or=gb,a.prototype.xor=ib,a.prototype.andNot=kb,a.prototype.not=lb,a.prototype.shiftLeft=mb,a.prototype.shiftRight=nb,a.prototype.getLowestSetBit=pb,a.prototype.bitCount=rb,a.prototype.testBit=sb,a.prototype.setBit=ub,a.prototype.clearBit=vb,a.prototype.flipBit=wb,a.prototype.add=yb,a.prototype.subtract=zb,a.prototype.multiply=Ab,a.prototype.divide=Cb,a.prototype.remainder=Db,a.prototype.divideAndRemainder=Eb,a.prototype.modPow=Ub,a.prototype.modInverse=Xb,a.prototype.pow=Lb,a.prototype.gcd=Vb,a.prototype.isProbablePrime=Yb,a.prototype.square=Bb,"undefined"!=typeof exports?exports=module.exports=a:this.BigInteger=a}.call(this),function(a){var b,c,d,e=a(window),f={jqueryui:{container:"ui-widget ui-widget-content ui-corner-all",notice:"ui-state-highlight",notice_icon:"ui-icon ui-icon-info",info:"",info_icon:"ui-icon ui-icon-info",success:"ui-state-default",success_icon:"ui-icon ui-icon-circle-check",error:"ui-state-error",error_icon:"ui-icon ui-icon-alert",closer:"ui-icon ui-icon-close",pin_up:"ui-icon ui-icon-pin-w",pin_down:"ui-icon ui-icon-pin-s",hi_menu:"ui-state-default ui-corner-bottom",hi_btn:"ui-state-default ui-corner-all",hi_btnhov:"ui-state-hover",hi_hnd:"ui-icon ui-icon-grip-dotted-horizontal"},bootstrap:{container:"alert",notice:"",notice_icon:"icon-exclamation-sign",info:"alert-info",info_icon:"icon-info-sign",success:"alert-success",success_icon:"icon-ok-sign",error:"alert-error",error_icon:"icon-warning-sign",closer:"icon-remove",pin_up:"icon-pause",pin_down:"icon-play",hi_menu:"well",hi_btn:"btn",hi_btnhov:"",hi_hnd:"icon-chevron-down"}},g=function(){d=a("body"),e=a(window),e.bind("resize",function(){c&&clearTimeout(c),c=setTimeout(a.pnotify_position_all,10)})};document.body?g():a(g),a.extend({pnotify_remove_all:function(){var b=e.data("pnotify");b&&b.length&&a.each(b,function(){this.pnotify_remove&&this.pnotify_remove()})},pnotify_position_all:function(){c&&clearTimeout(c),c=null;var b=e.data("pnotify");b&&b.length&&(a.each(b,function(){var a=this.opts.stack;a&&(a.nextpos1=a.firstpos1,a.nextpos2=a.firstpos2,a.addpos2=0,a.animation=!0)}),a.each(b,function(){this.pnotify_position()}))},pnotify:function(g){var h,i;"object"!=typeof g?(i=a.extend({},a.pnotify.defaults),i.text=g):i=a.extend({},a.pnotify.defaults,g);for(var j in i)"string"==typeof j&&j.match(/^pnotify_/)&&(i[j.replace(/^pnotify_/,"")]=i[j]);if(i.before_init&&i.before_init(i)===!1)return null;var k,m=function(b,c){o.css("display","none");var d=document.elementFromPoint(b.clientX,b.clientY);o.css("display","block");var e=a(d),f=e.css("cursor");o.css("cursor","auto"!=f?f:"default"),k&&k.get(0)==d||(k&&(l.call(k.get(0),"mouseleave",b.originalEvent),l.call(k.get(0),"mouseout",b.originalEvent)),l.call(d,"mouseenter",b.originalEvent),l.call(d,"mouseover",b.originalEvent)),l.call(d,c,b.originalEvent),k=e},n=f[i.styling],o=a("<div />",{"class":"ui-pnotify "+i.addclass,css:{display:"none"},mouseenter:function(a){i.nonblock&&a.stopPropagation(),i.mouse_reset&&"out"==h&&(o.stop(!0),h="in",o.css("height","auto").animate({width:i.width,opacity:i.nonblock?i.nonblock_opacity:i.opacity},"fast")),i.nonblock&&o.animate({opacity:i.nonblock_opacity},"fast"),i.hide&&i.mouse_reset&&o.pnotify_cancel_remove(),i.sticker&&!i.nonblock&&o.sticker.trigger("pnotify_icon").css("visibility","visible"),i.closer&&!i.nonblock&&o.closer.css("visibility","visible")},mouseleave:function(b){i.nonblock&&b.stopPropagation(),k=null,o.css("cursor","auto"),i.nonblock&&"out"!=h&&o.animate({opacity:i.opacity},"fast"),i.hide&&i.mouse_reset&&o.pnotify_queue_remove(),i.sticker_hover&&o.sticker.css("visibility","hidden"),i.closer_hover&&o.closer.css("visibility","hidden"),a.pnotify_position_all()},mouseover:function(a){i.nonblock&&a.stopPropagation()},mouseout:function(a){i.nonblock&&a.stopPropagation()},mousemove:function(a){i.nonblock&&(a.stopPropagation(),m(a,"onmousemove"))},mousedown:function(a){i.nonblock&&(a.stopPropagation(),a.preventDefault(),m(a,"onmousedown"))},mouseup:function(a){i.nonblock&&(a.stopPropagation(),a.preventDefault(),m(a,"onmouseup"))},click:function(a){i.nonblock&&(a.stopPropagation(),m(a,"onclick"))},dblclick:function(a){i.nonblock&&(a.stopPropagation(),m(a,"ondblclick"))}});o.opts=i,o.container=a("<div />",{"class":n.container+" ui-pnotify-container "+("error"==i.type?n.error:"info"==i.type?n.info:"success"==i.type?n.success:n.notice)}).appendTo(o),""!=i.cornerclass&&o.container.removeClass("ui-corner-all").addClass(i.cornerclass),i.shadow&&o.container.addClass("ui-pnotify-shadow"),o.pnotify_version="1.2.0",o.pnotify=function(b){var c=i;"string"==typeof b?i.text=b:i=a.extend({},i,b);for(var d in i)"string"==typeof d&&d.match(/^pnotify_/)&&(i[d.replace(/^pnotify_/,"")]=i[d]);return o.opts=i,i.cornerclass!=c.cornerclass&&o.container.removeClass("ui-corner-all").addClass(i.cornerclass),i.shadow!=c.shadow&&(i.shadow?o.container.addClass("ui-pnotify-shadow"):o.container.removeClass("ui-pnotify-shadow")),i.addclass===!1?o.removeClass(c.addclass):i.addclass!==c.addclass&&o.removeClass(c.addclass).addClass(i.addclass),i.title===!1?o.title_container.slideUp("fast"):i.title!==c.title&&(i.title_escape?o.title_container.text(i.title).slideDown(200):o.title_container.html(i.title).slideDown(200)),i.text===!1?o.text_container.slideUp("fast"):i.text!==c.text&&(i.text_escape?o.text_container.text(i.text).slideDown(200):o.text_container.html(i.insert_brs?String(i.text).replace(/\n/g,"<br />"):i.text).slideDown(200)),o.pnotify_history=i.history,o.pnotify_hide=i.hide,i.type!=c.type&&o.container.removeClass(n.error+" "+n.notice+" "+n.success+" "+n.info).addClass("error"==i.type?n.error:"info"==i.type?n.info:"success"==i.type?n.success:n.notice),(i.icon!==c.icon||i.icon===!0&&i.type!=c.type)&&(o.container.find("div.ui-pnotify-icon").remove(),i.icon!==!1&&a("<div />",{"class":"ui-pnotify-icon"}).append(a("<span />",{"class":i.icon===!0?"error"==i.type?n.error_icon:"info"==i.type?n.info_icon:"success"==i.type?n.success_icon:n.notice_icon:i.icon})).prependTo(o.container)),i.width!==c.width&&o.animate({width:i.width}),i.min_height!==c.min_height&&o.container.animate({minHeight:i.min_height}),i.opacity!==c.opacity&&o.fadeTo(i.animate_speed,i.opacity),!i.closer||i.nonblock?o.closer.css("display","none"):o.closer.css("display","block"),!i.sticker||i.nonblock?o.sticker.css("display","none"):o.sticker.css("display","block"),o.sticker.trigger("pnotify_icon"),i.sticker_hover?o.sticker.css("visibility","hidden"):i.nonblock||o.sticker.css("visibility","visible"),i.closer_hover?o.closer.css("visibility","hidden"):i.nonblock||o.closer.css("visibility","visible"),i.hide?c.hide||o.pnotify_queue_remove():o.pnotify_cancel_remove(),o.pnotify_queue_position(),o},o.pnotify_position=function(a){var b=o.opts.stack;if(b){b.nextpos1||(b.nextpos1=b.firstpos1),b.nextpos2||(b.nextpos2=b.firstpos2),b.addpos2||(b.addpos2=0);var c="none"==o.css("display");if(!c||a){var d,f,g,h={};switch(b.dir1){case"down":g="top";break;case"up":g="bottom";break;case"left":g="right";break;case"right":g="left"}d=parseInt(o.css(g)),isNaN(d)&&(d=0),"undefined"!=typeof b.firstpos1||c||(b.firstpos1=d,b.nextpos1=b.firstpos1);var i;switch(b.dir2){case"down":i="top";break;case"up":i="bottom";break;case"left":i="right";break;case"right":i="left"}if(f=parseInt(o.css(i)),isNaN(f)&&(f=0),"undefined"!=typeof b.firstpos2||c||(b.firstpos2=f,b.nextpos2=b.firstpos2),("down"==b.dir1&&b.nextpos1+o.height()>e.height()||"up"==b.dir1&&b.nextpos1+o.height()>e.height()||"left"==b.dir1&&b.nextpos1+o.width()>e.width()||"right"==b.dir1&&b.nextpos1+o.width()>e.width())&&(b.nextpos1=b.firstpos1,b.nextpos2+=b.addpos2+("undefined"==typeof b.spacing2?25:b.spacing2),b.addpos2=0),b.animation&&b.nextpos2<f)switch(b.dir2){case"down":h.top=b.nextpos2+"px";break;case"up":h.bottom=b.nextpos2+"px";break;case"left":h.right=b.nextpos2+"px";break;case"right":h.left=b.nextpos2+"px"}else o.css(i,b.nextpos2+"px");switch(b.dir2){case"down":case"up":o.outerHeight(!0)>b.addpos2&&(b.addpos2=o.height());break;case"left":case"right":o.outerWidth(!0)>b.addpos2&&(b.addpos2=o.width())}if(b.nextpos1)if(b.animation&&(d>b.nextpos1||h.top||h.bottom||h.right||h.left))switch(b.dir1){case"down":h.top=b.nextpos1+"px";break;case"up":h.bottom=b.nextpos1+"px";break;case"left":h.right=b.nextpos1+"px";break;case"right":h.left=b.nextpos1+"px"}else o.css(g,b.nextpos1+"px");switch((h.top||h.bottom||h.right||h.left)&&o.animate(h,{duration:500,queue:!1}),b.dir1){case"down":case"up":b.nextpos1+=o.height()+("undefined"==typeof b.spacing1?25:b.spacing1);break;case"left":case"right":b.nextpos1+=o.width()+("undefined"==typeof b.spacing1?25:b.spacing1)}}}},o.pnotify_queue_position=function(b){c&&clearTimeout(c),b||(b=10),c=setTimeout(a.pnotify_position_all,b)},o.pnotify_display=function(){o.parent().length||o.appendTo(d),i.before_open&&i.before_open(o)===!1||("top"!=i.stack.push&&o.pnotify_position(!0),"fade"==i.animation||"fade"==i.animation.effect_in?o.show().fadeTo(0,0).hide():1!=i.opacity&&o.show().fadeTo(0,i.opacity).hide(),o.animate_in(function(){i.after_open&&i.after_open(o),o.pnotify_queue_position(),i.hide&&o.pnotify_queue_remove()}))},o.pnotify_remove=function(){o.timer&&(window.clearTimeout(o.timer),o.timer=null),i.before_close&&i.before_close(o)===!1||o.animate_out(function(){i.after_close&&i.after_close(o)===!1||(o.pnotify_queue_position(),i.remove&&o.detach())})},o.animate_in=function(a){h="in";var b;b="undefined"!=typeof i.animation.effect_in?i.animation.effect_in:i.animation,"none"==b?(o.show(),a()):"show"==b?o.show(i.animate_speed,a):"fade"==b?o.show().fadeTo(i.animate_speed,i.opacity,a):"slide"==b?o.slideDown(i.animate_speed,a):"function"==typeof b?b("in",a,o):o.show(b,"object"==typeof i.animation.options_in?i.animation.options_in:{},i.animate_speed,a)},o.animate_out=function(a){h="out";var b;b="undefined"!=typeof i.animation.effect_out?i.animation.effect_out:i.animation,"none"==b?(o.hide(),a()):"show"==b?o.hide(i.animate_speed,a):"fade"==b?o.fadeOut(i.animate_speed,a):"slide"==b?o.slideUp(i.animate_speed,a):"function"==typeof b?b("out",a,o):o.hide(b,"object"==typeof i.animation.options_out?i.animation.options_out:{},i.animate_speed,a)},o.pnotify_cancel_remove=function(){o.timer&&window.clearTimeout(o.timer)},o.pnotify_queue_remove=function(){o.pnotify_cancel_remove(),o.timer=window.setTimeout(function(){o.pnotify_remove()},isNaN(i.delay)?0:i.delay)},o.closer=a("<div />",{"class":"ui-pnotify-closer",css:{cursor:"pointer",visibility:i.closer_hover?"hidden":"visible"},click:function(){o.pnotify_remove(),o.sticker.css("visibility","hidden"),o.closer.css("visibility","hidden")}}).append(a("<span />",{"class":n.closer})).appendTo(o.container),(!i.closer||i.nonblock)&&o.closer.css("display","none"),o.sticker=a("<div />",{"class":"ui-pnotify-sticker",css:{cursor:"pointer",visibility:i.sticker_hover?"hidden":"visible"},click:function(){i.hide=!i.hide,i.hide?o.pnotify_queue_remove():o.pnotify_cancel_remove(),a(this).trigger("pnotify_icon")}}).bind("pnotify_icon",function(){a(this).children().removeClass(n.pin_up+" "+n.pin_down).addClass(i.hide?n.pin_up:n.pin_down)}).append(a("<span />",{"class":n.pin_up})).appendTo(o.container),(!i.sticker||i.nonblock)&&o.sticker.css("display","none"),i.icon!==!1&&a("<div />",{"class":"ui-pnotify-icon"}).append(a("<span />",{"class":i.icon===!0?"error"==i.type?n.error_icon:"info"==i.type?n.info_icon:"success"==i.type?n.success_icon:n.notice_icon:i.icon})).prependTo(o.container),o.title_container=a("<h4 />",{"class":"ui-pnotify-title"}).appendTo(o.container),i.title===!1?o.title_container.hide():i.title_escape?o.title_container.text(i.title):o.title_container.html(i.title),o.text_container=a("<div />",{"class":"ui-pnotify-text"}).appendTo(o.container),i.text===!1?o.text_container.hide():i.text_escape?o.text_container.text(i.text):o.text_container.html(i.insert_brs?String(i.text).replace(/\n/g,"<br />"):i.text),"string"==typeof i.width&&o.css("width",i.width),"string"==typeof i.min_height&&o.container.css("min-height",i.min_height),o.pnotify_history=i.history,o.pnotify_hide=i.hide;var p=e.data("pnotify");if((null==p||"object"!=typeof p)&&(p=[]),p="top"==i.stack.push?a.merge([o],p):a.merge(p,[o]),e.data("pnotify",p),"top"==i.stack.push&&o.pnotify_queue_position(1),i.after_init&&i.after_init(o),i.history){var q=e.data("pnotify_history");if("undefined"==typeof q){q=a("<div />",{"class":"ui-pnotify-history-container "+n.hi_menu,mouseleave:function(){q.animate({top:"-"+b+"px"},{duration:100,queue:!1})}}).append(a("<div />",{"class":"ui-pnotify-history-header",text:"Redisplay"})).append(a("<button />",{"class":"ui-pnotify-history-all "+n.hi_btn,text:"All",mouseenter:function(){a(this).addClass(n.hi_btnhov)},mouseleave:function(){a(this).removeClass(n.hi_btnhov)},click:function(){return a.each(p,function(){this.pnotify_history&&(this.is(":visible")?this.pnotify_hide&&this.pnotify_queue_remove():this.pnotify_display&&this.pnotify_display())}),!1}})).append(a("<button />",{"class":"ui-pnotify-history-last "+n.hi_btn,text:"Last",mouseenter:function(){a(this).addClass(n.hi_btnhov)},mouseleave:function(){a(this).removeClass(n.hi_btnhov)},click:function(){var a,b=-1;do{if(a=-1==b?p.slice(b):p.slice(b,b+1),!a[0])break;b--}while(!a[0].pnotify_history||a[0].is(":visible"));return a[0]?(a[0].pnotify_display&&a[0].pnotify_display(),!1):!1}})).appendTo(d);var r=a("<span />",{"class":"ui-pnotify-history-pulldown "+n.hi_hnd,mouseenter:function(){q.animate({top:"0"},{duration:100,queue:!1})}}).appendTo(q);b=r.offset().top+2,q.css({top:"-"+b+"px"}),e.data("pnotify_history",q)}}return i.stack.animation=!1,o.pnotify_display(),o}});var h=/^on/,i=/^(dbl)?click$|^mouse(move|down|up|over|out|enter|leave)$|^contextmenu$/,j=/^(focus|blur|select|change|reset)$|^key(press|down|up)$/,k=/^(scroll|resize|(un)?load|abort|error)$/,l=function(b,c){var d;if(b=b.toLowerCase(),document.createEvent&&this.dispatchEvent){if(b=b.replace(h,""),b.match(i)?(a(this).offset(),d=document.createEvent("MouseEvents"),d.initMouseEvent(b,c.bubbles,c.cancelable,c.view,c.detail,c.screenX,c.screenY,c.clientX,c.clientY,c.ctrlKey,c.altKey,c.shiftKey,c.metaKey,c.button,c.relatedTarget)):b.match(j)?(d=document.createEvent("UIEvents"),d.initUIEvent(b,c.bubbles,c.cancelable,c.view,c.detail)):b.match(k)&&(d=document.createEvent("HTMLEvents"),d.initEvent(b,c.bubbles,c.cancelable)),!d)return;this.dispatchEvent(d)}else b.match(h)||(b="on"+b),d=document.createEventObject(c),this.fireEvent(b,d)};a.pnotify.defaults={title:!1,title_escape:!1,text:!1,text_escape:!1,styling:"bootstrap",addclass:"",cornerclass:"",nonblock:!1,nonblock_opacity:.2,history:!0,width:"300px",min_height:"16px",type:"notice",icon:!0,animation:"fade",animate_speed:"slow",opacity:1,shadow:!0,closer:!0,closer_hover:!0,sticker:!0,sticker_hover:!0,hide:!0,delay:8e3,mouse_reset:!0,remove:!0,insert_brs:!0,stack:{dir1:"down",dir2:"left",push:"bottom",spacing1:25,spacing2:25}}}(jQuery),function(){"use strict";function a(a,b){return Math.abs(a-b)<1e-6}var b=function(){function b(b){var d=null,e=[],f=[],g=[],h=angular.extend({},c,b),i=this,j=null;this.center=b.center,this.zoom=h.zoom,this.draggable=h.draggable,this.dragging=!1,this.selector=h.container,this.markers=[],this.options=h.options,this.draw=function(){if(null!=i.center)if(null==d)d=new google.maps.Map(i.selector,angular.extend(i.options,{center:i.center,zoom:i.zoom,draggable:i.draggable,mapTypeId:google.maps.MapTypeId.ROADMAP})),google.maps.event.addListener(d,"dragstart",function(){i.dragging=!0
-}),google.maps.event.addListener(d,"idle",function(){i.dragging=!1}),google.maps.event.addListener(d,"drag",function(){i.dragging=!0}),google.maps.event.addListener(d,"zoom_changed",function(){i.zoom=d.getZoom(),i.center=d.getCenter()}),google.maps.event.addListener(d,"center_changed",function(){i.center=d.getCenter()}),f.length&&angular.forEach(f,function(a){google.maps.event.addListener(d,a.on,a.handler)});else{google.maps.event.trigger(d,"resize");var b=d.getCenter();a(b.lat(),i.center.lat())&&a(b.lng(),i.center.lng())||d.setCenter(i.center),d.getZoom()!=i.zoom&&d.setZoom(i.zoom)}},this.fit=function(){if(d&&e.length){var a=new google.maps.LatLngBounds;angular.forEach(e,function(b){a.extend(b.getPosition())}),d.fitBounds(a)}},this.on=function(a,b){f.push({on:a,handler:b})},this.addMarker=function(a,b,c,f,g,h,k){if(null==i.findMarker(a,b)){var l=new MarkerWithLabel({position:new google.maps.LatLng(a,b),draggable:!1,raiseOnDrag:!0,map:d,labelContent:g,labelAnchor:new google.maps.Point(25,0),labelClass:"marker-label",labelStyle:{opacity:1}});if(null!=f){var m=new google.maps.InfoWindow({content:f});google.maps.event.addListener(l,"click",function(){null!=j&&j.close(),m.open(d,l),j=m})}return e.unshift(l),i.markers.unshift({lat:a,lng:b,draggable:!1,icon:c,infoWindowContent:f,label:g,url:h,thumbnail:k}),l}},this.findMarker=function(b,c){for(var d=0;d<e.length;d++){var f=e[d].getPosition();if(a(f.lat(),b)&&a(f.lng(),c))return e[d]}return null},this.findMarkerIndex=function(b,c){for(var d=0;d<e.length;d++){var f=e[d].getPosition();if(a(f.lat(),b)&&a(f.lng(),c))return d}return-1},this.addInfoWindow=function(a,b,c){var d=new google.maps.InfoWindow({content:c,position:new google.maps.LatLng(a,b)});return g.push(d),d},this.hasMarker=function(a,b){return null!==i.findMarker(a,b)},this.getMarkerInstances=function(){return e},this.removeMarkers=function(a){var b=this;angular.forEach(a,function(a){var c=a.getPosition(),d=c.lat(),f=c.lng(),g=b.findMarkerIndex(d,f);e.splice(g,1),b.markers.splice(g,1),a.setMap(null)})}}var c={zoom:8,draggable:!1,container:null};return b}(),c=angular.module("google-maps",[]);c.directive("googleMap",["$log","$timeout","$filter",function(c,d){var e=function(a){var b=a.map;self.addInfoWindow=function(a,c,d){b.addInfoWindow(a,c,d)}};return e.$inject=["$scope","$element"],{restrict:"ECA",priority:100,transclude:!0,template:"<div class='angular-google-map' ng-transclude></div>",replace:!1,scope:{center:"=center",markers:"=markers",latitude:"=latitude",longitude:"=longitude",zoom:"=zoom",refresh:"&refresh",windows:"=windows",events:"=events"},controller:e,link:function(e,f,g){if(!angular.isDefined(e.center)||!angular.isDefined(e.center.latitude)||!angular.isDefined(e.center.longitude))return void c.error("angular-google-maps: could not find a valid center property");if(!angular.isDefined(e.zoom))return void c.error("angular-google-maps: map zoom property not set");angular.element(f).addClass("angular-google-map");var h={options:{}};g.options&&(h.options=angular.fromJson(g.options));var i=new b(angular.extend(h,{container:f[0],center:new google.maps.LatLng(e.center.latitude,e.center.longitude),draggable:"true"==g.draggable,zoom:e.zoom}));if(i.on("drag",function(){var a=i.center;d(function(){e.$apply(function(){e.center.latitude=a.lat(),e.center.longitude=a.lng()})})}),i.on("zoom_changed",function(){e.zoom!=i.zoom&&d(function(){e.$apply(function(){e.zoom=i.zoom})})}),i.on("center_changed",function(){var a=i.center;d(function(){e.$apply(function(){i.dragging||(e.center.latitude=a.lat(),e.center.longitude=a.lng())})})}),angular.isDefined(e.events))for(var j in e.events)e.events.hasOwnProperty(j)&&angular.isFunction(e.events[j])&&i.on(j,function(){e.events[j].apply(e,[i,j,arguments])});"true"==g.markClick&&!function(){var a=null;i.on("click",function(b){null==a?(a={latitude:b.latLng.lat(),longitude:b.latLng.lng()},e.markers.push(a)):(a.latitude=b.latLng.lat(),a.longitude=b.latLng.lng()),d(function(){e.latitude=a.latitude,e.longitude=a.longitude,e.$apply()})})}(),e.map=i,angular.isUndefined(e.refresh())?i.draw():e.$watch("refresh()",function(a,b){a&&!b&&i.draw()}),e.$watch("markers",function(b){d(function(){angular.forEach(b,function(a){i.hasMarker(a.latitude,a.longitude)||i.addMarker(a.latitude,a.longitude,a.icon,a.infoWindow,a.label)});var c=[];angular.forEach(i.getMarkerInstances(),function(b){for(var d=b.getPosition(),f=d.lat(),g=d.lng(),h=!1,i=0;i<e.markers.length;i++){var j=e.markers[i];a(j.latitude,f)&&a(j.longitude,g)&&(h=!0)}h||c.push(b)}),c.length&&i.removeMarkers(c),"true"==g.fit&&b&&b.length>1&&i.fit()})},!0),e.$watch("center",function(a,b){a!==b&&(i.dragging||(i.center=new google.maps.LatLng(a.latitude,a.longitude),i.draw()))},!0),e.$watch("zoom",function(a,b){a!==b&&(i.zoom=a,i.draw())})}}}])}(),function(){window.visibly={q:document,p:void 0,prefixes:["webkit","ms","o","moz","khtml"],props:["VisibilityState","visibilitychange","Hidden"],m:["focus","blur"],visibleCallbacks:[],hiddenCallbacks:[],genericCallbacks:[],_callbacks:[],cachedPrefix:"",fn:null,onVisible:function(a){"function"==typeof a&&this.visibleCallbacks.push(a)},onHidden:function(a){"function"==typeof a&&this.hiddenCallbacks.push(a)},getPrefix:function(){if(!this.cachedPrefix)for(var a=0;b=this.prefixes[a++];)if(b+this.props[2]in this.q)return this.cachedPrefix=b,this.cachedPrefix},visibilityState:function(){return this._getProp(0)},hidden:function(){return this._getProp(2)},visibilitychange:function(a){"function"==typeof a&&this.genericCallbacks.push(a);var b=this.genericCallbacks.length;if(b)if(this.cachedPrefix)for(;b--;)this.genericCallbacks[b].call(this,this.visibilityState());else for(;b--;)this.genericCallbacks[b].call(this,arguments[0])},isSupported:function(){return this.cachedPrefix+this.props[2]in this.q},_getProp:function(a){return this.q[this.cachedPrefix+this.props[a]]},_execute:function(a){if(a){this._callbacks=1==a?this.visibleCallbacks:this.hiddenCallbacks;for(var b=this._callbacks.length;b--;)this._callbacks[b]()}},_visible:function(){window.visibly._execute(1),window.visibly.visibilitychange.call(window.visibly,"visible")},_hidden:function(){window.visibly._execute(2),window.visibly.visibilitychange.call(window.visibly,"hidden")},_nativeSwitch:function(){this[this._getProp(2)?"_hidden":"_visible"]()},_listen:function(){try{this.isSupported()?this.q.addEventListener(this.cachedPrefix+this.props[1],function(){window.visibly._nativeSwitch.apply(window.visibly,arguments)},1):this.q.addEventListener?(window.addEventListener(this.m[0],this._visible,1),window.addEventListener(this.m[1],this._hidden,1)):this.q.attachEvent&&(this.q.attachEvent("onfocusin",this._visible),this.q.attachEvent("onfocusout",this._hidden))}catch(a){}},init:function(){this.getPrefix(),this._listen()}},this.visibly.init()}();
\ No newline at end of file
diff --git a/web/demos/package/app/scripts/43b68137.plugins.js b/web/demos/package/app/scripts/43b68137.plugins.js
deleted file mode 100644
index c32bd00..0000000
--- a/web/demos/package/app/scripts/43b68137.plugins.js
+++ /dev/null
@@ -1,8 +0,0 @@
-!function(a,b){function c(a){var b=a.length,c=ib.type(a);return ib.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||"function"!==c&&(0===b||"number"==typeof b&&b>0&&b-1 in a)}function d(a){var b=xb[a]={};return ib.each(a.match(kb)||[],function(a,c){b[c]=!0}),b}function e(a,c,d,e){if(ib.acceptData(a)){var f,g,h=ib.expando,i="string"==typeof c,j=a.nodeType,k=j?ib.cache:a,l=j?a[h]:a[h]&&h;if(l&&k[l]&&(e||k[l].data)||!i||d!==b)return l||(j?a[h]=l=_.pop()||ib.guid++:l=h),k[l]||(k[l]={},j||(k[l].toJSON=ib.noop)),("object"==typeof c||"function"==typeof c)&&(e?k[l]=ib.extend(k[l],c):k[l].data=ib.extend(k[l].data,c)),f=k[l],e||(f.data||(f.data={}),f=f.data),d!==b&&(f[ib.camelCase(c)]=d),i?(g=f[c],null==g&&(g=f[ib.camelCase(c)])):g=f,g}}function f(a,b,c){if(ib.acceptData(a)){var d,e,f,g=a.nodeType,i=g?ib.cache:a,j=g?a[ib.expando]:ib.expando;if(i[j]){if(b&&(f=c?i[j]:i[j].data)){ib.isArray(b)?b=b.concat(ib.map(b,ib.camelCase)):b in f?b=[b]:(b=ib.camelCase(b),b=b in f?[b]:b.split(" "));for(d=0,e=b.length;e>d;d++)delete f[b[d]];if(!(c?h:ib.isEmptyObject)(f))return}(c||(delete i[j].data,h(i[j])))&&(g?ib.cleanData([a],!0):ib.support.deleteExpando||i!=i.window?delete i[j]:i[j]=null)}}}function g(a,c,d){if(d===b&&1===a.nodeType){var e="data-"+c.replace(zb,"-$1").toLowerCase();if(d=a.getAttribute(e),"string"==typeof d){try{d="true"===d?!0:"false"===d?!1:"null"===d?null:+d+""===d?+d:yb.test(d)?ib.parseJSON(d):d}catch(f){}ib.data(a,c,d)}else d=b}return d}function h(a){var b;for(b in a)if(("data"!==b||!ib.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function i(){return!0}function j(){return!1}function k(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}function l(a,b,c){if(b=b||0,ib.isFunction(b))return ib.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return ib.grep(a,function(a){return a===b===c});if("string"==typeof b){var d=ib.grep(a,function(a){return 1===a.nodeType});if(Rb.test(b))return ib.filter(b,d,!c);b=ib.filter(b,d)}return ib.grep(a,function(a){return ib.inArray(a,b)>=0===c})}function m(a){var b=Ub.split("|"),c=a.createDocumentFragment();if(c.createElement)for(;b.length;)c.createElement(b.pop());return c}function n(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function o(a){var b=a.getAttributeNode("type");return a.type=(b&&b.specified)+"/"+a.type,a}function p(a){var b=ec.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function q(a,b){for(var c,d=0;null!=(c=a[d]);d++)ib._data(c,"globalEval",!b||ib._data(b[d],"globalEval"))}function r(a,b){if(1===b.nodeType&&ib.hasData(a)){var c,d,e,f=ib._data(a),g=ib._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)ib.event.add(b,c,h[c][d])}g.data&&(g.data=ib.extend({},g.data))}}function s(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!ib.support.noCloneEvent&&b[ib.expando]){e=ib._data(b);for(d in e.events)ib.removeEvent(b,d,e.handle);b.removeAttribute(ib.expando)}"script"===c&&b.text!==a.text?(o(b).text=a.text,p(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),ib.support.html5Clone&&a.innerHTML&&!ib.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&bc.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}function t(a,c){var d,e,f=0,g=typeof a.getElementsByTagName!==V?a.getElementsByTagName(c||"*"):typeof a.querySelectorAll!==V?a.querySelectorAll(c||"*"):b;if(!g)for(g=[],d=a.childNodes||a;null!=(e=d[f]);f++)!c||ib.nodeName(e,c)?g.push(e):ib.merge(g,t(e,c));return c===b||c&&ib.nodeName(a,c)?ib.merge([a],g):g}function u(a){bc.test(a.type)&&(a.defaultChecked=a.checked)}function v(a,b){if(b in a)return b;for(var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=yc.length;e--;)if(b=yc[e]+c,b in a)return b;return d}function w(a,b){return a=b||a,"none"===ib.css(a,"display")||!ib.contains(a.ownerDocument,a)}function x(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=ib._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&w(d)&&(f[g]=ib._data(d,"olddisplay",B(d.nodeName)))):f[g]||(e=w(d),(c&&"none"!==c||!e)&&ib._data(d,"olddisplay",e?c:ib.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function y(a,b,c){var d=rc.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function z(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=ib.css(a,c+xc[f],!0,e)),d?("content"===c&&(g-=ib.css(a,"padding"+xc[f],!0,e)),"margin"!==c&&(g-=ib.css(a,"border"+xc[f]+"Width",!0,e))):(g+=ib.css(a,"padding"+xc[f],!0,e),"padding"!==c&&(g+=ib.css(a,"border"+xc[f]+"Width",!0,e)));return g}function A(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=kc(a),g=ib.support.boxSizing&&"border-box"===ib.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=lc(a,b,f),(0>e||null==e)&&(e=a.style[b]),sc.test(e))return e;d=g&&(ib.support.boxSizingReliable||e===a.style[b]),e=parseFloat(e)||0}return e+z(a,b,c||(g?"border":"content"),d,f)+"px"}function B(a){var b=W,c=uc[a];return c||(c=C(a,b),"none"!==c&&c||(jc=(jc||ib("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(b.documentElement),b=(jc[0].contentWindow||jc[0].contentDocument).document,b.write("<!doctype html><html><body>"),b.close(),c=C(a,b),jc.detach()),uc[a]=c),c}function C(a,b){var c=ib(b.createElement(a)).appendTo(b.body),d=ib.css(c[0],"display");return c.remove(),d}function D(a,b,c,d){var e;if(ib.isArray(b))ib.each(b,function(b,e){c||Ac.test(a)?d(a,e):D(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==ib.type(b))d(a,b);else for(e in b)D(a+"["+e+"]",b[e],c,d)}function E(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(kb)||[];if(ib.isFunction(c))for(;d=f[e++];)"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function F(a,b,c,d){function e(h){var i;return f[h]=!0,ib.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||g||f[j]?g?!(i=j):void 0:(b.dataTypes.unshift(j),e(j),!1)}),i}var f={},g=a===Rc;return e(b.dataTypes[0])||!f["*"]&&e("*")}function G(a,c){var d,e,f=ib.ajaxSettings.flatOptions||{};for(e in c)c[e]!==b&&((f[e]?a:d||(d={}))[e]=c[e]);return d&&ib.extend(!0,a,d),a}function H(a,c,d){var e,f,g,h,i=a.contents,j=a.dataTypes,k=a.responseFields;for(h in k)h in d&&(c[k[h]]=d[h]);for(;"*"===j[0];)j.shift(),f===b&&(f=a.mimeType||c.getResponseHeader("Content-Type"));if(f)for(h in i)if(i[h]&&i[h].test(f)){j.unshift(h);break}if(j[0]in d)g=j[0];else{for(h in d){if(!j[0]||a.converters[h+" "+j[0]]){g=h;break}e||(e=h)}g=g||e}return g?(g!==j[0]&&j.unshift(g),d[g]):void 0}function I(a,b){var c,d,e,f,g={},h=0,i=a.dataTypes.slice(),j=i[0];if(a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i[1])for(e in a.converters)g[e.toLowerCase()]=a.converters[e];for(;d=i[++h];)if("*"!==d){if("*"!==j&&j!==d){if(e=g[j+" "+d]||g["* "+d],!e)for(c in g)if(f=c.split(" "),f[1]===d&&(e=g[j+" "+f[0]]||g["* "+f[0]])){e===!0?e=g[c]:g[c]!==!0&&(d=f[0],i.splice(h--,0,d));break}if(e!==!0)if(e&&a["throws"])b=e(b);else try{b=e(b)}catch(k){return{state:"parsererror",error:e?k:"No conversion from "+j+" to "+d}}}j=d}return{state:"success",data:b}}function J(){try{return new a.XMLHttpRequest}catch(b){}}function K(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function L(){return setTimeout(function(){$c=b}),$c=ib.now()}function M(a,b){ib.each(b,function(b,c){for(var d=(ed[b]||[]).concat(ed["*"]),e=0,f=d.length;f>e;e++)if(d[e].call(a,b,c))return})}function N(a,b,c){var d,e,f=0,g=dd.length,h=ib.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$c||L(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:ib.extend({},b),opts:ib.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$c||L(),duration:c.duration,tweens:[],createTween:function(b,c){var d=ib.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(O(k,j.opts.specialEasing);g>f;f++)if(d=dd[f].call(j,a,k,j.opts))return d;return M(j,k),ib.isFunction(j.opts.start)&&j.opts.start.call(a,j),ib.fx.timer(ib.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}function O(a,b){var c,d,e,f,g;for(e in a)if(d=ib.camelCase(e),f=b[d],c=a[e],ib.isArray(c)&&(f=c[1],c=a[e]=c[0]),e!==d&&(a[d]=c,delete a[e]),g=ib.cssHooks[d],g&&"expand"in g){c=g.expand(c),delete a[d];for(e in c)e in a||(a[e]=c[e],b[e]=f)}else b[d]=f}function P(a,b,c){var d,e,f,g,h,i,j,k,l,m=this,n=a.style,o={},p=[],q=a.nodeType&&w(a);c.queue||(k=ib._queueHooks(a,"fx"),null==k.unqueued&&(k.unqueued=0,l=k.empty.fire,k.empty.fire=function(){k.unqueued||l()}),k.unqueued++,m.always(function(){m.always(function(){k.unqueued--,ib.queue(a,"fx").length||k.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[n.overflow,n.overflowX,n.overflowY],"inline"===ib.css(a,"display")&&"none"===ib.css(a,"float")&&(ib.support.inlineBlockNeedsLayout&&"inline"!==B(a.nodeName)?n.zoom=1:n.display="inline-block")),c.overflow&&(n.overflow="hidden",ib.support.shrinkWrapBlocks||m.always(function(){n.overflow=c.overflow[0],n.overflowX=c.overflow[1],n.overflowY=c.overflow[2]}));for(e in b)if(g=b[e],ad.exec(g)){if(delete b[e],i=i||"toggle"===g,g===(q?"hide":"show"))continue;p.push(e)}if(f=p.length){h=ib._data(a,"fxshow")||ib._data(a,"fxshow",{}),"hidden"in h&&(q=h.hidden),i&&(h.hidden=!q),q?ib(a).show():m.done(function(){ib(a).hide()}),m.done(function(){var b;ib._removeData(a,"fxshow");for(b in o)ib.style(a,b,o[b])});for(e=0;f>e;e++)d=p[e],j=m.createTween(d,q?h[d]:0),o[d]=h[d]||ib.style(a,d),d in h||(h[d]=j.start,q&&(j.end=j.start,j.start="width"===d||"height"===d?1:0))}}function Q(a,b,c,d,e){return new Q.prototype.init(a,b,c,d,e)}function R(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=xc[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function S(a){return ib.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}var T,U,V=typeof b,W=a.document,X=a.location,Y=a.jQuery,Z=a.$,$={},_=[],ab="1.9.1",bb=_.concat,cb=_.push,db=_.slice,eb=_.indexOf,fb=$.toString,gb=$.hasOwnProperty,hb=ab.trim,ib=function(a,b){return new ib.fn.init(a,b,U)},jb=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,kb=/\S+/g,lb=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,mb=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,nb=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,ob=/^[\],:{}\s]*$/,pb=/(?:^|:|,)(?:\s*\[)+/g,qb=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,rb=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,sb=/^-ms-/,tb=/-([\da-z])/gi,ub=function(a,b){return b.toUpperCase()},vb=function(a){(W.addEventListener||"load"===a.type||"complete"===W.readyState)&&(wb(),ib.ready())},wb=function(){W.addEventListener?(W.removeEventListener("DOMContentLoaded",vb,!1),a.removeEventListener("load",vb,!1)):(W.detachEvent("onreadystatechange",vb),a.detachEvent("onload",vb))};ib.fn=ib.prototype={jquery:ab,constructor:ib,init:function(a,c,d){var e,f;if(!a)return this;if("string"==typeof a){if(e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:mb.exec(a),!e||!e[1]&&c)return!c||c.jquery?(c||d).find(a):this.constructor(c).find(a);if(e[1]){if(c=c instanceof ib?c[0]:c,ib.merge(this,ib.parseHTML(e[1],c&&c.nodeType?c.ownerDocument||c:W,!0)),nb.test(e[1])&&ib.isPlainObject(c))for(e in c)ib.isFunction(this[e])?this[e](c[e]):this.attr(e,c[e]);return this}if(f=W.getElementById(e[2]),f&&f.parentNode){if(f.id!==e[2])return d.find(a);this.length=1,this[0]=f}return this.context=W,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):ib.isFunction(a)?d.ready(a):(a.selector!==b&&(this.selector=a.selector,this.context=a.context),ib.makeArray(a,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return db.call(this)},get:function(a){return null==a?this.toArray():0>a?this[this.length+a]:this[a]},pushStack:function(a){var b=ib.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return ib.each(this,a,b)},ready:function(a){return ib.ready.promise().done(a),this},slice:function(){return this.pushStack(db.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},map:function(a){return this.pushStack(ib.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:cb,sort:[].sort,splice:[].splice},ib.fn.init.prototype=ib.fn,ib.extend=ib.fn.extend=function(){var a,c,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;for("boolean"==typeof h&&(k=h,h=arguments[1]||{},i=2),"object"==typeof h||ib.isFunction(h)||(h={}),j===i&&(h=this,--i);j>i;i++)if(null!=(f=arguments[i]))for(e in f)a=h[e],d=f[e],h!==d&&(k&&d&&(ib.isPlainObject(d)||(c=ib.isArray(d)))?(c?(c=!1,g=a&&ib.isArray(a)?a:[]):g=a&&ib.isPlainObject(a)?a:{},h[e]=ib.extend(k,g,d)):d!==b&&(h[e]=d));return h},ib.extend({noConflict:function(b){return a.$===ib&&(a.$=Z),b&&a.jQuery===ib&&(a.jQuery=Y),ib},isReady:!1,readyWait:1,holdReady:function(a){a?ib.readyWait++:ib.ready(!0)},ready:function(a){if(a===!0?!--ib.readyWait:!ib.isReady){if(!W.body)return setTimeout(ib.ready);ib.isReady=!0,a!==!0&&--ib.readyWait>0||(T.resolveWith(W,[ib]),ib.fn.trigger&&ib(W).trigger("ready").off("ready"))}},isFunction:function(a){return"function"===ib.type(a)},isArray:Array.isArray||function(a){return"array"===ib.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return null==a?String(a):"object"==typeof a||"function"==typeof a?$[fb.call(a)]||"object":typeof a},isPlainObject:function(a){if(!a||"object"!==ib.type(a)||a.nodeType||ib.isWindow(a))return!1;try{if(a.constructor&&!gb.call(a,"constructor")&&!gb.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||gb.call(a,d)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},error:function(a){throw new Error(a)},parseHTML:function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||W;var d=nb.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=ib.buildFragment([a],b,e),e&&ib(e).remove(),ib.merge([],d.childNodes))},parseJSON:function(b){return a.JSON&&a.JSON.parse?a.JSON.parse(b):null===b?b:"string"==typeof b&&(b=ib.trim(b),b&&ob.test(b.replace(qb,"@").replace(rb,"]").replace(pb,"")))?new Function("return "+b)():void ib.error("Invalid JSON: "+b)},parseXML:function(c){var d,e;if(!c||"string"!=typeof c)return null;try{a.DOMParser?(e=new DOMParser,d=e.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(f){d=b}return d&&d.documentElement&&!d.getElementsByTagName("parsererror").length||ib.error("Invalid XML: "+c),d},noop:function(){},globalEval:function(b){b&&ib.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(sb,"ms-").replace(tb,ub)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,d){var e,f=0,g=a.length,h=c(a);if(d){if(h)for(;g>f&&(e=b.apply(a[f],d),e!==!1);f++);else for(f in a)if(e=b.apply(a[f],d),e===!1)break}else if(h)for(;g>f&&(e=b.call(a[f],f,a[f]),e!==!1);f++);else for(f in a)if(e=b.call(a[f],f,a[f]),e===!1)break;return a},trim:hb&&!hb.call("﻿ ")?function(a){return null==a?"":hb.call(a)}:function(a){return null==a?"":(a+"").replace(lb,"")},makeArray:function(a,b){var d=b||[];return null!=a&&(c(Object(a))?ib.merge(d,"string"==typeof a?[a]:a):cb.call(d,a)),d},inArray:function(a,b,c){var d;if(b){if(eb)return eb.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=c.length,e=a.length,f=0;if("number"==typeof d)for(;d>f;f++)a[e++]=c[f];else for(;c[f]!==b;)a[e++]=c[f++];return a.length=e,a},grep:function(a,b,c){var d,e=[],f=0,g=a.length;for(c=!!c;g>f;f++)d=!!b(a[f],f),c!==d&&e.push(a[f]);return e},map:function(a,b,d){var e,f=0,g=a.length,h=c(a),i=[];if(h)for(;g>f;f++)e=b(a[f],f,d),null!=e&&(i[i.length]=e);else for(f in a)e=b(a[f],f,d),null!=e&&(i[i.length]=e);return bb.apply([],i)},guid:1,proxy:function(a,c){var d,e,f;return"string"==typeof c&&(f=a[c],c=a,a=f),ib.isFunction(a)?(d=db.call(arguments,2),e=function(){return a.apply(c||this,d.concat(db.call(arguments)))},e.guid=a.guid=a.guid||ib.guid++,e):b},access:function(a,c,d,e,f,g,h){var i=0,j=a.length,k=null==d;if("object"===ib.type(d)){f=!0;for(i in d)ib.access(a,c,i,d[i],!0,g,h)}else if(e!==b&&(f=!0,ib.isFunction(e)||(h=!0),k&&(h?(c.call(a,e),c=null):(k=c,c=function(a,b,c){return k.call(ib(a),c)})),c))for(;j>i;i++)c(a[i],d,h?e:e.call(a[i],i,c(a[i],d)));return f?a:k?c.call(a):j?c(a[0],d):g},now:function(){return(new Date).getTime()}}),ib.ready.promise=function(b){if(!T)if(T=ib.Deferred(),"complete"===W.readyState)setTimeout(ib.ready);else if(W.addEventListener)W.addEventListener("DOMContentLoaded",vb,!1),a.addEventListener("load",vb,!1);else{W.attachEvent("onreadystatechange",vb),a.attachEvent("onload",vb);var c=!1;try{c=null==a.frameElement&&W.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!ib.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}wb(),ib.ready()}}()}return T.promise(b)},ib.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){$["[object "+b+"]"]=b.toLowerCase()}),U=ib(W);var xb={};ib.Callbacks=function(a){a="string"==typeof a?xb[a]||d(a):ib.extend({},a);var c,e,f,g,h,i,j=[],k=!a.once&&[],l=function(b){for(e=a.memory&&b,f=!0,h=i||0,i=0,g=j.length,c=!0;j&&g>h;h++)if(j[h].apply(b[0],b[1])===!1&&a.stopOnFalse){e=!1;break}c=!1,j&&(k?k.length&&l(k.shift()):e?j=[]:m.disable())},m={add:function(){if(j){var b=j.length;!function d(b){ib.each(b,function(b,c){var e=ib.type(c);"function"===e?a.unique&&m.has(c)||j.push(c):c&&c.length&&"string"!==e&&d(c)})}(arguments),c?g=j.length:e&&(i=b,l(e))}return this},remove:function(){return j&&ib.each(arguments,function(a,b){for(var d;(d=ib.inArray(b,j,d))>-1;)j.splice(d,1),c&&(g>=d&&g--,h>=d&&h--)}),this},has:function(a){return a?ib.inArray(a,j)>-1:!(!j||!j.length)},empty:function(){return j=[],this},disable:function(){return j=k=e=b,this},disabled:function(){return!j},lock:function(){return k=b,e||m.disable(),this},locked:function(){return!k},fireWith:function(a,b){return b=b||[],b=[a,b.slice?b.slice():b],!j||f&&!k||(c?k.push(b):l(b)),this},fire:function(){return m.fireWith(this,arguments),this},fired:function(){return!!f}};return m},ib.extend({Deferred:function(a){var b=[["resolve","done",ib.Callbacks("once memory"),"resolved"],["reject","fail",ib.Callbacks("once memory"),"rejected"],["notify","progress",ib.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return ib.Deferred(function(c){ib.each(b,function(b,f){var g=f[0],h=ib.isFunction(a[b])&&a[b];e[f[1]](function(){var a=h&&h.apply(this,arguments);a&&ib.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[g+"With"](this===d?c.promise():this,h?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?ib.extend(a,d):d}},e={};return d.pipe=d.then,ib.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b,c,d,e=0,f=db.call(arguments),g=f.length,h=1!==g||a&&ib.isFunction(a.promise)?g:0,i=1===h?a:ib.Deferred(),j=function(a,c,d){return function(e){c[a]=this,d[a]=arguments.length>1?db.call(arguments):e,d===b?i.notifyWith(c,d):--h||i.resolveWith(c,d)}};if(g>1)for(b=new Array(g),c=new Array(g),d=new Array(g);g>e;e++)f[e]&&ib.isFunction(f[e].promise)?f[e].promise().done(j(e,d,f)).fail(i.reject).progress(j(e,c,b)):--h;return h||i.resolveWith(d,f),i.promise()}}),ib.support=function(){var b,c,d,e,f,g,h,i,j,k,l=W.createElement("div");if(l.setAttribute("className","t"),l.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",c=l.getElementsByTagName("*"),d=l.getElementsByTagName("a")[0],!c||!d||!c.length)return{};f=W.createElement("select"),h=f.appendChild(W.createElement("option")),e=l.getElementsByTagName("input")[0],d.style.cssText="top:1px;float:left;opacity:.5",b={getSetAttribute:"t"!==l.className,leadingWhitespace:3===l.firstChild.nodeType,tbody:!l.getElementsByTagName("tbody").length,htmlSerialize:!!l.getElementsByTagName("link").length,style:/top/.test(d.getAttribute("style")),hrefNormalized:"/a"===d.getAttribute("href"),opacity:/^0.5/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:!!e.value,optSelected:h.selected,enctype:!!W.createElement("form").enctype,html5Clone:"<:nav></:nav>"!==W.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===W.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},e.checked=!0,b.noCloneChecked=e.cloneNode(!0).checked,f.disabled=!0,b.optDisabled=!h.disabled;try{delete l.test}catch(m){b.deleteExpando=!1}e=W.createElement("input"),e.setAttribute("value",""),b.input=""===e.getAttribute("value"),e.value="t",e.setAttribute("type","radio"),b.radioValue="t"===e.value,e.setAttribute("checked","t"),e.setAttribute("name","t"),g=W.createDocumentFragment(),g.appendChild(e),b.appendChecked=e.checked,b.checkClone=g.cloneNode(!0).cloneNode(!0).lastChild.checked,l.attachEvent&&(l.attachEvent("onclick",function(){b.noCloneEvent=!1}),l.cloneNode(!0).click());for(k in{submit:!0,change:!0,focusin:!0})l.setAttribute(i="on"+k,"t"),b[k+"Bubbles"]=i in a||l.attributes[i].expando===!1;return l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",b.clearCloneStyle="content-box"===l.style.backgroundClip,ib(function(){var c,d,e,f="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",g=W.getElementsByTagName("body")[0];g&&(c=W.createElement("div"),c.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",g.appendChild(c).appendChild(l),l.innerHTML="<table><tr><td></td><td>t</td></tr></table>",e=l.getElementsByTagName("td"),e[0].style.cssText="padding:0;margin:0;border:0;display:none",j=0===e[0].offsetHeight,e[0].style.display="",e[1].style.display="none",b.reliableHiddenOffsets=j&&0===e[0].offsetHeight,l.innerHTML="",l.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",b.boxSizing=4===l.offsetWidth,b.doesNotIncludeMarginInBodyOffset=1!==g.offsetTop,a.getComputedStyle&&(b.pixelPosition="1%"!==(a.getComputedStyle(l,null)||{}).top,b.boxSizingReliable="4px"===(a.getComputedStyle(l,null)||{width:"4px"}).width,d=l.appendChild(W.createElement("div")),d.style.cssText=l.style.cssText=f,d.style.marginRight=d.style.width="0",l.style.width="1px",b.reliableMarginRight=!parseFloat((a.getComputedStyle(d,null)||{}).marginRight)),typeof l.style.zoom!==V&&(l.innerHTML="",l.style.cssText=f+"width:1px;padding:1px;display:inline;zoom:1",b.inlineBlockNeedsLayout=3===l.offsetWidth,l.style.display="block",l.innerHTML="<div></div>",l.firstChild.style.width="5px",b.shrinkWrapBlocks=3!==l.offsetWidth,b.inlineBlockNeedsLayout&&(g.style.zoom=1)),g.removeChild(c),c=l=e=d=null)}),c=f=g=h=d=e=null,b}();var yb=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,zb=/([A-Z])/g;ib.extend({cache:{},expando:"jQuery"+(ab+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){return a=a.nodeType?ib.cache[a[ib.expando]]:a[ib.expando],!!a&&!h(a)},data:function(a,b,c){return e(a,b,c)},removeData:function(a,b){return f(a,b)},_data:function(a,b,c){return e(a,b,c,!0)},_removeData:function(a,b){return f(a,b,!0)},acceptData:function(a){if(a.nodeType&&1!==a.nodeType&&9!==a.nodeType)return!1;var b=a.nodeName&&ib.noData[a.nodeName.toLowerCase()];return!b||b!==!0&&a.getAttribute("classid")===b}}),ib.fn.extend({data:function(a,c){var d,e,f=this[0],h=0,i=null;if(a===b){if(this.length&&(i=ib.data(f),1===f.nodeType&&!ib._data(f,"parsedAttrs"))){for(d=f.attributes;h<d.length;h++)e=d[h].name,e.indexOf("data-")||(e=ib.camelCase(e.slice(5)),g(f,e,i[e]));ib._data(f,"parsedAttrs",!0)}return i}return"object"==typeof a?this.each(function(){ib.data(this,a)}):ib.access(this,function(c){return c===b?f?g(f,a,ib.data(f,a)):null:void this.each(function(){ib.data(this,a,c)})},null,c,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){ib.removeData(this,a)})}}),ib.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=ib._data(a,b),c&&(!d||ib.isArray(c)?d=ib._data(a,b,ib.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=ib.queue(a,b),d=c.length,e=c.shift(),f=ib._queueHooks(a,b),g=function(){ib.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),f.cur=e,e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return ib._data(a,c)||ib._data(a,c,{empty:ib.Callbacks("once memory").add(function(){ib._removeData(a,b+"queue"),ib._removeData(a,c)})})}}),ib.fn.extend({queue:function(a,c){var d=2;return"string"!=typeof a&&(c=a,a="fx",d--),arguments.length<d?ib.queue(this[0],a):c===b?this:this.each(function(){var b=ib.queue(this,a,c);ib._queueHooks(this,a),"fx"===a&&"inprogress"!==b[0]&&ib.dequeue(this,a)})},dequeue:function(a){return this.each(function(){ib.dequeue(this,a)})},delay:function(a,b){return a=ib.fx?ib.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){var d,e=1,f=ib.Deferred(),g=this,h=this.length,i=function(){--e||f.resolveWith(g,[g])};for("string"!=typeof a&&(c=a,a=b),a=a||"fx";h--;)d=ib._data(g[h],a+"queueHooks"),d&&d.empty&&(e++,d.empty.add(i));return i(),f.promise(c)}});var Ab,Bb,Cb=/[\t\r\n]/g,Db=/\r/g,Eb=/^(?:input|select|textarea|button|object)$/i,Fb=/^(?:a|area)$/i,Gb=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,Hb=/^(?:checked|selected)$/i,Ib=ib.support.getSetAttribute,Jb=ib.support.input;ib.fn.extend({attr:function(a,b){return ib.access(this,ib.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){ib.removeAttr(this,a)})},prop:function(a,b){return ib.access(this,ib.prop,a,b,arguments.length>1)},removeProp:function(a){return a=ib.propFix[a]||a,this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,f,g=0,h=this.length,i="string"==typeof a&&a;if(ib.isFunction(a))return this.each(function(b){ib(this).addClass(a.call(this,b,this.className))});if(i)for(b=(a||"").match(kb)||[];h>g;g++)if(c=this[g],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(Cb," "):" ")){for(f=0;e=b[f++];)d.indexOf(" "+e+" ")<0&&(d+=e+" ");c.className=ib.trim(d)}return this},removeClass:function(a){var b,c,d,e,f,g=0,h=this.length,i=0===arguments.length||"string"==typeof a&&a;if(ib.isFunction(a))return this.each(function(b){ib(this).removeClass(a.call(this,b,this.className))});if(i)for(b=(a||"").match(kb)||[];h>g;g++)if(c=this[g],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(Cb," "):"")){for(f=0;e=b[f++];)for(;d.indexOf(" "+e+" ")>=0;)d=d.replace(" "+e+" "," ");c.className=a?ib.trim(d):""}return this},toggleClass:function(a,b){var c=typeof a,d="boolean"==typeof b;return this.each(ib.isFunction(a)?function(c){ib(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c)for(var e,f=0,g=ib(this),h=b,i=a.match(kb)||[];e=i[f++];)h=d?h:!g.hasClass(e),g[h?"addClass":"removeClass"](e);else(c===V||"boolean"===c)&&(this.className&&ib._data(this,"__className__",this.className),this.className=this.className||a===!1?"":ib._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(Cb," ").indexOf(b)>=0)return!0;return!1},val:function(a){var c,d,e,f=this[0];{if(arguments.length)return e=ib.isFunction(a),this.each(function(c){var f,g=ib(this);1===this.nodeType&&(f=e?a.call(this,c,g.val()):a,null==f?f="":"number"==typeof f?f+="":ib.isArray(f)&&(f=ib.map(f,function(a){return null==a?"":a+""})),d=ib.valHooks[this.type]||ib.valHooks[this.nodeName.toLowerCase()],d&&"set"in d&&d.set(this,f,"value")!==b||(this.value=f))});if(f)return d=ib.valHooks[f.type]||ib.valHooks[f.nodeName.toLowerCase()],d&&"get"in d&&(c=d.get(f,"value"))!==b?c:(c=f.value,"string"==typeof c?c.replace(Db,""):null==c?"":c)}}}),ib.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(ib.support.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&ib.nodeName(c.parentNode,"optgroup"))){if(b=ib(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c=ib.makeArray(b);return ib(a).find("option").each(function(){this.selected=ib.inArray(ib(this).val(),c)>=0}),c.length||(a.selectedIndex=-1),c}}},attr:function(a,c,d){var e,f,g,h=a.nodeType;if(a&&3!==h&&8!==h&&2!==h)return typeof a.getAttribute===V?ib.prop(a,c,d):(f=1!==h||!ib.isXMLDoc(a),f&&(c=c.toLowerCase(),e=ib.attrHooks[c]||(Gb.test(c)?Bb:Ab)),d===b?e&&f&&"get"in e&&null!==(g=e.get(a,c))?g:(typeof a.getAttribute!==V&&(g=a.getAttribute(c)),null==g?b:g):null!==d?e&&f&&"set"in e&&(g=e.set(a,d,c))!==b?g:(a.setAttribute(c,d+""),d):void ib.removeAttr(a,c))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(kb);if(f&&1===a.nodeType)for(;c=f[e++];)d=ib.propFix[c]||c,Gb.test(c)?!Ib&&Hb.test(c)?a[ib.camelCase("default-"+c)]=a[d]=!1:a[d]=!1:ib.attr(a,c,""),a.removeAttribute(Ib?c:d)},attrHooks:{type:{set:function(a,b){if(!ib.support.radioValue&&"radio"===b&&ib.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,f,g,h=a.nodeType;if(a&&3!==h&&8!==h&&2!==h)return g=1!==h||!ib.isXMLDoc(a),g&&(c=ib.propFix[c]||c,f=ib.propHooks[c]),d!==b?f&&"set"in f&&(e=f.set(a,d,c))!==b?e:a[c]=d:f&&"get"in f&&null!==(e=f.get(a,c))?e:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):Eb.test(a.nodeName)||Fb.test(a.nodeName)&&a.href?0:b}}}}),Bb={get:function(a,c){var d=ib.prop(a,c),e="boolean"==typeof d&&a.getAttribute(c),f="boolean"==typeof d?Jb&&Ib?null!=e:Hb.test(c)?a[ib.camelCase("default-"+c)]:!!e:a.getAttributeNode(c);return f&&f.value!==!1?c.toLowerCase():b
-},set:function(a,b,c){return b===!1?ib.removeAttr(a,c):Jb&&Ib||!Hb.test(c)?a.setAttribute(!Ib&&ib.propFix[c]||c,c):a[ib.camelCase("default-"+c)]=a[c]=!0,c}},Jb&&Ib||(ib.attrHooks.value={get:function(a,c){var d=a.getAttributeNode(c);return ib.nodeName(a,"input")?a.defaultValue:d&&d.specified?d.value:b},set:function(a,b,c){return ib.nodeName(a,"input")?void(a.defaultValue=b):Ab&&Ab.set(a,b,c)}}),Ib||(Ab=ib.valHooks.button={get:function(a,c){var d=a.getAttributeNode(c);return d&&("id"===c||"name"===c||"coords"===c?""!==d.value:d.specified)?d.value:b},set:function(a,c,d){var e=a.getAttributeNode(d);return e||a.setAttributeNode(e=a.ownerDocument.createAttribute(d)),e.value=c+="","value"===d||c===a.getAttribute(d)?c:b}},ib.attrHooks.contenteditable={get:Ab.get,set:function(a,b,c){Ab.set(a,""===b?!1:b,c)}},ib.each(["width","height"],function(a,b){ib.attrHooks[b]=ib.extend(ib.attrHooks[b],{set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}})})),ib.support.hrefNormalized||(ib.each(["href","src","width","height"],function(a,c){ib.attrHooks[c]=ib.extend(ib.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return null==d?b:d}})}),ib.each(["href","src"],function(a,b){ib.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}})),ib.support.style||(ib.attrHooks.style={get:function(a){return a.style.cssText||b},set:function(a,b){return a.style.cssText=b+""}}),ib.support.optSelected||(ib.propHooks.selected=ib.extend(ib.propHooks.selected,{get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}})),ib.support.enctype||(ib.propFix.enctype="encoding"),ib.support.checkOn||ib.each(["radio","checkbox"],function(){ib.valHooks[this]={get:function(a){return null===a.getAttribute("value")?"on":a.value}}}),ib.each(["radio","checkbox"],function(){ib.valHooks[this]=ib.extend(ib.valHooks[this],{set:function(a,b){return ib.isArray(b)?a.checked=ib.inArray(ib(a).val(),b)>=0:void 0}})});var Kb=/^(?:input|select|textarea)$/i,Lb=/^key/,Mb=/^(?:mouse|contextmenu)|click/,Nb=/^(?:focusinfocus|focusoutblur)$/,Ob=/^([^.]*)(?:\.(.+)|)$/;ib.event={global:{},add:function(a,c,d,e,f){var g,h,i,j,k,l,m,n,o,p,q,r=ib._data(a);if(r){for(d.handler&&(j=d,d=j.handler,f=j.selector),d.guid||(d.guid=ib.guid++),(h=r.events)||(h=r.events={}),(l=r.handle)||(l=r.handle=function(a){return typeof ib===V||a&&ib.event.triggered===a.type?b:ib.event.dispatch.apply(l.elem,arguments)},l.elem=a),c=(c||"").match(kb)||[""],i=c.length;i--;)g=Ob.exec(c[i])||[],o=q=g[1],p=(g[2]||"").split(".").sort(),k=ib.event.special[o]||{},o=(f?k.delegateType:k.bindType)||o,k=ib.event.special[o]||{},m=ib.extend({type:o,origType:q,data:e,handler:d,guid:d.guid,selector:f,needsContext:f&&ib.expr.match.needsContext.test(f),namespace:p.join(".")},j),(n=h[o])||(n=h[o]=[],n.delegateCount=0,k.setup&&k.setup.call(a,e,p,l)!==!1||(a.addEventListener?a.addEventListener(o,l,!1):a.attachEvent&&a.attachEvent("on"+o,l))),k.add&&(k.add.call(a,m),m.handler.guid||(m.handler.guid=d.guid)),f?n.splice(n.delegateCount++,0,m):n.push(m),ib.event.global[o]=!0;a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=ib.hasData(a)&&ib._data(a);if(q&&(k=q.events)){for(b=(b||"").match(kb)||[""],j=b.length;j--;)if(h=Ob.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){for(l=ib.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=k[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;f--;)g=m[f],!e&&p!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||ib.removeEvent(a,n,q.handle),delete k[n])}else for(n in k)ib.event.remove(a,n+b[j],c,d,!0);ib.isEmptyObject(k)&&(delete q.handle,ib._removeData(a,"events"))}},trigger:function(c,d,e,f){var g,h,i,j,k,l,m,n=[e||W],o=gb.call(c,"type")?c.type:c,p=gb.call(c,"namespace")?c.namespace.split("."):[];if(i=l=e=e||W,3!==e.nodeType&&8!==e.nodeType&&!Nb.test(o+ib.event.triggered)&&(o.indexOf(".")>=0&&(p=o.split("."),o=p.shift(),p.sort()),h=o.indexOf(":")<0&&"on"+o,c=c[ib.expando]?c:new ib.Event(o,"object"==typeof c&&c),c.isTrigger=!0,c.namespace=p.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,c.result=b,c.target||(c.target=e),d=null==d?[c]:ib.makeArray(d,[c]),k=ib.event.special[o]||{},f||!k.trigger||k.trigger.apply(e,d)!==!1)){if(!f&&!k.noBubble&&!ib.isWindow(e)){for(j=k.delegateType||o,Nb.test(j+o)||(i=i.parentNode);i;i=i.parentNode)n.push(i),l=i;l===(e.ownerDocument||W)&&n.push(l.defaultView||l.parentWindow||a)}for(m=0;(i=n[m++])&&!c.isPropagationStopped();)c.type=m>1?j:k.bindType||o,g=(ib._data(i,"events")||{})[c.type]&&ib._data(i,"handle"),g&&g.apply(i,d),g=h&&i[h],g&&ib.acceptData(i)&&g.apply&&g.apply(i,d)===!1&&c.preventDefault();if(c.type=o,!(f||c.isDefaultPrevented()||k._default&&k._default.apply(e.ownerDocument,d)!==!1||"click"===o&&ib.nodeName(e,"a")||!ib.acceptData(e)||!h||!e[o]||ib.isWindow(e))){l=e[h],l&&(e[h]=null),ib.event.triggered=o;try{e[o]()}catch(q){}ib.event.triggered=b,l&&(e[h]=l)}return c.result}},dispatch:function(a){a=ib.event.fix(a);var c,d,e,f,g,h=[],i=db.call(arguments),j=(ib._data(this,"events")||{})[a.type]||[],k=ib.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){for(h=ib.event.handlers.call(this,a,j),c=0;(f=h[c++])&&!a.isPropagationStopped();)for(a.currentTarget=f.elem,g=0;(e=f.handlers[g++])&&!a.isImmediatePropagationStopped();)(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,d=((ib.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),d!==b&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()));return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,c){var d,e,f,g,h=[],i=c.delegateCount,j=a.target;if(i&&j.nodeType&&(!a.button||"click"!==a.type))for(;j!=this;j=j.parentNode||this)if(1===j.nodeType&&(j.disabled!==!0||"click"!==a.type)){for(f=[],g=0;i>g;g++)e=c[g],d=e.selector+" ",f[d]===b&&(f[d]=e.needsContext?ib(d,this).index(j)>=0:ib.find(d,this,null,[j]).length),f[d]&&f.push(e);f.length&&h.push({elem:j,handlers:f})}return i<c.length&&h.push({elem:this,handlers:c.slice(i)}),h},fix:function(a){if(a[ib.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];for(g||(this.fixHooks[e]=g=Mb.test(e)?this.mouseHooks:Lb.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new ib.Event(f),b=d.length;b--;)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||W),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,c){var d,e,f,g=c.button,h=c.fromElement;return null==a.pageX&&null!=c.clientX&&(e=a.target.ownerDocument||W,f=e.documentElement,d=e.body,a.pageX=c.clientX+(f&&f.scrollLeft||d&&d.scrollLeft||0)-(f&&f.clientLeft||d&&d.clientLeft||0),a.pageY=c.clientY+(f&&f.scrollTop||d&&d.scrollTop||0)-(f&&f.clientTop||d&&d.clientTop||0)),!a.relatedTarget&&h&&(a.relatedTarget=h===a.target?c.toElement:h),a.which||g===b||(a.which=1&g?1:2&g?3:4&g?2:0),a}},special:{load:{noBubble:!0},click:{trigger:function(){return ib.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0}},focus:{trigger:function(){if(this!==W.activeElement&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===W.activeElement&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},beforeunload:{postDispatch:function(a){a.result!==b&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=ib.extend(new ib.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?ib.event.trigger(e,null,b):ib.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},ib.removeEvent=W.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===V&&(a[d]=null),a.detachEvent(d,c))},ib.Event=function(a,b){return this instanceof ib.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?i:j):this.type=a,b&&ib.extend(this,b),this.timeStamp=a&&a.timeStamp||ib.now(),void(this[ib.expando]=!0)):new ib.Event(a,b)},ib.Event.prototype={isDefaultPrevented:j,isPropagationStopped:j,isImmediatePropagationStopped:j,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=i,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=i,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=i,this.stopPropagation()}},ib.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){ib.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!ib.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),ib.support.submitBubbles||(ib.event.special.submit={setup:function(){return ib.nodeName(this,"form")?!1:void ib.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=ib.nodeName(c,"input")||ib.nodeName(c,"button")?c.form:b;d&&!ib._data(d,"submitBubbles")&&(ib.event.add(d,"submit._submit",function(a){a._submit_bubble=!0}),ib._data(d,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&ib.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return ib.nodeName(this,"form")?!1:void ib.event.remove(this,"._submit")}}),ib.support.changeBubbles||(ib.event.special.change={setup:function(){return Kb.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(ib.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),ib.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),ib.event.simulate("change",this,a,!0)})),!1):void ib.event.add(this,"beforeactivate._change",function(a){var b=a.target;Kb.test(b.nodeName)&&!ib._data(b,"changeBubbles")&&(ib.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||ib.event.simulate("change",this.parentNode,a,!0)}),ib._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return ib.event.remove(this,"._change"),!Kb.test(this.nodeName)}}),ib.support.focusinBubbles||ib.each({focus:"focusin",blur:"focusout"},function(a,b){var c=0,d=function(a){ib.event.simulate(b,a.target,ib.event.fix(a),!0)};ib.event.special[b]={setup:function(){0===c++&&W.addEventListener(a,d,!0)},teardown:function(){0===--c&&W.removeEventListener(a,d,!0)}}}),ib.fn.extend({on:function(a,c,d,e,f){var g,h;if("object"==typeof a){"string"!=typeof c&&(d=d||c,c=b);for(g in a)this.on(g,c,d,a[g],f);return this}if(null==d&&null==e?(e=c,d=c=b):null==e&&("string"==typeof c?(e=d,d=b):(e=d,d=c,c=b)),e===!1)e=j;else if(!e)return this;return 1===f&&(h=e,e=function(a){return ib().off(a),h.apply(this,arguments)},e.guid=h.guid||(h.guid=ib.guid++)),this.each(function(){ib.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,c,d){var e,f;if(a&&a.preventDefault&&a.handleObj)return e=a.handleObj,ib(a.delegateTarget).off(e.namespace?e.origType+"."+e.namespace:e.origType,e.selector,e.handler),this;if("object"==typeof a){for(f in a)this.off(f,c,a[f]);return this}return(c===!1||"function"==typeof c)&&(d=c,c=b),d===!1&&(d=j),this.each(function(){ib.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)},trigger:function(a,b){return this.each(function(){ib.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?ib.event.trigger(a,b,c,!0):void 0}}),function(a,b){function c(a){return ob.test(a+"")}function d(){var a,b=[];return a=function(c,d){return b.push(c+=" ")>y.cacheLength&&delete a[b.shift()],a[c]=d}}function e(a){return a[N]=!0,a}function f(a){var b=F.createElement("div");try{return a(b)}catch(c){return!1}finally{b=null}}function g(a,b,c,d){var e,f,g,h,i,j,k,n,o,p;if((b?b.ownerDocument||b:O)!==F&&E(b),b=b||F,c=c||[],!a||"string"!=typeof a)return c;if(1!==(h=b.nodeType)&&9!==h)return[];if(!H&&!d){if(e=pb.exec(a))if(g=e[1]){if(9===h){if(f=b.getElementById(g),!f||!f.parentNode)return c;if(f.id===g)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(g))&&L(b,f)&&f.id===g)return c.push(f),c}else{if(e[2])return Z.apply(c,$.call(b.getElementsByTagName(a),0)),c;if((g=e[3])&&P.getByClassName&&b.getElementsByClassName)return Z.apply(c,$.call(b.getElementsByClassName(g),0)),c}if(P.qsa&&!I.test(a)){if(k=!0,n=N,o=b,p=9===h&&a,1===h&&"object"!==b.nodeName.toLowerCase()){for(j=l(a),(k=b.getAttribute("id"))?n=k.replace(sb,"\\$&"):b.setAttribute("id",n),n="[id='"+n+"'] ",i=j.length;i--;)j[i]=n+m(j[i]);o=nb.test(a)&&b.parentNode||b,p=j.join(",")}if(p)try{return Z.apply(c,$.call(o.querySelectorAll(p),0)),c}catch(q){}finally{k||b.removeAttribute("id")}}}return u(a.replace(gb,"$1"),b,c,d)}function h(a,b){var c=b&&a,d=c&&(~b.sourceIndex||W)-(~a.sourceIndex||W);if(d)return d;if(c)for(;c=c.nextSibling;)if(c===b)return-1;return a?1:-1}function i(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function j(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function k(a){return e(function(b){return b=+b,e(function(c,d){for(var e,f=a([],c.length,b),g=f.length;g--;)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function l(a,b){var c,d,e,f,h,i,j,k=T[a+" "];if(k)return b?0:k.slice(0);for(h=a,i=[],j=y.preFilter;h;){(!c||(d=hb.exec(h)))&&(d&&(h=h.slice(d[0].length)||h),i.push(e=[])),c=!1,(d=jb.exec(h))&&(c=d.shift(),e.push({value:c,type:d[0].replace(gb," ")}),h=h.slice(c.length));for(f in y.filter)!(d=mb[f].exec(h))||j[f]&&!(d=j[f](d))||(c=d.shift(),e.push({value:c,type:f,matches:d}),h=h.slice(c.length));if(!c)break}return b?h.length:h?g.error(a):T(a,i).slice(0)}function m(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function n(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=R++;return b.first?function(b,c,f){for(;b=b[d];)if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=Q+" "+f;if(g){for(;b=b[d];)if((1===b.nodeType||e)&&a(b,c,g))return!0}else for(;b=b[d];)if(1===b.nodeType||e)if(j=b[N]||(b[N]={}),(i=j[d])&&i[0]===k){if((h=i[1])===!0||h===x)return h===!0}else if(i=j[d]=[k],i[1]=a(b,c,g)||x,i[1]===!0)return!0}}function o(a){return a.length>1?function(b,c,d){for(var e=a.length;e--;)if(!a[e](b,c,d))return!1;return!0}:a[0]}function p(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function q(a,b,c,d,f,g){return d&&!d[N]&&(d=q(d)),f&&!f[N]&&(f=q(f,g)),e(function(e,g,h,i){var j,k,l,m=[],n=[],o=g.length,q=e||t(b||"*",h.nodeType?[h]:h,[]),r=!a||!e&&b?q:p(q,m,a,h,i),s=c?f||(e?a:o||d)?[]:g:r;if(c&&c(r,s,h,i),d)for(j=p(s,n),d(j,[],h,i),k=j.length;k--;)(l=j[k])&&(s[n[k]]=!(r[n[k]]=l));if(e){if(f||a){if(f){for(j=[],k=s.length;k--;)(l=s[k])&&j.push(r[k]=l);f(null,s=[],j,i)}for(k=s.length;k--;)(l=s[k])&&(j=f?_.call(e,l):m[k])>-1&&(e[j]=!(g[j]=l))}}else s=p(s===g?s.splice(o,s.length):s),f?f(null,g,s,i):Z.apply(g,s)})}function r(a){for(var b,c,d,e=a.length,f=y.relative[a[0].type],g=f||y.relative[" "],h=f?1:0,i=n(function(a){return a===b},g,!0),j=n(function(a){return _.call(b,a)>-1},g,!0),k=[function(a,c,d){return!f&&(d||c!==D)||((b=c).nodeType?i(a,c,d):j(a,c,d))}];e>h;h++)if(c=y.relative[a[h].type])k=[n(o(k),c)];else{if(c=y.filter[a[h].type].apply(null,a[h].matches),c[N]){for(d=++h;e>d&&!y.relative[a[d].type];d++);return q(h>1&&o(k),h>1&&m(a.slice(0,h-1)).replace(gb,"$1"),c,d>h&&r(a.slice(h,d)),e>d&&r(a=a.slice(d)),e>d&&m(a))}k.push(c)}return o(k)}function s(a,b){var c=0,d=b.length>0,f=a.length>0,h=function(e,h,i,j,k){var l,m,n,o=[],q=0,r="0",s=e&&[],t=null!=k,u=D,v=e||f&&y.find.TAG("*",k&&h.parentNode||h),w=Q+=null==u?1:Math.random()||.1;for(t&&(D=h!==F&&h,x=c);null!=(l=v[r]);r++){if(f&&l){for(m=0;n=a[m++];)if(n(l,h,i)){j.push(l);break}t&&(Q=w,x=++c)}d&&((l=!n&&l)&&q--,e&&s.push(l))}if(q+=r,d&&r!==q){for(m=0;n=b[m++];)n(s,o,h,i);if(e){if(q>0)for(;r--;)s[r]||o[r]||(o[r]=Y.call(j));o=p(o)}Z.apply(j,o),t&&!e&&o.length>0&&q+b.length>1&&g.uniqueSort(j)}return t&&(Q=w,D=u),s};return d?e(h):h}function t(a,b,c){for(var d=0,e=b.length;e>d;d++)g(a,b[d],c);return c}function u(a,b,c,d){var e,f,g,h,i,j=l(a);if(!d&&1===j.length){if(f=j[0]=j[0].slice(0),f.length>2&&"ID"===(g=f[0]).type&&9===b.nodeType&&!H&&y.relative[f[1].type]){if(b=y.find.ID(g.matches[0].replace(ub,vb),b)[0],!b)return c;a=a.slice(f.shift().value.length)}for(e=mb.needsContext.test(a)?0:f.length;e--&&(g=f[e],!y.relative[h=g.type]);)if((i=y.find[h])&&(d=i(g.matches[0].replace(ub,vb),nb.test(f[0].type)&&b.parentNode||b))){if(f.splice(e,1),a=d.length&&m(f),!a)return Z.apply(c,$.call(d,0)),c;break}}return B(a,j)(d,b,H,c,nb.test(a)),c}function v(){}var w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N="sizzle"+-new Date,O=a.document,P={},Q=0,R=0,S=d(),T=d(),U=d(),V=typeof b,W=1<<31,X=[],Y=X.pop,Z=X.push,$=X.slice,_=X.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},ab="[\\x20\\t\\r\\n\\f]",bb="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",cb=bb.replace("w","w#"),db="([*^$|!~]?=)",eb="\\["+ab+"*("+bb+")"+ab+"*(?:"+db+ab+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+cb+")|)|)"+ab+"*\\]",fb=":("+bb+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+eb.replace(3,8)+")*)|.*)\\)|)",gb=new RegExp("^"+ab+"+|((?:^|[^\\\\])(?:\\\\.)*)"+ab+"+$","g"),hb=new RegExp("^"+ab+"*,"+ab+"*"),jb=new RegExp("^"+ab+"*([\\x20\\t\\r\\n\\f>+~])"+ab+"*"),kb=new RegExp(fb),lb=new RegExp("^"+cb+"$"),mb={ID:new RegExp("^#("+bb+")"),CLASS:new RegExp("^\\.("+bb+")"),NAME:new RegExp("^\\[name=['\"]?("+bb+")['\"]?\\]"),TAG:new RegExp("^("+bb.replace("w","w*")+")"),ATTR:new RegExp("^"+eb),PSEUDO:new RegExp("^"+fb),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ab+"*(even|odd|(([+-]|)(\\d*)n|)"+ab+"*(?:([+-]|)"+ab+"*(\\d+)|))"+ab+"*\\)|)","i"),needsContext:new RegExp("^"+ab+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ab+"*((?:-\\d)?\\d*)"+ab+"*\\)|)(?=[^-]|$)","i")},nb=/[\x20\t\r\n\f]*[+~]/,ob=/^[^{]+\{\s*\[native code/,pb=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,qb=/^(?:input|select|textarea|button)$/i,rb=/^h\d$/i,sb=/'|\\/g,tb=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,ub=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,vb=function(a,b){var c="0x"+b-65536;return c!==c?b:0>c?String.fromCharCode(c+65536):String.fromCharCode(c>>10|55296,1023&c|56320)};try{$.call(O.documentElement.childNodes,0)[0].nodeType}catch(wb){$=function(a){for(var b,c=[];b=this[a++];)c.push(b);return c}}A=g.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},E=g.setDocument=function(a){var d=a?a.ownerDocument||a:O;return d!==F&&9===d.nodeType&&d.documentElement?(F=d,G=d.documentElement,H=A(d),P.tagNameNoComments=f(function(a){return a.appendChild(d.createComment("")),!a.getElementsByTagName("*").length}),P.attributes=f(function(a){a.innerHTML="<select></select>";var b=typeof a.lastChild.getAttribute("multiple");return"boolean"!==b&&"string"!==b}),P.getByClassName=f(function(a){return a.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",a.getElementsByClassName&&a.getElementsByClassName("e").length?(a.lastChild.className="e",2===a.getElementsByClassName("e").length):!1}),P.getByName=f(function(a){a.id=N+0,a.innerHTML="<a name='"+N+"'></a><div name='"+N+"'></div>",G.insertBefore(a,G.firstChild);var b=d.getElementsByName&&d.getElementsByName(N).length===2+d.getElementsByName(N+0).length;return P.getIdNotName=!d.getElementById(N),G.removeChild(a),b}),y.attrHandle=f(function(a){return a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!==V&&"#"===a.firstChild.getAttribute("href")})?{}:{href:function(a){return a.getAttribute("href",2)},type:function(a){return a.getAttribute("type")}},P.getIdNotName?(y.find.ID=function(a,b){if(typeof b.getElementById!==V&&!H){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},y.filter.ID=function(a){var b=a.replace(ub,vb);return function(a){return a.getAttribute("id")===b}}):(y.find.ID=function(a,c){if(typeof c.getElementById!==V&&!H){var d=c.getElementById(a);return d?d.id===a||typeof d.getAttributeNode!==V&&d.getAttributeNode("id").value===a?[d]:b:[]}},y.filter.ID=function(a){var b=a.replace(ub,vb);return function(a){var c=typeof a.getAttributeNode!==V&&a.getAttributeNode("id");return c&&c.value===b}}),y.find.TAG=P.tagNameNoComments?function(a,b){return typeof b.getElementsByTagName!==V?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){for(;c=f[e++];)1===c.nodeType&&d.push(c);return d}return f},y.find.NAME=P.getByName&&function(a,b){return typeof b.getElementsByName!==V?b.getElementsByName(name):void 0},y.find.CLASS=P.getByClassName&&function(a,b){return typeof b.getElementsByClassName===V||H?void 0:b.getElementsByClassName(a)},J=[],I=[":focus"],(P.qsa=c(d.querySelectorAll))&&(f(function(a){a.innerHTML="<select><option selected=''></option></select>",a.querySelectorAll("[selected]").length||I.push("\\["+ab+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),a.querySelectorAll(":checked").length||I.push(":checked")}),f(function(a){a.innerHTML="<input type='hidden' i=''/>",a.querySelectorAll("[i^='']").length&&I.push("[*^$]="+ab+"*(?:\"\"|'')"),a.querySelectorAll(":enabled").length||I.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),I.push(",.*:")})),(P.matchesSelector=c(K=G.matchesSelector||G.mozMatchesSelector||G.webkitMatchesSelector||G.oMatchesSelector||G.msMatchesSelector))&&f(function(a){P.disconnectedMatch=K.call(a,"div"),K.call(a,"[s!='']:x"),J.push("!=",fb)}),I=new RegExp(I.join("|")),J=new RegExp(J.join("|")),L=c(G.contains)||G.compareDocumentPosition?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)for(;b=b.parentNode;)if(b===a)return!0;return!1},M=G.compareDocumentPosition?function(a,b){var c;return a===b?(C=!0,0):(c=b.compareDocumentPosition&&a.compareDocumentPosition&&a.compareDocumentPosition(b))?1&c||a.parentNode&&11===a.parentNode.nodeType?a===d||L(O,a)?-1:b===d||L(O,b)?1:0:4&c?-1:1:a.compareDocumentPosition?-1:1}:function(a,b){var c,e=0,f=a.parentNode,g=b.parentNode,i=[a],j=[b];if(a===b)return C=!0,0;if(!f||!g)return a===d?-1:b===d?1:f?-1:g?1:0;if(f===g)return h(a,b);for(c=a;c=c.parentNode;)i.unshift(c);for(c=b;c=c.parentNode;)j.unshift(c);for(;i[e]===j[e];)e++;return e?h(i[e],j[e]):i[e]===O?-1:j[e]===O?1:0},C=!1,[0,0].sort(M),P.detectDuplicates=C,F):F},g.matches=function(a,b){return g(a,null,null,b)},g.matchesSelector=function(a,b){if((a.ownerDocument||a)!==F&&E(a),b=b.replace(tb,"='$1']"),!(!P.matchesSelector||H||J&&J.test(b)||I.test(b)))try{var c=K.call(a,b);if(c||P.disconnectedMatch||a.document&&11!==a.document.nodeType)return c}catch(d){}return g(b,F,null,[a]).length>0},g.contains=function(a,b){return(a.ownerDocument||a)!==F&&E(a),L(a,b)},g.attr=function(a,b){var c;return(a.ownerDocument||a)!==F&&E(a),H||(b=b.toLowerCase()),(c=y.attrHandle[b])?c(a):H||P.attributes?a.getAttribute(b):((c=a.getAttributeNode(b))||a.getAttribute(b))&&a[b]===!0?b:c&&c.specified?c.value:null},g.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},g.uniqueSort=function(a){var b,c=[],d=1,e=0;if(C=!P.detectDuplicates,a.sort(M),C){for(;b=a[d];d++)b===a[d-1]&&(e=c.push(d));for(;e--;)a.splice(c[e],1)}return a},z=g.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(1===e||9===e||11===e){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=z(a)}else if(3===e||4===e)return a.nodeValue}else for(;b=a[d];d++)c+=z(b);return c},y=g.selectors={cacheLength:50,createPseudo:e,match:mb,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ub,vb),a[3]=(a[4]||a[5]||"").replace(ub,vb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||g.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&g.error(a[0]),a},PSEUDO:function(a){var b,c=!a[5]&&a[2];return mb.CHILD.test(a[0])?null:(a[4]?a[2]=a[4]:c&&kb.test(c)&&(b=l(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){return"*"===a?function(){return!0}:(a=a.replace(ub,vb).toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=S[a+" "];return b||(b=new RegExp("(^|"+ab+")"+a+"("+ab+"|$)"))&&S(a,function(a){return b.test(a.className||typeof a.getAttribute!==V&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=g.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){for(;p;){for(l=b;l=l[p];)if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){for(k=q[N]||(q[N]={}),j=k[a]||[],n=j[0]===Q&&j[1],m=j[0]===Q&&j[2],l=n&&q.childNodes[n];l=++n&&l&&l[p]||(m=n=0)||o.pop();)if(1===l.nodeType&&++m&&l===b){k[a]=[Q,n,m];break}}else if(s&&(j=(b[N]||(b[N]={}))[a])&&j[0]===Q)m=j[1];else for(;(l=++n&&l&&l[p]||(m=n=0)||o.pop())&&((h?l.nodeName.toLowerCase()!==r:1!==l.nodeType)||!++m||(s&&((l[N]||(l[N]={}))[a]=[Q,m]),l!==b)););return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,d=y.pseudos[a]||y.setFilters[a.toLowerCase()]||g.error("unsupported pseudo: "+a);return d[N]?d(b):d.length>1?(c=[a,a,"",b],y.setFilters.hasOwnProperty(a.toLowerCase())?e(function(a,c){for(var e,f=d(a,b),g=f.length;g--;)e=_.call(a,f[g]),a[e]=!(c[e]=f[g])}):function(a){return d(a,0,c)}):d}},pseudos:{not:e(function(a){var b=[],c=[],d=B(a.replace(gb,"$1"));return d[N]?e(function(a,b,c,e){for(var f,g=d(a,null,e,[]),h=a.length;h--;)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:e(function(a){return function(b){return g(a,b).length>0}}),contains:e(function(a){return function(b){return(b.textContent||b.innerText||z(b)).indexOf(a)>-1}}),lang:e(function(a){return lb.test(a||"")||g.error("unsupported lang: "+a),a=a.replace(ub,vb).toLowerCase(),function(b){var c;do if(c=H?b.getAttribute("xml:lang")||b.getAttribute("lang"):b.lang)return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===G},focus:function(a){return a===F.activeElement&&(!F.hasFocus||F.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeName>"@"||3===a.nodeType||4===a.nodeType)return!1;return!0},parent:function(a){return!y.pseudos.empty(a)},header:function(a){return rb.test(a.nodeName)},input:function(a){return qb.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||b.toLowerCase()===a.type)},first:k(function(){return[0]}),last:k(function(a,b){return[b-1]}),eq:k(function(a,b,c){return[0>c?c+b:c]}),even:k(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:k(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:k(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:k(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}};for(w in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})y.pseudos[w]=i(w);for(w in{submit:!0,reset:!0})y.pseudos[w]=j(w);B=g.compile=function(a,b){var c,d=[],e=[],f=U[a+" "];if(!f){for(b||(b=l(a)),c=b.length;c--;)f=r(b[c]),f[N]?d.push(f):e.push(f);f=U(a,s(e,d))}return f},y.pseudos.nth=y.pseudos.eq,y.filters=v.prototype=y.pseudos,y.setFilters=new v,E(),g.attr=ib.attr,ib.find=g,ib.expr=g.selectors,ib.expr[":"]=ib.expr.pseudos,ib.unique=g.uniqueSort,ib.text=g.getText,ib.isXMLDoc=g.isXML,ib.contains=g.contains}(a);var Pb=/Until$/,Qb=/^(?:parents|prev(?:Until|All))/,Rb=/^.[^:#\[\.,]*$/,Sb=ib.expr.match.needsContext,Tb={children:!0,contents:!0,next:!0,prev:!0};ib.fn.extend({find:function(a){var b,c,d,e=this.length;if("string"!=typeof a)return d=this,this.pushStack(ib(a).filter(function(){for(b=0;e>b;b++)if(ib.contains(d[b],this))return!0}));for(c=[],b=0;e>b;b++)ib.find(a,this[b],c);return c=this.pushStack(e>1?ib.unique(c):c),c.selector=(this.selector?this.selector+" ":"")+a,c},has:function(a){var b,c=ib(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(ib.contains(this,c[b]))return!0})},not:function(a){return this.pushStack(l(this,a,!1))},filter:function(a){return this.pushStack(l(this,a,!0))},is:function(a){return!!a&&("string"==typeof a?Sb.test(a)?ib(a,this.context).index(this[0])>=0:ib.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=Sb.test(a)||"string"!=typeof a?ib(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c.ownerDocument&&c!==b&&11!==c.nodeType;){if(g?g.index(c)>-1:ib.find.matchesSelector(c,a)){f.push(c);break}c=c.parentNode}return this.pushStack(f.length>1?ib.unique(f):f)},index:function(a){return a?"string"==typeof a?ib.inArray(this[0],ib(a)):ib.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){var c="string"==typeof a?ib(a,b):ib.makeArray(a&&a.nodeType?[a]:a),d=ib.merge(this.get(),c);return this.pushStack(ib.unique(d))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}}),ib.fn.andSelf=ib.fn.addBack,ib.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return ib.dir(a,"parentNode")},parentsUntil:function(a,b,c){return ib.dir(a,"parentNode",c)},next:function(a){return k(a,"nextSibling")
-},prev:function(a){return k(a,"previousSibling")},nextAll:function(a){return ib.dir(a,"nextSibling")},prevAll:function(a){return ib.dir(a,"previousSibling")},nextUntil:function(a,b,c){return ib.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return ib.dir(a,"previousSibling",c)},siblings:function(a){return ib.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return ib.sibling(a.firstChild)},contents:function(a){return ib.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:ib.merge([],a.childNodes)}},function(a,b){ib.fn[a]=function(c,d){var e=ib.map(this,b,c);return Pb.test(a)||(d=c),d&&"string"==typeof d&&(e=ib.filter(d,e)),e=this.length>1&&!Tb[a]?ib.unique(e):e,this.length>1&&Qb.test(a)&&(e=e.reverse()),this.pushStack(e)}}),ib.extend({filter:function(a,b,c){return c&&(a=":not("+a+")"),1===b.length?ib.find.matchesSelector(b[0],a)?[b[0]]:[]:ib.find.matches(a,b)},dir:function(a,c,d){for(var e=[],f=a[c];f&&9!==f.nodeType&&(d===b||1!==f.nodeType||!ib(f).is(d));)1===f.nodeType&&e.push(f),f=f[c];return e},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}});var Ub="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",Vb=/ jQuery\d+="(?:null|\d+)"/g,Wb=new RegExp("<(?:"+Ub+")[\\s/>]","i"),Xb=/^\s+/,Yb=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,Zb=/<([\w:]+)/,$b=/<tbody/i,_b=/<|&#?\w+;/,ac=/<(?:script|style|link)/i,bc=/^(?:checkbox|radio)$/i,cc=/checked\s*(?:[^=]|=\s*.checked.)/i,dc=/^$|\/(?:java|ecma)script/i,ec=/^true\/(.*)/,fc=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,gc={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:ib.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},hc=m(W),ic=hc.appendChild(W.createElement("div"));gc.optgroup=gc.option,gc.tbody=gc.tfoot=gc.colgroup=gc.caption=gc.thead,gc.th=gc.td,ib.fn.extend({text:function(a){return ib.access(this,function(a){return a===b?ib.text(this):this.empty().append((this[0]&&this[0].ownerDocument||W).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(ib.isFunction(a))return this.each(function(b){ib(this).wrapAll(a.call(this,b))});if(this[0]){var b=ib(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){for(var a=this;a.firstChild&&1===a.firstChild.nodeType;)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(ib.isFunction(a)?function(b){ib(this).wrapInner(a.call(this,b))}:function(){var b=ib(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=ib.isFunction(a);return this.each(function(c){ib(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){ib.nodeName(this,"body")||ib(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(a,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,!1,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=0;null!=(c=this[d]);d++)(!a||ib.filter(a,[c]).length>0)&&(b||1!==c.nodeType||ib.cleanData(t(c)),c.parentNode&&(b&&ib.contains(c.ownerDocument,c)&&q(t(c,"script")),c.parentNode.removeChild(c)));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){for(1===a.nodeType&&ib.cleanData(t(a,!1));a.firstChild;)a.removeChild(a.firstChild);a.options&&ib.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return ib.clone(this,a,b)})},html:function(a){return ib.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return 1===c.nodeType?c.innerHTML.replace(Vb,""):b;if(!("string"!=typeof a||ac.test(a)||!ib.support.htmlSerialize&&Wb.test(a)||!ib.support.leadingWhitespace&&Xb.test(a)||gc[(Zb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(Yb,"<$1></$2>");try{for(;e>d;d++)c=this[d]||{},1===c.nodeType&&(ib.cleanData(t(c,!1)),c.innerHTML=a);c=0}catch(f){}}c&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(a){var b=ib.isFunction(a);return b||"string"==typeof a||(a=ib(a).not(this).detach()),this.domManip([a],!0,function(a){var b=this.nextSibling,c=this.parentNode;c&&(ib(this).remove(),c.insertBefore(a,b))})},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){a=bb.apply([],a);var e,f,g,h,i,j,k=0,l=this.length,m=this,q=l-1,r=a[0],s=ib.isFunction(r);if(s||!(1>=l||"string"!=typeof r||ib.support.checkClone)&&cc.test(r))return this.each(function(e){var f=m.eq(e);s&&(a[0]=r.call(this,e,c?f.html():b)),f.domManip(a,c,d)});if(l&&(j=ib.buildFragment(a,this[0].ownerDocument,!1,this),e=j.firstChild,1===j.childNodes.length&&(j=e),e)){for(c=c&&ib.nodeName(e,"tr"),h=ib.map(t(j,"script"),o),g=h.length;l>k;k++)f=j,k!==q&&(f=ib.clone(f,!0,!0),g&&ib.merge(h,t(f,"script"))),d.call(c&&ib.nodeName(this[k],"table")?n(this[k],"tbody"):this[k],f,k);if(g)for(i=h[h.length-1].ownerDocument,ib.map(h,p),k=0;g>k;k++)f=h[k],dc.test(f.type||"")&&!ib._data(f,"globalEval")&&ib.contains(i,f)&&(f.src?ib.ajax({url:f.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):ib.globalEval((f.text||f.textContent||f.innerHTML||"").replace(fc,"")));j=e=null}return this}}),ib.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){ib.fn[a]=function(a){for(var c,d=0,e=[],f=ib(a),g=f.length-1;g>=d;d++)c=d===g?this:this.clone(!0),ib(f[d])[b](c),cb.apply(e,c.get());return this.pushStack(e)}}),ib.extend({clone:function(a,b,c){var d,e,f,g,h,i=ib.contains(a.ownerDocument,a);if(ib.support.html5Clone||ib.isXMLDoc(a)||!Wb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ic.innerHTML=a.outerHTML,ic.removeChild(f=ic.firstChild)),!(ib.support.noCloneEvent&&ib.support.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||ib.isXMLDoc(a)))for(d=t(f),h=t(a),g=0;null!=(e=h[g]);++g)d[g]&&s(e,d[g]);if(b)if(c)for(h=h||t(a),d=d||t(f),g=0;null!=(e=h[g]);g++)r(e,d[g]);else r(a,f);return d=t(f,"script"),d.length>0&&q(d,!i&&t(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k,l=a.length,n=m(b),o=[],p=0;l>p;p++)if(f=a[p],f||0===f)if("object"===ib.type(f))ib.merge(o,f.nodeType?[f]:f);else if(_b.test(f)){for(h=h||n.appendChild(b.createElement("div")),i=(Zb.exec(f)||["",""])[1].toLowerCase(),k=gc[i]||gc._default,h.innerHTML=k[1]+f.replace(Yb,"<$1></$2>")+k[2],e=k[0];e--;)h=h.lastChild;if(!ib.support.leadingWhitespace&&Xb.test(f)&&o.push(b.createTextNode(Xb.exec(f)[0])),!ib.support.tbody)for(f="table"!==i||$b.test(f)?"<table>"!==k[1]||$b.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;e--;)ib.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j);for(ib.merge(o,h.childNodes),h.textContent="";h.firstChild;)h.removeChild(h.firstChild);h=n.lastChild}else o.push(b.createTextNode(f));for(h&&n.removeChild(h),ib.support.appendChecked||ib.grep(t(o,"input"),u),p=0;f=o[p++];)if((!d||-1===ib.inArray(f,d))&&(g=ib.contains(f.ownerDocument,f),h=t(n.appendChild(f),"script"),g&&q(h),c))for(e=0;f=h[e++];)dc.test(f.type||"")&&c.push(f);return h=null,n},cleanData:function(a,b){for(var c,d,e,f,g=0,h=ib.expando,i=ib.cache,j=ib.support.deleteExpando,k=ib.event.special;null!=(c=a[g]);g++)if((b||ib.acceptData(c))&&(e=c[h],f=e&&i[e])){if(f.events)for(d in f.events)k[d]?ib.event.remove(c,d):ib.removeEvent(c,d,f.handle);i[e]&&(delete i[e],j?delete c[h]:typeof c.removeAttribute!==V?c.removeAttribute(h):c[h]=null,_.push(e))}}});var jc,kc,lc,mc=/alpha\([^)]*\)/i,nc=/opacity\s*=\s*([^)]*)/,oc=/^(top|right|bottom|left)$/,pc=/^(none|table(?!-c[ea]).+)/,qc=/^margin/,rc=new RegExp("^("+jb+")(.*)$","i"),sc=new RegExp("^("+jb+")(?!px)[a-z%]+$","i"),tc=new RegExp("^([+-])=("+jb+")","i"),uc={BODY:"block"},vc={position:"absolute",visibility:"hidden",display:"block"},wc={letterSpacing:0,fontWeight:400},xc=["Top","Right","Bottom","Left"],yc=["Webkit","O","Moz","ms"];ib.fn.extend({css:function(a,c){return ib.access(this,function(a,c,d){var e,f,g={},h=0;if(ib.isArray(c)){for(f=kc(a),e=c.length;e>h;h++)g[c[h]]=ib.css(a,c[h],!1,f);return g}return d!==b?ib.style(a,c,d):ib.css(a,c)},a,c,arguments.length>1)},show:function(){return x(this,!0)},hide:function(){return x(this)},toggle:function(a){var b="boolean"==typeof a;return this.each(function(){(b?a:w(this))?ib(this).show():ib(this).hide()})}}),ib.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=lc(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":ib.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var f,g,h,i=ib.camelCase(c),j=a.style;if(c=ib.cssProps[i]||(ib.cssProps[i]=v(j,i)),h=ib.cssHooks[c]||ib.cssHooks[i],d===b)return h&&"get"in h&&(f=h.get(a,!1,e))!==b?f:j[c];if(g=typeof d,"string"===g&&(f=tc.exec(d))&&(d=(f[1]+1)*f[2]+parseFloat(ib.css(a,c)),g="number"),!(null==d||"number"===g&&isNaN(d)||("number"!==g||ib.cssNumber[i]||(d+="px"),ib.support.clearCloneStyle||""!==d||0!==c.indexOf("background")||(j[c]="inherit"),h&&"set"in h&&(d=h.set(a,d,e))===b)))try{j[c]=d}catch(k){}}},css:function(a,c,d,e){var f,g,h,i=ib.camelCase(c);return c=ib.cssProps[i]||(ib.cssProps[i]=v(a.style,i)),h=ib.cssHooks[c]||ib.cssHooks[i],h&&"get"in h&&(g=h.get(a,!0,d)),g===b&&(g=lc(a,c,e)),"normal"===g&&c in wc&&(g=wc[c]),""===d||d?(f=parseFloat(g),d===!0||ib.isNumeric(f)?f||0:g):g},swap:function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e}}),a.getComputedStyle?(kc=function(b){return a.getComputedStyle(b,null)},lc=function(a,c,d){var e,f,g,h=d||kc(a),i=h?h.getPropertyValue(c)||h[c]:b,j=a.style;return h&&(""!==i||ib.contains(a.ownerDocument,a)||(i=ib.style(a,c)),sc.test(i)&&qc.test(c)&&(e=j.width,f=j.minWidth,g=j.maxWidth,j.minWidth=j.maxWidth=j.width=i,i=h.width,j.width=e,j.minWidth=f,j.maxWidth=g)),i}):W.documentElement.currentStyle&&(kc=function(a){return a.currentStyle},lc=function(a,c,d){var e,f,g,h=d||kc(a),i=h?h[c]:b,j=a.style;return null==i&&j&&j[c]&&(i=j[c]),sc.test(i)&&!oc.test(c)&&(e=j.left,f=a.runtimeStyle,g=f&&f.left,g&&(f.left=a.currentStyle.left),j.left="fontSize"===c?"1em":i,i=j.pixelLeft+"px",j.left=e,g&&(f.left=g)),""===i?"auto":i}),ib.each(["height","width"],function(a,b){ib.cssHooks[b]={get:function(a,c,d){return c?0===a.offsetWidth&&pc.test(ib.css(a,"display"))?ib.swap(a,vc,function(){return A(a,b,d)}):A(a,b,d):void 0},set:function(a,c,d){var e=d&&kc(a);return y(a,c,d?z(a,b,d,ib.support.boxSizing&&"border-box"===ib.css(a,"boxSizing",!1,e),e):0)}}}),ib.support.opacity||(ib.cssHooks.opacity={get:function(a,b){return nc.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=ib.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===ib.trim(f.replace(mc,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=mc.test(f)?f.replace(mc,e):f+" "+e)}}),ib(function(){ib.support.reliableMarginRight||(ib.cssHooks.marginRight={get:function(a,b){return b?ib.swap(a,{display:"inline-block"},lc,[a,"marginRight"]):void 0}}),!ib.support.pixelPosition&&ib.fn.position&&ib.each(["top","left"],function(a,b){ib.cssHooks[b]={get:function(a,c){return c?(c=lc(a,b),sc.test(c)?ib(a).position()[b]+"px":c):void 0}}})}),ib.expr&&ib.expr.filters&&(ib.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!ib.support.reliableHiddenOffsets&&"none"===(a.style&&a.style.display||ib.css(a,"display"))},ib.expr.filters.visible=function(a){return!ib.expr.filters.hidden(a)}),ib.each({margin:"",padding:"",border:"Width"},function(a,b){ib.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+xc[d]+b]=f[d]||f[d-2]||f[0];return e}},qc.test(a)||(ib.cssHooks[a+b].set=y)});var zc=/%20/g,Ac=/\[\]$/,Bc=/\r?\n/g,Cc=/^(?:submit|button|image|reset|file)$/i,Dc=/^(?:input|select|textarea|keygen)/i;ib.fn.extend({serialize:function(){return ib.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=ib.prop(this,"elements");return a?ib.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!ib(this).is(":disabled")&&Dc.test(this.nodeName)&&!Cc.test(a)&&(this.checked||!bc.test(a))}).map(function(a,b){var c=ib(this).val();return null==c?null:ib.isArray(c)?ib.map(c,function(a){return{name:b.name,value:a.replace(Bc,"\r\n")}}):{name:b.name,value:c.replace(Bc,"\r\n")}}).get()}}),ib.param=function(a,c){var d,e=[],f=function(a,b){b=ib.isFunction(b)?b():null==b?"":b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(c===b&&(c=ib.ajaxSettings&&ib.ajaxSettings.traditional),ib.isArray(a)||a.jquery&&!ib.isPlainObject(a))ib.each(a,function(){f(this.name,this.value)});else for(d in a)D(d,a[d],c,f);return e.join("&").replace(zc,"+")},ib.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){ib.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),ib.fn.hover=function(a,b){return this.mouseenter(a).mouseleave(b||a)};var Ec,Fc,Gc=ib.now(),Hc=/\?/,Ic=/#.*$/,Jc=/([?&])_=[^&]*/,Kc=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Lc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mc=/^(?:GET|HEAD)$/,Nc=/^\/\//,Oc=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Pc=ib.fn.load,Qc={},Rc={},Sc="*/".concat("*");try{Fc=X.href}catch(Tc){Fc=W.createElement("a"),Fc.href="",Fc=Fc.href}Ec=Oc.exec(Fc.toLowerCase())||[],ib.fn.load=function(a,c,d){if("string"!=typeof a&&Pc)return Pc.apply(this,arguments);var e,f,g,h=this,i=a.indexOf(" ");return i>=0&&(e=a.slice(i,a.length),a=a.slice(0,i)),ib.isFunction(c)?(d=c,c=b):c&&"object"==typeof c&&(g="POST"),h.length>0&&ib.ajax({url:a,type:g,dataType:"html",data:c}).done(function(a){f=arguments,h.html(e?ib("<div>").append(ib.parseHTML(a)).find(e):a)}).complete(d&&function(a,b){h.each(d,f||[a.responseText,b,a])}),this},ib.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){ib.fn[b]=function(a){return this.on(b,a)}}),ib.each(["get","post"],function(a,c){ib[c]=function(a,d,e,f){return ib.isFunction(d)&&(f=f||e,e=d,d=b),ib.ajax({url:a,type:c,dataType:f,data:d,success:e})}}),ib.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Fc,type:"GET",isLocal:Lc.test(Ec[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Sc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":ib.parseJSON,"text xml":ib.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?G(G(a,ib.ajaxSettings),b):G(ib.ajaxSettings,a)},ajaxPrefilter:E(Qc),ajaxTransport:E(Rc),ajax:function(a,c){function d(a,c,d,e){var f,l,s,t,v,x=c;2!==u&&(u=2,i&&clearTimeout(i),k=b,h=e||"",w.readyState=a>0?4:0,d&&(t=H(m,w,d)),a>=200&&300>a||304===a?(m.ifModified&&(v=w.getResponseHeader("Last-Modified"),v&&(ib.lastModified[g]=v),v=w.getResponseHeader("etag"),v&&(ib.etag[g]=v)),204===a?(f=!0,x="nocontent"):304===a?(f=!0,x="notmodified"):(f=I(m,t),x=f.state,l=f.data,s=f.error,f=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),w.status=a,w.statusText=(c||x)+"",f?p.resolveWith(n,[l,x,w]):p.rejectWith(n,[w,x,s]),w.statusCode(r),r=b,j&&o.trigger(f?"ajaxSuccess":"ajaxError",[w,m,f?l:s]),q.fireWith(n,[w,x]),j&&(o.trigger("ajaxComplete",[w,m]),--ib.active||ib.event.trigger("ajaxStop")))}"object"==typeof a&&(c=a,a=b),c=c||{};var e,f,g,h,i,j,k,l,m=ib.ajaxSetup({},c),n=m.context||m,o=m.context&&(n.nodeType||n.jquery)?ib(n):ib.event,p=ib.Deferred(),q=ib.Callbacks("once memory"),r=m.statusCode||{},s={},t={},u=0,v="canceled",w={readyState:0,getResponseHeader:function(a){var b;if(2===u){if(!l)for(l={};b=Kc.exec(h);)l[b[1].toLowerCase()]=b[2];b=l[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===u?h:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return u||(a=t[c]=t[c]||a,s[a]=b),this},overrideMimeType:function(a){return u||(m.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>u)for(b in a)r[b]=[r[b],a[b]];else w.always(a[w.status]);return this},abort:function(a){var b=a||v;return k&&k.abort(b),d(0,b),this}};if(p.promise(w).complete=q.add,w.success=w.done,w.error=w.fail,m.url=((a||m.url||Fc)+"").replace(Ic,"").replace(Nc,Ec[1]+"//"),m.type=c.method||c.type||m.method||m.type,m.dataTypes=ib.trim(m.dataType||"*").toLowerCase().match(kb)||[""],null==m.crossDomain&&(e=Oc.exec(m.url.toLowerCase()),m.crossDomain=!(!e||e[1]===Ec[1]&&e[2]===Ec[2]&&(e[3]||("http:"===e[1]?80:443))==(Ec[3]||("http:"===Ec[1]?80:443)))),m.data&&m.processData&&"string"!=typeof m.data&&(m.data=ib.param(m.data,m.traditional)),F(Qc,m,c,w),2===u)return w;j=m.global,j&&0===ib.active++&&ib.event.trigger("ajaxStart"),m.type=m.type.toUpperCase(),m.hasContent=!Mc.test(m.type),g=m.url,m.hasContent||(m.data&&(g=m.url+=(Hc.test(g)?"&":"?")+m.data,delete m.data),m.cache===!1&&(m.url=Jc.test(g)?g.replace(Jc,"$1_="+Gc++):g+(Hc.test(g)?"&":"?")+"_="+Gc++)),m.ifModified&&(ib.lastModified[g]&&w.setRequestHeader("If-Modified-Since",ib.lastModified[g]),ib.etag[g]&&w.setRequestHeader("If-None-Match",ib.etag[g])),(m.data&&m.hasContent&&m.contentType!==!1||c.contentType)&&w.setRequestHeader("Content-Type",m.contentType),w.setRequestHeader("Accept",m.dataTypes[0]&&m.accepts[m.dataTypes[0]]?m.accepts[m.dataTypes[0]]+("*"!==m.dataTypes[0]?", "+Sc+"; q=0.01":""):m.accepts["*"]);for(f in m.headers)w.setRequestHeader(f,m.headers[f]);if(m.beforeSend&&(m.beforeSend.call(n,w,m)===!1||2===u))return w.abort();v="abort";for(f in{success:1,error:1,complete:1})w[f](m[f]);if(k=F(Rc,m,c,w)){w.readyState=1,j&&o.trigger("ajaxSend",[w,m]),m.async&&m.timeout>0&&(i=setTimeout(function(){w.abort("timeout")},m.timeout));try{u=1,k.send(s,d)}catch(x){if(!(2>u))throw x;d(-1,x)}}else d(-1,"No Transport");return w},getScript:function(a,c){return ib.get(a,b,c,"script")},getJSON:function(a,b,c){return ib.get(a,b,c,"json")}}),ib.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return ib.globalEval(a),a}}}),ib.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),ib.ajaxTransport("script",function(a){if(a.crossDomain){var c,d=W.head||ib("head")[0]||W.documentElement;return{send:function(b,e){c=W.createElement("script"),c.async=!0,a.scriptCharset&&(c.charset=a.scriptCharset),c.src=a.url,c.onload=c.onreadystatechange=function(a,b){(b||!c.readyState||/loaded|complete/.test(c.readyState))&&(c.onload=c.onreadystatechange=null,c.parentNode&&c.parentNode.removeChild(c),c=null,b||e(200,"success"))},d.insertBefore(c,d.firstChild)},abort:function(){c&&c.onload(b,!0)}}}});var Uc=[],Vc=/(=)\?(?=&|$)|\?\?/;ib.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Uc.pop()||ib.expando+"_"+Gc++;return this[a]=!0,a}}),ib.ajaxPrefilter("json jsonp",function(c,d,e){var f,g,h,i=c.jsonp!==!1&&(Vc.test(c.url)?"url":"string"==typeof c.data&&!(c.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vc.test(c.data)&&"data");return i||"jsonp"===c.dataTypes[0]?(f=c.jsonpCallback=ib.isFunction(c.jsonpCallback)?c.jsonpCallback():c.jsonpCallback,i?c[i]=c[i].replace(Vc,"$1"+f):c.jsonp!==!1&&(c.url+=(Hc.test(c.url)?"&":"?")+c.jsonp+"="+f),c.converters["script json"]=function(){return h||ib.error(f+" was not called"),h[0]},c.dataTypes[0]="json",g=a[f],a[f]=function(){h=arguments},e.always(function(){a[f]=g,c[f]&&(c.jsonpCallback=d.jsonpCallback,Uc.push(f)),h&&ib.isFunction(g)&&g(h[0]),h=g=b}),"script"):void 0});var Wc,Xc,Yc=0,Zc=a.ActiveXObject&&function(){var a;for(a in Wc)Wc[a](b,!0)};ib.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&J()||K()}:J,Xc=ib.ajaxSettings.xhr(),ib.support.cors=!!Xc&&"withCredentials"in Xc,Xc=ib.support.ajax=!!Xc,Xc&&ib.ajaxTransport(function(c){if(!c.crossDomain||ib.support.cors){var d;return{send:function(e,f){var g,h,i=c.xhr();if(c.username?i.open(c.type,c.url,c.async,c.username,c.password):i.open(c.type,c.url,c.async),c.xhrFields)for(h in c.xhrFields)i[h]=c.xhrFields[h];c.mimeType&&i.overrideMimeType&&i.overrideMimeType(c.mimeType),c.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");try{for(h in e)i.setRequestHeader(h,e[h])}catch(j){}i.send(c.hasContent&&c.data||null),d=function(a,e){var h,j,k,l;try{if(d&&(e||4===i.readyState))if(d=b,g&&(i.onreadystatechange=ib.noop,Zc&&delete Wc[g]),e)4!==i.readyState&&i.abort();else{l={},h=i.status,j=i.getAllResponseHeaders(),"string"==typeof i.responseText&&(l.text=i.responseText);try{k=i.statusText}catch(m){k=""}h||!c.isLocal||c.crossDomain?1223===h&&(h=204):h=l.text?200:404}}catch(n){e||f(-1,n)}l&&f(h,k,l,j)},c.async?4===i.readyState?setTimeout(d):(g=++Yc,Zc&&(Wc||(Wc={},ib(a).unload(Zc)),Wc[g]=d),i.onreadystatechange=d):d()},abort:function(){d&&d(b,!0)}}}});var $c,_c,ad=/^(?:toggle|show|hide)$/,bd=new RegExp("^(?:([+-])=|)("+jb+")([a-z%]*)$","i"),cd=/queueHooks$/,dd=[P],ed={"*":[function(a,b){var c,d,e=this.createTween(a,b),f=bd.exec(b),g=e.cur(),h=+g||0,i=1,j=20;if(f){if(c=+f[2],d=f[3]||(ib.cssNumber[a]?"":"px"),"px"!==d&&h){h=ib.css(e.elem,a,!0)||c||1;do i=i||".5",h/=i,ib.style(e.elem,a,h+d);while(i!==(i=e.cur()/g)&&1!==i&&--j)}e.unit=d,e.start=h,e.end=f[1]?h+(f[1]+1)*c:c}return e}]};ib.Animation=ib.extend(N,{tweener:function(a,b){ib.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],ed[c]=ed[c]||[],ed[c].unshift(b)},prefilter:function(a,b){b?dd.unshift(a):dd.push(a)}}),ib.Tween=Q,Q.prototype={constructor:Q,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(ib.cssNumber[c]?"":"px")},cur:function(){var a=Q.propHooks[this.prop];return a&&a.get?a.get(this):Q.propHooks._default.get(this)},run:function(a){var b,c=Q.propHooks[this.prop];return this.pos=b=this.options.duration?ib.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Q.propHooks._default.set(this),this}},Q.prototype.init.prototype=Q.prototype,Q.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=ib.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){ib.fx.step[a.prop]?ib.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[ib.cssProps[a.prop]]||ib.cssHooks[a.prop])?ib.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Q.propHooks.scrollTop=Q.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},ib.each(["toggle","show","hide"],function(a,b){var c=ib.fn[b];ib.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(R(b,!0),a,d,e)}}),ib.fn.extend({fadeTo:function(a,b,c,d){return this.filter(w).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=ib.isEmptyObject(a),f=ib.speed(b,c,d),g=function(){var b=N(this,ib.extend({},a),f);g.finish=function(){b.stop(!0)},(e||ib._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,c,d){var e=function(a){var b=a.stop;delete a.stop,b(d)};return"string"!=typeof a&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,c=null!=a&&a+"queueHooks",f=ib.timers,g=ib._data(this);if(c)g[c]&&g[c].stop&&e(g[c]);else for(c in g)g[c]&&g[c].stop&&cd.test(c)&&e(g[c]);for(c=f.length;c--;)f[c].elem!==this||null!=a&&f[c].queue!==a||(f[c].anim.stop(d),b=!1,f.splice(c,1));(b||!d)&&ib.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=ib._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=ib.timers,g=d?d.length:0;for(c.finish=!0,ib.queue(this,a,[]),e&&e.cur&&e.cur.finish&&e.cur.finish.call(this),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),ib.each({slideDown:R("show"),slideUp:R("hide"),slideToggle:R("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){ib.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),ib.speed=function(a,b,c){var d=a&&"object"==typeof a?ib.extend({},a):{complete:c||!c&&b||ib.isFunction(a)&&a,duration:a,easing:c&&b||b&&!ib.isFunction(b)&&b};return d.duration=ib.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in ib.fx.speeds?ib.fx.speeds[d.duration]:ib.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){ib.isFunction(d.old)&&d.old.call(this),d.queue&&ib.dequeue(this,d.queue)},d},ib.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},ib.timers=[],ib.fx=Q.prototype.init,ib.fx.tick=function(){var a,c=ib.timers,d=0;for($c=ib.now();d<c.length;d++)a=c[d],a()||c[d]!==a||c.splice(d--,1);c.length||ib.fx.stop(),$c=b},ib.fx.timer=function(a){a()&&ib.timers.push(a)&&ib.fx.start()},ib.fx.interval=13,ib.fx.start=function(){_c||(_c=setInterval(ib.fx.tick,ib.fx.interval))},ib.fx.stop=function(){clearInterval(_c),_c=null},ib.fx.speeds={slow:600,fast:200,_default:400},ib.fx.step={},ib.expr&&ib.expr.filters&&(ib.expr.filters.animated=function(a){return ib.grep(ib.timers,function(b){return a===b.elem}).length}),ib.fn.offset=function(a){if(arguments.length)return a===b?this:this.each(function(b){ib.offset.setOffset(this,a,b)});var c,d,e={top:0,left:0},f=this[0],g=f&&f.ownerDocument;if(g)return c=g.documentElement,ib.contains(c,f)?(typeof f.getBoundingClientRect!==V&&(e=f.getBoundingClientRect()),d=S(g),{top:e.top+(d.pageYOffset||c.scrollTop)-(c.clientTop||0),left:e.left+(d.pageXOffset||c.scrollLeft)-(c.clientLeft||0)}):e},ib.offset={setOffset:function(a,b,c){var d=ib.css(a,"position");"static"===d&&(a.style.position="relative");var e,f,g=ib(a),h=g.offset(),i=ib.css(a,"top"),j=ib.css(a,"left"),k=("absolute"===d||"fixed"===d)&&ib.inArray("auto",[i,j])>-1,l={},m={};k?(m=g.position(),e=m.top,f=m.left):(e=parseFloat(i)||0,f=parseFloat(j)||0),ib.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(l.top=b.top-h.top+e),null!=b.left&&(l.left=b.left-h.left+f),"using"in b?b.using.call(a,l):g.css(l)}},ib.fn.extend({position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===ib.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),ib.nodeName(a[0],"html")||(c=a.offset()),c.top+=ib.css(a[0],"borderTopWidth",!0),c.left+=ib.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-ib.css(d,"marginTop",!0),left:b.left-c.left-ib.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||W.documentElement;a&&!ib.nodeName(a,"html")&&"static"===ib.css(a,"position");)a=a.offsetParent;return a||W.documentElement})}}),ib.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);ib.fn[a]=function(e){return ib.access(this,function(a,e,f){var g=S(a);return f===b?g?c in g?g[c]:g.document.documentElement[e]:a[e]:void(g?g.scrollTo(d?ib(g).scrollLeft():f,d?f:ib(g).scrollTop()):a[e]=f)},a,e,arguments.length,null)}}),ib.each({Height:"height",Width:"width"},function(a,c){ib.each({padding:"inner"+a,content:c,"":"outer"+a},function(d,e){ib.fn[e]=function(e,f){var g=arguments.length&&(d||"boolean"!=typeof e),h=d||(e===!0||f===!0?"margin":"border");return ib.access(this,function(c,d,e){var f;return ib.isWindow(c)?c.document.documentElement["client"+a]:9===c.nodeType?(f=c.documentElement,Math.max(c.body["scroll"+a],f["scroll"+a],c.body["offset"+a],f["offset"+a],f["client"+a])):e===b?ib.css(c,d,h):ib.style(c,d,e,h)},c,g?e:b,g,null)}})}),a.jQuery=a.$=ib,"function"==typeof define&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return ib})}(window),function(a,b,c){"use strict";function d(a){return function(){var b,c,d=arguments[0],e="["+(a?a+":":"")+d+"] ",f=arguments[1],g=arguments,h=function(a){return"function"==typeof a?a.toString().replace(/ \{[\s\S]*$/,""):"undefined"==typeof a?"undefined":"string"!=typeof a?JSON.stringify(a):a};for(b=e+f.replace(/\{\d+\}/g,function(a){var b,c=+a.slice(1,-1);return c+2<g.length?(b=g[c+2],"function"==typeof b?b.toString().replace(/ ?\{[\s\S]*$/,""):"undefined"==typeof b?"undefined":"string"!=typeof b?R(b):b):a}),b=b+"\nhttp://errors.angularjs.org/1.2.16/"+(a?a+"/":"")+d,c=2;c<arguments.length;c++)b=b+(2==c?"?":"&")+"p"+(c-2)+"="+encodeURIComponent(h(arguments[c]));return new Error(b)}}function e(a){if(null==a||A(a))return!1;var b=a.length;return 1===a.nodeType&&b?!0:u(a)||x(a)||0===b||"number"==typeof b&&b>0&&b-1 in a}function f(a,b,c){var d;if(a)if(y(a))for(d in a)"prototype"==d||"length"==d||"name"==d||a.hasOwnProperty&&!a.hasOwnProperty(d)||b.call(c,a[d],d);else if(a.forEach&&a.forEach!==f)a.forEach(b,c);else if(e(a))for(d=0;d<a.length;d++)b.call(c,a[d],d);else for(d in a)a.hasOwnProperty(d)&&b.call(c,a[d],d);return a}function g(a){var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c);return b.sort()}function h(a,b,c){for(var d=g(a),e=0;e<d.length;e++)b.call(c,a[d[e]],d[e]);return d}function i(a){return function(b,c){a(c,b)}}function j(){for(var a,b=Bd.length;b;){if(b--,a=Bd[b].charCodeAt(0),57==a)return Bd[b]="A",Bd.join("");if(90!=a)return Bd[b]=String.fromCharCode(a+1),Bd.join("");Bd[b]="0"}return Bd.unshift("0"),Bd.join("")}function k(a,b){b?a.$$hashKey=b:delete a.$$hashKey}function l(a){var b=a.$$hashKey;return f(arguments,function(b){b!==a&&f(b,function(b,c){a[c]=b})}),k(a,b),a}function m(a){return parseInt(a,10)}function n(a,b){return l(new(l(function(){},{prototype:a})),b)}function o(){}function p(a){return a}function q(a){return function(){return a}}function r(a){return"undefined"==typeof a}function s(a){return"undefined"!=typeof a}function t(a){return null!=a&&"object"==typeof a}function u(a){return"string"==typeof a}function v(a){return"number"==typeof a}function w(a){return"[object Date]"===yd.call(a)}function x(a){return"[object Array]"===yd.call(a)}function y(a){return"function"==typeof a}function z(a){return"[object RegExp]"===yd.call(a)}function A(a){return a&&a.document&&a.location&&a.alert&&a.setInterval}function B(a){return a&&a.$evalAsync&&a.$watch}function C(a){return"[object File]"===yd.call(a)}function D(a){return"[object Blob]"===yd.call(a)}function E(a){return!(!a||!(a.nodeName||a.prop&&a.attr&&a.find))}function F(a,b,c){var d=[];return f(a,function(a,e,f){d.push(b.call(c,a,e,f))}),d}function G(a,b){return-1!=H(a,b)}function H(a,b){if(a.indexOf)return a.indexOf(b);for(var c=0;c<a.length;c++)if(b===a[c])return c;
-return-1}function I(a,b){var c=H(a,b);return c>=0&&a.splice(c,1),b}function J(a,b){if(A(a)||B(a))throw zd("cpws","Can't copy! Making copies of Window or Scope instances is not supported.");if(b){if(a===b)throw zd("cpi","Can't copy! Source and destination are identical.");if(x(a)){b.length=0;for(var c=0;c<a.length;c++)b.push(J(a[c]))}else{var d=b.$$hashKey;f(b,function(a,c){delete b[c]});for(var e in a)b[e]=J(a[e]);k(b,d)}}else b=a,a&&(x(a)?b=J(a,[]):w(a)?b=new Date(a.getTime()):z(a)?b=new RegExp(a.source):t(a)&&(b=J(a,{})));return b}function K(a,b){b=b||{};for(var c in a)!a.hasOwnProperty(c)||"$"===c.charAt(0)&&"$"===c.charAt(1)||(b[c]=a[c]);return b}function L(a,b){if(a===b)return!0;if(null===a||null===b)return!1;if(a!==a&&b!==b)return!0;var d,e,f,g=typeof a,h=typeof b;if(g==h&&"object"==g){if(!x(a)){if(w(a))return w(b)&&a.getTime()==b.getTime();if(z(a)&&z(b))return a.toString()==b.toString();if(B(a)||B(b)||A(a)||A(b)||x(b))return!1;f={};for(e in a)if("$"!==e.charAt(0)&&!y(a[e])){if(!L(a[e],b[e]))return!1;f[e]=!0}for(e in b)if(!f.hasOwnProperty(e)&&"$"!==e.charAt(0)&&b[e]!==c&&!y(b[e]))return!1;return!0}if(!x(b))return!1;if((d=a.length)==b.length){for(e=0;d>e;e++)if(!L(a[e],b[e]))return!1;return!0}}return!1}function M(){return b.securityPolicy&&b.securityPolicy.isActive||b.querySelector&&!(!b.querySelector("[ng-csp]")&&!b.querySelector("[data-ng-csp]"))}function N(a,b,c){return a.concat(wd.call(b,c))}function O(a,b){return wd.call(a,b||0)}function P(a,b){var c=arguments.length>2?O(arguments,2):[];return!y(b)||b instanceof RegExp?b:c.length?function(){return arguments.length?b.apply(a,c.concat(wd.call(arguments,0))):b.apply(a,c)}:function(){return arguments.length?b.apply(a,arguments):b.call(a)}}function Q(a,d){var e=d;return"string"==typeof a&&"$"===a.charAt(0)?e=c:A(d)?e="$WINDOW":d&&b===d?e="$DOCUMENT":B(d)&&(e="$SCOPE"),e}function R(a,b){return"undefined"==typeof a?c:JSON.stringify(a,Q,b?"  ":null)}function S(a){return u(a)?JSON.parse(a):a}function T(a){if("function"==typeof a)a=!0;else if(a&&0!==a.length){var b=md(""+a);a=!("f"==b||"0"==b||"false"==b||"no"==b||"n"==b||"[]"==b)}else a=!1;return a}function U(a){a=sd(a).clone();try{a.empty()}catch(b){}var c=3,d=sd("<div>").append(a).html();try{return a[0].nodeType===c?md(d):d.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+md(b)})}catch(b){return md(d)}}function V(a){try{return decodeURIComponent(a)}catch(b){}}function W(a){var b,c,d={};return f((a||"").split("&"),function(a){if(a&&(b=a.split("="),c=V(b[0]),s(c))){var e=s(b[1])?V(b[1]):!0;d[c]?x(d[c])?d[c].push(e):d[c]=[d[c],e]:d[c]=e}}),d}function X(a){var b=[];return f(a,function(a,c){x(a)?f(a,function(a){b.push(Z(c,!0)+(a===!0?"":"="+Z(a,!0)))}):b.push(Z(c,!0)+(a===!0?"":"="+Z(a,!0)))}),b.length?b.join("&"):""}function Y(a){return Z(a,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function Z(a,b){return encodeURIComponent(a).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,b?"%20":"+")}function $(a,c){function d(a){a&&h.push(a)}var e,g,h=[a],i=["ng:app","ng-app","x-ng-app","data-ng-app"],j=/\sng[:\-]app(:\s*([\w\d_]+);?)?\s/;f(i,function(c){i[c]=!0,d(b.getElementById(c)),c=c.replace(":","\\:"),a.querySelectorAll&&(f(a.querySelectorAll("."+c),d),f(a.querySelectorAll("."+c+"\\:"),d),f(a.querySelectorAll("["+c+"]"),d))}),f(h,function(a){if(!e){var b=" "+a.className+" ",c=j.exec(b);c?(e=a,g=(c[2]||"").replace(/\s+/g,",")):f(a.attributes,function(b){!e&&i[b.name]&&(e=a,g=b.value)})}}),e&&c(e,g?[g]:[])}function _(c,d){var e=function(){if(c=sd(c),c.injector()){var a=c[0]===b?"document":U(c);throw zd("btstrpd","App Already Bootstrapped with this Element '{0}'",a)}d=d||[],d.unshift(["$provide",function(a){a.value("$rootElement",c)}]),d.unshift("ng");var e=Ib(d);return e.invoke(["$rootScope","$rootElement","$compile","$injector","$animate",function(a,b,c,d){a.$apply(function(){b.data("$injector",d),c(b)(a)})}]),e},g=/^NG_DEFER_BOOTSTRAP!/;return a&&!g.test(a.name)?e():(a.name=a.name.replace(g,""),void(Ad.resumeBootstrap=function(a){f(a,function(a){d.push(a)}),e()}))}function ab(a,b){return b=b||"_",a.replace(Dd,function(a,c){return(c?b:"")+a.toLowerCase()})}function bb(){td=a.jQuery,td?(sd=td,l(td.fn,{scope:Sd.scope,isolateScope:Sd.isolateScope,controller:Sd.controller,injector:Sd.injector,inheritedData:Sd.inheritedData}),lb("remove",!0,!0,!1),lb("empty",!1,!1,!1),lb("html",!1,!1,!0)):sd=pb,Ad.element=sd}function cb(a,b,c){if(!a)throw zd("areq","Argument '{0}' is {1}",b||"?",c||"required");return a}function db(a,b,c){return c&&x(a)&&(a=a[a.length-1]),cb(y(a),b,"not a function, got "+(a&&"object"==typeof a?a.constructor.name||"Object":typeof a)),a}function eb(a,b){if("hasOwnProperty"===a)throw zd("badname","hasOwnProperty is not a valid {0} name",b)}function fb(a,b,c){if(!b)return a;for(var d,e=b.split("."),f=a,g=e.length,h=0;g>h;h++)d=e[h],a&&(a=(f=a)[d]);return!c&&y(a)?P(f,a):a}function gb(a){var b=a[0],c=a[a.length-1];if(b===c)return sd(b);var d=b,e=[d];do{if(d=d.nextSibling,!d)break;e.push(d)}while(d!==c);return sd(e)}function hb(a){function b(a,b,c){return a[b]||(a[b]=c())}var c=d("$injector"),e=d("ng"),f=b(a,"angular",Object);return f.$$minErr=f.$$minErr||d,b(f,"module",function(){var a={};return function(d,f,g){var h=function(a,b){if("hasOwnProperty"===a)throw e("badname","hasOwnProperty is not a valid {0} name",b)};return h(d,"module"),f&&a.hasOwnProperty(d)&&(a[d]=null),b(a,d,function(){function a(a,c,d){return function(){return b[d||"push"]([a,c,arguments]),i}}if(!f)throw c("nomod","Module '{0}' is not available! You either misspelled the module name or forgot to load it. If registering a module ensure that you specify the dependencies as the second argument.",d);var b=[],e=[],h=a("$injector","invoke"),i={_invokeQueue:b,_runBlocks:e,requires:f,name:d,provider:a("$provide","provider"),factory:a("$provide","factory"),service:a("$provide","service"),value:a("$provide","value"),constant:a("$provide","constant","unshift"),animation:a("$animateProvider","register"),filter:a("$filterProvider","register"),controller:a("$controllerProvider","register"),directive:a("$compileProvider","directive"),config:h,run:function(a){return e.push(a),this}};return g&&h(g),i})}})}function ib(b){l(b,{bootstrap:_,copy:J,extend:l,equals:L,element:sd,forEach:f,injector:Ib,noop:o,bind:P,toJson:R,fromJson:S,identity:p,isUndefined:r,isDefined:s,isString:u,isFunction:y,isObject:t,isNumber:v,isElement:E,isArray:x,version:Ed,isDate:w,lowercase:md,uppercase:od,callbacks:{counter:0},$$minErr:d,$$csp:M}),ud=hb(a);try{ud("ngLocale")}catch(c){ud("ngLocale",[]).provider("$locale",dc)}ud("ng",["ngLocale"],["$provide",function(a){a.provider({$$sanitizeUri:Ec}),a.provider("$compile",Pb).directive({a:ye,input:Ie,textarea:Ie,form:Ce,script:qf,select:tf,style:vf,option:uf,ngBind:Ue,ngBindHtml:We,ngBindTemplate:Ve,ngClass:Xe,ngClassEven:Ze,ngClassOdd:Ye,ngCloak:$e,ngController:_e,ngForm:De,ngHide:kf,ngIf:bf,ngInclude:cf,ngInit:ef,ngNonBindable:ff,ngPluralize:gf,ngRepeat:hf,ngShow:jf,ngStyle:lf,ngSwitch:mf,ngSwitchWhen:nf,ngSwitchDefault:of,ngOptions:sf,ngTransclude:pf,ngModel:Oe,ngList:Re,ngChange:Pe,required:Qe,ngRequired:Qe,ngValue:Te}).directive({ngInclude:df}).directive(ze).directive(af),a.provider({$anchorScroll:Jb,$animate:_d,$browser:Mb,$cacheFactory:Nb,$controller:Sb,$document:Tb,$exceptionHandler:Ub,$filter:Pc,$interpolate:bc,$interval:cc,$http:Zb,$httpBackend:_b,$location:qc,$log:rc,$parse:zc,$rootScope:Dc,$q:Ac,$sce:Jc,$sceDelegate:Ic,$sniffer:Kc,$templateCache:Ob,$timeout:Lc,$window:Oc,$$rAF:Cc,$$asyncCallback:Kb})}])}function jb(){return++Hd}function kb(a){return a.replace(Kd,function(a,b,c,d){return d?c.toUpperCase():c}).replace(Ld,"Moz$1")}function lb(a,b,c,d){function e(a){var e,g,h,i,j,k,l,m=c&&a?[this.filter(a)]:[this],n=b;if(!d||null!=a)for(;m.length;)for(e=m.shift(),g=0,h=e.length;h>g;g++)for(i=sd(e[g]),n?i.triggerHandler("$destroy"):n=!n,j=0,k=(l=i.children()).length;k>j;j++)m.push(td(l[j]));return f.apply(this,arguments)}var f=td.fn[a];f=f.$original||f,e.$original=f,td.fn[a]=e}function mb(a){return!Od.test(a)}function nb(a,b){var c,d,e,f,g,h,i=b.createDocumentFragment(),j=[];if(mb(a))j.push(b.createTextNode(a));else{for(c=i.appendChild(b.createElement("div")),d=(Pd.exec(a)||["",""])[1].toLowerCase(),e=Rd[d]||Rd._default,c.innerHTML="<div>&#160;</div>"+e[1]+a.replace(Qd,"<$1></$2>")+e[2],c.removeChild(c.firstChild),f=e[0];f--;)c=c.lastChild;for(g=0,h=c.childNodes.length;h>g;++g)j.push(c.childNodes[g]);c=i.firstChild,c.textContent=""}return i.textContent="",i.innerHTML="",j}function ob(a,c){c=c||b;var d;return(d=Nd.exec(a))?[c.createElement(d[1])]:nb(a,c)}function pb(a){if(a instanceof pb)return a;if(u(a)&&(a=Cd(a)),!(this instanceof pb)){if(u(a)&&"<"!=a.charAt(0))throw Md("nosel","Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element");return new pb(a)}if(u(a)){zb(this,ob(a));var c=sd(b.createDocumentFragment());c.append(this)}else zb(this,a)}function qb(a){return a.cloneNode(!0)}function rb(a){tb(a);for(var b=0,c=a.childNodes||[];b<c.length;b++)rb(c[b])}function sb(a,b,c,d){if(s(d))throw Md("offargs","jqLite#off() does not support the `selector` argument");var e=ub(a,"events"),g=ub(a,"handle");g&&(r(b)?f(e,function(b,c){Jd(a,c,b),delete e[c]}):f(b.split(" "),function(b){r(c)?(Jd(a,b,e[b]),delete e[b]):I(e[b]||[],c)}))}function tb(a,b){var d=a[Gd],e=Fd[d];if(e){if(b)return void delete Fd[d].data[b];e.handle&&(e.events.$destroy&&e.handle({},"$destroy"),sb(a)),delete Fd[d],a[Gd]=c}}function ub(a,b,c){var d=a[Gd],e=Fd[d||-1];return s(c)?(e||(a[Gd]=d=jb(),e=Fd[d]={}),void(e[b]=c)):e&&e[b]}function vb(a,b,c){var d=ub(a,"data"),e=s(c),f=!e&&s(b),g=f&&!t(b);if(d||g||ub(a,"data",d={}),e)d[b]=c;else{if(!f)return d;if(g)return d&&d[b];l(d,b)}}function wb(a,b){return a.getAttribute?(" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").indexOf(" "+b+" ")>-1:!1}function xb(a,b){b&&a.setAttribute&&f(b.split(" "),function(b){a.setAttribute("class",Cd((" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").replace(" "+Cd(b)+" "," ")))})}function yb(a,b){if(b&&a.setAttribute){var c=(" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ");f(b.split(" "),function(a){a=Cd(a),-1===c.indexOf(" "+a+" ")&&(c+=a+" ")}),a.setAttribute("class",Cd(c))}}function zb(a,b){if(b){b=b.nodeName||!s(b.length)||A(b)?[b]:b;for(var c=0;c<b.length;c++)a.push(b[c])}}function Ab(a,b){return Bb(a,"$"+(b||"ngController")+"Controller")}function Bb(a,b,d){a=sd(a),9==a[0].nodeType&&(a=a.find("html"));for(var e=x(b)?b:[b];a.length;){for(var f=a[0],g=0,h=e.length;h>g;g++)if((d=a.data(e[g]))!==c)return d;a=sd(f.parentNode||11===f.nodeType&&f.host)}}function Cb(a){for(var b=0,c=a.childNodes;b<c.length;b++)rb(c[b]);for(;a.firstChild;)a.removeChild(a.firstChild)}function Db(a,b){var c=Td[b.toLowerCase()];return c&&Ud[a.nodeName]&&c}function Eb(a,c){var d=function(d,e){if(d.preventDefault||(d.preventDefault=function(){d.returnValue=!1}),d.stopPropagation||(d.stopPropagation=function(){d.cancelBubble=!0}),d.target||(d.target=d.srcElement||b),r(d.defaultPrevented)){var g=d.preventDefault;d.preventDefault=function(){d.defaultPrevented=!0,g.call(d)},d.defaultPrevented=!1}d.isDefaultPrevented=function(){return d.defaultPrevented||d.returnValue===!1};var h=K(c[e||d.type]||[]);f(h,function(b){b.call(a,d)}),8>=rd?(d.preventDefault=null,d.stopPropagation=null,d.isDefaultPrevented=null):(delete d.preventDefault,delete d.stopPropagation,delete d.isDefaultPrevented)};return d.elem=a,d}function Fb(a){var b,d=typeof a;return"object"==d&&null!==a?"function"==typeof(b=a.$$hashKey)?b=a.$$hashKey():b===c&&(b=a.$$hashKey=j()):b=a,d+":"+b}function Gb(a){f(a,this.put,this)}function Hb(a){var b,c,d,e;return"function"==typeof a?(b=a.$inject)||(b=[],a.length&&(c=a.toString().replace(Yd,""),d=c.match(Vd),f(d[1].split(Wd),function(a){a.replace(Xd,function(a,c,d){b.push(d)})})),a.$inject=b):x(a)?(e=a.length-1,db(a[e],"fn"),b=a.slice(0,e)):db(a,"fn",!0),b}function Ib(a){function b(a){return function(b,c){return t(b)?void f(b,i(a)):a(b,c)}}function c(a,b){if(eb(a,"service"),(y(b)||x(b))&&(b=v.instantiate(b)),!b.$get)throw Zd("pget","Provider '{0}' must define $get factory method.",a);return s[a+n]=b}function d(a,b){return c(a,{$get:b})}function e(a,b){return d(a,["$injector",function(a){return a.instantiate(b)}])}function g(a,b){return d(a,q(b))}function h(a,b){eb(a,"constant"),s[a]=b,w[a]=b}function j(a,b){var c=v.get(a+n),d=c.$get;c.$get=function(){var a=z.invoke(d,c);return z.invoke(b,null,{$delegate:a})}}function k(a){var b,c,d,e,g=[];return f(a,function(a){if(!r.get(a)){r.put(a,!0);try{if(u(a))for(b=ud(a),g=g.concat(k(b.requires)).concat(b._runBlocks),c=b._invokeQueue,d=0,e=c.length;e>d;d++){var f=c[d],h=v.get(f[0]);h[f[1]].apply(h,f[2])}else y(a)?g.push(v.invoke(a)):x(a)?g.push(v.invoke(a)):db(a,"module")}catch(i){throw x(a)&&(a=a[a.length-1]),i.message&&i.stack&&-1==i.stack.indexOf(i.message)&&(i=i.message+"\n"+i.stack),Zd("modulerr","Failed to instantiate module {0} due to:\n{1}",a,i.stack||i.message||i)}}}),g}function l(a,b){function c(c){if(a.hasOwnProperty(c)){if(a[c]===m)throw Zd("cdep","Circular dependency found: {0}",p.join(" <- "));return a[c]}try{return p.unshift(c),a[c]=m,a[c]=b(c)}catch(d){throw a[c]===m&&delete a[c],d}finally{p.shift()}}function d(a,b,d){var e,f,g,h=[],i=Hb(a);for(f=0,e=i.length;e>f;f++){if(g=i[f],"string"!=typeof g)throw Zd("itkn","Incorrect injection token! Expected service name as string, got {0}",g);h.push(d&&d.hasOwnProperty(g)?d[g]:c(g))}return a.$inject||(a=a[e]),a.apply(b,h)}function e(a,b){var c,e,f=function(){};return f.prototype=(x(a)?a[a.length-1]:a).prototype,c=new f,e=d(a,c,b),t(e)||y(e)?e:c}return{invoke:d,instantiate:e,get:c,annotate:Hb,has:function(b){return s.hasOwnProperty(b+n)||a.hasOwnProperty(b)}}}var m={},n="Provider",p=[],r=new Gb,s={$provide:{provider:b(c),factory:b(d),service:b(e),value:b(g),constant:b(h),decorator:j}},v=s.$injector=l(s,function(){throw Zd("unpr","Unknown provider: {0}",p.join(" <- "))}),w={},z=w.$injector=l(w,function(a){var b=v.get(a+n);return z.invoke(b.$get,b)});return f(k(a),function(a){z.invoke(a||o)}),z}function Jb(){var a=!0;this.disableAutoScrolling=function(){a=!1},this.$get=["$window","$location","$rootScope",function(b,c,d){function e(a){var b=null;return f(a,function(a){b||"a"!==md(a.nodeName)||(b=a)}),b}function g(){var a,d=c.hash();d?(a=h.getElementById(d))?a.scrollIntoView():(a=e(h.getElementsByName(d)))?a.scrollIntoView():"top"===d&&b.scrollTo(0,0):b.scrollTo(0,0)}var h=b.document;return a&&d.$watch(function(){return c.hash()},function(){d.$evalAsync(g)}),g}]}function Kb(){this.$get=["$$rAF","$timeout",function(a,b){return a.supported?function(b){return a(b)}:function(a){return b(a,0,!1)}}]}function Lb(a,b,d,e){function g(a){try{a.apply(null,O(arguments,1))}finally{if(s--,0===s)for(;t.length;)try{t.pop()()}catch(b){d.error(b)}}}function h(a,b){!function c(){f(w,function(a){a()}),v=b(c,a)}()}function i(){z=null,x!=j.url()&&(x=j.url(),f(A,function(a){a(j.url())}))}var j=this,k=b[0],l=a.location,m=a.history,n=a.setTimeout,p=a.clearTimeout,q={};j.isMock=!1;var s=0,t=[];j.$$completeOutstandingRequest=g,j.$$incOutstandingRequestCount=function(){s++},j.notifyWhenNoOutstandingRequests=function(a){f(w,function(a){a()}),0===s?a():t.push(a)};var v,w=[];j.addPollFn=function(a){return r(v)&&h(100,n),w.push(a),a};var x=l.href,y=b.find("base"),z=null;j.url=function(b,c){if(l!==a.location&&(l=a.location),m!==a.history&&(m=a.history),b){if(x==b)return;return x=b,e.history?c?m.replaceState(null,"",b):(m.pushState(null,"",b),y.attr("href",y.attr("href"))):(z=b,c?l.replace(b):l.href=b),j}return z||l.href.replace(/%27/g,"'")};var A=[],B=!1;j.onUrlChange=function(b){return B||(e.history&&sd(a).on("popstate",i),e.hashchange?sd(a).on("hashchange",i):j.addPollFn(i),B=!0),A.push(b),b},j.baseHref=function(){var a=y.attr("href");return a?a.replace(/^(https?\:)?\/\/[^\/]*/,""):""};var C={},D="",E=j.baseHref();j.cookies=function(a,b){var e,f,g,h,i;if(!a){if(k.cookie!==D)for(D=k.cookie,f=D.split("; "),C={},h=0;h<f.length;h++)g=f[h],i=g.indexOf("="),i>0&&(a=unescape(g.substring(0,i)),C[a]===c&&(C[a]=unescape(g.substring(i+1))));return C}b===c?k.cookie=escape(a)+"=;path="+E+";expires=Thu, 01 Jan 1970 00:00:00 GMT":u(b)&&(e=(k.cookie=escape(a)+"="+escape(b)+";path="+E).length+1,e>4096&&d.warn("Cookie '"+a+"' possibly not set or overflowed because it was too large ("+e+" > 4096 bytes)!"))},j.defer=function(a,b){var c;return s++,c=n(function(){delete q[c],g(a)},b||0),q[c]=!0,c},j.defer.cancel=function(a){return q[a]?(delete q[a],p(a),g(o),!0):!1}}function Mb(){this.$get=["$window","$log","$sniffer","$document",function(a,b,c,d){return new Lb(a,d,b,c)}]}function Nb(){this.$get=function(){function a(a,c){function e(a){a!=m&&(n?n==a&&(n=a.n):n=a,f(a.n,a.p),f(a,m),m=a,m.n=null)}function f(a,b){a!=b&&(a&&(a.p=b),b&&(b.n=a))}if(a in b)throw d("$cacheFactory")("iid","CacheId '{0}' is already taken!",a);var g=0,h=l({},c,{id:a}),i={},j=c&&c.capacity||Number.MAX_VALUE,k={},m=null,n=null;return b[a]={put:function(a,b){if(j<Number.MAX_VALUE){var c=k[a]||(k[a]={key:a});e(c)}if(!r(b))return a in i||g++,i[a]=b,g>j&&this.remove(n.key),b},get:function(a){if(j<Number.MAX_VALUE){var b=k[a];if(!b)return;e(b)}return i[a]},remove:function(a){if(j<Number.MAX_VALUE){var b=k[a];if(!b)return;b==m&&(m=b.p),b==n&&(n=b.n),f(b.n,b.p),delete k[a]}delete i[a],g--},removeAll:function(){i={},g=0,k={},m=n=null},destroy:function(){i=null,h=null,k=null,delete b[a]},info:function(){return l({},h,{size:g})}}}var b={};return a.info=function(){var a={};return f(b,function(b,c){a[c]=b.info()}),a},a.get=function(a){return b[a]},a}}function Ob(){this.$get=["$cacheFactory",function(a){return a("templates")}]}function Pb(a,d){var e={},g="Directive",h=/^\s*directive\:\s*([\d\w\-_]+)\s+(.*)$/,j=/(([\d\w\-_]+)(?:\:([^;]+))?;?)/,k=/^(on[a-z]+|formaction)$/;this.directive=function m(b,c){return eb(b,"directive"),u(b)?(cb(c,"directiveFactory"),e.hasOwnProperty(b)||(e[b]=[],a.factory(b+g,["$injector","$exceptionHandler",function(a,c){var d=[];return f(e[b],function(e,f){try{var g=a.invoke(e);y(g)?g={compile:q(g)}:!g.compile&&g.link&&(g.compile=q(g.link)),g.priority=g.priority||0,g.index=f,g.name=g.name||b,g.require=g.require||g.controller&&g.name,g.restrict=g.restrict||"A",d.push(g)}catch(h){c(h)}}),d}])),e[b].push(c)):f(b,i(m)),this},this.aHrefSanitizationWhitelist=function(a){return s(a)?(d.aHrefSanitizationWhitelist(a),this):d.aHrefSanitizationWhitelist()},this.imgSrcSanitizationWhitelist=function(a){return s(a)?(d.imgSrcSanitizationWhitelist(a),this):d.imgSrcSanitizationWhitelist()},this.$get=["$injector","$interpolate","$exceptionHandler","$http","$templateCache","$parse","$controller","$rootScope","$document","$sce","$animate","$$sanitizeUri",function(a,d,i,m,o,r,s,v,w,z,A,B){function C(a,b,c,d,e){a instanceof sd||(a=sd(a)),f(a,function(b,c){3==b.nodeType&&b.nodeValue.match(/\S+/)&&(a[c]=b=sd(b).wrap("<span></span>").parent()[0])});var g=E(a,b,a,c,d,e);return D(a,"ng-scope"),function(b,c,d){cb(b,"scope");var e=c?Sd.clone.call(a):a;f(d,function(a,b){e.data("$"+b+"Controller",a)});for(var h=0,i=e.length;i>h;h++){var j=e[h],k=j.nodeType;(1===k||9===k)&&e.eq(h).data("$scope",b)}return c&&c(e,b),g&&g(b,e,e),e}}function D(a,b){try{a.addClass(b)}catch(c){}}function E(a,b,d,e,f,g){function h(a,d,e,f){var g,h,i,j,k,l,m,n,p,q=d.length,r=new Array(q);for(m=0;q>m;m++)r[m]=d[m];for(m=0,p=0,n=o.length;n>m;p++)i=r[p],g=o[m++],h=o[m++],j=sd(i),g?(g.scope?(k=a.$new(),j.data("$scope",k)):k=a,l=g.transclude,l||!f&&b?g(h,k,i,e,F(a,l||b)):g(h,k,i,e,f)):h&&h(a,i.childNodes,c,f)}for(var i,j,k,l,m,n,o=[],p=0;p<a.length;p++)i=new $,j=G(a[p],[],i,0===p?e:c,f),k=j.length?J(j,a[p],i,b,d,null,[],[],g):null,k&&k.scope&&D(sd(a[p]),"ng-scope"),m=k&&k.terminal||!(l=a[p].childNodes)||!l.length?null:E(l,k?k.transclude:b),o.push(k,m),n=n||k||m,g=null;return n?h:null}function F(a,b){return function(c,d,e){var f=!1;c||(c=a.$new(),c.$$transcluded=!0,f=!0);var g=b(c,d,e);return f&&g.on("$destroy",P(c,c.$destroy)),g}}function G(a,b,c,d,e){var f,g,i=a.nodeType,k=c.$attr;switch(i){case 1:N(b,Qb(vd(a).toLowerCase()),"E",d,e);for(var l,m,n,o,p,q=a.attributes,r=0,s=q&&q.length;s>r;r++){var t=!1,v=!1;if(l=q[r],!rd||rd>=8||l.specified){m=l.name,o=Qb(m),eb.test(o)&&(m=ab(o.substr(6),"-"));var w=o.replace(/(Start|End)$/,"");o===w+"Start"&&(t=m,v=m.substr(0,m.length-5)+"end",m=m.substr(0,m.length-6)),n=Qb(m.toLowerCase()),k[n]=m,c[n]=p=Cd(l.value),Db(a,n)&&(c[n]=!0),X(a,b,p,n),N(b,n,"A",d,e,t,v)}}if(g=a.className,u(g)&&""!==g)for(;f=j.exec(g);)n=Qb(f[2]),N(b,n,"C",d,e)&&(c[n]=Cd(f[3])),g=g.substr(f.index+f[0].length);break;case 3:V(b,a.nodeValue);break;case 8:try{f=h.exec(a.nodeValue),f&&(n=Qb(f[1]),N(b,n,"M",d,e)&&(c[n]=Cd(f[2])))}catch(x){}}return b.sort(S),b}function H(a,b,c){var d=[],e=0;if(b&&a.hasAttribute&&a.hasAttribute(b)){do{if(!a)throw ae("uterdir","Unterminated attribute, found '{0}' but no matching '{1}' found.",b,c);1==a.nodeType&&(a.hasAttribute(b)&&e++,a.hasAttribute(c)&&e--),d.push(a),a=a.nextSibling}while(e>0)}else d.push(a);return sd(d)}function I(a,b,c){return function(d,e,f,g,h){return e=H(e[0],b,c),a(d,e,f,g,h)}}function J(a,e,g,h,j,k,l,m,n){function o(a,b,c,d){a&&(c&&(a=I(a,c,d)),a.require=w.require,(N===w||w.$$isolateScope)&&(a=Z(a,{isolateScope:!0})),l.push(a)),b&&(c&&(b=I(b,c,d)),b.require=w.require,(N===w||w.$$isolateScope)&&(b=Z(b,{isolateScope:!0})),m.push(b))}function p(a,b,c){var d,e="data",g=!1;if(u(a)){for(;"^"==(d=a.charAt(0))||"?"==d;)a=a.substr(1),"^"==d&&(e="inheritedData"),g=g||"?"==d;if(d=null,c&&"data"===e&&(d=c[a]),d=d||b[e]("$"+a+"Controller"),!d&&!g)throw ae("ctreq","Controller '{0}', required by directive '{1}', can't be found!",a,z);return d}return x(a)&&(d=[],f(a,function(a){d.push(p(a,b,c))})),d}function q(a,b,h,j,k){function n(a,b){var d;return arguments.length<2&&(b=a,a=c),W&&(d=z),k(a,b,d)}var o,q,t,u,v,w,x,y,z={};if(o=e===h?g:K(g,new $(sd(h),g.$attr)),q=o.$$element,N){var A=/^\s*([@=&])(\??)\s*(\w*)\s*$/,B=sd(h);x=b.$new(!0),P&&P===N.$$originalDirective?B.data("$isolateScope",x):B.data("$isolateScopeNoTemplate",x),D(B,"ng-isolate-scope"),f(N.scope,function(a,c){var e,f,g,h,i=a.match(A)||[],j=i[3]||c,k="?"==i[2],l=i[1];switch(x.$$isolateBindings[c]=l+j,l){case"@":o.$observe(j,function(a){x[c]=a}),o.$$observers[j].$$scope=b,o[j]&&(x[c]=d(o[j])(b));break;case"=":if(k&&!o[j])return;f=r(o[j]),h=f.literal?L:function(a,b){return a===b},g=f.assign||function(){throw e=x[c]=f(b),ae("nonassign","Expression '{0}' used with directive '{1}' is non-assignable!",o[j],N.name)},e=x[c]=f(b),x.$watch(function(){var a=f(b);return h(a,x[c])||(h(a,e)?g(b,a=x[c]):x[c]=a),e=a},null,f.literal);break;case"&":f=r(o[j]),x[c]=function(a){return f(b,a)};break;default:throw ae("iscp","Invalid isolate scope definition for directive '{0}'. Definition: {... {1}: '{2}' ...}",N.name,c,a)}})}for(y=k&&n,J&&f(J,function(a){var c,d={$scope:a===N||a.$$isolateScope?x:b,$element:q,$attrs:o,$transclude:y};w=a.controller,"@"==w&&(w=o[a.name]),c=s(w,d),z[a.name]=c,W||q.data("$"+a.name+"Controller",c),a.controllerAs&&(d.$scope[a.controllerAs]=c)}),t=0,u=l.length;u>t;t++)try{v=l[t],v(v.isolateScope?x:b,q,o,v.require&&p(v.require,q,z),y)}catch(C){i(C,U(q))}var E=b;for(N&&(N.template||null===N.templateUrl)&&(E=x),a&&a(E,h.childNodes,c,k),t=m.length-1;t>=0;t--)try{v=m[t],v(v.isolateScope?x:b,q,o,v.require&&p(v.require,q,z),y)}catch(C){i(C,U(q))}}n=n||{};for(var v,w,z,A,B,E,F=-Number.MAX_VALUE,J=n.controllerDirectives,N=n.newIsolateScopeDirective,P=n.templateDirective,S=n.nonTlbTranscludeDirective,V=!1,W=n.hasElementTranscludeDirective,X=g.$$element=sd(e),_=k,ab=h,bb=0,cb=a.length;cb>bb;bb++){w=a[bb];var eb=w.$$start,fb=w.$$end;if(eb&&(X=H(e,eb,fb)),A=c,F>w.priority)break;if((E=w.scope)&&(v=v||w,w.templateUrl||(T("new/isolated scope",N,w,X),t(E)&&(N=w))),z=w.name,!w.templateUrl&&w.controller&&(E=w.controller,J=J||{},T("'"+z+"' controller",J[z],w,X),J[z]=w),(E=w.transclude)&&(V=!0,w.$$tlb||(T("transclusion",S,w,X),S=w),"element"==E?(W=!0,F=w.priority,A=H(e,eb,fb),X=g.$$element=sd(b.createComment(" "+z+": "+g[z]+" ")),e=X[0],Y(j,sd(O(A)),e),ab=C(A,h,F,_&&_.name,{nonTlbTranscludeDirective:S})):(A=sd(qb(e)).contents(),X.empty(),ab=C(A,h))),w.template)if(T("template",P,w,X),P=w,E=y(w.template)?w.template(X,g):w.template,E=db(E),w.replace){if(_=w,A=mb(E)?[]:sd(E),e=A[0],1!=A.length||1!==e.nodeType)throw ae("tplrt","Template for directive '{0}' must have exactly one root element. {1}",z,"");Y(j,X,e);var gb={$attr:{}},hb=G(e,[],gb),ib=a.splice(bb+1,a.length-(bb+1));N&&M(hb),a=a.concat(hb).concat(ib),Q(g,gb),cb=a.length}else X.html(E);if(w.templateUrl)T("template",P,w,X),P=w,w.replace&&(_=w),q=R(a.splice(bb,a.length-bb),X,g,j,ab,l,m,{controllerDirectives:J,newIsolateScopeDirective:N,templateDirective:P,nonTlbTranscludeDirective:S}),cb=a.length;else if(w.compile)try{B=w.compile(X,g,ab),y(B)?o(null,B,eb,fb):B&&o(B.pre,B.post,eb,fb)}catch(jb){i(jb,U(X))}w.terminal&&(q.terminal=!0,F=Math.max(F,w.priority))}return q.scope=v&&v.scope===!0,q.transclude=V&&ab,n.hasElementTranscludeDirective=W,q}function M(a){for(var b=0,c=a.length;c>b;b++)a[b]=n(a[b],{$$isolateScope:!0})}function N(b,d,f,h,j,k,l){if(d===j)return null;var m=null;if(e.hasOwnProperty(d))for(var o,p=a.get(d+g),q=0,r=p.length;r>q;q++)try{o=p[q],(h===c||h>o.priority)&&-1!=o.restrict.indexOf(f)&&(k&&(o=n(o,{$$start:k,$$end:l})),b.push(o),m=o)}catch(s){i(s)}return m}function Q(a,b){var c=b.$attr,d=a.$attr,e=a.$$element;f(a,function(d,e){"$"!=e.charAt(0)&&(b[e]&&(d+=("style"===e?";":" ")+b[e]),a.$set(e,d,!0,c[e]))}),f(b,function(b,f){"class"==f?(D(e,b),a["class"]=(a["class"]?a["class"]+" ":"")+b):"style"==f?(e.attr("style",e.attr("style")+";"+b),a.style=(a.style?a.style+";":"")+b):"$"==f.charAt(0)||a.hasOwnProperty(f)||(a[f]=b,d[f]=c[f])})}function R(a,b,c,d,e,g,h,i){var j,k,n=[],p=b[0],q=a.shift(),r=l({},q,{templateUrl:null,transclude:null,replace:null,$$originalDirective:q}),s=y(q.templateUrl)?q.templateUrl(b,c):q.templateUrl;return b.empty(),m.get(z.getTrustedResourceUrl(s),{cache:o}).success(function(l){var m,o,u,v;if(l=db(l),q.replace){if(u=mb(l)?[]:sd(l),m=u[0],1!=u.length||1!==m.nodeType)throw ae("tplrt","Template for directive '{0}' must have exactly one root element. {1}",q.name,s);o={$attr:{}},Y(d,b,m);var w=G(m,[],o);t(q.scope)&&M(w),a=w.concat(a),Q(c,o)}else m=p,b.html(l);for(a.unshift(r),j=J(a,m,c,e,b,q,g,h,i),f(d,function(a,c){a==m&&(d[c]=b[0])}),k=E(b[0].childNodes,e);n.length;){var x=n.shift(),y=n.shift(),z=n.shift(),A=n.shift(),B=b[0];if(y!==p){var C=y.className;i.hasElementTranscludeDirective&&q.replace||(B=qb(m)),Y(z,sd(y),B),D(sd(B),C)}v=j.transclude?F(x,j.transclude):A,j(k,x,B,d,v)}n=null}).error(function(a,b,c,d){throw ae("tpload","Failed to load template: {0}",d.url)}),function(a,b,c,d,e){n?(n.push(b),n.push(c),n.push(d),n.push(e)):j(k,b,c,d,e)}}function S(a,b){var c=b.priority-a.priority;return 0!==c?c:a.name!==b.name?a.name<b.name?-1:1:a.index-b.index}function T(a,b,c,d){if(b)throw ae("multidir","Multiple directives [{0}, {1}] asking for {2} on: {3}",b.name,c.name,a,U(d))}function V(a,b){var c=d(b,!0);c&&a.push({priority:0,compile:q(function(a,b){var d=b.parent(),e=d.data("$binding")||[];e.push(c),D(d.data("$binding",e),"ng-binding"),a.$watch(c,function(a){b[0].nodeValue=a})})})}function W(a,b){if("srcdoc"==b)return z.HTML;var c=vd(a);return"xlinkHref"==b||"FORM"==c&&"action"==b||"IMG"!=c&&("src"==b||"ngSrc"==b)?z.RESOURCE_URL:void 0}function X(a,b,c,e){var f=d(c,!0);if(f){if("multiple"===e&&"SELECT"===vd(a))throw ae("selmulti","Binding to the 'multiple' attribute is not supported. Element: {0}",U(a));b.push({priority:100,compile:function(){return{pre:function(b,c,g){var h=g.$$observers||(g.$$observers={});if(k.test(e))throw ae("nodomevents","Interpolations for HTML DOM event attributes are disallowed.  Please use the ng- versions (such as ng-click instead of onclick) instead.");f=d(g[e],!0,W(a,e)),f&&(g[e]=f(b),(h[e]||(h[e]=[])).$$inter=!0,(g.$$observers&&g.$$observers[e].$$scope||b).$watch(f,function(a,b){"class"===e&&a!=b?g.$updateClass(a,b):g.$set(e,a)}))}}}})}}function Y(a,c,d){var e,f,g=c[0],h=c.length,i=g.parentNode;if(a)for(e=0,f=a.length;f>e;e++)if(a[e]==g){a[e++]=d;for(var j=e,k=j+h-1,l=a.length;l>j;j++,k++)l>k?a[j]=a[k]:delete a[j];a.length-=h-1;break}i&&i.replaceChild(d,g);var m=b.createDocumentFragment();m.appendChild(g),d[sd.expando]=g[sd.expando];for(var n=1,o=c.length;o>n;n++){var p=c[n];sd(p).remove(),m.appendChild(p),delete c[n]}c[0]=d,c.length=1}function Z(a,b){return l(function(){return a.apply(null,arguments)},a,b)}var $=function(a,b){this.$$element=a,this.$attr=b||{}};$.prototype={$normalize:Qb,$addClass:function(a){a&&a.length>0&&A.addClass(this.$$element,a)},$removeClass:function(a){a&&a.length>0&&A.removeClass(this.$$element,a)},$updateClass:function(a,b){var c=Rb(a,b),d=Rb(b,a);0===c.length?A.removeClass(this.$$element,d):0===d.length?A.addClass(this.$$element,c):A.setClass(this.$$element,c,d)},$set:function(a,b,d,e){var g,h=Db(this.$$element[0],a);h&&(this.$$element.prop(a,b),e=h),this[a]=b,e?this.$attr[a]=e:(e=this.$attr[a],e||(this.$attr[a]=e=ab(a,"-"))),g=vd(this.$$element),("A"===g&&"href"===a||"IMG"===g&&"src"===a)&&(this[a]=b=B(b,"src"===a)),d!==!1&&(null===b||b===c?this.$$element.removeAttr(e):this.$$element.attr(e,b));var j=this.$$observers;j&&f(j[a],function(a){try{a(b)}catch(c){i(c)}})},$observe:function(a,b){var c=this,d=c.$$observers||(c.$$observers={}),e=d[a]||(d[a]=[]);return e.push(b),v.$evalAsync(function(){e.$$inter||b(c[a])}),b}};var _=d.startSymbol(),bb=d.endSymbol(),db="{{"==_||"}}"==bb?p:function(a){return a.replace(/\{\{/g,_).replace(/}}/g,bb)},eb=/^ngAttr[A-Z]/;return C}]}function Qb(a){return kb(a.replace(be,""))}function Rb(a,b){var c="",d=a.split(/\s+/),e=b.split(/\s+/);a:for(var f=0;f<d.length;f++){for(var g=d[f],h=0;h<e.length;h++)if(g==e[h])continue a;c+=(c.length>0?" ":"")+g}return c}function Sb(){var a={},b=/^(\S+)(\s+as\s+(\w+))?$/;this.register=function(b,c){eb(b,"controller"),t(b)?l(a,b):a[b]=c},this.$get=["$injector","$window",function(c,e){return function(f,g){var h,i,j,k;if(u(f)&&(i=f.match(b),j=i[1],k=i[3],f=a.hasOwnProperty(j)?a[j]:fb(g.$scope,j,!0)||fb(e,j,!0),db(f,j,!0)),h=c.instantiate(f,g),k){if(!g||"object"!=typeof g.$scope)throw d("$controller")("noscp","Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.",j||f.name,k);g.$scope[k]=h}return h}}]}function Tb(){this.$get=["$window",function(a){return sd(a.document)}]}function Ub(){this.$get=["$log",function(a){return function(){a.error.apply(a,arguments)}}]}function Vb(a){var b,c,d,e={};return a?(f(a.split("\n"),function(a){d=a.indexOf(":"),b=md(Cd(a.substr(0,d))),c=Cd(a.substr(d+1)),b&&(e[b]?e[b]+=", "+c:e[b]=c)}),e):e}function Wb(a){var b=t(a)?a:c;return function(c){return b||(b=Vb(a)),c?b[md(c)]||null:b}}function Xb(a,b,c){return y(c)?c(a,b):(f(c,function(c){a=c(a,b)}),a)}function Yb(a){return a>=200&&300>a}function Zb(){var a=/^\s*(\[|\{[^\{])/,b=/[\}\]]\s*$/,d=/^\)\]\}',?\n/,e={"Content-Type":"application/json;charset=utf-8"},g=this.defaults={transformResponse:[function(c){return u(c)&&(c=c.replace(d,""),a.test(c)&&b.test(c)&&(c=S(c))),c}],transformRequest:[function(a){return!t(a)||C(a)||D(a)?a:R(a)}],headers:{common:{Accept:"application/json, text/plain, */*"},post:J(e),put:J(e),patch:J(e)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN"},i=this.interceptors=[],j=this.responseInterceptors=[];this.$get=["$httpBackend","$browser","$cacheFactory","$rootScope","$q","$injector",function(a,b,d,e,k,m){function n(a){function d(a){var b=l({},a,{data:Xb(a.data,a.headers,h.transformResponse)});return Yb(a.status)?b:k.reject(b)}function e(a){function b(a){var b;f(a,function(c,d){y(c)&&(b=c(),null!=b?a[d]=b:delete a[d])})}var c,d,e,h=g.headers,i=l({},a.headers);h=l({},h.common,h[md(a.method)]),b(h),b(i);a:for(c in h){d=md(c);for(e in i)if(md(e)===d)continue a;
-i[c]=h[c]}return i}var h={method:"get",transformRequest:g.transformRequest,transformResponse:g.transformResponse},i=e(a);l(h,a),h.headers=i,h.method=od(h.method);var j=Nc(h.url)?b.cookies()[h.xsrfCookieName||g.xsrfCookieName]:c;j&&(i[h.xsrfHeaderName||g.xsrfHeaderName]=j);var m=function(a){i=a.headers;var b=Xb(a.data,Wb(i),a.transformRequest);return r(a.data)&&f(i,function(a,b){"content-type"===md(b)&&delete i[b]}),r(a.withCredentials)&&!r(g.withCredentials)&&(a.withCredentials=g.withCredentials),q(a,b,i).then(d,d)},n=[m,c],o=k.when(h);for(f(z,function(a){(a.request||a.requestError)&&n.unshift(a.request,a.requestError),(a.response||a.responseError)&&n.push(a.response,a.responseError)});n.length;){var p=n.shift(),s=n.shift();o=o.then(p,s)}return o.success=function(a){return o.then(function(b){a(b.data,b.status,b.headers,h)}),o},o.error=function(a){return o.then(null,function(b){a(b.data,b.status,b.headers,h)}),o},o}function o(){f(arguments,function(a){n[a]=function(b,c){return n(l(c||{},{method:a,url:b}))}})}function p(){f(arguments,function(a){n[a]=function(b,c,d){return n(l(d||{},{method:a,url:b,data:c}))}})}function q(b,c,d){function f(a,b,c,d){j&&(Yb(a)?j.put(p,[a,b,Vb(c),d]):j.remove(p)),h(b,a,c,d),e.$$phase||e.$apply()}function h(a,c,d,e){c=Math.max(c,0),(Yb(c)?m.resolve:m.reject)({data:a,status:c,headers:Wb(d),config:b,statusText:e})}function i(){var a=H(n.pendingRequests,b);-1!==a&&n.pendingRequests.splice(a,1)}var j,l,m=k.defer(),o=m.promise,p=v(b.url,b.params);if(n.pendingRequests.push(b),o.then(i,i),(b.cache||g.cache)&&b.cache!==!1&&"GET"==b.method&&(j=t(b.cache)?b.cache:t(g.cache)?g.cache:w),j)if(l=j.get(p),s(l)){if(l.then)return l.then(i,i),l;x(l)?h(l[1],l[0],J(l[2]),l[3]):h(l,200,{},"OK")}else j.put(p,o);return r(l)&&a(b.method,p,c,f,d,b.timeout,b.withCredentials,b.responseType),o}function v(a,b){if(!b)return a;var c=[];return h(b,function(a,b){null===a||r(a)||(x(a)||(a=[a]),f(a,function(a){t(a)&&(a=R(a)),c.push(Z(b)+"="+Z(a))}))}),c.length>0&&(a+=(-1==a.indexOf("?")?"?":"&")+c.join("&")),a}var w=d("$http"),z=[];return f(i,function(a){z.unshift(u(a)?m.get(a):m.invoke(a))}),f(j,function(a,b){var c=u(a)?m.get(a):m.invoke(a);z.splice(b,0,{response:function(a){return c(k.when(a))},responseError:function(a){return c(k.reject(a))}})}),n.pendingRequests=[],o("get","delete","head","jsonp"),p("post","put"),n.defaults=g,n}]}function $b(b){if(8>=rd&&(!b.match(/^(get|post|head|put|delete|options)$/i)||!a.XMLHttpRequest))return new a.ActiveXObject("Microsoft.XMLHTTP");if(a.XMLHttpRequest)return new a.XMLHttpRequest;throw d("$httpBackend")("noxhr","This browser does not support XMLHttpRequest.")}function _b(){this.$get=["$browser","$window","$document",function(a,b,c){return ac(a,$b,a.defer,b.angular.callbacks,c[0])}]}function ac(a,b,c,d,e){function g(a,b){var c=e.createElement("script"),d=function(){c.onreadystatechange=c.onload=c.onerror=null,e.body.removeChild(c),b&&b()};return c.type="text/javascript",c.src=a,rd&&8>=rd?c.onreadystatechange=function(){/loaded|complete/.test(c.readyState)&&d()}:c.onload=c.onerror=function(){d()},e.body.appendChild(c),d}var h=-1;return function(e,i,j,k,l,m,n,p){function q(){t=h,v&&v(),w&&w.abort()}function r(b,d,e,f,g){y&&c.cancel(y),v=w=null,0===d&&(d=e?200:"file"==Mc(i).protocol?404:0),d=1223===d?204:d,g=g||"",b(d,e,f,g),a.$$completeOutstandingRequest(o)}var t;if(a.$$incOutstandingRequestCount(),i=i||a.url(),"jsonp"==md(e)){var u="_"+(d.counter++).toString(36);d[u]=function(a){d[u].data=a};var v=g(i.replace("JSON_CALLBACK","angular.callbacks."+u),function(){d[u].data?r(k,200,d[u].data):r(k,t||-2),d[u]=Ad.noop})}else{var w=b(e);if(w.open(e,i,!0),f(l,function(a,b){s(a)&&w.setRequestHeader(b,a)}),w.onreadystatechange=function(){if(w&&4==w.readyState){var a=null,b=null;t!==h&&(a=w.getAllResponseHeaders(),b="response"in w?w.response:w.responseText),r(k,t||w.status,b,a,w.statusText||"")}},n&&(w.withCredentials=!0),p)try{w.responseType=p}catch(x){if("json"!==p)throw x}w.send(j||null)}if(m>0)var y=c(q,m);else m&&m.then&&m.then(q)}}function bc(){var a="{{",b="}}";this.startSymbol=function(b){return b?(a=b,this):a},this.endSymbol=function(a){return a?(b=a,this):b},this.$get=["$parse","$exceptionHandler","$sce",function(c,d,e){function f(f,i,j){for(var k,l,m,n,o=0,p=[],q=f.length,s=!1,t=[];q>o;)-1!=(k=f.indexOf(a,o))&&-1!=(l=f.indexOf(b,k+g))?(o!=k&&p.push(f.substring(o,k)),p.push(m=c(n=f.substring(k+g,l))),m.exp=n,o=l+h,s=!0):(o!=q&&p.push(f.substring(o)),o=q);if((q=p.length)||(p.push(""),q=1),j&&p.length>1)throw ce("noconcat","Error while interpolating: {0}\nStrict Contextual Escaping disallows interpolations that concatenate multiple expressions when a trusted value is required.  See http://docs.angularjs.org/api/ng.$sce",f);return!i||s?(t.length=q,m=function(a){try{for(var b,c=0,g=q;g>c;c++)"function"==typeof(b=p[c])&&(b=b(a),b=j?e.getTrusted(j,b):e.valueOf(b),null===b||r(b)?b="":"string"!=typeof b&&(b=R(b))),t[c]=b;return t.join("")}catch(h){var i=ce("interr","Can't interpolate: {0}\n{1}",f,h.toString());d(i)}},m.exp=f,m.parts=p,m):void 0}var g=a.length,h=b.length;return f.startSymbol=function(){return a},f.endSymbol=function(){return b},f}]}function cc(){this.$get=["$rootScope","$window","$q",function(a,b,c){function d(d,f,g,h){var i=b.setInterval,j=b.clearInterval,k=c.defer(),l=k.promise,m=0,n=s(h)&&!h;return g=s(g)?g:0,l.then(null,null,d),l.$$intervalId=i(function(){k.notify(m++),g>0&&m>=g&&(k.resolve(m),j(l.$$intervalId),delete e[l.$$intervalId]),n||a.$apply()},f),e[l.$$intervalId]=k,l}var e={};return d.cancel=function(a){return a&&a.$$intervalId in e?(e[a.$$intervalId].reject("canceled"),clearInterval(a.$$intervalId),delete e[a.$$intervalId],!0):!1},d}]}function dc(){this.$get=function(){return{id:"en-us",NUMBER_FORMATS:{DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{minInt:1,minFrac:0,maxFrac:3,posPre:"",posSuf:"",negPre:"-",negSuf:"",gSize:3,lgSize:3},{minInt:1,minFrac:2,maxFrac:2,posPre:"¤",posSuf:"",negPre:"(¤",negSuf:")",gSize:3,lgSize:3}],CURRENCY_SYM:"$"},DATETIME_FORMATS:{MONTH:"January,February,March,April,May,June,July,August,September,October,November,December".split(","),SHORTMONTH:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".split(","),DAY:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(","),SHORTDAY:"Sun,Mon,Tue,Wed,Thu,Fri,Sat".split(","),AMPMS:["AM","PM"],medium:"MMM d, y h:mm:ss a","short":"M/d/yy h:mm a",fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",mediumDate:"MMM d, y",shortDate:"M/d/yy",mediumTime:"h:mm:ss a",shortTime:"h:mm a"},pluralCat:function(a){return 1===a?"one":"other"}}}}function ec(a){for(var b=a.split("/"),c=b.length;c--;)b[c]=Y(b[c]);return b.join("/")}function fc(a,b,c){var d=Mc(a,c);b.$$protocol=d.protocol,b.$$host=d.hostname,b.$$port=m(d.port)||ee[d.protocol]||null}function gc(a,b,c){var d="/"!==a.charAt(0);d&&(a="/"+a);var e=Mc(a,c);b.$$path=decodeURIComponent(d&&"/"===e.pathname.charAt(0)?e.pathname.substring(1):e.pathname),b.$$search=W(e.search),b.$$hash=decodeURIComponent(e.hash),b.$$path&&"/"!=b.$$path.charAt(0)&&(b.$$path="/"+b.$$path)}function hc(a,b){return 0===b.indexOf(a)?b.substr(a.length):void 0}function ic(a){var b=a.indexOf("#");return-1==b?a:a.substr(0,b)}function jc(a){return a.substr(0,ic(a).lastIndexOf("/")+1)}function kc(a){return a.substring(0,a.indexOf("/",a.indexOf("//")+2))}function lc(a,b){this.$$html5=!0,b=b||"";var d=jc(a);fc(a,this,a),this.$$parse=function(b){var c=hc(d,b);if(!u(c))throw fe("ipthprfx",'Invalid url "{0}", missing path prefix "{1}".',b,d);gc(c,this,a),this.$$path||(this.$$path="/"),this.$$compose()},this.$$compose=function(){var a=X(this.$$search),b=this.$$hash?"#"+Y(this.$$hash):"";this.$$url=ec(this.$$path)+(a?"?"+a:"")+b,this.$$absUrl=d+this.$$url.substr(1)},this.$$rewrite=function(e){var f,g;return(f=hc(a,e))!==c?(g=f,(f=hc(b,f))!==c?d+(hc("/",f)||f):a+g):(f=hc(d,e))!==c?d+f:d==e+"/"?d:void 0}}function mc(a,b){var c=jc(a);fc(a,this,a),this.$$parse=function(d){function e(a,b,c){var d,e=/^\/?.*?:(\/.*)/;return 0===b.indexOf(c)&&(b=b.replace(c,"")),e.exec(b)?a:(d=e.exec(a),d?d[1]:a)}var f=hc(a,d)||hc(c,d),g="#"==f.charAt(0)?hc(b,f):this.$$html5?f:"";if(!u(g))throw fe("ihshprfx",'Invalid url "{0}", missing hash prefix "{1}".',d,b);gc(g,this,a),this.$$path=e(this.$$path,g,a),this.$$compose()},this.$$compose=function(){var c=X(this.$$search),d=this.$$hash?"#"+Y(this.$$hash):"";this.$$url=ec(this.$$path)+(c?"?"+c:"")+d,this.$$absUrl=a+(this.$$url?b+this.$$url:"")},this.$$rewrite=function(b){return ic(a)==ic(b)?b:void 0}}function nc(a,b){this.$$html5=!0,mc.apply(this,arguments);var c=jc(a);this.$$rewrite=function(d){var e;return a==ic(d)?d:(e=hc(c,d))?a+b+e:c===d+"/"?c:void 0}}function oc(a){return function(){return this[a]}}function pc(a,b){return function(c){return r(c)?this[a]:(this[a]=b(c),this.$$compose(),this)}}function qc(){var b="",c=!1;this.hashPrefix=function(a){return s(a)?(b=a,this):b},this.html5Mode=function(a){return s(a)?(c=a,this):c},this.$get=["$rootScope","$browser","$sniffer","$rootElement",function(d,e,f,g){function h(a){d.$broadcast("$locationChangeSuccess",i.absUrl(),a)}var i,j,k,l=e.baseHref(),m=e.url();c?(k=kc(m)+(l||"/"),j=f.history?lc:nc):(k=ic(m),j=mc),i=new j(k,"#"+b),i.$$parse(i.$$rewrite(m)),g.on("click",function(b){if(!b.ctrlKey&&!b.metaKey&&2!=b.which){for(var c=sd(b.target);"a"!==md(c[0].nodeName);)if(c[0]===g[0]||!(c=c.parent())[0])return;var f=c.prop("href");t(f)&&"[object SVGAnimatedString]"===f.toString()&&(f=Mc(f.animVal).href);var h=i.$$rewrite(f);f&&!c.attr("target")&&h&&!b.isDefaultPrevented()&&(b.preventDefault(),h!=e.url()&&(i.$$parse(h),d.$apply(),a.angular["ff-684208-preventDefault"]=!0))}}),i.absUrl()!=m&&e.url(i.absUrl(),!0),e.onUrlChange(function(a){i.absUrl()!=a&&(d.$evalAsync(function(){var b=i.absUrl();i.$$parse(a),d.$broadcast("$locationChangeStart",a,b).defaultPrevented?(i.$$parse(b),e.url(b)):h(b)}),d.$$phase||d.$digest())});var n=0;return d.$watch(function(){var a=e.url(),b=i.$$replace;return n&&a==i.absUrl()||(n++,d.$evalAsync(function(){d.$broadcast("$locationChangeStart",i.absUrl(),a).defaultPrevented?i.$$parse(a):(e.url(i.absUrl(),b),h(a))})),i.$$replace=!1,n}),i}]}function rc(){var a=!0,b=this;this.debugEnabled=function(b){return s(b)?(a=b,this):a},this.$get=["$window",function(c){function d(a){return a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&(a=a.message+"\n"+a.sourceURL+":"+a.line)),a}function e(a){var b=c.console||{},e=b[a]||b.log||o,g=!1;try{g=!!e.apply}catch(h){}return g?function(){var a=[];return f(arguments,function(b){a.push(d(b))}),e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){a&&c.apply(b,arguments)}}()}}]}function sc(a,b){if("constructor"===a)throw he("isecfld",'Referencing "constructor" field in Angular expressions is disallowed! Expression: {0}',b);return a}function tc(a,b){if(a){if(a.constructor===a)throw he("isecfn","Referencing Function in Angular expressions is disallowed! Expression: {0}",b);if(a.document&&a.location&&a.alert&&a.setInterval)throw he("isecwindow","Referencing the Window in Angular expressions is disallowed! Expression: {0}",b);if(a.children&&(a.nodeName||a.prop&&a.attr&&a.find))throw he("isecdom","Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}",b)}return a}function uc(a,b,d,e,f){f=f||{};for(var g,h=b.split("."),i=0;h.length>1;i++){g=sc(h.shift(),e);var j=a[g];j||(j={},a[g]=j),a=j,a.then&&f.unwrapPromises&&(ge(e),"$$v"in a||!function(a){a.then(function(b){a.$$v=b})}(a),a.$$v===c&&(a.$$v={}),a=a.$$v)}return g=sc(h.shift(),e),a[g]=d,d}function vc(a,b,d,e,f,g,h){return sc(a,g),sc(b,g),sc(d,g),sc(e,g),sc(f,g),h.unwrapPromises?function(h,i){var j,k=i&&i.hasOwnProperty(a)?i:h;return null==k?k:(k=k[a],k&&k.then&&(ge(g),"$$v"in k||(j=k,j.$$v=c,j.then(function(a){j.$$v=a})),k=k.$$v),b?null==k?c:(k=k[b],k&&k.then&&(ge(g),"$$v"in k||(j=k,j.$$v=c,j.then(function(a){j.$$v=a})),k=k.$$v),d?null==k?c:(k=k[d],k&&k.then&&(ge(g),"$$v"in k||(j=k,j.$$v=c,j.then(function(a){j.$$v=a})),k=k.$$v),e?null==k?c:(k=k[e],k&&k.then&&(ge(g),"$$v"in k||(j=k,j.$$v=c,j.then(function(a){j.$$v=a})),k=k.$$v),f?null==k?c:(k=k[f],k&&k.then&&(ge(g),"$$v"in k||(j=k,j.$$v=c,j.then(function(a){j.$$v=a})),k=k.$$v),k):k):k):k):k)}:function(g,h){var i=h&&h.hasOwnProperty(a)?h:g;return null==i?i:(i=i[a],b?null==i?c:(i=i[b],d?null==i?c:(i=i[d],e?null==i?c:(i=i[e],f?null==i?c:i=i[f]:i):i):i):i)}}function wc(a,b){return sc(a,b),function(b,d){return null==b?c:(d&&d.hasOwnProperty(a)?d:b)[a]}}function xc(a,b,d){return sc(a,d),sc(b,d),function(d,e){return null==d?c:(d=(e&&e.hasOwnProperty(a)?e:d)[a],null==d?c:d[b])}}function yc(a,b,d){if(ne.hasOwnProperty(a))return ne[a];var e,g=a.split("."),h=g.length;if(b.unwrapPromises||1!==h)if(b.unwrapPromises||2!==h)if(b.csp)e=6>h?vc(g[0],g[1],g[2],g[3],g[4],d,b):function(a,e){var f,i=0;do f=vc(g[i++],g[i++],g[i++],g[i++],g[i++],d,b)(a,e),e=c,a=f;while(h>i);return f};else{var i="var p;\n";f(g,function(a,c){sc(a,d),i+="if(s == null) return undefined;\ns="+(c?"s":'((k&&k.hasOwnProperty("'+a+'"))?k:s)')+'["'+a+'"];\n'+(b.unwrapPromises?'if (s && s.then) {\n pw("'+d.replace(/(["\r\n])/g,"\\$1")+'");\n if (!("$$v" in s)) {\n p=s;\n p.$$v = undefined;\n p.then(function(v) {p.$$v=v;});\n}\n s=s.$$v\n}\n':"")}),i+="return s;";var j=new Function("s","k","pw",i);j.toString=q(i),e=b.unwrapPromises?function(a,b){return j(a,b,ge)}:j}else e=xc(g[0],g[1],d);else e=wc(g[0],d);return"hasOwnProperty"!==a&&(ne[a]=e),e}function zc(){var a={},b={csp:!1,unwrapPromises:!1,logPromiseWarnings:!0};this.unwrapPromises=function(a){return s(a)?(b.unwrapPromises=!!a,this):b.unwrapPromises},this.logPromiseWarnings=function(a){return s(a)?(b.logPromiseWarnings=a,this):b.logPromiseWarnings},this.$get=["$filter","$sniffer","$log",function(c,d,e){return b.csp=d.csp,ge=function(a){b.logPromiseWarnings&&!ie.hasOwnProperty(a)&&(ie[a]=!0,e.warn("[$parse] Promise found in the expression `"+a+"`. Automatic unwrapping of promises in Angular expressions is deprecated."))},function(d){var e;switch(typeof d){case"string":if(a.hasOwnProperty(d))return a[d];var f=new le(b),g=new me(f,c,b);return e=g.parse(d,!1),"hasOwnProperty"!==d&&(a[d]=e),e;case"function":return d;default:return o}}}]}function Ac(){this.$get=["$rootScope","$exceptionHandler",function(a,b){return Bc(function(b){a.$evalAsync(b)},b)}]}function Bc(a,b){function d(a){return a}function e(a){return j(a)}function g(a){var b=h(),c=0,d=x(a)?[]:{};return f(a,function(a,e){c++,i(a).then(function(a){d.hasOwnProperty(e)||(d[e]=a,--c||b.resolve(d))},function(a){d.hasOwnProperty(e)||b.reject(a)})}),0===c&&b.resolve(d),b.promise}var h=function(){var f,g,j=[];return g={resolve:function(b){if(j){var d=j;j=c,f=i(b),d.length&&a(function(){for(var a,b=0,c=d.length;c>b;b++)a=d[b],f.then(a[0],a[1],a[2])})}},reject:function(a){g.resolve(k(a))},notify:function(b){if(j){var c=j;j.length&&a(function(){for(var a,d=0,e=c.length;e>d;d++)a=c[d],a[2](b)})}},promise:{then:function(a,c,g){var i=h(),k=function(c){try{i.resolve((y(a)?a:d)(c))}catch(e){i.reject(e),b(e)}},l=function(a){try{i.resolve((y(c)?c:e)(a))}catch(d){i.reject(d),b(d)}},m=function(a){try{i.notify((y(g)?g:d)(a))}catch(c){b(c)}};return j?j.push([k,l,m]):f.then(k,l,m),i.promise},"catch":function(a){return this.then(null,a)},"finally":function(a){function b(a,b){var c=h();return b?c.resolve(a):c.reject(a),c.promise}function c(c,e){var f=null;try{f=(a||d)()}catch(g){return b(g,!1)}return f&&y(f.then)?f.then(function(){return b(c,e)},function(a){return b(a,!1)}):b(c,e)}return this.then(function(a){return c(a,!0)},function(a){return c(a,!1)})}}}},i=function(b){return b&&y(b.then)?b:{then:function(c){var d=h();return a(function(){d.resolve(c(b))}),d.promise}}},j=function(a){var b=h();return b.reject(a),b.promise},k=function(c){return{then:function(d,f){var g=h();return a(function(){try{g.resolve((y(f)?f:e)(c))}catch(a){g.reject(a),b(a)}}),g.promise}}},l=function(c,f,g,k){var l,m=h(),n=function(a){try{return(y(f)?f:d)(a)}catch(c){return b(c),j(c)}},o=function(a){try{return(y(g)?g:e)(a)}catch(c){return b(c),j(c)}},p=function(a){try{return(y(k)?k:d)(a)}catch(c){b(c)}};return a(function(){i(c).then(function(a){l||(l=!0,m.resolve(i(a).then(n,o,p)))},function(a){l||(l=!0,m.resolve(o(a)))},function(a){l||m.notify(p(a))})}),m.promise};return{defer:h,reject:j,when:l,all:g}}function Cc(){this.$get=["$window","$timeout",function(a,b){var c=a.requestAnimationFrame||a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame,d=a.cancelAnimationFrame||a.webkitCancelAnimationFrame||a.mozCancelAnimationFrame||a.webkitCancelRequestAnimationFrame,e=!!c,f=e?function(a){var b=c(a);return function(){d(b)}}:function(a){var c=b(a,16.66,!1);return function(){b.cancel(c)}};return f.supported=e,f}]}function Dc(){var a=10,b=d("$rootScope"),c=null;this.digestTtl=function(b){return arguments.length&&(a=b),a},this.$get=["$injector","$exceptionHandler","$parse","$browser",function(d,g,h,i){function k(){this.$id=j(),this.$$phase=this.$parent=this.$$watchers=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null,this["this"]=this.$root=this,this.$$destroyed=!1,this.$$asyncQueue=[],this.$$postDigestQueue=[],this.$$listeners={},this.$$listenerCount={},this.$$isolateBindings={}}function l(a){if(r.$$phase)throw b("inprog","{0} already in progress",r.$$phase);r.$$phase=a}function m(){r.$$phase=null}function n(a,b){var c=h(a);return db(c,b),c}function p(a,b,c){do a.$$listenerCount[c]-=b,0===a.$$listenerCount[c]&&delete a.$$listenerCount[c];while(a=a.$parent)}function q(){}k.prototype={constructor:k,$new:function(a){var b,c;return a?(c=new k,c.$root=this.$root,c.$$asyncQueue=this.$$asyncQueue,c.$$postDigestQueue=this.$$postDigestQueue):(b=function(){},b.prototype=this,c=new b,c.$id=j()),c["this"]=c,c.$$listeners={},c.$$listenerCount={},c.$parent=this,c.$$watchers=c.$$nextSibling=c.$$childHead=c.$$childTail=null,c.$$prevSibling=this.$$childTail,this.$$childHead?(this.$$childTail.$$nextSibling=c,this.$$childTail=c):this.$$childHead=this.$$childTail=c,c},$watch:function(a,b,d){var e=this,f=n(a,"watch"),g=e.$$watchers,h={fn:b,last:q,get:f,exp:a,eq:!!d};if(c=null,!y(b)){var i=n(b||o,"listener");h.fn=function(a,b,c){i(c)}}if("string"==typeof a&&f.constant){var j=h.fn;h.fn=function(a,b,c){j.call(this,a,b,c),I(g,h)}}return g||(g=e.$$watchers=[]),g.unshift(h),function(){I(g,h),c=null}},$watchCollection:function(a,b){function c(){f=m(j);var a,b;if(t(f))if(e(f)){g!==n&&(g=n,q=g.length=0,l++),a=f.length,q!==a&&(l++,g.length=q=a);for(var c=0;a>c;c++){var d=g[c]!==g[c]&&f[c]!==f[c];d||g[c]===f[c]||(l++,g[c]=f[c])}}else{g!==o&&(g=o={},q=0,l++),a=0;for(b in f)f.hasOwnProperty(b)&&(a++,g.hasOwnProperty(b)?g[b]!==f[b]&&(l++,g[b]=f[b]):(q++,g[b]=f[b],l++));if(q>a){l++;for(b in g)g.hasOwnProperty(b)&&!f.hasOwnProperty(b)&&(q--,delete g[b])}}else g!==f&&(g=f,l++);return l}function d(){if(p?(p=!1,b(f,f,j)):b(f,i,j),k)if(t(f))if(e(f)){i=new Array(f.length);for(var a=0;a<f.length;a++)i[a]=f[a]}else{i={};for(var c in f)nd.call(f,c)&&(i[c]=f[c])}else i=f}var f,g,i,j=this,k=b.length>1,l=0,m=h(a),n=[],o={},p=!0,q=0;return this.$watch(c,d)},$digest:function(){var d,e,f,h,i,j,k,n,o,p,r,s=this.$$asyncQueue,t=this.$$postDigestQueue,u=a,v=this,w=[];l("$digest"),c=null;do{for(j=!1,n=v;s.length;){try{r=s.shift(),r.scope.$eval(r.expression)}catch(x){m(),g(x)}c=null}a:do{if(h=n.$$watchers)for(i=h.length;i--;)try{if(d=h[i])if((e=d.get(n))===(f=d.last)||(d.eq?L(e,f):"number"==typeof e&&"number"==typeof f&&isNaN(e)&&isNaN(f))){if(d===c){j=!1;break a}}else j=!0,c=d,d.last=d.eq?J(e):e,d.fn(e,f===q?e:f,n),5>u&&(o=4-u,w[o]||(w[o]=[]),p=y(d.exp)?"fn: "+(d.exp.name||d.exp.toString()):d.exp,p+="; newVal: "+R(e)+"; oldVal: "+R(f),w[o].push(p))}catch(x){m(),g(x)}if(!(k=n.$$childHead||n!==v&&n.$$nextSibling))for(;n!==v&&!(k=n.$$nextSibling);)n=n.$parent}while(n=k);if((j||s.length)&&!u--)throw m(),b("infdig","{0} $digest() iterations reached. Aborting!\nWatchers fired in the last 5 iterations: {1}",a,R(w))}while(j||s.length);for(m();t.length;)try{t.shift()()}catch(x){g(x)}},$destroy:function(){if(!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy"),this.$$destroyed=!0,this!==r&&(f(this.$$listenerCount,P(null,p,this)),a.$$childHead==this&&(a.$$childHead=this.$$nextSibling),a.$$childTail==this&&(a.$$childTail=this.$$prevSibling),this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling),this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling),this.$parent=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=this.$root=null,this.$$listeners={},this.$$watchers=this.$$asyncQueue=this.$$postDigestQueue=[],this.$destroy=this.$digest=this.$apply=o,this.$on=this.$watch=function(){return o})}},$eval:function(a,b){return h(a)(this,b)},$evalAsync:function(a){r.$$phase||r.$$asyncQueue.length||i.defer(function(){r.$$asyncQueue.length&&r.$digest()}),this.$$asyncQueue.push({scope:this,expression:a})},$$postDigest:function(a){this.$$postDigestQueue.push(a)},$apply:function(a){try{return l("$apply"),this.$eval(a)}catch(b){g(b)}finally{m();try{r.$digest()}catch(b){throw g(b),b}}},$on:function(a,b){var c=this.$$listeners[a];c||(this.$$listeners[a]=c=[]),c.push(b);var d=this;do d.$$listenerCount[a]||(d.$$listenerCount[a]=0),d.$$listenerCount[a]++;while(d=d.$parent);var e=this;return function(){c[H(c,b)]=null,p(e,1,a)}},$emit:function(a){var b,c,d,e=[],f=this,h=!1,i={name:a,targetScope:f,stopPropagation:function(){h=!0},preventDefault:function(){i.defaultPrevented=!0},defaultPrevented:!1},j=N([i],arguments,1);do{for(b=f.$$listeners[a]||e,i.currentScope=f,c=0,d=b.length;d>c;c++)if(b[c])try{b[c].apply(null,j)}catch(k){g(k)}else b.splice(c,1),c--,d--;if(h)return i;f=f.$parent}while(f);return i},$broadcast:function(a){for(var b,c,d,e=this,f=e,h=e,i={name:a,targetScope:e,preventDefault:function(){i.defaultPrevented=!0},defaultPrevented:!1},j=N([i],arguments,1);f=h;){for(i.currentScope=f,b=f.$$listeners[a]||[],c=0,d=b.length;d>c;c++)if(b[c])try{b[c].apply(null,j)}catch(k){g(k)}else b.splice(c,1),c--,d--;if(!(h=f.$$listenerCount[a]&&f.$$childHead||f!==e&&f.$$nextSibling))for(;f!==e&&!(h=f.$$nextSibling);)f=f.$parent}return i}};var r=new k;return r}]}function Ec(){var a=/^\s*(https?|ftp|mailto|tel|file):/,b=/^\s*(https?|ftp|file):|data:image\//;this.aHrefSanitizationWhitelist=function(b){return s(b)?(a=b,this):a},this.imgSrcSanitizationWhitelist=function(a){return s(a)?(b=a,this):b},this.$get=function(){return function(c,d){var e,f=d?b:a;return rd&&!(rd>=8)||(e=Mc(c).href,""===e||e.match(f))?c:"unsafe:"+e}}}function Fc(a){return a.replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g,"\\$1").replace(/\x08/g,"\\x08")}function Gc(a){if("self"===a)return a;if(u(a)){if(a.indexOf("***")>-1)throw oe("iwcard","Illegal sequence *** in string matcher.  String: {0}",a);return a=Fc(a).replace("\\*\\*",".*").replace("\\*","[^:/.?&;]*"),new RegExp("^"+a+"$")}if(z(a))return new RegExp("^"+a.source+"$");throw oe("imatcher",'Matchers may only be "self", string patterns or RegExp objects')}function Hc(a){var b=[];return s(a)&&f(a,function(a){b.push(Gc(a))}),b}function Ic(){this.SCE_CONTEXTS=pe;var a=["self"],b=[];this.resourceUrlWhitelist=function(b){return arguments.length&&(a=Hc(b)),a},this.resourceUrlBlacklist=function(a){return arguments.length&&(b=Hc(a)),b},this.$get=["$injector",function(d){function e(a,b){return"self"===a?Nc(b):!!a.exec(b.href)}function f(c){var d,f,g=Mc(c.toString()),h=!1;for(d=0,f=a.length;f>d;d++)if(e(a[d],g)){h=!0;break}if(h)for(d=0,f=b.length;f>d;d++)if(e(b[d],g)){h=!1;break}return h}function g(a){var b=function(a){this.$$unwrapTrustedValue=function(){return a}};return a&&(b.prototype=new a),b.prototype.valueOf=function(){return this.$$unwrapTrustedValue()},b.prototype.toString=function(){return this.$$unwrapTrustedValue().toString()},b}function h(a,b){var d=m.hasOwnProperty(a)?m[a]:null;if(!d)throw oe("icontext","Attempted to trust a value in invalid context. Context: {0}; Value: {1}",a,b);if(null===b||b===c||""===b)return b;if("string"!=typeof b)throw oe("itype","Attempted to trust a non-string value in a content requiring a string: Context: {0}",a);return new d(b)}function i(a){return a instanceof l?a.$$unwrapTrustedValue():a}function j(a,b){if(null===b||b===c||""===b)return b;var d=m.hasOwnProperty(a)?m[a]:null;if(d&&b instanceof d)return b.$$unwrapTrustedValue();if(a===pe.RESOURCE_URL){if(f(b))return b;throw oe("insecurl","Blocked loading resource from url not allowed by $sceDelegate policy.  URL: {0}",b.toString())}if(a===pe.HTML)return k(b);throw oe("unsafe","Attempting to use an unsafe value in a safe context.")}var k=function(){throw oe("unsafe","Attempting to use an unsafe value in a safe context.")};d.has("$sanitize")&&(k=d.get("$sanitize"));var l=g(),m={};return m[pe.HTML]=g(l),m[pe.CSS]=g(l),m[pe.URL]=g(l),m[pe.JS]=g(l),m[pe.RESOURCE_URL]=g(m[pe.URL]),{trustAs:h,getTrusted:j,valueOf:i}}]}function Jc(){var a=!0;this.enabled=function(b){return arguments.length&&(a=!!b),a},this.$get=["$parse","$sniffer","$sceDelegate",function(b,c,d){if(a&&c.msie&&c.msieDocumentMode<8)throw oe("iequirks","Strict Contextual Escaping does not support Internet Explorer version < 9 in quirks mode.  You can fix this by adding the text <!doctype html> to the top of your HTML document.  See http://docs.angularjs.org/api/ng.$sce for more information.");var e=J(pe);e.isEnabled=function(){return a},e.trustAs=d.trustAs,e.getTrusted=d.getTrusted,e.valueOf=d.valueOf,a||(e.trustAs=e.getTrusted=function(a,b){return b},e.valueOf=p),e.parseAs=function(a,c){var d=b(c);return d.literal&&d.constant?d:function(b,c){return e.getTrusted(a,d(b,c))}};var g=e.parseAs,h=e.getTrusted,i=e.trustAs;return f(pe,function(a,b){var c=md(b);e[kb("parse_as_"+c)]=function(b){return g(a,b)},e[kb("get_trusted_"+c)]=function(b){return h(a,b)},e[kb("trust_as_"+c)]=function(b){return i(a,b)}}),e}]}function Kc(){this.$get=["$window","$document",function(a,b){var c,d,e={},f=m((/android (\d+)/.exec(md((a.navigator||{}).userAgent))||[])[1]),g=/Boxee/i.test((a.navigator||{}).userAgent),h=b[0]||{},i=h.documentMode,j=/^(Moz|webkit|O|ms)(?=[A-Z])/,k=h.body&&h.body.style,l=!1,n=!1;if(k){for(var o in k)if(d=j.exec(o)){c=d[0],c=c.substr(0,1).toUpperCase()+c.substr(1);break}c||(c="WebkitOpacity"in k&&"webkit"),l=!!("transition"in k||c+"Transition"in k),n=!!("animation"in k||c+"Animation"in k),!f||l&&n||(l=u(h.body.style.webkitTransition),n=u(h.body.style.webkitAnimation))}return{history:!(!a.history||!a.history.pushState||4>f||g),hashchange:"onhashchange"in a&&(!i||i>7),hasEvent:function(a){if("input"==a&&9==rd)return!1;if(r(e[a])){var b=h.createElement("div");e[a]="on"+a in b}return e[a]},csp:M(),vendorPrefix:c,transitions:l,animations:n,android:f,msie:rd,msieDocumentMode:i}}]}function Lc(){this.$get=["$rootScope","$browser","$q","$exceptionHandler",function(a,b,c,d){function e(e,g,h){var i,j=c.defer(),k=j.promise,l=s(h)&&!h;return i=b.defer(function(){try{j.resolve(e())}catch(b){j.reject(b),d(b)}finally{delete f[k.$$timeoutId]}l||a.$apply()},g),k.$$timeoutId=i,f[i]=j,k}var f={};return e.cancel=function(a){return a&&a.$$timeoutId in f?(f[a.$$timeoutId].reject("canceled"),delete f[a.$$timeoutId],b.defer.cancel(a.$$timeoutId)):!1},e}]}function Mc(a){var b=a;return rd&&(qe.setAttribute("href",b),b=qe.href),qe.setAttribute("href",b),{href:qe.href,protocol:qe.protocol?qe.protocol.replace(/:$/,""):"",host:qe.host,search:qe.search?qe.search.replace(/^\?/,""):"",hash:qe.hash?qe.hash.replace(/^#/,""):"",hostname:qe.hostname,port:qe.port,pathname:"/"===qe.pathname.charAt(0)?qe.pathname:"/"+qe.pathname}}function Nc(a){var b=u(a)?Mc(a):a;return b.protocol===re.protocol&&b.host===re.host}function Oc(){this.$get=q(a)}function Pc(a){function b(d,e){if(t(d)){var g={};return f(d,function(a,c){g[c]=b(c,a)}),g}return a.factory(d+c,e)}var c="Filter";this.register=b,this.$get=["$injector",function(a){return function(b){return a.get(b+c)}}],b("currency",Rc),b("date",Zc),b("filter",Qc),b("json",$c),b("limitTo",_c),b("lowercase",we),b("number",Sc),b("orderBy",ad),b("uppercase",xe)}function Qc(){return function(a,b,c){if(!x(a))return a;var d=typeof c,e=[];e.check=function(a){for(var b=0;b<e.length;b++)if(!e[b](a))return!1;return!0},"function"!==d&&(c="boolean"===d&&c?function(a,b){return Ad.equals(a,b)}:function(a,b){if(a&&b&&"object"==typeof a&&"object"==typeof b){for(var d in a)if("$"!==d.charAt(0)&&nd.call(a,d)&&c(a[d],b[d]))return!0;return!1}return b=(""+b).toLowerCase(),(""+a).toLowerCase().indexOf(b)>-1});var f=function(a,b){if("string"==typeof b&&"!"===b.charAt(0))return!f(a,b.substr(1));switch(typeof a){case"boolean":case"number":case"string":return c(a,b);case"object":switch(typeof b){case"object":return c(a,b);default:for(var d in a)if("$"!==d.charAt(0)&&f(a[d],b))return!0}return!1;case"array":for(var e=0;e<a.length;e++)if(f(a[e],b))return!0;return!1;default:return!1}};switch(typeof b){case"boolean":case"number":case"string":b={$:b};case"object":for(var g in b)!function(a){"undefined"!=typeof b[a]&&e.push(function(c){return f("$"==a?c:c&&c[a],b[a])})}(g);break;case"function":e.push(b);break;default:return a}for(var h=[],i=0;i<a.length;i++){var j=a[i];e.check(j)&&h.push(j)}return h}}function Rc(a){var b=a.NUMBER_FORMATS;return function(a,c){return r(c)&&(c=b.CURRENCY_SYM),Tc(a,b.PATTERNS[1],b.GROUP_SEP,b.DECIMAL_SEP,2).replace(/\u00A4/g,c)}}function Sc(a){var b=a.NUMBER_FORMATS;return function(a,c){return Tc(a,b.PATTERNS[0],b.GROUP_SEP,b.DECIMAL_SEP,c)}}function Tc(a,b,c,d,e){if(null==a||!isFinite(a)||t(a))return"";var f=0>a;a=Math.abs(a);var g=a+"",h="",i=[],j=!1;if(-1!==g.indexOf("e")){var k=g.match(/([\d\.]+)e(-?)(\d+)/);k&&"-"==k[2]&&k[3]>e+1?g="0":(h=g,j=!0)}if(j)e>0&&a>-1&&1>a&&(h=a.toFixed(e));else{var l=(g.split(se)[1]||"").length;r(e)&&(e=Math.min(Math.max(b.minFrac,l),b.maxFrac));var m=Math.pow(10,e);a=Math.round(a*m)/m;var n=(""+a).split(se),o=n[0];n=n[1]||"";var p,q=0,s=b.lgSize,u=b.gSize;if(o.length>=s+u)for(q=o.length-s,p=0;q>p;p++)(q-p)%u===0&&0!==p&&(h+=c),h+=o.charAt(p);for(p=q;p<o.length;p++)(o.length-p)%s===0&&0!==p&&(h+=c),h+=o.charAt(p);for(;n.length<e;)n+="0";e&&"0"!==e&&(h+=d+n.substr(0,e))}return i.push(f?b.negPre:b.posPre),i.push(h),i.push(f?b.negSuf:b.posSuf),i.join("")}function Uc(a,b,c){var d="";for(0>a&&(d="-",a=-a),a=""+a;a.length<b;)a="0"+a;return c&&(a=a.substr(a.length-b)),d+a}function Vc(a,b,c,d){return c=c||0,function(e){var f=e["get"+a]();return(c>0||f>-c)&&(f+=c),0===f&&-12==c&&(f=12),Uc(f,b,d)}}function Wc(a,b){return function(c,d){var e=c["get"+a](),f=od(b?"SHORT"+a:a);return d[f][e]}}function Xc(a){var b=-1*a.getTimezoneOffset(),c=b>=0?"+":"";return c+=Uc(Math[b>0?"floor":"ceil"](b/60),2)+Uc(Math.abs(b%60),2)}function Yc(a,b){return a.getHours()<12?b.AMPMS[0]:b.AMPMS[1]}function Zc(a){function b(a){var b;if(b=a.match(c)){var d=new Date(0),e=0,f=0,g=b[8]?d.setUTCFullYear:d.setFullYear,h=b[8]?d.setUTCHours:d.setHours;b[9]&&(e=m(b[9]+b[10]),f=m(b[9]+b[11])),g.call(d,m(b[1]),m(b[2])-1,m(b[3]));var i=m(b[4]||0)-e,j=m(b[5]||0)-f,k=m(b[6]||0),l=Math.round(1e3*parseFloat("0."+(b[7]||0)));return h.call(d,i,j,k,l),d}return a}var c=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,d){var e,g,h="",i=[];if(d=d||"mediumDate",d=a.DATETIME_FORMATS[d]||d,u(c)&&(c=ve.test(c)?m(c):b(c)),v(c)&&(c=new Date(c)),!w(c))return c;for(;d;)g=ue.exec(d),g?(i=N(i,g,1),d=i.pop()):(i.push(d),d=null);return f(i,function(b){e=te[b],h+=e?e(c,a.DATETIME_FORMATS):b.replace(/(^'|'$)/g,"").replace(/''/g,"'")}),h}}function $c(){return function(a){return R(a,!0)}}function _c(){return function(a,b){if(!x(a)&&!u(a))return a;if(b=m(b),u(a))return b?b>=0?a.slice(0,b):a.slice(b,a.length):"";var c,d,e=[];for(b>a.length?b=a.length:b<-a.length&&(b=-a.length),b>0?(c=0,d=b):(c=a.length+b,d=a.length);d>c;c++)e.push(a[c]);return e}}function ad(a){return function(b,c,d){function e(a,b){for(var d=0;d<c.length;d++){var e=c[d](a,b);
-if(0!==e)return e}return 0}function f(a,b){return T(b)?function(b,c){return a(c,b)}:a}function g(a,b){var c=typeof a,d=typeof b;return c==d?("string"==c&&(a=a.toLowerCase(),b=b.toLowerCase()),a===b?0:b>a?-1:1):d>c?-1:1}if(!x(b))return b;if(!c)return b;c=x(c)?c:[c],c=F(c,function(b){var c=!1,d=b||p;if(u(b)&&(("+"==b.charAt(0)||"-"==b.charAt(0))&&(c="-"==b.charAt(0),b=b.substring(1)),d=a(b),d.constant)){var e=d();return f(function(a,b){return g(a[e],b[e])},c)}return f(function(a,b){return g(d(a),d(b))},c)});for(var h=[],i=0;i<b.length;i++)h.push(b[i]);return h.sort(f(e,d))}}function bd(a){return y(a)&&(a={link:a}),a.restrict=a.restrict||"AC",q(a)}function cd(a,b,c,d){function e(b,c){c=c?"-"+ab(c,"-"):"",d.removeClass(a,(b?Ke:Je)+c),d.addClass(a,(b?Je:Ke)+c)}var g=this,h=a.parent().controller("form")||Ae,i=0,j=g.$error={},k=[];g.$name=b.name||b.ngForm,g.$dirty=!1,g.$pristine=!0,g.$valid=!0,g.$invalid=!1,h.$addControl(g),a.addClass(Le),e(!0),g.$addControl=function(a){eb(a.$name,"input"),k.push(a),a.$name&&(g[a.$name]=a)},g.$removeControl=function(a){a.$name&&g[a.$name]===a&&delete g[a.$name],f(j,function(b,c){g.$setValidity(c,!0,a)}),I(k,a)},g.$setValidity=function(a,b,c){var d=j[a];if(b)d&&(I(d,c),d.length||(i--,i||(e(b),g.$valid=!0,g.$invalid=!1),j[a]=!1,e(!0,a),h.$setValidity(a,!0,g)));else{if(i||e(b),d){if(G(d,c))return}else j[a]=d=[],i++,e(!1,a),h.$setValidity(a,!1,g);d.push(c),g.$valid=!1,g.$invalid=!0}},g.$setDirty=function(){d.removeClass(a,Le),d.addClass(a,Me),g.$dirty=!0,g.$pristine=!1,h.$setDirty()},g.$setPristine=function(){d.removeClass(a,Me),d.addClass(a,Le),g.$dirty=!1,g.$pristine=!0,f(k,function(a){a.$setPristine()})}}function dd(a,b,d,e){return a.$setValidity(b,d),d?e:c}function ed(a,b,c){var d=c.prop("validity");if(t(d)){var e=function(c){return a.$error[b]||!(d.badInput||d.customError||d.typeMismatch)||d.valueMissing?c:void a.$setValidity(b,!1)};a.$parsers.push(e)}}function fd(a,b,c,e,f,g){var h=b.prop("validity");if(!f.android){var i=!1;b.on("compositionstart",function(){i=!0}),b.on("compositionend",function(){i=!1,j()})}var j=function(){if(!i){var d=b.val();T(c.ngTrim||"T")&&(d=Cd(d)),(e.$viewValue!==d||h&&""===d&&!h.valueMissing)&&(a.$$phase?e.$setViewValue(d):a.$apply(function(){e.$setViewValue(d)}))}};if(f.hasEvent("input"))b.on("input",j);else{var k,l=function(){k||(k=g.defer(function(){j(),k=null}))};b.on("keydown",function(a){var b=a.keyCode;91===b||b>15&&19>b||b>=37&&40>=b||l()}),f.hasEvent("paste")&&b.on("paste cut",l)}b.on("change",j),e.$render=function(){b.val(e.$isEmpty(e.$viewValue)?"":e.$viewValue)};var n,o,p=c.ngPattern;if(p){var q=function(a,b){return dd(e,"pattern",e.$isEmpty(b)||a.test(b),b)};o=p.match(/^\/(.*)\/([gim]*)$/),o?(p=new RegExp(o[1],o[2]),n=function(a){return q(p,a)}):n=function(c){var e=a.$eval(p);if(!e||!e.test)throw d("ngPattern")("noregexp","Expected {0} to be a RegExp but was {1}. Element: {2}",p,e,U(b));return q(e,c)},e.$formatters.push(n),e.$parsers.push(n)}if(c.ngMinlength){var r=m(c.ngMinlength),s=function(a){return dd(e,"minlength",e.$isEmpty(a)||a.length>=r,a)};e.$parsers.push(s),e.$formatters.push(s)}if(c.ngMaxlength){var t=m(c.ngMaxlength),u=function(a){return dd(e,"maxlength",e.$isEmpty(a)||a.length<=t,a)};e.$parsers.push(u),e.$formatters.push(u)}}function gd(a,b,d,e,f,g){if(fd(a,b,d,e,f,g),e.$parsers.push(function(a){var b=e.$isEmpty(a);return b||Ge.test(a)?(e.$setValidity("number",!0),""===a?null:b?a:parseFloat(a)):(e.$setValidity("number",!1),c)}),ed(e,"number",b),e.$formatters.push(function(a){return e.$isEmpty(a)?"":""+a}),d.min){var h=function(a){var b=parseFloat(d.min);return dd(e,"min",e.$isEmpty(a)||a>=b,a)};e.$parsers.push(h),e.$formatters.push(h)}if(d.max){var i=function(a){var b=parseFloat(d.max);return dd(e,"max",e.$isEmpty(a)||b>=a,a)};e.$parsers.push(i),e.$formatters.push(i)}e.$formatters.push(function(a){return dd(e,"number",e.$isEmpty(a)||v(a),a)})}function hd(a,b,c,d,e,f){fd(a,b,c,d,e,f);var g=function(a){return dd(d,"url",d.$isEmpty(a)||Ee.test(a),a)};d.$formatters.push(g),d.$parsers.push(g)}function id(a,b,c,d,e,f){fd(a,b,c,d,e,f);var g=function(a){return dd(d,"email",d.$isEmpty(a)||Fe.test(a),a)};d.$formatters.push(g),d.$parsers.push(g)}function jd(a,b,c,d){r(c.name)&&b.attr("name",j()),b.on("click",function(){b[0].checked&&a.$apply(function(){d.$setViewValue(c.value)})}),d.$render=function(){var a=c.value;b[0].checked=a==d.$viewValue},c.$observe("value",d.$render)}function kd(a,b,c,d){var e=c.ngTrueValue,f=c.ngFalseValue;u(e)||(e=!0),u(f)||(f=!1),b.on("click",function(){a.$apply(function(){d.$setViewValue(b[0].checked)})}),d.$render=function(){b[0].checked=d.$viewValue},d.$isEmpty=function(a){return a!==e},d.$formatters.push(function(a){return a===e}),d.$parsers.push(function(a){return a?e:f})}function ld(a,b){return a="ngClass"+a,["$animate",function(c){function d(a,b){var c=[];a:for(var d=0;d<a.length;d++){for(var e=a[d],f=0;f<b.length;f++)if(e==b[f])continue a;c.push(e)}return c}function e(a){if(x(a))return a;if(u(a))return a.split(" ");if(t(a)){var b=[];return f(a,function(a,c){a&&b.push(c)}),b}return a}return{restrict:"AC",link:function(g,h,i){function j(a){var b=l(a,1);i.$addClass(b)}function k(a){var b=l(a,-1);i.$removeClass(b)}function l(a,b){var c=h.data("$classCounts")||{},d=[];return f(a,function(a){(b>0||c[a])&&(c[a]=(c[a]||0)+b,c[a]===+(b>0)&&d.push(a))}),h.data("$classCounts",c),d.join(" ")}function m(a,b){var e=d(b,a),f=d(a,b);f=l(f,-1),e=l(e,1),0===e.length?c.removeClass(h,f):0===f.length?c.addClass(h,e):c.setClass(h,e,f)}function n(a){if(b===!0||g.$index%2===b){var c=e(a||[]);if(o){if(!L(a,o)){var d=e(o);m(d,c)}}else j(c)}o=J(a)}var o;g.$watch(i[a],n,!0),i.$observe("class",function(){n(g.$eval(i[a]))}),"ngClass"!==a&&g.$watch("$index",function(c,d){var f=1&c;if(f!==d&1){var h=e(g.$eval(i[a]));f===b?j(h):k(h)}})}}}]}var md=function(a){return u(a)?a.toLowerCase():a},nd=Object.prototype.hasOwnProperty,od=function(a){return u(a)?a.toUpperCase():a},pd=function(a){return u(a)?a.replace(/[A-Z]/g,function(a){return String.fromCharCode(32|a.charCodeAt(0))}):a},qd=function(a){return u(a)?a.replace(/[a-z]/g,function(a){return String.fromCharCode(-33&a.charCodeAt(0))}):a};"i"!=="I".toLowerCase()&&(md=pd,od=qd);var rd,sd,td,ud,vd,wd=[].slice,xd=[].push,yd=Object.prototype.toString,zd=d("ng"),Ad=(a.angular,a.angular||(a.angular={})),Bd=["0","0","0"];rd=m((/msie (\d+)/.exec(md(navigator.userAgent))||[])[1]),isNaN(rd)&&(rd=m((/trident\/.*; rv:(\d+)/.exec(md(navigator.userAgent))||[])[1])),o.$inject=[],p.$inject=[];var Cd=function(){return String.prototype.trim?function(a){return u(a)?a.trim():a}:function(a){return u(a)?a.replace(/^\s\s*/,"").replace(/\s\s*$/,""):a}}();vd=9>rd?function(a){return a=a.nodeName?a:a[0],a.scopeName&&"HTML"!=a.scopeName?od(a.scopeName+":"+a.nodeName):a.nodeName}:function(a){return a.nodeName?a.nodeName:a[0].nodeName};var Dd=/[A-Z]/g,Ed={full:"1.2.16",major:1,minor:2,dot:16,codeName:"badger-enumeration"},Fd=pb.cache={},Gd=pb.expando="ng-"+(new Date).getTime(),Hd=1,Id=a.document.addEventListener?function(a,b,c){a.addEventListener(b,c,!1)}:function(a,b,c){a.attachEvent("on"+b,c)},Jd=a.document.removeEventListener?function(a,b,c){a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent("on"+b,c)},Kd=(pb._data=function(a){return this.cache[a[this.expando]]||{}},/([\:\-\_]+(.))/g),Ld=/^moz([A-Z])/,Md=d("jqLite"),Nd=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,Od=/<|&#?\w+;/,Pd=/<([\w:]+)/,Qd=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,Rd={option:[1,'<select multiple="multiple">',"</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};Rd.optgroup=Rd.option,Rd.tbody=Rd.tfoot=Rd.colgroup=Rd.caption=Rd.thead,Rd.th=Rd.td;var Sd=pb.prototype={ready:function(c){function d(){e||(e=!0,c())}var e=!1;"complete"===b.readyState?setTimeout(d):(this.on("DOMContentLoaded",d),pb(a).on("load",d))},toString:function(){var a=[];return f(this,function(b){a.push(""+b)}),"["+a.join(", ")+"]"},eq:function(a){return sd(a>=0?this[a]:this[this.length+a])},length:0,push:xd,sort:[].sort,splice:[].splice},Td={};f("multiple,selected,checked,disabled,readOnly,required,open".split(","),function(a){Td[md(a)]=a});var Ud={};f("input,select,option,textarea,button,form,details".split(","),function(a){Ud[od(a)]=!0}),f({data:vb,inheritedData:Bb,scope:function(a){return sd(a).data("$scope")||Bb(a.parentNode||a,["$isolateScope","$scope"])},isolateScope:function(a){return sd(a).data("$isolateScope")||sd(a).data("$isolateScopeNoTemplate")},controller:Ab,injector:function(a){return Bb(a,"$injector")},removeAttr:function(a,b){a.removeAttribute(b)},hasClass:wb,css:function(a,b,d){if(b=kb(b),!s(d)){var e;return 8>=rd&&(e=a.currentStyle&&a.currentStyle[b],""===e&&(e="auto")),e=e||a.style[b],8>=rd&&(e=""===e?c:e),e}a.style[b]=d},attr:function(a,b,d){var e=md(b);if(Td[e]){if(!s(d))return a[b]||(a.attributes.getNamedItem(b)||o).specified?e:c;d?(a[b]=!0,a.setAttribute(b,e)):(a[b]=!1,a.removeAttribute(e))}else if(s(d))a.setAttribute(b,d);else if(a.getAttribute){var f=a.getAttribute(b,2);return null===f?c:f}},prop:function(a,b,c){return s(c)?void(a[b]=c):a[b]},text:function(){function a(a,c){var d=b[a.nodeType];return r(c)?d?a[d]:"":void(a[d]=c)}var b=[];return 9>rd?(b[1]="innerText",b[3]="nodeValue"):b[1]=b[3]="textContent",a.$dv="",a}(),val:function(a,b){if(r(b)){if("SELECT"===vd(a)&&a.multiple){var c=[];return f(a.options,function(a){a.selected&&c.push(a.value||a.text)}),0===c.length?null:c}return a.value}a.value=b},html:function(a,b){if(r(b))return a.innerHTML;for(var c=0,d=a.childNodes;c<d.length;c++)rb(d[c]);a.innerHTML=b},empty:Cb},function(a,b){pb.prototype[b]=function(b,d){var e,f;if(a!==Cb&&(2==a.length&&a!==wb&&a!==Ab?b:d)===c){if(t(b)){for(e=0;e<this.length;e++)if(a===vb)a(this[e],b);else for(f in b)a(this[e],f,b[f]);return this}for(var g=a.$dv,h=g===c?Math.min(this.length,1):this.length,i=0;h>i;i++){var j=a(this[i],b,d);g=g?g+j:j}return g}for(e=0;e<this.length;e++)a(this[e],b,d);return this}}),f({removeData:tb,dealoc:rb,on:function wf(a,c,d,e){if(s(e))throw Md("onargs","jqLite#on() does not support the `selector` or `eventData` parameters");var g=ub(a,"events"),h=ub(a,"handle");g||ub(a,"events",g={}),h||ub(a,"handle",h=Eb(a,g)),f(c.split(" "),function(c){var e=g[c];if(!e){if("mouseenter"==c||"mouseleave"==c){var f=b.body.contains||b.body.compareDocumentPosition?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)for(;b=b.parentNode;)if(b===a)return!0;return!1};g[c]=[];var i={mouseleave:"mouseout",mouseenter:"mouseover"};wf(a,i[c],function(a){var b=this,d=a.relatedTarget;(!d||d!==b&&!f(b,d))&&h(a,c)})}else Id(a,c,h),g[c]=[];e=g[c]}e.push(d)})},off:sb,one:function(a,b,c){a=sd(a),a.on(b,function d(){a.off(b,c),a.off(b,d)}),a.on(b,c)},replaceWith:function(a,b){var c,d=a.parentNode;rb(a),f(new pb(b),function(b){c?d.insertBefore(b,c.nextSibling):d.replaceChild(b,a),c=b})},children:function(a){var b=[];return f(a.childNodes,function(a){1===a.nodeType&&b.push(a)}),b},contents:function(a){return a.contentDocument||a.childNodes||[]},append:function(a,b){f(new pb(b),function(b){(1===a.nodeType||11===a.nodeType)&&a.appendChild(b)})},prepend:function(a,b){if(1===a.nodeType){var c=a.firstChild;f(new pb(b),function(b){a.insertBefore(b,c)})}},wrap:function(a,b){b=sd(b)[0];var c=a.parentNode;c&&c.replaceChild(b,a),b.appendChild(a)},remove:function(a){rb(a);var b=a.parentNode;b&&b.removeChild(a)},after:function(a,b){var c=a,d=a.parentNode;f(new pb(b),function(a){d.insertBefore(a,c.nextSibling),c=a})},addClass:yb,removeClass:xb,toggleClass:function(a,b,c){b&&f(b.split(" "),function(b){var d=c;r(d)&&(d=!wb(a,b)),(d?yb:xb)(a,b)})},parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},next:function(a){if(a.nextElementSibling)return a.nextElementSibling;for(var b=a.nextSibling;null!=b&&1!==b.nodeType;)b=b.nextSibling;return b},find:function(a,b){return a.getElementsByTagName?a.getElementsByTagName(b):[]},clone:qb,triggerHandler:function(a,b,c){var d=(ub(a,"events")||{})[b];c=c||[];var e=[{preventDefault:o,stopPropagation:o}];f(d,function(b){b.apply(a,e.concat(c))})}},function(a,b){pb.prototype[b]=function(b,c,d){for(var e,f=0;f<this.length;f++)r(e)?(e=a(this[f],b,c,d),s(e)&&(e=sd(e))):zb(e,a(this[f],b,c,d));return s(e)?e:this},pb.prototype.bind=pb.prototype.on,pb.prototype.unbind=pb.prototype.off}),Gb.prototype={put:function(a,b){this[Fb(a)]=b},get:function(a){return this[Fb(a)]},remove:function(a){var b=this[a=Fb(a)];return delete this[a],b}};var Vd=/^function\s*[^\(]*\(\s*([^\)]*)\)/m,Wd=/,/,Xd=/^\s*(_?)(\S+?)\1\s*$/,Yd=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm,Zd=d("$injector"),$d=d("$animate"),_d=["$provide",function(a){this.$$selectors={},this.register=function(b,c){var d=b+"-animation";if(b&&"."!=b.charAt(0))throw $d("notcsel","Expecting class selector starting with '.' got '{0}'.",b);this.$$selectors[b.substr(1)]=d,a.factory(d,c)},this.classNameFilter=function(a){return 1===arguments.length&&(this.$$classNameFilter=a instanceof RegExp?a:null),this.$$classNameFilter},this.$get=["$timeout","$$asyncCallback",function(a,b){function c(a){a&&b(a)}return{enter:function(a,b,d,e){d?d.after(a):(b&&b[0]||(b=d.parent()),b.append(a)),c(e)},leave:function(a,b){a.remove(),c(b)},move:function(a,b,c,d){this.enter(a,b,c,d)},addClass:function(a,b,d){b=u(b)?b:x(b)?b.join(" "):"",f(a,function(a){yb(a,b)}),c(d)},removeClass:function(a,b,d){b=u(b)?b:x(b)?b.join(" "):"",f(a,function(a){xb(a,b)}),c(d)},setClass:function(a,b,d,e){f(a,function(a){yb(a,b),xb(a,d)}),c(e)},enabled:o}}]}],ae=d("$compile");Pb.$inject=["$provide","$$sanitizeUriProvider"];var be=/^(x[\:\-_]|data[\:\-_])/i,ce=d("$interpolate"),de=/^([^\?#]*)(\?([^#]*))?(#(.*))?$/,ee={http:80,https:443,ftp:21},fe=d("$location");nc.prototype=mc.prototype=lc.prototype={$$html5:!1,$$replace:!1,absUrl:oc("$$absUrl"),url:function(a,b){if(r(a))return this.$$url;var c=de.exec(a);return c[1]&&this.path(decodeURIComponent(c[1])),(c[2]||c[1])&&this.search(c[3]||""),this.hash(c[5]||"",b),this},protocol:oc("$$protocol"),host:oc("$$host"),port:oc("$$port"),path:pc("$$path",function(a){return"/"==a.charAt(0)?a:"/"+a}),search:function(a,b){switch(arguments.length){case 0:return this.$$search;case 1:if(u(a))this.$$search=W(a);else{if(!t(a))throw fe("isrcharg","The first argument of the `$location#search()` call must be a string or an object.");this.$$search=a}break;default:r(b)||null===b?delete this.$$search[a]:this.$$search[a]=b}return this.$$compose(),this},hash:pc("$$hash",p),replace:function(){return this.$$replace=!0,this}};var ge,he=d("$parse"),ie={},je={"null":function(){return null},"true":function(){return!0},"false":function(){return!1},undefined:o,"+":function(a,b,d,e){return d=d(a,b),e=e(a,b),s(d)?s(e)?d+e:d:s(e)?e:c},"-":function(a,b,c,d){return c=c(a,b),d=d(a,b),(s(c)?c:0)-(s(d)?d:0)},"*":function(a,b,c,d){return c(a,b)*d(a,b)},"/":function(a,b,c,d){return c(a,b)/d(a,b)},"%":function(a,b,c,d){return c(a,b)%d(a,b)},"^":function(a,b,c,d){return c(a,b)^d(a,b)},"=":o,"===":function(a,b,c,d){return c(a,b)===d(a,b)},"!==":function(a,b,c,d){return c(a,b)!==d(a,b)},"==":function(a,b,c,d){return c(a,b)==d(a,b)},"!=":function(a,b,c,d){return c(a,b)!=d(a,b)},"<":function(a,b,c,d){return c(a,b)<d(a,b)},">":function(a,b,c,d){return c(a,b)>d(a,b)},"<=":function(a,b,c,d){return c(a,b)<=d(a,b)},">=":function(a,b,c,d){return c(a,b)>=d(a,b)},"&&":function(a,b,c,d){return c(a,b)&&d(a,b)},"||":function(a,b,c,d){return c(a,b)||d(a,b)},"&":function(a,b,c,d){return c(a,b)&d(a,b)},"|":function(a,b,c,d){return d(a,b)(a,b,c(a,b))},"!":function(a,b,c){return!c(a,b)}},ke={n:"\n",f:"\f",r:"\r",t:"	",v:"","'":"'",'"':'"'},le=function(a){this.options=a};le.prototype={constructor:le,lex:function(a){this.text=a,this.index=0,this.ch=c,this.lastCh=":",this.tokens=[];for(var b,d=[];this.index<this.text.length;){if(this.ch=this.text.charAt(this.index),this.is("\"'"))this.readString(this.ch);else if(this.isNumber(this.ch)||this.is(".")&&this.isNumber(this.peek()))this.readNumber();else if(this.isIdent(this.ch))this.readIdent(),this.was("{,")&&"{"===d[0]&&(b=this.tokens[this.tokens.length-1])&&(b.json=-1===b.text.indexOf("."));else if(this.is("(){}[].,;:?"))this.tokens.push({index:this.index,text:this.ch,json:this.was(":[,")&&this.is("{[")||this.is("}]:,")}),this.is("{[")&&d.unshift(this.ch),this.is("}]")&&d.shift(),this.index++;else{if(this.isWhitespace(this.ch)){this.index++;continue}var e=this.ch+this.peek(),f=e+this.peek(2),g=je[this.ch],h=je[e],i=je[f];i?(this.tokens.push({index:this.index,text:f,fn:i}),this.index+=3):h?(this.tokens.push({index:this.index,text:e,fn:h}),this.index+=2):g?(this.tokens.push({index:this.index,text:this.ch,fn:g,json:this.was("[,:")&&this.is("+-")}),this.index+=1):this.throwError("Unexpected next character ",this.index,this.index+1)}this.lastCh=this.ch}return this.tokens},is:function(a){return-1!==a.indexOf(this.ch)},was:function(a){return-1!==a.indexOf(this.lastCh)},peek:function(a){var b=a||1;return this.index+b<this.text.length?this.text.charAt(this.index+b):!1},isNumber:function(a){return a>="0"&&"9">=a},isWhitespace:function(a){return" "===a||"\r"===a||"	"===a||"\n"===a||""===a||" "===a},isIdent:function(a){return a>="a"&&"z">=a||a>="A"&&"Z">=a||"_"===a||"$"===a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,b,c){c=c||this.index;var d=s(b)?"s "+b+"-"+this.index+" ["+this.text.substring(b,c)+"]":" "+c;throw he("lexerr","Lexer Error: {0} at column{1} in expression [{2}].",a,d,this.text)},readNumber:function(){for(var a="",b=this.index;this.index<this.text.length;){var c=md(this.text.charAt(this.index));if("."==c||this.isNumber(c))a+=c;else{var d=this.peek();if("e"==c&&this.isExpOperator(d))a+=c;else if(this.isExpOperator(c)&&d&&this.isNumber(d)&&"e"==a.charAt(a.length-1))a+=c;else{if(!this.isExpOperator(c)||d&&this.isNumber(d)||"e"!=a.charAt(a.length-1))break;this.throwError("Invalid exponent")}}this.index++}a=1*a,this.tokens.push({index:b,text:a,json:!0,fn:function(){return a}})},readIdent:function(){for(var a,b,c,d,e=this,f="",g=this.index;this.index<this.text.length&&(d=this.text.charAt(this.index),"."===d||this.isIdent(d)||this.isNumber(d));)"."===d&&(a=this.index),f+=d,this.index++;if(a)for(b=this.index;b<this.text.length;){if(d=this.text.charAt(b),"("===d){c=f.substr(a-g+1),f=f.substr(0,a-g),this.index=b;break}if(!this.isWhitespace(d))break;b++}var h={index:g,text:f};if(je.hasOwnProperty(f))h.fn=je[f],h.json=je[f];else{var i=yc(f,this.options,this.text);h.fn=l(function(a,b){return i(a,b)},{assign:function(a,b){return uc(a,f,b,e.text,e.options)}})}this.tokens.push(h),c&&(this.tokens.push({index:a,text:".",json:!1}),this.tokens.push({index:a+1,text:c,json:!1}))},readString:function(a){var b=this.index;this.index++;for(var c="",d=a,e=!1;this.index<this.text.length;){var f=this.text.charAt(this.index);if(d+=f,e){if("u"===f){var g=this.text.substring(this.index+1,this.index+5);g.match(/[\da-f]{4}/i)||this.throwError("Invalid unicode escape [\\u"+g+"]"),this.index+=4,c+=String.fromCharCode(parseInt(g,16))}else{var h=ke[f];c+=h?h:f}e=!1}else if("\\"===f)e=!0;else{if(f===a)return this.index++,void this.tokens.push({index:b,text:d,string:c,json:!0,fn:function(){return c}});c+=f}this.index++}this.throwError("Unterminated quote",b)}};var me=function(a,b,c){this.lexer=a,this.$filter=b,this.options=c};me.ZERO=l(function(){return 0},{constant:!0}),me.prototype={constructor:me,parse:function(a,b){this.text=a,this.json=b,this.tokens=this.lexer.lex(a),b&&(this.assignment=this.logicalOR,this.functionCall=this.fieldAccess=this.objectIndex=this.filterChain=function(){this.throwError("is not valid json",{text:a,index:0})});var c=b?this.primary():this.statements();return 0!==this.tokens.length&&this.throwError("is an unexpected token",this.tokens[0]),c.literal=!!c.literal,c.constant=!!c.constant,c},primary:function(){var a;if(this.expect("("))a=this.filterChain(),this.consume(")");else if(this.expect("["))a=this.arrayDeclaration();else if(this.expect("{"))a=this.object();else{var b=this.expect();a=b.fn,a||this.throwError("not a primary expression",b),b.json&&(a.constant=!0,a.literal=!0)}for(var c,d;c=this.expect("(","[",".");)"("===c.text?(a=this.functionCall(a,d),d=null):"["===c.text?(d=a,a=this.objectIndex(a)):"."===c.text?(d=a,a=this.fieldAccess(a)):this.throwError("IMPOSSIBLE");return a},throwError:function(a,b){throw he("syntax","Syntax Error: Token '{0}' {1} at column {2} of the expression [{3}] starting at [{4}].",b.text,a,b.index+1,this.text,this.text.substring(b.index))},peekToken:function(){if(0===this.tokens.length)throw he("ueoe","Unexpected end of expression: {0}",this.text);return this.tokens[0]},peek:function(a,b,c,d){if(this.tokens.length>0){var e=this.tokens[0],f=e.text;if(f===a||f===b||f===c||f===d||!a&&!b&&!c&&!d)return e}return!1},expect:function(a,b,c,d){var e=this.peek(a,b,c,d);return e?(this.json&&!e.json&&this.throwError("is not valid json",e),this.tokens.shift(),e):!1},consume:function(a){this.expect(a)||this.throwError("is unexpected, expecting ["+a+"]",this.peek())},unaryFn:function(a,b){return l(function(c,d){return a(c,d,b)},{constant:b.constant})},ternaryFn:function(a,b,c){return l(function(d,e){return a(d,e)?b(d,e):c(d,e)},{constant:a.constant&&b.constant&&c.constant})},binaryFn:function(a,b,c){return l(function(d,e){return b(d,e,a,c)},{constant:a.constant&&c.constant})},statements:function(){for(var a=[];;)if(this.tokens.length>0&&!this.peek("}",")",";","]")&&a.push(this.filterChain()),!this.expect(";"))return 1===a.length?a[0]:function(b,c){for(var d,e=0;e<a.length;e++){var f=a[e];f&&(d=f(b,c))}return d}},filterChain:function(){for(var a,b=this.expression();;){if(!(a=this.expect("|")))return b;b=this.binaryFn(b,a.fn,this.filter())}},filter:function(){for(var a=this.expect(),b=this.$filter(a.text),c=[];;){if(!(a=this.expect(":"))){var d=function(a,d,e){for(var f=[e],g=0;g<c.length;g++)f.push(c[g](a,d));return b.apply(a,f)};return function(){return d}}c.push(this.expression())}},expression:function(){return this.assignment()},assignment:function(){var a,b,c=this.ternary();return(b=this.expect("="))?(c.assign||this.throwError("implies assignment but ["+this.text.substring(0,b.index)+"] can not be assigned to",b),a=this.ternary(),function(b,d){return c.assign(b,a(b,d),d)}):c},ternary:function(){var a,b,c=this.logicalOR();return(b=this.expect("?"))?(a=this.ternary(),(b=this.expect(":"))?this.ternaryFn(c,a,this.ternary()):void this.throwError("expected :",b)):c},logicalOR:function(){for(var a,b=this.logicalAND();;){if(!(a=this.expect("||")))return b;b=this.binaryFn(b,a.fn,this.logicalAND())}},logicalAND:function(){var a,b=this.equality();return(a=this.expect("&&"))&&(b=this.binaryFn(b,a.fn,this.logicalAND())),b},equality:function(){var a,b=this.relational();return(a=this.expect("==","!=","===","!=="))&&(b=this.binaryFn(b,a.fn,this.equality())),b},relational:function(){var a,b=this.additive();return(a=this.expect("<",">","<=",">="))&&(b=this.binaryFn(b,a.fn,this.relational())),b},additive:function(){for(var a,b=this.multiplicative();a=this.expect("+","-");)b=this.binaryFn(b,a.fn,this.multiplicative());return b},multiplicative:function(){for(var a,b=this.unary();a=this.expect("*","/","%");)b=this.binaryFn(b,a.fn,this.unary());return b},unary:function(){var a;return this.expect("+")?this.primary():(a=this.expect("-"))?this.binaryFn(me.ZERO,a.fn,this.unary()):(a=this.expect("!"))?this.unaryFn(a.fn,this.unary()):this.primary()},fieldAccess:function(a){var b=this,c=this.expect().text,d=yc(c,this.options,this.text);return l(function(b,c,e){return d(e||a(b,c))},{assign:function(d,e,f){return uc(a(d,f),c,e,b.text,b.options)}})},objectIndex:function(a){var b=this,d=this.expression();return this.consume("]"),l(function(e,f){var g,h,i=a(e,f),j=d(e,f);return i?(g=tc(i[j],b.text),g&&g.then&&b.options.unwrapPromises&&(h=g,"$$v"in g||(h.$$v=c,h.then(function(a){h.$$v=a})),g=g.$$v),g):c},{assign:function(c,e,f){var g=d(c,f),h=tc(a(c,f),b.text);return h[g]=e}})},functionCall:function(a,b){var c=[];if(")"!==this.peekToken().text)do c.push(this.expression());while(this.expect(","));this.consume(")");var d=this;return function(e,f){for(var g=[],h=b?b(e,f):e,i=0;i<c.length;i++)g.push(c[i](e,f));var j=a(e,f,h)||o;tc(h,d.text),tc(j,d.text);var k=j.apply?j.apply(h,g):j(g[0],g[1],g[2],g[3],g[4]);return tc(k,d.text)}},arrayDeclaration:function(){var a=[],b=!0;if("]"!==this.peekToken().text)do{if(this.peek("]"))break;var c=this.expression();a.push(c),c.constant||(b=!1)}while(this.expect(","));return this.consume("]"),l(function(b,c){for(var d=[],e=0;e<a.length;e++)d.push(a[e](b,c));return d},{literal:!0,constant:b})},object:function(){var a=[],b=!0;if("}"!==this.peekToken().text)do{if(this.peek("}"))break;var c=this.expect(),d=c.string||c.text;this.consume(":");var e=this.expression();a.push({key:d,value:e}),e.constant||(b=!1)}while(this.expect(","));return this.consume("}"),l(function(b,c){for(var d={},e=0;e<a.length;e++){var f=a[e];d[f.key]=f.value(b,c)}return d},{literal:!0,constant:b})}};var ne={},oe=d("$sce"),pe={HTML:"html",CSS:"css",URL:"url",RESOURCE_URL:"resourceUrl",JS:"js"},qe=b.createElement("a"),re=Mc(a.location.href,!0);Pc.$inject=["$provide"],Rc.$inject=["$locale"],Sc.$inject=["$locale"];var se=".",te={yyyy:Vc("FullYear",4),yy:Vc("FullYear",2,0,!0),y:Vc("FullYear",1),MMMM:Wc("Month"),MMM:Wc("Month",!0),MM:Vc("Month",2,1),M:Vc("Month",1,1),dd:Vc("Date",2),d:Vc("Date",1),HH:Vc("Hours",2),H:Vc("Hours",1),hh:Vc("Hours",2,-12),h:Vc("Hours",1,-12),mm:Vc("Minutes",2),m:Vc("Minutes",1),ss:Vc("Seconds",2),s:Vc("Seconds",1),sss:Vc("Milliseconds",3),EEEE:Wc("Day"),EEE:Wc("Day",!0),a:Yc,Z:Xc},ue=/((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z))(.*)/,ve=/^\-?\d+$/;Zc.$inject=["$locale"];var we=q(md),xe=q(od);ad.$inject=["$parse"];var ye=q({restrict:"E",compile:function(a,c){return 8>=rd&&(c.href||c.name||c.$set("href",""),a.append(b.createComment("IE fix"))),c.href||c.xlinkHref||c.name?void 0:function(a,b){var c="[object SVGAnimatedString]"===yd.call(b.prop("href"))?"xlink:href":"href";b.on("click",function(a){b.attr(c)||a.preventDefault()})}}}),ze={};f(Td,function(a,b){if("multiple"!=a){var c=Qb("ng-"+b);ze[c]=function(){return{priority:100,link:function(a,d,e){a.$watch(e[c],function(a){e.$set(b,!!a)})}}}}}),f(["src","srcset","href"],function(a){var b=Qb("ng-"+a);ze[b]=function(){return{priority:99,link:function(c,d,e){var f=a,g=a;"href"===a&&"[object SVGAnimatedString]"===yd.call(d.prop("href"))&&(g="xlinkHref",e.$attr[g]="xlink:href",f=null),e.$observe(b,function(a){a&&(e.$set(g,a),rd&&f&&d.prop(f,e[g]))})}}}});var Ae={$addControl:o,$removeControl:o,$setValidity:o,$setDirty:o,$setPristine:o};cd.$inject=["$element","$attrs","$scope","$animate"];var Be=function(a){return["$timeout",function(b){var d={name:"form",restrict:a?"EAC":"E",controller:cd,compile:function(){return{pre:function(a,d,e,f){if(!e.action){var g=function(a){a.preventDefault?a.preventDefault():a.returnValue=!1};Id(d[0],"submit",g),d.on("$destroy",function(){b(function(){Jd(d[0],"submit",g)},0,!1)})}var h=d.parent().controller("form"),i=e.name||e.ngForm;i&&uc(a,i,f,i),h&&d.on("$destroy",function(){h.$removeControl(f),i&&uc(a,i,c,i),l(f,Ae)})}}}};return d}]},Ce=Be(),De=Be(!0),Ee=/^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/,Fe=/^[a-z0-9!#$%&'*+/=?^_`{|}~.-]+@[a-z0-9-]+(\.[a-z0-9-]+)*$/i,Ge=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/,He={text:fd,number:gd,url:hd,email:id,radio:jd,checkbox:kd,hidden:o,button:o,submit:o,reset:o,file:o},Ie=["$browser","$sniffer",function(a,b){return{restrict:"E",require:"?ngModel",link:function(c,d,e,f){f&&(He[md(e.type)]||He.text)(c,d,e,f,b,a)}}}],Je="ng-valid",Ke="ng-invalid",Le="ng-pristine",Me="ng-dirty",Ne=["$scope","$exceptionHandler","$attrs","$element","$parse","$animate",function(a,b,c,e,g,h){function i(a,b){b=b?"-"+ab(b,"-"):"",h.removeClass(e,(a?Ke:Je)+b),h.addClass(e,(a?Je:Ke)+b)}this.$viewValue=Number.NaN,this.$modelValue=Number.NaN,this.$parsers=[],this.$formatters=[],this.$viewChangeListeners=[],this.$pristine=!0,this.$dirty=!1,this.$valid=!0,this.$invalid=!1,this.$name=c.name;var j=g(c.ngModel),k=j.assign;if(!k)throw d("ngModel")("nonassign","Expression '{0}' is non-assignable. Element: {1}",c.ngModel,U(e));this.$render=o,this.$isEmpty=function(a){return r(a)||""===a||null===a||a!==a};var l=e.inheritedData("$formController")||Ae,m=0,n=this.$error={};e.addClass(Le),i(!0),this.$setValidity=function(a,b){n[a]!==!b&&(b?(n[a]&&m--,m||(i(!0),this.$valid=!0,this.$invalid=!1)):(i(!1),this.$invalid=!0,this.$valid=!1,m++),n[a]=!b,i(b,a),l.$setValidity(a,b,this))},this.$setPristine=function(){this.$dirty=!1,this.$pristine=!0,h.removeClass(e,Me),h.addClass(e,Le)},this.$setViewValue=function(c){this.$viewValue=c,this.$pristine&&(this.$dirty=!0,this.$pristine=!1,h.removeClass(e,Le),h.addClass(e,Me),l.$setDirty()),f(this.$parsers,function(a){c=a(c)}),this.$modelValue!==c&&(this.$modelValue=c,k(a,c),f(this.$viewChangeListeners,function(a){try{a()}catch(c){b(c)}}))};var p=this;a.$watch(function(){var b=j(a);if(p.$modelValue!==b){var c=p.$formatters,d=c.length;for(p.$modelValue=b;d--;)b=c[d](b);p.$viewValue!==b&&(p.$viewValue=b,p.$render())}return b})}],Oe=function(){return{require:["ngModel","^?form"],controller:Ne,link:function(a,b,c,d){var e=d[0],f=d[1]||Ae;f.$addControl(e),a.$on("$destroy",function(){f.$removeControl(e)})}}},Pe=q({require:"ngModel",link:function(a,b,c,d){d.$viewChangeListeners.push(function(){a.$eval(c.ngChange)})}}),Qe=function(){return{require:"?ngModel",link:function(a,b,c,d){if(d){c.required=!0;var e=function(a){return c.required&&d.$isEmpty(a)?void d.$setValidity("required",!1):(d.$setValidity("required",!0),a)};d.$formatters.push(e),d.$parsers.unshift(e),c.$observe("required",function(){e(d.$viewValue)})}}}},Re=function(){return{require:"ngModel",link:function(a,b,d,e){var g=/\/(.*)\//.exec(d.ngList),h=g&&new RegExp(g[1])||d.ngList||",",i=function(a){if(!r(a)){var b=[];return a&&f(a.split(h),function(a){a&&b.push(Cd(a))}),b}};e.$parsers.push(i),e.$formatters.push(function(a){return x(a)?a.join(", "):c}),e.$isEmpty=function(a){return!a||!a.length}}}},Se=/^(true|false|\d+)$/,Te=function(){return{priority:100,compile:function(a,b){return Se.test(b.ngValue)?function(a,b,c){c.$set("value",a.$eval(c.ngValue))}:function(a,b,c){a.$watch(c.ngValue,function(a){c.$set("value",a)})}}}},Ue=bd(function(a,b,d){b.addClass("ng-binding").data("$binding",d.ngBind),a.$watch(d.ngBind,function(a){b.text(a==c?"":a)})}),Ve=["$interpolate",function(a){return function(b,c,d){var e=a(c.attr(d.$attr.ngBindTemplate));c.addClass("ng-binding").data("$binding",e),d.$observe("ngBindTemplate",function(a){c.text(a)})}}],We=["$sce","$parse",function(a,b){return function(c,d,e){function f(){return(g(c)||"").toString()}d.addClass("ng-binding").data("$binding",e.ngBindHtml);var g=b(e.ngBindHtml);c.$watch(f,function(){d.html(a.getTrustedHtml(g(c))||"")})}}],Xe=ld("",!0),Ye=ld("Odd",0),Ze=ld("Even",1),$e=bd({compile:function(a,b){b.$set("ngCloak",c),a.removeClass("ng-cloak")}}),_e=[function(){return{scope:!0,controller:"@",priority:500}}],af={};f("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var b=Qb("ng-"+a);af[b]=["$parse",function(c){return{compile:function(d,e){var f=c(e[b]);return function(b,c){c.on(md(a),function(a){b.$apply(function(){f(b,{$event:a})})})}}}}]});var bf=["$animate",function(a){return{transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(c,d,e,f,g){var h,i,j;c.$watch(e.ngIf,function(f){T(f)?i||(i=c.$new(),g(i,function(c){c[c.length++]=b.createComment(" end ngIf: "+e.ngIf+" "),h={clone:c},a.enter(c,d.parent(),d)
-})):(j&&(j.remove(),j=null),i&&(i.$destroy(),i=null),h&&(j=gb(h.clone),a.leave(j,function(){j=null}),h=null))})}}}],cf=["$http","$templateCache","$anchorScroll","$animate","$sce",function(a,b,c,d,e){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:Ad.noop,compile:function(f,g){var h=g.ngInclude||g.src,i=g.onload||"",j=g.autoscroll;return function(f,g,k,l,m){var n,o,p,q=0,r=function(){o&&(o.remove(),o=null),n&&(n.$destroy(),n=null),p&&(d.leave(p,function(){o=null}),o=p,p=null)};f.$watch(e.parseAsResourceUrl(h),function(e){var h=function(){!s(j)||j&&!f.$eval(j)||c()},k=++q;e?(a.get(e,{cache:b}).success(function(a){if(k===q){var b=f.$new();l.template=a;var c=m(b,function(a){r(),d.enter(a,null,g,h)});n=b,p=c,n.$emit("$includeContentLoaded"),f.$eval(i)}}).error(function(){k===q&&r()}),f.$emit("$includeContentRequested")):(r(),l.template=null)})}}}}],df=["$compile",function(a){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(b,c,d,e){c.html(e.template),a(c.contents())(b)}}}],ef=bd({priority:450,compile:function(){return{pre:function(a,b,c){a.$eval(c.ngInit)}}}}),ff=bd({terminal:!0,priority:1e3}),gf=["$locale","$interpolate",function(a,b){var c=/{}/g;return{restrict:"EA",link:function(d,e,g){var h=g.count,i=g.$attr.when&&e.attr(g.$attr.when),j=g.offset||0,k=d.$eval(i)||{},l={},m=b.startSymbol(),n=b.endSymbol(),o=/^when(Minus)?(.+)$/;f(g,function(a,b){o.test(b)&&(k[md(b.replace("when","").replace("Minus","-"))]=e.attr(g.$attr[b]))}),f(k,function(a,d){l[d]=b(a.replace(c,m+h+"-"+j+n))}),d.$watch(function(){var b=parseFloat(d.$eval(h));return isNaN(b)?"":(b in k||(b=a.pluralCat(b-j)),l[b](d,e,!0))},function(a){e.text(a)})}}}],hf=["$parse","$animate",function(a,c){function g(a){return a.clone[0]}function h(a){return a.clone[a.clone.length-1]}var i="$$NG_REMOVED",j=d("ngRepeat");return{transclude:"element",priority:1e3,terminal:!0,$$tlb:!0,link:function(d,k,l,m,n){var o,p,q,r,s,t,u,v,w,x=l.ngRepeat,y=x.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?\s*$/),z={$id:Fb};if(!y)throw j("iexp","Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.",x);if(t=y[1],u=y[2],o=y[3],o?(p=a(o),q=function(a,b,c){return w&&(z[w]=a),z[v]=b,z.$index=c,p(d,z)}):(r=function(a,b){return Fb(b)},s=function(a){return a}),y=t.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/),!y)throw j("iidexp","'_item_' in '_item_ in _collection_' should be an identifier or '(_key_, _value_)' expression, but got '{0}'.",t);v=y[3]||y[1],w=y[2];var A={};d.$watchCollection(u,function(a){var l,m,o,p,t,u,y,z,B,C,D,E,F=k[0],G={},H=[];if(e(a))C=a,B=q||r;else{B=q||s,C=[];for(u in a)a.hasOwnProperty(u)&&"$"!=u.charAt(0)&&C.push(u);C.sort()}for(p=C.length,m=H.length=C.length,l=0;m>l;l++)if(u=a===C?l:C[l],y=a[u],z=B(u,y,l),eb(z,"`track by` id"),A.hasOwnProperty(z))D=A[z],delete A[z],G[z]=D,H[l]=D;else{if(G.hasOwnProperty(z))throw f(H,function(a){a&&a.scope&&(A[a.id]=a)}),j("dupes","Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}",x,z);H[l]={id:z},G[z]=!1}for(u in A)A.hasOwnProperty(u)&&(D=A[u],E=gb(D.clone),c.leave(E),f(E,function(a){a[i]=!0}),D.scope.$destroy());for(l=0,m=C.length;m>l;l++){if(u=a===C?l:C[l],y=a[u],D=H[l],H[l-1]&&(F=h(H[l-1])),D.scope){t=D.scope,o=F;do o=o.nextSibling;while(o&&o[i]);g(D)!=o&&c.move(gb(D.clone),null,sd(F)),F=h(D)}else t=d.$new();t[v]=y,w&&(t[w]=u),t.$index=l,t.$first=0===l,t.$last=l===p-1,t.$middle=!(t.$first||t.$last),t.$odd=!(t.$even=0===(1&l)),D.scope||n(t,function(a){a[a.length++]=b.createComment(" end ngRepeat: "+x+" "),c.enter(a,null,sd(F)),F=a,D.scope=t,D.clone=a,G[D.id]=D})}A=G})}}}],jf=["$animate",function(a){return function(b,c,d){b.$watch(d.ngShow,function(b){a[T(b)?"removeClass":"addClass"](c,"ng-hide")})}}],kf=["$animate",function(a){return function(b,c,d){b.$watch(d.ngHide,function(b){a[T(b)?"addClass":"removeClass"](c,"ng-hide")})}}],lf=bd(function(a,b,c){a.$watch(c.ngStyle,function(a,c){c&&a!==c&&f(c,function(a,c){b.css(c,"")}),a&&b.css(a)},!0)}),mf=["$animate",function(a){return{restrict:"EA",require:"ngSwitch",controller:["$scope",function(){this.cases={}}],link:function(b,c,d,e){var g,h,i,j=d.ngSwitch||d.on,k=[];b.$watch(j,function(c){var j,l=k.length;if(l>0){if(i){for(j=0;l>j;j++)i[j].remove();i=null}for(i=[],j=0;l>j;j++){var m=h[j];k[j].$destroy(),i[j]=m,a.leave(m,function(){i.splice(j,1),0===i.length&&(i=null)})}}h=[],k=[],(g=e.cases["!"+c]||e.cases["?"])&&(b.$eval(d.change),f(g,function(c){var d=b.$new();k.push(d),c.transclude(d,function(b){var d=c.element;h.push(b),a.enter(b,d.parent(),d)})}))})}}}],nf=bd({transclude:"element",priority:800,require:"^ngSwitch",link:function(a,b,c,d,e){d.cases["!"+c.ngSwitchWhen]=d.cases["!"+c.ngSwitchWhen]||[],d.cases["!"+c.ngSwitchWhen].push({transclude:e,element:b})}}),of=bd({transclude:"element",priority:800,require:"^ngSwitch",link:function(a,b,c,d,e){d.cases["?"]=d.cases["?"]||[],d.cases["?"].push({transclude:e,element:b})}}),pf=bd({link:function(a,b,c,e,f){if(!f)throw d("ngTransclude")("orphan","Illegal use of ngTransclude directive in the template! No parent directive that requires a transclusion found. Element: {0}",U(b));f(function(a){b.empty(),b.append(a)})}}),qf=["$templateCache",function(a){return{restrict:"E",terminal:!0,compile:function(b,c){if("text/ng-template"==c.type){var d=c.id,e=b[0].text;a.put(d,e)}}}}],rf=d("ngOptions"),sf=q({terminal:!0}),tf=["$compile","$parse",function(a,d){var e=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/,h={$setViewValue:o};return{restrict:"E",require:["select","?ngModel"],controller:["$element","$scope","$attrs",function(a,b,c){var d,e,f=this,g={},i=h;f.databound=c.ngModel,f.init=function(a,b,c){i=a,d=b,e=c},f.addOption=function(b){eb(b,'"option value"'),g[b]=!0,i.$viewValue==b&&(a.val(b),e.parent()&&e.remove())},f.removeOption=function(a){this.hasOption(a)&&(delete g[a],i.$viewValue==a&&this.renderUnknownOption(a))},f.renderUnknownOption=function(b){var c="? "+Fb(b)+" ?";e.val(c),a.prepend(e),a.val(c),e.prop("selected",!0)},f.hasOption=function(a){return g.hasOwnProperty(a)},b.$on("$destroy",function(){f.renderUnknownOption=o})}],link:function(h,i,j,k){function l(a,b,c,d){c.$render=function(){var a=c.$viewValue;d.hasOption(a)?(z.parent()&&z.remove(),b.val(a),""===a&&o.prop("selected",!0)):r(a)&&o?b.val(""):d.renderUnknownOption(a)},b.on("change",function(){a.$apply(function(){z.parent()&&z.remove(),c.$setViewValue(b.val())})})}function m(a,b,c){var d;c.$render=function(){var a=new Gb(c.$viewValue);f(b.find("option"),function(b){b.selected=s(a.get(b.value))})},a.$watch(function(){L(d,c.$viewValue)||(d=J(c.$viewValue),c.$render())}),b.on("change",function(){a.$apply(function(){var a=[];f(b.find("option"),function(b){b.selected&&a.push(b.value)}),c.$setViewValue(a)})})}function n(b,f,h){function i(){var a,c,d,e,i,j,q,u,A,B,C,D,E,F,G,H={"":[]},I=[""],J=h.$modelValue,K=p(b)||[],L=m?g(K):K,M={},N=!1;if(t)if(r&&x(J)){N=new Gb([]);for(var O=0;O<J.length;O++)M[l]=J[O],N.put(r(b,M),J[O])}else N=new Gb(J);for(C=0;A=L.length,A>C;C++){if(q=C,m){if(q=L[C],"$"===q.charAt(0))continue;M[m]=q}if(M[l]=K[q],a=n(b,M)||"",(c=H[a])||(c=H[a]=[],I.push(a)),t)D=s(N.remove(r?r(b,M):o(b,M)));else{if(r){var P={};P[l]=J,D=r(b,P)===r(b,M)}else D=J===o(b,M);N=N||D}G=k(b,M),G=s(G)?G:"",c.push({id:r?r(b,M):m?L[C]:C,label:G,selected:D})}for(t||(v||null===J?H[""].unshift({id:"",label:"",selected:!N}):N||H[""].unshift({id:"?",label:"",selected:!0})),B=0,u=I.length;u>B;B++){for(a=I[B],c=H[a],z.length<=B?(e={element:y.clone().attr("label",a),label:c.label},i=[e],z.push(i),f.append(e.element)):(i=z[B],e=i[0],e.label!=a&&e.element.attr("label",e.label=a)),E=null,C=0,A=c.length;A>C;C++)d=c[C],(j=i[C+1])?(E=j.element,j.label!==d.label&&E.text(j.label=d.label),j.id!==d.id&&E.val(j.id=d.id),j.selected!==d.selected&&E.prop("selected",j.selected=d.selected)):(""===d.id&&v?F=v:(F=w.clone()).val(d.id).attr("selected",d.selected).text(d.label),i.push(j={element:F,label:d.label,id:d.id,selected:d.selected}),E?E.after(F):e.element.append(F),E=F);for(C++;i.length>C;)i.pop().element.remove()}for(;z.length>B;)z.pop()[0].element.remove()}var j;if(!(j=u.match(e)))throw rf("iexp","Expected expression in form of '_select_ (as _label_)? for (_key_,)?_value_ in _collection_' but got '{0}'. Element: {1}",u,U(f));var k=d(j[2]||j[1]),l=j[4]||j[6],m=j[5],n=d(j[3]||""),o=d(j[2]?j[1]:l),p=d(j[7]),q=j[8],r=q?d(j[8]):null,z=[[{element:f,label:""}]];v&&(a(v)(b),v.removeClass("ng-scope"),v.remove()),f.empty(),f.on("change",function(){b.$apply(function(){var a,d,e,g,i,j,k,n,q,s=p(b)||[],u={};if(t){for(e=[],j=0,n=z.length;n>j;j++)for(a=z[j],i=1,k=a.length;k>i;i++)if((g=a[i].element)[0].selected){if(d=g.val(),m&&(u[m]=d),r)for(q=0;q<s.length&&(u[l]=s[q],r(b,u)!=d);q++);else u[l]=s[d];e.push(o(b,u))}}else{if(d=f.val(),"?"==d)e=c;else if(""===d)e=null;else if(r){for(q=0;q<s.length;q++)if(u[l]=s[q],r(b,u)==d){e=o(b,u);break}}else u[l]=s[d],m&&(u[m]=d),e=o(b,u);z[0].length>1&&z[0][1].id!==d&&(z[0][1].selected=!1)}h.$setViewValue(e)})}),h.$render=i,b.$watch(i)}if(k[1]){for(var o,p=k[0],q=k[1],t=j.multiple,u=j.ngOptions,v=!1,w=sd(b.createElement("option")),y=sd(b.createElement("optgroup")),z=w.clone(),A=0,B=i.children(),C=B.length;C>A;A++)if(""===B[A].value){o=v=B.eq(A);break}p.init(q,v,z),t&&(q.$isEmpty=function(a){return!a||0===a.length}),u?n(h,i,q):t?m(h,i,q):l(h,i,q,p)}}}}],uf=["$interpolate",function(a){var b={addOption:o,removeOption:o};return{restrict:"E",priority:100,compile:function(c,d){if(r(d.value)){var e=a(c.text(),!0);e||d.$set("value",c.text())}return function(a,c,d){var f="$selectController",g=c.parent(),h=g.data(f)||g.parent().data(f);h&&h.databound?c.prop("selected",!1):h=b,e?a.$watch(e,function(a,b){d.$set("value",a),a!==b&&h.removeOption(b),h.addOption(a)}):h.addOption(d.value),c.on("$destroy",function(){h.removeOption(d.value)})}}}}],vf=q({restrict:"E",terminal:!0});return a.angular.bootstrap?void console.log("WARNING: Tried to load angular more than once."):(bb(),ib(Ad),void sd(b).ready(function(){$(b,_)}))}(window,document),!angular.$$csp()&&angular.element(document).find("head").prepend('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide{display:none !important;}ng\\:form{display:block;}.ng-animate-block-transitions{transition:0s all!important;-webkit-transition:0s all!important;}</style>'),!function(a){"use strict";var b=function(b,c){this.options=a.extend({},a.fn.affix.defaults,c),this.$window=a(window).on("scroll.affix.data-api",a.proxy(this.checkPosition,this)).on("click.affix.data-api",a.proxy(function(){setTimeout(a.proxy(this.checkPosition,this),1)},this)),this.$element=a(b),this.checkPosition()};b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b,c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.bottom,h=f.top,i="affix affix-top affix-bottom";"object"!=typeof f&&(g=h=f),"function"==typeof h&&(h=f.top()),"function"==typeof g&&(g=f.bottom()),b=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=g&&e.top+this.$element.height()>=c-g?"bottom":null!=h&&h>=d?"top":!1,this.affixed!==b&&(this.affixed=b,this.unpin="bottom"==b?e.top-d:null,this.$element.removeClass(i).addClass("affix"+(b?"-"+b:"")))}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("affix"),f="object"==typeof c&&c;e||d.data("affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.defaults={offset:0},a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(window.jQuery),!function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){d.trigger("closed").remove()}var d,e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,"")),d=a(f),b&&b.preventDefault(),d.length||(d=e.hasClass("alert")?e:e.parent()),d.trigger(b=a.Event("close")),b.isDefaultPrevented()||(d.removeClass("in"),a.support.transition&&d.hasClass("fade")?d.on(a.support.transition.end,c):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("alert");e||d.data("alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.alert.data-api",b,c.prototype.close)}(window.jQuery),!function(a){"use strict";function b(){a(".dropdown-backdrop").remove(),a(d).each(function(){c(a(this)).removeClass("open")})}function c(b){var c,d=b.attr("data-target");return d||(d=b.attr("href"),d=d&&/#/.test(d)&&d.replace(/.*(?=#[^\s]*$)/,"")),c=d&&a(d),c&&c.length||(c=b.parent()),c}var d="[data-toggle=dropdown]",e=function(b){var c=a(b).on("click.dropdown.data-api",this.toggle);a("html").on("click.dropdown.data-api",function(){c.parent().removeClass("open")})};e.prototype={constructor:e,toggle:function(){var d,e,f=a(this);if(!f.is(".disabled, :disabled"))return d=c(f),e=d.hasClass("open"),b(),e||("ontouchstart"in document.documentElement&&a('<div class="dropdown-backdrop"/>').insertBefore(a(this)).on("click",b),d.toggleClass("open")),f.focus(),!1},keydown:function(b){var e,f,g,h,i;if(/(38|40|27)/.test(b.keyCode)&&(e=a(this),b.preventDefault(),b.stopPropagation(),!e.is(".disabled, :disabled"))){if(g=c(e),h=g.hasClass("open"),!h||h&&27==b.keyCode)return 27==b.which&&g.find(d).focus(),e.click();f=a("[role=menu] li:not(.divider):visible a",g),f.length&&(i=f.index(f.filter(":focus")),38==b.keyCode&&i>0&&i--,40==b.keyCode&&i<f.length-1&&i++,~i||(i=0),f.eq(i).focus())}}};var f=a.fn.dropdown;a.fn.dropdown=function(b){return this.each(function(){var c=a(this),d=c.data("dropdown");d||c.data("dropdown",d=new e(this)),"string"==typeof b&&d[b].call(c)})},a.fn.dropdown.Constructor=e,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=f,this},a(document).on("click.dropdown.data-api",b).on("click.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.dropdown.data-api",d,e.prototype.toggle).on("keydown.dropdown.data-api",d+", [role=menu]",e.prototype.keydown)}(window.jQuery),!function(a){"use strict";var b=function(a,b){this.init("tooltip",a,b)};b.prototype={constructor:b,init:function(b,c,d){var e,f,g,h,i;for(this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.enabled=!0,g=this.options.trigger.split(" "),i=g.length;i--;)h=g[i],"click"==h?this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this)):"manual"!=h&&(e="hover"==h?"mouseenter":"focus",f="hover"==h?"mouseleave":"blur",this.$element.on(e+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(f+"."+this.type,this.options.selector,a.proxy(this.leave,this)));this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(b){return b=a.extend({},a.fn[this.type].defaults,this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},enter:function(b){var c,d=a.fn[this.type].defaults,e={};return this._options&&a.each(this._options,function(a,b){d[a]!=b&&(e[a]=b)},this),c=a(b.currentTarget)[this.type](e).data(this.type),c.options.delay&&c.options.delay.show?(clearTimeout(this.timeout),c.hoverState="in",void(this.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show))):c.show()},leave:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);return this.timeout&&clearTimeout(this.timeout),c.options.delay&&c.options.delay.hide?(c.hoverState="out",void(this.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide))):c.hide()},show:function(){var b,c,d,e,f,g,h=a.Event("show");if(this.hasContent()&&this.enabled){if(this.$element.trigger(h),h.isDefaultPrevented())return;switch(b=this.tip(),this.setContent(),this.options.animation&&b.addClass("fade"),f="function"==typeof this.options.placement?this.options.placement.call(this,b[0],this.$element[0]):this.options.placement,b.detach().css({top:0,left:0,display:"block"}),this.options.container?b.appendTo(this.options.container):b.insertAfter(this.$element),c=this.getPosition(),d=b[0].offsetWidth,e=b[0].offsetHeight,f){case"bottom":g={top:c.top+c.height,left:c.left+c.width/2-d/2};break;case"top":g={top:c.top-e,left:c.left+c.width/2-d/2};break;case"left":g={top:c.top+c.height/2-e/2,left:c.left-d};break;case"right":g={top:c.top+c.height/2-e/2,left:c.left+c.width}}this.applyPlacement(g,f),this.$element.trigger("shown")}},applyPlacement:function(a,b){var c,d,e,f,g=this.tip(),h=g[0].offsetWidth,i=g[0].offsetHeight;g.offset(a).addClass(b).addClass("in"),c=g[0].offsetWidth,d=g[0].offsetHeight,"top"==b&&d!=i&&(a.top=a.top+i-d,f=!0),"bottom"==b||"top"==b?(e=0,a.left<0&&(e=-2*a.left,a.left=0,g.offset(a),c=g[0].offsetWidth,d=g[0].offsetHeight),this.replaceArrow(e-h+c,c,"left")):this.replaceArrow(d-i,d,"top"),f&&g.offset(a)},replaceArrow:function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},setContent:function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},hide:function(){function b(){var b=setTimeout(function(){c.off(a.support.transition.end).detach()},500);c.one(a.support.transition.end,function(){clearTimeout(b),c.detach()})}var c=this.tip(),d=a.Event("hide");return this.$element.trigger(d),d.isDefaultPrevented()?void 0:(c.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?b():c.detach(),this.$element.trigger("hidden"),this)},fixTitle:function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},hasContent:function(){return this.getTitle()},getPosition:function(){var b=this.$element[0];return a.extend({},"function"==typeof b.getBoundingClientRect?b.getBoundingClientRect():{width:b.offsetWidth,height:b.offsetHeight},this.$element.offset())},getTitle:function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},tip:function(){return this.$tip=this.$tip||a(this.options.template)},arrow:function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(b){var c=b?a(b.currentTarget)[this.type](this._options).data(this.type):this;c.tip().hasClass("in")?c.hide():c.show()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}};var c=a.fn.tooltip;a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("tooltip"),f="object"==typeof c&&c;e||d.data("tooltip",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},a.fn.tooltip.noConflict=function(){return a.fn.tooltip=c,this}}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.options=c,this.$element=a(b).delegate('[data-dismiss="modal"]',"click.dismiss.modal",a.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};b.prototype={constructor:b,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var b=this,c=a.Event("show");this.$element.trigger(c),this.isShown||c.isDefaultPrevented()||(this.isShown=!0,this.escape(),this.backdrop(function(){var c=a.support.transition&&b.$element.hasClass("fade");b.$element.parent().length||b.$element.appendTo(document.body),b.$element.show(),c&&b.$element[0].offsetWidth,b.$element.addClass("in").attr("aria-hidden",!1),b.enforceFocus(),c?b.$element.one(a.support.transition.end,function(){b.$element.focus().trigger("shown")}):b.$element.focus().trigger("shown")}))},hide:function(b){b&&b.preventDefault();b=a.Event("hide"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),a(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),a.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal())},enforceFocus:function(){var b=this;a(document).on("focusin.modal",function(a){b.$element[0]===a.target||b.$element.has(a.target).length||b.$element.focus()})},escape:function(){var a=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(b){27==b.which&&a.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var b=this,c=setTimeout(function(){b.$element.off(a.support.transition.end),b.hideModal()},500);this.$element.one(a.support.transition.end,function(){clearTimeout(c),b.hideModal()})},hideModal:function(){var a=this;this.$element.hide(),this.backdrop(function(){a.removeBackdrop(),a.$element.trigger("hidden")})},removeBackdrop:function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},backdrop:function(b){var c=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var d=a.support.transition&&c;if(this.$backdrop=a('<div class="modal-backdrop '+c+'" />').appendTo(document.body),this.$backdrop.click("static"==this.options.backdrop?a.proxy(this.$element[0].focus,this.$element[0]):a.proxy(this.hide,this)),d&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;d?this.$backdrop.one(a.support.transition.end,b):b()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(a.support.transition.end,b):b()):b&&b()}};var c=a.fn.modal;a.fn.modal=function(c){return this.each(function(){var d=a(this),e=d.data("modal"),f=a.extend({},a.fn.modal.defaults,d.data(),"object"==typeof c&&c);e||d.data("modal",e=new b(this,f)),"string"==typeof c?e[c]():f.show&&e.show()})},a.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},a.fn.modal.Constructor=b,a.fn.modal.noConflict=function(){return a.fn.modal=c,this},a(document).on("click.modal.data-api",'[data-toggle="modal"]',function(b){var c=a(this),d=c.attr("href"),e=a(c.attr("data-target")||d&&d.replace(/.*(?=#[^\s]+$)/,"")),f=e.data("modal")?"toggle":a.extend({remote:!/#/.test(d)&&d},e.data(),c.data());b.preventDefault(),e.modal(f).one("hide",function(){c.focus()})})}(window.jQuery),!function(a){"use strict";a(function(){a.support.transition=function(){var a=function(){var a,b=document.createElement("bootstrap"),c={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(a in c)if(void 0!==b.style[a])return c[a]}();return a&&{end:a}}()})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.button.defaults,c)};b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.data(),e=c.is("input")?"val":"html";a+="Text",d.resetText||c.data("resetText",c[e]()),c[e](d[a]||this.options[a]),setTimeout(function(){"loadingText"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons-radio"]');a&&a.find(".active").removeClass("active"),this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("button"),f="object"==typeof c&&c;e||d.data("button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.defaults={loadingText:"loading..."},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle")})}(window.jQuery),!function(a){"use strict";var b=function(a,b){this.init("popover",a,b)};b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype,{constructor:b,setContent:function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var a,b=this.$element,c=this.options;return a=("function"==typeof c.content?c.content.call(b[0]):c.content)||b.attr("data-content")},tip:function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}});var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("popover"),f="object"==typeof c&&c;e||d.data("popover",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.defaults=a.extend({},a.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.typeahead.defaults,c),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.source=this.options.source,this.$menu=a(this.options.menu),this.shown=!1,this.listen()};b.prototype={constructor:b,select:function(){var a=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(a)).change(),this.hide()},updater:function(a){return a},show:function(){var b=a.extend({},this.$element.position(),{height:this.$element[0].offsetHeight});return this.$menu.insertAfter(this.$element).css({top:b.top+b.height,left:b.left}).show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(){var b;return this.query=this.$element.val(),!this.query||this.query.length<this.options.minLength?this.shown?this.hide():this:(b=a.isFunction(this.source)?this.source(this.query,a.proxy(this.process,this)):this.source,b?this.process(b):this)},process:function(b){var c=this;return b=a.grep(b,function(a){return c.matcher(a)}),b=this.sorter(b),b.length?this.render(b.slice(0,this.options.items)).show():this.shown?this.hide():this},matcher:function(a){return~a.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(a){for(var b,c=[],d=[],e=[];b=a.shift();)b.toLowerCase().indexOf(this.query.toLowerCase())?~b.indexOf(this.query)?d.push(b):e.push(b):c.push(b);return c.concat(d,e)},highlighter:function(a){var b=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return a.replace(new RegExp("("+b+")","ig"),function(a,b){return"<strong>"+b+"</strong>"})},render:function(b){var c=this;return b=a(b).map(function(b,d){return b=a(c.options.item).attr("data-value",d),b.find("a").html(c.highlighter(d)),b[0]}),b.first().addClass("active"),this.$menu.html(b),this},next:function(){var b=this.$menu.find(".active").removeClass("active"),c=b.next();c.length||(c=a(this.$menu.find("li")[0])),c.addClass("active")},prev:function(){var a=this.$menu.find(".active").removeClass("active"),b=a.prev();b.length||(b=this.$menu.find("li").last()),b.addClass("active")},listen:function(){this.$element.on("focus",a.proxy(this.focus,this)).on("blur",a.proxy(this.blur,this)).on("keypress",a.proxy(this.keypress,this)).on("keyup",a.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown",a.proxy(this.keydown,this)),this.$menu.on("click",a.proxy(this.click,this)).on("mouseenter","li",a.proxy(this.mouseenter,this)).on("mouseleave","li",a.proxy(this.mouseleave,this))},eventSupported:function(a){var b=a in this.$element;return b||(this.$element.setAttribute(a,"return;"),b="function"==typeof this.$element[a]),b},move:function(a){if(this.shown){switch(a.keyCode){case 9:case 13:case 27:a.preventDefault();break;case 38:a.preventDefault(),this.prev();break;case 40:a.preventDefault(),this.next()}a.stopPropagation()}},keydown:function(b){this.suppressKeyPressRepeat=~a.inArray(b.keyCode,[40,38,9,13,27]),this.move(b)},keypress:function(a){this.suppressKeyPressRepeat||this.move(a)},keyup:function(a){switch(a.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}a.stopPropagation(),a.preventDefault()},focus:function(){this.focused=!0},blur:function(){this.focused=!1,!this.mousedover&&this.shown&&this.hide()},click:function(a){a.stopPropagation(),a.preventDefault(),this.select(),this.$element.focus()},mouseenter:function(b){this.mousedover=!0,this.$menu.find(".active").removeClass("active"),a(b.currentTarget).addClass("active")},mouseleave:function(){this.mousedover=!1,!this.focused&&this.shown&&this.hide()}};var c=a.fn.typeahead;a.fn.typeahead=function(c){return this.each(function(){var d=a(this),e=d.data("typeahead"),f="object"==typeof c&&c;e||d.data("typeahead",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>',minLength:1},a.fn.typeahead.Constructor=b,a.fn.typeahead.noConflict=function(){return a.fn.typeahead=c,this},a(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(){var b=a(this);b.data("typeahead")||b.typeahead(b.data())})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.prototype={cycle:function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},getActiveIndex:function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},to:function(b){var c=this.getActiveIndex(),d=this;if(!(b>this.$items.length-1||0>b))return this.sliding?this.$element.one("slid",function(){d.to(b)}):c==b?this.pause().cycle():this.slide(b>c?"next":"prev",a(this.$items[b]))},pause:function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),clearInterval(this.interval),this.interval=null,this},next:function(){return this.sliding?void 0:this.slide("next")},prev:function(){return this.sliding?void 0:this.slide("prev")},slide:function(b,c){var d,e=this.$element.find(".item.active"),f=c||e[b](),g=this.interval,h="next"==b?"left":"right",i="next"==b?"first":"last",j=this;if(this.sliding=!0,g&&this.pause(),f=f.length?f:this.$element.find(".item")[i](),d=a.Event("slide",{relatedTarget:f[0],direction:h}),!f.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var b=a(j.$indicators.children()[j.getActiveIndex()]);
-b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(d),d.isDefaultPrevented())return;f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),this.$element.one(a.support.transition.end,function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),j.sliding=!1,setTimeout(function(){j.$element.trigger("slid")},0)})}else{if(this.$element.trigger(d),d.isDefaultPrevented())return;e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return g&&this.cycle(),this}}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("carousel"),f=a.extend({},a.fn.carousel.defaults,"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.defaults={interval:5e3,pause:"hover"},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d,e=a(this),f=a(e.attr("data-target")||(c=e.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),g=a.extend({},f.data(),e.data());f.carousel(g),(d=e.attr("data-slide-to"))&&f.data("carousel").pause().to(d).cycle(),b.preventDefault()})}(window.jQuery),!function(a){"use strict";function b(b,c){var d,e=a.proxy(this.process,this),f=a(a(b).is("body")?window:b);this.options=a.extend({},a.fn.scrollspy.defaults,c),this.$scrollElement=f.on("scroll.scroll-spy.data-api",e),this.selector=(this.options.target||(d=a(b).attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=a("body"),this.refresh(),this.process()}b.prototype={constructor:b,refresh:function(){var b,c=this;this.offsets=a([]),this.targets=a([]),b=this.$body.find(this.selector).map(function(){var b=a(this),d=b.data("target")||b.attr("href"),e=/^#\w/.test(d)&&a(d);return e&&e.length&&[[e.position().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),d]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})},process:function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},activate:function(b){var c,d;this.activeTarget=b,a(this.selector).parent(".active").removeClass("active"),d=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',c=a(d).parent("li").addClass("active"),c.parent(".dropdown-menu").length&&(c=c.closest("li.dropdown").addClass("active")),c.trigger("activate")}};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("scrollspy"),f="object"==typeof c&&c;e||d.data("scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.defaults={offset:10},a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.collapse.defaults,c),this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.prototype={constructor:b,dimension:function(){var a=this.$element.hasClass("width");return a?"width":"height"},show:function(){var b,c,d,e;if(!this.transitioning&&!this.$element.hasClass("in")){if(b=this.dimension(),c=a.camelCase(["scroll",b].join("-")),d=this.$parent&&this.$parent.find("> .accordion-group > .in"),d&&d.length){if(e=d.data("collapse"),e&&e.transitioning)return;d.collapse("hide"),e||d.data("collapse",null)}this.$element[b](0),this.transition("addClass",a.Event("show"),"shown"),a.support.transition&&this.$element[b](this.$element[0][c])}},hide:function(){var b;!this.transitioning&&this.$element.hasClass("in")&&(b=this.dimension(),this.reset(this.$element[b]()),this.transition("removeClass",a.Event("hide"),"hidden"),this.$element[b](0))},reset:function(a){var b=this.dimension();return this.$element.removeClass("collapse")[b](a||"auto")[0].offsetWidth,this.$element[null!==a?"addClass":"removeClass"]("collapse"),this},transition:function(b,c,d){var e=this,f=function(){"show"==c.type&&e.reset(),e.transitioning=0,e.$element.trigger(d)};this.$element.trigger(c),c.isDefaultPrevented()||(this.transitioning=1,this.$element[b]("in"),a.support.transition&&this.$element.hasClass("collapse")?this.$element.one(a.support.transition.end,f):f())},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("collapse"),f=a.extend({},a.fn.collapse.defaults,d.data(),"object"==typeof c&&c);e||d.data("collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.defaults={toggle:!0},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e).data("collapse")?"toggle":d.data();d[a(e).hasClass("in")?"addClass":"removeClass"]("collapsed"),a(e).collapse(f)})}(window.jQuery),!function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype={constructor:b,show:function(){var b,c,d,e=this.element,f=e.closest("ul:not(.dropdown-menu)"),g=e.attr("data-target");g||(g=e.attr("href"),g=g&&g.replace(/.*(?=#[^\s]*$)/,"")),e.parent("li").hasClass("active")||(b=f.find(".active:last a")[0],d=a.Event("show",{relatedTarget:b}),e.trigger(d),d.isDefaultPrevented()||(c=a(g),this.activate(e.parent("li"),f),this.activate(c,c.parent(),function(){e.trigger({type:"shown",relatedTarget:b})})))},activate:function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e):e(),f.removeClass("in")}};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("tab");e||d.data("tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(window.jQuery);
\ No newline at end of file
diff --git a/web/demos/package/app/scripts/5f986af9.scripts.js b/web/demos/package/app/scripts/5f986af9.scripts.js
new file mode 100644
index 0000000..de6783c
--- /dev/null
+++ b/web/demos/package/app/scripts/5f986af9.scripts.js
@@ -0,0 +1 @@
+!function(){"use strict";angular.module("widgets",["socket"]),angular.module("twitter",["rest","socket","widgets","ngGrid"]),angular.module("mobile",["rest","widgets","ngGrid","google-maps"]),angular.module("machine",["ng","rest","widgets"]),angular.module("dimensions",["ng","rest","widgets"]),angular.module("fraud",["rest","widgets"]),angular.module("app",["ngRoute","socket","twitter","mobile","machine","dimensions","fraud"]),angular.module("app").config(["$routeProvider","socketProvider",function(a,b){window.settings&&b.setWebSocketURL(settings.webSocketURL),a.when("/",{templateUrl:"views/welcome.html"}).when("/twitterUrls",{templateUrl:"views/twitter.html",controller:"TwitterUrlsController"}).when("/twitterHashtags",{templateUrl:"views/twitter.html",controller:"TwitterHashtagsController"}).when("/mobile",{templateUrl:"views/mobile.html",controller:"MobileController"}).when("/machine",{templateUrl:"views/machine.html",controller:"MachineController"}).when("/dimensions",{templateUrl:"views/dimensions.html",controller:"DimensionsController"}).when("/fraud",{templateUrl:"views/fraud.html",controller:"FraudController"})}])}(),function(){"use strict";angular.module("rest",["ng","restangular"]).factory("rest",["$q","Restangular",function(a,b){return{getApp:function(c){var d=a.defer();return b.oneUrl("applications","ws/v1/applications").get().then(function(a){var b=null;if(a&&a.apps&&a.apps.length>0){var e=_.where(a.apps,{name:c,state:"RUNNING"});if(e.length>0){e=_.sortBy(e,function(a){return parseInt(a.elapsedTime,10)});var f=e[0];d.resolve(f)}else b=c+" is not found. Please make sure application is running."}else b="No applications available.";b&&(d.reject(b),jQuery.pnotify({title:"Error",text:b,type:"error",icon:!1,hide:!1}))}),d.promise},getMachineData:function(a){var c=b.one("machine").get(a);return c.then(null,function(a){jQuery.pnotify({title:"Error",text:"Error getting data from server. Status Code: "+a.status,type:"error",icon:!1,hide:!1})}),c},getDimensionsData:function(a){var c=b.one("dimensions").get(a);return c.then(null,function(a){jQuery.pnotify({title:"Error",text:"Error getting data from server. Status Code: "+a.status,type:"error",icon:!1,hide:!1})}),c}}}]).run(function(){})}(),function(){"use strict";angular.module("socket",[]).factory("visibly",["$window",function(a){return a.visibly}]).provider("socket",function(){var a,b;return{$get:["$q","$rootScope","$timeout","visibly",function(c,d,e,f){if(!a&&!b)throw"WebSocket URL is not defined";var g=b?b:new WebSocket(a),h=c.defer();g.onopen=function(){h.resolve(),d.$apply(),jQuery.pnotify({title:"WebSocket",text:"WebSocket connection established.",type:"success",delay:2e3,icon:!1,history:!1})};var i=!1;g.onclose=function(){i||jQuery.pnotify({title:"WebSocket Closed",text:"WebSocket connection has been closed. Try refreshing the page.",type:"error",icon:!1,hide:!1,history:!1})},g.onerror=function(){i=!0,jQuery.pnotify({title:"WebSocket Error",text:"WebSocket error. Try refreshing the page.",type:"error",icon:!1,hide:!1,history:!1})};var j={},k=!1;g.onmessage=function(a){if(!k){var b=JSON.parse(a.data),c=b.topic;j.hasOwnProperty(c)&&j[c].fire(b)}};var l;return f.onHidden(function(){l=e(function(){k=!0,l=null},6e4)}),f.onVisible(function(){k=!1,l&&e.cancel(l)}),{send:function(a){var b=JSON.stringify(a);h.promise.then(function(){console.log("send "+b),g.send(b)})},publish:function(a,b){var c={type:"publish",topic:a,data:b};this.send(c)},subscribe:function(a,b,c){var d=j[a];if(!d){var e={type:"subscribe",topic:a};this.send(e),d=jQuery.Callbacks(),j[a]=d}d.add(b),c&&c.$on("$destroy",function(){this.unsubscribe(a,b)}.bind(this))},unsubscribe:function(a,b){if(j.hasOwnProperty(a)){var c=j[a];c.remove(b)}}}}],setWebSocketURL:function(b){a=b},setWebSocketObject:function(a){b=a}}})}(),function(){"use strict";angular.module("widgets").directive("lineChart",function(){return{template:"<div></div>",scope:{chart:"="},restrict:"E",replace:!0,link:function(a,b){function c(a){var b=a.data;b||(b=[]);var c=new google.visualization.DataTable;c.addColumn("datetime"),c.addColumn("number"),c.addRows(b.length);for(var e=new google.visualization.DataView(c),f=0;f<b.length;f++){var g=b[f];c.setCell(f,0,new Date(g.timestamp));var h=parseFloat(g.value);c.setCell(f,1,h)}var i;i=0===b.length&&a.emptyChartOptions?a.emptyChartOptions():a.options,d.draw(e,i)}var d=new google.visualization.LineChart(b[0]);a.$watch("chart",function(a){a&&c(a)})}}})}(),function(){"use strict";angular.module("widgets").directive("gauge",function(){return{restrict:"A",replace:!0,scope:{label:"@",min:"=",max:"=",value:"="},link:function(a,b,c){var d={size:280,label:c.label,min:void 0!==a.min?a.min:0,max:void 0!==a.max?a.max:100,minorTicks:5},e=d.max-d.min;d.yellowZones=[{from:d.min+.75*e,to:d.min+.9*e}],d.redZones=[{from:d.min+.9*e,to:d.max}],a.gauge=new Gauge(b[0],d),a.gauge.render(),a.gauge.redraw(a.value),a.$watch("value",function(){a.gauge&&a.gauge.redraw(a.value)})}}})}(),function(){"use strict";angular.module("widgets").directive("widgetsBarChart",function(){return{restrict:"A",scope:{data:"=",label:"@",onClick:"&"},link:function(a,b){var c=d3.select(b[0]).append("svg").attr("width","100%");window.onresize=function(){return a.$apply()},a.$watch(function(){return angular.element(window)[0].innerWidth},function(){return a.render(a.data)}),a.$watch("data",function(b){return a.render(b)},!0),a.render=function(d){c.selectAll("*").remove();var e,f,g;e=d3.select(b[0])[0][0].offsetWidth-20,f=35*a.data.length,g=98,c.attr("height",f),c.selectAll("rect").data(d).enter().append("rect").on("click",function(b){return a.onClick({item:b})}).attr("height",30).attr("width",0).attr("x",10).attr("y",function(a,b){return 35*b}).attr("width",function(a){var b=a.score/(g/e);return b>10?b:10}),c.selectAll("text").data(d).enter().append("text").attr("fill","#fff").attr("y",function(a,b){return 35*b+22}).attr("x",15).html(function(b){return b[a.label]})}}}})}(),function(){"use strict";angular.module("widgets").directive("widgetsStat",["$timeout","socket",function(a,b){return{restrict:"A",templateUrl:"views/stat.html",scope:{app:"=",label:"@",onClick:"&"},link:function(c){function d(){c.elapsed=e+(Date.now()-f),a(d,1e3)}c.totalEmitted=0,c.totalProcessed=0,c.elapsed=0;var e,f;c.$watch("app",function(a){if(a){e=parseInt(a.elapsedTime),f=Date.now(),d();var g="applications."+a.id;b.subscribe(g,function(a){var b=a.data;c.totalEmitted=b.tuplesEmittedPSMA,c.totalProcessed=b.totalTuplesProcessed,c.$apply()},c)}})}}}])}(),function(){"use strict";angular.module("widgets").filter("elapsed",function(){return function(a){var b={timeChunk:1*a,unixUptime:!0};_.defaults(b,{compareDate:+new Date,timeChunk:void 0,maxUnit:"year",unixUptime:!1,max_levels:3,timeStamp:a||0});var c=void 0!==b.timeChunk?b.timeChunk:b.compareDate-b.timeStamp,d="",e=", ",f=0,g=b.max_levels,h=1e3,i=60*h,j=60*i,k=24*j,l=7*k,m=4*l,n=365*k;if(b.unixUptime){var o=Math.floor(c/k);c-=o*k;var p=Math.floor(c/j);c-=p*j;var q=Math.round(c/i);if(0===o){q=Math.floor(c/i),c-=q*i;var r=Math.round(c/1e3);d=(10>p?"0":"")+p+":"+(10>q?"0":"")+q+":"+(10>r?"0":"")+r}else d=o+" days, "+p.toString()+":"+(10>q?"0":"")+q.toString()}else{for(var s=[{plural:"years",singular:"year",ms:n},{plural:"months",singular:"month",ms:m},{plural:"weeks",singular:"week",ms:l},{plural:"days",singular:"day",ms:k},{plural:"hours",singular:"hour",ms:j},{plural:"minutes",singular:"minute",ms:i},{plural:"seconds",singular:"second",ms:h}],t=!1,u=0;u<s.length;u++)if(b.maxUnit===s[u].singular&&(t=!0),!(c<s[u].ms)&&t){f++;var v=Math.floor(c/s[u].ms),w=1===v?s[u].singular:s[u].plural;if(d+=v+" "+w+e,c%=s[u].ms,f>=g)break}d=d.substring(0,d.length-e.length)}return d}})}(),function(){"use strict";angular.module("twitter").controller("TwitterUrlsController",["$scope","rest",function(a,b){b.getApp(settings.twitterUrls.appName).then(function(b){a.app=b,a.appURL=settings.appsURL+b.id}),a.topic=settings.twitterUrls.topic,a.pageTitle="Twitter Top URLs",a.entity="URLs",a.gridTitle="Twitter Top URLs",a.chartTitle="Top 10 URLs Chart",a.colName="URL",a.formatter=function(a){return'<a class="svg-link" xlink:href="'+a+'">'+a+"</a>"}}]).controller("TwitterHashtagsController",["$scope","rest",function(a,b){b.getApp(settings.twitterHashtags.appName).then(function(b){a.app=b,a.appURL=settings.appsURL+b.id}),a.topic=settings.twitterHashtags.topic,a.pageTitle="Twitter Top Hashtags",a.entity="hashtags",a.gridTitle="Twitter Top Hashtags",a.chartTitle="Top 10 Hashtags Chart",a.colName="Hashtag",a.formatter=function(a){return'<a class="svg-link" xlink:href="https://twitter.com/search?q=%23'+encodeURIComponent(a)+'">'+a+"</a>"}}]).controller("TwitterGridControlller",["$scope","socket",function(a,b){b.subscribe(a.topic,function(b){var c=[];jQuery.each(b.data,function(a,b){c.push({name:a,value:parseInt(b,10)})}),c=_.sortBy(c,function(a){return-a.value}),a.topTen=c,a.$apply()},a),a.gridOptions={data:"topTen",enableColumnResize:!0,columnDefs:[{field:"name",displayName:a.colName,width:"75%",sortable:!1},{field:"value",displayName:"Count",width:"25%",sortable:!1}]}}]).controller("TwitterBarChartController",["$scope","socket",function(a,b){b.subscribe(a.topic,function(b){var c=[];jQuery.each(b.data,function(a,b){c.push({name:a,value:parseInt(b,10)})}),c=_.sortBy(c,function(a){return-a.value});var d=c[0].value;_.each(c,function(b){a.formatter&&(b.name=a.formatter(b.name)),b.name+=" - "+b.value,b.score=b.value/d*100}),a.twitterBarChartData=c,a.$apply()},a),a.twitterBarChartData=[]}])}(),function(){"use strict";function a(a){var b=a.location.match(/\((\d+),(\d+)/),c=parseInt(b[1],10),d=parseInt(b[2],10),e=parseInt(a.phone,10),f=37.40180101292334+.01*(e%4-2)-.005*c,g=-121.9966721534729+.01*(e%8-4)+.007*d;return{latitude:f,longitude:g,label:a.phone,phone:a.phone}}angular.module("mobile").controller("MobileController",["$scope","rest","socket",function(b,c,d){c.getApp(settings.mobile.appName).then(function(a){b.app=a,b.appURL=settings.appsURL+a.id});var e={};d.subscribe(settings.mobile.topic.out,function(c){var d=c.data;if(d.hasOwnProperty("removed"))delete e[d.phone];else{var f=a(d);e[d.phone]=f}b.$broadcast("datachanged",e)},b)}]).controller("MobileGridControlller",["$scope","$filter","$timeout","socket",function(a,b,c,d){a.$on("datachanged",function(b,c){a.gridData=_.values(c)}),a.phone="",a.addPhone=function(){var b={command:"add",phone:a.phone},c={type:"publish",topic:settings.mobile.topic.in,data:b};d.send(c),a.phone=""},a.removePhone=function(a){var b={command:"del",phone:a},c={type:"publish",topic:settings.mobile.topic.in,data:b};d.send(c)},a.gridOptions={data:"gridData",enableColumnResize:!0,enableRowSelection:!1,columnDefs:[{field:"phone",displayName:"Phone",width:"30%",sortable:!1},{field:"latitude",displayName:"Latitude",cellFilter:"number:3",width:"30%",sortable:!1},{field:"longitude",displayName:"Longitude",cellFilter:"number:3",width:"30%",sortable:!1},{field:"phone",displayName:"",cellTemplate:'<div class="ngCellText" ng-class="col.colIndex()" ng-click="removePhone(COL_FIELD)"><i class="icon-trash"></i></div>',cellClass:"mobile-grid-remove",width:"10%",sortable:!1}]}}]).controller("MapController",["$scope","socket",function(a){google.maps.visualRefresh=!0,a.$on("datachanged",function(b,c){a.markersProperty=_.values(c)}),angular.extend(a,{position:{coords:{latitude:37.36197126180853,longitude:-121.92674696445465}},zoomProperty:12})}])}(),function(){"use strict";function a(a){return function(){var b=Date.now(),c=new Date(b),d=new Date(b-60*a.lookback*1e3),f=jQuery.extend({},e,{vAxis:{minValue:0,maxValue:100},hAxis:{viewWindow:{min:d,max:c}}});return f}}function b(a,b){return _.map(a,function(a){return{timestamp:a.timestamp,value:a[b]}})}function c(a){return{customer:a.customer.value,product:a.product.value,os:a.os.value,software1:a.software1.value,software2:a.software2.value,deviceId:a.deviceId.value,lookback:a.lookback}}function d(a,b,d){this.rest=a,this.scope=b,this.max=b.lookback,this.dataCache=null,this.callback=d,this.cancelled=!1,this.interval=null,this.timeout=null,this.params=c(this.scope)}var e={legend:"none",vAxis:{format:settings.machine.metricformat},chartArea:{top:20,height:240}};d.prototype={cancel:function(){this.cancelled=!0,this.scope.requestProgress=0,clearInterval(this.interval),clearTimeout(this.timeout)},responseStatus:function(){this.scope.requestProgress=Math.round((Date.now()-this.requestStartTime)/1e3),this.scope.$apply()},fetchMachineData:function(){this.dataCache&&this.dataCache.length&&(this.params.lastTimestamp=_.last(this.dataCache).timestamp);var a=this.max;this.requestStartTime=Date.now(),this.interval=setInterval(this.responseStatus.bind(this),250);var b=this;this.rest.getMachineData(this.params).then(function(c){if(!b.cancelled){b.scope.response=c;var d=c.minutes;b.scope.requestProgress=0,clearInterval(b.interval);var e=Date.now();if(b.scope.lastResponse=new Date(e),b.scope.responseTime=e-b.requestStartTime,b.dataCache){if(d.length>0){b.scope.minutesCached=b.dataCache.length,b.scope.minutesReceived=d.length,b.dataCache.pop();var f=b.dataCache.length+d.length;f>a&&b.dataCache.splice(0,f-a),b.dataCache.push.apply(b.dataCache,d)}}else b.dataCache=d,b.scope.minutesCached=0,b.scope.minutesReceived=d.length;b.callback(b.dataCache);var g=settings.machine.pollInterval-(Date.now()-b.requestStartTime);g=Math.max(0,g),b.timeout=setTimeout(b.fetchMachineData.bind(b),g)}},function(){b.cancel()})}},angular.module("machine").controller("MachineController",["$scope","$timeout","$location","$routeParams","rest",function(f,g,h,i,j){function k(a,b){var c=f.range(a),d=_.map(c,function(a){return{value:String(a),label:b+" "+a}});d.splice(0,0,{value:"",label:"ALL "}),f.select[a]=d;var e=null;n[a]&&(e=_.findWhere(d,{value:n[a]})),f[a]=e?e:d[0]}function l(a){if(a&&a.length>0){var c=_.last(a);f.cpu=parseFloat(c.cpu),f.ram=parseFloat(c.ram),f.hdd=parseFloat(c.hdd)}f.cpuChart={data:b(a,"cpu"),options:e,emptyChartOptions:o},f.ramChart={data:b(a,"ram"),options:e,emptyChartOptions:o},f.hddChart={data:b(a,"hdd"),options:e,emptyChartOptions:o}}function m(){p&&p.cancel(),p=new d(j,f,l),p.fetchMachineData()}var n=new URI(window.location.href).query(!0),o=a(f);j.getApp(settings.machine.appName).then(function(a){f.app=a,f.appURL=settings.appsURL+a.id}),f.cpu=0,f.ram=0,f.hdd=0,f.range=function(a){var b=settings.machine.range[a];return _.range(b.start,b.stop+1)},f.select={},k("customer","Customer"),k("product","Product"),k("os","OS"),k("software1","Software1 Version"),k("software2","Software2 Version"),k("deviceId","Device ID"),f.lookback=n.lookback?parseInt(n.lookback,10):settings.machine.lookback,f.reload=function(){window.location.href=window.location.pathname+"?"+jQuery.param(c(f))},f.cpuChart={emptyChartOptions:o},f.ramChart={emptyChartOptions:o},f.hddChart={emptyChartOptions:o};var p=null;f.$watch("[customer, product, os, software1, software1, deviceId]",function(){m()},!0);var q,r=!0;f.$watch("lookback",function(){r?r=!1:(clearTimeout(q),q=setTimeout(m,500))}),f.$on("$destroy",function(){p&&p.cancel()}.bind(this))}])}(),function(){"use strict";function a(a){return function(){var b=Date.now(),c=new Date(b),d=new Date(b-60*a.lookback*1e3),e=jQuery.extend({},f,{vAxis:{minValue:0,maxValue:100},hAxis:{viewWindow:{min:d,max:c}}});return e}}function b(a,b){return _.map(a,function(a){return{timestamp:a.timestamp,value:a[b]}})}function c(a,b){return _.map(a,function(a){return{timestamp:a.timestamp,value:b(a)}})}function d(a){return{publisher:a.publisher.value,advertiser:a.advertiser.value,adunit:a.adunit.value,lookback:a.lookback,includeLastMinute:a.includeLastMinute}}function e(a,b,c){this.rest=a,this.scope=b,this.max=b.lookback,this.dataCache=null,this.callback=c,this.cancelled=!1,this.interval=null,this.timeout=null,this.params=d(this.scope)}var f={legend:"none",chartArea:{top:20,height:240}};e.prototype={cancel:function(){this.cancelled=!0,this.scope.requestProgress=0,clearInterval(this.interval),clearTimeout(this.timeout)},responseStatus:function(){this.scope.requestProgress=Math.round((Date.now()-this.requestStartTime)/1e3),this.scope.$apply()},fetchDimensionsData:function(){this.dataCache&&this.dataCache.length&&(this.params.lastTimestamp=_.last(this.dataCache).timestamp);var a=this.max;this.requestStartTime=Date.now(),this.interval=setInterval(this.responseStatus.bind(this),250);var b=this;this.rest.getDimensionsData(this.params).then(function(c){if(!b.cancelled){b.scope.response=c;var d=c.minutes;b.scope.requestProgress=0,clearInterval(b.interval);var e=Date.now();if(b.scope.lastResponse=new Date(e),b.scope.responseTime=e-b.requestStartTime,b.dataCache){if(d.length>0){b.scope.minutesCached=b.dataCache.length,b.scope.minutesReceived=d.length,b.dataCache.pop();var f=b.dataCache.length+d.length;f>a&&b.dataCache.splice(0,f-a),b.dataCache.push.apply(b.dataCache,d)}}else b.dataCache=d,b.scope.minutesCached=0,b.scope.minutesReceived=d.length;b.callback(b.dataCache);var g=1e3*b.scope.pollInterval-(Date.now()-b.requestStartTime);g=Math.max(0,g),b.timeout=setTimeout(b.fetchDimensionsData.bind(b),g)}},function(){b.cancel()})}},angular.module("dimensions").controller("DimensionsController",["$scope","$timeout","$location","$routeParams","rest",function(g,h,i,j,k){function l(a,b){var c=g.range(a),d=_.map(c,function(a){return{value:String(a),label:b+" "+a}});d.splice(0,0,{value:"",label:"ALL "}),g.select[a]=d;var e=null;p[a]&&(e=_.findWhere(d,{value:p[a]})),g[a]=e?e:d[0]}function m(a){g.costChart={data:b(a,"cost"),options:f,emptyChartOptions:q},g.revenueChart={data:b(a,"revenue"),options:f,emptyChartOptions:q},g.impressionsChart={data:b(a,"impressions"),options:f,emptyChartOptions:q},g.clicksChart={data:b(a,"clicks"),options:f,emptyChartOptions:q},g.ctrChart={data:c(a,function(a){return a.clicks/a.impressions*100}),options:f,emptyChartOptions:q},g.marginChart={data:c(a,function(a){return(a.cost-a.revenue)/a.revenue}),options:f,emptyChartOptions:q}}function n(){r&&r.cancel(),r=new e(k,g,m),r.fetchDimensionsData()}function o(a,b){var c,d=!0;g.$watch(a,function(){d?d=!1:(clearTimeout(c),c=setTimeout(n,b))})}var p=new URI(window.location.href).query(!0),q=a(g);k.getApp(settings.dimensions.appName).then(function(a){g.app=a,g.appURL=settings.appsURL+a.id}),g.pollInterval=settings.dimensions.pollInterval,g.includeLastMinute=!1,g.range=function(a){var b=settings.dimensions.range[a];return _.range(b.start,b.stop+1)},g.select={},l("publisher","Publisher"),l("advertiser","Advertiser"),l("adunit","Ad Unit"),g.lookback=p.lookback?parseInt(p.lookback,10):settings.dimensions.lookback,g.reload=function(){window.location.href=window.location.pathname+"?"+jQuery.param(d(g))},g.costChart={emptyChartOptions:q},g.revenueChart={emptyChartOptions:q},g.impressionsChart={emptyChartOptions:q},g.clicksChart={emptyChartOptions:q},g.ctrChart={emptyChartOptions:q},g.marginChart={emptyChartOptions:q};var r=null;g.$watch("[publisher, advertiser, adunit]",function(){n()},!0),o("lookback",500),o("pollInterval",500),o("includeLastMinute",0),g.$on("$destroy",function(){r&&r.cancel()}.bind(this))}])}(),function(){"use strict";angular.module("fraud").controller("FraudController",["$scope","rest","socket",function(a,b,c){function d(b){return a[b][Math.floor(Math.random()*a[b].length)]}function e(a){return Math.round(a)}function f(){var a=Math.floor(25*Math.random())+10;return a+"00 0000"}function g(){var a=Math.floor(4e5*Math.random())+1e7,b=a+"";return b.substring(0,4)+" "+b.substring(4)}function h(b){var c=a.alerts.push(b)-1,d=a.alertTypeTitles[b.alertType],e="";switch(b.alertType){case"smallThenLarge":e=['<article class="alert-msg low" style="display:none">',"<h1>"+d+"</h1>","<p>"+b.message+"</p>",'<div><a href="#" class="btn view-txn-btn" data-txidx="'+c+'">view details</a></div>',"</article>"].join("");break;case"sameBankId":console.log("same bank",b),e=['<article class="alert-msg high" style="display:none">',"<h1>"+d+"</h1>","<p>"+b.message+"</p>",'<div><a href="#" class="btn view-txn-btn" data-txidx="'+c+'">view details</a></div>',"</article>"].join("");break;default:e=['<article class="alert-msg medium" style="display:none">',"<h1>"+d+"</h1>","<p>"+b.message+"</p>",'<div><a href="#" class="btn view-txn-btn" data-txidx="'+c+'">view details</a></div>',"</article>"].join("")}var f=$(e);$("#alertDisplayBox").prepend(f),f.slideDown().animate({opacity:.5},180).animate({opacity:1},180).animate({opacity:.5},180).animate({opacity:1},180)}function i(a,b){c.publish(n,a),console.log("txn",a),b||$.pnotify({title:"Transaction Submitted",text:"<strong>card</strong>: "+a.bankIdNum+" "+a.ccNum+"<br/> <strong>amount</strong>: $"+k(a.amount)+"<br/> <strong>merchant</strong>: "+a.merchantId+", <strong>terminal</strong>: "+a.terminalId,type:"success"})}function j(a){var b="";switch(a.alertType){case"smallThenLarge":var c=a.alertData;b=["<strong>Card Number:</strong> "+c.fullCcNum+"<br/>","<strong>Zip Code:</strong> "+c.zipCode+"<br/>","<strong>Merchant:</strong> "+c.merchantId+" ("+c.merchantType.toLowerCase().replace("_"," ")+")<br/>","<strong>Small Amount:</strong> $"+k(c.small)+"<br/>","<strong>Large Amount:</strong> $"+k(c.large)+"<br/>","<strong>Threshold:</strong> $"+k(c.threshold)+"<br/>","<strong>Time:</strong> "+new Date(1*c.time).toLocaleString()+"<br/>"].join("");break;case"sameBankId":var c=a.alertData;b=["<strong>Transaction Count:</strong> "+c.count+"<br/>","<strong>Bank ID Number:</strong> "+c.bankIdNum+"<br/>","<strong>Zip Code:</strong> "+c.zipCode+"<br/>","<strong>Merchant:</strong> "+c.merchantId+" ("+c.merchantType.toLowerCase().replace("_"," ")+")<br/>","<strong>Terminal:</strong> "+c.terminalId+"<br/>","<strong>Time:</strong> "+new Date(1*c.time).toLocaleString()+"<br/>"].join("");break;case"aboveAvg":var c=a.alertData;b=["<strong>Dollar Amount:</strong> $"+k(c.amount)+"<br/>","<strong>Last Average:</strong> $"+k(c.lastSmaValue)+"<br/>","<strong>Difference:</strong> $"+k(c.change)+"<br/>","<strong>Zip Code:</strong> "+c.zipCode+"<br/>","<strong>Merchant:</strong> "+c.merchantId+" ("+c.merchantType.toLowerCase().replace("_"," ")+")<br/>","<strong>Terminal:</strong> "+c.terminalId+"<br/>","<strong>Time:</strong> "+new Date(1*c.time).toLocaleString()+"<br/>"].join("")}return b}function k(a){return a=(1*a).toFixed(2),l(a)}function l(a){var b=a.toString().split(".");return b[0]=b[0].replace(/\B(?=(\d{3})+(?!\d))/g,","),b.join(".")}function m(){p||(a.startedTime?$.get("/fraud/alertCount?since="+a.startedTime).done(function(b){var c=_.find(a.stats,function(a){return"numFrauds"==a.id}),d=_.reduce(b,function(a,b){return a+b},0);c.value=l(d),setTimeout(m,2e3)}):setTimeout(m,2e3))}var n="demos.app.frauddetect.submitTransaction",o=b.getApp(settings.fraud.appName);o.then(function(b){a.app=b,a.appURL=settings.appsURL+b.id,a.startedTime=b.startedTime}),a.alertTypeTitles={smallThenLarge:"Suspicious Transaction Sequence",sameCard:"Same Card Multiple Times",sameBankId:"Same Bank Number Multiple Times",aboveAvg:"Above Average Transaction"},a.stats=[{id:"totalTxns",topic:"demos.app.frauddetect.totalTransactions",value:0,label:"Total Txns"},{id:"amtInLastSecond",topic:"demos.app.frauddetect.txLastSecond",value:0,label:"Total Dollars / sec"},{id:"avgAmtInLastSecond",topic:"demos.app.frauddetect.avgLastSecond",value:0,label:"Avg Txn Amount / sec"},{id:"numFrauds",topic:"demos.app.frauddetect.totalFrauds",value:0,label:"No. of Anomalies Detected"}],a.merchants=["Wal-Mart","Target","Amazon","Apple","Sears","Macys","JCPenny","Levis"],a.terminals=[1,2,3,4,5,6,7,8],a.zips=[94086,94087,94088,94089,94090,94091,94092,94093],a.actions=[{id:1,subtitle:a.alertTypeTitles.smallThenLarge,severity:"low",description:"This anomaly is when one credit card is used for a small purchase, then immediately again for a larger purchase. The idea here is that a scammer will first try a small purchase to ensure that the card works, then proceed with a larger purchase upon success.",generateTxns:function(){var a=f(),b=g();i({zipCode:d("zips"),merchantId:d("merchants"),terminalId:d("terminals"),bankIdNum:a,ccNum:b,amount:5}),setTimeout(function(){i({zipCode:d("zips"),merchantId:d("merchants"),terminalId:d("terminals"),bankIdNum:a,ccNum:b,amount:600})},5e3)}},{id:2,subtitle:a.alertTypeTitles.sameBankId,severity:"high",description:"This anomaly is detected when several transactions are made by cards issued by the same bank at the same terminal ID over moving window of 30 sec.",generateTxns:function(){var a=f().replace(/\d{4}$/,"1111"),b=d("zips"),c=d("terminals"),h=d("merchants"),j=setInterval(function(){i({zipCode:b,merchantId:h,terminalId:c,bankIdNum:a,ccNum:g(),amount:e(100+10*Math.random())},!0)},200);$.pnotify({title:"Several Transactions Being Sent",text:"<strong>Bank ID:</strong> "+a+", <strong>Merchant:</strong> "+h,type:"success"}),setTimeout(function(){clearInterval(j)},11e3)}},{id:3,subtitle:a.alertTypeTitles.aboveAvg,severity:"medium",description:"This anomaly is when a transaction at a given merchant significantly exceeds that merchant's average transaction amount.",generateTxns:function(){console.log("getting randomStats"),$.pnotify({type:"info",title:"Retrieving Average Information"}),$.get("/fraud/randomStats").done(function(a){var b=(f(),a.merchantId),c=a.terminalId,d=a.zipCode,h=e(a.sma+1500);setTimeout(function(){i({zipCode:d,merchantId:b,terminalId:c,bankIdNum:f(),ccNum:g(),amount:h})},1e3)})}}],o.then(function(){c.subscribe("demos.app.frauddetect.fraudAlert",function(a){"aboveAvg"===a.data.alertType&&console.log("aboveAvg",a.data),("true"===a.data.userGenerated||a.data.userGenerated===!0)&&h(a.data)},a),c.subscribe("demos.app.frauddetect.txSummary",function(b){var c=b.data;_.each(["amtInLastSecond","avgAmtInLastSecond","totalTxns","txnsInLastSecond"],function(b){var d=_.find(a.stats,function(a){return a.id==b});d&&(d.value=["amtInLastSecond","avgAmtInLastSecond"].indexOf(b)>-1?"$"+k(c[b]):l(c[b]))}),a.$apply()},a)}),a.stats.forEach(function(b){c.subscribe(b.topic,function(c){console.log("stat topic "+b.topic+" data received: ",c),b.value=c.value,a.$apply()},a)}),a.alerts=[];var p=!1;$("#alertDisplayBox").on("click",".view-txn-btn",function(b){b.preventDefault();var c=$(this).attr("data-txidx"),d=a.alerts[c];$("#txn-modal .modal-body").html(j(d)),$("#txn-modal").modal()}),m(),a.clearFrauds=function(){$("#alertDisplayBox").html("")},a.$on("$destroy",function(){p=!0}.bind(this))}])}();
\ No newline at end of file
diff --git a/web/demos/package/app/scripts/6277abef.scripts.js b/web/demos/package/app/scripts/6277abef.scripts.js
deleted file mode 100644
index 2a71ca1..0000000
--- a/web/demos/package/app/scripts/6277abef.scripts.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(){"use strict";angular.module("widgets",["socket"]),angular.module("twitter",["rest","socket","widgets","ngGrid"]),angular.module("mobile",["rest","widgets","ngGrid","google-maps"]),angular.module("machine",["ng","rest","widgets"]),angular.module("dimensions",["ng","rest","widgets"]),angular.module("fraud",["rest","widgets"]),angular.module("app",["ngRoute","socket","twitter","mobile","machine","dimensions","fraud"]),angular.module("app").config(["$routeProvider","socketProvider",function(a,b){window.settings&&b.setWebSocketURL(settings.webSocketURL),a.when("/",{templateUrl:"views/welcome.html"}).when("/twitter",{templateUrl:"views/twitter.html",controller:"TwitterController"}).when("/mobile",{templateUrl:"views/mobile.html",controller:"MobileController"}).when("/machine",{templateUrl:"views/machine.html",controller:"MachineController"}).when("/dimensions",{templateUrl:"views/dimensions.html",controller:"DimensionsController"}).when("/fraud",{templateUrl:"views/fraud.html",controller:"FraudController"})}])}(),function(){"use strict";angular.module("rest",["ng","restangular"]).factory("rest",["$q","Restangular",function(a,b){return{getApp:function(c){var d=a.defer();return b.oneUrl("applications","ws/v1/applications").get().then(function(a){var b=null;if(a&&a.apps&&a.apps.length>0){var e=_.where(a.apps,{name:c,state:"RUNNING"});if(e.length>0){e=_.sortBy(e,function(a){return parseInt(a.elapsedTime,10)});var f=e[0];d.resolve(f)}else b=c+" is not found. Please make sure application is running."}else b="No applications available.";b&&(d.reject(b),jQuery.pnotify({title:"Error",text:b,type:"error",icon:!1,hide:!1}))}),d.promise},getMachineData:function(a){var c=b.one("machine").get(a);return c.then(null,function(a){jQuery.pnotify({title:"Error",text:"Error getting data from server. Status Code: "+a.status,type:"error",icon:!1,hide:!1})}),c},getDimensionsData:function(a){var c=b.one("dimensions").get(a);return c.then(null,function(a){jQuery.pnotify({title:"Error",text:"Error getting data from server. Status Code: "+a.status,type:"error",icon:!1,hide:!1})}),c}}}]).run(function(){})}(),function(){"use strict";angular.module("socket",[]).factory("visibly",["$window",function(a){return a.visibly}]).provider("socket",function(){var a,b;return{$get:["$q","$rootScope","$timeout","visibly",function(c,d,e,f){if(!a&&!b)throw"WebSocket URL is not defined";var g=b?b:new WebSocket(a),h=c.defer();g.onopen=function(){h.resolve(),d.$apply(),jQuery.pnotify({title:"WebSocket",text:"WebSocket connection established.",type:"success",delay:2e3,icon:!1,history:!1})};var i=!1;g.onclose=function(){i||jQuery.pnotify({title:"WebSocket Closed",text:"WebSocket connection has been closed. Try refreshing the page.",type:"error",icon:!1,hide:!1,history:!1})},g.onerror=function(){i=!0,jQuery.pnotify({title:"WebSocket Error",text:"WebSocket error. Try refreshing the page.",type:"error",icon:!1,hide:!1,history:!1})};var j={},k=!1;g.onmessage=function(a){if(!k){var b=JSON.parse(a.data),c=b.topic;j.hasOwnProperty(c)&&j[c].fire(b)}};var l;return f.onHidden(function(){l=e(function(){k=!0,l=null},6e4)}),f.onVisible(function(){k=!1,l&&e.cancel(l)}),{send:function(a){var b=JSON.stringify(a);h.promise.then(function(){console.log("send "+b),g.send(b)})},publish:function(a,b){var c={type:"publish",topic:a,data:b};this.send(c)},subscribe:function(a,b,c){var d=j[a];if(!d){var e={type:"subscribe",topic:a};this.send(e),d=jQuery.Callbacks(),j[a]=d}d.add(b),c&&c.$on("$destroy",function(){this.unsubscribe(a,b)}.bind(this))},unsubscribe:function(a,b){if(j.hasOwnProperty(a)){var c=j[a];c.remove(b)}}}}],setWebSocketURL:function(b){a=b},setWebSocketObject:function(a){b=a}}})}(),function(){"use strict";angular.module("widgets").directive("lineChart",function(){return{template:"<div></div>",scope:{chart:"="},restrict:"E",replace:!0,link:function(a,b){function c(a){var b=a.data;b||(b=[]);var c=new google.visualization.DataTable;c.addColumn("datetime"),c.addColumn("number"),c.addRows(b.length);for(var e=new google.visualization.DataView(c),f=0;f<b.length;f++){var g=b[f];c.setCell(f,0,new Date(g.timestamp));var h=parseFloat(g.value);c.setCell(f,1,h)}var i;i=0===b.length&&a.emptyChartOptions?a.emptyChartOptions():a.options,d.draw(e,i)}var d=new google.visualization.LineChart(b[0]);a.$watch("chart",function(a){a&&c(a)})}}})}(),function(){"use strict";angular.module("widgets").directive("gauge",function(){return{restrict:"A",replace:!0,scope:{label:"@",min:"=",max:"=",value:"="},link:function(a,b,c){var d={size:280,label:c.label,min:void 0!==a.min?a.min:0,max:void 0!==a.max?a.max:100,minorTicks:5},e=d.max-d.min;d.yellowZones=[{from:d.min+.75*e,to:d.min+.9*e}],d.redZones=[{from:d.min+.9*e,to:d.max}],a.gauge=new Gauge(b[0],d),a.gauge.render(),a.gauge.redraw(a.value),a.$watch("value",function(){a.gauge&&a.gauge.redraw(a.value)})}}})}(),function(){"use strict";angular.module("widgets").directive("widgetsBarChart",function(){return{restrict:"A",scope:{data:"=",label:"@",onClick:"&"},link:function(a,b){var c=d3.select(b[0]).append("svg").attr("width","100%");window.onresize=function(){return a.$apply()},a.$watch(function(){return angular.element(window)[0].innerWidth},function(){return a.render(a.data)}),a.$watch("data",function(b){return a.render(b)},!0),a.render=function(d){c.selectAll("*").remove();var e,f,g;e=d3.select(b[0])[0][0].offsetWidth-20,f=35*a.data.length,g=98,c.attr("height",f),c.selectAll("rect").data(d).enter().append("rect").on("click",function(b){return a.onClick({item:b})}).attr("height",30).attr("width",0).attr("x",10).attr("y",function(a,b){return 35*b}).attr("width",function(a){var b=a.score/(g/e);return b>10?b:10}),c.selectAll("text").data(d).enter().append("text").attr("fill","#fff").attr("y",function(a,b){return 35*b+22}).attr("x",15).text(function(b){return b[a.label]})}}}})}(),function(){"use strict";angular.module("widgets").directive("widgetsStat",["$timeout","socket",function(a,b){return{restrict:"A",templateUrl:"views/stat.html",scope:{app:"=",label:"@",onClick:"&"},link:function(c){function d(){c.elapsed=e+(Date.now()-f),a(d,1e3)}c.totalEmitted=0,c.totalProcessed=0,c.elapsed=0;var e,f;c.$watch("app",function(a){if(a){e=parseInt(a.elapsedTime),f=Date.now(),d();var g="applications."+a.id;b.subscribe(g,function(a){var b=a.data;c.totalEmitted=b.tuplesEmittedPSMA,c.totalProcessed=b.totalTuplesProcessed,c.$apply()},c)}})}}}])}(),function(){"use strict";angular.module("widgets").filter("elapsed",function(){return function(a){var b={timeChunk:1*a,unixUptime:!0};_.defaults(b,{compareDate:+new Date,timeChunk:void 0,maxUnit:"year",unixUptime:!1,max_levels:3,timeStamp:a||0});var c=void 0!==b.timeChunk?b.timeChunk:b.compareDate-b.timeStamp,d="",e=", ",f=0,g=b.max_levels,h=1e3,i=60*h,j=60*i,k=24*j,l=7*k,m=4*l,n=365*k;if(b.unixUptime){var o=Math.floor(c/k);c-=o*k;var p=Math.floor(c/j);c-=p*j;var q=Math.round(c/i);if(0===o){q=Math.floor(c/i),c-=q*i;var r=Math.round(c/1e3);d=(10>p?"0":"")+p+":"+(10>q?"0":"")+q+":"+(10>r?"0":"")+r}else d=o+" days, "+p.toString()+":"+(10>q?"0":"")+q.toString()}else{for(var s=[{plural:"years",singular:"year",ms:n},{plural:"months",singular:"month",ms:m},{plural:"weeks",singular:"week",ms:l},{plural:"days",singular:"day",ms:k},{plural:"hours",singular:"hour",ms:j},{plural:"minutes",singular:"minute",ms:i},{plural:"seconds",singular:"second",ms:h}],t=!1,u=0;u<s.length;u++)if(b.maxUnit===s[u].singular&&(t=!0),!(c<s[u].ms)&&t){f++;var v=Math.floor(c/s[u].ms),w=1===v?s[u].singular:s[u].plural;if(d+=v+" "+w+e,c%=s[u].ms,f>=g)break}d=d.substring(0,d.length-e.length)}return d}})}(),function(){"use strict";angular.module("twitter").controller("TwitterController",["$scope","rest",function(a,b){b.getApp(settings.twitter.appName).then(function(b){a.app=b,a.appURL=settings.appsURL+b.id})}]).controller("TwitterGridControlller",["$scope","socket",function(a,b){b.subscribe(settings.twitter.topic,function(b){var c=[];jQuery.each(b.data,function(a,b){c.push({name:a,value:parseInt(b,10)})}),c=_.sortBy(c,function(a){return-a.value}),a.myData=c,a.$apply()},a),a.gridOptions={data:"myData",enableColumnResize:!0,columnDefs:[{field:"name",displayName:"URL",width:"75%",sortable:!1},{field:"value",displayName:"Count",width:"25%",sortable:!1}]}}]).controller("TwitterBarChartController",["$scope","socket",function(a,b){b.subscribe(settings.twitter.topic,function(b){var c=[];jQuery.each(b.data,function(a,b){c.push({name:a,value:parseInt(b,10)})}),c=_.sortBy(c,function(a){return-a.value});var d=c[0].value;_.each(c,function(a){a.name+=" - "+a.value,a.score=a.value/d*100}),a.twitterBarChartData=c,a.$apply()},a),a.twitterBarChartData=[]}])}(),function(){"use strict";function a(a){var b=a.location.match(/\((\d+),(\d+)/),c=parseInt(b[1],10),d=parseInt(b[2],10),e=parseInt(a.phone,10),f=37.40180101292334+.01*(e%4-2)-.005*c,g=-121.9966721534729+.01*(e%8-4)+.007*d;return{latitude:f,longitude:g,label:a.phone,phone:a.phone}}angular.module("mobile").controller("MobileController",["$scope","rest","socket",function(b,c,d){c.getApp(settings.mobile.appName).then(function(a){b.app=a,b.appURL=settings.appsURL+a.id});var e={};d.subscribe(settings.mobile.topic.out,function(c){var d=c.data;if(d.hasOwnProperty("removed"))delete e[d.phone];else{var f=a(d);e[d.phone]=f}b.$broadcast("datachanged",e)},b)}]).controller("MobileGridControlller",["$scope","$filter","$timeout","socket",function(a,b,c,d){a.$on("datachanged",function(b,c){a.gridData=_.values(c)}),a.phone="",a.addPhone=function(){var b={command:"add",phone:a.phone},c={type:"publish",topic:settings.mobile.topic.in,data:b};d.send(c),a.phone=""},a.removePhone=function(a){var b={command:"del",phone:a},c={type:"publish",topic:settings.mobile.topic.in,data:b};d.send(c)},a.gridOptions={data:"gridData",enableColumnResize:!0,enableRowSelection:!1,columnDefs:[{field:"phone",displayName:"Phone",width:"30%",sortable:!1},{field:"latitude",displayName:"Latitude",cellFilter:"number:3",width:"30%",sortable:!1},{field:"longitude",displayName:"Longitude",cellFilter:"number:3",width:"30%",sortable:!1},{field:"phone",displayName:"",cellTemplate:'<div class="ngCellText" ng-class="col.colIndex()" ng-click="removePhone(COL_FIELD)"><i class="icon-trash"></i></div>',cellClass:"mobile-grid-remove",width:"10%",sortable:!1}]}}]).controller("MapController",["$scope","socket",function(a){google.maps.visualRefresh=!0,a.$on("datachanged",function(b,c){a.markersProperty=_.values(c)}),angular.extend(a,{position:{coords:{latitude:37.36197126180853,longitude:-121.92674696445465}},zoomProperty:12})}])}(),function(){"use strict";function a(a){return function(){var b=Date.now(),c=new Date(b),d=new Date(b-60*a.lookback*1e3),f=jQuery.extend({},e,{vAxis:{minValue:0,maxValue:100},hAxis:{viewWindow:{min:d,max:c}}});return f}}function b(a,b){return _.map(a,function(a){return{timestamp:a.timestamp,value:a[b]}})}function c(a){return{customer:a.customer.value,product:a.product.value,os:a.os.value,software1:a.software1.value,software2:a.software2.value,deviceId:a.deviceId.value,lookback:a.lookback}}function d(a,b,d){this.rest=a,this.scope=b,this.max=b.lookback,this.dataCache=null,this.callback=d,this.cancelled=!1,this.interval=null,this.timeout=null,this.params=c(this.scope)}var e={legend:"none",vAxis:{format:settings.machine.metricformat},chartArea:{top:20,height:240}};d.prototype={cancel:function(){this.cancelled=!0,this.scope.requestProgress=0,clearInterval(this.interval),clearTimeout(this.timeout)},responseStatus:function(){this.scope.requestProgress=Math.round((Date.now()-this.requestStartTime)/1e3),this.scope.$apply()},fetchMachineData:function(){this.dataCache&&this.dataCache.length&&(this.params.lastTimestamp=_.last(this.dataCache).timestamp);var a=this.max;this.requestStartTime=Date.now(),this.interval=setInterval(this.responseStatus.bind(this),250);var b=this;this.rest.getMachineData(this.params).then(function(c){if(!b.cancelled){b.scope.response=c;var d=c.minutes;b.scope.requestProgress=0,clearInterval(b.interval);var e=Date.now();if(b.scope.lastResponse=new Date(e),b.scope.responseTime=e-b.requestStartTime,b.dataCache){if(d.length>0){b.scope.minutesCached=b.dataCache.length,b.scope.minutesReceived=d.length,b.dataCache.pop();var f=b.dataCache.length+d.length;f>a&&b.dataCache.splice(0,f-a),b.dataCache.push.apply(b.dataCache,d)}}else b.dataCache=d,b.scope.minutesCached=0,b.scope.minutesReceived=d.length;b.callback(b.dataCache);var g=settings.machine.pollInterval-(Date.now()-b.requestStartTime);g=Math.max(0,g),b.timeout=setTimeout(b.fetchMachineData.bind(b),g)}},function(){b.cancel()})}},angular.module("machine").controller("MachineController",["$scope","$timeout","$location","$routeParams","rest",function(f,g,h,i,j){function k(a,b){var c=f.range(a),d=_.map(c,function(a){return{value:String(a),label:b+" "+a}});d.splice(0,0,{value:"",label:"ALL "}),f.select[a]=d;var e=null;n[a]&&(e=_.findWhere(d,{value:n[a]})),f[a]=e?e:d[0]}function l(a){if(a&&a.length>0){var c=_.last(a);f.cpu=parseFloat(c.cpu),f.ram=parseFloat(c.ram),f.hdd=parseFloat(c.hdd)}f.cpuChart={data:b(a,"cpu"),options:e,emptyChartOptions:o},f.ramChart={data:b(a,"ram"),options:e,emptyChartOptions:o},f.hddChart={data:b(a,"hdd"),options:e,emptyChartOptions:o}}function m(){p&&p.cancel(),p=new d(j,f,l),p.fetchMachineData()}var n=new URI(window.location.href).query(!0),o=a(f);j.getApp(settings.machine.appName).then(function(a){f.app=a,f.appURL=settings.appsURL+a.id}),f.cpu=0,f.ram=0,f.hdd=0,f.range=function(a){var b=settings.machine.range[a];return _.range(b.start,b.stop+1)},f.select={},k("customer","Customer"),k("product","Product"),k("os","OS"),k("software1","Software1 Version"),k("software2","Software2 Version"),k("deviceId","Device ID"),f.lookback=n.lookback?parseInt(n.lookback,10):settings.machine.lookback,f.reload=function(){window.location.href=window.location.pathname+"?"+jQuery.param(c(f))},f.cpuChart={emptyChartOptions:o},f.ramChart={emptyChartOptions:o},f.hddChart={emptyChartOptions:o};var p=null;f.$watch("[customer, product, os, software1, software1, deviceId]",function(){m()},!0);var q,r=!0;f.$watch("lookback",function(){r?r=!1:(clearTimeout(q),q=setTimeout(m,500))}),f.$on("$destroy",function(){p&&p.cancel()}.bind(this))}])}(),function(){"use strict";function a(a){return function(){var b=Date.now(),c=new Date(b),d=new Date(b-60*a.lookback*1e3),e=jQuery.extend({},f,{vAxis:{minValue:0,maxValue:100},hAxis:{viewWindow:{min:d,max:c}}});return e}}function b(a,b){return _.map(a,function(a){return{timestamp:a.timestamp,value:a[b]}})}function c(a,b){return _.map(a,function(a){return{timestamp:a.timestamp,value:b(a)}})}function d(a){return{publisher:a.publisher.value,advertiser:a.advertiser.value,adunit:a.adunit.value,lookback:a.lookback,includeLastMinute:a.includeLastMinute}}function e(a,b,c){this.rest=a,this.scope=b,this.max=b.lookback,this.dataCache=null,this.callback=c,this.cancelled=!1,this.interval=null,this.timeout=null,this.params=d(this.scope)}var f={legend:"none",chartArea:{top:20,height:240}};e.prototype={cancel:function(){this.cancelled=!0,this.scope.requestProgress=0,clearInterval(this.interval),clearTimeout(this.timeout)},responseStatus:function(){this.scope.requestProgress=Math.round((Date.now()-this.requestStartTime)/1e3),this.scope.$apply()},fetchDimensionsData:function(){this.dataCache&&this.dataCache.length&&(this.params.lastTimestamp=_.last(this.dataCache).timestamp);var a=this.max;this.requestStartTime=Date.now(),this.interval=setInterval(this.responseStatus.bind(this),250);var b=this;this.rest.getDimensionsData(this.params).then(function(c){if(!b.cancelled){b.scope.response=c;var d=c.minutes;b.scope.requestProgress=0,clearInterval(b.interval);var e=Date.now();if(b.scope.lastResponse=new Date(e),b.scope.responseTime=e-b.requestStartTime,b.dataCache){if(d.length>0){b.scope.minutesCached=b.dataCache.length,b.scope.minutesReceived=d.length,b.dataCache.pop();var f=b.dataCache.length+d.length;f>a&&b.dataCache.splice(0,f-a),b.dataCache.push.apply(b.dataCache,d)}}else b.dataCache=d,b.scope.minutesCached=0,b.scope.minutesReceived=d.length;b.callback(b.dataCache);var g=1e3*b.scope.pollInterval-(Date.now()-b.requestStartTime);g=Math.max(0,g),b.timeout=setTimeout(b.fetchDimensionsData.bind(b),g)}},function(){b.cancel()})}},angular.module("dimensions").controller("DimensionsController",["$scope","$timeout","$location","$routeParams","rest",function(g,h,i,j,k){function l(a,b){var c=g.range(a),d=_.map(c,function(a){return{value:String(a),label:b+" "+a}});d.splice(0,0,{value:"",label:"ALL "}),g.select[a]=d;var e=null;p[a]&&(e=_.findWhere(d,{value:p[a]})),g[a]=e?e:d[0]}function m(a){g.costChart={data:b(a,"cost"),options:f,emptyChartOptions:q},g.revenueChart={data:b(a,"revenue"),options:f,emptyChartOptions:q},g.impressionsChart={data:b(a,"impressions"),options:f,emptyChartOptions:q},g.clicksChart={data:b(a,"clicks"),options:f,emptyChartOptions:q},g.ctrChart={data:c(a,function(a){return a.clicks/a.impressions*100}),options:f,emptyChartOptions:q},g.marginChart={data:c(a,function(a){return(a.cost-a.revenue)/a.revenue}),options:f,emptyChartOptions:q}}function n(){r&&r.cancel(),r=new e(k,g,m),r.fetchDimensionsData()}function o(a,b){var c,d=!0;g.$watch(a,function(){d?d=!1:(clearTimeout(c),c=setTimeout(n,b))})}var p=new URI(window.location.href).query(!0),q=a(g);k.getApp(settings.dimensions.appName).then(function(a){g.app=a,g.appURL=settings.appsURL+a.id}),g.pollInterval=settings.dimensions.pollInterval,g.includeLastMinute=!1,g.range=function(a){var b=settings.dimensions.range[a];return _.range(b.start,b.stop+1)},g.select={},l("publisher","Publisher"),l("advertiser","Advertiser"),l("adunit","Ad Unit"),g.lookback=p.lookback?parseInt(p.lookback,10):settings.dimensions.lookback,g.reload=function(){window.location.href=window.location.pathname+"?"+jQuery.param(d(g))},g.costChart={emptyChartOptions:q},g.revenueChart={emptyChartOptions:q},g.impressionsChart={emptyChartOptions:q},g.clicksChart={emptyChartOptions:q},g.ctrChart={emptyChartOptions:q},g.marginChart={emptyChartOptions:q};var r=null;g.$watch("[publisher, advertiser, adunit]",function(){n()},!0),o("lookback",500),o("pollInterval",500),o("includeLastMinute",0),g.$on("$destroy",function(){r&&r.cancel()}.bind(this))}])}(),function(){"use strict";angular.module("fraud").controller("FraudController",["$scope","rest","socket",function(a,b,c){function d(b){return a[b][Math.floor(Math.random()*a[b].length)]}function e(a){return Math.round(a)}function f(){var a=Math.floor(25*Math.random())+10;return a+"00 0000"}function g(){var a=Math.floor(4e5*Math.random())+1e7,b=a+"";return b.substring(0,4)+" "+b.substring(4)}function h(b){var c=a.alerts.push(b)-1,d=a.alertTypeTitles[b.alertType],e="";switch(b.alertType){case"smallThenLarge":e=['<article class="alert-msg low" style="display:none">',"<h1>"+d+"</h1>","<p>"+b.message+"</p>",'<div><a href="#" class="btn view-txn-btn" data-txidx="'+c+'">view details</a></div>',"</article>"].join("");break;case"sameBankId":console.log("same bank",b),e=['<article class="alert-msg high" style="display:none">',"<h1>"+d+"</h1>","<p>"+b.message+"</p>",'<div><a href="#" class="btn view-txn-btn" data-txidx="'+c+'">view details</a></div>',"</article>"].join("");break;default:e=['<article class="alert-msg medium" style="display:none">',"<h1>"+d+"</h1>","<p>"+b.message+"</p>",'<div><a href="#" class="btn view-txn-btn" data-txidx="'+c+'">view details</a></div>',"</article>"].join("")}var f=$(e);$("#alertDisplayBox").prepend(f),f.slideDown().animate({opacity:.5},180).animate({opacity:1},180).animate({opacity:.5},180).animate({opacity:1},180)}function i(a,b){c.publish(n,a),console.log("txn",a),b||$.pnotify({title:"Transaction Submitted",text:"<strong>card</strong>: "+a.bankIdNum+" "+a.ccNum+"<br/> <strong>amount</strong>: $"+k(a.amount)+"<br/> <strong>merchant</strong>: "+a.merchantId+", <strong>terminal</strong>: "+a.terminalId,type:"success"})}function j(a){var b="";switch(a.alertType){case"smallThenLarge":var c=a.alertData;b=["<strong>Card Number:</strong> "+c.fullCcNum+"<br/>","<strong>Zip Code:</strong> "+c.zipCode+"<br/>","<strong>Merchant:</strong> "+c.merchantId+" ("+c.merchantType.toLowerCase().replace("_"," ")+")<br/>","<strong>Small Amount:</strong> $"+k(c.small)+"<br/>","<strong>Large Amount:</strong> $"+k(c.large)+"<br/>","<strong>Threshold:</strong> $"+k(c.threshold)+"<br/>","<strong>Time:</strong> "+new Date(1*c.time).toLocaleString()+"<br/>"].join("");break;case"sameBankId":var c=a.alertData;b=["<strong>Transaction Count:</strong> "+c.count+"<br/>","<strong>Bank ID Number:</strong> "+c.bankIdNum+"<br/>","<strong>Zip Code:</strong> "+c.zipCode+"<br/>","<strong>Merchant:</strong> "+c.merchantId+" ("+c.merchantType.toLowerCase().replace("_"," ")+")<br/>","<strong>Terminal:</strong> "+c.terminalId+"<br/>","<strong>Time:</strong> "+new Date(1*c.time).toLocaleString()+"<br/>"].join("");break;case"aboveAvg":var c=a.alertData;b=["<strong>Dollar Amount:</strong> $"+k(c.amount)+"<br/>","<strong>Last Average:</strong> $"+k(c.lastSmaValue)+"<br/>","<strong>Difference:</strong> $"+k(c.change)+"<br/>","<strong>Zip Code:</strong> "+c.zipCode+"<br/>","<strong>Merchant:</strong> "+c.merchantId+" ("+c.merchantType.toLowerCase().replace("_"," ")+")<br/>","<strong>Terminal:</strong> "+c.terminalId+"<br/>","<strong>Time:</strong> "+new Date(1*c.time).toLocaleString()+"<br/>"].join("")}return b}function k(a){return a=(1*a).toFixed(2),l(a)}function l(a){var b=a.toString().split(".");return b[0]=b[0].replace(/\B(?=(\d{3})+(?!\d))/g,","),b.join(".")}function m(){p||(a.startedTime?$.get("/fraud/alertCount?since="+a.startedTime).done(function(b){var c=_.find(a.stats,function(a){return"numFrauds"==a.id}),d=_.reduce(b,function(a,b){return a+b},0);c.value=l(d),setTimeout(m,2e3)}):setTimeout(m,2e3))}var n="demos.app.frauddetect.submitTransaction",o=b.getApp(settings.fraud.appName);o.then(function(b){a.app=b,a.appURL=settings.appsURL+b.id,a.startedTime=b.startedTime}),a.alertTypeTitles={smallThenLarge:"Suspicious Transaction Sequence",sameCard:"Same Card Multiple Times",sameBankId:"Same Bank Number Multiple Times",aboveAvg:"Above Average Transaction"},a.stats=[{id:"totalTxns",topic:"demos.app.frauddetect.totalTransactions",value:0,label:"Total Txns"},{id:"amtInLastSecond",topic:"demos.app.frauddetect.txLastSecond",value:0,label:"Total Dollars / sec"},{id:"avgAmtInLastSecond",topic:"demos.app.frauddetect.avgLastSecond",value:0,label:"Avg Txn Amount / sec"},{id:"numFrauds",topic:"demos.app.frauddetect.totalFrauds",value:0,label:"No. of Anomalies Detected"}],a.merchants=["Wal-Mart","Target","Amazon","Apple","Sears","Macys","JCPenny","Levis"],a.terminals=[1,2,3,4,5,6,7,8],a.zips=[94086,94087,94088,94089,94090,94091,94092,94093],a.actions=[{id:1,subtitle:a.alertTypeTitles.smallThenLarge,severity:"low",description:"This anomaly is when one credit card is used for a small purchase, then immediately again for a larger purchase. The idea here is that a scammer will first try a small purchase to ensure that the card works, then proceed with a larger purchase upon success.",generateTxns:function(){var a=f(),b=g();i({zipCode:d("zips"),merchantId:d("merchants"),terminalId:d("terminals"),bankIdNum:a,ccNum:b,amount:5}),setTimeout(function(){i({zipCode:d("zips"),merchantId:d("merchants"),terminalId:d("terminals"),bankIdNum:a,ccNum:b,amount:600})},5e3)}},{id:2,subtitle:a.alertTypeTitles.sameBankId,severity:"high",description:"This anomaly is detected when several transactions are made by cards issued by the same bank at the same terminal ID over moving window of 30 sec.",generateTxns:function(){var a=f().replace(/\d{4}$/,"1111"),b=d("zips"),c=d("terminals"),h=d("merchants"),j=setInterval(function(){i({zipCode:b,merchantId:h,terminalId:c,bankIdNum:a,ccNum:g(),amount:e(100+10*Math.random())},!0)},200);$.pnotify({title:"Several Transactions Being Sent",text:"<strong>Bank ID:</strong> "+a+", <strong>Merchant:</strong> "+h,type:"success"}),setTimeout(function(){clearInterval(j)},11e3)}},{id:3,subtitle:a.alertTypeTitles.aboveAvg,severity:"medium",description:"This anomaly is when a transaction at a given merchant significantly exceeds that merchant's average transaction amount.",generateTxns:function(){console.log("getting randomStats"),$.pnotify({type:"info",title:"Retrieving Average Information"}),$.get("/fraud/randomStats").done(function(a){var b=(f(),a.merchantId),c=a.terminalId,d=a.zipCode,h=e(a.sma+1500);setTimeout(function(){i({zipCode:d,merchantId:b,terminalId:c,bankIdNum:f(),ccNum:g(),amount:h})},1e3)})}}],o.then(function(){c.subscribe("demos.app.frauddetect.fraudAlert",function(a){"aboveAvg"===a.data.alertType&&console.log("aboveAvg",a.data),("true"===a.data.userGenerated||a.data.userGenerated===!0)&&h(a.data)},a),c.subscribe("demos.app.frauddetect.txSummary",function(b){var c=b.data;_.each(["amtInLastSecond","avgAmtInLastSecond","totalTxns","txnsInLastSecond"],function(b){var d=_.find(a.stats,function(a){return a.id==b});d&&(d.value=["amtInLastSecond","avgAmtInLastSecond"].indexOf(b)>-1?"$"+k(c[b]):l(c[b]))}),a.$apply()},a)}),a.stats.forEach(function(b){c.subscribe(b.topic,function(c){console.log("stat topic "+b.topic+" data received: ",c),b.value=c.value,a.$apply()},a)}),a.alerts=[];var p=!1;$("#alertDisplayBox").on("click",".view-txn-btn",function(b){b.preventDefault();var c=$(this).attr("data-txidx"),d=a.alerts[c];$("#txn-modal .modal-body").html(j(d)),$("#txn-modal").modal()}),m(),a.clearFrauds=function(){$("#alertDisplayBox").html("")},a.$on("$destroy",function(){p=!0}.bind(this))}])}();
\ No newline at end of file
diff --git a/web/demos/package/app/scripts/9f21e177.modules.js b/web/demos/package/app/scripts/9f21e177.modules.js
new file mode 100644
index 0000000..71f121e
--- /dev/null
+++ b/web/demos/package/app/scripts/9f21e177.modules.js
@@ -0,0 +1,11 @@
+function Gauge(a,b){this.element=a;var c=this;this.configure=function(a){this.config=a,this.config.size=.9*this.config.size,this.config.raduis=.97*this.config.size/2,this.config.cx=this.config.size/2,this.config.cy=this.config.size/2,this.config.min=void 0!=a.min?a.min:0,this.config.max=void 0!=a.max?a.max:100,this.config.range=this.config.max-this.config.min,this.config.majorTicks=a.majorTicks||5,this.config.minorTicks=a.minorTicks||2,this.config.greenColor=a.greenColor||"#109618",this.config.yellowColor=a.yellowColor||"#FF9900",this.config.redColor=a.redColor||"#DC3912",this.config.transitionDuration=a.transitionDuration||500},this.render=function(){this.body=d3.select(this.element).append("svg:svg").attr("class","gauge").attr("width",this.config.size).attr("height",this.config.size),this.body.append("svg:circle").attr("cx",this.config.cx).attr("cy",this.config.cy).attr("r",this.config.raduis).style("fill","#ccc").style("stroke","#000").style("stroke-width","0.5px"),this.body.append("svg:circle").attr("cx",this.config.cx).attr("cy",this.config.cy).attr("r",.9*this.config.raduis).style("fill","#fff").style("stroke","#e0e0e0").style("stroke-width","2px");for(var a in this.config.greenZones)this.drawBand(this.config.greenZones[a].from,this.config.greenZones[a].to,c.config.greenColor);for(var a in this.config.yellowZones)this.drawBand(this.config.yellowZones[a].from,this.config.yellowZones[a].to,c.config.yellowColor);for(var a in this.config.redZones)this.drawBand(this.config.redZones[a].from,this.config.redZones[a].to,c.config.redColor);if(void 0!=this.config.label){var b=Math.round(this.config.size/9);this.body.append("svg:text").attr("x",this.config.cx).attr("y",this.config.cy/2+b/2).attr("dy",b/2).attr("text-anchor","middle").text(this.config.label).style("font-size",b+"px").style("fill","#333").style("stroke-width","0px")}for(var b=Math.round(this.config.size/16),d=this.config.range/(this.config.majorTicks-1),e=this.config.min;e<=this.config.max;e+=d){for(var f=d/this.config.minorTicks,g=e+f;g<Math.min(e+d,this.config.max);g+=f){var h=this.valueToPoint(g,.75),i=this.valueToPoint(g,.85);this.body.append("svg:line").attr("x1",h.x).attr("y1",h.y).attr("x2",i.x).attr("y2",i.y).style("stroke","#666").style("stroke-width","1px")}var h=this.valueToPoint(e,.7),i=this.valueToPoint(e,.85);if(this.body.append("svg:line").attr("x1",h.x).attr("y1",h.y).attr("x2",i.x).attr("y2",i.y).style("stroke","#333").style("stroke-width","2px"),e==this.config.min||e==this.config.max){var j=this.valueToPoint(e,.63);this.body.append("svg:text").attr("x",j.x).attr("y",j.y).attr("dy",b/3).attr("text-anchor",e==this.config.min?"start":"end").text(e).style("font-size",b+"px").style("fill","#333").style("stroke-width","0px")}}var k=this.body.append("svg:g").attr("class","pointerContainer"),l=(this.config.min+this.config.max)/2,m=this.buildPointerPath(l),n=d3.svg.line().x(function(a){return a.x}).y(function(a){return a.y}).interpolate("basis");k.selectAll("path").data([m]).enter().append("svg:path").attr("d",n).style("fill","#dc3912").style("stroke","#c63310").style("fill-opacity",.7),k.append("svg:circle").attr("cx",this.config.cx).attr("cy",this.config.cy).attr("r",.12*this.config.raduis).style("fill","#4684EE").style("stroke","#666").style("opacity",1);var b=Math.round(this.config.size/10);k.selectAll("text").data([l]).enter().append("svg:text").attr("x",this.config.cx).attr("y",this.config.size-this.config.cy/4-b).attr("dy",b/2).attr("text-anchor","middle").style("font-size",b+"px").style("fill","#000").style("stroke-width","0px"),this.redraw(this.config.min,0)},this.buildPointerPath=function(a){function b(a,b){var d=c.valueToPoint(a,b);return d.x-=c.config.cx,d.y-=c.config.cy,d}var d=this.config.range/13,e=b(a,.85),f=b(a-d,.12),g=b(a+d,.12),h=a-this.config.range*(1/.75)/2,i=b(h,.28),j=b(h-d,.12),k=b(h+d,.12);return[e,f,k,i,j,g,e]},this.drawBand=function(a,b,d){0>=b-a||this.body.append("svg:path").style("fill",d).attr("d",d3.svg.arc().startAngle(this.valueToRadians(a)).endAngle(this.valueToRadians(b)).innerRadius(.65*this.config.raduis).outerRadius(.85*this.config.raduis)).attr("transform",function(){return"translate("+c.config.cx+", "+c.config.cy+") rotate(270)"})},this.redraw=function(a,b){var d=this.body.select(".pointerContainer");d.selectAll("text").text(Math.round(a));var e=d.selectAll("path");e.transition().duration(void 0!=b?b:this.config.transitionDuration).attrTween("transform",function(){var b=a;a>c.config.max?b=c.config.max+.02*c.config.range:a<c.config.min&&(b=c.config.min-.02*c.config.range);var d=c.valueToDegrees(b)-90,e=c._currentRotation||d;return c._currentRotation=d,function(a){var b=e+(d-e)*a;return"translate("+c.config.cx+", "+c.config.cy+") rotate("+b+")"}})},this.valueToDegrees=function(a){return a/this.config.range*270-(this.config.min/this.config.range*270+45)},this.valueToRadians=function(a){return this.valueToDegrees(a)*Math.PI/180},this.valueToPoint=function(a,b){return{x:this.config.cx-this.config.raduis*b*Math.cos(this.valueToRadians(a)),y:this.config.cy-this.config.raduis*b*Math.sin(this.valueToRadians(a))}},this.configure(b)}(function(){var a=this,b=a._,c={},d=Array.prototype,e=Object.prototype,f=Function.prototype,g=d.push,h=d.slice,i=d.concat,j=e.toString,k=e.hasOwnProperty,l=d.forEach,m=d.map,n=d.reduce,o=d.reduceRight,p=d.filter,q=d.every,r=d.some,s=d.indexOf,t=d.lastIndexOf,u=Array.isArray,v=Object.keys,w=f.bind,x=function(a){return a instanceof x?a:this instanceof x?void(this._wrapped=a):new x(a)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=x),exports._=x):a._=x,x.VERSION="1.5.2";var y=x.each=x.forEach=function(a,b,d){if(null!=a)if(l&&a.forEach===l)a.forEach(b,d);else if(a.length===+a.length){for(var e=0,f=a.length;f>e;e++)if(b.call(d,a[e],e,a)===c)return}else for(var g=x.keys(a),e=0,f=g.length;f>e;e++)if(b.call(d,a[g[e]],g[e],a)===c)return};x.map=x.collect=function(a,b,c){var d=[];return null==a?d:m&&a.map===m?a.map(b,c):(y(a,function(a,e,f){d.push(b.call(c,a,e,f))}),d)};var z="Reduce of empty array with no initial value";x.reduce=x.foldl=x.inject=function(a,b,c,d){var e=arguments.length>2;if(null==a&&(a=[]),n&&a.reduce===n)return d&&(b=x.bind(b,d)),e?a.reduce(b,c):a.reduce(b);if(y(a,function(a,f,g){e?c=b.call(d,c,a,f,g):(c=a,e=!0)}),!e)throw new TypeError(z);return c},x.reduceRight=x.foldr=function(a,b,c,d){var e=arguments.length>2;if(null==a&&(a=[]),o&&a.reduceRight===o)return d&&(b=x.bind(b,d)),e?a.reduceRight(b,c):a.reduceRight(b);var f=a.length;if(f!==+f){var g=x.keys(a);f=g.length}if(y(a,function(h,i,j){i=g?g[--f]:--f,e?c=b.call(d,c,a[i],i,j):(c=a[i],e=!0)}),!e)throw new TypeError(z);return c},x.find=x.detect=function(a,b,c){var d;return A(a,function(a,e,f){return b.call(c,a,e,f)?(d=a,!0):void 0}),d},x.filter=x.select=function(a,b,c){var d=[];return null==a?d:p&&a.filter===p?a.filter(b,c):(y(a,function(a,e,f){b.call(c,a,e,f)&&d.push(a)}),d)},x.reject=function(a,b,c){return x.filter(a,function(a,d,e){return!b.call(c,a,d,e)},c)},x.every=x.all=function(a,b,d){b||(b=x.identity);var e=!0;return null==a?e:q&&a.every===q?a.every(b,d):(y(a,function(a,f,g){return(e=e&&b.call(d,a,f,g))?void 0:c}),!!e)};var A=x.some=x.any=function(a,b,d){b||(b=x.identity);var e=!1;return null==a?e:r&&a.some===r?a.some(b,d):(y(a,function(a,f,g){return e||(e=b.call(d,a,f,g))?c:void 0}),!!e)};x.contains=x.include=function(a,b){return null==a?!1:s&&a.indexOf===s?-1!=a.indexOf(b):A(a,function(a){return a===b})},x.invoke=function(a,b){var c=h.call(arguments,2),d=x.isFunction(b);return x.map(a,function(a){return(d?b:a[b]).apply(a,c)})},x.pluck=function(a,b){return x.map(a,function(a){return a[b]})},x.where=function(a,b,c){return x.isEmpty(b)?c?void 0:[]:x[c?"find":"filter"](a,function(a){for(var c in b)if(b[c]!==a[c])return!1;return!0})},x.findWhere=function(a,b){return x.where(a,b,!0)},x.max=function(a,b,c){if(!b&&x.isArray(a)&&a[0]===+a[0]&&a.length<65535)return Math.max.apply(Math,a);if(!b&&x.isEmpty(a))return-1/0;var d={computed:-1/0,value:-1/0};return y(a,function(a,e,f){var g=b?b.call(c,a,e,f):a;g>d.computed&&(d={value:a,computed:g})}),d.value},x.min=function(a,b,c){if(!b&&x.isArray(a)&&a[0]===+a[0]&&a.length<65535)return Math.min.apply(Math,a);if(!b&&x.isEmpty(a))return 1/0;var d={computed:1/0,value:1/0};return y(a,function(a,e,f){var g=b?b.call(c,a,e,f):a;g<d.computed&&(d={value:a,computed:g})}),d.value},x.shuffle=function(a){var b,c=0,d=[];return y(a,function(a){b=x.random(c++),d[c-1]=d[b],d[b]=a}),d},x.sample=function(a,b,c){return arguments.length<2||c?a[x.random(a.length-1)]:x.shuffle(a).slice(0,Math.max(0,b))};var B=function(a){return x.isFunction(a)?a:function(b){return b[a]}};x.sortBy=function(a,b,c){var d=B(b);return x.pluck(x.map(a,function(a,b,e){return{value:a,index:b,criteria:d.call(c,a,b,e)}}).sort(function(a,b){var c=a.criteria,d=b.criteria;if(c!==d){if(c>d||void 0===c)return 1;if(d>c||void 0===d)return-1}return a.index-b.index}),"value")};var C=function(a){return function(b,c,d){var e={},f=null==c?x.identity:B(c);return y(b,function(c,g){var h=f.call(d,c,g,b);a(e,h,c)}),e}};x.groupBy=C(function(a,b,c){(x.has(a,b)?a[b]:a[b]=[]).push(c)}),x.indexBy=C(function(a,b,c){a[b]=c}),x.countBy=C(function(a,b){x.has(a,b)?a[b]++:a[b]=1}),x.sortedIndex=function(a,b,c,d){c=null==c?x.identity:B(c);for(var e=c.call(d,b),f=0,g=a.length;g>f;){var h=f+g>>>1;c.call(d,a[h])<e?f=h+1:g=h}return f},x.toArray=function(a){return a?x.isArray(a)?h.call(a):a.length===+a.length?x.map(a,x.identity):x.values(a):[]},x.size=function(a){return null==a?0:a.length===+a.length?a.length:x.keys(a).length},x.first=x.head=x.take=function(a,b,c){return null==a?void 0:null==b||c?a[0]:h.call(a,0,b)},x.initial=function(a,b,c){return h.call(a,0,a.length-(null==b||c?1:b))},x.last=function(a,b,c){return null==a?void 0:null==b||c?a[a.length-1]:h.call(a,Math.max(a.length-b,0))},x.rest=x.tail=x.drop=function(a,b,c){return h.call(a,null==b||c?1:b)},x.compact=function(a){return x.filter(a,x.identity)};var D=function(a,b,c){return b&&x.every(a,x.isArray)?i.apply(c,a):(y(a,function(a){x.isArray(a)||x.isArguments(a)?b?g.apply(c,a):D(a,b,c):c.push(a)}),c)};x.flatten=function(a,b){return D(a,b,[])},x.without=function(a){return x.difference(a,h.call(arguments,1))},x.uniq=x.unique=function(a,b,c,d){x.isFunction(b)&&(d=c,c=b,b=!1);var e=c?x.map(a,c,d):a,f=[],g=[];return y(e,function(c,d){(b?d&&g[g.length-1]===c:x.contains(g,c))||(g.push(c),f.push(a[d]))}),f},x.union=function(){return x.uniq(x.flatten(arguments,!0))},x.intersection=function(a){var b=h.call(arguments,1);return x.filter(x.uniq(a),function(a){return x.every(b,function(b){return x.indexOf(b,a)>=0})})},x.difference=function(a){var b=i.apply(d,h.call(arguments,1));return x.filter(a,function(a){return!x.contains(b,a)})},x.zip=function(){for(var a=x.max(x.pluck(arguments,"length").concat(0)),b=new Array(a),c=0;a>c;c++)b[c]=x.pluck(arguments,""+c);return b},x.object=function(a,b){if(null==a)return{};for(var c={},d=0,e=a.length;e>d;d++)b?c[a[d]]=b[d]:c[a[d][0]]=a[d][1];return c},x.indexOf=function(a,b,c){if(null==a)return-1;var d=0,e=a.length;if(c){if("number"!=typeof c)return d=x.sortedIndex(a,b),a[d]===b?d:-1;d=0>c?Math.max(0,e+c):c}if(s&&a.indexOf===s)return a.indexOf(b,c);for(;e>d;d++)if(a[d]===b)return d;return-1},x.lastIndexOf=function(a,b,c){if(null==a)return-1;var d=null!=c;if(t&&a.lastIndexOf===t)return d?a.lastIndexOf(b,c):a.lastIndexOf(b);for(var e=d?c:a.length;e--;)if(a[e]===b)return e;return-1},x.range=function(a,b,c){arguments.length<=1&&(b=a||0,a=0),c=arguments[2]||1;for(var d=Math.max(Math.ceil((b-a)/c),0),e=0,f=new Array(d);d>e;)f[e++]=a,a+=c;return f};var E=function(){};x.bind=function(a,b){var c,d;if(w&&a.bind===w)return w.apply(a,h.call(arguments,1));if(!x.isFunction(a))throw new TypeError;return c=h.call(arguments,2),d=function(){if(!(this instanceof d))return a.apply(b,c.concat(h.call(arguments)));E.prototype=a.prototype;var e=new E;E.prototype=null;var f=a.apply(e,c.concat(h.call(arguments)));return Object(f)===f?f:e}},x.partial=function(a){var b=h.call(arguments,1);return function(){return a.apply(this,b.concat(h.call(arguments)))}},x.bindAll=function(a){var b=h.call(arguments,1);if(0===b.length)throw new Error("bindAll must be passed function names");return y(b,function(b){a[b]=x.bind(a[b],a)}),a},x.memoize=function(a,b){var c={};return b||(b=x.identity),function(){var d=b.apply(this,arguments);return x.has(c,d)?c[d]:c[d]=a.apply(this,arguments)}},x.delay=function(a,b){var c=h.call(arguments,2);return setTimeout(function(){return a.apply(null,c)},b)},x.defer=function(a){return x.delay.apply(x,[a,1].concat(h.call(arguments,1)))},x.throttle=function(a,b,c){var d,e,f,g=null,h=0;c||(c={});var i=function(){h=c.leading===!1?0:new Date,g=null,f=a.apply(d,e)};return function(){var j=new Date;h||c.leading!==!1||(h=j);var k=b-(j-h);return d=this,e=arguments,0>=k?(clearTimeout(g),g=null,h=j,f=a.apply(d,e)):g||c.trailing===!1||(g=setTimeout(i,k)),f}},x.debounce=function(a,b,c){var d,e,f,g,h;return function(){f=this,e=arguments,g=new Date;var i=function(){var j=new Date-g;b>j?d=setTimeout(i,b-j):(d=null,c||(h=a.apply(f,e)))},j=c&&!d;return d||(d=setTimeout(i,b)),j&&(h=a.apply(f,e)),h}},x.once=function(a){var b,c=!1;return function(){return c?b:(c=!0,b=a.apply(this,arguments),a=null,b)}},x.wrap=function(a,b){return function(){var c=[a];return g.apply(c,arguments),b.apply(this,c)}},x.compose=function(){var a=arguments;return function(){for(var b=arguments,c=a.length-1;c>=0;c--)b=[a[c].apply(this,b)];return b[0]}},x.after=function(a,b){return function(){return--a<1?b.apply(this,arguments):void 0}},x.keys=v||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var b=[];for(var c in a)x.has(a,c)&&b.push(c);return b},x.values=function(a){for(var b=x.keys(a),c=b.length,d=new Array(c),e=0;c>e;e++)d[e]=a[b[e]];return d},x.pairs=function(a){for(var b=x.keys(a),c=b.length,d=new Array(c),e=0;c>e;e++)d[e]=[b[e],a[b[e]]];return d},x.invert=function(a){for(var b={},c=x.keys(a),d=0,e=c.length;e>d;d++)b[a[c[d]]]=c[d];return b},x.functions=x.methods=function(a){var b=[];for(var c in a)x.isFunction(a[c])&&b.push(c);return b.sort()},x.extend=function(a){return y(h.call(arguments,1),function(b){if(b)for(var c in b)a[c]=b[c]}),a},x.pick=function(a){var b={},c=i.apply(d,h.call(arguments,1));return y(c,function(c){c in a&&(b[c]=a[c])}),b},x.omit=function(a){var b={},c=i.apply(d,h.call(arguments,1));for(var e in a)x.contains(c,e)||(b[e]=a[e]);return b},x.defaults=function(a){return y(h.call(arguments,1),function(b){if(b)for(var c in b)void 0===a[c]&&(a[c]=b[c])}),a},x.clone=function(a){return x.isObject(a)?x.isArray(a)?a.slice():x.extend({},a):a},x.tap=function(a,b){return b(a),a};var F=function(a,b,c,d){if(a===b)return 0!==a||1/a==1/b;if(null==a||null==b)return a===b;a instanceof x&&(a=a._wrapped),b instanceof x&&(b=b._wrapped);var e=j.call(a);if(e!=j.call(b))return!1;switch(e){case"[object String]":return a==String(b);case"[object Number]":return a!=+a?b!=+b:0==a?1/a==1/b:a==+b;case"[object Date]":case"[object Boolean]":return+a==+b;case"[object RegExp]":return a.source==b.source&&a.global==b.global&&a.multiline==b.multiline&&a.ignoreCase==b.ignoreCase}if("object"!=typeof a||"object"!=typeof b)return!1;for(var f=c.length;f--;)if(c[f]==a)return d[f]==b;var g=a.constructor,h=b.constructor;if(g!==h&&!(x.isFunction(g)&&g instanceof g&&x.isFunction(h)&&h instanceof h))return!1;c.push(a),d.push(b);var i=0,k=!0;if("[object Array]"==e){if(i=a.length,k=i==b.length)for(;i--&&(k=F(a[i],b[i],c,d)););}else{for(var l in a)if(x.has(a,l)&&(i++,!(k=x.has(b,l)&&F(a[l],b[l],c,d))))break;if(k){for(l in b)if(x.has(b,l)&&!i--)break;k=!i}}return c.pop(),d.pop(),k};x.isEqual=function(a,b){return F(a,b,[],[])},x.isEmpty=function(a){if(null==a)return!0;if(x.isArray(a)||x.isString(a))return 0===a.length;for(var b in a)if(x.has(a,b))return!1;return!0},x.isElement=function(a){return!(!a||1!==a.nodeType)},x.isArray=u||function(a){return"[object Array]"==j.call(a)},x.isObject=function(a){return a===Object(a)},y(["Arguments","Function","String","Number","Date","RegExp"],function(a){x["is"+a]=function(b){return j.call(b)=="[object "+a+"]"}}),x.isArguments(arguments)||(x.isArguments=function(a){return!(!a||!x.has(a,"callee"))}),"function"!=typeof/./&&(x.isFunction=function(a){return"function"==typeof a}),x.isFinite=function(a){return isFinite(a)&&!isNaN(parseFloat(a))},x.isNaN=function(a){return x.isNumber(a)&&a!=+a},x.isBoolean=function(a){return a===!0||a===!1||"[object Boolean]"==j.call(a)},x.isNull=function(a){return null===a},x.isUndefined=function(a){return void 0===a},x.has=function(a,b){return k.call(a,b)},x.noConflict=function(){return a._=b,this},x.identity=function(a){return a},x.times=function(a,b,c){for(var d=Array(Math.max(0,a)),e=0;a>e;e++)d[e]=b.call(c,e);return d},x.random=function(a,b){return null==b&&(b=a,a=0),a+Math.floor(Math.random()*(b-a+1))};var G={escape:{"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;"}};G.unescape=x.invert(G.escape);var H={escape:new RegExp("["+x.keys(G.escape).join("")+"]","g"),unescape:new RegExp("("+x.keys(G.unescape).join("|")+")","g")};x.each(["escape","unescape"],function(a){x[a]=function(b){return null==b?"":(""+b).replace(H[a],function(b){return G[a][b]})}}),x.result=function(a,b){if(null==a)return void 0;var c=a[b];return x.isFunction(c)?c.call(a):c},x.mixin=function(a){y(x.functions(a),function(b){var c=x[b]=a[b];x.prototype[b]=function(){var a=[this._wrapped];return g.apply(a,arguments),M.call(this,c.apply(x,a))}})};var I=0;x.uniqueId=function(a){var b=++I+"";return a?a+b:b},x.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var J=/(.)^/,K={"'":"'","\\":"\\","\r":"r","\n":"n","	":"t","\u2028":"u2028","\u2029":"u2029"},L=/\\|'|\r|\n|\t|\u2028|\u2029/g;x.template=function(a,b,c){var d;c=x.defaults({},c,x.templateSettings);var e=new RegExp([(c.escape||J).source,(c.interpolate||J).source,(c.evaluate||J).source].join("|")+"|$","g"),f=0,g="__p+='";a.replace(e,function(b,c,d,e,h){return g+=a.slice(f,h).replace(L,function(a){return"\\"+K[a]}),c&&(g+="'+\n((__t=("+c+"))==null?'':_.escape(__t))+\n'"),d&&(g+="'+\n((__t=("+d+"))==null?'':__t)+\n'"),e&&(g+="';\n"+e+"\n__p+='"),f=h+b.length,b}),g+="';\n",c.variable||(g="with(obj||{}){\n"+g+"}\n"),g="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+g+"return __p;\n";try{d=new Function(c.variable||"obj","_",g)}catch(h){throw h.source=g,h}if(b)return d(b,x);var i=function(a){return d.call(this,a,x)};return i.source="function("+(c.variable||"obj")+"){\n"+g+"}",i},x.chain=function(a){return x(a).chain()};var M=function(a){return this._chain?x(a).chain():a};x.mixin(x),y(["pop","push","reverse","shift","sort","splice","unshift"],function(a){var b=d[a];x.prototype[a]=function(){var c=this._wrapped;return b.apply(c,arguments),"shift"!=a&&"splice"!=a||0!==c.length||delete c[0],M.call(this,c)}}),y(["concat","join","slice"],function(a){var b=d[a];x.prototype[a]=function(){return M.call(this,b.apply(this._wrapped,arguments))}}),x.extend(x.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this),function(a,b){"use strict";function c(){function a(a,c){return b.extend(new(b.extend(function(){},{prototype:a})),c)}function c(a,b){var c=b.caseInsensitiveMatch,d={originalPath:a,regexp:a},e=d.keys=[];return a=a.replace(/([().])/g,"\\$1").replace(/(\/)?:(\w+)([\?\*])?/g,function(a,b,c,d){var f="?"===d?d:null,g="*"===d?d:null;return e.push({name:c,optional:!!f}),b=b||"",""+(f?"":b)+"(?:"+(f?b:"")+(g&&"(.+?)"||"([^/]+)")+(f||"")+")"+(f||"")}).replace(/([\/$\*])/g,"\\$1"),d.regexp=new RegExp("^"+a+"$",c?"i":""),d}var d={};this.when=function(a,e){if(d[a]=b.extend({reloadOnSearch:!0},e,a&&c(a,e)),a){var f="/"==a[a.length-1]?a.substr(0,a.length-1):a+"/";d[f]=b.extend({redirectTo:a},c(f,e))}return this},this.otherwise=function(a){return this.when(null,a),this},this.$get=["$rootScope","$location","$routeParams","$q","$injector","$http","$templateCache","$sce",function(c,e,f,g,h,i,j,k){function l(a,b){var c=b.keys,d={};if(!b.regexp)return null;var e=b.regexp.exec(a);if(!e)return null;for(var f=1,g=e.length;g>f;++f){var h=c[f-1],i="string"==typeof e[f]?decodeURIComponent(e[f]):e[f];h&&i&&(d[h.name]=i)}return d}function m(){var a=n(),d=q.current;a&&d&&a.$$route===d.$$route&&b.equals(a.pathParams,d.pathParams)&&!a.reloadOnSearch&&!p?(d.params=a.params,b.copy(d.params,f),c.$broadcast("$routeUpdate",d)):(a||d)&&(p=!1,c.$broadcast("$routeChangeStart",a,d),q.current=a,a&&a.redirectTo&&(b.isString(a.redirectTo)?e.path(o(a.redirectTo,a.params)).search(a.params).replace():e.url(a.redirectTo(a.pathParams,e.path(),e.search())).replace()),g.when(a).then(function(){if(a){var c,d,e=b.extend({},a.resolve);return b.forEach(e,function(a,c){e[c]=b.isString(a)?h.get(a):h.invoke(a)}),b.isDefined(c=a.template)?b.isFunction(c)&&(c=c(a.params)):b.isDefined(d=a.templateUrl)&&(b.isFunction(d)&&(d=d(a.params)),d=k.getTrustedResourceUrl(d),b.isDefined(d)&&(a.loadedTemplateUrl=d,c=i.get(d,{cache:j}).then(function(a){return a.data}))),b.isDefined(c)&&(e.$template=c),g.all(e)}}).then(function(e){a==q.current&&(a&&(a.locals=e,b.copy(a.params,f)),c.$broadcast("$routeChangeSuccess",a,d))},function(b){a==q.current&&c.$broadcast("$routeChangeError",a,d,b)}))}function n(){var c,f;return b.forEach(d,function(d){!f&&(c=l(e.path(),d))&&(f=a(d,{params:b.extend({},e.search(),c),pathParams:c}),f.$$route=d)}),f||d[null]&&a(d[null],{params:{},pathParams:{}})}function o(a,c){var d=[];return b.forEach((a||"").split(":"),function(a,b){if(0===b)d.push(a);else{var e=a.match(/(\w+)(.*)/),f=e[1];d.push(c[f]),d.push(e[2]||""),delete c[f]}}),d.join("")}var p=!1,q={routes:d,reload:function(){p=!0,c.$evalAsync(m)}};return c.$on("$locationChangeSuccess",m),q}]}function d(){this.$get=function(){return{}}}function e(a,c,d){return{restrict:"ECA",terminal:!0,priority:400,transclude:"element",link:function(e,f,g,h,i){function j(){n&&(n.remove(),n=null),l&&(l.$destroy(),l=null),m&&(d.leave(m,function(){n=null}),n=m,m=null)}function k(){var g=a.current&&a.current.locals,h=g&&g.$template;if(b.isDefined(h)){var k=e.$new(),n=a.current,q=i(k,function(a){d.enter(a,null,m||f,function(){!b.isDefined(o)||o&&!e.$eval(o)||c()}),j()});m=q,l=n.scope=k,l.$emit("$viewContentLoaded"),l.$eval(p)}else j()}var l,m,n,o=g.autoscroll,p=g.onload||"";e.$on("$routeChangeSuccess",k),k()}}}function f(a,b,c){return{restrict:"ECA",priority:-400,link:function(d,e){var f=c.current,g=f.locals;e.html(g.$template);var h=a(e.contents());if(f.controller){g.$scope=d;var i=b(f.controller,g);f.controllerAs&&(d[f.controllerAs]=i),e.data("$ngControllerController",i),e.children().data("$ngControllerController",i)}h(d)}}}var g=b.module("ngRoute",["ng"]).provider("$route",c);g.provider("$routeParams",d),g.directive("ngView",e),g.directive("ngView",f),e.$inject=["$route","$anchorScroll","$animate"],f.$inject=["$compile","$controller","$route"]}(window,window.angular),function(a,b,c){"use strict";function d(a){return null!=a&&""!==a&&"hasOwnProperty"!==a&&h.test("."+a)}function e(a,b){if(!d(b))throw g("badmember",'Dotted member path "@{0}" is invalid.',b);for(var e=b.split("."),f=0,h=e.length;h>f&&a!==c;f++){var i=e[f];a=null!==a?a[i]:c}return a}function f(a,c){c=c||{},b.forEach(c,function(a,b){delete c[b]});for(var d in a)!a.hasOwnProperty(d)||"$"===d.charAt(0)&&"$"===d.charAt(1)||(c[d]=a[d]);return c}var g=b.$$minErr("$resource"),h=/^(\.[a-zA-Z_$][0-9a-zA-Z_$]*)+$/;b.module("ngResource",["ng"]).factory("$resource",["$http","$q",function(a,d){function h(a){return i(a,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function i(a,b){return encodeURIComponent(a).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,b?"%20":"+")}function j(a,b){this.template=a,this.defaults=b||{},this.urlParams={}}function k(h,i,r){function s(a,b){var c={};return b=o({},i,b),n(b,function(b,d){q(b)&&(b=b()),c[d]=b&&b.charAt&&"@"==b.charAt(0)?e(a,b.substr(1)):b}),c}function t(a){return a.resource}function u(a){f(a||{},this)}var v=new j(h);return r=o({},l,r),n(r,function(e,h){var i=/^(POST|PUT|PATCH)$/i.test(e.method);u[h]=function(h,j,k,l){var r,w,x,y={};switch(arguments.length){case 4:x=l,w=k;case 3:case 2:if(!q(j)){y=h,r=j,w=k;break}if(q(h)){w=h,x=j;break}w=j,x=k;case 1:q(h)?w=h:i?r=h:y=h;break;case 0:break;default:throw g("badargs","Expected up to 4 arguments [params, data, success, error], got {0} arguments",arguments.length)}var z=this instanceof u,A=z?r:e.isArray?[]:new u(r),B={},C=e.interceptor&&e.interceptor.response||t,D=e.interceptor&&e.interceptor.responseError||c;n(e,function(a,b){"params"!=b&&"isArray"!=b&&"interceptor"!=b&&(B[b]=p(a))}),i&&(B.data=r),v.setUrlParams(B,o({},s(r,e.params||{}),y),e.url);var E=a(B).then(function(a){var c=a.data,d=A.$promise;if(c){if(b.isArray(c)!==!!e.isArray)throw g("badcfg","Error in resource configuration. Expected response to contain an {0} but got an {1}",e.isArray?"array":"object",b.isArray(c)?"array":"object");e.isArray?(A.length=0,n(c,function(a){A.push(new u(a))})):(f(c,A),A.$promise=d)}return A.$resolved=!0,a.resource=A,a},function(a){return A.$resolved=!0,(x||m)(a),d.reject(a)});return E=E.then(function(a){var b=C(a);return(w||m)(b,a.headers),b},D),z?E:(A.$promise=E,A.$resolved=!1,A)},u.prototype["$"+h]=function(a,b,c){q(a)&&(c=b,b=a,a={});var d=u[h].call(this,a,this,b,c);return d.$promise||d}}),u.bind=function(a){return k(h,o({},i,a),r)},u}var l={get:{method:"GET"},save:{method:"POST"},query:{method:"GET",isArray:!0},remove:{method:"DELETE"},"delete":{method:"DELETE"}},m=b.noop,n=b.forEach,o=b.extend,p=b.copy,q=b.isFunction;return j.prototype={setUrlParams:function(a,c,d){var e,f,i=this,j=d||i.template,k=i.urlParams={};n(j.split(/\W/),function(a){if("hasOwnProperty"===a)throw g("badname","hasOwnProperty is not a valid parameter name.");!new RegExp("^\\d+$").test(a)&&a&&new RegExp("(^|[^\\\\]):"+a+"(\\W|$)").test(j)&&(k[a]=!0)}),j=j.replace(/\\:/g,":"),c=c||{},n(i.urlParams,function(a,d){e=c.hasOwnProperty(d)?c[d]:i.defaults[d],b.isDefined(e)&&null!==e?(f=h(e),j=j.replace(new RegExp(":"+d+"(\\W|$)","g"),function(a,b){return f+b})):j=j.replace(new RegExp("(/?):"+d+"(\\W|$)","g"),function(a,b,c){return"/"==c.charAt(0)?c:b+c})}),j=j.replace(/\/+$/,"")||"/",j=j.replace(/\/\.(?=\w+($|\?))/,"."),a.url=j.replace(/\/\\\./,"/."),n(c,function(b,c){i.urlParams[c]||(a.params=a.params||{},a.params[c]=b)})}},k}])}(window,window.angular),function(a,b,c){"use strict";b.module("ngCookies",["ng"]).factory("$cookies",["$rootScope","$browser",function(a,d){function e(){var a,e,f,i;for(a in h)k(g[a])&&d.cookies(a,c);for(a in g)e=g[a],b.isString(e)||(e=""+e,g[a]=e),e!==h[a]&&(d.cookies(a,e),i=!0);if(i){i=!1,f=d.cookies();for(a in g)g[a]!==f[a]&&(k(f[a])?delete g[a]:g[a]=f[a],i=!0)}}var f,g={},h={},i=!1,j=b.copy,k=b.isUndefined;return d.addPollFn(function(){var b=d.cookies();f!=b&&(f=b,j(b,h),j(b,g),i&&a.$apply())})(),i=!0,a.$watch(e),g}]).factory("$cookieStore",["$cookies",function(a){return{get:function(c){var d=a[c];return d?b.fromJson(d):d},put:function(c,d){a[c]=b.toJson(d)},remove:function(b){delete a[b]}}}])}(window,window.angular),function(a,b){"use strict";function c(){this.$get=["$$sanitizeUri",function(a){return function(b){var c=[];return f(b,i(c,function(b,c){return!/^unsafe/.test(a(b,c))})),c.join("")}}]}function d(a){var c=[],d=i(c,b.noop);return d.chars(a),c.join("")}function e(a){var b,c={},d=a.split(",");for(b=0;b<d.length;b++)c[d[b]]=!0;return c}function f(a,c){function d(a,d,f,h){if(d=b.lowercase(d),y[d])for(;s.last()&&z[s.last()];)e("",s.last());x[d]&&s.last()==d&&e("",d),h=u[d]||!!h,h||s.push(d);var i={};f.replace(m,function(a,b,c,d,e){var f=c||d||e||"";i[b]=g(f)}),c.start&&c.start(d,i,h)}function e(a,d){var e,f=0;if(d=b.lowercase(d))for(f=s.length-1;f>=0&&s[f]!=d;f--);if(f>=0){for(e=s.length-1;e>=f;e--)c.end&&c.end(s[e]);s.length=f}}var f,h,i,s=[],t=a;for(s.last=function(){return s[s.length-1]};a;){if(h=!0,s.last()&&A[s.last()])a=a.replace(new RegExp("(.*)<\\s*\\/\\s*"+s.last()+"[^>]*>","i"),function(a,b){return b=b.replace(p,"$1").replace(r,"$1"),c.chars&&c.chars(g(b)),""}),e("",s.last());else if(0===a.indexOf("<!--")?(f=a.indexOf("--",4),f>=0&&a.lastIndexOf("-->",f)===f&&(c.comment&&c.comment(a.substring(4,f)),a=a.substring(f+3),h=!1)):q.test(a)?(i=a.match(q),i&&(a=a.replace(i[0],""),h=!1)):o.test(a)?(i=a.match(l),i&&(a=a.substring(i[0].length),i[0].replace(l,e),h=!1)):n.test(a)&&(i=a.match(k),i&&(a=a.substring(i[0].length),i[0].replace(k,d),h=!1)),h){f=a.indexOf("<");var v=0>f?a:a.substring(0,f);a=0>f?"":a.substring(f),c.chars&&c.chars(g(v))}if(a==t)throw j("badparse","The sanitizer was unable to parse the following block of html: {0}",a);t=a}e()}function g(a){if(!a)return"";var b=F.exec(a),c=b[1],d=b[3],e=b[2];return e&&(E.innerHTML=e.replace(/</g,"&lt;"),e="textContent"in E?E.textContent:E.innerText),c+e+d}function h(a){return a.replace(/&/g,"&amp;").replace(s,function(a){var b=a.charCodeAt(0),c=a.charCodeAt(1);return"&#"+(1024*(b-55296)+(c-56320)+65536)+";"}).replace(t,function(a){return"&#"+a.charCodeAt(0)+";"}).replace(/</g,"&lt;").replace(/>/g,"&gt;")}function i(a,c){var d=!1,e=b.bind(a,a.push);return{start:function(a,f,g){a=b.lowercase(a),!d&&A[a]&&(d=a),d||B[a]!==!0||(e("<"),e(a),b.forEach(f,function(d,f){var g=b.lowercase(f),i="img"===a&&"src"===g||"background"===g;D[g]!==!0||C[g]===!0&&!c(d,i)||(e(" "),e(f),e('="'),e(h(d)),e('"'))}),e(g?"/>":">"))},end:function(a){a=b.lowercase(a),d||B[a]!==!0||(e("</"),e(a),e(">")),a==d&&(d=!1)},chars:function(a){d||e(h(a))}}}var j=b.$$minErr("$sanitize"),k=/^<\s*([\w:-]+)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*>/,l=/^<\s*\/\s*([\w:-]+)[^>]*>/,m=/([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g,n=/^</,o=/^<\s*\//,p=/<!--(.*?)-->/g,q=/<!DOCTYPE([^>]*?)>/i,r=/<!\[CDATA\[(.*?)]]>/g,s=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,t=/([^\#-~| |!])/g,u=e("area,br,col,hr,img,wbr"),v=e("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"),w=e("rp,rt"),x=b.extend({},w,v),y=b.extend({},v,e("address,article,aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,script,section,table,ul")),z=b.extend({},w,e("a,abbr,acronym,b,bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s,samp,small,span,strike,strong,sub,sup,time,tt,u,var")),A=e("script,style"),B=b.extend({},u,y,z,x),C=e("background,cite,href,longdesc,src,usemap"),D=b.extend({},C,e("abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,scope,scrolling,shape,size,span,start,summary,target,title,type,valign,value,vspace,width")),E=document.createElement("pre"),F=/^(\s*)([\s\S]*?)(\s*)$/;b.module("ngSanitize",[]).provider("$sanitize",c),b.module("ngSanitize").filter("linky",["$sanitize",function(a){var c=/((ftp|https?):\/\/|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>]/,e=/^mailto:/;return function(f,g){function h(a){a&&n.push(d(a))}function i(a,c){n.push("<a "),b.isDefined(g)&&(n.push('target="'),n.push(g),n.push('" ')),n.push('href="'),n.push(a),n.push('">'),h(c),n.push("</a>")}if(!f)return f;for(var j,k,l,m=f,n=[];j=m.match(c);)k=j[0],j[2]==j[3]&&(k="mailto:"+k),l=j.index,h(m.substr(0,l)),i(k,j[0].replace(e,"")),m=m.substring(l+j[0].length);return h(m),a(n.join(""))}}])}(window,window.angular),function(){var a=angular.module("restangular",[]);a.provider("Restangular",function(){var a={};a.init=function(a,b){function c(a,b,c,d){var e={};return _.each(_.keys(d),function(f){var g=d[f];g.params=_.extend({},g.params,a.defaultRequestParams[g.method.toLowerCase()]),_.isEmpty(g.params)&&delete g.params,e[f]=a.isSafe(g.method)?function(){return b(_.extend(g,{url:c}))}:function(a){return b(_.extend(g,{url:c,data:a}))
+}}),e}a.configuration=b;var d=["get","head","options","trace","getlist"];b.isSafe=function(a){return _.contains(d,a.toLowerCase())};var e=/^https?:\/\//i;b.isAbsoluteUrl=function(a){return a&&e.test(a)},b.baseUrl=_.isUndefined(b.baseUrl)?"":b.baseUrl,a.setBaseUrl=function(a){return b.baseUrl=/\/$/.test(a)?a.substring(0,a.length-1):a,this},b.extraFields=b.extraFields||[],a.setExtraFields=function(a){return b.extraFields=a,this},b.defaultHttpFields=b.defaultHttpFields||{},a.setDefaultHttpFields=function(a){return b.defaultHttpFields=a,this},b.withHttpValues=function(a,c){return _.defaults(c,a,b.defaultHttpFields)},b.encodeIds=_.isUndefined(b.encodeIds)?!0:b.encodeIds,a.setEncodeIds=function(a){b.encodeIds=a},b.defaultRequestParams=b.defaultRequestParams||{get:{},post:{},put:{},remove:{},common:{}},a.setDefaultRequestParams=function(a,c){var d=[],e=c||a;return _.isUndefined(c)?d.push("common"):_.isArray(a)?d=a:d.push(a),_.each(d,function(a){b.defaultRequestParams[a]=e}),this},a.requestParams=b.defaultRequestParams,b.defaultHeaders=b.defaultHeaders||{},a.setDefaultHeaders=function(c){return b.defaultHeaders=c,a.defaultHeaders=b.defaultHeaders,this},a.defaultHeaders=b.defaultHeaders,b.methodOverriders=b.methodOverriders||[],a.setMethodOverriders=function(a){var c=_.extend([],a);return b.isOverridenMethod("delete",c)&&c.push("remove"),b.methodOverriders=c,this},b.isOverridenMethod=function(a,c){var d=c||b.methodOverriders;return!_.isUndefined(_.find(d,function(b){return b.toLowerCase()===a.toLowerCase()}))},b.urlCreator=b.urlCreator||"path",a.setUrlCreator=function(a){if(!_.has(b.urlCreatorFactory,a))throw new Error("URL Path selected isn't valid");return b.urlCreator=a,this},b.restangularFields=b.restangularFields||{id:"id",route:"route",parentResource:"parentResource",restangularCollection:"restangularCollection",cannonicalId:"__cannonicalId",etag:"restangularEtag",selfLink:"href",get:"get",getList:"getList",put:"put",post:"post",remove:"remove",head:"head",trace:"trace",options:"options",patch:"patch",getRestangularUrl:"getRestangularUrl",getRequestedUrl:"getRequestedUrl",putElement:"putElement",addRestangularMethod:"addRestangularMethod",getParentList:"getParentList",clone:"clone",ids:"ids",httpConfig:"_$httpConfig",reqParams:"reqParams"},a.setRestangularFields=function(a){return b.restangularFields=_.extend(b.restangularFields,a),this},b.setFieldToElem=function(a,b,c){var d=a.split("."),e=b;return _.each(_.initial(d),function(a){e[a]={},e=e[a]}),e[_.last(d)]=c,this},b.getFieldFromElem=function(a,b){var c=a.split("."),d=angular.copy(b);return _.each(c,function(a){d&&(d=d[a])}),d},b.setIdToElem=function(a,c){return b.setFieldToElem(b.restangularFields.id,a,c),this},b.getIdFromElem=function(a){return b.getFieldFromElem(b.restangularFields.id,a)},b.isValidId=function(a){return""!==a&&!_.isUndefined(a)&&!_.isNull(a)},b.setUrlToElem=function(a,c){return b.setFieldToElem(b.restangularFields.selfLink,a,c),this},b.getUrlFromElem=function(a){return b.getFieldFromElem(b.restangularFields.selfLink,a)},b.useCannonicalId=_.isUndefined(b.useCannonicalId)?!1:b.useCannonicalId,a.setUseCannonicalId=function(a){return b.useCannonicalId=a,this},b.getCannonicalIdFromElem=function(a){var c=a[b.restangularFields.cannonicalId],d=b.isValidId(c)?c:b.getIdFromElem(a);return d},b.responseExtractor=b.responseExtractor||function(a){return a},a.setResponseExtractor=function(a){return b.responseExtractor=a,this},a.setResponseInterceptor=a.setResponseExtractor,b.fullRequestInterceptor=b.fullRequestInterceptor||function(a,b,c,d,e,f,g){return{element:a,headers:e,params:f,httpConfig:g}},a.setRequestInterceptor=function(a){return b.fullRequestInterceptor=function(b,c,d,e,f,g,h){return{headers:f,params:g,element:a(b,c,d,e),httpConfig:h}},this},a.setFullRequestInterceptor=function(a){return b.fullRequestInterceptor=a,this},b.errorInterceptor=b.errorInterceptor||function(){},a.setErrorInterceptor=function(a){return b.errorInterceptor=a,this},b.onBeforeElemRestangularized=b.onBeforeElemRestangularized||function(a){return a},a.setOnBeforeElemRestangularized=function(a){return b.onBeforeElemRestangularized=a,this},b.onElemRestangularized=b.onElemRestangularized||function(a){return a},a.setOnElemRestangularized=function(a){return b.onElemRestangularized=a,this},a.setListTypeIsArray=function(){},b.shouldSaveParent=b.shouldSaveParent||function(){return!0},a.setParentless=function(a){return _.isArray(a)?b.shouldSaveParent=function(b){return!_.contains(a,b)}:_.isBoolean(a)&&(b.shouldSaveParent=function(){return!a}),this},b.suffix=_.isUndefined(b.suffix)?null:b.suffix,a.setRequestSuffix=function(a){return b.suffix=a,this},b.transformers=b.transformers||{},a.addElementTransformer=function(a,c,d){var e=null,f=null;2===arguments.length?f=c:(f=d,e=c);var g=b.transformers[a];g||(g=b.transformers[a]=[]),g.push(function(a,b){return _.isNull(e)||a==e?f(b):b})},a.extendCollection=function(b,c){return a.addElementTransformer(b,!0,c)},a.extendModel=function(b,c){return a.addElementTransformer(b,!1,c)},b.transformElem=function(a,c,d,e){var f=b.transformers[d],g=a;return f&&_.each(f,function(a){g=a(c,g)}),b.onElemRestangularized(g,c,d,e)},b.fullResponse=_.isUndefined(b.fullResponse)?!1:b.fullResponse,a.setFullResponse=function(a){return b.fullResponse=a,this},b.urlCreatorFactory={};var f=function(){};f.prototype.setConfig=function(a){return this.config=a,this},f.prototype.parentsArray=function(a){for(var b=[];a;)b.push(a),a=a[this.config.restangularFields.parentResource];return b.reverse()},f.prototype.resource=function(a,d,e,f,g,h,i,j){var k=_.defaults(g||{},this.config.defaultRequestParams.common),l=_.defaults(f||{},this.config.defaultHeaders);i&&(b.isSafe(j)?l["If-None-Match"]=i:l["If-Match"]=i);var m=this.base(a);if(h){var n="";/\/$/.test(m)||(n+="/"),n+=h,m+=n}return this.config.suffix&&-1===m.indexOf(this.config.suffix,m.length-this.config.suffix.length)&&(m+=this.config.suffix),a[this.config.restangularFields.httpConfig]=void 0,c(this.config,d,m,{getList:this.config.withHttpValues(e,{method:"GET",params:k,headers:l}),get:this.config.withHttpValues(e,{method:"GET",params:k,headers:l}),put:this.config.withHttpValues(e,{method:"PUT",params:k,headers:l}),post:this.config.withHttpValues(e,{method:"POST",params:k,headers:l}),remove:this.config.withHttpValues(e,{method:"DELETE",params:k,headers:l}),head:this.config.withHttpValues(e,{method:"HEAD",params:k,headers:l}),trace:this.config.withHttpValues(e,{method:"TRACE",params:k,headers:l}),options:this.config.withHttpValues(e,{method:"OPTIONS",params:k,headers:l}),patch:this.config.withHttpValues(e,{method:"PATCH",params:k,headers:l})})};var g=function(){};g.prototype=new f,g.prototype.base=function(a){var c=this;return _.reduce(this.parentsArray(a),function(a,d){var e,f=c.config.getUrlFromElem(d);if(f){if(c.config.isAbsoluteUrl(f))return f;e=f}else if(e=d[c.config.restangularFields.route],d[c.config.restangularFields.restangularCollection]){var g=d[c.config.restangularFields.ids];g&&(e+="/"+g.join(","))}else{var h;h=c.config.useCannonicalId?c.config.getCannonicalIdFromElem(d):c.config.getIdFromElem(d),b.isValidId(h)&&(e+="/"+(c.config.encodeIds?encodeURIComponent(h):h))}return a+"/"+e},this.config.baseUrl)},g.prototype.fetchUrl=function(a,b){var c=this.base(a);return b&&(c+="/"+b),c},g.prototype.fetchRequestedUrl=function(a,c){function d(a){var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c);return b.sort()}function e(a,b,c){for(var e=d(a),f=0;f<e.length;f++)b.call(c,a[e[f]],e[f]);return e}function f(a,b){return encodeURIComponent(a).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,b?"%20":"+")}var g=this.fetchUrl(a,c),h=a[b.restangularFields.reqParams];if(!h)return g;var i=[];return e(h,function(a,b){null!=a&&void 0!=a&&(angular.isArray(a)||(a=[a]),angular.forEach(a,function(a){angular.isObject(a)&&(a=angular.toJson(a)),i.push(f(b)+"="+f(a))}))}),g+(-1===g.indexOf("?")?"?":"&")+i.join("&")},b.urlCreatorFactory.path=g};var b={};a.init(this,b),this.$get=["$http","$q",function(c,d){function e(f){function g(a,b,c,d){if(b[f.restangularFields.route]=c,b[f.restangularFields.getRestangularUrl]=_.bind(N.fetchUrl,N,b),b[f.restangularFields.getRequestedUrl]=_.bind(N.fetchRequestedUrl,N,b),b[f.restangularFields.addRestangularMethod]=_.bind(K,b),b[f.restangularFields.clone]=_.bind(s,b,b),b[f.restangularFields.reqParams]=_.isEmpty(d)?null:d,b.withHttpConfig=_.bind(z,b),b.one=_.bind(h,b,b),b.all=_.bind(i,b,b),b.several=_.bind(j,b,b),b.oneUrl=_.bind(k,b,b),b.allUrl=_.bind(l,b,b),a&&f.shouldSaveParent(c)){var e=f.getIdFromElem(a),g=f.getUrlFromElem(a),m=_.union(_.values(_.pick(f.restangularFields,["route","parentResource"])),f.extraFields),n=_.pick(a,m);f.isValidId(e)&&f.setIdToElem(n,e),f.isValidId(g)&&f.setUrlToElem(n,g),b[f.restangularFields.parentResource]=n}else b[f.restangularFields.parentResource]=null;return b}function h(a,b,c){var d={};return f.setIdToElem(d,c),t(a,d,b)}function i(a,b){return u(a,[],b,!0)}function j(a,b){var c=[];return c[f.restangularFields.ids]=Array.prototype.splice.call(arguments,2),u(a,c,b,!0)}function k(a,b,c){var d={};return f.setUrlToElem(d,c),t(a,d,b)}function l(a,b,c){var d={};return f.setUrlToElem(d,c),u(a,d,b,!0)}function m(a,b){return a.call=_.bind(n,a),a.get=_.bind(o,a),a[f.restangularFields.restangularCollection]=b,b&&(a.push=_.bind(n,a,"push")),a}function n(a){var b=d.defer(),c=arguments;return this.then(function(d){var e=Array.prototype.slice.call(c,1),f=d[a];f.apply(d,e),b.resolve(d)}),m(b.promise,this[f.restangularFields.restangularCollection])}function o(a){var b=d.defer();return this.then(function(c){b.resolve(c[a])}),m(b.promise,this[f.restangularFields.restangularCollection])}function p(a,b,c){return f.fullResponse?a.resolve(_.extend(b,{data:c})):void a.resolve(c)}function q(a){return _.isArray(a)?_.without(a,_.values(_.omit(f.restangularFields,"id"))):_.omit(a,_.values(_.omit(f.restangularFields,"id")))}function r(a){a.customOperation=_.bind(J,a),_.each(["put","post","get","delete"],function(b){_.each(["do","custom"],function(c){var d,e="delete"===b?"remove":b,f=c+b.toUpperCase();d="put"!==e&&"post"!==e?J:function(a,b,c,d,e){return _.bind(J,this)(a,c,d,e,b)},a[f]=_.bind(d,a,e)})}),a.customGETLIST=_.bind(y,a),a.doGETLIST=a.customGETLIST}function s(a){var b=angular.copy(a);return t(b[f.restangularFields.parentResource],b,b[f.restangularFields.route])}function t(a,b,c,d,e){var h=f.onBeforeElemRestangularized(b,!1,c),i=g(a,h,c,e);return f.useCannonicalId&&(i[f.restangularFields.cannonicalId]=f.getIdFromElem(i)),d&&(i[f.restangularFields.getParentList]=function(){return d}),i[f.restangularFields.restangularCollection]=!1,i[f.restangularFields.get]=_.bind(B,i),i[f.restangularFields.getList]=_.bind(y,i),i[f.restangularFields.put]=_.bind(D,i),i[f.restangularFields.post]=_.bind(E,i),i[f.restangularFields.remove]=_.bind(C,i),i[f.restangularFields.head]=_.bind(F,i),i[f.restangularFields.trace]=_.bind(G,i),i[f.restangularFields.options]=_.bind(H,i),i[f.restangularFields.patch]=_.bind(I,i),r(i),f.transformElem(i,!1,c,M)}function u(a,b,c,d){var e=f.onBeforeElemRestangularized(b,!0,c),h=g(a,e,c,d);return h[f.restangularFields.restangularCollection]=!0,h[f.restangularFields.post]=_.bind(E,h,null),h[f.restangularFields.head]=_.bind(F,h),h[f.restangularFields.trace]=_.bind(G,h),h[f.restangularFields.putElement]=_.bind(w,h),h[f.restangularFields.options]=_.bind(H,h),h[f.restangularFields.patch]=_.bind(I,h),h[f.restangularFields.get]=_.bind(v,h),h[f.restangularFields.getList]=_.bind(y,h,null),r(h),f.transformElem(h,!0,c,M)}function v(a,b,c){return this.customGET(a.toString(),b,c)}function w(a,b,c){var e=this,f=this[a],g=d.defer();return f.put(b,c).then(function(b){var c=s(e);c[a]=b,g.resolve(c)},function(a){g.reject(a)}),m(g.promise,!0)}function x(a,b,c,d,e,g){var h=f.responseExtractor(a,b,c,d,e,g),i=e.headers("ETag");return h&&i&&(h[f.restangularFields.etag]=i),h}function y(a,b,e){var g=this,h=d.defer(),i="getList",j=N.fetchUrl(this,a),k=a||g[f.restangularFields.route],l=f.fullRequestInterceptor(null,i,k,j,e||{},b||{},this[f.restangularFields.httpConfig]||{});return N.resource(this,c,l.httpConfig,l.headers,l.params,a,this[f.restangularFields.etag],i).getList().then(function(b){var c=b.data,d=b.config.params,e=x(c,i,k,j,b,h),l=_.map(e,function(b){return g[f.restangularFields.restangularCollection]?t(g[f.restangularFields.parentResource],b,g[f.restangularFields.route],e):t(g,b,a,e)});l=_.extend(e,l),g[f.restangularFields.restangularCollection]?p(h,b,u(g[f.restangularFields.parentResource],l,g[f.restangularFields.route],d)):p(h,b,u(g,l,a,d))},function(a){f.errorInterceptor(a)!==!1&&h.reject(a)}),m(h.promise,!0)}function z(a){return this[f.restangularFields.httpConfig]=a,this}function A(a,b,e,g,h){var i=this,j=d.defer(),k=e||{},l=b||this[f.restangularFields.route],n=N.fetchUrl(this,b),o=g||this,r=o[f.restangularFields.etag];_.isObject(o)&&(o=q(o));var s=f.fullRequestInterceptor(o,a,l,n,h||{},k||{},this[f.restangularFields.httpConfig]||{}),u=function(c){var d=c.data,e=c.config.params,g=x(d,a,l,n,c,j);g?"post"!==a||i[f.restangularFields.restangularCollection]?p(j,c,t(i[f.restangularFields.parentResource],g,i[f.restangularFields.route],e)):p(j,c,t(i,g,b,e)):p(j,c,void 0)},v=function(a){f.errorInterceptor(a)!==!1&&j.reject(a)},w=a,y=_.extend({},s.headers),z=f.isOverridenMethod(a);return z&&(w="post",y=_.extend(y,{"X-HTTP-Method-Override":"remove"===a?"DELETE":a})),f.isSafe(a)?z?N.resource(this,c,s.httpConfig,y,s.params,b,r,w)[w]({}).then(u,v):N.resource(this,c,s.httpConfig,y,s.params,b,r,w)[w]().then(u,v):N.resource(this,c,s.httpConfig,y,s.params,b,r,w)[w](s.element).then(u,v),m(j.promise)}function B(a,b){return _.bind(A,this)("get",void 0,a,void 0,b)}function C(a,b){return _.bind(A,this)("remove",void 0,a,void 0,b)}function D(a,b){return _.bind(A,this)("put",void 0,a,void 0,b)}function E(a,b,c,d){return _.bind(A,this)("post",a,c,b,d)}function F(a,b){return _.bind(A,this)("head",void 0,a,void 0,b)}function G(a,b){return _.bind(A,this)("trace",void 0,a,void 0,b)}function H(a,b){return _.bind(A,this)("options",void 0,a,void 0,b)}function I(a,b,c){return _.bind(A,this)("patch",void 0,b,a,c)}function J(a,b,c,d,e){return _.bind(A,this)(a,b,c,e,d)}function K(a,b,c,d,e,g){var h;h="getList"===b?_.bind(y,this,c):_.bind(J,this,b,c);var i=function(a,b,c){var f=_.defaults({params:a,headers:b,elem:c},{params:d,headers:e,elem:g});return h(f.params,f.headers,f.elem)};this[a]=f.isSafe(b)?i:function(a,b,c){return i(b,c,a)}}function L(c){var d=angular.copy(b);return a.init(d,d),c(d),e(d)}var M={},N=new f.urlCreatorFactory[f.urlCreator];return N.setConfig(f),a.init(M,f),M.copy=_.bind(s,M),M.withConfig=_.bind(L,M),M.one=_.bind(h,M,null),M.all=_.bind(i,M,null),M.several=_.bind(j,M,null),M.oneUrl=_.bind(k,M,null),M.allUrl=_.bind(l,M,null),M.restangularizeElement=_.bind(t,M),M.restangularizeCollection=_.bind(u,M),M}return e(b)}]})}(),function(a,b){"use strict";var c=6,d=4,e="asc",f="desc",g="_ng_field_",h="_ng_depth_",i="_ng_hidden_",j="_ng_column_",k=/CUSTOM_FILTERS/g,l=/COL_FIELD/g,m=/DISPLAY_CELL_TEMPLATE/g,n=/EDITABLE_CELL_TEMPLATE/g,o=/CELL_EDITABLE_CONDITION/g,p=/<.+>/;a.ngGrid={},a.ngGrid.i18n={};var q=(angular.module("ngGrid.services",[]),angular.module("ngGrid.directives",[])),r=angular.module("ngGrid.filters",[]);angular.module("ngGrid",["ngGrid.services","ngGrid.directives","ngGrid.filters"]);var s=function(a,b,d,e){if(void 0===a.selectionProvider.selectedItems)return!0;var f,g=d.which||d.keyCode,h=!1,i=!1,j=void 0===a.selectionProvider.lastClickedRow?1:a.selectionProvider.lastClickedRow.rowIndex,k=a.columns.filter(function(a){return a.visible}),l=a.columns.filter(function(a){return a.pinned});if(a.col&&(f=k.indexOf(a.col)),37!==g&&38!==g&&39!==g&&40!==g&&(e.config.noTabInterference||9!==g)&&13!==g)return!0;if(a.enableCellSelection){9===g&&d.preventDefault();var m=a.showSelectionCheckbox?1===a.col.index:0===a.col.index,n=1===a.$index||0===a.$index,o=a.$index===a.renderedColumns.length-1||a.$index===a.renderedColumns.length-2,p=k.indexOf(a.col)===k.length-1,q=l.indexOf(a.col)===l.length-1;if(37===g||9===g&&d.shiftKey){var r=0;m||(f-=1),n?m&&9===g&&d.shiftKey?(r=e.$canvas.width(),f=k.length-1,i=!0):r=e.$viewport.scrollLeft()-a.col.width:l.length>0&&(r=e.$viewport.scrollLeft()-k[f].width),e.$viewport.scrollLeft(r)}else(39===g||9===g&&!d.shiftKey)&&(o?p&&9===g&&!d.shiftKey?(e.$viewport.scrollLeft(0),f=a.showSelectionCheckbox?1:0,h=!0):e.$viewport.scrollLeft(e.$viewport.scrollLeft()+a.col.width):q&&e.$viewport.scrollLeft(0),p||(f+=1))}var s;s=a.configGroups.length>0?e.rowFactory.parsedData.filter(function(a){return!a.isAggRow}):e.filteredRows;var t=0;if(0!==j&&(38===g||13===g&&d.shiftKey||9===g&&d.shiftKey&&i)?t=-1:j!==s.length-1&&(40===g||13===g&&!d.shiftKey||9===g&&h)&&(t=1),t){var u=s[j+t];u.beforeSelectionChange(u,d)&&(u.continueSelection(d),a.$emit("ngGridEventDigestGridParent"),a.selectionProvider.lastClickedRow.renderedRowIndex>=a.renderedRows.length-c-2?e.$viewport.scrollTop(e.$viewport.scrollTop()+a.rowHeight):a.selectionProvider.lastClickedRow.renderedRowIndex<=c+2&&e.$viewport.scrollTop(e.$viewport.scrollTop()-a.rowHeight))}return a.enableCellSelection&&setTimeout(function(){a.domAccessProvider.focusCellElement(a,a.renderedColumns.indexOf(k[f]))},3),!1};String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}),Array.prototype.indexOf||(Array.prototype.indexOf=function(a){var b=this.length>>>0,c=Number(arguments[1])||0;for(c=0>c?Math.ceil(c):Math.floor(c),0>c&&(c+=b);b>c;c++)if(c in this&&this[c]===a)return c;return-1}),Array.prototype.filter||(Array.prototype.filter=function(a){var b=Object(this),c=b.length>>>0;if("function"!=typeof a)throw new TypeError;for(var d=[],e=arguments[1],f=0;c>f;f++)if(f in b){var g=b[f];a.call(e,g,f,b)&&d.push(g)}return d}),r.filter("checkmark",function(){return function(a){return a?"✔":"✘"}}),r.filter("ngColumns",function(){return function(a){return a.filter(function(a){return!a.isAggCol})}}),angular.module("ngGrid.services").factory("$domUtilityService",["$utilityService","$window",function(a,c){var d={},e={},f=function(){var a=b("<div></div>");a.appendTo("body"),a.height(100).width(100).css("position","absolute").css("overflow","scroll"),a.append('<div style="height: 400px; width: 400px;"></div>'),d.ScrollH=a.height()-a[0].clientHeight,d.ScrollW=a.width()-a[0].clientWidth,a.empty(),a.attr("style",""),a.append('<span style="font-family: Verdana, Helvetica, Sans-Serif; font-size: 14px;"><strong>M</strong></span>'),d.LetterW=a.children().first().width(),a.remove()};return d.eventStorage={},d.AssignGridContainers=function(a,c,e){e.$root=b(c),e.$topPanel=e.$root.find(".ngTopPanel"),e.$groupPanel=e.$root.find(".ngGroupPanel"),e.$headerContainer=e.$topPanel.find(".ngHeaderContainer"),a.$headerContainer=e.$headerContainer,e.$headerScroller=e.$topPanel.find(".ngHeaderScroller"),e.$headers=e.$headerScroller.children(),e.$viewport=e.$root.find(".ngViewport"),e.$canvas=e.$viewport.find(".ngCanvas"),e.$footerPanel=e.$root.find(".ngFooterPanel");var f=a.$watch(function(){return e.$viewport.scrollLeft()},function(a){return e.$headerContainer.scrollLeft(a)});a.$on("$destroy",function(){b(e.$root.parent()).off("resize.nggrid"),e.$root=null,e.$topPanel=null,e.$headerContainer=null,e.$headers=null,e.$canvas=null,e.$footerPanel=null,f()}),d.UpdateGridLayout(a,e)},d.getRealWidth=function(a){var c=0,d={visibility:"hidden",display:"block"},e=a.parents().andSelf().not(":visible");return b.swap(e[0],d,function(){c=a.outerWidth()}),c},d.UpdateGridLayout=function(a,b){if(b.$root){var c=b.$viewport.scrollTop();b.elementDims.rootMaxW=b.$root.width(),b.$root.is(":hidden")&&(b.elementDims.rootMaxW=d.getRealWidth(b.$root)),b.elementDims.rootMaxH=b.$root.height(),b.refreshDomSizes(),a.adjustScrollTop(c,!0)}},d.numberOfGrids=0,d.setStyleText=function(a,b){var d=a.styleSheet,e=a.gridId,f=c.document;d||(d=f.getElementById(e)),d||(d=f.createElement("style"),d.type="text/css",d.id=e,(f.head||f.getElementsByTagName("head")[0]).appendChild(d)),d.styleSheet&&!d.sheet?d.styleSheet.cssText=b:d.innerHTML=b,a.styleSheet=d,a.styleText=b},d.BuildStyles=function(a,b,c){var e,f=b.config.rowHeight,g=b.gridId,h=a.columns,i=0,j=a.totalRowWidth();e="."+g+" .ngCanvas { width: "+j+"px; }."+g+" .ngRow { width: "+j+"px; }."+g+" .ngCanvas { width: "+j+"px; }."+g+" .ngHeaderScroller { width: "+(j+d.ScrollH)+"px}";for(var k=0;k<h.length;k++){var l=h[k];l.visible!==!1&&(e+="."+g+" .col"+k+" { width: "+l.width+"px; left: "+i+"px; height: "+f+"px }."+g+" .colt"+k+" { width: "+l.width+"px; }",i+=l.width)}d.setStyleText(b,e),a.adjustScrollLeft(b.$viewport.scrollLeft()),c&&d.digest(a)},d.setColLeft=function(a,b,c){if(c.styleText){var f=e[a.index];f||(f=e[a.index]=new RegExp(".col"+a.index+" { width: [0-9]+px; left: [0-9]+px"));var g=c.styleText.replace(f,".col"+a.index+" { width: "+a.width+"px; left: "+b+"px");d.setStyleText(c,g)}},d.setColLeft.immediate=1,d.RebuildGrid=function(a,b){d.UpdateGridLayout(a,b),(null==b.config.maintainColumnRatios||b.config.maintainColumnRatios)&&b.configureColumnWidths(),a.adjustScrollLeft(b.$viewport.scrollLeft()),d.BuildStyles(a,b,!0)},d.digest=function(a){a.$root.$$phase||a.$digest()},d.ScrollH=17,d.ScrollW=17,d.LetterW=10,f(),d}]),angular.module("ngGrid.services").factory("$sortService",["$parse",function(a){var b={};return b.colSortFnCache={},b.isCustomSort=!1,b.guessSortFn=function(a){var c=typeof a;switch(c){case"number":return b.sortNumber;case"boolean":return b.sortBool;case"string":return a.match(/^[-+]?[£$¤]?[\d,.]+%?$/)?b.sortNumberStr:b.sortAlpha;default:return"[object Date]"===Object.prototype.toString.call(a)?b.sortDate:b.basicSort}},b.basicSort=function(a,b){return a===b?0:b>a?-1:1},b.sortNumber=function(a,b){return a-b},b.sortNumberStr=function(a,b){var c,d,e=!1,f=!1;return c=parseFloat(a.replace(/[^0-9.-]/g,"")),isNaN(c)&&(e=!0),d=parseFloat(b.replace(/[^0-9.-]/g,"")),isNaN(d)&&(f=!0),e&&f?0:e?1:f?-1:c-d},b.sortAlpha=function(a,b){var c=a.toLowerCase(),d=b.toLowerCase();return c===d?0:d>c?-1:1},b.sortDate=function(a,b){var c=a.getTime(),d=b.getTime();return c===d?0:d>c?-1:1},b.sortBool=function(a,b){return a&&b?0:a||b?a?1:-1:0},b.sortData=function(c,d){if(d&&c){var f,g,h=c.fields.length,i=c.fields,j=d.slice(0);d.sort(function(d,k){for(var l,m,n=0,o=0;0===n&&h>o;){f=c.columns[o],g=c.directions[o],m=b.getSortFn(f,j);var p=a(i[o])(d),q=a(i[o])(k);b.isCustomSort?(l=m(p,q),n=g===e?l:0-l):!p&&0!==p||!q&&0!==q?q||p?p?q||(n=-1):n=1:n=0:(l=m(p,q),n=g===e?l:0-l),o++}return n})}},b.Sort=function(a,c){b.isSorting||(b.isSorting=!0,b.sortData(a,c),b.isSorting=!1)},b.getSortFn=function(c,d){var e,f;if(b.colSortFnCache[c.field])e=b.colSortFnCache[c.field];else if(void 0!==c.sortingAlgorithm)e=c.sortingAlgorithm,b.colSortFnCache[c.field]=c.sortingAlgorithm,b.isCustomSort=!0;else{if(f=d[0],!f)return e;e=b.guessSortFn(a(c.field)(f)),e?b.colSortFnCache[c.field]=e:e=b.sortAlpha}return e},b}]),angular.module("ngGrid.services").factory("$utilityService",["$parse",function(c){var d=/function (.{1,})\(/,e={visualLength:function(a){var c=document.getElementById("testDataLength");c||(c=document.createElement("SPAN"),c.id="testDataLength",c.style.visibility="hidden",document.body.appendChild(c));var d=b(a);b(c).css({font:d.css("font"),"font-size":d.css("font-size"),"font-family":d.css("font-family")}),c.innerHTML=d.text();var e=c.offsetWidth;return document.body.removeChild(c),e},forIn:function(a,b){for(var c in a)a.hasOwnProperty(c)&&b(a[c],c)},evalProperty:function(a,b){return c("entity."+b)({entity:a})},endsWith:function(a,b){return a&&b&&"string"==typeof a?-1!==a.indexOf(b,a.length-b.length):!1},isNullOrUndefined:function(a){return void 0===a||null===a?!0:!1},getElementsByClassName:function(a){if(document.getElementsByClassName)return document.getElementsByClassName(a);for(var b=[],c=new RegExp("\\b"+a+"\\b"),d=document.getElementsByTagName("*"),e=0;e<d.length;e++){var f=d[e].className;c.test(f)&&b.push(d[e])}return b},newId:function(){var a=(new Date).getTime();return function(){return a+=1}}(),seti18n:function(b,c){var d=a.ngGrid.i18n[c];for(var e in d)b.i18n[e]=d[e]},getInstanceType:function(a){var b=d.exec(a.constructor.toString());if(b&&b.length>1){var c=b[1].replace(/^\s+|\s+$/g,"");return c}return""}};return e}]);var t=function(a,b,c,d){this.rowIndex=0,this.offsetTop=this.rowIndex*c,this.entity=a,this.label=a.gLabel,this.field=a.gField,this.depth=a.gDepth,this.parent=a.parent,this.children=a.children,this.aggChildren=a.aggChildren,this.aggIndex=a.aggIndex,this.collapsed=d,this.groupInitState=d,this.rowFactory=b,this.rowHeight=c,this.isAggRow=!0,this.offsetLeft=25*a.gDepth,this.aggLabelFilter=a.aggLabelFilter};t.prototype.toggleExpand=function(){this.collapsed=this.collapsed?!1:!0,this.orig&&(this.orig.collapsed=this.collapsed),this.notifyChildren()},t.prototype.setExpand=function(a){this.collapsed=a,this.notifyChildren()},t.prototype.notifyChildren=function(){for(var a=Math.max(this.rowFactory.aggCache.length,this.children.length),b=0;a>b;b++)if(this.aggChildren[b]&&(this.aggChildren[b].entity[i]=this.collapsed,this.collapsed&&this.aggChildren[b].setExpand(this.collapsed)),this.children[b]&&(this.children[b][i]=this.collapsed),b>this.aggIndex&&this.rowFactory.aggCache[b]){var c=this.rowFactory.aggCache[b],d=30*this.children.length;c.offsetTop=this.collapsed?c.offsetTop-d:c.offsetTop+d}this.rowFactory.renderedChange()},t.prototype.aggClass=function(){return this.collapsed?"ngAggArrowCollapsed":"ngAggArrowExpanded"},t.prototype.totalChildren=function(){if(this.aggChildren.length>0){var a=0,b=function(c){c.aggChildren.length>0?angular.forEach(c.aggChildren,function(a){b(a)}):a+=c.children.length};return b(this),a}return this.children.length},t.prototype.copy=function(){var a=new t(this.entity,this.rowFactory,this.rowHeight,this.groupInitState);return a.orig=this,a};var u=function(a,c,d,g,h,i){var j=this,l=a.colDef,m=500,n=0,o=null;j.colDef=a.colDef,j.width=l.width,j.groupIndex=0,j.isGroupedBy=!1,j.minWidth=l.minWidth?l.minWidth:50,j.maxWidth=l.maxWidth?l.maxWidth:9e3,j.enableCellEdit=void 0!==l.enableCellEdit?l.enableCellEdit:a.enableCellEdit||a.enableCellEditOnFocus,j.cellEditableCondition=l.cellEditableCondition||a.cellEditableCondition||"true",j.headerRowHeight=a.headerRowHeight,j.displayName=void 0===l.displayName?l.field:l.displayName,j.index=a.index,j.isAggCol=a.isAggCol,j.cellClass=l.cellClass,j.sortPriority=void 0,j.cellFilter=l.cellFilter?l.cellFilter:"",j.field=l.field,j.aggLabelFilter=l.aggLabelFilter||l.cellFilter,j.visible=i.isNullOrUndefined(l.visible)||l.visible,j.sortable=!1,j.resizable=!1,j.pinnable=!1,j.pinned=a.enablePinning&&l.pinned,j.originalIndex=null==a.originalIndex?j.index:a.originalIndex,j.groupable=i.isNullOrUndefined(l.groupable)||l.groupable,a.enableSort&&(j.sortable=i.isNullOrUndefined(l.sortable)||l.sortable),a.enableResize&&(j.resizable=i.isNullOrUndefined(l.resizable)||l.resizable),a.enablePinning&&(j.pinnable=i.isNullOrUndefined(l.pinnable)||l.pinnable),j.sortDirection=void 0,j.sortingAlgorithm=l.sortFn,j.headerClass=l.headerClass,j.cursor=j.sortable?"pointer":"default",j.headerCellTemplate=l.headerCellTemplate||h.get("headerCellTemplate.html"),j.cellTemplate=l.cellTemplate||h.get("cellTemplate.html").replace(k,j.cellFilter?"|"+j.cellFilter:""),j.enableCellEdit&&(j.cellEditTemplate=l.cellEditTemplate||h.get("cellEditTemplate.html"),j.editableCellTemplate=l.editableCellTemplate||h.get("editableCellTemplate.html")),l.cellTemplate&&!p.test(l.cellTemplate)&&(j.cellTemplate=h.get(l.cellTemplate)||b.ajax({type:"GET",url:l.cellTemplate,async:!1}).responseText),j.enableCellEdit&&l.editableCellTemplate&&!p.test(l.editableCellTemplate)&&(j.editableCellTemplate=h.get(l.editableCellTemplate)||b.ajax({type:"GET",url:l.editableCellTemplate,async:!1}).responseText),l.headerCellTemplate&&!p.test(l.headerCellTemplate)&&(j.headerCellTemplate=h.get(l.headerCellTemplate)||b.ajax({type:"GET",url:l.headerCellTemplate,async:!1}).responseText),j.colIndex=function(){var a=j.pinned?"pinned ":"";return a+="col"+j.index+" colt"+j.index,j.cellClass&&(a+=" "+j.cellClass),a},j.groupedByClass=function(){return j.isGroupedBy?"ngGroupedByIcon":"ngGroupIcon"},j.toggleVisible=function(){j.visible=!j.visible},j.showSortButtonUp=function(){return j.sortable?j.sortDirection===f:j.sortable},j.showSortButtonDown=function(){return j.sortable?j.sortDirection===e:j.sortable},j.noSortVisible=function(){return!j.sortDirection},j.sort=function(b){if(!j.sortable)return!0;var c=j.sortDirection===e?f:e;return j.sortDirection=c,a.sortCallback(j,b),!1},j.gripClick=function(){n++,1===n?o=setTimeout(function(){n=0},m):(clearTimeout(o),a.resizeOnDataCallback(j),n=0)},j.gripOnMouseDown=function(a){return c.isColumnResizing=!0,a.ctrlKey&&!j.pinned?(j.toggleVisible(),g.BuildStyles(c,d),!0):(a.target.parentElement.style.cursor="col-resize",j.startMousePosition=a.clientX,j.origWidth=j.width,b(document).mousemove(j.onMouseMove),b(document).mouseup(j.gripOnMouseUp),!1)},j.onMouseMove=function(a){var b=a.clientX-j.startMousePosition,e=b+j.origWidth;return j.width=e<j.minWidth?j.minWidth:e>j.maxWidth?j.maxWidth:e,c.hasUserChangedGridColumnWidths=!0,g.BuildStyles(c,d),!1},j.gripOnMouseUp=function(a){return b(document).off("mousemove",j.onMouseMove),b(document).off("mouseup",j.gripOnMouseUp),a.target.parentElement.style.cursor="default",g.digest(c),c.isColumnResizing=!1,!1},j.copy=function(){var b=new u(a,c,d,g,h,i);return b.isClone=!0,b.orig=j,b},j.setVars=function(a){j.orig=a,j.width=a.width,j.groupIndex=a.groupIndex,j.isGroupedBy=a.isGroupedBy,j.displayName=a.displayName,j.index=a.index,j.isAggCol=a.isAggCol,j.cellClass=a.cellClass,j.cellFilter=a.cellFilter,j.field=a.field,j.aggLabelFilter=a.aggLabelFilter,j.visible=a.visible,j.sortable=a.sortable,j.resizable=a.resizable,j.pinnable=a.pinnable,j.pinned=a.pinned,j.originalIndex=a.originalIndex,j.sortDirection=a.sortDirection,j.sortingAlgorithm=a.sortingAlgorithm,j.headerClass=a.headerClass,j.headerCellTemplate=a.headerCellTemplate,j.cellTemplate=a.cellTemplate,j.cellEditTemplate=a.cellEditTemplate}},v=function(a){this.outerHeight=null,this.outerWidth=null,b.extend(this,a)},w=function(a){this.previousColumn=null,this.grid=a};w.prototype.changeUserSelect=function(a,b){a.css({"-webkit-touch-callout":b,"-webkit-user-select":b,"-khtml-user-select":b,"-moz-user-select":"none"===b?"-moz-none":b,"-ms-user-select":b,"user-select":b})},w.prototype.focusCellElement=function(a,b){if(a.selectionProvider.lastClickedRow){var c=void 0!==b?b:this.previousColumn,d=a.selectionProvider.lastClickedRow.clone?a.selectionProvider.lastClickedRow.clone.elm:a.selectionProvider.lastClickedRow.elm;if(void 0!==c&&d){var e=angular.element(d[0].children).filter(function(){return 8!==this.nodeType}),f=Math.max(Math.min(a.renderedColumns.length-1,c),0);this.grid.config.showSelectionCheckbox&&angular.element(e[f]).scope()&&0===angular.element(e[f]).scope().col.index&&(f=1),e[f]&&e[f].children[1].children[0].focus(),this.previousColumn=c}}},w.prototype.selectionHandlers=function(a,b){function c(c){if(16===c.keyCode)return f.changeUserSelect(b,"none",c),!0;if(!e){e=!0;var d=s(a,b,c,f.grid);return e=!1,d}return!0}function d(a){return 16===a.keyCode&&f.changeUserSelect(b,"text",a),!0}var e=!1,f=this;b.bind("keydown",c),b.bind("keyup",d),b.on("$destroy",function(){b.off("keydown",c),b.off("keyup",d)})};var x=function(c,d,e,f){var g=this;g.colToMove=void 0,g.groupToMove=void 0,g.assignEvents=function(){c.config.jqueryUIDraggable&&!c.config.enablePinning?(c.$groupPanel.droppable({addClasses:!1,drop:function(a){g.onGroupDrop(a)}}),c.$groupPanel.on("$destroy",function(){c.$groupPanel=null})):(c.$groupPanel.on("mousedown",g.onGroupMouseDown).on("dragover",g.dragOver).on("drop",g.onGroupDrop),c.$topPanel.on("mousedown",".ngHeaderScroller",g.onHeaderMouseDown).on("dragover",".ngHeaderScroller",g.dragOver),c.$groupPanel.on("$destroy",function(){c.$groupPanel&&c.$groupPanel.off("mousedown"),c.$groupPanel=null
+}),c.config.enableColumnReordering&&c.$topPanel.on("drop",".ngHeaderScroller",g.onHeaderDrop),c.$topPanel.on("$destroy",function(){c.$topPanel&&c.$topPanel.off("mousedown"),c.config.enableColumnReordering&&c.$topPanel&&c.$topPanel.off("drop"),c.$topPanel=null})),d.$on("$destroy",d.$watch("renderedColumns",function(){f(g.setDraggables)}))},g.dragStart=function(a){a.dataTransfer.setData("text","")},g.dragOver=function(a){a.preventDefault()},g.setDraggables=function(){if(c.config.jqueryUIDraggable)c.$root&&c.$root.find(".ngHeaderSortColumn").draggable({helper:"clone",appendTo:"body",stack:"div",addClasses:!1,start:function(a){g.onHeaderMouseDown(a)}}).droppable({drop:function(a){g.onHeaderDrop(a)}});else{var a=c.$root.find(".ngHeaderSortColumn");if(angular.forEach(a,function(a){a.className&&-1!==a.className.indexOf("ngHeaderSortColumn")&&(a.setAttribute("draggable","true"),a.addEventListener&&(a.addEventListener("dragstart",g.dragStart),angular.element(a).on("$destroy",function(){angular.element(a).off("dragstart",g.dragStart),a.removeEventListener("dragstart",g.dragStart)})))}),-1!==navigator.userAgent.indexOf("MSIE")){var b=c.$root.find(".ngHeaderSortColumn");b.bind("selectstart",function(){return this.dragDrop(),!1}),angular.element(b).on("$destroy",function(){b.off("selectstart")})}}},g.onGroupMouseDown=function(a){var d=b(a.target);if("ngRemoveGroup"!==d[0].className){var e=angular.element(d).scope();e&&(c.config.jqueryUIDraggable||(d.attr("draggable","true"),this.addEventListener&&(this.addEventListener("dragstart",g.dragStart),angular.element(this).on("$destroy",function(){this.removeEventListener("dragstart",g.dragStart)})),-1!==navigator.userAgent.indexOf("MSIE")&&(d.bind("selectstart",function(){return this.dragDrop(),!1}),d.on("$destroy",function(){d.off("selectstart")}))),g.groupToMove={header:d,groupName:e.group,index:e.$index})}else g.groupToMove=void 0},g.onGroupDrop=function(a){a.stopPropagation();var e,f;g.groupToMove?(e=b(a.target).closest(".ngGroupElement"),"ngGroupPanel"===e.context.className?(d.configGroups.splice(g.groupToMove.index,1),d.configGroups.push(g.groupToMove.groupName)):(f=angular.element(e).scope(),f&&g.groupToMove.index!==f.$index&&(d.configGroups.splice(g.groupToMove.index,1),d.configGroups.splice(f.$index,0,g.groupToMove.groupName))),g.groupToMove=void 0,c.fixGroupIndexes()):g.colToMove&&(-1===d.configGroups.indexOf(g.colToMove.col)&&(e=b(a.target).closest(".ngGroupElement"),"ngGroupPanel"===e.context.className||"ngGroupPanelDescription ng-binding"===e.context.className?d.groupBy(g.colToMove.col):(f=angular.element(e).scope(),f&&d.removeGroup(f.$index))),g.colToMove=void 0),d.$$phase||d.$apply()},g.onHeaderMouseDown=function(a){var c=b(a.target).closest(".ngHeaderSortColumn"),d=angular.element(c).scope();d&&(g.colToMove={header:c,col:d.col})},g.onHeaderDrop=function(a){if(g.colToMove&&!g.colToMove.col.pinned){var f=b(a.target).closest(".ngHeaderSortColumn"),h=angular.element(f).scope();if(h){if(g.colToMove.col===h.col||h.col.pinned)return;d.columns.splice(g.colToMove.col.index,1),d.columns.splice(h.col.index,0,g.colToMove.col),c.fixColumnIndexes(),g.colToMove=void 0,e.digest(d)}}},g.assignGridEventHandlers=function(){-1===c.config.tabIndex?(c.$viewport.attr("tabIndex",e.numberOfGrids),e.numberOfGrids++):c.$viewport.attr("tabIndex",c.config.tabIndex);var f,g=function(){clearTimeout(f),f=setTimeout(function(){e.RebuildGrid(d,c)},100)};b(a).on("resize.nggrid",g);var h,i=function(){clearTimeout(h),h=setTimeout(function(){e.RebuildGrid(d,c)},100)};b(c.$root.parent()).on("resize.nggrid",i),d.$on("$destroy",function(){b(a).off("resize.nggrid",g)})},g.assignGridEventHandlers(),g.assignEvents()},y=function(a,b){a.maxRows=function(){var c=Math.max(a.totalServerItems,b.data.length);return c},a.$on("$destroy",a.$watch("totalServerItems",function(){a.currentMaxPages=a.maxPages()})),a.multiSelect=b.config.enableRowSelection&&b.config.multiSelect,a.selectedItemCount=b.selectedItemCount,a.maxPages=function(){return 0===a.maxRows()?1:Math.ceil(a.maxRows()/a.pagingOptions.pageSize)},a.pageForward=function(){var b=a.pagingOptions.currentPage;a.totalServerItems>0?a.pagingOptions.currentPage=Math.min(b+1,a.maxPages()):a.pagingOptions.currentPage++},a.pageBackward=function(){var b=a.pagingOptions.currentPage;a.pagingOptions.currentPage=Math.max(b-1,1)},a.pageToFirst=function(){a.pagingOptions.currentPage=1},a.pageToLast=function(){var b=a.maxPages();a.pagingOptions.currentPage=b},a.cantPageForward=function(){var c=a.pagingOptions.currentPage,d=a.maxPages();return a.totalServerItems>0?c>=d:b.data.length<1},a.cantPageToLast=function(){return a.totalServerItems>0?a.cantPageForward():!0},a.cantPageBackward=function(){var b=a.pagingOptions.currentPage;return 1>=b}},z=function(e,f,g,h,j,k,l,m,n,o,q){var r={aggregateTemplate:void 0,afterSelectionChange:function(){},beforeSelectionChange:function(){return!0},checkboxCellTemplate:void 0,checkboxHeaderTemplate:void 0,columnDefs:void 0,data:[],dataUpdated:function(){},enableCellEdit:!1,enableCellEditOnFocus:!1,enableCellSelection:!1,enableColumnResize:!1,enableColumnReordering:!1,enableColumnHeavyVirt:!1,enablePaging:!1,enablePinning:!1,enableRowSelection:!0,enableSorting:!0,enableHighlighting:!1,excludeProperties:[],filterOptions:{filterText:"",useExternalFilter:!1},footerRowHeight:55,footerTemplate:void 0,forceSyncScrolling:!0,groups:[],groupsCollapsedByDefault:!0,headerRowHeight:30,headerRowTemplate:void 0,jqueryUIDraggable:!1,jqueryUITheme:!1,keepLastSelected:!0,maintainColumnRatios:void 0,menuTemplate:void 0,multiSelect:!0,pagingOptions:{pageSizes:[250,500,1e3],pageSize:250,currentPage:1},pinSelectionCheckbox:!1,plugins:[],primaryKey:void 0,rowHeight:30,rowTemplate:void 0,selectedItems:[],selectWithCheckboxOnly:!1,showColumnMenu:!1,showFilter:!1,showFooter:!1,showGroupPanel:!1,showSelectionCheckbox:!1,sortInfo:{fields:[],columns:[],directions:[]},tabIndex:-1,totalServerItems:0,useExternalSorting:!1,i18n:"en",virtualizationThreshold:50,noTabInterference:!1},s=this;s.maxCanvasHt=0,s.config=b.extend(r,a.ngGrid.config,f),s.config.showSelectionCheckbox=s.config.showSelectionCheckbox&&s.config.enableColumnHeavyVirt===!1,s.config.enablePinning=s.config.enablePinning&&s.config.enableColumnHeavyVirt===!1,s.config.selectWithCheckboxOnly=s.config.selectWithCheckboxOnly&&s.config.showSelectionCheckbox!==!1,s.config.pinSelectionCheckbox=s.config.enablePinning,"string"==typeof f.columnDefs&&(s.config.columnDefs=e.$eval(f.columnDefs)),s.rowCache=[],s.rowMap=[],s.gridId="ng"+l.newId(),s.$root=null,s.$groupPanel=null,s.$topPanel=null,s.$headerContainer=null,s.$headerScroller=null,s.$headers=null,s.$viewport=null,s.$canvas=null,s.rootDim=s.config.gridDim,s.data=[],s.lateBindColumns=!1,s.filteredRows=[],s.initTemplates=function(){var a=["rowTemplate","aggregateTemplate","headerRowTemplate","checkboxCellTemplate","checkboxHeaderTemplate","menuTemplate","footerTemplate"],b=[];return angular.forEach(a,function(a){b.push(s.getTemplate(a))}),q.all(b)},s.getTemplate=function(a){var b=s.config[a],c=s.gridId+a+".html",d=q.defer();if(b&&!p.test(b))o.get(b,{cache:k}).success(function(a){k.put(c,a),d.resolve()}).error(function(){d.reject("Could not load template: "+b)});else if(b)k.put(c,b),d.resolve();else{var e=a+".html";k.put(c,k.get(e)),d.resolve()}return d.promise},"object"==typeof s.config.data&&(s.data=s.config.data),s.calcMaxCanvasHeight=function(){var a;return a=s.config.groups.length>0?s.rowFactory.parsedData.filter(function(a){return!a[i]}).length*s.config.rowHeight:s.filteredRows.length*s.config.rowHeight},s.elementDims={scrollW:0,scrollH:0,rowIndexCellW:25,rowSelectedCellW:25,rootMaxW:0,rootMaxH:0},s.setRenderedRows=function(a){e.renderedRows.length=a.length;for(var b=0;b<a.length;b++)!e.renderedRows[b]||a[b].isAggRow||e.renderedRows[b].isAggRow?(e.renderedRows[b]=a[b].copy(),e.renderedRows[b].collapsed=a[b].collapsed,a[b].isAggRow||e.renderedRows[b].setVars(a[b])):e.renderedRows[b].setVars(a[b]),e.renderedRows[b].rowIndex=a[b].rowIndex,e.renderedRows[b].offsetTop=a[b].offsetTop,e.renderedRows[b].selected=a[b].selected,a[b].renderedRowIndex=b;s.refreshDomSizes(),e.$emit("ngGridEventRows",a)},s.minRowsToRender=function(){var a=e.viewportDimHeight()||1;return Math.floor(a/s.config.rowHeight)},s.refreshDomSizes=function(){var a=new v;a.outerWidth=s.elementDims.rootMaxW,a.outerHeight=s.elementDims.rootMaxH,s.rootDim=a,s.maxCanvasHt=s.calcMaxCanvasHeight()},s.buildColumnDefsFromData=function(){s.config.columnDefs=[];var a=s.data[0];return a?void l.forIn(a,function(a,b){-1===s.config.excludeProperties.indexOf(b)&&s.config.columnDefs.push({field:b})}):void(s.lateBoundColumns=!0)},s.buildColumns=function(){var a=s.config.columnDefs,b=[];if(a||(s.buildColumnDefsFromData(),a=s.config.columnDefs),s.config.showSelectionCheckbox&&b.push(new u({colDef:{field:"✔",width:s.elementDims.rowSelectedCellW,sortable:!1,resizable:!1,groupable:!1,headerCellTemplate:k.get(e.gridId+"checkboxHeaderTemplate.html"),cellTemplate:k.get(e.gridId+"checkboxCellTemplate.html"),pinned:s.config.pinSelectionCheckbox},index:0,headerRowHeight:s.config.headerRowHeight,sortCallback:s.sortData,resizeOnDataCallback:s.resizeOnData,enableResize:s.config.enableColumnResize,enableSort:s.config.enableSorting,enablePinning:s.config.enablePinning},e,s,h,k,l)),a.length>0){var c=s.config.showSelectionCheckbox?1:0,d=e.configGroups.length;e.configGroups.length=0,angular.forEach(a,function(a,f){f+=c;var g=new u({colDef:a,index:f+d,originalIndex:f,headerRowHeight:s.config.headerRowHeight,sortCallback:s.sortData,resizeOnDataCallback:s.resizeOnData,enableResize:s.config.enableColumnResize,enableSort:s.config.enableSorting,enablePinning:s.config.enablePinning,enableCellEdit:s.config.enableCellEdit||s.config.enableCellEditOnFocus,cellEditableCondition:s.config.cellEditableCondition},e,s,h,k,l),i=s.config.groups.indexOf(a.field);-1!==i&&(g.isGroupedBy=!0,e.configGroups.splice(i,0,g),g.groupIndex=e.configGroups.length),b.push(g)}),e.columns=b,s.config.groups.length>0&&s.rowFactory.getGrouping(s.config.groups)}},s.configureColumnWidths=function(){var a=[],b=[],c=0,d=0,f={};if(angular.forEach(e.columns,function(a,b){if(!l.isNullOrUndefined(a.originalIndex)){var c=a.originalIndex;s.config.showSelectionCheckbox&&(0===a.originalIndex&&a.visible&&(d+=25),c--),f[c]=b}}),angular.forEach(s.config.columnDefs,function(g,h){var i=e.columns[f[h]];g.index=h;var j,k=!1;if(l.isNullOrUndefined(g.width)?g.width="*":(k=isNaN(g.width)?l.endsWith(g.width,"%"):!1,j=k?g.width:parseInt(g.width,10)),isNaN(j)&&!e.hasUserChangedGridColumnWidths){if(j=g.width,"auto"===j){i.width=i.minWidth,d+=i.width;var m=i;return void e.$on("$destroy",e.$on("ngGridEventData",function(){s.resizeOnData(m)}))}if(-1!==j.indexOf("*"))return i.visible!==!1&&(c+=j.length),void a.push(g);if(k)return void b.push(g);throw'unable to parse column width, use percentage ("10%","20%", etc...) or "*" to use remaining width of grid'}i.visible!==!1&&(d+=i.width=parseInt(i.width,10))}),b.length>0){s.config.maintainColumnRatios=s.config.maintainColumnRatios!==!1;var g=0,i=0;angular.forEach(b,function(a){var b=e.columns[f[a.index]],c=parseFloat(a.width)/100;g+=c,b.visible||(i+=c)});var j=g-i;angular.forEach(b,function(a){var b=e.columns[f[a.index]],c=parseFloat(a.width)/100;c/=i>0?j:g;var h=s.rootDim.outerWidth*g;b.width=h*c,d+=b.width})}if(a.length>0){s.config.maintainColumnRatios=s.config.maintainColumnRatios!==!1;var k=s.rootDim.outerWidth-d;s.maxCanvasHt>e.viewportDimHeight()&&(k-=h.ScrollW);var m=Math.floor(k/c);angular.forEach(a,function(b,c){var g=e.columns[f[b.index]];g.width=m*b.width.length,g.visible!==!1&&(d+=g.width);var i=c===a.length-1;if(i&&d<s.rootDim.outerWidth){var j=s.rootDim.outerWidth-d;s.maxCanvasHt>e.viewportDimHeight()&&(j-=h.ScrollW),g.width+=j}})}},s.init=function(){return s.initTemplates().then(function(){e.selectionProvider=new E(s,e,n),e.domAccessProvider=new w(s),s.rowFactory=new C(s,e,h,k,l),s.searchProvider=new D(e,s,j),s.styleProvider=new F(e,s),e.$on("$destroy",e.$watch("configGroups",function(a){var b=[];angular.forEach(a,function(a){b.push(a.field||a)}),s.config.groups=b,s.rowFactory.filteredRowsChanged(),e.$emit("ngGridEventGroups",a)},!0)),e.$on("$destroy",e.$watch("columns",function(a){e.isColumnResizing||h.RebuildGrid(e,s),e.$emit("ngGridEventColumns",a)},!0)),e.$on("$destroy",e.$watch(function(){return f.i18n},function(a){l.seti18n(e,a)})),s.maxCanvasHt=s.calcMaxCanvasHeight(),s.config.sortInfo.fields&&s.config.sortInfo.fields.length>0&&e.$on("$destroy",e.$watch(function(){return s.config.sortInfo},function(){g.isSorting||(s.sortColumnsInit(),e.$emit("ngGridEventSorted",s.config.sortInfo))},!0))})},s.resizeOnData=function(a){var c=a.minWidth,d=l.getElementsByClassName("col"+a.index);angular.forEach(d,function(a,d){var e;if(0===d){var f=b(a).find(".ngHeaderText");e=l.visualLength(f)+10}else{var g=b(a).find(".ngCellText");e=l.visualLength(g)+10}e>c&&(c=e)}),a.width=a.longest=Math.min(a.maxWidth,c+7),h.BuildStyles(e,s,!0)},s.lastSortedColumns=[],s.sortData=function(a,c){if(c&&c.shiftKey&&s.config.sortInfo){var d=s.config.sortInfo.columns.indexOf(a);-1===d?(1===s.config.sortInfo.columns.length&&(s.config.sortInfo.columns[0].sortPriority=1),s.config.sortInfo.columns.push(a),a.sortPriority=s.config.sortInfo.columns.length,s.config.sortInfo.fields.push(a.field),s.config.sortInfo.directions.push(a.sortDirection),s.lastSortedColumns.push(a)):s.config.sortInfo.directions[d]=a.sortDirection}else if(!s.config.useExternalSorting||s.config.useExternalSorting&&s.config.sortInfo){var f=b.isArray(a);s.config.sortInfo.columns.length=0,s.config.sortInfo.fields.length=0,s.config.sortInfo.directions.length=0;var g=function(a){s.config.sortInfo.columns.push(a),s.config.sortInfo.fields.push(a.field),s.config.sortInfo.directions.push(a.sortDirection),s.lastSortedColumns.push(a)};f?angular.forEach(a,function(a,b){a.sortPriority=b+1,g(a)}):(s.clearSortingData(a),a.sortPriority=void 0,g(a)),s.sortActual(),s.searchProvider.evalFilter(),e.$emit("ngGridEventSorted",s.config.sortInfo)}},s.sortColumnsInit=function(){s.config.sortInfo.columns?s.config.sortInfo.columns.length=0:s.config.sortInfo.columns=[];var a=[];angular.forEach(e.columns,function(b){var c=s.config.sortInfo.fields.indexOf(b.field);-1!==c&&(b.sortDirection=s.config.sortInfo.directions[c]||"asc",a[c]=b)}),s.sortData(1===a.length?a[0]:a)},s.sortActual=function(){if(!s.config.useExternalSorting){var a=s.data.slice(0);angular.forEach(a,function(a,b){var c=s.rowMap[b];if(void 0!==c){var d=s.rowCache[c];void 0!==d&&(a.preSortSelected=d.selected,a.preSortIndex=b)}}),g.Sort(s.config.sortInfo,a),angular.forEach(a,function(a,b){s.rowCache[b].entity=a,s.rowCache[b].selected=a.preSortSelected,s.rowMap[a.preSortIndex]=b,delete a.preSortSelected,delete a.preSortIndex})}},s.clearSortingData=function(a){a?(angular.forEach(s.lastSortedColumns,function(b){a.index!==b.index&&(b.sortDirection="",b.sortPriority=null)}),s.lastSortedColumns[0]=a,s.lastSortedColumns.length=1):(angular.forEach(s.lastSortedColumns,function(a){a.sortDirection="",a.sortPriority=null}),s.lastSortedColumns=[])},s.fixColumnIndexes=function(){for(var a=0;a<e.columns.length;a++)e.columns[a].index=a},s.fixGroupIndexes=function(){angular.forEach(e.configGroups,function(a,b){a.groupIndex=b+1})},e.elementsNeedMeasuring=!0,e.columns=[],e.renderedRows=[],e.renderedColumns=[],e.headerRow=null,e.rowHeight=s.config.rowHeight,e.jqueryUITheme=s.config.jqueryUITheme,e.showSelectionCheckbox=s.config.showSelectionCheckbox,e.enableCellSelection=s.config.enableCellSelection,e.enableCellEditOnFocus=s.config.enableCellEditOnFocus,e.footer=null,e.selectedItems=s.config.selectedItems,e.multiSelect=s.config.multiSelect,e.showFooter=s.config.showFooter,e.footerRowHeight=e.showFooter?s.config.footerRowHeight:0,e.showColumnMenu=s.config.showColumnMenu,e.forceSyncScrolling=s.config.forceSyncScrolling,e.showMenu=!1,e.configGroups=[],e.gridId=s.gridId,e.enablePaging=s.config.enablePaging,e.pagingOptions=s.config.pagingOptions,e.i18n={},l.seti18n(e,s.config.i18n),e.adjustScrollLeft=function(a){for(var b=0,c=0,d=e.columns.length,f=[],g=!s.config.enableColumnHeavyVirt,i=0,j=function(a){g?f.push(a):e.renderedColumns[i]?e.renderedColumns[i].setVars(a):e.renderedColumns[i]=a.copy(),i++},k=0;d>k;k++){var l=e.columns[k];if(l.visible!==!1){var m=l.width+b;if(l.pinned){j(l);var n=k>0?a+c:a;h.setColLeft(l,n,s),c+=l.width}else m>=a&&b<=a+s.rootDim.outerWidth&&j(l);b+=l.width}}g&&(e.renderedColumns=f)},s.prevScrollTop=0,s.prevScrollIndex=0,e.adjustScrollTop=function(a,b){if(s.prevScrollTop!==a||b){a>0&&s.$viewport[0].scrollHeight-a<=s.$viewport.outerHeight()&&e.$emit("ngGridEventScroll");var f,g=Math.floor(a/s.config.rowHeight);if(s.filteredRows.length>s.config.virtualizationThreshold){if(s.prevScrollTop<a&&g<s.prevScrollIndex+d)return;if(s.prevScrollTop>a&&g>s.prevScrollIndex-d)return;f=new A(Math.max(0,g-c),g+s.minRowsToRender()+c)}else{var h=e.configGroups.length>0?s.rowFactory.parsedData.length:s.filteredRows.length;f=new A(0,Math.max(h,s.minRowsToRender()+c))}s.prevScrollTop=a,s.rowFactory.UpdateViewableRange(f),s.prevScrollIndex=g}},e.toggleShowMenu=function(){e.showMenu=!e.showMenu},e.toggleSelectAll=function(a,b){e.selectionProvider.toggleSelectAll(a,!1,b)},e.totalFilteredItemsLength=function(){return s.filteredRows.length},e.showGroupPanel=function(){return s.config.showGroupPanel},e.topPanelHeight=function(){return s.config.showGroupPanel===!0?s.config.headerRowHeight+32:s.config.headerRowHeight},e.viewportDimHeight=function(){return Math.max(0,s.rootDim.outerHeight-e.topPanelHeight()-e.footerRowHeight-2)},e.groupBy=function(a){if(!(s.data.length<1)&&a.groupable&&a.field){a.sortDirection||a.sort({shiftKey:e.configGroups.length>0?!0:!1});var b=e.configGroups.indexOf(a);-1===b?(a.isGroupedBy=!0,e.configGroups.push(a),a.groupIndex=e.configGroups.length):e.removeGroup(b),s.$viewport.scrollTop(0),h.digest(e)}},e.removeGroup=function(a){var b=e.columns.filter(function(b){return b.groupIndex===a+1})[0];b.isGroupedBy=!1,b.groupIndex=0,e.columns[a].isAggCol&&(e.columns.splice(a,1),e.configGroups.splice(a,1),s.fixGroupIndexes()),0===e.configGroups.length&&(s.fixColumnIndexes(),h.digest(e)),e.adjustScrollLeft(0)},e.togglePin=function(a){for(var b=a.index,c=0,d=0;d<e.columns.length&&e.columns[d].pinned;d++)c++;a.pinned&&(c=Math.max(a.originalIndex,c-1)),a.pinned=!a.pinned,e.columns.splice(b,1),e.columns.splice(c,0,a),s.fixColumnIndexes(),h.BuildStyles(e,s,!0),s.$viewport.scrollLeft(s.$viewport.scrollLeft()-a.width)},e.totalRowWidth=function(){for(var a=0,b=e.columns,c=0;c<b.length;c++)b[c].visible!==!1&&(a+=b[c].width);return a},e.headerScrollerDim=function(){var a=e.viewportDimHeight(),b=s.maxCanvasHt,c=b>a,d=new v;return d.autoFitHeight=!0,d.outerWidth=e.totalRowWidth(),c?d.outerWidth+=s.elementDims.scrollW:b-a<=s.elementDims.scrollH&&(d.outerWidth+=s.elementDims.scrollW),d}},A=function(a,b){this.topRow=a,this.bottomRow=b},B=function(a,b,c,d,e){this.entity=a,this.config=b,this.selectionProvider=c,this.rowIndex=d,this.utils=e,this.selected=c.getSelection(a),this.cursor=this.config.enableRowSelection&&!this.config.selectWithCheckboxOnly?"pointer":"default",this.beforeSelectionChange=b.beforeSelectionChangeCallback,this.afterSelectionChange=b.afterSelectionChangeCallback,this.offsetTop=this.rowIndex*b.rowHeight,this.rowDisplayIndex=0};B.prototype.setSelection=function(a){this.selectionProvider.setSelection(this,a),this.selectionProvider.lastClickedRow=this},B.prototype.continueSelection=function(a){this.selectionProvider.ChangeSelection(this,a)},B.prototype.ensureEntity=function(a){this.entity!==a&&(this.entity=a,this.selected=this.selectionProvider.getSelection(this.entity))},B.prototype.toggleSelected=function(a){if(!this.config.enableRowSelection&&!this.config.enableCellSelection)return!0;var b=a.target||a;return"checkbox"===b.type&&"ngSelectionCell ng-scope"!==b.parentElement.className?!0:this.config.selectWithCheckboxOnly&&"checkbox"!==b.type?(this.selectionProvider.lastClickedRow=this,!0):(this.beforeSelectionChange(this,a)&&this.continueSelection(a),!1)},B.prototype.alternatingRowClass=function(){var a=this.rowIndex%2===0,b={ngRow:!0,selected:this.selected,even:a,odd:!a,"ui-state-default":this.config.jqueryUITheme&&a,"ui-state-active":this.config.jqueryUITheme&&!a};return b},B.prototype.getProperty=function(a){return this.utils.evalProperty(this.entity,a)},B.prototype.copy=function(){return this.clone=new B(this.entity,this.config,this.selectionProvider,this.rowIndex,this.utils),this.clone.isClone=!0,this.clone.elm=this.elm,this.clone.orig=this,this.clone},B.prototype.setVars=function(a){a.clone=this,this.entity=a.entity,this.selected=a.selected,this.orig=a};var C=function(a,b,d,e,f){var k=this;k.aggCache={},k.parentCache=[],k.dataChanged=!0,k.parsedData=[],k.rowConfig={},k.selectionProvider=b.selectionProvider,k.rowHeight=30,k.numberOfAggregates=0,k.groupedData=void 0,k.rowHeight=a.config.rowHeight,k.rowConfig={enableRowSelection:a.config.enableRowSelection,rowClasses:a.config.rowClasses,selectedItems:b.selectedItems,selectWithCheckboxOnly:a.config.selectWithCheckboxOnly,beforeSelectionChangeCallback:a.config.beforeSelectionChange,afterSelectionChangeCallback:a.config.afterSelectionChange,jqueryUITheme:a.config.jqueryUITheme,enableCellSelection:a.config.enableCellSelection,rowHeight:a.config.rowHeight},k.renderedRange=new A(0,a.minRowsToRender()+c),k.buildEntityRow=function(a,b){return new B(a,k.rowConfig,k.selectionProvider,b,f)},k.buildAggregateRow=function(b,c){var d=k.aggCache[b.aggIndex];return d||(d=new t(b,k,k.rowConfig.rowHeight,a.config.groupsCollapsedByDefault),k.aggCache[b.aggIndex]=d),d.rowIndex=c,d.offsetTop=c*k.rowConfig.rowHeight,d},k.UpdateViewableRange=function(a){k.renderedRange=a,k.renderedChange()},k.filteredRowsChanged=function(){a.lateBoundColumns&&a.filteredRows.length>0&&(a.config.columnDefs=void 0,a.buildColumns(),a.lateBoundColumns=!1,b.$evalAsync(function(){b.adjustScrollLeft(0)})),k.dataChanged=!0,a.config.groups.length>0&&k.getGrouping(a.config.groups),k.UpdateViewableRange(k.renderedRange)},k.renderedChange=function(){if(!k.groupedData||a.config.groups.length<1)return k.renderedChangeNoGroups(),void a.refreshDomSizes();k.wasGrouped=!0,k.parentCache=[];var b=0,c=k.parsedData.filter(function(a){return a.isAggRow?a.parent&&a.parent.collapsed?!1:!0:(a[i]||(a.rowIndex=b++),!a[i])});k.totalRows=c.length;for(var d=[],e=k.renderedRange.topRow;e<k.renderedRange.bottomRow;e++)c[e]&&(c[e].offsetTop=e*a.config.rowHeight,d.push(c[e]));a.setRenderedRows(d)},k.renderedChangeNoGroups=function(){for(var b=[],c=k.renderedRange.topRow;c<k.renderedRange.bottomRow;c++)a.filteredRows[c]&&(a.filteredRows[c].rowIndex=c,a.filteredRows[c].offsetTop=c*a.config.rowHeight,b.push(a.filteredRows[c]));a.setRenderedRows(b)},k.fixRowCache=function(){var b=a.data.length,c=b-a.rowCache.length;if(0>c)a.rowCache.length=a.rowMap.length=b;else for(var d=a.rowCache.length;b>d;d++)a.rowCache[d]=a.rowFactory.buildEntityRow(a.data[d],d)},k.parseGroupData=function(a){if(a.values)for(var b=0;b<a.values.length;b++)k.parentCache[k.parentCache.length-1].children.push(a.values[b]),k.parsedData.push(a.values[b]);else for(var c in a)if(c!==g&&c!==h&&c!==j&&a.hasOwnProperty(c)){var d=k.buildAggregateRow({gField:a[g],gLabel:c,gDepth:a[h],isAggRow:!0,_ng_hidden_:!1,children:[],aggChildren:[],aggIndex:k.numberOfAggregates,aggLabelFilter:a[j].aggLabelFilter},0);k.numberOfAggregates++,d.parent=k.parentCache[d.depth-1],d.parent&&(d.parent.collapsed=!1,d.parent.aggChildren.push(d)),k.parsedData.push(d),k.parentCache[d.depth]=d,k.parseGroupData(a[c])}},k.getGrouping=function(c){function l(a,b){return a.filter(function(a){return a.field===b})}k.aggCache=[],k.numberOfAggregates=0,k.groupedData={};for(var m=a.filteredRows,n=c.length,o=b.columns,p=0;p<m.length;p++){var q=m[p].entity;if(!q)return;m[p][i]=a.config.groupsCollapsedByDefault;for(var r=k.groupedData,s=0;s<c.length;s++){var t=c[s],v=l(o,t)[0],w=f.evalProperty(q,t);w=w?w.toString():"null",r[w]||(r[w]={}),r[g]||(r[g]=t),r[h]||(r[h]=s),r[j]||(r[j]=v),r=r[w]}r.values||(r.values=[]),r.values.push(m[p])}if(o.length>0)for(var x=0;x<c.length;x++)!o[x].isAggCol&&n>=x&&o.splice(0,0,new u({colDef:{field:"",width:25,sortable:!1,resizable:!1,headerCellTemplate:'<div class="ngAggHeader"></div>',pinned:a.config.pinSelectionCheckbox},enablePinning:a.config.enablePinning,isAggCol:!0,headerRowHeight:a.config.headerRowHeight},b,a,d,e,f));a.fixColumnIndexes(),b.adjustScrollLeft(0),k.parsedData.length=0,k.parseGroupData(k.groupedData),k.fixRowCache()},a.config.groups.length>0&&a.filteredRows.length>0&&k.getGrouping(a.config.groups)},D=function(a,c,d){var e=this,f=[];e.extFilter=c.config.filterOptions.useExternalFilter,a.showFilter=c.config.showFilter,a.filterText="",e.fieldMap={};var g=function(a){var b={};for(var c in a)a.hasOwnProperty(c)&&(b[c.toLowerCase()]=a[c]);return b},h=function(a,b,c){var e;for(var f in b)if(b.hasOwnProperty(f)){var i=c[f.toLowerCase()];if(!i)continue;var j=b[f];if("object"!=typeof j||j instanceof Date){var k=null,l=null;if(i&&i.cellFilter&&(l=i.cellFilter.split(":"),k=d(l[0])),null!==j&&void 0!==j){if("function"==typeof k){var m=k(j,l[1].slice(1,-1)).toString();e=a.regex.test(m)}else e=a.regex.test(j.toString());if(e)return!0}}else{var n=g(i);if(e=h(a,j,n))return!0}}return!1},i=function(a,b){var c,f=e.fieldMap[a.columnDisplay];if(!f)return!1;var g=f.cellFilter.split(":"),h=f.cellFilter?d(g[0]):null,i=b[a.column]||b[f.field.split(".")[0]];if(null===i||void 0===i)return!1;if("function"==typeof h){var j=h("object"==typeof i?k(i,f.field):i,g[1]).toString();c=a.regex.test(j)}else c=a.regex.test("object"==typeof i?k(i,f.field).toString():i.toString());return c?!0:!1},j=function(a){for(var b=0,c=f.length;c>b;b++){var d,g=f[b];if(d=g.column?i(g,a):h(g,a,e.fieldMap),!d)return!1}return!0};e.evalFilter=function(){c.filteredRows=0===f.length?c.rowCache:c.rowCache.filter(function(a){return j(a.entity)});for(var a=0;a<c.filteredRows.length;a++)c.filteredRows[a].rowIndex=a;c.rowFactory.filteredRowsChanged()};var k=function(a,b){if("object"!=typeof a||"string"!=typeof b)return a;var c=b.split("."),d=a;if(c.length>1){for(var e=1,f=c.length;f>e;e++)if(d=d[c[e]],!d)return a;return d}return a},l=function(a,b){try{return new RegExp(a,b)}catch(c){return new RegExp(a.replace(/(\^|\$|\(|\)|<|>|\[|\]|\{|\}|\\|\||\.|\*|\+|\?)/g,"\\$1"))}},m=function(a){f=[];var c;if(c=b.trim(a))for(var d=c.split(";"),e=0;e<d.length;e++){var g=d[e].split(":");if(g.length>1){var h=b.trim(g[0]),i=b.trim(g[1]);h&&i&&f.push({column:h,columnDisplay:h.replace(/\s+/g,"").toLowerCase(),regex:l(i,"i")})}else{var j=b.trim(g[0]);j&&f.push({column:"",regex:l(j,"i")})}}};e.extFilter||a.$on("$destroy",a.$watch("columns",function(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.field)if(c.field.match(/\./g)){for(var d=c.field.split("."),f=e.fieldMap,g=0;g<d.length-1;g++)f[d[g]]=f[d[g]]||{},f=f[d[g]];f[d[d.length-1]]=c}else e.fieldMap[c.field.toLowerCase()]=c;c.displayName&&(e.fieldMap[c.displayName.toLowerCase().replace(/\s+/g,"")]=c)}})),a.$on("$destroy",a.$watch(function(){return c.config.filterOptions.filterText},function(b){a.filterText=b})),a.$on("$destroy",a.$watch("filterText",function(b){e.extFilter||(a.$emit("ngGridEventFilter",b),m(b),e.evalFilter())}))},E=function(a,b,c){var d=this;d.multi=a.config.multiSelect,d.selectedItems=a.config.selectedItems,d.selectedIndex=a.config.selectedIndex,d.lastClickedRow=void 0,d.ignoreSelectedItemChanges=!1,d.pKeyParser=c(a.config.primaryKey),d.ChangeSelection=function(c,e){var f=e.which||e.keyCode,g=40===f||38===f;if(e&&e.shiftKey&&!e.keyCode&&d.multi&&a.config.enableRowSelection){if(d.lastClickedRow){var h;h=b.configGroups.length>0?a.rowFactory.parsedData.filter(function(a){return!a.isAggRow}):a.filteredRows;var i=c.rowIndex,j=d.lastClickedRowIndex;if(i===j)return!1;j>i?(i^=j,j=i^j,i^=j,i--):j++;for(var k=[];i>=j;j++)k.push(h[j]);if(k[k.length-1].beforeSelectionChange(k,e)){for(var l=0;l<k.length;l++){var m=k[l],n=m.selected;m.selected=!n,m.clone&&(m.clone.selected=m.selected);var o=d.selectedItems.indexOf(m.entity);-1===o?d.selectedItems.push(m.entity):d.selectedItems.splice(o,1)}k[k.length-1].afterSelectionChange(k,e)}return d.lastClickedRow=c,d.lastClickedRowIndex=c.rowIndex,!0}}else d.multi?(!e.keyCode||g&&!a.config.selectWithCheckboxOnly)&&d.setSelection(c,!c.selected):d.lastClickedRow===c?d.setSelection(d.lastClickedRow,a.config.keepLastSelected?!0:!c.selected):(d.lastClickedRow&&d.setSelection(d.lastClickedRow,!1),d.setSelection(c,!c.selected));return d.lastClickedRow=c,d.lastClickedRowIndex=c.rowIndex,!0},d.getSelection=function(a){return-1!==d.getSelectionIndex(a)},d.getSelectionIndex=function(b){var c=-1;if(a.config.primaryKey){var e=d.pKeyParser(b);angular.forEach(d.selectedItems,function(a,b){e===d.pKeyParser(a)&&(c=b)})}else c=d.selectedItems.indexOf(b);return c},d.setSelection=function(b,c){if(a.config.enableRowSelection){if(c)-1===d.getSelectionIndex(b.entity)&&(!d.multi&&d.selectedItems.length>0&&d.toggleSelectAll(!1,!0),d.selectedItems.push(b.entity));else{var e=d.getSelectionIndex(b.entity);-1!==e&&d.selectedItems.splice(e,1)}b.selected=c,b.orig&&(b.orig.selected=c),b.clone&&(b.clone.selected=c),b.afterSelectionChange(b)}},d.toggleSelectAll=function(b,c,e){var f=e?a.filteredRows:a.rowCache;if(c||a.config.beforeSelectionChange(f,b)){var g=d.selectedItems.length;g>0&&(d.selectedItems.length=0);for(var h=0;h<f.length;h++)f[h].selected=b,f[h].clone&&(f[h].clone.selected=b),b&&d.selectedItems.push(f[h].entity);c||a.config.afterSelectionChange(f,b)}}},F=function(a,b){a.headerCellStyle=function(a){return{height:a.headerRowHeight+"px"}},a.rowStyle=function(b){var c={top:b.offsetTop+"px",height:a.rowHeight+"px"};return b.isAggRow&&(c.left=b.offsetLeft),c},a.canvasStyle=function(){return{height:b.maxCanvasHt+"px"}},a.headerScrollerStyle=function(){return{height:b.config.headerRowHeight+"px"}},a.topPanelStyle=function(){return{width:b.rootDim.outerWidth+"px",height:a.topPanelHeight()+"px"}},a.headerStyle=function(){return{width:b.rootDim.outerWidth+"px",height:b.config.headerRowHeight+"px"}},a.groupPanelStyle=function(){return{width:b.rootDim.outerWidth+"px",height:"32px"}},a.viewportStyle=function(){return{width:b.rootDim.outerWidth+"px",height:a.viewportDimHeight()+"px"}},a.footerStyle=function(){return{width:b.rootDim.outerWidth+"px",height:a.footerRowHeight+"px"}}};q.directive("ngCellHasFocus",["$domUtilityService",function(a){var b=function(b){b.isFocused=!0,a.digest(b),b.$broadcast("ngGridEventStartCellEdit"),b.$emit("ngGridEventStartCellEdit"),b.$on("$destroy",b.$on("ngGridEventEndCellEdit",function(){b.isFocused=!1,a.digest(b)}))};return function(a,c){function d(){return a.enableCellEditOnFocus?j=!0:c.focus(),!0}function e(d){a.enableCellEditOnFocus&&(d.preventDefault(),j=!1,b(a,c))}function f(){return i=!0,a.enableCellEditOnFocus&&!j&&b(a,c),!0}function g(){return i=!1,!0}function h(d){return a.enableCellEditOnFocus||(i&&37!==d.keyCode&&38!==d.keyCode&&39!==d.keyCode&&40!==d.keyCode&&9!==d.keyCode&&!d.shiftKey&&13!==d.keyCode&&b(a,c),i&&d.shiftKey&&d.keyCode>=65&&d.keyCode<=90&&b(a,c),27===d.keyCode&&c.focus()),!0}var i=!1,j=!1;a.editCell=function(){a.enableCellEditOnFocus||setTimeout(function(){b(a,c)},0)},c.bind("mousedown",d),c.bind("click",e),c.bind("focus",f),c.bind("blur",g),c.bind("keydown",h),c.on("$destroy",function(){c.off("mousedown",d),c.off("click",e),c.off("focus",f),c.off("blur",g),c.off("keydown",h)})}}]),q.directive("ngCellText",function(){return function(a,b){function c(a){a.preventDefault()}function d(a){a.preventDefault()}b.bind("mouseover",c),b.bind("mouseleave",d),b.on("$destroy",function(){b.off("mouseover",c),b.off("mouseleave",d)})}}),q.directive("ngCell",["$compile","$domUtilityService",function(a,c){var d={scope:!1,compile:function(){return{pre:function(c,d){var e,f=c.col.cellTemplate.replace(l,"row.entity."+c.col.field);
+c.col.enableCellEdit?(e=c.col.cellEditTemplate,e=e.replace(o,c.col.cellEditableCondition),e=e.replace(m,f),e=e.replace(n,c.col.editableCellTemplate.replace(l,"row.entity."+c.col.field))):e=f;var g=b(e);d.append(g),a(g)(c),c.enableCellSelection&&-1===g[0].className.indexOf("ngSelectionCell")&&(g[0].setAttribute("tabindex",0),g.addClass("ngCellElement"))},post:function(a,b){a.enableCellSelection&&a.domAccessProvider.selectionHandlers(a,b),a.$on("$destroy",a.$on("ngGridEventDigestCell",function(){c.digest(a)}))}}}};return d}]),q.directive("ngEditCellIf",[function(){return{transclude:"element",priority:1e3,terminal:!0,restrict:"A",compile:function(a,b,c){return function(a,b,d){var e,f;a.$on("$destroy",a.$watch(d.ngEditCellIf,function(d){e&&(e.remove(),e=void 0),f&&(f.$destroy(),f=void 0),d&&(f=a.$new(),c(f,function(a){e=a,b.after(a)}))}))}}}}]),q.directive("ngGridFooter",["$compile","$templateCache",function(a,b){var c={scope:!1,compile:function(){return{pre:function(c,d){0===d.children().length&&d.append(a(b.get(c.gridId+"footerTemplate.html"))(c))}}}};return c}]),q.directive("ngGridMenu",["$compile","$templateCache",function(a,b){var c={scope:!1,compile:function(){return{pre:function(c,d){0===d.children().length&&d.append(a(b.get(c.gridId+"menuTemplate.html"))(c))}}}};return c}]),q.directive("ngGrid",["$compile","$filter","$templateCache","$sortService","$domUtilityService","$utilityService","$timeout","$parse","$http","$q",function(a,c,d,e,f,g,h,i,j,k){var l={scope:!0,compile:function(){return{pre:function(l,m,n){var o=b(m),p=l.$eval(n.ngGrid);p.gridDim=new v({outerHeight:b(o).height(),outerWidth:b(o).width()});var q=new z(l,p,e,f,c,d,g,h,i,j,k);return l.$on("$destroy",function(){p.gridDim=null,p.selectRow=null,p.selectItem=null,p.selectAll=null,p.selectVisible=null,p.groupBy=null,p.sortBy=null,p.gridId=null,p.ngGrid=null,p.$gridScope=null,p.$gridServices=null,l.domAccessProvider.grid=null,angular.element(q.styleSheet).remove(),q.styleSheet=null}),q.init().then(function(){if("string"==typeof p.columnDefs?l.$on("$destroy",l.$parent.$watch(p.columnDefs,function(a){return a?(q.lateBoundColumns=!1,l.columns=[],q.config.columnDefs=a,q.buildColumns(),q.eventProvider.assignEvents(),void f.RebuildGrid(l,q)):(q.refreshDomSizes(),void q.buildColumns())},!0)):q.buildColumns(),"string"==typeof p.totalServerItems?l.$on("$destroy",l.$parent.$watch(p.totalServerItems,function(a){l.totalServerItems=angular.isDefined(a)?a:0})):l.totalServerItems=0,"string"==typeof p.data){var c=function(a){q.data=b.extend([],a),q.rowFactory.fixRowCache(),angular.forEach(q.data,function(a,b){var c=q.rowMap[b]||b;q.rowCache[c]&&q.rowCache[c].ensureEntity(a),q.rowMap[c]=b}),q.searchProvider.evalFilter(),q.configureColumnWidths(),q.refreshDomSizes(),q.config.sortInfo.fields.length>0&&(q.sortColumnsInit(),l.$emit("ngGridEventSorted",q.config.sortInfo)),l.$emit("ngGridEventData",q.gridId)};l.$on("$destroy",l.$parent.$watch(p.data,c)),l.$on("$destroy",l.$parent.$watch(p.data+".length",function(){c(l.$eval(p.data)),l.adjustScrollTop(q.$viewport.scrollTop(),!0)}))}return q.footerController=new y(l,q),m.addClass("ngGrid").addClass(q.gridId.toString()),p.enableHighlighting||m.addClass("unselectable"),p.jqueryUITheme&&m.addClass("ui-widget"),m.append(a(d.get("gridTemplate.html"))(l)),f.AssignGridContainers(l,m,q),q.eventProvider=new x(q,l,f,h),p.selectRow=function(a,b){q.rowCache[a]&&(q.rowCache[a].clone&&q.rowCache[a].clone.setSelection(b?!0:!1),q.rowCache[a].setSelection(b?!0:!1))},p.selectItem=function(a,b){p.selectRow(q.rowMap[a],b)},p.selectAll=function(a){l.toggleSelectAll(a)},p.selectVisible=function(a){l.toggleSelectAll(a,!0)},p.groupBy=function(a){if(a)l.groupBy(l.columns.filter(function(b){return b.field===a})[0]);else{var c=b.extend(!0,[],l.configGroups);angular.forEach(c,l.groupBy)}},p.sortBy=function(a){var b=l.columns.filter(function(b){return b.field===a})[0];b&&b.sort()},p.gridId=q.gridId,p.ngGrid=q,p.$gridScope=l,p.$gridServices={SortService:e,DomUtilityService:f,UtilityService:g},l.$on("$destroy",l.$on("ngGridEventDigestGrid",function(){f.digest(l.$parent)})),l.$on("$destroy",l.$on("ngGridEventDigestGridParent",function(){f.digest(l.$parent)})),l.$evalAsync(function(){l.adjustScrollLeft(0)}),angular.forEach(p.plugins,function(a){"function"==typeof a&&(a=new a);var b=l.$new();a.init(b,q,p.$gridServices),p.plugins[g.getInstanceType(a)]=a,l.$on("$destroy",function(){b.$destroy()})}),"function"==typeof p.init&&p.init(q,l),null})}}}};return l}]),q.directive("ngHeaderCell",["$compile",function(a){var b={scope:!1,compile:function(){return{pre:function(b,c){c.append(a(b.col.headerCellTemplate)(b))}}}};return b}]),q.directive("ngHeaderRow",["$compile","$templateCache",function(a,b){var c={scope:!1,compile:function(){return{pre:function(c,d){0===d.children().length&&d.append(a(b.get(c.gridId+"headerRowTemplate.html"))(c))}}}};return c}]),q.directive("ngInput",[function(){return{require:"ngModel",link:function(a,b,c,d){function e(c){switch(c.keyCode){case 37:case 38:case 39:case 40:c.stopPropagation();break;case 27:a.$$phase||a.$apply(function(){d.$setViewValue(h),b.blur()});break;case 13:(a.enableCellEditOnFocus&&a.totalFilteredItemsLength()-1>a.row.rowIndex&&a.row.rowIndex>0||a.col.enableCellEdit)&&b.blur()}return!0}function f(a){a.stopPropagation()}function g(a){a.stopPropagation()}var h,i=a.$watch("ngModel",function(){h=d.$modelValue,i()});b.bind("keydown",e),b.bind("click",f),b.bind("mousedown",g),b.on("$destroy",function(){b.off("keydown",e),b.off("click",f),b.off("mousedown",g)}),a.$on("$destroy",a.$on("ngGridEventStartCellEdit",function(){b.focus(),b.select()})),angular.element(b).bind("blur",function(){a.$emit("ngGridEventEndCellEdit")})}}}]),q.directive("ngRow",["$compile","$domUtilityService","$templateCache",function(a,b,c){var d={scope:!1,compile:function(){return{pre:function(d,e){if(d.row.elm=e,d.row.clone&&(d.row.clone.elm=e),d.row.isAggRow){var f=c.get(d.gridId+"aggregateTemplate.html");f=d.row.aggLabelFilter?f.replace(k,"| "+d.row.aggLabelFilter):f.replace(k,""),e.append(a(f)(d))}else e.append(a(c.get(d.gridId+"rowTemplate.html"))(d));d.$on("$destroy",d.$on("ngGridEventDigestRow",function(){b.digest(d)}))}}}};return d}]),q.directive("ngViewport",[function(){return function(a,b){function c(b){var c=b.target.scrollLeft,d=b.target.scrollTop;return a.$headerContainer&&a.$headerContainer.scrollLeft(c),a.adjustScrollLeft(c),a.adjustScrollTop(d),a.forceSyncScrolling?i():(clearTimeout(g),g=setTimeout(i,150)),f=c,h=d,e=!1,!0}function d(){return e=!0,b.focus&&b.focus(),!0}var e,f,g,h=0,i=function(){a.$root.$$phase||a.$digest()};b.bind("scroll",c),b.bind("mousewheel DOMMouseScroll",d),b.on("$destroy",function(){b.off("scroll",c),b.off("mousewheel DOMMouseScroll",d)}),a.enableCellSelection||a.domAccessProvider.selectionHandlers(a,b)}}]),a.ngGrid.i18n.da={ngAggregateLabel:"artikler",ngGroupPanelDescription:"Grupér rækker udfra en kolonne ved at trække dens overskift hertil.",ngSearchPlaceHolder:"Søg...",ngMenuText:"Vælg kolonner:",ngShowingItemsLabel:"Viste rækker:",ngTotalItemsLabel:"Rækker totalt:",ngSelectedItemsLabel:"Valgte rækker:",ngPageSizeLabel:"Side størrelse:",ngPagerFirstTitle:"Første side",ngPagerNextTitle:"Næste side",ngPagerPrevTitle:"Forrige side",ngPagerLastTitle:"Sidste side"},a.ngGrid.i18n.de={ngAggregateLabel:"eintrag",ngGroupPanelDescription:"Ziehen Sie eine Spaltenüberschrift hierhin um nach dieser Spalte zu gruppieren.",ngSearchPlaceHolder:"Suche...",ngMenuText:"Spalten auswählen:",ngShowingItemsLabel:"Zeige Einträge:",ngTotalItemsLabel:"Einträge gesamt:",ngSelectedItemsLabel:"Ausgewählte Einträge:",ngPageSizeLabel:"Einträge pro Seite:",ngPagerFirstTitle:"Erste Seite",ngPagerNextTitle:"Nächste Seite",ngPagerPrevTitle:"Vorherige Seite",ngPagerLastTitle:"Letzte Seite"},a.ngGrid.i18n.en={ngAggregateLabel:"items",ngGroupPanelDescription:"Drag a column header here and drop it to group by that column.",ngSearchPlaceHolder:"Search...",ngMenuText:"Choose Columns:",ngShowingItemsLabel:"Showing Items:",ngTotalItemsLabel:"Total Items:",ngSelectedItemsLabel:"Selected Items:",ngPageSizeLabel:"Page Size:",ngPagerFirstTitle:"First Page",ngPagerNextTitle:"Next Page",ngPagerPrevTitle:"Previous Page",ngPagerLastTitle:"Last Page"},a.ngGrid.i18n.es={ngAggregateLabel:"Artículos",ngGroupPanelDescription:"Arrastre un encabezado de columna aquí y soltarlo para agrupar por esa columna.",ngSearchPlaceHolder:"Buscar...",ngMenuText:"Elegir columnas:",ngShowingItemsLabel:"Artículos Mostrando:",ngTotalItemsLabel:"Artículos Totales:",ngSelectedItemsLabel:"Artículos Seleccionados:",ngPageSizeLabel:"Tamaño de Página:",ngPagerFirstTitle:"Primera Página",ngPagerNextTitle:"Página Siguiente",ngPagerPrevTitle:"Página Anterior",ngPagerLastTitle:"Última Página"},a.ngGrid.i18n.fa={ngAggregateLabel:"موردها",ngGroupPanelDescription:"یک عنوان ستون اینجا را بردار و به گروهی از آن ستون بیانداز.",ngSearchPlaceHolder:"جستجو...",ngMenuText:"انتخاب ستون‌ها:",ngShowingItemsLabel:"نمایش موردها:",ngTotalItemsLabel:"همهٔ موردها:",ngSelectedItemsLabel:"موردهای انتخاب‌شده:",ngPageSizeLabel:"اندازهٔ صفحه:",ngPagerFirstTitle:"صفحهٔ اول",ngPagerNextTitle:"صفحهٔ بعد",ngPagerPrevTitle:"صفحهٔ قبل",ngPagerLastTitle:"آخرین صفحه"},a.ngGrid.i18n.fr={ngAggregateLabel:"articles",ngGroupPanelDescription:"Faites glisser un en-tête de colonne ici et déposez-le vers un groupe par cette colonne.",ngSearchPlaceHolder:"Recherche...",ngMenuText:"Choisir des colonnes:",ngShowingItemsLabel:"Articles Affichage des:",ngTotalItemsLabel:"Nombre total d'articles:",ngSelectedItemsLabel:"Éléments Articles:",ngPageSizeLabel:"Taille de page:",ngPagerFirstTitle:"Première page",ngPagerNextTitle:"Page Suivante",ngPagerPrevTitle:"Page précédente",ngPagerLastTitle:"Dernière page"},a.ngGrid.i18n.nl={ngAggregateLabel:"items",ngGroupPanelDescription:"Sleep hier een kolomkop om op te groeperen.",ngSearchPlaceHolder:"Zoeken...",ngMenuText:"Kies kolommen:",ngShowingItemsLabel:"Toon items:",ngTotalItemsLabel:"Totaal items:",ngSelectedItemsLabel:"Geselecteerde items:",ngPageSizeLabel:"Pagina grootte:, ",ngPagerFirstTitle:"Eerste pagina",ngPagerNextTitle:"Volgende pagina",ngPagerPrevTitle:"Vorige pagina",ngPagerLastTitle:"Laatste pagina"},a.ngGrid.i18n["pt-br"]={ngAggregateLabel:"itens",ngGroupPanelDescription:"Arraste e solte uma coluna aqui para agrupar por essa coluna",ngSearchPlaceHolder:"Procurar...",ngMenuText:"Selecione as colunas:",ngShowingItemsLabel:"Mostrando os Itens:",ngTotalItemsLabel:"Total de Itens:",ngSelectedItemsLabel:"Items Selecionados:",ngPageSizeLabel:"Tamanho da Página:",ngPagerFirstTitle:"Primeira Página",ngPagerNextTitle:"Próxima Página",ngPagerPrevTitle:"Página Anterior",ngPagerLastTitle:"Última Página"},a.ngGrid.i18n["zh-cn"]={ngAggregateLabel:"条目",ngGroupPanelDescription:"拖曳表头到此处以进行分组",ngSearchPlaceHolder:"搜索...",ngMenuText:"数据分组与选择列：",ngShowingItemsLabel:"当前显示条目：",ngTotalItemsLabel:"条目总数：",ngSelectedItemsLabel:"选中条目：",ngPageSizeLabel:"每页显示数：",ngPagerFirstTitle:"回到首页",ngPagerNextTitle:"下一页",ngPagerPrevTitle:"上一页",ngPagerLastTitle:"前往尾页"},a.ngGrid.i18n["zh-tw"]={ngAggregateLabel:"筆",ngGroupPanelDescription:"拖拉表頭到此處以進行分組",ngSearchPlaceHolder:"搜尋...",ngMenuText:"選擇欄位：",ngShowingItemsLabel:"目前顯示筆數：",ngTotalItemsLabel:"總筆數：",ngSelectedItemsLabel:"選取筆數：",ngPageSizeLabel:"每頁顯示：",ngPagerFirstTitle:"第一頁",ngPagerNextTitle:"下一頁",ngPagerPrevTitle:"上一頁",ngPagerLastTitle:"最後頁"},angular.module("ngGrid").run(["$templateCache",function(a){a.put("aggregateTemplate.html",'<div ng-click="row.toggleExpand()" ng-style="rowStyle(row)" class="ngAggregate">\r\n    <span class="ngAggregateText">{{row.label CUSTOM_FILTERS}} ({{row.totalChildren()}} {{AggItemsLabel}})</span>\r\n    <div class="{{row.aggClass()}}"></div>\r\n</div>\r\n'),a.put("cellEditTemplate.html",'<div ng-cell-has-focus ng-dblclick="CELL_EDITABLE_CONDITION && editCell()">\r\n	<div ng-edit-cell-if="!(isFocused && CELL_EDITABLE_CONDITION)">	\r\n		DISPLAY_CELL_TEMPLATE\r\n	</div>\r\n	<div ng-edit-cell-if="isFocused && CELL_EDITABLE_CONDITION">\r\n		EDITABLE_CELL_TEMPLATE\r\n	</div>\r\n</div>\r\n'),a.put("cellTemplate.html",'<div class="ngCellText" ng-class="col.colIndex()"><span ng-cell-text>{{COL_FIELD CUSTOM_FILTERS}}</span></div>'),a.put("checkboxCellTemplate.html",'<div class="ngSelectionCell"><input tabindex="-1" class="ngSelectionCheckbox" type="checkbox" ng-checked="row.selected" /></div>'),a.put("checkboxHeaderTemplate.html",'<input class="ngSelectionHeader" type="checkbox" ng-show="multiSelect" ng-model="allSelected" ng-change="toggleSelectAll(allSelected, true)"/>'),a.put("editableCellTemplate.html",'<input ng-class="\'colt\' + col.index" ng-input="COL_FIELD" ng-model="COL_FIELD" />'),a.put("footerTemplate.html",'<div ng-show="showFooter" class="ngFooterPanel" ng-class="{\'ui-widget-content\': jqueryUITheme, \'ui-corner-bottom\': jqueryUITheme}" ng-style="footerStyle()">\r\n    <div class="ngTotalSelectContainer" >\r\n        <div class="ngFooterTotalItems" ng-class="{\'ngNoMultiSelect\': !multiSelect}" >\r\n            <span class="ngLabel">{{i18n.ngTotalItemsLabel}} {{maxRows()}}</span><span ng-show="filterText.length > 0" class="ngLabel">({{i18n.ngShowingItemsLabel}} {{totalFilteredItemsLength()}})</span>\r\n        </div>\r\n        <div class="ngFooterSelectedItems" ng-show="multiSelect">\r\n            <span class="ngLabel">{{i18n.ngSelectedItemsLabel}} {{selectedItems.length}}</span>\r\n        </div>\r\n    </div>\r\n    <div class="ngPagerContainer" style="float: right; margin-top: 10px;" ng-show="enablePaging" ng-class="{\'ngNoMultiSelect\': !multiSelect}">\r\n        <div style="float:left; margin-right: 10px;" class="ngRowCountPicker">\r\n            <span style="float: left; margin-top: 3px;" class="ngLabel">{{i18n.ngPageSizeLabel}}</span>\r\n            <select style="float: left;height: 27px; width: 100px" ng-model="pagingOptions.pageSize" >\r\n                <option ng-repeat="size in pagingOptions.pageSizes">{{size}}</option>\r\n            </select>\r\n        </div>\r\n        <div style="float:left; margin-right: 10px; line-height:25px;" class="ngPagerControl" style="float: left; min-width: 135px;">\r\n            <button type="button" class="ngPagerButton" ng-click="pageToFirst()" ng-disabled="cantPageBackward()" title="{{i18n.ngPagerFirstTitle}}"><div class="ngPagerFirstTriangle"><div class="ngPagerFirstBar"></div></div></button>\r\n            <button type="button" class="ngPagerButton" ng-click="pageBackward()" ng-disabled="cantPageBackward()" title="{{i18n.ngPagerPrevTitle}}"><div class="ngPagerFirstTriangle ngPagerPrevTriangle"></div></button>\r\n            <input class="ngPagerCurrent" min="1" max="{{currentMaxPages}}" type="number" style="width:50px; height: 24px; margin-top: 1px; padding: 0 4px;" ng-model="pagingOptions.currentPage"/>\r\n            <span class="ngGridMaxPagesNumber" ng-show="maxPages() > 0">/ {{maxPages()}}</span>\r\n            <button type="button" class="ngPagerButton" ng-click="pageForward()" ng-disabled="cantPageForward()" title="{{i18n.ngPagerNextTitle}}"><div class="ngPagerLastTriangle ngPagerNextTriangle"></div></button>\r\n            <button type="button" class="ngPagerButton" ng-click="pageToLast()" ng-disabled="cantPageToLast()" title="{{i18n.ngPagerLastTitle}}"><div class="ngPagerLastTriangle"><div class="ngPagerLastBar"></div></div></button>\r\n        </div>\r\n    </div>\r\n</div>\r\n'),a.put("gridTemplate.html",'<div class="ngTopPanel" ng-class="{\'ui-widget-header\':jqueryUITheme, \'ui-corner-top\': jqueryUITheme}" ng-style="topPanelStyle()">\r\n    <div class="ngGroupPanel" ng-show="showGroupPanel()" ng-style="groupPanelStyle()">\r\n        <div class="ngGroupPanelDescription" ng-show="configGroups.length == 0">{{i18n.ngGroupPanelDescription}}</div>\r\n        <ul ng-show="configGroups.length > 0" class="ngGroupList">\r\n            <li class="ngGroupItem" ng-repeat="group in configGroups">\r\n                <span class="ngGroupElement">\r\n                    <span class="ngGroupName">{{group.displayName}}\r\n                        <span ng-click="removeGroup($index)" class="ngRemoveGroup">x</span>\r\n                    </span>\r\n                    <span ng-hide="$last" class="ngGroupArrow"></span>\r\n                </span>\r\n            </li>\r\n        </ul>\r\n    </div>\r\n    <div class="ngHeaderContainer" ng-style="headerStyle()">\r\n        <div ng-header-row class="ngHeaderScroller" ng-style="headerScrollerStyle()"></div>\r\n    </div>\r\n    <div ng-grid-menu></div>\r\n</div>\r\n<div class="ngViewport" unselectable="on" ng-viewport ng-class="{\'ui-widget-content\': jqueryUITheme}" ng-style="viewportStyle()">\r\n    <div class="ngCanvas" ng-style="canvasStyle()">\r\n        <div ng-style="rowStyle(row)" ng-repeat="row in renderedRows" ng-click="row.toggleSelected($event)" ng-class="row.alternatingRowClass()" ng-row></div>\r\n    </div>\r\n</div>\r\n<div ng-grid-footer></div>\r\n'),a.put("headerCellTemplate.html",'<div class="ngHeaderSortColumn {{col.headerClass}}" ng-style="{\'cursor\': col.cursor}" ng-class="{ \'ngSorted\': !col.noSortVisible() }">\r\n    <div ng-click="col.sort($event)" ng-class="\'colt\' + col.index" class="ngHeaderText">{{col.displayName}}</div>\r\n    <div class="ngSortButtonDown" ng-click="col.sort($event)" ng-show="col.showSortButtonDown()"></div>\r\n    <div class="ngSortButtonUp" ng-click="col.sort($event)" ng-show="col.showSortButtonUp()"></div>\r\n    <div class="ngSortPriority">{{col.sortPriority}}</div>\r\n    <div ng-class="{ ngPinnedIcon: col.pinned, ngUnPinnedIcon: !col.pinned }" ng-click="togglePin(col)" ng-show="col.pinnable"></div>\r\n</div>\r\n<div ng-show="col.resizable" class="ngHeaderGrip" ng-click="col.gripClick($event)" ng-mousedown="col.gripOnMouseDown($event)"></div>\r\n'),a.put("headerRowTemplate.html",'<div ng-style="{ height: col.headerRowHeight }" ng-repeat="col in renderedColumns" ng-class="col.colIndex()" class="ngHeaderCell">\r\n	<div class="ngVerticalBar" ng-style="{height: col.headerRowHeight}" ng-class="{ ngVerticalBarVisible: !$last }">&nbsp;</div>\r\n	<div ng-header-cell></div>\r\n</div>'),a.put("menuTemplate.html",'<div ng-show="showColumnMenu || showFilter"  class="ngHeaderButton" ng-click="toggleShowMenu()">\r\n    <div class="ngHeaderButtonArrow"></div>\r\n</div>\r\n<div ng-show="showMenu" class="ngColMenu">\r\n    <div ng-show="showFilter">\r\n        <input placeholder="{{i18n.ngSearchPlaceHolder}}" type="text" ng-model="filterText"/>\r\n    </div>\r\n    <div ng-show="showColumnMenu">\r\n        <span class="ngMenuText">{{i18n.ngMenuText}}</span>\r\n        <ul class="ngColList">\r\n            <li class="ngColListItem" ng-repeat="col in columns | ngColumns">\r\n                <label><input ng-disabled="col.pinned" type="checkbox" class="ngColListCheckbox" ng-model="col.visible"/>{{col.displayName}}</label>\r\n				<a title="Group By" ng-class="col.groupedByClass()" ng-show="col.groupable && col.visible" ng-click="groupBy(col)"></a>\r\n				<span class="ngGroupingNumber" ng-show="col.groupIndex > 0">{{col.groupIndex}}</span>          \r\n            </li>\r\n        </ul>\r\n    </div>\r\n</div>'),a.put("rowTemplate.html",'<div ng-style="{ \'cursor\': row.cursor }" ng-repeat="col in renderedColumns" ng-class="col.colIndex()" class="ngCell {{col.cellClass}}">\r\n	<div class="ngVerticalBar" ng-style="{height: rowHeight}" ng-class="{ ngVerticalBarVisible: !$last }">&nbsp;</div>\r\n	<div ng-cell></div>\r\n</div>')}])}(window,jQuery),d3=function(){function a(a){return null!=a&&!isNaN(a)}function b(a){return a.length}function c(a){for(var b=1;a*b%1;)b*=10;return b}function d(a,b){try{for(var c in b)Object.defineProperty(a.prototype,c,{value:b[c],enumerable:!1})}catch(d){a.prototype=b}}function e(){}function f(){}function g(a,b,c){return function(){var d=c.apply(b,arguments);return d===b?a:d}}function h(a,b){if(b in a)return b;b=b.charAt(0).toUpperCase()+b.substring(1);for(var c=0,d=lh.length;d>c;++c){var e=lh[c]+b;if(e in a)return e}}function i(){}function j(){}function k(a){function b(){for(var b,d=c,e=-1,f=d.length;++e<f;)(b=d[e].on)&&b.apply(this,arguments);return a}var c=[],d=new e;return b.on=function(b,e){var f,g=d.get(b);return arguments.length<2?g&&g.on:(g&&(g.on=null,c=c.slice(0,f=c.indexOf(g)).concat(c.slice(f+1)),d.remove(b)),e&&c.push(d.set(b,{on:e})),a)},b}function l(){Wg.event.preventDefault()}function m(){for(var a,b=Wg.event;a=b.sourceEvent;)b=a;return b}function n(a){for(var b=new j,c=0,d=arguments.length;++c<d;)b[arguments[c]]=k(b);return b.of=function(c,d){return function(e){try{var f=e.sourceEvent=Wg.event;e.target=a,Wg.event=e,b[e.type].apply(c,d)}finally{Wg.event=f}}},b}function o(a){return nh(a,sh),a}function p(a){return"function"==typeof a?a:function(){return oh(a,this)}}function q(a){return"function"==typeof a?a:function(){return ph(a,this)}}function r(a,b){function c(){this.removeAttribute(a)}function d(){this.removeAttributeNS(a.space,a.local)}function e(){this.setAttribute(a,b)}function f(){this.setAttributeNS(a.space,a.local,b)}function g(){var c=b.apply(this,arguments);null==c?this.removeAttribute(a):this.setAttribute(a,c)}function h(){var c=b.apply(this,arguments);null==c?this.removeAttributeNS(a.space,a.local):this.setAttributeNS(a.space,a.local,c)}return a=Wg.ns.qualify(a),null==b?a.local?d:c:"function"==typeof b?a.local?h:g:a.local?f:e}function s(a){return a.trim().replace(/\s+/g," ")}function t(a){return new RegExp("(?:^|\\s+)"+Wg.requote(a)+"(?:\\s+|$)","g")}function u(a){return a.trim().split(/^|\s+/)}function v(a,b){function c(){for(var c=-1;++c<e;)a[c](this,b)}function d(){for(var c=-1,d=b.apply(this,arguments);++c<e;)a[c](this,d)}a=u(a).map(w);var e=a.length;return"function"==typeof b?d:c}function w(a){var b=t(a);return function(c,d){if(e=c.classList)return d?e.add(a):e.remove(a);var e=c.getAttribute("class")||"";d?(b.lastIndex=0,b.test(e)||c.setAttribute("class",s(e+" "+a))):c.setAttribute("class",s(e.replace(b," ")))}}function x(a,b,c){function d(){this.style.removeProperty(a)}function e(){this.style.setProperty(a,b,c)}function f(){var d=b.apply(this,arguments);null==d?this.style.removeProperty(a):this.style.setProperty(a,d,c)}return null==b?d:"function"==typeof b?f:e}function y(a,b){function c(){delete this[a]}function d(){this[a]=b}function e(){var c=b.apply(this,arguments);null==c?delete this[a]:this[a]=c}return null==b?c:"function"==typeof b?e:d}function z(a){return"function"==typeof a?a:(a=Wg.ns.qualify(a)).local?function(){return this.ownerDocument.createElementNS(a.space,a.local)}:function(){return this.ownerDocument.createElementNS(this.namespaceURI,a)}}function A(a){return{__data__:a}}function B(a){return function(){return rh(this,a)}}function C(a){return arguments.length||(a=Wg.ascending),function(b,c){return b&&c?a(b.__data__,c.__data__):!b-!c}}function D(a,b){for(var c=0,d=a.length;d>c;c++)for(var e,f=a[c],g=0,h=f.length;h>g;g++)(e=f[g])&&b(e,g,c);return a}function E(a){return nh(a,uh),a}function F(a){var b,c;return function(d,e,f){var g,h=a[f].update,i=h.length;for(f!=c&&(c=f,b=0),e>=b&&(b=e+1);!(g=h[b])&&++b<i;);return g}}function G(){var a=this.__transition__;a&&++a.active}function H(a,b,c){function d(){var b=this[g];b&&(this.removeEventListener(a,b,b.$),delete this[g])}function e(){var e=j(b,Yg(arguments));d.call(this),this.addEventListener(a,this[g]=e,e.$=c),e._=b}function f(){var b,c=new RegExp("^__on([^.]+)"+Wg.requote(a)+"$");for(var d in this)if(b=d.match(c)){var e=this[d];this.removeEventListener(b[1],e,e.$),delete this[d]}}var g="__on"+a,h=a.indexOf("."),j=I;h>0&&(a=a.substring(0,h));var k=wh.get(a);return k&&(a=k,j=J),h?b?e:d:b?i:f}function I(a,b){return function(c){var d=Wg.event;Wg.event=c,b[0]=this.__data__;try{a.apply(this,b)}finally{Wg.event=d}}}function J(a,b){var c=I(a,b);return function(a){var b=this,d=a.relatedTarget;d&&(d===b||8&d.compareDocumentPosition(b))||c.call(b,a)}}function K(){var a=".dragsuppress-"+ ++yh,b="click"+a,c=Wg.select(_g).on("touchmove"+a,l).on("dragstart"+a,l).on("selectstart"+a,l);if(xh){var d=$g.style,e=d[xh];d[xh]="none"}return function(f){function g(){c.on(b,null)}c.on(a,null),xh&&(d[xh]=e),f&&(c.on(b,function(){l(),g()},!0),setTimeout(g,0))}}function L(a,b){b.changedTouches&&(b=b.changedTouches[0]);var c=a.ownerSVGElement||a;if(c.createSVGPoint){var d=c.createSVGPoint();if(0>zh&&(_g.scrollX||_g.scrollY)){c=Wg.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var e=c[0][0].getScreenCTM();zh=!(e.f||e.e),c.remove()}return zh?(d.x=b.pageX,d.y=b.pageY):(d.x=b.clientX,d.y=b.clientY),d=d.matrixTransform(a.getScreenCTM().inverse()),[d.x,d.y]}var f=a.getBoundingClientRect();return[b.clientX-f.left-a.clientLeft,b.clientY-f.top-a.clientTop]}function M(a){return a>0?1:0>a?-1:0}function N(a){return a>1?0:-1>a?Ah:Math.acos(a)}function O(a){return a>1?Ch:-1>a?-Ch:Math.asin(a)}function P(a){return((a=Math.exp(a))-1/a)/2}function Q(a){return((a=Math.exp(a))+1/a)/2}function R(a){return((a=Math.exp(2*a))-1)/(a+1)}function S(a){return(a=Math.sin(a/2))*a}function T(){}function U(a,b,c){return new V(a,b,c)}function V(a,b,c){this.h=a,this.s=b,this.l=c}function W(a,b,c){function d(a){return a>360?a-=360:0>a&&(a+=360),60>a?f+(g-f)*a/60:180>a?g:240>a?f+(g-f)*(240-a)/60:f}function e(a){return Math.round(255*d(a))}var f,g;return a=isNaN(a)?0:(a%=360)<0?a+360:a,b=isNaN(b)?0:0>b?0:b>1?1:b,c=0>c?0:c>1?1:c,g=.5>=c?c*(1+b):c+b-c*b,f=2*c-g,hb(e(a+120),e(a),e(a-120))}function X(a,b,c){return new Y(a,b,c)}function Y(a,b,c){this.h=a,this.c=b,this.l=c}function Z(a,b,c){return isNaN(a)&&(a=0),isNaN(b)&&(b=0),$(c,Math.cos(a*=Fh)*b,Math.sin(a)*b)}function $(a,b,c){return new _(a,b,c)}function _(a,b,c){this.l=a,this.a=b,this.b=c}function ab(a,b,c){var d=(a+16)/116,e=d+b/500,f=d-c/200;return e=cb(e)*Qh,d=cb(d)*Rh,f=cb(f)*Sh,hb(eb(3.2404542*e-1.5371385*d-.4985314*f),eb(-.969266*e+1.8760108*d+.041556*f),eb(.0556434*e-.2040259*d+1.0572252*f))}function bb(a,b,c){return a>0?X(Math.atan2(c,b)*Gh,Math.sqrt(b*b+c*c),a):X(0/0,0/0,a)}function cb(a){return a>.206893034?a*a*a:(a-4/29)/7.787037}function db(a){return a>.008856?Math.pow(a,1/3):7.787037*a+4/29}function eb(a){return Math.round(255*(.00304>=a?12.92*a:1.055*Math.pow(a,1/2.4)-.055))}function fb(a){return hb(a>>16,a>>8&255,255&a)}function gb(a){return fb(a)+""}function hb(a,b,c){return new ib(a,b,c)}function ib(a,b,c){this.r=a,this.g=b,this.b=c}function jb(a){return 16>a?"0"+Math.max(0,a).toString(16):Math.min(255,a).toString(16)}function kb(a,b,c){var d,e,f,g=0,h=0,i=0;if(d=/([a-z]+)\((.*)\)/i.exec(a))switch(e=d[2].split(","),d[1]){case"hsl":return c(parseFloat(e[0]),parseFloat(e[1])/100,parseFloat(e[2])/100);case"rgb":return b(ob(e[0]),ob(e[1]),ob(e[2]))}return(f=Vh.get(a))?b(f.r,f.g,f.b):(null!=a&&"#"===a.charAt(0)&&(4===a.length?(g=a.charAt(1),g+=g,h=a.charAt(2),h+=h,i=a.charAt(3),i+=i):7===a.length&&(g=a.substring(1,3),h=a.substring(3,5),i=a.substring(5,7)),g=parseInt(g,16),h=parseInt(h,16),i=parseInt(i,16)),b(g,h,i))}function lb(a,b,c){var d,e,f=Math.min(a/=255,b/=255,c/=255),g=Math.max(a,b,c),h=g-f,i=(g+f)/2;return h?(e=.5>i?h/(g+f):h/(2-g-f),d=a==g?(b-c)/h+(c>b?6:0):b==g?(c-a)/h+2:(a-b)/h+4,d*=60):(d=0/0,e=i>0&&1>i?0:d),U(d,e,i)}function mb(a,b,c){a=nb(a),b=nb(b),c=nb(c);var d=db((.4124564*a+.3575761*b+.1804375*c)/Qh),e=db((.2126729*a+.7151522*b+.072175*c)/Rh),f=db((.0193339*a+.119192*b+.9503041*c)/Sh);return $(116*e-16,500*(d-e),200*(e-f))}function nb(a){return(a/=255)<=.04045?a/12.92:Math.pow((a+.055)/1.055,2.4)}function ob(a){var b=parseFloat(a);return"%"===a.charAt(a.length-1)?Math.round(2.55*b):b}function pb(a){return"function"==typeof a?a:function(){return a}}function qb(a){return a}function rb(a){return function(b,c,d){return 2===arguments.length&&"function"==typeof c&&(d=c,c=null),sb(b,c,a,d)}}function sb(a,b,c,d){function e(){var a,b=i.status;if(!b&&i.responseText||b>=200&&300>b||304===b){try{a=c.call(f,i)}catch(d){return void g.error.call(f,d)}g.load.call(f,a)}else g.error.call(f,i)}var f={},g=Wg.dispatch("beforesend","progress","load","error"),h={},i=new XMLHttpRequest,j=null;return!_g.XDomainRequest||"withCredentials"in i||!/^(http(s)?:)?\/\//.test(a)||(i=new XDomainRequest),"onload"in i?i.onload=i.onerror=e:i.onreadystatechange=function(){i.readyState>3&&e()},i.onprogress=function(a){var b=Wg.event;Wg.event=a;try{g.progress.call(f,i)}finally{Wg.event=b}},f.header=function(a,b){return a=(a+"").toLowerCase(),arguments.length<2?h[a]:(null==b?delete h[a]:h[a]=b+"",f)},f.mimeType=function(a){return arguments.length?(b=null==a?null:a+"",f):b},f.responseType=function(a){return arguments.length?(j=a,f):j},f.response=function(a){return c=a,f},["get","post"].forEach(function(a){f[a]=function(){return f.send.apply(f,[a].concat(Yg(arguments)))}}),f.send=function(c,d,e){if(2===arguments.length&&"function"==typeof d&&(e=d,d=null),i.open(c,a,!0),null==b||"accept"in h||(h.accept=b+",*/*"),i.setRequestHeader)for(var k in h)i.setRequestHeader(k,h[k]);return null!=b&&i.overrideMimeType&&i.overrideMimeType(b),null!=j&&(i.responseType=j),null!=e&&f.on("error",e).on("load",function(a){e(null,a)}),g.beforesend.call(f,i),i.send(null==d?null:d),f},f.abort=function(){return i.abort(),f},Wg.rebind(f,g,"on"),null==d?f:f.get(tb(d))}function tb(a){return 1===a.length?function(b,c){a(null==b?c:null)}:a}function ub(){var a=vb(),b=wb()-a;b>24?(isFinite(b)&&(clearTimeout(Zh),Zh=setTimeout(ub,b)),Yh=0):(Yh=1,_h(ub))}function vb(){var a=Date.now();for($h=Wh;$h;)a>=$h.t&&($h.f=$h.c(a-$h.t)),$h=$h.n;return a}function wb(){for(var a,b=Wh,c=1/0;b;)b.f?b=a?a.n=b.n:Wh=b.n:(b.t<c&&(c=b.t),b=(a=b).n);return Xh=a,c}function xb(a,b){var c=Math.pow(10,3*ih(8-b));return{scale:b>8?function(a){return a/c}:function(a){return a*c},symbol:a}}function yb(a,b){return b-(a?Math.ceil(Math.log(a)/Math.LN10):1)}function zb(a){return a+""}function Ab(){}function Bb(a,b,c){var d=c.s=a+b,e=d-a,f=d-e;c.t=a-f+(b-e)}function Cb(a,b){a&&li.hasOwnProperty(a.type)&&li[a.type](a,b)}function Db(a,b,c){var d,e=-1,f=a.length-c;for(b.lineStart();++e<f;)d=a[e],b.point(d[0],d[1],d[2]);b.lineEnd()}function Eb(a,b){var c=-1,d=a.length;for(b.polygonStart();++c<d;)Db(a[c],b,1);b.polygonEnd()}function Fb(){function a(a,b){a*=Fh,b=b*Fh/2+Ah/4;var c=a-d,g=Math.cos(b),h=Math.sin(b),i=f*h,j=e*g+i*Math.cos(c),k=i*Math.sin(c);ni.add(Math.atan2(k,j)),d=a,e=g,f=h}var b,c,d,e,f;oi.point=function(g,h){oi.point=a,d=(b=g)*Fh,e=Math.cos(h=(c=h)*Fh/2+Ah/4),f=Math.sin(h)},oi.lineEnd=function(){a(b,c)}}function Gb(a){var b=a[0],c=a[1],d=Math.cos(c);return[d*Math.cos(b),d*Math.sin(b),Math.sin(c)]}function Hb(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]}function Ib(a,b){return[a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0]]}function Jb(a,b){a[0]+=b[0],a[1]+=b[1],a[2]+=b[2]}function Kb(a,b){return[a[0]*b,a[1]*b,a[2]*b]}function Lb(a){var b=Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]);a[0]/=b,a[1]/=b,a[2]/=b}function Mb(a){return[Math.atan2(a[1],a[0]),O(a[2])]}function Nb(a,b){return ih(a[0]-b[0])<Dh&&ih(a[1]-b[1])<Dh}function Ob(a,b){a*=Fh;var c=Math.cos(b*=Fh);Pb(c*Math.cos(a),c*Math.sin(a),Math.sin(b))}function Pb(a,b,c){++pi,ri+=(a-ri)/pi,si+=(b-si)/pi,ti+=(c-ti)/pi}function Qb(){function a(a,e){a*=Fh;var f=Math.cos(e*=Fh),g=f*Math.cos(a),h=f*Math.sin(a),i=Math.sin(e),j=Math.atan2(Math.sqrt((j=c*i-d*h)*j+(j=d*g-b*i)*j+(j=b*h-c*g)*j),b*g+c*h+d*i);qi+=j,ui+=j*(b+(b=g)),vi+=j*(c+(c=h)),wi+=j*(d+(d=i)),Pb(b,c,d)}var b,c,d;Ai.point=function(e,f){e*=Fh;var g=Math.cos(f*=Fh);b=g*Math.cos(e),c=g*Math.sin(e),d=Math.sin(f),Ai.point=a,Pb(b,c,d)}}function Rb(){Ai.point=Ob}function Sb(){function a(a,b){a*=Fh;var c=Math.cos(b*=Fh),g=c*Math.cos(a),h=c*Math.sin(a),i=Math.sin(b),j=e*i-f*h,k=f*g-d*i,l=d*h-e*g,m=Math.sqrt(j*j+k*k+l*l),n=d*g+e*h+f*i,o=m&&-N(n)/m,p=Math.atan2(m,n);xi+=o*j,yi+=o*k,zi+=o*l,qi+=p,ui+=p*(d+(d=g)),vi+=p*(e+(e=h)),wi+=p*(f+(f=i)),Pb(d,e,f)}var b,c,d,e,f;Ai.point=function(g,h){b=g,c=h,Ai.point=a,g*=Fh;var i=Math.cos(h*=Fh);d=i*Math.cos(g),e=i*Math.sin(g),f=Math.sin(h),Pb(d,e,f)
+},Ai.lineEnd=function(){a(b,c),Ai.lineEnd=Rb,Ai.point=Ob}}function Tb(){return!0}function Ub(a,b,c,d,e){var f=[],g=[];if(a.forEach(function(a){if(!((b=a.length-1)<=0)){var b,c=a[0],d=a[b];if(Nb(c,d)){e.lineStart();for(var h=0;b>h;++h)e.point((c=a[h])[0],c[1]);return void e.lineEnd()}var i=new Wb(c,a,null,!0),j=new Wb(c,null,i,!1);i.o=j,f.push(i),g.push(j),i=new Wb(d,a,null,!1),j=new Wb(d,null,i,!0),i.o=j,f.push(i),g.push(j)}}),g.sort(b),Vb(f),Vb(g),f.length){for(var h=0,i=c,j=g.length;j>h;++h)g[h].e=i=!i;for(var k,l,m=f[0];;){for(var n=m,o=!0;n.v;)if((n=n.n)===m)return;k=n.z,e.lineStart();do{if(n.v=n.o.v=!0,n.e){if(o)for(var h=0,j=k.length;j>h;++h)e.point((l=k[h])[0],l[1]);else d(n.x,n.n.x,1,e);n=n.n}else{if(o){k=n.p.z;for(var h=k.length-1;h>=0;--h)e.point((l=k[h])[0],l[1])}else d(n.x,n.p.x,-1,e);n=n.p}n=n.o,k=n.z,o=!o}while(!n.v);e.lineEnd()}}}function Vb(a){if(b=a.length){for(var b,c,d=0,e=a[0];++d<b;)e.n=c=a[d],c.p=e,e=c;e.n=c=a[0],c.p=e}}function Wb(a,b,c,d){this.x=a,this.z=b,this.o=c,this.e=d,this.v=!1,this.n=this.p=null}function Xb(a,b,c,d){return function(e,f){function g(b,c){var d=e(b,c);a(b=d[0],c=d[1])&&f.point(b,c)}function h(a,b){var c=e(a,b);q.point(c[0],c[1])}function i(){s.point=h,q.lineStart()}function j(){s.point=g,q.lineEnd()}function k(a,b){p.push([a,b]);var c=e(a,b);u.point(c[0],c[1])}function l(){u.lineStart(),p=[]}function m(){k(p[0][0],p[0][1]),u.lineEnd();var a,b=u.clean(),c=t.buffer(),d=c.length;if(p.pop(),o.push(p),p=null,d){if(1&b){a=c[0];var e,d=a.length-1,g=-1;for(f.lineStart();++g<d;)f.point((e=a[g])[0],e[1]);return void f.lineEnd()}d>1&&2&b&&c.push(c.pop().concat(c.shift())),n.push(c.filter(Yb))}}var n,o,p,q=b(f),r=e.invert(d[0],d[1]),s={point:g,lineStart:i,lineEnd:j,polygonStart:function(){s.point=k,s.lineStart=l,s.lineEnd=m,n=[],o=[],f.polygonStart()},polygonEnd:function(){s.point=g,s.lineStart=i,s.lineEnd=j,n=Wg.merge(n);var a=_b(r,o);n.length?Ub(n,$b,a,c,f):a&&(f.lineStart(),c(null,null,1,f),f.lineEnd()),f.polygonEnd(),n=o=null},sphere:function(){f.polygonStart(),f.lineStart(),c(null,null,1,f),f.lineEnd(),f.polygonEnd()}},t=Zb(),u=b(t);return s}}function Yb(a){return a.length>1}function Zb(){var a,b=[];return{lineStart:function(){b.push(a=[])},point:function(b,c){a.push([b,c])},lineEnd:i,buffer:function(){var c=b;return b=[],a=null,c},rejoin:function(){b.length>1&&b.push(b.pop().concat(b.shift()))}}}function $b(a,b){return((a=a.x)[0]<0?a[1]-Ch-Dh:Ch-a[1])-((b=b.x)[0]<0?b[1]-Ch-Dh:Ch-b[1])}function _b(a,b){var c=a[0],d=a[1],e=[Math.sin(c),-Math.cos(c),0],f=0,g=0;ni.reset();for(var h=0,i=b.length;i>h;++h){var j=b[h],k=j.length;if(k)for(var l=j[0],m=l[0],n=l[1]/2+Ah/4,o=Math.sin(n),p=Math.cos(n),q=1;;){q===k&&(q=0),a=j[q];var r=a[0],s=a[1]/2+Ah/4,t=Math.sin(s),u=Math.cos(s),v=r-m,w=ih(v)>Ah,x=o*t;if(ni.add(Math.atan2(x*Math.sin(v),p*u+x*Math.cos(v))),f+=w?v+(v>=0?Bh:-Bh):v,w^m>=c^r>=c){var y=Ib(Gb(l),Gb(a));Lb(y);var z=Ib(e,y);Lb(z);var A=(w^v>=0?-1:1)*O(z[2]);(d>A||d===A&&(y[0]||y[1]))&&(g+=w^v>=0?1:-1)}if(!q++)break;m=r,o=t,p=u,l=a}}return(-Dh>f||Dh>f&&0>ni)^1&g}function ac(a){var b,c=0/0,d=0/0,e=0/0;return{lineStart:function(){a.lineStart(),b=1},point:function(f,g){var h=f>0?Ah:-Ah,i=ih(f-c);ih(i-Ah)<Dh?(a.point(c,d=(d+g)/2>0?Ch:-Ch),a.point(e,d),a.lineEnd(),a.lineStart(),a.point(h,d),a.point(f,d),b=0):e!==h&&i>=Ah&&(ih(c-e)<Dh&&(c-=e*Dh),ih(f-h)<Dh&&(f-=h*Dh),d=bc(c,d,f,g),a.point(e,d),a.lineEnd(),a.lineStart(),a.point(h,d),b=0),a.point(c=f,d=g),e=h},lineEnd:function(){a.lineEnd(),c=d=0/0},clean:function(){return 2-b}}}function bc(a,b,c,d){var e,f,g=Math.sin(a-c);return ih(g)>Dh?Math.atan((Math.sin(b)*(f=Math.cos(d))*Math.sin(c)-Math.sin(d)*(e=Math.cos(b))*Math.sin(a))/(e*f*g)):(b+d)/2}function cc(a,b,c,d){var e;if(null==a)e=c*Ch,d.point(-Ah,e),d.point(0,e),d.point(Ah,e),d.point(Ah,0),d.point(Ah,-e),d.point(0,-e),d.point(-Ah,-e),d.point(-Ah,0),d.point(-Ah,e);else if(ih(a[0]-b[0])>Dh){var f=a[0]<b[0]?Ah:-Ah;e=c*f/2,d.point(-f,e),d.point(0,e),d.point(f,e)}else d.point(b[0],b[1])}function dc(a){function b(a,b){return Math.cos(a)*Math.cos(b)>f}function c(a){var c,f,i,j,k;return{lineStart:function(){j=i=!1,k=1},point:function(l,m){var n,o=[l,m],p=b(l,m),q=g?p?0:e(l,m):p?e(l+(0>l?Ah:-Ah),m):0;if(!c&&(j=i=p)&&a.lineStart(),p!==i&&(n=d(c,o),(Nb(c,n)||Nb(o,n))&&(o[0]+=Dh,o[1]+=Dh,p=b(o[0],o[1]))),p!==i)k=0,p?(a.lineStart(),n=d(o,c),a.point(n[0],n[1])):(n=d(c,o),a.point(n[0],n[1]),a.lineEnd()),c=n;else if(h&&c&&g^p){var r;q&f||!(r=d(o,c,!0))||(k=0,g?(a.lineStart(),a.point(r[0][0],r[0][1]),a.point(r[1][0],r[1][1]),a.lineEnd()):(a.point(r[1][0],r[1][1]),a.lineEnd(),a.lineStart(),a.point(r[0][0],r[0][1])))}!p||c&&Nb(c,o)||a.point(o[0],o[1]),c=o,i=p,f=q},lineEnd:function(){i&&a.lineEnd(),c=null},clean:function(){return k|(j&&i)<<1}}}function d(a,b,c){var d=Gb(a),e=Gb(b),g=[1,0,0],h=Ib(d,e),i=Hb(h,h),j=h[0],k=i-j*j;if(!k)return!c&&a;var l=f*i/k,m=-f*j/k,n=Ib(g,h),o=Kb(g,l),p=Kb(h,m);Jb(o,p);var q=n,r=Hb(o,q),s=Hb(q,q),t=r*r-s*(Hb(o,o)-1);if(!(0>t)){var u=Math.sqrt(t),v=Kb(q,(-r-u)/s);if(Jb(v,o),v=Mb(v),!c)return v;var w,x=a[0],y=b[0],z=a[1],A=b[1];x>y&&(w=x,x=y,y=w);var B=y-x,C=ih(B-Ah)<Dh,D=C||Dh>B;if(!C&&z>A&&(w=z,z=A,A=w),D?C?z+A>0^v[1]<(ih(v[0]-x)<Dh?z:A):z<=v[1]&&v[1]<=A:B>Ah^(x<=v[0]&&v[0]<=y)){var E=Kb(q,(-r+u)/s);return Jb(E,o),[v,Mb(E)]}}}function e(b,c){var d=g?a:Ah-a,e=0;return-d>b?e|=1:b>d&&(e|=2),-d>c?e|=4:c>d&&(e|=8),e}var f=Math.cos(a),g=f>0,h=ih(f)>Dh,i=Fc(a,6*Fh);return Xb(b,c,i,g?[0,-a]:[-Ah,a-Ah])}function ec(a,b,c,d){return function(e){var f,g=e.a,h=e.b,i=g.x,j=g.y,k=h.x,l=h.y,m=0,n=1,o=k-i,p=l-j;if(f=a-i,o||!(f>0)){if(f/=o,0>o){if(m>f)return;n>f&&(n=f)}else if(o>0){if(f>n)return;f>m&&(m=f)}if(f=c-i,o||!(0>f)){if(f/=o,0>o){if(f>n)return;f>m&&(m=f)}else if(o>0){if(m>f)return;n>f&&(n=f)}if(f=b-j,p||!(f>0)){if(f/=p,0>p){if(m>f)return;n>f&&(n=f)}else if(p>0){if(f>n)return;f>m&&(m=f)}if(f=d-j,p||!(0>f)){if(f/=p,0>p){if(f>n)return;f>m&&(m=f)}else if(p>0){if(m>f)return;n>f&&(n=f)}return m>0&&(e.a={x:i+m*o,y:j+m*p}),1>n&&(e.b={x:i+n*o,y:j+n*p}),e}}}}}}function fc(a,b,c,d){function e(d,e){return ih(d[0]-a)<Dh?e>0?0:3:ih(d[0]-c)<Dh?e>0?2:1:ih(d[1]-b)<Dh?e>0?1:0:e>0?3:2}function f(a,b){return g(a.x,b.x)}function g(a,b){var c=e(a,1),d=e(b,1);return c!==d?c-d:0===c?b[1]-a[1]:1===c?a[0]-b[0]:2===c?a[1]-b[1]:b[0]-a[0]}return function(h){function i(a){for(var b=0,c=r.length,d=a[1],e=0;c>e;++e)for(var f,g=1,h=r[e],i=h.length,k=h[0];i>g;++g)f=h[g],k[1]<=d?f[1]>d&&j(k,f,a)>0&&++b:f[1]<=d&&j(k,f,a)<0&&--b,k=f;return 0!==b}function j(a,b,c){return(b[0]-a[0])*(c[1]-a[1])-(c[0]-a[0])*(b[1]-a[1])}function k(f,h,i,j){var k=0,l=0;if(null==f||(k=e(f,i))!==(l=e(h,i))||g(f,h)<0^i>0){do j.point(0===k||3===k?a:c,k>1?d:b);while((k=(k+i+4)%4)!==l)}else j.point(h[0],h[1])}function l(e,f){return e>=a&&c>=e&&f>=b&&d>=f}function m(a,b){l(a,b)&&h.point(a,b)}function n(){E.point=p,r&&r.push(s=[]),z=!0,y=!1,w=x=0/0}function o(){q&&(p(t,u),v&&y&&C.rejoin(),q.push(C.buffer())),E.point=m,y&&h.lineEnd()}function p(a,b){a=Math.max(-Ci,Math.min(Ci,a)),b=Math.max(-Ci,Math.min(Ci,b));var c=l(a,b);if(r&&s.push([a,b]),z)t=a,u=b,v=c,z=!1,c&&(h.lineStart(),h.point(a,b));else if(c&&y)h.point(a,b);else{var d={a:{x:w,y:x},b:{x:a,y:b}};D(d)?(y||(h.lineStart(),h.point(d.a.x,d.a.y)),h.point(d.b.x,d.b.y),c||h.lineEnd(),A=!1):c&&(h.lineStart(),h.point(a,b),A=!1)}w=a,x=b,y=c}var q,r,s,t,u,v,w,x,y,z,A,B=h,C=Zb(),D=ec(a,b,c,d),E={point:m,lineStart:n,lineEnd:o,polygonStart:function(){h=C,q=[],r=[],A=!0},polygonEnd:function(){h=B,q=Wg.merge(q);var b=i([a,d]),c=A&&b,e=q.length;(c||e)&&(h.polygonStart(),c&&(h.lineStart(),k(null,null,1,h),h.lineEnd()),e&&Ub(q,f,b,k,h),h.polygonEnd()),q=r=s=null}};return E}}function gc(a,b){function c(c,d){return c=a(c,d),b(c[0],c[1])}return a.invert&&b.invert&&(c.invert=function(c,d){return c=b.invert(c,d),c&&a.invert(c[0],c[1])}),c}function hc(a){var b=0,c=Ah/3,d=xc(a),e=d(b,c);return e.parallels=function(a){return arguments.length?d(b=a[0]*Ah/180,c=a[1]*Ah/180):[b/Ah*180,c/Ah*180]},e}function ic(a,b){function c(a,b){var c=Math.sqrt(f-2*e*Math.sin(b))/e;return[c*Math.sin(a*=e),g-c*Math.cos(a)]}var d=Math.sin(a),e=(d+Math.sin(b))/2,f=1+d*(2*e-d),g=Math.sqrt(f)/e;return c.invert=function(a,b){var c=g-b;return[Math.atan2(a,c)/e,O((f-(a*a+c*c)*e*e)/(2*e))]},c}function jc(){function a(a,b){Ei+=e*a-d*b,d=a,e=b}var b,c,d,e;Ji.point=function(f,g){Ji.point=a,b=d=f,c=e=g},Ji.lineEnd=function(){a(b,c)}}function kc(a,b){Fi>a&&(Fi=a),a>Hi&&(Hi=a),Gi>b&&(Gi=b),b>Ii&&(Ii=b)}function lc(){function a(a,b){g.push("M",a,",",b,f)}function b(a,b){g.push("M",a,",",b),h.point=c}function c(a,b){g.push("L",a,",",b)}function d(){h.point=a}function e(){g.push("Z")}var f=mc(4.5),g=[],h={point:a,lineStart:function(){h.point=b},lineEnd:d,polygonStart:function(){h.lineEnd=e},polygonEnd:function(){h.lineEnd=d,h.point=a},pointRadius:function(a){return f=mc(a),h},result:function(){if(g.length){var a=g.join("");return g=[],a}}};return h}function mc(a){return"m0,"+a+"a"+a+","+a+" 0 1,1 0,"+-2*a+"a"+a+","+a+" 0 1,1 0,"+2*a+"z"}function nc(a,b){ri+=a,si+=b,++ti}function oc(){function a(a,d){var e=a-b,f=d-c,g=Math.sqrt(e*e+f*f);ui+=g*(b+a)/2,vi+=g*(c+d)/2,wi+=g,nc(b=a,c=d)}var b,c;Li.point=function(d,e){Li.point=a,nc(b=d,c=e)}}function pc(){Li.point=nc}function qc(){function a(a,b){var c=a-d,f=b-e,g=Math.sqrt(c*c+f*f);ui+=g*(d+a)/2,vi+=g*(e+b)/2,wi+=g,g=e*a-d*b,xi+=g*(d+a),yi+=g*(e+b),zi+=3*g,nc(d=a,e=b)}var b,c,d,e;Li.point=function(f,g){Li.point=a,nc(b=d=f,c=e=g)},Li.lineEnd=function(){a(b,c)}}function rc(a){function b(b,c){a.moveTo(b,c),a.arc(b,c,g,0,Bh)}function c(b,c){a.moveTo(b,c),h.point=d}function d(b,c){a.lineTo(b,c)}function e(){h.point=b}function f(){a.closePath()}var g=4.5,h={point:b,lineStart:function(){h.point=c},lineEnd:e,polygonStart:function(){h.lineEnd=f},polygonEnd:function(){h.lineEnd=e,h.point=b},pointRadius:function(a){return g=a,h},result:i};return h}function sc(a){function b(a){return(h?d:c)(a)}function c(b){return vc(b,function(c,d){c=a(c,d),b.point(c[0],c[1])})}function d(b){function c(c,d){c=a(c,d),b.point(c[0],c[1])}function d(){t=0/0,y.point=f,b.lineStart()}function f(c,d){var f=Gb([c,d]),g=a(c,d);e(t,u,s,v,w,x,t=g[0],u=g[1],s=c,v=f[0],w=f[1],x=f[2],h,b),b.point(t,u)}function g(){y.point=c,b.lineEnd()}function i(){d(),y.point=j,y.lineEnd=k}function j(a,b){f(l=a,m=b),n=t,o=u,p=v,q=w,r=x,y.point=f}function k(){e(t,u,s,v,w,x,n,o,l,p,q,r,h,b),y.lineEnd=g,g()}var l,m,n,o,p,q,r,s,t,u,v,w,x,y={point:c,lineStart:d,lineEnd:g,polygonStart:function(){b.polygonStart(),y.lineStart=i},polygonEnd:function(){b.polygonEnd(),y.lineStart=d}};return y}function e(b,c,d,h,i,j,k,l,m,n,o,p,q,r){var s=k-b,t=l-c,u=s*s+t*t;if(u>4*f&&q--){var v=h+n,w=i+o,x=j+p,y=Math.sqrt(v*v+w*w+x*x),z=Math.asin(x/=y),A=ih(ih(x)-1)<Dh||ih(d-m)<Dh?(d+m)/2:Math.atan2(w,v),B=a(A,z),C=B[0],D=B[1],E=C-b,F=D-c,G=t*E-s*F;(G*G/u>f||ih((s*E+t*F)/u-.5)>.3||g>h*n+i*o+j*p)&&(e(b,c,d,h,i,j,C,D,A,v/=y,w/=y,x,q,r),r.point(C,D),e(C,D,A,v,w,x,k,l,m,n,o,p,q,r))}}var f=.5,g=Math.cos(30*Fh),h=16;return b.precision=function(a){return arguments.length?(h=(f=a*a)>0&&16,b):Math.sqrt(f)},b}function tc(a){var b=sc(function(b,c){return a([b*Gh,c*Gh])});return function(a){return yc(b(a))}}function uc(a){this.stream=a}function vc(a,b){return{point:b,sphere:function(){a.sphere()},lineStart:function(){a.lineStart()},lineEnd:function(){a.lineEnd()},polygonStart:function(){a.polygonStart()},polygonEnd:function(){a.polygonEnd()}}}function wc(a){return xc(function(){return a})()}function xc(a){function b(a){return a=h(a[0]*Fh,a[1]*Fh),[a[0]*m+i,j-a[1]*m]}function c(a){return a=h.invert((a[0]-i)/m,(j-a[1])/m),a&&[a[0]*Gh,a[1]*Gh]}function d(){h=gc(g=Bc(r,s,t),f);var a=f(p,q);return i=n-a[0]*m,j=o+a[1]*m,e()}function e(){return k&&(k.valid=!1,k=null),b}var f,g,h,i,j,k,l=sc(function(a,b){return a=f(a,b),[a[0]*m+i,j-a[1]*m]}),m=150,n=480,o=250,p=0,q=0,r=0,s=0,t=0,u=Bi,v=qb,w=null,x=null;return b.stream=function(a){return k&&(k.valid=!1),k=yc(u(g,l(v(a)))),k.valid=!0,k},b.clipAngle=function(a){return arguments.length?(u=null==a?(w=a,Bi):dc((w=+a)*Fh),e()):w},b.clipExtent=function(a){return arguments.length?(x=a,v=a?fc(a[0][0],a[0][1],a[1][0],a[1][1]):qb,e()):x},b.scale=function(a){return arguments.length?(m=+a,d()):m},b.translate=function(a){return arguments.length?(n=+a[0],o=+a[1],d()):[n,o]},b.center=function(a){return arguments.length?(p=a[0]%360*Fh,q=a[1]%360*Fh,d()):[p*Gh,q*Gh]},b.rotate=function(a){return arguments.length?(r=a[0]%360*Fh,s=a[1]%360*Fh,t=a.length>2?a[2]%360*Fh:0,d()):[r*Gh,s*Gh,t*Gh]},Wg.rebind(b,l,"precision"),function(){return f=a.apply(this,arguments),b.invert=f.invert&&c,d()}}function yc(a){return vc(a,function(b,c){a.point(b*Fh,c*Fh)})}function zc(a,b){return[a,b]}function Ac(a,b){return[a>Ah?a-Bh:-Ah>a?a+Bh:a,b]}function Bc(a,b,c){return a?b||c?gc(Dc(a),Ec(b,c)):Dc(a):b||c?Ec(b,c):Ac}function Cc(a){return function(b,c){return b+=a,[b>Ah?b-Bh:-Ah>b?b+Bh:b,c]}}function Dc(a){var b=Cc(a);return b.invert=Cc(-a),b}function Ec(a,b){function c(a,b){var c=Math.cos(b),h=Math.cos(a)*c,i=Math.sin(a)*c,j=Math.sin(b),k=j*d+h*e;return[Math.atan2(i*f-k*g,h*d-j*e),O(k*f+i*g)]}var d=Math.cos(a),e=Math.sin(a),f=Math.cos(b),g=Math.sin(b);return c.invert=function(a,b){var c=Math.cos(b),h=Math.cos(a)*c,i=Math.sin(a)*c,j=Math.sin(b),k=j*f-i*g;return[Math.atan2(i*f+j*g,h*d+k*e),O(k*d-h*e)]},c}function Fc(a,b){var c=Math.cos(a),d=Math.sin(a);return function(e,f,g,h){var i=g*b;null!=e?(e=Gc(c,e),f=Gc(c,f),(g>0?f>e:e>f)&&(e+=g*Bh)):(e=a+g*Bh,f=a-.5*i);for(var j,k=e;g>0?k>f:f>k;k-=i)h.point((j=Mb([c,-d*Math.cos(k),-d*Math.sin(k)]))[0],j[1])}}function Gc(a,b){var c=Gb(b);c[0]-=a,Lb(c);var d=N(-c[1]);return((-c[2]<0?-d:d)+2*Math.PI-Dh)%(2*Math.PI)}function Hc(a,b,c){var d=Wg.range(a,b-Dh,c).concat(b);return function(a){return d.map(function(b){return[a,b]})}}function Ic(a,b,c){var d=Wg.range(a,b-Dh,c).concat(b);return function(a){return d.map(function(b){return[b,a]})}}function Jc(a){return a.source}function Kc(a){return a.target}function Lc(a,b,c,d){var e=Math.cos(b),f=Math.sin(b),g=Math.cos(d),h=Math.sin(d),i=e*Math.cos(a),j=e*Math.sin(a),k=g*Math.cos(c),l=g*Math.sin(c),m=2*Math.asin(Math.sqrt(S(d-b)+e*g*S(c-a))),n=1/Math.sin(m),o=m?function(a){var b=Math.sin(a*=m)*n,c=Math.sin(m-a)*n,d=c*i+b*k,e=c*j+b*l,g=c*f+b*h;return[Math.atan2(e,d)*Gh,Math.atan2(g,Math.sqrt(d*d+e*e))*Gh]}:function(){return[a*Gh,b*Gh]};return o.distance=m,o}function Mc(){function a(a,e){var f=Math.sin(e*=Fh),g=Math.cos(e),h=ih((a*=Fh)-b),i=Math.cos(h);Mi+=Math.atan2(Math.sqrt((h=g*Math.sin(h))*h+(h=d*f-c*g*i)*h),c*f+d*g*i),b=a,c=f,d=g}var b,c,d;Ni.point=function(e,f){b=e*Fh,c=Math.sin(f*=Fh),d=Math.cos(f),Ni.point=a},Ni.lineEnd=function(){Ni.point=Ni.lineEnd=i}}function Nc(a,b){function c(b,c){var d=Math.cos(b),e=Math.cos(c),f=a(d*e);return[f*e*Math.sin(b),f*Math.sin(c)]}return c.invert=function(a,c){var d=Math.sqrt(a*a+c*c),e=b(d),f=Math.sin(e),g=Math.cos(e);return[Math.atan2(a*f,d*g),Math.asin(d&&c*f/d)]},c}function Oc(a,b){function c(a,b){var c=ih(ih(b)-Ch)<Dh?0:g/Math.pow(e(b),f);return[c*Math.sin(f*a),g-c*Math.cos(f*a)]}var d=Math.cos(a),e=function(a){return Math.tan(Ah/4+a/2)},f=a===b?Math.sin(a):Math.log(d/Math.cos(b))/Math.log(e(b)/e(a)),g=d*Math.pow(e(a),f)/f;return f?(c.invert=function(a,b){var c=g-b,d=M(f)*Math.sqrt(a*a+c*c);return[Math.atan2(a,c)/f,2*Math.atan(Math.pow(g/d,1/f))-Ch]},c):Qc}function Pc(a,b){function c(a,b){var c=f-b;return[c*Math.sin(e*a),f-c*Math.cos(e*a)]}var d=Math.cos(a),e=a===b?Math.sin(a):(d-Math.cos(b))/(b-a),f=d/e+a;return ih(e)<Dh?zc:(c.invert=function(a,b){var c=f-b;return[Math.atan2(a,c)/e,f-M(e)*Math.sqrt(a*a+c*c)]},c)}function Qc(a,b){return[a,Math.log(Math.tan(Ah/4+b/2))]}function Rc(a){var b,c=wc(a),d=c.scale,e=c.translate,f=c.clipExtent;return c.scale=function(){var a=d.apply(c,arguments);return a===c?b?c.clipExtent(null):c:a},c.translate=function(){var a=e.apply(c,arguments);return a===c?b?c.clipExtent(null):c:a},c.clipExtent=function(a){var g=f.apply(c,arguments);if(g===c){if(b=null==a){var h=Ah*d(),i=e();f([[i[0]-h,i[1]-h],[i[0]+h,i[1]+h]])}}else b&&(g=null);return g},c.clipExtent(null)}function Sc(a,b){return[Math.log(Math.tan(Ah/4+b/2)),-a]}function Tc(a){return a[0]}function Uc(a){return a[1]}function Vc(a,b,c,d){var e,f,g,h,i,j,k;return e=d[a],f=e[0],g=e[1],e=d[b],h=e[0],i=e[1],e=d[c],j=e[0],k=e[1],(k-g)*(h-f)-(i-g)*(j-f)>0}function Wc(a,b,c){return(c[0]-b[0])*(a[1]-b[1])<(c[1]-b[1])*(a[0]-b[0])}function Xc(a,b,c,d){var e=a[0],f=c[0],g=b[0]-e,h=d[0]-f,i=a[1],j=c[1],k=b[1]-i,l=d[1]-j,m=(h*(i-j)-l*(e-f))/(l*g-h*k);return[e+m*g,i+m*k]}function Yc(a){var b=a[0],c=a[a.length-1];return!(b[0]-c[0]||b[1]-c[1])}function Zc(){sd(this),this.edge=this.site=this.circle=null}function $c(a){var b=Zi.pop()||new Zc;return b.site=a,b}function _c(a){jd(a),Wi.remove(a),Zi.push(a),sd(a)}function ad(a){var b=a.circle,c=b.x,d=b.cy,e={x:c,y:d},f=a.P,g=a.N,h=[a];_c(a);for(var i=f;i.circle&&ih(c-i.circle.x)<Dh&&ih(d-i.circle.cy)<Dh;)f=i.P,h.unshift(i),_c(i),i=f;h.unshift(i),jd(i);for(var j=g;j.circle&&ih(c-j.circle.x)<Dh&&ih(d-j.circle.cy)<Dh;)g=j.N,h.push(j),_c(j),j=g;h.push(j),jd(j);var k,l=h.length;for(k=1;l>k;++k)j=h[k],i=h[k-1],pd(j.edge,i.site,j.site,e);i=h[0],j=h[l-1],j.edge=nd(i.site,j.site,null,e),id(i),id(j)}function bd(a){for(var b,c,d,e,f=a.x,g=a.y,h=Wi._;h;)if(d=cd(h,g)-f,d>Dh)h=h.L;else{if(e=f-dd(h,g),!(e>Dh)){d>-Dh?(b=h.P,c=h):e>-Dh?(b=h,c=h.N):b=c=h;break}if(!h.R){b=h;break}h=h.R}var i=$c(a);if(Wi.insert(b,i),b||c){if(b===c)return jd(b),c=$c(b.site),Wi.insert(i,c),i.edge=c.edge=nd(b.site,i.site),id(b),void id(c);if(!c)return void(i.edge=nd(b.site,i.site));jd(b),jd(c);var j=b.site,k=j.x,l=j.y,m=a.x-k,n=a.y-l,o=c.site,p=o.x-k,q=o.y-l,r=2*(m*q-n*p),s=m*m+n*n,t=p*p+q*q,u={x:(q*s-n*t)/r+k,y:(m*t-p*s)/r+l};pd(c.edge,j,o,u),i.edge=nd(j,a,null,u),c.edge=nd(a,o,null,u),id(b),id(c)}}function cd(a,b){var c=a.site,d=c.x,e=c.y,f=e-b;if(!f)return d;var g=a.P;if(!g)return-1/0;c=g.site;var h=c.x,i=c.y,j=i-b;if(!j)return h;var k=h-d,l=1/f-1/j,m=k/j;return l?(-m+Math.sqrt(m*m-2*l*(k*k/(-2*j)-i+j/2+e-f/2)))/l+d:(d+h)/2}function dd(a,b){var c=a.N;if(c)return cd(c,b);var d=a.site;return d.y===b?d.x:1/0}function ed(a){this.site=a,this.edges=[]}function fd(a){for(var b,c,d,e,f,g,h,i,j,k,l=a[0][0],m=a[1][0],n=a[0][1],o=a[1][1],p=Vi,q=p.length;q--;)if(f=p[q],f&&f.prepare())for(h=f.edges,i=h.length,g=0;i>g;)k=h[g].end(),d=k.x,e=k.y,j=h[++g%i].start(),b=j.x,c=j.y,(ih(d-b)>Dh||ih(e-c)>Dh)&&(h.splice(g,0,new qd(od(f.site,k,ih(d-l)<Dh&&o-e>Dh?{x:l,y:ih(b-l)<Dh?c:o}:ih(e-o)<Dh&&m-d>Dh?{x:ih(c-o)<Dh?b:m,y:o}:ih(d-m)<Dh&&e-n>Dh?{x:m,y:ih(b-m)<Dh?c:n}:ih(e-n)<Dh&&d-l>Dh?{x:ih(c-n)<Dh?b:l,y:n}:null),f.site,null)),++i)}function gd(a,b){return b.angle-a.angle}function hd(){sd(this),this.x=this.y=this.arc=this.site=this.cy=null}function id(a){var b=a.P,c=a.N;if(b&&c){var d=b.site,e=a.site,f=c.site;if(d!==f){var g=e.x,h=e.y,i=d.x-g,j=d.y-h,k=f.x-g,l=f.y-h,m=2*(i*l-j*k);if(!(m>=-Eh)){var n=i*i+j*j,o=k*k+l*l,p=(l*n-j*o)/m,q=(i*o-k*n)/m,l=q+h,r=$i.pop()||new hd;r.arc=a,r.site=e,r.x=p+g,r.y=l+Math.sqrt(p*p+q*q),r.cy=l,a.circle=r;for(var s=null,t=Yi._;t;)if(r.y<t.y||r.y===t.y&&r.x<=t.x){if(!t.L){s=t.P;break}t=t.L}else{if(!t.R){s=t;break}t=t.R}Yi.insert(s,r),s||(Xi=r)}}}}function jd(a){var b=a.circle;b&&(b.P||(Xi=b.N),Yi.remove(b),$i.push(b),sd(b),a.circle=null)}function kd(a){for(var b,c=Ui,d=ec(a[0][0],a[0][1],a[1][0],a[1][1]),e=c.length;e--;)b=c[e],(!ld(b,a)||!d(b)||ih(b.a.x-b.b.x)<Dh&&ih(b.a.y-b.b.y)<Dh)&&(b.a=b.b=null,c.splice(e,1))}function ld(a,b){var c=a.b;if(c)return!0;var d,e,f=a.a,g=b[0][0],h=b[1][0],i=b[0][1],j=b[1][1],k=a.l,l=a.r,m=k.x,n=k.y,o=l.x,p=l.y,q=(m+o)/2,r=(n+p)/2;if(p===n){if(g>q||q>=h)return;if(m>o){if(f){if(f.y>=j)return}else f={x:q,y:i};c={x:q,y:j}}else{if(f){if(f.y<i)return}else f={x:q,y:j};c={x:q,y:i}}}else if(d=(m-o)/(p-n),e=r-d*q,-1>d||d>1)if(m>o){if(f){if(f.y>=j)return}else f={x:(i-e)/d,y:i};c={x:(j-e)/d,y:j}}else{if(f){if(f.y<i)return}else f={x:(j-e)/d,y:j};c={x:(i-e)/d,y:i}}else if(p>n){if(f){if(f.x>=h)return}else f={x:g,y:d*g+e};c={x:h,y:d*h+e}}else{if(f){if(f.x<g)return}else f={x:h,y:d*h+e};c={x:g,y:d*g+e}}return a.a=f,a.b=c,!0}function md(a,b){this.l=a,this.r=b,this.a=this.b=null}function nd(a,b,c,d){var e=new md(a,b);return Ui.push(e),c&&pd(e,a,b,c),d&&pd(e,b,a,d),Vi[a.i].edges.push(new qd(e,a,b)),Vi[b.i].edges.push(new qd(e,b,a)),e}function od(a,b,c){var d=new md(a,null);return d.a=b,d.b=c,Ui.push(d),d}function pd(a,b,c,d){a.a||a.b?a.l===c?a.b=d:a.a=d:(a.a=d,a.l=b,a.r=c)}function qd(a,b,c){var d=a.a,e=a.b;this.edge=a,this.site=b,this.angle=c?Math.atan2(c.y-b.y,c.x-b.x):a.l===b?Math.atan2(e.x-d.x,d.y-e.y):Math.atan2(d.x-e.x,e.y-d.y)}function rd(){this._=null}function sd(a){a.U=a.C=a.L=a.R=a.P=a.N=null}function td(a,b){var c=b,d=b.R,e=c.U;e?e.L===c?e.L=d:e.R=d:a._=d,d.U=e,c.U=d,c.R=d.L,c.R&&(c.R.U=c),d.L=c}function ud(a,b){var c=b,d=b.L,e=c.U;e?e.L===c?e.L=d:e.R=d:a._=d,d.U=e,c.U=d,c.L=d.R,c.L&&(c.L.U=c),d.R=c}function vd(a){for(;a.L;)a=a.L;return a}function wd(a,b){var c,d,e,f=a.sort(xd).pop();for(Ui=[],Vi=new Array(a.length),Wi=new rd,Yi=new rd;;)if(e=Xi,f&&(!e||f.y<e.y||f.y===e.y&&f.x<e.x))(f.x!==c||f.y!==d)&&(Vi[f.i]=new ed(f),bd(f),c=f.x,d=f.y),f=a.pop();else{if(!e)break;ad(e.arc)}b&&(kd(b),fd(b));var g={cells:Vi,edges:Ui};return Wi=Yi=Ui=Vi=null,g}function xd(a,b){return b.y-a.y||b.x-a.x}function yd(a,b,c){return(a.x-c.x)*(b.y-a.y)-(a.x-b.x)*(c.y-a.y)}function zd(a){return a.x}function Ad(a){return a.y}function Bd(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function Cd(a,b,c,d,e,f){if(!a(b,c,d,e,f)){var g=.5*(c+e),h=.5*(d+f),i=b.nodes;i[0]&&Cd(a,i[0],c,d,g,h),i[1]&&Cd(a,i[1],g,d,e,h),i[2]&&Cd(a,i[2],c,h,g,f),i[3]&&Cd(a,i[3],g,h,e,f)}}function Dd(a,b){a=Wg.rgb(a),b=Wg.rgb(b);var c=a.r,d=a.g,e=a.b,f=b.r-c,g=b.g-d,h=b.b-e;return function(a){return"#"+jb(Math.round(c+f*a))+jb(Math.round(d+g*a))+jb(Math.round(e+h*a))}}function Ed(a,b){var c,d={},e={};for(c in a)c in b?d[c]=Hd(a[c],b[c]):e[c]=a[c];for(c in b)c in a||(e[c]=b[c]);return function(a){for(c in d)e[c]=d[c](a);return e}}function Fd(a,b){return b-=a=+a,function(c){return a+b*c}}function Gd(a,b){var c,d,e,f,g,h=0,i=0,j=[],k=[];for(a+="",b+="",aj.lastIndex=0,d=0;c=aj.exec(b);++d)c.index&&j.push(b.substring(h,i=c.index)),k.push({i:j.length,x:c[0]}),j.push(null),h=aj.lastIndex;for(h<b.length&&j.push(b.substring(h)),d=0,f=k.length;(c=aj.exec(a))&&f>d;++d)if(g=k[d],g.x==c[0]){if(g.i)if(null==j[g.i+1])for(j[g.i-1]+=g.x,j.splice(g.i,1),e=d+1;f>e;++e)k[e].i--;else for(j[g.i-1]+=g.x+j[g.i+1],j.splice(g.i,2),e=d+1;f>e;++e)k[e].i-=2;else if(null==j[g.i+1])j[g.i]=g.x;else for(j[g.i]=g.x+j[g.i+1],j.splice(g.i+1,1),e=d+1;f>e;++e)k[e].i--;k.splice(d,1),f--,d--}else g.x=Fd(parseFloat(c[0]),parseFloat(g.x));for(;f>d;)g=k.pop(),null==j[g.i+1]?j[g.i]=g.x:(j[g.i]=g.x+j[g.i+1],j.splice(g.i+1,1)),f--;return 1===j.length?null==j[0]?(g=k[0].x,function(a){return g(a)+""}):function(){return b}:function(a){for(d=0;f>d;++d)j[(g=k[d]).i]=g.x(a);return j.join("")}}function Hd(a,b){for(var c,d=Wg.interpolators.length;--d>=0&&!(c=Wg.interpolators[d](a,b)););return c}function Id(a,b){var c,d=[],e=[],f=a.length,g=b.length,h=Math.min(a.length,b.length);for(c=0;h>c;++c)d.push(Hd(a[c],b[c]));for(;f>c;++c)e[c]=a[c];for(;g>c;++c)e[c]=b[c];return function(a){for(c=0;h>c;++c)e[c]=d[c](a);return e}}function Jd(a){return function(b){return 0>=b?0:b>=1?1:a(b)}}function Kd(a){return function(b){return 1-a(1-b)}}function Ld(a){return function(b){return.5*(.5>b?a(2*b):2-a(2-2*b))}}function Md(a){return a*a}function Nd(a){return a*a*a}function Od(a){if(0>=a)return 0;if(a>=1)return 1;var b=a*a,c=b*a;return 4*(.5>a?c:3*(a-b)+c-.75)}function Pd(a){return function(b){return Math.pow(b,a)}}function Qd(a){return 1-Math.cos(a*Ch)}function Rd(a){return Math.pow(2,10*(a-1))}function Sd(a){return 1-Math.sqrt(1-a*a)}function Td(a,b){var c;return arguments.length<2&&(b=.45),arguments.length?c=b/Bh*Math.asin(1/a):(a=1,c=b/4),function(d){return 1+a*Math.pow(2,-10*d)*Math.sin((d-c)*Bh/b)}}function Ud(a){return a||(a=1.70158),function(b){return b*b*((a+1)*b-a)}}function Vd(a){return 1/2.75>a?7.5625*a*a:2/2.75>a?7.5625*(a-=1.5/2.75)*a+.75:2.5/2.75>a?7.5625*(a-=2.25/2.75)*a+.9375:7.5625*(a-=2.625/2.75)*a+.984375}function Wd(a,b){a=Wg.hcl(a),b=Wg.hcl(b);var c=a.h,d=a.c,e=a.l,f=b.h-c,g=b.c-d,h=b.l-e;return isNaN(g)&&(g=0,d=isNaN(d)?b.c:d),isNaN(f)?(f=0,c=isNaN(c)?b.h:c):f>180?f-=360:-180>f&&(f+=360),function(a){return Z(c+f*a,d+g*a,e+h*a)+""}}function Xd(a,b){a=Wg.hsl(a),b=Wg.hsl(b);var c=a.h,d=a.s,e=a.l,f=b.h-c,g=b.s-d,h=b.l-e;return isNaN(g)&&(g=0,d=isNaN(d)?b.s:d),isNaN(f)?(f=0,c=isNaN(c)?b.h:c):f>180?f-=360:-180>f&&(f+=360),function(a){return W(c+f*a,d+g*a,e+h*a)+""}}function Yd(a,b){a=Wg.lab(a),b=Wg.lab(b);var c=a.l,d=a.a,e=a.b,f=b.l-c,g=b.a-d,h=b.b-e;return function(a){return ab(c+f*a,d+g*a,e+h*a)+""}}function Zd(a,b){return b-=a,function(c){return Math.round(a+b*c)}}function $d(a){var b=[a.a,a.b],c=[a.c,a.d],d=ae(b),e=_d(b,c),f=ae(be(c,b,-e))||0;b[0]*c[1]<c[0]*b[1]&&(b[0]*=-1,b[1]*=-1,d*=-1,e*=-1),this.rotate=(d?Math.atan2(b[1],b[0]):Math.atan2(-c[0],c[1]))*Gh,this.translate=[a.e,a.f],this.scale=[d,f],this.skew=f?Math.atan2(e,f)*Gh:0}function _d(a,b){return a[0]*b[0]+a[1]*b[1]}function ae(a){var b=Math.sqrt(_d(a,a));return b&&(a[0]/=b,a[1]/=b),b}function be(a,b,c){return a[0]+=c*b[0],a[1]+=c*b[1],a}function ce(a,b){var c,d=[],e=[],f=Wg.transform(a),g=Wg.transform(b),h=f.translate,i=g.translate,j=f.rotate,k=g.rotate,l=f.skew,m=g.skew,n=f.scale,o=g.scale;return h[0]!=i[0]||h[1]!=i[1]?(d.push("translate(",null,",",null,")"),e.push({i:1,x:Fd(h[0],i[0])},{i:3,x:Fd(h[1],i[1])})):d.push(i[0]||i[1]?"translate("+i+")":""),j!=k?(j-k>180?k+=360:k-j>180&&(j+=360),e.push({i:d.push(d.pop()+"rotate(",null,")")-2,x:Fd(j,k)})):k&&d.push(d.pop()+"rotate("+k+")"),l!=m?e.push({i:d.push(d.pop()+"skewX(",null,")")-2,x:Fd(l,m)}):m&&d.push(d.pop()+"skewX("+m+")"),n[0]!=o[0]||n[1]!=o[1]?(c=d.push(d.pop()+"scale(",null,",",null,")"),e.push({i:c-4,x:Fd(n[0],o[0])},{i:c-2,x:Fd(n[1],o[1])})):(1!=o[0]||1!=o[1])&&d.push(d.pop()+"scale("+o+")"),c=e.length,function(a){for(var b,f=-1;++f<c;)d[(b=e[f]).i]=b.x(a);return d.join("")}}function de(a,b){return b=b-(a=+a)?1/(b-a):0,function(c){return(c-a)*b}}function ee(a,b){return b=b-(a=+a)?1/(b-a):0,function(c){return Math.max(0,Math.min(1,(c-a)*b))}}function fe(a){for(var b=a.source,c=a.target,d=he(b,c),e=[b];b!==d;)b=b.parent,e.push(b);for(var f=e.length;c!==d;)e.splice(f,0,c),c=c.parent;return e}function ge(a){for(var b=[],c=a.parent;null!=c;)b.push(a),a=c,c=c.parent;return b.push(a),b}function he(a,b){if(a===b)return a;for(var c=ge(a),d=ge(b),e=c.pop(),f=d.pop(),g=null;e===f;)g=e,e=c.pop(),f=d.pop();return g}function ie(a){a.fixed|=2}function je(a){a.fixed&=-7}function ke(a){a.fixed|=4,a.px=a.x,a.py=a.y}function le(a){a.fixed&=-5}function me(a,b,c){var d=0,e=0;if(a.charge=0,!a.leaf)for(var f,g=a.nodes,h=g.length,i=-1;++i<h;)f=g[i],null!=f&&(me(f,b,c),a.charge+=f.charge,d+=f.charge*f.cx,e+=f.charge*f.cy);if(a.point){a.leaf||(a.point.x+=Math.random()-.5,a.point.y+=Math.random()-.5);var j=b*c[a.point.index];a.charge+=a.pointCharge=j,d+=j*a.point.x,e+=j*a.point.y}a.cx=d/a.charge,a.cy=e/a.charge}function ne(a,b){return Wg.rebind(a,b,"sort","children","value"),a.nodes=a,a.links=re,a}function oe(a){return a.children}function pe(a){return a.value}function qe(a,b){return b.value-a.value}function re(a){return Wg.merge(a.map(function(a){return(a.children||[]).map(function(b){return{source:a,target:b}})}))}function se(a){return a.x}function te(a){return a.y}function ue(a,b,c){a.y0=b,a.y=c}function ve(a){return Wg.range(a.length)}function we(a){for(var b=-1,c=a[0].length,d=[];++b<c;)d[b]=0;return d}function xe(a){for(var b,c=1,d=0,e=a[0][1],f=a.length;f>c;++c)(b=a[c][1])>e&&(d=c,e=b);return d}function ye(a){return a.reduce(ze,0)}function ze(a,b){return a+b[1]}function Ae(a,b){return Be(a,Math.ceil(Math.log(b.length)/Math.LN2+1))}function Be(a,b){for(var c=-1,d=+a[0],e=(a[1]-d)/b,f=[];++c<=b;)f[c]=e*c+d;return f}function Ce(a){return[Wg.min(a),Wg.max(a)]}function De(a,b){return a.parent==b.parent?1:2}function Ee(a){var b=a.children;return b&&b.length?b[0]:a._tree.thread}function Fe(a){var b,c=a.children;return c&&(b=c.length)?c[b-1]:a._tree.thread}function Ge(a,b){var c=a.children;if(c&&(e=c.length))for(var d,e,f=-1;++f<e;)b(d=Ge(c[f],b),a)>0&&(a=d);return a}function He(a,b){return a.x-b.x}function Ie(a,b){return b.x-a.x}function Je(a,b){return a.depth-b.depth}function Ke(a,b){function c(a,d){var e=a.children;if(e&&(g=e.length))for(var f,g,h=null,i=-1;++i<g;)f=e[i],c(f,h),h=f;b(a,d)}c(a,null)}function Le(a){for(var b,c=0,d=0,e=a.children,f=e.length;--f>=0;)b=e[f]._tree,b.prelim+=c,b.mod+=c,c+=b.shift+(d+=b.change)}function Me(a,b,c){a=a._tree,b=b._tree;var d=c/(b.number-a.number);a.change+=d,b.change-=d,b.shift+=c,b.prelim+=c,b.mod+=c}function Ne(a,b,c){return a._tree.ancestor.parent==b.parent?a._tree.ancestor:c}function Oe(a,b){return a.value-b.value}function Pe(a,b){var c=a._pack_next;a._pack_next=b,b._pack_prev=a,b._pack_next=c,c._pack_prev=b}function Qe(a,b){a._pack_next=b,b._pack_prev=a}function Re(a,b){var c=b.x-a.x,d=b.y-a.y,e=a.r+b.r;return.999*e*e>c*c+d*d}function Se(a){function b(a){k=Math.min(a.x-a.r,k),l=Math.max(a.x+a.r,l),m=Math.min(a.y-a.r,m),n=Math.max(a.y+a.r,n)}if((c=a.children)&&(j=c.length)){var c,d,e,f,g,h,i,j,k=1/0,l=-1/0,m=1/0,n=-1/0;if(c.forEach(Te),d=c[0],d.x=-d.r,d.y=0,b(d),j>1&&(e=c[1],e.x=e.r,e.y=0,b(e),j>2))for(f=c[2],We(d,e,f),b(f),Pe(d,f),d._pack_prev=f,Pe(f,e),e=d._pack_next,g=3;j>g;g++){We(d,e,f=c[g]);var o=0,p=1,q=1;for(h=e._pack_next;h!==e;h=h._pack_next,p++)if(Re(h,f)){o=1;break}if(1==o)for(i=d._pack_prev;i!==h._pack_prev&&!Re(i,f);i=i._pack_prev,q++);o?(q>p||p==q&&e.r<d.r?Qe(d,e=h):Qe(d=i,e),g--):(Pe(d,f),e=f,b(f))}var r=(k+l)/2,s=(m+n)/2,t=0;for(g=0;j>g;g++)f=c[g],f.x-=r,f.y-=s,t=Math.max(t,f.r+Math.sqrt(f.x*f.x+f.y*f.y));a.r=t,c.forEach(Ue)}}function Te(a){a._pack_next=a._pack_prev=a}function Ue(a){delete a._pack_next,delete a._pack_prev}function Ve(a,b,c,d){var e=a.children;if(a.x=b+=d*a.x,a.y=c+=d*a.y,a.r*=d,e)for(var f=-1,g=e.length;++f<g;)Ve(e[f],b,c,d)}function We(a,b,c){var d=a.r+c.r,e=b.x-a.x,f=b.y-a.y;if(d&&(e||f)){var g=b.r+c.r,h=e*e+f*f;g*=g,d*=d;var i=.5+(d-g)/(2*h),j=Math.sqrt(Math.max(0,2*g*(d+h)-(d-=h)*d-g*g))/(2*h);c.x=a.x+i*e+j*f,c.y=a.y+i*f-j*e}else c.x=a.x+d,c.y=a.y}function Xe(a){return 1+Wg.max(a,function(a){return a.y})}function Ye(a){return a.reduce(function(a,b){return a+b.x},0)/a.length}function Ze(a){var b=a.children;return b&&b.length?Ze(b[0]):a}function $e(a){var b,c=a.children;return c&&(b=c.length)?$e(c[b-1]):a}function _e(a){return{x:a.x,y:a.y,dx:a.dx,dy:a.dy}}function af(a,b){var c=a.x+b[3],d=a.y+b[0],e=a.dx-b[1]-b[3],f=a.dy-b[0]-b[2];return 0>e&&(c+=e/2,e=0),0>f&&(d+=f/2,f=0),{x:c,y:d,dx:e,dy:f}}function bf(a){var b=a[0],c=a[a.length-1];return c>b?[b,c]:[c,b]}function cf(a){return a.rangeExtent?a.rangeExtent():bf(a.range())}function df(a,b,c,d){var e=c(a[0],a[1]),f=d(b[0],b[1]);return function(a){return f(e(a))}}function ef(a,b){var c,d=0,e=a.length-1,f=a[d],g=a[e];return f>g&&(c=d,d=e,e=c,c=f,f=g,g=c),a[d]=b.floor(f),a[e]=b.ceil(g),a}function ff(a){return a?{floor:function(b){return Math.floor(b/a)*a},ceil:function(b){return Math.ceil(b/a)*a}}:kj}function gf(a,b,c,d){var e=[],f=[],g=0,h=Math.min(a.length,b.length)-1;for(a[h]<a[0]&&(a=a.slice().reverse(),b=b.slice().reverse());++g<=h;)e.push(c(a[g-1],a[g])),f.push(d(b[g-1],b[g]));return function(b){var c=Wg.bisect(a,b,1,h)-1;return f[c](e[c](b))}}function hf(a,b,c,d){function e(){var e=Math.min(a.length,b.length)>2?gf:df,i=d?ee:de;return g=e(a,b,i,c),h=e(b,a,i,Hd),f}function f(a){return g(a)}var g,h;return f.invert=function(a){return h(a)},f.domain=function(b){return arguments.length?(a=b.map(Number),e()):a},f.range=function(a){return arguments.length?(b=a,e()):b},f.rangeRound=function(a){return f.range(a).interpolate(Zd)},f.clamp=function(a){return arguments.length?(d=a,e()):d},f.interpolate=function(a){return arguments.length?(c=a,e()):c},f.ticks=function(b){return mf(a,b)},f.tickFormat=function(b,c){return nf(a,b,c)},f.nice=function(b){return kf(a,b),e()
+},f.copy=function(){return hf(a,b,c,d)},e()}function jf(a,b){return Wg.rebind(a,b,"range","rangeRound","interpolate","clamp")}function kf(a,b){return ef(a,ff(lf(a,b)[2]))}function lf(a,b){null==b&&(b=10);var c=bf(a),d=c[1]-c[0],e=Math.pow(10,Math.floor(Math.log(d/b)/Math.LN10)),f=b/d*e;return.15>=f?e*=10:.35>=f?e*=5:.75>=f&&(e*=2),c[0]=Math.ceil(c[0]/e)*e,c[1]=Math.floor(c[1]/e)*e+.5*e,c[2]=e,c}function mf(a,b){return Wg.range.apply(Wg,lf(a,b))}function nf(a,b,c){var d=lf(a,b);return Wg.format(c?c.replace(fi,function(a,b,c,e,f,g,h,i,j,k){return[b,c,e,f,g,h,i,j||"."+pf(k,d),k].join("")}):",."+of(d[2])+"f")}function of(a){return-Math.floor(Math.log(a)/Math.LN10+.01)}function pf(a,b){var c=of(b[2]);return a in lj?Math.abs(c-of(Math.max(Math.abs(b[0]),Math.abs(b[1]))))+ +("e"!==a):c-2*("%"===a)}function qf(a,b,c,d){function e(a){return(c?Math.log(0>a?0:a):-Math.log(a>0?0:-a))/Math.log(b)}function f(a){return c?Math.pow(b,a):-Math.pow(b,-a)}function g(b){return a(e(b))}return g.invert=function(b){return f(a.invert(b))},g.domain=function(b){return arguments.length?(c=b[0]>=0,a.domain((d=b.map(Number)).map(e)),g):d},g.base=function(c){return arguments.length?(b=+c,a.domain(d.map(e)),g):b},g.nice=function(){var b=ef(d.map(e),c?Math:nj);return a.domain(b),d=b.map(f),g},g.ticks=function(){var a=bf(d),g=[],h=a[0],i=a[1],j=Math.floor(e(h)),k=Math.ceil(e(i)),l=b%1?2:b;if(isFinite(k-j)){if(c){for(;k>j;j++)for(var m=1;l>m;m++)g.push(f(j)*m);g.push(f(j))}else for(g.push(f(j));j++<k;)for(var m=l-1;m>0;m--)g.push(f(j)*m);for(j=0;g[j]<h;j++);for(k=g.length;g[k-1]>i;k--);g=g.slice(j,k)}return g},g.tickFormat=function(a,b){if(!arguments.length)return mj;arguments.length<2?b=mj:"function"!=typeof b&&(b=Wg.format(b));var d,h=Math.max(.1,a/g.ticks().length),i=c?(d=1e-12,Math.ceil):(d=-1e-12,Math.floor);return function(a){return a/f(i(e(a)+d))<=h?b(a):""}},g.copy=function(){return qf(a.copy(),b,c,d)},jf(g,a)}function rf(a,b,c){function d(b){return a(e(b))}var e=sf(b),f=sf(1/b);return d.invert=function(b){return f(a.invert(b))},d.domain=function(b){return arguments.length?(a.domain((c=b.map(Number)).map(e)),d):c},d.ticks=function(a){return mf(c,a)},d.tickFormat=function(a,b){return nf(c,a,b)},d.nice=function(a){return d.domain(kf(c,a))},d.exponent=function(g){return arguments.length?(e=sf(b=g),f=sf(1/b),a.domain(c.map(e)),d):b},d.copy=function(){return rf(a.copy(),b,c)},jf(d,a)}function sf(a){return function(b){return 0>b?-Math.pow(-b,a):Math.pow(b,a)}}function tf(a,b){function c(c){return g[((f.get(c)||"range"===b.t&&f.set(c,a.push(c)))-1)%g.length]}function d(b,c){return Wg.range(a.length).map(function(a){return b+c*a})}var f,g,h;return c.domain=function(d){if(!arguments.length)return a;a=[],f=new e;for(var g,h=-1,i=d.length;++h<i;)f.has(g=d[h])||f.set(g,a.push(g));return c[b.t].apply(c,b.a)},c.range=function(a){return arguments.length?(g=a,h=0,b={t:"range",a:arguments},c):g},c.rangePoints=function(e,f){arguments.length<2&&(f=0);var i=e[0],j=e[1],k=(j-i)/(Math.max(1,a.length-1)+f);return g=d(a.length<2?(i+j)/2:i+k*f/2,k),h=0,b={t:"rangePoints",a:arguments},c},c.rangeBands=function(e,f,i){arguments.length<2&&(f=0),arguments.length<3&&(i=f);var j=e[1]<e[0],k=e[j-0],l=e[1-j],m=(l-k)/(a.length-f+2*i);return g=d(k+m*i,m),j&&g.reverse(),h=m*(1-f),b={t:"rangeBands",a:arguments},c},c.rangeRoundBands=function(e,f,i){arguments.length<2&&(f=0),arguments.length<3&&(i=f);var j=e[1]<e[0],k=e[j-0],l=e[1-j],m=Math.floor((l-k)/(a.length-f+2*i)),n=l-k-(a.length-f)*m;return g=d(k+Math.round(n/2),m),j&&g.reverse(),h=Math.round(m*(1-f)),b={t:"rangeRoundBands",a:arguments},c},c.rangeBand=function(){return h},c.rangeExtent=function(){return bf(b.a[0])},c.copy=function(){return tf(a,b)},c.domain(a)}function uf(a,b){function c(){var c=0,f=b.length;for(e=[];++c<f;)e[c-1]=Wg.quantile(a,c/f);return d}function d(a){return isNaN(a=+a)?void 0:b[Wg.bisect(e,a)]}var e;return d.domain=function(b){return arguments.length?(a=b.filter(function(a){return!isNaN(a)}).sort(Wg.ascending),c()):a},d.range=function(a){return arguments.length?(b=a,c()):b},d.quantiles=function(){return e},d.invertExtent=function(c){return c=b.indexOf(c),0>c?[0/0,0/0]:[c>0?e[c-1]:a[0],c<e.length?e[c]:a[a.length-1]]},d.copy=function(){return uf(a,b)},c()}function vf(a,b,c){function d(b){return c[Math.max(0,Math.min(g,Math.floor(f*(b-a))))]}function e(){return f=c.length/(b-a),g=c.length-1,d}var f,g;return d.domain=function(c){return arguments.length?(a=+c[0],b=+c[c.length-1],e()):[a,b]},d.range=function(a){return arguments.length?(c=a,e()):c},d.invertExtent=function(b){return b=c.indexOf(b),b=0>b?0/0:b/f+a,[b,b+1/f]},d.copy=function(){return vf(a,b,c)},e()}function wf(a,b){function c(c){return c>=c?b[Wg.bisect(a,c)]:void 0}return c.domain=function(b){return arguments.length?(a=b,c):a},c.range=function(a){return arguments.length?(b=a,c):b},c.invertExtent=function(c){return c=b.indexOf(c),[a[c-1],a[c]]},c.copy=function(){return wf(a,b)},c}function xf(a){function b(a){return+a}return b.invert=b,b.domain=b.range=function(c){return arguments.length?(a=c.map(b),b):a},b.ticks=function(b){return mf(a,b)},b.tickFormat=function(b,c){return nf(a,b,c)},b.copy=function(){return xf(a)},b}function yf(a){return a.innerRadius}function zf(a){return a.outerRadius}function Af(a){return a.startAngle}function Bf(a){return a.endAngle}function Cf(a){function b(b){function g(){j.push("M",f(a(k),h))}for(var i,j=[],k=[],l=-1,m=b.length,n=pb(c),o=pb(d);++l<m;)e.call(this,i=b[l],l)?k.push([+n.call(this,i,l),+o.call(this,i,l)]):k.length&&(g(),k=[]);return k.length&&g(),j.length?j.join(""):null}var c=Tc,d=Uc,e=Tb,f=Df,g=f.key,h=.7;return b.x=function(a){return arguments.length?(c=a,b):c},b.y=function(a){return arguments.length?(d=a,b):d},b.defined=function(a){return arguments.length?(e=a,b):e},b.interpolate=function(a){return arguments.length?(g="function"==typeof a?f=a:(f=uj.get(a)||Df).key,b):g},b.tension=function(a){return arguments.length?(h=a,b):h},b}function Df(a){return a.join("L")}function Ef(a){return Df(a)+"Z"}function Ff(a){for(var b=0,c=a.length,d=a[0],e=[d[0],",",d[1]];++b<c;)e.push("H",(d[0]+(d=a[b])[0])/2,"V",d[1]);return c>1&&e.push("H",d[0]),e.join("")}function Gf(a){for(var b=0,c=a.length,d=a[0],e=[d[0],",",d[1]];++b<c;)e.push("V",(d=a[b])[1],"H",d[0]);return e.join("")}function Hf(a){for(var b=0,c=a.length,d=a[0],e=[d[0],",",d[1]];++b<c;)e.push("H",(d=a[b])[0],"V",d[1]);return e.join("")}function If(a,b){return a.length<4?Df(a):a[1]+Lf(a.slice(1,a.length-1),Mf(a,b))}function Jf(a,b){return a.length<3?Df(a):a[0]+Lf((a.push(a[0]),a),Mf([a[a.length-2]].concat(a,[a[1]]),b))}function Kf(a,b){return a.length<3?Df(a):a[0]+Lf(a,Mf(a,b))}function Lf(a,b){if(b.length<1||a.length!=b.length&&a.length!=b.length+2)return Df(a);var c=a.length!=b.length,d="",e=a[0],f=a[1],g=b[0],h=g,i=1;if(c&&(d+="Q"+(f[0]-2*g[0]/3)+","+(f[1]-2*g[1]/3)+","+f[0]+","+f[1],e=a[1],i=2),b.length>1){h=b[1],f=a[i],i++,d+="C"+(e[0]+g[0])+","+(e[1]+g[1])+","+(f[0]-h[0])+","+(f[1]-h[1])+","+f[0]+","+f[1];for(var j=2;j<b.length;j++,i++)f=a[i],h=b[j],d+="S"+(f[0]-h[0])+","+(f[1]-h[1])+","+f[0]+","+f[1]}if(c){var k=a[i];d+="Q"+(f[0]+2*h[0]/3)+","+(f[1]+2*h[1]/3)+","+k[0]+","+k[1]}return d}function Mf(a,b){for(var c,d=[],e=(1-b)/2,f=a[0],g=a[1],h=1,i=a.length;++h<i;)c=f,f=g,g=a[h],d.push([e*(g[0]-c[0]),e*(g[1]-c[1])]);return d}function Nf(a){if(a.length<3)return Df(a);var b=1,c=a.length,d=a[0],e=d[0],f=d[1],g=[e,e,e,(d=a[1])[0]],h=[f,f,f,d[1]],i=[e,",",f,"L",Rf(xj,g),",",Rf(xj,h)];for(a.push(a[c-1]);++b<=c;)d=a[b],g.shift(),g.push(d[0]),h.shift(),h.push(d[1]),Sf(i,g,h);return a.pop(),i.push("L",d),i.join("")}function Of(a){if(a.length<4)return Df(a);for(var b,c=[],d=-1,e=a.length,f=[0],g=[0];++d<3;)b=a[d],f.push(b[0]),g.push(b[1]);for(c.push(Rf(xj,f)+","+Rf(xj,g)),--d;++d<e;)b=a[d],f.shift(),f.push(b[0]),g.shift(),g.push(b[1]),Sf(c,f,g);return c.join("")}function Pf(a){for(var b,c,d=-1,e=a.length,f=e+4,g=[],h=[];++d<4;)c=a[d%e],g.push(c[0]),h.push(c[1]);for(b=[Rf(xj,g),",",Rf(xj,h)],--d;++d<f;)c=a[d%e],g.shift(),g.push(c[0]),h.shift(),h.push(c[1]),Sf(b,g,h);return b.join("")}function Qf(a,b){var c=a.length-1;if(c)for(var d,e,f=a[0][0],g=a[0][1],h=a[c][0]-f,i=a[c][1]-g,j=-1;++j<=c;)d=a[j],e=j/c,d[0]=b*d[0]+(1-b)*(f+e*h),d[1]=b*d[1]+(1-b)*(g+e*i);return Nf(a)}function Rf(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+a[3]*b[3]}function Sf(a,b,c){a.push("C",Rf(vj,b),",",Rf(vj,c),",",Rf(wj,b),",",Rf(wj,c),",",Rf(xj,b),",",Rf(xj,c))}function Tf(a,b){return(b[1]-a[1])/(b[0]-a[0])}function Uf(a){for(var b=0,c=a.length-1,d=[],e=a[0],f=a[1],g=d[0]=Tf(e,f);++b<c;)d[b]=(g+(g=Tf(e=f,f=a[b+1])))/2;return d[b]=g,d}function Vf(a){for(var b,c,d,e,f=[],g=Uf(a),h=-1,i=a.length-1;++h<i;)b=Tf(a[h],a[h+1]),ih(b)<Dh?g[h]=g[h+1]=0:(c=g[h]/b,d=g[h+1]/b,e=c*c+d*d,e>9&&(e=3*b/Math.sqrt(e),g[h]=e*c,g[h+1]=e*d));for(h=-1;++h<=i;)e=(a[Math.min(i,h+1)][0]-a[Math.max(0,h-1)][0])/(6*(1+g[h]*g[h])),f.push([e||0,g[h]*e||0]);return f}function Wf(a){return a.length<3?Df(a):a[0]+Lf(a,Vf(a))}function Xf(a){for(var b,c,d,e=-1,f=a.length;++e<f;)b=a[e],c=b[0],d=b[1]+sj,b[0]=c*Math.cos(d),b[1]=c*Math.sin(d);return a}function Yf(a){function b(b){function i(){p.push("M",h(a(r),l),k,j(a(q.reverse()),l),"Z")}for(var m,n,o,p=[],q=[],r=[],s=-1,t=b.length,u=pb(c),v=pb(e),w=c===d?function(){return n}:pb(d),x=e===f?function(){return o}:pb(f);++s<t;)g.call(this,m=b[s],s)?(q.push([n=+u.call(this,m,s),o=+v.call(this,m,s)]),r.push([+w.call(this,m,s),+x.call(this,m,s)])):q.length&&(i(),q=[],r=[]);return q.length&&i(),p.length?p.join(""):null}var c=Tc,d=Tc,e=0,f=Uc,g=Tb,h=Df,i=h.key,j=h,k="L",l=.7;return b.x=function(a){return arguments.length?(c=d=a,b):d},b.x0=function(a){return arguments.length?(c=a,b):c},b.x1=function(a){return arguments.length?(d=a,b):d},b.y=function(a){return arguments.length?(e=f=a,b):f},b.y0=function(a){return arguments.length?(e=a,b):e},b.y1=function(a){return arguments.length?(f=a,b):f},b.defined=function(a){return arguments.length?(g=a,b):g},b.interpolate=function(a){return arguments.length?(i="function"==typeof a?h=a:(h=uj.get(a)||Df).key,j=h.reverse||h,k=h.closed?"M":"L",b):i},b.tension=function(a){return arguments.length?(l=a,b):l},b}function Zf(a){return a.radius}function $f(a){return[a.x,a.y]}function _f(a){return function(){var b=a.apply(this,arguments),c=b[0],d=b[1]+sj;return[c*Math.cos(d),c*Math.sin(d)]}}function ag(){return 64}function bg(){return"circle"}function cg(a){var b=Math.sqrt(a/Ah);return"M0,"+b+"A"+b+","+b+" 0 1,1 0,"+-b+"A"+b+","+b+" 0 1,1 0,"+b+"Z"}function dg(a,b){return nh(a,Dj),a.id=b,a}function eg(a,b,c,d){var e=a.id;return D(a,"function"==typeof c?function(a,f,g){a.__transition__[e].tween.set(b,d(c.call(a,a.__data__,f,g)))}:(c=d(c),function(a){a.__transition__[e].tween.set(b,c)}))}function fg(a){return null==a&&(a=""),function(){this.textContent=a}}function gg(a,b,c,d){var f=a.__transition__||(a.__transition__={active:0,count:0}),g=f[c];if(!g){var h=d.time;g=f[c]={tween:new e,time:h,ease:d.ease,delay:d.delay,duration:d.duration},++f.count,Wg.timer(function(d){function e(d){return f.active>c?j():(f.active=c,g.event&&g.event.start.call(a,k,b),g.tween.forEach(function(c,d){(d=d.call(a,k,b))&&p.push(d)}),void Wg.timer(function(){return o.c=i(d||1)?Tb:i,1},0,h))}function i(d){if(f.active!==c)return j();for(var e=d/n,h=l(e),i=p.length;i>0;)p[--i].call(a,h);return e>=1?(g.event&&g.event.end.call(a,k,b),j()):void 0}function j(){return--f.count?delete f[c]:delete a.__transition__,1}var k=a.__data__,l=g.ease,m=g.delay,n=g.duration,o=$h,p=[];return o.t=m+h,d>=m?e(d-m):void(o.c=e)},0,h)}}function hg(a,b){a.attr("transform",function(a){return"translate("+b(a)+",0)"})}function ig(a,b){a.attr("transform",function(a){return"translate(0,"+b(a)+")"})}function jg(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function kg(a,b,c){function d(b){var c=a(b),d=f(c,1);return d-b>b-c?c:d}function e(c){return b(c=a(new Kj(c-1)),1),c}function f(a,c){return b(a=new Kj(+a),c),a}function g(a,d,f){var g=e(a),h=[];if(f>1)for(;d>g;)c(g)%f||h.push(new Date(+g)),b(g,1);else for(;d>g;)h.push(new Date(+g)),b(g,1);return h}function h(a,b,c){try{Kj=jg;var d=new jg;return d._=a,g(d,b,c)}finally{Kj=Date}}a.floor=a,a.round=d,a.ceil=e,a.offset=f,a.range=g;var i=a.utc=lg(a);return i.floor=i,i.round=lg(d),i.ceil=lg(e),i.offset=lg(f),i.range=h,a}function lg(a){return function(b,c){try{Kj=jg;var d=new jg;return d._=b,a(d,c)._}finally{Kj=Date}}}function mg(a){function b(b){for(var d,e,f,g=[],h=-1,i=0;++h<c;)37===a.charCodeAt(h)&&(g.push(a.substring(i,h)),null!=(e=bk[d=a.charAt(++h)])&&(d=a.charAt(++h)),(f=ck[d])&&(d=f(b,null==e?"e"===d?" ":"0":e)),g.push(d),i=h+1);return g.push(a.substring(i,h)),g.join("")}var c=a.length;return b.parse=function(b){var c={y:1900,m:0,d:1,H:0,M:0,S:0,L:0,Z:null},d=ng(c,a,b,0);if(d!=b.length)return null;"p"in c&&(c.H=c.H%12+12*c.p);var e=null!=c.Z&&Kj!==jg,f=new(e?jg:Kj);return"j"in c?f.setFullYear(c.y,0,c.j):"w"in c&&("W"in c||"U"in c)?(f.setFullYear(c.y,0,1),f.setFullYear(c.y,0,"W"in c?(c.w+6)%7+7*c.W-(f.getDay()+5)%7:c.w+7*c.U-(f.getDay()+6)%7)):f.setFullYear(c.y,c.m,c.d),f.setHours(c.H+Math.floor(c.Z/100),c.M+c.Z%100,c.S,c.L),e?f._:f},b.toString=function(){return a},b}function ng(a,b,c,d){for(var e,f,g,h=0,i=b.length,j=c.length;i>h;){if(d>=j)return-1;if(e=b.charCodeAt(h++),37===e){if(g=b.charAt(h++),f=dk[g in bk?b.charAt(h++):g],!f||(d=f(a,c,d))<0)return-1}else if(e!=c.charCodeAt(d++))return-1}return d}function og(a){return new RegExp("^(?:"+a.map(Wg.requote).join("|")+")","i")}function pg(a){for(var b=new e,c=-1,d=a.length;++c<d;)b.set(a[c].toLowerCase(),c);return b}function qg(a,b,c){var d=0>a?"-":"",e=(d?-a:a)+"",f=e.length;return d+(c>f?new Array(c-f+1).join(b)+e:e)}function rg(a,b,c){Wj.lastIndex=0;var d=Wj.exec(b.substring(c));return d?(a.w=Xj.get(d[0].toLowerCase()),c+d[0].length):-1}function sg(a,b,c){Uj.lastIndex=0;var d=Uj.exec(b.substring(c));return d?(a.w=Vj.get(d[0].toLowerCase()),c+d[0].length):-1}function tg(a,b,c){ek.lastIndex=0;var d=ek.exec(b.substring(c,c+1));return d?(a.w=+d[0],c+d[0].length):-1}function ug(a,b,c){ek.lastIndex=0;var d=ek.exec(b.substring(c));return d?(a.U=+d[0],c+d[0].length):-1}function vg(a,b,c){ek.lastIndex=0;var d=ek.exec(b.substring(c));return d?(a.W=+d[0],c+d[0].length):-1}function wg(a,b,c){$j.lastIndex=0;var d=$j.exec(b.substring(c));return d?(a.m=_j.get(d[0].toLowerCase()),c+d[0].length):-1}function xg(a,b,c){Yj.lastIndex=0;var d=Yj.exec(b.substring(c));return d?(a.m=Zj.get(d[0].toLowerCase()),c+d[0].length):-1}function yg(a,b,c){return ng(a,ck.c.toString(),b,c)}function zg(a,b,c){return ng(a,ck.x.toString(),b,c)}function Ag(a,b,c){return ng(a,ck.X.toString(),b,c)}function Bg(a,b,c){ek.lastIndex=0;var d=ek.exec(b.substring(c,c+4));return d?(a.y=+d[0],c+d[0].length):-1}function Cg(a,b,c){ek.lastIndex=0;var d=ek.exec(b.substring(c,c+2));return d?(a.y=Eg(+d[0]),c+d[0].length):-1}function Dg(a,b,c){return/^[+-]\d{4}$/.test(b=b.substring(c,c+5))?(a.Z=+b,c+5):-1}function Eg(a){return a+(a>68?1900:2e3)}function Fg(a,b,c){ek.lastIndex=0;var d=ek.exec(b.substring(c,c+2));return d?(a.m=d[0]-1,c+d[0].length):-1}function Gg(a,b,c){ek.lastIndex=0;var d=ek.exec(b.substring(c,c+2));return d?(a.d=+d[0],c+d[0].length):-1}function Hg(a,b,c){ek.lastIndex=0;var d=ek.exec(b.substring(c,c+3));return d?(a.j=+d[0],c+d[0].length):-1}function Ig(a,b,c){ek.lastIndex=0;var d=ek.exec(b.substring(c,c+2));return d?(a.H=+d[0],c+d[0].length):-1}function Jg(a,b,c){ek.lastIndex=0;var d=ek.exec(b.substring(c,c+2));return d?(a.M=+d[0],c+d[0].length):-1}function Kg(a,b,c){ek.lastIndex=0;var d=ek.exec(b.substring(c,c+2));return d?(a.S=+d[0],c+d[0].length):-1}function Lg(a,b,c){ek.lastIndex=0;var d=ek.exec(b.substring(c,c+3));return d?(a.L=+d[0],c+d[0].length):-1}function Mg(a,b,c){var d=fk.get(b.substring(c,c+=2).toLowerCase());return null==d?-1:(a.p=d,c)}function Ng(a){var b=a.getTimezoneOffset(),c=b>0?"-":"+",d=~~(ih(b)/60),e=ih(b)%60;return c+qg(d,"0",2)+qg(e,"0",2)}function Og(a,b,c){ak.lastIndex=0;var d=ak.exec(b.substring(c,c+1));return d?c+d[0].length:-1}function Pg(a){function b(a){try{Kj=jg;var b=new Kj;return b._=a,c(b)}finally{Kj=Date}}var c=mg(a);return b.parse=function(a){try{Kj=jg;var b=c.parse(a);return b&&b._}finally{Kj=Date}},b.toString=c.toString,b}function Qg(a){return a.toISOString()}function Rg(a,b,c){function d(b){return a(b)}function e(a,c){var d=a[1]-a[0],e=d/c,f=Wg.bisect(hk,e);return f==hk.length?[b.year,lf(a.map(function(a){return a/31536e6}),c)[2]]:f?b[e/hk[f-1]<hk[f]/e?f-1:f]:[lk,lf(a,c)[2]]}return d.invert=function(b){return Sg(a.invert(b))},d.domain=function(b){return arguments.length?(a.domain(b),d):a.domain().map(Sg)},d.nice=function(a,b){function c(c){return!isNaN(c)&&!a.range(c,Sg(+c+1),b).length}var f=d.domain(),g=bf(f),h=null==a?e(g,10):"number"==typeof a&&e(g,a);return h&&(a=h[0],b=h[1]),d.domain(ef(f,b>1?{floor:function(b){for(;c(b=a.floor(b));)b=Sg(b-1);return b},ceil:function(b){for(;c(b=a.ceil(b));)b=Sg(+b+1);return b}}:a))},d.ticks=function(a,b){var c=bf(d.domain()),f=null==a?e(c,10):"number"==typeof a?e(c,a):!a.range&&[{range:a},b];return f&&(a=f[0],b=f[1]),a.range(c[0],Sg(+c[1]+1),1>b?1:b)},d.tickFormat=function(){return c},d.copy=function(){return Rg(a.copy(),b,c)},jf(d,a)}function Sg(a){return new Date(a)}function Tg(a){return function(b){for(var c=a.length-1,d=a[c];!d[1](b);)d=a[--c];return d[0](b)}}function Ug(a){return JSON.parse(a.responseText)}function Vg(a){var b=Zg.createRange();return b.selectNode(Zg.body),b.createContextualFragment(a.responseText)}var Wg={version:"3.3.13"};Date.now||(Date.now=function(){return+new Date});var Xg=[].slice,Yg=function(a){return Xg.call(a)},Zg=document,$g=Zg.documentElement,_g=window;try{Yg($g.childNodes)[0].nodeType}catch(ah){Yg=function(a){for(var b=a.length,c=new Array(b);b--;)c[b]=a[b];return c}}try{Zg.createElement("div").style.setProperty("opacity",0,"")}catch(bh){var ch=_g.Element.prototype,dh=ch.setAttribute,eh=ch.setAttributeNS,fh=_g.CSSStyleDeclaration.prototype,gh=fh.setProperty;ch.setAttribute=function(a,b){dh.call(this,a,b+"")},ch.setAttributeNS=function(a,b,c){eh.call(this,a,b,c+"")},fh.setProperty=function(a,b,c){gh.call(this,a,b+"",c)}}Wg.ascending=function(a,b){return b>a?-1:a>b?1:a>=b?0:0/0},Wg.descending=function(a,b){return a>b?-1:b>a?1:b>=a?0:0/0},Wg.min=function(a,b){var c,d,e=-1,f=a.length;if(1===arguments.length){for(;++e<f&&!(null!=(c=a[e])&&c>=c);)c=void 0;for(;++e<f;)null!=(d=a[e])&&c>d&&(c=d)}else{for(;++e<f&&!(null!=(c=b.call(a,a[e],e))&&c>=c);)c=void 0;for(;++e<f;)null!=(d=b.call(a,a[e],e))&&c>d&&(c=d)}return c},Wg.max=function(a,b){var c,d,e=-1,f=a.length;if(1===arguments.length){for(;++e<f&&!(null!=(c=a[e])&&c>=c);)c=void 0;for(;++e<f;)null!=(d=a[e])&&d>c&&(c=d)}else{for(;++e<f&&!(null!=(c=b.call(a,a[e],e))&&c>=c);)c=void 0;for(;++e<f;)null!=(d=b.call(a,a[e],e))&&d>c&&(c=d)}return c},Wg.extent=function(a,b){var c,d,e,f=-1,g=a.length;if(1===arguments.length){for(;++f<g&&!(null!=(c=e=a[f])&&c>=c);)c=e=void 0;for(;++f<g;)null!=(d=a[f])&&(c>d&&(c=d),d>e&&(e=d))}else{for(;++f<g&&!(null!=(c=e=b.call(a,a[f],f))&&c>=c);)c=void 0;for(;++f<g;)null!=(d=b.call(a,a[f],f))&&(c>d&&(c=d),d>e&&(e=d))}return[c,e]},Wg.sum=function(a,b){var c,d=0,e=a.length,f=-1;if(1===arguments.length)for(;++f<e;)isNaN(c=+a[f])||(d+=c);else for(;++f<e;)isNaN(c=+b.call(a,a[f],f))||(d+=c);return d},Wg.mean=function(b,c){var d,e=b.length,f=0,g=-1,h=0;if(1===arguments.length)for(;++g<e;)a(d=b[g])&&(f+=(d-f)/++h);else for(;++g<e;)a(d=c.call(b,b[g],g))&&(f+=(d-f)/++h);return h?f:void 0},Wg.quantile=function(a,b){var c=(a.length-1)*b+1,d=Math.floor(c),e=+a[d-1],f=c-d;return f?e+f*(a[d]-e):e},Wg.median=function(b,c){return arguments.length>1&&(b=b.map(c)),b=b.filter(a),b.length?Wg.quantile(b.sort(Wg.ascending),.5):void 0},Wg.bisector=function(a){return{left:function(b,c,d,e){for(arguments.length<3&&(d=0),arguments.length<4&&(e=b.length);e>d;){var f=d+e>>>1;a.call(b,b[f],f)<c?d=f+1:e=f}return d},right:function(b,c,d,e){for(arguments.length<3&&(d=0),arguments.length<4&&(e=b.length);e>d;){var f=d+e>>>1;c<a.call(b,b[f],f)?e=f:d=f+1}return d}}};var hh=Wg.bisector(function(a){return a});Wg.bisectLeft=hh.left,Wg.bisect=Wg.bisectRight=hh.right,Wg.shuffle=function(a){for(var b,c,d=a.length;d;)c=Math.random()*d--|0,b=a[d],a[d]=a[c],a[c]=b;return a},Wg.permute=function(a,b){for(var c=b.length,d=new Array(c);c--;)d[c]=a[b[c]];return d},Wg.pairs=function(a){for(var b,c=0,d=a.length-1,e=a[0],f=new Array(0>d?0:d);d>c;)f[c]=[b=e,e=a[++c]];return f},Wg.zip=function(){if(!(e=arguments.length))return[];for(var a=-1,c=Wg.min(arguments,b),d=new Array(c);++a<c;)for(var e,f=-1,g=d[a]=new Array(e);++f<e;)g[f]=arguments[f][a];return d},Wg.transpose=function(a){return Wg.zip.apply(Wg,a)},Wg.keys=function(a){var b=[];for(var c in a)b.push(c);return b},Wg.values=function(a){var b=[];for(var c in a)b.push(a[c]);return b},Wg.entries=function(a){var b=[];for(var c in a)b.push({key:c,value:a[c]});return b},Wg.merge=function(a){for(var b,c,d,e=a.length,f=-1,g=0;++f<e;)g+=a[f].length;for(c=new Array(g);--e>=0;)for(d=a[e],b=d.length;--b>=0;)c[--g]=d[b];return c};var ih=Math.abs;Wg.range=function(a,b,d){if(arguments.length<3&&(d=1,arguments.length<2&&(b=a,a=0)),(b-a)/d===1/0)throw new Error("infinite range");var e,f=[],g=c(ih(d)),h=-1;if(a*=g,b*=g,d*=g,0>d)for(;(e=a+d*++h)>b;)f.push(e/g);else for(;(e=a+d*++h)<b;)f.push(e/g);return f},Wg.map=function(a){var b=new e;if(a instanceof e)a.forEach(function(a,c){b.set(a,c)});else for(var c in a)b.set(c,a[c]);return b},d(e,{has:function(a){return jh+a in this},get:function(a){return this[jh+a]},set:function(a,b){return this[jh+a]=b},remove:function(a){return a=jh+a,a in this&&delete this[a]},keys:function(){var a=[];return this.forEach(function(b){a.push(b)}),a},values:function(){var a=[];return this.forEach(function(b,c){a.push(c)}),a},entries:function(){var a=[];return this.forEach(function(b,c){a.push({key:b,value:c})}),a},forEach:function(a){for(var b in this)b.charCodeAt(0)===kh&&a.call(this,b.substring(1),this[b])}});var jh="\x00",kh=jh.charCodeAt(0);Wg.nest=function(){function a(b,h,i){if(i>=g.length)return d?d.call(f,h):c?h.sort(c):h;for(var j,k,l,m,n=-1,o=h.length,p=g[i++],q=new e;++n<o;)(m=q.get(j=p(k=h[n])))?m.push(k):q.set(j,[k]);return b?(k=b(),l=function(c,d){k.set(c,a(b,d,i))}):(k={},l=function(c,d){k[c]=a(b,d,i)}),q.forEach(l),k}function b(a,c){if(c>=g.length)return a;var d=[],e=h[c++];return a.forEach(function(a,e){d.push({key:a,values:b(e,c)})}),e?d.sort(function(a,b){return e(a.key,b.key)}):d}var c,d,f={},g=[],h=[];return f.map=function(b,c){return a(c,b,0)},f.entries=function(c){return b(a(Wg.map,c,0),0)},f.key=function(a){return g.push(a),f},f.sortKeys=function(a){return h[g.length-1]=a,f},f.sortValues=function(a){return c=a,f},f.rollup=function(a){return d=a,f},f},Wg.set=function(a){var b=new f;if(a)for(var c=0,d=a.length;d>c;++c)b.add(a[c]);return b},d(f,{has:function(a){return jh+a in this},add:function(a){return this[jh+a]=!0,a},remove:function(a){return a=jh+a,a in this&&delete this[a]},values:function(){var a=[];return this.forEach(function(b){a.push(b)}),a},forEach:function(a){for(var b in this)b.charCodeAt(0)===kh&&a.call(this,b.substring(1))}}),Wg.behavior={},Wg.rebind=function(a,b){for(var c,d=1,e=arguments.length;++d<e;)a[c=arguments[d]]=g(a,b,b[c]);return a};var lh=["webkit","ms","moz","Moz","o","O"];Wg.dispatch=function(){for(var a=new j,b=-1,c=arguments.length;++b<c;)a[arguments[b]]=k(a);return a},j.prototype.on=function(a,b){var c=a.indexOf("."),d="";if(c>=0&&(d=a.substring(c+1),a=a.substring(0,c)),a)return arguments.length<2?this[a].on(d):this[a].on(d,b);if(2===arguments.length){if(null==b)for(a in this)this.hasOwnProperty(a)&&this[a].on(d,null);return this}},Wg.event=null,Wg.requote=function(a){return a.replace(mh,"\\$&")};var mh=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,nh={}.__proto__?function(a,b){a.__proto__=b}:function(a,b){for(var c in b)a[c]=b[c]},oh=function(a,b){return b.querySelector(a)},ph=function(a,b){return b.querySelectorAll(a)},qh=$g[h($g,"matchesSelector")],rh=function(a,b){return qh.call(a,b)};"function"==typeof Sizzle&&(oh=function(a,b){return Sizzle(a,b)[0]||null},ph=function(a,b){return Sizzle.uniqueSort(Sizzle(a,b))},rh=Sizzle.matchesSelector),Wg.selection=function(){return vh};var sh=Wg.selection.prototype=[];sh.select=function(a){var b,c,d,e,f=[];a=p(a);for(var g=-1,h=this.length;++g<h;){f.push(b=[]),b.parentNode=(d=this[g]).parentNode;for(var i=-1,j=d.length;++i<j;)(e=d[i])?(b.push(c=a.call(e,e.__data__,i,g)),c&&"__data__"in e&&(c.__data__=e.__data__)):b.push(null)}return o(f)},sh.selectAll=function(a){var b,c,d=[];a=q(a);for(var e=-1,f=this.length;++e<f;)for(var g=this[e],h=-1,i=g.length;++h<i;)(c=g[h])&&(d.push(b=Yg(a.call(c,c.__data__,h,e))),b.parentNode=c);return o(d)};var th={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};Wg.ns={prefix:th,qualify:function(a){var b=a.indexOf(":"),c=a;return b>=0&&(c=a.substring(0,b),a=a.substring(b+1)),th.hasOwnProperty(c)?{space:th[c],local:a}:a}},sh.attr=function(a,b){if(arguments.length<2){if("string"==typeof a){var c=this.node();return a=Wg.ns.qualify(a),a.local?c.getAttributeNS(a.space,a.local):c.getAttribute(a)}for(b in a)this.each(r(b,a[b]));return this}return this.each(r(a,b))},sh.classed=function(a,b){if(arguments.length<2){if("string"==typeof a){var c=this.node(),d=(a=u(a)).length,e=-1;if(b=c.classList){for(;++e<d;)if(!b.contains(a[e]))return!1}else for(b=c.getAttribute("class");++e<d;)if(!t(a[e]).test(b))return!1;return!0}for(b in a)this.each(v(b,a[b]));return this}return this.each(v(a,b))},sh.style=function(a,b,c){var d=arguments.length;if(3>d){if("string"!=typeof a){2>d&&(b="");for(c in a)this.each(x(c,a[c],b));return this}if(2>d)return _g.getComputedStyle(this.node(),null).getPropertyValue(a);c=""}return this.each(x(a,b,c))},sh.property=function(a,b){if(arguments.length<2){if("string"==typeof a)return this.node()[a];for(b in a)this.each(y(b,a[b]));return this}return this.each(y(a,b))},sh.text=function(a){return arguments.length?this.each("function"==typeof a?function(){var b=a.apply(this,arguments);this.textContent=null==b?"":b}:null==a?function(){this.textContent=""}:function(){this.textContent=a}):this.node().textContent},sh.html=function(a){return arguments.length?this.each("function"==typeof a?function(){var b=a.apply(this,arguments);this.innerHTML=null==b?"":b}:null==a?function(){this.innerHTML=""}:function(){this.innerHTML=a}):this.node().innerHTML},sh.append=function(a){return a=z(a),this.select(function(){return this.appendChild(a.apply(this,arguments))})},sh.insert=function(a,b){return a=z(a),b=p(b),this.select(function(){return this.insertBefore(a.apply(this,arguments),b.apply(this,arguments)||null)})},sh.remove=function(){return this.each(function(){var a=this.parentNode;a&&a.removeChild(this)})},sh.data=function(a,b){function c(a,c){var d,f,g,h=a.length,l=c.length,m=Math.min(h,l),n=new Array(l),o=new Array(l),p=new Array(h);if(b){var q,r=new e,s=new e,t=[];for(d=-1;++d<h;)q=b.call(f=a[d],f.__data__,d),r.has(q)?p[d]=f:r.set(q,f),t.push(q);for(d=-1;++d<l;)q=b.call(c,g=c[d],d),(f=r.get(q))?(n[d]=f,f.__data__=g):s.has(q)||(o[d]=A(g)),s.set(q,g),r.remove(q);for(d=-1;++d<h;)r.has(t[d])&&(p[d]=a[d])}else{for(d=-1;++d<m;)f=a[d],g=c[d],f?(f.__data__=g,n[d]=f):o[d]=A(g);for(;l>d;++d)o[d]=A(c[d]);for(;h>d;++d)p[d]=a[d]}o.update=n,o.parentNode=n.parentNode=p.parentNode=a.parentNode,i.push(o),j.push(n),k.push(p)}var d,f,g=-1,h=this.length;if(!arguments.length){for(a=new Array(h=(d=this[0]).length);++g<h;)(f=d[g])&&(a[g]=f.__data__);return a}var i=E([]),j=o([]),k=o([]);if("function"==typeof a)for(;++g<h;)c(d=this[g],a.call(d,d.parentNode.__data__,g));else for(;++g<h;)c(d=this[g],a);return j.enter=function(){return i},j.exit=function(){return k},j},sh.datum=function(a){return arguments.length?this.property("__data__",a):this.property("__data__")},sh.filter=function(a){var b,c,d,e=[];"function"!=typeof a&&(a=B(a));for(var f=0,g=this.length;g>f;f++){e.push(b=[]),b.parentNode=(c=this[f]).parentNode;for(var h=0,i=c.length;i>h;h++)(d=c[h])&&a.call(d,d.__data__,h,f)&&b.push(d)}return o(e)},sh.order=function(){for(var a=-1,b=this.length;++a<b;)for(var c,d=this[a],e=d.length-1,f=d[e];--e>=0;)(c=d[e])&&(f&&f!==c.nextSibling&&f.parentNode.insertBefore(c,f),f=c);return this},sh.sort=function(a){a=C.apply(this,arguments);for(var b=-1,c=this.length;++b<c;)this[b].sort(a);return this.order()},sh.each=function(a){return D(this,function(b,c,d){a.call(b,b.__data__,c,d)})},sh.call=function(a){var b=Yg(arguments);return a.apply(b[0]=this,b),this},sh.empty=function(){return!this.node()},sh.node=function(){for(var a=0,b=this.length;b>a;a++)for(var c=this[a],d=0,e=c.length;e>d;d++){var f=c[d];if(f)return f}return null},sh.size=function(){var a=0;return this.each(function(){++a}),a};var uh=[];Wg.selection.enter=E,Wg.selection.enter.prototype=uh,uh.append=sh.append,uh.empty=sh.empty,uh.node=sh.node,uh.call=sh.call,uh.size=sh.size,uh.select=function(a){for(var b,c,d,e,f,g=[],h=-1,i=this.length;++h<i;){d=(e=this[h]).update,g.push(b=[]),b.parentNode=e.parentNode;for(var j=-1,k=e.length;++j<k;)(f=e[j])?(b.push(d[j]=c=a.call(e.parentNode,f.__data__,j,h)),c.__data__=f.__data__):b.push(null)}return o(g)},uh.insert=function(a,b){return arguments.length<2&&(b=F(this)),sh.insert.call(this,a,b)},sh.transition=function(){for(var a,b,c=zj||++Ej,d=[],e=Aj||{time:Date.now(),ease:Od,delay:0,duration:250},f=-1,g=this.length;++f<g;){d.push(a=[]);for(var h=this[f],i=-1,j=h.length;++i<j;)(b=h[i])&&gg(b,i,c,e),a.push(b)}return dg(d,c)},sh.interrupt=function(){return this.each(G)},Wg.select=function(a){var b=["string"==typeof a?oh(a,Zg):a];return b.parentNode=$g,o([b])},Wg.selectAll=function(a){var b=Yg("string"==typeof a?ph(a,Zg):a);return b.parentNode=$g,o([b])};var vh=Wg.select($g);sh.on=function(a,b,c){var d=arguments.length;if(3>d){if("string"!=typeof a){2>d&&(b=!1);for(c in a)this.each(H(c,a[c],b));return this}if(2>d)return(d=this.node()["__on"+a])&&d._;c=!1}return this.each(H(a,b,c))};var wh=Wg.map({mouseenter:"mouseover",mouseleave:"mouseout"});wh.forEach(function(a){"on"+a in Zg&&wh.remove(a)});var xh="onselectstart"in Zg?null:h($g.style,"userSelect"),yh=0;Wg.mouse=function(a){return L(a,m())};var zh=/WebKit/.test(_g.navigator.userAgent)?-1:0;Wg.touches=function(a,b){return arguments.length<2&&(b=m().touches),b?Yg(b).map(function(b){var c=L(a,b);return c.identifier=b.identifier,c}):[]},Wg.behavior.drag=function(){function a(){this.on("mousedown.drag",g).on("touchstart.drag",h)}function b(){return Wg.event.changedTouches[0].identifier}function c(a,b){return Wg.touches(a).filter(function(a){return a.identifier===b})[0]}function d(a,b,c,d){return function(){function g(){var a=b(k,n),c=a[0]-p[0],d=a[1]-p[1];q|=c|d,p=a,l({type:"drag",x:a[0]+i[0],y:a[1]+i[1],dx:c,dy:d})}function h(){r.on(c+"."+o,null).on(d+"."+o,null),s(q&&Wg.event.target===m),l({type:"dragend"})}var i,j=this,k=j.parentNode,l=e.of(j,arguments),m=Wg.event.target,n=a(),o=null==n?"drag":"drag-"+n,p=b(k,n),q=0,r=Wg.select(_g).on(c+"."+o,g).on(d+"."+o,h),s=K();f?(i=f.apply(j,arguments),i=[i.x-p[0],i.y-p[1]]):i=[0,0],l({type:"dragstart"})}}var e=n(a,"drag","dragstart","dragend"),f=null,g=d(i,Wg.mouse,"mousemove","mouseup"),h=d(b,c,"touchmove","touchend");return a.origin=function(b){return arguments.length?(f=b,a):f},Wg.rebind(a,e,"on")};var Ah=Math.PI,Bh=2*Ah,Ch=Ah/2,Dh=1e-6,Eh=Dh*Dh,Fh=Ah/180,Gh=180/Ah,Hh=Math.SQRT2,Ih=2,Jh=4;Wg.interpolateZoom=function(a,b){function c(a){var b=a*s;if(r){var c=Q(p),g=f/(Ih*m)*(c*R(Hh*b+p)-P(p));return[d+g*j,e+g*k,f*c/Q(Hh*b+p)]}return[d+a*j,e+a*k,f*Math.exp(Hh*b)]}var d=a[0],e=a[1],f=a[2],g=b[0],h=b[1],i=b[2],j=g-d,k=h-e,l=j*j+k*k,m=Math.sqrt(l),n=(i*i-f*f+Jh*l)/(2*f*Ih*m),o=(i*i-f*f-Jh*l)/(2*i*Ih*m),p=Math.log(Math.sqrt(n*n+1)-n),q=Math.log(Math.sqrt(o*o+1)-o),r=q-p,s=(r||Math.log(i/f))/Hh;return c.duration=1e3*s,c},Wg.behavior.zoom=function(){function a(a){a.on(B,j).on(Mh+".zoom",m).on(C,o).on("dblclick.zoom",p).on(E,k)
+}function b(a){return[(a[0]-y.x)/y.k,(a[1]-y.y)/y.k]}function c(a){return[a[0]*y.k+y.x,a[1]*y.k+y.y]}function d(a){y.k=Math.max(A[0],Math.min(A[1],a))}function e(a,b){b=c(b),y.x+=a[0]-b[0],y.y+=a[1]-b[1]}function f(){v&&v.domain(u.range().map(function(a){return(a-y.x)/y.k}).map(u.invert)),x&&x.domain(w.range().map(function(a){return(a-y.y)/y.k}).map(w.invert))}function g(a){a({type:"zoomstart"})}function h(a){f(),a({type:"zoom",scale:y.k,translate:[y.x,y.y]})}function i(a){a({type:"zoomend"})}function j(){function a(){k=1,e(Wg.mouse(d),m),h(f)}function c(){l.on(C,_g===d?o:null).on(D,null),n(k&&Wg.event.target===j),i(f)}var d=this,f=F.of(d,arguments),j=Wg.event.target,k=0,l=Wg.select(_g).on(C,a).on(D,c),m=b(Wg.mouse(d)),n=K();G.call(d),g(f)}function k(){function a(){var a=Wg.touches(o);return n=y.k,a.forEach(function(a){a.identifier in q&&(q[a.identifier]=b(a))}),a}function c(){for(var b=Wg.event.changedTouches,c=0,f=b.length;f>c;++c)q[b[c].identifier]=null;var g=a(),i=Date.now();if(1===g.length){if(500>i-t){var j=g[0],k=q[j.identifier];d(2*y.k),e(j,k),l(),h(p)}t=i}else if(g.length>1){var j=g[0],m=g[1],n=j[0]-m[0],o=j[1]-m[1];r=n*n+o*o}}function f(){for(var a,b,c,f,g=Wg.touches(o),i=0,j=g.length;j>i;++i,f=null)if(c=g[i],f=q[c.identifier]){if(b)break;a=c,b=f}if(f){var k=(k=c[0]-a[0])*k+(k=c[1]-a[1])*k,l=r&&Math.sqrt(k/r);a=[(a[0]+c[0])/2,(a[1]+c[1])/2],b=[(b[0]+f[0])/2,(b[1]+f[1])/2],d(l*n)}t=null,e(a,b),h(p)}function m(){if(Wg.event.touches.length){for(var b=Wg.event.changedTouches,c=0,d=b.length;d>c;++c)delete q[b[c].identifier];for(var e in q)return void a()}w.on(u,null).on(v,null),x.on(B,j).on(E,k),z(),i(p)}var n,o=this,p=F.of(o,arguments),q={},r=0,s=Wg.event.changedTouches[0].identifier,u="touchmove.zoom-"+s,v="touchend.zoom-"+s,w=Wg.select(_g).on(u,f).on(v,m),x=Wg.select(o).on(B,null).on(E,c),z=K();G.call(o),c(),g(p)}function m(){var a=F.of(this,arguments);s?clearTimeout(s):(G.call(this),g(a)),s=setTimeout(function(){s=null,i(a)},50),l();var c=r||Wg.mouse(this);q||(q=b(c)),d(Math.pow(2,.002*Kh())*y.k),e(c,q),h(a)}function o(){q=null}function p(){var a=F.of(this,arguments),c=Wg.mouse(this),f=b(c),j=Math.log(y.k)/Math.LN2;g(a),d(Math.pow(2,Wg.event.shiftKey?Math.ceil(j)-1:Math.floor(j)+1)),e(c,f),h(a),i(a)}var q,r,s,t,u,v,w,x,y={x:0,y:0,k:1},z=[960,500],A=Lh,B="mousedown.zoom",C="mousemove.zoom",D="mouseup.zoom",E="touchstart.zoom",F=n(a,"zoomstart","zoom","zoomend");return a.event=function(a){a.each(function(){var a=F.of(this,arguments),b=y;zj?Wg.select(this).transition().each("start.zoom",function(){y=this.__chart__||{x:0,y:0,k:1},g(a)}).tween("zoom:zoom",function(){var c=z[0],d=z[1],e=c/2,f=d/2,g=Wg.interpolateZoom([(e-y.x)/y.k,(f-y.y)/y.k,c/y.k],[(e-b.x)/b.k,(f-b.y)/b.k,c/b.k]);return function(b){var d=g(b),i=c/d[2];this.__chart__=y={x:e-d[0]*i,y:f-d[1]*i,k:i},h(a)}}).each("end.zoom",function(){i(a)}):(this.__chart__=y,g(a),h(a),i(a))})},a.translate=function(b){return arguments.length?(y={x:+b[0],y:+b[1],k:y.k},f(),a):[y.x,y.y]},a.scale=function(b){return arguments.length?(y={x:y.x,y:y.y,k:+b},f(),a):y.k},a.scaleExtent=function(b){return arguments.length?(A=null==b?Lh:[+b[0],+b[1]],a):A},a.center=function(b){return arguments.length?(r=b&&[+b[0],+b[1]],a):r},a.size=function(b){return arguments.length?(z=b&&[+b[0],+b[1]],a):z},a.x=function(b){return arguments.length?(v=b,u=b.copy(),y={x:0,y:0,k:1},a):v},a.y=function(b){return arguments.length?(x=b,w=b.copy(),y={x:0,y:0,k:1},a):x},Wg.rebind(a,F,"on")};var Kh,Lh=[0,1/0],Mh="onwheel"in Zg?(Kh=function(){return-Wg.event.deltaY*(Wg.event.deltaMode?120:1)},"wheel"):"onmousewheel"in Zg?(Kh=function(){return Wg.event.wheelDelta},"mousewheel"):(Kh=function(){return-Wg.event.detail},"MozMousePixelScroll");T.prototype.toString=function(){return this.rgb()+""},Wg.hsl=function(a,b,c){return 1===arguments.length?a instanceof V?U(a.h,a.s,a.l):kb(""+a,lb,U):U(+a,+b,+c)};var Nh=V.prototype=new T;Nh.brighter=function(a){return a=Math.pow(.7,arguments.length?a:1),U(this.h,this.s,this.l/a)},Nh.darker=function(a){return a=Math.pow(.7,arguments.length?a:1),U(this.h,this.s,a*this.l)},Nh.rgb=function(){return W(this.h,this.s,this.l)},Wg.hcl=function(a,b,c){return 1===arguments.length?a instanceof Y?X(a.h,a.c,a.l):a instanceof _?bb(a.l,a.a,a.b):bb((a=mb((a=Wg.rgb(a)).r,a.g,a.b)).l,a.a,a.b):X(+a,+b,+c)};var Oh=Y.prototype=new T;Oh.brighter=function(a){return X(this.h,this.c,Math.min(100,this.l+Ph*(arguments.length?a:1)))},Oh.darker=function(a){return X(this.h,this.c,Math.max(0,this.l-Ph*(arguments.length?a:1)))},Oh.rgb=function(){return Z(this.h,this.c,this.l).rgb()},Wg.lab=function(a,b,c){return 1===arguments.length?a instanceof _?$(a.l,a.a,a.b):a instanceof Y?Z(a.l,a.c,a.h):mb((a=Wg.rgb(a)).r,a.g,a.b):$(+a,+b,+c)};var Ph=18,Qh=.95047,Rh=1,Sh=1.08883,Th=_.prototype=new T;Th.brighter=function(a){return $(Math.min(100,this.l+Ph*(arguments.length?a:1)),this.a,this.b)},Th.darker=function(a){return $(Math.max(0,this.l-Ph*(arguments.length?a:1)),this.a,this.b)},Th.rgb=function(){return ab(this.l,this.a,this.b)},Wg.rgb=function(a,b,c){return 1===arguments.length?a instanceof ib?hb(a.r,a.g,a.b):kb(""+a,hb,W):hb(~~a,~~b,~~c)};var Uh=ib.prototype=new T;Uh.brighter=function(a){a=Math.pow(.7,arguments.length?a:1);var b=this.r,c=this.g,d=this.b,e=30;return b||c||d?(b&&e>b&&(b=e),c&&e>c&&(c=e),d&&e>d&&(d=e),hb(Math.min(255,~~(b/a)),Math.min(255,~~(c/a)),Math.min(255,~~(d/a)))):hb(e,e,e)},Uh.darker=function(a){return a=Math.pow(.7,arguments.length?a:1),hb(~~(a*this.r),~~(a*this.g),~~(a*this.b))},Uh.hsl=function(){return lb(this.r,this.g,this.b)},Uh.toString=function(){return"#"+jb(this.r)+jb(this.g)+jb(this.b)};var Vh=Wg.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});Vh.forEach(function(a,b){Vh.set(a,fb(b))}),Wg.functor=pb,Wg.xhr=rb(qb),Wg.dsv=function(a,b){function c(a,c,f){arguments.length<3&&(f=c,c=null);var g=sb(a,b,null==c?d:e(c),f);return g.row=function(a){return arguments.length?g.response(null==(c=a)?d:e(a)):c},g}function d(a){return c.parse(a.responseText)}function e(a){return function(b){return c.parse(b.responseText,a)}}function g(b){return b.map(h).join(a)}function h(a){return i.test(a)?'"'+a.replace(/\"/g,'""')+'"':a}var i=new RegExp('["'+a+"\n]"),j=a.charCodeAt(0);return c.parse=function(a,b){var d;return c.parseRows(a,function(a,c){if(d)return d(a,c-1);var e=new Function("d","return {"+a.map(function(a,b){return JSON.stringify(a)+": d["+b+"]"}).join(",")+"}");d=b?function(a,c){return b(e(a),c)}:e})},c.parseRows=function(a,b){function c(){if(k>=i)return g;if(e)return e=!1,f;var b=k;if(34===a.charCodeAt(b)){for(var c=b;c++<i;)if(34===a.charCodeAt(c)){if(34!==a.charCodeAt(c+1))break;++c}k=c+2;var d=a.charCodeAt(c+1);return 13===d?(e=!0,10===a.charCodeAt(c+2)&&++k):10===d&&(e=!0),a.substring(b+1,c).replace(/""/g,'"')}for(;i>k;){var d=a.charCodeAt(k++),h=1;if(10===d)e=!0;else if(13===d)e=!0,10===a.charCodeAt(k)&&(++k,++h);else if(d!==j)continue;return a.substring(b,k-h)}return a.substring(b)}for(var d,e,f={},g={},h=[],i=a.length,k=0,l=0;(d=c())!==g;){for(var m=[];d!==f&&d!==g;)m.push(d),d=c();(!b||(m=b(m,l++)))&&h.push(m)}return h},c.format=function(b){if(Array.isArray(b[0]))return c.formatRows(b);var d=new f,e=[];return b.forEach(function(a){for(var b in a)d.has(b)||e.push(d.add(b))}),[e.map(h).join(a)].concat(b.map(function(b){return e.map(function(a){return h(b[a])}).join(a)})).join("\n")},c.formatRows=function(a){return a.map(g).join("\n")},c},Wg.csv=Wg.dsv(",","text/csv"),Wg.tsv=Wg.dsv("	","text/tab-separated-values");var Wh,Xh,Yh,Zh,$h,_h=_g[h(_g,"requestAnimationFrame")]||function(a){setTimeout(a,17)};Wg.timer=function(a,b,c){var d=arguments.length;2>d&&(b=0),3>d&&(c=Date.now());var e=c+b,f={c:a,t:e,f:!1,n:null};Xh?Xh.n=f:Wh=f,Xh=f,Yh||(Zh=clearTimeout(Zh),Yh=1,_h(ub))},Wg.timer.flush=function(){vb(),wb()};var ai=".",bi=",",ci=[3,3],di="$",ei=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"].map(xb);Wg.formatPrefix=function(a,b){var c=0;return a&&(0>a&&(a*=-1),b&&(a=Wg.round(a,yb(a,b))),c=1+Math.floor(1e-12+Math.log(a)/Math.LN10),c=Math.max(-24,Math.min(24,3*Math.floor((0>=c?c+1:c-1)/3)))),ei[8+c/3]},Wg.round=function(a,b){return b?Math.round(a*(b=Math.pow(10,b)))/b:Math.round(a)},Wg.format=function(a){var b=fi.exec(a),c=b[1]||" ",d=b[2]||">",e=b[3]||"",f=b[4]||"",g=b[5],h=+b[6],i=b[7],j=b[8],k=b[9],l=1,m="",n=!1;switch(j&&(j=+j.substring(1)),(g||"0"===c&&"="===d)&&(g=c="0",d="=",i&&(h-=Math.floor((h-1)/4))),k){case"n":i=!0,k="g";break;case"%":l=100,m="%",k="f";break;case"p":l=100,m="%",k="r";break;case"b":case"o":case"x":case"X":"#"===f&&(f="0"+k.toLowerCase());case"c":case"d":n=!0,j=0;break;case"s":l=-1,k="r"}"#"===f?f="":"$"===f&&(f=di),"r"!=k||j||(k="g"),null!=j&&("g"==k?j=Math.max(1,Math.min(21,j)):("e"==k||"f"==k)&&(j=Math.max(0,Math.min(20,j)))),k=gi.get(k)||zb;var o=g&&i;return function(a){if(n&&a%1)return"";var b=0>a||0===a&&0>1/a?(a=-a,"-"):e;if(0>l){var p=Wg.formatPrefix(a,j);a=p.scale(a),m=p.symbol}else a*=l;a=k(a,j);var q=a.lastIndexOf("."),r=0>q?a:a.substring(0,q),s=0>q?"":ai+a.substring(q+1);!g&&i&&(r=hi(r));var t=f.length+r.length+s.length+(o?0:b.length),u=h>t?new Array(t=h-t+1).join(c):"";return o&&(r=hi(u+r)),b+=f,a=r+s,("<"===d?b+a+u:">"===d?u+b+a:"^"===d?u.substring(0,t>>=1)+b+a+u.substring(t):b+(o?a:u+a))+m}};var fi=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,gi=Wg.map({b:function(a){return a.toString(2)},c:function(a){return String.fromCharCode(a)},o:function(a){return a.toString(8)},x:function(a){return a.toString(16)},X:function(a){return a.toString(16).toUpperCase()},g:function(a,b){return a.toPrecision(b)},e:function(a,b){return a.toExponential(b)},f:function(a,b){return a.toFixed(b)},r:function(a,b){return(a=Wg.round(a,yb(a,b))).toFixed(Math.max(0,Math.min(20,yb(a*(1+1e-15),b))))}}),hi=qb;if(ci){var ii=ci.length;hi=function(a){for(var b=a.length,c=[],d=0,e=ci[0];b>0&&e>0;)c.push(a.substring(b-=e,b+e)),e=ci[d=(d+1)%ii];return c.reverse().join(bi)}}Wg.geo={},Ab.prototype={s:0,t:0,add:function(a){Bb(a,this.t,ji),Bb(ji.s,this.s,this),this.s?this.t+=ji.t:this.s=ji.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var ji=new Ab;Wg.geo.stream=function(a,b){a&&ki.hasOwnProperty(a.type)?ki[a.type](a,b):Cb(a,b)};var ki={Feature:function(a,b){Cb(a.geometry,b)},FeatureCollection:function(a,b){for(var c=a.features,d=-1,e=c.length;++d<e;)Cb(c[d].geometry,b)}},li={Sphere:function(a,b){b.sphere()},Point:function(a,b){a=a.coordinates,b.point(a[0],a[1],a[2])},MultiPoint:function(a,b){for(var c=a.coordinates,d=-1,e=c.length;++d<e;)a=c[d],b.point(a[0],a[1],a[2])},LineString:function(a,b){Db(a.coordinates,b,0)},MultiLineString:function(a,b){for(var c=a.coordinates,d=-1,e=c.length;++d<e;)Db(c[d],b,0)},Polygon:function(a,b){Eb(a.coordinates,b)},MultiPolygon:function(a,b){for(var c=a.coordinates,d=-1,e=c.length;++d<e;)Eb(c[d],b)},GeometryCollection:function(a,b){for(var c=a.geometries,d=-1,e=c.length;++d<e;)Cb(c[d],b)}};Wg.geo.area=function(a){return mi=0,Wg.geo.stream(a,oi),mi};var mi,ni=new Ab,oi={sphere:function(){mi+=4*Ah},point:i,lineStart:i,lineEnd:i,polygonStart:function(){ni.reset(),oi.lineStart=Fb},polygonEnd:function(){var a=2*ni;mi+=0>a?4*Ah+a:a,oi.lineStart=oi.lineEnd=oi.point=i}};Wg.geo.bounds=function(){function a(a,b){t.push(u=[k=a,m=a]),l>b&&(l=b),b>n&&(n=b)}function b(b,c){var d=Gb([b*Fh,c*Fh]);if(r){var e=Ib(r,d),f=[e[1],-e[0],0],g=Ib(f,e);Lb(g),g=Mb(g);var i=b-o,j=i>0?1:-1,p=g[0]*Gh*j,q=ih(i)>180;if(q^(p>j*o&&j*b>p)){var s=g[1]*Gh;s>n&&(n=s)}else if(p=(p+360)%360-180,q^(p>j*o&&j*b>p)){var s=-g[1]*Gh;l>s&&(l=s)}else l>c&&(l=c),c>n&&(n=c);q?o>b?h(k,b)>h(k,m)&&(m=b):h(b,m)>h(k,m)&&(k=b):m>=k?(k>b&&(k=b),b>m&&(m=b)):b>o?h(k,b)>h(k,m)&&(m=b):h(b,m)>h(k,m)&&(k=b)}else a(b,c);r=d,o=b}function c(){v.point=b}function d(){u[0]=k,u[1]=m,v.point=a,r=null}function e(a,c){if(r){var d=a-o;s+=ih(d)>180?d+(d>0?360:-360):d}else p=a,q=c;oi.point(a,c),b(a,c)}function f(){oi.lineStart()}function g(){e(p,q),oi.lineEnd(),ih(s)>Dh&&(k=-(m=180)),u[0]=k,u[1]=m,r=null}function h(a,b){return(b-=a)<0?b+360:b}function i(a,b){return a[0]-b[0]}function j(a,b){return b[0]<=b[1]?b[0]<=a&&a<=b[1]:a<b[0]||b[1]<a}var k,l,m,n,o,p,q,r,s,t,u,v={point:a,lineStart:c,lineEnd:d,polygonStart:function(){v.point=e,v.lineStart=f,v.lineEnd=g,s=0,oi.polygonStart()},polygonEnd:function(){oi.polygonEnd(),v.point=a,v.lineStart=c,v.lineEnd=d,0>ni?(k=-(m=180),l=-(n=90)):s>Dh?n=90:-Dh>s&&(l=-90),u[0]=k,u[1]=m}};return function(a){n=m=-(k=l=1/0),t=[],Wg.geo.stream(a,v);var b=t.length;if(b){t.sort(i);for(var c,d=1,e=t[0],f=[e];b>d;++d)c=t[d],j(c[0],e)||j(c[1],e)?(h(e[0],c[1])>h(e[0],e[1])&&(e[1]=c[1]),h(c[0],e[1])>h(e[0],e[1])&&(e[0]=c[0])):f.push(e=c);for(var g,c,o=-1/0,b=f.length-1,d=0,e=f[b];b>=d;e=c,++d)c=f[d],(g=h(e[1],c[0]))>o&&(o=g,k=c[0],m=e[1])}return t=u=null,1/0===k||1/0===l?[[0/0,0/0],[0/0,0/0]]:[[k,l],[m,n]]}}(),Wg.geo.centroid=function(a){pi=qi=ri=si=ti=ui=vi=wi=xi=yi=zi=0,Wg.geo.stream(a,Ai);var b=xi,c=yi,d=zi,e=b*b+c*c+d*d;return Eh>e&&(b=ui,c=vi,d=wi,Dh>qi&&(b=ri,c=si,d=ti),e=b*b+c*c+d*d,Eh>e)?[0/0,0/0]:[Math.atan2(c,b)*Gh,O(d/Math.sqrt(e))*Gh]};var pi,qi,ri,si,ti,ui,vi,wi,xi,yi,zi,Ai={sphere:i,point:Ob,lineStart:Qb,lineEnd:Rb,polygonStart:function(){Ai.lineStart=Sb},polygonEnd:function(){Ai.lineStart=Qb}},Bi=Xb(Tb,ac,cc,[-Ah,-Ah/2]),Ci=1e9;Wg.geo.clipExtent=function(){var a,b,c,d,e,f,g={stream:function(a){return e&&(e.valid=!1),e=f(a),e.valid=!0,e},extent:function(h){return arguments.length?(f=fc(a=+h[0][0],b=+h[0][1],c=+h[1][0],d=+h[1][1]),e&&(e.valid=!1,e=null),g):[[a,b],[c,d]]}};return g.extent([[0,0],[960,500]])},(Wg.geo.conicEqualArea=function(){return hc(ic)}).raw=ic,Wg.geo.albers=function(){return Wg.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},Wg.geo.albersUsa=function(){function a(a){var f=a[0],g=a[1];return b=null,c(f,g),b||(d(f,g),b)||e(f,g),b}var b,c,d,e,f=Wg.geo.albers(),g=Wg.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),h=Wg.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),i={point:function(a,c){b=[a,c]}};return a.invert=function(a){var b=f.scale(),c=f.translate(),d=(a[0]-c[0])/b,e=(a[1]-c[1])/b;return(e>=.12&&.234>e&&d>=-.425&&-.214>d?g:e>=.166&&.234>e&&d>=-.214&&-.115>d?h:f).invert(a)},a.stream=function(a){var b=f.stream(a),c=g.stream(a),d=h.stream(a);return{point:function(a,e){b.point(a,e),c.point(a,e),d.point(a,e)},sphere:function(){b.sphere(),c.sphere(),d.sphere()},lineStart:function(){b.lineStart(),c.lineStart(),d.lineStart()},lineEnd:function(){b.lineEnd(),c.lineEnd(),d.lineEnd()},polygonStart:function(){b.polygonStart(),c.polygonStart(),d.polygonStart()},polygonEnd:function(){b.polygonEnd(),c.polygonEnd(),d.polygonEnd()}}},a.precision=function(b){return arguments.length?(f.precision(b),g.precision(b),h.precision(b),a):f.precision()},a.scale=function(b){return arguments.length?(f.scale(b),g.scale(.35*b),h.scale(b),a.translate(f.translate())):f.scale()},a.translate=function(b){if(!arguments.length)return f.translate();var j=f.scale(),k=+b[0],l=+b[1];return c=f.translate(b).clipExtent([[k-.455*j,l-.238*j],[k+.455*j,l+.238*j]]).stream(i).point,d=g.translate([k-.307*j,l+.201*j]).clipExtent([[k-.425*j+Dh,l+.12*j+Dh],[k-.214*j-Dh,l+.234*j-Dh]]).stream(i).point,e=h.translate([k-.205*j,l+.212*j]).clipExtent([[k-.214*j+Dh,l+.166*j+Dh],[k-.115*j-Dh,l+.234*j-Dh]]).stream(i).point,a},a.scale(1070)};var Di,Ei,Fi,Gi,Hi,Ii,Ji={point:i,lineStart:i,lineEnd:i,polygonStart:function(){Ei=0,Ji.lineStart=jc},polygonEnd:function(){Ji.lineStart=Ji.lineEnd=Ji.point=i,Di+=ih(Ei/2)}},Ki={point:kc,lineStart:i,lineEnd:i,polygonStart:i,polygonEnd:i},Li={point:nc,lineStart:oc,lineEnd:pc,polygonStart:function(){Li.lineStart=qc},polygonEnd:function(){Li.point=nc,Li.lineStart=oc,Li.lineEnd=pc}};Wg.geo.path=function(){function a(a){return a&&("function"==typeof h&&f.pointRadius(+h.apply(this,arguments)),g&&g.valid||(g=e(f)),Wg.geo.stream(a,g)),f.result()}function b(){return g=null,a}var c,d,e,f,g,h=4.5;return a.area=function(a){return Di=0,Wg.geo.stream(a,e(Ji)),Di},a.centroid=function(a){return ri=si=ti=ui=vi=wi=xi=yi=zi=0,Wg.geo.stream(a,e(Li)),zi?[xi/zi,yi/zi]:wi?[ui/wi,vi/wi]:ti?[ri/ti,si/ti]:[0/0,0/0]},a.bounds=function(a){return Hi=Ii=-(Fi=Gi=1/0),Wg.geo.stream(a,e(Ki)),[[Fi,Gi],[Hi,Ii]]},a.projection=function(a){return arguments.length?(e=(c=a)?a.stream||tc(a):qb,b()):c},a.context=function(a){return arguments.length?(f=null==(d=a)?new lc:new rc(a),"function"!=typeof h&&f.pointRadius(h),b()):d},a.pointRadius=function(b){return arguments.length?(h="function"==typeof b?b:(f.pointRadius(+b),+b),a):h},a.projection(Wg.geo.albersUsa()).context(null)},Wg.geo.transform=function(a){return{stream:function(b){var c=new uc(b);for(var d in a)c[d]=a[d];return c}}},uc.prototype={point:function(a,b){this.stream.point(a,b)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},Wg.geo.projection=wc,Wg.geo.projectionMutator=xc,(Wg.geo.equirectangular=function(){return wc(zc)}).raw=zc.invert=zc,Wg.geo.rotation=function(a){function b(b){return b=a(b[0]*Fh,b[1]*Fh),b[0]*=Gh,b[1]*=Gh,b}return a=Bc(a[0]%360*Fh,a[1]*Fh,a.length>2?a[2]*Fh:0),b.invert=function(b){return b=a.invert(b[0]*Fh,b[1]*Fh),b[0]*=Gh,b[1]*=Gh,b},b},Ac.invert=zc,Wg.geo.circle=function(){function a(){var a="function"==typeof d?d.apply(this,arguments):d,b=Bc(-a[0]*Fh,-a[1]*Fh,0).invert,e=[];return c(null,null,1,{point:function(a,c){e.push(a=b(a,c)),a[0]*=Gh,a[1]*=Gh}}),{type:"Polygon",coordinates:[e]}}var b,c,d=[0,0],e=6;return a.origin=function(b){return arguments.length?(d=b,a):d},a.angle=function(d){return arguments.length?(c=Fc((b=+d)*Fh,e*Fh),a):b},a.precision=function(d){return arguments.length?(c=Fc(b*Fh,(e=+d)*Fh),a):e},a.angle(90)},Wg.geo.distance=function(a,b){var c,d=(b[0]-a[0])*Fh,e=a[1]*Fh,f=b[1]*Fh,g=Math.sin(d),h=Math.cos(d),i=Math.sin(e),j=Math.cos(e),k=Math.sin(f),l=Math.cos(f);return Math.atan2(Math.sqrt((c=l*g)*c+(c=j*k-i*l*h)*c),i*k+j*l*h)},Wg.geo.graticule=function(){function a(){return{type:"MultiLineString",coordinates:b()}}function b(){return Wg.range(Math.ceil(f/q)*q,e,q).map(m).concat(Wg.range(Math.ceil(j/r)*r,i,r).map(n)).concat(Wg.range(Math.ceil(d/o)*o,c,o).filter(function(a){return ih(a%q)>Dh}).map(k)).concat(Wg.range(Math.ceil(h/p)*p,g,p).filter(function(a){return ih(a%r)>Dh}).map(l))}var c,d,e,f,g,h,i,j,k,l,m,n,o=10,p=o,q=90,r=360,s=2.5;return a.lines=function(){return b().map(function(a){return{type:"LineString",coordinates:a}})},a.outline=function(){return{type:"Polygon",coordinates:[m(f).concat(n(i).slice(1),m(e).reverse().slice(1),n(j).reverse().slice(1))]}},a.extent=function(b){return arguments.length?a.majorExtent(b).minorExtent(b):a.minorExtent()},a.majorExtent=function(b){return arguments.length?(f=+b[0][0],e=+b[1][0],j=+b[0][1],i=+b[1][1],f>e&&(b=f,f=e,e=b),j>i&&(b=j,j=i,i=b),a.precision(s)):[[f,j],[e,i]]},a.minorExtent=function(b){return arguments.length?(d=+b[0][0],c=+b[1][0],h=+b[0][1],g=+b[1][1],d>c&&(b=d,d=c,c=b),h>g&&(b=h,h=g,g=b),a.precision(s)):[[d,h],[c,g]]},a.step=function(b){return arguments.length?a.majorStep(b).minorStep(b):a.minorStep()},a.majorStep=function(b){return arguments.length?(q=+b[0],r=+b[1],a):[q,r]},a.minorStep=function(b){return arguments.length?(o=+b[0],p=+b[1],a):[o,p]},a.precision=function(b){return arguments.length?(s=+b,k=Hc(h,g,90),l=Ic(d,c,s),m=Hc(j,i,90),n=Ic(f,e,s),a):s},a.majorExtent([[-180,-90+Dh],[180,90-Dh]]).minorExtent([[-180,-80-Dh],[180,80+Dh]])},Wg.geo.greatArc=function(){function a(){return{type:"LineString",coordinates:[b||d.apply(this,arguments),c||e.apply(this,arguments)]}}var b,c,d=Jc,e=Kc;return a.distance=function(){return Wg.geo.distance(b||d.apply(this,arguments),c||e.apply(this,arguments))},a.source=function(c){return arguments.length?(d=c,b="function"==typeof c?null:c,a):d},a.target=function(b){return arguments.length?(e=b,c="function"==typeof b?null:b,a):e},a.precision=function(){return arguments.length?a:0},a},Wg.geo.interpolate=function(a,b){return Lc(a[0]*Fh,a[1]*Fh,b[0]*Fh,b[1]*Fh)},Wg.geo.length=function(a){return Mi=0,Wg.geo.stream(a,Ni),Mi};var Mi,Ni={sphere:i,point:i,lineStart:Mc,lineEnd:i,polygonStart:i,polygonEnd:i},Oi=Nc(function(a){return Math.sqrt(2/(1+a))},function(a){return 2*Math.asin(a/2)});(Wg.geo.azimuthalEqualArea=function(){return wc(Oi)}).raw=Oi;var Pi=Nc(function(a){var b=Math.acos(a);return b&&b/Math.sin(b)},qb);(Wg.geo.azimuthalEquidistant=function(){return wc(Pi)}).raw=Pi,(Wg.geo.conicConformal=function(){return hc(Oc)}).raw=Oc,(Wg.geo.conicEquidistant=function(){return hc(Pc)}).raw=Pc;var Qi=Nc(function(a){return 1/a},Math.atan);(Wg.geo.gnomonic=function(){return wc(Qi)}).raw=Qi,Qc.invert=function(a,b){return[a,2*Math.atan(Math.exp(b))-Ch]},(Wg.geo.mercator=function(){return Rc(Qc)}).raw=Qc;var Ri=Nc(function(){return 1},Math.asin);(Wg.geo.orthographic=function(){return wc(Ri)}).raw=Ri;var Si=Nc(function(a){return 1/(1+a)},function(a){return 2*Math.atan(a)});(Wg.geo.stereographic=function(){return wc(Si)}).raw=Si,Sc.invert=function(a,b){return[-b,2*Math.atan(Math.exp(a))-Ch]},(Wg.geo.transverseMercator=function(){var a=Rc(Sc),b=a.center,c=a.rotate;return a.center=function(a){return a?b([-a[1],a[0]]):(a=b(),[-a[1],a[0]])},a.rotate=function(a){return a?c([a[0],a[1],a.length>2?a[2]+90:90]):(a=c(),[a[0],a[1],a[2]-90])},a.rotate([0,0])}).raw=Sc,Wg.geom={},Wg.geom.hull=function(a){function b(a){if(a.length<3)return[];var b,e,f,g,h,i,j,k,l,m,n,o,p=pb(c),q=pb(d),r=a.length,s=r-1,t=[],u=[],v=0;if(p===Tc&&d===Uc)b=a;else for(f=0,b=[];r>f;++f)b.push([+p.call(this,e=a[f],f),+q.call(this,e,f)]);for(f=1;r>f;++f)(b[f][1]<b[v][1]||b[f][1]==b[v][1]&&b[f][0]<b[v][0])&&(v=f);for(f=0;r>f;++f)f!==v&&(i=b[f][1]-b[v][1],h=b[f][0]-b[v][0],t.push({angle:Math.atan2(i,h),index:f}));for(t.sort(function(a,b){return a.angle-b.angle}),n=t[0].angle,m=t[0].index,l=0,f=1;s>f;++f){if(g=t[f].index,n==t[f].angle){if(h=b[m][0]-b[v][0],i=b[m][1]-b[v][1],j=b[g][0]-b[v][0],k=b[g][1]-b[v][1],h*h+i*i>=j*j+k*k){t[f].index=-1;continue}t[l].index=-1}n=t[f].angle,l=f,m=g}for(u.push(v),f=0,g=0;2>f;++g)t[g].index>-1&&(u.push(t[g].index),f++);for(o=u.length;s>g;++g)if(!(t[g].index<0)){for(;!Vc(u[o-2],u[o-1],t[g].index,b);)--o;u[o++]=t[g].index}var w=[];for(f=o-1;f>=0;--f)w.push(a[u[f]]);return w}var c=Tc,d=Uc;return arguments.length?b(a):(b.x=function(a){return arguments.length?(c=a,b):c},b.y=function(a){return arguments.length?(d=a,b):d},b)},Wg.geom.polygon=function(a){return nh(a,Ti),a};var Ti=Wg.geom.polygon.prototype=[];Ti.area=function(){for(var a,b=-1,c=this.length,d=this[c-1],e=0;++b<c;)a=d,d=this[b],e+=a[1]*d[0]-a[0]*d[1];return.5*e},Ti.centroid=function(a){var b,c,d=-1,e=this.length,f=0,g=0,h=this[e-1];for(arguments.length||(a=-1/(6*this.area()));++d<e;)b=h,h=this[d],c=b[0]*h[1]-h[0]*b[1],f+=(b[0]+h[0])*c,g+=(b[1]+h[1])*c;return[f*a,g*a]},Ti.clip=function(a){for(var b,c,d,e,f,g,h=Yc(a),i=-1,j=this.length-Yc(this),k=this[j-1];++i<j;){for(b=a.slice(),a.length=0,e=this[i],f=b[(d=b.length-h)-1],c=-1;++c<d;)g=b[c],Wc(g,k,e)?(Wc(f,k,e)||a.push(Xc(f,g,k,e)),a.push(g)):Wc(f,k,e)&&a.push(Xc(f,g,k,e)),f=g;h&&a.push(a[0]),k=e}return a};var Ui,Vi,Wi,Xi,Yi,Zi=[],$i=[];ed.prototype.prepare=function(){for(var a,b=this.edges,c=b.length;c--;)a=b[c].edge,a.b&&a.a||b.splice(c,1);return b.sort(gd),b.length},qd.prototype={start:function(){return this.edge.l===this.site?this.edge.a:this.edge.b},end:function(){return this.edge.l===this.site?this.edge.b:this.edge.a}},rd.prototype={insert:function(a,b){var c,d,e;if(a){if(b.P=a,b.N=a.N,a.N&&(a.N.P=b),a.N=b,a.R){for(a=a.R;a.L;)a=a.L;a.L=b}else a.R=b;c=a}else this._?(a=vd(this._),b.P=null,b.N=a,a.P=a.L=b,c=a):(b.P=b.N=null,this._=b,c=null);for(b.L=b.R=null,b.U=c,b.C=!0,a=b;c&&c.C;)d=c.U,c===d.L?(e=d.R,e&&e.C?(c.C=e.C=!1,d.C=!0,a=d):(a===c.R&&(td(this,c),a=c,c=a.U),c.C=!1,d.C=!0,ud(this,d))):(e=d.L,e&&e.C?(c.C=e.C=!1,d.C=!0,a=d):(a===c.L&&(ud(this,c),a=c,c=a.U),c.C=!1,d.C=!0,td(this,d))),c=a.U;this._.C=!1},remove:function(a){a.N&&(a.N.P=a.P),a.P&&(a.P.N=a.N),a.N=a.P=null;var b,c,d,e=a.U,f=a.L,g=a.R;if(c=f?g?vd(g):f:g,e?e.L===a?e.L=c:e.R=c:this._=c,f&&g?(d=c.C,c.C=a.C,c.L=f,f.U=c,c!==g?(e=c.U,c.U=a.U,a=c.R,e.L=a,c.R=g,g.U=c):(c.U=e,e=c,a=c.R)):(d=a.C,a=c),a&&(a.U=e),!d){if(a&&a.C)return void(a.C=!1);do{if(a===this._)break;if(a===e.L){if(b=e.R,b.C&&(b.C=!1,e.C=!0,td(this,e),b=e.R),b.L&&b.L.C||b.R&&b.R.C){b.R&&b.R.C||(b.L.C=!1,b.C=!0,ud(this,b),b=e.R),b.C=e.C,e.C=b.R.C=!1,td(this,e),a=this._;break}}else if(b=e.L,b.C&&(b.C=!1,e.C=!0,ud(this,e),b=e.L),b.L&&b.L.C||b.R&&b.R.C){b.L&&b.L.C||(b.R.C=!1,b.C=!0,td(this,b),b=e.L),b.C=e.C,e.C=b.L.C=!1,ud(this,e),a=this._;break}b.C=!0,a=e,e=e.U}while(!a.C);a&&(a.C=!1)}}},Wg.geom.voronoi=function(a){function b(a){var b=new Array(a.length),d=h[0][0],e=h[0][1],f=h[1][0],g=h[1][1];return wd(c(a),h).cells.forEach(function(c,h){var i=c.edges,j=c.site,k=b[h]=i.length?i.map(function(a){var b=a.start();return[b.x,b.y]}):j.x>=d&&j.x<=f&&j.y>=e&&j.y<=g?[[d,g],[f,g],[f,e],[d,e]]:[];k.point=a[h]}),b}function c(a){return a.map(function(a,b){return{x:Math.round(f(a,b)/Dh)*Dh,y:Math.round(g(a,b)/Dh)*Dh,i:b}})}var d=Tc,e=Uc,f=d,g=e,h=_i;return a?b(a):(b.links=function(a){return wd(c(a)).edges.filter(function(a){return a.l&&a.r}).map(function(b){return{source:a[b.l.i],target:a[b.r.i]}})},b.triangles=function(a){var b=[];return wd(c(a)).cells.forEach(function(c,d){for(var e,f,g=c.site,h=c.edges.sort(gd),i=-1,j=h.length,k=h[j-1].edge,l=k.l===g?k.r:k.l;++i<j;)e=k,f=l,k=h[i].edge,l=k.l===g?k.r:k.l,d<f.i&&d<l.i&&yd(g,f,l)<0&&b.push([a[d],a[f.i],a[l.i]])}),b},b.x=function(a){return arguments.length?(f=pb(d=a),b):d},b.y=function(a){return arguments.length?(g=pb(e=a),b):e},b.clipExtent=function(a){return arguments.length?(h=null==a?_i:a,b):h===_i?null:h},b.size=function(a){return arguments.length?b.clipExtent(a&&[[0,0],a]):h===_i?null:h&&h[1]},b)};var _i=[[-1e6,-1e6],[1e6,1e6]];Wg.geom.delaunay=function(a){return Wg.geom.voronoi().triangles(a)},Wg.geom.quadtree=function(a,b,c,d,e){function f(a){function f(a,b,c,d,e,f,g,h){if(!isNaN(c)&&!isNaN(d))if(a.leaf){var i=a.x,k=a.y;if(null!=i)if(ih(i-c)+ih(k-d)<.01)j(a,b,c,d,e,f,g,h);else{var l=a.point;a.x=a.y=a.point=null,j(a,l,i,k,e,f,g,h),j(a,b,c,d,e,f,g,h)}else a.x=c,a.y=d,a.point=b}else j(a,b,c,d,e,f,g,h)}function j(a,b,c,d,e,g,h,i){var j=.5*(e+h),k=.5*(g+i),l=c>=j,m=d>=k,n=(m<<1)+l;a.leaf=!1,a=a.nodes[n]||(a.nodes[n]=Bd()),l?e=j:h=j,m?g=k:i=k,f(a,b,c,d,e,g,h,i)}var k,l,m,n,o,p,q,r,s,t=pb(h),u=pb(i);if(null!=b)p=b,q=c,r=d,s=e;else if(r=s=-(p=q=1/0),l=[],m=[],o=a.length,g)for(n=0;o>n;++n)k=a[n],k.x<p&&(p=k.x),k.y<q&&(q=k.y),k.x>r&&(r=k.x),k.y>s&&(s=k.y),l.push(k.x),m.push(k.y);else for(n=0;o>n;++n){var v=+t(k=a[n],n),w=+u(k,n);p>v&&(p=v),q>w&&(q=w),v>r&&(r=v),w>s&&(s=w),l.push(v),m.push(w)}var x=r-p,y=s-q;x>y?s=q+x:r=p+y;var z=Bd();if(z.add=function(a){f(z,a,+t(a,++n),+u(a,n),p,q,r,s)},z.visit=function(a){Cd(a,z,p,q,r,s)},n=-1,null==b){for(;++n<o;)f(z,a[n],l[n],m[n],p,q,r,s);--n}else a.forEach(z.add);return l=m=a=k=null,z}var g,h=Tc,i=Uc;return(g=arguments.length)?(h=zd,i=Ad,3===g&&(e=c,d=b,c=b=0),f(a)):(f.x=function(a){return arguments.length?(h=a,f):h},f.y=function(a){return arguments.length?(i=a,f):i},f.extent=function(a){return arguments.length?(null==a?b=c=d=e=null:(b=+a[0][0],c=+a[0][1],d=+a[1][0],e=+a[1][1]),f):null==b?null:[[b,c],[d,e]]},f.size=function(a){return arguments.length?(null==a?b=c=d=e=null:(b=c=0,d=+a[0],e=+a[1]),f):null==b?null:[d-b,e-c]},f)},Wg.interpolateRgb=Dd,Wg.interpolateObject=Ed,Wg.interpolateNumber=Fd,Wg.interpolateString=Gd;var aj=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;Wg.interpolate=Hd,Wg.interpolators=[function(a,b){var c=typeof b;return("string"===c?Vh.has(b)||/^(#|rgb\(|hsl\()/.test(b)?Dd:Gd:b instanceof T?Dd:"object"===c?Array.isArray(b)?Id:Ed:Fd)(a,b)}],Wg.interpolateArray=Id;var bj=function(){return qb},cj=Wg.map({linear:bj,poly:Pd,quad:function(){return Md},cubic:function(){return Nd},sin:function(){return Qd},exp:function(){return Rd},circle:function(){return Sd},elastic:Td,back:Ud,bounce:function(){return Vd}}),dj=Wg.map({"in":qb,out:Kd,"in-out":Ld,"out-in":function(a){return Ld(Kd(a))}});Wg.ease=function(a){var b=a.indexOf("-"),c=b>=0?a.substring(0,b):a,d=b>=0?a.substring(b+1):"in";return c=cj.get(c)||bj,d=dj.get(d)||qb,Jd(d(c.apply(null,Xg.call(arguments,1))))},Wg.interpolateHcl=Wd,Wg.interpolateHsl=Xd,Wg.interpolateLab=Yd,Wg.interpolateRound=Zd,Wg.transform=function(a){var b=Zg.createElementNS(Wg.ns.prefix.svg,"g");return(Wg.transform=function(a){if(null!=a){b.setAttribute("transform",a);var c=b.transform.baseVal.consolidate()}return new $d(c?c.matrix:ej)})(a)},$d.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var ej={a:1,b:0,c:0,d:1,e:0,f:0};Wg.interpolateTransform=ce,Wg.layout={},Wg.layout.bundle=function(){return function(a){for(var b=[],c=-1,d=a.length;++c<d;)b.push(fe(a[c]));return b}},Wg.layout.chord=function(){function a(){var a,j,l,m,n,o={},p=[],q=Wg.range(f),r=[];for(c=[],d=[],a=0,m=-1;++m<f;){for(j=0,n=-1;++n<f;)j+=e[m][n];p.push(j),r.push(Wg.range(f)),a+=j}for(g&&q.sort(function(a,b){return g(p[a],p[b])}),h&&r.forEach(function(a,b){a.sort(function(a,c){return h(e[b][a],e[b][c])})}),a=(Bh-k*f)/a,j=0,m=-1;++m<f;){for(l=j,n=-1;++n<f;){var s=q[m],t=r[s][n],u=e[s][t],v=j,w=j+=u*a;
+o[s+"-"+t]={index:s,subindex:t,startAngle:v,endAngle:w,value:u}}d[s]={index:s,startAngle:l,endAngle:j,value:(j-l)/a},j+=k}for(m=-1;++m<f;)for(n=m-1;++n<f;){var x=o[m+"-"+n],y=o[n+"-"+m];(x.value||y.value)&&c.push(x.value<y.value?{source:y,target:x}:{source:x,target:y})}i&&b()}function b(){c.sort(function(a,b){return i((a.source.value+a.target.value)/2,(b.source.value+b.target.value)/2)})}var c,d,e,f,g,h,i,j={},k=0;return j.matrix=function(a){return arguments.length?(f=(e=a)&&e.length,c=d=null,j):e},j.padding=function(a){return arguments.length?(k=a,c=d=null,j):k},j.sortGroups=function(a){return arguments.length?(g=a,c=d=null,j):g},j.sortSubgroups=function(a){return arguments.length?(h=a,c=null,j):h},j.sortChords=function(a){return arguments.length?(i=a,c&&b(),j):i},j.chords=function(){return c||a(),c},j.groups=function(){return d||a(),d},j},Wg.layout.force=function(){function a(a){return function(b,c,d,e){if(b.point!==a){var f=b.cx-a.x,g=b.cy-a.y,h=1/Math.sqrt(f*f+g*g);if(p>(e-c)*h){var i=b.charge*h*h;return a.px-=f*i,a.py-=g*i,!0}if(b.point&&isFinite(h)){var i=b.pointCharge*h*h;a.px-=f*i,a.py-=g*i}}return!b.charge}}function b(a){a.px=Wg.event.x,a.py=Wg.event.y,h.resume()}var c,d,e,f,g,h={},i=Wg.dispatch("start","tick","end"),j=[1,1],k=.9,l=fj,m=gj,n=-30,o=.1,p=.8,q=[],r=[];return h.tick=function(){if((d*=.99)<.005)return i.end({type:"end",alpha:d=0}),!0;var b,c,h,l,m,p,s,t,u,v=q.length,w=r.length;for(c=0;w>c;++c)h=r[c],l=h.source,m=h.target,t=m.x-l.x,u=m.y-l.y,(p=t*t+u*u)&&(p=d*f[c]*((p=Math.sqrt(p))-e[c])/p,t*=p,u*=p,m.x-=t*(s=l.weight/(m.weight+l.weight)),m.y-=u*s,l.x+=t*(s=1-s),l.y+=u*s);if((s=d*o)&&(t=j[0]/2,u=j[1]/2,c=-1,s))for(;++c<v;)h=q[c],h.x+=(t-h.x)*s,h.y+=(u-h.y)*s;if(n)for(me(b=Wg.geom.quadtree(q),d,g),c=-1;++c<v;)(h=q[c]).fixed||b.visit(a(h));for(c=-1;++c<v;)h=q[c],h.fixed?(h.x=h.px,h.y=h.py):(h.x-=(h.px-(h.px=h.x))*k,h.y-=(h.py-(h.py=h.y))*k);i.tick({type:"tick",alpha:d})},h.nodes=function(a){return arguments.length?(q=a,h):q},h.links=function(a){return arguments.length?(r=a,h):r},h.size=function(a){return arguments.length?(j=a,h):j},h.linkDistance=function(a){return arguments.length?(l="function"==typeof a?a:+a,h):l},h.distance=h.linkDistance,h.linkStrength=function(a){return arguments.length?(m="function"==typeof a?a:+a,h):m},h.friction=function(a){return arguments.length?(k=+a,h):k},h.charge=function(a){return arguments.length?(n="function"==typeof a?a:+a,h):n},h.gravity=function(a){return arguments.length?(o=+a,h):o},h.theta=function(a){return arguments.length?(p=+a,h):p},h.alpha=function(a){return arguments.length?(a=+a,d?d=a>0?a:0:a>0&&(i.start({type:"start",alpha:d=a}),Wg.timer(h.tick)),h):d},h.start=function(){function a(a,d){if(!c){for(c=new Array(i),h=0;i>h;++h)c[h]=[];for(h=0;j>h;++h){var e=r[h];c[e.source.index].push(e.target),c[e.target.index].push(e.source)}}for(var f,g=c[b],h=-1,j=g.length;++h<j;)if(!isNaN(f=g[h][a]))return f;return Math.random()*d}var b,c,d,i=q.length,k=r.length,o=j[0],p=j[1];for(b=0;i>b;++b)(d=q[b]).index=b,d.weight=0;for(b=0;k>b;++b)d=r[b],"number"==typeof d.source&&(d.source=q[d.source]),"number"==typeof d.target&&(d.target=q[d.target]),++d.source.weight,++d.target.weight;for(b=0;i>b;++b)d=q[b],isNaN(d.x)&&(d.x=a("x",o)),isNaN(d.y)&&(d.y=a("y",p)),isNaN(d.px)&&(d.px=d.x),isNaN(d.py)&&(d.py=d.y);if(e=[],"function"==typeof l)for(b=0;k>b;++b)e[b]=+l.call(this,r[b],b);else for(b=0;k>b;++b)e[b]=l;if(f=[],"function"==typeof m)for(b=0;k>b;++b)f[b]=+m.call(this,r[b],b);else for(b=0;k>b;++b)f[b]=m;if(g=[],"function"==typeof n)for(b=0;i>b;++b)g[b]=+n.call(this,q[b],b);else for(b=0;i>b;++b)g[b]=n;return h.resume()},h.resume=function(){return h.alpha(.1)},h.stop=function(){return h.alpha(0)},h.drag=function(){return c||(c=Wg.behavior.drag().origin(qb).on("dragstart.force",ie).on("drag.force",b).on("dragend.force",je)),arguments.length?void this.on("mouseover.force",ke).on("mouseout.force",le).call(c):c},Wg.rebind(h,i,"on")};var fj=20,gj=1;Wg.layout.hierarchy=function(){function a(b,g,h){var i=e.call(c,b,g);if(b.depth=g,h.push(b),i&&(j=i.length)){for(var j,k,l=-1,m=b.children=new Array(j),n=0,o=g+1;++l<j;)k=m[l]=a(i[l],o,h),k.parent=b,n+=k.value;d&&m.sort(d),f&&(b.value=n)}else delete b.children,f&&(b.value=+f.call(c,b,g)||0);return b}function b(a,d){var e=a.children,g=0;if(e&&(h=e.length))for(var h,i=-1,j=d+1;++i<h;)g+=b(e[i],j);else f&&(g=+f.call(c,a,d)||0);return f&&(a.value=g),g}function c(b){var c=[];return a(b,0,c),c}var d=qe,e=oe,f=pe;return c.sort=function(a){return arguments.length?(d=a,c):d},c.children=function(a){return arguments.length?(e=a,c):e},c.value=function(a){return arguments.length?(f=a,c):f},c.revalue=function(a){return b(a,0),a},c},Wg.layout.partition=function(){function a(b,c,d,e){var f=b.children;if(b.x=c,b.y=b.depth*e,b.dx=d,b.dy=e,f&&(g=f.length)){var g,h,i,j=-1;for(d=b.value?d/b.value:0;++j<g;)a(h=f[j],c,i=h.value*d,e),c+=i}}function b(a){var c=a.children,d=0;if(c&&(e=c.length))for(var e,f=-1;++f<e;)d=Math.max(d,b(c[f]));return 1+d}function c(c,f){var g=d.call(this,c,f);return a(g[0],0,e[0],e[1]/b(g[0])),g}var d=Wg.layout.hierarchy(),e=[1,1];return c.size=function(a){return arguments.length?(e=a,c):e},ne(c,d)},Wg.layout.pie=function(){function a(f){var g=f.map(function(c,d){return+b.call(a,c,d)}),h=+("function"==typeof d?d.apply(this,arguments):d),i=(("function"==typeof e?e.apply(this,arguments):e)-h)/Wg.sum(g),j=Wg.range(f.length);null!=c&&j.sort(c===hj?function(a,b){return g[b]-g[a]}:function(a,b){return c(f[a],f[b])});var k=[];return j.forEach(function(a){var b;k[a]={data:f[a],value:b=g[a],startAngle:h,endAngle:h+=b*i}}),k}var b=Number,c=hj,d=0,e=Bh;return a.value=function(c){return arguments.length?(b=c,a):b},a.sort=function(b){return arguments.length?(c=b,a):c},a.startAngle=function(b){return arguments.length?(d=b,a):d},a.endAngle=function(b){return arguments.length?(e=b,a):e},a};var hj={};Wg.layout.stack=function(){function a(h,i){var j=h.map(function(c,d){return b.call(a,c,d)}),k=j.map(function(b){return b.map(function(b,c){return[f.call(a,b,c),g.call(a,b,c)]})}),l=c.call(a,k,i);j=Wg.permute(j,l),k=Wg.permute(k,l);var m,n,o,p=d.call(a,k,i),q=j.length,r=j[0].length;for(n=0;r>n;++n)for(e.call(a,j[0][n],o=p[n],k[0][n][1]),m=1;q>m;++m)e.call(a,j[m][n],o+=k[m-1][n][1],k[m][n][1]);return h}var b=qb,c=ve,d=we,e=ue,f=se,g=te;return a.values=function(c){return arguments.length?(b=c,a):b},a.order=function(b){return arguments.length?(c="function"==typeof b?b:ij.get(b)||ve,a):c},a.offset=function(b){return arguments.length?(d="function"==typeof b?b:jj.get(b)||we,a):d},a.x=function(b){return arguments.length?(f=b,a):f},a.y=function(b){return arguments.length?(g=b,a):g},a.out=function(b){return arguments.length?(e=b,a):e},a};var ij=Wg.map({"inside-out":function(a){var b,c,d=a.length,e=a.map(xe),f=a.map(ye),g=Wg.range(d).sort(function(a,b){return e[a]-e[b]}),h=0,i=0,j=[],k=[];for(b=0;d>b;++b)c=g[b],i>h?(h+=f[c],j.push(c)):(i+=f[c],k.push(c));return k.reverse().concat(j)},reverse:function(a){return Wg.range(a.length).reverse()},"default":ve}),jj=Wg.map({silhouette:function(a){var b,c,d,e=a.length,f=a[0].length,g=[],h=0,i=[];for(c=0;f>c;++c){for(b=0,d=0;e>b;b++)d+=a[b][c][1];d>h&&(h=d),g.push(d)}for(c=0;f>c;++c)i[c]=(h-g[c])/2;return i},wiggle:function(a){var b,c,d,e,f,g,h,i,j,k=a.length,l=a[0],m=l.length,n=[];for(n[0]=i=j=0,c=1;m>c;++c){for(b=0,e=0;k>b;++b)e+=a[b][c][1];for(b=0,f=0,h=l[c][0]-l[c-1][0];k>b;++b){for(d=0,g=(a[b][c][1]-a[b][c-1][1])/(2*h);b>d;++d)g+=(a[d][c][1]-a[d][c-1][1])/h;f+=g*a[b][c][1]}n[c]=i-=e?f/e*h:0,j>i&&(j=i)}for(c=0;m>c;++c)n[c]-=j;return n},expand:function(a){var b,c,d,e=a.length,f=a[0].length,g=1/e,h=[];for(c=0;f>c;++c){for(b=0,d=0;e>b;b++)d+=a[b][c][1];if(d)for(b=0;e>b;b++)a[b][c][1]/=d;else for(b=0;e>b;b++)a[b][c][1]=g}for(c=0;f>c;++c)h[c]=0;return h},zero:we});Wg.layout.histogram=function(){function a(a,f){for(var g,h,i=[],j=a.map(c,this),k=d.call(this,j,f),l=e.call(this,k,j,f),f=-1,m=j.length,n=l.length-1,o=b?1:1/m;++f<n;)g=i[f]=[],g.dx=l[f+1]-(g.x=l[f]),g.y=0;if(n>0)for(f=-1;++f<m;)h=j[f],h>=k[0]&&h<=k[1]&&(g=i[Wg.bisect(l,h,1,n)-1],g.y+=o,g.push(a[f]));return i}var b=!0,c=Number,d=Ce,e=Ae;return a.value=function(b){return arguments.length?(c=b,a):c},a.range=function(b){return arguments.length?(d=pb(b),a):d},a.bins=function(b){return arguments.length?(e="number"==typeof b?function(a){return Be(a,b)}:pb(b),a):e},a.frequency=function(c){return arguments.length?(b=!!c,a):b},a},Wg.layout.tree=function(){function a(a,f){function g(a,b){var d=a.children,e=a._tree;if(d&&(f=d.length)){for(var f,h,j,k=d[0],l=k,m=-1;++m<f;)j=d[m],g(j,h),l=i(j,h,l),h=j;Le(a);var n=.5*(k._tree.prelim+j._tree.prelim);b?(e.prelim=b._tree.prelim+c(a,b),e.mod=e.prelim-n):e.prelim=n}else b&&(e.prelim=b._tree.prelim+c(a,b))}function h(a,b){a.x=a._tree.prelim+b;var c=a.children;if(c&&(d=c.length)){var d,e=-1;for(b+=a._tree.mod;++e<d;)h(c[e],b)}}function i(a,b,d){if(b){for(var e,f=a,g=a,h=b,i=a.parent.children[0],j=f._tree.mod,k=g._tree.mod,l=h._tree.mod,m=i._tree.mod;h=Fe(h),f=Ee(f),h&&f;)i=Ee(i),g=Fe(g),g._tree.ancestor=a,e=h._tree.prelim+l-f._tree.prelim-j+c(h,f),e>0&&(Me(Ne(h,a,d),a,e),j+=e,k+=e),l+=h._tree.mod,j+=f._tree.mod,m+=i._tree.mod,k+=g._tree.mod;h&&!Fe(g)&&(g._tree.thread=h,g._tree.mod+=l-k),f&&!Ee(i)&&(i._tree.thread=f,i._tree.mod+=j-m,d=a)}return d}var j=b.call(this,a,f),k=j[0];Ke(k,function(a,b){a._tree={ancestor:a,prelim:0,mod:0,change:0,shift:0,number:b?b._tree.number+1:0}}),g(k),h(k,-k._tree.prelim);var l=Ge(k,Ie),m=Ge(k,He),n=Ge(k,Je),o=l.x-c(l,m)/2,p=m.x+c(m,l)/2,q=n.depth||1;return Ke(k,e?function(a){a.x*=d[0],a.y=a.depth*d[1],delete a._tree}:function(a){a.x=(a.x-o)/(p-o)*d[0],a.y=a.depth/q*d[1],delete a._tree}),j}var b=Wg.layout.hierarchy().sort(null).value(null),c=De,d=[1,1],e=!1;return a.separation=function(b){return arguments.length?(c=b,a):c},a.size=function(b){return arguments.length?(e=null==(d=b),a):e?null:d},a.nodeSize=function(b){return arguments.length?(e=null!=(d=b),a):e?d:null},ne(a,b)},Wg.layout.pack=function(){function a(a,f){var g=c.call(this,a,f),h=g[0],i=e[0],j=e[1],k=null==b?Math.sqrt:"function"==typeof b?b:function(){return b};if(h.x=h.y=0,Ke(h,function(a){a.r=+k(a.value)}),Ke(h,Se),d){var l=d*(b?1:Math.max(2*h.r/i,2*h.r/j))/2;Ke(h,function(a){a.r+=l}),Ke(h,Se),Ke(h,function(a){a.r-=l})}return Ve(h,i/2,j/2,b?1:1/Math.max(2*h.r/i,2*h.r/j)),g}var b,c=Wg.layout.hierarchy().sort(Oe),d=0,e=[1,1];return a.size=function(b){return arguments.length?(e=b,a):e},a.radius=function(c){return arguments.length?(b=null==c||"function"==typeof c?c:+c,a):b},a.padding=function(b){return arguments.length?(d=+b,a):d},ne(a,c)},Wg.layout.cluster=function(){function a(a,f){var g,h=b.call(this,a,f),i=h[0],j=0;Ke(i,function(a){var b=a.children;b&&b.length?(a.x=Ye(b),a.y=Xe(b)):(a.x=g?j+=c(a,g):0,a.y=0,g=a)});var k=Ze(i),l=$e(i),m=k.x-c(k,l)/2,n=l.x+c(l,k)/2;return Ke(i,e?function(a){a.x=(a.x-i.x)*d[0],a.y=(i.y-a.y)*d[1]}:function(a){a.x=(a.x-m)/(n-m)*d[0],a.y=(1-(i.y?a.y/i.y:1))*d[1]}),h}var b=Wg.layout.hierarchy().sort(null).value(null),c=De,d=[1,1],e=!1;return a.separation=function(b){return arguments.length?(c=b,a):c},a.size=function(b){return arguments.length?(e=null==(d=b),a):e?null:d},a.nodeSize=function(b){return arguments.length?(e=null!=(d=b),a):e?d:null},ne(a,b)},Wg.layout.treemap=function(){function a(a,b){for(var c,d,e=-1,f=a.length;++e<f;)d=(c=a[e]).value*(0>b?0:b),c.area=isNaN(d)||0>=d?0:d}function b(c){var f=c.children;if(f&&f.length){var g,h,i,j=l(c),k=[],m=f.slice(),o=1/0,p="slice"===n?j.dx:"dice"===n?j.dy:"slice-dice"===n?1&c.depth?j.dy:j.dx:Math.min(j.dx,j.dy);for(a(m,j.dx*j.dy/c.value),k.area=0;(i=m.length)>0;)k.push(g=m[i-1]),k.area+=g.area,"squarify"!==n||(h=d(k,p))<=o?(m.pop(),o=h):(k.area-=k.pop().area,e(k,p,j,!1),p=Math.min(j.dx,j.dy),k.length=k.area=0,o=1/0);k.length&&(e(k,p,j,!0),k.length=k.area=0),f.forEach(b)}}function c(b){var d=b.children;if(d&&d.length){var f,g=l(b),h=d.slice(),i=[];for(a(h,g.dx*g.dy/b.value),i.area=0;f=h.pop();)i.push(f),i.area+=f.area,null!=f.z&&(e(i,f.z?g.dx:g.dy,g,!h.length),i.length=i.area=0);d.forEach(c)}}function d(a,b){for(var c,d=a.area,e=0,f=1/0,g=-1,h=a.length;++g<h;)(c=a[g].area)&&(f>c&&(f=c),c>e&&(e=c));return d*=d,b*=b,d?Math.max(b*e*o/d,d/(b*f*o)):1/0}function e(a,b,c,d){var e,f=-1,g=a.length,h=c.x,j=c.y,k=b?i(a.area/b):0;if(b==c.dx){for((d||k>c.dy)&&(k=c.dy);++f<g;)e=a[f],e.x=h,e.y=j,e.dy=k,h+=e.dx=Math.min(c.x+c.dx-h,k?i(e.area/k):0);e.z=!0,e.dx+=c.x+c.dx-h,c.y+=k,c.dy-=k}else{for((d||k>c.dx)&&(k=c.dx);++f<g;)e=a[f],e.x=h,e.y=j,e.dx=k,j+=e.dy=Math.min(c.y+c.dy-j,k?i(e.area/k):0);e.z=!1,e.dy+=c.y+c.dy-j,c.x+=k,c.dx-=k}}function f(d){var e=g||h(d),f=e[0];return f.x=0,f.y=0,f.dx=j[0],f.dy=j[1],g&&h.revalue(f),a([f],f.dx*f.dy/f.value),(g?c:b)(f),m&&(g=e),e}var g,h=Wg.layout.hierarchy(),i=Math.round,j=[1,1],k=null,l=_e,m=!1,n="squarify",o=.5*(1+Math.sqrt(5));return f.size=function(a){return arguments.length?(j=a,f):j},f.padding=function(a){function b(b){var c=a.call(f,b,b.depth);return null==c?_e(b):af(b,"number"==typeof c?[c,c,c,c]:c)}function c(b){return af(b,a)}if(!arguments.length)return k;var d;return l=null==(k=a)?_e:"function"==(d=typeof a)?b:"number"===d?(a=[a,a,a,a],c):c,f},f.round=function(a){return arguments.length?(i=a?Math.round:Number,f):i!=Number},f.sticky=function(a){return arguments.length?(m=a,g=null,f):m},f.ratio=function(a){return arguments.length?(o=a,f):o},f.mode=function(a){return arguments.length?(n=a+"",f):n},ne(f,h)},Wg.random={normal:function(a,b){var c=arguments.length;return 2>c&&(b=1),1>c&&(a=0),function(){var c,d,e;do c=2*Math.random()-1,d=2*Math.random()-1,e=c*c+d*d;while(!e||e>1);return a+b*c*Math.sqrt(-2*Math.log(e)/e)}},logNormal:function(){var a=Wg.random.normal.apply(Wg,arguments);return function(){return Math.exp(a())}},bates:function(a){var b=Wg.random.irwinHall(a);return function(){return b()/a}},irwinHall:function(a){return function(){for(var b=0,c=0;a>c;c++)b+=Math.random();return b}}},Wg.scale={};var kj={floor:qb,ceil:qb};Wg.scale.linear=function(){return hf([0,1],[0,1],Hd,!1)};var lj={s:1,g:1,p:1,r:1,e:1};Wg.scale.log=function(){return qf(Wg.scale.linear().domain([0,1]),10,!0,[1,10])};var mj=Wg.format(".0e"),nj={floor:function(a){return-Math.ceil(-a)},ceil:function(a){return-Math.floor(-a)}};Wg.scale.pow=function(){return rf(Wg.scale.linear(),1,[0,1])},Wg.scale.sqrt=function(){return Wg.scale.pow().exponent(.5)},Wg.scale.ordinal=function(){return tf([],{t:"range",a:[[]]})},Wg.scale.category10=function(){return Wg.scale.ordinal().range(oj)},Wg.scale.category20=function(){return Wg.scale.ordinal().range(pj)},Wg.scale.category20b=function(){return Wg.scale.ordinal().range(qj)},Wg.scale.category20c=function(){return Wg.scale.ordinal().range(rj)};var oj=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(gb),pj=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(gb),qj=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(gb),rj=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(gb);Wg.scale.quantile=function(){return uf([],[])},Wg.scale.quantize=function(){return vf(0,1,[0,1])},Wg.scale.threshold=function(){return wf([.5],[0,1])},Wg.scale.identity=function(){return xf([0,1])},Wg.svg={},Wg.svg.arc=function(){function a(){var a=b.apply(this,arguments),f=c.apply(this,arguments),g=d.apply(this,arguments)+sj,h=e.apply(this,arguments)+sj,i=(g>h&&(i=g,g=h,h=i),h-g),j=Ah>i?"0":"1",k=Math.cos(g),l=Math.sin(g),m=Math.cos(h),n=Math.sin(h);return i>=tj?a?"M0,"+f+"A"+f+","+f+" 0 1,1 0,"+-f+"A"+f+","+f+" 0 1,1 0,"+f+"M0,"+a+"A"+a+","+a+" 0 1,0 0,"+-a+"A"+a+","+a+" 0 1,0 0,"+a+"Z":"M0,"+f+"A"+f+","+f+" 0 1,1 0,"+-f+"A"+f+","+f+" 0 1,1 0,"+f+"Z":a?"M"+f*k+","+f*l+"A"+f+","+f+" 0 "+j+",1 "+f*m+","+f*n+"L"+a*m+","+a*n+"A"+a+","+a+" 0 "+j+",0 "+a*k+","+a*l+"Z":"M"+f*k+","+f*l+"A"+f+","+f+" 0 "+j+",1 "+f*m+","+f*n+"L0,0Z"}var b=yf,c=zf,d=Af,e=Bf;return a.innerRadius=function(c){return arguments.length?(b=pb(c),a):b},a.outerRadius=function(b){return arguments.length?(c=pb(b),a):c},a.startAngle=function(b){return arguments.length?(d=pb(b),a):d},a.endAngle=function(b){return arguments.length?(e=pb(b),a):e},a.centroid=function(){var a=(b.apply(this,arguments)+c.apply(this,arguments))/2,f=(d.apply(this,arguments)+e.apply(this,arguments))/2+sj;return[Math.cos(f)*a,Math.sin(f)*a]},a};var sj=-Ch,tj=Bh-Dh;Wg.svg.line=function(){return Cf(qb)};var uj=Wg.map({linear:Df,"linear-closed":Ef,step:Ff,"step-before":Gf,"step-after":Hf,basis:Nf,"basis-open":Of,"basis-closed":Pf,bundle:Qf,cardinal:Kf,"cardinal-open":If,"cardinal-closed":Jf,monotone:Wf});uj.forEach(function(a,b){b.key=a,b.closed=/-closed$/.test(a)});var vj=[0,2/3,1/3,0],wj=[0,1/3,2/3,0],xj=[0,1/6,2/3,1/6];Wg.svg.line.radial=function(){var a=Cf(Xf);return a.radius=a.x,delete a.x,a.angle=a.y,delete a.y,a},Gf.reverse=Hf,Hf.reverse=Gf,Wg.svg.area=function(){return Yf(qb)},Wg.svg.area.radial=function(){var a=Yf(Xf);return a.radius=a.x,delete a.x,a.innerRadius=a.x0,delete a.x0,a.outerRadius=a.x1,delete a.x1,a.angle=a.y,delete a.y,a.startAngle=a.y0,delete a.y0,a.endAngle=a.y1,delete a.y1,a},Wg.svg.chord=function(){function a(a,h){var i=b(this,f,a,h),j=b(this,g,a,h);return"M"+i.p0+d(i.r,i.p1,i.a1-i.a0)+(c(i,j)?e(i.r,i.p1,i.r,i.p0):e(i.r,i.p1,j.r,j.p0)+d(j.r,j.p1,j.a1-j.a0)+e(j.r,j.p1,i.r,i.p0))+"Z"}function b(a,b,c,d){var e=b.call(a,c,d),f=h.call(a,e,d),g=i.call(a,e,d)+sj,k=j.call(a,e,d)+sj;return{r:f,a0:g,a1:k,p0:[f*Math.cos(g),f*Math.sin(g)],p1:[f*Math.cos(k),f*Math.sin(k)]}}function c(a,b){return a.a0==b.a0&&a.a1==b.a1}function d(a,b,c){return"A"+a+","+a+" 0 "+ +(c>Ah)+",1 "+b}function e(a,b,c,d){return"Q 0,0 "+d}var f=Jc,g=Kc,h=Zf,i=Af,j=Bf;return a.radius=function(b){return arguments.length?(h=pb(b),a):h},a.source=function(b){return arguments.length?(f=pb(b),a):f},a.target=function(b){return arguments.length?(g=pb(b),a):g},a.startAngle=function(b){return arguments.length?(i=pb(b),a):i},a.endAngle=function(b){return arguments.length?(j=pb(b),a):j},a},Wg.svg.diagonal=function(){function a(a,e){var f=b.call(this,a,e),g=c.call(this,a,e),h=(f.y+g.y)/2,i=[f,{x:f.x,y:h},{x:g.x,y:h},g];return i=i.map(d),"M"+i[0]+"C"+i[1]+" "+i[2]+" "+i[3]}var b=Jc,c=Kc,d=$f;return a.source=function(c){return arguments.length?(b=pb(c),a):b},a.target=function(b){return arguments.length?(c=pb(b),a):c},a.projection=function(b){return arguments.length?(d=b,a):d},a},Wg.svg.diagonal.radial=function(){var a=Wg.svg.diagonal(),b=$f,c=a.projection;return a.projection=function(a){return arguments.length?c(_f(b=a)):b},a},Wg.svg.symbol=function(){function a(a,d){return(yj.get(b.call(this,a,d))||cg)(c.call(this,a,d))}var b=bg,c=ag;return a.type=function(c){return arguments.length?(b=pb(c),a):b},a.size=function(b){return arguments.length?(c=pb(b),a):c},a};var yj=Wg.map({circle:cg,cross:function(a){var b=Math.sqrt(a/5)/2;return"M"+-3*b+","+-b+"H"+-b+"V"+-3*b+"H"+b+"V"+-b+"H"+3*b+"V"+b+"H"+b+"V"+3*b+"H"+-b+"V"+b+"H"+-3*b+"Z"},diamond:function(a){var b=Math.sqrt(a/(2*Cj)),c=b*Cj;return"M0,"+-b+"L"+c+",0 0,"+b+" "+-c+",0Z"},square:function(a){var b=Math.sqrt(a)/2;return"M"+-b+","+-b+"L"+b+","+-b+" "+b+","+b+" "+-b+","+b+"Z"},"triangle-down":function(a){var b=Math.sqrt(a/Bj),c=b*Bj/2;return"M0,"+c+"L"+b+","+-c+" "+-b+","+-c+"Z"},"triangle-up":function(a){var b=Math.sqrt(a/Bj),c=b*Bj/2;return"M0,"+-c+"L"+b+","+c+" "+-b+","+c+"Z"}});Wg.svg.symbolTypes=yj.keys();var zj,Aj,Bj=Math.sqrt(3),Cj=Math.tan(30*Fh),Dj=[],Ej=0;Dj.call=sh.call,Dj.empty=sh.empty,Dj.node=sh.node,Dj.size=sh.size,Wg.transition=function(a){return arguments.length?zj?a.transition():a:vh.transition()},Wg.transition.prototype=Dj,Dj.select=function(a){var b,c,d,e=this.id,f=[];a=p(a);for(var g=-1,h=this.length;++g<h;){f.push(b=[]);for(var i=this[g],j=-1,k=i.length;++j<k;)(d=i[j])&&(c=a.call(d,d.__data__,j,g))?("__data__"in d&&(c.__data__=d.__data__),gg(c,j,e,d.__transition__[e]),b.push(c)):b.push(null)}return dg(f,e)},Dj.selectAll=function(a){var b,c,d,e,f,g=this.id,h=[];a=q(a);for(var i=-1,j=this.length;++i<j;)for(var k=this[i],l=-1,m=k.length;++l<m;)if(d=k[l]){f=d.__transition__[g],c=a.call(d,d.__data__,l,i),h.push(b=[]);for(var n=-1,o=c.length;++n<o;)(e=c[n])&&gg(e,n,g,f),b.push(e)}return dg(h,g)},Dj.filter=function(a){var b,c,d,e=[];"function"!=typeof a&&(a=B(a));for(var f=0,g=this.length;g>f;f++){e.push(b=[]);for(var c=this[f],h=0,i=c.length;i>h;h++)(d=c[h])&&a.call(d,d.__data__,h,f)&&b.push(d)}return dg(e,this.id)},Dj.tween=function(a,b){var c=this.id;return arguments.length<2?this.node().__transition__[c].tween.get(a):D(this,null==b?function(b){b.__transition__[c].tween.remove(a)}:function(d){d.__transition__[c].tween.set(a,b)})},Dj.attr=function(a,b){function c(){this.removeAttribute(h)}function d(){this.removeAttributeNS(h.space,h.local)}function e(a){return null==a?c:(a+="",function(){var b,c=this.getAttribute(h);return c!==a&&(b=g(c,a),function(a){this.setAttribute(h,b(a))})})}function f(a){return null==a?d:(a+="",function(){var b,c=this.getAttributeNS(h.space,h.local);return c!==a&&(b=g(c,a),function(a){this.setAttributeNS(h.space,h.local,b(a))})})}if(arguments.length<2){for(b in a)this.attr(b,a[b]);return this}var g="transform"==a?ce:Hd,h=Wg.ns.qualify(a);return eg(this,"attr."+a,b,h.local?f:e)},Dj.attrTween=function(a,b){function c(a,c){var d=b.call(this,a,c,this.getAttribute(e));return d&&function(a){this.setAttribute(e,d(a))}}function d(a,c){var d=b.call(this,a,c,this.getAttributeNS(e.space,e.local));return d&&function(a){this.setAttributeNS(e.space,e.local,d(a))}}var e=Wg.ns.qualify(a);return this.tween("attr."+a,e.local?d:c)},Dj.style=function(a,b,c){function d(){this.style.removeProperty(a)}function e(b){return null==b?d:(b+="",function(){var d,e=_g.getComputedStyle(this,null).getPropertyValue(a);return e!==b&&(d=Hd(e,b),function(b){this.style.setProperty(a,d(b),c)})})}var f=arguments.length;if(3>f){if("string"!=typeof a){2>f&&(b="");for(c in a)this.style(c,a[c],b);return this}c=""}return eg(this,"style."+a,b,e)},Dj.styleTween=function(a,b,c){function d(d,e){var f=b.call(this,d,e,_g.getComputedStyle(this,null).getPropertyValue(a));return f&&function(b){this.style.setProperty(a,f(b),c)}}return arguments.length<3&&(c=""),this.tween("style."+a,d)},Dj.text=function(a){return eg(this,"text",a,fg)},Dj.remove=function(){return this.each("end.transition",function(){var a;this.__transition__.count<2&&(a=this.parentNode)&&a.removeChild(this)})},Dj.ease=function(a){var b=this.id;return arguments.length<1?this.node().__transition__[b].ease:("function"!=typeof a&&(a=Wg.ease.apply(Wg,arguments)),D(this,function(c){c.__transition__[b].ease=a}))},Dj.delay=function(a){var b=this.id;return D(this,"function"==typeof a?function(c,d,e){c.__transition__[b].delay=+a.call(c,c.__data__,d,e)}:(a=+a,function(c){c.__transition__[b].delay=a}))},Dj.duration=function(a){var b=this.id;return D(this,"function"==typeof a?function(c,d,e){c.__transition__[b].duration=Math.max(1,a.call(c,c.__data__,d,e))}:(a=Math.max(1,a),function(c){c.__transition__[b].duration=a}))},Dj.each=function(a,b){var c=this.id;if(arguments.length<2){var d=Aj,e=zj;zj=c,D(this,function(b,d,e){Aj=b.__transition__[c],a.call(b,b.__data__,d,e)}),Aj=d,zj=e}else D(this,function(d){var e=d.__transition__[c];(e.event||(e.event=Wg.dispatch("start","end"))).on(a,b)});return this},Dj.transition=function(){for(var a,b,c,d,e=this.id,f=++Ej,g=[],h=0,i=this.length;i>h;h++){g.push(a=[]);for(var b=this[h],j=0,k=b.length;k>j;j++)(c=b[j])&&(d=Object.create(c.__transition__[e]),d.delay+=d.duration,gg(c,j,f,d)),a.push(c)}return dg(g,f)},Wg.svg.axis=function(){function a(a){a.each(function(){var a,j=Wg.select(this),k=this.__chart__||c,l=this.__chart__=c.copy(),m=null==i?l.ticks?l.ticks.apply(l,h):l.domain():i,n=null==b?l.tickFormat?l.tickFormat.apply(l,h):qb:b,o=j.selectAll(".tick").data(m,l),p=o.enter().insert("g",".domain").attr("class","tick").style("opacity",Dh),q=Wg.transition(o.exit()).style("opacity",Dh).remove(),r=Wg.transition(o).style("opacity",1),s=cf(l),t=j.selectAll(".domain").data([0]),u=(t.enter().append("path").attr("class","domain"),Wg.transition(t));p.append("line"),p.append("text");var v=p.select("line"),w=r.select("line"),x=o.select("text").text(n),y=p.select("text"),z=r.select("text");switch(d){case"bottom":a=hg,v.attr("y2",e),y.attr("y",Math.max(e,0)+g),w.attr("x2",0).attr("y2",e),z.attr("x",0).attr("y",Math.max(e,0)+g),x.attr("dy",".71em").style("text-anchor","middle"),u.attr("d","M"+s[0]+","+f+"V0H"+s[1]+"V"+f);break;case"top":a=hg,v.attr("y2",-e),y.attr("y",-(Math.max(e,0)+g)),w.attr("x2",0).attr("y2",-e),z.attr("x",0).attr("y",-(Math.max(e,0)+g)),x.attr("dy","0em").style("text-anchor","middle"),u.attr("d","M"+s[0]+","+-f+"V0H"+s[1]+"V"+-f);break;case"left":a=ig,v.attr("x2",-e),y.attr("x",-(Math.max(e,0)+g)),w.attr("x2",-e).attr("y2",0),z.attr("x",-(Math.max(e,0)+g)).attr("y",0),x.attr("dy",".32em").style("text-anchor","end"),u.attr("d","M"+-f+","+s[0]+"H0V"+s[1]+"H"+-f);break;case"right":a=ig,v.attr("x2",e),y.attr("x",Math.max(e,0)+g),w.attr("x2",e).attr("y2",0),z.attr("x",Math.max(e,0)+g).attr("y",0),x.attr("dy",".32em").style("text-anchor","start"),u.attr("d","M"+f+","+s[0]+"H0V"+s[1]+"H"+f)}if(l.rangeBand){var A=l,B=A.rangeBand()/2;k=l=function(a){return A(a)+B}}else k.rangeBand?k=l:q.call(a,l);p.call(a,k),r.call(a,l)})}var b,c=Wg.scale.linear(),d=Fj,e=6,f=6,g=3,h=[10],i=null;return a.scale=function(b){return arguments.length?(c=b,a):c},a.orient=function(b){return arguments.length?(d=b in Gj?b+"":Fj,a):d},a.ticks=function(){return arguments.length?(h=arguments,a):h},a.tickValues=function(b){return arguments.length?(i=b,a):i},a.tickFormat=function(c){return arguments.length?(b=c,a):b},a.tickSize=function(b){var c=arguments.length;return c?(e=+b,f=+arguments[c-1],a):e},a.innerTickSize=function(b){return arguments.length?(e=+b,a):e},a.outerTickSize=function(b){return arguments.length?(f=+b,a):f},a.tickPadding=function(b){return arguments.length?(g=+b,a):g},a.tickSubdivide=function(){return arguments.length&&a},a};var Fj="bottom",Gj={top:1,right:1,bottom:1,left:1};Wg.svg.brush=function(){function a(f){f.each(function(){var f=Wg.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",e).on("touchstart.brush",e),g=f.selectAll(".background").data([0]);g.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),f.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var h=f.selectAll(".resize").data(q,qb);h.exit().remove(),h.enter().append("g").attr("class",function(a){return"resize "+a}).style("cursor",function(a){return Hj[a]}).append("rect").attr("x",function(a){return/[ew]$/.test(a)?-3:null}).attr("y",function(a){return/^[ns]/.test(a)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),h.style("display",a.empty()?"none":null);var k,l=Wg.transition(f),m=Wg.transition(g);i&&(k=cf(i),m.attr("x",k[0]).attr("width",k[1]-k[0]),c(l)),j&&(k=cf(j),m.attr("y",k[0]).attr("height",k[1]-k[0]),d(l)),b(l)})}function b(a){a.selectAll(".resize").attr("transform",function(a){return"translate("+k[+/e$/.test(a)]+","+m[+/^s/.test(a)]+")"})}function c(a){a.select(".extent").attr("x",k[0]),a.selectAll(".extent,.n>rect,.s>rect").attr("width",k[1]-k[0])}function d(a){a.select(".extent").attr("y",m[0]),a.selectAll(".extent,.e>rect,.w>rect").attr("height",m[1]-m[0])}function e(){function e(){32==Wg.event.keyCode&&(C||(t=null,E[0]-=k[1],E[1]-=m[1],C=2),l())}function n(){32==Wg.event.keyCode&&2==C&&(E[0]+=k[1],E[1]+=m[1],C=0,l())}function q(){var a=Wg.mouse(v),e=!1;u&&(a[0]+=u[0],a[1]+=u[1]),C||(Wg.event.altKey?(t||(t=[(k[0]+k[1])/2,(m[0]+m[1])/2]),E[0]=k[+(a[0]<t[0])],E[1]=m[+(a[1]<t[1])]):t=null),A&&r(a,i,0)&&(c(y),e=!0),B&&r(a,j,1)&&(d(y),e=!0),e&&(b(y),x({type:"brush",mode:C?"move":"resize"}))}function r(a,b,c){var d,e,h=cf(b),i=h[0],j=h[1],l=E[c],n=c?m:k,q=n[1]-n[0];return C&&(i-=l,j-=q+l),d=(c?p:o)?Math.max(i,Math.min(j,a[c])):a[c],C?e=(d+=l)+q:(t&&(l=Math.max(i,Math.min(j,2*t[c]-d))),d>l?(e=d,d=l):e=l),n[0]!=d||n[1]!=e?(c?g=null:f=null,n[0]=d,n[1]=e,!0):void 0}function s(){q(),y.style("pointer-events","all").selectAll(".resize").style("display",a.empty()?"none":null),Wg.select("body").style("cursor",null),F.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),D(),x({type:"brushend"})}var t,u,v=this,w=Wg.select(Wg.event.target),x=h.of(v,arguments),y=Wg.select(v),z=w.datum(),A=!/^(n|s)$/.test(z)&&i,B=!/^(e|w)$/.test(z)&&j,C=w.classed("extent"),D=K(),E=Wg.mouse(v),F=Wg.select(_g).on("keydown.brush",e).on("keyup.brush",n);if(Wg.event.changedTouches?F.on("touchmove.brush",q).on("touchend.brush",s):F.on("mousemove.brush",q).on("mouseup.brush",s),y.interrupt().selectAll("*").interrupt(),C)E[0]=k[0]-E[0],E[1]=m[0]-E[1];else if(z){var G=+/w$/.test(z),H=+/^n/.test(z);u=[k[1-G]-E[0],m[1-H]-E[1]],E[0]=k[G],E[1]=m[H]}else Wg.event.altKey&&(t=E.slice());y.style("pointer-events","none").selectAll(".resize").style("display",null),Wg.select("body").style("cursor",w.style("cursor")),x({type:"brushstart"}),q()}var f,g,h=n(a,"brushstart","brush","brushend"),i=null,j=null,k=[0,0],m=[0,0],o=!0,p=!0,q=Ij[0];return a.event=function(a){a.each(function(){var a=h.of(this,arguments),b={x:k,y:m,i:f,j:g},c=this.__chart__||b;this.__chart__=b,zj?Wg.select(this).transition().each("start.brush",function(){f=c.i,g=c.j,k=c.x,m=c.y,a({type:"brushstart"})}).tween("brush:brush",function(){var c=Id(k,b.x),d=Id(m,b.y);return f=g=null,function(e){k=b.x=c(e),m=b.y=d(e),a({type:"brush",mode:"resize"})}}).each("end.brush",function(){f=b.i,g=b.j,a({type:"brush",mode:"resize"}),a({type:"brushend"})}):(a({type:"brushstart"}),a({type:"brush",mode:"resize"}),a({type:"brushend"}))})},a.x=function(b){return arguments.length?(i=b,q=Ij[!i<<1|!j],a):i},a.y=function(b){return arguments.length?(j=b,q=Ij[!i<<1|!j],a):j},a.clamp=function(b){return arguments.length?(i&&j?(o=!!b[0],p=!!b[1]):i?o=!!b:j&&(p=!!b),a):i&&j?[o,p]:i?o:j?p:null},a.extent=function(b){var c,d,e,h,l;return arguments.length?(i&&(c=b[0],d=b[1],j&&(c=c[0],d=d[0]),f=[c,d],i.invert&&(c=i(c),d=i(d)),c>d&&(l=c,c=d,d=l),(c!=k[0]||d!=k[1])&&(k=[c,d])),j&&(e=b[0],h=b[1],i&&(e=e[1],h=h[1]),g=[e,h],j.invert&&(e=j(e),h=j(h)),e>h&&(l=e,e=h,h=l),(e!=m[0]||h!=m[1])&&(m=[e,h])),a):(i&&(f?(c=f[0],d=f[1]):(c=k[0],d=k[1],i.invert&&(c=i.invert(c),d=i.invert(d)),c>d&&(l=c,c=d,d=l))),j&&(g?(e=g[0],h=g[1]):(e=m[0],h=m[1],j.invert&&(e=j.invert(e),h=j.invert(h)),e>h&&(l=e,e=h,h=l))),i&&j?[[c,e],[d,h]]:i?[c,d]:j&&[e,h])},a.clear=function(){return a.empty()||(k=[0,0],m=[0,0],f=g=null),a},a.empty=function(){return!!i&&k[0]==k[1]||!!j&&m[0]==m[1]},Wg.rebind(a,h,"on")};var Hj={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Ij=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Jj=Wg.time={},Kj=Date,Lj=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];jg.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){Mj.setUTCDate.apply(this._,arguments)},setDay:function(){Mj.setUTCDay.apply(this._,arguments)
+},setFullYear:function(){Mj.setUTCFullYear.apply(this._,arguments)},setHours:function(){Mj.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){Mj.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){Mj.setUTCMinutes.apply(this._,arguments)},setMonth:function(){Mj.setUTCMonth.apply(this._,arguments)},setSeconds:function(){Mj.setUTCSeconds.apply(this._,arguments)},setTime:function(){Mj.setTime.apply(this._,arguments)}};var Mj=Date.prototype,Nj="%a %b %e %X %Y",Oj="%m/%d/%Y",Pj="%H:%M:%S",Qj=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],Rj=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],Sj=["January","February","March","April","May","June","July","August","September","October","November","December"],Tj=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];Jj.year=kg(function(a){return a=Jj.day(a),a.setMonth(0,1),a},function(a,b){a.setFullYear(a.getFullYear()+b)},function(a){return a.getFullYear()}),Jj.years=Jj.year.range,Jj.years.utc=Jj.year.utc.range,Jj.day=kg(function(a){var b=new Kj(2e3,0);return b.setFullYear(a.getFullYear(),a.getMonth(),a.getDate()),b},function(a,b){a.setDate(a.getDate()+b)},function(a){return a.getDate()-1}),Jj.days=Jj.day.range,Jj.days.utc=Jj.day.utc.range,Jj.dayOfYear=function(a){var b=Jj.year(a);return Math.floor((a-b-6e4*(a.getTimezoneOffset()-b.getTimezoneOffset()))/864e5)},Lj.forEach(function(a,b){a=a.toLowerCase(),b=7-b;var c=Jj[a]=kg(function(a){return(a=Jj.day(a)).setDate(a.getDate()-(a.getDay()+b)%7),a},function(a,b){a.setDate(a.getDate()+7*Math.floor(b))},function(a){var c=Jj.year(a).getDay();return Math.floor((Jj.dayOfYear(a)+(c+b)%7)/7)-(c!==b)});Jj[a+"s"]=c.range,Jj[a+"s"].utc=c.utc.range,Jj[a+"OfYear"]=function(a){var c=Jj.year(a).getDay();return Math.floor((Jj.dayOfYear(a)+(c+b)%7)/7)}}),Jj.week=Jj.sunday,Jj.weeks=Jj.sunday.range,Jj.weeks.utc=Jj.sunday.utc.range,Jj.weekOfYear=Jj.sundayOfYear,Jj.format=mg;var Uj=og(Qj),Vj=pg(Qj),Wj=og(Rj),Xj=pg(Rj),Yj=og(Sj),Zj=pg(Sj),$j=og(Tj),_j=pg(Tj),ak=/^%/,bk={"-":"",_:" ",0:"0"},ck={a:function(a){return Rj[a.getDay()]},A:function(a){return Qj[a.getDay()]},b:function(a){return Tj[a.getMonth()]},B:function(a){return Sj[a.getMonth()]},c:mg(Nj),d:function(a,b){return qg(a.getDate(),b,2)},e:function(a,b){return qg(a.getDate(),b,2)},H:function(a,b){return qg(a.getHours(),b,2)},I:function(a,b){return qg(a.getHours()%12||12,b,2)},j:function(a,b){return qg(1+Jj.dayOfYear(a),b,3)},L:function(a,b){return qg(a.getMilliseconds(),b,3)},m:function(a,b){return qg(a.getMonth()+1,b,2)},M:function(a,b){return qg(a.getMinutes(),b,2)},p:function(a){return a.getHours()>=12?"PM":"AM"},S:function(a,b){return qg(a.getSeconds(),b,2)},U:function(a,b){return qg(Jj.sundayOfYear(a),b,2)},w:function(a){return a.getDay()},W:function(a,b){return qg(Jj.mondayOfYear(a),b,2)},x:mg(Oj),X:mg(Pj),y:function(a,b){return qg(a.getFullYear()%100,b,2)},Y:function(a,b){return qg(a.getFullYear()%1e4,b,4)},Z:Ng,"%":function(){return"%"}},dk={a:rg,A:sg,b:wg,B:xg,c:yg,d:Gg,e:Gg,H:Ig,I:Ig,j:Hg,L:Lg,m:Fg,M:Jg,p:Mg,S:Kg,U:ug,w:tg,W:vg,x:zg,X:Ag,y:Cg,Y:Bg,Z:Dg,"%":Og},ek=/^\s*\d+/,fk=Wg.map({am:0,pm:1});mg.utc=Pg;var gk=Pg("%Y-%m-%dT%H:%M:%S.%LZ");mg.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?Qg:gk,Qg.parse=function(a){var b=new Date(a);return isNaN(b)?null:b},Qg.toString=gk.toString,Jj.second=kg(function(a){return new Kj(1e3*Math.floor(a/1e3))},function(a,b){a.setTime(a.getTime()+1e3*Math.floor(b))},function(a){return a.getSeconds()}),Jj.seconds=Jj.second.range,Jj.seconds.utc=Jj.second.utc.range,Jj.minute=kg(function(a){return new Kj(6e4*Math.floor(a/6e4))},function(a,b){a.setTime(a.getTime()+6e4*Math.floor(b))},function(a){return a.getMinutes()}),Jj.minutes=Jj.minute.range,Jj.minutes.utc=Jj.minute.utc.range,Jj.hour=kg(function(a){var b=a.getTimezoneOffset()/60;return new Kj(36e5*(Math.floor(a/36e5-b)+b))},function(a,b){a.setTime(a.getTime()+36e5*Math.floor(b))},function(a){return a.getHours()}),Jj.hours=Jj.hour.range,Jj.hours.utc=Jj.hour.utc.range,Jj.month=kg(function(a){return a=Jj.day(a),a.setDate(1),a},function(a,b){a.setMonth(a.getMonth()+b)},function(a){return a.getMonth()}),Jj.months=Jj.month.range,Jj.months.utc=Jj.month.utc.range;var hk=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],ik=[[Jj.second,1],[Jj.second,5],[Jj.second,15],[Jj.second,30],[Jj.minute,1],[Jj.minute,5],[Jj.minute,15],[Jj.minute,30],[Jj.hour,1],[Jj.hour,3],[Jj.hour,6],[Jj.hour,12],[Jj.day,1],[Jj.day,2],[Jj.week,1],[Jj.month,1],[Jj.month,3],[Jj.year,1]],jk=[[mg("%Y"),Tb],[mg("%B"),function(a){return a.getMonth()}],[mg("%b %d"),function(a){return 1!=a.getDate()}],[mg("%a %d"),function(a){return a.getDay()&&1!=a.getDate()}],[mg("%I %p"),function(a){return a.getHours()}],[mg("%I:%M"),function(a){return a.getMinutes()}],[mg(":%S"),function(a){return a.getSeconds()}],[mg(".%L"),function(a){return a.getMilliseconds()}]],kk=Tg(jk);ik.year=Jj.year,Jj.scale=function(){return Rg(Wg.scale.linear(),ik,kk)};var lk={range:function(a,b,c){return Wg.range(+a,+b,c).map(Sg)},floor:qb,ceil:qb},mk=ik.map(function(a){return[a[0].utc,a[1]]}),nk=[[Pg("%Y"),Tb],[Pg("%B"),function(a){return a.getUTCMonth()}],[Pg("%b %d"),function(a){return 1!=a.getUTCDate()}],[Pg("%a %d"),function(a){return a.getUTCDay()&&1!=a.getUTCDate()}],[Pg("%I %p"),function(a){return a.getUTCHours()}],[Pg("%I:%M"),function(a){return a.getUTCMinutes()}],[Pg(":%S"),function(a){return a.getUTCSeconds()}],[Pg(".%L"),function(a){return a.getUTCMilliseconds()}]],ok=Tg(nk);return mk.year=Jj.year.utc,Jj.scale.utc=function(){return Rg(Wg.scale.linear(),mk,ok)},Wg.text=rb(function(a){return a.responseText}),Wg.json=function(a,b){return sb(a,"application/json",Ug,b)},Wg.html=function(a,b){return sb(a,"text/html",Vg,b)},Wg.xml=rb(function(a){return a.responseXML}),Wg}(),function(a,b){"object"==typeof exports?module.exports=b(require("./punycode"),require("./IPv6"),require("./SecondLevelDomains")):"function"==typeof define&&define.amd?define(["./punycode","./IPv6","./SecondLevelDomains"],b):a.URI=b(a.punycode,a.IPv6,a.SecondLevelDomains,a)}(this,function(a,b,c,d){"use strict";function e(a,b){return this instanceof e?(void 0===a&&(a="undefined"!=typeof location?location.href+"":""),this.href(a),void 0!==b?this.absoluteTo(b):this):new e(a,b)}function f(a){return a.replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1")}function g(a){return void 0===a?"Undefined":String(Object.prototype.toString.call(a)).slice(8,-1)}function h(a){return"Array"===g(a)}function i(a,b){var c,d,e={};if(h(b))for(c=0,d=b.length;d>c;c++)e[b[c]]=!0;else e[b]=!0;for(c=0,d=a.length;d>c;c++)void 0!==e[a[c]]&&(a.splice(c,1),d--,c--);return a}function j(a,b){var c,d;if(h(b)){for(c=0,d=b.length;d>c;c++)if(!j(a,b[c]))return!1;return!0}var e=g(b);for(c=0,d=a.length;d>c;c++)if("RegExp"===e){if("string"==typeof a[c]&&a[c].match(b))return!0}else if(a[c]===b)return!0;return!1}function k(a,b){if(!h(a)||!h(b))return!1;if(a.length!==b.length)return!1;a.sort(),b.sort();for(var c=0,d=a.length;d>c;c++)if(a[c]!==b[c])return!1;return!0}function l(a){return escape(a)}function m(a){return encodeURIComponent(a).replace(/[!'()*]/g,l).replace(/\*/g,"%2A")}var n=d&&d.URI,o=e.prototype,p=Object.prototype.hasOwnProperty;e._parts=function(){return{protocol:null,username:null,password:null,hostname:null,urn:null,port:null,path:null,query:null,fragment:null,duplicateQueryParameters:e.duplicateQueryParameters,escapeQuerySpace:e.escapeQuerySpace}},e.duplicateQueryParameters=!1,e.escapeQuerySpace=!0,e.protocol_expression=/^[a-z][a-z0-9-+-]*$/i,e.idn_expression=/[^a-z0-9\.-]/i,e.punycode_expression=/(xn--)/i,e.ip4_expression=/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/,e.ip6_expression=/^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/,e.find_uri_expression=/\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/gi,e.defaultPorts={http:"80",https:"443",ftp:"21",gopher:"70",ws:"80",wss:"443"},e.invalid_hostname_characters=/[^a-zA-Z0-9\.-]/,e.domAttributes={a:"href",blockquote:"cite",link:"href",base:"href",script:"src",form:"action",img:"src",area:"href",iframe:"src",embed:"src",source:"src",track:"src",input:"src"},e.getDomAttribute=function(a){if(!a||!a.nodeName)return void 0;var b=a.nodeName.toLowerCase();return"input"===b&&"image"!==a.type?void 0:e.domAttributes[b]},e.encode=m,e.decode=decodeURIComponent,e.iso8859=function(){e.encode=escape,e.decode=unescape},e.unicode=function(){e.encode=m,e.decode=decodeURIComponent},e.characters={pathname:{encode:{expression:/%(24|26|2B|2C|3B|3D|3A|40)/gi,map:{"%24":"$","%26":"&","%2B":"+","%2C":",","%3B":";","%3D":"=","%3A":":","%40":"@"}},decode:{expression:/[\/\?#]/g,map:{"/":"%2F","?":"%3F","#":"%23"}}},reserved:{encode:{expression:/%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/gi,map:{"%3A":":","%2F":"/","%3F":"?","%23":"#","%5B":"[","%5D":"]","%40":"@","%21":"!","%24":"$","%26":"&","%27":"'","%28":"(","%29":")","%2A":"*","%2B":"+","%2C":",","%3B":";","%3D":"="}}}},e.encodeQuery=function(a,b){var c=e.encode(a+"");return b?c.replace(/%20/g,"+"):c},e.decodeQuery=function(a,b){a+="";try{return e.decode(b?a.replace(/\+/g,"%20"):a)}catch(c){return a}},e.recodePath=function(a){for(var b=(a+"").split("/"),c=0,d=b.length;d>c;c++)b[c]=e.encodePathSegment(e.decode(b[c]));return b.join("/")},e.decodePath=function(a){for(var b=(a+"").split("/"),c=0,d=b.length;d>c;c++)b[c]=e.decodePathSegment(b[c]);return b.join("/")};var q,r={encode:"encode",decode:"decode"},s=function(a,b){return function(c){return e[b](c+"").replace(e.characters[a][b].expression,function(c){return e.characters[a][b].map[c]})}};for(q in r)e[q+"PathSegment"]=s("pathname",r[q]);e.encodeReserved=s("reserved","encode"),e.parse=function(a,b){var c;return b||(b={}),c=a.indexOf("#"),c>-1&&(b.fragment=a.substring(c+1)||null,a=a.substring(0,c)),c=a.indexOf("?"),c>-1&&(b.query=a.substring(c+1)||null,a=a.substring(0,c)),"//"===a.substring(0,2)?(b.protocol=null,a=a.substring(2),a=e.parseAuthority(a,b)):(c=a.indexOf(":"),c>-1&&(b.protocol=a.substring(0,c)||null,b.protocol&&!b.protocol.match(e.protocol_expression)?b.protocol=void 0:"file"===b.protocol?a=a.substring(c+3):"//"===a.substring(c+1,c+3)?(a=a.substring(c+3),a=e.parseAuthority(a,b)):(a=a.substring(c+1),b.urn=!0))),b.path=a,b},e.parseHost=function(a,b){var c,d,e=a.indexOf("/");return-1===e&&(e=a.length),"["===a.charAt(0)?(c=a.indexOf("]"),b.hostname=a.substring(1,c)||null,b.port=a.substring(c+2,e)||null):a.indexOf(":")!==a.lastIndexOf(":")?(b.hostname=a.substring(0,e)||null,b.port=null):(d=a.substring(0,e).split(":"),b.hostname=d[0]||null,b.port=d[1]||null),b.hostname&&"/"!==a.substring(e).charAt(0)&&(e++,a="/"+a),a.substring(e)||"/"},e.parseAuthority=function(a,b){return a=e.parseUserinfo(a,b),e.parseHost(a,b)},e.parseUserinfo=function(a,b){var c,d=a.indexOf("/"),f=d>-1?a.lastIndexOf("@",d):a.indexOf("@");return f>-1&&(-1===d||d>f)?(c=a.substring(0,f).split(":"),b.username=c[0]?e.decode(c[0]):null,c.shift(),b.password=c[0]?e.decode(c.join(":")):null,a=a.substring(f+1)):(b.username=null,b.password=null),a},e.parseQuery=function(a,b){if(!a)return{};if(a=a.replace(/&+/g,"&").replace(/^\?*&*|&+$/g,""),!a)return{};for(var c,d,f,g={},h=a.split("&"),i=h.length,j=0;i>j;j++)c=h[j].split("="),d=e.decodeQuery(c.shift(),b),f=c.length?e.decodeQuery(c.join("="),b):null,g[d]?("string"==typeof g[d]&&(g[d]=[g[d]]),g[d].push(f)):g[d]=f;return g},e.build=function(a){var b="";return a.protocol&&(b+=a.protocol+":"),a.urn||!b&&!a.hostname||(b+="//"),b+=e.buildAuthority(a)||"","string"==typeof a.path&&("/"!==a.path.charAt(0)&&"string"==typeof a.hostname&&(b+="/"),b+=a.path),"string"==typeof a.query&&a.query&&(b+="?"+a.query),"string"==typeof a.fragment&&a.fragment&&(b+="#"+a.fragment),b},e.buildHost=function(a){var b="";return a.hostname?(e.ip6_expression.test(a.hostname)?b+=a.port?"["+a.hostname+"]:"+a.port:a.hostname:(b+=a.hostname,a.port&&(b+=":"+a.port)),b):""},e.buildAuthority=function(a){return e.buildUserinfo(a)+e.buildHost(a)},e.buildUserinfo=function(a){var b="";return a.username&&(b+=e.encode(a.username),a.password&&(b+=":"+e.encode(a.password)),b+="@"),b},e.buildQuery=function(a,b,c){var d,f,g,i,j="";for(f in a)if(p.call(a,f)&&f)if(h(a[f]))for(d={},g=0,i=a[f].length;i>g;g++)void 0!==a[f][g]&&void 0===d[a[f][g]+""]&&(j+="&"+e.buildQueryParameter(f,a[f][g],c),b!==!0&&(d[a[f][g]+""]=!0));else void 0!==a[f]&&(j+="&"+e.buildQueryParameter(f,a[f],c));return j.substring(1)},e.buildQueryParameter=function(a,b,c){return e.encodeQuery(a,c)+(null!==b?"="+e.encodeQuery(b,c):"")},e.addQuery=function(a,b,c){if("object"==typeof b)for(var d in b)p.call(b,d)&&e.addQuery(a,d,b[d]);else{if("string"!=typeof b)throw new TypeError("URI.addQuery() accepts an object, string as the name parameter");if(void 0===a[b])return void(a[b]=c);"string"==typeof a[b]&&(a[b]=[a[b]]),h(c)||(c=[c]),a[b]=a[b].concat(c)}},e.removeQuery=function(a,b,c){var d,f,g;if(h(b))for(d=0,f=b.length;f>d;d++)a[b[d]]=void 0;else if("object"==typeof b)for(g in b)p.call(b,g)&&e.removeQuery(a,g,b[g]);else{if("string"!=typeof b)throw new TypeError("URI.addQuery() accepts an object, string as the first parameter");void 0!==c?a[b]===c?a[b]=void 0:h(a[b])&&(a[b]=i(a[b],c)):a[b]=void 0}},e.hasQuery=function(a,b,c,d){if("object"==typeof b){for(var f in b)if(p.call(b,f)&&!e.hasQuery(a,f,b[f]))return!1;return!0}if("string"!=typeof b)throw new TypeError("URI.hasQuery() accepts an object, string as the name parameter");switch(g(c)){case"Undefined":return b in a;case"Boolean":var i=Boolean(h(a[b])?a[b].length:a[b]);return c===i;case"Function":return!!c(a[b],b,a);case"Array":if(!h(a[b]))return!1;var l=d?j:k;return l(a[b],c);case"RegExp":return h(a[b])?d?j(a[b],c):!1:Boolean(a[b]&&a[b].match(c));case"Number":c=String(c);case"String":return h(a[b])?d?j(a[b],c):!1:a[b]===c;default:throw new TypeError("URI.hasQuery() accepts undefined, boolean, string, number, RegExp, Function as the value parameter")}},e.commonPath=function(a,b){var c,d=Math.min(a.length,b.length);for(c=0;d>c;c++)if(a.charAt(c)!==b.charAt(c)){c--;break}return 1>c?a.charAt(0)===b.charAt(0)&&"/"===a.charAt(0)?"/":"":(("/"!==a.charAt(c)||"/"!==b.charAt(c))&&(c=a.substring(0,c).lastIndexOf("/")),a.substring(0,c+1))},e.withinString=function(a,b){return a.replace(e.find_uri_expression,b)},e.ensureValidHostname=function(b){if(b.match(e.invalid_hostname_characters)){if(!a)throw new TypeError("Hostname '"+b+"' contains characters other than [A-Z0-9.-] and Punycode.js is not available");if(a.toASCII(b).match(e.invalid_hostname_characters))throw new TypeError("Hostname '"+b+"' contains characters other than [A-Z0-9.-]")}},e.noConflict=function(a){if(a){var c={URI:this.noConflict()};return URITemplate&&"function"==typeof URITemplate.noConflict&&(c.URITemplate=URITemplate.noConflict()),b&&"function"==typeof b.noConflict&&(c.IPv6=b.noConflict()),SecondLevelDomains&&"function"==typeof SecondLevelDomains.noConflict&&(c.SecondLevelDomains=SecondLevelDomains.noConflict()),c}return d.URI===this&&(d.URI=n),this},o.build=function(a){return a===!0?this._deferred_build=!0:(void 0===a||this._deferred_build)&&(this._string=e.build(this._parts),this._deferred_build=!1),this},o.clone=function(){return new e(this)},o.valueOf=o.toString=function(){return this.build(!1)._string},r={protocol:"protocol",username:"username",password:"password",hostname:"hostname",port:"port"},s=function(a){return function(b,c){return void 0===b?this._parts[a]||"":(this._parts[a]=b||null,this.build(!c),this)}};for(q in r)o[q]=s(r[q]);r={query:"?",fragment:"#"},s=function(a,b){return function(c,d){return void 0===c?this._parts[a]||"":(null!==c&&(c+="",c.charAt(0)===b&&(c=c.substring(1))),this._parts[a]=c,this.build(!d),this)}};for(q in r)o[q]=s(q,r[q]);r={search:["?","query"],hash:["#","fragment"]},s=function(a,b){return function(c,d){var e=this[a](c,d);return"string"==typeof e&&e.length?b+e:e}};for(q in r)o[q]=s(r[q][1],r[q][0]);o.pathname=function(a,b){if(void 0===a||a===!0){var c=this._parts.path||(this._parts.hostname?"/":"");return a?e.decodePath(c):c}return this._parts.path=a?e.recodePath(a):"/",this.build(!b),this},o.path=o.pathname,o.href=function(a,b){var c;if(void 0===a)return this.toString();this._string="",this._parts=e._parts();var d=a instanceof e,f="object"==typeof a&&(a.hostname||a.path||a.pathname);if(a.nodeName){var g=e.getDomAttribute(a);a=a[g]||"",f=!1}if(!d&&f&&void 0!==a.pathname&&(a=a.toString()),"string"==typeof a)this._parts=e.parse(a,this._parts);else{if(!d&&!f)throw new TypeError("invalid input");var h=d?a._parts:a;for(c in h)p.call(this._parts,c)&&(this._parts[c]=h[c])}return this.build(!b),this},o.is=function(a){var b=!1,d=!1,f=!1,g=!1,h=!1,i=!1,j=!1,k=!this._parts.urn;switch(this._parts.hostname&&(k=!1,d=e.ip4_expression.test(this._parts.hostname),f=e.ip6_expression.test(this._parts.hostname),b=d||f,g=!b,h=g&&c&&c.has(this._parts.hostname),i=g&&e.idn_expression.test(this._parts.hostname),j=g&&e.punycode_expression.test(this._parts.hostname)),a.toLowerCase()){case"relative":return k;case"absolute":return!k;case"domain":case"name":return g;case"sld":return h;case"ip":return b;case"ip4":case"ipv4":case"inet4":return d;case"ip6":case"ipv6":case"inet6":return f;case"idn":return i;case"url":return!this._parts.urn;case"urn":return!!this._parts.urn;case"punycode":return j}return null};var t=o.protocol,u=o.port,v=o.hostname;o.protocol=function(a,b){if(void 0!==a&&a&&(a=a.replace(/:(\/\/)?$/,""),a.match(/[^a-zA-z0-9\.+-]/)))throw new TypeError("Protocol '"+a+"' contains characters other than [A-Z0-9.+-]");return t.call(this,a,b)},o.scheme=o.protocol,o.port=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0!==a&&(0===a&&(a=null),a&&(a+="",":"===a.charAt(0)&&(a=a.substring(1)),a.match(/[^0-9]/))))throw new TypeError("Port '"+a+"' contains characters other than [0-9]");return u.call(this,a,b)},o.hostname=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0!==a){var c={};e.parseHost(a,c),a=c.hostname}return v.call(this,a,b)},o.host=function(a,b){return this._parts.urn?void 0===a?"":this:void 0===a?this._parts.hostname?e.buildHost(this._parts):"":(e.parseHost(a,this._parts),this.build(!b),this)},o.authority=function(a,b){return this._parts.urn?void 0===a?"":this:void 0===a?this._parts.hostname?e.buildAuthority(this._parts):"":(e.parseAuthority(a,this._parts),this.build(!b),this)},o.userinfo=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a){if(!this._parts.username)return"";var c=e.buildUserinfo(this._parts);return c.substring(0,c.length-1)}return"@"!==a[a.length-1]&&(a+="@"),e.parseUserinfo(a,this._parts),this.build(!b),this},o.resource=function(a,b){var c;return void 0===a?this.path()+this.search()+this.hash():(c=e.parse(a),this._parts.path=c.path,this._parts.query=c.query,this._parts.fragment=c.fragment,this.build(!b),this)},o.subdomain=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a){if(!this._parts.hostname||this.is("IP"))return"";var c=this._parts.hostname.length-this.domain().length-1;return this._parts.hostname.substring(0,c)||""}var d=this._parts.hostname.length-this.domain().length,g=this._parts.hostname.substring(0,d),h=new RegExp("^"+f(g));return a&&"."!==a.charAt(a.length-1)&&(a+="."),a&&e.ensureValidHostname(a),this._parts.hostname=this._parts.hostname.replace(h,a),this.build(!b),this},o.domain=function(a,b){if(this._parts.urn)return void 0===a?"":this;if("boolean"==typeof a&&(b=a,a=void 0),void 0===a){if(!this._parts.hostname||this.is("IP"))return"";var c=this._parts.hostname.match(/\./g);if(c&&c.length<2)return this._parts.hostname;var d=this._parts.hostname.length-this.tld(b).length-1;return d=this._parts.hostname.lastIndexOf(".",d-1)+1,this._parts.hostname.substring(d)||""}if(!a)throw new TypeError("cannot set domain empty");if(e.ensureValidHostname(a),!this._parts.hostname||this.is("IP"))this._parts.hostname=a;else{var g=new RegExp(f(this.domain())+"$");this._parts.hostname=this._parts.hostname.replace(g,a)}return this.build(!b),this},o.tld=function(a,b){if(this._parts.urn)return void 0===a?"":this;if("boolean"==typeof a&&(b=a,a=void 0),void 0===a){if(!this._parts.hostname||this.is("IP"))return"";var d=this._parts.hostname.lastIndexOf("."),e=this._parts.hostname.substring(d+1);return b!==!0&&c&&c.list[e.toLowerCase()]?c.get(this._parts.hostname)||e:e}var g;if(!a)throw new TypeError("cannot set TLD empty");if(a.match(/[^a-zA-Z0-9-]/)){if(!c||!c.is(a))throw new TypeError("TLD '"+a+"' contains characters other than [A-Z0-9]");g=new RegExp(f(this.tld())+"$"),this._parts.hostname=this._parts.hostname.replace(g,a)}else{if(!this._parts.hostname||this.is("IP"))throw new ReferenceError("cannot set TLD on non-domain host");g=new RegExp(f(this.tld())+"$"),this._parts.hostname=this._parts.hostname.replace(g,a)}return this.build(!b),this},o.directory=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a||a===!0){if(!this._parts.path&&!this._parts.hostname)return"";if("/"===this._parts.path)return"/";var c=this._parts.path.length-this.filename().length-1,d=this._parts.path.substring(0,c)||(this._parts.hostname?"/":"");return a?e.decodePath(d):d}var g=this._parts.path.length-this.filename().length,h=this._parts.path.substring(0,g),i=new RegExp("^"+f(h));return this.is("relative")||(a||(a="/"),"/"!==a.charAt(0)&&(a="/"+a)),a&&"/"!==a.charAt(a.length-1)&&(a+="/"),a=e.recodePath(a),this._parts.path=this._parts.path.replace(i,a),this.build(!b),this},o.filename=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a||a===!0){if(!this._parts.path||"/"===this._parts.path)return"";var c=this._parts.path.lastIndexOf("/"),d=this._parts.path.substring(c+1);return a?e.decodePathSegment(d):d}var g=!1;"/"===a.charAt(0)&&(a=a.substring(1)),a.match(/\.?\//)&&(g=!0);var h=new RegExp(f(this.filename())+"$");return a=e.recodePath(a),this._parts.path=this._parts.path.replace(h,a),g?this.normalizePath(b):this.build(!b),this},o.suffix=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a||a===!0){if(!this._parts.path||"/"===this._parts.path)return"";var c,d,g=this.filename(),h=g.lastIndexOf(".");return-1===h?"":(c=g.substring(h+1),d=/^[a-z0-9%]+$/i.test(c)?c:"",a?e.decodePathSegment(d):d)}"."===a.charAt(0)&&(a=a.substring(1));var i,j=this.suffix();if(j)i=new RegExp(a?f(j)+"$":f("."+j)+"$");else{if(!a)return this;this._parts.path+="."+e.recodePath(a)}return i&&(a=e.recodePath(a),this._parts.path=this._parts.path.replace(i,a)),this.build(!b),this},o.segment=function(a,b,c){var d=this._parts.urn?":":"/",e=this.path(),f="/"===e.substring(0,1),g=e.split(d);if(void 0!==a&&"number"!=typeof a&&(c=b,b=a,a=void 0),void 0!==a&&"number"!=typeof a)throw new Error("Bad segment '"+a+"', must be 0-based integer");if(f&&g.shift(),0>a&&(a=Math.max(g.length+a,0)),void 0===b)return void 0===a?g:g[a];if(null===a||void 0===g[a])if(h(b)){g=[];for(var i=0,j=b.length;j>i;i++)(b[i].length||g.length&&g[g.length-1].length)&&(g.length&&!g[g.length-1].length&&g.pop(),g.push(b[i]))}else(b||"string"==typeof b)&&(""===g[g.length-1]?g[g.length-1]=b:g.push(b));else b||"string"==typeof b&&b.length?g[a]=b:g.splice(a,1);return f&&g.unshift(""),this.path(g.join(d),c)},o.segmentCoded=function(a,b,c){var d,f,g;if("number"!=typeof a&&(c=b,b=a,a=void 0),void 0===b){if(d=this.segment(a,b,c),h(d))for(f=0,g=d.length;g>f;f++)d[f]=e.decode(d[f]);else d=void 0!==d?e.decode(d):void 0;return d}if(h(b))for(f=0,g=b.length;g>f;f++)b[f]=e.decode(b[f]);else b="string"==typeof b?e.encode(b):b;return this.segment(a,b,c)};var w=o.query;return o.query=function(a,b){if(a===!0)return e.parseQuery(this._parts.query,this._parts.escapeQuerySpace);if("function"==typeof a){var c=e.parseQuery(this._parts.query,this._parts.escapeQuerySpace),d=a.call(this,c);return this._parts.query=e.buildQuery(d||c,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace),this.build(!b),this}return void 0!==a&&"string"!=typeof a?(this._parts.query=e.buildQuery(a,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace),this.build(!b),this):w.call(this,a,b)},o.setQuery=function(a,b,c){var d=e.parseQuery(this._parts.query,this._parts.escapeQuerySpace);if("object"==typeof a)for(var f in a)p.call(a,f)&&(d[f]=a[f]);else{if("string"!=typeof a)throw new TypeError("URI.addQuery() accepts an object, string as the name parameter");d[a]=void 0!==b?b:null}return this._parts.query=e.buildQuery(d,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace),"string"!=typeof a&&(c=b),this.build(!c),this},o.addQuery=function(a,b,c){var d=e.parseQuery(this._parts.query,this._parts.escapeQuerySpace);return e.addQuery(d,a,void 0===b?null:b),this._parts.query=e.buildQuery(d,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace),"string"!=typeof a&&(c=b),this.build(!c),this},o.removeQuery=function(a,b,c){var d=e.parseQuery(this._parts.query,this._parts.escapeQuerySpace);return e.removeQuery(d,a,b),this._parts.query=e.buildQuery(d,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace),"string"!=typeof a&&(c=b),this.build(!c),this},o.hasQuery=function(a,b,c){var d=e.parseQuery(this._parts.query,this._parts.escapeQuerySpace);return e.hasQuery(d,a,b,c)},o.setSearch=o.setQuery,o.addSearch=o.addQuery,o.removeSearch=o.removeQuery,o.hasSearch=o.hasQuery,o.normalize=function(){return this._parts.urn?this.normalizeProtocol(!1).normalizeQuery(!1).normalizeFragment(!1).build():this.normalizeProtocol(!1).normalizeHostname(!1).normalizePort(!1).normalizePath(!1).normalizeQuery(!1).normalizeFragment(!1).build()},o.normalizeProtocol=function(a){return"string"==typeof this._parts.protocol&&(this._parts.protocol=this._parts.protocol.toLowerCase(),this.build(!a)),this},o.normalizeHostname=function(c){return this._parts.hostname&&(this.is("IDN")&&a?this._parts.hostname=a.toASCII(this._parts.hostname):this.is("IPv6")&&b&&(this._parts.hostname=b.best(this._parts.hostname)),this._parts.hostname=this._parts.hostname.toLowerCase(),this.build(!c)),this},o.normalizePort=function(a){return"string"==typeof this._parts.protocol&&this._parts.port===e.defaultPorts[this._parts.protocol]&&(this._parts.port=null,this.build(!a)),this},o.normalizePath=function(a){if(this._parts.urn)return this;if(!this._parts.path||"/"===this._parts.path)return this;var b,c,d,f=this._parts.path;for("/"!==f.charAt(0)&&(b=!0,f="/"+f),f=f.replace(/(\/(\.\/)+)|(\/\.$)/g,"/").replace(/\/{2,}/g,"/");;){if(c=f.indexOf("/../"),-1===c)break;if(0===c){f=f.substring(3);break}d=f.substring(0,c).lastIndexOf("/"),-1===d&&(d=c),f=f.substring(0,d)+f.substring(c+3)}return b&&this.is("relative")&&(f=f.substring(1)),f=e.recodePath(f),this._parts.path=f,this.build(!a),this},o.normalizePathname=o.normalizePath,o.normalizeQuery=function(a){return"string"==typeof this._parts.query&&(this._parts.query.length?this.query(e.parseQuery(this._parts.query,this._parts.escapeQuerySpace)):this._parts.query=null,this.build(!a)),this},o.normalizeFragment=function(a){return this._parts.fragment||(this._parts.fragment=null,this.build(!a)),this},o.normalizeSearch=o.normalizeQuery,o.normalizeHash=o.normalizeFragment,o.iso8859=function(){var a=e.encode,b=e.decode;return e.encode=escape,e.decode=decodeURIComponent,this.normalize(),e.encode=a,e.decode=b,this},o.unicode=function(){var a=e.encode,b=e.decode;return e.encode=m,e.decode=unescape,this.normalize(),e.encode=a,e.decode=b,this},o.readable=function(){var b=this.clone();b.username("").password("").normalize();var c="";if(b._parts.protocol&&(c+=b._parts.protocol+"://"),b._parts.hostname&&(b.is("punycode")&&a?(c+=a.toUnicode(b._parts.hostname),b._parts.port&&(c+=":"+b._parts.port)):c+=b.host()),b._parts.hostname&&b._parts.path&&"/"!==b._parts.path.charAt(0)&&(c+="/"),c+=b.path(!0),b._parts.query){for(var d="",f=0,g=b._parts.query.split("&"),h=g.length;h>f;f++){var i=(g[f]||"").split("=");d+="&"+e.decodeQuery(i[0],this._parts.escapeQuerySpace).replace(/&/g,"%26"),void 0!==i[1]&&(d+="="+e.decodeQuery(i[1],this._parts.escapeQuerySpace).replace(/&/g,"%26"))}c+="?"+d.substring(1)}return c+=e.decodeQuery(b.hash(),!0)},o.absoluteTo=function(a){var b,c,d,f=this.clone(),g=["protocol","username","password","hostname","port"];if(this._parts.urn)throw new Error("URNs do not have any generally defined hierarchical components");if(a instanceof e||(a=new e(a)),f._parts.protocol||(f._parts.protocol=a._parts.protocol),this._parts.hostname)return f;for(c=0;d=g[c];c++)f._parts[d]=a._parts[d];for(g=["query","path"],c=0;d=g[c];c++)!f._parts[d]&&a._parts[d]&&(f._parts[d]=a._parts[d]);return"/"!==f.path().charAt(0)&&(b=a.directory(),f._parts.path=(b?b+"/":"")+f._parts.path,f.normalizePath()),f.build(),f},o.relativeTo=function(a){var b,c,d,f,g,h=this.clone().normalize();if(h._parts.urn)throw new Error("URNs do not have any generally defined hierarchical components");if(a=new e(a).normalize(),b=h._parts,c=a._parts,f=h.path(),g=a.path(),"/"!==f.charAt(0))throw new Error("URI is already relative");if("/"!==g.charAt(0))throw new Error("Cannot calculate a URI relative to another relative URI");if(b.protocol===c.protocol&&(b.protocol=null),b.username!==c.username||b.password!==c.password)return h.build();if(null!==b.protocol||null!==b.username||null!==b.password)return h.build();if(b.hostname!==c.hostname||b.port!==c.port)return h.build();if(b.hostname=null,b.port=null,f===g)return b.path="",h.build();if(d=e.commonPath(h.path(),a.path()),!d)return h.build();var i=c.path.substring(d.length).replace(/[^\/]*$/,"").replace(/.*?\//g,"../");return b.path=i+b.path.substring(d.length),h.build()},o.equals=function(a){var b,c,d,f=this.clone(),g=new e(a),i={},j={},l={};if(f.normalize(),g.normalize(),f.toString()===g.toString())return!0;if(b=f.query(),c=g.query(),f.query(""),g.query(""),f.toString()!==g.toString())return!1;if(b.length!==c.length)return!1;i=e.parseQuery(b,this._parts.escapeQuerySpace),j=e.parseQuery(c,this._parts.escapeQuerySpace);for(d in i)if(p.call(i,d)){if(h(i[d])){if(!k(i[d],j[d]))return!1}else if(i[d]!==j[d])return!1;l[d]=!0}for(d in j)if(p.call(j,d)&&!l[d])return!1;return!0},o.duplicateQueryParameters=function(a){return this._parts.duplicateQueryParameters=!!a,this},o.escapeQuerySpace=function(a){return this._parts.escapeQuerySpace=!!a,this},e}),function(){function a(a,b,c){null!=a&&("number"==typeof a?this.fromNumber(a,b,c):null==b&&"string"!=typeof a?this.fromString(a,256):this.fromString(a,b))}function b(){return new a(null)}function c(a,b,c,d,e,f){for(;--f>=0;){var g=b*this[a++]+c[d]+e;e=Math.floor(g/67108864),c[d++]=67108863&g}return e}function d(a,b,c,d,e,f){for(var g=32767&b,h=b>>15;--f>=0;){var i=32767&this[a],j=this[a++]>>15,k=h*i+j*g;i=g*i+((32767&k)<<15)+c[d]+(1073741823&e),e=(i>>>30)+(k>>>15)+h*j+(e>>>30),c[d++]=1073741823&i}return e}function e(a,b,c,d,e,f){for(var g=16383&b,h=b>>14;--f>=0;){var i=16383&this[a],j=this[a++]>>14,k=h*i+j*g;
+i=g*i+((16383&k)<<14)+c[d]+e,e=(i>>28)+(k>>14)+h*j,c[d++]=268435455&i}return e}function f(a){return fc.charAt(a)}function g(a,b){var c=gc[a.charCodeAt(b)];return null==c?-1:c}function h(a){for(var b=this.t-1;b>=0;--b)a[b]=this[b];a.t=this.t,a.s=this.s}function i(a){this.t=1,this.s=0>a?-1:0,a>0?this[0]=a:-1>a?this[0]=a+DV:this.t=0}function j(a){var c=b();return c.fromInt(a),c}function k(b,c){var d;if(16==c)d=4;else if(8==c)d=3;else if(256==c)d=8;else if(2==c)d=1;else if(32==c)d=5;else{if(4!=c)return void this.fromRadix(b,c);d=2}this.t=0,this.s=0;for(var e=b.length,f=!1,h=0;--e>=0;){var i=8==d?255&b[e]:g(b,e);0>i?"-"==b.charAt(e)&&(f=!0):(f=!1,0==h?this[this.t++]=i:h+d>this.DB?(this[this.t-1]|=(i&(1<<this.DB-h)-1)<<h,this[this.t++]=i>>this.DB-h):this[this.t-1]|=i<<h,h+=d,h>=this.DB&&(h-=this.DB))}8==d&&0!=(128&b[0])&&(this.s=-1,h>0&&(this[this.t-1]|=(1<<this.DB-h)-1<<h)),this.clamp(),f&&a.ZERO.subTo(this,this)}function l(){for(var a=this.s&this.DM;this.t>0&&this[this.t-1]==a;)--this.t}function m(a){if(this.s<0)return"-"+this.negate().toString(a);var b;if(16==a)b=4;else if(8==a)b=3;else if(2==a)b=1;else if(32==a)b=5;else{if(4!=a)return this.toRadix(a);b=2}var c,d=(1<<b)-1,e=!1,g="",h=this.t,i=this.DB-h*this.DB%b;if(h-->0)for(i<this.DB&&(c=this[h]>>i)>0&&(e=!0,g=f(c));h>=0;)b>i?(c=(this[h]&(1<<i)-1)<<b-i,c|=this[--h]>>(i+=this.DB-b)):(c=this[h]>>(i-=b)&d,0>=i&&(i+=this.DB,--h)),c>0&&(e=!0),e&&(g+=f(c));return e?g:"0"}function n(){var c=b();return a.ZERO.subTo(this,c),c}function o(){return this.s<0?this.negate():this}function p(a){var b=this.s-a.s;if(0!=b)return b;var c=this.t;if(b=c-a.t,0!=b)return this.s<0?-b:b;for(;--c>=0;)if(0!=(b=this[c]-a[c]))return b;return 0}function q(a){var b,c=1;return 0!=(b=a>>>16)&&(a=b,c+=16),0!=(b=a>>8)&&(a=b,c+=8),0!=(b=a>>4)&&(a=b,c+=4),0!=(b=a>>2)&&(a=b,c+=2),0!=(b=a>>1)&&(a=b,c+=1),c}function r(){return this.t<=0?0:this.DB*(this.t-1)+q(this[this.t-1]^this.s&this.DM)}function s(a,b){var c;for(c=this.t-1;c>=0;--c)b[c+a]=this[c];for(c=a-1;c>=0;--c)b[c]=0;b.t=this.t+a,b.s=this.s}function t(a,b){for(var c=a;c<this.t;++c)b[c-a]=this[c];b.t=Math.max(this.t-a,0),b.s=this.s}function u(a,b){var c,d=a%this.DB,e=this.DB-d,f=(1<<e)-1,g=Math.floor(a/this.DB),h=this.s<<d&this.DM;for(c=this.t-1;c>=0;--c)b[c+g+1]=this[c]>>e|h,h=(this[c]&f)<<d;for(c=g-1;c>=0;--c)b[c]=0;b[g]=h,b.t=this.t+g+1,b.s=this.s,b.clamp()}function v(a,b){b.s=this.s;var c=Math.floor(a/this.DB);if(c>=this.t)return void(b.t=0);var d=a%this.DB,e=this.DB-d,f=(1<<d)-1;b[0]=this[c]>>d;for(var g=c+1;g<this.t;++g)b[g-c-1]|=(this[g]&f)<<e,b[g-c]=this[g]>>d;d>0&&(b[this.t-c-1]|=(this.s&f)<<e),b.t=this.t-c,b.clamp()}function w(a,b){for(var c=0,d=0,e=Math.min(a.t,this.t);e>c;)d+=this[c]-a[c],b[c++]=d&this.DM,d>>=this.DB;if(a.t<this.t){for(d-=a.s;c<this.t;)d+=this[c],b[c++]=d&this.DM,d>>=this.DB;d+=this.s}else{for(d+=this.s;c<a.t;)d-=a[c],b[c++]=d&this.DM,d>>=this.DB;d-=a.s}b.s=0>d?-1:0,-1>d?b[c++]=this.DV+d:d>0&&(b[c++]=d),b.t=c,b.clamp()}function x(b,c){var d=this.abs(),e=b.abs(),f=d.t;for(c.t=f+e.t;--f>=0;)c[f]=0;for(f=0;f<e.t;++f)c[f+d.t]=d.am(0,e[f],c,f,0,d.t);c.s=0,c.clamp(),this.s!=b.s&&a.ZERO.subTo(c,c)}function y(a){for(var b=this.abs(),c=a.t=2*b.t;--c>=0;)a[c]=0;for(c=0;c<b.t-1;++c){var d=b.am(c,b[c],a,2*c,0,1);(a[c+b.t]+=b.am(c+1,2*b[c],a,2*c+1,d,b.t-c-1))>=b.DV&&(a[c+b.t]-=b.DV,a[c+b.t+1]=1)}a.t>0&&(a[a.t-1]+=b.am(c,b[c],a,2*c,0,1)),a.s=0,a.clamp()}function z(c,d,e){var f=c.abs();if(!(f.t<=0)){var g=this.abs();if(g.t<f.t)return null!=d&&d.fromInt(0),void(null!=e&&this.copyTo(e));null==e&&(e=b());var h=b(),i=this.s,j=c.s,k=this.DB-q(f[f.t-1]);k>0?(f.lShiftTo(k,h),g.lShiftTo(k,e)):(f.copyTo(h),g.copyTo(e));var l=h.t,m=h[l-1];if(0!=m){var n=m*(1<<this.F1)+(l>1?h[l-2]>>this.F2:0),o=this.FV/n,p=(1<<this.F1)/n,r=1<<this.F2,s=e.t,t=s-l,u=null==d?b():d;for(h.dlShiftTo(t,u),e.compareTo(u)>=0&&(e[e.t++]=1,e.subTo(u,e)),a.ONE.dlShiftTo(l,u),u.subTo(h,h);h.t<l;)h[h.t++]=0;for(;--t>=0;){var v=e[--s]==m?this.DM:Math.floor(e[s]*o+(e[s-1]+r)*p);if((e[s]+=h.am(0,v,e,t,0,l))<v)for(h.dlShiftTo(t,u),e.subTo(u,e);e[s]<--v;)e.subTo(u,e)}null!=d&&(e.drShiftTo(l,d),i!=j&&a.ZERO.subTo(d,d)),e.t=l,e.clamp(),k>0&&e.rShiftTo(k,e),0>i&&a.ZERO.subTo(e,e)}}}function A(c){var d=b();return this.abs().divRemTo(c,null,d),this.s<0&&d.compareTo(a.ZERO)>0&&c.subTo(d,d),d}function B(a){this.m=a}function C(a){return a.s<0||a.compareTo(this.m)>=0?a.mod(this.m):a}function D(a){return a}function E(a){a.divRemTo(this.m,null,a)}function F(a,b,c){a.multiplyTo(b,c),this.reduce(c)}function G(a,b){a.squareTo(b),this.reduce(b)}function H(){if(this.t<1)return 0;var a=this[0];if(0==(1&a))return 0;var b=3&a;return b=b*(2-(15&a)*b)&15,b=b*(2-(255&a)*b)&255,b=b*(2-((65535&a)*b&65535))&65535,b=b*(2-a*b%this.DV)%this.DV,b>0?this.DV-b:-b}function I(a){this.m=a,this.mp=a.invDigit(),this.mpl=32767&this.mp,this.mph=this.mp>>15,this.um=(1<<a.DB-15)-1,this.mt2=2*a.t}function J(c){var d=b();return c.abs().dlShiftTo(this.m.t,d),d.divRemTo(this.m,null,d),c.s<0&&d.compareTo(a.ZERO)>0&&this.m.subTo(d,d),d}function K(a){var c=b();return a.copyTo(c),this.reduce(c),c}function L(a){for(;a.t<=this.mt2;)a[a.t++]=0;for(var b=0;b<this.m.t;++b){var c=32767&a[b],d=c*this.mpl+((c*this.mph+(a[b]>>15)*this.mpl&this.um)<<15)&a.DM;for(c=b+this.m.t,a[c]+=this.m.am(0,d,a,b,0,this.m.t);a[c]>=a.DV;)a[c]-=a.DV,a[++c]++}a.clamp(),a.drShiftTo(this.m.t,a),a.compareTo(this.m)>=0&&a.subTo(this.m,a)}function M(a,b){a.squareTo(b),this.reduce(b)}function N(a,b,c){a.multiplyTo(b,c),this.reduce(c)}function O(){return 0==(this.t>0?1&this[0]:this.s)}function P(c,d){if(c>4294967295||1>c)return a.ONE;var e=b(),f=b(),g=d.convert(this),h=q(c)-1;for(g.copyTo(e);--h>=0;)if(d.sqrTo(e,f),(c&1<<h)>0)d.mulTo(f,g,e);else{var i=e;e=f,f=i}return d.revert(e)}function Q(a,b){var c;return c=256>a||b.isEven()?new B(b):new I(b),this.exp(a,c)}function R(){var a=b();return this.copyTo(a),a}function S(){if(this.s<0){if(1==this.t)return this[0]-this.DV;if(0==this.t)return-1}else{if(1==this.t)return this[0];if(0==this.t)return 0}return(this[1]&(1<<32-this.DB)-1)<<this.DB|this[0]}function T(){return 0==this.t?this.s:this[0]<<24>>24}function U(){return 0==this.t?this.s:this[0]<<16>>16}function V(a){return Math.floor(Math.LN2*this.DB/Math.log(a))}function W(){return this.s<0?-1:this.t<=0||1==this.t&&this[0]<=0?0:1}function X(a){if(null==a&&(a=10),0==this.signum()||2>a||a>36)return"0";var c=this.chunkSize(a),d=Math.pow(a,c),e=j(d),f=b(),g=b(),h="";for(this.divRemTo(e,f,g);f.signum()>0;)h=(d+g.intValue()).toString(a).substr(1)+h,f.divRemTo(e,f,g);return g.intValue().toString(a)+h}function Y(b,c){this.fromInt(0),null==c&&(c=10);for(var d=this.chunkSize(c),e=Math.pow(c,d),f=!1,h=0,i=0,j=0;j<b.length;++j){var k=g(b,j);0>k?"-"==b.charAt(j)&&0==this.signum()&&(f=!0):(i=c*i+k,++h>=d&&(this.dMultiply(e),this.dAddOffset(i,0),h=0,i=0))}h>0&&(this.dMultiply(Math.pow(c,h)),this.dAddOffset(i,0)),f&&a.ZERO.subTo(this,this)}function Z(b,c,d){if("number"==typeof c)if(2>b)this.fromInt(1);else for(this.fromNumber(b,d),this.testBit(b-1)||this.bitwiseTo(a.ONE.shiftLeft(b-1),fb,this),this.isEven()&&this.dAddOffset(1,0);!this.isProbablePrime(c);)this.dAddOffset(2,0),this.bitLength()>b&&this.subTo(a.ONE.shiftLeft(b-1),this);else{var e=new Array,f=7&b;e.length=(b>>3)+1,c.nextBytes(e),f>0?e[0]&=(1<<f)-1:e[0]=0,this.fromString(e,256)}}function $(){var a=this.t,b=new Array;b[0]=this.s;var c,d=this.DB-a*this.DB%8,e=0;if(a-->0)for(d<this.DB&&(c=this[a]>>d)!=(this.s&this.DM)>>d&&(b[e++]=c|this.s<<this.DB-d);a>=0;)8>d?(c=(this[a]&(1<<d)-1)<<8-d,c|=this[--a]>>(d+=this.DB-8)):(c=this[a]>>(d-=8)&255,0>=d&&(d+=this.DB,--a)),0!=(128&c)&&(c|=-256),0==e&&(128&this.s)!=(128&c)&&++e,(e>0||c!=this.s)&&(b[e++]=c);return b}function _(a){return 0==this.compareTo(a)}function ab(a){return this.compareTo(a)<0?this:a}function bb(a){return this.compareTo(a)>0?this:a}function cb(a,b,c){var d,e,f=Math.min(a.t,this.t);for(d=0;f>d;++d)c[d]=b(this[d],a[d]);if(a.t<this.t){for(e=a.s&this.DM,d=f;d<this.t;++d)c[d]=b(this[d],e);c.t=this.t}else{for(e=this.s&this.DM,d=f;d<a.t;++d)c[d]=b(e,a[d]);c.t=a.t}c.s=b(this.s,a.s),c.clamp()}function db(a,b){return a&b}function eb(a){var c=b();return this.bitwiseTo(a,db,c),c}function fb(a,b){return a|b}function gb(a){var c=b();return this.bitwiseTo(a,fb,c),c}function hb(a,b){return a^b}function ib(a){var c=b();return this.bitwiseTo(a,hb,c),c}function jb(a,b){return a&~b}function kb(a){var c=b();return this.bitwiseTo(a,jb,c),c}function lb(){for(var a=b(),c=0;c<this.t;++c)a[c]=this.DM&~this[c];return a.t=this.t,a.s=~this.s,a}function mb(a){var c=b();return 0>a?this.rShiftTo(-a,c):this.lShiftTo(a,c),c}function nb(a){var c=b();return 0>a?this.lShiftTo(-a,c):this.rShiftTo(a,c),c}function ob(a){if(0==a)return-1;var b=0;return 0==(65535&a)&&(a>>=16,b+=16),0==(255&a)&&(a>>=8,b+=8),0==(15&a)&&(a>>=4,b+=4),0==(3&a)&&(a>>=2,b+=2),0==(1&a)&&++b,b}function pb(){for(var a=0;a<this.t;++a)if(0!=this[a])return a*this.DB+ob(this[a]);return this.s<0?this.t*this.DB:-1}function qb(a){for(var b=0;0!=a;)a&=a-1,++b;return b}function rb(){for(var a=0,b=this.s&this.DM,c=0;c<this.t;++c)a+=qb(this[c]^b);return a}function sb(a){var b=Math.floor(a/this.DB);return b>=this.t?0!=this.s:0!=(this[b]&1<<a%this.DB)}function tb(b,c){var d=a.ONE.shiftLeft(b);return this.bitwiseTo(d,c,d),d}function ub(a){return this.changeBit(a,fb)}function vb(a){return this.changeBit(a,jb)}function wb(a){return this.changeBit(a,hb)}function xb(a,b){for(var c=0,d=0,e=Math.min(a.t,this.t);e>c;)d+=this[c]+a[c],b[c++]=d&this.DM,d>>=this.DB;if(a.t<this.t){for(d+=a.s;c<this.t;)d+=this[c],b[c++]=d&this.DM,d>>=this.DB;d+=this.s}else{for(d+=this.s;c<a.t;)d+=a[c],b[c++]=d&this.DM,d>>=this.DB;d+=a.s}b.s=0>d?-1:0,d>0?b[c++]=d:-1>d&&(b[c++]=this.DV+d),b.t=c,b.clamp()}function yb(a){var c=b();return this.addTo(a,c),c}function zb(a){var c=b();return this.subTo(a,c),c}function Ab(a){var c=b();return this.multiplyTo(a,c),c}function Bb(){var a=b();return this.squareTo(a),a}function Cb(a){var c=b();return this.divRemTo(a,c,null),c}function Db(a){var c=b();return this.divRemTo(a,null,c),c}function Eb(a){var c=b(),d=b();return this.divRemTo(a,c,d),new Array(c,d)}function Fb(a){this[this.t]=this.am(0,a-1,this,0,0,this.t),++this.t,this.clamp()}function Gb(a,b){if(0!=a){for(;this.t<=b;)this[this.t++]=0;for(this[b]+=a;this[b]>=this.DV;)this[b]-=this.DV,++b>=this.t&&(this[this.t++]=0),++this[b]}}function Hb(){}function Ib(a){return a}function Jb(a,b,c){a.multiplyTo(b,c)}function Kb(a,b){a.squareTo(b)}function Lb(a){return this.exp(a,new Hb)}function Mb(a,b,c){var d=Math.min(this.t+a.t,b);for(c.s=0,c.t=d;d>0;)c[--d]=0;var e;for(e=c.t-this.t;e>d;++d)c[d+this.t]=this.am(0,a[d],c,d,0,this.t);for(e=Math.min(a.t,b);e>d;++d)this.am(0,a[d],c,d,0,b-d);c.clamp()}function Nb(a,b,c){--b;var d=c.t=this.t+a.t-b;for(c.s=0;--d>=0;)c[d]=0;for(d=Math.max(b-this.t,0);d<a.t;++d)c[this.t+d-b]=this.am(b-d,a[d],c,0,0,this.t+d-b);c.clamp(),c.drShiftTo(1,c)}function Ob(c){this.r2=b(),this.q3=b(),a.ONE.dlShiftTo(2*c.t,this.r2),this.mu=this.r2.divide(c),this.m=c}function Pb(a){if(a.s<0||a.t>2*this.m.t)return a.mod(this.m);if(a.compareTo(this.m)<0)return a;var c=b();return a.copyTo(c),this.reduce(c),c}function Qb(a){return a}function Rb(a){for(a.drShiftTo(this.m.t-1,this.r2),a.t>this.m.t+1&&(a.t=this.m.t+1,a.clamp()),this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3),this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);a.compareTo(this.r2)<0;)a.dAddOffset(1,this.m.t+1);for(a.subTo(this.r2,a);a.compareTo(this.m)>=0;)a.subTo(this.m,a)}function Sb(a,b){a.squareTo(b),this.reduce(b)}function Tb(a,b,c){a.multiplyTo(b,c),this.reduce(c)}function Ub(a,c){var d,e,f=a.bitLength(),g=j(1);if(0>=f)return g;d=18>f?1:48>f?3:144>f?4:768>f?5:6,e=8>f?new B(c):c.isEven()?new Ob(c):new I(c);var h=new Array,i=3,k=d-1,l=(1<<d)-1;if(h[1]=e.convert(this),d>1){var m=b();for(e.sqrTo(h[1],m);l>=i;)h[i]=b(),e.mulTo(m,h[i-2],h[i]),i+=2}var n,o,p=a.t-1,r=!0,s=b();for(f=q(a[p])-1;p>=0;){for(f>=k?n=a[p]>>f-k&l:(n=(a[p]&(1<<f+1)-1)<<k-f,p>0&&(n|=a[p-1]>>this.DB+f-k)),i=d;0==(1&n);)n>>=1,--i;if((f-=i)<0&&(f+=this.DB,--p),r)h[n].copyTo(g),r=!1;else{for(;i>1;)e.sqrTo(g,s),e.sqrTo(s,g),i-=2;i>0?e.sqrTo(g,s):(o=g,g=s,s=o),e.mulTo(s,h[n],g)}for(;p>=0&&0==(a[p]&1<<f);)e.sqrTo(g,s),o=g,g=s,s=o,--f<0&&(f=this.DB-1,--p)}return e.revert(g)}function Vb(a){var b=this.s<0?this.negate():this.clone(),c=a.s<0?a.negate():a.clone();if(b.compareTo(c)<0){var d=b;b=c,c=d}var e=b.getLowestSetBit(),f=c.getLowestSetBit();if(0>f)return b;for(f>e&&(f=e),f>0&&(b.rShiftTo(f,b),c.rShiftTo(f,c));b.signum()>0;)(e=b.getLowestSetBit())>0&&b.rShiftTo(e,b),(e=c.getLowestSetBit())>0&&c.rShiftTo(e,c),b.compareTo(c)>=0?(b.subTo(c,b),b.rShiftTo(1,b)):(c.subTo(b,c),c.rShiftTo(1,c));return f>0&&c.lShiftTo(f,c),c}function Wb(a){if(0>=a)return 0;var b=this.DV%a,c=this.s<0?a-1:0;if(this.t>0)if(0==b)c=this[0]%a;else for(var d=this.t-1;d>=0;--d)c=(b*c+this[d])%a;return c}function Xb(b){var c=b.isEven();if(this.isEven()&&c||0==b.signum())return a.ZERO;for(var d=b.clone(),e=this.clone(),f=j(1),g=j(0),h=j(0),i=j(1);0!=d.signum();){for(;d.isEven();)d.rShiftTo(1,d),c?(f.isEven()&&g.isEven()||(f.addTo(this,f),g.subTo(b,g)),f.rShiftTo(1,f)):g.isEven()||g.subTo(b,g),g.rShiftTo(1,g);for(;e.isEven();)e.rShiftTo(1,e),c?(h.isEven()&&i.isEven()||(h.addTo(this,h),i.subTo(b,i)),h.rShiftTo(1,h)):i.isEven()||i.subTo(b,i),i.rShiftTo(1,i);d.compareTo(e)>=0?(d.subTo(e,d),c&&f.subTo(h,f),g.subTo(i,g)):(e.subTo(d,e),c&&h.subTo(f,h),i.subTo(g,i))}return 0!=e.compareTo(a.ONE)?a.ZERO:i.compareTo(b)>=0?i.subtract(b):i.signum()<0?(i.addTo(b,i),i.signum()<0?i.add(b):i):i}function Yb(a){var b,c=this.abs();if(1==c.t&&c[0]<=hc[hc.length-1]){for(b=0;b<hc.length;++b)if(c[0]==hc[b])return!0;return!1}if(c.isEven())return!1;for(b=1;b<hc.length;){for(var d=hc[b],e=b+1;e<hc.length&&ic>d;)d*=hc[e++];for(d=c.modInt(d);e>b;)if(d%hc[b++]==0)return!1}return c.millerRabin(a)}function Zb(c){var d=this.subtract(a.ONE),e=d.getLowestSetBit();if(0>=e)return!1;var f=d.shiftRight(e);c=c+1>>1,c>hc.length&&(c=hc.length);for(var g=b(),h=0;c>h;++h){g.fromInt(hc[Math.floor(Math.random()*hc.length)]);var i=g.modPow(f,this);if(0!=i.compareTo(a.ONE)&&0!=i.compareTo(d)){for(var j=1;j++<e&&0!=i.compareTo(d);)if(i=i.modPowInt(2,this),0==i.compareTo(a.ONE))return!1;if(0!=i.compareTo(d))return!1}}return!0}var $b,_b=0xdeadbeefcafe,ac=15715070==(16777215&_b),bc="undefined"!=typeof navigator;bc&&ac&&"Microsoft Internet Explorer"==navigator.appName?(a.prototype.am=d,$b=30):bc&&ac&&"Netscape"!=navigator.appName?(a.prototype.am=c,$b=26):(a.prototype.am=e,$b=28),a.prototype.DB=$b,a.prototype.DM=(1<<$b)-1,a.prototype.DV=1<<$b;var cc=52;a.prototype.FV=Math.pow(2,cc),a.prototype.F1=cc-$b,a.prototype.F2=2*$b-cc;var dc,ec,fc="0123456789abcdefghijklmnopqrstuvwxyz",gc=new Array;for(dc="0".charCodeAt(0),ec=0;9>=ec;++ec)gc[dc++]=ec;for(dc="a".charCodeAt(0),ec=10;36>ec;++ec)gc[dc++]=ec;for(dc="A".charCodeAt(0),ec=10;36>ec;++ec)gc[dc++]=ec;B.prototype.convert=C,B.prototype.revert=D,B.prototype.reduce=E,B.prototype.mulTo=F,B.prototype.sqrTo=G,I.prototype.convert=J,I.prototype.revert=K,I.prototype.reduce=L,I.prototype.mulTo=N,I.prototype.sqrTo=M,a.prototype.copyTo=h,a.prototype.fromInt=i,a.prototype.fromString=k,a.prototype.clamp=l,a.prototype.dlShiftTo=s,a.prototype.drShiftTo=t,a.prototype.lShiftTo=u,a.prototype.rShiftTo=v,a.prototype.subTo=w,a.prototype.multiplyTo=x,a.prototype.squareTo=y,a.prototype.divRemTo=z,a.prototype.invDigit=H,a.prototype.isEven=O,a.prototype.exp=P,a.prototype.toString=m,a.prototype.negate=n,a.prototype.abs=o,a.prototype.compareTo=p,a.prototype.bitLength=r,a.prototype.mod=A,a.prototype.modPowInt=Q,a.ZERO=j(0),a.ONE=j(1),Hb.prototype.convert=Ib,Hb.prototype.revert=Ib,Hb.prototype.mulTo=Jb,Hb.prototype.sqrTo=Kb,Ob.prototype.convert=Pb,Ob.prototype.revert=Qb,Ob.prototype.reduce=Rb,Ob.prototype.mulTo=Tb,Ob.prototype.sqrTo=Sb;var hc=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997],ic=(1<<26)/hc[hc.length-1];a.prototype.chunkSize=V,a.prototype.toRadix=X,a.prototype.fromRadix=Y,a.prototype.fromNumber=Z,a.prototype.bitwiseTo=cb,a.prototype.changeBit=tb,a.prototype.addTo=xb,a.prototype.dMultiply=Fb,a.prototype.dAddOffset=Gb,a.prototype.multiplyLowerTo=Mb,a.prototype.multiplyUpperTo=Nb,a.prototype.modInt=Wb,a.prototype.millerRabin=Zb,a.prototype.clone=R,a.prototype.intValue=S,a.prototype.byteValue=T,a.prototype.shortValue=U,a.prototype.signum=W,a.prototype.toByteArray=$,a.prototype.equals=_,a.prototype.min=ab,a.prototype.max=bb,a.prototype.and=eb,a.prototype.or=gb,a.prototype.xor=ib,a.prototype.andNot=kb,a.prototype.not=lb,a.prototype.shiftLeft=mb,a.prototype.shiftRight=nb,a.prototype.getLowestSetBit=pb,a.prototype.bitCount=rb,a.prototype.testBit=sb,a.prototype.setBit=ub,a.prototype.clearBit=vb,a.prototype.flipBit=wb,a.prototype.add=yb,a.prototype.subtract=zb,a.prototype.multiply=Ab,a.prototype.divide=Cb,a.prototype.remainder=Db,a.prototype.divideAndRemainder=Eb,a.prototype.modPow=Ub,a.prototype.modInverse=Xb,a.prototype.pow=Lb,a.prototype.gcd=Vb,a.prototype.isProbablePrime=Yb,a.prototype.square=Bb,"undefined"!=typeof exports?exports=module.exports=a:this.BigInteger=a}.call(this),function(a){var b,c,d,e=a(window),f={jqueryui:{container:"ui-widget ui-widget-content ui-corner-all",notice:"ui-state-highlight",notice_icon:"ui-icon ui-icon-info",info:"",info_icon:"ui-icon ui-icon-info",success:"ui-state-default",success_icon:"ui-icon ui-icon-circle-check",error:"ui-state-error",error_icon:"ui-icon ui-icon-alert",closer:"ui-icon ui-icon-close",pin_up:"ui-icon ui-icon-pin-w",pin_down:"ui-icon ui-icon-pin-s",hi_menu:"ui-state-default ui-corner-bottom",hi_btn:"ui-state-default ui-corner-all",hi_btnhov:"ui-state-hover",hi_hnd:"ui-icon ui-icon-grip-dotted-horizontal"},bootstrap:{container:"alert",notice:"",notice_icon:"icon-exclamation-sign",info:"alert-info",info_icon:"icon-info-sign",success:"alert-success",success_icon:"icon-ok-sign",error:"alert-error",error_icon:"icon-warning-sign",closer:"icon-remove",pin_up:"icon-pause",pin_down:"icon-play",hi_menu:"well",hi_btn:"btn",hi_btnhov:"",hi_hnd:"icon-chevron-down"}},g=function(){d=a("body"),e=a(window),e.bind("resize",function(){c&&clearTimeout(c),c=setTimeout(a.pnotify_position_all,10)})};document.body?g():a(g),a.extend({pnotify_remove_all:function(){var b=e.data("pnotify");b&&b.length&&a.each(b,function(){this.pnotify_remove&&this.pnotify_remove()})},pnotify_position_all:function(){c&&clearTimeout(c),c=null;var b=e.data("pnotify");b&&b.length&&(a.each(b,function(){var a=this.opts.stack;a&&(a.nextpos1=a.firstpos1,a.nextpos2=a.firstpos2,a.addpos2=0,a.animation=!0)}),a.each(b,function(){this.pnotify_position()}))},pnotify:function(g){var h,i;"object"!=typeof g?(i=a.extend({},a.pnotify.defaults),i.text=g):i=a.extend({},a.pnotify.defaults,g);for(var j in i)"string"==typeof j&&j.match(/^pnotify_/)&&(i[j.replace(/^pnotify_/,"")]=i[j]);if(i.before_init&&i.before_init(i)===!1)return null;var k,m=function(b,c){o.css("display","none");var d=document.elementFromPoint(b.clientX,b.clientY);o.css("display","block");var e=a(d),f=e.css("cursor");o.css("cursor","auto"!=f?f:"default"),k&&k.get(0)==d||(k&&(l.call(k.get(0),"mouseleave",b.originalEvent),l.call(k.get(0),"mouseout",b.originalEvent)),l.call(d,"mouseenter",b.originalEvent),l.call(d,"mouseover",b.originalEvent)),l.call(d,c,b.originalEvent),k=e},n=f[i.styling],o=a("<div />",{"class":"ui-pnotify "+i.addclass,css:{display:"none"},mouseenter:function(a){i.nonblock&&a.stopPropagation(),i.mouse_reset&&"out"==h&&(o.stop(!0),h="in",o.css("height","auto").animate({width:i.width,opacity:i.nonblock?i.nonblock_opacity:i.opacity},"fast")),i.nonblock&&o.animate({opacity:i.nonblock_opacity},"fast"),i.hide&&i.mouse_reset&&o.pnotify_cancel_remove(),i.sticker&&!i.nonblock&&o.sticker.trigger("pnotify_icon").css("visibility","visible"),i.closer&&!i.nonblock&&o.closer.css("visibility","visible")},mouseleave:function(b){i.nonblock&&b.stopPropagation(),k=null,o.css("cursor","auto"),i.nonblock&&"out"!=h&&o.animate({opacity:i.opacity},"fast"),i.hide&&i.mouse_reset&&o.pnotify_queue_remove(),i.sticker_hover&&o.sticker.css("visibility","hidden"),i.closer_hover&&o.closer.css("visibility","hidden"),a.pnotify_position_all()},mouseover:function(a){i.nonblock&&a.stopPropagation()},mouseout:function(a){i.nonblock&&a.stopPropagation()},mousemove:function(a){i.nonblock&&(a.stopPropagation(),m(a,"onmousemove"))},mousedown:function(a){i.nonblock&&(a.stopPropagation(),a.preventDefault(),m(a,"onmousedown"))},mouseup:function(a){i.nonblock&&(a.stopPropagation(),a.preventDefault(),m(a,"onmouseup"))},click:function(a){i.nonblock&&(a.stopPropagation(),m(a,"onclick"))},dblclick:function(a){i.nonblock&&(a.stopPropagation(),m(a,"ondblclick"))}});o.opts=i,o.container=a("<div />",{"class":n.container+" ui-pnotify-container "+("error"==i.type?n.error:"info"==i.type?n.info:"success"==i.type?n.success:n.notice)}).appendTo(o),""!=i.cornerclass&&o.container.removeClass("ui-corner-all").addClass(i.cornerclass),i.shadow&&o.container.addClass("ui-pnotify-shadow"),o.pnotify_version="1.2.0",o.pnotify=function(b){var c=i;"string"==typeof b?i.text=b:i=a.extend({},i,b);for(var d in i)"string"==typeof d&&d.match(/^pnotify_/)&&(i[d.replace(/^pnotify_/,"")]=i[d]);return o.opts=i,i.cornerclass!=c.cornerclass&&o.container.removeClass("ui-corner-all").addClass(i.cornerclass),i.shadow!=c.shadow&&(i.shadow?o.container.addClass("ui-pnotify-shadow"):o.container.removeClass("ui-pnotify-shadow")),i.addclass===!1?o.removeClass(c.addclass):i.addclass!==c.addclass&&o.removeClass(c.addclass).addClass(i.addclass),i.title===!1?o.title_container.slideUp("fast"):i.title!==c.title&&(i.title_escape?o.title_container.text(i.title).slideDown(200):o.title_container.html(i.title).slideDown(200)),i.text===!1?o.text_container.slideUp("fast"):i.text!==c.text&&(i.text_escape?o.text_container.text(i.text).slideDown(200):o.text_container.html(i.insert_brs?String(i.text).replace(/\n/g,"<br />"):i.text).slideDown(200)),o.pnotify_history=i.history,o.pnotify_hide=i.hide,i.type!=c.type&&o.container.removeClass(n.error+" "+n.notice+" "+n.success+" "+n.info).addClass("error"==i.type?n.error:"info"==i.type?n.info:"success"==i.type?n.success:n.notice),(i.icon!==c.icon||i.icon===!0&&i.type!=c.type)&&(o.container.find("div.ui-pnotify-icon").remove(),i.icon!==!1&&a("<div />",{"class":"ui-pnotify-icon"}).append(a("<span />",{"class":i.icon===!0?"error"==i.type?n.error_icon:"info"==i.type?n.info_icon:"success"==i.type?n.success_icon:n.notice_icon:i.icon})).prependTo(o.container)),i.width!==c.width&&o.animate({width:i.width}),i.min_height!==c.min_height&&o.container.animate({minHeight:i.min_height}),i.opacity!==c.opacity&&o.fadeTo(i.animate_speed,i.opacity),!i.closer||i.nonblock?o.closer.css("display","none"):o.closer.css("display","block"),!i.sticker||i.nonblock?o.sticker.css("display","none"):o.sticker.css("display","block"),o.sticker.trigger("pnotify_icon"),i.sticker_hover?o.sticker.css("visibility","hidden"):i.nonblock||o.sticker.css("visibility","visible"),i.closer_hover?o.closer.css("visibility","hidden"):i.nonblock||o.closer.css("visibility","visible"),i.hide?c.hide||o.pnotify_queue_remove():o.pnotify_cancel_remove(),o.pnotify_queue_position(),o},o.pnotify_position=function(a){var b=o.opts.stack;if(b){b.nextpos1||(b.nextpos1=b.firstpos1),b.nextpos2||(b.nextpos2=b.firstpos2),b.addpos2||(b.addpos2=0);var c="none"==o.css("display");if(!c||a){var d,f,g,h={};switch(b.dir1){case"down":g="top";break;case"up":g="bottom";break;case"left":g="right";break;case"right":g="left"}d=parseInt(o.css(g)),isNaN(d)&&(d=0),"undefined"!=typeof b.firstpos1||c||(b.firstpos1=d,b.nextpos1=b.firstpos1);var i;switch(b.dir2){case"down":i="top";break;case"up":i="bottom";break;case"left":i="right";break;case"right":i="left"}if(f=parseInt(o.css(i)),isNaN(f)&&(f=0),"undefined"!=typeof b.firstpos2||c||(b.firstpos2=f,b.nextpos2=b.firstpos2),("down"==b.dir1&&b.nextpos1+o.height()>e.height()||"up"==b.dir1&&b.nextpos1+o.height()>e.height()||"left"==b.dir1&&b.nextpos1+o.width()>e.width()||"right"==b.dir1&&b.nextpos1+o.width()>e.width())&&(b.nextpos1=b.firstpos1,b.nextpos2+=b.addpos2+("undefined"==typeof b.spacing2?25:b.spacing2),b.addpos2=0),b.animation&&b.nextpos2<f)switch(b.dir2){case"down":h.top=b.nextpos2+"px";break;case"up":h.bottom=b.nextpos2+"px";break;case"left":h.right=b.nextpos2+"px";break;case"right":h.left=b.nextpos2+"px"}else o.css(i,b.nextpos2+"px");switch(b.dir2){case"down":case"up":o.outerHeight(!0)>b.addpos2&&(b.addpos2=o.height());break;case"left":case"right":o.outerWidth(!0)>b.addpos2&&(b.addpos2=o.width())}if(b.nextpos1)if(b.animation&&(d>b.nextpos1||h.top||h.bottom||h.right||h.left))switch(b.dir1){case"down":h.top=b.nextpos1+"px";break;case"up":h.bottom=b.nextpos1+"px";break;case"left":h.right=b.nextpos1+"px";break;case"right":h.left=b.nextpos1+"px"}else o.css(g,b.nextpos1+"px");switch((h.top||h.bottom||h.right||h.left)&&o.animate(h,{duration:500,queue:!1}),b.dir1){case"down":case"up":b.nextpos1+=o.height()+("undefined"==typeof b.spacing1?25:b.spacing1);break;case"left":case"right":b.nextpos1+=o.width()+("undefined"==typeof b.spacing1?25:b.spacing1)}}}},o.pnotify_queue_position=function(b){c&&clearTimeout(c),b||(b=10),c=setTimeout(a.pnotify_position_all,b)},o.pnotify_display=function(){o.parent().length||o.appendTo(d),i.before_open&&i.before_open(o)===!1||("top"!=i.stack.push&&o.pnotify_position(!0),"fade"==i.animation||"fade"==i.animation.effect_in?o.show().fadeTo(0,0).hide():1!=i.opacity&&o.show().fadeTo(0,i.opacity).hide(),o.animate_in(function(){i.after_open&&i.after_open(o),o.pnotify_queue_position(),i.hide&&o.pnotify_queue_remove()}))},o.pnotify_remove=function(){o.timer&&(window.clearTimeout(o.timer),o.timer=null),i.before_close&&i.before_close(o)===!1||o.animate_out(function(){i.after_close&&i.after_close(o)===!1||(o.pnotify_queue_position(),i.remove&&o.detach())})},o.animate_in=function(a){h="in";var b;b="undefined"!=typeof i.animation.effect_in?i.animation.effect_in:i.animation,"none"==b?(o.show(),a()):"show"==b?o.show(i.animate_speed,a):"fade"==b?o.show().fadeTo(i.animate_speed,i.opacity,a):"slide"==b?o.slideDown(i.animate_speed,a):"function"==typeof b?b("in",a,o):o.show(b,"object"==typeof i.animation.options_in?i.animation.options_in:{},i.animate_speed,a)},o.animate_out=function(a){h="out";var b;b="undefined"!=typeof i.animation.effect_out?i.animation.effect_out:i.animation,"none"==b?(o.hide(),a()):"show"==b?o.hide(i.animate_speed,a):"fade"==b?o.fadeOut(i.animate_speed,a):"slide"==b?o.slideUp(i.animate_speed,a):"function"==typeof b?b("out",a,o):o.hide(b,"object"==typeof i.animation.options_out?i.animation.options_out:{},i.animate_speed,a)},o.pnotify_cancel_remove=function(){o.timer&&window.clearTimeout(o.timer)},o.pnotify_queue_remove=function(){o.pnotify_cancel_remove(),o.timer=window.setTimeout(function(){o.pnotify_remove()},isNaN(i.delay)?0:i.delay)},o.closer=a("<div />",{"class":"ui-pnotify-closer",css:{cursor:"pointer",visibility:i.closer_hover?"hidden":"visible"},click:function(){o.pnotify_remove(),o.sticker.css("visibility","hidden"),o.closer.css("visibility","hidden")}}).append(a("<span />",{"class":n.closer})).appendTo(o.container),(!i.closer||i.nonblock)&&o.closer.css("display","none"),o.sticker=a("<div />",{"class":"ui-pnotify-sticker",css:{cursor:"pointer",visibility:i.sticker_hover?"hidden":"visible"},click:function(){i.hide=!i.hide,i.hide?o.pnotify_queue_remove():o.pnotify_cancel_remove(),a(this).trigger("pnotify_icon")}}).bind("pnotify_icon",function(){a(this).children().removeClass(n.pin_up+" "+n.pin_down).addClass(i.hide?n.pin_up:n.pin_down)}).append(a("<span />",{"class":n.pin_up})).appendTo(o.container),(!i.sticker||i.nonblock)&&o.sticker.css("display","none"),i.icon!==!1&&a("<div />",{"class":"ui-pnotify-icon"}).append(a("<span />",{"class":i.icon===!0?"error"==i.type?n.error_icon:"info"==i.type?n.info_icon:"success"==i.type?n.success_icon:n.notice_icon:i.icon})).prependTo(o.container),o.title_container=a("<h4 />",{"class":"ui-pnotify-title"}).appendTo(o.container),i.title===!1?o.title_container.hide():i.title_escape?o.title_container.text(i.title):o.title_container.html(i.title),o.text_container=a("<div />",{"class":"ui-pnotify-text"}).appendTo(o.container),i.text===!1?o.text_container.hide():i.text_escape?o.text_container.text(i.text):o.text_container.html(i.insert_brs?String(i.text).replace(/\n/g,"<br />"):i.text),"string"==typeof i.width&&o.css("width",i.width),"string"==typeof i.min_height&&o.container.css("min-height",i.min_height),o.pnotify_history=i.history,o.pnotify_hide=i.hide;var p=e.data("pnotify");if((null==p||"object"!=typeof p)&&(p=[]),p="top"==i.stack.push?a.merge([o],p):a.merge(p,[o]),e.data("pnotify",p),"top"==i.stack.push&&o.pnotify_queue_position(1),i.after_init&&i.after_init(o),i.history){var q=e.data("pnotify_history");if("undefined"==typeof q){q=a("<div />",{"class":"ui-pnotify-history-container "+n.hi_menu,mouseleave:function(){q.animate({top:"-"+b+"px"},{duration:100,queue:!1})}}).append(a("<div />",{"class":"ui-pnotify-history-header",text:"Redisplay"})).append(a("<button />",{"class":"ui-pnotify-history-all "+n.hi_btn,text:"All",mouseenter:function(){a(this).addClass(n.hi_btnhov)},mouseleave:function(){a(this).removeClass(n.hi_btnhov)},click:function(){return a.each(p,function(){this.pnotify_history&&(this.is(":visible")?this.pnotify_hide&&this.pnotify_queue_remove():this.pnotify_display&&this.pnotify_display())}),!1}})).append(a("<button />",{"class":"ui-pnotify-history-last "+n.hi_btn,text:"Last",mouseenter:function(){a(this).addClass(n.hi_btnhov)},mouseleave:function(){a(this).removeClass(n.hi_btnhov)},click:function(){var a,b=-1;do{if(a=-1==b?p.slice(b):p.slice(b,b+1),!a[0])break;b--}while(!a[0].pnotify_history||a[0].is(":visible"));return a[0]?(a[0].pnotify_display&&a[0].pnotify_display(),!1):!1}})).appendTo(d);var r=a("<span />",{"class":"ui-pnotify-history-pulldown "+n.hi_hnd,mouseenter:function(){q.animate({top:"0"},{duration:100,queue:!1})}}).appendTo(q);b=r.offset().top+2,q.css({top:"-"+b+"px"}),e.data("pnotify_history",q)}}return i.stack.animation=!1,o.pnotify_display(),o}});var h=/^on/,i=/^(dbl)?click$|^mouse(move|down|up|over|out|enter|leave)$|^contextmenu$/,j=/^(focus|blur|select|change|reset)$|^key(press|down|up)$/,k=/^(scroll|resize|(un)?load|abort|error)$/,l=function(b,c){var d;if(b=b.toLowerCase(),document.createEvent&&this.dispatchEvent){if(b=b.replace(h,""),b.match(i)?(a(this).offset(),d=document.createEvent("MouseEvents"),d.initMouseEvent(b,c.bubbles,c.cancelable,c.view,c.detail,c.screenX,c.screenY,c.clientX,c.clientY,c.ctrlKey,c.altKey,c.shiftKey,c.metaKey,c.button,c.relatedTarget)):b.match(j)?(d=document.createEvent("UIEvents"),d.initUIEvent(b,c.bubbles,c.cancelable,c.view,c.detail)):b.match(k)&&(d=document.createEvent("HTMLEvents"),d.initEvent(b,c.bubbles,c.cancelable)),!d)return;this.dispatchEvent(d)}else b.match(h)||(b="on"+b),d=document.createEventObject(c),this.fireEvent(b,d)};a.pnotify.defaults={title:!1,title_escape:!1,text:!1,text_escape:!1,styling:"bootstrap",addclass:"",cornerclass:"",nonblock:!1,nonblock_opacity:.2,history:!0,width:"300px",min_height:"16px",type:"notice",icon:!0,animation:"fade",animate_speed:"slow",opacity:1,shadow:!0,closer:!0,closer_hover:!0,sticker:!0,sticker_hover:!0,hide:!0,delay:8e3,mouse_reset:!0,remove:!0,insert_brs:!0,stack:{dir1:"down",dir2:"left",push:"bottom",spacing1:25,spacing2:25}}}(jQuery),function(){"use strict";function a(a,b){return Math.abs(a-b)<1e-6
+}var b=function(){function b(b){var d=null,e=[],f=[],g=[],h=angular.extend({},c,b),i=this,j=null;this.center=b.center,this.zoom=h.zoom,this.draggable=h.draggable,this.dragging=!1,this.selector=h.container,this.markers=[],this.options=h.options,this.draw=function(){if(null!=i.center)if(null==d)d=new google.maps.Map(i.selector,angular.extend(i.options,{center:i.center,zoom:i.zoom,draggable:i.draggable,mapTypeId:google.maps.MapTypeId.ROADMAP})),google.maps.event.addListener(d,"dragstart",function(){i.dragging=!0}),google.maps.event.addListener(d,"idle",function(){i.dragging=!1}),google.maps.event.addListener(d,"drag",function(){i.dragging=!0}),google.maps.event.addListener(d,"zoom_changed",function(){i.zoom=d.getZoom(),i.center=d.getCenter()}),google.maps.event.addListener(d,"center_changed",function(){i.center=d.getCenter()}),f.length&&angular.forEach(f,function(a){google.maps.event.addListener(d,a.on,a.handler)});else{google.maps.event.trigger(d,"resize");var b=d.getCenter();a(b.lat(),i.center.lat())&&a(b.lng(),i.center.lng())||d.setCenter(i.center),d.getZoom()!=i.zoom&&d.setZoom(i.zoom)}},this.fit=function(){if(d&&e.length){var a=new google.maps.LatLngBounds;angular.forEach(e,function(b){a.extend(b.getPosition())}),d.fitBounds(a)}},this.on=function(a,b){f.push({on:a,handler:b})},this.addMarker=function(a,b,c,f,g,h,k){if(null==i.findMarker(a,b)){var l=new MarkerWithLabel({position:new google.maps.LatLng(a,b),draggable:!1,raiseOnDrag:!0,map:d,labelContent:g,labelAnchor:new google.maps.Point(25,0),labelClass:"marker-label",labelStyle:{opacity:1}});if(null!=f){var m=new google.maps.InfoWindow({content:f});google.maps.event.addListener(l,"click",function(){null!=j&&j.close(),m.open(d,l),j=m})}return e.unshift(l),i.markers.unshift({lat:a,lng:b,draggable:!1,icon:c,infoWindowContent:f,label:g,url:h,thumbnail:k}),l}},this.findMarker=function(b,c){for(var d=0;d<e.length;d++){var f=e[d].getPosition();if(a(f.lat(),b)&&a(f.lng(),c))return e[d]}return null},this.findMarkerIndex=function(b,c){for(var d=0;d<e.length;d++){var f=e[d].getPosition();if(a(f.lat(),b)&&a(f.lng(),c))return d}return-1},this.addInfoWindow=function(a,b,c){var d=new google.maps.InfoWindow({content:c,position:new google.maps.LatLng(a,b)});return g.push(d),d},this.hasMarker=function(a,b){return null!==i.findMarker(a,b)},this.getMarkerInstances=function(){return e},this.removeMarkers=function(a){var b=this;angular.forEach(a,function(a){var c=a.getPosition(),d=c.lat(),f=c.lng(),g=b.findMarkerIndex(d,f);e.splice(g,1),b.markers.splice(g,1),a.setMap(null)})}}var c={zoom:8,draggable:!1,container:null};return b}(),c=angular.module("google-maps",[]);c.directive("googleMap",["$log","$timeout","$filter",function(c,d){var e=function(a){var b=a.map;self.addInfoWindow=function(a,c,d){b.addInfoWindow(a,c,d)}};return e.$inject=["$scope","$element"],{restrict:"ECA",priority:100,transclude:!0,template:"<div class='angular-google-map' ng-transclude></div>",replace:!1,scope:{center:"=center",markers:"=markers",latitude:"=latitude",longitude:"=longitude",zoom:"=zoom",refresh:"&refresh",windows:"=windows",events:"=events"},controller:e,link:function(e,f,g){if(!angular.isDefined(e.center)||!angular.isDefined(e.center.latitude)||!angular.isDefined(e.center.longitude))return void c.error("angular-google-maps: could not find a valid center property");if(!angular.isDefined(e.zoom))return void c.error("angular-google-maps: map zoom property not set");angular.element(f).addClass("angular-google-map");var h={options:{}};g.options&&(h.options=angular.fromJson(g.options));var i=new b(angular.extend(h,{container:f[0],center:new google.maps.LatLng(e.center.latitude,e.center.longitude),draggable:"true"==g.draggable,zoom:e.zoom}));if(i.on("drag",function(){var a=i.center;d(function(){e.$apply(function(){e.center.latitude=a.lat(),e.center.longitude=a.lng()})})}),i.on("zoom_changed",function(){e.zoom!=i.zoom&&d(function(){e.$apply(function(){e.zoom=i.zoom})})}),i.on("center_changed",function(){var a=i.center;d(function(){e.$apply(function(){i.dragging||(e.center.latitude=a.lat(),e.center.longitude=a.lng())})})}),angular.isDefined(e.events))for(var j in e.events)e.events.hasOwnProperty(j)&&angular.isFunction(e.events[j])&&i.on(j,function(){e.events[j].apply(e,[i,j,arguments])});"true"==g.markClick&&!function(){var a=null;i.on("click",function(b){null==a?(a={latitude:b.latLng.lat(),longitude:b.latLng.lng()},e.markers.push(a)):(a.latitude=b.latLng.lat(),a.longitude=b.latLng.lng()),d(function(){e.latitude=a.latitude,e.longitude=a.longitude,e.$apply()})})}(),e.map=i,angular.isUndefined(e.refresh())?i.draw():e.$watch("refresh()",function(a,b){a&&!b&&i.draw()}),e.$watch("markers",function(b){d(function(){angular.forEach(b,function(a){i.hasMarker(a.latitude,a.longitude)||i.addMarker(a.latitude,a.longitude,a.icon,a.infoWindow,a.label)});var c=[];angular.forEach(i.getMarkerInstances(),function(b){for(var d=b.getPosition(),f=d.lat(),g=d.lng(),h=!1,i=0;i<e.markers.length;i++){var j=e.markers[i];a(j.latitude,f)&&a(j.longitude,g)&&(h=!0)}h||c.push(b)}),c.length&&i.removeMarkers(c),"true"==g.fit&&b&&b.length>1&&i.fit()})},!0),e.$watch("center",function(a,b){a!==b&&(i.dragging||(i.center=new google.maps.LatLng(a.latitude,a.longitude),i.draw()))},!0),e.$watch("zoom",function(a,b){a!==b&&(i.zoom=a,i.draw())})}}}])}(),function(){window.visibly={q:document,p:void 0,prefixes:["webkit","ms","o","moz","khtml"],props:["VisibilityState","visibilitychange","Hidden"],m:["focus","blur"],visibleCallbacks:[],hiddenCallbacks:[],genericCallbacks:[],_callbacks:[],cachedPrefix:"",fn:null,onVisible:function(a){"function"==typeof a&&this.visibleCallbacks.push(a)},onHidden:function(a){"function"==typeof a&&this.hiddenCallbacks.push(a)},getPrefix:function(){if(!this.cachedPrefix)for(var a=0;b=this.prefixes[a++];)if(b+this.props[2]in this.q)return this.cachedPrefix=b,this.cachedPrefix},visibilityState:function(){return this._getProp(0)},hidden:function(){return this._getProp(2)},visibilitychange:function(a){"function"==typeof a&&this.genericCallbacks.push(a);var b=this.genericCallbacks.length;if(b)if(this.cachedPrefix)for(;b--;)this.genericCallbacks[b].call(this,this.visibilityState());else for(;b--;)this.genericCallbacks[b].call(this,arguments[0])},isSupported:function(){return this.cachedPrefix+this.props[2]in this.q},_getProp:function(a){return this.q[this.cachedPrefix+this.props[a]]},_execute:function(a){if(a){this._callbacks=1==a?this.visibleCallbacks:this.hiddenCallbacks;for(var b=this._callbacks.length;b--;)this._callbacks[b]()}},_visible:function(){window.visibly._execute(1),window.visibly.visibilitychange.call(window.visibly,"visible")},_hidden:function(){window.visibly._execute(2),window.visibly.visibilitychange.call(window.visibly,"hidden")},_nativeSwitch:function(){this[this._getProp(2)?"_hidden":"_visible"]()},_listen:function(){try{this.isSupported()?this.q.addEventListener(this.cachedPrefix+this.props[1],function(){window.visibly._nativeSwitch.apply(window.visibly,arguments)},1):this.q.addEventListener?(window.addEventListener(this.m[0],this._visible,1),window.addEventListener(this.m[1],this._hidden,1)):this.q.attachEvent&&(this.q.attachEvent("onfocusin",this._visible),this.q.attachEvent("onfocusout",this._hidden))}catch(a){}},init:function(){this.getPrefix(),this._listen()}},this.visibly.init()}();
\ No newline at end of file
diff --git a/web/demos/package/app/scripts/d63799f1.plugins.js b/web/demos/package/app/scripts/d63799f1.plugins.js
new file mode 100644
index 0000000..52bdd31
--- /dev/null
+++ b/web/demos/package/app/scripts/d63799f1.plugins.js
@@ -0,0 +1,8 @@
+!function(a,b){function c(a){var b=a.length,c=ib.type(a);return ib.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||"function"!==c&&(0===b||"number"==typeof b&&b>0&&b-1 in a)}function d(a){var b=xb[a]={};return ib.each(a.match(kb)||[],function(a,c){b[c]=!0}),b}function e(a,c,d,e){if(ib.acceptData(a)){var f,g,h=ib.expando,i="string"==typeof c,j=a.nodeType,k=j?ib.cache:a,l=j?a[h]:a[h]&&h;if(l&&k[l]&&(e||k[l].data)||!i||d!==b)return l||(j?a[h]=l=_.pop()||ib.guid++:l=h),k[l]||(k[l]={},j||(k[l].toJSON=ib.noop)),("object"==typeof c||"function"==typeof c)&&(e?k[l]=ib.extend(k[l],c):k[l].data=ib.extend(k[l].data,c)),f=k[l],e||(f.data||(f.data={}),f=f.data),d!==b&&(f[ib.camelCase(c)]=d),i?(g=f[c],null==g&&(g=f[ib.camelCase(c)])):g=f,g}}function f(a,b,c){if(ib.acceptData(a)){var d,e,f,g=a.nodeType,i=g?ib.cache:a,j=g?a[ib.expando]:ib.expando;if(i[j]){if(b&&(f=c?i[j]:i[j].data)){ib.isArray(b)?b=b.concat(ib.map(b,ib.camelCase)):b in f?b=[b]:(b=ib.camelCase(b),b=b in f?[b]:b.split(" "));for(d=0,e=b.length;e>d;d++)delete f[b[d]];if(!(c?h:ib.isEmptyObject)(f))return}(c||(delete i[j].data,h(i[j])))&&(g?ib.cleanData([a],!0):ib.support.deleteExpando||i!=i.window?delete i[j]:i[j]=null)}}}function g(a,c,d){if(d===b&&1===a.nodeType){var e="data-"+c.replace(zb,"-$1").toLowerCase();if(d=a.getAttribute(e),"string"==typeof d){try{d="true"===d?!0:"false"===d?!1:"null"===d?null:+d+""===d?+d:yb.test(d)?ib.parseJSON(d):d}catch(f){}ib.data(a,c,d)}else d=b}return d}function h(a){var b;for(b in a)if(("data"!==b||!ib.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function i(){return!0}function j(){return!1}function k(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}function l(a,b,c){if(b=b||0,ib.isFunction(b))return ib.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return ib.grep(a,function(a){return a===b===c});if("string"==typeof b){var d=ib.grep(a,function(a){return 1===a.nodeType});if(Rb.test(b))return ib.filter(b,d,!c);b=ib.filter(b,d)}return ib.grep(a,function(a){return ib.inArray(a,b)>=0===c})}function m(a){var b=Ub.split("|"),c=a.createDocumentFragment();if(c.createElement)for(;b.length;)c.createElement(b.pop());return c}function n(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function o(a){var b=a.getAttributeNode("type");return a.type=(b&&b.specified)+"/"+a.type,a}function p(a){var b=ec.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function q(a,b){for(var c,d=0;null!=(c=a[d]);d++)ib._data(c,"globalEval",!b||ib._data(b[d],"globalEval"))}function r(a,b){if(1===b.nodeType&&ib.hasData(a)){var c,d,e,f=ib._data(a),g=ib._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)ib.event.add(b,c,h[c][d])}g.data&&(g.data=ib.extend({},g.data))}}function s(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!ib.support.noCloneEvent&&b[ib.expando]){e=ib._data(b);for(d in e.events)ib.removeEvent(b,d,e.handle);b.removeAttribute(ib.expando)}"script"===c&&b.text!==a.text?(o(b).text=a.text,p(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),ib.support.html5Clone&&a.innerHTML&&!ib.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&bc.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}function t(a,c){var d,e,f=0,g=typeof a.getElementsByTagName!==V?a.getElementsByTagName(c||"*"):typeof a.querySelectorAll!==V?a.querySelectorAll(c||"*"):b;if(!g)for(g=[],d=a.childNodes||a;null!=(e=d[f]);f++)!c||ib.nodeName(e,c)?g.push(e):ib.merge(g,t(e,c));return c===b||c&&ib.nodeName(a,c)?ib.merge([a],g):g}function u(a){bc.test(a.type)&&(a.defaultChecked=a.checked)}function v(a,b){if(b in a)return b;for(var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=yc.length;e--;)if(b=yc[e]+c,b in a)return b;return d}function w(a,b){return a=b||a,"none"===ib.css(a,"display")||!ib.contains(a.ownerDocument,a)}function x(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=ib._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&w(d)&&(f[g]=ib._data(d,"olddisplay",B(d.nodeName)))):f[g]||(e=w(d),(c&&"none"!==c||!e)&&ib._data(d,"olddisplay",e?c:ib.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function y(a,b,c){var d=rc.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function z(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=ib.css(a,c+xc[f],!0,e)),d?("content"===c&&(g-=ib.css(a,"padding"+xc[f],!0,e)),"margin"!==c&&(g-=ib.css(a,"border"+xc[f]+"Width",!0,e))):(g+=ib.css(a,"padding"+xc[f],!0,e),"padding"!==c&&(g+=ib.css(a,"border"+xc[f]+"Width",!0,e)));return g}function A(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=kc(a),g=ib.support.boxSizing&&"border-box"===ib.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=lc(a,b,f),(0>e||null==e)&&(e=a.style[b]),sc.test(e))return e;d=g&&(ib.support.boxSizingReliable||e===a.style[b]),e=parseFloat(e)||0}return e+z(a,b,c||(g?"border":"content"),d,f)+"px"}function B(a){var b=W,c=uc[a];return c||(c=C(a,b),"none"!==c&&c||(jc=(jc||ib("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(b.documentElement),b=(jc[0].contentWindow||jc[0].contentDocument).document,b.write("<!doctype html><html><body>"),b.close(),c=C(a,b),jc.detach()),uc[a]=c),c}function C(a,b){var c=ib(b.createElement(a)).appendTo(b.body),d=ib.css(c[0],"display");return c.remove(),d}function D(a,b,c,d){var e;if(ib.isArray(b))ib.each(b,function(b,e){c||Ac.test(a)?d(a,e):D(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==ib.type(b))d(a,b);else for(e in b)D(a+"["+e+"]",b[e],c,d)}function E(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(kb)||[];if(ib.isFunction(c))for(;d=f[e++];)"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function F(a,b,c,d){function e(h){var i;return f[h]=!0,ib.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||g||f[j]?g?!(i=j):void 0:(b.dataTypes.unshift(j),e(j),!1)}),i}var f={},g=a===Rc;return e(b.dataTypes[0])||!f["*"]&&e("*")}function G(a,c){var d,e,f=ib.ajaxSettings.flatOptions||{};for(e in c)c[e]!==b&&((f[e]?a:d||(d={}))[e]=c[e]);return d&&ib.extend(!0,a,d),a}function H(a,c,d){var e,f,g,h,i=a.contents,j=a.dataTypes,k=a.responseFields;for(h in k)h in d&&(c[k[h]]=d[h]);for(;"*"===j[0];)j.shift(),f===b&&(f=a.mimeType||c.getResponseHeader("Content-Type"));if(f)for(h in i)if(i[h]&&i[h].test(f)){j.unshift(h);break}if(j[0]in d)g=j[0];else{for(h in d){if(!j[0]||a.converters[h+" "+j[0]]){g=h;break}e||(e=h)}g=g||e}return g?(g!==j[0]&&j.unshift(g),d[g]):void 0}function I(a,b){var c,d,e,f,g={},h=0,i=a.dataTypes.slice(),j=i[0];if(a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i[1])for(e in a.converters)g[e.toLowerCase()]=a.converters[e];for(;d=i[++h];)if("*"!==d){if("*"!==j&&j!==d){if(e=g[j+" "+d]||g["* "+d],!e)for(c in g)if(f=c.split(" "),f[1]===d&&(e=g[j+" "+f[0]]||g["* "+f[0]])){e===!0?e=g[c]:g[c]!==!0&&(d=f[0],i.splice(h--,0,d));break}if(e!==!0)if(e&&a["throws"])b=e(b);else try{b=e(b)}catch(k){return{state:"parsererror",error:e?k:"No conversion from "+j+" to "+d}}}j=d}return{state:"success",data:b}}function J(){try{return new a.XMLHttpRequest}catch(b){}}function K(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function L(){return setTimeout(function(){$c=b}),$c=ib.now()}function M(a,b){ib.each(b,function(b,c){for(var d=(ed[b]||[]).concat(ed["*"]),e=0,f=d.length;f>e;e++)if(d[e].call(a,b,c))return})}function N(a,b,c){var d,e,f=0,g=dd.length,h=ib.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$c||L(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:ib.extend({},b),opts:ib.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$c||L(),duration:c.duration,tweens:[],createTween:function(b,c){var d=ib.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(O(k,j.opts.specialEasing);g>f;f++)if(d=dd[f].call(j,a,k,j.opts))return d;return M(j,k),ib.isFunction(j.opts.start)&&j.opts.start.call(a,j),ib.fx.timer(ib.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}function O(a,b){var c,d,e,f,g;for(e in a)if(d=ib.camelCase(e),f=b[d],c=a[e],ib.isArray(c)&&(f=c[1],c=a[e]=c[0]),e!==d&&(a[d]=c,delete a[e]),g=ib.cssHooks[d],g&&"expand"in g){c=g.expand(c),delete a[d];for(e in c)e in a||(a[e]=c[e],b[e]=f)}else b[d]=f}function P(a,b,c){var d,e,f,g,h,i,j,k,l,m=this,n=a.style,o={},p=[],q=a.nodeType&&w(a);c.queue||(k=ib._queueHooks(a,"fx"),null==k.unqueued&&(k.unqueued=0,l=k.empty.fire,k.empty.fire=function(){k.unqueued||l()}),k.unqueued++,m.always(function(){m.always(function(){k.unqueued--,ib.queue(a,"fx").length||k.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[n.overflow,n.overflowX,n.overflowY],"inline"===ib.css(a,"display")&&"none"===ib.css(a,"float")&&(ib.support.inlineBlockNeedsLayout&&"inline"!==B(a.nodeName)?n.zoom=1:n.display="inline-block")),c.overflow&&(n.overflow="hidden",ib.support.shrinkWrapBlocks||m.always(function(){n.overflow=c.overflow[0],n.overflowX=c.overflow[1],n.overflowY=c.overflow[2]}));for(e in b)if(g=b[e],ad.exec(g)){if(delete b[e],i=i||"toggle"===g,g===(q?"hide":"show"))continue;p.push(e)}if(f=p.length){h=ib._data(a,"fxshow")||ib._data(a,"fxshow",{}),"hidden"in h&&(q=h.hidden),i&&(h.hidden=!q),q?ib(a).show():m.done(function(){ib(a).hide()}),m.done(function(){var b;ib._removeData(a,"fxshow");for(b in o)ib.style(a,b,o[b])});for(e=0;f>e;e++)d=p[e],j=m.createTween(d,q?h[d]:0),o[d]=h[d]||ib.style(a,d),d in h||(h[d]=j.start,q&&(j.end=j.start,j.start="width"===d||"height"===d?1:0))}}function Q(a,b,c,d,e){return new Q.prototype.init(a,b,c,d,e)}function R(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=xc[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function S(a){return ib.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}var T,U,V=typeof b,W=a.document,X=a.location,Y=a.jQuery,Z=a.$,$={},_=[],ab="1.9.1",bb=_.concat,cb=_.push,db=_.slice,eb=_.indexOf,fb=$.toString,gb=$.hasOwnProperty,hb=ab.trim,ib=function(a,b){return new ib.fn.init(a,b,U)},jb=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,kb=/\S+/g,lb=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,mb=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,nb=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,ob=/^[\],:{}\s]*$/,pb=/(?:^|:|,)(?:\s*\[)+/g,qb=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,rb=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,sb=/^-ms-/,tb=/-([\da-z])/gi,ub=function(a,b){return b.toUpperCase()},vb=function(a){(W.addEventListener||"load"===a.type||"complete"===W.readyState)&&(wb(),ib.ready())},wb=function(){W.addEventListener?(W.removeEventListener("DOMContentLoaded",vb,!1),a.removeEventListener("load",vb,!1)):(W.detachEvent("onreadystatechange",vb),a.detachEvent("onload",vb))};ib.fn=ib.prototype={jquery:ab,constructor:ib,init:function(a,c,d){var e,f;if(!a)return this;if("string"==typeof a){if(e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:mb.exec(a),!e||!e[1]&&c)return!c||c.jquery?(c||d).find(a):this.constructor(c).find(a);if(e[1]){if(c=c instanceof ib?c[0]:c,ib.merge(this,ib.parseHTML(e[1],c&&c.nodeType?c.ownerDocument||c:W,!0)),nb.test(e[1])&&ib.isPlainObject(c))for(e in c)ib.isFunction(this[e])?this[e](c[e]):this.attr(e,c[e]);return this}if(f=W.getElementById(e[2]),f&&f.parentNode){if(f.id!==e[2])return d.find(a);this.length=1,this[0]=f}return this.context=W,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):ib.isFunction(a)?d.ready(a):(a.selector!==b&&(this.selector=a.selector,this.context=a.context),ib.makeArray(a,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return db.call(this)},get:function(a){return null==a?this.toArray():0>a?this[this.length+a]:this[a]},pushStack:function(a){var b=ib.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return ib.each(this,a,b)},ready:function(a){return ib.ready.promise().done(a),this},slice:function(){return this.pushStack(db.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},map:function(a){return this.pushStack(ib.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:cb,sort:[].sort,splice:[].splice},ib.fn.init.prototype=ib.fn,ib.extend=ib.fn.extend=function(){var a,c,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;for("boolean"==typeof h&&(k=h,h=arguments[1]||{},i=2),"object"==typeof h||ib.isFunction(h)||(h={}),j===i&&(h=this,--i);j>i;i++)if(null!=(f=arguments[i]))for(e in f)a=h[e],d=f[e],h!==d&&(k&&d&&(ib.isPlainObject(d)||(c=ib.isArray(d)))?(c?(c=!1,g=a&&ib.isArray(a)?a:[]):g=a&&ib.isPlainObject(a)?a:{},h[e]=ib.extend(k,g,d)):d!==b&&(h[e]=d));return h},ib.extend({noConflict:function(b){return a.$===ib&&(a.$=Z),b&&a.jQuery===ib&&(a.jQuery=Y),ib},isReady:!1,readyWait:1,holdReady:function(a){a?ib.readyWait++:ib.ready(!0)},ready:function(a){if(a===!0?!--ib.readyWait:!ib.isReady){if(!W.body)return setTimeout(ib.ready);ib.isReady=!0,a!==!0&&--ib.readyWait>0||(T.resolveWith(W,[ib]),ib.fn.trigger&&ib(W).trigger("ready").off("ready"))}},isFunction:function(a){return"function"===ib.type(a)},isArray:Array.isArray||function(a){return"array"===ib.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return null==a?String(a):"object"==typeof a||"function"==typeof a?$[fb.call(a)]||"object":typeof a},isPlainObject:function(a){if(!a||"object"!==ib.type(a)||a.nodeType||ib.isWindow(a))return!1;try{if(a.constructor&&!gb.call(a,"constructor")&&!gb.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||gb.call(a,d)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},error:function(a){throw new Error(a)},parseHTML:function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||W;var d=nb.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=ib.buildFragment([a],b,e),e&&ib(e).remove(),ib.merge([],d.childNodes))},parseJSON:function(b){return a.JSON&&a.JSON.parse?a.JSON.parse(b):null===b?b:"string"==typeof b&&(b=ib.trim(b),b&&ob.test(b.replace(qb,"@").replace(rb,"]").replace(pb,"")))?new Function("return "+b)():void ib.error("Invalid JSON: "+b)},parseXML:function(c){var d,e;if(!c||"string"!=typeof c)return null;try{a.DOMParser?(e=new DOMParser,d=e.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(f){d=b}return d&&d.documentElement&&!d.getElementsByTagName("parsererror").length||ib.error("Invalid XML: "+c),d},noop:function(){},globalEval:function(b){b&&ib.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(sb,"ms-").replace(tb,ub)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,d){var e,f=0,g=a.length,h=c(a);if(d){if(h)for(;g>f&&(e=b.apply(a[f],d),e!==!1);f++);else for(f in a)if(e=b.apply(a[f],d),e===!1)break}else if(h)for(;g>f&&(e=b.call(a[f],f,a[f]),e!==!1);f++);else for(f in a)if(e=b.call(a[f],f,a[f]),e===!1)break;return a},trim:hb&&!hb.call("﻿ ")?function(a){return null==a?"":hb.call(a)}:function(a){return null==a?"":(a+"").replace(lb,"")},makeArray:function(a,b){var d=b||[];return null!=a&&(c(Object(a))?ib.merge(d,"string"==typeof a?[a]:a):cb.call(d,a)),d},inArray:function(a,b,c){var d;if(b){if(eb)return eb.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=c.length,e=a.length,f=0;if("number"==typeof d)for(;d>f;f++)a[e++]=c[f];else for(;c[f]!==b;)a[e++]=c[f++];return a.length=e,a},grep:function(a,b,c){var d,e=[],f=0,g=a.length;for(c=!!c;g>f;f++)d=!!b(a[f],f),c!==d&&e.push(a[f]);return e},map:function(a,b,d){var e,f=0,g=a.length,h=c(a),i=[];if(h)for(;g>f;f++)e=b(a[f],f,d),null!=e&&(i[i.length]=e);else for(f in a)e=b(a[f],f,d),null!=e&&(i[i.length]=e);return bb.apply([],i)},guid:1,proxy:function(a,c){var d,e,f;return"string"==typeof c&&(f=a[c],c=a,a=f),ib.isFunction(a)?(d=db.call(arguments,2),e=function(){return a.apply(c||this,d.concat(db.call(arguments)))},e.guid=a.guid=a.guid||ib.guid++,e):b},access:function(a,c,d,e,f,g,h){var i=0,j=a.length,k=null==d;if("object"===ib.type(d)){f=!0;for(i in d)ib.access(a,c,i,d[i],!0,g,h)}else if(e!==b&&(f=!0,ib.isFunction(e)||(h=!0),k&&(h?(c.call(a,e),c=null):(k=c,c=function(a,b,c){return k.call(ib(a),c)})),c))for(;j>i;i++)c(a[i],d,h?e:e.call(a[i],i,c(a[i],d)));return f?a:k?c.call(a):j?c(a[0],d):g},now:function(){return(new Date).getTime()}}),ib.ready.promise=function(b){if(!T)if(T=ib.Deferred(),"complete"===W.readyState)setTimeout(ib.ready);else if(W.addEventListener)W.addEventListener("DOMContentLoaded",vb,!1),a.addEventListener("load",vb,!1);else{W.attachEvent("onreadystatechange",vb),a.attachEvent("onload",vb);var c=!1;try{c=null==a.frameElement&&W.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!ib.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}wb(),ib.ready()}}()}return T.promise(b)},ib.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){$["[object "+b+"]"]=b.toLowerCase()}),U=ib(W);var xb={};ib.Callbacks=function(a){a="string"==typeof a?xb[a]||d(a):ib.extend({},a);var c,e,f,g,h,i,j=[],k=!a.once&&[],l=function(b){for(e=a.memory&&b,f=!0,h=i||0,i=0,g=j.length,c=!0;j&&g>h;h++)if(j[h].apply(b[0],b[1])===!1&&a.stopOnFalse){e=!1;break}c=!1,j&&(k?k.length&&l(k.shift()):e?j=[]:m.disable())},m={add:function(){if(j){var b=j.length;!function d(b){ib.each(b,function(b,c){var e=ib.type(c);"function"===e?a.unique&&m.has(c)||j.push(c):c&&c.length&&"string"!==e&&d(c)})}(arguments),c?g=j.length:e&&(i=b,l(e))}return this},remove:function(){return j&&ib.each(arguments,function(a,b){for(var d;(d=ib.inArray(b,j,d))>-1;)j.splice(d,1),c&&(g>=d&&g--,h>=d&&h--)}),this},has:function(a){return a?ib.inArray(a,j)>-1:!(!j||!j.length)},empty:function(){return j=[],this},disable:function(){return j=k=e=b,this},disabled:function(){return!j},lock:function(){return k=b,e||m.disable(),this},locked:function(){return!k},fireWith:function(a,b){return b=b||[],b=[a,b.slice?b.slice():b],!j||f&&!k||(c?k.push(b):l(b)),this},fire:function(){return m.fireWith(this,arguments),this},fired:function(){return!!f}};return m},ib.extend({Deferred:function(a){var b=[["resolve","done",ib.Callbacks("once memory"),"resolved"],["reject","fail",ib.Callbacks("once memory"),"rejected"],["notify","progress",ib.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return ib.Deferred(function(c){ib.each(b,function(b,f){var g=f[0],h=ib.isFunction(a[b])&&a[b];e[f[1]](function(){var a=h&&h.apply(this,arguments);a&&ib.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[g+"With"](this===d?c.promise():this,h?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?ib.extend(a,d):d}},e={};return d.pipe=d.then,ib.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b,c,d,e=0,f=db.call(arguments),g=f.length,h=1!==g||a&&ib.isFunction(a.promise)?g:0,i=1===h?a:ib.Deferred(),j=function(a,c,d){return function(e){c[a]=this,d[a]=arguments.length>1?db.call(arguments):e,d===b?i.notifyWith(c,d):--h||i.resolveWith(c,d)}};if(g>1)for(b=new Array(g),c=new Array(g),d=new Array(g);g>e;e++)f[e]&&ib.isFunction(f[e].promise)?f[e].promise().done(j(e,d,f)).fail(i.reject).progress(j(e,c,b)):--h;return h||i.resolveWith(d,f),i.promise()}}),ib.support=function(){var b,c,d,e,f,g,h,i,j,k,l=W.createElement("div");if(l.setAttribute("className","t"),l.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",c=l.getElementsByTagName("*"),d=l.getElementsByTagName("a")[0],!c||!d||!c.length)return{};f=W.createElement("select"),h=f.appendChild(W.createElement("option")),e=l.getElementsByTagName("input")[0],d.style.cssText="top:1px;float:left;opacity:.5",b={getSetAttribute:"t"!==l.className,leadingWhitespace:3===l.firstChild.nodeType,tbody:!l.getElementsByTagName("tbody").length,htmlSerialize:!!l.getElementsByTagName("link").length,style:/top/.test(d.getAttribute("style")),hrefNormalized:"/a"===d.getAttribute("href"),opacity:/^0.5/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:!!e.value,optSelected:h.selected,enctype:!!W.createElement("form").enctype,html5Clone:"<:nav></:nav>"!==W.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===W.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},e.checked=!0,b.noCloneChecked=e.cloneNode(!0).checked,f.disabled=!0,b.optDisabled=!h.disabled;try{delete l.test}catch(m){b.deleteExpando=!1}e=W.createElement("input"),e.setAttribute("value",""),b.input=""===e.getAttribute("value"),e.value="t",e.setAttribute("type","radio"),b.radioValue="t"===e.value,e.setAttribute("checked","t"),e.setAttribute("name","t"),g=W.createDocumentFragment(),g.appendChild(e),b.appendChecked=e.checked,b.checkClone=g.cloneNode(!0).cloneNode(!0).lastChild.checked,l.attachEvent&&(l.attachEvent("onclick",function(){b.noCloneEvent=!1}),l.cloneNode(!0).click());for(k in{submit:!0,change:!0,focusin:!0})l.setAttribute(i="on"+k,"t"),b[k+"Bubbles"]=i in a||l.attributes[i].expando===!1;return l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",b.clearCloneStyle="content-box"===l.style.backgroundClip,ib(function(){var c,d,e,f="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",g=W.getElementsByTagName("body")[0];g&&(c=W.createElement("div"),c.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",g.appendChild(c).appendChild(l),l.innerHTML="<table><tr><td></td><td>t</td></tr></table>",e=l.getElementsByTagName("td"),e[0].style.cssText="padding:0;margin:0;border:0;display:none",j=0===e[0].offsetHeight,e[0].style.display="",e[1].style.display="none",b.reliableHiddenOffsets=j&&0===e[0].offsetHeight,l.innerHTML="",l.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",b.boxSizing=4===l.offsetWidth,b.doesNotIncludeMarginInBodyOffset=1!==g.offsetTop,a.getComputedStyle&&(b.pixelPosition="1%"!==(a.getComputedStyle(l,null)||{}).top,b.boxSizingReliable="4px"===(a.getComputedStyle(l,null)||{width:"4px"}).width,d=l.appendChild(W.createElement("div")),d.style.cssText=l.style.cssText=f,d.style.marginRight=d.style.width="0",l.style.width="1px",b.reliableMarginRight=!parseFloat((a.getComputedStyle(d,null)||{}).marginRight)),typeof l.style.zoom!==V&&(l.innerHTML="",l.style.cssText=f+"width:1px;padding:1px;display:inline;zoom:1",b.inlineBlockNeedsLayout=3===l.offsetWidth,l.style.display="block",l.innerHTML="<div></div>",l.firstChild.style.width="5px",b.shrinkWrapBlocks=3!==l.offsetWidth,b.inlineBlockNeedsLayout&&(g.style.zoom=1)),g.removeChild(c),c=l=e=d=null)}),c=f=g=h=d=e=null,b}();var yb=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,zb=/([A-Z])/g;ib.extend({cache:{},expando:"jQuery"+(ab+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){return a=a.nodeType?ib.cache[a[ib.expando]]:a[ib.expando],!!a&&!h(a)},data:function(a,b,c){return e(a,b,c)},removeData:function(a,b){return f(a,b)},_data:function(a,b,c){return e(a,b,c,!0)},_removeData:function(a,b){return f(a,b,!0)},acceptData:function(a){if(a.nodeType&&1!==a.nodeType&&9!==a.nodeType)return!1;var b=a.nodeName&&ib.noData[a.nodeName.toLowerCase()];return!b||b!==!0&&a.getAttribute("classid")===b}}),ib.fn.extend({data:function(a,c){var d,e,f=this[0],h=0,i=null;if(a===b){if(this.length&&(i=ib.data(f),1===f.nodeType&&!ib._data(f,"parsedAttrs"))){for(d=f.attributes;h<d.length;h++)e=d[h].name,e.indexOf("data-")||(e=ib.camelCase(e.slice(5)),g(f,e,i[e]));ib._data(f,"parsedAttrs",!0)}return i}return"object"==typeof a?this.each(function(){ib.data(this,a)}):ib.access(this,function(c){return c===b?f?g(f,a,ib.data(f,a)):null:void this.each(function(){ib.data(this,a,c)})},null,c,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){ib.removeData(this,a)})}}),ib.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=ib._data(a,b),c&&(!d||ib.isArray(c)?d=ib._data(a,b,ib.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=ib.queue(a,b),d=c.length,e=c.shift(),f=ib._queueHooks(a,b),g=function(){ib.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),f.cur=e,e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return ib._data(a,c)||ib._data(a,c,{empty:ib.Callbacks("once memory").add(function(){ib._removeData(a,b+"queue"),ib._removeData(a,c)})})}}),ib.fn.extend({queue:function(a,c){var d=2;return"string"!=typeof a&&(c=a,a="fx",d--),arguments.length<d?ib.queue(this[0],a):c===b?this:this.each(function(){var b=ib.queue(this,a,c);ib._queueHooks(this,a),"fx"===a&&"inprogress"!==b[0]&&ib.dequeue(this,a)})},dequeue:function(a){return this.each(function(){ib.dequeue(this,a)})},delay:function(a,b){return a=ib.fx?ib.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){var d,e=1,f=ib.Deferred(),g=this,h=this.length,i=function(){--e||f.resolveWith(g,[g])};for("string"!=typeof a&&(c=a,a=b),a=a||"fx";h--;)d=ib._data(g[h],a+"queueHooks"),d&&d.empty&&(e++,d.empty.add(i));return i(),f.promise(c)}});var Ab,Bb,Cb=/[\t\r\n]/g,Db=/\r/g,Eb=/^(?:input|select|textarea|button|object)$/i,Fb=/^(?:a|area)$/i,Gb=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,Hb=/^(?:checked|selected)$/i,Ib=ib.support.getSetAttribute,Jb=ib.support.input;ib.fn.extend({attr:function(a,b){return ib.access(this,ib.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){ib.removeAttr(this,a)})},prop:function(a,b){return ib.access(this,ib.prop,a,b,arguments.length>1)},removeProp:function(a){return a=ib.propFix[a]||a,this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,f,g=0,h=this.length,i="string"==typeof a&&a;if(ib.isFunction(a))return this.each(function(b){ib(this).addClass(a.call(this,b,this.className))});if(i)for(b=(a||"").match(kb)||[];h>g;g++)if(c=this[g],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(Cb," "):" ")){for(f=0;e=b[f++];)d.indexOf(" "+e+" ")<0&&(d+=e+" ");c.className=ib.trim(d)}return this},removeClass:function(a){var b,c,d,e,f,g=0,h=this.length,i=0===arguments.length||"string"==typeof a&&a;if(ib.isFunction(a))return this.each(function(b){ib(this).removeClass(a.call(this,b,this.className))});if(i)for(b=(a||"").match(kb)||[];h>g;g++)if(c=this[g],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(Cb," "):"")){for(f=0;e=b[f++];)for(;d.indexOf(" "+e+" ")>=0;)d=d.replace(" "+e+" "," ");c.className=a?ib.trim(d):""}return this},toggleClass:function(a,b){var c=typeof a,d="boolean"==typeof b;return this.each(ib.isFunction(a)?function(c){ib(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c)for(var e,f=0,g=ib(this),h=b,i=a.match(kb)||[];e=i[f++];)h=d?h:!g.hasClass(e),g[h?"addClass":"removeClass"](e);else(c===V||"boolean"===c)&&(this.className&&ib._data(this,"__className__",this.className),this.className=this.className||a===!1?"":ib._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(Cb," ").indexOf(b)>=0)return!0;return!1},val:function(a){var c,d,e,f=this[0];{if(arguments.length)return e=ib.isFunction(a),this.each(function(c){var f,g=ib(this);1===this.nodeType&&(f=e?a.call(this,c,g.val()):a,null==f?f="":"number"==typeof f?f+="":ib.isArray(f)&&(f=ib.map(f,function(a){return null==a?"":a+""})),d=ib.valHooks[this.type]||ib.valHooks[this.nodeName.toLowerCase()],d&&"set"in d&&d.set(this,f,"value")!==b||(this.value=f))});if(f)return d=ib.valHooks[f.type]||ib.valHooks[f.nodeName.toLowerCase()],d&&"get"in d&&(c=d.get(f,"value"))!==b?c:(c=f.value,"string"==typeof c?c.replace(Db,""):null==c?"":c)}}}),ib.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(ib.support.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&ib.nodeName(c.parentNode,"optgroup"))){if(b=ib(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c=ib.makeArray(b);return ib(a).find("option").each(function(){this.selected=ib.inArray(ib(this).val(),c)>=0}),c.length||(a.selectedIndex=-1),c}}},attr:function(a,c,d){var e,f,g,h=a.nodeType;if(a&&3!==h&&8!==h&&2!==h)return typeof a.getAttribute===V?ib.prop(a,c,d):(f=1!==h||!ib.isXMLDoc(a),f&&(c=c.toLowerCase(),e=ib.attrHooks[c]||(Gb.test(c)?Bb:Ab)),d===b?e&&f&&"get"in e&&null!==(g=e.get(a,c))?g:(typeof a.getAttribute!==V&&(g=a.getAttribute(c)),null==g?b:g):null!==d?e&&f&&"set"in e&&(g=e.set(a,d,c))!==b?g:(a.setAttribute(c,d+""),d):void ib.removeAttr(a,c))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(kb);if(f&&1===a.nodeType)for(;c=f[e++];)d=ib.propFix[c]||c,Gb.test(c)?!Ib&&Hb.test(c)?a[ib.camelCase("default-"+c)]=a[d]=!1:a[d]=!1:ib.attr(a,c,""),a.removeAttribute(Ib?c:d)},attrHooks:{type:{set:function(a,b){if(!ib.support.radioValue&&"radio"===b&&ib.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,f,g,h=a.nodeType;if(a&&3!==h&&8!==h&&2!==h)return g=1!==h||!ib.isXMLDoc(a),g&&(c=ib.propFix[c]||c,f=ib.propHooks[c]),d!==b?f&&"set"in f&&(e=f.set(a,d,c))!==b?e:a[c]=d:f&&"get"in f&&null!==(e=f.get(a,c))?e:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):Eb.test(a.nodeName)||Fb.test(a.nodeName)&&a.href?0:b}}}}),Bb={get:function(a,c){var d=ib.prop(a,c),e="boolean"==typeof d&&a.getAttribute(c),f="boolean"==typeof d?Jb&&Ib?null!=e:Hb.test(c)?a[ib.camelCase("default-"+c)]:!!e:a.getAttributeNode(c);return f&&f.value!==!1?c.toLowerCase():b
+},set:function(a,b,c){return b===!1?ib.removeAttr(a,c):Jb&&Ib||!Hb.test(c)?a.setAttribute(!Ib&&ib.propFix[c]||c,c):a[ib.camelCase("default-"+c)]=a[c]=!0,c}},Jb&&Ib||(ib.attrHooks.value={get:function(a,c){var d=a.getAttributeNode(c);return ib.nodeName(a,"input")?a.defaultValue:d&&d.specified?d.value:b},set:function(a,b,c){return ib.nodeName(a,"input")?void(a.defaultValue=b):Ab&&Ab.set(a,b,c)}}),Ib||(Ab=ib.valHooks.button={get:function(a,c){var d=a.getAttributeNode(c);return d&&("id"===c||"name"===c||"coords"===c?""!==d.value:d.specified)?d.value:b},set:function(a,c,d){var e=a.getAttributeNode(d);return e||a.setAttributeNode(e=a.ownerDocument.createAttribute(d)),e.value=c+="","value"===d||c===a.getAttribute(d)?c:b}},ib.attrHooks.contenteditable={get:Ab.get,set:function(a,b,c){Ab.set(a,""===b?!1:b,c)}},ib.each(["width","height"],function(a,b){ib.attrHooks[b]=ib.extend(ib.attrHooks[b],{set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}})})),ib.support.hrefNormalized||(ib.each(["href","src","width","height"],function(a,c){ib.attrHooks[c]=ib.extend(ib.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return null==d?b:d}})}),ib.each(["href","src"],function(a,b){ib.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}})),ib.support.style||(ib.attrHooks.style={get:function(a){return a.style.cssText||b},set:function(a,b){return a.style.cssText=b+""}}),ib.support.optSelected||(ib.propHooks.selected=ib.extend(ib.propHooks.selected,{get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}})),ib.support.enctype||(ib.propFix.enctype="encoding"),ib.support.checkOn||ib.each(["radio","checkbox"],function(){ib.valHooks[this]={get:function(a){return null===a.getAttribute("value")?"on":a.value}}}),ib.each(["radio","checkbox"],function(){ib.valHooks[this]=ib.extend(ib.valHooks[this],{set:function(a,b){return ib.isArray(b)?a.checked=ib.inArray(ib(a).val(),b)>=0:void 0}})});var Kb=/^(?:input|select|textarea)$/i,Lb=/^key/,Mb=/^(?:mouse|contextmenu)|click/,Nb=/^(?:focusinfocus|focusoutblur)$/,Ob=/^([^.]*)(?:\.(.+)|)$/;ib.event={global:{},add:function(a,c,d,e,f){var g,h,i,j,k,l,m,n,o,p,q,r=ib._data(a);if(r){for(d.handler&&(j=d,d=j.handler,f=j.selector),d.guid||(d.guid=ib.guid++),(h=r.events)||(h=r.events={}),(l=r.handle)||(l=r.handle=function(a){return typeof ib===V||a&&ib.event.triggered===a.type?b:ib.event.dispatch.apply(l.elem,arguments)},l.elem=a),c=(c||"").match(kb)||[""],i=c.length;i--;)g=Ob.exec(c[i])||[],o=q=g[1],p=(g[2]||"").split(".").sort(),k=ib.event.special[o]||{},o=(f?k.delegateType:k.bindType)||o,k=ib.event.special[o]||{},m=ib.extend({type:o,origType:q,data:e,handler:d,guid:d.guid,selector:f,needsContext:f&&ib.expr.match.needsContext.test(f),namespace:p.join(".")},j),(n=h[o])||(n=h[o]=[],n.delegateCount=0,k.setup&&k.setup.call(a,e,p,l)!==!1||(a.addEventListener?a.addEventListener(o,l,!1):a.attachEvent&&a.attachEvent("on"+o,l))),k.add&&(k.add.call(a,m),m.handler.guid||(m.handler.guid=d.guid)),f?n.splice(n.delegateCount++,0,m):n.push(m),ib.event.global[o]=!0;a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=ib.hasData(a)&&ib._data(a);if(q&&(k=q.events)){for(b=(b||"").match(kb)||[""],j=b.length;j--;)if(h=Ob.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){for(l=ib.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=k[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;f--;)g=m[f],!e&&p!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||ib.removeEvent(a,n,q.handle),delete k[n])}else for(n in k)ib.event.remove(a,n+b[j],c,d,!0);ib.isEmptyObject(k)&&(delete q.handle,ib._removeData(a,"events"))}},trigger:function(c,d,e,f){var g,h,i,j,k,l,m,n=[e||W],o=gb.call(c,"type")?c.type:c,p=gb.call(c,"namespace")?c.namespace.split("."):[];if(i=l=e=e||W,3!==e.nodeType&&8!==e.nodeType&&!Nb.test(o+ib.event.triggered)&&(o.indexOf(".")>=0&&(p=o.split("."),o=p.shift(),p.sort()),h=o.indexOf(":")<0&&"on"+o,c=c[ib.expando]?c:new ib.Event(o,"object"==typeof c&&c),c.isTrigger=!0,c.namespace=p.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,c.result=b,c.target||(c.target=e),d=null==d?[c]:ib.makeArray(d,[c]),k=ib.event.special[o]||{},f||!k.trigger||k.trigger.apply(e,d)!==!1)){if(!f&&!k.noBubble&&!ib.isWindow(e)){for(j=k.delegateType||o,Nb.test(j+o)||(i=i.parentNode);i;i=i.parentNode)n.push(i),l=i;l===(e.ownerDocument||W)&&n.push(l.defaultView||l.parentWindow||a)}for(m=0;(i=n[m++])&&!c.isPropagationStopped();)c.type=m>1?j:k.bindType||o,g=(ib._data(i,"events")||{})[c.type]&&ib._data(i,"handle"),g&&g.apply(i,d),g=h&&i[h],g&&ib.acceptData(i)&&g.apply&&g.apply(i,d)===!1&&c.preventDefault();if(c.type=o,!(f||c.isDefaultPrevented()||k._default&&k._default.apply(e.ownerDocument,d)!==!1||"click"===o&&ib.nodeName(e,"a")||!ib.acceptData(e)||!h||!e[o]||ib.isWindow(e))){l=e[h],l&&(e[h]=null),ib.event.triggered=o;try{e[o]()}catch(q){}ib.event.triggered=b,l&&(e[h]=l)}return c.result}},dispatch:function(a){a=ib.event.fix(a);var c,d,e,f,g,h=[],i=db.call(arguments),j=(ib._data(this,"events")||{})[a.type]||[],k=ib.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){for(h=ib.event.handlers.call(this,a,j),c=0;(f=h[c++])&&!a.isPropagationStopped();)for(a.currentTarget=f.elem,g=0;(e=f.handlers[g++])&&!a.isImmediatePropagationStopped();)(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,d=((ib.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),d!==b&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()));return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,c){var d,e,f,g,h=[],i=c.delegateCount,j=a.target;if(i&&j.nodeType&&(!a.button||"click"!==a.type))for(;j!=this;j=j.parentNode||this)if(1===j.nodeType&&(j.disabled!==!0||"click"!==a.type)){for(f=[],g=0;i>g;g++)e=c[g],d=e.selector+" ",f[d]===b&&(f[d]=e.needsContext?ib(d,this).index(j)>=0:ib.find(d,this,null,[j]).length),f[d]&&f.push(e);f.length&&h.push({elem:j,handlers:f})}return i<c.length&&h.push({elem:this,handlers:c.slice(i)}),h},fix:function(a){if(a[ib.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];for(g||(this.fixHooks[e]=g=Mb.test(e)?this.mouseHooks:Lb.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new ib.Event(f),b=d.length;b--;)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||W),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,c){var d,e,f,g=c.button,h=c.fromElement;return null==a.pageX&&null!=c.clientX&&(e=a.target.ownerDocument||W,f=e.documentElement,d=e.body,a.pageX=c.clientX+(f&&f.scrollLeft||d&&d.scrollLeft||0)-(f&&f.clientLeft||d&&d.clientLeft||0),a.pageY=c.clientY+(f&&f.scrollTop||d&&d.scrollTop||0)-(f&&f.clientTop||d&&d.clientTop||0)),!a.relatedTarget&&h&&(a.relatedTarget=h===a.target?c.toElement:h),a.which||g===b||(a.which=1&g?1:2&g?3:4&g?2:0),a}},special:{load:{noBubble:!0},click:{trigger:function(){return ib.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0}},focus:{trigger:function(){if(this!==W.activeElement&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===W.activeElement&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},beforeunload:{postDispatch:function(a){a.result!==b&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=ib.extend(new ib.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?ib.event.trigger(e,null,b):ib.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},ib.removeEvent=W.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===V&&(a[d]=null),a.detachEvent(d,c))},ib.Event=function(a,b){return this instanceof ib.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?i:j):this.type=a,b&&ib.extend(this,b),this.timeStamp=a&&a.timeStamp||ib.now(),void(this[ib.expando]=!0)):new ib.Event(a,b)},ib.Event.prototype={isDefaultPrevented:j,isPropagationStopped:j,isImmediatePropagationStopped:j,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=i,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=i,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=i,this.stopPropagation()}},ib.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){ib.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!ib.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),ib.support.submitBubbles||(ib.event.special.submit={setup:function(){return ib.nodeName(this,"form")?!1:void ib.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=ib.nodeName(c,"input")||ib.nodeName(c,"button")?c.form:b;d&&!ib._data(d,"submitBubbles")&&(ib.event.add(d,"submit._submit",function(a){a._submit_bubble=!0}),ib._data(d,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&ib.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return ib.nodeName(this,"form")?!1:void ib.event.remove(this,"._submit")}}),ib.support.changeBubbles||(ib.event.special.change={setup:function(){return Kb.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(ib.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),ib.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),ib.event.simulate("change",this,a,!0)})),!1):void ib.event.add(this,"beforeactivate._change",function(a){var b=a.target;Kb.test(b.nodeName)&&!ib._data(b,"changeBubbles")&&(ib.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||ib.event.simulate("change",this.parentNode,a,!0)}),ib._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return ib.event.remove(this,"._change"),!Kb.test(this.nodeName)}}),ib.support.focusinBubbles||ib.each({focus:"focusin",blur:"focusout"},function(a,b){var c=0,d=function(a){ib.event.simulate(b,a.target,ib.event.fix(a),!0)};ib.event.special[b]={setup:function(){0===c++&&W.addEventListener(a,d,!0)},teardown:function(){0===--c&&W.removeEventListener(a,d,!0)}}}),ib.fn.extend({on:function(a,c,d,e,f){var g,h;if("object"==typeof a){"string"!=typeof c&&(d=d||c,c=b);for(g in a)this.on(g,c,d,a[g],f);return this}if(null==d&&null==e?(e=c,d=c=b):null==e&&("string"==typeof c?(e=d,d=b):(e=d,d=c,c=b)),e===!1)e=j;else if(!e)return this;return 1===f&&(h=e,e=function(a){return ib().off(a),h.apply(this,arguments)},e.guid=h.guid||(h.guid=ib.guid++)),this.each(function(){ib.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,c,d){var e,f;if(a&&a.preventDefault&&a.handleObj)return e=a.handleObj,ib(a.delegateTarget).off(e.namespace?e.origType+"."+e.namespace:e.origType,e.selector,e.handler),this;if("object"==typeof a){for(f in a)this.off(f,c,a[f]);return this}return(c===!1||"function"==typeof c)&&(d=c,c=b),d===!1&&(d=j),this.each(function(){ib.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)},trigger:function(a,b){return this.each(function(){ib.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?ib.event.trigger(a,b,c,!0):void 0}}),function(a,b){function c(a){return ob.test(a+"")}function d(){var a,b=[];return a=function(c,d){return b.push(c+=" ")>y.cacheLength&&delete a[b.shift()],a[c]=d}}function e(a){return a[N]=!0,a}function f(a){var b=F.createElement("div");try{return a(b)}catch(c){return!1}finally{b=null}}function g(a,b,c,d){var e,f,g,h,i,j,k,n,o,p;if((b?b.ownerDocument||b:O)!==F&&E(b),b=b||F,c=c||[],!a||"string"!=typeof a)return c;if(1!==(h=b.nodeType)&&9!==h)return[];if(!H&&!d){if(e=pb.exec(a))if(g=e[1]){if(9===h){if(f=b.getElementById(g),!f||!f.parentNode)return c;if(f.id===g)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(g))&&L(b,f)&&f.id===g)return c.push(f),c}else{if(e[2])return Z.apply(c,$.call(b.getElementsByTagName(a),0)),c;if((g=e[3])&&P.getByClassName&&b.getElementsByClassName)return Z.apply(c,$.call(b.getElementsByClassName(g),0)),c}if(P.qsa&&!I.test(a)){if(k=!0,n=N,o=b,p=9===h&&a,1===h&&"object"!==b.nodeName.toLowerCase()){for(j=l(a),(k=b.getAttribute("id"))?n=k.replace(sb,"\\$&"):b.setAttribute("id",n),n="[id='"+n+"'] ",i=j.length;i--;)j[i]=n+m(j[i]);o=nb.test(a)&&b.parentNode||b,p=j.join(",")}if(p)try{return Z.apply(c,$.call(o.querySelectorAll(p),0)),c}catch(q){}finally{k||b.removeAttribute("id")}}}return u(a.replace(gb,"$1"),b,c,d)}function h(a,b){var c=b&&a,d=c&&(~b.sourceIndex||W)-(~a.sourceIndex||W);if(d)return d;if(c)for(;c=c.nextSibling;)if(c===b)return-1;return a?1:-1}function i(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function j(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function k(a){return e(function(b){return b=+b,e(function(c,d){for(var e,f=a([],c.length,b),g=f.length;g--;)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function l(a,b){var c,d,e,f,h,i,j,k=T[a+" "];if(k)return b?0:k.slice(0);for(h=a,i=[],j=y.preFilter;h;){(!c||(d=hb.exec(h)))&&(d&&(h=h.slice(d[0].length)||h),i.push(e=[])),c=!1,(d=jb.exec(h))&&(c=d.shift(),e.push({value:c,type:d[0].replace(gb," ")}),h=h.slice(c.length));for(f in y.filter)!(d=mb[f].exec(h))||j[f]&&!(d=j[f](d))||(c=d.shift(),e.push({value:c,type:f,matches:d}),h=h.slice(c.length));if(!c)break}return b?h.length:h?g.error(a):T(a,i).slice(0)}function m(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function n(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=R++;return b.first?function(b,c,f){for(;b=b[d];)if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=Q+" "+f;if(g){for(;b=b[d];)if((1===b.nodeType||e)&&a(b,c,g))return!0}else for(;b=b[d];)if(1===b.nodeType||e)if(j=b[N]||(b[N]={}),(i=j[d])&&i[0]===k){if((h=i[1])===!0||h===x)return h===!0}else if(i=j[d]=[k],i[1]=a(b,c,g)||x,i[1]===!0)return!0}}function o(a){return a.length>1?function(b,c,d){for(var e=a.length;e--;)if(!a[e](b,c,d))return!1;return!0}:a[0]}function p(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function q(a,b,c,d,f,g){return d&&!d[N]&&(d=q(d)),f&&!f[N]&&(f=q(f,g)),e(function(e,g,h,i){var j,k,l,m=[],n=[],o=g.length,q=e||t(b||"*",h.nodeType?[h]:h,[]),r=!a||!e&&b?q:p(q,m,a,h,i),s=c?f||(e?a:o||d)?[]:g:r;if(c&&c(r,s,h,i),d)for(j=p(s,n),d(j,[],h,i),k=j.length;k--;)(l=j[k])&&(s[n[k]]=!(r[n[k]]=l));if(e){if(f||a){if(f){for(j=[],k=s.length;k--;)(l=s[k])&&j.push(r[k]=l);f(null,s=[],j,i)}for(k=s.length;k--;)(l=s[k])&&(j=f?_.call(e,l):m[k])>-1&&(e[j]=!(g[j]=l))}}else s=p(s===g?s.splice(o,s.length):s),f?f(null,g,s,i):Z.apply(g,s)})}function r(a){for(var b,c,d,e=a.length,f=y.relative[a[0].type],g=f||y.relative[" "],h=f?1:0,i=n(function(a){return a===b},g,!0),j=n(function(a){return _.call(b,a)>-1},g,!0),k=[function(a,c,d){return!f&&(d||c!==D)||((b=c).nodeType?i(a,c,d):j(a,c,d))}];e>h;h++)if(c=y.relative[a[h].type])k=[n(o(k),c)];else{if(c=y.filter[a[h].type].apply(null,a[h].matches),c[N]){for(d=++h;e>d&&!y.relative[a[d].type];d++);return q(h>1&&o(k),h>1&&m(a.slice(0,h-1)).replace(gb,"$1"),c,d>h&&r(a.slice(h,d)),e>d&&r(a=a.slice(d)),e>d&&m(a))}k.push(c)}return o(k)}function s(a,b){var c=0,d=b.length>0,f=a.length>0,h=function(e,h,i,j,k){var l,m,n,o=[],q=0,r="0",s=e&&[],t=null!=k,u=D,v=e||f&&y.find.TAG("*",k&&h.parentNode||h),w=Q+=null==u?1:Math.random()||.1;for(t&&(D=h!==F&&h,x=c);null!=(l=v[r]);r++){if(f&&l){for(m=0;n=a[m++];)if(n(l,h,i)){j.push(l);break}t&&(Q=w,x=++c)}d&&((l=!n&&l)&&q--,e&&s.push(l))}if(q+=r,d&&r!==q){for(m=0;n=b[m++];)n(s,o,h,i);if(e){if(q>0)for(;r--;)s[r]||o[r]||(o[r]=Y.call(j));o=p(o)}Z.apply(j,o),t&&!e&&o.length>0&&q+b.length>1&&g.uniqueSort(j)}return t&&(Q=w,D=u),s};return d?e(h):h}function t(a,b,c){for(var d=0,e=b.length;e>d;d++)g(a,b[d],c);return c}function u(a,b,c,d){var e,f,g,h,i,j=l(a);if(!d&&1===j.length){if(f=j[0]=j[0].slice(0),f.length>2&&"ID"===(g=f[0]).type&&9===b.nodeType&&!H&&y.relative[f[1].type]){if(b=y.find.ID(g.matches[0].replace(ub,vb),b)[0],!b)return c;a=a.slice(f.shift().value.length)}for(e=mb.needsContext.test(a)?0:f.length;e--&&(g=f[e],!y.relative[h=g.type]);)if((i=y.find[h])&&(d=i(g.matches[0].replace(ub,vb),nb.test(f[0].type)&&b.parentNode||b))){if(f.splice(e,1),a=d.length&&m(f),!a)return Z.apply(c,$.call(d,0)),c;break}}return B(a,j)(d,b,H,c,nb.test(a)),c}function v(){}var w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N="sizzle"+-new Date,O=a.document,P={},Q=0,R=0,S=d(),T=d(),U=d(),V=typeof b,W=1<<31,X=[],Y=X.pop,Z=X.push,$=X.slice,_=X.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},ab="[\\x20\\t\\r\\n\\f]",bb="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",cb=bb.replace("w","w#"),db="([*^$|!~]?=)",eb="\\["+ab+"*("+bb+")"+ab+"*(?:"+db+ab+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+cb+")|)|)"+ab+"*\\]",fb=":("+bb+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+eb.replace(3,8)+")*)|.*)\\)|)",gb=new RegExp("^"+ab+"+|((?:^|[^\\\\])(?:\\\\.)*)"+ab+"+$","g"),hb=new RegExp("^"+ab+"*,"+ab+"*"),jb=new RegExp("^"+ab+"*([\\x20\\t\\r\\n\\f>+~])"+ab+"*"),kb=new RegExp(fb),lb=new RegExp("^"+cb+"$"),mb={ID:new RegExp("^#("+bb+")"),CLASS:new RegExp("^\\.("+bb+")"),NAME:new RegExp("^\\[name=['\"]?("+bb+")['\"]?\\]"),TAG:new RegExp("^("+bb.replace("w","w*")+")"),ATTR:new RegExp("^"+eb),PSEUDO:new RegExp("^"+fb),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ab+"*(even|odd|(([+-]|)(\\d*)n|)"+ab+"*(?:([+-]|)"+ab+"*(\\d+)|))"+ab+"*\\)|)","i"),needsContext:new RegExp("^"+ab+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ab+"*((?:-\\d)?\\d*)"+ab+"*\\)|)(?=[^-]|$)","i")},nb=/[\x20\t\r\n\f]*[+~]/,ob=/^[^{]+\{\s*\[native code/,pb=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,qb=/^(?:input|select|textarea|button)$/i,rb=/^h\d$/i,sb=/'|\\/g,tb=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,ub=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,vb=function(a,b){var c="0x"+b-65536;return c!==c?b:0>c?String.fromCharCode(c+65536):String.fromCharCode(c>>10|55296,1023&c|56320)};try{$.call(O.documentElement.childNodes,0)[0].nodeType}catch(wb){$=function(a){for(var b,c=[];b=this[a++];)c.push(b);return c}}A=g.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},E=g.setDocument=function(a){var d=a?a.ownerDocument||a:O;return d!==F&&9===d.nodeType&&d.documentElement?(F=d,G=d.documentElement,H=A(d),P.tagNameNoComments=f(function(a){return a.appendChild(d.createComment("")),!a.getElementsByTagName("*").length}),P.attributes=f(function(a){a.innerHTML="<select></select>";var b=typeof a.lastChild.getAttribute("multiple");return"boolean"!==b&&"string"!==b}),P.getByClassName=f(function(a){return a.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",a.getElementsByClassName&&a.getElementsByClassName("e").length?(a.lastChild.className="e",2===a.getElementsByClassName("e").length):!1}),P.getByName=f(function(a){a.id=N+0,a.innerHTML="<a name='"+N+"'></a><div name='"+N+"'></div>",G.insertBefore(a,G.firstChild);var b=d.getElementsByName&&d.getElementsByName(N).length===2+d.getElementsByName(N+0).length;return P.getIdNotName=!d.getElementById(N),G.removeChild(a),b}),y.attrHandle=f(function(a){return a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!==V&&"#"===a.firstChild.getAttribute("href")})?{}:{href:function(a){return a.getAttribute("href",2)},type:function(a){return a.getAttribute("type")}},P.getIdNotName?(y.find.ID=function(a,b){if(typeof b.getElementById!==V&&!H){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},y.filter.ID=function(a){var b=a.replace(ub,vb);return function(a){return a.getAttribute("id")===b}}):(y.find.ID=function(a,c){if(typeof c.getElementById!==V&&!H){var d=c.getElementById(a);return d?d.id===a||typeof d.getAttributeNode!==V&&d.getAttributeNode("id").value===a?[d]:b:[]}},y.filter.ID=function(a){var b=a.replace(ub,vb);return function(a){var c=typeof a.getAttributeNode!==V&&a.getAttributeNode("id");return c&&c.value===b}}),y.find.TAG=P.tagNameNoComments?function(a,b){return typeof b.getElementsByTagName!==V?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){for(;c=f[e++];)1===c.nodeType&&d.push(c);return d}return f},y.find.NAME=P.getByName&&function(a,b){return typeof b.getElementsByName!==V?b.getElementsByName(name):void 0},y.find.CLASS=P.getByClassName&&function(a,b){return typeof b.getElementsByClassName===V||H?void 0:b.getElementsByClassName(a)},J=[],I=[":focus"],(P.qsa=c(d.querySelectorAll))&&(f(function(a){a.innerHTML="<select><option selected=''></option></select>",a.querySelectorAll("[selected]").length||I.push("\\["+ab+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),a.querySelectorAll(":checked").length||I.push(":checked")}),f(function(a){a.innerHTML="<input type='hidden' i=''/>",a.querySelectorAll("[i^='']").length&&I.push("[*^$]="+ab+"*(?:\"\"|'')"),a.querySelectorAll(":enabled").length||I.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),I.push(",.*:")})),(P.matchesSelector=c(K=G.matchesSelector||G.mozMatchesSelector||G.webkitMatchesSelector||G.oMatchesSelector||G.msMatchesSelector))&&f(function(a){P.disconnectedMatch=K.call(a,"div"),K.call(a,"[s!='']:x"),J.push("!=",fb)}),I=new RegExp(I.join("|")),J=new RegExp(J.join("|")),L=c(G.contains)||G.compareDocumentPosition?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)for(;b=b.parentNode;)if(b===a)return!0;return!1},M=G.compareDocumentPosition?function(a,b){var c;return a===b?(C=!0,0):(c=b.compareDocumentPosition&&a.compareDocumentPosition&&a.compareDocumentPosition(b))?1&c||a.parentNode&&11===a.parentNode.nodeType?a===d||L(O,a)?-1:b===d||L(O,b)?1:0:4&c?-1:1:a.compareDocumentPosition?-1:1}:function(a,b){var c,e=0,f=a.parentNode,g=b.parentNode,i=[a],j=[b];if(a===b)return C=!0,0;if(!f||!g)return a===d?-1:b===d?1:f?-1:g?1:0;if(f===g)return h(a,b);for(c=a;c=c.parentNode;)i.unshift(c);for(c=b;c=c.parentNode;)j.unshift(c);for(;i[e]===j[e];)e++;return e?h(i[e],j[e]):i[e]===O?-1:j[e]===O?1:0},C=!1,[0,0].sort(M),P.detectDuplicates=C,F):F},g.matches=function(a,b){return g(a,null,null,b)},g.matchesSelector=function(a,b){if((a.ownerDocument||a)!==F&&E(a),b=b.replace(tb,"='$1']"),!(!P.matchesSelector||H||J&&J.test(b)||I.test(b)))try{var c=K.call(a,b);if(c||P.disconnectedMatch||a.document&&11!==a.document.nodeType)return c}catch(d){}return g(b,F,null,[a]).length>0},g.contains=function(a,b){return(a.ownerDocument||a)!==F&&E(a),L(a,b)},g.attr=function(a,b){var c;return(a.ownerDocument||a)!==F&&E(a),H||(b=b.toLowerCase()),(c=y.attrHandle[b])?c(a):H||P.attributes?a.getAttribute(b):((c=a.getAttributeNode(b))||a.getAttribute(b))&&a[b]===!0?b:c&&c.specified?c.value:null},g.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},g.uniqueSort=function(a){var b,c=[],d=1,e=0;if(C=!P.detectDuplicates,a.sort(M),C){for(;b=a[d];d++)b===a[d-1]&&(e=c.push(d));for(;e--;)a.splice(c[e],1)}return a},z=g.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(1===e||9===e||11===e){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=z(a)}else if(3===e||4===e)return a.nodeValue}else for(;b=a[d];d++)c+=z(b);return c},y=g.selectors={cacheLength:50,createPseudo:e,match:mb,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ub,vb),a[3]=(a[4]||a[5]||"").replace(ub,vb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||g.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&g.error(a[0]),a},PSEUDO:function(a){var b,c=!a[5]&&a[2];return mb.CHILD.test(a[0])?null:(a[4]?a[2]=a[4]:c&&kb.test(c)&&(b=l(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){return"*"===a?function(){return!0}:(a=a.replace(ub,vb).toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=S[a+" "];return b||(b=new RegExp("(^|"+ab+")"+a+"("+ab+"|$)"))&&S(a,function(a){return b.test(a.className||typeof a.getAttribute!==V&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=g.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){for(;p;){for(l=b;l=l[p];)if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){for(k=q[N]||(q[N]={}),j=k[a]||[],n=j[0]===Q&&j[1],m=j[0]===Q&&j[2],l=n&&q.childNodes[n];l=++n&&l&&l[p]||(m=n=0)||o.pop();)if(1===l.nodeType&&++m&&l===b){k[a]=[Q,n,m];break}}else if(s&&(j=(b[N]||(b[N]={}))[a])&&j[0]===Q)m=j[1];else for(;(l=++n&&l&&l[p]||(m=n=0)||o.pop())&&((h?l.nodeName.toLowerCase()!==r:1!==l.nodeType)||!++m||(s&&((l[N]||(l[N]={}))[a]=[Q,m]),l!==b)););return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,d=y.pseudos[a]||y.setFilters[a.toLowerCase()]||g.error("unsupported pseudo: "+a);return d[N]?d(b):d.length>1?(c=[a,a,"",b],y.setFilters.hasOwnProperty(a.toLowerCase())?e(function(a,c){for(var e,f=d(a,b),g=f.length;g--;)e=_.call(a,f[g]),a[e]=!(c[e]=f[g])}):function(a){return d(a,0,c)}):d}},pseudos:{not:e(function(a){var b=[],c=[],d=B(a.replace(gb,"$1"));return d[N]?e(function(a,b,c,e){for(var f,g=d(a,null,e,[]),h=a.length;h--;)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:e(function(a){return function(b){return g(a,b).length>0}}),contains:e(function(a){return function(b){return(b.textContent||b.innerText||z(b)).indexOf(a)>-1}}),lang:e(function(a){return lb.test(a||"")||g.error("unsupported lang: "+a),a=a.replace(ub,vb).toLowerCase(),function(b){var c;do if(c=H?b.getAttribute("xml:lang")||b.getAttribute("lang"):b.lang)return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===G},focus:function(a){return a===F.activeElement&&(!F.hasFocus||F.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeName>"@"||3===a.nodeType||4===a.nodeType)return!1;return!0},parent:function(a){return!y.pseudos.empty(a)},header:function(a){return rb.test(a.nodeName)},input:function(a){return qb.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||b.toLowerCase()===a.type)},first:k(function(){return[0]}),last:k(function(a,b){return[b-1]}),eq:k(function(a,b,c){return[0>c?c+b:c]}),even:k(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:k(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:k(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:k(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}};for(w in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})y.pseudos[w]=i(w);for(w in{submit:!0,reset:!0})y.pseudos[w]=j(w);B=g.compile=function(a,b){var c,d=[],e=[],f=U[a+" "];if(!f){for(b||(b=l(a)),c=b.length;c--;)f=r(b[c]),f[N]?d.push(f):e.push(f);f=U(a,s(e,d))}return f},y.pseudos.nth=y.pseudos.eq,y.filters=v.prototype=y.pseudos,y.setFilters=new v,E(),g.attr=ib.attr,ib.find=g,ib.expr=g.selectors,ib.expr[":"]=ib.expr.pseudos,ib.unique=g.uniqueSort,ib.text=g.getText,ib.isXMLDoc=g.isXML,ib.contains=g.contains}(a);var Pb=/Until$/,Qb=/^(?:parents|prev(?:Until|All))/,Rb=/^.[^:#\[\.,]*$/,Sb=ib.expr.match.needsContext,Tb={children:!0,contents:!0,next:!0,prev:!0};ib.fn.extend({find:function(a){var b,c,d,e=this.length;if("string"!=typeof a)return d=this,this.pushStack(ib(a).filter(function(){for(b=0;e>b;b++)if(ib.contains(d[b],this))return!0}));for(c=[],b=0;e>b;b++)ib.find(a,this[b],c);return c=this.pushStack(e>1?ib.unique(c):c),c.selector=(this.selector?this.selector+" ":"")+a,c},has:function(a){var b,c=ib(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(ib.contains(this,c[b]))return!0})},not:function(a){return this.pushStack(l(this,a,!1))},filter:function(a){return this.pushStack(l(this,a,!0))},is:function(a){return!!a&&("string"==typeof a?Sb.test(a)?ib(a,this.context).index(this[0])>=0:ib.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=Sb.test(a)||"string"!=typeof a?ib(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c.ownerDocument&&c!==b&&11!==c.nodeType;){if(g?g.index(c)>-1:ib.find.matchesSelector(c,a)){f.push(c);break}c=c.parentNode}return this.pushStack(f.length>1?ib.unique(f):f)},index:function(a){return a?"string"==typeof a?ib.inArray(this[0],ib(a)):ib.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){var c="string"==typeof a?ib(a,b):ib.makeArray(a&&a.nodeType?[a]:a),d=ib.merge(this.get(),c);return this.pushStack(ib.unique(d))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}}),ib.fn.andSelf=ib.fn.addBack,ib.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return ib.dir(a,"parentNode")},parentsUntil:function(a,b,c){return ib.dir(a,"parentNode",c)},next:function(a){return k(a,"nextSibling")
+},prev:function(a){return k(a,"previousSibling")},nextAll:function(a){return ib.dir(a,"nextSibling")},prevAll:function(a){return ib.dir(a,"previousSibling")},nextUntil:function(a,b,c){return ib.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return ib.dir(a,"previousSibling",c)},siblings:function(a){return ib.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return ib.sibling(a.firstChild)},contents:function(a){return ib.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:ib.merge([],a.childNodes)}},function(a,b){ib.fn[a]=function(c,d){var e=ib.map(this,b,c);return Pb.test(a)||(d=c),d&&"string"==typeof d&&(e=ib.filter(d,e)),e=this.length>1&&!Tb[a]?ib.unique(e):e,this.length>1&&Qb.test(a)&&(e=e.reverse()),this.pushStack(e)}}),ib.extend({filter:function(a,b,c){return c&&(a=":not("+a+")"),1===b.length?ib.find.matchesSelector(b[0],a)?[b[0]]:[]:ib.find.matches(a,b)},dir:function(a,c,d){for(var e=[],f=a[c];f&&9!==f.nodeType&&(d===b||1!==f.nodeType||!ib(f).is(d));)1===f.nodeType&&e.push(f),f=f[c];return e},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}});var Ub="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",Vb=/ jQuery\d+="(?:null|\d+)"/g,Wb=new RegExp("<(?:"+Ub+")[\\s/>]","i"),Xb=/^\s+/,Yb=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,Zb=/<([\w:]+)/,$b=/<tbody/i,_b=/<|&#?\w+;/,ac=/<(?:script|style|link)/i,bc=/^(?:checkbox|radio)$/i,cc=/checked\s*(?:[^=]|=\s*.checked.)/i,dc=/^$|\/(?:java|ecma)script/i,ec=/^true\/(.*)/,fc=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,gc={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:ib.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},hc=m(W),ic=hc.appendChild(W.createElement("div"));gc.optgroup=gc.option,gc.tbody=gc.tfoot=gc.colgroup=gc.caption=gc.thead,gc.th=gc.td,ib.fn.extend({text:function(a){return ib.access(this,function(a){return a===b?ib.text(this):this.empty().append((this[0]&&this[0].ownerDocument||W).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(ib.isFunction(a))return this.each(function(b){ib(this).wrapAll(a.call(this,b))});if(this[0]){var b=ib(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){for(var a=this;a.firstChild&&1===a.firstChild.nodeType;)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(ib.isFunction(a)?function(b){ib(this).wrapInner(a.call(this,b))}:function(){var b=ib(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=ib.isFunction(a);return this.each(function(c){ib(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){ib.nodeName(this,"body")||ib(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(a,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,!1,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=0;null!=(c=this[d]);d++)(!a||ib.filter(a,[c]).length>0)&&(b||1!==c.nodeType||ib.cleanData(t(c)),c.parentNode&&(b&&ib.contains(c.ownerDocument,c)&&q(t(c,"script")),c.parentNode.removeChild(c)));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){for(1===a.nodeType&&ib.cleanData(t(a,!1));a.firstChild;)a.removeChild(a.firstChild);a.options&&ib.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return ib.clone(this,a,b)})},html:function(a){return ib.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return 1===c.nodeType?c.innerHTML.replace(Vb,""):b;if(!("string"!=typeof a||ac.test(a)||!ib.support.htmlSerialize&&Wb.test(a)||!ib.support.leadingWhitespace&&Xb.test(a)||gc[(Zb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(Yb,"<$1></$2>");try{for(;e>d;d++)c=this[d]||{},1===c.nodeType&&(ib.cleanData(t(c,!1)),c.innerHTML=a);c=0}catch(f){}}c&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(a){var b=ib.isFunction(a);return b||"string"==typeof a||(a=ib(a).not(this).detach()),this.domManip([a],!0,function(a){var b=this.nextSibling,c=this.parentNode;c&&(ib(this).remove(),c.insertBefore(a,b))})},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){a=bb.apply([],a);var e,f,g,h,i,j,k=0,l=this.length,m=this,q=l-1,r=a[0],s=ib.isFunction(r);if(s||!(1>=l||"string"!=typeof r||ib.support.checkClone)&&cc.test(r))return this.each(function(e){var f=m.eq(e);s&&(a[0]=r.call(this,e,c?f.html():b)),f.domManip(a,c,d)});if(l&&(j=ib.buildFragment(a,this[0].ownerDocument,!1,this),e=j.firstChild,1===j.childNodes.length&&(j=e),e)){for(c=c&&ib.nodeName(e,"tr"),h=ib.map(t(j,"script"),o),g=h.length;l>k;k++)f=j,k!==q&&(f=ib.clone(f,!0,!0),g&&ib.merge(h,t(f,"script"))),d.call(c&&ib.nodeName(this[k],"table")?n(this[k],"tbody"):this[k],f,k);if(g)for(i=h[h.length-1].ownerDocument,ib.map(h,p),k=0;g>k;k++)f=h[k],dc.test(f.type||"")&&!ib._data(f,"globalEval")&&ib.contains(i,f)&&(f.src?ib.ajax({url:f.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):ib.globalEval((f.text||f.textContent||f.innerHTML||"").replace(fc,"")));j=e=null}return this}}),ib.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){ib.fn[a]=function(a){for(var c,d=0,e=[],f=ib(a),g=f.length-1;g>=d;d++)c=d===g?this:this.clone(!0),ib(f[d])[b](c),cb.apply(e,c.get());return this.pushStack(e)}}),ib.extend({clone:function(a,b,c){var d,e,f,g,h,i=ib.contains(a.ownerDocument,a);if(ib.support.html5Clone||ib.isXMLDoc(a)||!Wb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ic.innerHTML=a.outerHTML,ic.removeChild(f=ic.firstChild)),!(ib.support.noCloneEvent&&ib.support.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||ib.isXMLDoc(a)))for(d=t(f),h=t(a),g=0;null!=(e=h[g]);++g)d[g]&&s(e,d[g]);if(b)if(c)for(h=h||t(a),d=d||t(f),g=0;null!=(e=h[g]);g++)r(e,d[g]);else r(a,f);return d=t(f,"script"),d.length>0&&q(d,!i&&t(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k,l=a.length,n=m(b),o=[],p=0;l>p;p++)if(f=a[p],f||0===f)if("object"===ib.type(f))ib.merge(o,f.nodeType?[f]:f);else if(_b.test(f)){for(h=h||n.appendChild(b.createElement("div")),i=(Zb.exec(f)||["",""])[1].toLowerCase(),k=gc[i]||gc._default,h.innerHTML=k[1]+f.replace(Yb,"<$1></$2>")+k[2],e=k[0];e--;)h=h.lastChild;if(!ib.support.leadingWhitespace&&Xb.test(f)&&o.push(b.createTextNode(Xb.exec(f)[0])),!ib.support.tbody)for(f="table"!==i||$b.test(f)?"<table>"!==k[1]||$b.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;e--;)ib.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j);for(ib.merge(o,h.childNodes),h.textContent="";h.firstChild;)h.removeChild(h.firstChild);h=n.lastChild}else o.push(b.createTextNode(f));for(h&&n.removeChild(h),ib.support.appendChecked||ib.grep(t(o,"input"),u),p=0;f=o[p++];)if((!d||-1===ib.inArray(f,d))&&(g=ib.contains(f.ownerDocument,f),h=t(n.appendChild(f),"script"),g&&q(h),c))for(e=0;f=h[e++];)dc.test(f.type||"")&&c.push(f);return h=null,n},cleanData:function(a,b){for(var c,d,e,f,g=0,h=ib.expando,i=ib.cache,j=ib.support.deleteExpando,k=ib.event.special;null!=(c=a[g]);g++)if((b||ib.acceptData(c))&&(e=c[h],f=e&&i[e])){if(f.events)for(d in f.events)k[d]?ib.event.remove(c,d):ib.removeEvent(c,d,f.handle);i[e]&&(delete i[e],j?delete c[h]:typeof c.removeAttribute!==V?c.removeAttribute(h):c[h]=null,_.push(e))}}});var jc,kc,lc,mc=/alpha\([^)]*\)/i,nc=/opacity\s*=\s*([^)]*)/,oc=/^(top|right|bottom|left)$/,pc=/^(none|table(?!-c[ea]).+)/,qc=/^margin/,rc=new RegExp("^("+jb+")(.*)$","i"),sc=new RegExp("^("+jb+")(?!px)[a-z%]+$","i"),tc=new RegExp("^([+-])=("+jb+")","i"),uc={BODY:"block"},vc={position:"absolute",visibility:"hidden",display:"block"},wc={letterSpacing:0,fontWeight:400},xc=["Top","Right","Bottom","Left"],yc=["Webkit","O","Moz","ms"];ib.fn.extend({css:function(a,c){return ib.access(this,function(a,c,d){var e,f,g={},h=0;if(ib.isArray(c)){for(f=kc(a),e=c.length;e>h;h++)g[c[h]]=ib.css(a,c[h],!1,f);return g}return d!==b?ib.style(a,c,d):ib.css(a,c)},a,c,arguments.length>1)},show:function(){return x(this,!0)},hide:function(){return x(this)},toggle:function(a){var b="boolean"==typeof a;return this.each(function(){(b?a:w(this))?ib(this).show():ib(this).hide()})}}),ib.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=lc(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":ib.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var f,g,h,i=ib.camelCase(c),j=a.style;if(c=ib.cssProps[i]||(ib.cssProps[i]=v(j,i)),h=ib.cssHooks[c]||ib.cssHooks[i],d===b)return h&&"get"in h&&(f=h.get(a,!1,e))!==b?f:j[c];if(g=typeof d,"string"===g&&(f=tc.exec(d))&&(d=(f[1]+1)*f[2]+parseFloat(ib.css(a,c)),g="number"),!(null==d||"number"===g&&isNaN(d)||("number"!==g||ib.cssNumber[i]||(d+="px"),ib.support.clearCloneStyle||""!==d||0!==c.indexOf("background")||(j[c]="inherit"),h&&"set"in h&&(d=h.set(a,d,e))===b)))try{j[c]=d}catch(k){}}},css:function(a,c,d,e){var f,g,h,i=ib.camelCase(c);return c=ib.cssProps[i]||(ib.cssProps[i]=v(a.style,i)),h=ib.cssHooks[c]||ib.cssHooks[i],h&&"get"in h&&(g=h.get(a,!0,d)),g===b&&(g=lc(a,c,e)),"normal"===g&&c in wc&&(g=wc[c]),""===d||d?(f=parseFloat(g),d===!0||ib.isNumeric(f)?f||0:g):g},swap:function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e}}),a.getComputedStyle?(kc=function(b){return a.getComputedStyle(b,null)},lc=function(a,c,d){var e,f,g,h=d||kc(a),i=h?h.getPropertyValue(c)||h[c]:b,j=a.style;return h&&(""!==i||ib.contains(a.ownerDocument,a)||(i=ib.style(a,c)),sc.test(i)&&qc.test(c)&&(e=j.width,f=j.minWidth,g=j.maxWidth,j.minWidth=j.maxWidth=j.width=i,i=h.width,j.width=e,j.minWidth=f,j.maxWidth=g)),i}):W.documentElement.currentStyle&&(kc=function(a){return a.currentStyle},lc=function(a,c,d){var e,f,g,h=d||kc(a),i=h?h[c]:b,j=a.style;return null==i&&j&&j[c]&&(i=j[c]),sc.test(i)&&!oc.test(c)&&(e=j.left,f=a.runtimeStyle,g=f&&f.left,g&&(f.left=a.currentStyle.left),j.left="fontSize"===c?"1em":i,i=j.pixelLeft+"px",j.left=e,g&&(f.left=g)),""===i?"auto":i}),ib.each(["height","width"],function(a,b){ib.cssHooks[b]={get:function(a,c,d){return c?0===a.offsetWidth&&pc.test(ib.css(a,"display"))?ib.swap(a,vc,function(){return A(a,b,d)}):A(a,b,d):void 0},set:function(a,c,d){var e=d&&kc(a);return y(a,c,d?z(a,b,d,ib.support.boxSizing&&"border-box"===ib.css(a,"boxSizing",!1,e),e):0)}}}),ib.support.opacity||(ib.cssHooks.opacity={get:function(a,b){return nc.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=ib.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===ib.trim(f.replace(mc,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=mc.test(f)?f.replace(mc,e):f+" "+e)}}),ib(function(){ib.support.reliableMarginRight||(ib.cssHooks.marginRight={get:function(a,b){return b?ib.swap(a,{display:"inline-block"},lc,[a,"marginRight"]):void 0}}),!ib.support.pixelPosition&&ib.fn.position&&ib.each(["top","left"],function(a,b){ib.cssHooks[b]={get:function(a,c){return c?(c=lc(a,b),sc.test(c)?ib(a).position()[b]+"px":c):void 0}}})}),ib.expr&&ib.expr.filters&&(ib.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!ib.support.reliableHiddenOffsets&&"none"===(a.style&&a.style.display||ib.css(a,"display"))},ib.expr.filters.visible=function(a){return!ib.expr.filters.hidden(a)}),ib.each({margin:"",padding:"",border:"Width"},function(a,b){ib.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+xc[d]+b]=f[d]||f[d-2]||f[0];return e}},qc.test(a)||(ib.cssHooks[a+b].set=y)});var zc=/%20/g,Ac=/\[\]$/,Bc=/\r?\n/g,Cc=/^(?:submit|button|image|reset|file)$/i,Dc=/^(?:input|select|textarea|keygen)/i;ib.fn.extend({serialize:function(){return ib.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=ib.prop(this,"elements");return a?ib.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!ib(this).is(":disabled")&&Dc.test(this.nodeName)&&!Cc.test(a)&&(this.checked||!bc.test(a))}).map(function(a,b){var c=ib(this).val();return null==c?null:ib.isArray(c)?ib.map(c,function(a){return{name:b.name,value:a.replace(Bc,"\r\n")}}):{name:b.name,value:c.replace(Bc,"\r\n")}}).get()}}),ib.param=function(a,c){var d,e=[],f=function(a,b){b=ib.isFunction(b)?b():null==b?"":b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(c===b&&(c=ib.ajaxSettings&&ib.ajaxSettings.traditional),ib.isArray(a)||a.jquery&&!ib.isPlainObject(a))ib.each(a,function(){f(this.name,this.value)});else for(d in a)D(d,a[d],c,f);return e.join("&").replace(zc,"+")},ib.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){ib.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),ib.fn.hover=function(a,b){return this.mouseenter(a).mouseleave(b||a)};var Ec,Fc,Gc=ib.now(),Hc=/\?/,Ic=/#.*$/,Jc=/([?&])_=[^&]*/,Kc=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Lc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mc=/^(?:GET|HEAD)$/,Nc=/^\/\//,Oc=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Pc=ib.fn.load,Qc={},Rc={},Sc="*/".concat("*");try{Fc=X.href}catch(Tc){Fc=W.createElement("a"),Fc.href="",Fc=Fc.href}Ec=Oc.exec(Fc.toLowerCase())||[],ib.fn.load=function(a,c,d){if("string"!=typeof a&&Pc)return Pc.apply(this,arguments);var e,f,g,h=this,i=a.indexOf(" ");return i>=0&&(e=a.slice(i,a.length),a=a.slice(0,i)),ib.isFunction(c)?(d=c,c=b):c&&"object"==typeof c&&(g="POST"),h.length>0&&ib.ajax({url:a,type:g,dataType:"html",data:c}).done(function(a){f=arguments,h.html(e?ib("<div>").append(ib.parseHTML(a)).find(e):a)}).complete(d&&function(a,b){h.each(d,f||[a.responseText,b,a])}),this},ib.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){ib.fn[b]=function(a){return this.on(b,a)}}),ib.each(["get","post"],function(a,c){ib[c]=function(a,d,e,f){return ib.isFunction(d)&&(f=f||e,e=d,d=b),ib.ajax({url:a,type:c,dataType:f,data:d,success:e})}}),ib.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Fc,type:"GET",isLocal:Lc.test(Ec[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Sc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":ib.parseJSON,"text xml":ib.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?G(G(a,ib.ajaxSettings),b):G(ib.ajaxSettings,a)},ajaxPrefilter:E(Qc),ajaxTransport:E(Rc),ajax:function(a,c){function d(a,c,d,e){var f,l,s,t,v,x=c;2!==u&&(u=2,i&&clearTimeout(i),k=b,h=e||"",w.readyState=a>0?4:0,d&&(t=H(m,w,d)),a>=200&&300>a||304===a?(m.ifModified&&(v=w.getResponseHeader("Last-Modified"),v&&(ib.lastModified[g]=v),v=w.getResponseHeader("etag"),v&&(ib.etag[g]=v)),204===a?(f=!0,x="nocontent"):304===a?(f=!0,x="notmodified"):(f=I(m,t),x=f.state,l=f.data,s=f.error,f=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),w.status=a,w.statusText=(c||x)+"",f?p.resolveWith(n,[l,x,w]):p.rejectWith(n,[w,x,s]),w.statusCode(r),r=b,j&&o.trigger(f?"ajaxSuccess":"ajaxError",[w,m,f?l:s]),q.fireWith(n,[w,x]),j&&(o.trigger("ajaxComplete",[w,m]),--ib.active||ib.event.trigger("ajaxStop")))}"object"==typeof a&&(c=a,a=b),c=c||{};var e,f,g,h,i,j,k,l,m=ib.ajaxSetup({},c),n=m.context||m,o=m.context&&(n.nodeType||n.jquery)?ib(n):ib.event,p=ib.Deferred(),q=ib.Callbacks("once memory"),r=m.statusCode||{},s={},t={},u=0,v="canceled",w={readyState:0,getResponseHeader:function(a){var b;if(2===u){if(!l)for(l={};b=Kc.exec(h);)l[b[1].toLowerCase()]=b[2];b=l[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===u?h:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return u||(a=t[c]=t[c]||a,s[a]=b),this},overrideMimeType:function(a){return u||(m.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>u)for(b in a)r[b]=[r[b],a[b]];else w.always(a[w.status]);return this},abort:function(a){var b=a||v;return k&&k.abort(b),d(0,b),this}};if(p.promise(w).complete=q.add,w.success=w.done,w.error=w.fail,m.url=((a||m.url||Fc)+"").replace(Ic,"").replace(Nc,Ec[1]+"//"),m.type=c.method||c.type||m.method||m.type,m.dataTypes=ib.trim(m.dataType||"*").toLowerCase().match(kb)||[""],null==m.crossDomain&&(e=Oc.exec(m.url.toLowerCase()),m.crossDomain=!(!e||e[1]===Ec[1]&&e[2]===Ec[2]&&(e[3]||("http:"===e[1]?80:443))==(Ec[3]||("http:"===Ec[1]?80:443)))),m.data&&m.processData&&"string"!=typeof m.data&&(m.data=ib.param(m.data,m.traditional)),F(Qc,m,c,w),2===u)return w;j=m.global,j&&0===ib.active++&&ib.event.trigger("ajaxStart"),m.type=m.type.toUpperCase(),m.hasContent=!Mc.test(m.type),g=m.url,m.hasContent||(m.data&&(g=m.url+=(Hc.test(g)?"&":"?")+m.data,delete m.data),m.cache===!1&&(m.url=Jc.test(g)?g.replace(Jc,"$1_="+Gc++):g+(Hc.test(g)?"&":"?")+"_="+Gc++)),m.ifModified&&(ib.lastModified[g]&&w.setRequestHeader("If-Modified-Since",ib.lastModified[g]),ib.etag[g]&&w.setRequestHeader("If-None-Match",ib.etag[g])),(m.data&&m.hasContent&&m.contentType!==!1||c.contentType)&&w.setRequestHeader("Content-Type",m.contentType),w.setRequestHeader("Accept",m.dataTypes[0]&&m.accepts[m.dataTypes[0]]?m.accepts[m.dataTypes[0]]+("*"!==m.dataTypes[0]?", "+Sc+"; q=0.01":""):m.accepts["*"]);for(f in m.headers)w.setRequestHeader(f,m.headers[f]);if(m.beforeSend&&(m.beforeSend.call(n,w,m)===!1||2===u))return w.abort();v="abort";for(f in{success:1,error:1,complete:1})w[f](m[f]);if(k=F(Rc,m,c,w)){w.readyState=1,j&&o.trigger("ajaxSend",[w,m]),m.async&&m.timeout>0&&(i=setTimeout(function(){w.abort("timeout")},m.timeout));try{u=1,k.send(s,d)}catch(x){if(!(2>u))throw x;d(-1,x)}}else d(-1,"No Transport");return w},getScript:function(a,c){return ib.get(a,b,c,"script")},getJSON:function(a,b,c){return ib.get(a,b,c,"json")}}),ib.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return ib.globalEval(a),a}}}),ib.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),ib.ajaxTransport("script",function(a){if(a.crossDomain){var c,d=W.head||ib("head")[0]||W.documentElement;return{send:function(b,e){c=W.createElement("script"),c.async=!0,a.scriptCharset&&(c.charset=a.scriptCharset),c.src=a.url,c.onload=c.onreadystatechange=function(a,b){(b||!c.readyState||/loaded|complete/.test(c.readyState))&&(c.onload=c.onreadystatechange=null,c.parentNode&&c.parentNode.removeChild(c),c=null,b||e(200,"success"))},d.insertBefore(c,d.firstChild)},abort:function(){c&&c.onload(b,!0)}}}});var Uc=[],Vc=/(=)\?(?=&|$)|\?\?/;ib.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Uc.pop()||ib.expando+"_"+Gc++;return this[a]=!0,a}}),ib.ajaxPrefilter("json jsonp",function(c,d,e){var f,g,h,i=c.jsonp!==!1&&(Vc.test(c.url)?"url":"string"==typeof c.data&&!(c.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vc.test(c.data)&&"data");return i||"jsonp"===c.dataTypes[0]?(f=c.jsonpCallback=ib.isFunction(c.jsonpCallback)?c.jsonpCallback():c.jsonpCallback,i?c[i]=c[i].replace(Vc,"$1"+f):c.jsonp!==!1&&(c.url+=(Hc.test(c.url)?"&":"?")+c.jsonp+"="+f),c.converters["script json"]=function(){return h||ib.error(f+" was not called"),h[0]},c.dataTypes[0]="json",g=a[f],a[f]=function(){h=arguments},e.always(function(){a[f]=g,c[f]&&(c.jsonpCallback=d.jsonpCallback,Uc.push(f)),h&&ib.isFunction(g)&&g(h[0]),h=g=b}),"script"):void 0});var Wc,Xc,Yc=0,Zc=a.ActiveXObject&&function(){var a;for(a in Wc)Wc[a](b,!0)};ib.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&J()||K()}:J,Xc=ib.ajaxSettings.xhr(),ib.support.cors=!!Xc&&"withCredentials"in Xc,Xc=ib.support.ajax=!!Xc,Xc&&ib.ajaxTransport(function(c){if(!c.crossDomain||ib.support.cors){var d;return{send:function(e,f){var g,h,i=c.xhr();if(c.username?i.open(c.type,c.url,c.async,c.username,c.password):i.open(c.type,c.url,c.async),c.xhrFields)for(h in c.xhrFields)i[h]=c.xhrFields[h];c.mimeType&&i.overrideMimeType&&i.overrideMimeType(c.mimeType),c.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");try{for(h in e)i.setRequestHeader(h,e[h])}catch(j){}i.send(c.hasContent&&c.data||null),d=function(a,e){var h,j,k,l;try{if(d&&(e||4===i.readyState))if(d=b,g&&(i.onreadystatechange=ib.noop,Zc&&delete Wc[g]),e)4!==i.readyState&&i.abort();else{l={},h=i.status,j=i.getAllResponseHeaders(),"string"==typeof i.responseText&&(l.text=i.responseText);try{k=i.statusText}catch(m){k=""}h||!c.isLocal||c.crossDomain?1223===h&&(h=204):h=l.text?200:404}}catch(n){e||f(-1,n)}l&&f(h,k,l,j)},c.async?4===i.readyState?setTimeout(d):(g=++Yc,Zc&&(Wc||(Wc={},ib(a).unload(Zc)),Wc[g]=d),i.onreadystatechange=d):d()},abort:function(){d&&d(b,!0)}}}});var $c,_c,ad=/^(?:toggle|show|hide)$/,bd=new RegExp("^(?:([+-])=|)("+jb+")([a-z%]*)$","i"),cd=/queueHooks$/,dd=[P],ed={"*":[function(a,b){var c,d,e=this.createTween(a,b),f=bd.exec(b),g=e.cur(),h=+g||0,i=1,j=20;if(f){if(c=+f[2],d=f[3]||(ib.cssNumber[a]?"":"px"),"px"!==d&&h){h=ib.css(e.elem,a,!0)||c||1;do i=i||".5",h/=i,ib.style(e.elem,a,h+d);while(i!==(i=e.cur()/g)&&1!==i&&--j)}e.unit=d,e.start=h,e.end=f[1]?h+(f[1]+1)*c:c}return e}]};ib.Animation=ib.extend(N,{tweener:function(a,b){ib.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],ed[c]=ed[c]||[],ed[c].unshift(b)},prefilter:function(a,b){b?dd.unshift(a):dd.push(a)}}),ib.Tween=Q,Q.prototype={constructor:Q,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(ib.cssNumber[c]?"":"px")},cur:function(){var a=Q.propHooks[this.prop];return a&&a.get?a.get(this):Q.propHooks._default.get(this)},run:function(a){var b,c=Q.propHooks[this.prop];return this.pos=b=this.options.duration?ib.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Q.propHooks._default.set(this),this}},Q.prototype.init.prototype=Q.prototype,Q.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=ib.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){ib.fx.step[a.prop]?ib.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[ib.cssProps[a.prop]]||ib.cssHooks[a.prop])?ib.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Q.propHooks.scrollTop=Q.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},ib.each(["toggle","show","hide"],function(a,b){var c=ib.fn[b];ib.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(R(b,!0),a,d,e)}}),ib.fn.extend({fadeTo:function(a,b,c,d){return this.filter(w).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=ib.isEmptyObject(a),f=ib.speed(b,c,d),g=function(){var b=N(this,ib.extend({},a),f);g.finish=function(){b.stop(!0)},(e||ib._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,c,d){var e=function(a){var b=a.stop;delete a.stop,b(d)};return"string"!=typeof a&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,c=null!=a&&a+"queueHooks",f=ib.timers,g=ib._data(this);if(c)g[c]&&g[c].stop&&e(g[c]);else for(c in g)g[c]&&g[c].stop&&cd.test(c)&&e(g[c]);for(c=f.length;c--;)f[c].elem!==this||null!=a&&f[c].queue!==a||(f[c].anim.stop(d),b=!1,f.splice(c,1));(b||!d)&&ib.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=ib._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=ib.timers,g=d?d.length:0;for(c.finish=!0,ib.queue(this,a,[]),e&&e.cur&&e.cur.finish&&e.cur.finish.call(this),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),ib.each({slideDown:R("show"),slideUp:R("hide"),slideToggle:R("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){ib.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),ib.speed=function(a,b,c){var d=a&&"object"==typeof a?ib.extend({},a):{complete:c||!c&&b||ib.isFunction(a)&&a,duration:a,easing:c&&b||b&&!ib.isFunction(b)&&b};return d.duration=ib.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in ib.fx.speeds?ib.fx.speeds[d.duration]:ib.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){ib.isFunction(d.old)&&d.old.call(this),d.queue&&ib.dequeue(this,d.queue)},d},ib.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},ib.timers=[],ib.fx=Q.prototype.init,ib.fx.tick=function(){var a,c=ib.timers,d=0;for($c=ib.now();d<c.length;d++)a=c[d],a()||c[d]!==a||c.splice(d--,1);c.length||ib.fx.stop(),$c=b},ib.fx.timer=function(a){a()&&ib.timers.push(a)&&ib.fx.start()},ib.fx.interval=13,ib.fx.start=function(){_c||(_c=setInterval(ib.fx.tick,ib.fx.interval))},ib.fx.stop=function(){clearInterval(_c),_c=null},ib.fx.speeds={slow:600,fast:200,_default:400},ib.fx.step={},ib.expr&&ib.expr.filters&&(ib.expr.filters.animated=function(a){return ib.grep(ib.timers,function(b){return a===b.elem}).length}),ib.fn.offset=function(a){if(arguments.length)return a===b?this:this.each(function(b){ib.offset.setOffset(this,a,b)});var c,d,e={top:0,left:0},f=this[0],g=f&&f.ownerDocument;if(g)return c=g.documentElement,ib.contains(c,f)?(typeof f.getBoundingClientRect!==V&&(e=f.getBoundingClientRect()),d=S(g),{top:e.top+(d.pageYOffset||c.scrollTop)-(c.clientTop||0),left:e.left+(d.pageXOffset||c.scrollLeft)-(c.clientLeft||0)}):e},ib.offset={setOffset:function(a,b,c){var d=ib.css(a,"position");"static"===d&&(a.style.position="relative");var e,f,g=ib(a),h=g.offset(),i=ib.css(a,"top"),j=ib.css(a,"left"),k=("absolute"===d||"fixed"===d)&&ib.inArray("auto",[i,j])>-1,l={},m={};k?(m=g.position(),e=m.top,f=m.left):(e=parseFloat(i)||0,f=parseFloat(j)||0),ib.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(l.top=b.top-h.top+e),null!=b.left&&(l.left=b.left-h.left+f),"using"in b?b.using.call(a,l):g.css(l)}},ib.fn.extend({position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===ib.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),ib.nodeName(a[0],"html")||(c=a.offset()),c.top+=ib.css(a[0],"borderTopWidth",!0),c.left+=ib.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-ib.css(d,"marginTop",!0),left:b.left-c.left-ib.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||W.documentElement;a&&!ib.nodeName(a,"html")&&"static"===ib.css(a,"position");)a=a.offsetParent;return a||W.documentElement})}}),ib.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);ib.fn[a]=function(e){return ib.access(this,function(a,e,f){var g=S(a);return f===b?g?c in g?g[c]:g.document.documentElement[e]:a[e]:void(g?g.scrollTo(d?ib(g).scrollLeft():f,d?f:ib(g).scrollTop()):a[e]=f)},a,e,arguments.length,null)}}),ib.each({Height:"height",Width:"width"},function(a,c){ib.each({padding:"inner"+a,content:c,"":"outer"+a},function(d,e){ib.fn[e]=function(e,f){var g=arguments.length&&(d||"boolean"!=typeof e),h=d||(e===!0||f===!0?"margin":"border");return ib.access(this,function(c,d,e){var f;return ib.isWindow(c)?c.document.documentElement["client"+a]:9===c.nodeType?(f=c.documentElement,Math.max(c.body["scroll"+a],f["scroll"+a],c.body["offset"+a],f["offset"+a],f["client"+a])):e===b?ib.css(c,d,h):ib.style(c,d,e,h)},c,g?e:b,g,null)}})}),a.jQuery=a.$=ib,"function"==typeof define&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return ib})}(window),function(a,b,c){"use strict";function d(a){return function(){var b,c,d=arguments[0],e="["+(a?a+":":"")+d+"] ",f=arguments[1],g=arguments,h=function(a){return"function"==typeof a?a.toString().replace(/ \{[\s\S]*$/,""):"undefined"==typeof a?"undefined":"string"!=typeof a?JSON.stringify(a):a};for(b=e+f.replace(/\{\d+\}/g,function(a){var b,c=+a.slice(1,-1);return c+2<g.length?(b=g[c+2],"function"==typeof b?b.toString().replace(/ ?\{[\s\S]*$/,""):"undefined"==typeof b?"undefined":"string"!=typeof b?R(b):b):a}),b=b+"\nhttp://errors.angularjs.org/1.2.18-build.233+sha.e906aaf/"+(a?a+"/":"")+d,c=2;c<arguments.length;c++)b=b+(2==c?"?":"&")+"p"+(c-2)+"="+encodeURIComponent(h(arguments[c]));return new Error(b)}}function e(a){if(null==a||A(a))return!1;var b=a.length;return 1===a.nodeType&&b?!0:u(a)||x(a)||0===b||"number"==typeof b&&b>0&&b-1 in a}function f(a,b,c){var d;if(a)if(y(a))for(d in a)"prototype"==d||"length"==d||"name"==d||a.hasOwnProperty&&!a.hasOwnProperty(d)||b.call(c,a[d],d);else if(a.forEach&&a.forEach!==f)a.forEach(b,c);else if(e(a))for(d=0;d<a.length;d++)b.call(c,a[d],d);else for(d in a)a.hasOwnProperty(d)&&b.call(c,a[d],d);return a}function g(a){var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c);return b.sort()}function h(a,b,c){for(var d=g(a),e=0;e<d.length;e++)b.call(c,a[d[e]],d[e]);return d}function i(a){return function(b,c){a(c,b)}}function j(){for(var a,b=Bd.length;b;){if(b--,a=Bd[b].charCodeAt(0),57==a)return Bd[b]="A",Bd.join("");if(90!=a)return Bd[b]=String.fromCharCode(a+1),Bd.join("");Bd[b]="0"}return Bd.unshift("0"),Bd.join("")}function k(a,b){b?a.$$hashKey=b:delete a.$$hashKey}function l(a){var b=a.$$hashKey;return f(arguments,function(b){b!==a&&f(b,function(b,c){a[c]=b})}),k(a,b),a}function m(a){return parseInt(a,10)}function n(a,b){return l(new(l(function(){},{prototype:a})),b)}function o(){}function p(a){return a}function q(a){return function(){return a}}function r(a){return"undefined"==typeof a}function s(a){return"undefined"!=typeof a}function t(a){return null!=a&&"object"==typeof a}function u(a){return"string"==typeof a}function v(a){return"number"==typeof a}function w(a){return"[object Date]"===yd.call(a)}function x(a){return"[object Array]"===yd.call(a)}function y(a){return"function"==typeof a}function z(a){return"[object RegExp]"===yd.call(a)}function A(a){return a&&a.document&&a.location&&a.alert&&a.setInterval}function B(a){return a&&a.$evalAsync&&a.$watch}function C(a){return"[object File]"===yd.call(a)}function D(a){return"[object Blob]"===yd.call(a)}function E(a){return!(!a||!(a.nodeName||a.prop&&a.attr&&a.find))}function F(a,b,c){var d=[];return f(a,function(a,e,f){d.push(b.call(c,a,e,f))}),d}function G(a,b){return-1!=H(a,b)}function H(a,b){if(a.indexOf)return a.indexOf(b);
+for(var c=0;c<a.length;c++)if(b===a[c])return c;return-1}function I(a,b){var c=H(a,b);return c>=0&&a.splice(c,1),b}function J(a,b,c,d){if(A(a)||B(a))throw zd("cpws","Can't copy! Making copies of Window or Scope instances is not supported.");if(b){if(a===b)throw zd("cpi","Can't copy! Source and destination are identical.");if(c=c||[],d=d||[],t(a)){var e=H(c,a);if(-1!==e)return d[e];c.push(a),d.push(b)}var g;if(x(a)){b.length=0;for(var h=0;h<a.length;h++)g=J(a[h],null,c,d),t(a[h])&&(c.push(a[h]),d.push(g)),b.push(g)}else{var i=b.$$hashKey;f(b,function(a,c){delete b[c]});for(var j in a)g=J(a[j],null,c,d),t(a[j])&&(c.push(a[j]),d.push(g)),b[j]=g;k(b,i)}}else b=a,a&&(x(a)?b=J(a,[],c,d):w(a)?b=new Date(a.getTime()):z(a)?b=new RegExp(a.source):t(a)&&(b=J(a,{},c,d)));return b}function K(a,b){if(x(a)){b=b||[];for(var c=0;c<a.length;c++)b[c]=a[c]}else if(t(a)){b=b||{};for(var d in a)!nd.call(a,d)||"$"===d.charAt(0)&&"$"===d.charAt(1)||(b[d]=a[d])}return b||a}function L(a,b){if(a===b)return!0;if(null===a||null===b)return!1;if(a!==a&&b!==b)return!0;var d,e,f,g=typeof a,h=typeof b;if(g==h&&"object"==g){if(!x(a)){if(w(a))return w(b)&&a.getTime()==b.getTime();if(z(a)&&z(b))return a.toString()==b.toString();if(B(a)||B(b)||A(a)||A(b)||x(b))return!1;f={};for(e in a)if("$"!==e.charAt(0)&&!y(a[e])){if(!L(a[e],b[e]))return!1;f[e]=!0}for(e in b)if(!f.hasOwnProperty(e)&&"$"!==e.charAt(0)&&b[e]!==c&&!y(b[e]))return!1;return!0}if(!x(b))return!1;if((d=a.length)==b.length){for(e=0;d>e;e++)if(!L(a[e],b[e]))return!1;return!0}}return!1}function M(){return b.securityPolicy&&b.securityPolicy.isActive||b.querySelector&&!(!b.querySelector("[ng-csp]")&&!b.querySelector("[data-ng-csp]"))}function N(a,b,c){return a.concat(wd.call(b,c))}function O(a,b){return wd.call(a,b||0)}function P(a,b){var c=arguments.length>2?O(arguments,2):[];return!y(b)||b instanceof RegExp?b:c.length?function(){return arguments.length?b.apply(a,c.concat(wd.call(arguments,0))):b.apply(a,c)}:function(){return arguments.length?b.apply(a,arguments):b.call(a)}}function Q(a,d){var e=d;return"string"==typeof a&&"$"===a.charAt(0)?e=c:A(d)?e="$WINDOW":d&&b===d?e="$DOCUMENT":B(d)&&(e="$SCOPE"),e}function R(a,b){return"undefined"==typeof a?c:JSON.stringify(a,Q,b?"  ":null)}function S(a){return u(a)?JSON.parse(a):a}function T(a){if("function"==typeof a)a=!0;else if(a&&0!==a.length){var b=md(""+a);a=!("f"==b||"0"==b||"false"==b||"no"==b||"n"==b||"[]"==b)}else a=!1;return a}function U(a){a=sd(a).clone();try{a.empty()}catch(b){}var c=3,d=sd("<div>").append(a).html();try{return a[0].nodeType===c?md(d):d.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+md(b)})}catch(b){return md(d)}}function V(a){try{return decodeURIComponent(a)}catch(b){}}function W(a){var b,c,d={};return f((a||"").split("&"),function(a){if(a&&(b=a.split("="),c=V(b[0]),s(c))){var e=s(b[1])?V(b[1]):!0;d[c]?x(d[c])?d[c].push(e):d[c]=[d[c],e]:d[c]=e}}),d}function X(a){var b=[];return f(a,function(a,c){x(a)?f(a,function(a){b.push(Z(c,!0)+(a===!0?"":"="+Z(a,!0)))}):b.push(Z(c,!0)+(a===!0?"":"="+Z(a,!0)))}),b.length?b.join("&"):""}function Y(a){return Z(a,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function Z(a,b){return encodeURIComponent(a).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,b?"%20":"+")}function $(a,c){function d(a){a&&h.push(a)}var e,g,h=[a],i=["ng:app","ng-app","x-ng-app","data-ng-app"],j=/\sng[:\-]app(:\s*([\w\d_]+);?)?\s/;f(i,function(c){i[c]=!0,d(b.getElementById(c)),c=c.replace(":","\\:"),a.querySelectorAll&&(f(a.querySelectorAll("."+c),d),f(a.querySelectorAll("."+c+"\\:"),d),f(a.querySelectorAll("["+c+"]"),d))}),f(h,function(a){if(!e){var b=" "+a.className+" ",c=j.exec(b);c?(e=a,g=(c[2]||"").replace(/\s+/g,",")):f(a.attributes,function(b){!e&&i[b.name]&&(e=a,g=b.value)})}}),e&&c(e,g?[g]:[])}function _(c,d){var e=function(){if(c=sd(c),c.injector()){var a=c[0]===b?"document":U(c);throw zd("btstrpd","App Already Bootstrapped with this Element '{0}'",a)}d=d||[],d.unshift(["$provide",function(a){a.value("$rootElement",c)}]),d.unshift("ng");var e=Ib(d);return e.invoke(["$rootScope","$rootElement","$compile","$injector","$animate",function(a,b,c,d){a.$apply(function(){b.data("$injector",d),c(b)(a)})}]),e},g=/^NG_DEFER_BOOTSTRAP!/;return a&&!g.test(a.name)?e():(a.name=a.name.replace(g,""),void(Ad.resumeBootstrap=function(a){f(a,function(a){d.push(a)}),e()}))}function ab(a,b){return b=b||"_",a.replace(Dd,function(a,c){return(c?b:"")+a.toLowerCase()})}function bb(){td=a.jQuery,td&&td.fn.on?(sd=td,l(td.fn,{scope:Sd.scope,isolateScope:Sd.isolateScope,controller:Sd.controller,injector:Sd.injector,inheritedData:Sd.inheritedData}),lb("remove",!0,!0,!1),lb("empty",!1,!1,!1),lb("html",!1,!1,!0)):sd=pb,Ad.element=sd}function cb(a,b,c){if(!a)throw zd("areq","Argument '{0}' is {1}",b||"?",c||"required");return a}function db(a,b,c){return c&&x(a)&&(a=a[a.length-1]),cb(y(a),b,"not a function, got "+(a&&"object"==typeof a?a.constructor.name||"Object":typeof a)),a}function eb(a,b){if("hasOwnProperty"===a)throw zd("badname","hasOwnProperty is not a valid {0} name",b)}function fb(a,b,c){if(!b)return a;for(var d,e=b.split("."),f=a,g=e.length,h=0;g>h;h++)d=e[h],a&&(a=(f=a)[d]);return!c&&y(a)?P(f,a):a}function gb(a){var b=a[0],c=a[a.length-1];if(b===c)return sd(b);var d=b,e=[d];do{if(d=d.nextSibling,!d)break;e.push(d)}while(d!==c);return sd(e)}function hb(a){function b(a,b,c){return a[b]||(a[b]=c())}var c=d("$injector"),e=d("ng"),f=b(a,"angular",Object);return f.$$minErr=f.$$minErr||d,b(f,"module",function(){var a={};return function(d,f,g){var h=function(a,b){if("hasOwnProperty"===a)throw e("badname","hasOwnProperty is not a valid {0} name",b)};return h(d,"module"),f&&a.hasOwnProperty(d)&&(a[d]=null),b(a,d,function(){function a(a,c,d){return function(){return b[d||"push"]([a,c,arguments]),i}}if(!f)throw c("nomod","Module '{0}' is not available! You either misspelled the module name or forgot to load it. If registering a module ensure that you specify the dependencies as the second argument.",d);var b=[],e=[],h=a("$injector","invoke"),i={_invokeQueue:b,_runBlocks:e,requires:f,name:d,provider:a("$provide","provider"),factory:a("$provide","factory"),service:a("$provide","service"),value:a("$provide","value"),constant:a("$provide","constant","unshift"),animation:a("$animateProvider","register"),filter:a("$filterProvider","register"),controller:a("$controllerProvider","register"),directive:a("$compileProvider","directive"),config:h,run:function(a){return e.push(a),this}};return g&&h(g),i})}})}function ib(b){l(b,{bootstrap:_,copy:J,extend:l,equals:L,element:sd,forEach:f,injector:Ib,noop:o,bind:P,toJson:R,fromJson:S,identity:p,isUndefined:r,isDefined:s,isString:u,isFunction:y,isObject:t,isNumber:v,isElement:E,isArray:x,version:Ed,isDate:w,lowercase:md,uppercase:od,callbacks:{counter:0},$$minErr:d,$$csp:M}),ud=hb(a);try{ud("ngLocale")}catch(c){ud("ngLocale",[]).provider("$locale",dc)}ud("ng",["ngLocale"],["$provide",function(a){a.provider({$$sanitizeUri:Ec}),a.provider("$compile",Pb).directive({a:ye,input:Ie,textarea:Ie,form:Ce,script:qf,select:tf,style:vf,option:uf,ngBind:Ue,ngBindHtml:We,ngBindTemplate:Ve,ngClass:Xe,ngClassEven:Ze,ngClassOdd:Ye,ngCloak:$e,ngController:_e,ngForm:De,ngHide:kf,ngIf:bf,ngInclude:cf,ngInit:ef,ngNonBindable:ff,ngPluralize:gf,ngRepeat:hf,ngShow:jf,ngStyle:lf,ngSwitch:mf,ngSwitchWhen:nf,ngSwitchDefault:of,ngOptions:sf,ngTransclude:pf,ngModel:Oe,ngList:Re,ngChange:Pe,required:Qe,ngRequired:Qe,ngValue:Te}).directive({ngInclude:df}).directive(ze).directive(af),a.provider({$anchorScroll:Jb,$animate:_d,$browser:Mb,$cacheFactory:Nb,$controller:Sb,$document:Tb,$exceptionHandler:Ub,$filter:Pc,$interpolate:bc,$interval:cc,$http:Zb,$httpBackend:_b,$location:qc,$log:rc,$parse:zc,$rootScope:Dc,$q:Ac,$sce:Jc,$sceDelegate:Ic,$sniffer:Kc,$templateCache:Ob,$timeout:Lc,$window:Oc,$$rAF:Cc,$$asyncCallback:Kb})}])}function jb(){return++Hd}function kb(a){return a.replace(Kd,function(a,b,c,d){return d?c.toUpperCase():c}).replace(Ld,"Moz$1")}function lb(a,b,c,d){function e(a){var e,g,h,i,j,k,l,m=c&&a?[this.filter(a)]:[this],n=b;if(!d||null!=a)for(;m.length;)for(e=m.shift(),g=0,h=e.length;h>g;g++)for(i=sd(e[g]),n?i.triggerHandler("$destroy"):n=!n,j=0,k=(l=i.children()).length;k>j;j++)m.push(td(l[j]));return f.apply(this,arguments)}var f=td.fn[a];f=f.$original||f,e.$original=f,td.fn[a]=e}function mb(a){return!Od.test(a)}function nb(a,b){var c,d,e,f,g,h,i=b.createDocumentFragment(),j=[];if(mb(a))j.push(b.createTextNode(a));else{for(c=i.appendChild(b.createElement("div")),d=(Pd.exec(a)||["",""])[1].toLowerCase(),e=Rd[d]||Rd._default,c.innerHTML="<div>&#160;</div>"+e[1]+a.replace(Qd,"<$1></$2>")+e[2],c.removeChild(c.firstChild),f=e[0];f--;)c=c.lastChild;for(g=0,h=c.childNodes.length;h>g;++g)j.push(c.childNodes[g]);c=i.firstChild,c.textContent=""}return i.textContent="",i.innerHTML="",j}function ob(a,c){c=c||b;var d;return(d=Nd.exec(a))?[c.createElement(d[1])]:nb(a,c)}function pb(a){if(a instanceof pb)return a;if(u(a)&&(a=Cd(a)),!(this instanceof pb)){if(u(a)&&"<"!=a.charAt(0))throw Md("nosel","Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element");return new pb(a)}if(u(a)){zb(this,ob(a));var c=sd(b.createDocumentFragment());c.append(this)}else zb(this,a)}function qb(a){return a.cloneNode(!0)}function rb(a){tb(a);for(var b=0,c=a.childNodes||[];b<c.length;b++)rb(c[b])}function sb(a,b,c,d){if(s(d))throw Md("offargs","jqLite#off() does not support the `selector` argument");var e=ub(a,"events"),g=ub(a,"handle");g&&(r(b)?f(e,function(b,c){Jd(a,c,b),delete e[c]}):f(b.split(" "),function(b){r(c)?(Jd(a,b,e[b]),delete e[b]):I(e[b]||[],c)}))}function tb(a,b){var d=a[Gd],e=Fd[d];if(e){if(b)return void delete Fd[d].data[b];e.handle&&(e.events.$destroy&&e.handle({},"$destroy"),sb(a)),delete Fd[d],a[Gd]=c}}function ub(a,b,c){var d=a[Gd],e=Fd[d||-1];return s(c)?(e||(a[Gd]=d=jb(),e=Fd[d]={}),void(e[b]=c)):e&&e[b]}function vb(a,b,c){var d=ub(a,"data"),e=s(c),f=!e&&s(b),g=f&&!t(b);if(d||g||ub(a,"data",d={}),e)d[b]=c;else{if(!f)return d;if(g)return d&&d[b];l(d,b)}}function wb(a,b){return a.getAttribute?(" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").indexOf(" "+b+" ")>-1:!1}function xb(a,b){b&&a.setAttribute&&f(b.split(" "),function(b){a.setAttribute("class",Cd((" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").replace(" "+Cd(b)+" "," ")))})}function yb(a,b){if(b&&a.setAttribute){var c=(" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ");f(b.split(" "),function(a){a=Cd(a),-1===c.indexOf(" "+a+" ")&&(c+=a+" ")}),a.setAttribute("class",Cd(c))}}function zb(a,b){if(b){b=b.nodeName||!s(b.length)||A(b)?[b]:b;for(var c=0;c<b.length;c++)a.push(b[c])}}function Ab(a,b){return Bb(a,"$"+(b||"ngController")+"Controller")}function Bb(a,b,d){a=sd(a),9==a[0].nodeType&&(a=a.find("html"));for(var e=x(b)?b:[b];a.length;){for(var f=a[0],g=0,h=e.length;h>g;g++)if((d=a.data(e[g]))!==c)return d;a=sd(f.parentNode||11===f.nodeType&&f.host)}}function Cb(a){for(var b=0,c=a.childNodes;b<c.length;b++)rb(c[b]);for(;a.firstChild;)a.removeChild(a.firstChild)}function Db(a,b){var c=Td[b.toLowerCase()];return c&&Ud[a.nodeName]&&c}function Eb(a,c){var d=function(d,e){if(d.preventDefault||(d.preventDefault=function(){d.returnValue=!1}),d.stopPropagation||(d.stopPropagation=function(){d.cancelBubble=!0}),d.target||(d.target=d.srcElement||b),r(d.defaultPrevented)){var g=d.preventDefault;d.preventDefault=function(){d.defaultPrevented=!0,g.call(d)},d.defaultPrevented=!1}d.isDefaultPrevented=function(){return d.defaultPrevented||d.returnValue===!1};var h=K(c[e||d.type]||[]);f(h,function(b){b.call(a,d)}),8>=rd?(d.preventDefault=null,d.stopPropagation=null,d.isDefaultPrevented=null):(delete d.preventDefault,delete d.stopPropagation,delete d.isDefaultPrevented)};return d.elem=a,d}function Fb(a){var b,d=typeof a;return"object"==d&&null!==a?"function"==typeof(b=a.$$hashKey)?b=a.$$hashKey():b===c&&(b=a.$$hashKey=j()):b=a,d+":"+b}function Gb(a){f(a,this.put,this)}function Hb(a){var b,c,d,e;return"function"==typeof a?(b=a.$inject)||(b=[],a.length&&(c=a.toString().replace(Yd,""),d=c.match(Vd),f(d[1].split(Wd),function(a){a.replace(Xd,function(a,c,d){b.push(d)})})),a.$inject=b):x(a)?(e=a.length-1,db(a[e],"fn"),b=a.slice(0,e)):db(a,"fn",!0),b}function Ib(a){function b(a){return function(b,c){return t(b)?void f(b,i(a)):a(b,c)}}function c(a,b){if(eb(a,"service"),(y(b)||x(b))&&(b=v.instantiate(b)),!b.$get)throw Zd("pget","Provider '{0}' must define $get factory method.",a);return s[a+n]=b}function d(a,b){return c(a,{$get:b})}function e(a,b){return d(a,["$injector",function(a){return a.instantiate(b)}])}function g(a,b){return d(a,q(b))}function h(a,b){eb(a,"constant"),s[a]=b,w[a]=b}function j(a,b){var c=v.get(a+n),d=c.$get;c.$get=function(){var a=z.invoke(d,c);return z.invoke(b,null,{$delegate:a})}}function k(a){var b,c,d,e,g=[];return f(a,function(a){if(!r.get(a)){r.put(a,!0);try{if(u(a))for(b=ud(a),g=g.concat(k(b.requires)).concat(b._runBlocks),c=b._invokeQueue,d=0,e=c.length;e>d;d++){var f=c[d],h=v.get(f[0]);h[f[1]].apply(h,f[2])}else y(a)?g.push(v.invoke(a)):x(a)?g.push(v.invoke(a)):db(a,"module")}catch(i){throw x(a)&&(a=a[a.length-1]),i.message&&i.stack&&-1==i.stack.indexOf(i.message)&&(i=i.message+"\n"+i.stack),Zd("modulerr","Failed to instantiate module {0} due to:\n{1}",a,i.stack||i.message||i)}}}),g}function l(a,b){function c(c){if(a.hasOwnProperty(c)){if(a[c]===m)throw Zd("cdep","Circular dependency found: {0}",p.join(" <- "));return a[c]}try{return p.unshift(c),a[c]=m,a[c]=b(c)}catch(d){throw a[c]===m&&delete a[c],d}finally{p.shift()}}function d(a,b,d){var e,f,g,h=[],i=Hb(a);for(f=0,e=i.length;e>f;f++){if(g=i[f],"string"!=typeof g)throw Zd("itkn","Incorrect injection token! Expected service name as string, got {0}",g);h.push(d&&d.hasOwnProperty(g)?d[g]:c(g))}return a.$inject||(a=a[e]),a.apply(b,h)}function e(a,b){var c,e,f=function(){};return f.prototype=(x(a)?a[a.length-1]:a).prototype,c=new f,e=d(a,c,b),t(e)||y(e)?e:c}return{invoke:d,instantiate:e,get:c,annotate:Hb,has:function(b){return s.hasOwnProperty(b+n)||a.hasOwnProperty(b)}}}var m={},n="Provider",p=[],r=new Gb,s={$provide:{provider:b(c),factory:b(d),service:b(e),value:b(g),constant:b(h),decorator:j}},v=s.$injector=l(s,function(){throw Zd("unpr","Unknown provider: {0}",p.join(" <- "))}),w={},z=w.$injector=l(w,function(a){var b=v.get(a+n);return z.invoke(b.$get,b)});return f(k(a),function(a){z.invoke(a||o)}),z}function Jb(){var a=!0;this.disableAutoScrolling=function(){a=!1},this.$get=["$window","$location","$rootScope",function(b,c,d){function e(a){var b=null;return f(a,function(a){b||"a"!==md(a.nodeName)||(b=a)}),b}function g(){var a,d=c.hash();d?(a=h.getElementById(d))?a.scrollIntoView():(a=e(h.getElementsByName(d)))?a.scrollIntoView():"top"===d&&b.scrollTo(0,0):b.scrollTo(0,0)}var h=b.document;return a&&d.$watch(function(){return c.hash()},function(){d.$evalAsync(g)}),g}]}function Kb(){this.$get=["$$rAF","$timeout",function(a,b){return a.supported?function(b){return a(b)}:function(a){return b(a,0,!1)}}]}function Lb(a,b,d,e){function g(a){try{a.apply(null,O(arguments,1))}finally{if(s--,0===s)for(;t.length;)try{t.pop()()}catch(b){d.error(b)}}}function h(a,b){!function c(){f(w,function(a){a()}),v=b(c,a)}()}function i(){z=null,x!=j.url()&&(x=j.url(),f(A,function(a){a(j.url())}))}var j=this,k=b[0],l=a.location,m=a.history,n=a.setTimeout,p=a.clearTimeout,q={};j.isMock=!1;var s=0,t=[];j.$$completeOutstandingRequest=g,j.$$incOutstandingRequestCount=function(){s++},j.notifyWhenNoOutstandingRequests=function(a){f(w,function(a){a()}),0===s?a():t.push(a)};var v,w=[];j.addPollFn=function(a){return r(v)&&h(100,n),w.push(a),a};var x=l.href,y=b.find("base"),z=null;j.url=function(b,c){if(l!==a.location&&(l=a.location),m!==a.history&&(m=a.history),b){if(x==b)return;return x=b,e.history?c?m.replaceState(null,"",b):(m.pushState(null,"",b),y.attr("href",y.attr("href"))):(z=b,c?l.replace(b):l.href=b),j}return z||l.href.replace(/%27/g,"'")};var A=[],B=!1;j.onUrlChange=function(b){return B||(e.history&&sd(a).on("popstate",i),e.hashchange?sd(a).on("hashchange",i):j.addPollFn(i),B=!0),A.push(b),b},j.baseHref=function(){var a=y.attr("href");return a?a.replace(/^(https?\:)?\/\/[^\/]*/,""):""};var C={},D="",E=j.baseHref();j.cookies=function(a,b){var e,f,g,h,i;if(!a){if(k.cookie!==D)for(D=k.cookie,f=D.split("; "),C={},h=0;h<f.length;h++)g=f[h],i=g.indexOf("="),i>0&&(a=unescape(g.substring(0,i)),C[a]===c&&(C[a]=unescape(g.substring(i+1))));return C}b===c?k.cookie=escape(a)+"=;path="+E+";expires=Thu, 01 Jan 1970 00:00:00 GMT":u(b)&&(e=(k.cookie=escape(a)+"="+escape(b)+";path="+E).length+1,e>4096&&d.warn("Cookie '"+a+"' possibly not set or overflowed because it was too large ("+e+" > 4096 bytes)!"))},j.defer=function(a,b){var c;return s++,c=n(function(){delete q[c],g(a)},b||0),q[c]=!0,c},j.defer.cancel=function(a){return q[a]?(delete q[a],p(a),g(o),!0):!1}}function Mb(){this.$get=["$window","$log","$sniffer","$document",function(a,b,c,d){return new Lb(a,d,b,c)}]}function Nb(){this.$get=function(){function a(a,c){function e(a){a!=m&&(n?n==a&&(n=a.n):n=a,f(a.n,a.p),f(a,m),m=a,m.n=null)}function f(a,b){a!=b&&(a&&(a.p=b),b&&(b.n=a))}if(a in b)throw d("$cacheFactory")("iid","CacheId '{0}' is already taken!",a);var g=0,h=l({},c,{id:a}),i={},j=c&&c.capacity||Number.MAX_VALUE,k={},m=null,n=null;return b[a]={put:function(a,b){if(j<Number.MAX_VALUE){var c=k[a]||(k[a]={key:a});e(c)}if(!r(b))return a in i||g++,i[a]=b,g>j&&this.remove(n.key),b},get:function(a){if(j<Number.MAX_VALUE){var b=k[a];if(!b)return;e(b)}return i[a]},remove:function(a){if(j<Number.MAX_VALUE){var b=k[a];if(!b)return;b==m&&(m=b.p),b==n&&(n=b.n),f(b.n,b.p),delete k[a]}delete i[a],g--},removeAll:function(){i={},g=0,k={},m=n=null},destroy:function(){i=null,h=null,k=null,delete b[a]},info:function(){return l({},h,{size:g})}}}var b={};return a.info=function(){var a={};return f(b,function(b,c){a[c]=b.info()}),a},a.get=function(a){return b[a]},a}}function Ob(){this.$get=["$cacheFactory",function(a){return a("templates")}]}function Pb(a,d){var e={},g="Directive",h=/^\s*directive\:\s*([\d\w_\-]+)\s+(.*)$/,j=/(([\d\w_\-]+)(?:\:([^;]+))?;?)/,k=/^(on[a-z]+|formaction)$/;this.directive=function m(b,c){return eb(b,"directive"),u(b)?(cb(c,"directiveFactory"),e.hasOwnProperty(b)||(e[b]=[],a.factory(b+g,["$injector","$exceptionHandler",function(a,c){var d=[];return f(e[b],function(e,f){try{var g=a.invoke(e);y(g)?g={compile:q(g)}:!g.compile&&g.link&&(g.compile=q(g.link)),g.priority=g.priority||0,g.index=f,g.name=g.name||b,g.require=g.require||g.controller&&g.name,g.restrict=g.restrict||"A",d.push(g)}catch(h){c(h)}}),d}])),e[b].push(c)):f(b,i(m)),this},this.aHrefSanitizationWhitelist=function(a){return s(a)?(d.aHrefSanitizationWhitelist(a),this):d.aHrefSanitizationWhitelist()},this.imgSrcSanitizationWhitelist=function(a){return s(a)?(d.imgSrcSanitizationWhitelist(a),this):d.imgSrcSanitizationWhitelist()},this.$get=["$injector","$interpolate","$exceptionHandler","$http","$templateCache","$parse","$controller","$rootScope","$document","$sce","$animate","$$sanitizeUri",function(a,d,i,m,o,r,s,v,w,z,A,B){function C(a,b,c,d,e){a instanceof sd||(a=sd(a)),f(a,function(b,c){3==b.nodeType&&b.nodeValue.match(/\S+/)&&(a[c]=b=sd(b).wrap("<span></span>").parent()[0])});var g=E(a,b,a,c,d,e);return D(a,"ng-scope"),function(b,c,d){cb(b,"scope");var e=c?Sd.clone.call(a):a;f(d,function(a,b){e.data("$"+b+"Controller",a)});for(var h=0,i=e.length;i>h;h++){var j=e[h],k=j.nodeType;(1===k||9===k)&&e.eq(h).data("$scope",b)}return c&&c(e,b),g&&g(b,e,e),e}}function D(a,b){try{a.addClass(b)}catch(c){}}function E(a,b,d,e,f,g){function h(a,d,e,f){var g,h,i,j,k,l,m,n,p,q=d.length,r=new Array(q);for(m=0;q>m;m++)r[m]=d[m];for(m=0,p=0,n=o.length;n>m;p++)i=r[p],g=o[m++],h=o[m++],j=sd(i),g?(g.scope?(k=a.$new(),j.data("$scope",k)):k=a,l=g.transclude,l||!f&&b?g(h,k,i,e,F(a,l||b)):g(h,k,i,e,f)):h&&h(a,i.childNodes,c,f)}for(var i,j,k,l,m,n,o=[],p=0;p<a.length;p++)i=new $,j=G(a[p],[],i,0===p?e:c,f),k=j.length?J(j,a[p],i,b,d,null,[],[],g):null,k&&k.scope&&D(sd(a[p]),"ng-scope"),m=k&&k.terminal||!(l=a[p].childNodes)||!l.length?null:E(l,k?k.transclude:b),o.push(k,m),n=n||k||m,g=null;return n?h:null}function F(a,b){return function(c,d,e){var f=!1;c||(c=a.$new(),c.$$transcluded=!0,f=!0);var g=b(c,d,e);return f&&g.on("$destroy",P(c,c.$destroy)),g}}function G(a,b,c,d,e){var f,g,i=a.nodeType,k=c.$attr;switch(i){case 1:N(b,Qb(vd(a).toLowerCase()),"E",d,e);for(var l,m,n,o,p,q=a.attributes,r=0,s=q&&q.length;s>r;r++){var t=!1,v=!1;if(l=q[r],!rd||rd>=8||l.specified){m=l.name,o=Qb(m),eb.test(o)&&(m=ab(o.substr(6),"-"));var w=o.replace(/(Start|End)$/,"");o===w+"Start"&&(t=m,v=m.substr(0,m.length-5)+"end",m=m.substr(0,m.length-6)),n=Qb(m.toLowerCase()),k[n]=m,c[n]=p=Cd(l.value),Db(a,n)&&(c[n]=!0),X(a,b,p,n),N(b,n,"A",d,e,t,v)}}if(g=a.className,u(g)&&""!==g)for(;f=j.exec(g);)n=Qb(f[2]),N(b,n,"C",d,e)&&(c[n]=Cd(f[3])),g=g.substr(f.index+f[0].length);break;case 3:V(b,a.nodeValue);break;case 8:try{f=h.exec(a.nodeValue),f&&(n=Qb(f[1]),N(b,n,"M",d,e)&&(c[n]=Cd(f[2])))}catch(x){}}return b.sort(S),b}function H(a,b,c){var d=[],e=0;if(b&&a.hasAttribute&&a.hasAttribute(b)){do{if(!a)throw ae("uterdir","Unterminated attribute, found '{0}' but no matching '{1}' found.",b,c);1==a.nodeType&&(a.hasAttribute(b)&&e++,a.hasAttribute(c)&&e--),d.push(a),a=a.nextSibling}while(e>0)}else d.push(a);return sd(d)}function I(a,b,c){return function(d,e,f,g,h){return e=H(e[0],b,c),a(d,e,f,g,h)}}function J(a,e,g,h,j,k,l,m,n){function o(a,b,c,d){a&&(c&&(a=I(a,c,d)),a.require=w.require,a.directiveName=z,(N===w||w.$$isolateScope)&&(a=Z(a,{isolateScope:!0})),l.push(a)),b&&(c&&(b=I(b,c,d)),b.require=w.require,b.directiveName=z,(N===w||w.$$isolateScope)&&(b=Z(b,{isolateScope:!0})),m.push(b))}function p(a,b,c,d){var e,g="data",h=!1;if(u(b)){for(;"^"==(e=b.charAt(0))||"?"==e;)b=b.substr(1),"^"==e&&(g="inheritedData"),h=h||"?"==e;if(e=null,d&&"data"===g&&(e=d[b]),e=e||c[g]("$"+b+"Controller"),!e&&!h)throw ae("ctreq","Controller '{0}', required by directive '{1}', can't be found!",b,a);return e}return x(b)&&(e=[],f(b,function(b){e.push(p(a,b,c,d))})),e}function q(a,b,h,j,k){function n(a,b){var d;return arguments.length<2&&(b=a,a=c),W&&(d=z),k(a,b,d)}var o,q,t,u,v,w,x,y,z={};if(o=e===h?g:K(g,new $(sd(h),g.$attr)),q=o.$$element,N){var A=/^\s*([@=&])(\??)\s*(\w*)\s*$/,B=sd(h);x=b.$new(!0),!P||P!==N&&P!==N.$$originalDirective?B.data("$isolateScopeNoTemplate",x):B.data("$isolateScope",x),D(B,"ng-isolate-scope"),f(N.scope,function(a,c){var e,f,g,h,i=a.match(A)||[],j=i[3]||c,k="?"==i[2],l=i[1];switch(x.$$isolateBindings[c]=l+j,l){case"@":o.$observe(j,function(a){x[c]=a}),o.$$observers[j].$$scope=b,o[j]&&(x[c]=d(o[j])(b));break;case"=":if(k&&!o[j])return;f=r(o[j]),h=f.literal?L:function(a,b){return a===b},g=f.assign||function(){throw e=x[c]=f(b),ae("nonassign","Expression '{0}' used with directive '{1}' is non-assignable!",o[j],N.name)},e=x[c]=f(b),x.$watch(function(){var a=f(b);return h(a,x[c])||(h(a,e)?g(b,a=x[c]):x[c]=a),e=a},null,f.literal);break;case"&":f=r(o[j]),x[c]=function(a){return f(b,a)};break;default:throw ae("iscp","Invalid isolate scope definition for directive '{0}'. Definition: {... {1}: '{2}' ...}",N.name,c,a)}})}for(y=k&&n,J&&f(J,function(a){var c,d={$scope:a===N||a.$$isolateScope?x:b,$element:q,$attrs:o,$transclude:y};w=a.controller,"@"==w&&(w=o[a.name]),c=s(w,d),z[a.name]=c,W||q.data("$"+a.name+"Controller",c),a.controllerAs&&(d.$scope[a.controllerAs]=c)}),t=0,u=l.length;u>t;t++)try{v=l[t],v(v.isolateScope?x:b,q,o,v.require&&p(v.directiveName,v.require,q,z),y)}catch(C){i(C,U(q))}var E=b;for(N&&(N.template||null===N.templateUrl)&&(E=x),a&&a(E,h.childNodes,c,k),t=m.length-1;t>=0;t--)try{v=m[t],v(v.isolateScope?x:b,q,o,v.require&&p(v.directiveName,v.require,q,z),y)}catch(C){i(C,U(q))}}n=n||{};for(var v,w,z,A,B,E,F=-Number.MAX_VALUE,J=n.controllerDirectives,N=n.newIsolateScopeDirective,P=n.templateDirective,S=n.nonTlbTranscludeDirective,V=!1,W=n.hasElementTranscludeDirective,X=g.$$element=sd(e),_=k,ab=h,bb=0,cb=a.length;cb>bb;bb++){w=a[bb];var eb=w.$$start,fb=w.$$end;if(eb&&(X=H(e,eb,fb)),A=c,F>w.priority)break;if((E=w.scope)&&(v=v||w,w.templateUrl||(T("new/isolated scope",N,w,X),t(E)&&(N=w))),z=w.name,!w.templateUrl&&w.controller&&(E=w.controller,J=J||{},T("'"+z+"' controller",J[z],w,X),J[z]=w),(E=w.transclude)&&(V=!0,w.$$tlb||(T("transclusion",S,w,X),S=w),"element"==E?(W=!0,F=w.priority,A=H(e,eb,fb),X=g.$$element=sd(b.createComment(" "+z+": "+g[z]+" ")),e=X[0],Y(j,sd(O(A)),e),ab=C(A,h,F,_&&_.name,{nonTlbTranscludeDirective:S})):(A=sd(qb(e)).contents(),X.empty(),ab=C(A,h))),w.template)if(T("template",P,w,X),P=w,E=y(w.template)?w.template(X,g):w.template,E=db(E),w.replace){if(_=w,A=mb(E)?[]:sd(Cd(E)),e=A[0],1!=A.length||1!==e.nodeType)throw ae("tplrt","Template for directive '{0}' must have exactly one root element. {1}",z,"");Y(j,X,e);var gb={$attr:{}},hb=G(e,[],gb),ib=a.splice(bb+1,a.length-(bb+1));N&&M(hb),a=a.concat(hb).concat(ib),Q(g,gb),cb=a.length}else X.html(E);if(w.templateUrl)T("template",P,w,X),P=w,w.replace&&(_=w),q=R(a.splice(bb,a.length-bb),X,g,j,ab,l,m,{controllerDirectives:J,newIsolateScopeDirective:N,templateDirective:P,nonTlbTranscludeDirective:S}),cb=a.length;else if(w.compile)try{B=w.compile(X,g,ab),y(B)?o(null,B,eb,fb):B&&o(B.pre,B.post,eb,fb)}catch(jb){i(jb,U(X))}w.terminal&&(q.terminal=!0,F=Math.max(F,w.priority))}return q.scope=v&&v.scope===!0,q.transclude=V&&ab,n.hasElementTranscludeDirective=W,q}function M(a){for(var b=0,c=a.length;c>b;b++)a[b]=n(a[b],{$$isolateScope:!0})}function N(b,d,f,h,j,k,l){if(d===j)return null;var m=null;if(e.hasOwnProperty(d))for(var o,p=a.get(d+g),q=0,r=p.length;r>q;q++)try{o=p[q],(h===c||h>o.priority)&&-1!=o.restrict.indexOf(f)&&(k&&(o=n(o,{$$start:k,$$end:l})),b.push(o),m=o)}catch(s){i(s)}return m}function Q(a,b){var c=b.$attr,d=a.$attr,e=a.$$element;f(a,function(d,e){"$"!=e.charAt(0)&&(b[e]&&b[e]!==d&&(d+=("style"===e?";":" ")+b[e]),a.$set(e,d,!0,c[e]))}),f(b,function(b,f){"class"==f?(D(e,b),a["class"]=(a["class"]?a["class"]+" ":"")+b):"style"==f?(e.attr("style",e.attr("style")+";"+b),a.style=(a.style?a.style+";":"")+b):"$"==f.charAt(0)||a.hasOwnProperty(f)||(a[f]=b,d[f]=c[f])})}function R(a,b,c,d,e,g,h,i){var j,k,n=[],p=b[0],q=a.shift(),r=l({},q,{templateUrl:null,transclude:null,replace:null,$$originalDirective:q}),s=y(q.templateUrl)?q.templateUrl(b,c):q.templateUrl;return b.empty(),m.get(z.getTrustedResourceUrl(s),{cache:o}).success(function(l){var m,o,u,v;if(l=db(l),q.replace){if(u=mb(l)?[]:sd(Cd(l)),m=u[0],1!=u.length||1!==m.nodeType)throw ae("tplrt","Template for directive '{0}' must have exactly one root element. {1}",q.name,s);o={$attr:{}},Y(d,b,m);var w=G(m,[],o);t(q.scope)&&M(w),a=w.concat(a),Q(c,o)}else m=p,b.html(l);for(a.unshift(r),j=J(a,m,c,e,b,q,g,h,i),f(d,function(a,c){a==m&&(d[c]=b[0])}),k=E(b[0].childNodes,e);n.length;){var x=n.shift(),y=n.shift(),z=n.shift(),A=n.shift(),B=b[0];if(y!==p){var C=y.className;i.hasElementTranscludeDirective&&q.replace||(B=qb(m)),Y(z,sd(y),B),D(sd(B),C)}v=j.transclude?F(x,j.transclude):A,j(k,x,B,d,v)}n=null}).error(function(a,b,c,d){throw ae("tpload","Failed to load template: {0}",d.url)}),function(a,b,c,d,e){n?(n.push(b),n.push(c),n.push(d),n.push(e)):j(k,b,c,d,e)}}function S(a,b){var c=b.priority-a.priority;return 0!==c?c:a.name!==b.name?a.name<b.name?-1:1:a.index-b.index}function T(a,b,c,d){if(b)throw ae("multidir","Multiple directives [{0}, {1}] asking for {2} on: {3}",b.name,c.name,a,U(d))}function V(a,b){var c=d(b,!0);c&&a.push({priority:0,compile:q(function(a,b){var d=b.parent(),e=d.data("$binding")||[];e.push(c),D(d.data("$binding",e),"ng-binding"),a.$watch(c,function(a){b[0].nodeValue=a})})})}function W(a,b){if("srcdoc"==b)return z.HTML;var c=vd(a);return"xlinkHref"==b||"FORM"==c&&"action"==b||"IMG"!=c&&("src"==b||"ngSrc"==b)?z.RESOURCE_URL:void 0}function X(a,b,c,e){var f=d(c,!0);if(f){if("multiple"===e&&"SELECT"===vd(a))throw ae("selmulti","Binding to the 'multiple' attribute is not supported. Element: {0}",U(a));b.push({priority:100,compile:function(){return{pre:function(b,c,g){var h=g.$$observers||(g.$$observers={});if(k.test(e))throw ae("nodomevents","Interpolations for HTML DOM event attributes are disallowed.  Please use the ng- versions (such as ng-click instead of onclick) instead.");f=d(g[e],!0,W(a,e)),f&&(g[e]=f(b),(h[e]||(h[e]=[])).$$inter=!0,(g.$$observers&&g.$$observers[e].$$scope||b).$watch(f,function(a,b){"class"===e&&a!=b?g.$updateClass(a,b):g.$set(e,a)}))}}}})}}function Y(a,c,d){var e,f,g=c[0],h=c.length,i=g.parentNode;if(a)for(e=0,f=a.length;f>e;e++)if(a[e]==g){a[e++]=d;for(var j=e,k=j+h-1,l=a.length;l>j;j++,k++)l>k?a[j]=a[k]:delete a[j];a.length-=h-1;break}i&&i.replaceChild(d,g);var m=b.createDocumentFragment();m.appendChild(g),d[sd.expando]=g[sd.expando];for(var n=1,o=c.length;o>n;n++){var p=c[n];sd(p).remove(),m.appendChild(p),delete c[n]}c[0]=d,c.length=1}function Z(a,b){return l(function(){return a.apply(null,arguments)},a,b)}var $=function(a,b){this.$$element=a,this.$attr=b||{}};$.prototype={$normalize:Qb,$addClass:function(a){a&&a.length>0&&A.addClass(this.$$element,a)},$removeClass:function(a){a&&a.length>0&&A.removeClass(this.$$element,a)},$updateClass:function(a,b){var c=Rb(a,b),d=Rb(b,a);0===c.length?A.removeClass(this.$$element,d):0===d.length?A.addClass(this.$$element,c):A.setClass(this.$$element,c,d)},$set:function(a,b,d,e){var g,h=Db(this.$$element[0],a);h&&(this.$$element.prop(a,b),e=h),this[a]=b,e?this.$attr[a]=e:(e=this.$attr[a],e||(this.$attr[a]=e=ab(a,"-"))),g=vd(this.$$element),("A"===g&&"href"===a||"IMG"===g&&"src"===a)&&(this[a]=b=B(b,"src"===a)),d!==!1&&(null===b||b===c?this.$$element.removeAttr(e):this.$$element.attr(e,b));var j=this.$$observers;j&&f(j[a],function(a){try{a(b)}catch(c){i(c)}})},$observe:function(a,b){var c=this,d=c.$$observers||(c.$$observers={}),e=d[a]||(d[a]=[]);return e.push(b),v.$evalAsync(function(){e.$$inter||b(c[a])}),b}};var _=d.startSymbol(),bb=d.endSymbol(),db="{{"==_||"}}"==bb?p:function(a){return a.replace(/\{\{/g,_).replace(/}}/g,bb)},eb=/^ngAttr[A-Z]/;return C}]}function Qb(a){return kb(a.replace(be,""))}function Rb(a,b){var c="",d=a.split(/\s+/),e=b.split(/\s+/);a:for(var f=0;f<d.length;f++){for(var g=d[f],h=0;h<e.length;h++)if(g==e[h])continue a;c+=(c.length>0?" ":"")+g}return c}function Sb(){var a={},b=/^(\S+)(\s+as\s+(\w+))?$/;this.register=function(b,c){eb(b,"controller"),t(b)?l(a,b):a[b]=c},this.$get=["$injector","$window",function(c,e){return function(f,g){var h,i,j,k;if(u(f)&&(i=f.match(b),j=i[1],k=i[3],f=a.hasOwnProperty(j)?a[j]:fb(g.$scope,j,!0)||fb(e,j,!0),db(f,j,!0)),h=c.instantiate(f,g),k){if(!g||"object"!=typeof g.$scope)throw d("$controller")("noscp","Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.",j||f.name,k);g.$scope[k]=h}return h}}]}function Tb(){this.$get=["$window",function(a){return sd(a.document)}]}function Ub(){this.$get=["$log",function(a){return function(){a.error.apply(a,arguments)}}]}function Vb(a){var b,c,d,e={};return a?(f(a.split("\n"),function(a){d=a.indexOf(":"),b=md(Cd(a.substr(0,d))),c=Cd(a.substr(d+1)),b&&(e[b]?e[b]+=", "+c:e[b]=c)}),e):e}function Wb(a){var b=t(a)?a:c;return function(c){return b||(b=Vb(a)),c?b[md(c)]||null:b}}function Xb(a,b,c){return y(c)?c(a,b):(f(c,function(c){a=c(a,b)}),a)}function Yb(a){return a>=200&&300>a}function Zb(){var a=/^\s*(\[|\{[^\{])/,b=/[\}\]]\s*$/,d=/^\)\]\}',?\n/,e={"Content-Type":"application/json;charset=utf-8"},g=this.defaults={transformResponse:[function(c){return u(c)&&(c=c.replace(d,""),a.test(c)&&b.test(c)&&(c=S(c))),c}],transformRequest:[function(a){return!t(a)||C(a)||D(a)?a:R(a)}],headers:{common:{Accept:"application/json, text/plain, */*"},post:K(e),put:K(e),patch:K(e)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN"},i=this.interceptors=[],j=this.responseInterceptors=[];this.$get=["$httpBackend","$browser","$cacheFactory","$rootScope","$q","$injector",function(a,b,d,e,k,m){function n(a){function d(a){var b=l({},a,{data:Xb(a.data,a.headers,h.transformResponse)});
+return Yb(a.status)?b:k.reject(b)}function e(a){function b(a){var b;f(a,function(c,d){y(c)&&(b=c(),null!=b?a[d]=b:delete a[d])})}var c,d,e,h=g.headers,i=l({},a.headers);h=l({},h.common,h[md(a.method)]),b(h),b(i);a:for(c in h){d=md(c);for(e in i)if(md(e)===d)continue a;i[c]=h[c]}return i}var h={method:"get",transformRequest:g.transformRequest,transformResponse:g.transformResponse},i=e(a);l(h,a),h.headers=i,h.method=od(h.method);var j=Nc(h.url)?b.cookies()[h.xsrfCookieName||g.xsrfCookieName]:c;j&&(i[h.xsrfHeaderName||g.xsrfHeaderName]=j);var m=function(a){i=a.headers;var b=Xb(a.data,Wb(i),a.transformRequest);return r(a.data)&&f(i,function(a,b){"content-type"===md(b)&&delete i[b]}),r(a.withCredentials)&&!r(g.withCredentials)&&(a.withCredentials=g.withCredentials),q(a,b,i).then(d,d)},n=[m,c],o=k.when(h);for(f(z,function(a){(a.request||a.requestError)&&n.unshift(a.request,a.requestError),(a.response||a.responseError)&&n.push(a.response,a.responseError)});n.length;){var p=n.shift(),s=n.shift();o=o.then(p,s)}return o.success=function(a){return o.then(function(b){a(b.data,b.status,b.headers,h)}),o},o.error=function(a){return o.then(null,function(b){a(b.data,b.status,b.headers,h)}),o},o}function o(){f(arguments,function(a){n[a]=function(b,c){return n(l(c||{},{method:a,url:b}))}})}function p(){f(arguments,function(a){n[a]=function(b,c,d){return n(l(d||{},{method:a,url:b,data:c}))}})}function q(b,c,d){function f(a,b,c,d){j&&(Yb(a)?j.put(p,[a,b,Vb(c),d]):j.remove(p)),h(b,a,c,d),e.$$phase||e.$apply()}function h(a,c,d,e){c=Math.max(c,0),(Yb(c)?m.resolve:m.reject)({data:a,status:c,headers:Wb(d),config:b,statusText:e})}function i(){var a=H(n.pendingRequests,b);-1!==a&&n.pendingRequests.splice(a,1)}var j,l,m=k.defer(),o=m.promise,p=v(b.url,b.params);if(n.pendingRequests.push(b),o.then(i,i),(b.cache||g.cache)&&b.cache!==!1&&"GET"==b.method&&(j=t(b.cache)?b.cache:t(g.cache)?g.cache:w),j)if(l=j.get(p),s(l)){if(l.then)return l.then(i,i),l;x(l)?h(l[1],l[0],K(l[2]),l[3]):h(l,200,{},"OK")}else j.put(p,o);return r(l)&&a(b.method,p,c,f,d,b.timeout,b.withCredentials,b.responseType),o}function v(a,b){if(!b)return a;var c=[];return h(b,function(a,b){null===a||r(a)||(x(a)||(a=[a]),f(a,function(a){t(a)&&(a=R(a)),c.push(Z(b)+"="+Z(a))}))}),c.length>0&&(a+=(-1==a.indexOf("?")?"?":"&")+c.join("&")),a}var w=d("$http"),z=[];return f(i,function(a){z.unshift(u(a)?m.get(a):m.invoke(a))}),f(j,function(a,b){var c=u(a)?m.get(a):m.invoke(a);z.splice(b,0,{response:function(a){return c(k.when(a))},responseError:function(a){return c(k.reject(a))}})}),n.pendingRequests=[],o("get","delete","head","jsonp"),p("post","put"),n.defaults=g,n}]}function $b(b){if(8>=rd&&(!b.match(/^(get|post|head|put|delete|options)$/i)||!a.XMLHttpRequest))return new a.ActiveXObject("Microsoft.XMLHTTP");if(a.XMLHttpRequest)return new a.XMLHttpRequest;throw d("$httpBackend")("noxhr","This browser does not support XMLHttpRequest.")}function _b(){this.$get=["$browser","$window","$document",function(a,b,c){return ac(a,$b,a.defer,b.angular.callbacks,c[0])}]}function ac(a,b,c,d,e){function g(a,b,c){var f=e.createElement("script"),g=null;return f.type="text/javascript",f.src=a,f.async=!0,g=function(a){Jd(f,"load",g),Jd(f,"error",g),e.body.removeChild(f),f=null;var h=-1,i="unknown";a&&("load"!==a.type||d[b].called||(a={type:"error"}),i=a.type,h="error"===a.type?404:200),c&&c(h,i)},Id(f,"load",g),Id(f,"error",g),8>=rd&&(f.onreadystatechange=function(){u(f.readyState)&&/loaded|complete/.test(f.readyState)&&(f.onreadystatechange=null,g({type:"load"}))}),e.body.appendChild(f),g}var h=-1;return function(e,i,j,k,l,m,n,p){function q(){t=h,v&&v(),w&&w.abort()}function r(b,d,e,f,g){y&&c.cancel(y),v=w=null,0===d&&(d=e?200:"file"==Mc(i).protocol?404:0),d=1223===d?204:d,g=g||"",b(d,e,f,g),a.$$completeOutstandingRequest(o)}var t;if(a.$$incOutstandingRequestCount(),i=i||a.url(),"jsonp"==md(e)){var u="_"+(d.counter++).toString(36);d[u]=function(a){d[u].data=a,d[u].called=!0};var v=g(i.replace("JSON_CALLBACK","angular.callbacks."+u),u,function(a,b){r(k,a,d[u].data,"",b),d[u]=o})}else{var w=b(e);if(w.open(e,i,!0),f(l,function(a,b){s(a)&&w.setRequestHeader(b,a)}),w.onreadystatechange=function(){if(w&&4==w.readyState){var a=null,b=null;t!==h&&(a=w.getAllResponseHeaders(),b="response"in w?w.response:w.responseText),r(k,t||w.status,b,a,w.statusText||"")}},n&&(w.withCredentials=!0),p)try{w.responseType=p}catch(x){if("json"!==p)throw x}w.send(j||null)}if(m>0)var y=c(q,m);else m&&m.then&&m.then(q)}}function bc(){var a="{{",b="}}";this.startSymbol=function(b){return b?(a=b,this):a},this.endSymbol=function(a){return a?(b=a,this):b},this.$get=["$parse","$exceptionHandler","$sce",function(c,d,e){function f(f,i,j){for(var k,l,m,n,o=0,p=[],q=f.length,r=!1,s=[];q>o;)-1!=(k=f.indexOf(a,o))&&-1!=(l=f.indexOf(b,k+g))?(o!=k&&p.push(f.substring(o,k)),p.push(m=c(n=f.substring(k+g,l))),m.exp=n,o=l+h,r=!0):(o!=q&&p.push(f.substring(o)),o=q);if((q=p.length)||(p.push(""),q=1),j&&p.length>1)throw ce("noconcat","Error while interpolating: {0}\nStrict Contextual Escaping disallows interpolations that concatenate multiple expressions when a trusted value is required.  See http://docs.angularjs.org/api/ng.$sce",f);return!i||r?(s.length=q,m=function(a){try{for(var b,c=0,g=q;g>c;c++){if("function"==typeof(b=p[c]))if(b=b(a),b=j?e.getTrusted(j,b):e.valueOf(b),null==b)b="";else switch(typeof b){case"string":break;case"number":b=""+b;break;default:b=R(b)}s[c]=b}return s.join("")}catch(h){var i=ce("interr","Can't interpolate: {0}\n{1}",f,h.toString());d(i)}},m.exp=f,m.parts=p,m):void 0}var g=a.length,h=b.length;return f.startSymbol=function(){return a},f.endSymbol=function(){return b},f}]}function cc(){this.$get=["$rootScope","$window","$q",function(a,b,c){function d(d,f,g,h){var i=b.setInterval,j=b.clearInterval,k=c.defer(),l=k.promise,m=0,n=s(h)&&!h;return g=s(g)?g:0,l.then(null,null,d),l.$$intervalId=i(function(){k.notify(m++),g>0&&m>=g&&(k.resolve(m),j(l.$$intervalId),delete e[l.$$intervalId]),n||a.$apply()},f),e[l.$$intervalId]=k,l}var e={};return d.cancel=function(a){return a&&a.$$intervalId in e?(e[a.$$intervalId].reject("canceled"),clearInterval(a.$$intervalId),delete e[a.$$intervalId],!0):!1},d}]}function dc(){this.$get=function(){return{id:"en-us",NUMBER_FORMATS:{DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{minInt:1,minFrac:0,maxFrac:3,posPre:"",posSuf:"",negPre:"-",negSuf:"",gSize:3,lgSize:3},{minInt:1,minFrac:2,maxFrac:2,posPre:"¤",posSuf:"",negPre:"(¤",negSuf:")",gSize:3,lgSize:3}],CURRENCY_SYM:"$"},DATETIME_FORMATS:{MONTH:"January,February,March,April,May,June,July,August,September,October,November,December".split(","),SHORTMONTH:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".split(","),DAY:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(","),SHORTDAY:"Sun,Mon,Tue,Wed,Thu,Fri,Sat".split(","),AMPMS:["AM","PM"],medium:"MMM d, y h:mm:ss a","short":"M/d/yy h:mm a",fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",mediumDate:"MMM d, y",shortDate:"M/d/yy",mediumTime:"h:mm:ss a",shortTime:"h:mm a"},pluralCat:function(a){return 1===a?"one":"other"}}}}function ec(a){for(var b=a.split("/"),c=b.length;c--;)b[c]=Y(b[c]);return b.join("/")}function fc(a,b,c){var d=Mc(a,c);b.$$protocol=d.protocol,b.$$host=d.hostname,b.$$port=m(d.port)||ee[d.protocol]||null}function gc(a,b,c){var d="/"!==a.charAt(0);d&&(a="/"+a);var e=Mc(a,c);b.$$path=decodeURIComponent(d&&"/"===e.pathname.charAt(0)?e.pathname.substring(1):e.pathname),b.$$search=W(e.search),b.$$hash=decodeURIComponent(e.hash),b.$$path&&"/"!=b.$$path.charAt(0)&&(b.$$path="/"+b.$$path)}function hc(a,b){return 0===b.indexOf(a)?b.substr(a.length):void 0}function ic(a){var b=a.indexOf("#");return-1==b?a:a.substr(0,b)}function jc(a){return a.substr(0,ic(a).lastIndexOf("/")+1)}function kc(a){return a.substring(0,a.indexOf("/",a.indexOf("//")+2))}function lc(a,b){this.$$html5=!0,b=b||"";var d=jc(a);fc(a,this,a),this.$$parse=function(b){var c=hc(d,b);if(!u(c))throw fe("ipthprfx",'Invalid url "{0}", missing path prefix "{1}".',b,d);gc(c,this,a),this.$$path||(this.$$path="/"),this.$$compose()},this.$$compose=function(){var a=X(this.$$search),b=this.$$hash?"#"+Y(this.$$hash):"";this.$$url=ec(this.$$path)+(a?"?"+a:"")+b,this.$$absUrl=d+this.$$url.substr(1)},this.$$rewrite=function(e){var f,g;return(f=hc(a,e))!==c?(g=f,(f=hc(b,f))!==c?d+(hc("/",f)||f):a+g):(f=hc(d,e))!==c?d+f:d==e+"/"?d:void 0}}function mc(a,b){var c=jc(a);fc(a,this,a),this.$$parse=function(d){function e(a,b,c){var d,e=/^\/[A-Z]:(\/.*)/;return 0===b.indexOf(c)&&(b=b.replace(c,"")),e.exec(b)?a:(d=e.exec(a),d?d[1]:a)}var f=hc(a,d)||hc(c,d),g="#"==f.charAt(0)?hc(b,f):this.$$html5?f:"";if(!u(g))throw fe("ihshprfx",'Invalid url "{0}", missing hash prefix "{1}".',d,b);gc(g,this,a),this.$$path=e(this.$$path,g,a),this.$$compose()},this.$$compose=function(){var c=X(this.$$search),d=this.$$hash?"#"+Y(this.$$hash):"";this.$$url=ec(this.$$path)+(c?"?"+c:"")+d,this.$$absUrl=a+(this.$$url?b+this.$$url:"")},this.$$rewrite=function(b){return ic(a)==ic(b)?b:void 0}}function nc(a,b){this.$$html5=!0,mc.apply(this,arguments);var c=jc(a);this.$$rewrite=function(d){var e;return a==ic(d)?d:(e=hc(c,d))?a+b+e:c===d+"/"?c:void 0},this.$$compose=function(){var c=X(this.$$search),d=this.$$hash?"#"+Y(this.$$hash):"";this.$$url=ec(this.$$path)+(c?"?"+c:"")+d,this.$$absUrl=a+b+this.$$url}}function oc(a){return function(){return this[a]}}function pc(a,b){return function(c){return r(c)?this[a]:(this[a]=b(c),this.$$compose(),this)}}function qc(){var b="",c=!1;this.hashPrefix=function(a){return s(a)?(b=a,this):b},this.html5Mode=function(a){return s(a)?(c=a,this):c},this.$get=["$rootScope","$browser","$sniffer","$rootElement",function(d,e,f,g){function h(a){d.$broadcast("$locationChangeSuccess",i.absUrl(),a)}var i,j,k,l=e.baseHref(),m=e.url();c?(k=kc(m)+(l||"/"),j=f.history?lc:nc):(k=ic(m),j=mc),i=new j(k,"#"+b),i.$$parse(i.$$rewrite(m)),g.on("click",function(c){if(!c.ctrlKey&&!c.metaKey&&2!=c.which){for(var f=sd(c.target);"a"!==md(f[0].nodeName);)if(f[0]===g[0]||!(f=f.parent())[0])return;var h=f.prop("href");if(t(h)&&"[object SVGAnimatedString]"===h.toString()&&(h=Mc(h.animVal).href),j===nc){var l=f.attr("href")||f.attr("xlink:href");if(l.indexOf("://")<0){var m="#"+b;if("/"==l[0])h=k+m+l;else if("#"==l[0])h=k+m+(i.path()||"/")+l;else{for(var n=i.path().split("/"),o=l.split("/"),p=0;p<o.length;p++)"."!=o[p]&&(".."==o[p]?n.pop():o[p].length&&n.push(o[p]));h=k+m+n.join("/")}}}var q=i.$$rewrite(h);h&&!f.attr("target")&&q&&!c.isDefaultPrevented()&&(c.preventDefault(),q!=e.url()&&(i.$$parse(q),d.$apply(),a.angular["ff-684208-preventDefault"]=!0))}}),i.absUrl()!=m&&e.url(i.absUrl(),!0),e.onUrlChange(function(a){i.absUrl()!=a&&(d.$evalAsync(function(){var b=i.absUrl();i.$$parse(a),d.$broadcast("$locationChangeStart",a,b).defaultPrevented?(i.$$parse(b),e.url(b)):h(b)}),d.$$phase||d.$digest())});var n=0;return d.$watch(function(){var a=e.url(),b=i.$$replace;return n&&a==i.absUrl()||(n++,d.$evalAsync(function(){d.$broadcast("$locationChangeStart",i.absUrl(),a).defaultPrevented?i.$$parse(a):(e.url(i.absUrl(),b),h(a))})),i.$$replace=!1,n}),i}]}function rc(){var a=!0,b=this;this.debugEnabled=function(b){return s(b)?(a=b,this):a},this.$get=["$window",function(c){function d(a){return a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&(a=a.message+"\n"+a.sourceURL+":"+a.line)),a}function e(a){var b=c.console||{},e=b[a]||b.log||o,g=!1;try{g=!!e.apply}catch(h){}return g?function(){var a=[];return f(arguments,function(b){a.push(d(b))}),e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){a&&c.apply(b,arguments)}}()}}]}function sc(a,b){if("constructor"===a)throw he("isecfld",'Referencing "constructor" field in Angular expressions is disallowed! Expression: {0}',b);return a}function tc(a,b){if(a){if(a.constructor===a)throw he("isecfn","Referencing Function in Angular expressions is disallowed! Expression: {0}",b);if(a.document&&a.location&&a.alert&&a.setInterval)throw he("isecwindow","Referencing the Window in Angular expressions is disallowed! Expression: {0}",b);if(a.children&&(a.nodeName||a.prop&&a.attr&&a.find))throw he("isecdom","Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}",b)}return a}function uc(a,b,d,e,f){f=f||{};for(var g,h=b.split("."),i=0;h.length>1;i++){g=sc(h.shift(),e);var j=a[g];j||(j={},a[g]=j),a=j,a.then&&f.unwrapPromises&&(ge(e),"$$v"in a||!function(a){a.then(function(b){a.$$v=b})}(a),a.$$v===c&&(a.$$v={}),a=a.$$v)}return g=sc(h.shift(),e),a[g]=d,d}function vc(a,b,d,e,f,g,h){return sc(a,g),sc(b,g),sc(d,g),sc(e,g),sc(f,g),h.unwrapPromises?function(h,i){var j,k=i&&i.hasOwnProperty(a)?i:h;return null==k?k:(k=k[a],k&&k.then&&(ge(g),"$$v"in k||(j=k,j.$$v=c,j.then(function(a){j.$$v=a})),k=k.$$v),b?null==k?c:(k=k[b],k&&k.then&&(ge(g),"$$v"in k||(j=k,j.$$v=c,j.then(function(a){j.$$v=a})),k=k.$$v),d?null==k?c:(k=k[d],k&&k.then&&(ge(g),"$$v"in k||(j=k,j.$$v=c,j.then(function(a){j.$$v=a})),k=k.$$v),e?null==k?c:(k=k[e],k&&k.then&&(ge(g),"$$v"in k||(j=k,j.$$v=c,j.then(function(a){j.$$v=a})),k=k.$$v),f?null==k?c:(k=k[f],k&&k.then&&(ge(g),"$$v"in k||(j=k,j.$$v=c,j.then(function(a){j.$$v=a})),k=k.$$v),k):k):k):k):k)}:function(g,h){var i=h&&h.hasOwnProperty(a)?h:g;return null==i?i:(i=i[a],b?null==i?c:(i=i[b],d?null==i?c:(i=i[d],e?null==i?c:(i=i[e],f?null==i?c:i=i[f]:i):i):i):i)}}function wc(a,b){return sc(a,b),function(b,d){return null==b?c:(d&&d.hasOwnProperty(a)?d:b)[a]}}function xc(a,b,d){return sc(a,d),sc(b,d),function(d,e){return null==d?c:(d=(e&&e.hasOwnProperty(a)?e:d)[a],null==d?c:d[b])}}function yc(a,b,d){if(ne.hasOwnProperty(a))return ne[a];var e,g=a.split("."),h=g.length;if(b.unwrapPromises||1!==h)if(b.unwrapPromises||2!==h)if(b.csp)e=6>h?vc(g[0],g[1],g[2],g[3],g[4],d,b):function(a,e){var f,i=0;do f=vc(g[i++],g[i++],g[i++],g[i++],g[i++],d,b)(a,e),e=c,a=f;while(h>i);return f};else{var i="var p;\n";f(g,function(a,c){sc(a,d),i+="if(s == null) return undefined;\ns="+(c?"s":'((k&&k.hasOwnProperty("'+a+'"))?k:s)')+'["'+a+'"];\n'+(b.unwrapPromises?'if (s && s.then) {\n pw("'+d.replace(/(["\r\n])/g,"\\$1")+'");\n if (!("$$v" in s)) {\n p=s;\n p.$$v = undefined;\n p.then(function(v) {p.$$v=v;});\n}\n s=s.$$v\n}\n':"")}),i+="return s;";var j=new Function("s","k","pw",i);j.toString=q(i),e=b.unwrapPromises?function(a,b){return j(a,b,ge)}:j}else e=xc(g[0],g[1],d);else e=wc(g[0],d);return"hasOwnProperty"!==a&&(ne[a]=e),e}function zc(){var a={},b={csp:!1,unwrapPromises:!1,logPromiseWarnings:!0};this.unwrapPromises=function(a){return s(a)?(b.unwrapPromises=!!a,this):b.unwrapPromises},this.logPromiseWarnings=function(a){return s(a)?(b.logPromiseWarnings=a,this):b.logPromiseWarnings},this.$get=["$filter","$sniffer","$log",function(c,d,e){return b.csp=d.csp,ge=function(a){b.logPromiseWarnings&&!ie.hasOwnProperty(a)&&(ie[a]=!0,e.warn("[$parse] Promise found in the expression `"+a+"`. Automatic unwrapping of promises in Angular expressions is deprecated."))},function(d){var e;switch(typeof d){case"string":if(a.hasOwnProperty(d))return a[d];var f=new le(b),g=new me(f,c,b);return e=g.parse(d),"hasOwnProperty"!==d&&(a[d]=e),e;case"function":return d;default:return o}}}]}function Ac(){this.$get=["$rootScope","$exceptionHandler",function(a,b){return Bc(function(b){a.$evalAsync(b)},b)}]}function Bc(a,b){function d(a){return a}function e(a){return j(a)}function g(a){var b=h(),c=0,d=x(a)?[]:{};return f(a,function(a,e){c++,i(a).then(function(a){d.hasOwnProperty(e)||(d[e]=a,--c||b.resolve(d))},function(a){d.hasOwnProperty(e)||b.reject(a)})}),0===c&&b.resolve(d),b.promise}var h=function(){var f,g,j=[];return g={resolve:function(b){if(j){var d=j;j=c,f=i(b),d.length&&a(function(){for(var a,b=0,c=d.length;c>b;b++)a=d[b],f.then(a[0],a[1],a[2])})}},reject:function(a){g.resolve(k(a))},notify:function(b){if(j){var c=j;j.length&&a(function(){for(var a,d=0,e=c.length;e>d;d++)a=c[d],a[2](b)})}},promise:{then:function(a,c,g){var i=h(),k=function(c){try{i.resolve((y(a)?a:d)(c))}catch(e){i.reject(e),b(e)}},l=function(a){try{i.resolve((y(c)?c:e)(a))}catch(d){i.reject(d),b(d)}},m=function(a){try{i.notify((y(g)?g:d)(a))}catch(c){b(c)}};return j?j.push([k,l,m]):f.then(k,l,m),i.promise},"catch":function(a){return this.then(null,a)},"finally":function(a){function b(a,b){var c=h();return b?c.resolve(a):c.reject(a),c.promise}function c(c,e){var f=null;try{f=(a||d)()}catch(g){return b(g,!1)}return f&&y(f.then)?f.then(function(){return b(c,e)},function(a){return b(a,!1)}):b(c,e)}return this.then(function(a){return c(a,!0)},function(a){return c(a,!1)})}}}},i=function(b){return b&&y(b.then)?b:{then:function(c){var d=h();return a(function(){d.resolve(c(b))}),d.promise}}},j=function(a){var b=h();return b.reject(a),b.promise},k=function(c){return{then:function(d,f){var g=h();return a(function(){try{g.resolve((y(f)?f:e)(c))}catch(a){g.reject(a),b(a)}}),g.promise}}},l=function(c,f,g,k){var l,m=h(),n=function(a){try{return(y(f)?f:d)(a)}catch(c){return b(c),j(c)}},o=function(a){try{return(y(g)?g:e)(a)}catch(c){return b(c),j(c)}},p=function(a){try{return(y(k)?k:d)(a)}catch(c){b(c)}};return a(function(){i(c).then(function(a){l||(l=!0,m.resolve(i(a).then(n,o,p)))},function(a){l||(l=!0,m.resolve(o(a)))},function(a){l||m.notify(p(a))})}),m.promise};return{defer:h,reject:j,when:l,all:g}}function Cc(){this.$get=["$window","$timeout",function(a,b){var c=a.requestAnimationFrame||a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame,d=a.cancelAnimationFrame||a.webkitCancelAnimationFrame||a.mozCancelAnimationFrame||a.webkitCancelRequestAnimationFrame,e=!!c,f=e?function(a){var b=c(a);return function(){d(b)}}:function(a){var c=b(a,16.66,!1);return function(){b.cancel(c)}};return f.supported=e,f}]}function Dc(){var a=10,b=d("$rootScope"),c=null;this.digestTtl=function(b){return arguments.length&&(a=b),a},this.$get=["$injector","$exceptionHandler","$parse","$browser",function(d,g,h,i){function k(){this.$id=j(),this.$$phase=this.$parent=this.$$watchers=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null,this["this"]=this.$root=this,this.$$destroyed=!1,this.$$asyncQueue=[],this.$$postDigestQueue=[],this.$$listeners={},this.$$listenerCount={},this.$$isolateBindings={}}function l(a){if(r.$$phase)throw b("inprog","{0} already in progress",r.$$phase);r.$$phase=a}function m(){r.$$phase=null}function n(a,b){var c=h(a);return db(c,b),c}function p(a,b,c){do a.$$listenerCount[c]-=b,0===a.$$listenerCount[c]&&delete a.$$listenerCount[c];while(a=a.$parent)}function q(){}k.prototype={constructor:k,$new:function(a){var b;return a?(b=new k,b.$root=this.$root,b.$$asyncQueue=this.$$asyncQueue,b.$$postDigestQueue=this.$$postDigestQueue):(this.$$childScopeClass||(this.$$childScopeClass=function(){this.$$watchers=this.$$nextSibling=this.$$childHead=this.$$childTail=null,this.$$listeners={},this.$$listenerCount={},this.$id=j(),this.$$childScopeClass=null},this.$$childScopeClass.prototype=this),b=new this.$$childScopeClass),b["this"]=b,b.$parent=this,b.$$prevSibling=this.$$childTail,this.$$childHead?(this.$$childTail.$$nextSibling=b,this.$$childTail=b):this.$$childHead=this.$$childTail=b,b},$watch:function(a,b,d){var e=this,f=n(a,"watch"),g=e.$$watchers,h={fn:b,last:q,get:f,exp:a,eq:!!d};if(c=null,!y(b)){var i=n(b||o,"listener");h.fn=function(a,b,c){i(c)}}if("string"==typeof a&&f.constant){var j=h.fn;h.fn=function(a,b,c){j.call(this,a,b,c),I(g,h)}}return g||(g=e.$$watchers=[]),g.unshift(h),function(){I(g,h),c=null}},$watchCollection:function(a,b){function c(){f=m(j);var a,b;if(t(f))if(e(f)){g!==n&&(g=n,q=g.length=0,l++),a=f.length,q!==a&&(l++,g.length=q=a);for(var c=0;a>c;c++){var d=g[c]!==g[c]&&f[c]!==f[c];d||g[c]===f[c]||(l++,g[c]=f[c])}}else{g!==o&&(g=o={},q=0,l++),a=0;for(b in f)f.hasOwnProperty(b)&&(a++,g.hasOwnProperty(b)?g[b]!==f[b]&&(l++,g[b]=f[b]):(q++,g[b]=f[b],l++));if(q>a){l++;for(b in g)g.hasOwnProperty(b)&&!f.hasOwnProperty(b)&&(q--,delete g[b])}}else g!==f&&(g=f,l++);return l}function d(){if(p?(p=!1,b(f,f,j)):b(f,i,j),k)if(t(f))if(e(f)){i=new Array(f.length);for(var a=0;a<f.length;a++)i[a]=f[a]}else{i={};for(var c in f)nd.call(f,c)&&(i[c]=f[c])}else i=f}var f,g,i,j=this,k=b.length>1,l=0,m=h(a),n=[],o={},p=!0,q=0;return this.$watch(c,d)},$digest:function(){var d,e,f,h,i,j,k,n,o,p,r,s=this.$$asyncQueue,t=this.$$postDigestQueue,u=a,v=this,w=[];l("$digest"),c=null;do{for(j=!1,n=v;s.length;){try{r=s.shift(),r.scope.$eval(r.expression)}catch(x){m(),g(x)}c=null}a:do{if(h=n.$$watchers)for(i=h.length;i--;)try{if(d=h[i])if((e=d.get(n))===(f=d.last)||(d.eq?L(e,f):"number"==typeof e&&"number"==typeof f&&isNaN(e)&&isNaN(f))){if(d===c){j=!1;break a}}else j=!0,c=d,d.last=d.eq?J(e,null):e,d.fn(e,f===q?e:f,n),5>u&&(o=4-u,w[o]||(w[o]=[]),p=y(d.exp)?"fn: "+(d.exp.name||d.exp.toString()):d.exp,p+="; newVal: "+R(e)+"; oldVal: "+R(f),w[o].push(p))}catch(x){m(),g(x)}if(!(k=n.$$childHead||n!==v&&n.$$nextSibling))for(;n!==v&&!(k=n.$$nextSibling);)n=n.$parent}while(n=k);if((j||s.length)&&!u--)throw m(),b("infdig","{0} $digest() iterations reached. Aborting!\nWatchers fired in the last 5 iterations: {1}",a,R(w))}while(j||s.length);for(m();t.length;)try{t.shift()()}catch(x){g(x)}},$destroy:function(){if(!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy"),this.$$destroyed=!0,this!==r&&(f(this.$$listenerCount,P(null,p,this)),a.$$childHead==this&&(a.$$childHead=this.$$nextSibling),a.$$childTail==this&&(a.$$childTail=this.$$prevSibling),this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling),this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling),this.$parent=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=this.$root=null,this.$$listeners={},this.$$watchers=this.$$asyncQueue=this.$$postDigestQueue=[],this.$destroy=this.$digest=this.$apply=o,this.$on=this.$watch=function(){return o})}},$eval:function(a,b){return h(a)(this,b)},$evalAsync:function(a){r.$$phase||r.$$asyncQueue.length||i.defer(function(){r.$$asyncQueue.length&&r.$digest()}),this.$$asyncQueue.push({scope:this,expression:a})},$$postDigest:function(a){this.$$postDigestQueue.push(a)},$apply:function(a){try{return l("$apply"),this.$eval(a)}catch(b){g(b)}finally{m();try{r.$digest()}catch(b){throw g(b),b}}},$on:function(a,b){var c=this.$$listeners[a];c||(this.$$listeners[a]=c=[]),c.push(b);var d=this;do d.$$listenerCount[a]||(d.$$listenerCount[a]=0),d.$$listenerCount[a]++;while(d=d.$parent);var e=this;return function(){c[H(c,b)]=null,p(e,1,a)}},$emit:function(a){var b,c,d,e=[],f=this,h=!1,i={name:a,targetScope:f,stopPropagation:function(){h=!0},preventDefault:function(){i.defaultPrevented=!0},defaultPrevented:!1},j=N([i],arguments,1);do{for(b=f.$$listeners[a]||e,i.currentScope=f,c=0,d=b.length;d>c;c++)if(b[c])try{b[c].apply(null,j)}catch(k){g(k)}else b.splice(c,1),c--,d--;if(h)return i;f=f.$parent}while(f);return i},$broadcast:function(a){for(var b,c,d,e=this,f=e,h=e,i={name:a,targetScope:e,preventDefault:function(){i.defaultPrevented=!0},defaultPrevented:!1},j=N([i],arguments,1);f=h;){for(i.currentScope=f,b=f.$$listeners[a]||[],c=0,d=b.length;d>c;c++)if(b[c])try{b[c].apply(null,j)}catch(k){g(k)}else b.splice(c,1),c--,d--;if(!(h=f.$$listenerCount[a]&&f.$$childHead||f!==e&&f.$$nextSibling))for(;f!==e&&!(h=f.$$nextSibling);)f=f.$parent}return i}};var r=new k;return r}]}function Ec(){var a=/^\s*(https?|ftp|mailto|tel|file):/,b=/^\s*(https?|ftp|file):|data:image\//;this.aHrefSanitizationWhitelist=function(b){return s(b)?(a=b,this):a},this.imgSrcSanitizationWhitelist=function(a){return s(a)?(b=a,this):b},this.$get=function(){return function(c,d){var e,f=d?b:a;return rd&&!(rd>=8)||(e=Mc(c).href,""===e||e.match(f))?c:"unsafe:"+e}}}function Fc(a){return a.replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g,"\\$1").replace(/\x08/g,"\\x08")}function Gc(a){if("self"===a)return a;if(u(a)){if(a.indexOf("***")>-1)throw oe("iwcard","Illegal sequence *** in string matcher.  String: {0}",a);return a=Fc(a).replace("\\*\\*",".*").replace("\\*","[^:/.?&;]*"),new RegExp("^"+a+"$")}if(z(a))return new RegExp("^"+a.source+"$");throw oe("imatcher",'Matchers may only be "self", string patterns or RegExp objects')}function Hc(a){var b=[];return s(a)&&f(a,function(a){b.push(Gc(a))}),b}function Ic(){this.SCE_CONTEXTS=pe;var a=["self"],b=[];this.resourceUrlWhitelist=function(b){return arguments.length&&(a=Hc(b)),a},this.resourceUrlBlacklist=function(a){return arguments.length&&(b=Hc(a)),b},this.$get=["$injector",function(d){function e(a,b){return"self"===a?Nc(b):!!a.exec(b.href)}function f(c){var d,f,g=Mc(c.toString()),h=!1;for(d=0,f=a.length;f>d;d++)if(e(a[d],g)){h=!0;break}if(h)for(d=0,f=b.length;f>d;d++)if(e(b[d],g)){h=!1;break}return h}function g(a){var b=function(a){this.$$unwrapTrustedValue=function(){return a}};return a&&(b.prototype=new a),b.prototype.valueOf=function(){return this.$$unwrapTrustedValue()},b.prototype.toString=function(){return this.$$unwrapTrustedValue().toString()},b}function h(a,b){var d=m.hasOwnProperty(a)?m[a]:null;if(!d)throw oe("icontext","Attempted to trust a value in invalid context. Context: {0}; Value: {1}",a,b);if(null===b||b===c||""===b)return b;if("string"!=typeof b)throw oe("itype","Attempted to trust a non-string value in a content requiring a string: Context: {0}",a);return new d(b)}function i(a){return a instanceof l?a.$$unwrapTrustedValue():a}function j(a,b){if(null===b||b===c||""===b)return b;var d=m.hasOwnProperty(a)?m[a]:null;if(d&&b instanceof d)return b.$$unwrapTrustedValue();if(a===pe.RESOURCE_URL){if(f(b))return b;throw oe("insecurl","Blocked loading resource from url not allowed by $sceDelegate policy.  URL: {0}",b.toString())}if(a===pe.HTML)return k(b);throw oe("unsafe","Attempting to use an unsafe value in a safe context.")}var k=function(){throw oe("unsafe","Attempting to use an unsafe value in a safe context.")};d.has("$sanitize")&&(k=d.get("$sanitize"));var l=g(),m={};return m[pe.HTML]=g(l),m[pe.CSS]=g(l),m[pe.URL]=g(l),m[pe.JS]=g(l),m[pe.RESOURCE_URL]=g(m[pe.URL]),{trustAs:h,getTrusted:j,valueOf:i}}]}function Jc(){var a=!0;this.enabled=function(b){return arguments.length&&(a=!!b),a},this.$get=["$parse","$sniffer","$sceDelegate",function(b,c,d){if(a&&c.msie&&c.msieDocumentMode<8)throw oe("iequirks","Strict Contextual Escaping does not support Internet Explorer version < 9 in quirks mode.  You can fix this by adding the text <!doctype html> to the top of your HTML document.  See http://docs.angularjs.org/api/ng.$sce for more information.");var e=K(pe);e.isEnabled=function(){return a},e.trustAs=d.trustAs,e.getTrusted=d.getTrusted,e.valueOf=d.valueOf,a||(e.trustAs=e.getTrusted=function(a,b){return b},e.valueOf=p),e.parseAs=function(a,c){var d=b(c);return d.literal&&d.constant?d:function(b,c){return e.getTrusted(a,d(b,c))}};var g=e.parseAs,h=e.getTrusted,i=e.trustAs;return f(pe,function(a,b){var c=md(b);e[kb("parse_as_"+c)]=function(b){return g(a,b)},e[kb("get_trusted_"+c)]=function(b){return h(a,b)},e[kb("trust_as_"+c)]=function(b){return i(a,b)}}),e}]}function Kc(){this.$get=["$window","$document",function(a,b){var c,d,e={},f=m((/android (\d+)/.exec(md((a.navigator||{}).userAgent))||[])[1]),g=/Boxee/i.test((a.navigator||{}).userAgent),h=b[0]||{},i=h.documentMode,j=/^(Moz|webkit|O|ms)(?=[A-Z])/,k=h.body&&h.body.style,l=!1,n=!1;if(k){for(var o in k)if(d=j.exec(o)){c=d[0],c=c.substr(0,1).toUpperCase()+c.substr(1);break}c||(c="WebkitOpacity"in k&&"webkit"),l=!!("transition"in k||c+"Transition"in k),n=!!("animation"in k||c+"Animation"in k),!f||l&&n||(l=u(h.body.style.webkitTransition),n=u(h.body.style.webkitAnimation))}return{history:!(!a.history||!a.history.pushState||4>f||g),hashchange:"onhashchange"in a&&(!i||i>7),hasEvent:function(a){if("input"==a&&9==rd)return!1;if(r(e[a])){var b=h.createElement("div");e[a]="on"+a in b}return e[a]},csp:M(),vendorPrefix:c,transitions:l,animations:n,android:f,msie:rd,msieDocumentMode:i}}]}function Lc(){this.$get=["$rootScope","$browser","$q","$exceptionHandler",function(a,b,c,d){function e(e,g,h){var i,j=c.defer(),k=j.promise,l=s(h)&&!h;return i=b.defer(function(){try{j.resolve(e())}catch(b){j.reject(b),d(b)}finally{delete f[k.$$timeoutId]}l||a.$apply()},g),k.$$timeoutId=i,f[i]=j,k}var f={};return e.cancel=function(a){return a&&a.$$timeoutId in f?(f[a.$$timeoutId].reject("canceled"),delete f[a.$$timeoutId],b.defer.cancel(a.$$timeoutId)):!1},e}]}function Mc(a){var b=a;return rd&&(qe.setAttribute("href",b),b=qe.href),qe.setAttribute("href",b),{href:qe.href,protocol:qe.protocol?qe.protocol.replace(/:$/,""):"",host:qe.host,search:qe.search?qe.search.replace(/^\?/,""):"",hash:qe.hash?qe.hash.replace(/^#/,""):"",hostname:qe.hostname,port:qe.port,pathname:"/"===qe.pathname.charAt(0)?qe.pathname:"/"+qe.pathname}}function Nc(a){var b=u(a)?Mc(a):a;return b.protocol===re.protocol&&b.host===re.host}function Oc(){this.$get=q(a)}function Pc(a){function b(d,e){if(t(d)){var g={};return f(d,function(a,c){g[c]=b(c,a)}),g}return a.factory(d+c,e)}var c="Filter";this.register=b,this.$get=["$injector",function(a){return function(b){return a.get(b+c)}}],b("currency",Rc),b("date",Zc),b("filter",Qc),b("json",$c),b("limitTo",_c),b("lowercase",we),b("number",Sc),b("orderBy",ad),b("uppercase",xe)}function Qc(){return function(a,b,c){if(!x(a))return a;var d=typeof c,e=[];e.check=function(a){for(var b=0;b<e.length;b++)if(!e[b](a))return!1;return!0},"function"!==d&&(c="boolean"===d&&c?function(a,b){return Ad.equals(a,b)}:function(a,b){if(a&&b&&"object"==typeof a&&"object"==typeof b){for(var d in a)if("$"!==d.charAt(0)&&nd.call(a,d)&&c(a[d],b[d]))return!0;return!1}return b=(""+b).toLowerCase(),(""+a).toLowerCase().indexOf(b)>-1});var f=function(a,b){if("string"==typeof b&&"!"===b.charAt(0))return!f(a,b.substr(1));switch(typeof a){case"boolean":case"number":case"string":return c(a,b);case"object":switch(typeof b){case"object":return c(a,b);default:for(var d in a)if("$"!==d.charAt(0)&&f(a[d],b))return!0}return!1;case"array":for(var e=0;e<a.length;e++)if(f(a[e],b))return!0;return!1;default:return!1}};switch(typeof b){case"boolean":case"number":case"string":b={$:b};case"object":for(var g in b)!function(a){"undefined"!=typeof b[a]&&e.push(function(c){return f("$"==a?c:c&&c[a],b[a])})}(g);break;case"function":e.push(b);break;default:return a}for(var h=[],i=0;i<a.length;i++){var j=a[i];e.check(j)&&h.push(j)}return h}}function Rc(a){var b=a.NUMBER_FORMATS;return function(a,c){return r(c)&&(c=b.CURRENCY_SYM),Tc(a,b.PATTERNS[1],b.GROUP_SEP,b.DECIMAL_SEP,2).replace(/\u00A4/g,c)}}function Sc(a){var b=a.NUMBER_FORMATS;return function(a,c){return Tc(a,b.PATTERNS[0],b.GROUP_SEP,b.DECIMAL_SEP,c)}}function Tc(a,b,c,d,e){if(null==a||!isFinite(a)||t(a))return"";var f=0>a;a=Math.abs(a);var g=a+"",h="",i=[],j=!1;if(-1!==g.indexOf("e")){var k=g.match(/([\d\.]+)e(-?)(\d+)/);k&&"-"==k[2]&&k[3]>e+1?g="0":(h=g,j=!0)}if(j)e>0&&a>-1&&1>a&&(h=a.toFixed(e));else{var l=(g.split(se)[1]||"").length;r(e)&&(e=Math.min(Math.max(b.minFrac,l),b.maxFrac));var m=Math.pow(10,e+1);a=Math.floor(a*m+5)/m;var n=(""+a).split(se),o=n[0];n=n[1]||"";var p,q=0,s=b.lgSize,u=b.gSize;if(o.length>=s+u)for(q=o.length-s,p=0;q>p;p++)(q-p)%u===0&&0!==p&&(h+=c),h+=o.charAt(p);for(p=q;p<o.length;p++)(o.length-p)%s===0&&0!==p&&(h+=c),h+=o.charAt(p);for(;n.length<e;)n+="0";e&&"0"!==e&&(h+=d+n.substr(0,e))}return i.push(f?b.negPre:b.posPre),i.push(h),i.push(f?b.negSuf:b.posSuf),i.join("")}function Uc(a,b,c){var d="";for(0>a&&(d="-",a=-a),a=""+a;a.length<b;)a="0"+a;return c&&(a=a.substr(a.length-b)),d+a}function Vc(a,b,c,d){return c=c||0,function(e){var f=e["get"+a]();return(c>0||f>-c)&&(f+=c),0===f&&-12==c&&(f=12),Uc(f,b,d)}}function Wc(a,b){return function(c,d){var e=c["get"+a](),f=od(b?"SHORT"+a:a);return d[f][e]}}function Xc(a){var b=-1*a.getTimezoneOffset(),c=b>=0?"+":"";return c+=Uc(Math[b>0?"floor":"ceil"](b/60),2)+Uc(Math.abs(b%60),2)}function Yc(a,b){return a.getHours()<12?b.AMPMS[0]:b.AMPMS[1]}function Zc(a){function b(a){var b;
+if(b=a.match(c)){var d=new Date(0),e=0,f=0,g=b[8]?d.setUTCFullYear:d.setFullYear,h=b[8]?d.setUTCHours:d.setHours;b[9]&&(e=m(b[9]+b[10]),f=m(b[9]+b[11])),g.call(d,m(b[1]),m(b[2])-1,m(b[3]));var i=m(b[4]||0)-e,j=m(b[5]||0)-f,k=m(b[6]||0),l=Math.round(1e3*parseFloat("0."+(b[7]||0)));return h.call(d,i,j,k,l),d}return a}var c=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,d){var e,g,h="",i=[];if(d=d||"mediumDate",d=a.DATETIME_FORMATS[d]||d,u(c)&&(c=ve.test(c)?m(c):b(c)),v(c)&&(c=new Date(c)),!w(c))return c;for(;d;)g=ue.exec(d),g?(i=N(i,g,1),d=i.pop()):(i.push(d),d=null);return f(i,function(b){e=te[b],h+=e?e(c,a.DATETIME_FORMATS):b.replace(/(^'|'$)/g,"").replace(/''/g,"'")}),h}}function $c(){return function(a){return R(a,!0)}}function _c(){return function(a,b){if(!x(a)&&!u(a))return a;if(b=1/0===Math.abs(Number(b))?Number(b):m(b),u(a))return b?b>=0?a.slice(0,b):a.slice(b,a.length):"";var c,d,e=[];for(b>a.length?b=a.length:b<-a.length&&(b=-a.length),b>0?(c=0,d=b):(c=a.length+b,d=a.length);d>c;c++)e.push(a[c]);return e}}function ad(a){return function(b,c,d){function e(a,b){for(var d=0;d<c.length;d++){var e=c[d](a,b);if(0!==e)return e}return 0}function f(a,b){return T(b)?function(b,c){return a(c,b)}:a}function g(a,b){var c=typeof a,d=typeof b;return c==d?("string"==c&&(a=a.toLowerCase(),b=b.toLowerCase()),a===b?0:b>a?-1:1):d>c?-1:1}if(!x(b))return b;if(!c)return b;c=x(c)?c:[c],c=F(c,function(b){var c=!1,d=b||p;if(u(b)&&(("+"==b.charAt(0)||"-"==b.charAt(0))&&(c="-"==b.charAt(0),b=b.substring(1)),d=a(b),d.constant)){var e=d();return f(function(a,b){return g(a[e],b[e])},c)}return f(function(a,b){return g(d(a),d(b))},c)});for(var h=[],i=0;i<b.length;i++)h.push(b[i]);return h.sort(f(e,d))}}function bd(a){return y(a)&&(a={link:a}),a.restrict=a.restrict||"AC",q(a)}function cd(a,b,c,d){function e(b,c){c=c?"-"+ab(c,"-"):"",d.removeClass(a,(b?Ke:Je)+c),d.addClass(a,(b?Je:Ke)+c)}var g=this,h=a.parent().controller("form")||Ae,i=0,j=g.$error={},k=[];g.$name=b.name||b.ngForm,g.$dirty=!1,g.$pristine=!0,g.$valid=!0,g.$invalid=!1,h.$addControl(g),a.addClass(Le),e(!0),g.$addControl=function(a){eb(a.$name,"input"),k.push(a),a.$name&&(g[a.$name]=a)},g.$removeControl=function(a){a.$name&&g[a.$name]===a&&delete g[a.$name],f(j,function(b,c){g.$setValidity(c,!0,a)}),I(k,a)},g.$setValidity=function(a,b,c){var d=j[a];if(b)d&&(I(d,c),d.length||(i--,i||(e(b),g.$valid=!0,g.$invalid=!1),j[a]=!1,e(!0,a),h.$setValidity(a,!0,g)));else{if(i||e(b),d){if(G(d,c))return}else j[a]=d=[],i++,e(!1,a),h.$setValidity(a,!1,g);d.push(c),g.$valid=!1,g.$invalid=!0}},g.$setDirty=function(){d.removeClass(a,Le),d.addClass(a,Me),g.$dirty=!0,g.$pristine=!1,h.$setDirty()},g.$setPristine=function(){d.removeClass(a,Me),d.addClass(a,Le),g.$dirty=!1,g.$pristine=!0,f(k,function(a){a.$setPristine()})}}function dd(a,b,d,e){return a.$setValidity(b,d),d?e:c}function ed(a,b,c){var d=c.prop("validity");if(t(d)){var e=function(c){return a.$error[b]||!(d.badInput||d.customError||d.typeMismatch)||d.valueMissing?c:void a.$setValidity(b,!1)};a.$parsers.push(e)}}function fd(a,b,c,e,f,g){var h=b.prop("validity"),i=b[0].placeholder,j={};if(!f.android){var k=!1;b.on("compositionstart",function(){k=!0}),b.on("compositionend",function(){k=!1,l()})}var l=function(d){if(!k){var f=b.val();if(rd&&"input"===(d||j).type&&b[0].placeholder!==i)return void(i=b[0].placeholder);T(c.ngTrim||"T")&&(f=Cd(f)),(e.$viewValue!==f||h&&""===f&&!h.valueMissing)&&(a.$$phase?e.$setViewValue(f):a.$apply(function(){e.$setViewValue(f)}))}};if(f.hasEvent("input"))b.on("input",l);else{var n,o=function(){n||(n=g.defer(function(){l(),n=null}))};b.on("keydown",function(a){var b=a.keyCode;91===b||b>15&&19>b||b>=37&&40>=b||o()}),f.hasEvent("paste")&&b.on("paste cut",o)}b.on("change",l),e.$render=function(){b.val(e.$isEmpty(e.$viewValue)?"":e.$viewValue)};var p,q,r=c.ngPattern;if(r){var s=function(a,b){return dd(e,"pattern",e.$isEmpty(b)||a.test(b),b)};q=r.match(/^\/(.*)\/([gim]*)$/),q?(r=new RegExp(q[1],q[2]),p=function(a){return s(r,a)}):p=function(c){var e=a.$eval(r);if(!e||!e.test)throw d("ngPattern")("noregexp","Expected {0} to be a RegExp but was {1}. Element: {2}",r,e,U(b));return s(e,c)},e.$formatters.push(p),e.$parsers.push(p)}if(c.ngMinlength){var t=m(c.ngMinlength),u=function(a){return dd(e,"minlength",e.$isEmpty(a)||a.length>=t,a)};e.$parsers.push(u),e.$formatters.push(u)}if(c.ngMaxlength){var v=m(c.ngMaxlength),w=function(a){return dd(e,"maxlength",e.$isEmpty(a)||a.length<=v,a)};e.$parsers.push(w),e.$formatters.push(w)}}function gd(a,b,d,e,f,g){if(fd(a,b,d,e,f,g),e.$parsers.push(function(a){var b=e.$isEmpty(a);return b||Ge.test(a)?(e.$setValidity("number",!0),""===a?null:b?a:parseFloat(a)):(e.$setValidity("number",!1),c)}),ed(e,"number",b),e.$formatters.push(function(a){return e.$isEmpty(a)?"":""+a}),d.min){var h=function(a){var b=parseFloat(d.min);return dd(e,"min",e.$isEmpty(a)||a>=b,a)};e.$parsers.push(h),e.$formatters.push(h)}if(d.max){var i=function(a){var b=parseFloat(d.max);return dd(e,"max",e.$isEmpty(a)||b>=a,a)};e.$parsers.push(i),e.$formatters.push(i)}e.$formatters.push(function(a){return dd(e,"number",e.$isEmpty(a)||v(a),a)})}function hd(a,b,c,d,e,f){fd(a,b,c,d,e,f);var g=function(a){return dd(d,"url",d.$isEmpty(a)||Ee.test(a),a)};d.$formatters.push(g),d.$parsers.push(g)}function id(a,b,c,d,e,f){fd(a,b,c,d,e,f);var g=function(a){return dd(d,"email",d.$isEmpty(a)||Fe.test(a),a)};d.$formatters.push(g),d.$parsers.push(g)}function jd(a,b,c,d){r(c.name)&&b.attr("name",j()),b.on("click",function(){b[0].checked&&a.$apply(function(){d.$setViewValue(c.value)})}),d.$render=function(){var a=c.value;b[0].checked=a==d.$viewValue},c.$observe("value",d.$render)}function kd(a,b,c,d){var e=c.ngTrueValue,f=c.ngFalseValue;u(e)||(e=!0),u(f)||(f=!1),b.on("click",function(){a.$apply(function(){d.$setViewValue(b[0].checked)})}),d.$render=function(){b[0].checked=d.$viewValue},d.$isEmpty=function(a){return a!==e},d.$formatters.push(function(a){return a===e}),d.$parsers.push(function(a){return a?e:f})}function ld(a,b){return a="ngClass"+a,["$animate",function(c){function d(a,b){var c=[];a:for(var d=0;d<a.length;d++){for(var e=a[d],f=0;f<b.length;f++)if(e==b[f])continue a;c.push(e)}return c}function e(a){if(x(a))return a;if(u(a))return a.split(" ");if(t(a)){var b=[];return f(a,function(a,c){a&&(b=b.concat(c.split(" ")))}),b}return a}return{restrict:"AC",link:function(g,h,i){function j(a){var b=l(a,1);i.$addClass(b)}function k(a){var b=l(a,-1);i.$removeClass(b)}function l(a,b){var c=h.data("$classCounts")||{},d=[];return f(a,function(a){(b>0||c[a])&&(c[a]=(c[a]||0)+b,c[a]===+(b>0)&&d.push(a))}),h.data("$classCounts",c),d.join(" ")}function m(a,b){var e=d(b,a),f=d(a,b);f=l(f,-1),e=l(e,1),0===e.length?c.removeClass(h,f):0===f.length?c.addClass(h,e):c.setClass(h,e,f)}function n(a){if(b===!0||g.$index%2===b){var c=e(a||[]);if(o){if(!L(a,o)){var d=e(o);m(d,c)}}else j(c)}o=K(a)}var o;g.$watch(i[a],n,!0),i.$observe("class",function(){n(g.$eval(i[a]))}),"ngClass"!==a&&g.$watch("$index",function(c,d){var f=1&c;if(f!==(1&d)){var h=e(g.$eval(i[a]));f===b?j(h):k(h)}})}}}]}var md=function(a){return u(a)?a.toLowerCase():a},nd=Object.prototype.hasOwnProperty,od=function(a){return u(a)?a.toUpperCase():a},pd=function(a){return u(a)?a.replace(/[A-Z]/g,function(a){return String.fromCharCode(32|a.charCodeAt(0))}):a},qd=function(a){return u(a)?a.replace(/[a-z]/g,function(a){return String.fromCharCode(-33&a.charCodeAt(0))}):a};"i"!=="I".toLowerCase()&&(md=pd,od=qd);var rd,sd,td,ud,vd,wd=[].slice,xd=[].push,yd=Object.prototype.toString,zd=d("ng"),Ad=a.angular||(a.angular={}),Bd=["0","0","0"];rd=m((/msie (\d+)/.exec(md(navigator.userAgent))||[])[1]),isNaN(rd)&&(rd=m((/trident\/.*; rv:(\d+)/.exec(md(navigator.userAgent))||[])[1])),o.$inject=[],p.$inject=[];var Cd=function(){return String.prototype.trim?function(a){return u(a)?a.trim():a}:function(a){return u(a)?a.replace(/^\s\s*/,"").replace(/\s\s*$/,""):a}}();vd=9>rd?function(a){return a=a.nodeName?a:a[0],a.scopeName&&"HTML"!=a.scopeName?od(a.scopeName+":"+a.nodeName):a.nodeName}:function(a){return a.nodeName?a.nodeName:a[0].nodeName};var Dd=/[A-Z]/g,Ed={full:"1.2.18-build.233+sha.e906aaf",major:1,minor:2,dot:18,codeName:"snapshot"},Fd=pb.cache={},Gd=pb.expando="ng"+(new Date).getTime(),Hd=1,Id=a.document.addEventListener?function(a,b,c){a.addEventListener(b,c,!1)}:function(a,b,c){a.attachEvent("on"+b,c)},Jd=a.document.removeEventListener?function(a,b,c){a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent("on"+b,c)},Kd=(pb._data=function(a){return this.cache[a[this.expando]]||{}},/([\:\-\_]+(.))/g),Ld=/^moz([A-Z])/,Md=d("jqLite"),Nd=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,Od=/<|&#?\w+;/,Pd=/<([\w:]+)/,Qd=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,Rd={option:[1,'<select multiple="multiple">',"</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};Rd.optgroup=Rd.option,Rd.tbody=Rd.tfoot=Rd.colgroup=Rd.caption=Rd.thead,Rd.th=Rd.td;var Sd=pb.prototype={ready:function(c){function d(){e||(e=!0,c())}var e=!1;"complete"===b.readyState?setTimeout(d):(this.on("DOMContentLoaded",d),pb(a).on("load",d))},toString:function(){var a=[];return f(this,function(b){a.push(""+b)}),"["+a.join(", ")+"]"},eq:function(a){return sd(a>=0?this[a]:this[this.length+a])},length:0,push:xd,sort:[].sort,splice:[].splice},Td={};f("multiple,selected,checked,disabled,readOnly,required,open".split(","),function(a){Td[md(a)]=a});var Ud={};f("input,select,option,textarea,button,form,details".split(","),function(a){Ud[od(a)]=!0}),f({data:vb,inheritedData:Bb,scope:function(a){return sd(a).data("$scope")||Bb(a.parentNode||a,["$isolateScope","$scope"])},isolateScope:function(a){return sd(a).data("$isolateScope")||sd(a).data("$isolateScopeNoTemplate")},controller:Ab,injector:function(a){return Bb(a,"$injector")},removeAttr:function(a,b){a.removeAttribute(b)},hasClass:wb,css:function(a,b,d){if(b=kb(b),!s(d)){var e;return 8>=rd&&(e=a.currentStyle&&a.currentStyle[b],""===e&&(e="auto")),e=e||a.style[b],8>=rd&&(e=""===e?c:e),e}a.style[b]=d},attr:function(a,b,d){var e=md(b);if(Td[e]){if(!s(d))return a[b]||(a.attributes.getNamedItem(b)||o).specified?e:c;d?(a[b]=!0,a.setAttribute(b,e)):(a[b]=!1,a.removeAttribute(e))}else if(s(d))a.setAttribute(b,d);else if(a.getAttribute){var f=a.getAttribute(b,2);return null===f?c:f}},prop:function(a,b,c){return s(c)?void(a[b]=c):a[b]},text:function(){function a(a,c){var d=b[a.nodeType];return r(c)?d?a[d]:"":void(a[d]=c)}var b=[];return 9>rd?(b[1]="innerText",b[3]="nodeValue"):b[1]=b[3]="textContent",a.$dv="",a}(),val:function(a,b){if(r(b)){if("SELECT"===vd(a)&&a.multiple){var c=[];return f(a.options,function(a){a.selected&&c.push(a.value||a.text)}),0===c.length?null:c}return a.value}a.value=b},html:function(a,b){if(r(b))return a.innerHTML;for(var c=0,d=a.childNodes;c<d.length;c++)rb(d[c]);a.innerHTML=b},empty:Cb},function(a,b){pb.prototype[b]=function(b,d){var e,f;if(a!==Cb&&(2==a.length&&a!==wb&&a!==Ab?b:d)===c){if(t(b)){for(e=0;e<this.length;e++)if(a===vb)a(this[e],b);else for(f in b)a(this[e],f,b[f]);return this}for(var g=a.$dv,h=g===c?Math.min(this.length,1):this.length,i=0;h>i;i++){var j=a(this[i],b,d);g=g?g+j:j}return g}for(e=0;e<this.length;e++)a(this[e],b,d);return this}}),f({removeData:tb,dealoc:rb,on:function wf(a,c,d,e){if(s(e))throw Md("onargs","jqLite#on() does not support the `selector` or `eventData` parameters");var g=ub(a,"events"),h=ub(a,"handle");g||ub(a,"events",g={}),h||ub(a,"handle",h=Eb(a,g)),f(c.split(" "),function(c){var e=g[c];if(!e){if("mouseenter"==c||"mouseleave"==c){var f=b.body.contains||b.body.compareDocumentPosition?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)for(;b=b.parentNode;)if(b===a)return!0;return!1};g[c]=[];var i={mouseleave:"mouseout",mouseenter:"mouseover"};wf(a,i[c],function(a){var b=this,d=a.relatedTarget;(!d||d!==b&&!f(b,d))&&h(a,c)})}else Id(a,c,h),g[c]=[];e=g[c]}e.push(d)})},off:sb,one:function(a,b,c){a=sd(a),a.on(b,function d(){a.off(b,c),a.off(b,d)}),a.on(b,c)},replaceWith:function(a,b){var c,d=a.parentNode;rb(a),f(new pb(b),function(b){c?d.insertBefore(b,c.nextSibling):d.replaceChild(b,a),c=b})},children:function(a){var b=[];return f(a.childNodes,function(a){1===a.nodeType&&b.push(a)}),b},contents:function(a){return a.contentDocument||a.childNodes||[]},append:function(a,b){f(new pb(b),function(b){(1===a.nodeType||11===a.nodeType)&&a.appendChild(b)})},prepend:function(a,b){if(1===a.nodeType){var c=a.firstChild;f(new pb(b),function(b){a.insertBefore(b,c)})}},wrap:function(a,b){b=sd(b)[0];var c=a.parentNode;c&&c.replaceChild(b,a),b.appendChild(a)},remove:function(a){rb(a);var b=a.parentNode;b&&b.removeChild(a)},after:function(a,b){var c=a,d=a.parentNode;f(new pb(b),function(a){d.insertBefore(a,c.nextSibling),c=a})},addClass:yb,removeClass:xb,toggleClass:function(a,b,c){b&&f(b.split(" "),function(b){var d=c;r(d)&&(d=!wb(a,b)),(d?yb:xb)(a,b)})},parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},next:function(a){if(a.nextElementSibling)return a.nextElementSibling;for(var b=a.nextSibling;null!=b&&1!==b.nodeType;)b=b.nextSibling;return b},find:function(a,b){return a.getElementsByTagName?a.getElementsByTagName(b):[]},clone:qb,triggerHandler:function(a,b,c){var d=(ub(a,"events")||{})[b];c=c||[];var e=[{preventDefault:o,stopPropagation:o}];f(d,function(b){b.apply(a,e.concat(c))})}},function(a,b){pb.prototype[b]=function(b,c,d){for(var e,f=0;f<this.length;f++)r(e)?(e=a(this[f],b,c,d),s(e)&&(e=sd(e))):zb(e,a(this[f],b,c,d));return s(e)?e:this},pb.prototype.bind=pb.prototype.on,pb.prototype.unbind=pb.prototype.off}),Gb.prototype={put:function(a,b){this[Fb(a)]=b},get:function(a){return this[Fb(a)]},remove:function(a){var b=this[a=Fb(a)];return delete this[a],b}};var Vd=/^function\s*[^\(]*\(\s*([^\)]*)\)/m,Wd=/,/,Xd=/^\s*(_?)(\S+?)\1\s*$/,Yd=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm,Zd=d("$injector"),$d=d("$animate"),_d=["$provide",function(a){this.$$selectors={},this.register=function(b,c){var d=b+"-animation";if(b&&"."!=b.charAt(0))throw $d("notcsel","Expecting class selector starting with '.' got '{0}'.",b);this.$$selectors[b.substr(1)]=d,a.factory(d,c)},this.classNameFilter=function(a){return 1===arguments.length&&(this.$$classNameFilter=a instanceof RegExp?a:null),this.$$classNameFilter},this.$get=["$timeout","$$asyncCallback",function(a,b){function c(a){a&&b(a)}return{enter:function(a,b,d,e){d?d.after(a):(b&&b[0]||(b=d.parent()),b.append(a)),c(e)},leave:function(a,b){a.remove(),c(b)},move:function(a,b,c,d){this.enter(a,b,c,d)},addClass:function(a,b,d){b=u(b)?b:x(b)?b.join(" "):"",f(a,function(a){yb(a,b)}),c(d)},removeClass:function(a,b,d){b=u(b)?b:x(b)?b.join(" "):"",f(a,function(a){xb(a,b)}),c(d)},setClass:function(a,b,d,e){f(a,function(a){yb(a,b),xb(a,d)}),c(e)},enabled:o}}]}],ae=d("$compile");Pb.$inject=["$provide","$$sanitizeUriProvider"];var be=/^(x[\:\-_]|data[\:\-_])/i,ce=d("$interpolate"),de=/^([^\?#]*)(\?([^#]*))?(#(.*))?$/,ee={http:80,https:443,ftp:21},fe=d("$location");nc.prototype=mc.prototype=lc.prototype={$$html5:!1,$$replace:!1,absUrl:oc("$$absUrl"),url:function(a,b){if(r(a))return this.$$url;var c=de.exec(a);return c[1]&&this.path(decodeURIComponent(c[1])),(c[2]||c[1])&&this.search(c[3]||""),this.hash(c[5]||"",b),this},protocol:oc("$$protocol"),host:oc("$$host"),port:oc("$$port"),path:pc("$$path",function(a){return"/"==a.charAt(0)?a:"/"+a}),search:function(a,b){switch(arguments.length){case 0:return this.$$search;case 1:if(u(a))this.$$search=W(a);else{if(!t(a))throw fe("isrcharg","The first argument of the `$location#search()` call must be a string or an object.");this.$$search=a}break;default:r(b)||null===b?delete this.$$search[a]:this.$$search[a]=b}return this.$$compose(),this},hash:pc("$$hash",p),replace:function(){return this.$$replace=!0,this}};var ge,he=d("$parse"),ie={},je={"null":function(){return null},"true":function(){return!0},"false":function(){return!1},undefined:o,"+":function(a,b,d,e){return d=d(a,b),e=e(a,b),s(d)?s(e)?d+e:d:s(e)?e:c},"-":function(a,b,c,d){return c=c(a,b),d=d(a,b),(s(c)?c:0)-(s(d)?d:0)},"*":function(a,b,c,d){return c(a,b)*d(a,b)},"/":function(a,b,c,d){return c(a,b)/d(a,b)},"%":function(a,b,c,d){return c(a,b)%d(a,b)},"^":function(a,b,c,d){return c(a,b)^d(a,b)},"=":o,"===":function(a,b,c,d){return c(a,b)===d(a,b)},"!==":function(a,b,c,d){return c(a,b)!==d(a,b)},"==":function(a,b,c,d){return c(a,b)==d(a,b)},"!=":function(a,b,c,d){return c(a,b)!=d(a,b)},"<":function(a,b,c,d){return c(a,b)<d(a,b)},">":function(a,b,c,d){return c(a,b)>d(a,b)},"<=":function(a,b,c,d){return c(a,b)<=d(a,b)},">=":function(a,b,c,d){return c(a,b)>=d(a,b)},"&&":function(a,b,c,d){return c(a,b)&&d(a,b)},"||":function(a,b,c,d){return c(a,b)||d(a,b)},"&":function(a,b,c,d){return c(a,b)&d(a,b)},"|":function(a,b,c,d){return d(a,b)(a,b,c(a,b))},"!":function(a,b,c){return!c(a,b)}},ke={n:"\n",f:"\f",r:"\r",t:"	",v:"","'":"'",'"':'"'},le=function(a){this.options=a};le.prototype={constructor:le,lex:function(a){for(this.text=a,this.index=0,this.ch=c,this.lastCh=":",this.tokens=[];this.index<this.text.length;){if(this.ch=this.text.charAt(this.index),this.is("\"'"))this.readString(this.ch);else if(this.isNumber(this.ch)||this.is(".")&&this.isNumber(this.peek()))this.readNumber();else if(this.isIdent(this.ch))this.readIdent();else if(this.is("(){}[].,;:?"))this.tokens.push({index:this.index,text:this.ch}),this.index++;else{if(this.isWhitespace(this.ch)){this.index++;continue}var b=this.ch+this.peek(),d=b+this.peek(2),e=je[this.ch],f=je[b],g=je[d];g?(this.tokens.push({index:this.index,text:d,fn:g}),this.index+=3):f?(this.tokens.push({index:this.index,text:b,fn:f}),this.index+=2):e?(this.tokens.push({index:this.index,text:this.ch,fn:e}),this.index+=1):this.throwError("Unexpected next character ",this.index,this.index+1)}this.lastCh=this.ch}return this.tokens},is:function(a){return-1!==a.indexOf(this.ch)},was:function(a){return-1!==a.indexOf(this.lastCh)},peek:function(a){var b=a||1;return this.index+b<this.text.length?this.text.charAt(this.index+b):!1},isNumber:function(a){return a>="0"&&"9">=a},isWhitespace:function(a){return" "===a||"\r"===a||"	"===a||"\n"===a||""===a||" "===a},isIdent:function(a){return a>="a"&&"z">=a||a>="A"&&"Z">=a||"_"===a||"$"===a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,b,c){c=c||this.index;var d=s(b)?"s "+b+"-"+this.index+" ["+this.text.substring(b,c)+"]":" "+c;throw he("lexerr","Lexer Error: {0} at column{1} in expression [{2}].",a,d,this.text)},readNumber:function(){for(var a="",b=this.index;this.index<this.text.length;){var c=md(this.text.charAt(this.index));if("."==c||this.isNumber(c))a+=c;else{var d=this.peek();if("e"==c&&this.isExpOperator(d))a+=c;else if(this.isExpOperator(c)&&d&&this.isNumber(d)&&"e"==a.charAt(a.length-1))a+=c;else{if(!this.isExpOperator(c)||d&&this.isNumber(d)||"e"!=a.charAt(a.length-1))break;this.throwError("Invalid exponent")}}this.index++}a=1*a,this.tokens.push({index:b,text:a,literal:!0,constant:!0,fn:function(){return a}})},readIdent:function(){for(var a,b,c,d,e=this,f="",g=this.index;this.index<this.text.length&&(d=this.text.charAt(this.index),"."===d||this.isIdent(d)||this.isNumber(d));)"."===d&&(a=this.index),f+=d,this.index++;if(a)for(b=this.index;b<this.text.length;){if(d=this.text.charAt(b),"("===d){c=f.substr(a-g+1),f=f.substr(0,a-g),this.index=b;break}if(!this.isWhitespace(d))break;b++}var h={index:g,text:f};if(je.hasOwnProperty(f))h.fn=je[f],h.literal=!0,h.constant=!0;else{var i=yc(f,this.options,this.text);h.fn=l(function(a,b){return i(a,b)},{assign:function(a,b){return uc(a,f,b,e.text,e.options)}})}this.tokens.push(h),c&&(this.tokens.push({index:a,text:"."}),this.tokens.push({index:a+1,text:c}))},readString:function(a){var b=this.index;this.index++;for(var c="",d=a,e=!1;this.index<this.text.length;){var f=this.text.charAt(this.index);if(d+=f,e){if("u"===f){var g=this.text.substring(this.index+1,this.index+5);g.match(/[\da-f]{4}/i)||this.throwError("Invalid unicode escape [\\u"+g+"]"),this.index+=4,c+=String.fromCharCode(parseInt(g,16))}else{var h=ke[f];c+=h?h:f}e=!1}else if("\\"===f)e=!0;else{if(f===a)return this.index++,void this.tokens.push({index:b,text:d,string:c,literal:!0,constant:!0,fn:function(){return c}});c+=f}this.index++}this.throwError("Unterminated quote",b)}};var me=function(a,b,c){this.lexer=a,this.$filter=b,this.options=c};me.ZERO=l(function(){return 0},{constant:!0}),me.prototype={constructor:me,parse:function(a){this.text=a,this.tokens=this.lexer.lex(a);var b=this.statements();return 0!==this.tokens.length&&this.throwError("is an unexpected token",this.tokens[0]),b.literal=!!b.literal,b.constant=!!b.constant,b},primary:function(){var a;if(this.expect("("))a=this.filterChain(),this.consume(")");else if(this.expect("["))a=this.arrayDeclaration();else if(this.expect("{"))a=this.object();else{var b=this.expect();a=b.fn,a||this.throwError("not a primary expression",b),a.literal=!!b.literal,a.constant=!!b.constant}for(var c,d;c=this.expect("(","[",".");)"("===c.text?(a=this.functionCall(a,d),d=null):"["===c.text?(d=a,a=this.objectIndex(a)):"."===c.text?(d=a,a=this.fieldAccess(a)):this.throwError("IMPOSSIBLE");return a},throwError:function(a,b){throw he("syntax","Syntax Error: Token '{0}' {1} at column {2} of the expression [{3}] starting at [{4}].",b.text,a,b.index+1,this.text,this.text.substring(b.index))},peekToken:function(){if(0===this.tokens.length)throw he("ueoe","Unexpected end of expression: {0}",this.text);return this.tokens[0]},peek:function(a,b,c,d){if(this.tokens.length>0){var e=this.tokens[0],f=e.text;if(f===a||f===b||f===c||f===d||!a&&!b&&!c&&!d)return e}return!1},expect:function(a,b,c,d){var e=this.peek(a,b,c,d);return e?(this.tokens.shift(),e):!1},consume:function(a){this.expect(a)||this.throwError("is unexpected, expecting ["+a+"]",this.peek())},unaryFn:function(a,b){return l(function(c,d){return a(c,d,b)},{constant:b.constant})},ternaryFn:function(a,b,c){return l(function(d,e){return a(d,e)?b(d,e):c(d,e)},{constant:a.constant&&b.constant&&c.constant})},binaryFn:function(a,b,c){return l(function(d,e){return b(d,e,a,c)},{constant:a.constant&&c.constant})},statements:function(){for(var a=[];;)if(this.tokens.length>0&&!this.peek("}",")",";","]")&&a.push(this.filterChain()),!this.expect(";"))return 1===a.length?a[0]:function(b,c){for(var d,e=0;e<a.length;e++){var f=a[e];f&&(d=f(b,c))}return d}},filterChain:function(){for(var a,b=this.expression();;){if(!(a=this.expect("|")))return b;b=this.binaryFn(b,a.fn,this.filter())}},filter:function(){for(var a=this.expect(),b=this.$filter(a.text),c=[];;){if(!(a=this.expect(":"))){var d=function(a,d,e){for(var f=[e],g=0;g<c.length;g++)f.push(c[g](a,d));return b.apply(a,f)};return function(){return d}}c.push(this.expression())}},expression:function(){return this.assignment()},assignment:function(){var a,b,c=this.ternary();return(b=this.expect("="))?(c.assign||this.throwError("implies assignment but ["+this.text.substring(0,b.index)+"] can not be assigned to",b),a=this.ternary(),function(b,d){return c.assign(b,a(b,d),d)}):c},ternary:function(){var a,b,c=this.logicalOR();return(b=this.expect("?"))?(a=this.ternary(),(b=this.expect(":"))?this.ternaryFn(c,a,this.ternary()):void this.throwError("expected :",b)):c},logicalOR:function(){for(var a,b=this.logicalAND();;){if(!(a=this.expect("||")))return b;b=this.binaryFn(b,a.fn,this.logicalAND())}},logicalAND:function(){var a,b=this.equality();return(a=this.expect("&&"))&&(b=this.binaryFn(b,a.fn,this.logicalAND())),b},equality:function(){var a,b=this.relational();return(a=this.expect("==","!=","===","!=="))&&(b=this.binaryFn(b,a.fn,this.equality())),b},relational:function(){var a,b=this.additive();return(a=this.expect("<",">","<=",">="))&&(b=this.binaryFn(b,a.fn,this.relational())),b},additive:function(){for(var a,b=this.multiplicative();a=this.expect("+","-");)b=this.binaryFn(b,a.fn,this.multiplicative());return b},multiplicative:function(){for(var a,b=this.unary();a=this.expect("*","/","%");)b=this.binaryFn(b,a.fn,this.unary());return b},unary:function(){var a;return this.expect("+")?this.primary():(a=this.expect("-"))?this.binaryFn(me.ZERO,a.fn,this.unary()):(a=this.expect("!"))?this.unaryFn(a.fn,this.unary()):this.primary()},fieldAccess:function(a){var b=this,c=this.expect().text,d=yc(c,this.options,this.text);return l(function(b,c,e){return d(e||a(b,c))},{assign:function(d,e,f){return uc(a(d,f),c,e,b.text,b.options)}})},objectIndex:function(a){var b=this,d=this.expression();return this.consume("]"),l(function(e,f){var g,h,i=a(e,f),j=d(e,f);return i?(g=tc(i[j],b.text),g&&g.then&&b.options.unwrapPromises&&(h=g,"$$v"in g||(h.$$v=c,h.then(function(a){h.$$v=a})),g=g.$$v),g):c},{assign:function(c,e,f){var g=d(c,f),h=tc(a(c,f),b.text);return h[g]=e}})},functionCall:function(a,b){var c=[];if(")"!==this.peekToken().text)do c.push(this.expression());while(this.expect(","));this.consume(")");var d=this;return function(e,f){for(var g=[],h=b?b(e,f):e,i=0;i<c.length;i++)g.push(c[i](e,f));var j=a(e,f,h)||o;tc(h,d.text),tc(j,d.text);var k=j.apply?j.apply(h,g):j(g[0],g[1],g[2],g[3],g[4]);return tc(k,d.text)}},arrayDeclaration:function(){var a=[],b=!0;if("]"!==this.peekToken().text)do{if(this.peek("]"))break;var c=this.expression();a.push(c),c.constant||(b=!1)}while(this.expect(","));return this.consume("]"),l(function(b,c){for(var d=[],e=0;e<a.length;e++)d.push(a[e](b,c));return d},{literal:!0,constant:b})},object:function(){var a=[],b=!0;if("}"!==this.peekToken().text)do{if(this.peek("}"))break;var c=this.expect(),d=c.string||c.text;this.consume(":");var e=this.expression();a.push({key:d,value:e}),e.constant||(b=!1)}while(this.expect(","));return this.consume("}"),l(function(b,c){for(var d={},e=0;e<a.length;e++){var f=a[e];d[f.key]=f.value(b,c)}return d},{literal:!0,constant:b})}};var ne={},oe=d("$sce"),pe={HTML:"html",CSS:"css",URL:"url",RESOURCE_URL:"resourceUrl",JS:"js"},qe=b.createElement("a"),re=Mc(a.location.href,!0);Pc.$inject=["$provide"],Rc.$inject=["$locale"],Sc.$inject=["$locale"];var se=".",te={yyyy:Vc("FullYear",4),yy:Vc("FullYear",2,0,!0),y:Vc("FullYear",1),MMMM:Wc("Month"),MMM:Wc("Month",!0),MM:Vc("Month",2,1),M:Vc("Month",1,1),dd:Vc("Date",2),d:Vc("Date",1),HH:Vc("Hours",2),H:Vc("Hours",1),hh:Vc("Hours",2,-12),h:Vc("Hours",1,-12),mm:Vc("Minutes",2),m:Vc("Minutes",1),ss:Vc("Seconds",2),s:Vc("Seconds",1),sss:Vc("Milliseconds",3),EEEE:Wc("Day"),EEE:Wc("Day",!0),a:Yc,Z:Xc},ue=/((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z))(.*)/,ve=/^\-?\d+$/;Zc.$inject=["$locale"];var we=q(md),xe=q(od);ad.$inject=["$parse"];var ye=q({restrict:"E",compile:function(a,c){return 8>=rd&&(c.href||c.name||c.$set("href",""),a.append(b.createComment("IE fix"))),c.href||c.xlinkHref||c.name?void 0:function(a,b){var c="[object SVGAnimatedString]"===yd.call(b.prop("href"))?"xlink:href":"href";b.on("click",function(a){b.attr(c)||a.preventDefault()})}}}),ze={};f(Td,function(a,b){if("multiple"!=a){var c=Qb("ng-"+b);ze[c]=function(){return{priority:100,link:function(a,d,e){a.$watch(e[c],function(a){e.$set(b,!!a)})}}}}}),f(["src","srcset","href"],function(a){var b=Qb("ng-"+a);ze[b]=function(){return{priority:99,link:function(c,d,e){var f=a,g=a;"href"===a&&"[object SVGAnimatedString]"===yd.call(d.prop("href"))&&(g="xlinkHref",e.$attr[g]="xlink:href",f=null),e.$observe(b,function(a){a&&(e.$set(g,a),rd&&f&&d.prop(f,e[g]))})}}}});var Ae={$addControl:o,$removeControl:o,$setValidity:o,$setDirty:o,$setPristine:o};cd.$inject=["$element","$attrs","$scope","$animate"];var Be=function(a){return["$timeout",function(b){var d={name:"form",restrict:a?"EAC":"E",controller:cd,compile:function(){return{pre:function(a,d,e,f){if(!e.action){var g=function(a){a.preventDefault?a.preventDefault():a.returnValue=!1};Id(d[0],"submit",g),d.on("$destroy",function(){b(function(){Jd(d[0],"submit",g)},0,!1)})}var h=d.parent().controller("form"),i=e.name||e.ngForm;i&&uc(a,i,f,i),h&&d.on("$destroy",function(){h.$removeControl(f),i&&uc(a,i,c,i),l(f,Ae)})}}}};return d}]},Ce=Be(),De=Be(!0),Ee=/^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/,Fe=/^[a-z0-9!#$%&'*+/=?^_`{|}~.-]+@[a-z0-9-]+(\.[a-z0-9-]+)*$/i,Ge=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/,He={text:fd,number:gd,url:hd,email:id,radio:jd,checkbox:kd,hidden:o,button:o,submit:o,reset:o,file:o},Ie=["$browser","$sniffer",function(a,b){return{restrict:"E",require:"?ngModel",link:function(c,d,e,f){f&&(He[md(e.type)]||He.text)(c,d,e,f,b,a)}}}],Je="ng-valid",Ke="ng-invalid",Le="ng-pristine",Me="ng-dirty",Ne=["$scope","$exceptionHandler","$attrs","$element","$parse","$animate",function(a,b,c,e,g,h){function i(a,b){b=b?"-"+ab(b,"-"):"",h.removeClass(e,(a?Ke:Je)+b),h.addClass(e,(a?Je:Ke)+b)}this.$viewValue=Number.NaN,this.$modelValue=Number.NaN,this.$parsers=[],this.$formatters=[],this.$viewChangeListeners=[],this.$pristine=!0,this.$dirty=!1,this.$valid=!0,this.$invalid=!1,this.$name=c.name;var j=g(c.ngModel),k=j.assign;if(!k)throw d("ngModel")("nonassign","Expression '{0}' is non-assignable. Element: {1}",c.ngModel,U(e));this.$render=o,this.$isEmpty=function(a){return r(a)||""===a||null===a||a!==a};var l=e.inheritedData("$formController")||Ae,m=0,n=this.$error={};e.addClass(Le),i(!0),this.$setValidity=function(a,b){n[a]!==!b&&(b?(n[a]&&m--,m||(i(!0),this.$valid=!0,this.$invalid=!1)):(i(!1),this.$invalid=!0,this.$valid=!1,m++),n[a]=!b,i(b,a),l.$setValidity(a,b,this))},this.$setPristine=function(){this.$dirty=!1,this.$pristine=!0,h.removeClass(e,Me),h.addClass(e,Le)},this.$setViewValue=function(c){this.$viewValue=c,this.$pristine&&(this.$dirty=!0,this.$pristine=!1,h.removeClass(e,Le),h.addClass(e,Me),l.$setDirty()),f(this.$parsers,function(a){c=a(c)}),this.$modelValue!==c&&(this.$modelValue=c,k(a,c),f(this.$viewChangeListeners,function(a){try{a()}catch(c){b(c)}}))};var p=this;a.$watch(function(){var b=j(a);if(p.$modelValue!==b){var c=p.$formatters,d=c.length;for(p.$modelValue=b;d--;)b=c[d](b);p.$viewValue!==b&&(p.$viewValue=b,p.$render())}return b})}],Oe=function(){return{require:["ngModel","^?form"],controller:Ne,link:function(a,b,c,d){var e=d[0],f=d[1]||Ae;f.$addControl(e),a.$on("$destroy",function(){f.$removeControl(e)})}}},Pe=q({require:"ngModel",link:function(a,b,c,d){d.$viewChangeListeners.push(function(){a.$eval(c.ngChange)})}}),Qe=function(){return{require:"?ngModel",link:function(a,b,c,d){if(d){c.required=!0;var e=function(a){return c.required&&d.$isEmpty(a)?void d.$setValidity("required",!1):(d.$setValidity("required",!0),a)};d.$formatters.push(e),d.$parsers.unshift(e),c.$observe("required",function(){e(d.$viewValue)})}}}},Re=function(){return{require:"ngModel",link:function(a,b,d,e){var g=/\/(.*)\//.exec(d.ngList),h=g&&new RegExp(g[1])||d.ngList||",",i=function(a){if(!r(a)){var b=[];return a&&f(a.split(h),function(a){a&&b.push(Cd(a))}),b}};e.$parsers.push(i),e.$formatters.push(function(a){return x(a)?a.join(", "):c}),e.$isEmpty=function(a){return!a||!a.length}}}},Se=/^(true|false|\d+)$/,Te=function(){return{priority:100,compile:function(a,b){return Se.test(b.ngValue)?function(a,b,c){c.$set("value",a.$eval(c.ngValue))}:function(a,b,c){a.$watch(c.ngValue,function(a){c.$set("value",a)})}}}},Ue=bd(function(a,b,d){b.addClass("ng-binding").data("$binding",d.ngBind),a.$watch(d.ngBind,function(a){b.text(a==c?"":a)})}),Ve=["$interpolate",function(a){return function(b,c,d){var e=a(c.attr(d.$attr.ngBindTemplate));c.addClass("ng-binding").data("$binding",e),d.$observe("ngBindTemplate",function(a){c.text(a)})}}],We=["$sce","$parse",function(a,b){return function(c,d,e){function f(){return(g(c)||"").toString()}d.addClass("ng-binding").data("$binding",e.ngBindHtml);
+var g=b(e.ngBindHtml);c.$watch(f,function(){d.html(a.getTrustedHtml(g(c))||"")})}}],Xe=ld("",!0),Ye=ld("Odd",0),Ze=ld("Even",1),$e=bd({compile:function(a,b){b.$set("ngCloak",c),a.removeClass("ng-cloak")}}),_e=[function(){return{scope:!0,controller:"@",priority:500}}],af={};f("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var b=Qb("ng-"+a);af[b]=["$parse",function(c){return{compile:function(d,e){var f=c(e[b]);return function(b,c){c.on(md(a),function(a){b.$apply(function(){f(b,{$event:a})})})}}}}]});var bf=["$animate",function(a){return{transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(c,d,e,f,g){var h,i,j;c.$watch(e.ngIf,function(f){T(f)?i||(i=c.$new(),g(i,function(c){c[c.length++]=b.createComment(" end ngIf: "+e.ngIf+" "),h={clone:c},a.enter(c,d.parent(),d)})):(j&&(j.remove(),j=null),i&&(i.$destroy(),i=null),h&&(j=gb(h.clone),a.leave(j,function(){j=null}),h=null))})}}}],cf=["$http","$templateCache","$anchorScroll","$animate","$sce",function(a,b,c,d,e){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:Ad.noop,compile:function(f,g){var h=g.ngInclude||g.src,i=g.onload||"",j=g.autoscroll;return function(f,g,k,l,m){var n,o,p,q=0,r=function(){o&&(o.remove(),o=null),n&&(n.$destroy(),n=null),p&&(d.leave(p,function(){o=null}),o=p,p=null)};f.$watch(e.parseAsResourceUrl(h),function(e){var h=function(){!s(j)||j&&!f.$eval(j)||c()},k=++q;e?(a.get(e,{cache:b}).success(function(a){if(k===q){var b=f.$new();l.template=a;var c=m(b,function(a){r(),d.enter(a,null,g,h)});n=b,p=c,n.$emit("$includeContentLoaded"),f.$eval(i)}}).error(function(){k===q&&r()}),f.$emit("$includeContentRequested")):(r(),l.template=null)})}}}}],df=["$compile",function(a){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(b,c,d,e){c.html(e.template),a(c.contents())(b)}}}],ef=bd({priority:450,compile:function(){return{pre:function(a,b,c){a.$eval(c.ngInit)}}}}),ff=bd({terminal:!0,priority:1e3}),gf=["$locale","$interpolate",function(a,b){var c=/{}/g;return{restrict:"EA",link:function(d,e,g){var h=g.count,i=g.$attr.when&&e.attr(g.$attr.when),j=g.offset||0,k=d.$eval(i)||{},l={},m=b.startSymbol(),n=b.endSymbol(),o=/^when(Minus)?(.+)$/;f(g,function(a,b){o.test(b)&&(k[md(b.replace("when","").replace("Minus","-"))]=e.attr(g.$attr[b]))}),f(k,function(a,d){l[d]=b(a.replace(c,m+h+"-"+j+n))}),d.$watch(function(){var b=parseFloat(d.$eval(h));return isNaN(b)?"":(b in k||(b=a.pluralCat(b-j)),l[b](d,e,!0))},function(a){e.text(a)})}}}],hf=["$parse","$animate",function(a,c){function g(a){return a.clone[0]}function h(a){return a.clone[a.clone.length-1]}var i="$$NG_REMOVED",j=d("ngRepeat");return{transclude:"element",priority:1e3,terminal:!0,$$tlb:!0,link:function(d,k,l,m,n){var o,p,q,r,s,t,u,v,w,x=l.ngRepeat,y=x.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?\s*$/),z={$id:Fb};if(!y)throw j("iexp","Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.",x);if(t=y[1],u=y[2],o=y[3],o?(p=a(o),q=function(a,b,c){return w&&(z[w]=a),z[v]=b,z.$index=c,p(d,z)}):(r=function(a,b){return Fb(b)},s=function(a){return a}),y=t.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/),!y)throw j("iidexp","'_item_' in '_item_ in _collection_' should be an identifier or '(_key_, _value_)' expression, but got '{0}'.",t);v=y[3]||y[1],w=y[2];var A={};d.$watchCollection(u,function(a){var l,m,o,p,t,u,y,z,B,C,D,E,F=k[0],G={},H=[];if(e(a))C=a,B=q||r;else{B=q||s,C=[];for(u in a)a.hasOwnProperty(u)&&"$"!=u.charAt(0)&&C.push(u);C.sort()}for(p=C.length,m=H.length=C.length,l=0;m>l;l++)if(u=a===C?l:C[l],y=a[u],z=B(u,y,l),eb(z,"`track by` id"),A.hasOwnProperty(z))D=A[z],delete A[z],G[z]=D,H[l]=D;else{if(G.hasOwnProperty(z))throw f(H,function(a){a&&a.scope&&(A[a.id]=a)}),j("dupes","Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}",x,z);H[l]={id:z},G[z]=!1}for(u in A)A.hasOwnProperty(u)&&(D=A[u],E=gb(D.clone),c.leave(E),f(E,function(a){a[i]=!0}),D.scope.$destroy());for(l=0,m=C.length;m>l;l++){if(u=a===C?l:C[l],y=a[u],D=H[l],H[l-1]&&(F=h(H[l-1])),D.scope){t=D.scope,o=F;do o=o.nextSibling;while(o&&o[i]);g(D)!=o&&c.move(gb(D.clone),null,sd(F)),F=h(D)}else t=d.$new();t[v]=y,w&&(t[w]=u),t.$index=l,t.$first=0===l,t.$last=l===p-1,t.$middle=!(t.$first||t.$last),t.$odd=!(t.$even=0===(1&l)),D.scope||n(t,function(a){a[a.length++]=b.createComment(" end ngRepeat: "+x+" "),c.enter(a,null,sd(F)),F=a,D.scope=t,D.clone=a,G[D.id]=D})}A=G})}}}],jf=["$animate",function(a){return function(b,c,d){b.$watch(d.ngShow,function(b){a[T(b)?"removeClass":"addClass"](c,"ng-hide")})}}],kf=["$animate",function(a){return function(b,c,d){b.$watch(d.ngHide,function(b){a[T(b)?"addClass":"removeClass"](c,"ng-hide")})}}],lf=bd(function(a,b,c){a.$watch(c.ngStyle,function(a,c){c&&a!==c&&f(c,function(a,c){b.css(c,"")}),a&&b.css(a)},!0)}),mf=["$animate",function(a){return{restrict:"EA",require:"ngSwitch",controller:["$scope",function(){this.cases={}}],link:function(b,c,d,e){var g=d.ngSwitch||d.on,h=[],i=[],j=[],k=[];b.$watch(g,function(c){var g,l;for(g=0,l=j.length;l>g;++g)j[g].remove();for(j.length=0,g=0,l=k.length;l>g;++g){var m=i[g];k[g].$destroy(),j[g]=m,a.leave(m,function(){j.splice(g,1)})}i.length=0,k.length=0,(h=e.cases["!"+c]||e.cases["?"])&&(b.$eval(d.change),f(h,function(c){var d=b.$new();k.push(d),c.transclude(d,function(b){var d=c.element;i.push(b),a.enter(b,d.parent(),d)})}))})}}}],nf=bd({transclude:"element",priority:800,require:"^ngSwitch",link:function(a,b,c,d,e){d.cases["!"+c.ngSwitchWhen]=d.cases["!"+c.ngSwitchWhen]||[],d.cases["!"+c.ngSwitchWhen].push({transclude:e,element:b})}}),of=bd({transclude:"element",priority:800,require:"^ngSwitch",link:function(a,b,c,d,e){d.cases["?"]=d.cases["?"]||[],d.cases["?"].push({transclude:e,element:b})}}),pf=bd({link:function(a,b,c,e,f){if(!f)throw d("ngTransclude")("orphan","Illegal use of ngTransclude directive in the template! No parent directive that requires a transclusion found. Element: {0}",U(b));f(function(a){b.empty(),b.append(a)})}}),qf=["$templateCache",function(a){return{restrict:"E",terminal:!0,compile:function(b,c){if("text/ng-template"==c.type){var d=c.id,e=b[0].text;a.put(d,e)}}}}],rf=d("ngOptions"),sf=q({terminal:!0}),tf=["$compile","$parse",function(a,d){var e=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/,h={$setViewValue:o};return{restrict:"E",require:["select","?ngModel"],controller:["$element","$scope","$attrs",function(a,b,c){var d,e,f=this,g={},i=h;f.databound=c.ngModel,f.init=function(a,b,c){i=a,d=b,e=c},f.addOption=function(b){eb(b,'"option value"'),g[b]=!0,i.$viewValue==b&&(a.val(b),e.parent()&&e.remove())},f.removeOption=function(a){this.hasOption(a)&&(delete g[a],i.$viewValue==a&&this.renderUnknownOption(a))},f.renderUnknownOption=function(b){var c="? "+Fb(b)+" ?";e.val(c),a.prepend(e),a.val(c),e.prop("selected",!0)},f.hasOption=function(a){return g.hasOwnProperty(a)},b.$on("$destroy",function(){f.renderUnknownOption=o})}],link:function(h,i,j,k){function l(a,b,c,d){c.$render=function(){var a=c.$viewValue;d.hasOption(a)?(z.parent()&&z.remove(),b.val(a),""===a&&o.prop("selected",!0)):r(a)&&o?b.val(""):d.renderUnknownOption(a)},b.on("change",function(){a.$apply(function(){z.parent()&&z.remove(),c.$setViewValue(b.val())})})}function m(a,b,c){var d;c.$render=function(){var a=new Gb(c.$viewValue);f(b.find("option"),function(b){b.selected=s(a.get(b.value))})},a.$watch(function(){L(d,c.$viewValue)||(d=K(c.$viewValue),c.$render())}),b.on("change",function(){a.$apply(function(){var a=[];f(b.find("option"),function(b){b.selected&&a.push(b.value)}),c.$setViewValue(a)})})}function n(b,f,h){function i(){var a,c,d,e,i,j,q,u,A,B,C,D,E,F,G,H={"":[]},I=[""],J=h.$modelValue,K=p(b)||[],L=m?g(K):K,M={},N=!1;if(t)if(r&&x(J)){N=new Gb([]);for(var O=0;O<J.length;O++)M[l]=J[O],N.put(r(b,M),J[O])}else N=new Gb(J);for(C=0;A=L.length,A>C;C++){if(q=C,m){if(q=L[C],"$"===q.charAt(0))continue;M[m]=q}if(M[l]=K[q],a=n(b,M)||"",(c=H[a])||(c=H[a]=[],I.push(a)),t)D=s(N.remove(r?r(b,M):o(b,M)));else{if(r){var P={};P[l]=J,D=r(b,P)===r(b,M)}else D=J===o(b,M);N=N||D}G=k(b,M),G=s(G)?G:"",c.push({id:r?r(b,M):m?L[C]:C,label:G,selected:D})}for(t||(v||null===J?H[""].unshift({id:"",label:"",selected:!N}):N||H[""].unshift({id:"?",label:"",selected:!0})),B=0,u=I.length;u>B;B++){for(a=I[B],c=H[a],z.length<=B?(e={element:y.clone().attr("label",a),label:c.label},i=[e],z.push(i),f.append(e.element)):(i=z[B],e=i[0],e.label!=a&&e.element.attr("label",e.label=a)),E=null,C=0,A=c.length;A>C;C++)d=c[C],(j=i[C+1])?(E=j.element,j.label!==d.label&&E.text(j.label=d.label),j.id!==d.id&&E.val(j.id=d.id),j.selected!==d.selected&&E.prop("selected",j.selected=d.selected)):(""===d.id&&v?F=v:(F=w.clone()).val(d.id).attr("selected",d.selected).text(d.label),i.push(j={element:F,label:d.label,id:d.id,selected:d.selected}),E?E.after(F):e.element.append(F),E=F);for(C++;i.length>C;)i.pop().element.remove()}for(;z.length>B;)z.pop()[0].element.remove()}var j;if(!(j=u.match(e)))throw rf("iexp","Expected expression in form of '_select_ (as _label_)? for (_key_,)?_value_ in _collection_' but got '{0}'. Element: {1}",u,U(f));var k=d(j[2]||j[1]),l=j[4]||j[6],m=j[5],n=d(j[3]||""),o=d(j[2]?j[1]:l),p=d(j[7]),q=j[8],r=q?d(j[8]):null,z=[[{element:f,label:""}]];v&&(a(v)(b),v.removeClass("ng-scope"),v.remove()),f.empty(),f.on("change",function(){b.$apply(function(){var a,d,e,g,i,j,k,n,q,s=p(b)||[],u={};if(t){for(e=[],j=0,n=z.length;n>j;j++)for(a=z[j],i=1,k=a.length;k>i;i++)if((g=a[i].element)[0].selected){if(d=g.val(),m&&(u[m]=d),r)for(q=0;q<s.length&&(u[l]=s[q],r(b,u)!=d);q++);else u[l]=s[d];e.push(o(b,u))}}else{if(d=f.val(),"?"==d)e=c;else if(""===d)e=null;else if(r){for(q=0;q<s.length;q++)if(u[l]=s[q],r(b,u)==d){e=o(b,u);break}}else u[l]=s[d],m&&(u[m]=d),e=o(b,u);z[0].length>1&&z[0][1].id!==d&&(z[0][1].selected=!1)}h.$setViewValue(e)})}),h.$render=i,b.$watch(i)}if(k[1]){for(var o,p=k[0],q=k[1],t=j.multiple,u=j.ngOptions,v=!1,w=sd(b.createElement("option")),y=sd(b.createElement("optgroup")),z=w.clone(),A=0,B=i.children(),C=B.length;C>A;A++)if(""===B[A].value){o=v=B.eq(A);break}p.init(q,v,z),t&&(q.$isEmpty=function(a){return!a||0===a.length}),u?n(h,i,q):t?m(h,i,q):l(h,i,q,p)}}}}],uf=["$interpolate",function(a){var b={addOption:o,removeOption:o};return{restrict:"E",priority:100,compile:function(c,d){if(r(d.value)){var e=a(c.text(),!0);e||d.$set("value",c.text())}return function(a,c,d){var f="$selectController",g=c.parent(),h=g.data(f)||g.parent().data(f);h&&h.databound?c.prop("selected",!1):h=b,e?a.$watch(e,function(a,b){d.$set("value",a),a!==b&&h.removeOption(b),h.addOption(a)}):h.addOption(d.value),c.on("$destroy",function(){h.removeOption(d.value)})}}}}],vf=q({restrict:"E",terminal:!0});return a.angular.bootstrap?void console.log("WARNING: Tried to load angular more than once."):(bb(),ib(Ad),void sd(b).ready(function(){$(b,_)}))}(window,document),!window.angular.$$csp()&&window.angular.element(document).find("head").prepend('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide{display:none !important;}ng\\:form{display:block;}.ng-animate-block-transitions{transition:0s all!important;-webkit-transition:0s all!important;}.ng-hide-add-active,.ng-hide-remove{display:block!important;}</style>'),!function(a){"use strict";var b=function(b,c){this.options=a.extend({},a.fn.affix.defaults,c),this.$window=a(window).on("scroll.affix.data-api",a.proxy(this.checkPosition,this)).on("click.affix.data-api",a.proxy(function(){setTimeout(a.proxy(this.checkPosition,this),1)},this)),this.$element=a(b),this.checkPosition()};b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b,c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.bottom,h=f.top,i="affix affix-top affix-bottom";"object"!=typeof f&&(g=h=f),"function"==typeof h&&(h=f.top()),"function"==typeof g&&(g=f.bottom()),b=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=g&&e.top+this.$element.height()>=c-g?"bottom":null!=h&&h>=d?"top":!1,this.affixed!==b&&(this.affixed=b,this.unpin="bottom"==b?e.top-d:null,this.$element.removeClass(i).addClass("affix"+(b?"-"+b:"")))}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("affix"),f="object"==typeof c&&c;e||d.data("affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.defaults={offset:0},a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(window.jQuery),!function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){d.trigger("closed").remove()}var d,e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,"")),d=a(f),b&&b.preventDefault(),d.length||(d=e.hasClass("alert")?e:e.parent()),d.trigger(b=a.Event("close")),b.isDefaultPrevented()||(d.removeClass("in"),a.support.transition&&d.hasClass("fade")?d.on(a.support.transition.end,c):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("alert");e||d.data("alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.alert.data-api",b,c.prototype.close)}(window.jQuery),!function(a){"use strict";function b(){a(".dropdown-backdrop").remove(),a(d).each(function(){c(a(this)).removeClass("open")})}function c(b){var c,d=b.attr("data-target");return d||(d=b.attr("href"),d=d&&/#/.test(d)&&d.replace(/.*(?=#[^\s]*$)/,"")),c=d&&a(d),c&&c.length||(c=b.parent()),c}var d="[data-toggle=dropdown]",e=function(b){var c=a(b).on("click.dropdown.data-api",this.toggle);a("html").on("click.dropdown.data-api",function(){c.parent().removeClass("open")})};e.prototype={constructor:e,toggle:function(){var d,e,f=a(this);if(!f.is(".disabled, :disabled"))return d=c(f),e=d.hasClass("open"),b(),e||("ontouchstart"in document.documentElement&&a('<div class="dropdown-backdrop"/>').insertBefore(a(this)).on("click",b),d.toggleClass("open")),f.focus(),!1},keydown:function(b){var e,f,g,h,i;if(/(38|40|27)/.test(b.keyCode)&&(e=a(this),b.preventDefault(),b.stopPropagation(),!e.is(".disabled, :disabled"))){if(g=c(e),h=g.hasClass("open"),!h||h&&27==b.keyCode)return 27==b.which&&g.find(d).focus(),e.click();f=a("[role=menu] li:not(.divider):visible a",g),f.length&&(i=f.index(f.filter(":focus")),38==b.keyCode&&i>0&&i--,40==b.keyCode&&i<f.length-1&&i++,~i||(i=0),f.eq(i).focus())}}};var f=a.fn.dropdown;a.fn.dropdown=function(b){return this.each(function(){var c=a(this),d=c.data("dropdown");d||c.data("dropdown",d=new e(this)),"string"==typeof b&&d[b].call(c)})},a.fn.dropdown.Constructor=e,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=f,this},a(document).on("click.dropdown.data-api",b).on("click.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.dropdown.data-api",d,e.prototype.toggle).on("keydown.dropdown.data-api",d+", [role=menu]",e.prototype.keydown)}(window.jQuery),!function(a){"use strict";var b=function(a,b){this.init("tooltip",a,b)};b.prototype={constructor:b,init:function(b,c,d){var e,f,g,h,i;for(this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.enabled=!0,g=this.options.trigger.split(" "),i=g.length;i--;)h=g[i],"click"==h?this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this)):"manual"!=h&&(e="hover"==h?"mouseenter":"focus",f="hover"==h?"mouseleave":"blur",this.$element.on(e+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(f+"."+this.type,this.options.selector,a.proxy(this.leave,this)));this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(b){return b=a.extend({},a.fn[this.type].defaults,this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},enter:function(b){var c,d=a.fn[this.type].defaults,e={};return this._options&&a.each(this._options,function(a,b){d[a]!=b&&(e[a]=b)},this),c=a(b.currentTarget)[this.type](e).data(this.type),c.options.delay&&c.options.delay.show?(clearTimeout(this.timeout),c.hoverState="in",void(this.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show))):c.show()},leave:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);return this.timeout&&clearTimeout(this.timeout),c.options.delay&&c.options.delay.hide?(c.hoverState="out",void(this.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide))):c.hide()},show:function(){var b,c,d,e,f,g,h=a.Event("show");if(this.hasContent()&&this.enabled){if(this.$element.trigger(h),h.isDefaultPrevented())return;switch(b=this.tip(),this.setContent(),this.options.animation&&b.addClass("fade"),f="function"==typeof this.options.placement?this.options.placement.call(this,b[0],this.$element[0]):this.options.placement,b.detach().css({top:0,left:0,display:"block"}),this.options.container?b.appendTo(this.options.container):b.insertAfter(this.$element),c=this.getPosition(),d=b[0].offsetWidth,e=b[0].offsetHeight,f){case"bottom":g={top:c.top+c.height,left:c.left+c.width/2-d/2};break;case"top":g={top:c.top-e,left:c.left+c.width/2-d/2};break;case"left":g={top:c.top+c.height/2-e/2,left:c.left-d};break;case"right":g={top:c.top+c.height/2-e/2,left:c.left+c.width}}this.applyPlacement(g,f),this.$element.trigger("shown")}},applyPlacement:function(a,b){var c,d,e,f,g=this.tip(),h=g[0].offsetWidth,i=g[0].offsetHeight;g.offset(a).addClass(b).addClass("in"),c=g[0].offsetWidth,d=g[0].offsetHeight,"top"==b&&d!=i&&(a.top=a.top+i-d,f=!0),"bottom"==b||"top"==b?(e=0,a.left<0&&(e=-2*a.left,a.left=0,g.offset(a),c=g[0].offsetWidth,d=g[0].offsetHeight),this.replaceArrow(e-h+c,c,"left")):this.replaceArrow(d-i,d,"top"),f&&g.offset(a)},replaceArrow:function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},setContent:function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},hide:function(){function b(){var b=setTimeout(function(){c.off(a.support.transition.end).detach()},500);c.one(a.support.transition.end,function(){clearTimeout(b),c.detach()})}var c=this.tip(),d=a.Event("hide");return this.$element.trigger(d),d.isDefaultPrevented()?void 0:(c.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?b():c.detach(),this.$element.trigger("hidden"),this)},fixTitle:function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},hasContent:function(){return this.getTitle()},getPosition:function(){var b=this.$element[0];return a.extend({},"function"==typeof b.getBoundingClientRect?b.getBoundingClientRect():{width:b.offsetWidth,height:b.offsetHeight},this.$element.offset())},getTitle:function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},tip:function(){return this.$tip=this.$tip||a(this.options.template)},arrow:function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(b){var c=b?a(b.currentTarget)[this.type](this._options).data(this.type):this;c.tip().hasClass("in")?c.hide():c.show()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}};var c=a.fn.tooltip;a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("tooltip"),f="object"==typeof c&&c;e||d.data("tooltip",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},a.fn.tooltip.noConflict=function(){return a.fn.tooltip=c,this}}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.options=c,this.$element=a(b).delegate('[data-dismiss="modal"]',"click.dismiss.modal",a.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};b.prototype={constructor:b,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var b=this,c=a.Event("show");this.$element.trigger(c),this.isShown||c.isDefaultPrevented()||(this.isShown=!0,this.escape(),this.backdrop(function(){var c=a.support.transition&&b.$element.hasClass("fade");b.$element.parent().length||b.$element.appendTo(document.body),b.$element.show(),c&&b.$element[0].offsetWidth,b.$element.addClass("in").attr("aria-hidden",!1),b.enforceFocus(),c?b.$element.one(a.support.transition.end,function(){b.$element.focus().trigger("shown")}):b.$element.focus().trigger("shown")}))},hide:function(b){b&&b.preventDefault();b=a.Event("hide"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),a(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),a.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal())},enforceFocus:function(){var b=this;a(document).on("focusin.modal",function(a){b.$element[0]===a.target||b.$element.has(a.target).length||b.$element.focus()})},escape:function(){var a=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(b){27==b.which&&a.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var b=this,c=setTimeout(function(){b.$element.off(a.support.transition.end),b.hideModal()},500);this.$element.one(a.support.transition.end,function(){clearTimeout(c),b.hideModal()})},hideModal:function(){var a=this;this.$element.hide(),this.backdrop(function(){a.removeBackdrop(),a.$element.trigger("hidden")})},removeBackdrop:function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},backdrop:function(b){var c=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var d=a.support.transition&&c;if(this.$backdrop=a('<div class="modal-backdrop '+c+'" />').appendTo(document.body),this.$backdrop.click("static"==this.options.backdrop?a.proxy(this.$element[0].focus,this.$element[0]):a.proxy(this.hide,this)),d&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;d?this.$backdrop.one(a.support.transition.end,b):b()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(a.support.transition.end,b):b()):b&&b()}};var c=a.fn.modal;a.fn.modal=function(c){return this.each(function(){var d=a(this),e=d.data("modal"),f=a.extend({},a.fn.modal.defaults,d.data(),"object"==typeof c&&c);e||d.data("modal",e=new b(this,f)),"string"==typeof c?e[c]():f.show&&e.show()})},a.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},a.fn.modal.Constructor=b,a.fn.modal.noConflict=function(){return a.fn.modal=c,this},a(document).on("click.modal.data-api",'[data-toggle="modal"]',function(b){var c=a(this),d=c.attr("href"),e=a(c.attr("data-target")||d&&d.replace(/.*(?=#[^\s]+$)/,"")),f=e.data("modal")?"toggle":a.extend({remote:!/#/.test(d)&&d},e.data(),c.data());b.preventDefault(),e.modal(f).one("hide",function(){c.focus()})})}(window.jQuery),!function(a){"use strict";a(function(){a.support.transition=function(){var a=function(){var a,b=document.createElement("bootstrap"),c={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(a in c)if(void 0!==b.style[a])return c[a]}();return a&&{end:a}}()})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.button.defaults,c)};b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.data(),e=c.is("input")?"val":"html";a+="Text",d.resetText||c.data("resetText",c[e]()),c[e](d[a]||this.options[a]),setTimeout(function(){"loadingText"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons-radio"]');a&&a.find(".active").removeClass("active"),this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("button"),f="object"==typeof c&&c;e||d.data("button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.defaults={loadingText:"loading..."},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle")})}(window.jQuery),!function(a){"use strict";var b=function(a,b){this.init("popover",a,b)};b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype,{constructor:b,setContent:function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var a,b=this.$element,c=this.options;return a=("function"==typeof c.content?c.content.call(b[0]):c.content)||b.attr("data-content")},tip:function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}});var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("popover"),f="object"==typeof c&&c;e||d.data("popover",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.defaults=a.extend({},a.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.typeahead.defaults,c),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.source=this.options.source,this.$menu=a(this.options.menu),this.shown=!1,this.listen()};b.prototype={constructor:b,select:function(){var a=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(a)).change(),this.hide()},updater:function(a){return a},show:function(){var b=a.extend({},this.$element.position(),{height:this.$element[0].offsetHeight});return this.$menu.insertAfter(this.$element).css({top:b.top+b.height,left:b.left}).show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(){var b;return this.query=this.$element.val(),!this.query||this.query.length<this.options.minLength?this.shown?this.hide():this:(b=a.isFunction(this.source)?this.source(this.query,a.proxy(this.process,this)):this.source,b?this.process(b):this)},process:function(b){var c=this;return b=a.grep(b,function(a){return c.matcher(a)}),b=this.sorter(b),b.length?this.render(b.slice(0,this.options.items)).show():this.shown?this.hide():this},matcher:function(a){return~a.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(a){for(var b,c=[],d=[],e=[];b=a.shift();)b.toLowerCase().indexOf(this.query.toLowerCase())?~b.indexOf(this.query)?d.push(b):e.push(b):c.push(b);return c.concat(d,e)},highlighter:function(a){var b=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return a.replace(new RegExp("("+b+")","ig"),function(a,b){return"<strong>"+b+"</strong>"})},render:function(b){var c=this;return b=a(b).map(function(b,d){return b=a(c.options.item).attr("data-value",d),b.find("a").html(c.highlighter(d)),b[0]}),b.first().addClass("active"),this.$menu.html(b),this},next:function(){var b=this.$menu.find(".active").removeClass("active"),c=b.next();c.length||(c=a(this.$menu.find("li")[0])),c.addClass("active")},prev:function(){var a=this.$menu.find(".active").removeClass("active"),b=a.prev();b.length||(b=this.$menu.find("li").last()),b.addClass("active")},listen:function(){this.$element.on("focus",a.proxy(this.focus,this)).on("blur",a.proxy(this.blur,this)).on("keypress",a.proxy(this.keypress,this)).on("keyup",a.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown",a.proxy(this.keydown,this)),this.$menu.on("click",a.proxy(this.click,this)).on("mouseenter","li",a.proxy(this.mouseenter,this)).on("mouseleave","li",a.proxy(this.mouseleave,this))},eventSupported:function(a){var b=a in this.$element;return b||(this.$element.setAttribute(a,"return;"),b="function"==typeof this.$element[a]),b},move:function(a){if(this.shown){switch(a.keyCode){case 9:case 13:case 27:a.preventDefault();break;case 38:a.preventDefault(),this.prev();break;case 40:a.preventDefault(),this.next()}a.stopPropagation()}},keydown:function(b){this.suppressKeyPressRepeat=~a.inArray(b.keyCode,[40,38,9,13,27]),this.move(b)},keypress:function(a){this.suppressKeyPressRepeat||this.move(a)},keyup:function(a){switch(a.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}a.stopPropagation(),a.preventDefault()},focus:function(){this.focused=!0},blur:function(){this.focused=!1,!this.mousedover&&this.shown&&this.hide()},click:function(a){a.stopPropagation(),a.preventDefault(),this.select(),this.$element.focus()},mouseenter:function(b){this.mousedover=!0,this.$menu.find(".active").removeClass("active"),a(b.currentTarget).addClass("active")},mouseleave:function(){this.mousedover=!1,!this.focused&&this.shown&&this.hide()}};var c=a.fn.typeahead;a.fn.typeahead=function(c){return this.each(function(){var d=a(this),e=d.data("typeahead"),f="object"==typeof c&&c;e||d.data("typeahead",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>',minLength:1},a.fn.typeahead.Constructor=b,a.fn.typeahead.noConflict=function(){return a.fn.typeahead=c,this},a(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(){var b=a(this);b.data("typeahead")||b.typeahead(b.data())})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.prototype={cycle:function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},getActiveIndex:function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},to:function(b){var c=this.getActiveIndex(),d=this;
+if(!(b>this.$items.length-1||0>b))return this.sliding?this.$element.one("slid",function(){d.to(b)}):c==b?this.pause().cycle():this.slide(b>c?"next":"prev",a(this.$items[b]))},pause:function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),clearInterval(this.interval),this.interval=null,this},next:function(){return this.sliding?void 0:this.slide("next")},prev:function(){return this.sliding?void 0:this.slide("prev")},slide:function(b,c){var d,e=this.$element.find(".item.active"),f=c||e[b](),g=this.interval,h="next"==b?"left":"right",i="next"==b?"first":"last",j=this;if(this.sliding=!0,g&&this.pause(),f=f.length?f:this.$element.find(".item")[i](),d=a.Event("slide",{relatedTarget:f[0],direction:h}),!f.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var b=a(j.$indicators.children()[j.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(d),d.isDefaultPrevented())return;f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),this.$element.one(a.support.transition.end,function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),j.sliding=!1,setTimeout(function(){j.$element.trigger("slid")},0)})}else{if(this.$element.trigger(d),d.isDefaultPrevented())return;e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return g&&this.cycle(),this}}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("carousel"),f=a.extend({},a.fn.carousel.defaults,"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.defaults={interval:5e3,pause:"hover"},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d,e=a(this),f=a(e.attr("data-target")||(c=e.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),g=a.extend({},f.data(),e.data());f.carousel(g),(d=e.attr("data-slide-to"))&&f.data("carousel").pause().to(d).cycle(),b.preventDefault()})}(window.jQuery),!function(a){"use strict";function b(b,c){var d,e=a.proxy(this.process,this),f=a(a(b).is("body")?window:b);this.options=a.extend({},a.fn.scrollspy.defaults,c),this.$scrollElement=f.on("scroll.scroll-spy.data-api",e),this.selector=(this.options.target||(d=a(b).attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=a("body"),this.refresh(),this.process()}b.prototype={constructor:b,refresh:function(){var b,c=this;this.offsets=a([]),this.targets=a([]),b=this.$body.find(this.selector).map(function(){var b=a(this),d=b.data("target")||b.attr("href"),e=/^#\w/.test(d)&&a(d);return e&&e.length&&[[e.position().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),d]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})},process:function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},activate:function(b){var c,d;this.activeTarget=b,a(this.selector).parent(".active").removeClass("active"),d=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',c=a(d).parent("li").addClass("active"),c.parent(".dropdown-menu").length&&(c=c.closest("li.dropdown").addClass("active")),c.trigger("activate")}};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("scrollspy"),f="object"==typeof c&&c;e||d.data("scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.defaults={offset:10},a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.collapse.defaults,c),this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.prototype={constructor:b,dimension:function(){var a=this.$element.hasClass("width");return a?"width":"height"},show:function(){var b,c,d,e;if(!this.transitioning&&!this.$element.hasClass("in")){if(b=this.dimension(),c=a.camelCase(["scroll",b].join("-")),d=this.$parent&&this.$parent.find("> .accordion-group > .in"),d&&d.length){if(e=d.data("collapse"),e&&e.transitioning)return;d.collapse("hide"),e||d.data("collapse",null)}this.$element[b](0),this.transition("addClass",a.Event("show"),"shown"),a.support.transition&&this.$element[b](this.$element[0][c])}},hide:function(){var b;!this.transitioning&&this.$element.hasClass("in")&&(b=this.dimension(),this.reset(this.$element[b]()),this.transition("removeClass",a.Event("hide"),"hidden"),this.$element[b](0))},reset:function(a){var b=this.dimension();return this.$element.removeClass("collapse")[b](a||"auto")[0].offsetWidth,this.$element[null!==a?"addClass":"removeClass"]("collapse"),this},transition:function(b,c,d){var e=this,f=function(){"show"==c.type&&e.reset(),e.transitioning=0,e.$element.trigger(d)};this.$element.trigger(c),c.isDefaultPrevented()||(this.transitioning=1,this.$element[b]("in"),a.support.transition&&this.$element.hasClass("collapse")?this.$element.one(a.support.transition.end,f):f())},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("collapse"),f=a.extend({},a.fn.collapse.defaults,d.data(),"object"==typeof c&&c);e||d.data("collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.defaults={toggle:!0},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e).data("collapse")?"toggle":d.data();d[a(e).hasClass("in")?"addClass":"removeClass"]("collapsed"),a(e).collapse(f)})}(window.jQuery),!function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype={constructor:b,show:function(){var b,c,d,e=this.element,f=e.closest("ul:not(.dropdown-menu)"),g=e.attr("data-target");g||(g=e.attr("href"),g=g&&g.replace(/.*(?=#[^\s]*$)/,"")),e.parent("li").hasClass("active")||(b=f.find(".active:last a")[0],d=a.Event("show",{relatedTarget:b}),e.trigger(d),d.isDefaultPrevented()||(c=a(g),this.activate(e.parent("li"),f),this.activate(c,c.parent(),function(){e.trigger({type:"shown",relatedTarget:b})})))},activate:function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e):e(),f.removeClass("in")}};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("tab");e||d.data("tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(window.jQuery);
\ No newline at end of file
diff --git a/web/demos/package/app/styles/f3706ec2.main.css b/web/demos/package/app/styles/00ae7995.main.css
similarity index 97%
rename from web/demos/package/app/styles/f3706ec2.main.css
rename to web/demos/package/app/styles/00ae7995.main.css
index b90ee41..ad78456 100644
--- a/web/demos/package/app/styles/f3706ec2.main.css
+++ b/web/demos/package/app/styles/00ae7995.main.css
@@ -1 +1 @@
-body{padding-top:60px;padding-bottom:40px}.sidebar-nav{padding:9px 0}.navbar .nav>li{line-height:28px}@media (max-width:980px){.navbar-text.pull-right{float:none;padding-left:5px;padding-right:5px}}[class^=icon-],[class*=" icon-"]{background-image:url(../images/23bb1446.glyphicons-halflings.png)}h4.ui-pnotify-title{display:inline;font-size:16px}.ui-pnotify-text{font-size:12px}.ui-pnotify-icon,.ui-pnotify-icon span{display:inline-block;float:none}.app-title{margin-top:0}.btn-view-console{margin-left:20px}.twitter-grid{border:1px solid #d4d4d4;height:350px;width:400px}.mobile-grid{border:1px solid #d4d4d4;height:450px}.mobile-grid-remove{text-align:center;cursor:pointer}.params-nav select{width:100%}.chart-title{text-align:center}.line-chart{height:300px}.network-response{height:30px}.network-response-label{display:inline-block;font-weight:700;vertical-align:middle}.network-response-stat{display:inline-block;width:100px;overflow:hidden;vertical-align:middle}.network-response-loading{background-color:#ff0}.bar-chart rect.bar-chart-p{fill:#05EEFA}.bar-chart rect.bar-chart-c{fill:transparent;stroke:red;stroke-width:1px;width:100%}.bar-chart rect{fill:#05EEFA}.bar-chart text{fill:#000}.chart-ctnr{height:300px}.gauge{margin-top:15px}.marker-label{color:red;background-color:#fff;font-family:"Lucida Grande",Arial,sans-serif;font-size:10px;font-weight:700;text-align:center;width:50px;border:1px solid #000;white-space:nowrap}.widget-response{max-height:340px;overflow:auto}.overview-item{padding-top:14px}.overview-item .key{color:#888;letter-spacing:.1em;display:block;margin-bottom:5px}.overview-item .value{font-weight:700;color:#000;font-size:140%;display:block}.navbar .brand{background:url(../images/74c3df97.main_banner.png) no-repeat scroll 0 0;padding:0;width:241px;height:48px;margin-left:-15px}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{background:#11506d}.navbar .navbar-inner{background:#11506d}.generate-tx-btn-wrap.span3,.generate-tx-desc.span9{display:inline-block;vertical-align:middle;float:none}.generate-tx-btn-wrap.span3{text-align:center}#alertDisplayBox{padding:10px;height:418px;overflow:auto}article.alert-msg{padding:10px 25px;border-radius:4px;color:#000;text-shadow:0 1px 0 rgba(255,255,255,.6);margin-bottom:10px}article.alert-msg.medium,button.generate-medium{background:#FF7000;box-shadow:inset 0 -2px 20px 0 #EEBC6B,0 1px 3px rgba(0,0,0,.3)}button.generate-medium:hover,button.generate-medium:focus{background:#FF970B}article.alert-msg.high,button.generate-high{background:#FF5E54;box-shadow:inset 0 -2px 20px 0 #D14D45,0 1px 3px rgba(0,0,0,.3)}button.generate-high{color:#fff;text-shadow:0 1px 0 #000}button.generate-high:hover,button.generate-high:focus{background:#FF4A31;color:#fff;text-shadow:0 1px 0 #000}article.alert-msg.low,button.generate-low{background:#FFF971;box-shadow:inset 0 -4px 30px -6px #EED306,0 1px 3px rgba(0,0,0,.3)}button.generate-low:hover,button.generate-low:focus{background:#FFE00A}article.alert-msg h1{font-size:18px;margin:0}button.clearFraudsBtn{float:right}
\ No newline at end of file
+body{padding-top:60px;padding-bottom:40px}.sidebar-nav{padding:9px 0}.navbar .nav>li{line-height:28px}@media (max-width:980px){.navbar-text.pull-right{float:none;padding-left:5px;padding-right:5px}}[class^=icon-],[class*=" icon-"]{background-image:url(../images/23bb1446.glyphicons-halflings.png)}h4.ui-pnotify-title{display:inline;font-size:16px}.ui-pnotify-text{font-size:12px}.ui-pnotify-icon,.ui-pnotify-icon span{display:inline-block;float:none}.app-title{margin-top:0}.btn-view-console{margin-left:20px}.twitter-grid{border:1px solid #d4d4d4;height:350px;width:400px}.mobile-grid{border:1px solid #d4d4d4;height:450px}.mobile-grid-remove{text-align:center;cursor:pointer}.params-nav select{width:100%}.chart-title{text-align:center}.line-chart{height:300px}.network-response{height:30px}.network-response-label{display:inline-block;font-weight:700;vertical-align:middle}.network-response-stat{display:inline-block;width:100px;overflow:hidden;vertical-align:middle}.network-response-loading{background-color:#ff0}.bar-chart rect.bar-chart-p{fill:#05EEFA}.bar-chart rect.bar-chart-c{fill:transparent;stroke:red;stroke-width:1px;width:100%}.bar-chart rect{fill:#05EEFA}.bar-chart text{fill:#000}.chart-ctnr{height:300px}.gauge{margin-top:15px}.marker-label{color:red;background-color:#fff;font-family:"Lucida Grande",Arial,sans-serif;font-size:10px;font-weight:700;text-align:center;width:50px;border:1px solid #000;white-space:nowrap}.widget-response{max-height:340px;overflow:auto}.overview-item{padding-top:14px}.overview-item .key{color:#888;letter-spacing:.1em;display:block;margin-bottom:5px}.overview-item .value{font-weight:700;color:#000;font-size:140%;display:block}.navbar .brand{background:url(../images/74c3df97.main_banner.png) no-repeat scroll 0 0;padding:0;width:241px;height:48px;margin-left:-15px}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{background:#11506d}.navbar .navbar-inner{background:#11506d}.generate-tx-btn-wrap.span3,.generate-tx-desc.span9{display:inline-block;vertical-align:middle;float:none}.generate-tx-btn-wrap.span3{text-align:center}#alertDisplayBox{padding:10px;height:418px;overflow:auto}article.alert-msg{padding:10px 25px;border-radius:4px;color:#000;text-shadow:0 1px 0 rgba(255,255,255,.6);margin-bottom:10px}article.alert-msg.medium,button.generate-medium{background:#FF7000;box-shadow:inset 0 -2px 20px 0 #EEBC6B,0 1px 3px rgba(0,0,0,.3)}button.generate-medium:hover,button.generate-medium:focus{background:#FF970B}article.alert-msg.high,button.generate-high{background:#FF5E54;box-shadow:inset 0 -2px 20px 0 #D14D45,0 1px 3px rgba(0,0,0,.3)}button.generate-high{color:#fff;text-shadow:0 1px 0 #000}button.generate-high:hover,button.generate-high:focus{background:#FF4A31;color:#fff;text-shadow:0 1px 0 #000}article.alert-msg.low,button.generate-low{background:#FFF971;box-shadow:inset 0 -4px 30px -6px #EED306,0 1px 3px rgba(0,0,0,.3)}button.generate-low:hover,button.generate-low:focus{background:#FFE00A}article.alert-msg h1{font-size:18px;margin:0}button.clearFraudsBtn{float:right}a.svg-link{text-decoration:underline}
\ No newline at end of file
diff --git a/web/demos/package/app/views/dimensions.html b/web/demos/package/app/views/dimensions.html
index 80913d0..afd1703 100644
--- a/web/demos/package/app/views/dimensions.html
+++ b/web/demos/package/app/views/dimensions.html
@@ -160,6 +160,6 @@
     <hr>
 
     <footer>
-        <p>&copy; DataTorrent 2013</p>
+        <p>&copy; DataTorrent 2014</p>
     </footer>
 </div><!--/.fluid-container-->
\ No newline at end of file
diff --git a/web/demos/package/app/views/fraud.html b/web/demos/package/app/views/fraud.html
index 7a3b9b4..cedfa5c 100644
--- a/web/demos/package/app/views/fraud.html
+++ b/web/demos/package/app/views/fraud.html
@@ -47,7 +47,7 @@
 	<hr>
 
 	<footer>
-		<p>&copy; DataTorrent 2013</p>
+		<p>&copy; DataTorrent 2014</p>
 	</footer>
 </div><!--/.fluid-container-->
 <div id="txn-modal" class="modal hide fade" role="dialog" style="display:none">
diff --git a/web/demos/package/app/views/machine.html b/web/demos/package/app/views/machine.html
index 4ac4248..0da15a6 100644
--- a/web/demos/package/app/views/machine.html
+++ b/web/demos/package/app/views/machine.html
@@ -168,6 +168,6 @@
     <hr>
 
     <footer>
-        <p>&copy; DataTorrent 2013</p>
+        <p>&copy; DataTorrent 2014</p>
     </footer>
 </div><!--/.fluid-container-->
\ No newline at end of file
diff --git a/web/demos/package/app/views/mobile.html b/web/demos/package/app/views/mobile.html
index 4dc9400..4a5f2cf 100644
--- a/web/demos/package/app/views/mobile.html
+++ b/web/demos/package/app/views/mobile.html
@@ -35,6 +35,6 @@
     <hr>
 
     <footer>
-        <p>&copy; DataTorrent 2013</p>
+        <p>&copy; DataTorrent 2014</p>
     </footer>
 </div><!--/.fluid-container-->
\ No newline at end of file
diff --git a/web/demos/package/app/views/twitter.html b/web/demos/package/app/views/twitter.html
index 3ba9051..e1897cd 100644
--- a/web/demos/package/app/views/twitter.html
+++ b/web/demos/package/app/views/twitter.html
@@ -2,14 +2,14 @@
     <div class="row-fluid">
         <div class="span12">
             <h2 class="app-title">
-                Twitter Top URLs
+                {{pageTitle}}
                 <a ng-show="appURL" href="{{appURL}}" class="btn btn-primary btn-view-console" target="_blank">View Console</a>
             </h2>
         </div>
     </div>
     <div class="row-fluid">
         <p class="well span7">
-            This demo application processes tweets and computes most frequently cited URLs during the last 5 minutes. The results are continuously updated every 0.5 sec. For demo purposes, we used live (1% sample) developer version of the Twitter feed, and scale it up by 100x to produce the true load.  The application process load equivalent to full firehose.
+            This demo application processes tweets and computes most frequently cited {{entity}} during the last 5 minutes. The results are continuously updated every 0.5 sec. For demo purposes, we used live (1% sample) developer version of the Twitter feed, and scale it up by 100x to produce the true load.  The application process load equivalent to full firehose.
         </p>
         <div class="span5">
             <span widgets-stat="" app="app"></span>
@@ -17,13 +17,13 @@
     </div>
     <div class="row-fluid">
         <div class="span4">
-            <h4>Top 10 URLs</h4>
+            <h4>{{gridTitle}}</h4>
             <div ng-controller="TwitterGridControlller">
                 <div class="twitter-grid" ng-grid="gridOptions"></div>
             </div>
         </div><!--/span-->
         <div class="span4">
-            <h4>Top 10 URLs Chart</h4>
+            <h4>{{chartTitle}}</h4>
             <div ng-controller="TwitterBarChartController">
                 <span widgets-bar-chart="" class="bar-chart" data="twitterBarChartData" label="name" on-click="d3OnClick(item)"></span>
             </div>
@@ -33,6 +33,6 @@
     <hr>
 
     <footer>
-        <p>&copy; DataTorrent 2013</p>
+        <p>&copy; DataTorrent 2014</p>
     </footer>
 </div><!--/.fluid-container-->
\ No newline at end of file
diff --git a/web/demos/package/config.js b/web/demos/package/config.js
index ec62902..1db5085 100644
--- a/web/demos/package/config.js
+++ b/web/demos/package/config.js
@@ -26,7 +26,8 @@
 config.settings = {};
 var settings = config.settings;
 
-settings.twitter = {};
+settings.twitterUrls = {};
+settings.twitterHashtags = {};
 settings.mobile = {};
 settings.mobile.topic = {};
 settings.machine = {};
@@ -38,8 +39,10 @@
 settings.webSocketURL = 'ws://' + config.gateway.host + ':' + config.gateway.port + '/pubsub';
 settings.appsURL = 'http://' + config.gateway.host + ':' + config.gateway.port + '/static/#ops/apps/';
 
-settings.twitter.appName = process.env.APP_NAME_TWITTER || 'TwitterDemo';
-settings.twitter.topic = 'demos.twitter.topURLs';
+settings.twitterUrls.appName = process.env.APP_NAME_TWITTER_URLS || 'TwitterDemo';
+settings.twitterUrls.topic = 'demos.twitter.topURLs';
+settings.twitterHashtags.appName = process.env.APP_NAME_TWITTER_HASHTAGS || 'TwitterTrendingDemo';
+settings.twitterHashtags.topic = 'demos.twitter.topHashtags';
 settings.mobile.topic.out = 'demos.mobile.phoneLocationQueryResult';
 settings.mobile.topic.in = 'demos.mobile.phoneLocationQuery';
 settings.mobile.appName = process.env.APP_NAME_MOBILE || 'MobileDemo';
